@medialane/ui 0.3.3 → 0.4.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/discover-creators-strip.cjs +4 -2
- package/dist/components/discover-creators-strip.cjs.map +1 -1
- package/dist/components/discover-creators-strip.js +4 -2
- package/dist/components/discover-creators-strip.js.map +1 -1
- package/dist/components/launchpad-services.cjs +191 -0
- package/dist/components/launchpad-services.cjs.map +1 -0
- package/dist/components/launchpad-services.d.cts +20 -0
- package/dist/components/launchpad-services.d.ts +20 -0
- package/dist/components/launchpad-services.js +157 -0
- package/dist/components/launchpad-services.js.map +1 -0
- package/dist/data/launchpad-services.cjs +211 -0
- package/dist/data/launchpad-services.cjs.map +1 -0
- package/dist/data/launchpad-services.d.cts +24 -0
- package/dist/data/launchpad-services.d.ts +24 -0
- package/dist/data/launchpad-services.js +199 -0
- package/dist/data/launchpad-services.js.map +1 -0
- package/dist/index.cjs +6 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +12 -10
|
@@ -36,8 +36,10 @@ function CreatorChip({
|
|
|
36
36
|
}) {
|
|
37
37
|
const [avatarError, setAvatarError] = (0, import_react.useState)(false);
|
|
38
38
|
const [bannerError, setBannerError] = (0, import_react.useState)(false);
|
|
39
|
-
const
|
|
40
|
-
const
|
|
39
|
+
const bannerSrc = creator.bannerImage ?? creator.collectionImage ?? null;
|
|
40
|
+
const avatarSrc = creator.avatarImage ?? creator.collectionImage ?? null;
|
|
41
|
+
const bannerUrl = bannerSrc && !bannerError ? (0, import_ipfs.ipfsToHttp)(bannerSrc) : null;
|
|
42
|
+
const avatarUrl = avatarSrc && !avatarError ? (0, import_ipfs.ipfsToHttp)(avatarSrc) : null;
|
|
41
43
|
const displayName = creator.displayName || `@${creator.username}`;
|
|
42
44
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
43
45
|
"a",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/discover-creators-strip.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Users, ArrowRight, AtSign } from \"lucide-react\";\nimport { FadeIn } from \"./motion-primitives.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport type { ApiCreatorProfile } from \"@medialane/sdk\";\n\nexport interface DiscoverCreatorsStripProps {\n creators: ApiCreatorProfile[];\n isLoading: boolean;\n getHref: (creator: ApiCreatorProfile) => string;\n allCreatorsHref?: string;\n}\n\nfunction CreatorChipSkeleton() {\n return (\n <div className=\"shrink-0 w-64 aspect-[3/4] rounded-xl bg-muted animate-pulse\" />\n );\n}\n\nfunction CreatorChip({\n creator,\n href,\n}: {\n creator: ApiCreatorProfile;\n href: string;\n}) {\n const [avatarError, setAvatarError] = useState(false);\n const [bannerError, setBannerError] = useState(false);\n\n const
|
|
1
|
+
{"version":3,"sources":["../../src/components/discover-creators-strip.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Users, ArrowRight, AtSign } from \"lucide-react\";\nimport { FadeIn } from \"./motion-primitives.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport type { ApiCreatorProfile } from \"@medialane/sdk\";\n\nexport interface DiscoverCreatorsStripProps {\n creators: ApiCreatorProfile[];\n isLoading: boolean;\n getHref: (creator: ApiCreatorProfile) => string;\n allCreatorsHref?: string;\n}\n\nfunction CreatorChipSkeleton() {\n return (\n <div className=\"shrink-0 w-64 aspect-[3/4] rounded-xl bg-muted animate-pulse\" />\n );\n}\n\nfunction CreatorChip({\n creator,\n href,\n}: {\n creator: ApiCreatorProfile;\n href: string;\n}) {\n const [avatarError, setAvatarError] = useState(false);\n const [bannerError, setBannerError] = useState(false);\n\n const bannerSrc = creator.bannerImage ?? creator.collectionImage ?? null;\n const avatarSrc = creator.avatarImage ?? creator.collectionImage ?? null;\n\n const bannerUrl = bannerSrc && !bannerError ? ipfsToHttp(bannerSrc) : null;\n const avatarUrl = avatarSrc && !avatarError ? ipfsToHttp(avatarSrc) : null;\n\n const displayName = creator.displayName || `@${creator.username}`;\n\n return (\n <a\n href={href}\n className=\"block shrink-0 w-64 snap-start active:scale-[0.97] transition-transform duration-150 select-none\"\n >\n <div className=\"relative aspect-[3/4] rounded-xl overflow-hidden bg-muted\">\n {bannerUrl && (\n <img\n src={bannerUrl}\n alt=\"\"\n aria-hidden\n loading=\"lazy\"\n className=\"absolute inset-0 w-full h-full object-cover\"\n onError={() => setBannerError(true)}\n />\n )}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/80 via-black/10 to-transparent\" />\n <div className=\"absolute bottom-0 inset-x-0 p-2.5 space-y-1.5\">\n <div className=\"h-8 w-8 rounded-full ring-2 ring-white/20 overflow-hidden bg-muted flex items-center justify-center\">\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={displayName ?? \"\"}\n loading=\"lazy\"\n className=\"h-full w-full object-cover\"\n onError={() => setAvatarError(true)}\n />\n ) : (\n <span className=\"text-xs font-black text-white/60\">\n {(displayName ?? \"?\").charAt(0).toUpperCase()}\n </span>\n )}\n </div>\n <div>\n <p className=\"font-bold text-white text-xs truncate\">{displayName}</p>\n <p className=\"text-[10px] text-white/55 flex items-center gap-0.5\">\n <AtSign className=\"h-2 w-2 shrink-0\" />\n <span className=\"truncate\">{creator.username}</span>\n </p>\n </div>\n </div>\n </div>\n </a>\n );\n}\n\nexport function DiscoverCreatorsStrip({\n creators,\n isLoading,\n getHref,\n allCreatorsHref = \"/creators\",\n}: DiscoverCreatorsStripProps) {\n if (!isLoading && creators.length === 0) return null;\n\n return (\n <FadeIn>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"section-label\">Creator network</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <Users className=\"h-4 w-4 text-brand-purple\" />\n <h2 className=\"text-lg font-bold\">Creators</h2>\n </div>\n </div>\n <a\n href={allCreatorsHref}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors\"\n >\n View all <ArrowRight className=\"h-3.5 w-3.5\" />\n </a>\n </div>\n <div className=\"overflow-x-auto scrollbar-hide snap-x snap-mandatory -mx-4 px-4 md:mx-0 md:px-0\">\n <div className=\"flex gap-3 w-max pb-1\">\n {isLoading\n ? Array.from({ length: 6 }).map((_, i) => <CreatorChipSkeleton key={i} />)\n : creators.map((c) => (\n <CreatorChip key={c.walletAddress} creator={c} href={getHref(c)} />\n ))}\n </div>\n </div>\n </div>\n </FadeIn>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBI;AAfJ,mBAAyB;AACzB,0BAA0C;AAC1C,+BAAuB;AACvB,kBAA2B;AAU3B,SAAS,sBAAsB;AAC7B,SACE,4CAAC,SAAI,WAAU,gEAA+D;AAElF;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,KAAK;AACpD,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,KAAK;AAEpD,QAAM,YAAY,QAAQ,eAAe,QAAQ,mBAAmB;AACpE,QAAM,YAAY,QAAQ,eAAe,QAAQ,mBAAmB;AAEpE,QAAM,YAAY,aAAa,CAAC,kBAAc,wBAAW,SAAS,IAAI;AACtE,QAAM,YAAY,aAAa,CAAC,kBAAc,wBAAW,SAAS,IAAI;AAEtE,QAAM,cAAc,QAAQ,eAAe,IAAI,QAAQ,QAAQ;AAE/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MAEV,uDAAC,SAAI,WAAU,6DACZ;AAAA,qBACC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,eAAW;AAAA,YACX,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,SAAS,MAAM,eAAe,IAAI;AAAA;AAAA,QACpC;AAAA,QAEF,4CAAC,SAAI,WAAU,+EAA8E;AAAA,QAC7F,6CAAC,SAAI,WAAU,iDACb;AAAA,sDAAC,SAAI,WAAU,uGACZ,sBACC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK,eAAe;AAAA,cACpB,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS,MAAM,eAAe,IAAI;AAAA;AAAA,UACpC,IAEA,4CAAC,UAAK,WAAU,oCACZ,0BAAe,KAAK,OAAO,CAAC,EAAE,YAAY,GAC9C,GAEJ;AAAA,UACA,6CAAC,SACC;AAAA,wDAAC,OAAE,WAAU,yCAAyC,uBAAY;AAAA,YAClE,6CAAC,OAAE,WAAU,uDACX;AAAA,0DAAC,8BAAO,WAAU,oBAAmB;AAAA,cACrC,4CAAC,UAAK,WAAU,YAAY,kBAAQ,UAAS;AAAA,eAC/C;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAA+B;AAC7B,MAAI,CAAC,aAAa,SAAS,WAAW,EAAG,QAAO;AAEhD,SACE,4CAAC,mCACC,uDAAC,SAAI,WAAU,aACb;AAAA,iDAAC,SAAI,WAAU,qCACb;AAAA,mDAAC,SACC;AAAA,oDAAC,OAAE,WAAU,iBAAgB,6BAAe;AAAA,QAC5C,6CAAC,SAAI,WAAU,kCACb;AAAA,sDAAC,6BAAM,WAAU,6BAA4B;AAAA,UAC7C,4CAAC,QAAG,WAAU,qBAAoB,sBAAQ;AAAA,WAC5C;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,YACU,4CAAC,kCAAW,WAAU,eAAc;AAAA;AAAA;AAAA,MAC/C;AAAA,OACF;AAAA,IACA,4CAAC,SAAI,WAAU,mFACb,sDAAC,SAAI,WAAU,yBACZ,sBACG,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,4CAAC,yBAAyB,CAAG,CAAE,IACvE,SAAS,IAAI,CAAC,MACZ,4CAAC,eAAkC,SAAS,GAAG,MAAM,QAAQ,CAAC,KAA5C,EAAE,aAA6C,CAClE,GACP,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -13,8 +13,10 @@ function CreatorChip({
|
|
|
13
13
|
}) {
|
|
14
14
|
const [avatarError, setAvatarError] = useState(false);
|
|
15
15
|
const [bannerError, setBannerError] = useState(false);
|
|
16
|
-
const
|
|
17
|
-
const
|
|
16
|
+
const bannerSrc = creator.bannerImage ?? creator.collectionImage ?? null;
|
|
17
|
+
const avatarSrc = creator.avatarImage ?? creator.collectionImage ?? null;
|
|
18
|
+
const bannerUrl = bannerSrc && !bannerError ? ipfsToHttp(bannerSrc) : null;
|
|
19
|
+
const avatarUrl = avatarSrc && !avatarError ? ipfsToHttp(avatarSrc) : null;
|
|
18
20
|
const displayName = creator.displayName || `@${creator.username}`;
|
|
19
21
|
return /* @__PURE__ */ jsx(
|
|
20
22
|
"a",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/discover-creators-strip.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Users, ArrowRight, AtSign } from \"lucide-react\";\nimport { FadeIn } from \"./motion-primitives.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport type { ApiCreatorProfile } from \"@medialane/sdk\";\n\nexport interface DiscoverCreatorsStripProps {\n creators: ApiCreatorProfile[];\n isLoading: boolean;\n getHref: (creator: ApiCreatorProfile) => string;\n allCreatorsHref?: string;\n}\n\nfunction CreatorChipSkeleton() {\n return (\n <div className=\"shrink-0 w-64 aspect-[3/4] rounded-xl bg-muted animate-pulse\" />\n );\n}\n\nfunction CreatorChip({\n creator,\n href,\n}: {\n creator: ApiCreatorProfile;\n href: string;\n}) {\n const [avatarError, setAvatarError] = useState(false);\n const [bannerError, setBannerError] = useState(false);\n\n const
|
|
1
|
+
{"version":3,"sources":["../../src/components/discover-creators-strip.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Users, ArrowRight, AtSign } from \"lucide-react\";\nimport { FadeIn } from \"./motion-primitives.js\";\nimport { ipfsToHttp } from \"../utils/ipfs.js\";\nimport type { ApiCreatorProfile } from \"@medialane/sdk\";\n\nexport interface DiscoverCreatorsStripProps {\n creators: ApiCreatorProfile[];\n isLoading: boolean;\n getHref: (creator: ApiCreatorProfile) => string;\n allCreatorsHref?: string;\n}\n\nfunction CreatorChipSkeleton() {\n return (\n <div className=\"shrink-0 w-64 aspect-[3/4] rounded-xl bg-muted animate-pulse\" />\n );\n}\n\nfunction CreatorChip({\n creator,\n href,\n}: {\n creator: ApiCreatorProfile;\n href: string;\n}) {\n const [avatarError, setAvatarError] = useState(false);\n const [bannerError, setBannerError] = useState(false);\n\n const bannerSrc = creator.bannerImage ?? creator.collectionImage ?? null;\n const avatarSrc = creator.avatarImage ?? creator.collectionImage ?? null;\n\n const bannerUrl = bannerSrc && !bannerError ? ipfsToHttp(bannerSrc) : null;\n const avatarUrl = avatarSrc && !avatarError ? ipfsToHttp(avatarSrc) : null;\n\n const displayName = creator.displayName || `@${creator.username}`;\n\n return (\n <a\n href={href}\n className=\"block shrink-0 w-64 snap-start active:scale-[0.97] transition-transform duration-150 select-none\"\n >\n <div className=\"relative aspect-[3/4] rounded-xl overflow-hidden bg-muted\">\n {bannerUrl && (\n <img\n src={bannerUrl}\n alt=\"\"\n aria-hidden\n loading=\"lazy\"\n className=\"absolute inset-0 w-full h-full object-cover\"\n onError={() => setBannerError(true)}\n />\n )}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/80 via-black/10 to-transparent\" />\n <div className=\"absolute bottom-0 inset-x-0 p-2.5 space-y-1.5\">\n <div className=\"h-8 w-8 rounded-full ring-2 ring-white/20 overflow-hidden bg-muted flex items-center justify-center\">\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={displayName ?? \"\"}\n loading=\"lazy\"\n className=\"h-full w-full object-cover\"\n onError={() => setAvatarError(true)}\n />\n ) : (\n <span className=\"text-xs font-black text-white/60\">\n {(displayName ?? \"?\").charAt(0).toUpperCase()}\n </span>\n )}\n </div>\n <div>\n <p className=\"font-bold text-white text-xs truncate\">{displayName}</p>\n <p className=\"text-[10px] text-white/55 flex items-center gap-0.5\">\n <AtSign className=\"h-2 w-2 shrink-0\" />\n <span className=\"truncate\">{creator.username}</span>\n </p>\n </div>\n </div>\n </div>\n </a>\n );\n}\n\nexport function DiscoverCreatorsStrip({\n creators,\n isLoading,\n getHref,\n allCreatorsHref = \"/creators\",\n}: DiscoverCreatorsStripProps) {\n if (!isLoading && creators.length === 0) return null;\n\n return (\n <FadeIn>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"section-label\">Creator network</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <Users className=\"h-4 w-4 text-brand-purple\" />\n <h2 className=\"text-lg font-bold\">Creators</h2>\n </div>\n </div>\n <a\n href={allCreatorsHref}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors\"\n >\n View all <ArrowRight className=\"h-3.5 w-3.5\" />\n </a>\n </div>\n <div className=\"overflow-x-auto scrollbar-hide snap-x snap-mandatory -mx-4 px-4 md:mx-0 md:px-0\">\n <div className=\"flex gap-3 w-max pb-1\">\n {isLoading\n ? Array.from({ length: 6 }).map((_, i) => <CreatorChipSkeleton key={i} />)\n : creators.map((c) => (\n <CreatorChip key={c.walletAddress} creator={c} href={getHref(c)} />\n ))}\n </div>\n </div>\n </div>\n </FadeIn>\n );\n}\n"],"mappings":";AAiBI,cAyDQ,YAzDR;AAfJ,SAAS,gBAAgB;AACzB,SAAS,OAAO,YAAY,cAAc;AAC1C,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAU3B,SAAS,sBAAsB;AAC7B,SACE,oBAAC,SAAI,WAAU,gEAA+D;AAElF;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,QAAM,YAAY,QAAQ,eAAe,QAAQ,mBAAmB;AACpE,QAAM,YAAY,QAAQ,eAAe,QAAQ,mBAAmB;AAEpE,QAAM,YAAY,aAAa,CAAC,cAAc,WAAW,SAAS,IAAI;AACtE,QAAM,YAAY,aAAa,CAAC,cAAc,WAAW,SAAS,IAAI;AAEtE,QAAM,cAAc,QAAQ,eAAe,IAAI,QAAQ,QAAQ;AAE/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MAEV,+BAAC,SAAI,WAAU,6DACZ;AAAA,qBACC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,eAAW;AAAA,YACX,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,SAAS,MAAM,eAAe,IAAI;AAAA;AAAA,QACpC;AAAA,QAEF,oBAAC,SAAI,WAAU,+EAA8E;AAAA,QAC7F,qBAAC,SAAI,WAAU,iDACb;AAAA,8BAAC,SAAI,WAAU,uGACZ,sBACC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK,eAAe;AAAA,cACpB,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS,MAAM,eAAe,IAAI;AAAA;AAAA,UACpC,IAEA,oBAAC,UAAK,WAAU,oCACZ,0BAAe,KAAK,OAAO,CAAC,EAAE,YAAY,GAC9C,GAEJ;AAAA,UACA,qBAAC,SACC;AAAA,gCAAC,OAAE,WAAU,yCAAyC,uBAAY;AAAA,YAClE,qBAAC,OAAE,WAAU,uDACX;AAAA,kCAAC,UAAO,WAAU,oBAAmB;AAAA,cACrC,oBAAC,UAAK,WAAU,YAAY,kBAAQ,UAAS;AAAA,eAC/C;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAA+B;AAC7B,MAAI,CAAC,aAAa,SAAS,WAAW,EAAG,QAAO;AAEhD,SACE,oBAAC,UACC,+BAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SAAI,WAAU,qCACb;AAAA,2BAAC,SACC;AAAA,4BAAC,OAAE,WAAU,iBAAgB,6BAAe;AAAA,QAC5C,qBAAC,SAAI,WAAU,kCACb;AAAA,8BAAC,SAAM,WAAU,6BAA4B;AAAA,UAC7C,oBAAC,QAAG,WAAU,qBAAoB,sBAAQ;AAAA,WAC5C;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,YACU,oBAAC,cAAW,WAAU,eAAc;AAAA;AAAA;AAAA,MAC/C;AAAA,OACF;AAAA,IACA,oBAAC,SAAI,WAAU,mFACb,8BAAC,SAAI,WAAU,yBACZ,sBACG,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,oBAAC,yBAAyB,CAAG,CAAE,IACvE,SAAS,IAAI,CAAC,MACZ,oBAAC,eAAkC,SAAS,GAAG,MAAM,QAAQ,CAAC,KAA5C,EAAE,aAA6C,CAClE,GACP,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var launchpad_services_exports = {};
|
|
31
|
+
__export(launchpad_services_exports, {
|
|
32
|
+
LaunchpadServicesGrid: () => LaunchpadServicesGrid
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(launchpad_services_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var import_link = __toESM(require("next/link"), 1);
|
|
37
|
+
var import_lucide_react = require("lucide-react");
|
|
38
|
+
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
|
+
}) {
|
|
56
|
+
const live = status === "live";
|
|
57
|
+
const building = status === "building";
|
|
58
|
+
const active = live || building;
|
|
59
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
|
+
"div",
|
|
61
|
+
{
|
|
62
|
+
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
|
+
),
|
|
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
|
+
)
|
|
95
|
+
] }),
|
|
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
|
+
)
|
|
117
|
+
] }),
|
|
118
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
119
|
+
"p",
|
|
120
|
+
{
|
|
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
|
|
126
|
+
}
|
|
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
|
+
] })
|
|
172
|
+
}
|
|
173
|
+
);
|
|
174
|
+
}
|
|
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))
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
188
|
+
0 && (module.exports = {
|
|
189
|
+
LaunchpadServicesGrid
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=launchpad-services.cjs.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
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';
|
|
4
|
+
import 'lucide-react';
|
|
5
|
+
|
|
6
|
+
interface ServiceCardProps extends ServiceDefinition {
|
|
7
|
+
/** Primary CTA href — required for live services */
|
|
8
|
+
href?: string;
|
|
9
|
+
/** Primary CTA button label */
|
|
10
|
+
buttonLabel?: string;
|
|
11
|
+
/** Secondary browse link href */
|
|
12
|
+
browseHref?: string;
|
|
13
|
+
}
|
|
14
|
+
interface LaunchpadServicesGridProps {
|
|
15
|
+
services: ServiceCardProps[];
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
declare function LaunchpadServicesGrid({ services, className }: LaunchpadServicesGridProps): react_jsx_runtime.JSX.Element;
|
|
19
|
+
|
|
20
|
+
export { LaunchpadServicesGrid, type LaunchpadServicesGridProps, type ServiceCardProps, ServiceDefinition };
|
|
@@ -0,0 +1,20 @@
|
|
|
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';
|
|
4
|
+
import 'lucide-react';
|
|
5
|
+
|
|
6
|
+
interface ServiceCardProps extends ServiceDefinition {
|
|
7
|
+
/** Primary CTA href — required for live services */
|
|
8
|
+
href?: string;
|
|
9
|
+
/** Primary CTA button label */
|
|
10
|
+
buttonLabel?: string;
|
|
11
|
+
/** Secondary browse link href */
|
|
12
|
+
browseHref?: string;
|
|
13
|
+
}
|
|
14
|
+
interface LaunchpadServicesGridProps {
|
|
15
|
+
services: ServiceCardProps[];
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
declare function LaunchpadServicesGrid({ services, className }: LaunchpadServicesGridProps): react_jsx_runtime.JSX.Element;
|
|
19
|
+
|
|
20
|
+
export { LaunchpadServicesGrid, type LaunchpadServicesGridProps, type ServiceCardProps, ServiceDefinition };
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import { Lock, ArrowRight } from "lucide-react";
|
|
5
|
+
import { cn } from "../utils/cn.js";
|
|
6
|
+
function ServiceCard({
|
|
7
|
+
title,
|
|
8
|
+
subtitle,
|
|
9
|
+
description,
|
|
10
|
+
features,
|
|
11
|
+
icon: Icon,
|
|
12
|
+
gradient,
|
|
13
|
+
borderColor,
|
|
14
|
+
iconColor,
|
|
15
|
+
buttonColor,
|
|
16
|
+
badge,
|
|
17
|
+
status,
|
|
18
|
+
href,
|
|
19
|
+
buttonLabel,
|
|
20
|
+
browseHref,
|
|
21
|
+
browseLinkLabel
|
|
22
|
+
}) {
|
|
23
|
+
const live = status === "live";
|
|
24
|
+
const building = status === "building";
|
|
25
|
+
const active = live || building;
|
|
26
|
+
return /* @__PURE__ */ jsx(
|
|
27
|
+
"div",
|
|
28
|
+
{
|
|
29
|
+
className: cn(
|
|
30
|
+
"group relative rounded-2xl border overflow-hidden transition-all duration-300 flex flex-col",
|
|
31
|
+
`bg-gradient-to-br ${gradient}`,
|
|
32
|
+
active ? borderColor : "border-border/20",
|
|
33
|
+
live && "hover:-translate-y-[3px] hover:shadow-lg hover:shadow-black/5 dark:hover:shadow-black/20",
|
|
34
|
+
!active && "opacity-60"
|
|
35
|
+
),
|
|
36
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col flex-1 p-7 gap-6", 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
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsx(
|
|
86
|
+
"p",
|
|
87
|
+
{
|
|
88
|
+
className: cn(
|
|
89
|
+
"text-sm leading-relaxed flex-1",
|
|
90
|
+
active ? "text-muted-foreground" : "text-muted-foreground/30"
|
|
91
|
+
),
|
|
92
|
+
children: description
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: features.map((f) => /* @__PURE__ */ jsx(
|
|
96
|
+
"span",
|
|
97
|
+
{
|
|
98
|
+
className: cn(
|
|
99
|
+
"text-[11px] px-2.5 py-1 rounded-full border font-medium",
|
|
100
|
+
active ? "bg-background/50 border-border/50 text-muted-foreground" : "bg-muted/10 border-border/15 text-muted-foreground/25"
|
|
101
|
+
),
|
|
102
|
+
children: f
|
|
103
|
+
},
|
|
104
|
+
f
|
|
105
|
+
)) }),
|
|
106
|
+
live && href ? /* @__PURE__ */ jsxs("div", { className: "space-y-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 duration-200 active:scale-[0.98]",
|
|
115
|
+
buttonColor
|
|
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 text-sm text-muted-foreground/30 font-medium", children: [
|
|
135
|
+
/* @__PURE__ */ jsx(Lock, { className: "h-3.5 w-3.5" }),
|
|
136
|
+
building ? "In development" : "Coming soon"
|
|
137
|
+
] })
|
|
138
|
+
] })
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
function LaunchpadServicesGrid({ services, className }) {
|
|
143
|
+
return /* @__PURE__ */ jsx(
|
|
144
|
+
"div",
|
|
145
|
+
{
|
|
146
|
+
className: cn(
|
|
147
|
+
"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
148
|
+
className
|
|
149
|
+
),
|
|
150
|
+
children: services.map(({ key, ...rest }) => /* @__PURE__ */ jsx(ServiceCard, { ...rest }, key))
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
export {
|
|
155
|
+
LaunchpadServicesGrid
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=launchpad-services.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var launchpad_services_exports = {};
|
|
20
|
+
__export(launchpad_services_exports, {
|
|
21
|
+
LAUNCHPAD_SERVICE_DEFINITIONS: () => LAUNCHPAD_SERVICE_DEFINITIONS
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(launchpad_services_exports);
|
|
24
|
+
var import_lucide_react = require("lucide-react");
|
|
25
|
+
const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
26
|
+
// ── Create ────────────────────────────────────────────────────────────────
|
|
27
|
+
{
|
|
28
|
+
key: "mint-ip-asset",
|
|
29
|
+
title: "Mint IP Asset",
|
|
30
|
+
subtitle: "Register any creative work onchain",
|
|
31
|
+
description: "Turn any creative file into a programmable IP NFT. Gasless, permanent, and immediately tradeable.",
|
|
32
|
+
features: ["Gasless via ChipiPay", "IPFS metadata", "Programmable licensing"],
|
|
33
|
+
icon: import_lucide_react.ImagePlus,
|
|
34
|
+
gradient: "from-blue-500/10 via-sky-400/4 to-transparent",
|
|
35
|
+
borderColor: "border-blue-500/20",
|
|
36
|
+
iconColor: "text-blue-500",
|
|
37
|
+
buttonColor: "bg-brand-blue hover:bg-brand-blue/90",
|
|
38
|
+
badge: "Create",
|
|
39
|
+
status: "live",
|
|
40
|
+
category: "create"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
key: "create-collection",
|
|
44
|
+
title: "Create Collection",
|
|
45
|
+
subtitle: "Deploy a named ERC-721 catalog",
|
|
46
|
+
description: "Deploy a branded collection with its own page, metadata, and on-chain identity \u2014 ready to populate with assets.",
|
|
47
|
+
features: ["Factory-deployed ERC-721", "Branded collection page", "Add assets at any time"],
|
|
48
|
+
icon: import_lucide_react.Layers,
|
|
49
|
+
gradient: "from-violet-500/10 via-purple-400/4 to-transparent",
|
|
50
|
+
borderColor: "border-violet-500/20",
|
|
51
|
+
iconColor: "text-violet-500",
|
|
52
|
+
buttonColor: "bg-brand-purple hover:bg-brand-purple/90",
|
|
53
|
+
badge: "Create",
|
|
54
|
+
status: "live",
|
|
55
|
+
category: "create"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: "remix-asset",
|
|
59
|
+
title: "Remix Asset",
|
|
60
|
+
subtitle: "Derivative works with on-chain attribution",
|
|
61
|
+
description: "Create a licensed derivative of any IP asset with full provenance and attribution flowing back to the original creator.",
|
|
62
|
+
features: ["On-chain attribution", "License-enforced at mint", "Royalties to original creator"],
|
|
63
|
+
icon: import_lucide_react.GitBranch,
|
|
64
|
+
gradient: "from-rose-500/10 via-pink-400/4 to-transparent",
|
|
65
|
+
borderColor: "border-rose-500/20",
|
|
66
|
+
iconColor: "text-rose-500",
|
|
67
|
+
buttonColor: "bg-brand-rose hover:bg-brand-rose/90",
|
|
68
|
+
badge: "Remix",
|
|
69
|
+
status: "live",
|
|
70
|
+
category: "create"
|
|
71
|
+
},
|
|
72
|
+
// ── Launch ────────────────────────────────────────────────────────────────
|
|
73
|
+
{
|
|
74
|
+
key: "pop-protocol",
|
|
75
|
+
title: "POP Protocol",
|
|
76
|
+
subtitle: "Soulbound credentials for events & education",
|
|
77
|
+
description: "Issue non-transferable on-chain credentials for bootcamps, hackathons, and conferences. Each attendee claims one soulbound badge \u2014 permanently tied to their wallet.",
|
|
78
|
+
features: ["Soulbound \xB7 non-transferable", "One credential per wallet", "Optional allowlist gating"],
|
|
79
|
+
icon: import_lucide_react.Award,
|
|
80
|
+
gradient: "from-emerald-500/10 via-green-400/4 to-transparent",
|
|
81
|
+
borderColor: "border-emerald-500/20",
|
|
82
|
+
iconColor: "text-emerald-500",
|
|
83
|
+
buttonColor: "bg-green-600 hover:bg-green-700",
|
|
84
|
+
badge: "Launch",
|
|
85
|
+
browseLinkLabel: "Browse events",
|
|
86
|
+
status: "live",
|
|
87
|
+
category: "launch"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
key: "collection-drop",
|
|
91
|
+
title: "Collection Drop",
|
|
92
|
+
subtitle: "Limited-edition timed releases",
|
|
93
|
+
description: "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.",
|
|
94
|
+
features: ["Fixed supply cap", "Timed mint window", "Free or paid mint"],
|
|
95
|
+
icon: import_lucide_react.Package,
|
|
96
|
+
gradient: "from-orange-500/10 via-amber-400/4 to-transparent",
|
|
97
|
+
borderColor: "border-orange-500/20",
|
|
98
|
+
iconColor: "text-orange-500",
|
|
99
|
+
buttonColor: "bg-orange-600 hover:bg-orange-700",
|
|
100
|
+
badge: "Launch",
|
|
101
|
+
browseLinkLabel: "Browse drops",
|
|
102
|
+
status: "live",
|
|
103
|
+
category: "launch"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
key: "ip-collection-1155",
|
|
107
|
+
title: "IP Collection 1155",
|
|
108
|
+
subtitle: "Multi-edition ERC-1155 collections",
|
|
109
|
+
description: "Deploy a multi-edition collection for music tracks, art series, or any IP with multiple copies. Mint unlimited editions in a single transaction.",
|
|
110
|
+
features: ["Multi-edition ERC-1155", "Immutable provenance", "Tradeable on Medialane"],
|
|
111
|
+
icon: import_lucide_react.Layers,
|
|
112
|
+
gradient: "from-violet-500/10 via-purple-400/4 to-transparent",
|
|
113
|
+
borderColor: "border-violet-500/20",
|
|
114
|
+
iconColor: "text-violet-500",
|
|
115
|
+
buttonColor: "bg-violet-600 hover:bg-violet-700",
|
|
116
|
+
badge: "Launch",
|
|
117
|
+
status: "live",
|
|
118
|
+
category: "launch"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
key: "mint-editions",
|
|
122
|
+
title: "Mint Editions",
|
|
123
|
+
subtitle: "Add new tokens to an existing collection",
|
|
124
|
+
description: "Select one of your IP Collection 1155 contracts and mint new token editions into it \u2014 set supply, upload artwork, and release to collectors.",
|
|
125
|
+
features: ["Choose any 1155 collection", "Set edition supply", "IPFS metadata"],
|
|
126
|
+
icon: import_lucide_react.PlusCircle,
|
|
127
|
+
gradient: "from-fuchsia-500/10 via-violet-400/4 to-transparent",
|
|
128
|
+
borderColor: "border-fuchsia-500/20",
|
|
129
|
+
iconColor: "text-fuchsia-500",
|
|
130
|
+
buttonColor: "bg-fuchsia-600 hover:bg-fuchsia-700",
|
|
131
|
+
badge: "Launch",
|
|
132
|
+
status: "live",
|
|
133
|
+
category: "launch"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
key: "ip-tickets",
|
|
137
|
+
title: "IP Tickets",
|
|
138
|
+
subtitle: "Gate real-world experiences with NFTs",
|
|
139
|
+
description: "Distribute tickets for concerts, workshops, and events. Each ticket is verifiable on-chain proof of attendance.",
|
|
140
|
+
features: ["NFT-based event gating", "Proof of attendance", "Transferable or soulbound"],
|
|
141
|
+
icon: import_lucide_react.Ticket,
|
|
142
|
+
gradient: "from-teal-500/7 via-cyan-400/3 to-transparent",
|
|
143
|
+
borderColor: "border-teal-500/15",
|
|
144
|
+
iconColor: "text-teal-500",
|
|
145
|
+
badge: "Soon",
|
|
146
|
+
status: "building",
|
|
147
|
+
category: "launch"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
key: "membership",
|
|
151
|
+
title: "Membership",
|
|
152
|
+
subtitle: "Token-gated access passes",
|
|
153
|
+
description: "Create tiered membership passes that unlock exclusive content, private communities, and experiences for your most loyal fans.",
|
|
154
|
+
features: ["Token-gated content", "Tiered access levels", "Community alignment"],
|
|
155
|
+
icon: import_lucide_react.Users,
|
|
156
|
+
gradient: "from-indigo-500/6 via-violet-400/2 to-transparent",
|
|
157
|
+
borderColor: "border-indigo-500/10",
|
|
158
|
+
iconColor: "text-indigo-400",
|
|
159
|
+
badge: "Soon",
|
|
160
|
+
status: "soon",
|
|
161
|
+
category: "launch"
|
|
162
|
+
},
|
|
163
|
+
// ── Monetize ─────────────────────────────────────────────────────────────
|
|
164
|
+
{
|
|
165
|
+
key: "subscriptions",
|
|
166
|
+
title: "Subscriptions",
|
|
167
|
+
subtitle: "Recurring on-chain revenue",
|
|
168
|
+
description: "Monthly licensing, creator support tiers, and access passes \u2014 all auto-renewed without intermediaries.",
|
|
169
|
+
features: ["Recurring revenue", "Auto-renewal protocol", "No middlemen"],
|
|
170
|
+
icon: import_lucide_react.RefreshCw,
|
|
171
|
+
gradient: "from-sky-500/6 via-blue-400/2 to-transparent",
|
|
172
|
+
borderColor: "border-sky-500/10",
|
|
173
|
+
iconColor: "text-sky-400",
|
|
174
|
+
badge: "Soon",
|
|
175
|
+
status: "soon",
|
|
176
|
+
category: "monetize"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
key: "ip-coins",
|
|
180
|
+
title: "IP Coins",
|
|
181
|
+
subtitle: "Fractional ownership of intellectual property",
|
|
182
|
+
description: "Tokenize your IP catalog as fungible tokens. Enable fractional ownership and liquid markets around your creative work.",
|
|
183
|
+
features: ["Fungible IP tokens", "Fractional ownership", "Liquid secondary markets"],
|
|
184
|
+
icon: import_lucide_react.Coins,
|
|
185
|
+
gradient: "from-amber-500/6 via-yellow-400/2 to-transparent",
|
|
186
|
+
borderColor: "border-amber-500/10",
|
|
187
|
+
iconColor: "text-amber-400",
|
|
188
|
+
badge: "Soon",
|
|
189
|
+
status: "soon",
|
|
190
|
+
category: "monetize"
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
key: "creator-coins",
|
|
194
|
+
title: "Creator Coins",
|
|
195
|
+
subtitle: "Personal social token for fans",
|
|
196
|
+
description: "Launch a social token tied to your creative career. Let fans invest directly in your work \u2014 full economic alignment between creator and community.",
|
|
197
|
+
features: ["Personal social token", "Fan investment", "Creator-community alignment"],
|
|
198
|
+
icon: import_lucide_react.TrendingUp,
|
|
199
|
+
gradient: "from-pink-500/6 via-rose-400/2 to-transparent",
|
|
200
|
+
borderColor: "border-pink-500/10",
|
|
201
|
+
iconColor: "text-pink-400",
|
|
202
|
+
badge: "Soon",
|
|
203
|
+
status: "soon",
|
|
204
|
+
category: "monetize"
|
|
205
|
+
}
|
|
206
|
+
];
|
|
207
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
208
|
+
0 && (module.exports = {
|
|
209
|
+
LAUNCHPAD_SERVICE_DEFINITIONS
|
|
210
|
+
});
|
|
211
|
+
//# sourceMappingURL=launchpad-services.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data/launchpad-services.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport {\n ImagePlus, Layers, GitBranch,\n Award, Package, PlusCircle,\n Ticket, Users,\n RefreshCw, Coins, TrendingUp,\n} from \"lucide-react\";\n\nexport type ServiceStatus = \"live\" | \"building\" | \"soon\";\nexport type ServiceCategory = \"create\" | \"launch\" | \"monetize\";\n\nexport interface ServiceDefinition {\n key: string;\n title: string;\n subtitle: string;\n description: string;\n features: string[];\n icon: LucideIcon;\n gradient: string;\n borderColor: string;\n iconColor: string;\n buttonColor?: string;\n badge: string;\n status: ServiceStatus;\n category: ServiceCategory;\n /** Secondary browse link label — injected app adds the href */\n browseLinkLabel?: string;\n}\n\nexport const LAUNCHPAD_SERVICE_DEFINITIONS: ServiceDefinition[] = [\n // ── Create ────────────────────────────────────────────────────────────────\n {\n key: \"mint-ip-asset\",\n title: \"Mint IP Asset\",\n subtitle: \"Register any creative work onchain\",\n description:\n \"Turn any creative file into a programmable IP NFT. Gasless, permanent, and immediately tradeable.\",\n features: [\"Gasless via ChipiPay\", \"IPFS metadata\", \"Programmable licensing\"],\n icon: ImagePlus,\n gradient: \"from-blue-500/10 via-sky-400/4 to-transparent\",\n borderColor: \"border-blue-500/20\",\n iconColor: \"text-blue-500\",\n buttonColor: \"bg-brand-blue hover:bg-brand-blue/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n {\n key: \"create-collection\",\n title: \"Create Collection\",\n subtitle: \"Deploy a named ERC-721 catalog\",\n description:\n \"Deploy a branded collection with its own page, metadata, and on-chain identity — ready to populate with assets.\",\n features: [\"Factory-deployed ERC-721\", \"Branded collection page\", \"Add assets at any time\"],\n icon: Layers,\n gradient: \"from-violet-500/10 via-purple-400/4 to-transparent\",\n borderColor: \"border-violet-500/20\",\n iconColor: \"text-violet-500\",\n buttonColor: \"bg-brand-purple hover:bg-brand-purple/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n {\n key: \"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: \"Remix\",\n status: \"live\",\n category: \"create\",\n },\n\n // ── Launch ────────────────────────────────────────────────────────────────\n {\n key: \"pop-protocol\",\n title: \"POP Protocol\",\n subtitle: \"Soulbound credentials for events & education\",\n description:\n \"Issue non-transferable on-chain credentials for bootcamps, hackathons, and conferences. Each attendee claims one soulbound badge — permanently tied to their wallet.\",\n features: [\"Soulbound · non-transferable\", \"One credential per wallet\", \"Optional allowlist gating\"],\n icon: Award,\n gradient: \"from-emerald-500/10 via-green-400/4 to-transparent\",\n borderColor: \"border-emerald-500/20\",\n iconColor: \"text-emerald-500\",\n buttonColor: \"bg-green-600 hover:bg-green-700\",\n badge: \"Launch\",\n browseLinkLabel: \"Browse events\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"collection-drop\",\n title: \"Collection Drop\",\n subtitle: \"Limited-edition timed releases\",\n description:\n \"Launch a fixed-supply ERC-721 drop with a defined mint window and per-wallet limit. Set your open date and let your community race to collect.\",\n features: [\"Fixed supply cap\", \"Timed mint window\", \"Free or paid mint\"],\n icon: Package,\n gradient: \"from-orange-500/10 via-amber-400/4 to-transparent\",\n borderColor: \"border-orange-500/20\",\n iconColor: \"text-orange-500\",\n buttonColor: \"bg-orange-600 hover:bg-orange-700\",\n badge: \"Launch\",\n browseLinkLabel: \"Browse drops\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"ip-collection-1155\",\n title: \"IP Collection 1155\",\n subtitle: \"Multi-edition ERC-1155 collections\",\n description:\n \"Deploy a multi-edition collection for music tracks, art series, or any IP with multiple copies. Mint unlimited editions in a single transaction.\",\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: \"Launch\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"mint-editions\",\n title: \"Mint Editions\",\n subtitle: \"Add new tokens to an existing collection\",\n description:\n \"Select one of your IP Collection 1155 contracts and mint new token editions into it — set supply, upload artwork, and release to collectors.\",\n features: [\"Choose any 1155 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: \"Launch\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"ip-tickets\",\n title: \"IP Tickets\",\n subtitle: \"Gate real-world experiences with NFTs\",\n description:\n \"Distribute tickets for concerts, workshops, and events. Each ticket is verifiable on-chain proof of attendance.\",\n features: [\"NFT-based event gating\", \"Proof of attendance\", \"Transferable or soulbound\"],\n icon: Ticket,\n gradient: \"from-teal-500/7 via-cyan-400/3 to-transparent\",\n borderColor: \"border-teal-500/15\",\n iconColor: \"text-teal-500\",\n badge: \"Soon\",\n status: \"building\",\n category: \"launch\",\n },\n {\n key: \"membership\",\n title: \"Membership\",\n subtitle: \"Token-gated access passes\",\n description:\n \"Create tiered membership passes that unlock exclusive content, private communities, and experiences for your most loyal fans.\",\n features: [\"Token-gated content\", \"Tiered access levels\", \"Community alignment\"],\n icon: Users,\n gradient: \"from-indigo-500/6 via-violet-400/2 to-transparent\",\n borderColor: \"border-indigo-500/10\",\n iconColor: \"text-indigo-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"launch\",\n },\n\n // ── Monetize ─────────────────────────────────────────────────────────────\n {\n key: \"subscriptions\",\n title: \"Subscriptions\",\n subtitle: \"Recurring on-chain revenue\",\n description:\n \"Monthly licensing, creator support tiers, and access passes — all auto-renewed without intermediaries.\",\n features: [\"Recurring revenue\", \"Auto-renewal protocol\", \"No middlemen\"],\n icon: RefreshCw,\n gradient: \"from-sky-500/6 via-blue-400/2 to-transparent\",\n borderColor: \"border-sky-500/10\",\n iconColor: \"text-sky-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n {\n key: \"ip-coins\",\n title: \"IP Coins\",\n subtitle: \"Fractional ownership of intellectual property\",\n description:\n \"Tokenize your IP catalog as fungible tokens. Enable fractional ownership and liquid markets around your creative work.\",\n features: [\"Fungible IP tokens\", \"Fractional ownership\", \"Liquid secondary markets\"],\n icon: Coins,\n gradient: \"from-amber-500/6 via-yellow-400/2 to-transparent\",\n borderColor: \"border-amber-500/10\",\n iconColor: \"text-amber-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n {\n key: \"creator-coins\",\n title: \"Creator Coins\",\n subtitle: \"Personal social token for fans\",\n description:\n \"Launch a social token tied to your creative career. Let fans invest directly in your work — full economic alignment between creator and community.\",\n features: [\"Personal social token\", \"Fan investment\", \"Creator-community alignment\"],\n icon: TrendingUp,\n gradient: \"from-pink-500/6 via-rose-400/2 to-transparent\",\n borderColor: \"border-pink-500/10\",\n iconColor: \"text-pink-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n];\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { LucideIcon } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
type ServiceStatus = "live" | "building" | "soon";
|
|
4
|
+
type ServiceCategory = "create" | "launch" | "monetize";
|
|
5
|
+
interface ServiceDefinition {
|
|
6
|
+
key: string;
|
|
7
|
+
title: string;
|
|
8
|
+
subtitle: string;
|
|
9
|
+
description: string;
|
|
10
|
+
features: string[];
|
|
11
|
+
icon: LucideIcon;
|
|
12
|
+
gradient: string;
|
|
13
|
+
borderColor: string;
|
|
14
|
+
iconColor: string;
|
|
15
|
+
buttonColor?: string;
|
|
16
|
+
badge: string;
|
|
17
|
+
status: ServiceStatus;
|
|
18
|
+
category: ServiceCategory;
|
|
19
|
+
/** Secondary browse link label — injected app adds the href */
|
|
20
|
+
browseLinkLabel?: string;
|
|
21
|
+
}
|
|
22
|
+
declare const LAUNCHPAD_SERVICE_DEFINITIONS: ServiceDefinition[];
|
|
23
|
+
|
|
24
|
+
export { LAUNCHPAD_SERVICE_DEFINITIONS, type ServiceCategory, type ServiceDefinition, type ServiceStatus };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { LucideIcon } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
type ServiceStatus = "live" | "building" | "soon";
|
|
4
|
+
type ServiceCategory = "create" | "launch" | "monetize";
|
|
5
|
+
interface ServiceDefinition {
|
|
6
|
+
key: string;
|
|
7
|
+
title: string;
|
|
8
|
+
subtitle: string;
|
|
9
|
+
description: string;
|
|
10
|
+
features: string[];
|
|
11
|
+
icon: LucideIcon;
|
|
12
|
+
gradient: string;
|
|
13
|
+
borderColor: string;
|
|
14
|
+
iconColor: string;
|
|
15
|
+
buttonColor?: string;
|
|
16
|
+
badge: string;
|
|
17
|
+
status: ServiceStatus;
|
|
18
|
+
category: ServiceCategory;
|
|
19
|
+
/** Secondary browse link label — injected app adds the href */
|
|
20
|
+
browseLinkLabel?: string;
|
|
21
|
+
}
|
|
22
|
+
declare const LAUNCHPAD_SERVICE_DEFINITIONS: ServiceDefinition[];
|
|
23
|
+
|
|
24
|
+
export { LAUNCHPAD_SERVICE_DEFINITIONS, type ServiceCategory, type ServiceDefinition, type ServiceStatus };
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ImagePlus,
|
|
3
|
+
Layers,
|
|
4
|
+
GitBranch,
|
|
5
|
+
Award,
|
|
6
|
+
Package,
|
|
7
|
+
PlusCircle,
|
|
8
|
+
Ticket,
|
|
9
|
+
Users,
|
|
10
|
+
RefreshCw,
|
|
11
|
+
Coins,
|
|
12
|
+
TrendingUp
|
|
13
|
+
} from "lucide-react";
|
|
14
|
+
const LAUNCHPAD_SERVICE_DEFINITIONS = [
|
|
15
|
+
// ── Create ────────────────────────────────────────────────────────────────
|
|
16
|
+
{
|
|
17
|
+
key: "mint-ip-asset",
|
|
18
|
+
title: "Mint IP Asset",
|
|
19
|
+
subtitle: "Register any creative work onchain",
|
|
20
|
+
description: "Turn any creative file into a programmable IP NFT. Gasless, permanent, and immediately tradeable.",
|
|
21
|
+
features: ["Gasless via ChipiPay", "IPFS metadata", "Programmable licensing"],
|
|
22
|
+
icon: ImagePlus,
|
|
23
|
+
gradient: "from-blue-500/10 via-sky-400/4 to-transparent",
|
|
24
|
+
borderColor: "border-blue-500/20",
|
|
25
|
+
iconColor: "text-blue-500",
|
|
26
|
+
buttonColor: "bg-brand-blue hover:bg-brand-blue/90",
|
|
27
|
+
badge: "Create",
|
|
28
|
+
status: "live",
|
|
29
|
+
category: "create"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: "create-collection",
|
|
33
|
+
title: "Create Collection",
|
|
34
|
+
subtitle: "Deploy a named ERC-721 catalog",
|
|
35
|
+
description: "Deploy a branded collection with its own page, metadata, and on-chain identity \u2014 ready to populate with assets.",
|
|
36
|
+
features: ["Factory-deployed ERC-721", "Branded collection page", "Add assets at any time"],
|
|
37
|
+
icon: Layers,
|
|
38
|
+
gradient: "from-violet-500/10 via-purple-400/4 to-transparent",
|
|
39
|
+
borderColor: "border-violet-500/20",
|
|
40
|
+
iconColor: "text-violet-500",
|
|
41
|
+
buttonColor: "bg-brand-purple hover:bg-brand-purple/90",
|
|
42
|
+
badge: "Create",
|
|
43
|
+
status: "live",
|
|
44
|
+
category: "create"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
key: "remix-asset",
|
|
48
|
+
title: "Remix Asset",
|
|
49
|
+
subtitle: "Derivative works with on-chain attribution",
|
|
50
|
+
description: "Create a licensed derivative of any IP asset with full provenance and attribution flowing back to the original creator.",
|
|
51
|
+
features: ["On-chain attribution", "License-enforced at mint", "Royalties to original creator"],
|
|
52
|
+
icon: GitBranch,
|
|
53
|
+
gradient: "from-rose-500/10 via-pink-400/4 to-transparent",
|
|
54
|
+
borderColor: "border-rose-500/20",
|
|
55
|
+
iconColor: "text-rose-500",
|
|
56
|
+
buttonColor: "bg-brand-rose hover:bg-brand-rose/90",
|
|
57
|
+
badge: "Remix",
|
|
58
|
+
status: "live",
|
|
59
|
+
category: "create"
|
|
60
|
+
},
|
|
61
|
+
// ── Launch ────────────────────────────────────────────────────────────────
|
|
62
|
+
{
|
|
63
|
+
key: "pop-protocol",
|
|
64
|
+
title: "POP Protocol",
|
|
65
|
+
subtitle: "Soulbound credentials for events & education",
|
|
66
|
+
description: "Issue non-transferable on-chain credentials for bootcamps, hackathons, and conferences. Each attendee claims one soulbound badge \u2014 permanently tied to their wallet.",
|
|
67
|
+
features: ["Soulbound \xB7 non-transferable", "One credential per wallet", "Optional allowlist gating"],
|
|
68
|
+
icon: Award,
|
|
69
|
+
gradient: "from-emerald-500/10 via-green-400/4 to-transparent",
|
|
70
|
+
borderColor: "border-emerald-500/20",
|
|
71
|
+
iconColor: "text-emerald-500",
|
|
72
|
+
buttonColor: "bg-green-600 hover:bg-green-700",
|
|
73
|
+
badge: "Launch",
|
|
74
|
+
browseLinkLabel: "Browse events",
|
|
75
|
+
status: "live",
|
|
76
|
+
category: "launch"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
key: "collection-drop",
|
|
80
|
+
title: "Collection Drop",
|
|
81
|
+
subtitle: "Limited-edition timed releases",
|
|
82
|
+
description: "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.",
|
|
83
|
+
features: ["Fixed supply cap", "Timed mint window", "Free or paid mint"],
|
|
84
|
+
icon: Package,
|
|
85
|
+
gradient: "from-orange-500/10 via-amber-400/4 to-transparent",
|
|
86
|
+
borderColor: "border-orange-500/20",
|
|
87
|
+
iconColor: "text-orange-500",
|
|
88
|
+
buttonColor: "bg-orange-600 hover:bg-orange-700",
|
|
89
|
+
badge: "Launch",
|
|
90
|
+
browseLinkLabel: "Browse drops",
|
|
91
|
+
status: "live",
|
|
92
|
+
category: "launch"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
key: "ip-collection-1155",
|
|
96
|
+
title: "IP Collection 1155",
|
|
97
|
+
subtitle: "Multi-edition ERC-1155 collections",
|
|
98
|
+
description: "Deploy a multi-edition collection for music tracks, art series, or any IP with multiple copies. Mint unlimited editions in a single transaction.",
|
|
99
|
+
features: ["Multi-edition ERC-1155", "Immutable provenance", "Tradeable on Medialane"],
|
|
100
|
+
icon: Layers,
|
|
101
|
+
gradient: "from-violet-500/10 via-purple-400/4 to-transparent",
|
|
102
|
+
borderColor: "border-violet-500/20",
|
|
103
|
+
iconColor: "text-violet-500",
|
|
104
|
+
buttonColor: "bg-violet-600 hover:bg-violet-700",
|
|
105
|
+
badge: "Launch",
|
|
106
|
+
status: "live",
|
|
107
|
+
category: "launch"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
key: "mint-editions",
|
|
111
|
+
title: "Mint Editions",
|
|
112
|
+
subtitle: "Add new tokens to an existing collection",
|
|
113
|
+
description: "Select one of your IP Collection 1155 contracts and mint new token editions into it \u2014 set supply, upload artwork, and release to collectors.",
|
|
114
|
+
features: ["Choose any 1155 collection", "Set edition supply", "IPFS metadata"],
|
|
115
|
+
icon: PlusCircle,
|
|
116
|
+
gradient: "from-fuchsia-500/10 via-violet-400/4 to-transparent",
|
|
117
|
+
borderColor: "border-fuchsia-500/20",
|
|
118
|
+
iconColor: "text-fuchsia-500",
|
|
119
|
+
buttonColor: "bg-fuchsia-600 hover:bg-fuchsia-700",
|
|
120
|
+
badge: "Launch",
|
|
121
|
+
status: "live",
|
|
122
|
+
category: "launch"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
key: "ip-tickets",
|
|
126
|
+
title: "IP Tickets",
|
|
127
|
+
subtitle: "Gate real-world experiences with NFTs",
|
|
128
|
+
description: "Distribute tickets for concerts, workshops, and events. Each ticket is verifiable on-chain proof of attendance.",
|
|
129
|
+
features: ["NFT-based event gating", "Proof of attendance", "Transferable or soulbound"],
|
|
130
|
+
icon: Ticket,
|
|
131
|
+
gradient: "from-teal-500/7 via-cyan-400/3 to-transparent",
|
|
132
|
+
borderColor: "border-teal-500/15",
|
|
133
|
+
iconColor: "text-teal-500",
|
|
134
|
+
badge: "Soon",
|
|
135
|
+
status: "building",
|
|
136
|
+
category: "launch"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
key: "membership",
|
|
140
|
+
title: "Membership",
|
|
141
|
+
subtitle: "Token-gated access passes",
|
|
142
|
+
description: "Create tiered membership passes that unlock exclusive content, private communities, and experiences for your most loyal fans.",
|
|
143
|
+
features: ["Token-gated content", "Tiered access levels", "Community alignment"],
|
|
144
|
+
icon: Users,
|
|
145
|
+
gradient: "from-indigo-500/6 via-violet-400/2 to-transparent",
|
|
146
|
+
borderColor: "border-indigo-500/10",
|
|
147
|
+
iconColor: "text-indigo-400",
|
|
148
|
+
badge: "Soon",
|
|
149
|
+
status: "soon",
|
|
150
|
+
category: "launch"
|
|
151
|
+
},
|
|
152
|
+
// ── Monetize ─────────────────────────────────────────────────────────────
|
|
153
|
+
{
|
|
154
|
+
key: "subscriptions",
|
|
155
|
+
title: "Subscriptions",
|
|
156
|
+
subtitle: "Recurring on-chain revenue",
|
|
157
|
+
description: "Monthly licensing, creator support tiers, and access passes \u2014 all auto-renewed without intermediaries.",
|
|
158
|
+
features: ["Recurring revenue", "Auto-renewal protocol", "No middlemen"],
|
|
159
|
+
icon: RefreshCw,
|
|
160
|
+
gradient: "from-sky-500/6 via-blue-400/2 to-transparent",
|
|
161
|
+
borderColor: "border-sky-500/10",
|
|
162
|
+
iconColor: "text-sky-400",
|
|
163
|
+
badge: "Soon",
|
|
164
|
+
status: "soon",
|
|
165
|
+
category: "monetize"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
key: "ip-coins",
|
|
169
|
+
title: "IP Coins",
|
|
170
|
+
subtitle: "Fractional ownership of intellectual property",
|
|
171
|
+
description: "Tokenize your IP catalog as fungible tokens. Enable fractional ownership and liquid markets around your creative work.",
|
|
172
|
+
features: ["Fungible IP tokens", "Fractional ownership", "Liquid secondary markets"],
|
|
173
|
+
icon: Coins,
|
|
174
|
+
gradient: "from-amber-500/6 via-yellow-400/2 to-transparent",
|
|
175
|
+
borderColor: "border-amber-500/10",
|
|
176
|
+
iconColor: "text-amber-400",
|
|
177
|
+
badge: "Soon",
|
|
178
|
+
status: "soon",
|
|
179
|
+
category: "monetize"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
key: "creator-coins",
|
|
183
|
+
title: "Creator Coins",
|
|
184
|
+
subtitle: "Personal social token for fans",
|
|
185
|
+
description: "Launch a social token tied to your creative career. Let fans invest directly in your work \u2014 full economic alignment between creator and community.",
|
|
186
|
+
features: ["Personal social token", "Fan investment", "Creator-community alignment"],
|
|
187
|
+
icon: TrendingUp,
|
|
188
|
+
gradient: "from-pink-500/6 via-rose-400/2 to-transparent",
|
|
189
|
+
borderColor: "border-pink-500/10",
|
|
190
|
+
iconColor: "text-pink-400",
|
|
191
|
+
badge: "Soon",
|
|
192
|
+
status: "soon",
|
|
193
|
+
category: "monetize"
|
|
194
|
+
}
|
|
195
|
+
];
|
|
196
|
+
export {
|
|
197
|
+
LAUNCHPAD_SERVICE_DEFINITIONS
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=launchpad-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data/launchpad-services.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport {\n ImagePlus, Layers, GitBranch,\n Award, Package, PlusCircle,\n Ticket, Users,\n RefreshCw, Coins, TrendingUp,\n} from \"lucide-react\";\n\nexport type ServiceStatus = \"live\" | \"building\" | \"soon\";\nexport type ServiceCategory = \"create\" | \"launch\" | \"monetize\";\n\nexport interface ServiceDefinition {\n key: string;\n title: string;\n subtitle: string;\n description: string;\n features: string[];\n icon: LucideIcon;\n gradient: string;\n borderColor: string;\n iconColor: string;\n buttonColor?: string;\n badge: string;\n status: ServiceStatus;\n category: ServiceCategory;\n /** Secondary browse link label — injected app adds the href */\n browseLinkLabel?: string;\n}\n\nexport const LAUNCHPAD_SERVICE_DEFINITIONS: ServiceDefinition[] = [\n // ── Create ────────────────────────────────────────────────────────────────\n {\n key: \"mint-ip-asset\",\n title: \"Mint IP Asset\",\n subtitle: \"Register any creative work onchain\",\n description:\n \"Turn any creative file into a programmable IP NFT. Gasless, permanent, and immediately tradeable.\",\n features: [\"Gasless via ChipiPay\", \"IPFS metadata\", \"Programmable licensing\"],\n icon: ImagePlus,\n gradient: \"from-blue-500/10 via-sky-400/4 to-transparent\",\n borderColor: \"border-blue-500/20\",\n iconColor: \"text-blue-500\",\n buttonColor: \"bg-brand-blue hover:bg-brand-blue/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n {\n key: \"create-collection\",\n title: \"Create Collection\",\n subtitle: \"Deploy a named ERC-721 catalog\",\n description:\n \"Deploy a branded collection with its own page, metadata, and on-chain identity — ready to populate with assets.\",\n features: [\"Factory-deployed ERC-721\", \"Branded collection page\", \"Add assets at any time\"],\n icon: Layers,\n gradient: \"from-violet-500/10 via-purple-400/4 to-transparent\",\n borderColor: \"border-violet-500/20\",\n iconColor: \"text-violet-500\",\n buttonColor: \"bg-brand-purple hover:bg-brand-purple/90\",\n badge: \"Create\",\n status: \"live\",\n category: \"create\",\n },\n {\n key: \"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: \"Remix\",\n status: \"live\",\n category: \"create\",\n },\n\n // ── Launch ────────────────────────────────────────────────────────────────\n {\n key: \"pop-protocol\",\n title: \"POP Protocol\",\n subtitle: \"Soulbound credentials for events & education\",\n description:\n \"Issue non-transferable on-chain credentials for bootcamps, hackathons, and conferences. Each attendee claims one soulbound badge — permanently tied to their wallet.\",\n features: [\"Soulbound · non-transferable\", \"One credential per wallet\", \"Optional allowlist gating\"],\n icon: Award,\n gradient: \"from-emerald-500/10 via-green-400/4 to-transparent\",\n borderColor: \"border-emerald-500/20\",\n iconColor: \"text-emerald-500\",\n buttonColor: \"bg-green-600 hover:bg-green-700\",\n badge: \"Launch\",\n browseLinkLabel: \"Browse events\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"collection-drop\",\n title: \"Collection Drop\",\n subtitle: \"Limited-edition timed releases\",\n description:\n \"Launch a fixed-supply ERC-721 drop with a defined mint window and per-wallet limit. Set your open date and let your community race to collect.\",\n features: [\"Fixed supply cap\", \"Timed mint window\", \"Free or paid mint\"],\n icon: Package,\n gradient: \"from-orange-500/10 via-amber-400/4 to-transparent\",\n borderColor: \"border-orange-500/20\",\n iconColor: \"text-orange-500\",\n buttonColor: \"bg-orange-600 hover:bg-orange-700\",\n badge: \"Launch\",\n browseLinkLabel: \"Browse drops\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"ip-collection-1155\",\n title: \"IP Collection 1155\",\n subtitle: \"Multi-edition ERC-1155 collections\",\n description:\n \"Deploy a multi-edition collection for music tracks, art series, or any IP with multiple copies. Mint unlimited editions in a single transaction.\",\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: \"Launch\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"mint-editions\",\n title: \"Mint Editions\",\n subtitle: \"Add new tokens to an existing collection\",\n description:\n \"Select one of your IP Collection 1155 contracts and mint new token editions into it — set supply, upload artwork, and release to collectors.\",\n features: [\"Choose any 1155 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: \"Launch\",\n status: \"live\",\n category: \"launch\",\n },\n {\n key: \"ip-tickets\",\n title: \"IP Tickets\",\n subtitle: \"Gate real-world experiences with NFTs\",\n description:\n \"Distribute tickets for concerts, workshops, and events. Each ticket is verifiable on-chain proof of attendance.\",\n features: [\"NFT-based event gating\", \"Proof of attendance\", \"Transferable or soulbound\"],\n icon: Ticket,\n gradient: \"from-teal-500/7 via-cyan-400/3 to-transparent\",\n borderColor: \"border-teal-500/15\",\n iconColor: \"text-teal-500\",\n badge: \"Soon\",\n status: \"building\",\n category: \"launch\",\n },\n {\n key: \"membership\",\n title: \"Membership\",\n subtitle: \"Token-gated access passes\",\n description:\n \"Create tiered membership passes that unlock exclusive content, private communities, and experiences for your most loyal fans.\",\n features: [\"Token-gated content\", \"Tiered access levels\", \"Community alignment\"],\n icon: Users,\n gradient: \"from-indigo-500/6 via-violet-400/2 to-transparent\",\n borderColor: \"border-indigo-500/10\",\n iconColor: \"text-indigo-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"launch\",\n },\n\n // ── Monetize ─────────────────────────────────────────────────────────────\n {\n key: \"subscriptions\",\n title: \"Subscriptions\",\n subtitle: \"Recurring on-chain revenue\",\n description:\n \"Monthly licensing, creator support tiers, and access passes — all auto-renewed without intermediaries.\",\n features: [\"Recurring revenue\", \"Auto-renewal protocol\", \"No middlemen\"],\n icon: RefreshCw,\n gradient: \"from-sky-500/6 via-blue-400/2 to-transparent\",\n borderColor: \"border-sky-500/10\",\n iconColor: \"text-sky-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n {\n key: \"ip-coins\",\n title: \"IP Coins\",\n subtitle: \"Fractional ownership of intellectual property\",\n description:\n \"Tokenize your IP catalog as fungible tokens. Enable fractional ownership and liquid markets around your creative work.\",\n features: [\"Fungible IP tokens\", \"Fractional ownership\", \"Liquid secondary markets\"],\n icon: Coins,\n gradient: \"from-amber-500/6 via-yellow-400/2 to-transparent\",\n borderColor: \"border-amber-500/10\",\n iconColor: \"text-amber-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n {\n key: \"creator-coins\",\n title: \"Creator Coins\",\n subtitle: \"Personal social token for fans\",\n description:\n \"Launch a social token tied to your creative career. Let fans invest directly in your work — full economic alignment between creator and community.\",\n features: [\"Personal social token\", \"Fan investment\", \"Creator-community alignment\"],\n icon: TrendingUp,\n gradient: \"from-pink-500/6 via-rose-400/2 to-transparent\",\n borderColor: \"border-pink-500/10\",\n iconColor: \"text-pink-400\",\n badge: \"Soon\",\n status: \"soon\",\n category: \"monetize\",\n },\n];\n"],"mappings":"AACA;AAAA,EACE;AAAA,EAAW;AAAA,EAAQ;AAAA,EACnB;AAAA,EAAO;AAAA,EAAS;AAAA,EAChB;AAAA,EAAQ;AAAA,EACR;AAAA,EAAW;AAAA,EAAO;AAAA,OACb;AAuBA,MAAM,gCAAqD;AAAA;AAAA,EAEhE;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,wBAAwB,iBAAiB,wBAAwB;AAAA,IAC5E,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,4BAA4B,2BAA2B,wBAAwB;AAAA,IAC1F,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,wBAAwB,4BAA4B,+BAA+B;AAAA,IAC9F,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA,EAGA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,mCAAgC,6BAA6B,2BAA2B;AAAA,IACnG,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,oBAAoB,qBAAqB,mBAAmB;AAAA,IACvE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,0BAA0B,wBAAwB,wBAAwB;AAAA,IACrF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,8BAA8B,sBAAsB,eAAe;AAAA,IAC9E,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,0BAA0B,uBAAuB,2BAA2B;AAAA,IACvF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,uBAAuB,wBAAwB,qBAAqB;AAAA,IAC/E,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA,EAGA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,qBAAqB,yBAAyB,cAAc;AAAA,IACvE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,sBAAsB,wBAAwB,0BAA0B;AAAA,IACnF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aACE;AAAA,IACF,UAAU,CAAC,yBAAyB,kBAAkB,6BAA6B;AAAA,IACnF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AACF;","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -45,7 +45,9 @@ __export(index_exports, {
|
|
|
45
45
|
IP_TYPE_MAP: () => import_ip_type_badge.IP_TYPE_MAP,
|
|
46
46
|
IpTypeBadge: () => import_ip_type_badge.IpTypeBadge,
|
|
47
47
|
KineticWords: () => import_motion_primitives.KineticWords,
|
|
48
|
+
LAUNCHPAD_SERVICE_DEFINITIONS: () => import_launchpad_services2.LAUNCHPAD_SERVICE_DEFINITIONS,
|
|
48
49
|
LaunchpadGrid: () => import_launchpad_grid.LaunchpadGrid,
|
|
50
|
+
LaunchpadServicesGrid: () => import_launchpad_services.LaunchpadServicesGrid,
|
|
49
51
|
ListingCard: () => import_listing_card.ListingCard,
|
|
50
52
|
ListingCardSkeleton: () => import_listing_card.ListingCardSkeleton,
|
|
51
53
|
MedialaneIcon: () => import_brand_icon.MedialaneIcon,
|
|
@@ -96,6 +98,8 @@ var import_featured_carousel = require("./components/featured-carousel.js");
|
|
|
96
98
|
var import_discover_collections_strip = require("./components/discover-collections-strip.js");
|
|
97
99
|
var import_discover_creators_strip = require("./components/discover-creators-strip.js");
|
|
98
100
|
var import_discover_feed_section = require("./components/discover-feed-section.js");
|
|
101
|
+
var import_launchpad_services = require("./components/launchpad-services.js");
|
|
102
|
+
var import_launchpad_services2 = require("./data/launchpad-services.js");
|
|
99
103
|
// Annotate the CommonJS export names for ESM import in node:
|
|
100
104
|
0 && (module.exports = {
|
|
101
105
|
ACTIVITY_TYPE_CONFIG,
|
|
@@ -125,7 +129,9 @@ var import_discover_feed_section = require("./components/discover-feed-section.j
|
|
|
125
129
|
IP_TYPE_MAP,
|
|
126
130
|
IpTypeBadge,
|
|
127
131
|
KineticWords,
|
|
132
|
+
LAUNCHPAD_SERVICE_DEFINITIONS,
|
|
128
133
|
LaunchpadGrid,
|
|
134
|
+
LaunchpadServicesGrid,
|
|
129
135
|
ListingCard,
|
|
130
136
|
ListingCardSkeleton,
|
|
131
137
|
MedialaneIcon,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport { BRAND } from \"./data/brand.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps, RarityTier } from \"./components/token-card.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAmB;AACnB,oBAAmC;AACnC,qBAA+B;AAC/B,kBAA2B;AAG3B,sBAA+C;AAE/C,mBAAsB;AAGtB,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAA8B;AAE9B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAI7C,kBAAwB;AACxB,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,4BAA8B;AAE9B,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAAoC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport { BRAND } from \"./data/brand.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps, RarityTier } from \"./components/token-card.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\n\n// ── v0.4 additions ────────────────────────────────────────────────────────────\nexport { LaunchpadServicesGrid } from \"./components/launchpad-services.js\";\nexport type { LaunchpadServicesGridProps, ServiceCardProps } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory } from \"./data/launchpad-services.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAmB;AACnB,oBAAmC;AACnC,qBAA+B;AAC/B,kBAA2B;AAG3B,sBAA+C;AAE/C,mBAAsB;AAGtB,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAA8B;AAE9B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAI7C,kBAAwB;AACxB,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,4BAA8B;AAE9B,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAAoC;AAIpC,gCAAsC;AAEtC,IAAAA,6BAA8C;","names":["import_launchpad_services"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -28,6 +28,8 @@ export { FeaturedCarousel, FeaturedCarouselProps, FeaturedCarouselSkeleton } fro
|
|
|
28
28
|
export { DiscoverCollectionsStrip, DiscoverCollectionsStripProps } from './components/discover-collections-strip.cjs';
|
|
29
29
|
export { DiscoverCreatorsStrip, DiscoverCreatorsStripProps } from './components/discover-creators-strip.cjs';
|
|
30
30
|
export { DiscoverFeedSection, DiscoverFeedSectionProps } from './components/discover-feed-section.cjs';
|
|
31
|
+
export { LaunchpadServicesGrid, LaunchpadServicesGridProps, ServiceCardProps } from './components/launchpad-services.cjs';
|
|
32
|
+
export { LAUNCHPAD_SERVICE_DEFINITIONS, ServiceCategory, ServiceDefinition, ServiceStatus } from './data/launchpad-services.cjs';
|
|
31
33
|
import 'clsx';
|
|
32
34
|
import 'react/jsx-runtime';
|
|
33
35
|
import 'framer-motion';
|
package/dist/index.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export { FeaturedCarousel, FeaturedCarouselProps, FeaturedCarouselSkeleton } fro
|
|
|
28
28
|
export { DiscoverCollectionsStrip, DiscoverCollectionsStripProps } from './components/discover-collections-strip.js';
|
|
29
29
|
export { DiscoverCreatorsStrip, DiscoverCreatorsStripProps } from './components/discover-creators-strip.js';
|
|
30
30
|
export { DiscoverFeedSection, DiscoverFeedSectionProps } from './components/discover-feed-section.js';
|
|
31
|
+
export { LaunchpadServicesGrid, LaunchpadServicesGridProps, ServiceCardProps } from './components/launchpad-services.js';
|
|
32
|
+
export { LAUNCHPAD_SERVICE_DEFINITIONS, ServiceCategory, ServiceDefinition, ServiceStatus } from './data/launchpad-services.js';
|
|
31
33
|
import 'clsx';
|
|
32
34
|
import 'react/jsx-runtime';
|
|
33
35
|
import 'framer-motion';
|
package/dist/index.js
CHANGED
|
@@ -28,6 +28,8 @@ import { FeaturedCarousel, FeaturedCarouselSkeleton } from "./components/feature
|
|
|
28
28
|
import { DiscoverCollectionsStrip } from "./components/discover-collections-strip.js";
|
|
29
29
|
import { DiscoverCreatorsStrip } from "./components/discover-creators-strip.js";
|
|
30
30
|
import { DiscoverFeedSection } from "./components/discover-feed-section.js";
|
|
31
|
+
import { LaunchpadServicesGrid } from "./components/launchpad-services.js";
|
|
32
|
+
import { LAUNCHPAD_SERVICE_DEFINITIONS } from "./data/launchpad-services.js";
|
|
31
33
|
export {
|
|
32
34
|
ACTIVITY_TYPE_CONFIG,
|
|
33
35
|
ActivityFeedShell,
|
|
@@ -56,7 +58,9 @@ export {
|
|
|
56
58
|
IP_TYPE_MAP,
|
|
57
59
|
IpTypeBadge,
|
|
58
60
|
KineticWords,
|
|
61
|
+
LAUNCHPAD_SERVICE_DEFINITIONS,
|
|
59
62
|
LaunchpadGrid,
|
|
63
|
+
LaunchpadServicesGrid,
|
|
60
64
|
ListingCard,
|
|
61
65
|
ListingCardSkeleton,
|
|
62
66
|
MedialaneIcon,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport { BRAND } from \"./data/brand.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps, RarityTier } from \"./components/token-card.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\n"],"mappings":"AACA,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAG3B,SAAS,cAAc,wBAAwB;AAE/C,SAAS,aAAa;AAGtB,SAAS,cAAc,sBAAsB;AAG7C,SAAS,aAAa,gBAAgB,mBAAmB;AAGzD,SAAS,sBAAsB;AAG/B,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAIlC,SAAS,YAAY,QAAQ,SAAS,aAAa,cAAc,QAAQ,gBAAgB;AACzF,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAE5B,SAAS,gBAAgB,8BAA8B;AAEvD,SAAS,WAAW,yBAAyB;AAI7C,SAAS,eAAe;AACxB,SAAS,sBAAsB,oBAAoB;AAEnD,SAAS,YAAY,0BAA0B;AAE/C,SAAS,sBAAsB;AAE/B,SAAS,aAAa,2BAA2B;AAEjD,SAAS,mBAAmB;AAE5B,SAAS,yBAAyB;AAElC,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAI5B,SAAS,oBAAoB;AAE7B,SAAS,kBAAkB,gCAAgC;AAE3D,SAAS,gCAAgC;AAEzC,SAAS,6BAA6B;AAEtC,SAAS,2BAA2B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\n\n// ── Data (server-safe — no React, safe in Server Components) ──────────────────\nexport { IP_TYPE_DATA, IP_TYPE_DATA_MAP } from \"./data/ip-types.js\";\nexport type { IpTypeData } from \"./data/ip-types.js\";\nexport { BRAND } from \"./data/brand.js\";\n\n// ── Components (client-only — all have \"use client\") ─────────────────────────\nexport { CurrencyIcon, CurrencyAmount } from \"./components/currency-icon.js\";\nexport type { CurrencyIconProps, CurrencyAmountProps } from \"./components/currency-icon.js\";\n\nexport { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from \"./components/ip-type-badge.js\";\nexport type { IpTypeBadgeProps, IpTypeConfig } from \"./components/ip-type-badge.js\";\n\nexport { AddressDisplay } from \"./components/address-display.js\";\nexport type { AddressDisplayProps } from \"./components/address-display.js\";\n\nexport { MedialaneIcon } from \"./components/brand-icon.js\";\nexport type { MedialaneIconProps } from \"./components/brand-icon.js\";\nexport { MedialaneLogoFull } from \"./components/brand-logo.js\";\nexport type { MedialaneLogoFullProps } from \"./components/brand-logo.js\";\n\n// ── v0.2 additions ────────────────────────────────────────────────────────────\nexport { MotionCard, FadeIn, Stagger, StaggerItem, KineticWords, SPRING, EASE_OUT } from \"./components/motion-primitives.js\";\nexport { ScrollSection } from \"./components/scroll-section.js\";\nexport type { ScrollSectionProps } from \"./components/scroll-section.js\";\nexport { ShareButton } from \"./components/share-button.js\";\nexport type { ShareButtonProps } from \"./components/share-button.js\";\nexport { CollectionCard, CollectionCardSkeleton } from \"./components/collection-card.js\";\nexport type { CollectionCardProps } from \"./components/collection-card.js\";\nexport { TokenCard, TokenCardSkeleton } from \"./components/token-card.js\";\nexport type { TokenCardProps, RarityTier } from \"./components/token-card.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo } from \"./utils/time.js\";\nexport { ACTIVITY_TYPE_CONFIG, TYPE_FILTERS } from \"./data/activity.js\";\nexport type { ActivityTypeConfig } from \"./data/activity.js\";\nexport { HeroSlider, HeroSliderSkeleton } from \"./components/hero-slider.js\";\nexport type { HeroSliderProps } from \"./components/hero-slider.js\";\nexport { ActivityTicker } from \"./components/activity-ticker.js\";\nexport type { ActivityTickerProps } from \"./components/activity-ticker.js\";\nexport { ListingCard, ListingCardSkeleton } from \"./components/listing-card.js\";\nexport type { ListingCardProps } from \"./components/listing-card.js\";\nexport { ActivityRow } from \"./components/activity-row.js\";\nexport type { ActivityRowProps } from \"./components/activity-row.js\";\nexport { ActivityFeedShell } from \"./components/activity-feed-shell.js\";\nexport type { ActivityFeedShellProps } from \"./components/activity-feed-shell.js\";\nexport { LaunchpadGrid } from \"./components/launchpad-grid.js\";\nexport type { LaunchpadGridProps, FeatureItem } from \"./components/launchpad-grid.js\";\nexport { CtaCardGrid } from \"./components/cta-card-grid.js\";\nexport type { CtaCardGridProps, CtaCardItem } from \"./components/cta-card-grid.js\";\n\n// ── v0.3.2 additions ─────────────────────────────────────────────────────────\nexport { DiscoverHero } from \"./components/discover-hero.js\";\nexport type { DiscoverHeroProps } from \"./components/discover-hero.js\";\nexport { FeaturedCarousel, FeaturedCarouselSkeleton } from \"./components/featured-carousel.js\";\nexport type { FeaturedCarouselProps } from \"./components/featured-carousel.js\";\nexport { DiscoverCollectionsStrip } from \"./components/discover-collections-strip.js\";\nexport type { DiscoverCollectionsStripProps } from \"./components/discover-collections-strip.js\";\nexport { DiscoverCreatorsStrip } from \"./components/discover-creators-strip.js\";\nexport type { DiscoverCreatorsStripProps } from \"./components/discover-creators-strip.js\";\nexport { DiscoverFeedSection } from \"./components/discover-feed-section.js\";\nexport type { DiscoverFeedSectionProps } from \"./components/discover-feed-section.js\";\n\n// ── v0.4 additions ────────────────────────────────────────────────────────────\nexport { LaunchpadServicesGrid } from \"./components/launchpad-services.js\";\nexport type { LaunchpadServicesGridProps, ServiceCardProps } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory } from \"./data/launchpad-services.js\";\n"],"mappings":"AACA,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAG3B,SAAS,cAAc,wBAAwB;AAE/C,SAAS,aAAa;AAGtB,SAAS,cAAc,sBAAsB;AAG7C,SAAS,aAAa,gBAAgB,mBAAmB;AAGzD,SAAS,sBAAsB;AAG/B,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAIlC,SAAS,YAAY,QAAQ,SAAS,aAAa,cAAc,QAAQ,gBAAgB;AACzF,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAE5B,SAAS,gBAAgB,8BAA8B;AAEvD,SAAS,WAAW,yBAAyB;AAI7C,SAAS,eAAe;AACxB,SAAS,sBAAsB,oBAAoB;AAEnD,SAAS,YAAY,0BAA0B;AAE/C,SAAS,sBAAsB;AAE/B,SAAS,aAAa,2BAA2B;AAEjD,SAAS,mBAAmB;AAE5B,SAAS,yBAAyB;AAElC,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAI5B,SAAS,oBAAoB;AAE7B,SAAS,kBAAkB,gCAAgC;AAE3D,SAAS,gCAAgC;AAEzC,SAAS,6BAA6B;AAEtC,SAAS,2BAA2B;AAIpC,SAAS,6BAA6B;AAEtC,SAAS,qCAAqC;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@medialane/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Shared UI components for Medialane apps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -23,26 +23,28 @@
|
|
|
23
23
|
"publishConfig": {
|
|
24
24
|
"access": "public"
|
|
25
25
|
},
|
|
26
|
-
"files": [
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
27
29
|
"scripts": {
|
|
28
30
|
"build": "tsup",
|
|
29
31
|
"dev": "tsup --watch",
|
|
30
32
|
"typecheck": "tsc --noEmit"
|
|
31
33
|
},
|
|
32
34
|
"peerDependencies": {
|
|
33
|
-
"
|
|
34
|
-
"react-dom": ">=18.0.0",
|
|
35
|
-
"next": ">=14.0.0",
|
|
36
|
-
"next-themes": ">=0.3.0",
|
|
37
|
-
"lucide-react": ">=0.400.0",
|
|
38
|
-
"tailwind-merge": ">=2.0.0",
|
|
35
|
+
"@medialane/sdk": ">=0.6.0",
|
|
39
36
|
"clsx": ">=2.0.0",
|
|
40
37
|
"framer-motion": ">=10.0.0",
|
|
38
|
+
"lucide-react": ">=0.400.0",
|
|
39
|
+
"next": ">=14.0.0",
|
|
40
|
+
"next-themes": ">=0.3.0",
|
|
41
|
+
"react": ">=18.0.0",
|
|
42
|
+
"react-dom": ">=18.0.0",
|
|
41
43
|
"sonner": ">=1.0.0",
|
|
42
|
-
"
|
|
44
|
+
"tailwind-merge": ">=2.0.0"
|
|
43
45
|
},
|
|
44
46
|
"devDependencies": {
|
|
45
|
-
"@medialane/sdk": "^0.
|
|
47
|
+
"@medialane/sdk": "^0.7.2",
|
|
46
48
|
"@types/react": "^19.0.0",
|
|
47
49
|
"@types/react-dom": "^19.0.0",
|
|
48
50
|
"clsx": "^2.0.0",
|