@medialane/ui 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/launchpad-services.cjs +166 -129
- package/dist/components/launchpad-services.cjs.map +1 -1
- package/dist/components/launchpad-services.d.cts +30 -9
- package/dist/components/launchpad-services.d.ts +30 -9
- package/dist/components/launchpad-services.js +166 -128
- package/dist/components/launchpad-services.js.map +1 -1
- package/dist/data/launchpad-services.cjs +24 -16
- package/dist/data/launchpad-services.cjs.map +1 -1
- package/dist/data/launchpad-services.d.cts +2 -0
- package/dist/data/launchpad-services.d.ts +2 -0
- package/dist/data/launchpad-services.js +24 -16
- package/dist/data/launchpad-services.js.map +1 -1
- package/dist/index.cjs +6 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/launchpad-grid.cjs +0 -77
- package/dist/components/launchpad-grid.cjs.map +0 -1
- package/dist/components/launchpad-grid.d.cts +0 -20
- package/dist/components/launchpad-grid.d.ts +0 -20
- package/dist/components/launchpad-grid.js +0 -43
- package/dist/components/launchpad-grid.js.map +0 -1
|
@@ -1,157 +1,195 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import Link from "next/link";
|
|
4
|
+
import { motion } from "framer-motion";
|
|
4
5
|
import { Lock, ArrowRight } from "lucide-react";
|
|
5
6
|
import { cn } from "../utils/cn.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
icon:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
7
|
+
import {
|
|
8
|
+
LAUNCHPAD_SERVICE_DEFINITIONS,
|
|
9
|
+
LAUNCHPAD_SERVICE_GROUPS
|
|
10
|
+
} from "../data/launchpad-services.js";
|
|
11
|
+
const DEFAULT_COLORS = {
|
|
12
|
+
icon: "text-brand-blue",
|
|
13
|
+
button: "bg-brand-blue",
|
|
14
|
+
chip: "border-border/50 text-muted-foreground bg-muted/30",
|
|
15
|
+
gradient: "from-border/40 to-border/20"
|
|
16
|
+
};
|
|
17
|
+
const SERVICE_CARD_COLORS = {
|
|
18
|
+
"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" },
|
|
19
|
+
"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" },
|
|
20
|
+
"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" },
|
|
21
|
+
"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" },
|
|
22
|
+
"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" },
|
|
23
|
+
"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" },
|
|
24
|
+
"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" },
|
|
25
|
+
"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" },
|
|
26
|
+
"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" },
|
|
27
|
+
"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" },
|
|
28
|
+
"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" },
|
|
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" }
|
|
33
|
+
};
|
|
34
|
+
function LaunchpadServiceCard({ def, override = {} }) {
|
|
35
|
+
const { key, icon: Icon, browseLinkLabel } = def;
|
|
36
|
+
const status = override.status ?? def.status;
|
|
37
|
+
const badge = override.badge ?? def.badge;
|
|
38
|
+
const subtitle = override.subtitle ?? def.subtitle;
|
|
39
|
+
const description = override.description ?? def.description;
|
|
40
|
+
const features = override.features ?? def.features;
|
|
41
|
+
const { href, buttonLabel, browseHref } = override;
|
|
23
42
|
const live = status === "live";
|
|
24
43
|
const building = status === "building";
|
|
25
44
|
const active = live || building;
|
|
26
|
-
|
|
45
|
+
const colors = SERVICE_CARD_COLORS[key] ?? DEFAULT_COLORS;
|
|
46
|
+
const card = /* @__PURE__ */ jsxs(
|
|
27
47
|
"div",
|
|
28
48
|
{
|
|
29
49
|
className: cn(
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
active
|
|
33
|
-
live && "hover:-translate-y-[3px] hover:shadow-lg hover:shadow-black/5 dark:hover:shadow-black/20",
|
|
34
|
-
!active && "opacity-60"
|
|
50
|
+
"relative rounded-[15px] bg-card flex flex-col overflow-hidden",
|
|
51
|
+
"transition-all duration-200 flex-1",
|
|
52
|
+
!active && "opacity-80"
|
|
35
53
|
),
|
|
36
|
-
children:
|
|
37
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
|
|
38
|
-
/* @__PURE__ */ jsx(
|
|
39
|
-
Icon,
|
|
40
|
-
{
|
|
41
|
-
className: cn(
|
|
42
|
-
"h-9 w-9 transition-transform duration-300",
|
|
43
|
-
active ? iconColor : "text-muted-foreground/25",
|
|
44
|
-
live && "group-hover:scale-110"
|
|
45
|
-
)
|
|
46
|
-
}
|
|
47
|
-
),
|
|
48
|
-
/* @__PURE__ */ jsxs(
|
|
49
|
-
"span",
|
|
50
|
-
{
|
|
51
|
-
className: cn(
|
|
52
|
-
"text-[10px] font-semibold tracking-widest uppercase rounded-full px-2.5 py-1 flex items-center gap-1.5",
|
|
53
|
-
live ? "text-emerald-600 dark:text-emerald-400 bg-emerald-500/10" : building ? "text-amber-600 dark:text-amber-400 bg-amber-500/10" : "text-muted-foreground/40 bg-muted/30"
|
|
54
|
-
),
|
|
55
|
-
children: [
|
|
56
|
-
live && /* @__PURE__ */ jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse" }),
|
|
57
|
-
!active && /* @__PURE__ */ jsx(Lock, { className: "h-2.5 w-2.5" }),
|
|
58
|
-
badge
|
|
59
|
-
]
|
|
60
|
-
}
|
|
61
|
-
)
|
|
62
|
-
] }),
|
|
63
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
64
|
-
/* @__PURE__ */ jsx(
|
|
65
|
-
"p",
|
|
66
|
-
{
|
|
67
|
-
className: cn(
|
|
68
|
-
"text-xl sm:text-2xl font-bold leading-snug tracking-tight",
|
|
69
|
-
!active && "text-foreground/40"
|
|
70
|
-
),
|
|
71
|
-
children: title
|
|
72
|
-
}
|
|
73
|
-
),
|
|
74
|
-
/* @__PURE__ */ jsx(
|
|
75
|
-
"p",
|
|
76
|
-
{
|
|
77
|
-
className: cn(
|
|
78
|
-
"text-xs leading-relaxed",
|
|
79
|
-
active ? "text-muted-foreground" : "text-muted-foreground/30"
|
|
80
|
-
),
|
|
81
|
-
children: subtitle
|
|
82
|
-
}
|
|
83
|
-
)
|
|
84
|
-
] }),
|
|
54
|
+
children: [
|
|
85
55
|
/* @__PURE__ */ jsx(
|
|
86
|
-
"
|
|
56
|
+
"div",
|
|
87
57
|
{
|
|
58
|
+
"aria-hidden": true,
|
|
88
59
|
className: cn(
|
|
89
|
-
"
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
60
|
+
"absolute inset-0 bg-gradient-to-br pointer-events-none",
|
|
61
|
+
colors.gradient,
|
|
62
|
+
active ? "opacity-[0.13]" : "opacity-[0.05]"
|
|
63
|
+
)
|
|
93
64
|
}
|
|
94
65
|
),
|
|
95
|
-
/* @__PURE__ */
|
|
96
|
-
"
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
"
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
66
|
+
/* @__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: [
|
|
68
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
69
|
+
active && /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: cn("absolute -inset-3 rounded-full blur-2xl opacity-30", colors.button) }),
|
|
70
|
+
/* @__PURE__ */ jsx(Icon, { className: cn("relative h-10 w-10 transition-transform duration-300", active ? colors.icon : "text-muted-foreground/45") })
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsxs(
|
|
73
|
+
"span",
|
|
74
|
+
{
|
|
75
|
+
className: cn(
|
|
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 })
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
92
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-sm leading-relaxed", active ? "text-muted-foreground" : "text-muted-foreground/50"), children: description }),
|
|
93
|
+
def.example && active && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground/60 italic", children: def.example })
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: features.map((f) => /* @__PURE__ */ jsx(
|
|
96
|
+
"span",
|
|
109
97
|
{
|
|
110
|
-
href,
|
|
111
98
|
className: cn(
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"transition-all duration-200 active:scale-[0.98]",
|
|
115
|
-
buttonColor
|
|
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"
|
|
116
101
|
),
|
|
117
|
-
children:
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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(
|
|
124
|
+
Link,
|
|
125
|
+
{
|
|
126
|
+
href: browseHref,
|
|
127
|
+
className: "flex items-center justify-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors py-1",
|
|
128
|
+
children: [
|
|
129
|
+
browseLinkLabel,
|
|
130
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "h-3 w-3" })
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 h-10 mt-auto pt-2 text-sm text-muted-foreground/50 font-medium", children: [
|
|
135
|
+
/* @__PURE__ */ jsx(Lock, { className: "h-3.5 w-3.5" }),
|
|
136
|
+
building ? "In development" : "Coming soon"
|
|
137
|
+
] })
|
|
137
138
|
] })
|
|
138
|
-
]
|
|
139
|
+
]
|
|
139
140
|
}
|
|
140
141
|
);
|
|
142
|
+
return live ? /* @__PURE__ */ jsx("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"), children: card }) : /* @__PURE__ */ jsx("div", { className: "rounded-2xl border border-border/25 flex flex-col", children: card });
|
|
141
143
|
}
|
|
142
|
-
function
|
|
143
|
-
return /* @__PURE__ */
|
|
144
|
-
"div",
|
|
145
|
-
|
|
146
|
-
className:
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
144
|
+
function GroupHeader({ group }) {
|
|
145
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
146
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
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
|
+
] }),
|
|
150
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: group.tagline })
|
|
151
|
+
] });
|
|
152
|
+
}
|
|
153
|
+
function ComingSoonStrip({ group, defs }) {
|
|
154
|
+
return /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border/25 p-5", children: [
|
|
155
|
+
/* @__PURE__ */ jsx("p", { className: "section-label", children: group.title }),
|
|
156
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mt-1", children: group.tagline }),
|
|
157
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 mt-4", children: defs.map(({ key, icon: Icon, title, subtitle }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25", children: [
|
|
158
|
+
/* @__PURE__ */ jsx(Icon, { className: "h-3.5 w-3.5 text-muted-foreground/60" }),
|
|
159
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-muted-foreground", children: title }),
|
|
160
|
+
/* @__PURE__ */ jsxs("span", { className: "hidden sm:inline text-xs text-muted-foreground/50", children: [
|
|
161
|
+
"\u2014 ",
|
|
162
|
+
subtitle
|
|
163
|
+
] })
|
|
164
|
+
] }, key)) })
|
|
165
|
+
] });
|
|
166
|
+
}
|
|
167
|
+
function LaunchpadGroupedSections({ overrides, className }) {
|
|
168
|
+
return /* @__PURE__ */ jsx("div", { className: cn("space-y-10", className), children: LAUNCHPAD_SERVICE_GROUPS.map((group) => {
|
|
169
|
+
const defs = LAUNCHPAD_SERVICE_DEFINITIONS.filter((d) => d.group === group.key);
|
|
170
|
+
if (defs.length === 0) return null;
|
|
171
|
+
if (group.key === "coming-soon") {
|
|
172
|
+
return /* @__PURE__ */ jsx(ComingSoonStrip, { group, defs }, group.key);
|
|
151
173
|
}
|
|
152
|
-
|
|
174
|
+
return /* @__PURE__ */ jsxs(
|
|
175
|
+
motion.div,
|
|
176
|
+
{
|
|
177
|
+
initial: { opacity: 0, y: 8 },
|
|
178
|
+
animate: { opacity: 1, y: 0 },
|
|
179
|
+
transition: { duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] },
|
|
180
|
+
className: "space-y-4",
|
|
181
|
+
children: [
|
|
182
|
+
/* @__PURE__ */ jsx(GroupHeader, { group }),
|
|
183
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-5", children: defs.map((def) => /* @__PURE__ */ jsx(LaunchpadServiceCard, { def, override: overrides[def.key] }, def.key)) })
|
|
184
|
+
]
|
|
185
|
+
},
|
|
186
|
+
group.key
|
|
187
|
+
);
|
|
188
|
+
}) });
|
|
153
189
|
}
|
|
154
190
|
export {
|
|
155
|
-
|
|
191
|
+
LaunchpadGroupedSections,
|
|
192
|
+
LaunchpadServiceCard,
|
|
193
|
+
SERVICE_CARD_COLORS
|
|
156
194
|
};
|
|
157
195
|
//# sourceMappingURL=launchpad-services.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/launchpad-services.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { Lock, ArrowRight } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\nimport type { ServiceDefinition } from \"../data/launchpad-services.js\";\n\nexport type { ServiceStatus, ServiceCategory, ServiceDefinition } from \"../data/launchpad-services.js\";\n\nexport interface ServiceCardProps extends ServiceDefinition {\n /** Primary CTA href — required for live services */\n href?: string;\n /** Primary CTA button label */\n buttonLabel?: string;\n /** Secondary browse link href */\n browseHref?: string;\n}\n\nfunction ServiceCard({\n title,\n subtitle,\n description,\n features,\n icon: Icon,\n gradient,\n borderColor,\n iconColor,\n buttonColor,\n badge,\n status,\n href,\n buttonLabel,\n browseHref,\n browseLinkLabel,\n}: ServiceCardProps) {\n const live = status === \"live\";\n const building = status === \"building\";\n const active = live || building;\n\n return (\n <div\n className={cn(\n \"group relative rounded-2xl border overflow-hidden transition-all duration-300 flex flex-col\",\n `bg-gradient-to-br ${gradient}`,\n active ? borderColor : \"border-border/20\",\n live && \"hover:-translate-y-[3px] hover:shadow-lg hover:shadow-black/5 dark:hover:shadow-black/20\",\n !active && \"opacity-60\"\n )}\n >\n <div className=\"flex flex-col flex-1 p-7 gap-6\">\n\n {/* Icon + status badge */}\n <div className=\"flex items-start justify-between\">\n <Icon\n className={cn(\n \"h-9 w-9 transition-transform duration-300\",\n active ? iconColor : \"text-muted-foreground/25\",\n live && \"group-hover:scale-110\"\n )}\n />\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-600 dark:text-emerald-400 bg-emerald-500/10\"\n : building\n ? \"text-amber-600 dark:text-amber-400 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.5\">\n <p\n className={cn(\n \"text-xl sm:text-2xl font-bold leading-snug tracking-tight\",\n !active && \"text-foreground/40\"\n )}\n >\n {title}\n </p>\n <p\n className={cn(\n \"text-xs leading-relaxed\",\n active ? \"text-muted-foreground\" : \"text-muted-foreground/30\"\n )}\n >\n {subtitle}\n </p>\n </div>\n\n {/* Description */}\n <p\n className={cn(\n \"text-sm leading-relaxed flex-1\",\n active ? \"text-muted-foreground\" : \"text-muted-foreground/30\"\n )}\n >\n {description}\n </p>\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\n ? \"bg-background/50 border-border/50 text-muted-foreground\"\n : \"bg-muted/10 border-border/15 text-muted-foreground/25\"\n )}\n >\n {f}\n </span>\n ))}\n </div>\n\n {/* CTA */}\n {live && href ? (\n <div className=\"space-y-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 duration-200 active:scale-[0.98]\",\n buttonColor\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 text-sm text-muted-foreground/30 font-medium\">\n <Lock className=\"h-3.5 w-3.5\" />\n {building ? \"In development\" : \"Coming soon\"}\n </div>\n )}\n\n </div>\n </div>\n );\n}\n\nexport interface LaunchpadServicesGridProps {\n services: ServiceCardProps[];\n className?: string;\n}\n\nexport function LaunchpadServicesGrid({ services, className }: LaunchpadServicesGridProps) {\n return (\n <div\n className={cn(\n \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\",\n className\n )}\n >\n {services.map(({ key, ...rest }) => (\n <ServiceCard key={key} {...rest} />\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 (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":[]}
|
|
@@ -71,10 +71,12 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
71
71
|
// ── Create ────────────────────────────────────────────────────────────────
|
|
72
72
|
{
|
|
73
73
|
key: "mint-ip-asset",
|
|
74
|
-
title: "Mint
|
|
75
|
-
subtitle: "Publish
|
|
76
|
-
description: "
|
|
77
|
-
features
|
|
74
|
+
title: "Mint singular NFT",
|
|
75
|
+
subtitle: "Publish your creative work onchain",
|
|
76
|
+
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.",
|
|
77
|
+
// Apps may override features[0] with their gasless-rail wording (ChipiPay/AVNU).
|
|
78
|
+
features: ["Gasless transactions", "IPFS metadata", "Programmable licensing"],
|
|
79
|
+
example: "e.g. A song, a photo, an ebook, a short film",
|
|
78
80
|
icon: import_lucide_react.ImagePlus,
|
|
79
81
|
gradient: "from-blue-500/10 via-sky-400/4 to-transparent",
|
|
80
82
|
borderColor: "border-blue-500/20",
|
|
@@ -87,10 +89,11 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
87
89
|
},
|
|
88
90
|
{
|
|
89
91
|
key: "create-collection",
|
|
90
|
-
title: "Create Collection",
|
|
92
|
+
title: "Create NFT Collection",
|
|
91
93
|
subtitle: "Group your NFTs under a shared identity",
|
|
92
|
-
description: "Deploy a branded ERC-721 collection with its own page
|
|
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.",
|
|
93
95
|
features: ["Factory-deployed ERC-721", "Branded collection page", "Add assets at any time"],
|
|
96
|
+
example: "e.g. A photography portfolio, a music catalog, a comic series",
|
|
94
97
|
icon: import_lucide_react.Layers,
|
|
95
98
|
gradient: "from-violet-500/10 via-purple-400/4 to-transparent",
|
|
96
99
|
borderColor: "border-violet-500/20",
|
|
@@ -103,10 +106,11 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
103
106
|
},
|
|
104
107
|
{
|
|
105
108
|
key: "ip-collection-1155",
|
|
106
|
-
title: "
|
|
109
|
+
title: "Limited Editions Collections",
|
|
107
110
|
subtitle: "Deploy a contract for multi-copy NFT releases",
|
|
108
|
-
description: "
|
|
109
|
-
features: ["Multi-edition ERC-1155", "
|
|
111
|
+
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.",
|
|
112
|
+
features: ["Multi-edition ERC-1155", "Numbered tokens", "Tradeable on Medialane"],
|
|
113
|
+
example: "e.g. 50 copies of a limited print, a music EP released in 100 editions",
|
|
110
114
|
icon: import_lucide_react.Layers,
|
|
111
115
|
gradient: "from-violet-500/10 via-purple-400/4 to-transparent",
|
|
112
116
|
borderColor: "border-violet-500/20",
|
|
@@ -119,10 +123,11 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
119
123
|
},
|
|
120
124
|
{
|
|
121
125
|
key: "mint-editions",
|
|
122
|
-
title: "Mint
|
|
126
|
+
title: "Mint Limited Edition",
|
|
123
127
|
subtitle: "Add new editions to an existing collection",
|
|
124
|
-
description: "
|
|
128
|
+
description: "Pick one of your Limited Edition contracts, upload artwork, set the supply, and release to collectors \u2014 all in a few clicks.",
|
|
125
129
|
features: ["Choose any edition collection", "Set edition supply", "IPFS metadata"],
|
|
130
|
+
example: "e.g. Drop 25 numbered prints from your art series",
|
|
126
131
|
icon: import_lucide_react.PlusCircle,
|
|
127
132
|
gradient: "from-fuchsia-500/10 via-violet-400/4 to-transparent",
|
|
128
133
|
borderColor: "border-fuchsia-500/20",
|
|
@@ -137,8 +142,9 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
137
142
|
key: "remix-asset",
|
|
138
143
|
title: "Remix Asset",
|
|
139
144
|
subtitle: "Derivative works with on-chain attribution",
|
|
140
|
-
description: "Create a licensed derivative of any
|
|
145
|
+
description: "Create a licensed derivative of any digital asset with full provenance and attribution flowing back to the original creator on-chain.",
|
|
141
146
|
features: ["On-chain attribution", "License-enforced at mint", "Royalties to original creator"],
|
|
147
|
+
example: "e.g. A remix of a song, a derivative artwork inspired by an original",
|
|
142
148
|
icon: import_lucide_react.GitBranch,
|
|
143
149
|
gradient: "from-rose-500/10 via-pink-400/4 to-transparent",
|
|
144
150
|
borderColor: "border-rose-500/20",
|
|
@@ -154,8 +160,9 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
154
160
|
key: "pop-protocol",
|
|
155
161
|
title: "POP Protocol",
|
|
156
162
|
subtitle: "Proof-of-participation for events & communities",
|
|
157
|
-
description: "
|
|
163
|
+
description: "Issue soulbound credentials to your community \u2014 one non-transferable badge per wallet, permanently on-chain. No transferring, no faking.",
|
|
158
164
|
features: ["Soulbound \xB7 non-transferable", "One credential per wallet", "Optional allowlist gating"],
|
|
165
|
+
example: "e.g. Hackathon attendance badge, community membership, conference pass",
|
|
159
166
|
icon: import_lucide_react.Award,
|
|
160
167
|
gradient: "from-emerald-500/10 via-green-400/4 to-transparent",
|
|
161
168
|
borderColor: "border-emerald-500/20",
|
|
@@ -170,9 +177,10 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
|
170
177
|
{
|
|
171
178
|
key: "collection-drop",
|
|
172
179
|
title: "Collection Drop",
|
|
173
|
-
subtitle: "
|
|
174
|
-
description: "Launch a
|
|
175
|
-
features: ["
|
|
180
|
+
subtitle: "Timed NFT releases with mint windows",
|
|
181
|
+
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.",
|
|
182
|
+
features: ["Timed mint window", "Price + supply cap", "Branded drop page"],
|
|
183
|
+
example: "e.g. A 48-hour drop of 200 NFTs at 5 USDC each",
|
|
176
184
|
icon: import_lucide_react.Package,
|
|
177
185
|
gradient: "from-orange-500/10 via-amber-400/4 to-transparent",
|
|
178
186
|
borderColor: "border-orange-500/20",
|
|
@@ -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 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":[]}
|
|
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 /** Concrete usage example shown on active cards (italic line). */\n example?: string;\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 singular NFT\",\n subtitle: \"Publish your creative work onchain\",\n description:\n \"Upload any photo, video, audio, or document and mint it as an IP NFT — with licensing, provenance, and ownership all locked on-chain.\",\n // Apps may override features[0] with their gasless-rail wording (ChipiPay/AVNU).\n features: [\"Gasless transactions\", \"IPFS metadata\", \"Programmable licensing\"],\n example: \"e.g. A song, a photo, an ebook, a short film\",\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 NFT Collection\",\n subtitle: \"Group your NFTs under a shared identity\",\n description:\n \"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.\",\n features: [\"Factory-deployed ERC-721\", \"Branded collection page\", \"Add assets at any time\"],\n example: \"e.g. A photography portfolio, a music catalog, a comic series\",\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: \"Limited Editions Collections\",\n subtitle: \"Deploy a contract for multi-copy NFT releases\",\n description:\n \"Create a collection built for editions — release music tracks, art prints, or any IP in numbered multiples. Each edition token is tradeable on Medialane.\",\n features: [\"Multi-edition ERC-1155\", \"Numbered tokens\", \"Tradeable on Medialane\"],\n example: \"e.g. 50 copies of a limited print, a music EP released in 100 editions\",\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 Limited Edition\",\n subtitle: \"Add new editions to an existing collection\",\n description:\n \"Pick one of your Limited Edition contracts, upload artwork, set the supply, and release to collectors — all in a few clicks.\",\n features: [\"Choose any edition collection\", \"Set edition supply\", \"IPFS metadata\"],\n example: \"e.g. Drop 25 numbered prints from your art series\",\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 digital asset with full provenance and attribution flowing back to the original creator on-chain.\",\n features: [\"On-chain attribution\", \"License-enforced at mint\", \"Royalties to original creator\"],\n example: \"e.g. A remix of a song, a derivative artwork inspired by an original\",\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 \"Issue soulbound credentials to your community — one non-transferable badge per wallet, permanently on-chain. No transferring, no faking.\",\n features: [\"Soulbound · non-transferable\", \"One credential per wallet\", \"Optional allowlist gating\"],\n example: \"e.g. Hackathon attendance badge, community membership, conference pass\",\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: \"Timed NFT releases with mint windows\",\n description:\n \"Launch a time-gated mint campaign — set a price, supply cap, start and end time, and let collectors mint directly from your drop page.\",\n features: [\"Timed mint window\", \"Price + supply cap\", \"Branded drop page\"],\n example: \"e.g. A 48-hour drop of 200 NFTs at 5 USDC each\",\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":[]}
|
|
@@ -28,6 +28,8 @@ interface ServiceDefinition {
|
|
|
28
28
|
status: ServiceStatus;
|
|
29
29
|
category: ServiceCategory;
|
|
30
30
|
group: ServiceGroup;
|
|
31
|
+
/** Concrete usage example shown on active cards (italic line). */
|
|
32
|
+
example?: string;
|
|
31
33
|
/** Secondary browse link label — injected app adds the href */
|
|
32
34
|
browseLinkLabel?: string;
|
|
33
35
|
}
|