@medialane/ui 0.5.4 → 0.7.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.
@@ -9,8 +9,54 @@ import {
9
9
  Users,
10
10
  RefreshCw,
11
11
  Coins,
12
- TrendingUp
12
+ TrendingUp,
13
+ AtSign,
14
+ FolderInput
13
15
  } from "lucide-react";
16
+ const LAUNCHPAD_SERVICE_GROUPS = [
17
+ {
18
+ key: "single-edition",
19
+ title: "Single Edition NFTs",
20
+ badge: "ERC-721",
21
+ tagline: "Publish one-of-one works and group them under your own brand."
22
+ },
23
+ {
24
+ key: "limited-editions",
25
+ title: "Limited Editions",
26
+ badge: "ERC-1155",
27
+ tagline: "Release your work in numbered multiples collectors can buy and trade."
28
+ },
29
+ {
30
+ key: "creator-coins",
31
+ title: "Creator Coins",
32
+ tagline: "Launch your own coin with a public liquidity pool you control."
33
+ },
34
+ {
35
+ key: "collection-drop",
36
+ title: "Collection Drop",
37
+ tagline: "Timed releases with mint windows your community can race to collect."
38
+ },
39
+ {
40
+ key: "pop-protocol",
41
+ title: "POP Protocol",
42
+ tagline: "Credentials for your events and community \u2014 permanent, non-transferable proof."
43
+ },
44
+ {
45
+ key: "licensing-remix",
46
+ title: "Licensing & Remix",
47
+ tagline: "Licensed derivatives with attribution and royalties flowing back to you."
48
+ },
49
+ {
50
+ key: "claims",
51
+ title: "Claims",
52
+ tagline: "Free wins that build your creator profile and bring your existing work onchain."
53
+ },
54
+ {
55
+ key: "coming-soon",
56
+ title: "Coming soon",
57
+ tagline: "More monetization services on the way."
58
+ }
59
+ ];
14
60
  const LAUNCHPAD_SERVICE_DEFINITIONS = [
15
61
  // ── Create ────────────────────────────────────────────────────────────────
16
62
  {
@@ -26,7 +72,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
26
72
  buttonColor: "bg-brand-blue hover:bg-brand-blue/90",
27
73
  badge: "Create",
28
74
  status: "live",
29
- category: "create"
75
+ category: "create",
76
+ group: "single-edition"
30
77
  },
31
78
  {
32
79
  key: "create-collection",
@@ -41,7 +88,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
41
88
  buttonColor: "bg-brand-purple hover:bg-brand-purple/90",
42
89
  badge: "Create",
43
90
  status: "live",
44
- category: "create"
91
+ category: "create",
92
+ group: "single-edition"
45
93
  },
46
94
  {
47
95
  key: "ip-collection-1155",
@@ -56,7 +104,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
56
104
  buttonColor: "bg-violet-600 hover:bg-violet-700",
57
105
  badge: "Create",
58
106
  status: "live",
59
- category: "create"
107
+ category: "create",
108
+ group: "limited-editions"
60
109
  },
61
110
  {
62
111
  key: "mint-editions",
@@ -71,7 +120,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
71
120
  buttonColor: "bg-fuchsia-600 hover:bg-fuchsia-700",
72
121
  badge: "Create",
73
122
  status: "live",
74
- category: "create"
123
+ category: "create",
124
+ group: "limited-editions"
75
125
  },
76
126
  {
77
127
  key: "remix-asset",
@@ -86,7 +136,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
86
136
  buttonColor: "bg-brand-rose hover:bg-brand-rose/90",
87
137
  badge: "Create",
88
138
  status: "live",
89
- category: "create"
139
+ category: "create",
140
+ group: "licensing-remix"
90
141
  },
91
142
  // ── Launch ────────────────────────────────────────────────────────────────
92
143
  {
@@ -103,7 +154,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
103
154
  badge: "Launch",
104
155
  browseLinkLabel: "Browse events",
105
156
  status: "live",
106
- category: "launch"
157
+ category: "launch",
158
+ group: "pop-protocol"
107
159
  },
108
160
  {
109
161
  key: "collection-drop",
@@ -119,7 +171,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
119
171
  badge: "Launch",
120
172
  browseLinkLabel: "Browse drops",
121
173
  status: "live",
122
- category: "launch"
174
+ category: "launch",
175
+ group: "collection-drop"
123
176
  },
124
177
  {
125
178
  key: "ip-tickets",
@@ -133,7 +186,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
133
186
  iconColor: "text-teal-500",
134
187
  badge: "Soon",
135
188
  status: "building",
136
- category: "launch"
189
+ category: "launch",
190
+ group: "coming-soon"
137
191
  },
138
192
  {
139
193
  key: "membership",
@@ -147,7 +201,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
147
201
  iconColor: "text-indigo-400",
148
202
  badge: "Soon",
149
203
  status: "soon",
150
- category: "launch"
204
+ category: "launch",
205
+ group: "coming-soon"
151
206
  },
152
207
  // ── Monetize ─────────────────────────────────────────────────────────────
153
208
  {
@@ -162,7 +217,8 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
162
217
  iconColor: "text-sky-400",
163
218
  badge: "Soon",
164
219
  status: "soon",
165
- category: "monetize"
220
+ category: "monetize",
221
+ group: "coming-soon"
166
222
  },
167
223
  {
168
224
  key: "ip-coins",
@@ -176,24 +232,77 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
176
232
  iconColor: "text-amber-400",
177
233
  badge: "Soon",
178
234
  status: "soon",
179
- category: "monetize"
235
+ category: "monetize",
236
+ group: "coming-soon"
180
237
  },
181
238
  {
182
239
  key: "creator-coins",
183
- title: "Creator Coins",
184
- subtitle: "Personal social token for fans",
185
- description: "Launch a social token tied to your creative career. Let fans invest directly in your work \u2014 full economic alignment between creator and community.",
186
- features: ["Personal social token", "Fan investment", "Creator-community alignment"],
240
+ title: "Creator Coin",
241
+ subtitle: "Your own coin, your liquidity",
242
+ description: "Launch a standard ERC-20 coin tied to your creative work, paired with a public Ekubo liquidity pool. You set the supply and allocation \u2014 and you stay in control of the liquidity.",
243
+ features: ["Standard ERC-20", "Public Ekubo pool", "You control the liquidity"],
187
244
  icon: TrendingUp,
188
245
  gradient: "from-pink-500/6 via-rose-400/2 to-transparent",
189
- borderColor: "border-pink-500/10",
246
+ borderColor: "border-pink-500/20",
190
247
  iconColor: "text-pink-400",
248
+ buttonColor: "bg-brand-rose hover:bg-brand-rose/90",
191
249
  badge: "Soon",
192
250
  status: "soon",
193
- category: "monetize"
251
+ category: "monetize",
252
+ group: "creator-coins"
253
+ },
254
+ // ── Claims ────────────────────────────────────────────────────────────────
255
+ {
256
+ key: "claim-memecoin",
257
+ title: "Claim Memecoin",
258
+ subtitle: "Bring your Starknet coin to Medialane",
259
+ description: "Already launched a coin on Starknet (unrug or partner)? Claim it to add it to Medialane \u2014 reviewed by our team, then live on the Coins page and your profile.",
260
+ features: ["unrug & partner coins", "Team reviewed", "Lists on /coins"],
261
+ icon: Coins,
262
+ gradient: "from-orange-500/10 via-amber-400/4 to-transparent",
263
+ borderColor: "border-orange-500/20",
264
+ iconColor: "text-orange-500",
265
+ buttonColor: "bg-orange-600 hover:bg-orange-700",
266
+ badge: "Claim",
267
+ status: "soon",
268
+ category: "monetize",
269
+ group: "creator-coins"
270
+ },
271
+ {
272
+ key: "claim-username",
273
+ title: "Claim Username",
274
+ subtitle: "Reserve your creator page URL",
275
+ description: "Claim your unique username and get a shareable creator page \u2014 your public portfolio at a clean, memorable URL. Free, and yours.",
276
+ features: ["Free claim", "Shareable creator page", "Your public portfolio"],
277
+ icon: AtSign,
278
+ gradient: "from-violet-500/10 via-purple-400/4 to-transparent",
279
+ borderColor: "border-violet-500/20",
280
+ iconColor: "text-violet-500",
281
+ buttonColor: "bg-brand-purple hover:bg-brand-purple/90",
282
+ badge: "Claim",
283
+ status: "live",
284
+ category: "create",
285
+ group: "claims"
286
+ },
287
+ {
288
+ key: "claim-collection",
289
+ title: "Claim Collection",
290
+ subtitle: "Import an existing Starknet collection",
291
+ description: "Already deployed an ERC-721 collection on Starknet? Claim it to link it to your Medialane profile and give it a branded collection page.",
292
+ features: ["Import existing ERC-721", "Linked to your profile", "Branded collection page"],
293
+ icon: FolderInput,
294
+ gradient: "from-blue-500/10 via-sky-400/4 to-transparent",
295
+ borderColor: "border-blue-500/20",
296
+ iconColor: "text-blue-500",
297
+ buttonColor: "bg-brand-blue hover:bg-brand-blue/90",
298
+ badge: "Claim",
299
+ status: "live",
300
+ category: "create",
301
+ group: "claims"
194
302
  }
195
303
  ];
