@medialane/ui 0.90.3 → 0.92.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.
@@ -36,11 +36,6 @@ var import_jsx_runtime = require("react/jsx-runtime");
36
36
  var import_link = __toESM(require("next/link"), 1);
37
37
  var import_lucide_react = require("lucide-react");
38
38
  var import_cn = require("../utils/cn.js");
39
- const ATTENTION_DOT = {
40
- destructive: "bg-destructive",
41
- warning: "bg-amber-500",
42
- primary: "bg-primary"
43
- };
44
39
  function SectionHeading({
45
40
  title,
46
41
  href
@@ -61,9 +56,9 @@ function SectionHeading({
61
56
  ] });
62
57
  }
63
58
  function PortfolioOverview({
64
- attention,
65
59
  stats,
66
60
  quickActions,
61
+ compact,
67
62
  assetsSlot,
68
63
  assetsHref,
69
64
  activitySlot,
@@ -72,42 +67,10 @@ function PortfolioOverview({
72
67
  emptyState,
73
68
  className
74
69
  }) {
75
- const pending = (attention ?? []).filter((item) => item.count > 0);
70
+ const hasActivity = Boolean(activitySlot) && !compact;
76
71
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_cn.cn)("space-y-6", className), children: [
77
- pending.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "rounded-xl border border-primary/25 bg-primary/[0.04] p-4 sm:p-5 space-y-3", children: [
78
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 text-primary", children: [
79
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.BellRing, { className: "h-4 w-4" }),
80
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-sm font-semibold", children: "Needs your attention" })
81
- ] }),
82
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid gap-2 sm:grid-cols-2", children: pending.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
83
- import_link.default,
84
- {
85
- href: item.href,
86
- className: "flex items-center justify-between gap-3 rounded-lg bg-card border border-border/60 px-3.5 py-2.5 active:opacity-80 hover:border-border transition-colors",
87
- children: [
88
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex items-center gap-2.5 min-w-0", children: [
89
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
90
- "span",
91
- {
92
- className: (0, import_cn.cn)(
93
- "h-2 w-2 rounded-full shrink-0",
94
- ATTENTION_DOT[item.tone ?? "primary"]
95
- )
96
- }
97
- ),
98
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "min-w-0", children: [
99
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "block text-sm font-medium text-foreground truncate", children: item.label }),
100
- item.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "block text-xs text-muted-foreground truncate", children: item.description })
101
- ] })
102
- ] }),
103
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-4 w-4 text-muted-foreground shrink-0" })
104
- ]
105
- },
106
- item.href + item.label
107
- )) })
108
- ] }),
109
- (stats && stats.length > 0 || quickActions && quickActions.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-3", children: [
110
- stats && stats.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center gap-2 flex-wrap", children: stats.map((stat) => {
72
+ !compact && (stats && stats.length > 0 || quickActions && quickActions.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 flex-wrap", children: [
73
+ stats?.map((stat) => {
111
74
  if (stat.value == null) {
112
75
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
113
76
  "span",
@@ -126,23 +89,23 @@ function PortfolioOverview({
126
89
  ] })
127
90
  ] });
128
91
  return stat.href ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: stat.href, className: "active:opacity-80", children: pill }, stat.label) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: pill }, stat.label);
129
- }) }),
130
- quickActions && quickActions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center gap-2 flex-wrap", children: quickActions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
92
+ }),
93
+ quickActions?.map((action) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
131
94
  import_link.default,
132
95
  {
133
96
  href: action.href,
134
- className: "inline-flex items-center rounded-full border border-border bg-card px-4 py-1.5 text-[13px] font-medium text-foreground active:opacity-80 hover:border-primary/40 transition-colors",
97
+ className: "inline-flex items-center text-[13px] font-medium text-muted-foreground hover:text-foreground transition-colors px-1",
135
98
  children: action.label
136
99
  },
137
100
  action.href
138
- )) })
101
+ ))
139
102
  ] }),
140
103
  isEmpty ? emptyState : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid gap-6 lg:grid-cols-5", children: [
141
- assetsSlot && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "lg:col-span-3 space-y-3", children: [
104
+ assetsSlot && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: (0, import_cn.cn)("space-y-3", hasActivity ? "lg:col-span-3" : "lg:col-span-5"), children: [
142
105
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SectionHeading, { title: "Your assets", href: assetsHref }),
143
106
  assetsSlot
144
107
  ] }),
