@medialane/ui 0.7.0 → 0.9.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.
@@ -29,163 +29,117 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
30
  var launchpad_services_exports = {};
31
31
  __export(launchpad_services_exports, {
32
- LaunchpadServicesGrid: () => LaunchpadServicesGrid
32
+ LaunchpadGroupedSections: () => LaunchpadGroupedSections,
33
+ LaunchpadServiceCard: () => LaunchpadServiceCard,
34
+ SERVICE_HUES: () => SERVICE_HUES
33
35
  });
34
36
  module.exports = __toCommonJS(launchpad_services_exports);
35
37
  var import_jsx_runtime = require("react/jsx-runtime");
36
38
  var import_link = __toESM(require("next/link"), 1);
39
+ var import_framer_motion = require("framer-motion");
37
40
  var import_lucide_react = require("lucide-react");
38
41
  var import_cn = require("../utils/cn.js");
39
- function ServiceCard({
40
- title,
41
- subtitle,
42
- description,
43
- features,
44
- icon: Icon,
45
- gradient,
46
- borderColor,
47
- iconColor,
48
- buttonColor,
49
- badge,
50
- status,
51
- href,
52
- buttonLabel,
53
- browseHref,
54
- browseLinkLabel
55
- }) {
42
+ var import_launchpad_services = require("../data/launchpad-services.js");
43
+ const DEFAULT_HUE = { text: "text-sky-600 dark:text-sky-400", bg: "bg-sky-500/10" };
44
+ const SERVICE_HUES = {
45
+ "mint-ip-asset": { text: "text-sky-600 dark:text-sky-400", bg: "bg-sky-500/10" },
46
+ "create-collection": { text: "text-violet-600 dark:text-violet-400", bg: "bg-violet-500/10" },
47
+ "ip-collection-1155": { text: "text-rose-600 dark:text-rose-400", bg: "bg-rose-500/10" },
48
+ "mint-editions": { text: "text-amber-600 dark:text-amber-400", bg: "bg-amber-500/10" },
49
+ "creator-coins": { text: "text-pink-600 dark:text-pink-400", bg: "bg-pink-500/10" },
50
+ "claim-memecoin": { text: "text-teal-600 dark:text-teal-400", bg: "bg-teal-500/10" },
51
+ "collection-drop": { text: "text-orange-600 dark:text-orange-400", bg: "bg-orange-500/10" },
52
+ "pop-protocol": { text: "text-emerald-600 dark:text-emerald-400", bg: "bg-emerald-500/10" },
53
+ "remix-asset": { text: "text-indigo-600 dark:text-indigo-400", bg: "bg-indigo-500/10" },
54
+ "claim-username": { text: "text-purple-600 dark:text-purple-400", bg: "bg-purple-500/10" },
55
+ "claim-collection": { text: "text-cyan-600 dark:text-cyan-400", bg: "bg-cyan-500/10" }
56
+ };
57
+ function LaunchpadServiceCard({ def, override = {} }) {
58
+ const { key, icon: Icon, title, browseLinkLabel } = def;
59
+ const status = override.status ?? def.status;
60
+ const blurb = override.blurb ?? def.blurb;
61
+ const { href, browseHref } = override;
56
62
  const live = status === "live";
57
- const building = status === "building";
58
- const active = live || building;
59
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
63
+ const hue = SERVICE_HUES[key] ?? DEFAULT_HUE;
64
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
60
65
  "div",
61
66
  {
62
67
  className: (0, import_cn.cn)(
63
- "group relative rounded-2xl border overflow-hidden transition-all duration-300 flex flex-col",
64
- `bg-gradient-to-br ${gradient}`,
65
- active ? borderColor : "border-border/20",
66
- live && "hover:-translate-y-[3px] hover:shadow-lg hover:shadow-black/5 dark:hover:shadow-black/20",
67
- !active && "opacity-60"
68
+ "relative rounded-2xl border border-border/60 bg-card p-5 sm:p-6",
69
+ "flex flex-col gap-3 transition-transform",
70
+ live ? "active:scale-[0.99]" : "opacity-60"
68
71
  ),
69
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col flex-1 p-7 gap-6", children: [
70
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start justify-between", children: [
71
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
72
- Icon,
73
- {
74
- className: (0, import_cn.cn)(
75
- "h-9 w-9 transition-transform duration-300",
76
- active ? iconColor : "text-muted-foreground/25",
77
- live && "group-hover:scale-110"
78
- )
79
- }
80
- ),
81
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
82
- "span",
83
- {
84
- className: (0, import_cn.cn)(
85
- "text-[10px] font-semibold tracking-widest uppercase rounded-full px-2.5 py-1 flex items-center gap-1.5",
86
- 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"
87
- ),
88
- children: [
89
- live && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse" }),
90
- !active && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Lock, { className: "h-2.5 w-2.5" }),
91
- badge
92
- ]
93
- }
94
- )
72
+ children: [
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: (0, import_cn.cn)("h-7 w-7 shrink-0", live ? hue.text : "text-muted-foreground/50") }),
75
+ live ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: (0, import_cn.cn)("h-9 w-9 shrink-0 rounded-full flex items-center justify-center", hue.bg), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowUpRight, { className: (0, import_cn.cn)("h-4 w-4", hue.text) }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex items-center gap-1 text-[11px] font-medium text-muted-foreground/60 pt-1", children: [
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Lock, { className: "h-3 w-3" }),
77
+ "Coming soon"
78
+ ] })
95
79
  ] }),