196
304
  export {
197
- LAUNCHPAD_SERVICE_DEFINITIONS
305
+ LAUNCHPAD_SERVICE_DEFINITIONS,
306
+ LAUNCHPAD_SERVICE_GROUPS
198
307
  };
199
308
  //# sourceMappingURL=launchpad-services.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data/launchpad-services.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport {\n ImagePlus, Layers, GitBranch,\n Award, Package, PlusCircle,\n Ticket, Users,\n RefreshCw, Coins, TrendingUp,\n} from \"lucide-react\";\n\nexport type ServiceStatus = \"live\" | \"building\" | \"soon\";\nexport type ServiceCategory = \"create\" | \"launch\" | \"monetize\";\n\nexport interface ServiceDefinition {\n key: string;\n title: string;\n subtitle: string;\n description: string;\n features: string[];\n icon: LucideIcon;\n gradient: string;\n borderColor: string;\n iconColor: string;\n buttonColor?: string;\n badge: string;\n status: ServiceStatus;\n category: ServiceCategory;\n /** Secondary browse link label — injected app adds the href */\n browseLinkLabel?: string;\n}\n\nexport const LAUNCHPAD_SERVICE_DEFINITIONS: ServiceDefinition[] = [\n // ── Create ────────────────────────────────────────────────────────────────\n {\n key: \"mint-ip-asset\",\n title: \"Mint IP NFT\",\n subtitle: \"Publish any creative work on Starknet\",\n description:\n \"Turn any photo, video, or audio file into a programmable IP NFT. Gasless, permanent, and immediately tradeable on Medialane.\",\n features: [\"Gasless via ChipiPay\", \"IPFS metadata\", \"Programmable licensing\"],\n icon: ImagePlus,\n gradient: \"from-blue-500/10 via-sky-400/4 to-transparent\",\n borderColor: \"border-blue-500/20\",\n iconColor: \"text-blue-500\",\n buttonColor: \"bg-brand-blue hover:bg-brand-blue/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n {\n key: \"create-collection\",\n title: \"Create Collection\",\n subtitle: \"Group your NFTs under a shared identity\",\n description:\n \"Deploy a branded ERC-721 collection with its own page, metadata, and on-chain identity — ready to populate with assets at any time.\",\n features: [\"Factory-deployed ERC-721\", \"Branded collection page\", \"Add assets at any time\"],\n icon: Layers,\n gradient: \"from-violet-500/10 via-purple-400/4 to-transparent\",\n borderColor: \"border-violet-500/20\",\n iconColor: \"text-violet-500\",\n buttonColor: \"bg-brand-purple hover:bg-brand-purple/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n {\n key: \"ip-collection-1155\",\n title: \"Edition Collection\",\n subtitle: \"Deploy a contract for multi-copy NFT releases\",\n description:\n \"Launch a collection for music tracks, art prints, or any IP you want to release in multiples. Each edition token is numbered and tradeable on Medialane.\",\n features: [\"Multi-edition ERC-1155\", \"Immutable provenance\", \"Tradeable on Medialane\"],\n icon: Layers,\n gradient: \"from-violet-500/10 via-purple-400/4 to-transparent\",\n borderColor: \"border-violet-500/20\",\n iconColor: \"text-violet-500\",\n buttonColor: \"bg-violet-600 hover:bg-violet-700\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n {\n key: \"mint-editions\",\n title: \"Mint NFT Editions\",\n subtitle: \"Add new editions to an existing collection\",\n description:\n \"Select one of your Edition Collection contracts and mint new token editions into it — set supply, upload artwork, and release to collectors.\",\n features: [\"Choose any edition collection\", \"Set edition supply\", \"IPFS metadata\"],\n icon: PlusCircle,\n gradient: \"from-fuchsia-500/10 via-violet-400/4 to-transparent\",\n borderColor: \"border-fuchsia-500/20\",\n iconColor: \"text-fuchsia-500\",\n buttonColor: \"bg-fuchsia-600 hover:bg-fuchsia-700\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n {\n key: \"remix-asset\",\n title: \"Remix Asset\",\n subtitle: \"Derivative works with on-chain attribution\",\n description:\n \"Create a licensed derivative of any IP asset with full provenance and attribution flowing back to the original creator.\",\n features: [\"On-chain attribution\", \"License-enforced at mint\", \"Royalties to original creator\"],\n icon: GitBranch,\n gradient: \"from-rose-500/10 via-pink-400/4 to-transparent\",\n borderColor: \"border-rose-500/20\",\n iconColor: \"text-rose-500\",\n buttonColor: \"bg-brand-rose hover:bg-brand-rose/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n\n // ── Launch ────────────────────────────────────────────────────────────────\n {\n key: \"pop-protocol\",\n title: \"POP Protocol\",\n subtitle: \"Proof-of-participation for events & communities\",\n description:\n \"Give every attendee proof they were there. Issue soulbound credentials to your community — one non-transferable badge per wallet, permanently on-chain. Works for bootcamps, hackathons, and conferences.\",\n features: [\"Soulbound · non-transferable\", \"One credential per wallet\", \"Optional allowlist gating\"],\n icon: Award,\n gradient: \"from-emerald-500/10 via-green-400/4 to-transparent\",\n borderColor: \"border-emerald-500/20\",\n iconColor: \"text-emerald-500\",\n buttonColor: \"bg-green-600 hover:bg-green-700\",\n badge: \"Launch\",\n browseLinkLabel: \"Browse events\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"collection-drop\",\n title: \"Collection Drop\",\n subtitle: \"Limited-edition timed releases\",\n description:\n \"Launch a fixed-supply ERC-721 drop with a defined mint window and per-wallet limit. Set your open date and let your community race to collect.\",\n features: [\"Fixed supply cap\", \"Timed mint window\", \"Free or paid mint\"],\n icon: Package,\n gradient: \"from-orange-500/10 via-amber-400/4 to-transparent\",\n borderColor: \"border-orange-500/20\",\n iconColor: \"text-orange-500\",\n buttonColor: \"bg-orange-600 hover:bg-orange-700\",\n badge: \"Launch\",\n browseLinkLabel: \"Browse drops\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"ip-tickets\",\n title: \"IP Tickets\",\n subtitle: \"Gate real-world experiences with NFTs\",\n description:\n \"Distribute tickets for concerts, workshops, and events. Each ticket is verifiable on-chain proof of attendance.\",\n features: [\"NFT-based event gating\", \"Proof of attendance\", \"Transferable or soulbound\"],\n icon: Ticket,\n gradient: \"from-teal-500/7 via-cyan-400/3 to-transparent\",\n borderColor: \"border-teal-500/15\",\n iconColor: \"text-teal-500\",\n badge: \"Soon\",\n status: \"building\",\n category: \"launch\",\n },\n {\n key: \"membership\",\n title: \"Membership\",\n subtitle: \"Token-gated access passes\",\n description:\n \"Create tiered membership passes that unlock exclusive content, private communities, and experiences for your most loyal fans.\",\n features: [\"Token-gated content\", \"Tiered access levels\", \"Community alignment\"],\n icon: Users,\n gradient: \"from-indigo-500/6 via-violet-400/2 to-transparent\",\n borderColor: \"border-indigo-500/10\",\n iconColor: \"text-indigo-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"launch\",\n },\n\n // ── Monetize ─────────────────────────────────────────────────────────────\n {\n key: \"subscriptions\",\n title: \"Subscriptions\",\n subtitle: \"Recurring on-chain revenue\",\n description:\n \"Monthly licensing, creator support tiers, and access passes — all auto-renewed without intermediaries.\",\n features: [\"Recurring revenue\", \"Auto-renewal protocol\", \"No middlemen\"],\n icon: RefreshCw,\n gradient: \"from-sky-500/6 via-blue-400/2 to-transparent\",\n borderColor: \"border-sky-500/10\",\n iconColor: \"text-sky-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n {\n key: \"ip-coins\",\n title: \"IP Coins\",\n subtitle: \"Fractional ownership of intellectual property\",\n description:\n \"Tokenize your IP catalog as fungible tokens. Enable fractional ownership and liquid markets around your creative work.\",\n features: [\"Fungible IP tokens\", \"Fractional ownership\", \"Liquid secondary markets\"],\n icon: Coins,\n gradient: \"from-amber-500/6 via-yellow-400/2 to-transparent\",\n borderColor: \"border-amber-500/10\",\n iconColor: \"text-amber-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n {\n key: \"creator-coins\",\n title: \"Creator Coins\",\n subtitle: \"Personal social token for fans\",\n description:\n \"Launch a social token tied to your creative career. Let fans invest directly in your work — full economic alignment between creator and community.\",\n features: [\"Personal social token\", \"Fan investment\", \"Creator-community alignment\"],\n icon: TrendingUp,\n gradient: \"from-pink-500/6 via-rose-400/2 to-transparent\",\n borderColor: \"border-pink-500/10\",\n iconColor: \"text-pink-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n];\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/data/launchpad-services.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport {\n ImagePlus, Layers, GitBranch,\n Award, Package, PlusCircle,\n Ticket, Users,\n RefreshCw, Coins, TrendingUp,\n AtSign, FolderInput,\n} from \"lucide-react\";\n\nexport type ServiceStatus = \"live\" | \"building\" | \"soon\";\nexport type ServiceCategory = \"create\" | \"launch\" | \"monetize\";\n\nexport type ServiceGroup =\n | \"single-edition\"\n | \"limited-editions\"\n | \"creator-coins\"\n | \"collection-drop\"\n | \"pop-protocol\"\n | \"licensing-remix\"\n | \"claims\"\n | \"coming-soon\";\n\nexport interface ServiceGroupDefinition {\n key: ServiceGroup;\n title: string;\n /** One line of plain creator language: what does this group do for my portfolio/revenue? */\n tagline: string;\n /** Optional small chip next to the title (e.g. the token standard) */\n badge?: string;\n}\n\n/** Ordered — launchpad pages render sections in this order. */\nexport const LAUNCHPAD_SERVICE_GROUPS: ServiceGroupDefinition[] = [\n {\n key: \"single-edition\",\n title: \"Single Edition NFTs\",\n badge: \"ERC-721\",\n tagline: \"Publish one-of-one works and group them under your own brand.\",\n },\n {\n key: \"limited-editions\",\n title: \"Limited Editions\",\n badge: \"ERC-1155\",\n tagline: \"Release your work in numbered multiples collectors can buy and trade.\",\n },\n {\n key: \"creator-coins\",\n title: \"Creator Coins\",\n tagline: \"Launch your own coin with a public liquidity pool you control.\",\n },\n {\n key: \"collection-drop\",\n title: \"Collection Drop\",\n tagline: \"Timed releases with mint windows your community can race to collect.\",\n },\n {\n key: \"pop-protocol\",\n title: \"POP Protocol\",\n tagline: \"Credentials for your events and community — permanent, non-transferable proof.\",\n },\n {\n key: \"licensing-remix\",\n title: \"Licensing & Remix\",\n tagline: \"Licensed derivatives with attribution and royalties flowing back to you.\",\n },\n {\n key: \"claims\",\n title: \"Claims\",\n tagline: \"Free wins that build your creator profile and bring your existing work onchain.\",\n },\n {\n key: \"coming-soon\",\n title: \"Coming soon\",\n tagline: \"More monetization services on the way.\",\n },\n];\n\nexport interface ServiceDefinition {\n key: string;\n title: string;\n subtitle: string;\n description: string;\n features: string[];\n icon: LucideIcon;\n gradient: string;\n borderColor: string;\n iconColor: string;\n buttonColor?: string;\n badge: string;\n status: ServiceStatus;\n category: ServiceCategory;\n group: ServiceGroup;\n /** Secondary browse link label — injected app adds the href */\n browseLinkLabel?: string;\n}\n\nexport const LAUNCHPAD_SERVICE_DEFINITIONS: ServiceDefinition[] = [\n // ── Create ────────────────────────────────────────────────────────────────\n {\n key: \"mint-ip-asset\",\n title: \"Mint IP NFT\",\n subtitle: \"Publish any creative work on Starknet\",\n description:\n \"Turn any photo, video, or audio file into a programmable IP NFT. Gasless, permanent, and immediately tradeable on Medialane.\",\n features: [\"Gasless via ChipiPay\", \"IPFS metadata\", \"Programmable licensing\"],\n icon: ImagePlus,\n gradient: \"from-blue-500/10 via-sky-400/4 to-transparent\",\n borderColor: \"border-blue-500/20\",\n iconColor: \"text-blue-500\",\n buttonColor: \"bg-brand-blue hover:bg-brand-blue/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n group: \"single-edition\",\n },\n {\n key: \"create-collection\",\n title: \"Create Collection\",\n subtitle: \"Group your NFTs under a shared identity\",\n description:\n \"Deploy a branded ERC-721 collection with its own page, metadata, and on-chain identity — ready to populate with assets at any time.\",\n features: [\"Factory-deployed ERC-721\", \"Branded collection page\", \"Add assets at any time\"],\n icon: Layers,\n gradient: \"from-violet-500/10 via-purple-400/4 to-transparent\",\n borderColor: \"border-violet-500/20\",\n iconColor: \"text-violet-500\",\n buttonColor: \"bg-brand-purple hover:bg-brand-purple/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n group: \"single-edition\",\n },\n {\n key: \"ip-collection-1155\",\n title: \"Edition Collection\",\n subtitle: \"Deploy a contract for multi-copy NFT releases\",\n description:\n \"Launch a collection for music tracks, art prints, or any IP you want to release in multiples. Each edition token is numbered and tradeable on Medialane.\",\n features: [\"Multi-edition ERC-1155\", \"Immutable provenance\", \"Tradeable on Medialane\"],\n icon: Layers,\n gradient: \"from-violet-500/10 via-purple-400/4 to-transparent\",\n borderColor: \"border-violet-500/20\",\n iconColor: \"text-violet-500\",\n buttonColor: \"bg-violet-600 hover:bg-violet-700\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n group: \"limited-editions\",\n },\n {\n key: \"mint-editions\",\n title: \"Mint NFT Editions\",\n subtitle: \"Add new editions to an existing collection\",\n description:\n \"Select one of your Edition Collection contracts and mint new token editions into it — set supply, upload artwork, and release to collectors.\",\n features: [\"Choose any edition collection\", \"Set edition supply\", \"IPFS metadata\"],\n icon: PlusCircle,\n gradient: \"from-fuchsia-500/10 via-violet-400/4 to-transparent\",\n borderColor: \"border-fuchsia-500/20\",\n iconColor: \"text-fuchsia-500\",\n buttonColor: \"bg-fuchsia-600 hover:bg-fuchsia-700\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n group: \"limited-editions\",\n },\n {\n key: \"remix-asset\",\n title: \"Remix Asset\",\n subtitle: \"Derivative works with on-chain attribution\",\n description:\n \"Create a licensed derivative of any IP asset with full provenance and attribution flowing back to the original creator.\",\n features: [\"On-chain attribution\", \"License-enforced at mint\", \"Royalties to original creator\"],\n icon: GitBranch,\n gradient: \"from-rose-500/10 via-pink-400/4 to-transparent\",\n borderColor: \"border-rose-500/20\",\n iconColor: \"text-rose-500\",\n buttonColor: \"bg-brand-rose hover:bg-brand-rose/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n group: \"licensing-remix\",\n },\n\n // ── Launch ────────────────────────────────────────────────────────────────\n {\n key: \"pop-protocol\",\n title: \"POP Protocol\",\n subtitle: \"Proof-of-participation for events & communities\",\n description:\n \"Give every attendee proof they were there. Issue soulbound credentials to your community — one non-transferable badge per wallet, permanently on-chain. Works for bootcamps, hackathons, and conferences.\",\n features: [\"Soulbound · non-transferable\", \"One credential per wallet\", \"Optional allowlist gating\"],\n icon: Award,\n gradient: \"from-emerald-500/10 via-green-400/4 to-transparent\",\n borderColor: \"border-emerald-500/20\",\n iconColor: \"text-emerald-500\",\n buttonColor: \"bg-green-600 hover:bg-green-700\",\n badge: \"Launch\",\n browseLinkLabel: \"Browse events\",\n status: \"live\",\n category: \"launch\",\n group: \"pop-protocol\",\n },\n {\n key: \"collection-drop\",\n title: \"Collection Drop\",\n subtitle: \"Limited-edition timed releases\",\n description:\n \"Launch a fixed-supply ERC-721 drop with a defined mint window and per-wallet limit. Set your open date and let your community race to collect.\",\n features: [\"Fixed supply cap\", \"Timed mint window\", \"Free or paid mint\"],\n icon: Package,\n gradient: \"from-orange-500/10 via-amber-400/4 to-transparent\",\n borderColor: \"border-orange-500/20\",\n iconColor: \"text-orange-500\",\n buttonColor: \"bg-orange-600 hover:bg-orange-700\",\n badge: \"Launch\",\n browseLinkLabel: \"Browse drops\",\n status: \"live\",\n category: \"launch\",\n group: \"collection-drop\",\n },\n {\n key: \"ip-tickets\",\n title: \"IP Tickets\",\n subtitle: \"Gate real-world experiences with NFTs\",\n description:\n \"Distribute tickets for concerts, workshops, and events. Each ticket is verifiable on-chain proof of attendance.\",\n features: [\"NFT-based event gating\", \"Proof of attendance\", \"Transferable or soulbound\"],\n icon: Ticket,\n gradient: \"from-teal-500/7 via-cyan-400/3 to-transparent\",\n borderColor: \"border-teal-500/15\",\n iconColor: \"text-teal-500\",\n badge: \"Soon\",\n status: \"building\",\n category: \"launch\",\n group: \"coming-soon\",\n },\n {\n key: \"membership\",\n title: \"Membership\",\n subtitle: \"Token-gated access passes\",\n description:\n \"Create tiered membership passes that unlock exclusive content, private communities, and experiences for your most loyal fans.\",\n features: [\"Token-gated content\", \"Tiered access levels\", \"Community alignment\"],\n icon: Users,\n gradient: \"from-indigo-500/6 via-violet-400/2 to-transparent\",\n borderColor: \"border-indigo-500/10\",\n iconColor: \"text-indigo-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"launch\",\n group: \"coming-soon\",\n },\n\n // ── Monetize ─────────────────────────────────────────────────────────────\n {\n key: \"subscriptions\",\n title: \"Subscriptions\",\n subtitle: \"Recurring on-chain revenue\",\n description:\n \"Monthly licensing, creator support tiers, and access passes — all auto-renewed without intermediaries.\",\n features: [\"Recurring revenue\", \"Auto-renewal protocol\", \"No middlemen\"],\n icon: RefreshCw,\n gradient: \"from-sky-500/6 via-blue-400/2 to-transparent\",\n borderColor: \"border-sky-500/10\",\n iconColor: \"text-sky-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n group: \"coming-soon\",\n },\n {\n key: \"ip-coins\",\n title: \"IP Coins\",\n subtitle: \"Fractional ownership of intellectual property\",\n description:\n \"Tokenize your IP catalog as fungible tokens. Enable fractional ownership and liquid markets around your creative work.\",\n features: [\"Fungible IP tokens\", \"Fractional ownership\", \"Liquid secondary markets\"],\n icon: Coins,\n gradient: \"from-amber-500/6 via-yellow-400/2 to-transparent\",\n borderColor: \"border-amber-500/10\",\n iconColor: \"text-amber-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n group: \"coming-soon\",\n },\n {\n key: \"creator-coins\",\n title: \"Creator Coin\",\n subtitle: \"Your own coin, your liquidity\",\n description:\n \"Launch a standard ERC-20 coin tied to your creative work, paired with a public Ekubo liquidity pool. You set the supply and allocation — and you stay in control of the liquidity.\",\n features: [\"Standard ERC-20\", \"Public Ekubo pool\", \"You control the liquidity\"],\n icon: TrendingUp,\n gradient: \"from-pink-500/6 via-rose-400/2 to-transparent\",\n borderColor: \"border-pink-500/20\",\n iconColor: \"text-pink-400\",\n buttonColor: \"bg-brand-rose hover:bg-brand-rose/90\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n group: \"creator-coins\",\n },\n\n // ── Claims ────────────────────────────────────────────────────────────────\n {\n key: \"claim-memecoin\",\n title: \"Claim Memecoin\",\n subtitle: \"Bring your Starknet coin to Medialane\",\n description:\n \"Already launched a coin on Starknet (unrug or partner)? Claim it to add it to Medialane — reviewed by our team, then live on the Coins page and your profile.\",\n features: [\"unrug & partner coins\", \"Team reviewed\", \"Lists on /coins\"],\n icon: Coins,\n gradient: \"from-orange-500/10 via-amber-400/4 to-transparent\",\n borderColor: \"border-orange-500/20\",\n iconColor: \"text-orange-500\",\n buttonColor: \"bg-orange-600 hover:bg-orange-700\",\n badge: \"Claim\",\n status: \"soon\",\n category: \"monetize\",\n group: \"creator-coins\",\n },\n {\n key: \"claim-username\",\n title: \"Claim Username\",\n subtitle: \"Reserve your creator page URL\",\n description:\n \"Claim your unique username and get a shareable creator page — your public portfolio at a clean, memorable URL. Free, and yours.\",\n features: [\"Free claim\", \"Shareable creator page\", \"Your public portfolio\"],\n icon: AtSign,\n gradient: \"from-violet-500/10 via-purple-400/4 to-transparent\",\n borderColor: \"border-violet-500/20\",\n iconColor: \"text-violet-500\",\n buttonColor: \"bg-brand-purple hover:bg-brand-purple/90\",\n badge: \"Claim\",\n status: \"live\",\n category: \"create\",\n group: \"claims\",\n },\n {\n key: \"claim-collection\",\n title: \"Claim Collection\",\n subtitle: \"Import an existing Starknet collection\",\n description:\n \"Already deployed an ERC-721 collection on Starknet? Claim it to link it to your Medialane profile and give it a branded collection page.\",\n features: [\"Import existing ERC-721\", \"Linked to your profile\", \"Branded collection page\"],\n icon: FolderInput,\n gradient: \"from-blue-500/10 via-sky-400/4 to-transparent\",\n borderColor: \"border-blue-500/20\",\n iconColor: \"text-blue-500\",\n buttonColor: \"bg-brand-blue hover:bg-brand-blue/90\",\n badge: \"Claim\",\n status: \"live\",\n category: \"create\",\n group: \"claims\",\n },\n];\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -46,6 +46,7 @@ __export(index_exports, {