145
- activitySlot && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "lg:col-span-2 space-y-3", children: [
108
+ hasActivity && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "lg:col-span-2 space-y-3", children: [
146
109
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SectionHeading, { title: "Recent activity", href: activityHref }),
147
110
  activitySlot
148
111
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-overview.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, BellRing } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface PortfolioAttentionItem {\n /** e.g. \"2 offers received\" — caller composes count + label. */\n label: string;\n /** Short helper line, e.g. \"Accept, counter, or decline\". */\n description?: string;\n href: string;\n count: number;\n tone?: \"destructive\" | \"warning\" | \"primary\";\n}\n\nexport interface PortfolioOverviewStat {\n label: string;\n /** Pass null while loading. */\n value: string | number | null;\n sub?: string;\n href?: string;\n}\n\nexport interface PortfolioQuickAction {\n label: string;\n href: string;\n}\n\nexport interface PortfolioOverviewProps {\n /** Pending items needing action. The panel renders only when a count > 0. */\n attention?: PortfolioAttentionItem[];\n stats?: PortfolioOverviewStat[];\n /** Shortcut row under the stat tiles (\"Create asset\", …). */\n quickActions?: PortfolioQuickAction[];\n /** Recent-assets cards, rendered by the app. */\n assetsSlot?: React.ReactNode;\n assetsHref?: string;\n /** Recent-activity rows, rendered by the app. */\n activitySlot?: React.ReactNode;\n activityHref?: string;\n /** First-run state; rendered instead of the columns when `isEmpty`. */\n isEmpty?: boolean;\n emptyState?: React.ReactNode;\n className?: string;\n}\n\nconst ATTENTION_DOT: Record<\n NonNullable<PortfolioAttentionItem[\"tone\"]>,\n string\n> = {\n destructive: \"bg-destructive\",\n warning: \"bg-amber-500\",\n primary: \"bg-primary\",\n};\n\nfunction SectionHeading({\n title,\n href,\n}: {\n title: string;\n href?: string;\n}) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>\n {href && (\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n View all\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n )}\n </div>\n );\n}\n\n/**\n * Portfolio landing page layout: needs-attention panel, clickable stat tiles,\n * and recent assets/activity columns. Pure presentation — the app injects\n * counts, stats, and rendered cards.\n */\nexport function PortfolioOverview({\n attention,\n stats,\n quickActions,\n assetsSlot,\n assetsHref,\n activitySlot,\n activityHref,\n isEmpty,\n emptyState,\n className,\n}: PortfolioOverviewProps) {\n const pending = (attention ?? []).filter((item) => item.count > 0);\n\n return (\n <div className={cn(\"space-y-6\", className)}>\n {pending.length > 0 && (\n <section className=\"rounded-xl border border-primary/25 bg-primary/[0.04] p-4 sm:p-5 space-y-3\">\n <div className=\"flex items-center gap-2 text-primary\">\n <BellRing className=\"h-4 w-4\" />\n <h2 className=\"text-sm font-semibold\">Needs your attention</h2>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {pending.map((item) => (\n <Link\n key={item.href + item.label}\n href={item.href}\n className=\"flex items-center justify-between gap-3 rounded-lg bg-card border border-border/60 px-3.5 py-2.5 active:opacity-80 hover:border-border transition-colors\"\n >\n <span className=\"flex items-center gap-2.5 min-w-0\">\n <span\n className={cn(\n \"h-2 w-2 rounded-full shrink-0\",\n ATTENTION_DOT[item.tone ?? \"primary\"],\n )}\n />\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-foreground truncate\">\n {item.label}\n </span>\n {item.description && (\n <span className=\"block text-xs text-muted-foreground truncate\">\n {item.description}\n </span>\n )}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n </Link>\n ))}\n </div>\n </section>\n )}\n\n {((stats && stats.length > 0) || (quickActions && quickActions.length > 0)) && (\n <div className=\"space-y-3\">\n {stats && stats.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {stats.map((stat) => {\n if (stat.value == null) {\n return (\n <span\n key={stat.label}\n className=\"bg-muted rounded-full px-3 py-1.5 w-20 h-7 animate-pulse inline-block\"\n />\n );\n }\n const pill = (\n <span className=\"inline-flex items-baseline gap-1.5 rounded-full bg-muted px-3 py-1.5 text-[13px] whitespace-nowrap\">\n <span className=\"font-semibold text-foreground tabular-nums\">\n {stat.value}\n </span>\n <span className=\"text-muted-foreground\">{stat.label}</span>\n {stat.sub && (\n <span className=\"text-muted-foreground/70\">\n · {stat.sub}\n </span>\n )}\n </span>\n );\n return stat.href ? (\n <Link key={stat.label} href={stat.href} className=\"active:opacity-80\">\n {pill}\n </Link>\n ) : (\n <span key={stat.label}>{pill}</span>\n );\n })}\n </div>\n )}\n\n {quickActions && quickActions.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {quickActions.map((action) => (\n <Link\n key={action.href}\n href={action.href}\n className=\"inline-flex items-center rounded-full border border-border bg-card px-4 py-1.5 text-[13px] font-medium text-foreground active:opacity-80 hover:border-primary/40 transition-colors\"\n >\n {action.label}\n </Link>\n ))}\n </div>\n )}\n </div>\n )}\n\n {isEmpty ? (\n emptyState\n ) : (\n <div className=\"grid gap-6 lg:grid-cols-5\">\n {assetsSlot && (\n <section className=\"lg:col-span-3 space-y-3\">\n <SectionHeading title=\"Your assets\" href={assetsHref} />\n {assetsSlot}\n </section>\n )}\n {activitySlot && (\n <section className=\"lg:col-span-2 space-y-3\">\n <SectionHeading title=\"Recent activity\" href={activityHref} />\n {activitySlot}\n </section>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/portfolio-overview.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface PortfolioOverviewStat {\n label: string;\n /** Pass null while loading. */\n value: string | number | null;\n sub?: string;\n href?: string;\n}\n\nexport interface PortfolioQuickAction {\n label: string;\n href: string;\n}\n\nexport interface PortfolioOverviewProps {\n stats?: PortfolioOverviewStat[];\n /** Shortcut row under the stat tiles (\"Create asset\", …). */\n quickActions?: PortfolioQuickAction[];\n /**\n * Small/empty portfolio: suppresses the stats+quick-actions row entirely\n * and renders the assets grid full-width. The app computes this from its\n * own asset/pending counts — this component stays presentation-only.\n */\n compact?: boolean;\n /** Recent-assets cards, rendered by the app. */\n assetsSlot?: React.ReactNode;\n assetsHref?: string;\n /** Recent-activity rows, rendered by the app. */\n activitySlot?: React.ReactNode;\n activityHref?: string;\n /** First-run state; rendered instead of the columns when `isEmpty`. */\n isEmpty?: boolean;\n emptyState?: React.ReactNode;\n className?: string;\n}\n\nfunction SectionHeading({\n title,\n href,\n}: {\n title: string;\n href?: string;\n}) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>\n {href && (\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n View all\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n )}\n </div>\n );\n}\n\n/**\n * Portfolio landing page layout: one merged stats/quick-actions row, then\n * recent assets/activity columns. Pure presentation — the app injects\n * counts, stats, and rendered cards. Pending-action counts surface via\n * PortfolioNav's badges, not here.\n */\nexport function PortfolioOverview({\n stats,\n quickActions,\n compact,\n assetsSlot,\n assetsHref,\n activitySlot,\n activityHref,\n isEmpty,\n emptyState,\n className,\n}: PortfolioOverviewProps) {\n const hasActivity = Boolean(activitySlot) && !compact;\n\n return (\n <div className={cn(\"space-y-6\", className)}>\n {!compact && ((stats && stats.length > 0) || (quickActions && quickActions.length > 0)) && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {stats?.map((stat) => {\n if (stat.value == null) {\n return (\n <span\n key={stat.label}\n className=\"bg-muted rounded-full px-3 py-1.5 w-20 h-7 animate-pulse inline-block\"\n />\n );\n }\n const pill = (\n <span className=\"inline-flex items-baseline gap-1.5 rounded-full bg-muted px-3 py-1.5 text-[13px] whitespace-nowrap\">\n <span className=\"font-semibold text-foreground tabular-nums\">\n {stat.value}\n </span>\n <span className=\"text-muted-foreground\">{stat.label}</span>\n {stat.sub && (\n <span className=\"text-muted-foreground/70\">\n · {stat.sub}\n </span>\n )}\n </span>\n );\n return stat.href ? (\n <Link key={stat.label} href={stat.href} className=\"active:opacity-80\">\n {pill}\n </Link>\n ) : (\n <span key={stat.label}>{pill}</span>\n );\n })}\n\n {quickActions?.map((action) => (\n <Link\n key={action.href}\n href={action.href}\n className=\"inline-flex items-center text-[13px] font-medium text-muted-foreground hover:text-foreground transition-colors px-1\"\n >\n {action.label}\n </Link>\n ))}\n </div>\n )}\n\n {isEmpty ? (\n emptyState\n ) : (\n <div className=\"grid gap-6 lg:grid-cols-5\">\n {assetsSlot && (\n <section className={cn(\"space-y-3\", hasActivity ? \"lg:col-span-3\" : \"lg:col-span-5\")}>\n <SectionHeading title=\"Your assets\" href={assetsHref} />\n {assetsSlot}\n </section>\n )}\n {hasActivity && (\n <section className=\"lg:col-span-2 space-y-3\">\n <SectionHeading title=\"Recent activity\" href={activityHref} />\n {activitySlot}\n </section>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkDM;AAhDN,kBAAiB;AACjB,0BAA2B;AAC3B,gBAAmB;AAqCnB,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AACF,GAGG;AACD,SACE,6CAAC,SAAI,WAAU,2CACb;AAAA,gDAAC,QAAG,WAAU,yCAAyC,iBAAM;AAAA,IAC5D,QACC;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAU;AAAA,QACX;AAAA;AAAA,UAEC,4CAAC,kCAAW,WAAU,WAAU;AAAA;AAAA;AAAA,IAClC;AAAA,KAEJ;AAEJ;AAQO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,cAAc,QAAQ,YAAY,KAAK,CAAC;AAE9C,SACE,6CAAC,SAAI,eAAW,cAAG,aAAa,SAAS,GACtC;AAAA,KAAC,YAAa,SAAS,MAAM,SAAS,KAAO,gBAAgB,aAAa,SAAS,MAClF,6CAAC,SAAI,WAAU,qCACZ;AAAA,aAAO,IAAI,CAAC,SAAS;AACpB,YAAI,KAAK,SAAS,MAAM;AACtB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA;AAAA,YADL,KAAK;AAAA,UAEZ;AAAA,QAEJ;AACA,cAAM,OACJ,6CAAC,UAAK,WAAU,sGACd;AAAA,sDAAC,UAAK,WAAU,8CACb,eAAK,OACR;AAAA,UACA,4CAAC,UAAK,WAAU,yBAAyB,eAAK,OAAM;AAAA,UACnD,KAAK,OACJ,6CAAC,UAAK,WAAU,4BAA2B;AAAA;AAAA,YACtC,KAAK;AAAA,aACV;AAAA,WAEJ;AAEF,eAAO,KAAK,OACV,4CAAC,YAAAA,SAAA,EAAsB,MAAM,KAAK,MAAM,WAAU,qBAC/C,kBADQ,KAAK,KAEhB,IAEA,4CAAC,UAAuB,kBAAb,KAAK,KAAa;AAAA,MAEjC,CAAC;AAAA,MAEA,cAAc,IAAI,CAAC,WAClB;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UAEC,MAAM,OAAO;AAAA,UACb,WAAU;AAAA,UAET,iBAAO;AAAA;AAAA,QAJH,OAAO;AAAA,MAKd,CACD;AAAA,OACH;AAAA,IAGD,UACC,aAEA,6CAAC,SAAI,WAAU,6BACZ;AAAA,oBACC,6CAAC,aAAQ,eAAW,cAAG,aAAa,cAAc,kBAAkB,eAAe,GACjF;AAAA,oDAAC,kBAAe,OAAM,eAAc,MAAM,YAAY;AAAA,QACrD;AAAA,SACH;AAAA,MAED,eACC,6CAAC,aAAQ,WAAU,2BACjB;AAAA,oDAAC,kBAAe,OAAM,mBAAkB,MAAM,cAAc;AAAA,QAC3D;AAAA,SACH;AAAA,OAEJ;AAAA,KAEJ;AAEJ;","names":["Link"]}
@@ -1,14 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
- interface PortfolioAttentionItem {
4
- /** e.g. "2 offers received" — caller composes count + label. */
5
- label: string;
6
- /** Short helper line, e.g. "Accept, counter, or decline". */
7
- description?: string;
8
- href: string;
9
- count: number;
10
- tone?: "destructive" | "warning" | "primary";
11
- }
12
3
  interface PortfolioOverviewStat {
13
4
  label: string;
14
5
  /** Pass null while loading. */
@@ -21,11 +12,15 @@ interface PortfolioQuickAction {
21
12
  href: string;
22
13
  }
23
14
  interface PortfolioOverviewProps {
24
- /** Pending items needing action. The panel renders only when a count > 0. */
25
- attention?: PortfolioAttentionItem[];
26
15
  stats?: PortfolioOverviewStat[];
27
16
  /** Shortcut row under the stat tiles ("Create asset", …). */
28
17
  quickActions?: PortfolioQuickAction[];
18
+ /**
19
+ * Small/empty portfolio: suppresses the stats+quick-actions row entirely
20
+ * and renders the assets grid full-width. The app computes this from its
21
+ * own asset/pending counts — this component stays presentation-only.
22
+ */
23
+ compact?: boolean;
29
24
  /** Recent-assets cards, rendered by the app. */
30
25
  assetsSlot?: React.ReactNode;
31
26
  assetsHref?: string;
@@ -38,10 +33,11 @@ interface PortfolioOverviewProps {
38
33
  className?: string;
39
34
  }
40
35
  /**
41
- * Portfolio landing page layout: needs-attention panel, clickable stat tiles,
42
- * and recent assets/activity columns. Pure presentation — the app injects
43
- * counts, stats, and rendered cards.
36
+ * Portfolio landing page layout: one merged stats/quick-actions row, then
37
+ * recent assets/activity columns. Pure presentation — the app injects
38
+ * counts, stats, and rendered cards. Pending-action counts surface via
39
+ * PortfolioNav's badges, not here.
44
40
  */
45
- declare function PortfolioOverview({ attention, stats, quickActions, assetsSlot, assetsHref, activitySlot, activityHref, isEmpty, emptyState, className, }: PortfolioOverviewProps): react_jsx_runtime.JSX.Element;
41
+ declare function PortfolioOverview({ stats, quickActions, compact, assetsSlot, assetsHref, activitySlot, activityHref, isEmpty, emptyState, className, }: PortfolioOverviewProps): react_jsx_runtime.JSX.Element;
46
42
 
47
- export { type PortfolioAttentionItem, PortfolioOverview, type PortfolioOverviewProps, type PortfolioOverviewStat, type PortfolioQuickAction };
43
+ export { PortfolioOverview, type PortfolioOverviewProps, type PortfolioOverviewStat, type PortfolioQuickAction };
@@ -1,14 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
- interface PortfolioAttentionItem {
4
- /** e.g. "2 offers received" — caller composes count + label. */
5
- label: string;
6
- /** Short helper line, e.g. "Accept, counter, or decline". */
7
- description?: string;
8
- href: string;
9
- count: number;
10
- tone?: "destructive" | "warning" | "primary";
11
- }
12
3
  interface PortfolioOverviewStat {
13
4
  label: string;
14
5
  /** Pass null while loading. */
@@ -21,11 +12,15 @@ interface PortfolioQuickAction {
21
12
  href: string;
22
13
  }
23
14
  interface PortfolioOverviewProps {
24
- /** Pending items needing action. The panel renders only when a count > 0. */
25
- attention?: PortfolioAttentionItem[];
26
15
  stats?: PortfolioOverviewStat[];
27
16
  /** Shortcut row under the stat tiles ("Create asset", …). */
28
17
  quickActions?: PortfolioQuickAction[];
18
+ /**
19
+ * Small/empty portfolio: suppresses the stats+quick-actions row entirely
20
+ * and renders the assets grid full-width. The app computes this from its
21
+ * own asset/pending counts — this component stays presentation-only.
22
+ */
23
+ compact?: boolean;
29
24
  /** Recent-assets cards, rendered by the app. */
30
25
  assetsSlot?: React.ReactNode;
31
26
  assetsHref?: string;
@@ -38,10 +33,11 @@ interface PortfolioOverviewProps {
38
33
  className?: string;
39
34
  }
40
35
  /**
41
- * Portfolio landing page layout: needs-attention panel, clickable stat tiles,
42
- * and recent assets/activity columns. Pure presentation — the app injects
43
- * counts, stats, and rendered cards.
36
+ * Portfolio landing page layout: one merged stats/quick-actions row, then
37
+ * recent assets/activity columns. Pure presentation — the app injects
38
+ * counts, stats, and rendered cards. Pending-action counts surface via
39
+ * PortfolioNav's badges, not here.
44
40
  */
45
- declare function PortfolioOverview({ attention, stats, quickActions, assetsSlot, assetsHref, activitySlot, activityHref, isEmpty, emptyState, className, }: PortfolioOverviewProps): react_jsx_runtime.JSX.Element;
41
+ declare function PortfolioOverview({ stats, quickActions, compact, assetsSlot, assetsHref, activitySlot, activityHref, isEmpty, emptyState, className, }: PortfolioOverviewProps): react_jsx_runtime.JSX.Element;
46
42
 
47
- export { type PortfolioAttentionItem, PortfolioOverview, type PortfolioOverviewProps, type PortfolioOverviewStat, type PortfolioQuickAction };
43
+ export { PortfolioOverview, type PortfolioOverviewProps, type PortfolioOverviewStat, type PortfolioQuickAction };
@@ -1,13 +1,8 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import Link from "next/link";
4
- import { ArrowRight, BellRing } from "lucide-react";
4
+ import { ArrowRight } from "lucide-react";
5
5
  import { cn } from "../utils/cn.js";
6
- const ATTENTION_DOT = {
7
- destructive: "bg-destructive",
8
- warning: "bg-amber-500",
9
- primary: "bg-primary"
10
- };
11
6
  function SectionHeading({
12
7
  title,
13
8
  href
@@ -28,9 +23,9 @@ function SectionHeading({
28
23
  ] });
29
24
  }
30
25
  function PortfolioOverview({
31
- attention,
32
26
  stats,
33
27
  quickActions,
28
+ compact,
34
29
  assetsSlot,
35
30
  assetsHref,
36
31
  activitySlot,
@@ -39,42 +34,10 @@ function PortfolioOverview({
39
34
  emptyState,
40
35
  className
41
36
  }) {
42
- const pending = (attention ?? []).filter((item) => item.count > 0);
37
+ const hasActivity = Boolean(activitySlot) && !compact;
43
38
  return /* @__PURE__ */ jsxs("div", { className: cn("space-y-6", className), children: [
44
- pending.length > 0 && /* @__PURE__ */ jsxs("section", { className: "rounded-xl border border-primary/25 bg-primary/[0.04] p-4 sm:p-5 space-y-3", children: [
45
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-primary", children: [
46
- /* @__PURE__ */ jsx(BellRing, { className: "h-4 w-4" }),
47
- /* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold", children: "Needs your attention" })
48
- ] }),
49
- /* @__PURE__ */ jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: pending.map((item) => /* @__PURE__ */ jsxs(
50
- Link,
51
- {
52
- href: item.href,
53
- className: "flex items-center justify-between gap-3 rounded-lg bg-card border border-border/60 px-3.5 py-2.5 active:opacity-80 hover:border-border transition-colors",
54
- children: [
55
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2.5 min-w-0", children: [
56
- /* @__PURE__ */ jsx(
57
- "span",
58
- {
59
- className: cn(
60
- "h-2 w-2 rounded-full shrink-0",
61
- ATTENTION_DOT[item.tone ?? "primary"]
62
- )
63
- }
64
- ),
65
- /* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
66
- /* @__PURE__ */ jsx("span", { className: "block text-sm font-medium text-foreground truncate", children: item.label }),
67
- item.description && /* @__PURE__ */ jsx("span", { className: "block text-xs text-muted-foreground truncate", children: item.description })
68
- ] })
69
- ] }),
70
- /* @__PURE__ */ jsx(ArrowRight, { className: "h-4 w-4 text-muted-foreground shrink-0" })
71
- ]
72
- },
73
- item.href + item.label
74
- )) })
75
- ] }),
76
- (stats && stats.length > 0 || quickActions && quickActions.length > 0) && /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
77
- stats && stats.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 flex-wrap", children: stats.map((stat) => {
39
+ !compact && (stats && stats.length > 0 || quickActions && quickActions.length > 0) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [
40
+ stats?.map((stat) => {
78
41
  if (stat.value == null) {
79
42
  return /* @__PURE__ */ jsx(
80
43
  "span",
@@ -93,23 +56,23 @@ function PortfolioOverview({
93
56
  ] })
94
57
  ] });
95
58
  return stat.href ? /* @__PURE__ */ jsx(Link, { href: stat.href, className: "active:opacity-80", children: pill }, stat.label) : /* @__PURE__ */ jsx("span", { children: pill }, stat.label);
96
- }) }),
97
- quickActions && quickActions.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 flex-wrap", children: quickActions.map((action) => /* @__PURE__ */ jsx(
59
+ }),
60
+ quickActions?.map((action) => /* @__PURE__ */ jsx(
98
61
  Link,
99
62
  {
100
63
  href: action.href,
101
- className: "inline-flex items-center rounded-full border border-border bg-card px-4 py-1.5 text-[13px] font-medium text-foreground active:opacity-80 hover:border-primary/40 transition-colors",
64
+ className: "inline-flex items-center text-[13px] font-medium text-muted-foreground hover:text-foreground transition-colors px-1",
102
65
  children: action.label
103
66
  },
104
67
  action.href
105
- )) })
68
+ ))
106
69
  ] }),