96
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1.5", children: [
97
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
98
- "p",
99
- {
100
- className: (0, import_cn.cn)(
101
- "text-xl sm:text-2xl font-bold leading-snug tracking-tight",
102
- !active && "text-foreground/40"
103
- ),
104
- children: title
105
- }
106
- ),
107
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
108
- "p",
109
- {
110
- className: (0, import_cn.cn)(
111
- "text-xs leading-relaxed",
112
- active ? "text-muted-foreground" : "text-muted-foreground/30"
113
- ),
114
- children: subtitle
115
- }
116
- )
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1", children: [
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-lg font-bold tracking-tight leading-snug", children: title }),
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: (0, import_cn.cn)("text-sm leading-relaxed", live ? "text-muted-foreground" : "text-muted-foreground/60"), children: blurb })
117
83
  ] }),
118
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
119
- "p",
84
+ live && href && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href, "aria-label": title, className: "absolute inset-0 z-10 rounded-2xl" }),
85
+ live && browseHref && browseLinkLabel && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
86
+ import_link.default,
120
87
  {
121
- className: (0, import_cn.cn)(
122
- "text-sm leading-relaxed flex-1",
123
- active ? "text-muted-foreground" : "text-muted-foreground/30"
124
- ),
125
- children: description
88
+ href: browseHref,
89
+ className: "relative z-20 mt-auto self-start inline-flex items-center gap-1 text-xs font-medium text-muted-foreground active:text-foreground",
90
+ children: [
91
+ browseLinkLabel,
92
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-3 w-3" })
93
+ ]
126
94
  }
127
- ),
128
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap gap-1.5", children: features.map((f) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
129
- "span",
130
- {
131
- className: (0, import_cn.cn)(
132
- "text-[11px] px-2.5 py-1 rounded-full border font-medium",
133
- active ? "bg-background/50 border-border/50 text-muted-foreground" : "bg-muted/10 border-border/15 text-muted-foreground/25"
134
- ),
135
- children: f
136
- },
137
- f
138
- )) }),
139
- live && href ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
140
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
141
- import_link.default,
142
- {
143
- href,
144
- className: (0, import_cn.cn)(
145
- "flex items-center justify-between w-full h-10 px-4 rounded-xl",
146
- "text-sm font-semibold text-white",
147
- "transition-all duration-200 active:scale-[0.98]",
148
- buttonColor
149
- ),
150
- children: [
151
- buttonLabel ?? "Get started",
152
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-3.5 w-3.5" })
153
- ]
154
- }
155
- ),
156
- browseHref && browseLinkLabel && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
157
- import_link.default,
158
- {
159
- href: browseHref,
160
- className: "flex items-center justify-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors py-1",
161
- children: [
162
- browseLinkLabel,
163
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-3 w-3" })
164
- ]
165
- }
166
- )
167
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 h-10 text-sm text-muted-foreground/30 font-medium", children: [
168
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Lock, { className: "h-3.5 w-3.5" }),
169
- building ? "In development" : "Coming soon"
170
- ] })
171
- ] })
95
+ )
96
+ ]
172
97
  }