46
46
  IpTypeBadge: () => import_ip_type_badge.IpTypeBadge,
47
47
  KineticWords: () => import_motion_primitives.KineticWords,
48
48
  LAUNCHPAD_SERVICE_DEFINITIONS: () => import_launchpad_services2.LAUNCHPAD_SERVICE_DEFINITIONS,
49
+ LAUNCHPAD_SERVICE_GROUPS: () => import_launchpad_services2.LAUNCHPAD_SERVICE_GROUPS,
49
50
  LaunchpadGrid: () => import_launchpad_grid.LaunchpadGrid,
50
51
  LaunchpadServicesGrid: () => import_launchpad_services.LaunchpadServicesGrid,
51
52
  ListingCard: () => import_listing_card.ListingCard,
@@ -55,6 +56,7 @@ __export(index_exports, {
55
56
  MotionCard: () => import_motion_primitives.MotionCard,
56
57
  NavCommandMenu: () => import_nav_command_menu.NavCommandMenu,
57
58
  PageContainer: () => import_page_container.PageContainer,
59
+ PortfolioSubnav: () => import_portfolio_subnav.PortfolioSubnav,
58
60
  SPRING: () => import_motion_primitives.SPRING,
59
61
  ScrollSection: () => import_scroll_section.ScrollSection,
60
62
  ShareButton: () => import_share_button.ShareButton,
@@ -64,6 +66,7 @@ __export(index_exports, {
64
66
  TokenCard: () => import_token_card.TokenCard,
65
67
  TokenCardSkeleton: () => import_token_card.TokenCardSkeleton,
66
68
  cn: () => import_cn.cn,
69
+ derivePortfolioCounts: () => import_portfolio_counts.derivePortfolioCounts,
67
70
  formatDisplayPrice: () => import_format.formatDisplayPrice,
68
71
  ipfsToHttp: () => import_ipfs.ipfsToHttp,
69
72
  shortenAddress: () => import_address.shortenAddress,
@@ -105,6 +108,8 @@ var import_discover_feed_section = require("./components/discover-feed-section.j
105
108
  var import_launchpad_services = require("./components/launchpad-services.js");
106
109
  var import_launchpad_services2 = require("./data/launchpad-services.js");
107
110
  var import_nav_command_menu = require("./components/nav-command-menu.js");
111
+ var import_portfolio_subnav = require("./components/portfolio-subnav.js");
112
+ var import_portfolio_counts = require("./utils/portfolio-counts.js");
108
113
  // Annotate the CommonJS export names for ESM import in node:
109
114
  0 && (module.exports = {
110
115
  ACTIVITY_TYPE_CONFIG,
@@ -135,6 +140,7 @@ var import_nav_command_menu = require("./components/nav-command-menu.js");
135
140
  IpTypeBadge,
136
141
  KineticWords,
137
142
  LAUNCHPAD_SERVICE_DEFINITIONS,
143
+ LAUNCHPAD_SERVICE_GROUPS,
138
144
  LaunchpadGrid,
139
145
  LaunchpadServicesGrid,
140
146
  ListingCard,
@@ -144,6 +150,7 @@ var import_nav_command_menu = require("./components/nav-command-menu.js");
144
150
  MotionCard,
145
151
  NavCommandMenu,
146
152
  PageContainer,
153
+ PortfolioSubnav,
147
154
  SPRING,
148
155
  ScrollSection,
149
156
  ShareButton,
@@ -153,6 +160,7 @@ var import_nav_command_menu = require("./components/nav-command-menu.js");
153
160
  TokenCard,
154
161
  TokenCardSkeleton,
155
162
  cn,
163
+ derivePortfolioCounts,
156
164
  formatDisplayPrice,
157
165
  ipfsToHttp,
158
166
  shortenAddress,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.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 { BRAND } from \"./data/brand.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 { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\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, RarityTier } from \"./components/token-card.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } 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 { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.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 } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\n\n// ── v0.4 additions ────────────────────────────────────────────────────────────\nexport { LaunchpadServicesGrid } from \"./components/launchpad-services.js\";\nexport type { LaunchpadServicesGridProps, ServiceCardProps } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory } 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"],"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;AACA,gBAAmB;AACnB,oBAAmC;AACnC,qBAA+B;AAC/B,kBAA2B;AAG3B,sBAA+C;AAE/C,mBAAsB;AAGtB,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAA8B;AAE9B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAI7C,kBAAwB;AACxB,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,4BAA8B;AAE9B,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAAoC;AAIpC,gCAAsC;AAEtC,IAAAA,6BAA8C;AAI9C,8BAAkD;","names":["import_launchpad_services"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.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 { BRAND } from \"./data/brand.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 { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\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, RarityTier } from \"./components/token-card.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } 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 { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.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 } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\n\n// ── v0.4 additions ────────────────────────────────────────────────────────────\nexport { LaunchpadServicesGrid } from \"./components/launchpad-services.js\";\nexport type { LaunchpadServicesGridProps, ServiceCardProps } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory, 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.6.0 additions — portfolio subnav + counts ────────────────────────────\nexport { PortfolioSubnav } from \"./components/portfolio-subnav.js\";\nexport type {\n PortfolioSubnavProps,\n PortfolioNavItem,\n PortfolioNavGroup,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-subnav.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.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;AACA,gBAAmB;AACnB,oBAAmC;AACnC,qBAA+B;AAC/B,kBAA2B;AAG3B,sBAA+C;AAE/C,mBAAsB;AAGtB,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAA8B;AAE9B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAI7C,kBAAwB;AACxB,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,4BAA8B;AAE9B,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAAoC;AAIpC,gCAAsC;AAEtC,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,8BAAgC;AAOhC,8BAAsC;","names":["import_launchpad_services"]}
package/dist/index.d.cts CHANGED
@@ -30,8 +30,10 @@ export { DiscoverCollectionsStrip, DiscoverCollectionsStripProps } from './compo
30
30
  export { DiscoverCreatorsStrip, DiscoverCreatorsStripProps } from './components/discover-creators-strip.cjs';
31
31
  export { DiscoverFeedSection, DiscoverFeedSectionProps } from './components/discover-feed-section.cjs';
32
32
  export { LaunchpadServicesGrid, LaunchpadServicesGridProps, ServiceCardProps } from './components/launchpad-services.cjs';
33
- export { LAUNCHPAD_SERVICE_DEFINITIONS, ServiceCategory, ServiceDefinition, ServiceStatus } from './data/launchpad-services.cjs';
33
+ export { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS, ServiceCategory, ServiceDefinition, ServiceGroup, ServiceGroupDefinition, ServiceStatus } from './data/launchpad-services.cjs';
34
34
  export { NavCommand, NavCommandGroup, NavCommandMenu, NavCommandMenuProps, useNavCommandMenu } from './components/nav-command-menu.cjs';
35
+ export { PortfolioBadgeVariant, PortfolioNavGroup, PortfolioNavItem, PortfolioSubnav, PortfolioSubnavProps } from './components/portfolio-subnav.cjs';
36
+ export { CountableOrder, PortfolioCounts, derivePortfolioCounts } from './utils/portfolio-counts.cjs';
35
37
  import 'clsx';
36
38
  import 'react/jsx-runtime';
37
39
  import 'framer-motion';
package/dist/index.d.ts CHANGED
@@ -30,8 +30,10 @@ export { DiscoverCollectionsStrip, DiscoverCollectionsStripProps } from './compo
30
30
  export { DiscoverCreatorsStrip, DiscoverCreatorsStripProps } from './components/discover-creators-strip.js';
31
31
  export { DiscoverFeedSection, DiscoverFeedSectionProps } from './components/discover-feed-section.js';
32
32
  export { LaunchpadServicesGrid, LaunchpadServicesGridProps, ServiceCardProps } from './components/launchpad-services.js';
33
- export { LAUNCHPAD_SERVICE_DEFINITIONS, ServiceCategory, ServiceDefinition, ServiceStatus } from './data/launchpad-services.js';
33
+ export { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS, ServiceCategory, ServiceDefinition, ServiceGroup, ServiceGroupDefinition, ServiceStatus } from './data/launchpad-services.js';
34
34
  export { NavCommand, NavCommandGroup, NavCommandMenu, NavCommandMenuProps, useNavCommandMenu } from './components/nav-command-menu.js';
35
+ export { PortfolioBadgeVariant, PortfolioNavGroup, PortfolioNavItem, PortfolioSubnav, PortfolioSubnavProps } from './components/portfolio-subnav.js';
36
+ export { CountableOrder, PortfolioCounts, derivePortfolioCounts } from './utils/portfolio-counts.js';
35
37
  import 'clsx';
36
38
  import 'react/jsx-runtime';
37
39
  import 'framer-motion';
package/dist/index.js CHANGED
@@ -30,8 +30,10 @@ import { DiscoverCollectionsStrip } from "./components/discover-collections-stri
30
30
  import { DiscoverCreatorsStrip } from "./components/discover-creators-strip.js";
31
31
  import { DiscoverFeedSection } from "./components/discover-feed-section.js";
32
32
  import { LaunchpadServicesGrid } from "./components/launchpad-services.js";
33
- import { LAUNCHPAD_SERVICE_DEFINITIONS } from "./data/launchpad-services.js";
33
+ import { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from "./data/launchpad-services.js";
34
34
  import { NavCommandMenu, useNavCommandMenu } from "./components/nav-command-menu.js";
35
+ import { PortfolioSubnav } from "./components/portfolio-subnav.js";
36
+ import { derivePortfolioCounts } from "./utils/portfolio-counts.js";
35
37
  export {
36
38
  ACTIVITY_TYPE_CONFIG,
37
39
  ActivityFeedShell,
@@ -61,6 +63,7 @@ export {
61
63
  IpTypeBadge,
62
64
  KineticWords,
63
65
  LAUNCHPAD_SERVICE_DEFINITIONS,
66
+ LAUNCHPAD_SERVICE_GROUPS,
64
67
  LaunchpadGrid,
65
68
  LaunchpadServicesGrid,
66
69
  ListingCard,
@@ -70,6 +73,7 @@ export {
70
73
  MotionCard,
71
74
  NavCommandMenu,
72
75
  PageContainer,
76
+ PortfolioSubnav,
73
77
  SPRING,
74
78
  ScrollSection,
75
79
  ShareButton,
@@ -79,6 +83,7 @@ export {
79
83
  TokenCard,
80
84
  TokenCardSkeleton,
81
85
  cn,
86
+ derivePortfolioCounts,
82
87
  formatDisplayPrice,
83
88
  ipfsToHttp,
84
89
  shortenAddress,
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 } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.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 { BRAND } from \"./data/brand.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 { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\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, RarityTier } from \"./components/token-card.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } 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 { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.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 } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\n\n// ── v0.4 additions ────────────────────────────────────────────────────────────\nexport { LaunchpadServicesGrid } from \"./components/launchpad-services.js\";\nexport type { LaunchpadServicesGridProps, ServiceCardProps } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory } 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"],"mappings":"AACA,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAG3B,SAAS,cAAc,wBAAwB;AAE/C,SAAS,aAAa;AAGtB,SAAS,cAAc,sBAAsB;AAG7C,SAAS,aAAa,gBAAgB,mBAAmB;AAGzD,SAAS,sBAAsB;AAG/B,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAIlC,SAAS,YAAY,QAAQ,SAAS,aAAa,cAAc,QAAQ,gBAAgB;AACzF,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAE5B,SAAS,gBAAgB,8BAA8B;AAEvD,SAAS,WAAW,yBAAyB;AAI7C,SAAS,eAAe;AACxB,SAAS,sBAAsB,oBAAoB;AAEnD,SAAS,YAAY,0BAA0B;AAE/C,SAAS,sBAAsB;AAE/B,SAAS,aAAa,2BAA2B;AAEjD,SAAS,mBAAmB;AAE5B,SAAS,yBAAyB;AAElC,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAI5B,SAAS,oBAAoB;AAE7B,SAAS,kBAAkB,gCAAgC;AAE3D,SAAS,gCAAgC;AAEzC,SAAS,6BAA6B;AAEtC,SAAS,2BAA2B;AAIpC,SAAS,6BAA6B;AAEtC,SAAS,qCAAqC;AAI9C,SAAS,gBAAgB,yBAAyB;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.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 { BRAND } from \"./data/brand.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 { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\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, RarityTier } from \"./components/token-card.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } 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 { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.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 } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\n\n// ── v0.4 additions ────────────────────────────────────────────────────────────\nexport { LaunchpadServicesGrid } from \"./components/launchpad-services.js\";\nexport type { LaunchpadServicesGridProps, ServiceCardProps } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory, 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.6.0 additions — portfolio subnav + counts ────────────────────────────\nexport { PortfolioSubnav } from \"./components/portfolio-subnav.js\";\nexport type {\n PortfolioSubnavProps,\n PortfolioNavItem,\n PortfolioNavGroup,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-subnav.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n"],"mappings":"AACA,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAG3B,SAAS,cAAc,wBAAwB;AAE/C,SAAS,aAAa;AAGtB,SAAS,cAAc,sBAAsB;AAG7C,SAAS,aAAa,gBAAgB,mBAAmB;AAGzD,SAAS,sBAAsB;AAG/B,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAIlC,SAAS,YAAY,QAAQ,SAAS,aAAa,cAAc,QAAQ,gBAAgB;AACzF,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAE5B,SAAS,gBAAgB,8BAA8B;AAEvD,SAAS,WAAW,yBAAyB;AAI7C,SAAS,eAAe;AACxB,SAAS,sBAAsB,oBAAoB;AAEnD,SAAS,YAAY,0BAA0B;AAE/C,SAAS,sBAAsB;AAE/B,SAAS,aAAa,2BAA2B;AAEjD,SAAS,mBAAmB;AAE5B,SAAS,yBAAyB;AAElC,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAI5B,SAAS,oBAAoB;AAE7B,SAAS,kBAAkB,gCAAgC;AAE3D,SAAS,gCAAgC;AAEzC,SAAS,6BAA6B;AAEtC,SAAS,2BAA2B;AAIpC,SAAS,6BAA6B;AAEtC,SAAS,+BAA+B,gCAAgC;AAIxE,SAAS,gBAAgB,yBAAyB;AAIlD,SAAS,uBAAuB;AAOhC,SAAS,6BAA6B;","names":[]}
@@ -0,0 +1,45 @@
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 portfolio_counts_exports = {};
20
+ __export(portfolio_counts_exports, {
21
+ derivePortfolioCounts: () => derivePortfolioCounts
22
+ });
23
+ module.exports = __toCommonJS(portfolio_counts_exports);
24
+ function derivePortfolioCounts(orders, remixOffers, address) {
25
+ const list = Array.isArray(orders) ? orders : [];
26
+ const addr = (address ?? "").toLowerCase();
27
+ const received = list.filter(
28
+ (o) => o.status === "ACTIVE" && o.offer.itemType === "ERC20" && o.offerer.toLowerCase() !== addr
29
+ ).length;
30
+ const listings = list.filter(
31
+ (o) => (o.offer.itemType === "ERC721" || o.offer.itemType === "ERC1155") && o.status === "ACTIVE"
32
+ ).length;
33
+ const remix = Array.isArray(remixOffers) ? remixOffers.filter(
34
+ (o) => o.status === "PENDING" || o.status === "AUTO_PENDING"
35
+ ).length : 0;
36
+ const counter = list.filter(
37
+ (o) => o.offer.itemType === "ERC20" && o.offerer.toLowerCase() === addr && o.hasActiveCounterOffer === true
38
+ ).length;
39
+ return { received, listings, remix, counter };
40
+ }
41
+ // Annotate the CommonJS export names for ESM import in node:
42
+ 0 && (module.exports = {
43
+ derivePortfolioCounts
44
+ });
45
+ //# sourceMappingURL=portfolio-counts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/portfolio-counts.ts"],"sourcesContent":["/**\n * Minimal structural shape of a marketplace order needed to derive portfolio\n * counts. `ApiOrder` from `@medialane/sdk` is structurally assignable to this,\n * so callers pass their `ApiOrder[]` directly and the package stays decoupled\n * from any specific SDK version.\n */\nexport interface CountableOrder {\n status: string;\n offerer: string;\n offer: { itemType: string };\n hasActiveCounterOffer?: boolean;\n}\n\nexport interface PortfolioCounts {\n /** Active ERC-20 offers made by others on the user's assets. */\n received: number;\n /** Active ERC-721/ERC-1155 listings the user is selling. */\n listings: number;\n /** Pending remix offers awaiting the user's action. */\n remix: number;\n /** The user's bids that a seller has countered. */\n counter: number;\n}\n\n/**\n * Derive the portfolio header/subnav counts from the user's orders and remix\n * offers. Pure and server-safe (no React). Guards nullish inputs.\n */\nexport function derivePortfolioCounts(\n orders: ReadonlyArray<CountableOrder> | null | undefined,\n remixOffers: ReadonlyArray<{ status: string }> | null | undefined,\n address: string | null | undefined,\n): PortfolioCounts {\n const list = Array.isArray(orders) ? orders : [];\n const addr = (address ?? \"\").toLowerCase();\n\n const received = list.filter(\n (o) =>\n o.status === \"ACTIVE\" &&\n o.offer.itemType === \"ERC20\" &&\n o.offerer.toLowerCase() !== addr,\n ).length;\n\n const listings = list.filter(\n (o) =>\n (o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\") &&\n o.status === \"ACTIVE\",\n ).length;\n\n const remix = Array.isArray(remixOffers)\n ? remixOffers.filter(\n (o) => o.status === \"PENDING\" || o.status === \"AUTO_PENDING\",\n ).length\n : 0;\n\n const counter = list.filter(\n (o) =>\n o.offer.itemType === \"ERC20\" &&\n o.offerer.toLowerCase() === addr &&\n o.hasActiveCounterOffer === true,\n ).length;\n\n return { received, listings, remix, counter };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BO,SAAS,sBACd,QACA,aACA,SACiB;AACjB,QAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAC/C,QAAM,QAAQ,WAAW,IAAI,YAAY;AAEzC,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,MACC,EAAE,WAAW,YACb,EAAE,MAAM,aAAa,WACrB,EAAE,QAAQ,YAAY,MAAM;AAAA,EAChC,EAAE;AAEF,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,OACE,EAAE,MAAM,aAAa,YAAY,EAAE,MAAM,aAAa,cACvD,EAAE,WAAW;AAAA,EACjB,EAAE;AAEF,QAAM,QAAQ,MAAM,QAAQ,WAAW,IACnC,YAAY;AAAA,IACV,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW;AAAA,EAChD,EAAE,SACF;AAEJ,QAAM,UAAU,KAAK;AAAA,IACnB,CAAC,MACC,EAAE,MAAM,aAAa,WACrB,EAAE,QAAQ,YAAY,MAAM,QAC5B,EAAE,0BAA0B;AAAA,EAChC,EAAE;AAEF,SAAO,EAAE,UAAU,UAAU,OAAO,QAAQ;AAC9C;","names":[]}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Minimal structural shape of a marketplace order needed to derive portfolio
3
+ * counts. `ApiOrder` from `@medialane/sdk` is structurally assignable to this,
4
+ * so callers pass their `ApiOrder[]` directly and the package stays decoupled
5
+ * from any specific SDK version.
6
+ */
7
+ interface CountableOrder {
8
+ status: string;
9
+ offerer: string;
10
+ offer: {
11
+ itemType: string;
12
+ };
13
+ hasActiveCounterOffer?: boolean;
14
+ }
15
+ interface PortfolioCounts {
16
+ /** Active ERC-20 offers made by others on the user's assets. */
17
+ received: number;
18
+ /** Active ERC-721/ERC-1155 listings the user is selling. */
19
+ listings: number;
20
+ /** Pending remix offers awaiting the user's action. */
21
+ remix: number;
22
+ /** The user's bids that a seller has countered. */
23
+ counter: number;
24
+ }
25
+ /**
26
+ * Derive the portfolio header/subnav counts from the user's orders and remix
27
+ * offers. Pure and server-safe (no React). Guards nullish inputs.
28
+ */
29
+ declare function derivePortfolioCounts(orders: ReadonlyArray<CountableOrder> | null | undefined, remixOffers: ReadonlyArray<{
30
+ status: string;
31
+ }> | null | undefined, address: string | null | undefined): PortfolioCounts;
32
+
33
+ export { type CountableOrder, type PortfolioCounts, derivePortfolioCounts };