107
70
  isEmpty ? emptyState : /* @__PURE__ */ jsxs("div", { className: "grid gap-6 lg:grid-cols-5", children: [
108
- assetsSlot && /* @__PURE__ */ jsxs("section", { className: "lg:col-span-3 space-y-3", children: [
71
+ assetsSlot && /* @__PURE__ */ jsxs("section", { className: cn("space-y-3", hasActivity ? "lg:col-span-3" : "lg:col-span-5"), children: [
109
72
  /* @__PURE__ */ jsx(SectionHeading, { title: "Your assets", href: assetsHref }),
110
73
  assetsSlot
111
74
  ] }),
112
- activitySlot && /* @__PURE__ */ jsxs("section", { className: "lg:col-span-2 space-y-3", children: [
75
+ hasActivity && /* @__PURE__ */ jsxs("section", { className: "lg:col-span-2 space-y-3", children: [
113
76
  /* @__PURE__ */ jsx(SectionHeading, { title: "Recent activity", href: activityHref }),
114
77
  activitySlot
115
78
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/portfolio-overview.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, BellRing } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface PortfolioAttentionItem {\n /** e.g. \"2 offers received\" — caller composes count + label. */\n label: string;\n /** Short helper line, e.g. \"Accept, counter, or decline\". */\n description?: string;\n href: string;\n count: number;\n tone?: \"destructive\" | \"warning\" | \"primary\";\n}\n\nexport interface PortfolioOverviewStat {\n label: string;\n /** Pass null while loading. */\n value: string | number | null;\n sub?: string;\n href?: string;\n}\n\nexport interface PortfolioQuickAction {\n label: string;\n href: string;\n}\n\nexport interface PortfolioOverviewProps {\n /** Pending items needing action. The panel renders only when a count > 0. */\n attention?: PortfolioAttentionItem[];\n stats?: PortfolioOverviewStat[];\n /** Shortcut row under the stat tiles (\"Create asset\", …). */\n quickActions?: PortfolioQuickAction[];\n /** Recent-assets cards, rendered by the app. */\n assetsSlot?: React.ReactNode;\n assetsHref?: string;\n /** Recent-activity rows, rendered by the app. */\n activitySlot?: React.ReactNode;\n activityHref?: string;\n /** First-run state; rendered instead of the columns when `isEmpty`. */\n isEmpty?: boolean;\n emptyState?: React.ReactNode;\n className?: string;\n}\n\nconst ATTENTION_DOT: Record<\n NonNullable<PortfolioAttentionItem[\"tone\"]>,\n string\n> = {\n destructive: \"bg-destructive\",\n warning: \"bg-amber-500\",\n primary: \"bg-primary\",\n};\n\nfunction SectionHeading({\n title,\n href,\n}: {\n title: string;\n href?: string;\n}) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>\n {href && (\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n View all\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n )}\n </div>\n );\n}\n\n/**\n * Portfolio landing page layout: needs-attention panel, clickable stat tiles,\n * and recent assets/activity columns. Pure presentation — the app injects\n * counts, stats, and rendered cards.\n */\nexport function PortfolioOverview({\n attention,\n stats,\n quickActions,\n assetsSlot,\n assetsHref,\n activitySlot,\n activityHref,\n isEmpty,\n emptyState,\n className,\n}: PortfolioOverviewProps) {\n const pending = (attention ?? []).filter((item) => item.count > 0);\n\n return (\n <div className={cn(\"space-y-6\", className)}>\n {pending.length > 0 && (\n <section className=\"rounded-xl border border-primary/25 bg-primary/[0.04] p-4 sm:p-5 space-y-3\">\n <div className=\"flex items-center gap-2 text-primary\">\n <BellRing className=\"h-4 w-4\" />\n <h2 className=\"text-sm font-semibold\">Needs your attention</h2>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {pending.map((item) => (\n <Link\n key={item.href + item.label}\n href={item.href}\n className=\"flex items-center justify-between gap-3 rounded-lg bg-card border border-border/60 px-3.5 py-2.5 active:opacity-80 hover:border-border transition-colors\"\n >\n <span className=\"flex items-center gap-2.5 min-w-0\">\n <span\n className={cn(\n \"h-2 w-2 rounded-full shrink-0\",\n ATTENTION_DOT[item.tone ?? \"primary\"],\n )}\n />\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-foreground truncate\">\n {item.label}\n </span>\n {item.description && (\n <span className=\"block text-xs text-muted-foreground truncate\">\n {item.description}\n </span>\n )}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n </Link>\n ))}\n </div>\n </section>\n )}\n\n {((stats && stats.length > 0) || (quickActions && quickActions.length > 0)) && (\n <div className=\"space-y-3\">\n {stats && stats.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {stats.map((stat) => {\n if (stat.value == null) {\n return (\n <span\n key={stat.label}\n className=\"bg-muted rounded-full px-3 py-1.5 w-20 h-7 animate-pulse inline-block\"\n />\n );\n }\n const pill = (\n <span className=\"inline-flex items-baseline gap-1.5 rounded-full bg-muted px-3 py-1.5 text-[13px] whitespace-nowrap\">\n <span className=\"font-semibold text-foreground tabular-nums\">\n {stat.value}\n </span>\n <span className=\"text-muted-foreground\">{stat.label}</span>\n {stat.sub && (\n <span className=\"text-muted-foreground/70\">\n · {stat.sub}\n </span>\n )}\n </span>\n );\n return stat.href ? (\n <Link key={stat.label} href={stat.href} className=\"active:opacity-80\">\n {pill}\n </Link>\n ) : (\n <span key={stat.label}>{pill}</span>\n );\n })}\n </div>\n )}\n\n {quickActions && quickActions.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {quickActions.map((action) => (\n <Link\n key={action.href}\n href={action.href}\n className=\"inline-flex items-center rounded-full border border-border bg-card px-4 py-1.5 text-[13px] font-medium text-foreground active:opacity-80 hover:border-primary/40 transition-colors\"\n >\n {action.label}\n </Link>\n ))}\n </div>\n )}\n </div>\n )}\n\n {isEmpty ? (\n emptyState\n ) : (\n <div className=\"grid gap-6 lg:grid-cols-5\">\n {assetsSlot && (\n <section className=\"lg:col-span-3 space-y-3\">\n <SectionHeading title=\"Your assets\" href={assetsHref} />\n {assetsSlot}\n </section>\n )}\n {activitySlot && (\n <section className=\"lg:col-span-2 space-y-3\">\n <SectionHeading title=\"Recent activity\" href={activityHref} />\n {activitySlot}\n </section>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/portfolio-overview.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface PortfolioOverviewStat {\n label: string;\n /** Pass null while loading. */\n value: string | number | null;\n sub?: string;\n href?: string;\n}\n\nexport interface PortfolioQuickAction {\n label: string;\n href: string;\n}\n\nexport interface PortfolioOverviewProps {\n stats?: PortfolioOverviewStat[];\n /** Shortcut row under the stat tiles (\"Create asset\", …). */\n quickActions?: PortfolioQuickAction[];\n /**\n * Small/empty portfolio: suppresses the stats+quick-actions row entirely\n * and renders the assets grid full-width. The app computes this from its\n * own asset/pending counts — this component stays presentation-only.\n */\n compact?: boolean;\n /** Recent-assets cards, rendered by the app. */\n assetsSlot?: React.ReactNode;\n assetsHref?: string;\n /** Recent-activity rows, rendered by the app. */\n activitySlot?: React.ReactNode;\n activityHref?: string;\n /** First-run state; rendered instead of the columns when `isEmpty`. */\n isEmpty?: boolean;\n emptyState?: React.ReactNode;\n className?: string;\n}\n\nfunction SectionHeading({\n title,\n href,\n}: {\n title: string;\n href?: string;\n}) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-sm font-semibold text-foreground\">{title}</h2>\n {href && (\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n View all\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n )}\n </div>\n );\n}\n\n/**\n * Portfolio landing page layout: one merged stats/quick-actions row, then\n * recent assets/activity columns. Pure presentation — the app injects\n * counts, stats, and rendered cards. Pending-action counts surface via\n * PortfolioNav's badges, not here.\n */\nexport function PortfolioOverview({\n stats,\n quickActions,\n compact,\n assetsSlot,\n assetsHref,\n activitySlot,\n activityHref,\n isEmpty,\n emptyState,\n className,\n}: PortfolioOverviewProps) {\n const hasActivity = Boolean(activitySlot) && !compact;\n\n return (\n <div className={cn(\"space-y-6\", className)}>\n {!compact && ((stats && stats.length > 0) || (quickActions && quickActions.length > 0)) && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n {stats?.map((stat) => {\n if (stat.value == null) {\n return (\n <span\n key={stat.label}\n className=\"bg-muted rounded-full px-3 py-1.5 w-20 h-7 animate-pulse inline-block\"\n />\n );\n }\n const pill = (\n <span className=\"inline-flex items-baseline gap-1.5 rounded-full bg-muted px-3 py-1.5 text-[13px] whitespace-nowrap\">\n <span className=\"font-semibold text-foreground tabular-nums\">\n {stat.value}\n </span>\n <span className=\"text-muted-foreground\">{stat.label}</span>\n {stat.sub && (\n <span className=\"text-muted-foreground/70\">\n · {stat.sub}\n </span>\n )}\n </span>\n );\n return stat.href ? (\n <Link key={stat.label} href={stat.href} className=\"active:opacity-80\">\n {pill}\n </Link>\n ) : (\n <span key={stat.label}>{pill}</span>\n );\n })}\n\n {quickActions?.map((action) => (\n <Link\n key={action.href}\n href={action.href}\n className=\"inline-flex items-center text-[13px] font-medium text-muted-foreground hover:text-foreground transition-colors px-1\"\n >\n {action.label}\n </Link>\n ))}\n </div>\n )}\n\n {isEmpty ? (\n emptyState\n ) : (\n <div className=\"grid gap-6 lg:grid-cols-5\">\n {assetsSlot && (\n <section className={cn(\"space-y-3\", hasActivity ? \"lg:col-span-3\" : \"lg:col-span-5\")}>\n <SectionHeading title=\"Your assets\" href={assetsHref} />\n {assetsSlot}\n </section>\n )}\n {hasActivity && (\n <section className=\"lg:col-span-2 space-y-3\">\n <SectionHeading title=\"Recent activity\" href={activityHref} />\n {activitySlot}\n </section>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";AAkDM,cAEE,YAFF;AAhDN,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AAqCnB,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AACF,GAGG;AACD,SACE,qBAAC,SAAI,WAAU,2CACb;AAAA,wBAAC,QAAG,WAAU,yCAAyC,iBAAM;AAAA,IAC5D,QACC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAU;AAAA,QACX;AAAA;AAAA,UAEC,oBAAC,cAAW,WAAU,WAAU;AAAA;AAAA;AAAA,IAClC;AAAA,KAEJ;AAEJ;AAQO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,cAAc,QAAQ,YAAY,KAAK,CAAC;AAE9C,SACE,qBAAC,SAAI,WAAW,GAAG,aAAa,SAAS,GACtC;AAAA,KAAC,YAAa,SAAS,MAAM,SAAS,KAAO,gBAAgB,aAAa,SAAS,MAClF,qBAAC,SAAI,WAAU,qCACZ;AAAA,aAAO,IAAI,CAAC,SAAS;AACpB,YAAI,KAAK,SAAS,MAAM;AACtB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA;AAAA,YADL,KAAK;AAAA,UAEZ;AAAA,QAEJ;AACA,cAAM,OACJ,qBAAC,UAAK,WAAU,sGACd;AAAA,8BAAC,UAAK,WAAU,8CACb,eAAK,OACR;AAAA,UACA,oBAAC,UAAK,WAAU,yBAAyB,eAAK,OAAM;AAAA,UACnD,KAAK,OACJ,qBAAC,UAAK,WAAU,4BAA2B;AAAA;AAAA,YACtC,KAAK;AAAA,aACV;AAAA,WAEJ;AAEF,eAAO,KAAK,OACV,oBAAC,QAAsB,MAAM,KAAK,MAAM,WAAU,qBAC/C,kBADQ,KAAK,KAEhB,IAEA,oBAAC,UAAuB,kBAAb,KAAK,KAAa;AAAA,MAEjC,CAAC;AAAA,MAEA,cAAc,IAAI,CAAC,WAClB;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM,OAAO;AAAA,UACb,WAAU;AAAA,UAET,iBAAO;AAAA;AAAA,QAJH,OAAO;AAAA,MAKd,CACD;AAAA,OACH;AAAA,IAGD,UACC,aAEA,qBAAC,SAAI,WAAU,6BACZ;AAAA,oBACC,qBAAC,aAAQ,WAAW,GAAG,aAAa,cAAc,kBAAkB,eAAe,GACjF;AAAA,4BAAC,kBAAe,OAAM,eAAc,MAAM,YAAY;AAAA,QACrD;AAAA,SACH;AAAA,MAED,eACC,qBAAC,aAAQ,WAAU,2BACjB;AAAA,4BAAC,kBAAe,OAAM,mBAAkB,MAAM,cAAc;AAAA,QAC3D;AAAA,SACH;AAAA,OAEJ;AAAA,KAEJ;AAEJ;","names":[]}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var reward_toast_exports = {};
21
+ __export(reward_toast_exports, {
22
+ createRewardToast: () => createRewardToast
23
+ });
24
+ module.exports = __toCommonJS(reward_toast_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_sonner = require("sonner");
27
+ var import_xp_toast_content = require("./xp-toast-content.js");
28
+ function createRewardToast(getRewardsConfig) {
29
+ let configPromise = null;
30
+ function loadConfig() {
31
+ configPromise ?? (configPromise = getRewardsConfig());
32
+ return configPromise;
33
+ }
34
+ return function rewardToast(actionType) {
35
+ loadConfig().then((config) => {
36
+ const action = config.actions.find((a) => a.type === actionType);
37
+ if (!action) return;
38
+ (0, import_sonner.toast)(/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_xp_toast_content.XpToastContent, { xp: action.xp, label: action.label }), { duration: 3500 });
39
+ }).catch(() => {
40
+ configPromise = null;
41
+ });
42
+ };
43
+ }
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ createRewardToast
47
+ });
48
+ //# sourceMappingURL=reward-toast.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/rewards/reward-toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { toast } from \"sonner\";\nimport { XpToastContent } from \"./xp-toast-content.js\";\nimport type { ApiRewardsConfig } from \"@medialane/sdk\";\n\n/**\n * Optimistic XP feedback after a scoring action. Scores recompute on a\n * schedule, so this shows the action's configured value, never a balance.\n * Fire-and-forget: any failure is silent (rewards UI must never break a flow).\n *\n * Each app supplies its own `getRewardsConfig` (bound to its own\n * `MedialaneClient` singleton) — the caching/toast logic lives here once.\n */\nexport function createRewardToast(getRewardsConfig: () => Promise<ApiRewardsConfig>) {\n let configPromise: Promise<ApiRewardsConfig> | null = null;\n function loadConfig() {\n configPromise ??= getRewardsConfig();\n return configPromise;\n }\n\n return function rewardToast(actionType: string): void {\n loadConfig()\n .then((config) => {\n const action = config.actions.find((a) => a.type === actionType);\n if (!action) return;\n toast(<XpToastContent xp={action.xp} label={action.label} />, { duration: 3500 });\n })\n .catch(() => {\n configPromise = null; // retry on the next action\n });\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Bc;AAxBd,oBAAsB;AACtB,8BAA+B;AAWxB,SAAS,kBAAkB,kBAAmD;AACnF,MAAI,gBAAkD;AACtD,WAAS,aAAa;AACpB,sCAAkB,iBAAiB;AACnC,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,YAAY,YAA0B;AACpD,eAAW,EACR,KAAK,CAAC,WAAW;AAChB,YAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAC/D,UAAI,CAAC,OAAQ;AACb,+BAAM,4CAAC,0CAAe,IAAI,OAAO,IAAI,OAAO,OAAO,OAAO,GAAI,EAAE,UAAU,KAAK,CAAC;AAAA,IAClF,CAAC,EACA,MAAM,MAAM;AACX,sBAAgB;AAAA,IAClB,CAAC;AAAA,EACL;AACF;","names":[]}
@@ -0,0 +1,13 @@
1
+ import { ApiRewardsConfig } from '@medialane/sdk';
2
+
3
+ /**
4
+ * Optimistic XP feedback after a scoring action. Scores recompute on a
5
+ * schedule, so this shows the action's configured value, never a balance.
6
+ * Fire-and-forget: any failure is silent (rewards UI must never break a flow).
7
+ *
8
+ * Each app supplies its own `getRewardsConfig` (bound to its own
9
+ * `MedialaneClient` singleton) — the caching/toast logic lives here once.
10
+ */
11
+ declare function createRewardToast(getRewardsConfig: () => Promise<ApiRewardsConfig>): (actionType: string) => void;
12
+
13
+ export { createRewardToast };
@@ -0,0 +1,13 @@
1
+ import { ApiRewardsConfig } from '@medialane/sdk';
2
+
3
+ /**
4
+ * Optimistic XP feedback after a scoring action. Scores recompute on a
5
+ * schedule, so this shows the action's configured value, never a balance.
6
+ * Fire-and-forget: any failure is silent (rewards UI must never break a flow).
7
+ *
8
+ * Each app supplies its own `getRewardsConfig` (bound to its own
9
+ * `MedialaneClient` singleton) — the caching/toast logic lives here once.
10
+ */
11
+ declare function createRewardToast(getRewardsConfig: () => Promise<ApiRewardsConfig>): (actionType: string) => void;
12
+
13
+ export { createRewardToast };
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { toast } from "sonner";
4
+ import { XpToastContent } from "./xp-toast-content.js";
5
+ function createRewardToast(getRewardsConfig) {
6
+ let configPromise = null;
7
+ function loadConfig() {
8
+ configPromise ?? (configPromise = getRewardsConfig());
9
+ return configPromise;
10
+ }
11
+ return function rewardToast(actionType) {
12
+ loadConfig().then((config) => {
13
+ const action = config.actions.find((a) => a.type === actionType);
14
+ if (!action) return;
15
+ toast(/* @__PURE__ */ jsx(XpToastContent, { xp: action.xp, label: action.label }), { duration: 3500 });
16
+ }).catch(() => {
17
+ configPromise = null;
18
+ });
19
+ };
20
+ }
21
+ export {
22
+ createRewardToast
23
+ };
24
+ //# sourceMappingURL=reward-toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/rewards/reward-toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { toast } from \"sonner\";\nimport { XpToastContent } from \"./xp-toast-content.js\";\nimport type { ApiRewardsConfig } from \"@medialane/sdk\";\n\n/**\n * Optimistic XP feedback after a scoring action. Scores recompute on a\n * schedule, so this shows the action's configured value, never a balance.\n * Fire-and-forget: any failure is silent (rewards UI must never break a flow).\n *\n * Each app supplies its own `getRewardsConfig` (bound to its own\n * `MedialaneClient` singleton) — the caching/toast logic lives here once.\n */\nexport function createRewardToast(getRewardsConfig: () => Promise<ApiRewardsConfig>) {\n let configPromise: Promise<ApiRewardsConfig> | null = null;\n function loadConfig() {\n configPromise ??= getRewardsConfig();\n return configPromise;\n }\n\n return function rewardToast(actionType: string): void {\n loadConfig()\n .then((config) => {\n const action = config.actions.find((a) => a.type === actionType);\n if (!action) return;\n toast(<XpToastContent xp={action.xp} label={action.label} />, { duration: 3500 });\n })\n .catch(() => {\n configPromise = null; // retry on the next action\n });\n };\n}\n"],"mappings":";AA0Bc;AAxBd,SAAS,aAAa;AACtB,SAAS,sBAAsB;AAWxB,SAAS,kBAAkB,kBAAmD;AACnF,MAAI,gBAAkD;AACtD,WAAS,aAAa;AACpB,sCAAkB,iBAAiB;AACnC,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,YAAY,YAA0B;AACpD,eAAW,EACR,KAAK,CAAC,WAAW;AAChB,YAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAC/D,UAAI,CAAC,OAAQ;AACb,YAAM,oBAAC,kBAAe,IAAI,OAAO,IAAI,OAAO,OAAO,OAAO,GAAI,EAAE,UAAU,KAAK,CAAC;AAAA,IAClF,CAAC,EACA,MAAM,MAAM;AACX,sBAAgB;AAAA,IAClB,CAAC;AAAA,EACL;AACF;","names":[]}
package/dist/index.cjs CHANGED
@@ -159,13 +159,16 @@ __export(index_exports, {
159
159
  buildEditionStats: () => import_asset_top_sections.buildEditionStats,
160
160
  cn: () => import_cn.cn,
161
161
  coinKind: () => import_coins.coinKind,
162
+ createRewardToast: () => import_reward_toast.createRewardToast,
162
163
  derivePortfolioCounts: () => import_portfolio_counts.derivePortfolioCounts,
163
164
  formatCoinPrice: () => import_coins.formatCoinPrice,
164
165
  formatDisplayPrice: () => import_format.formatDisplayPrice,
165
166
  formatFdv: () => import_coins.formatFdv,
167
+ getReadIds: () => import_notification_storage.getReadIds,
166
168
  ipfsToHttp: () => import_ipfs.ipfsToHttp,
167
169
  isLivingRenderCollection: () => import_living_render_collections.isLivingRenderCollection,
168
170
  licenseSummary: () => import_license_summary.licenseSummary,
171
+ markRead: () => import_notification_storage.markRead,
169
172
  parsePriceDisplay: () => import_format.parsePriceDisplay,
170
173
  shortenAddress: () => import_address.shortenAddress,
171
174
  timeAgo: () => import_time.timeAgo,
@@ -184,6 +187,7 @@ var import_format = require("./utils/format.js");
184
187
  var import_address = require("./utils/address.js");
185
188
  var import_ipfs = require("./utils/ipfs.js");
186
189
  var import_use_intersection_active = require("./utils/use-intersection-active.js");
190
+ var import_notification_storage = require("./utils/notification-storage.js");
187
191
  var import_license_summary = require("./utils/license-summary.js");
188
192
  var import_ip_types = require("./data/ip-types.js");
189
193
  var import_ip = require("./data/ip.js");
@@ -255,6 +259,7 @@ var import_score_summary_card = require("./components/rewards/score-summary-card
255
259
  var import_leaderboard_table = require("./components/rewards/leaderboard-table.js");
256
260
  var import_level_ladder = require("./components/rewards/level-ladder.js");
257
261
  var import_xp_toast_content = require("./components/rewards/xp-toast-content.js");
262
+ var import_reward_toast = require("./components/rewards/reward-toast.js");
258
263
  var import_load_more_sentinel = require("./components/load-more-sentinel.js");
259
264
  var import_community_rewards_section = require("./components/community-rewards-section.js");
260
265
  var import_creator_airdrop_banner = require("./components/creator-airdrop-banner.js");
@@ -408,13 +413,16 @@ var import_action_dialog = require("./components/action-dialog.js");
408
413
  buildEditionStats,
409
414
  cn,
410
415
  coinKind,
416
+ createRewardToast,
411
417
  derivePortfolioCounts,
412
418
  formatCoinPrice,
413
419
  formatDisplayPrice,
414
420
  formatFdv,
421
+ getReadIds,
415
422
  ipfsToHttp,
416
423
  isLivingRenderCollection,
417
424
  licenseSummary,
425
+ markRead,
418
426
  parsePriceDisplay,
419
427
  shortenAddress,
420
428
  timeAgo,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice, parsePriceDisplay } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { useIntersectionActive } from \"./utils/use-intersection-active.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, AssetOwnerRow, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport type { AssetOwnerRowProps } from \"./components/asset-top-sections.js\";\nexport { AssetCollectionBar } from \"./components/asset-collection-bar.js\";\nexport type { AssetCollectionBarProps, AssetCollectionBarSibling } from \"./components/asset-collection-bar.js\";\nexport { AssetUtilityIcons } from \"./components/asset-utility-icons.js\";\nexport type { AssetUtilityIconsProps } from \"./components/asset-utility-icons.js\";\nexport { AssetMarketplacePanel } from \"./components/asset-marketplace-panel.js\";\nexport type { AssetMarketplacePanelProps, ApiOrderLike } from \"./components/asset-marketplace-panel.js\";\nexport { BRAND } from \"./data/brand.js\";\nexport { LIVING_RENDER_COLLECTIONS, isLivingRenderCollection } from \"./data/living-render-collections.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps } from \"./components/token-card.js\";\nexport { AnimatedTokenMedia } from \"./components/animated-token-media.js\";\nexport type { AnimatedTokenMediaProps } from \"./components/animated-token-media.js\";\nexport { ThemeAmbientBackground } from \"./components/theme-ambient-background.js\";\nexport {\n useCollectionFilters, SORT_OPTIONS, CollectionFiltersTrigger, CollectionFiltersBody,\n} from \"./components/collection-filters.js\";\nexport type { TraitSection, CollectionFiltersTriggerProps, CollectionFiltersBodyProps } from \"./components/collection-filters.js\";\nexport {\n DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel,\n DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup,\n DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent,\n DropdownMenuSubTrigger, DropdownMenuRadioGroup,\n} from \"./components/dropdown-menu.js\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\nexport { AssetPicker } from \"./components/asset-picker.js\";\nexport type { AssetPickerProps, OwnedAsset } from \"./components/asset-picker.js\";\nexport { AssetSearchPicker } from \"./components/asset-search-picker.js\";\nexport type { AssetSearchPickerProps } from \"./components/asset-search-picker.js\";\nexport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, MEDIA_TYPES, DURATION_UNITS, toLicenseMetadata, toDurationDays } from \"./components/license-terms-builder.js\";\nexport type { LicenseTermsBuilderProps, SponsorshipTerms, DurationUnit } from \"./components/license-terms-builder.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection, DiscoverActivityStrip } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps, DiscoverActivityStripProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES, useLaunchpadFilter } from \"./components/launchpad-services.js\";\nexport { LaunchpadFilterBar } from \"./components/launchpad-filter-bar.js\";\nexport type { LaunchpadFilterBarProps } from \"./components/launchpad-filter-bar.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.62.0 — nav shell (brand trigger + header buttons + account sheet) ─────\nexport {\n NavBrandButton,\n NavIconButton,\n NavWalletTrigger,\n NavAccountSheet,\n useNavAccountSheet,\n} from \"./components/nav-shell.js\";\nexport type {\n NavBrandButtonProps,\n NavIconButtonProps,\n NavWalletTriggerProps,\n NavAccountSheetProps,\n} from \"./components/nav-shell.js\";\n\n// ── v0.59.0 — portfolio shell (two-level nav + header + overview) ────────────\nexport { PortfolioNav } from \"./components/portfolio-nav.js\";\nexport type {\n PortfolioNavProps,\n PortfolioNavSection,\n PortfolioNavChild,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-nav.js\";\nexport { PortfolioHeader } from \"./components/portfolio-header.js\";\nexport type {\n PortfolioHeaderProps,\n PortfolioHeaderScore,\n} from \"./components/portfolio-header.js\";\nexport { PortfolioOverview } from \"./components/portfolio-overview.js\";\nexport type {\n PortfolioOverviewProps,\n PortfolioOverviewStat,\n PortfolioAttentionItem,\n PortfolioQuickAction,\n} from \"./components/portfolio-overview.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n\n// ── v0.22.0 additions — launchpad/claim form template primitives ─────────────\n// Pure-presentation header + rail shared by every launchpad/claim form. The\n// app supplies its own gate, back button, and form logic. Requires the\n// `.btn-border-animated` class (in @medialane/ui/styles) for the form shell.\nexport { ServiceHeader } from \"./components/service-header.js\";\nexport type { ServiceHeaderProps } from \"./components/service-header.js\";\nexport { ClaimRail } from \"./components/claim-rail.js\";\nexport type { ClaimRailProps } from \"./components/claim-rail.js\";\n\n// ── v0.23.0 additions — slot-based form shell ────────────────────────────────\n// Pure layout (back slot + header + animated-border compartment + 8/4 bento).\n// No auth/router — the app injects its own gate (around children) + back button.\nexport { ServiceFormShell } from \"./components/service-form-shell.js\";\nexport type { ServiceFormShellProps } from \"./components/service-form-shell.js\";\nexport { StepNav } from \"./components/step-nav.js\";\nexport type { StepNavProps, StepNavStep } from \"./components/step-nav.js\";\n\n// Rewards score kit (v0.36.0)\nexport { LevelBadge } from \"./components/rewards/level-badge.js\";\nexport type { LevelBadgeProps } from \"./components/rewards/level-badge.js\";\nexport { XpProgress } from \"./components/rewards/xp-progress.js\";\nexport type { XpProgressProps } from \"./components/rewards/xp-progress.js\";\nexport { BadgeShelf } from \"./components/rewards/badge-shelf.js\";\nexport type { BadgeShelfProps, BadgeShelfBadge } from \"./components/rewards/badge-shelf.js\";\nexport { ScoreSummaryCard } from \"./components/rewards/score-summary-card.js\";\nexport type { ScoreSummaryCardProps } from \"./components/rewards/score-summary-card.js\";\nexport { LeaderboardTable, LeaderboardWidget } from \"./components/rewards/leaderboard-table.js\";\nexport type { LeaderboardTableProps, LeaderboardWidgetProps, LeaderboardEntryLike } from \"./components/rewards/leaderboard-table.js\";\nexport { LevelLadder } from \"./components/rewards/level-ladder.js\";\nexport type { LevelLadderProps } from \"./components/rewards/level-ladder.js\";\nexport { XpToastContent } from \"./components/rewards/xp-toast-content.js\";\nexport type { XpToastContentProps } from \"./components/rewards/xp-toast-content.js\";\n\n// ── v0.37.0 additions — infinite-scroll trigger ──────────────────────────────\nexport { LoadMoreSentinel } from \"./components/load-more-sentinel.js\";\nexport type { LoadMoreSentinelProps } from \"./components/load-more-sentinel.js\";\n\n// ── v0.47.0 additions — community rewards section ────────────────────────────\nexport { CommunityRewardsSection } from \"./components/community-rewards-section.js\";\nexport type { CommunityRewardsSectionProps, CommunityRewardsEntry } from \"./components/community-rewards-section.js\";\nexport { CreatorAirdropBanner } from \"./components/creator-airdrop-banner.js\";\nexport type { CreatorAirdropBannerProps } from \"./components/creator-airdrop-banner.js\";\n\n// ── Design system primitives — action-focus pattern, tokens, data display ────\nexport { ActionButton } from \"./components/action-button.js\";\nexport type { ActionButtonProps, ActionKey, ToneKey } from \"./components/action-button.js\";\nexport { GradientButton } from \"./components/gradient-button.js\";\nexport type { GradientButtonProps } from \"./components/gradient-button.js\";\n\nexport { CoinLaunchPreview } from \"./components/coin-launch-preview.js\";\nexport type { CoinPreviewData } from \"./components/coin-launch-preview.js\";\nexport { MedialaneCollectionCard } from \"./components/medialane-collection-card.js\";\nexport type { MedialaneCollectionCardProps } from \"./components/medialane-collection-card.js\";\nexport { TokenGlyph, TokenAmount } from \"./components/token-glyph.js\";\nexport type { TokenGlyphProps, TokenAmountProps, TokenSymbol } from \"./components/token-glyph.js\";\n\nexport { StatTile, StatPill } from \"./components/stat-tile.js\";\nexport type { StatTileProps, StatPillProps } from \"./components/stat-tile.js\";\n\nexport { ActionDialog } from \"./components/action-dialog.js\";\nexport type { ActionDialogProps } from \"./components/action-dialog.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAmB;AACnB,oBAAsD;AACtD,qBAA+B;AAC/B,kBAA2B;AAC3B,qCAAsC;AACtC,6BAA+B;AAG/B,sBAA+C;AAE/C,gBAGO;AAEP,0BAEO;AAEP,6BAA8B;AAC9B,oCAAqC;AACrC,mCAAoC;AACpC,+BAAgC;AAChC,uCAAwC;AAExC,gCAAqF;AAErF,kCAAmC;AAEnC,iCAAkC;AAElC,qCAAsC;AAEtC,mBAAsB;AACtB,uCAAoE;AAGpE,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAE7C,kCAAmC;AAEnC,sCAAuC;AACvC,gCAEO;AAEP,2BAMO;AACP,wBAA6C;AAE7C,0BAA4B;AAE5B,iCAAkC;AAElC,mCAA6H;AAG7H,mBAGO;AACP,uBAA2F;AAC3F,4BAGO;AAGP,kBAAmC;AACnC,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAA2D;AAE3D,2BAAsE;AAItE,gCAAiG;AACjG,kCAAmC;AAEnC,6BAA+B;AAG/B,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,uBAMO;AASP,2BAA6B;AAO7B,8BAAgC;AAKhC,gCAAkC;AAOlC,8BAAsC;AAOtC,4BAA8B;AAE9B,wBAA0B;AAM1B,gCAAiC;AAEjC,sBAAwB;AAIxB,yBAA2B;AAE3B,yBAA2B;AAE3B,yBAA2B;AAE3B,gCAAiC;AAEjC,+BAAoD;AAEpD,0BAA4B;AAE5B,8BAA+B;AAI/B,gCAAiC;AAIjC,uCAAwC;AAExC,oCAAqC;AAIrC,2BAA6B;AAE7B,6BAA+B;AAG/B,iCAAkC;AAElC,uCAAwC;AAExC,yBAAwC;AAGxC,uBAAmC;AAGnC,2BAA6B;","names":["import_launchpad_services"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice, parsePriceDisplay } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { useIntersectionActive } from \"./utils/use-intersection-active.js\";\nexport { getReadIds, markRead } from \"./utils/notification-storage.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, AssetOwnerRow, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport type { AssetOwnerRowProps } from \"./components/asset-top-sections.js\";\nexport { AssetCollectionBar } from \"./components/asset-collection-bar.js\";\nexport type { AssetCollectionBarProps, AssetCollectionBarSibling } from \"./components/asset-collection-bar.js\";\nexport { AssetUtilityIcons } from \"./components/asset-utility-icons.js\";\nexport type { AssetUtilityIconsProps } from \"./components/asset-utility-icons.js\";\nexport { AssetMarketplacePanel } from \"./components/asset-marketplace-panel.js\";\nexport type { AssetMarketplacePanelProps, ApiOrderLike } from \"./components/asset-marketplace-panel.js\";\nexport { BRAND } from \"./data/brand.js\";\nexport { LIVING_RENDER_COLLECTIONS, isLivingRenderCollection } from \"./data/living-render-collections.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps } from \"./components/token-card.js\";\nexport { AnimatedTokenMedia } from \"./components/animated-token-media.js\";\nexport type { AnimatedTokenMediaProps } from \"./components/animated-token-media.js\";\nexport { ThemeAmbientBackground } from \"./components/theme-ambient-background.js\";\nexport {\n useCollectionFilters, SORT_OPTIONS, CollectionFiltersTrigger, CollectionFiltersBody,\n} from \"./components/collection-filters.js\";\nexport type { TraitSection, CollectionFiltersTriggerProps, CollectionFiltersBodyProps } from \"./components/collection-filters.js\";\nexport {\n DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel,\n DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup,\n DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent,\n DropdownMenuSubTrigger, DropdownMenuRadioGroup,\n} from \"./components/dropdown-menu.js\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\nexport { AssetPicker } from \"./components/asset-picker.js\";\nexport type { AssetPickerProps, OwnedAsset } from \"./components/asset-picker.js\";\nexport { AssetSearchPicker } from \"./components/asset-search-picker.js\";\nexport type { AssetSearchPickerProps } from \"./components/asset-search-picker.js\";\nexport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, MEDIA_TYPES, DURATION_UNITS, toLicenseMetadata, toDurationDays } from \"./components/license-terms-builder.js\";\nexport type { LicenseTermsBuilderProps, SponsorshipTerms, DurationUnit } from \"./components/license-terms-builder.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection, DiscoverActivityStrip } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps, DiscoverActivityStripProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES, useLaunchpadFilter } from \"./components/launchpad-services.js\";\nexport { LaunchpadFilterBar } from \"./components/launchpad-filter-bar.js\";\nexport type { LaunchpadFilterBarProps } from \"./components/launchpad-filter-bar.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.62.0 — nav shell (brand trigger + header buttons + account sheet) ─────\nexport {\n NavBrandButton,\n NavIconButton,\n NavWalletTrigger,\n NavAccountSheet,\n useNavAccountSheet,\n} from \"./components/nav-shell.js\";\nexport type {\n NavBrandButtonProps,\n NavIconButtonProps,\n NavWalletTriggerProps,\n NavAccountSheetProps,\n} from \"./components/nav-shell.js\";\n\n// ── v0.59.0 — portfolio shell (two-level nav + header + overview) ────────────\nexport { PortfolioNav } from \"./components/portfolio-nav.js\";\nexport type {\n PortfolioNavProps,\n PortfolioNavSection,\n PortfolioNavChild,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-nav.js\";\nexport { PortfolioHeader } from \"./components/portfolio-header.js\";\nexport type {\n PortfolioHeaderProps,\n PortfolioHeaderScore,\n} from \"./components/portfolio-header.js\";\nexport { PortfolioOverview } from \"./components/portfolio-overview.js\";\nexport type {\n PortfolioOverviewProps,\n PortfolioOverviewStat,\n PortfolioQuickAction,\n} from \"./components/portfolio-overview.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n\n// ── v0.22.0 additions — launchpad/claim form template primitives ─────────────\n// Pure-presentation header + rail shared by every launchpad/claim form. The\n// app supplies its own gate, back button, and form logic. Requires the\n// `.btn-border-animated` class (in @medialane/ui/styles) for the form shell.\nexport { ServiceHeader } from \"./components/service-header.js\";\nexport type { ServiceHeaderProps } from \"./components/service-header.js\";\nexport { ClaimRail } from \"./components/claim-rail.js\";\nexport type { ClaimRailProps } from \"./components/claim-rail.js\";\n\n// ── v0.23.0 additions — slot-based form shell ────────────────────────────────\n// Pure layout (back slot + header + animated-border compartment + 8/4 bento).\n// No auth/router — the app injects its own gate (around children) + back button.\nexport { ServiceFormShell } from \"./components/service-form-shell.js\";\nexport type { ServiceFormShellProps } from \"./components/service-form-shell.js\";\nexport { StepNav } from \"./components/step-nav.js\";\nexport type { StepNavProps, StepNavStep } from \"./components/step-nav.js\";\n\n// Rewards score kit (v0.36.0)\nexport { LevelBadge } from \"./components/rewards/level-badge.js\";\nexport type { LevelBadgeProps } from \"./components/rewards/level-badge.js\";\nexport { XpProgress } from \"./components/rewards/xp-progress.js\";\nexport type { XpProgressProps } from \"./components/rewards/xp-progress.js\";\nexport { BadgeShelf } from \"./components/rewards/badge-shelf.js\";\nexport type { BadgeShelfProps, BadgeShelfBadge } from \"./components/rewards/badge-shelf.js\";\nexport { ScoreSummaryCard } from \"./components/rewards/score-summary-card.js\";\nexport type { ScoreSummaryCardProps } from \"./components/rewards/score-summary-card.js\";\nexport { LeaderboardTable, LeaderboardWidget } from \"./components/rewards/leaderboard-table.js\";\nexport type { LeaderboardTableProps, LeaderboardWidgetProps, LeaderboardEntryLike } from \"./components/rewards/leaderboard-table.js\";\nexport { LevelLadder } from \"./components/rewards/level-ladder.js\";\nexport type { LevelLadderProps } from \"./components/rewards/level-ladder.js\";\nexport { XpToastContent } from \"./components/rewards/xp-toast-content.js\";\nexport type { XpToastContentProps } from \"./components/rewards/xp-toast-content.js\";\nexport { createRewardToast } from \"./components/rewards/reward-toast.js\";\n\n// ── v0.37.0 additions — infinite-scroll trigger ──────────────────────────────\nexport { LoadMoreSentinel } from \"./components/load-more-sentinel.js\";\nexport type { LoadMoreSentinelProps } from \"./components/load-more-sentinel.js\";\n\n// ── v0.47.0 additions — community rewards section ────────────────────────────\nexport { CommunityRewardsSection } from \"./components/community-rewards-section.js\";\nexport type { CommunityRewardsSectionProps, CommunityRewardsEntry } from \"./components/community-rewards-section.js\";\nexport { CreatorAirdropBanner } from \"./components/creator-airdrop-banner.js\";\nexport type { CreatorAirdropBannerProps } from \"./components/creator-airdrop-banner.js\";\n\n// ── Design system primitives — action-focus pattern, tokens, data display ────\nexport { ActionButton } from \"./components/action-button.js\";\nexport type { ActionButtonProps, ActionKey, ToneKey } from \"./components/action-button.js\";\nexport { GradientButton } from \"./components/gradient-button.js\";\nexport type { GradientButtonProps } from \"./components/gradient-button.js\";\n\nexport { CoinLaunchPreview } from \"./components/coin-launch-preview.js\";\nexport type { CoinPreviewData } from \"./components/coin-launch-preview.js\";\nexport { MedialaneCollectionCard } from \"./components/medialane-collection-card.js\";\nexport type { MedialaneCollectionCardProps } from \"./components/medialane-collection-card.js\";\nexport { TokenGlyph, TokenAmount } from \"./components/token-glyph.js\";\nexport type { TokenGlyphProps, TokenAmountProps, TokenSymbol } from \"./components/token-glyph.js\";\n\nexport { StatTile, StatPill } from \"./components/stat-tile.js\";\nexport type { StatTileProps, StatPillProps } from \"./components/stat-tile.js\";\n\nexport { ActionDialog } from \"./components/action-dialog.js\";\nexport type { ActionDialogProps } from \"./components/action-dialog.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAmB;AACnB,oBAAsD;AACtD,qBAA+B;AAC/B,kBAA2B;AAC3B,qCAAsC;AACtC,kCAAqC;AACrC,6BAA+B;AAG/B,sBAA+C;AAE/C,gBAGO;AAEP,0BAEO;AAEP,6BAA8B;AAC9B,oCAAqC;AACrC,mCAAoC;AACpC,+BAAgC;AAChC,uCAAwC;AAExC,gCAAqF;AAErF,kCAAmC;AAEnC,iCAAkC;AAElC,qCAAsC;AAEtC,mBAAsB;AACtB,uCAAoE;AAGpE,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAE7C,kCAAmC;AAEnC,sCAAuC;AACvC,gCAEO;AAEP,2BAMO;AACP,wBAA6C;AAE7C,0BAA4B;AAE5B,iCAAkC;AAElC,mCAA6H;AAG7H,mBAGO;AACP,uBAA2F;AAC3F,4BAGO;AAGP,kBAAmC;AACnC,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAA2D;AAE3D,2BAAsE;AAItE,gCAAiG;AACjG,kCAAmC;AAEnC,6BAA+B;AAG/B,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,uBAMO;AASP,2BAA6B;AAO7B,8BAAgC;AAKhC,gCAAkC;AAMlC,8BAAsC;AAOtC,4BAA8B;AAE9B,wBAA0B;AAM1B,gCAAiC;AAEjC,sBAAwB;AAIxB,yBAA2B;AAE3B,yBAA2B;AAE3B,yBAA2B;AAE3B,gCAAiC;AAEjC,+BAAoD;AAEpD,0BAA4B;AAE5B,8BAA+B;AAE/B,0BAAkC;AAGlC,gCAAiC;AAIjC,uCAAwC;AAExC,oCAAqC;AAIrC,2BAA6B;AAE7B,6BAA+B;AAG/B,iCAAkC;AAElC,uCAAwC;AAExC,yBAAwC;AAGxC,uBAAmC;AAGnC,2BAA6B;","names":["import_launchpad_services"]}
package/dist/index.d.cts CHANGED
@@ -3,6 +3,7 @@ export { formatDisplayPrice, parsePriceDisplay } from './utils/format.cjs';
3
3
  export { shortenAddress } from './utils/address.cjs';
4
4
  export { ipfsToHttp } from './utils/ipfs.cjs';
5
5
  export { useIntersectionActive } from './utils/use-intersection-active.cjs';
6
+ export { getReadIds, markRead } from './utils/notification-storage.cjs';
6
7
  export { licenseSummary } from './utils/license-summary.cjs';
7
8
  export { IP_TYPE_DATA, IP_TYPE_DATA_MAP, IpTypeData } from './data/ip-types.cjs';
8
9
  export { AI_POLICIES, DERIVATIVES_OPTIONS, GEOGRAPHIC_SCOPES, IPType, IP_TYPES, LICENSE_TRAIT_TYPES, LICENSE_TYPES, LicenseType } from './data/ip.cjs';
@@ -61,7 +62,7 @@ export { NavCommand, NavCommandGroup, NavCommandMenu, NavCommandMenuProps, useNa
61
62
  export { NavAccountSheet, NavAccountSheetProps, NavBrandButton, NavBrandButtonProps, NavIconButton, NavIconButtonProps, NavWalletTrigger, NavWalletTriggerProps, useNavAccountSheet } from './components/nav-shell.cjs';
62
63
  export { PortfolioBadgeVariant, PortfolioNav, PortfolioNavChild, PortfolioNavProps, PortfolioNavSection } from './components/portfolio-nav.cjs';
63
64
  export { PortfolioHeader, PortfolioHeaderProps, PortfolioHeaderScore } from './components/portfolio-header.cjs';
64
- export { PortfolioAttentionItem, PortfolioOverview, PortfolioOverviewProps, PortfolioOverviewStat, PortfolioQuickAction } from './components/portfolio-overview.cjs';
65
+ export { PortfolioOverview, PortfolioOverviewProps, PortfolioOverviewStat, PortfolioQuickAction } from './components/portfolio-overview.cjs';
65
66
  export { CountableOrder, PortfolioCounts, derivePortfolioCounts } from './utils/portfolio-counts.cjs';
66
67
  export { ServiceHeader, ServiceHeaderProps } from './components/service-header.cjs';
67
68
  export { ClaimRail, ClaimRailProps } from './components/claim-rail.cjs';
@@ -74,6 +75,7 @@ export { ScoreSummaryCard, ScoreSummaryCardProps } from './components/rewards/sc
74
75
  export { LeaderboardEntryLike, LeaderboardTable, LeaderboardTableProps, LeaderboardWidget, LeaderboardWidgetProps } from './components/rewards/leaderboard-table.cjs';
75
76
  export { LevelLadder, LevelLadderProps } from './components/rewards/level-ladder.cjs';
76
77
  export { XpToastContent, XpToastContentProps } from './components/rewards/xp-toast-content.cjs';
78
+ export { createRewardToast } from './components/rewards/reward-toast.cjs';
77
79
  export { LoadMoreSentinel, LoadMoreSentinelProps } from './components/load-more-sentinel.cjs';
78
80
  export { CommunityRewardsEntry, CommunityRewardsSection, CommunityRewardsSectionProps } from './components/community-rewards-section.cjs';
79
81
  export { CreatorAirdropBanner, CreatorAirdropBannerProps } from './components/creator-airdrop-banner.cjs';
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export { formatDisplayPrice, parsePriceDisplay } from './utils/format.js';
3
3
  export { shortenAddress } from './utils/address.js';
4
4
  export { ipfsToHttp } from './utils/ipfs.js';
5
5
  export { useIntersectionActive } from './utils/use-intersection-active.js';
6
+ export { getReadIds, markRead } from './utils/notification-storage.js';
6
7
  export { licenseSummary } from './utils/license-summary.js';
7
8
  export { IP_TYPE_DATA, IP_TYPE_DATA_MAP, IpTypeData } from './data/ip-types.js';
8
9
  export { AI_POLICIES, DERIVATIVES_OPTIONS, GEOGRAPHIC_SCOPES, IPType, IP_TYPES, LICENSE_TRAIT_TYPES, LICENSE_TYPES, LicenseType } from './data/ip.js';
@@ -61,7 +62,7 @@ export { NavCommand, NavCommandGroup, NavCommandMenu, NavCommandMenuProps, useNa
61
62
  export { NavAccountSheet, NavAccountSheetProps, NavBrandButton, NavBrandButtonProps, NavIconButton, NavIconButtonProps, NavWalletTrigger, NavWalletTriggerProps, useNavAccountSheet } from './components/nav-shell.js';
62
63
  export { PortfolioBadgeVariant, PortfolioNav, PortfolioNavChild, PortfolioNavProps, PortfolioNavSection } from './components/portfolio-nav.js';
63
64
  export { PortfolioHeader, PortfolioHeaderProps, PortfolioHeaderScore } from './components/portfolio-header.js';
64
- export { PortfolioAttentionItem, PortfolioOverview, PortfolioOverviewProps, PortfolioOverviewStat, PortfolioQuickAction } from './components/portfolio-overview.js';
65
+ export { PortfolioOverview, PortfolioOverviewProps, PortfolioOverviewStat, PortfolioQuickAction } from './components/portfolio-overview.js';
65
66
  export { CountableOrder, PortfolioCounts, derivePortfolioCounts } from './utils/portfolio-counts.js';
66
67
  export { ServiceHeader, ServiceHeaderProps } from './components/service-header.js';
67
68
  export { ClaimRail, ClaimRailProps } from './components/claim-rail.js';
@@ -74,6 +75,7 @@ export { ScoreSummaryCard, ScoreSummaryCardProps } from './components/rewards/sc
74
75
  export { LeaderboardEntryLike, LeaderboardTable, LeaderboardTableProps, LeaderboardWidget, LeaderboardWidgetProps } from './components/rewards/leaderboard-table.js';
75
76
  export { LevelLadder, LevelLadderProps } from './components/rewards/level-ladder.js';
76
77
  export { XpToastContent, XpToastContentProps } from './components/rewards/xp-toast-content.js';
78
+ export { createRewardToast } from './components/rewards/reward-toast.js';
77
79
  export { LoadMoreSentinel, LoadMoreSentinelProps } from './components/load-more-sentinel.js';
78
80
  export { CommunityRewardsEntry, CommunityRewardsSection, CommunityRewardsSectionProps } from './components/community-rewards-section.js';
79
81
  export { CreatorAirdropBanner, CreatorAirdropBannerProps } from './components/creator-airdrop-banner.js';
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { formatDisplayPrice, parsePriceDisplay } from "./utils/format.js";
3
3
  import { shortenAddress } from "./utils/address.js";
4
4
  import { ipfsToHttp } from "./utils/ipfs.js";
5
5
  import { useIntersectionActive } from "./utils/use-intersection-active.js";
6
+ import { getReadIds, markRead } from "./utils/notification-storage.js";
6
7
  import { licenseSummary } from "./utils/license-summary.js";
7
8
  import { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from "./data/ip-types.js";
8
9
  import {
@@ -120,6 +121,7 @@ import { ScoreSummaryCard } from "./components/rewards/score-summary-card.js";
120
121
  import { LeaderboardTable, LeaderboardWidget } from "./components/rewards/leaderboard-table.js";
121
122
  import { LevelLadder } from "./components/rewards/level-ladder.js";
122
123
  import { XpToastContent } from "./components/rewards/xp-toast-content.js";
124
+ import { createRewardToast } from "./components/rewards/reward-toast.js";
123
125
  import { LoadMoreSentinel } from "./components/load-more-sentinel.js";
124
126
  import { CommunityRewardsSection } from "./components/community-rewards-section.js";
125
127
  import { CreatorAirdropBanner } from "./components/creator-airdrop-banner.js";
@@ -272,13 +274,16 @@ export {
272
274
  buildEditionStats,
273
275
  cn,
274
276
  coinKind,
277
+ createRewardToast,
275
278
  derivePortfolioCounts,
276
279
  formatCoinPrice,
277
280
  formatDisplayPrice,
278
281
  formatFdv,
282
+ getReadIds,
279
283
  ipfsToHttp,
280
284
  isLivingRenderCollection,
281
285
  licenseSummary,
286
+ markRead,
282
287
  parsePriceDisplay,
283
288
  shortenAddress,
284
289
  timeAgo,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice, parsePriceDisplay } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { useIntersectionActive } from \"./utils/use-intersection-active.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, AssetOwnerRow, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport type { AssetOwnerRowProps } from \"./components/asset-top-sections.js\";\nexport { AssetCollectionBar } from \"./components/asset-collection-bar.js\";\nexport type { AssetCollectionBarProps, AssetCollectionBarSibling } from \"./components/asset-collection-bar.js\";\nexport { AssetUtilityIcons } from \"./components/asset-utility-icons.js\";\nexport type { AssetUtilityIconsProps } from \"./components/asset-utility-icons.js\";\nexport { AssetMarketplacePanel } from \"./components/asset-marketplace-panel.js\";\nexport type { AssetMarketplacePanelProps, ApiOrderLike } from \"./components/asset-marketplace-panel.js\";\nexport { BRAND } from \"./data/brand.js\";\nexport { LIVING_RENDER_COLLECTIONS, isLivingRenderCollection } from \"./data/living-render-collections.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps } from \"./components/token-card.js\";\nexport { AnimatedTokenMedia } from \"./components/animated-token-media.js\";\nexport type { AnimatedTokenMediaProps } from \"./components/animated-token-media.js\";\nexport { ThemeAmbientBackground } from \"./components/theme-ambient-background.js\";\nexport {\n useCollectionFilters, SORT_OPTIONS, CollectionFiltersTrigger, CollectionFiltersBody,\n} from \"./components/collection-filters.js\";\nexport type { TraitSection, CollectionFiltersTriggerProps, CollectionFiltersBodyProps } from \"./components/collection-filters.js\";\nexport {\n DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel,\n DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup,\n DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent,\n DropdownMenuSubTrigger, DropdownMenuRadioGroup,\n} from \"./components/dropdown-menu.js\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\nexport { AssetPicker } from \"./components/asset-picker.js\";\nexport type { AssetPickerProps, OwnedAsset } from \"./components/asset-picker.js\";\nexport { AssetSearchPicker } from \"./components/asset-search-picker.js\";\nexport type { AssetSearchPickerProps } from \"./components/asset-search-picker.js\";\nexport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, MEDIA_TYPES, DURATION_UNITS, toLicenseMetadata, toDurationDays } from \"./components/license-terms-builder.js\";\nexport type { LicenseTermsBuilderProps, SponsorshipTerms, DurationUnit } from \"./components/license-terms-builder.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection, DiscoverActivityStrip } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps, DiscoverActivityStripProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES, useLaunchpadFilter } from \"./components/launchpad-services.js\";\nexport { LaunchpadFilterBar } from \"./components/launchpad-filter-bar.js\";\nexport type { LaunchpadFilterBarProps } from \"./components/launchpad-filter-bar.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.62.0 — nav shell (brand trigger + header buttons + account sheet) ─────\nexport {\n NavBrandButton,\n NavIconButton,\n NavWalletTrigger,\n NavAccountSheet,\n useNavAccountSheet,\n} from \"./components/nav-shell.js\";\nexport type {\n NavBrandButtonProps,\n NavIconButtonProps,\n NavWalletTriggerProps,\n NavAccountSheetProps,\n} from \"./components/nav-shell.js\";\n\n// ── v0.59.0 — portfolio shell (two-level nav + header + overview) ────────────\nexport { PortfolioNav } from \"./components/portfolio-nav.js\";\nexport type {\n PortfolioNavProps,\n PortfolioNavSection,\n PortfolioNavChild,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-nav.js\";\nexport { PortfolioHeader } from \"./components/portfolio-header.js\";\nexport type {\n PortfolioHeaderProps,\n PortfolioHeaderScore,\n} from \"./components/portfolio-header.js\";\nexport { PortfolioOverview } from \"./components/portfolio-overview.js\";\nexport type {\n PortfolioOverviewProps,\n PortfolioOverviewStat,\n PortfolioAttentionItem,\n PortfolioQuickAction,\n} from \"./components/portfolio-overview.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n\n// ── v0.22.0 additions — launchpad/claim form template primitives ─────────────\n// Pure-presentation header + rail shared by every launchpad/claim form. The\n// app supplies its own gate, back button, and form logic. Requires the\n// `.btn-border-animated` class (in @medialane/ui/styles) for the form shell.\nexport { ServiceHeader } from \"./components/service-header.js\";\nexport type { ServiceHeaderProps } from \"./components/service-header.js\";\nexport { ClaimRail } from \"./components/claim-rail.js\";\nexport type { ClaimRailProps } from \"./components/claim-rail.js\";\n\n// ── v0.23.0 additions — slot-based form shell ────────────────────────────────\n// Pure layout (back slot + header + animated-border compartment + 8/4 bento).\n// No auth/router — the app injects its own gate (around children) + back button.\nexport { ServiceFormShell } from \"./components/service-form-shell.js\";\nexport type { ServiceFormShellProps } from \"./components/service-form-shell.js\";\nexport { StepNav } from \"./components/step-nav.js\";\nexport type { StepNavProps, StepNavStep } from \"./components/step-nav.js\";\n\n// Rewards score kit (v0.36.0)\nexport { LevelBadge } from \"./components/rewards/level-badge.js\";\nexport type { LevelBadgeProps } from \"./components/rewards/level-badge.js\";\nexport { XpProgress } from \"./components/rewards/xp-progress.js\";\nexport type { XpProgressProps } from \"./components/rewards/xp-progress.js\";\nexport { BadgeShelf } from \"./components/rewards/badge-shelf.js\";\nexport type { BadgeShelfProps, BadgeShelfBadge } from \"./components/rewards/badge-shelf.js\";\nexport { ScoreSummaryCard } from \"./components/rewards/score-summary-card.js\";\nexport type { ScoreSummaryCardProps } from \"./components/rewards/score-summary-card.js\";\nexport { LeaderboardTable, LeaderboardWidget } from \"./components/rewards/leaderboard-table.js\";\nexport type { LeaderboardTableProps, LeaderboardWidgetProps, LeaderboardEntryLike } from \"./components/rewards/leaderboard-table.js\";\nexport { LevelLadder } from \"./components/rewards/level-ladder.js\";\nexport type { LevelLadderProps } from \"./components/rewards/level-ladder.js\";\nexport { XpToastContent } from \"./components/rewards/xp-toast-content.js\";\nexport type { XpToastContentProps } from \"./components/rewards/xp-toast-content.js\";\n\n// ── v0.37.0 additions — infinite-scroll trigger ──────────────────────────────\nexport { LoadMoreSentinel } from \"./components/load-more-sentinel.js\";\nexport type { LoadMoreSentinelProps } from \"./components/load-more-sentinel.js\";\n\n// ── v0.47.0 additions — community rewards section ────────────────────────────\nexport { CommunityRewardsSection } from \"./components/community-rewards-section.js\";\nexport type { CommunityRewardsSectionProps, CommunityRewardsEntry } from \"./components/community-rewards-section.js\";\nexport { CreatorAirdropBanner } from \"./components/creator-airdrop-banner.js\";\nexport type { CreatorAirdropBannerProps } from \"./components/creator-airdrop-banner.js\";\n\n// ── Design system primitives — action-focus pattern, tokens, data display ────\nexport { ActionButton } from \"./components/action-button.js\";\nexport type { ActionButtonProps, ActionKey, ToneKey } from \"./components/action-button.js\";\nexport { GradientButton } from \"./components/gradient-button.js\";\nexport type { GradientButtonProps } from \"./components/gradient-button.js\";\n\nexport { CoinLaunchPreview } from \"./components/coin-launch-preview.js\";\nexport type { CoinPreviewData } from \"./components/coin-launch-preview.js\";\nexport { MedialaneCollectionCard } from \"./components/medialane-collection-card.js\";\nexport type { MedialaneCollectionCardProps } from \"./components/medialane-collection-card.js\";\nexport { TokenGlyph, TokenAmount } from \"./components/token-glyph.js\";\nexport type { TokenGlyphProps, TokenAmountProps, TokenSymbol } from \"./components/token-glyph.js\";\n\nexport { StatTile, StatPill } from \"./components/stat-tile.js\";\nexport type { StatTileProps, StatPillProps } from \"./components/stat-tile.js\";\n\nexport { ActionDialog } from \"./components/action-dialog.js\";\nexport type { ActionDialogProps } from \"./components/action-dialog.js\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice, parsePriceDisplay } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { useIntersectionActive } from \"./utils/use-intersection-active.js\";\nexport { getReadIds, markRead } from \"./utils/notification-storage.js\";\nexport { licenseSummary } from \"./utils/license-summary.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, AssetOwnerRow, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport type { AssetOwnerRowProps } from \"./components/asset-top-sections.js\";\nexport { AssetCollectionBar } from \"./components/asset-collection-bar.js\";\nexport type { AssetCollectionBarProps, AssetCollectionBarSibling } from \"./components/asset-collection-bar.js\";\nexport { AssetUtilityIcons } from \"./components/asset-utility-icons.js\";\nexport type { AssetUtilityIconsProps } from \"./components/asset-utility-icons.js\";\nexport { AssetMarketplacePanel } from \"./components/asset-marketplace-panel.js\";\nexport type { AssetMarketplacePanelProps, ApiOrderLike } from \"./components/asset-marketplace-panel.js\";\nexport { BRAND } from \"./data/brand.js\";\nexport { LIVING_RENDER_COLLECTIONS, isLivingRenderCollection } from \"./data/living-render-collections.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps } from \"./components/token-card.js\";\nexport { AnimatedTokenMedia } from \"./components/animated-token-media.js\";\nexport type { AnimatedTokenMediaProps } from \"./components/animated-token-media.js\";\nexport { ThemeAmbientBackground } from \"./components/theme-ambient-background.js\";\nexport {\n useCollectionFilters, SORT_OPTIONS, CollectionFiltersTrigger, CollectionFiltersBody,\n} from \"./components/collection-filters.js\";\nexport type { TraitSection, CollectionFiltersTriggerProps, CollectionFiltersBodyProps } from \"./components/collection-filters.js\";\nexport {\n DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel,\n DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup,\n DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent,\n DropdownMenuSubTrigger, DropdownMenuRadioGroup,\n} from \"./components/dropdown-menu.js\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\nexport { AssetPicker } from \"./components/asset-picker.js\";\nexport type { AssetPickerProps, OwnedAsset } from \"./components/asset-picker.js\";\nexport { AssetSearchPicker } from \"./components/asset-search-picker.js\";\nexport type { AssetSearchPickerProps } from \"./components/asset-search-picker.js\";\nexport { LicenseTermsBuilder, EMPTY_SPONSORSHIP_TERMS, MEDIA_TYPES, DURATION_UNITS, toLicenseMetadata, toDurationDays } from \"./components/license-terms-builder.js\";\nexport type { LicenseTermsBuilderProps, SponsorshipTerms, DurationUnit } from \"./components/license-terms-builder.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection, DiscoverActivityStrip } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps, DiscoverActivityStripProps } from \"./components/discover-feed-section.js\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES, useLaunchpadFilter } from \"./components/launchpad-services.js\";\nexport { LaunchpadFilterBar } from \"./components/launchpad-filter-bar.js\";\nexport type { LaunchpadFilterBarProps } from \"./components/launchpad-filter-bar.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.62.0 — nav shell (brand trigger + header buttons + account sheet) ─────\nexport {\n NavBrandButton,\n NavIconButton,\n NavWalletTrigger,\n NavAccountSheet,\n useNavAccountSheet,\n} from \"./components/nav-shell.js\";\nexport type {\n NavBrandButtonProps,\n NavIconButtonProps,\n NavWalletTriggerProps,\n NavAccountSheetProps,\n} from \"./components/nav-shell.js\";\n\n// ── v0.59.0 — portfolio shell (two-level nav + header + overview) ────────────\nexport { PortfolioNav } from \"./components/portfolio-nav.js\";\nexport type {\n PortfolioNavProps,\n PortfolioNavSection,\n PortfolioNavChild,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-nav.js\";\nexport { PortfolioHeader } from \"./components/portfolio-header.js\";\nexport type {\n PortfolioHeaderProps,\n PortfolioHeaderScore,\n} from \"./components/portfolio-header.js\";\nexport { PortfolioOverview } from \"./components/portfolio-overview.js\";\nexport type {\n PortfolioOverviewProps,\n PortfolioOverviewStat,\n PortfolioQuickAction,\n} from \"./components/portfolio-overview.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n\n// ── v0.22.0 additions — launchpad/claim form template primitives ─────────────\n// Pure-presentation header + rail shared by every launchpad/claim form. The\n// app supplies its own gate, back button, and form logic. Requires the\n// `.btn-border-animated` class (in @medialane/ui/styles) for the form shell.\nexport { ServiceHeader } from \"./components/service-header.js\";\nexport type { ServiceHeaderProps } from \"./components/service-header.js\";\nexport { ClaimRail } from \"./components/claim-rail.js\";\nexport type { ClaimRailProps } from \"./components/claim-rail.js\";\n\n// ── v0.23.0 additions — slot-based form shell ────────────────────────────────\n// Pure layout (back slot + header + animated-border compartment + 8/4 bento).\n// No auth/router — the app injects its own gate (around children) + back button.\nexport { ServiceFormShell } from \"./components/service-form-shell.js\";\nexport type { ServiceFormShellProps } from \"./components/service-form-shell.js\";\nexport { StepNav } from \"./components/step-nav.js\";\nexport type { StepNavProps, StepNavStep } from \"./components/step-nav.js\";\n\n// Rewards score kit (v0.36.0)\nexport { LevelBadge } from \"./components/rewards/level-badge.js\";\nexport type { LevelBadgeProps } from \"./components/rewards/level-badge.js\";\nexport { XpProgress } from \"./components/rewards/xp-progress.js\";\nexport type { XpProgressProps } from \"./components/rewards/xp-progress.js\";\nexport { BadgeShelf } from \"./components/rewards/badge-shelf.js\";\nexport type { BadgeShelfProps, BadgeShelfBadge } from \"./components/rewards/badge-shelf.js\";\nexport { ScoreSummaryCard } from \"./components/rewards/score-summary-card.js\";\nexport type { ScoreSummaryCardProps } from \"./components/rewards/score-summary-card.js\";\nexport { LeaderboardTable, LeaderboardWidget } from \"./components/rewards/leaderboard-table.js\";\nexport type { LeaderboardTableProps, LeaderboardWidgetProps, LeaderboardEntryLike } from \"./components/rewards/leaderboard-table.js\";\nexport { LevelLadder } from \"./components/rewards/level-ladder.js\";\nexport type { LevelLadderProps } from \"./components/rewards/level-ladder.js\";\nexport { XpToastContent } from \"./components/rewards/xp-toast-content.js\";\nexport type { XpToastContentProps } from \"./components/rewards/xp-toast-content.js\";\nexport { createRewardToast } from \"./components/rewards/reward-toast.js\";\n\n// ── v0.37.0 additions — infinite-scroll trigger ──────────────────────────────\nexport { LoadMoreSentinel } from \"./components/load-more-sentinel.js\";\nexport type { LoadMoreSentinelProps } from \"./components/load-more-sentinel.js\";\n\n// ── v0.47.0 additions — community rewards section ────────────────────────────\nexport { CommunityRewardsSection } from \"./components/community-rewards-section.js\";\nexport type { CommunityRewardsSectionProps, CommunityRewardsEntry } from \"./components/community-rewards-section.js\";\nexport { CreatorAirdropBanner } from \"./components/creator-airdrop-banner.js\";\nexport type { CreatorAirdropBannerProps } from \"./components/creator-airdrop-banner.js\";\n\n// ── Design system primitives — action-focus pattern, tokens, data display ────\nexport { ActionButton } from \"./components/action-button.js\";\nexport type { ActionButtonProps, ActionKey, ToneKey } from \"./components/action-button.js\";\nexport { GradientButton } from \"./components/gradient-button.js\";\nexport type { GradientButtonProps } from \"./components/gradient-button.js\";\n\nexport { CoinLaunchPreview } from \"./components/coin-launch-preview.js\";\nexport type { CoinPreviewData } from \"./components/coin-launch-preview.js\";\nexport { MedialaneCollectionCard } from \"./components/medialane-collection-card.js\";\nexport type { MedialaneCollectionCardProps } from \"./components/medialane-collection-card.js\";\nexport { TokenGlyph, TokenAmount } from \"./components/token-glyph.js\";\nexport type { TokenGlyphProps, TokenAmountProps, TokenSymbol } from \"./components/token-glyph.js\";\n\nexport { StatTile, StatPill } from \"./components/stat-tile.js\";\nexport type { StatTileProps, StatPillProps } from \"./components/stat-tile.js\";\n\nexport { ActionDialog } from \"./components/action-dialog.js\";\nexport type { ActionDialogProps } from \"./components/action-dialog.js\";\n"],"mappings":"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","names":[]}
@@ -0,0 +1,52 @@
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_storage_exports = {};
20
+ __export(notification_storage_exports, {
21
+ getReadIds: () => getReadIds,
22
+ markRead: () => markRead
23
+ });
24
+ module.exports = __toCommonJS(notification_storage_exports);
25
+ const KEY = "ml-notification-reads";
26
+ function getReadIds() {
27
+ if (typeof window === "undefined") return /* @__PURE__ */ new Set();
28
+ try {
29
+ const raw = localStorage.getItem(KEY);
30
+ const parsed = raw ? JSON.parse(raw) : [];
31
+ if (!Array.isArray(parsed)) return /* @__PURE__ */ new Set();
32
+ return new Set(parsed);
33
+ } catch {
34
+ return /* @__PURE__ */ new Set();
35
+ }
36
+ }
37
+ function markRead(ids) {
38
+ if (typeof window === "undefined") return;
39
+ try {
40
+ const existing = getReadIds();
41
+ ids.forEach((id) => existing.add(id));
42
+ const arr = [...existing].slice(-1e3);
43
+ localStorage.setItem(KEY, JSON.stringify(arr));
44
+ } catch {
45
+ }
46
+ }
47
+ // Annotate the CommonJS export names for ESM import in node:
48
+ 0 && (module.exports = {
49
+ getReadIds,
50
+ markRead
51
+ });
52
+ //# sourceMappingURL=notification-storage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/notification-storage.ts"],"sourcesContent":["const KEY = \"ml-notification-reads\";\n\nexport function getReadIds(): Set<string> {\n if (typeof window === \"undefined\") return new Set();\n try {\n const raw = localStorage.getItem(KEY);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n if (!Array.isArray(parsed)) return new Set();\n return new Set(parsed as string[]);\n } catch {\n return new Set();\n }\n}\n\nexport function markRead(ids: string[]): void {\n if (typeof window === \"undefined\") return;\n try {\n const existing = getReadIds();\n ids.forEach((id) => existing.add(id));\n // Cap at 1000 entries to prevent unbounded growth\n const arr = [...existing].slice(-1000);\n localStorage.setItem(KEY, JSON.stringify(arr));\n } catch { /* ignore */ }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,MAAM;AAEL,SAAS,aAA0B;AACxC,MAAI,OAAO,WAAW,YAAa,QAAO,oBAAI,IAAI;AAClD,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,GAAG;AACpC,UAAM,SAAkB,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;AACjD,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,oBAAI,IAAI;AAC3C,WAAO,IAAI,IAAI,MAAkB;AAAA,EACnC,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AACF;AAEO,SAAS,SAAS,KAAqB;AAC5C,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI;AACF,UAAM,WAAW,WAAW;AAC5B,QAAI,QAAQ,CAAC,OAAO,SAAS,IAAI,EAAE,CAAC;AAEpC,UAAM,MAAM,CAAC,GAAG,QAAQ,EAAE,MAAM,IAAK;AACrC,iBAAa,QAAQ,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,EAC/C,QAAQ;AAAA,EAAe;AACzB;","names":[]}
@@ -0,0 +1,4 @@
1
+ declare function getReadIds(): Set<string>;
2
+ declare function markRead(ids: string[]): void;
3
+
4
+ export { getReadIds, markRead };
@@ -0,0 +1,4 @@
1
+ declare function getReadIds(): Set<string>;
2
+ declare function markRead(ids: string[]): void;
3
+
4
+ export { getReadIds, markRead };
@@ -0,0 +1,27 @@
1
+ const KEY = "ml-notification-reads";
2
+ function getReadIds() {
3
+ if (typeof window === "undefined") return /* @__PURE__ */ new Set();
4
+ try {
5
+ const raw = localStorage.getItem(KEY);
6
+ const parsed = raw ? JSON.parse(raw) : [];
7
+ if (!Array.isArray(parsed)) return /* @__PURE__ */ new Set();
8
+ return new Set(parsed);
9
+ } catch {
10
+ return /* @__PURE__ */ new Set();
11
+ }
12
+ }
13
+ function markRead(ids) {
14
+ if (typeof window === "undefined") return;
15
+ try {
16
+ const existing = getReadIds();
17
+ ids.forEach((id) => existing.add(id));
18
+ const arr = [...existing].slice(-1e3);
19
+ localStorage.setItem(KEY, JSON.stringify(arr));
20
+ } catch {
21
+ }
22
+ }
23
+ export {
24
+ getReadIds,
25
+ markRead
26
+ };
27
+ //# sourceMappingURL=notification-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/notification-storage.ts"],"sourcesContent":["const KEY = \"ml-notification-reads\";\n\nexport function getReadIds(): Set<string> {\n if (typeof window === \"undefined\") return new Set();\n try {\n const raw = localStorage.getItem(KEY);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n if (!Array.isArray(parsed)) return new Set();\n return new Set(parsed as string[]);\n } catch {\n return new Set();\n }\n}\n\nexport function markRead(ids: string[]): void {\n if (typeof window === \"undefined\") return;\n try {\n const existing = getReadIds();\n ids.forEach((id) => existing.add(id));\n // Cap at 1000 entries to prevent unbounded growth\n const arr = [...existing].slice(-1000);\n localStorage.setItem(KEY, JSON.stringify(arr));\n } catch { /* ignore */ }\n}\n"],"mappings":"AAAA,MAAM,MAAM;AAEL,SAAS,aAA0B;AACxC,MAAI,OAAO,WAAW,YAAa,QAAO,oBAAI,IAAI;AAClD,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,GAAG;AACpC,UAAM,SAAkB,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;AACjD,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,oBAAI,IAAI;AAC3C,WAAO,IAAI,IAAI,MAAkB;AAAA,EACnC,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AACF;AAEO,SAAS,SAAS,KAAqB;AAC5C,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI;AACF,UAAM,WAAW,WAAW;AAC5B,QAAI,QAAQ,CAAC,OAAO,SAAS,IAAI,EAAE,CAAC;AAEpC,UAAM,MAAM,CAAC,GAAG,QAAQ,EAAE,MAAM,IAAK;AACrC,iBAAa,QAAQ,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,EAC/C,QAAQ;AAAA,EAAe;AACzB;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medialane/ui",
3
- "version": "0.90.3",
3
+ "version": "0.92.0",
4
4
  "description": "Shared UI components for Medialane apps",
5
5
  "type": "module",
6
6
  "sideEffects": false,