@medialane/ui 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/launchpad-services.cjs +51 -119
- package/dist/components/launchpad-services.cjs.map +1 -1
- package/dist/components/launchpad-services.d.cts +13 -15
- package/dist/components/launchpad-services.d.ts +13 -15
- package/dist/components/launchpad-services.js +51 -119
- package/dist/components/launchpad-services.js.map +1 -1
- package/dist/data/launchpad-services.cjs +24 -11
- package/dist/data/launchpad-services.cjs.map +1 -1
- package/dist/data/launchpad-services.d.cts +3 -1
- package/dist/data/launchpad-services.d.ts +3 -1
- package/dist/data/launchpad-services.js +24 -11
- package/dist/data/launchpad-services.js.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,165 +2,97 @@
|
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import Link from "next/link";
|
|
4
4
|
import { motion } from "framer-motion";
|
|
5
|
-
import { Lock, ArrowRight } from "lucide-react";
|
|
5
|
+
import { Lock, ArrowUpRight, ArrowRight } from "lucide-react";
|
|
6
6
|
import { cn } from "../utils/cn.js";
|
|
7
7
|
import {
|
|
8
8
|
LAUNCHPAD_SERVICE_DEFINITIONS,
|
|
9
9
|
LAUNCHPAD_SERVICE_GROUPS
|
|
10
10
|
} from "../data/launchpad-services.js";
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
gradient: "from-border/40 to-border/20"
|
|
11
|
+
const DEFAULT_HUE = {
|
|
12
|
+
text: "text-sky-600 dark:text-sky-400",
|
|
13
|
+
solid: "bg-sky-500",
|
|
14
|
+
ring: "from-sky-500/60 via-sky-400/15 to-sky-600/40"
|
|
16
15
|
};
|
|
17
|
-
const
|
|
18
|
-
"mint-ip-asset": {
|
|
19
|
-
"create-collection": {
|
|
20
|
-
"ip-collection-1155": {
|
|
21
|
-
"mint-editions": {
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"collection-drop": {
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"creator-coins": { icon: "text-brand-rose", button: "bg-brand-rose", chip: "border-rose-500/30 text-rose-400 bg-rose-500/10", gradient: "from-rose-500/50 via-pink-400/20 to-rose-700/30" },
|
|
30
|
-
"claim-memecoin": { icon: "text-brand-orange", button: "bg-brand-orange", chip: "border-orange-500/30 text-orange-400 bg-orange-500/10", gradient: "from-orange-500/50 via-amber-400/20 to-orange-700/30" },
|
|
31
|
-
"claim-username": { icon: "text-brand-purple", button: "bg-brand-purple", chip: "border-purple-500/30 text-purple-400 bg-purple-500/10", gradient: "from-purple-500/50 via-violet-400/20 to-purple-700/30" },
|
|
32
|
-
"claim-collection": { icon: "text-brand-blue", button: "bg-brand-blue", chip: "border-blue-500/30 text-blue-400 bg-blue-500/10", gradient: "from-blue-500/50 via-cyan-400/20 to-blue-600/30" }
|
|
16
|
+
const SERVICE_HUES = {
|
|
17
|
+
"mint-ip-asset": { text: "text-sky-600 dark:text-sky-400", solid: "bg-sky-500", ring: "from-sky-500/60 via-sky-400/15 to-sky-600/40" },
|
|
18
|
+
"create-collection": { text: "text-violet-600 dark:text-violet-400", solid: "bg-violet-500", ring: "from-violet-500/60 via-violet-400/15 to-violet-600/40" },
|
|
19
|
+
"ip-collection-1155": { text: "text-rose-600 dark:text-rose-400", solid: "bg-rose-500", ring: "from-rose-500/60 via-rose-400/15 to-rose-600/40" },
|
|
20
|
+
"mint-editions": { text: "text-amber-600 dark:text-amber-400", solid: "bg-amber-500", ring: "from-amber-500/60 via-amber-400/15 to-amber-600/40" },
|
|
21
|
+
"creator-coins": { text: "text-pink-600 dark:text-pink-400", solid: "bg-pink-500", ring: "from-pink-500/60 via-pink-400/15 to-pink-600/40" },
|
|
22
|
+
"claim-memecoin": { text: "text-teal-600 dark:text-teal-400", solid: "bg-teal-500", ring: "from-teal-500/60 via-teal-400/15 to-teal-600/40" },
|
|
23
|
+
"collection-drop": { text: "text-orange-600 dark:text-orange-400", solid: "bg-orange-500", ring: "from-orange-500/60 via-orange-400/15 to-orange-600/40" },
|
|
24
|
+
"pop-protocol": { text: "text-emerald-600 dark:text-emerald-400", solid: "bg-emerald-500", ring: "from-emerald-500/60 via-emerald-400/15 to-emerald-600/40" },
|
|
25
|
+
"remix-asset": { text: "text-indigo-600 dark:text-indigo-400", solid: "bg-indigo-500", ring: "from-indigo-500/60 via-indigo-400/15 to-indigo-600/40" },
|
|
26
|
+
"claim-username": { text: "text-purple-600 dark:text-purple-400", solid: "bg-purple-500", ring: "from-purple-500/60 via-purple-400/15 to-purple-600/40" },
|
|
27
|
+
"claim-collection": { text: "text-cyan-600 dark:text-cyan-400", solid: "bg-cyan-500", ring: "from-cyan-500/60 via-cyan-400/15 to-cyan-600/40" }
|
|
33
28
|
};
|
|
34
29
|
function LaunchpadServiceCard({ def, override = {} }) {
|
|
35
|
-
const { key, icon: Icon, browseLinkLabel } = def;
|
|
30
|
+
const { key, icon: Icon, title, browseLinkLabel } = def;
|
|
36
31
|
const status = override.status ?? def.status;
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const description = override.description ?? def.description;
|
|
40
|
-
const features = override.features ?? def.features;
|
|
41
|
-
const { href, buttonLabel, browseHref } = override;
|
|
32
|
+
const blurb = override.blurb ?? def.blurb;
|
|
33
|
+
const { href, browseHref } = override;
|
|
42
34
|
const live = status === "live";
|
|
43
|
-
const
|
|
44
|
-
const active = live || building;
|
|
45
|
-
const colors = SERVICE_CARD_COLORS[key] ?? DEFAULT_COLORS;
|
|
35
|
+
const hue = SERVICE_HUES[key] ?? DEFAULT_HUE;
|
|
46
36
|
const card = /* @__PURE__ */ jsxs(
|
|
47
37
|
"div",
|
|
48
38
|
{
|
|
49
39
|
className: cn(
|
|
50
|
-
"relative rounded-[15px] bg-card flex flex-col
|
|
51
|
-
"transition-
|
|
52
|
-
|
|
40
|
+
"relative rounded-[15px] bg-card overflow-hidden flex flex-col flex-1 min-h-[210px]",
|
|
41
|
+
"transition-transform",
|
|
42
|
+
live ? "active:scale-[0.99]" : "opacity-70"
|
|
53
43
|
),
|
|
54
44
|
children: [
|
|
55
|
-
/* @__PURE__ */ jsx(
|
|
56
|
-
|
|
57
|
-
{
|
|
58
|
-
"aria-hidden": true,
|
|
59
|
-
className: cn(
|
|
60
|
-
"absolute inset-0 bg-gradient-to-br pointer-events-none",
|
|
61
|
-
colors.gradient,
|
|
62
|
-
active ? "opacity-[0.13]" : "opacity-[0.05]"
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
),
|
|
45
|
+
live && /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: cn("absolute inset-0 pointer-events-none bg-gradient-to-br to-transparent opacity-[0.07]", hue.solid.replace("bg-", "from-")) }),
|
|
46
|
+
/* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "absolute -right-8 -bottom-10 opacity-[0.05] select-none pointer-events-none", children: /* @__PURE__ */ jsx(Icon, { className: "h-44 w-44" }) }),
|
|
66
47
|
/* @__PURE__ */ jsxs("div", { className: "relative flex flex-col flex-1 p-6 gap-4", children: [
|
|
67
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
68
49
|
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
69
|
-
|
|
70
|
-
/* @__PURE__ */ jsx(Icon, { className: cn("relative h-
|
|
50
|
+
live && /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: cn("absolute -inset-3 rounded-full blur-2xl opacity-30", hue.solid) }),
|
|
51
|
+
/* @__PURE__ */ jsx(Icon, { className: cn("relative h-9 w-9 shrink-0", live ? hue.text : "text-muted-foreground/50") })
|
|
71
52
|
] }),
|
|
72
|
-
/* @__PURE__ */ jsxs(
|
|
73
|
-
"
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
"text-[10px] font-semibold tracking-widest uppercase rounded-full px-2.5 py-1 flex items-center gap-1.5",
|
|
77
|
-
live ? "text-emerald-500 bg-emerald-500/10" : building ? "text-amber-500 bg-amber-500/10" : "text-muted-foreground/40 bg-muted/30"
|
|
78
|
-
),
|
|
79
|
-
children: [
|
|
80
|
-
live && /* @__PURE__ */ jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse" }),
|
|
81
|
-
!active && /* @__PURE__ */ jsx(Lock, { className: "h-2.5 w-2.5" }),
|
|
82
|
-
badge
|
|
83
|
-
]
|
|
84
|
-
}
|
|
85
|
-
)
|
|
86
|
-
] }),
|
|
87
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
88
|
-
/* @__PURE__ */ jsx("p", { className: cn("text-2xl font-bold leading-snug tracking-tight", !active && "text-foreground/60"), children: def.title }),
|
|
89
|
-
/* @__PURE__ */ jsx("p", { className: cn("text-[13px] leading-relaxed", active ? "text-muted-foreground" : "text-muted-foreground/50"), children: subtitle })
|
|
53
|
+
!live && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-[11px] font-medium text-muted-foreground/60 pt-1", children: [
|
|
54
|
+
/* @__PURE__ */ jsx(Lock, { className: "h-3 w-3" }),
|
|
55
|
+
"Coming soon"
|
|
56
|
+
] })
|
|
90
57
|
] }),
|
|
91
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-
|
|
92
|
-
/* @__PURE__ */ jsx("
|
|
93
|
-
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
59
|
+
/* @__PURE__ */ jsx("h3", { className: "text-2xl font-bold tracking-tight leading-snug", children: title }),
|
|
60
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-[15px] leading-relaxed max-w-[34ch]", live ? "text-muted-foreground" : "text-muted-foreground/60"), children: blurb })
|
|
94
61
|
] }),
|
|
95
|
-
/* @__PURE__ */ jsx("
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
className: cn(
|
|
99
|
-
"text-[11px] px-2.5 py-1 rounded-full border font-medium",
|
|
100
|
-
active ? colors.chip : "bg-muted/10 border-border/15 text-muted-foreground/45"
|
|
101
|
-
),
|
|
102
|
-
children: f
|
|
103
|
-
},
|
|
104
|
-
f
|
|
105
|
-
)) }),
|
|
106
|
-
live && href ? /* @__PURE__ */ jsxs("div", { className: "space-y-2 mt-auto pt-2", children: [
|
|
107
|
-
/* @__PURE__ */ jsxs(
|
|
108
|
-
Link,
|
|
109
|
-
{
|
|
110
|
-
href,
|
|
111
|
-
className: cn(
|
|
112
|
-
"flex items-center justify-between w-full h-10 px-4 rounded-xl",
|
|
113
|
-
"text-sm font-semibold text-white",
|
|
114
|
-
"transition-all hover:brightness-110 active:scale-[0.98]",
|
|
115
|
-
colors.button
|
|
116
|
-
),
|
|
117
|
-
children: [
|
|
118
|
-
buttonLabel ?? "Get started",
|
|
119
|
-
/* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5" })
|
|
120
|
-
]
|
|
121
|
-
}
|
|
122
|
-
),
|
|
123
|
-
browseHref && browseLinkLabel && /* @__PURE__ */ jsxs(
|
|
62
|
+
live && href && /* @__PURE__ */ jsx(Link, { href, "aria-label": title, className: "absolute inset-0 z-10" }),
|
|
63
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-auto pt-1 flex items-end justify-between", children: [
|
|
64
|
+
live && browseHref && browseLinkLabel ? /* @__PURE__ */ jsxs(
|
|
124
65
|
Link,
|
|
125
66
|
{
|
|
126
67
|
href: browseHref,
|
|
127
|
-
className: "flex items-center
|
|
68
|
+
className: "relative z-20 inline-flex items-center gap-1 text-xs font-medium text-muted-foreground active:text-foreground",
|
|
128
69
|
children: [
|
|
129
70
|
browseLinkLabel,
|
|
130
71
|
/* @__PURE__ */ jsx(ArrowRight, { className: "h-3 w-3" })
|
|
131
72
|
]
|
|
132
73
|
}
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
/* @__PURE__ */ jsx(Lock, { className: "h-3.5 w-3.5" }),
|
|
136
|
-
building ? "In development" : "Coming soon"
|
|
74
|
+
) : /* @__PURE__ */ jsx("span", {}),
|
|
75
|
+
live && /* @__PURE__ */ jsx("span", { className: cn("h-11 w-11 shrink-0 rounded-full flex items-center justify-center shadow-lg shadow-black/20", hue.solid), children: /* @__PURE__ */ jsx(ArrowUpRight, { className: "h-5 w-5 text-white" }) })
|
|
137
76
|
] })
|
|
138
77
|
] })
|
|
139
78
|
]
|
|
140
79
|
}
|
|
141
80
|
);
|
|
142
|
-
return live ? /* @__PURE__ */ jsx("div", { className: cn("p-[1px] rounded-2xl bg-gradient-to-br
|
|
81
|
+
return live ? /* @__PURE__ */ jsx("div", { className: cn("p-[1px] rounded-2xl bg-gradient-to-br flex flex-col", hue.ring), children: card }) : /* @__PURE__ */ jsx("div", { className: "rounded-2xl border border-border/30 flex flex-col", children: card });
|
|
143
82
|
}
|
|
144
83
|
function GroupHeader({ group }) {
|
|
145
84
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
/* @__PURE__ */ jsx("h2", { className: "text-xl font-bold tracking-tight", children: group.title }),
|
|
148
|
-
group.badge ? /* @__PURE__ */ jsx("span", { className: "text-[10px] font-semibold tracking-widest uppercase rounded-full px-2 py-0.5 bg-muted/40 text-muted-foreground", children: group.badge }) : null
|
|
149
|
-
] }),
|
|
85
|
+
/* @__PURE__ */ jsx("h2", { className: "text-xl font-bold tracking-tight", children: group.title }),
|
|
150
86
|
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: group.tagline })
|
|
151
87
|
] });
|
|
152
88
|
}
|
|
153
89
|
function ComingSoonStrip({ group, defs }) {
|
|
154
|
-
return /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border/
|
|
155
|
-
/* @__PURE__ */ jsx("p", { className: "
|
|
156
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mt-
|
|
157
|
-
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 mt-4", children: defs.map(({ key, icon: Icon, title
|
|
90
|
+
return /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border/40 p-5", children: [
|
|
91
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-sm", children: group.title }),
|
|
92
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mt-0.5", children: group.tagline }),
|
|
93
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 mt-4", children: defs.map(({ key, icon: Icon, title }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25", children: [
|
|
158
94
|
/* @__PURE__ */ jsx(Icon, { className: "h-3.5 w-3.5 text-muted-foreground/60" }),
|
|
159
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
160
|
-
/* @__PURE__ */ jsxs("span", { className: "hidden sm:inline text-xs text-muted-foreground/50", children: [
|
|
161
|
-
"\u2014 ",
|
|
162
|
-
subtitle
|
|
163
|
-
] })
|
|
95
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-muted-foreground", children: title })
|
|
164
96
|
] }, key)) })
|
|
165
97
|
] });
|
|
166
98
|
}
|
|
@@ -180,7 +112,7 @@ function LaunchpadGroupedSections({ overrides, className }) {
|
|
|
180
112
|
className: "space-y-4",
|
|
181
113
|
children: [
|
|
182
114
|
/* @__PURE__ */ jsx(GroupHeader, { group }),
|
|
183
|
-
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-
|
|
115
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: defs.map((def) => /* @__PURE__ */ jsx(LaunchpadServiceCard, { def, override: overrides[def.key] }, def.key)) })
|
|
184
116
|
]
|
|
185
117
|
},
|
|
186
118
|
group.key
|
|
@@ -190,6 +122,6 @@ function LaunchpadGroupedSections({ overrides, className }) {
|
|
|
190
122
|
export {
|
|
191
123
|
LaunchpadGroupedSections,
|
|
192
124
|
LaunchpadServiceCard,
|
|
193
|
-
|
|
125
|
+
SERVICE_HUES
|
|
194
126
|
};
|
|
195
127
|
//# sourceMappingURL=launchpad-services.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/launchpad-services.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Launchpad grouped services — the single source for the /launchpad page UI\n * in medialane-io and medialane-dapp (consolidated 2026-06-10; replaces the\n * old flat LaunchpadServicesGrid).\n *\n * Apps own: hrefs, button labels, per-app status/badge flips (rollout), and\n * any copy overrides (e.g. the gasless-rail chip wording). Everything else —\n * card design, group order, colors, copy — lives here.\n */\n\nimport Link from \"next/link\";\nimport { motion } from \"framer-motion\";\nimport { Lock, ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport {\n LAUNCHPAD_SERVICE_DEFINITIONS,\n LAUNCHPAD_SERVICE_GROUPS,\n type ServiceDefinition,\n type ServiceGroupDefinition,\n type ServiceStatus,\n} from \"../data/launchpad-services.js\";\n\n// ── Per-app injection points ─────────────────────────────────────────────────\n\nexport interface ServiceOverride {\n /** Primary CTA href — required for live services */\n href?: string;\n buttonLabel?: string;\n /** Secondary browse link href (pairs with the def's browseLinkLabel) */\n browseHref?: string;\n /** Per-app rollout flips (e.g. coins live on one app first) */\n status?: ServiceStatus;\n badge?: string;\n /** Per-app copy overrides (e.g. \"Gasless via ChipiPay\" vs \"Gasless transactions\") */\n features?: string[];\n description?: string;\n subtitle?: string;\n}\n\nexport type ServiceOverrides = Record<string, ServiceOverride>;\n\n// ── Brand color map per service key ──────────────────────────────────────────\n\ninterface ServiceCardColors {\n icon: string;\n button: string;\n chip: string;\n gradient: string;\n}\n\nconst DEFAULT_COLORS: ServiceCardColors = {\n icon: \"text-brand-blue\",\n button: \"bg-brand-blue\",\n chip: \"border-border/50 text-muted-foreground bg-muted/30\",\n gradient: \"from-border/40 to-border/20\",\n};\n\nexport const SERVICE_CARD_COLORS: Record<string, ServiceCardColors> = {\n \"mint-ip-asset\": { icon: \"text-brand-blue\", button: \"bg-brand-blue\", chip: \"border-blue-500/30 text-blue-400 bg-blue-500/10\", gradient: \"from-blue-500/50 via-cyan-400/20 to-blue-600/30\" },\n \"create-collection\": { icon: \"text-brand-purple\", button: \"bg-brand-purple\", chip: \"border-purple-500/30 text-purple-400 bg-purple-500/10\", gradient: \"from-purple-500/50 via-violet-400/20 to-purple-700/30\" },\n \"ip-collection-1155\": { icon: \"text-brand-rose\", button: \"bg-brand-rose\", chip: \"border-rose-500/30 text-rose-400 bg-rose-500/10\", gradient: \"from-rose-500/50 via-pink-400/20 to-rose-700/30\" },\n \"mint-editions\": { icon: \"text-brand-orange\", button: \"bg-brand-orange\", chip: \"border-orange-500/30 text-orange-400 bg-orange-500/10\", gradient: \"from-orange-500/50 via-amber-400/20 to-orange-700/30\" },\n \"remix-asset\": { icon: \"text-brand-navy\", button: \"bg-brand-navy\", chip: \"border-indigo-700/30 text-indigo-300 bg-indigo-900/20\", gradient: \"from-blue-900/60 via-indigo-700/20 to-blue-800/30\" },\n \"pop-protocol\": { icon: \"text-brand-orange\", button: \"bg-brand-orange\", chip: \"border-orange-500/30 text-orange-400 bg-orange-500/10\", gradient: \"from-orange-500/50 via-amber-400/20 to-orange-700/30\" },\n \"collection-drop\": { icon: \"text-brand-rose\", button: \"bg-brand-rose\", chip: \"border-rose-500/30 text-rose-400 bg-rose-500/10\", gradient: \"from-rose-500/50 via-red-400/20 to-rose-700/30\" },\n \"ip-tickets\": { icon: \"text-brand-blue\", button: \"bg-brand-blue\", chip: \"border-blue-500/30 text-blue-400 bg-blue-500/10\", gradient: \"from-blue-500/50 via-cyan-400/20 to-blue-600/30\" },\n \"membership\": { icon: \"text-brand-purple\", button: \"bg-brand-purple\", chip: \"border-purple-500/30 text-purple-400 bg-purple-500/10\", gradient: \"from-purple-500/50 via-violet-400/20 to-purple-700/30\" },\n \"subscriptions\": { icon: \"text-brand-blue\", button: \"bg-brand-blue\", chip: \"border-blue-500/30 text-blue-400 bg-blue-500/10\", gradient: \"from-blue-500/50 via-cyan-400/20 to-blue-600/30\" },\n \"ip-coins\": { icon: \"text-brand-orange\", button: \"bg-brand-orange\", chip: \"border-orange-500/30 text-orange-400 bg-orange-500/10\", gradient: \"from-orange-500/50 via-amber-400/20 to-orange-700/30\" },\n \"creator-coins\": { icon: \"text-brand-rose\", button: \"bg-brand-rose\", chip: \"border-rose-500/30 text-rose-400 bg-rose-500/10\", gradient: \"from-rose-500/50 via-pink-400/20 to-rose-700/30\" },\n \"claim-memecoin\": { icon: \"text-brand-orange\", button: \"bg-brand-orange\", chip: \"border-orange-500/30 text-orange-400 bg-orange-500/10\", gradient: \"from-orange-500/50 via-amber-400/20 to-orange-700/30\" },\n \"claim-username\": { icon: \"text-brand-purple\", button: \"bg-brand-purple\", chip: \"border-purple-500/30 text-purple-400 bg-purple-500/10\", gradient: \"from-purple-500/50 via-violet-400/20 to-purple-700/30\" },\n \"claim-collection\": { icon: \"text-brand-blue\", button: \"bg-brand-blue\", chip: \"border-blue-500/30 text-blue-400 bg-blue-500/10\", gradient: \"from-blue-500/50 via-cyan-400/20 to-blue-600/30\" },\n};\n\n// ── Service card ─────────────────────────────────────────────────────────────\n\nexport interface LaunchpadServiceCardProps {\n def: ServiceDefinition;\n override?: ServiceOverride;\n}\n\nexport function LaunchpadServiceCard({ def, override = {} }: LaunchpadServiceCardProps) {\n const { key, icon: Icon, browseLinkLabel } = def;\n const status = override.status ?? def.status;\n const badge = override.badge ?? def.badge;\n const subtitle = override.subtitle ?? def.subtitle;\n const description = override.description ?? def.description;\n const features = override.features ?? def.features;\n const { href, buttonLabel, browseHref } = override;\n\n const live = status === \"live\";\n const building = status === \"building\";\n const active = live || building;\n const colors = SERVICE_CARD_COLORS[key] ?? DEFAULT_COLORS;\n\n const card = (\n <div\n className={cn(\n \"relative rounded-[15px] bg-card flex flex-col overflow-hidden\",\n \"transition-all duration-200 flex-1\",\n !active && \"opacity-80\",\n )}\n >\n {/* Atmospheric wash — per-service color, fades to nothing */}\n <div\n aria-hidden\n className={cn(\n \"absolute inset-0 bg-gradient-to-br pointer-events-none\",\n colors.gradient,\n active ? \"opacity-[0.13]\" : \"opacity-[0.05]\",\n )}\n />\n <div className=\"relative flex flex-col flex-1 p-6 gap-4\">\n {/* Icon (soft glow) + status badge */}\n <div className=\"flex items-start justify-between\">\n <div className=\"relative\">\n {active && (\n <div aria-hidden className={cn(\"absolute -inset-3 rounded-full blur-2xl opacity-30\", colors.button)} />\n )}\n <Icon className={cn(\"relative h-10 w-10 transition-transform duration-300\", active ? colors.icon : \"text-muted-foreground/45\")} />\n </div>\n <span\n className={cn(\n \"text-[10px] font-semibold tracking-widest uppercase rounded-full px-2.5 py-1 flex items-center gap-1.5\",\n live\n ? \"text-emerald-500 bg-emerald-500/10\"\n : building\n ? \"text-amber-500 bg-amber-500/10\"\n : \"text-muted-foreground/40 bg-muted/30\",\n )}\n >\n {live && <span className=\"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse\" />}\n {!active && <Lock className=\"h-2.5 w-2.5\" />}\n {badge}\n </span>\n </div>\n\n {/* Title + subtitle */}\n <div className=\"space-y-1\">\n <p className={cn(\"text-2xl font-bold leading-snug tracking-tight\", !active && \"text-foreground/60\")}>\n {def.title}\n </p>\n <p className={cn(\"text-[13px] leading-relaxed\", active ? \"text-muted-foreground\" : \"text-muted-foreground/50\")}>\n {subtitle}\n </p>\n </div>\n\n {/* Description */}\n <div className=\"space-y-2\">\n <p className={cn(\"text-sm leading-relaxed\", active ? \"text-muted-foreground\" : \"text-muted-foreground/50\")}>\n {description}\n </p>\n {def.example && active && (\n <p className=\"text-xs text-muted-foreground/60 italic\">{def.example}</p>\n )}\n </div>\n\n {/* Feature chips */}\n <div className=\"flex flex-wrap gap-1.5\">\n {features.map((f) => (\n <span\n key={f}\n className={cn(\n \"text-[11px] px-2.5 py-1 rounded-full border font-medium\",\n active ? colors.chip : \"bg-muted/10 border-border/15 text-muted-foreground/45\",\n )}\n >\n {f}\n </span>\n ))}\n </div>\n\n {/* CTA — pinned to the card bottom */}\n {live && href ? (\n <div className=\"space-y-2 mt-auto pt-2\">\n <Link\n href={href}\n className={cn(\n \"flex items-center justify-between w-full h-10 px-4 rounded-xl\",\n \"text-sm font-semibold text-white\",\n \"transition-all hover:brightness-110 active:scale-[0.98]\",\n colors.button,\n )}\n >\n {buttonLabel ?? \"Get started\"}\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n {browseHref && browseLinkLabel && (\n <Link\n href={browseHref}\n className=\"flex items-center justify-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors py-1\"\n >\n {browseLinkLabel}\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n )}\n </div>\n ) : (\n <div className=\"flex items-center gap-2 h-10 mt-auto pt-2 text-sm text-muted-foreground/50 font-medium\">\n <Lock className=\"h-3.5 w-3.5\" />\n {building ? \"In development\" : \"Coming soon\"}\n </div>\n )}\n </div>\n </div>\n );\n\n return live ? (\n <div className={cn(\"p-[1px] rounded-2xl bg-gradient-to-br\", colors.gradient, \"transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-black/25 flex flex-col\")}>\n {card}\n </div>\n ) : (\n <div className=\"rounded-2xl border border-border/25 flex flex-col\">{card}</div>\n );\n}\n\n// ── Group sections ───────────────────────────────────────────────────────────\n\nfunction GroupHeader({ group }: { group: ServiceGroupDefinition }) {\n return (\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-xl font-bold tracking-tight\">{group.title}</h2>\n {group.badge ? (\n <span className=\"text-[10px] font-semibold tracking-widest uppercase rounded-full px-2 py-0.5 bg-muted/40 text-muted-foreground\">\n {group.badge}\n </span>\n ) : null}\n </div>\n <p className=\"text-sm text-muted-foreground\">{group.tagline}</p>\n </div>\n );\n}\n\nfunction ComingSoonStrip({ group, defs }: { group: ServiceGroupDefinition; defs: ServiceDefinition[] }) {\n return (\n <div className=\"rounded-2xl border border-border/25 p-5\">\n <p className=\"section-label\">{group.title}</p>\n <p className=\"text-sm text-muted-foreground mt-1\">{group.tagline}</p>\n <div className=\"flex flex-wrap gap-2 mt-4\">\n {defs.map(({ key, icon: Icon, title, subtitle }) => (\n <div key={key} className=\"flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25\">\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground/60\" />\n <span className=\"text-xs font-semibold text-muted-foreground\">{title}</span>\n <span className=\"hidden sm:inline text-xs text-muted-foreground/50\">— {subtitle}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface LaunchpadGroupedSectionsProps {\n /** Per-app hrefs / labels / rollout flips / copy overrides, keyed by service key. */\n overrides: ServiceOverrides;\n className?: string;\n}\n\n/** The full grouped launchpad services block — section order comes from\n * LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */\nexport function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps) {\n return (\n <div className={cn(\"space-y-10\", className)}>\n {LAUNCHPAD_SERVICE_GROUPS.map((group) => {\n const defs = LAUNCHPAD_SERVICE_DEFINITIONS.filter((d) => d.group === group.key);\n if (defs.length === 0) return null;\n if (group.key === \"coming-soon\") {\n return <ComingSoonStrip key={group.key} group={group} defs={defs} />;\n }\n return (\n <motion.div\n key={group.key}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] }}\n className=\"space-y-4\"\n >\n <GroupHeader group={group} />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n {defs.map((def) => (\n <LaunchpadServiceCard key={def.key} def={def} override={overrides[def.key]} />\n ))}\n </div>\n </motion.div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/launchpad-services.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Launchpad grouped services — the single source for the /launchpad page UI\n * in medialane-io and medialane-dapp.\n *\n * Card philosophy (creator-first redesign, 2026-06-10): the whole card is the\n * action. One title, one creator-language sentence (def.blurb), one unique hue\n * per service — no buttons repeating the title, no status badges, no tech\n * chips, no hover-only effects (mobile first: press states only).\n *\n * Apps own: hrefs + per-app rollout status flips. Everything else lives here.\n */\n\nimport Link from \"next/link\";\nimport { motion } from \"framer-motion\";\nimport { Lock, ArrowUpRight, ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport {\n LAUNCHPAD_SERVICE_DEFINITIONS,\n LAUNCHPAD_SERVICE_GROUPS,\n type ServiceDefinition,\n type ServiceGroupDefinition,\n type ServiceStatus,\n} from \"../data/launchpad-services.js\";\n\n// ── Per-app injection points ─────────────────────────────────────────────────\n\nexport interface ServiceOverride {\n /** Primary destination — the whole card links here (required for live services) */\n href?: string;\n /** Secondary browse link href (pairs with the def's browseLinkLabel) */\n browseHref?: string;\n /** Per-app rollout flips (e.g. coins live on one app first) */\n status?: ServiceStatus;\n /** Per-app one-liner override (rarely needed) */\n blurb?: string;\n}\n\nexport type ServiceOverrides = Record<string, ServiceOverride>;\n\n// ── One unique hue per service — never repeated inside a group ───────────────\n\ninterface ServiceHue {\n /** icon + link tint (600 for light surfaces, 400 for dark) */\n text: string;\n /** solid fill — the arrow action + icon glow */\n solid: string;\n /** gradient ring around live cards */\n ring: string;\n}\n\nconst DEFAULT_HUE: ServiceHue = {\n text: \"text-sky-600 dark:text-sky-400\",\n solid: \"bg-sky-500\",\n ring: \"from-sky-500/60 via-sky-400/15 to-sky-600/40\",\n};\n\nexport const SERVICE_HUES: Record<string, ServiceHue> = {\n \"mint-ip-asset\": { text: \"text-sky-600 dark:text-sky-400\", solid: \"bg-sky-500\", ring: \"from-sky-500/60 via-sky-400/15 to-sky-600/40\" },\n \"create-collection\": { text: \"text-violet-600 dark:text-violet-400\", solid: \"bg-violet-500\", ring: \"from-violet-500/60 via-violet-400/15 to-violet-600/40\" },\n \"ip-collection-1155\": { text: \"text-rose-600 dark:text-rose-400\", solid: \"bg-rose-500\", ring: \"from-rose-500/60 via-rose-400/15 to-rose-600/40\" },\n \"mint-editions\": { text: \"text-amber-600 dark:text-amber-400\", solid: \"bg-amber-500\", ring: \"from-amber-500/60 via-amber-400/15 to-amber-600/40\" },\n \"creator-coins\": { text: \"text-pink-600 dark:text-pink-400\", solid: \"bg-pink-500\", ring: \"from-pink-500/60 via-pink-400/15 to-pink-600/40\" },\n \"claim-memecoin\": { text: \"text-teal-600 dark:text-teal-400\", solid: \"bg-teal-500\", ring: \"from-teal-500/60 via-teal-400/15 to-teal-600/40\" },\n \"collection-drop\": { text: \"text-orange-600 dark:text-orange-400\", solid: \"bg-orange-500\", ring: \"from-orange-500/60 via-orange-400/15 to-orange-600/40\" },\n \"pop-protocol\": { text: \"text-emerald-600 dark:text-emerald-400\", solid: \"bg-emerald-500\", ring: \"from-emerald-500/60 via-emerald-400/15 to-emerald-600/40\" },\n \"remix-asset\": { text: \"text-indigo-600 dark:text-indigo-400\", solid: \"bg-indigo-500\", ring: \"from-indigo-500/60 via-indigo-400/15 to-indigo-600/40\" },\n \"claim-username\": { text: \"text-purple-600 dark:text-purple-400\", solid: \"bg-purple-500\", ring: \"from-purple-500/60 via-purple-400/15 to-purple-600/40\" },\n \"claim-collection\": { text: \"text-cyan-600 dark:text-cyan-400\", solid: \"bg-cyan-500\", ring: \"from-cyan-500/60 via-cyan-400/15 to-cyan-600/40\" },\n};\n\n// ── Service card — the whole card is the action ─────────────────────────────\n\nexport interface LaunchpadServiceCardProps {\n def: ServiceDefinition;\n override?: ServiceOverride;\n}\n\nexport function LaunchpadServiceCard({ def, override = {} }: LaunchpadServiceCardProps) {\n const { key, icon: Icon, title, browseLinkLabel } = def;\n const status = override.status ?? def.status;\n const blurb = override.blurb ?? def.blurb;\n const { href, browseHref } = override;\n\n const live = status === \"live\";\n const hue = SERVICE_HUES[key] ?? DEFAULT_HUE;\n\n const card = (\n <div\n className={cn(\n \"relative rounded-[15px] bg-card overflow-hidden flex flex-col flex-1 min-h-[210px]\",\n \"transition-transform\",\n live ? \"active:scale-[0.99]\" : \"opacity-70\",\n )}\n >\n {/* Soft hue tint — same language as the Drop Pages panel */}\n {live && (\n <div aria-hidden className={cn(\"absolute inset-0 pointer-events-none bg-gradient-to-br to-transparent opacity-[0.07]\", hue.solid.replace(\"bg-\", \"from-\"))} />\n )}\n {/* Giant watermark icon, ghosted in the corner */}\n <div aria-hidden className=\"absolute -right-8 -bottom-10 opacity-[0.05] select-none pointer-events-none\">\n <Icon className=\"h-44 w-44\" />\n </div>\n\n <div className=\"relative flex flex-col flex-1 p-6 gap-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"relative\">\n {live && (\n <div aria-hidden className={cn(\"absolute -inset-3 rounded-full blur-2xl opacity-30\", hue.solid)} />\n )}\n <Icon className={cn(\"relative h-9 w-9 shrink-0\", live ? hue.text : \"text-muted-foreground/50\")} />\n </div>\n {!live && (\n <span className=\"flex items-center gap-1 text-[11px] font-medium text-muted-foreground/60 pt-1\">\n <Lock className=\"h-3 w-3\" />\n Coming soon\n </span>\n )}\n </div>\n\n <div className=\"space-y-1.5\">\n <h3 className=\"text-2xl font-bold tracking-tight leading-snug\">{title}</h3>\n <p className={cn(\"text-[15px] leading-relaxed max-w-[34ch]\", live ? \"text-muted-foreground\" : \"text-muted-foreground/60\")}>\n {blurb}\n </p>\n </div>\n\n {/* Stretched link — the whole card is the action, no title-repeating button */}\n {live && href && <Link href={href} aria-label={title} className=\"absolute inset-0 z-10\" />}\n\n <div className=\"mt-auto pt-1 flex items-end justify-between\">\n {live && browseHref && browseLinkLabel ? (\n <Link\n href={browseHref}\n className=\"relative z-20 inline-flex items-center gap-1 text-xs font-medium text-muted-foreground active:text-foreground\"\n >\n {browseLinkLabel}\n <ArrowRight className=\"h-3 w-3\" />\n </Link>\n ) : (\n <span />\n )}\n {live && (\n <span className={cn(\"h-11 w-11 shrink-0 rounded-full flex items-center justify-center shadow-lg shadow-black/20\", hue.solid)}>\n <ArrowUpRight className=\"h-5 w-5 text-white\" />\n </span>\n )}\n </div>\n </div>\n </div>\n );\n\n return live ? (\n <div className={cn(\"p-[1px] rounded-2xl bg-gradient-to-br flex flex-col\", hue.ring)}>\n {card}\n </div>\n ) : (\n <div className=\"rounded-2xl border border-border/30 flex flex-col\">{card}</div>\n );\n}\n\n// ── Group sections ───────────────────────────────────────────────────────────\n\nfunction GroupHeader({ group }: { group: ServiceGroupDefinition }) {\n return (\n <div className=\"space-y-1\">\n <h2 className=\"text-xl font-bold tracking-tight\">{group.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{group.tagline}</p>\n </div>\n );\n}\n\nfunction ComingSoonStrip({ group, defs }: { group: ServiceGroupDefinition; defs: ServiceDefinition[] }) {\n return (\n <div className=\"rounded-2xl border border-border/40 p-5\">\n <p className=\"font-semibold text-sm\">{group.title}</p>\n <p className=\"text-sm text-muted-foreground mt-0.5\">{group.tagline}</p>\n <div className=\"flex flex-wrap gap-2 mt-4\">\n {defs.map(({ key, icon: Icon, title }) => (\n <div key={key} className=\"flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25\">\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground/60\" />\n <span className=\"text-xs font-medium text-muted-foreground\">{title}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface LaunchpadGroupedSectionsProps {\n /** Per-app hrefs / rollout flips, keyed by service key. */\n overrides: ServiceOverrides;\n className?: string;\n}\n\n/** The full grouped launchpad services block — section order comes from\n * LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */\nexport function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps) {\n return (\n <div className={cn(\"space-y-10\", className)}>\n {LAUNCHPAD_SERVICE_GROUPS.map((group) => {\n const defs = LAUNCHPAD_SERVICE_DEFINITIONS.filter((d) => d.group === group.key);\n if (defs.length === 0) return null;\n if (group.key === \"coming-soon\") {\n return <ComingSoonStrip key={group.key} group={group} defs={defs} />;\n }\n return (\n <motion.div\n key={group.key}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] }}\n className=\"space-y-4\"\n >\n <GroupHeader group={group} />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {defs.map((def) => (\n <LaunchpadServiceCard key={def.key} def={def} override={overrides[def.key]} />\n ))}\n </div>\n </motion.div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -26,51 +26,50 @@ var import_lucide_react = require("lucide-react");
|
|
|
26
26
|
const LAUNCHPAD_SERVICE_GROUPS = [
|
|
27
27
|
{
|
|
28
28
|
key: "single-edition",
|
|
29
|
-
title: "Single
|
|
30
|
-
|
|
31
|
-
tagline: "Publish one-of-one works and group them under your own brand."
|
|
29
|
+
title: "Single Editions",
|
|
30
|
+
tagline: "Publish one-of-a-kind pieces \u2014 a song, a photo, a film \u2014 under your own name."
|
|
32
31
|
},
|
|
33
32
|
{
|
|
34
33
|
key: "limited-editions",
|
|
35
34
|
title: "Limited Editions",
|
|
36
|
-
|
|
37
|
-
tagline: "Release your work in numbered multiples collectors can buy and trade."
|
|
35
|
+
tagline: "Release your work in numbered copies your fans can collect and trade."
|
|
38
36
|
},
|
|
39
37
|
{
|
|
40
38
|
key: "creator-coins",
|
|
41
39
|
title: "Creator Coins",
|
|
42
|
-
tagline: "Launch your own coin
|
|
40
|
+
tagline: "Launch your own coin and let your community back you."
|
|
43
41
|
},
|
|
44
42
|
{
|
|
45
43
|
key: "collection-drop",
|
|
46
44
|
title: "Collection Drop",
|
|
47
|
-
tagline: "
|
|
45
|
+
tagline: "Schedule a release and let your audience mint while the window is open."
|
|
48
46
|
},
|
|
49
47
|
{
|
|
50
48
|
key: "pop-protocol",
|
|
51
49
|
title: "POP Protocol",
|
|
52
|
-
tagline: "
|
|
50
|
+
tagline: "Give your community proof they were part of the moment."
|
|
53
51
|
},
|
|
54
52
|
{
|
|
55
53
|
key: "licensing-remix",
|
|
56
54
|
title: "Licensing & Remix",
|
|
57
|
-
tagline: "
|
|
55
|
+
tagline: "Let others build on your work \u2014 with credit and royalties flowing back to you."
|
|
58
56
|
},
|
|
59
57
|
{
|
|
60
58
|
key: "claims",
|
|
61
59
|
title: "Claims",
|
|
62
|
-
tagline: "
|
|
60
|
+
tagline: "Quick wins \u2014 claim your name and bring in work you have already made."
|
|
63
61
|
},
|
|
64
62
|
{
|
|
65
63
|
key: "coming-soon",
|
|
66
64
|
title: "Coming soon",
|
|
67
|
-
tagline: "More
|
|
65
|
+
tagline: "More ways to earn are on the way."
|
|
68
66
|
}
|
|
69
67
|
];
|
|
70
68
|
const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
71
69
|
// ── Create ────────────────────────────────────────────────────────────────
|
|
72
70
|
{
|
|
73
71
|
key: "mint-ip-asset",
|
|
72
|
+
blurb: "Upload a song, a photo, a video \u2014 any file \u2014 and publish it as yours, free, in minutes.",
|
|
74
73
|
title: "Mint singular NFT",
|
|
75
74
|
subtitle: "Publish your creative work onchain",
|
|
76
75
|
description: "Upload any photo, video, audio, or document and mint it as an IP NFT \u2014 with licensing, provenance, and ownership all locked on-chain.",
|
|
@@ -89,6 +88,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
89
88
|
},
|
|
90
89
|
{
|
|
91
90
|
key: "create-collection",
|
|
91
|
+
blurb: "Give your works a home of their own, with its own page and name.",
|
|
92
92
|
title: "Create NFT Collection",
|
|
93
93
|
subtitle: "Group your NFTs under a shared identity",
|
|
94
94
|
description: "Deploy a branded ERC-721 collection with its own page and on-chain identity. Add assets to it at any time and share it with collectors.",
|
|
@@ -106,6 +106,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
108
|
key: "ip-collection-1155",
|
|
109
|
+
blurb: "Set up a collection made for numbered copies of your work.",
|
|
109
110
|
title: "Limited Editions Collections",
|
|
110
111
|
subtitle: "Deploy a contract for multi-copy NFT releases",
|
|
111
112
|
description: "Create a collection built for editions \u2014 release music tracks, art prints, or any IP in numbered multiples. Each edition token is tradeable on Medialane.",
|
|
@@ -123,6 +124,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
123
124
|
},
|
|
124
125
|
{
|
|
125
126
|
key: "mint-editions",
|
|
127
|
+
blurb: "Release a new piece in as many copies as you choose.",
|
|
126
128
|
title: "Mint Limited Edition",
|
|
127
129
|
subtitle: "Add new editions to an existing collection",
|
|
128
130
|
description: "Pick one of your Limited Edition contracts, upload artwork, set the supply, and release to collectors \u2014 all in a few clicks.",
|
|
@@ -140,6 +142,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
140
142
|
},
|
|
141
143
|
{
|
|
142
144
|
key: "remix-asset",
|
|
145
|
+
blurb: "Create from another work \u2014 credit and royalties are handled for you.",
|
|
143
146
|
title: "Remix Asset",
|
|
144
147
|
subtitle: "Derivative works with on-chain attribution",
|
|
145
148
|
description: "Create a licensed derivative of any digital asset with full provenance and attribution flowing back to the original creator on-chain.",
|
|
@@ -158,6 +161,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
158
161
|
// ── Launch ────────────────────────────────────────────────────────────────
|
|
159
162
|
{
|
|
160
163
|
key: "pop-protocol",
|
|
164
|
+
blurb: "Hand out badges your attendees keep forever.",
|
|
161
165
|
title: "POP Protocol",
|
|
162
166
|
subtitle: "Proof-of-participation for events & communities",
|
|
163
167
|
description: "Issue soulbound credentials to your community \u2014 one non-transferable badge per wallet, permanently on-chain. No transferring, no faking.",
|
|
@@ -176,6 +180,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
176
180
|
},
|
|
177
181
|
{
|
|
178
182
|
key: "collection-drop",
|
|
183
|
+
blurb: "Set a price, a window, and a limited run \u2014 then open the doors.",
|
|
179
184
|
title: "Collection Drop",
|
|
180
185
|
subtitle: "Timed NFT releases with mint windows",
|
|
181
186
|
description: "Launch a time-gated mint campaign \u2014 set a price, supply cap, start and end time, and let collectors mint directly from your drop page.",
|
|
@@ -194,6 +199,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
194
199
|
},
|
|
195
200
|
{
|
|
196
201
|
key: "ip-tickets",
|
|
202
|
+
blurb: "Sell tickets to your shows and events.",
|
|
197
203
|
title: "IP Tickets",
|
|
198
204
|
subtitle: "Gate real-world experiences with NFTs",
|
|
199
205
|
description: "Distribute tickets for concerts, workshops, and events. Each ticket is verifiable on-chain proof of attendance.",
|
|
@@ -209,6 +215,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
209
215
|
},
|
|
210
216
|
{
|
|
211
217
|
key: "membership",
|
|
218
|
+
blurb: "Passes that unlock more for your closest fans.",
|
|
212
219
|
title: "Membership",
|
|
213
220
|
subtitle: "Token-gated access passes",
|
|
214
221
|
description: "Create tiered membership passes that unlock exclusive content, private communities, and experiences for your most loyal fans.",
|
|
@@ -225,6 +232,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
225
232
|
// ── Monetize ─────────────────────────────────────────────────────────────
|
|
226
233
|
{
|
|
227
234
|
key: "subscriptions",
|
|
235
|
+
blurb: "Recurring support from your audience.",
|
|
228
236
|
title: "Subscriptions",
|
|
229
237
|
subtitle: "Recurring on-chain revenue",
|
|
230
238
|
description: "Monthly licensing, creator support tiers, and access passes \u2014 all auto-renewed without intermediaries.",
|
|
@@ -240,6 +248,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
240
248
|
},
|
|
241
249
|
{
|
|
242
250
|
key: "ip-coins",
|
|
251
|
+
blurb: "Let fans own a piece of your catalog.",
|
|
243
252
|
title: "IP Coins",
|
|
244
253
|
subtitle: "Fractional ownership of intellectual property",
|
|
245
254
|
description: "Tokenize your IP catalog as fungible tokens. Enable fractional ownership and liquid markets around your creative work.",
|
|
@@ -255,6 +264,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
255
264
|
},
|
|
256
265
|
{
|
|
257
266
|
key: "creator-coins",
|
|
267
|
+
blurb: "Launch your coin in a few clicks \u2014 and stay in control of it.",
|
|
258
268
|
title: "Creator Coin",
|
|
259
269
|
subtitle: "Your own coin, your liquidity",
|
|
260
270
|
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.",
|
|
@@ -272,6 +282,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
272
282
|
// ── Claims ────────────────────────────────────────────────────────────────
|
|
273
283
|
{
|
|
274
284
|
key: "claim-memecoin",
|
|
285
|
+
blurb: "Already launched a coin? Add it to your Medialane profile.",
|
|
275
286
|
title: "Claim Memecoin",
|
|
276
287
|
subtitle: "Bring your Starknet coin to Medialane",
|
|
277
288
|
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.",
|
|
@@ -288,6 +299,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
288
299
|
},
|
|
289
300
|
{
|
|
290
301
|
key: "claim-username",
|
|
302
|
+
blurb: "Reserve your name and get your own creator page.",
|
|
291
303
|
title: "Claim Username",
|
|
292
304
|
subtitle: "Reserve your creator page URL",
|
|
293
305
|
description: "Claim your unique username and get a shareable creator page \u2014 your public portfolio at a clean, memorable URL. Free, and yours.",
|
|
@@ -304,6 +316,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
304
316
|
},
|
|
305
317
|
{
|
|
306
318
|
key: "claim-collection",
|
|
319
|
+
blurb: "Made a collection somewhere else? Bring it to your profile.",
|
|
307
320
|
title: "Claim Collection",
|
|
308
321
|
subtitle: "Import an existing Starknet collection",
|
|
309
322
|
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.",
|