173
98
  );
174
99
  }
175
- function LaunchpadServicesGrid({ services, className }) {
176
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
177
- "div",
178
- {
179
- className: (0, import_cn.cn)(
180
- "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
181
- className
182
- ),
183
- children: services.map(({ key, ...rest }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ServiceCard, { ...rest }, key))
100
+ function GroupHeader({ group }) {
101
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-1", children: [
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-xl font-bold tracking-tight", children: group.title }),
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: group.tagline })
104
+ ] });
105
+ }
106
+ function ComingSoonStrip({ group, defs }) {
107
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-2xl border border-border/40 p-5", children: [
108
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-semibold text-sm", children: group.title }),
109
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground mt-0.5", children: group.tagline }),
110
+ /* @__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: [
111
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: "h-3.5 w-3.5 text-muted-foreground/60" }),
112
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-medium text-muted-foreground", children: title })
113
+ ] }, key)) })
114
+ ] });
115
+ }
116
+ function LaunchpadGroupedSections({ overrides, className }) {
117
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("space-y-10", className), children: import_launchpad_services.LAUNCHPAD_SERVICE_GROUPS.map((group) => {
118
+ const defs = import_launchpad_services.LAUNCHPAD_SERVICE_DEFINITIONS.filter((d) => d.group === group.key);
119
+ if (defs.length === 0) return null;
120
+ if (group.key === "coming-soon") {
121
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ComingSoonStrip, { group, defs }, group.key);
184
122
  }
185
- );
123
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
124
+ import_framer_motion.motion.div,
125
+ {
126
+ initial: { opacity: 0, y: 8 },
127
+ animate: { opacity: 1, y: 0 },
128
+ transition: { duration: 0.3, ease: [0.25, 0.46, 0.45, 0.94] },
129
+ className: "space-y-4",
130
+ children: [
131
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GroupHeader, { group }),
132
+ /* @__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)) })
133
+ ]
134
+ },
135
+ group.key
136
+ );
137
+ }) });
186
138
  }
187
139
  // Annotate the CommonJS export names for ESM import in node:
188
140
  0 && (module.exports = {
189
- LaunchpadServicesGrid
141
+ LaunchpadGroupedSections,
142
+ LaunchpadServiceCard,
143
+ SERVICE_HUES
190
144
  });
191
145
  //# sourceMappingURL=launchpad-services.cjs.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":["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 + arrow tint (600 for light surfaces, 400 for dark) */\n text: string;\n /** soft circle behind the arrow */\n bg: string;\n}\n\nconst DEFAULT_HUE: ServiceHue = { text: \"text-sky-600 dark:text-sky-400\", bg: \"bg-sky-500/10\" };\n\nexport const SERVICE_HUES: Record<string, ServiceHue> = {\n \"mint-ip-asset\": { text: \"text-sky-600 dark:text-sky-400\", bg: \"bg-sky-500/10\" },\n \"create-collection\": { text: \"text-violet-600 dark:text-violet-400\", bg: \"bg-violet-500/10\" },\n \"ip-collection-1155\": { text: \"text-rose-600 dark:text-rose-400\", bg: \"bg-rose-500/10\" },\n \"mint-editions\": { text: \"text-amber-600 dark:text-amber-400\", bg: \"bg-amber-500/10\" },\n \"creator-coins\": { text: \"text-pink-600 dark:text-pink-400\", bg: \"bg-pink-500/10\" },\n \"claim-memecoin\": { text: \"text-teal-600 dark:text-teal-400\", bg: \"bg-teal-500/10\" },\n \"collection-drop\": { text: \"text-orange-600 dark:text-orange-400\", bg: \"bg-orange-500/10\" },\n \"pop-protocol\": { text: \"text-emerald-600 dark:text-emerald-400\", bg: \"bg-emerald-500/10\" },\n \"remix-asset\": { text: \"text-indigo-600 dark:text-indigo-400\", bg: \"bg-indigo-500/10\" },\n \"claim-username\": { text: \"text-purple-600 dark:text-purple-400\", bg: \"bg-purple-500/10\" },\n \"claim-collection\": { text: \"text-cyan-600 dark:text-cyan-400\", bg: \"bg-cyan-500/10\" },\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 return (\n <div\n className={cn(\n \"relative rounded-2xl border border-border/60 bg-card p-5 sm:p-6\",\n \"flex flex-col gap-3 transition-transform\",\n live ? \"active:scale-[0.99]\" : \"opacity-60\",\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <Icon className={cn(\"h-7 w-7 shrink-0\", live ? hue.text : \"text-muted-foreground/50\")} />\n {live ? (\n <span className={cn(\"h-9 w-9 shrink-0 rounded-full flex items-center justify-center\", hue.bg)}>\n <ArrowUpRight className={cn(\"h-4 w-4\", hue.text)} />\n </span>\n ) : (\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\">\n <h3 className=\"text-lg font-bold tracking-tight leading-snug\">{title}</h3>\n <p className={cn(\"text-sm leading-relaxed\", live ? \"text-muted-foreground\" : \"text-muted-foreground/60\")}>\n {blurb}\n </p>\n </div>\n\n {/* Stretched link — makes the whole card the action without nesting anchors */}\n {live && href && <Link href={href} aria-label={title} className=\"absolute inset-0 z-10 rounded-2xl\" />}\n\n {live && browseHref && browseLinkLabel && (\n <Link\n href={browseHref}\n className=\"relative z-20 mt-auto self-start 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 </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"]}
