@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
|
@@ -31,7 +31,7 @@ var launchpad_services_exports = {};
|
|
|
31
31
|
__export(launchpad_services_exports, {
|
|
32
32
|
LaunchpadGroupedSections: () => LaunchpadGroupedSections,
|
|
33
33
|
LaunchpadServiceCard: () => LaunchpadServiceCard,
|
|
34
|
-
|
|
34
|
+
SERVICE_HUES: () => SERVICE_HUES
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(launchpad_services_exports);
|
|
37
37
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -40,159 +40,91 @@ var import_framer_motion = require("framer-motion");
|
|
|
40
40
|
var import_lucide_react = require("lucide-react");
|
|
41
41
|
var import_cn = require("../utils/cn.js");
|
|
42
42
|
var import_launchpad_services = require("../data/launchpad-services.js");
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
gradient: "from-border/40 to-border/20"
|
|
43
|
+
const DEFAULT_HUE = {
|
|
44
|
+
text: "text-sky-600 dark:text-sky-400",
|
|
45
|
+
solid: "bg-sky-500",
|
|
46
|
+
ring: "from-sky-500/60 via-sky-400/15 to-sky-600/40"
|
|
48
47
|
};
|
|
49
|
-
const
|
|
50
|
-
"mint-ip-asset": {
|
|
51
|
-
"create-collection": {
|
|
52
|
-
"ip-collection-1155": {
|
|
53
|
-
"mint-editions": {
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"collection-drop": {
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"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" },
|
|
62
|
-
"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" },
|
|
63
|
-
"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" },
|
|
64
|
-
"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" }
|
|
48
|
+
const SERVICE_HUES = {
|
|
49
|
+
"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" },
|
|
50
|
+
"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" },
|
|
51
|
+
"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" },
|
|
52
|
+
"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" },
|
|
53
|
+
"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" },
|
|
54
|
+
"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" },
|
|
55
|
+
"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" },
|
|
56
|
+
"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" },
|
|
57
|
+
"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" },
|
|
58
|
+
"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" },
|
|
59
|
+
"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" }
|
|
65
60
|
};
|
|
66
61
|
function LaunchpadServiceCard({ def, override = {} }) {
|
|
67
|
-
const { key, icon: Icon, browseLinkLabel } = def;
|
|
62
|
+
const { key, icon: Icon, title, browseLinkLabel } = def;
|
|
68
63
|
const status = override.status ?? def.status;
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
-
const description = override.description ?? def.description;
|
|
72
|
-
const features = override.features ?? def.features;
|
|
73
|
-
const { href, buttonLabel, browseHref } = override;
|
|
64
|
+
const blurb = override.blurb ?? def.blurb;
|
|
65
|
+
const { href, browseHref } = override;
|
|
74
66
|
const live = status === "live";
|
|
75
|
-
const
|
|
76
|
-
const active = live || building;
|
|
77
|
-
const colors = SERVICE_CARD_COLORS[key] ?? DEFAULT_COLORS;
|
|
67
|
+
const hue = SERVICE_HUES[key] ?? DEFAULT_HUE;
|
|
78
68
|
const card = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
79
69
|
"div",
|
|
80
70
|
{
|
|
81
71
|
className: (0, import_cn.cn)(
|
|
82
|
-
"relative rounded-[15px] bg-card flex flex-col
|
|
83
|
-
"transition-
|
|
84
|
-
|
|
72
|
+
"relative rounded-[15px] bg-card overflow-hidden flex flex-col flex-1 min-h-[210px]",
|
|
73
|
+
"transition-transform",
|
|
74
|
+
live ? "active:scale-[0.99]" : "opacity-70"
|
|
85
75
|
),
|
|
86
76
|
children: [
|
|
87
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
88
|
-
|
|
89
|
-
{
|
|
90
|
-
"aria-hidden": true,
|
|
91
|
-
className: (0, import_cn.cn)(
|
|
92
|
-
"absolute inset-0 bg-gradient-to-br pointer-events-none",
|
|
93
|
-
colors.gradient,
|
|
94
|
-
active ? "opacity-[0.13]" : "opacity-[0.05]"
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
),
|
|
77
|
+
live && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { "aria-hidden": true, className: (0, import_cn.cn)("absolute inset-0 pointer-events-none bg-gradient-to-br to-transparent opacity-[0.07]", hue.solid.replace("bg-", "from-")) }),
|
|
78
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { "aria-hidden": true, className: "absolute -right-8 -bottom-10 opacity-[0.05] select-none pointer-events-none", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: "h-44 w-44" }) }),
|
|
98
79
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative flex flex-col flex-1 p-6 gap-4", children: [
|
|
99
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start justify-between", children: [
|
|
80
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
|
|
100
81
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative", children: [
|
|
101
|
-
|
|
102
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: (0, import_cn.cn)("relative h-
|
|
82
|
+
live && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { "aria-hidden": true, className: (0, import_cn.cn)("absolute -inset-3 rounded-full blur-2xl opacity-30", hue.solid) }),
|
|
83
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: (0, import_cn.cn)("relative h-9 w-9 shrink-0", live ? hue.text : "text-muted-foreground/50") })
|
|
103
84
|
] }),
|
|
104
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
105
|
-
"
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
"text-[10px] font-semibold tracking-widest uppercase rounded-full px-2.5 py-1 flex items-center gap-1.5",
|
|
109
|
-
live ? "text-emerald-500 bg-emerald-500/10" : building ? "text-amber-500 bg-amber-500/10" : "text-muted-foreground/40 bg-muted/30"
|
|
110
|
-
),
|
|
111
|
-
children: [
|
|
112
|
-
live && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse" }),
|
|
113
|
-
!active && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Lock, { className: "h-2.5 w-2.5" }),
|
|
114
|
-
badge
|
|
115
|
-
]
|
|
116
|
-
}
|
|
117
|
-
)
|
|
118
|
-
] }),
|
|
119
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1", children: [
|
|
120
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: (0, import_cn.cn)("text-2xl font-bold leading-snug tracking-tight", !active && "text-foreground/60"), children: def.title }),
|
|
121
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: (0, import_cn.cn)("text-[13px] leading-relaxed", active ? "text-muted-foreground" : "text-muted-foreground/50"), children: subtitle })
|
|
85
|
+
!live && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1 text-[11px] font-medium text-muted-foreground/60 pt-1", children: [
|
|
86
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Lock, { className: "h-3 w-3" }),
|
|
87
|
+
"Coming soon"
|
|
88
|
+
] })
|
|
122
89
|
] }),
|
|
123
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-
|
|
124
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("
|
|
125
|
-
|
|
90
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
|
|
91
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-2xl font-bold tracking-tight leading-snug", children: title }),
|
|
92
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: (0, import_cn.cn)("text-[15px] leading-relaxed max-w-[34ch]", live ? "text-muted-foreground" : "text-muted-foreground/60"), children: blurb })
|
|
126
93
|
] }),
|
|
127
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
className: (0, import_cn.cn)(
|
|
131
|
-
"text-[11px] px-2.5 py-1 rounded-full border font-medium",
|
|
132
|
-
active ? colors.chip : "bg-muted/10 border-border/15 text-muted-foreground/45"
|
|
133
|
-
),
|
|
134
|
-
children: f
|
|
135
|
-
},
|
|
136
|
-
f
|
|
137
|
-
)) }),
|
|
138
|
-
live && href ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2 mt-auto pt-2", children: [
|
|
139
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
140
|
-
import_link.default,
|
|
141
|
-
{
|
|
142
|
-
href,
|
|
143
|
-
className: (0, import_cn.cn)(
|
|
144
|
-
"flex items-center justify-between w-full h-10 px-4 rounded-xl",
|
|
145
|
-
"text-sm font-semibold text-white",
|
|
146
|
-
"transition-all hover:brightness-110 active:scale-[0.98]",
|
|
147
|
-
colors.button
|
|
148
|
-
),
|
|
149
|
-
children: [
|
|
150
|
-
buttonLabel ?? "Get started",
|
|
151
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-3.5 w-3.5" })
|
|
152
|
-
]
|
|
153
|
-
}
|
|
154
|
-
),
|
|
155
|
-
browseHref && browseLinkLabel && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
94
|
+
live && href && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, "aria-label": title, className: "absolute inset-0 z-10" }),
|
|
95
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-auto pt-1 flex items-end justify-between", children: [
|
|
96
|
+
live && browseHref && browseLinkLabel ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
156
97
|
import_link.default,
|
|
157
98
|
{
|
|
158
99
|
href: browseHref,
|
|
159
|
-
className: "flex items-center
|
|
100
|
+
className: "relative z-20 inline-flex items-center gap-1 text-xs font-medium text-muted-foreground active:text-foreground",
|
|
160
101
|
children: [
|
|
161
102
|
browseLinkLabel,
|
|
162
103
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-3 w-3" })
|
|
163
104
|
]
|
|
164
105
|
}
|
|
165
|
-
)
|
|
166
|
-
|
|
167
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Lock, { className: "h-3.5 w-3.5" }),
|
|
168
|
-
building ? "In development" : "Coming soon"
|
|
106
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {}),
|
|
107
|
+
live && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: (0, import_cn.cn)("h-11 w-11 shrink-0 rounded-full flex items-center justify-center shadow-lg shadow-black/20", hue.solid), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowUpRight, { className: "h-5 w-5 text-white" }) })
|
|
169
108
|
] })
|
|
170
109
|
] })
|
|
171
110
|
]
|
|
172
111
|
}
|
|
173
112
|
);
|
|
174
|
-
return live ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("p-[1px] rounded-2xl bg-gradient-to-br
|
|
113
|
+
return live ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("p-[1px] rounded-2xl bg-gradient-to-br flex flex-col", hue.ring), children: card }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "rounded-2xl border border-border/30 flex flex-col", children: card });
|
|
175
114
|
}
|
|
176
115
|
function GroupHeader({ group }) {
|
|
177
116
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1", children: [
|
|
178
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
179
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-xl font-bold tracking-tight", children: group.title }),
|
|
180
|
-
group.badge ? /* @__PURE__ */ (0, import_jsx_runtime.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
|
|
181
|
-
] }),
|
|
117
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-xl font-bold tracking-tight", children: group.title }),
|
|
182
118
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: group.tagline })
|
|
183
119
|
] });
|
|
184
120
|
}
|
|
185
121
|
function ComingSoonStrip({ group, defs }) {
|
|
186
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-2xl border border-border/
|
|
187
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "
|
|
188
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground mt-
|
|
189
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap gap-2 mt-4", children: defs.map(({ key, icon: Icon, title
|
|
122
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-2xl border border-border/40 p-5", children: [
|
|
123
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-semibold text-sm", children: group.title }),
|
|
124
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground mt-0.5", children: group.tagline }),
|
|
125
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap gap-2 mt-4", children: defs.map(({ key, icon: Icon, title }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 px-3 py-2 rounded-full bg-muted/30 border border-border/25", children: [
|
|
190
126
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: "h-3.5 w-3.5 text-muted-foreground/60" }),
|
|
191
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-
|
|
192
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "hidden sm:inline text-xs text-muted-foreground/50", children: [
|
|
193
|
-
"\u2014 ",
|
|
194
|
-
subtitle
|
|
195
|
-
] })
|
|
127
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-medium text-muted-foreground", children: title })
|
|
196
128
|
] }, key)) })
|
|
197
129
|
] });
|
|
198
130
|
}
|
|
@@ -212,7 +144,7 @@ function LaunchpadGroupedSections({ overrides, className }) {
|
|
|
212
144
|
className: "space-y-4",
|
|
213
145
|
children: [
|
|
214
146
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(GroupHeader, { group }),
|
|
215
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-
|
|
147
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: defs.map((def) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LaunchpadServiceCard, { def, override: overrides[def.key] }, def.key)) })
|
|
216
148
|
]
|
|
217
149
|
},
|
|
218
150
|
group.key
|
|
@@ -223,6 +155,6 @@ function LaunchpadGroupedSections({ overrides, className }) {
|
|
|
223
155
|
0 && (module.exports = {
|
|
224
156
|
LaunchpadGroupedSections,
|
|
225
157
|
LaunchpadServiceCard,
|
|
226
|
-
|
|
158
|
+
SERVICE_HUES
|
|
227
159
|
});
|
|
228
160
|
//# sourceMappingURL=launchpad-services.cjs.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":["Link"]}
|
|
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":["Link"]}
|
|
@@ -3,34 +3,32 @@ import { ServiceStatus, ServiceDefinition } from '../data/launchpad-services.cjs
|
|
|
3
3
|
import 'lucide-react';
|
|
4
4
|
|
|
5
5
|
interface ServiceOverride {
|
|
6
|
-
/** Primary
|
|
6
|
+
/** Primary destination — the whole card links here (required for live services) */
|
|
7
7
|
href?: string;
|
|
8
|
-
buttonLabel?: string;
|
|
9
8
|
/** Secondary browse link href (pairs with the def's browseLinkLabel) */
|
|
10
9
|
browseHref?: string;
|
|
11
10
|
/** Per-app rollout flips (e.g. coins live on one app first) */
|
|
12
11
|
status?: ServiceStatus;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
features?: string[];
|
|
16
|
-
description?: string;
|
|
17
|
-
subtitle?: string;
|
|
12
|
+
/** Per-app one-liner override (rarely needed) */
|
|
13
|
+
blurb?: string;
|
|
18
14
|
}
|
|
19
15
|
type ServiceOverrides = Record<string, ServiceOverride>;
|
|
20
|
-
interface
|
|
21
|
-
icon
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
interface ServiceHue {
|
|
17
|
+
/** icon + link tint (600 for light surfaces, 400 for dark) */
|
|
18
|
+
text: string;
|
|
19
|
+
/** solid fill — the arrow action + icon glow */
|
|
20
|
+
solid: string;
|
|
21
|
+
/** gradient ring around live cards */
|
|
22
|
+
ring: string;
|
|
25
23
|
}
|
|
26
|
-
declare const
|
|
24
|
+
declare const SERVICE_HUES: Record<string, ServiceHue>;
|
|
27
25
|
interface LaunchpadServiceCardProps {
|
|
28
26
|
def: ServiceDefinition;
|
|
29
27
|
override?: ServiceOverride;
|
|
30
28
|
}
|
|
31
29
|
declare function LaunchpadServiceCard({ def, override }: LaunchpadServiceCardProps): react_jsx_runtime.JSX.Element;
|
|
32
30
|
interface LaunchpadGroupedSectionsProps {
|
|
33
|
-
/** Per-app hrefs /
|
|
31
|
+
/** Per-app hrefs / rollout flips, keyed by service key. */
|
|
34
32
|
overrides: ServiceOverrides;
|
|
35
33
|
className?: string;
|
|
36
34
|
}
|
|
@@ -38,4 +36,4 @@ interface LaunchpadGroupedSectionsProps {
|
|
|
38
36
|
* LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */
|
|
39
37
|
declare function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps): react_jsx_runtime.JSX.Element;
|
|
40
38
|
|
|
41
|
-
export { LaunchpadGroupedSections, type LaunchpadGroupedSectionsProps, LaunchpadServiceCard, type LaunchpadServiceCardProps,
|
|
39
|
+
export { LaunchpadGroupedSections, type LaunchpadGroupedSectionsProps, LaunchpadServiceCard, type LaunchpadServiceCardProps, SERVICE_HUES, type ServiceOverride, type ServiceOverrides };
|
|
@@ -3,34 +3,32 @@ import { ServiceStatus, ServiceDefinition } from '../data/launchpad-services.js'
|
|
|
3
3
|
import 'lucide-react';
|
|
4
4
|
|
|
5
5
|
interface ServiceOverride {
|
|
6
|
-
/** Primary
|
|
6
|
+
/** Primary destination — the whole card links here (required for live services) */
|
|
7
7
|
href?: string;
|
|
8
|
-
buttonLabel?: string;
|
|
9
8
|
/** Secondary browse link href (pairs with the def's browseLinkLabel) */
|
|
10
9
|
browseHref?: string;
|
|
11
10
|
/** Per-app rollout flips (e.g. coins live on one app first) */
|
|
12
11
|
status?: ServiceStatus;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
features?: string[];
|
|
16
|
-
description?: string;
|
|
17
|
-
subtitle?: string;
|
|
12
|
+
/** Per-app one-liner override (rarely needed) */
|
|
13
|
+
blurb?: string;
|
|
18
14
|
}
|
|
19
15
|
type ServiceOverrides = Record<string, ServiceOverride>;
|
|
20
|
-
interface
|
|
21
|
-
icon
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
interface ServiceHue {
|
|
17
|
+
/** icon + link tint (600 for light surfaces, 400 for dark) */
|
|
18
|
+
text: string;
|
|
19
|
+
/** solid fill — the arrow action + icon glow */
|
|
20
|
+
solid: string;
|
|
21
|
+
/** gradient ring around live cards */
|
|
22
|
+
ring: string;
|
|
25
23
|
}
|
|
26
|
-
declare const
|
|
24
|
+
declare const SERVICE_HUES: Record<string, ServiceHue>;
|
|
27
25
|
interface LaunchpadServiceCardProps {
|
|
28
26
|
def: ServiceDefinition;
|
|
29
27
|
override?: ServiceOverride;
|
|
30
28
|
}
|
|
31
29
|
declare function LaunchpadServiceCard({ def, override }: LaunchpadServiceCardProps): react_jsx_runtime.JSX.Element;
|
|
32
30
|
interface LaunchpadGroupedSectionsProps {
|
|
33
|
-
/** Per-app hrefs /
|
|
31
|
+
/** Per-app hrefs / rollout flips, keyed by service key. */
|
|
34
32
|
overrides: ServiceOverrides;
|
|
35
33
|
className?: string;
|
|
36
34
|
}
|
|
@@ -38,4 +36,4 @@ interface LaunchpadGroupedSectionsProps {
|
|
|
38
36
|
* LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */
|
|
39
37
|
declare function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps): react_jsx_runtime.JSX.Element;
|
|
40
38
|
|
|
41
|
-
export { LaunchpadGroupedSections, type LaunchpadGroupedSectionsProps, LaunchpadServiceCard, type LaunchpadServiceCardProps,
|
|
39
|
+
export { LaunchpadGroupedSections, type LaunchpadGroupedSectionsProps, LaunchpadServiceCard, type LaunchpadServiceCardProps, SERVICE_HUES, type ServiceOverride, type ServiceOverrides };
|