@@ -1,20 +1,37 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ServiceDefinition } from '../data/launchpad-services.cjs';
3
- export { ServiceCategory, ServiceStatus } from '../data/launchpad-services.cjs';
2
+ import { ServiceStatus, ServiceDefinition } from '../data/launchpad-services.cjs';
4
3
  import 'lucide-react';
5
4
 
6
- interface ServiceCardProps extends ServiceDefinition {
7
- /** Primary CTA href — required for live services */
5
+ interface ServiceOverride {
6
+ /** Primary destinationthe whole card links here (required for live services) */
8
7
  href?: string;
9
- /** Primary CTA button label */
10
- buttonLabel?: string;
11
- /** Secondary browse link href */
8
+ /** Secondary browse link href (pairs with the def's browseLinkLabel) */
12
9
  browseHref?: string;
10
+ /** Per-app rollout flips (e.g. coins live on one app first) */
11
+ status?: ServiceStatus;
12
+ /** Per-app one-liner override (rarely needed) */
13
+ blurb?: string;
13
14
  }
14
- interface LaunchpadServicesGridProps {
15
- services: ServiceCardProps[];
15
+ type ServiceOverrides = Record<string, ServiceOverride>;
16
+ interface ServiceHue {
17
+ /** icon + arrow tint (600 for light surfaces, 400 for dark) */
18
+ text: string;
19
+ /** soft circle behind the arrow */
20
+ bg: string;
21
+ }
22
+ declare const SERVICE_HUES: Record<string, ServiceHue>;
23
+ interface LaunchpadServiceCardProps {
24
+ def: ServiceDefinition;
25
+ override?: ServiceOverride;
26
+ }
27
+ declare function LaunchpadServiceCard({ def, override }: LaunchpadServiceCardProps): react_jsx_runtime.JSX.Element;
28
+ interface LaunchpadGroupedSectionsProps {
29
+ /** Per-app hrefs / rollout flips, keyed by service key. */
30
+ overrides: ServiceOverrides;
16
31
  className?: string;
17
32
  }
18
- declare function LaunchpadServicesGrid({ services, className }: LaunchpadServicesGridProps): react_jsx_runtime.JSX.Element;
33
+ /** The full grouped launchpad services block section order comes from
34
+ * LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */
35
+ declare function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps): react_jsx_runtime.JSX.Element;
19
36
 
20
- export { LaunchpadServicesGrid, type LaunchpadServicesGridProps, type ServiceCardProps, ServiceDefinition };
37
+ export { LaunchpadGroupedSections, type LaunchpadGroupedSectionsProps, LaunchpadServiceCard, type LaunchpadServiceCardProps, SERVICE_HUES, type ServiceOverride, type ServiceOverrides };
@@ -1,20 +1,37 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ServiceDefinition } from '../data/launchpad-services.js';
3
- export { ServiceCategory, ServiceStatus } from '../data/launchpad-services.js';
2
+ import { ServiceStatus, ServiceDefinition } from '../data/launchpad-services.js';
4
3
  import 'lucide-react';
5
4
 
6
- interface ServiceCardProps extends ServiceDefinition {
7
- /** Primary CTA href — required for live services */
5
+ interface ServiceOverride {
6
+ /** Primary destinationthe whole card links here (required for live services) */
8
7
  href?: string;
9
- /** Primary CTA button label */
10
- buttonLabel?: string;
11
- /** Secondary browse link href */
8
+ /** Secondary browse link href (pairs with the def's browseLinkLabel) */
12
9
  browseHref?: string;
10
+ /** Per-app rollout flips (e.g. coins live on one app first) */
11
+ status?: ServiceStatus;
12
+ /** Per-app one-liner override (rarely needed) */
13
+ blurb?: string;
13
14
  }
14
- interface LaunchpadServicesGridProps {
15
- services: ServiceCardProps[];
15
+ type ServiceOverrides = Record<string, ServiceOverride>;
16
+ interface ServiceHue {
17
+ /** icon + arrow tint (600 for light surfaces, 400 for dark) */
18
+ text: string;
19
+ /** soft circle behind the arrow */
20
+ bg: string;
21
+ }
22
+ declare const SERVICE_HUES: Record<string, ServiceHue>;
23
+ interface LaunchpadServiceCardProps {
24
+ def: ServiceDefinition;
25
+ override?: ServiceOverride;
26
+ }
27
+ declare function LaunchpadServiceCard({ def, override }: LaunchpadServiceCardProps): react_jsx_runtime.JSX.Element;
28
+ interface LaunchpadGroupedSectionsProps {
29
+ /** Per-app hrefs / rollout flips, keyed by service key. */
30
+ overrides: ServiceOverrides;
16
31
  className?: string;
17
32
  }
18
- declare function LaunchpadServicesGrid({ services, className }: LaunchpadServicesGridProps): react_jsx_runtime.JSX.Element;
33
+ /** The full grouped launchpad services block section order comes from
34
+ * LAUNCHPAD_SERVICE_GROUPS; cards from LAUNCHPAD_SERVICE_DEFINITIONS. */
35
+ declare function LaunchpadGroupedSections({ overrides, className }: LaunchpadGroupedSectionsProps): react_jsx_runtime.JSX.Element;
19
36
 
20
- export { LaunchpadServicesGrid, type LaunchpadServicesGridProps, type ServiceCardProps, ServiceDefinition };
37
+ export { LaunchpadGroupedSections, type LaunchpadGroupedSectionsProps, LaunchpadServiceCard, type LaunchpadServiceCardProps, SERVICE_HUES, type ServiceOverride, type ServiceOverrides };