@medialane/ui 0.27.0 → 0.29.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.
Files changed (44) hide show
  1. package/README.md +1 -0
  2. package/dist/components/asset-collection-bar.cjs +135 -0
  3. package/dist/components/asset-collection-bar.cjs.map +1 -0
  4. package/dist/components/asset-collection-bar.d.cts +28 -0
  5. package/dist/components/asset-collection-bar.d.ts +28 -0
  6. package/dist/components/asset-collection-bar.js +101 -0
  7. package/dist/components/asset-collection-bar.js.map +1 -0
  8. package/dist/components/asset-marketplace-panel.cjs +284 -0
  9. package/dist/components/asset-marketplace-panel.cjs.map +1 -0
  10. package/dist/components/asset-marketplace-panel.d.cts +44 -0
  11. package/dist/components/asset-marketplace-panel.d.ts +44 -0
  12. package/dist/components/asset-marketplace-panel.js +270 -0
  13. package/dist/components/asset-marketplace-panel.js.map +1 -0
  14. package/dist/components/asset-top-sections.cjs +4 -9
  15. package/dist/components/asset-top-sections.cjs.map +1 -1
  16. package/dist/components/asset-top-sections.d.cts +1 -3
  17. package/dist/components/asset-top-sections.d.ts +1 -3
  18. package/dist/components/asset-top-sections.js +4 -9
  19. package/dist/components/asset-top-sections.js.map +1 -1
  20. package/dist/components/service-form-shell.cjs +3 -2
  21. package/dist/components/service-form-shell.cjs.map +1 -1
  22. package/dist/components/service-form-shell.d.cts +4 -1
  23. package/dist/components/service-form-shell.d.ts +4 -1
  24. package/dist/components/service-form-shell.js +3 -2
  25. package/dist/components/service-form-shell.js.map +1 -1
  26. package/dist/components/step-nav.cjs +82 -0
  27. package/dist/components/step-nav.cjs.map +1 -0
  28. package/dist/components/step-nav.d.cts +28 -0
  29. package/dist/components/step-nav.d.ts +28 -0
  30. package/dist/components/step-nav.js +58 -0
  31. package/dist/components/step-nav.js.map +1 -0
  32. package/dist/index.cjs +11 -0
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +5 -2
  35. package/dist/index.d.ts +5 -2
  36. package/dist/index.js +8 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/utils/format.cjs +17 -2
  39. package/dist/utils/format.cjs.map +1 -1
  40. package/dist/utils/format.d.cts +9 -1
  41. package/dist/utils/format.d.ts +9 -1
  42. package/dist/utils/format.js +15 -1
  43. package/dist/utils/format.js.map +1 -1
  44. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/asset-top-sections.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport { motion } from \"framer-motion\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ParentAttributionBanner } from \"./parent-attribution-banner.js\";\nimport type { IPType } from \"../data/ip.js\";\nimport { Layers, Users } from \"lucide-react\";\n\ninterface AssetMediaColumnProps {\n shouldReduce: boolean;\n image: string;\n imageAlt: string;\n imgError: boolean;\n onImageError: () => void;\n fallback: React.ReactNode;\n stats?: Array<{\n value: string;\n label: string;\n icon: React.ReactNode;\n }>;\n}\n\nexport function AssetMediaColumn({\n shouldReduce,\n image,\n imageAlt,\n imgError,\n onImageError,\n fallback,\n stats,\n}: AssetMediaColumnProps) {\n return (\n <motion.div\n initial={shouldReduce ? false : { scale: 1.0, opacity: 0 }}\n animate={{ scale: 1.02, opacity: 1 }}\n transition={{ duration: 0.6, ease: \"easeOut\" }}\n className=\"overflow-hidden rounded-xl lg:sticky lg:top-16\"\n >\n <div className=\"rounded-2xl overflow-hidden border border-border bg-muted\">\n {image && !imgError ? (\n <Image\n src={image}\n alt={imageAlt}\n width={0}\n height={0}\n sizes=\"(max-width: 1024px) 100vw, 66vw\"\n className=\"w-full h-auto\"\n onError={onImageError}\n crossOrigin=\"anonymous\"\n priority\n />\n ) : (\n fallback\n )}\n </div>\n\n {stats && stats.length > 0 ? (\n <div className={`grid gap-3 mt-4 ${stats.length === 2 ? \"grid-cols-2\" : \"grid-cols-1\"}`}>\n {stats.map((stat) => (\n <div key={stat.label} className=\"rounded-xl border border-border bg-muted/20 p-4 text-center\">\n <p className=\"text-2xl font-black\">{stat.value}</p>\n <div className=\"flex items-center justify-center gap-1 text-xs text-muted-foreground mt-1\">\n {stat.icon}\n {stat.label}\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </motion.div>\n );\n}\n\ninterface AssetHeaderBlockProps {\n name: string;\n description?: string | null;\n ipType?: IPType | string | null;\n showMultiEditionBadge?: boolean;\n parentContract?: string | null;\n parentTokenId?: string | null;\n ownerAddress?: string | null;\n}\n\nexport function AssetHeaderBlock({\n name,\n description,\n ipType,\n showMultiEditionBadge = false,\n parentContract,\n parentTokenId,\n ownerAddress,\n}: AssetHeaderBlockProps) {\n return (\n <div>\n {parentContract && parentTokenId ? (\n <div className=\"mb-3\">\n <ParentAttributionBanner\n parentContract={parentContract}\n parentTokenId={parentTokenId}\n parentName={`Token #${parentTokenId}`}\n />\n </div>\n ) : null}\n <div className=\"flex items-center gap-2 flex-wrap mb-2\">\n {ipType ? <IpTypeBadge ipType={ipType} size=\"md\" /> : null}\n {showMultiEditionBadge ? (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-semibold px-2.5 py-1 rounded-full border border-violet-500/30 bg-violet-500/10 text-violet-500\">\n <Layers className=\"h-3 w-3\" />\n Multi-edition\n </span>\n ) : null}\n </div>\n {ownerAddress ? (\n <div className=\"mb-1 flex items-center gap-1.5 text-xs text-muted-foreground\">\n <span className=\"font-semibold uppercase tracking-wider\">Owner</span>\n <Link\n href={`/creator/${ownerAddress}`}\n className=\"hover:text-primary transition-colors font-medium\"\n >\n <AddressDisplay address={ownerAddress} />\n </Link>\n </div>\n ) : null}\n <h1 className=\"text-3xl lg:text-5xl font-bold\">{name}</h1>\n {description ? (\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n ) : null}\n </div>\n );\n}\n\nexport function buildEditionStats(totalEditions: number, uniqueOwners: number) {\n return [\n {\n value: totalEditions.toLocaleString(),\n label: \"editions minted\",\n icon: <Layers className=\"h-3 w-3\" />,\n },\n {\n value: uniqueOwners.toLocaleString(),\n label: \"unique owners\",\n icon: <Users className=\"h-3 w-3\" />,\n },\n ];\n}\n"],"mappings":";AA2CU,cAqBI,YArBJ;AAzCV,OAAO,WAAW;AAClB,OAAO,UAAU;AACjB,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,+BAA+B;AAExC,SAAS,QAAQ,aAAa;AAgBvB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,eAAe,QAAQ,EAAE,OAAO,GAAK,SAAS,EAAE;AAAA,MACzD,SAAS,EAAE,OAAO,MAAM,SAAS,EAAE;AAAA,MACnC,YAAY,EAAE,UAAU,KAAK,MAAM,UAAU;AAAA,MAC7C,WAAU;AAAA,MAEV;AAAA,4BAAC,SAAI,WAAU,6DACZ,mBAAS,CAAC,WACT;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,OAAM;AAAA,YACN,WAAU;AAAA,YACV,SAAS;AAAA,YACT,aAAY;AAAA,YACZ,UAAQ;AAAA;AAAA,QACV,IAEA,UAEJ;AAAA,QAEC,SAAS,MAAM,SAAS,IACvB,oBAAC,SAAI,WAAW,mBAAmB,MAAM,WAAW,IAAI,gBAAgB,aAAa,IAClF,gBAAM,IAAI,CAAC,SACV,qBAAC,SAAqB,WAAU,+DAC9B;AAAA,8BAAC,OAAE,WAAU,uBAAuB,eAAK,OAAM;AAAA,UAC/C,qBAAC,SAAI,WAAU,6EACZ;AAAA,iBAAK;AAAA,YACL,KAAK;AAAA,aACR;AAAA,aALQ,KAAK,KAMf,CACD,GACH,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAYO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE,qBAAC,SACE;AAAA,sBAAkB,gBACjB,oBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAY,UAAU,aAAa;AAAA;AAAA,IACrC,GACF,IACE;AAAA,IACJ,qBAAC,SAAI,WAAU,0CACZ;AAAA,eAAS,oBAAC,eAAY,QAAgB,MAAK,MAAK,IAAK;AAAA,MACrD,wBACC,qBAAC,UAAK,WAAU,kJACd;AAAA,4BAAC,UAAO,WAAU,WAAU;AAAA,QAAE;AAAA,SAEhC,IACE;AAAA,OACN;AAAA,IACC,eACC,qBAAC,SAAI,WAAU,gEACb;AAAA,0BAAC,UAAK,WAAU,0CAAyC,mBAAK;AAAA,MAC9D;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,YAAY,YAAY;AAAA,UAC9B,WAAU;AAAA,UAEV,8BAAC,kBAAe,SAAS,cAAc;AAAA;AAAA,MACzC;AAAA,OACF,IACE;AAAA,IACJ,oBAAC,QAAG,WAAU,kCAAkC,gBAAK;AAAA,IACpD,cACC,oBAAC,OAAE,WAAU,sDAAsD,uBAAY,IAC7E;AAAA,KACN;AAEJ;AAEO,SAAS,kBAAkB,eAAuB,cAAsB;AAC7E,SAAO;AAAA,IACL;AAAA,MACE,OAAO,cAAc,eAAe;AAAA,MACpC,OAAO;AAAA,MACP,MAAM,oBAAC,UAAO,WAAU,WAAU;AAAA,IACpC;AAAA,IACA;AAAA,MACE,OAAO,aAAa,eAAe;AAAA,MACnC,OAAO;AAAA,MACP,MAAM,oBAAC,SAAM,WAAU,WAAU;AAAA,IACnC;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/components/asset-top-sections.tsx"],"sourcesContent":["\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport { motion } from \"framer-motion\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ParentAttributionBanner } from \"./parent-attribution-banner.js\";\nimport { Layers, Users } from \"lucide-react\";\n\ninterface AssetMediaColumnProps {\n shouldReduce: boolean;\n image: string;\n imageAlt: string;\n imgError: boolean;\n onImageError: () => void;\n fallback: React.ReactNode;\n stats?: Array<{\n value: string;\n label: string;\n icon: React.ReactNode;\n }>;\n}\n\nexport function AssetMediaColumn({\n shouldReduce,\n image,\n imageAlt,\n imgError,\n onImageError,\n fallback,\n stats,\n}: AssetMediaColumnProps) {\n return (\n <motion.div\n initial={shouldReduce ? false : { scale: 1.0, opacity: 0 }}\n animate={{ scale: 1.02, opacity: 1 }}\n transition={{ duration: 0.6, ease: \"easeOut\" }}\n className=\"overflow-hidden rounded-xl lg:sticky lg:top-16\"\n >\n <div className=\"rounded-2xl overflow-hidden border border-border bg-muted\">\n {image && !imgError ? (\n <Image\n src={image}\n alt={imageAlt}\n width={0}\n height={0}\n sizes=\"(max-width: 1024px) 100vw, 66vw\"\n className=\"w-full h-auto\"\n onError={onImageError}\n crossOrigin=\"anonymous\"\n priority\n />\n ) : (\n fallback\n )}\n </div>\n\n {stats && stats.length > 0 ? (\n <div className={`grid gap-3 mt-4 ${stats.length === 2 ? \"grid-cols-2\" : \"grid-cols-1\"}`}>\n {stats.map((stat) => (\n <div key={stat.label} className=\"rounded-xl border border-border bg-muted/20 p-4 text-center\">\n <p className=\"text-2xl font-black\">{stat.value}</p>\n <div className=\"flex items-center justify-center gap-1 text-xs text-muted-foreground mt-1\">\n {stat.icon}\n {stat.label}\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </motion.div>\n );\n}\n\ninterface AssetHeaderBlockProps {\n name: string;\n description?: string | null;\n showMultiEditionBadge?: boolean;\n parentContract?: string | null;\n parentTokenId?: string | null;\n ownerAddress?: string | null;\n}\n\nexport function AssetHeaderBlock({\n name,\n description,\n showMultiEditionBadge = false,\n parentContract,\n parentTokenId,\n ownerAddress,\n}: AssetHeaderBlockProps) {\n return (\n <div>\n {parentContract && parentTokenId ? (\n <div className=\"mb-3\">\n <ParentAttributionBanner\n parentContract={parentContract}\n parentTokenId={parentTokenId}\n parentName={`Token #${parentTokenId}`}\n />\n </div>\n ) : null}\n {showMultiEditionBadge ? (\n <div className=\"flex items-center gap-2 flex-wrap mb-2\">\n <span className=\"inline-flex items-center gap-1 text-[11px] font-semibold px-2.5 py-1 rounded-full border border-violet-500/30 bg-violet-500/10 text-violet-500\">\n <Layers className=\"h-3 w-3\" />\n Multi-edition\n </span>\n </div>\n ) : null}\n {ownerAddress ? (\n <div className=\"mb-1 flex items-center gap-1.5 text-xs text-muted-foreground\">\n <span className=\"font-semibold uppercase tracking-wider\">Owner</span>\n <Link\n href={`/creator/${ownerAddress}`}\n className=\"hover:text-primary transition-colors font-medium\"\n >\n <AddressDisplay address={ownerAddress} />\n </Link>\n </div>\n ) : null}\n <h1 className=\"text-3xl lg:text-5xl font-bold\">{name}</h1>\n {description ? (\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-1\">{description}</p>\n ) : null}\n </div>\n );\n}\n\nexport function buildEditionStats(totalEditions: number, uniqueOwners: number) {\n return [\n {\n value: totalEditions.toLocaleString(),\n label: \"editions minted\",\n icon: <Layers className=\"h-3 w-3\" />,\n },\n {\n value: uniqueOwners.toLocaleString(),\n label: \"unique owners\",\n icon: <Users className=\"h-3 w-3\" />,\n },\n ];\n}\n"],"mappings":";AAyCU,cAqBI,YArBJ;AAvCV,OAAO,WAAW;AAClB,OAAO,UAAU;AACjB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,+BAA+B;AACxC,SAAS,QAAQ,aAAa;AAgBvB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,eAAe,QAAQ,EAAE,OAAO,GAAK,SAAS,EAAE;AAAA,MACzD,SAAS,EAAE,OAAO,MAAM,SAAS,EAAE;AAAA,MACnC,YAAY,EAAE,UAAU,KAAK,MAAM,UAAU;AAAA,MAC7C,WAAU;AAAA,MAEV;AAAA,4BAAC,SAAI,WAAU,6DACZ,mBAAS,CAAC,WACT;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,OAAM;AAAA,YACN,WAAU;AAAA,YACV,SAAS;AAAA,YACT,aAAY;AAAA,YACZ,UAAQ;AAAA;AAAA,QACV,IAEA,UAEJ;AAAA,QAEC,SAAS,MAAM,SAAS,IACvB,oBAAC,SAAI,WAAW,mBAAmB,MAAM,WAAW,IAAI,gBAAgB,aAAa,IAClF,gBAAM,IAAI,CAAC,SACV,qBAAC,SAAqB,WAAU,+DAC9B;AAAA,8BAAC,OAAE,WAAU,uBAAuB,eAAK,OAAM;AAAA,UAC/C,qBAAC,SAAI,WAAU,6EACZ;AAAA,iBAAK;AAAA,YACL,KAAK;AAAA,aACR;AAAA,aALQ,KAAK,KAMf,CACD,GACH,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAWO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE,qBAAC,SACE;AAAA,sBAAkB,gBACjB,oBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAY,UAAU,aAAa;AAAA;AAAA,IACrC,GACF,IACE;AAAA,IACH,wBACC,oBAAC,SAAI,WAAU,0CACb,+BAAC,UAAK,WAAU,kJACd;AAAA,0BAAC,UAAO,WAAU,WAAU;AAAA,MAAE;AAAA,OAEhC,GACF,IACE;AAAA,IACH,eACC,qBAAC,SAAI,WAAU,gEACb;AAAA,0BAAC,UAAK,WAAU,0CAAyC,mBAAK;AAAA,MAC9D;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,YAAY,YAAY;AAAA,UAC9B,WAAU;AAAA,UAEV,8BAAC,kBAAe,SAAS,cAAc;AAAA;AAAA,MACzC;AAAA,OACF,IACE;AAAA,IACJ,oBAAC,QAAG,WAAU,kCAAkC,gBAAK;AAAA,IACpD,cACC,oBAAC,OAAE,WAAU,sDAAsD,uBAAY,IAC7E;AAAA,KACN;AAEJ;AAEO,SAAS,kBAAkB,eAAuB,cAAsB;AAC7E,SAAO;AAAA,IACL;AAAA,MACE,OAAO,cAAc,eAAe;AAAA,MACpC,OAAO;AAAA,MACP,MAAM,oBAAC,UAAO,WAAU,WAAU;AAAA,IACpC;AAAA,IACA;AAAA,MACE,OAAO,aAAa,eAAe;AAAA,MACnC,OAAO;AAAA,MACP,MAAM,oBAAC,SAAM,WAAU,WAAU;AAAA,IACnC;AAAA,EACF;AACF;","names":[]}
@@ -24,7 +24,7 @@ module.exports = __toCommonJS(service_form_shell_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
25
  var import_cn = require("../utils/cn.js");
26
26
  var import_service_header = require("./service-header.js");
27
- function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, children }) {
27
+ function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, aboveForm, children }) {
28
28
  const header = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_service_header.ServiceHeader, { plain: true, icon, title, subtitle, headerAccessory });
29
29
  const form = aside ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "btn-border-animated p-[1.5px] rounded-2xl", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "rounded-[15px] bg-card p-5 sm:p-6", children }) }) : children;
30
30
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_cn.cn)("container mx-auto px-4 sm:px-6 py-10 space-y-6 pb-20", aside ? "max-w-5xl" : "max-w-3xl"), children: [
@@ -32,9 +32,10 @@ function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, as
32
32
  aside ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid gap-4 lg:grid-cols-12 lg:items-start", children: [
33
33
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-4 lg:col-span-8", children: [
34
34
  header,
35
+ aboveForm,
35
36
  form
36
37
  ] }),
37
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "space-y-4 lg:col-span-4", children: aside })
38
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "space-y-4 lg:col-span-4 lg:sticky lg:top-24", children: aside })
38
39
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-6", children: [
39
40
  header,
40
41
  form
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/service-form-shell.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ServiceHeader } from \"./service-header.js\";\n\nexport interface ServiceFormShellProps {\n /** Rendered icon element for the header, e.g. <Coins className=\"h-4 w-4 text-white\" />. */\n icon: ReactNode;\n title: string;\n subtitle: string;\n /** Optional element under the header subtitle (e.g. a URL pill). */\n headerAccessory?: ReactNode;\n /** Rendered above the header — the app's own back button (router-specific). */\n backSlot?: ReactNode;\n /** Right-rail panels (e.g. <ClaimRail/>). When present, lays out an 8/4 bento. */\n aside?: ReactNode;\n /** The form. **Already gated by the app** — wrap it in your own auth/wallet\n * gate before passing. This component stays presentation-only (no auth,\n * no router) so both apps can share it. */\n children: ReactNode;\n}\n\n/** Shared launchpad/claim form layout: back slot + gradient header, then the\n * form inside the animated full-spectrum border (`.btn-border-animated`, from\n * @medialane/ui/styles). With an `aside` it lays out an 8/4 bento (form left,\n * rail right); without, a single centered column. */\nexport function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, children }: ServiceFormShellProps) {\n // Plain header: the form below already carries the animated gradient border,\n // so the header drops its gradient frame to keep a single focal accent.\n const header = <ServiceHeader plain icon={icon} title={title} subtitle={subtitle} headerAccessory={headerAccessory} />;\n\n // The form is the focus: animated gradient border around the dark card.\n const form = aside ? (\n <div className=\"btn-border-animated p-[1.5px] rounded-2xl\">\n <div className=\"rounded-[15px] bg-card p-5 sm:p-6\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div className={cn(\"container mx-auto px-4 sm:px-6 py-10 space-y-6 pb-20\", aside ? \"max-w-5xl\" : \"max-w-3xl\")}>\n {backSlot}\n {aside ? (\n <div className=\"grid gap-4 lg:grid-cols-12 lg:items-start\">\n <div className=\"space-y-4 lg:col-span-8\">\n {header}\n {form}\n </div>\n <div className=\"space-y-4 lg:col-span-4\">{aside}</div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {header}\n {form}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BiB;AA3BjB,gBAAmB;AACnB,4BAA8B;AAuBvB,SAAS,iBAAiB,EAAE,MAAM,OAAO,UAAU,iBAAiB,UAAU,OAAO,SAAS,GAA0B;AAG7H,QAAM,SAAS,4CAAC,uCAAc,OAAK,MAAC,MAAY,OAAc,UAAoB,iBAAkC;AAGpH,QAAM,OAAO,QACX,4CAAC,SAAI,WAAU,6CACb,sDAAC,SAAI,WAAU,qCAAqC,UAAS,GAC/D,IAEA;AAGF,SACE,6CAAC,SAAI,eAAW,cAAG,wDAAwD,QAAQ,cAAc,WAAW,GACzG;AAAA;AAAA,IACA,QACC,6CAAC,SAAI,WAAU,6CACb;AAAA,mDAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,QACA;AAAA,SACH;AAAA,MACA,4CAAC,SAAI,WAAU,2BAA2B,iBAAM;AAAA,OAClD,IAEA,6CAAC,SAAI,WAAU,aACZ;AAAA;AAAA,MACA;AAAA,OACH;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/service-form-shell.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ServiceHeader } from \"./service-header.js\";\n\nexport interface ServiceFormShellProps {\n /** Rendered icon element for the header, e.g. <Coins className=\"h-4 w-4 text-white\" />. */\n icon: ReactNode;\n title: string;\n subtitle: string;\n /** Optional element under the header subtitle (e.g. a URL pill). */\n headerAccessory?: ReactNode;\n /** Rendered above the header — the app's own back button (router-specific). */\n backSlot?: ReactNode;\n /** Right-rail panels (e.g. <ClaimRail/>). When present, lays out an 8/4 bento. */\n aside?: ReactNode;\n /** Rendered in the left column between the header and the form — e.g. a\n * <StepNav/> for multi-step flows. Only used in the aside (8/4) layout. */\n aboveForm?: ReactNode;\n /** The form. **Already gated by the app** — wrap it in your own auth/wallet\n * gate before passing. This component stays presentation-only (no auth,\n * no router) so both apps can share it. */\n children: ReactNode;\n}\n\n/** Shared launchpad/claim form layout: back slot + gradient header, then the\n * form inside the animated full-spectrum border (`.btn-border-animated`, from\n * @medialane/ui/styles). With an `aside` it lays out an 8/4 bento (form left,\n * rail right); without, a single centered column. */\nexport function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, aboveForm, children }: ServiceFormShellProps) {\n // Plain header: the form below already carries the animated gradient border,\n // so the header drops its gradient frame to keep a single focal accent.\n const header = <ServiceHeader plain icon={icon} title={title} subtitle={subtitle} headerAccessory={headerAccessory} />;\n\n // The form is the focus: animated gradient border around the dark card.\n const form = aside ? (\n <div className=\"btn-border-animated p-[1.5px] rounded-2xl\">\n <div className=\"rounded-[15px] bg-card p-5 sm:p-6\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div className={cn(\"container mx-auto px-4 sm:px-6 py-10 space-y-6 pb-20\", aside ? \"max-w-5xl\" : \"max-w-3xl\")}>\n {backSlot}\n {aside ? (\n <div className=\"grid gap-4 lg:grid-cols-12 lg:items-start\">\n <div className=\"space-y-4 lg:col-span-8\">\n {header}\n {aboveForm}\n {form}\n </div>\n <div className=\"space-y-4 lg:col-span-4 lg:sticky lg:top-24\">{aside}</div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {header}\n {form}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BiB;AA9BjB,gBAAmB;AACnB,4BAA8B;AA0BvB,SAAS,iBAAiB,EAAE,MAAM,OAAO,UAAU,iBAAiB,UAAU,OAAO,WAAW,SAAS,GAA0B;AAGxI,QAAM,SAAS,4CAAC,uCAAc,OAAK,MAAC,MAAY,OAAc,UAAoB,iBAAkC;AAGpH,QAAM,OAAO,QACX,4CAAC,SAAI,WAAU,6CACb,sDAAC,SAAI,WAAU,qCAAqC,UAAS,GAC/D,IAEA;AAGF,SACE,6CAAC,SAAI,eAAW,cAAG,wDAAwD,QAAQ,cAAc,WAAW,GACzG;AAAA;AAAA,IACA,QACC,6CAAC,SAAI,WAAU,6CACb;AAAA,mDAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,QACA;AAAA,QACA;AAAA,SACH;AAAA,MACA,4CAAC,SAAI,WAAU,+CAA+C,iBAAM;AAAA,OACtE,IAEA,6CAAC,SAAI,WAAU,aACZ;AAAA;AAAA,MACA;AAAA,OACH;AAAA,KAEJ;AAEJ;","names":[]}
@@ -12,6 +12,9 @@ interface ServiceFormShellProps {
12
12
  backSlot?: ReactNode;
13
13
  /** Right-rail panels (e.g. <ClaimRail/>). When present, lays out an 8/4 bento. */
14
14
  aside?: ReactNode;
15
+ /** Rendered in the left column between the header and the form — e.g. a
16
+ * <StepNav/> for multi-step flows. Only used in the aside (8/4) layout. */
17
+ aboveForm?: ReactNode;
15
18
  /** The form. **Already gated by the app** — wrap it in your own auth/wallet
16
19
  * gate before passing. This component stays presentation-only (no auth,
17
20
  * no router) so both apps can share it. */
@@ -21,6 +24,6 @@ interface ServiceFormShellProps {
21
24
  * form inside the animated full-spectrum border (`.btn-border-animated`, from
22
25
  * @medialane/ui/styles). With an `aside` it lays out an 8/4 bento (form left,
23
26
  * rail right); without, a single centered column. */
24
- declare function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, children }: ServiceFormShellProps): react_jsx_runtime.JSX.Element;
27
+ declare function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, aboveForm, children }: ServiceFormShellProps): react_jsx_runtime.JSX.Element;
25
28
 
26
29
  export { ServiceFormShell, type ServiceFormShellProps };
@@ -12,6 +12,9 @@ interface ServiceFormShellProps {
12
12
  backSlot?: ReactNode;
13
13
  /** Right-rail panels (e.g. <ClaimRail/>). When present, lays out an 8/4 bento. */
14
14
  aside?: ReactNode;
15
+ /** Rendered in the left column between the header and the form — e.g. a
16
+ * <StepNav/> for multi-step flows. Only used in the aside (8/4) layout. */
17
+ aboveForm?: ReactNode;
15
18
  /** The form. **Already gated by the app** — wrap it in your own auth/wallet
16
19
  * gate before passing. This component stays presentation-only (no auth,
17
20
  * no router) so both apps can share it. */
@@ -21,6 +24,6 @@ interface ServiceFormShellProps {
21
24
  * form inside the animated full-spectrum border (`.btn-border-animated`, from
22
25
  * @medialane/ui/styles). With an `aside` it lays out an 8/4 bento (form left,
23
26
  * rail right); without, a single centered column. */
24
- declare function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, children }: ServiceFormShellProps): react_jsx_runtime.JSX.Element;
27
+ declare function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, aboveForm, children }: ServiceFormShellProps): react_jsx_runtime.JSX.Element;
25
28
 
26
29
  export { ServiceFormShell, type ServiceFormShellProps };
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../utils/cn.js";
3
3
  import { ServiceHeader } from "./service-header.js";
4
- function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, children }) {
4
+ function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, aboveForm, children }) {
5
5
  const header = /* @__PURE__ */ jsx(ServiceHeader, { plain: true, icon, title, subtitle, headerAccessory });
6
6
  const form = aside ? /* @__PURE__ */ jsx("div", { className: "btn-border-animated p-[1.5px] rounded-2xl", children: /* @__PURE__ */ jsx("div", { className: "rounded-[15px] bg-card p-5 sm:p-6", children }) }) : children;
7
7
  return /* @__PURE__ */ jsxs("div", { className: cn("container mx-auto px-4 sm:px-6 py-10 space-y-6 pb-20", aside ? "max-w-5xl" : "max-w-3xl"), children: [
@@ -9,9 +9,10 @@ function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, as
9
9
  aside ? /* @__PURE__ */ jsxs("div", { className: "grid gap-4 lg:grid-cols-12 lg:items-start", children: [
10
10
  /* @__PURE__ */ jsxs("div", { className: "space-y-4 lg:col-span-8", children: [
11
11
  header,
12
+ aboveForm,
12
13
  form
13
14
  ] }),
14
- /* @__PURE__ */ jsx("div", { className: "space-y-4 lg:col-span-4", children: aside })
15
+ /* @__PURE__ */ jsx("div", { className: "space-y-4 lg:col-span-4 lg:sticky lg:top-24", children: aside })
15
16
  ] }) : /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
16
17
  header,
17
18
  form
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/service-form-shell.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ServiceHeader } from \"./service-header.js\";\n\nexport interface ServiceFormShellProps {\n /** Rendered icon element for the header, e.g. <Coins className=\"h-4 w-4 text-white\" />. */\n icon: ReactNode;\n title: string;\n subtitle: string;\n /** Optional element under the header subtitle (e.g. a URL pill). */\n headerAccessory?: ReactNode;\n /** Rendered above the header — the app's own back button (router-specific). */\n backSlot?: ReactNode;\n /** Right-rail panels (e.g. <ClaimRail/>). When present, lays out an 8/4 bento. */\n aside?: ReactNode;\n /** The form. **Already gated by the app** — wrap it in your own auth/wallet\n * gate before passing. This component stays presentation-only (no auth,\n * no router) so both apps can share it. */\n children: ReactNode;\n}\n\n/** Shared launchpad/claim form layout: back slot + gradient header, then the\n * form inside the animated full-spectrum border (`.btn-border-animated`, from\n * @medialane/ui/styles). With an `aside` it lays out an 8/4 bento (form left,\n * rail right); without, a single centered column. */\nexport function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, children }: ServiceFormShellProps) {\n // Plain header: the form below already carries the animated gradient border,\n // so the header drops its gradient frame to keep a single focal accent.\n const header = <ServiceHeader plain icon={icon} title={title} subtitle={subtitle} headerAccessory={headerAccessory} />;\n\n // The form is the focus: animated gradient border around the dark card.\n const form = aside ? (\n <div className=\"btn-border-animated p-[1.5px] rounded-2xl\">\n <div className=\"rounded-[15px] bg-card p-5 sm:p-6\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div className={cn(\"container mx-auto px-4 sm:px-6 py-10 space-y-6 pb-20\", aside ? \"max-w-5xl\" : \"max-w-3xl\")}>\n {backSlot}\n {aside ? (\n <div className=\"grid gap-4 lg:grid-cols-12 lg:items-start\">\n <div className=\"space-y-4 lg:col-span-8\">\n {header}\n {form}\n </div>\n <div className=\"space-y-4 lg:col-span-4\">{aside}</div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {header}\n {form}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"AA4BiB,cAgBP,YAhBO;AA3BjB,SAAS,UAAU;AACnB,SAAS,qBAAqB;AAuBvB,SAAS,iBAAiB,EAAE,MAAM,OAAO,UAAU,iBAAiB,UAAU,OAAO,SAAS,GAA0B;AAG7H,QAAM,SAAS,oBAAC,iBAAc,OAAK,MAAC,MAAY,OAAc,UAAoB,iBAAkC;AAGpH,QAAM,OAAO,QACX,oBAAC,SAAI,WAAU,6CACb,8BAAC,SAAI,WAAU,qCAAqC,UAAS,GAC/D,IAEA;AAGF,SACE,qBAAC,SAAI,WAAW,GAAG,wDAAwD,QAAQ,cAAc,WAAW,GACzG;AAAA;AAAA,IACA,QACC,qBAAC,SAAI,WAAU,6CACb;AAAA,2BAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,QACA;AAAA,SACH;AAAA,MACA,oBAAC,SAAI,WAAU,2BAA2B,iBAAM;AAAA,OAClD,IAEA,qBAAC,SAAI,WAAU,aACZ;AAAA;AAAA,MACA;AAAA,OACH;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/service-form-shell.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn.js\";\nimport { ServiceHeader } from \"./service-header.js\";\n\nexport interface ServiceFormShellProps {\n /** Rendered icon element for the header, e.g. <Coins className=\"h-4 w-4 text-white\" />. */\n icon: ReactNode;\n title: string;\n subtitle: string;\n /** Optional element under the header subtitle (e.g. a URL pill). */\n headerAccessory?: ReactNode;\n /** Rendered above the header — the app's own back button (router-specific). */\n backSlot?: ReactNode;\n /** Right-rail panels (e.g. <ClaimRail/>). When present, lays out an 8/4 bento. */\n aside?: ReactNode;\n /** Rendered in the left column between the header and the form — e.g. a\n * <StepNav/> for multi-step flows. Only used in the aside (8/4) layout. */\n aboveForm?: ReactNode;\n /** The form. **Already gated by the app** — wrap it in your own auth/wallet\n * gate before passing. This component stays presentation-only (no auth,\n * no router) so both apps can share it. */\n children: ReactNode;\n}\n\n/** Shared launchpad/claim form layout: back slot + gradient header, then the\n * form inside the animated full-spectrum border (`.btn-border-animated`, from\n * @medialane/ui/styles). With an `aside` it lays out an 8/4 bento (form left,\n * rail right); without, a single centered column. */\nexport function ServiceFormShell({ icon, title, subtitle, headerAccessory, backSlot, aside, aboveForm, children }: ServiceFormShellProps) {\n // Plain header: the form below already carries the animated gradient border,\n // so the header drops its gradient frame to keep a single focal accent.\n const header = <ServiceHeader plain icon={icon} title={title} subtitle={subtitle} headerAccessory={headerAccessory} />;\n\n // The form is the focus: animated gradient border around the dark card.\n const form = aside ? (\n <div className=\"btn-border-animated p-[1.5px] rounded-2xl\">\n <div className=\"rounded-[15px] bg-card p-5 sm:p-6\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div className={cn(\"container mx-auto px-4 sm:px-6 py-10 space-y-6 pb-20\", aside ? \"max-w-5xl\" : \"max-w-3xl\")}>\n {backSlot}\n {aside ? (\n <div className=\"grid gap-4 lg:grid-cols-12 lg:items-start\">\n <div className=\"space-y-4 lg:col-span-8\">\n {header}\n {aboveForm}\n {form}\n </div>\n <div className=\"space-y-4 lg:col-span-4 lg:sticky lg:top-24\">{aside}</div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {header}\n {form}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"AA+BiB,cAgBP,YAhBO;AA9BjB,SAAS,UAAU;AACnB,SAAS,qBAAqB;AA0BvB,SAAS,iBAAiB,EAAE,MAAM,OAAO,UAAU,iBAAiB,UAAU,OAAO,WAAW,SAAS,GAA0B;AAGxI,QAAM,SAAS,oBAAC,iBAAc,OAAK,MAAC,MAAY,OAAc,UAAoB,iBAAkC;AAGpH,QAAM,OAAO,QACX,oBAAC,SAAI,WAAU,6CACb,8BAAC,SAAI,WAAU,qCAAqC,UAAS,GAC/D,IAEA;AAGF,SACE,qBAAC,SAAI,WAAW,GAAG,wDAAwD,QAAQ,cAAc,WAAW,GACzG;AAAA;AAAA,IACA,QACC,qBAAC,SAAI,WAAU,6CACb;AAAA,2BAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,QACA;AAAA,QACA;AAAA,SACH;AAAA,MACA,oBAAC,SAAI,WAAU,+CAA+C,iBAAM;AAAA,OACtE,IAEA,qBAAC,SAAI,WAAU,aACZ;AAAA;AAAA,MACA;AAAA,OACH;AAAA,KAEJ;AAEJ;","names":[]}
@@ -0,0 +1,82 @@
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 step_nav_exports = {};
20
+ __export(step_nav_exports, {
21
+ StepNav: () => StepNav
22
+ });
23
+ module.exports = __toCommonJS(step_nav_exports);
24
+ var import_jsx_runtime = require("react/jsx-runtime");
25
+ var import_react = require("react");
26
+ var import_lucide_react = require("lucide-react");
27
+ var import_cn = require("../utils/cn.js");
28
+ function StepNav({
29
+ steps,
30
+ current,
31
+ onStep,
32
+ accentText = "text-primary",
33
+ accentBg = "bg-primary",
34
+ className
35
+ }) {
36
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("flex items-center", className), children: steps.map((s, idx) => {
37
+ const n = idx + 1;
38
+ const done = n < current;
39
+ const active = n === current;
40
+ const reachable = s.reachable ?? n <= current;
41
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react.Fragment, { children: [
42
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
43
+ "button",
44
+ {
45
+ type: "button",
46
+ disabled: !reachable,
47
+ onClick: () => reachable && onStep?.(n),
48
+ "aria-current": active ? "step" : void 0,
49
+ className: (0, import_cn.cn)("flex items-center gap-2 shrink-0", reachable ? "cursor-pointer" : "cursor-default"),
50
+ children: [
51
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
52
+ "span",
53
+ {
54
+ className: (0, import_cn.cn)(
55
+ "flex h-7 w-7 items-center justify-center rounded-full text-xs font-bold transition-colors",
56
+ active ? (0, import_cn.cn)(accentBg, "text-white") : done ? (0, import_cn.cn)("border-2 border-current bg-transparent", accentText) : "bg-muted/40 text-muted-foreground"
57
+ ),
58
+ children: done ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Check, { className: "h-3.5 w-3.5" }) : n
59
+ }
60
+ ),
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
62
+ "span",
63
+ {
64
+ className: (0, import_cn.cn)(
65
+ "hidden sm:inline text-xs sm:text-sm font-semibold transition-colors",
66
+ active ? "text-foreground" : done ? accentText : "text-muted-foreground"
67
+ ),
68
+ children: s.label
69
+ }
70
+ )
71
+ ]
72
+ }
73
+ ),
74
+ idx < steps.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: (0, import_cn.cn)("mx-2 sm:mx-3 h-px flex-1 min-w-3 transition-colors", done ? accentBg : "bg-border") })
75
+ ] }, s.label);
76
+ }) });
77
+ }
78
+ // Annotate the CommonJS export names for ESM import in node:
79
+ 0 && (module.exports = {
80
+ StepNav
81
+ });
82
+ //# sourceMappingURL=step-nav.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/step-nav.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface StepNavStep {\n label: string;\n /** Whether the step can be navigated to. Defaults to \"any step up to the\n * current one\" when omitted. */\n reachable?: boolean;\n}\n\nexport interface StepNavProps {\n /** Ordered steps. */\n steps: StepNavStep[];\n /** 1-based index of the active step. */\n current: number;\n /** Called with the 1-based step index when a reachable step is clicked. */\n onStep?: (step: number) => void;\n /** Tailwind text-color class for the active/completed accent (e.g. \"text-brand-rose\"). */\n accentText?: string;\n /** Tailwind bg-color class for the active dot + completed connector (e.g. \"bg-brand-rose\"). */\n accentBg?: string;\n className?: string;\n}\n\n/** Presentation-only step indicator: a connected row of numbered dots —\n * solid accent for the active step, an outlined check for completed steps,\n * muted for upcoming ones, with the connector filling as you progress.\n * Touch-first (no hover-only affordance); labels collapse on mobile. */\nexport function StepNav({\n steps,\n current,\n onStep,\n accentText = \"text-primary\",\n accentBg = \"bg-primary\",\n className,\n}: StepNavProps) {\n return (\n <div className={cn(\"flex items-center\", className)}>\n {steps.map((s, idx) => {\n const n = idx + 1;\n const done = n < current;\n const active = n === current;\n const reachable = s.reachable ?? n <= current;\n return (\n <Fragment key={s.label}>\n <button\n type=\"button\"\n disabled={!reachable}\n onClick={() => reachable && onStep?.(n)}\n aria-current={active ? \"step\" : undefined}\n className={cn(\"flex items-center gap-2 shrink-0\", reachable ? \"cursor-pointer\" : \"cursor-default\")}\n >\n <span\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full text-xs font-bold transition-colors\",\n active\n ? cn(accentBg, \"text-white\")\n : done\n ? cn(\"border-2 border-current bg-transparent\", accentText)\n : \"bg-muted/40 text-muted-foreground\",\n )}\n >\n {done ? <Check className=\"h-3.5 w-3.5\" /> : n}\n </span>\n <span\n className={cn(\n \"hidden sm:inline text-xs sm:text-sm font-semibold transition-colors\",\n active ? \"text-foreground\" : done ? accentText : \"text-muted-foreground\",\n )}\n >\n {s.label}\n </span>\n </button>\n {idx < steps.length - 1 && (\n <span className={cn(\"mx-2 sm:mx-3 h-px flex-1 min-w-3 transition-colors\", done ? accentBg : \"bg-border\")} />\n )}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8CY;AA9CZ,mBAAyB;AACzB,0BAAsB;AACtB,gBAAmB;AA2BZ,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,WAAW;AAAA,EACX;AACF,GAAiB;AACf,SACE,4CAAC,SAAI,eAAW,cAAG,qBAAqB,SAAS,GAC9C,gBAAM,IAAI,CAAC,GAAG,QAAQ;AACrB,UAAM,IAAI,MAAM;AAChB,UAAM,OAAO,IAAI;AACjB,UAAM,SAAS,MAAM;AACrB,UAAM,YAAY,EAAE,aAAa,KAAK;AACtC,WACE,6CAAC,yBACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,CAAC;AAAA,UACX,SAAS,MAAM,aAAa,SAAS,CAAC;AAAA,UACtC,gBAAc,SAAS,SAAS;AAAA,UAChC,eAAW,cAAG,oCAAoC,YAAY,mBAAmB,gBAAgB;AAAA,UAEjG;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,kBACT;AAAA,kBACA,aACI,cAAG,UAAU,YAAY,IACzB,WACE,cAAG,0CAA0C,UAAU,IACvD;AAAA,gBACR;AAAA,gBAEC,iBAAO,4CAAC,6BAAM,WAAU,eAAc,IAAK;AAAA;AAAA,YAC9C;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,kBACT;AAAA,kBACA,SAAS,oBAAoB,OAAO,aAAa;AAAA,gBACnD;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA;AAAA;AAAA,MACF;AAAA,MACC,MAAM,MAAM,SAAS,KACpB,4CAAC,UAAK,eAAW,cAAG,sDAAsD,OAAO,WAAW,WAAW,GAAG;AAAA,SA9B/F,EAAE,KAgCjB;AAAA,EAEJ,CAAC,GACH;AAEJ;","names":[]}
@@ -0,0 +1,28 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface StepNavStep {
4
+ label: string;
5
+ /** Whether the step can be navigated to. Defaults to "any step up to the
6
+ * current one" when omitted. */
7
+ reachable?: boolean;
8
+ }
9
+ interface StepNavProps {
10
+ /** Ordered steps. */
11
+ steps: StepNavStep[];
12
+ /** 1-based index of the active step. */
13
+ current: number;
14
+ /** Called with the 1-based step index when a reachable step is clicked. */
15
+ onStep?: (step: number) => void;
16
+ /** Tailwind text-color class for the active/completed accent (e.g. "text-brand-rose"). */
17
+ accentText?: string;
18
+ /** Tailwind bg-color class for the active dot + completed connector (e.g. "bg-brand-rose"). */
19
+ accentBg?: string;
20
+ className?: string;
21
+ }
22
+ /** Presentation-only step indicator: a connected row of numbered dots —
23
+ * solid accent for the active step, an outlined check for completed steps,
24
+ * muted for upcoming ones, with the connector filling as you progress.
25
+ * Touch-first (no hover-only affordance); labels collapse on mobile. */
26
+ declare function StepNav({ steps, current, onStep, accentText, accentBg, className, }: StepNavProps): react_jsx_runtime.JSX.Element;
27
+
28
+ export { StepNav, type StepNavProps, type StepNavStep };
@@ -0,0 +1,28 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface StepNavStep {
4
+ label: string;
5
+ /** Whether the step can be navigated to. Defaults to "any step up to the
6
+ * current one" when omitted. */
7
+ reachable?: boolean;
8
+ }
9
+ interface StepNavProps {
10
+ /** Ordered steps. */
11
+ steps: StepNavStep[];
12
+ /** 1-based index of the active step. */
13
+ current: number;
14
+ /** Called with the 1-based step index when a reachable step is clicked. */
15
+ onStep?: (step: number) => void;
16
+ /** Tailwind text-color class for the active/completed accent (e.g. "text-brand-rose"). */
17
+ accentText?: string;
18
+ /** Tailwind bg-color class for the active dot + completed connector (e.g. "bg-brand-rose"). */
19
+ accentBg?: string;
20
+ className?: string;
21
+ }
22
+ /** Presentation-only step indicator: a connected row of numbered dots —
23
+ * solid accent for the active step, an outlined check for completed steps,
24
+ * muted for upcoming ones, with the connector filling as you progress.
25
+ * Touch-first (no hover-only affordance); labels collapse on mobile. */
26
+ declare function StepNav({ steps, current, onStep, accentText, accentBg, className, }: StepNavProps): react_jsx_runtime.JSX.Element;
27
+
28
+ export { StepNav, type StepNavProps, type StepNavStep };
@@ -0,0 +1,58 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment } from "react";
3
+ import { Check } from "lucide-react";
4
+ import { cn } from "../utils/cn.js";
5
+ function StepNav({
6
+ steps,
7
+ current,
8
+ onStep,
9
+ accentText = "text-primary",
10
+ accentBg = "bg-primary",
11
+ className
12
+ }) {
13
+ return /* @__PURE__ */ jsx("div", { className: cn("flex items-center", className), children: steps.map((s, idx) => {
14
+ const n = idx + 1;
15
+ const done = n < current;
16
+ const active = n === current;
17
+ const reachable = s.reachable ?? n <= current;
18
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
19
+ /* @__PURE__ */ jsxs(
20
+ "button",
21
+ {
22
+ type: "button",
23
+ disabled: !reachable,
24
+ onClick: () => reachable && onStep?.(n),
25
+ "aria-current": active ? "step" : void 0,
26
+ className: cn("flex items-center gap-2 shrink-0", reachable ? "cursor-pointer" : "cursor-default"),
27
+ children: [
28
+ /* @__PURE__ */ jsx(
29
+ "span",
30
+ {
31
+ className: cn(
32
+ "flex h-7 w-7 items-center justify-center rounded-full text-xs font-bold transition-colors",
33
+ active ? cn(accentBg, "text-white") : done ? cn("border-2 border-current bg-transparent", accentText) : "bg-muted/40 text-muted-foreground"
34
+ ),
35
+ children: done ? /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5" }) : n
36
+ }
37
+ ),
38
+ /* @__PURE__ */ jsx(
39
+ "span",
40
+ {
41
+ className: cn(
42
+ "hidden sm:inline text-xs sm:text-sm font-semibold transition-colors",
43
+ active ? "text-foreground" : done ? accentText : "text-muted-foreground"
44
+ ),
45
+ children: s.label
46
+ }
47
+ )
48
+ ]
49
+ }
50
+ ),
51
+ idx < steps.length - 1 && /* @__PURE__ */ jsx("span", { className: cn("mx-2 sm:mx-3 h-px flex-1 min-w-3 transition-colors", done ? accentBg : "bg-border") })
52
+ ] }, s.label);
53
+ }) });
54
+ }
55
+ export {
56
+ StepNav
57
+ };
58
+ //# sourceMappingURL=step-nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/step-nav.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface StepNavStep {\n label: string;\n /** Whether the step can be navigated to. Defaults to \"any step up to the\n * current one\" when omitted. */\n reachable?: boolean;\n}\n\nexport interface StepNavProps {\n /** Ordered steps. */\n steps: StepNavStep[];\n /** 1-based index of the active step. */\n current: number;\n /** Called with the 1-based step index when a reachable step is clicked. */\n onStep?: (step: number) => void;\n /** Tailwind text-color class for the active/completed accent (e.g. \"text-brand-rose\"). */\n accentText?: string;\n /** Tailwind bg-color class for the active dot + completed connector (e.g. \"bg-brand-rose\"). */\n accentBg?: string;\n className?: string;\n}\n\n/** Presentation-only step indicator: a connected row of numbered dots —\n * solid accent for the active step, an outlined check for completed steps,\n * muted for upcoming ones, with the connector filling as you progress.\n * Touch-first (no hover-only affordance); labels collapse on mobile. */\nexport function StepNav({\n steps,\n current,\n onStep,\n accentText = \"text-primary\",\n accentBg = \"bg-primary\",\n className,\n}: StepNavProps) {\n return (\n <div className={cn(\"flex items-center\", className)}>\n {steps.map((s, idx) => {\n const n = idx + 1;\n const done = n < current;\n const active = n === current;\n const reachable = s.reachable ?? n <= current;\n return (\n <Fragment key={s.label}>\n <button\n type=\"button\"\n disabled={!reachable}\n onClick={() => reachable && onStep?.(n)}\n aria-current={active ? \"step\" : undefined}\n className={cn(\"flex items-center gap-2 shrink-0\", reachable ? \"cursor-pointer\" : \"cursor-default\")}\n >\n <span\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full text-xs font-bold transition-colors\",\n active\n ? cn(accentBg, \"text-white\")\n : done\n ? cn(\"border-2 border-current bg-transparent\", accentText)\n : \"bg-muted/40 text-muted-foreground\",\n )}\n >\n {done ? <Check className=\"h-3.5 w-3.5\" /> : n}\n </span>\n <span\n className={cn(\n \"hidden sm:inline text-xs sm:text-sm font-semibold transition-colors\",\n active ? \"text-foreground\" : done ? accentText : \"text-muted-foreground\",\n )}\n >\n {s.label}\n </span>\n </button>\n {idx < steps.length - 1 && (\n <span className={cn(\"mx-2 sm:mx-3 h-px flex-1 min-w-3 transition-colors\", done ? accentBg : \"bg-border\")} />\n )}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":"AA8CY,SAiBY,KAjBZ;AA9CZ,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,UAAU;AA2BZ,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,WAAW;AAAA,EACX;AACF,GAAiB;AACf,SACE,oBAAC,SAAI,WAAW,GAAG,qBAAqB,SAAS,GAC9C,gBAAM,IAAI,CAAC,GAAG,QAAQ;AACrB,UAAM,IAAI,MAAM;AAChB,UAAM,OAAO,IAAI;AACjB,UAAM,SAAS,MAAM;AACrB,UAAM,YAAY,EAAE,aAAa,KAAK;AACtC,WACE,qBAAC,YACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,CAAC;AAAA,UACX,SAAS,MAAM,aAAa,SAAS,CAAC;AAAA,UACtC,gBAAc,SAAS,SAAS;AAAA,UAChC,WAAW,GAAG,oCAAoC,YAAY,mBAAmB,gBAAgB;AAAA,UAEjG;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,SACI,GAAG,UAAU,YAAY,IACzB,OACE,GAAG,0CAA0C,UAAU,IACvD;AAAA,gBACR;AAAA,gBAEC,iBAAO,oBAAC,SAAM,WAAU,eAAc,IAAK;AAAA;AAAA,YAC9C;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,SAAS,oBAAoB,OAAO,aAAa;AAAA,gBACnD;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA;AAAA;AAAA,MACF;AAAA,MACC,MAAM,MAAM,SAAS,KACpB,oBAAC,UAAK,WAAW,GAAG,sDAAsD,OAAO,WAAW,WAAW,GAAG;AAAA,SA9B/F,EAAE,KAgCjB;AAAA,EAEJ,CAAC,GACH;AAEJ;","names":[]}
package/dist/index.cjs CHANGED
@@ -29,8 +29,10 @@ __export(index_exports, {
29
29
  AddressDisplay: () => import_address_display.AddressDisplay,
30
30
  AssetCard: () => import_asset_card.AssetCard,
31
31
  AssetCardSkeleton: () => import_asset_card.AssetCardSkeleton,
32
+ AssetCollectionBar: () => import_asset_collection_bar.AssetCollectionBar,
32
33
  AssetHeaderBlock: () => import_asset_top_sections.AssetHeaderBlock,
33
34
  AssetLicenseSummary: () => import_asset_license_summary.AssetLicenseSummary,
35
+ AssetMarketplacePanel: () => import_asset_marketplace_panel.AssetMarketplacePanel,
34
36
  AssetMarketsTab: () => import_asset_markets_tab.AssetMarketsTab,
35
37
  AssetMediaColumn: () => import_asset_top_sections.AssetMediaColumn,
36
38
  AssetOverviewContent: () => import_asset_overview_content.AssetOverviewContent,
@@ -93,6 +95,7 @@ __export(index_exports, {
93
95
  ShareButton: () => import_share_button.ShareButton,
94
96
  Stagger: () => import_motion_primitives.Stagger,
95
97
  StaggerItem: () => import_motion_primitives.StaggerItem,
98
+ StepNav: () => import_step_nav.StepNav,
96
99
  TEMPLATE_TRAIT_TYPES: () => import_ip_templates.TEMPLATE_TRAIT_TYPES,
97
100
  TYPE_FILTERS: () => import_activity.TYPE_FILTERS,
98
101
  TokenCard: () => import_token_card.TokenCard,
@@ -106,6 +109,7 @@ __export(index_exports, {
106
109
  formatFdv: () => import_coins.formatFdv,
107
110
  ipfsToHttp: () => import_ipfs.ipfsToHttp,
108
111
  licenseSummary: () => import_license_summary.licenseSummary,
112
+ parsePriceDisplay: () => import_format.parsePriceDisplay,
109
113
  shortenAddress: () => import_address.shortenAddress,
110
114
  timeAgo: () => import_time.timeAgo,
111
115
  timeUntil: () => import_time.timeUntil,
@@ -126,6 +130,8 @@ var import_asset_license_summary = require("./components/asset-license-summary.j
126
130
  var import_asset_markets_tab = require("./components/asset-markets-tab.js");
127
131
  var import_parent_attribution_banner = require("./components/parent-attribution-banner.js");
128
132
  var import_asset_top_sections = require("./components/asset-top-sections.js");
133
+ var import_asset_collection_bar = require("./components/asset-collection-bar.js");
134
+ var import_asset_marketplace_panel = require("./components/asset-marketplace-panel.js");
129
135
  var import_brand = require("./data/brand.js");
130
136
  var import_currency_icon = require("./components/currency-icon.js");
131
137
  var import_ip_type_badge = require("./components/ip-type-badge.js");
@@ -165,6 +171,7 @@ var import_portfolio_counts = require("./utils/portfolio-counts.js");
165
171
  var import_service_header = require("./components/service-header.js");
166
172
  var import_claim_rail = require("./components/claim-rail.js");
167
173
  var import_service_form_shell = require("./components/service-form-shell.js");
174
+ var import_step_nav = require("./components/step-nav.js");
168
175
  // Annotate the CommonJS export names for ESM import in node:
169
176
  0 && (module.exports = {
170
177
  ACTIVITY_MESSAGES,
@@ -178,8 +185,10 @@ var import_service_form_shell = require("./components/service-form-shell.js");
178
185
  AddressDisplay,
179
186
  AssetCard,
180
187
  AssetCardSkeleton,
188
+ AssetCollectionBar,
181
189
  AssetHeaderBlock,
182
190
  AssetLicenseSummary,
191
+ AssetMarketplacePanel,
183
192
  AssetMarketsTab,
184
193
  AssetMediaColumn,
185
194
  AssetOverviewContent,
@@ -242,6 +251,7 @@ var import_service_form_shell = require("./components/service-form-shell.js");
242
251
  ShareButton,
243
252
  Stagger,
244
253
  StaggerItem,
254
+ StepNav,
245
255
  TEMPLATE_TRAIT_TYPES,
246
256
  TYPE_FILTERS,
247
257
  TokenCard,
@@ -255,6 +265,7 @@ var import_service_form_shell = require("./components/service-form-shell.js");
255
265
  formatFdv,
256
266
  ipfsToHttp,
257
267
  licenseSummary,
268
+ parsePriceDisplay,
258
269
  shortenAddress,
259
270
  timeAgo,
260
271
  timeUntil,
@@ -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\";\nexport { licenseSummary } from \"./utils/license-summary.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 {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, buildEditionStats } from \"./components/asset-top-sections.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 { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.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\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } 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 { 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\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from \"./components/launchpad-services.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.6.0 additions — portfolio subnav + counts ────────────────────────────\nexport { PortfolioSubnav } from \"./components/portfolio-subnav.js\";\nexport type {\n PortfolioSubnavProps,\n PortfolioNavItem,\n PortfolioNavGroup,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-subnav.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n\n// ── v0.22.0 additions — launchpad/claim form template primitives ─────────────\n// Pure-presentation header + rail shared by every launchpad/claim form. The\n// app supplies its own gate, back button, and form logic. Requires the\n// `.btn-border-animated` class (in @medialane/ui/styles) for the form shell.\nexport { ServiceHeader } from \"./components/service-header.js\";\nexport type { ServiceHeaderProps } from \"./components/service-header.js\";\nexport { ClaimRail } from \"./components/claim-rail.js\";\nexport type { ClaimRailProps } from \"./components/claim-rail.js\";\n\n// ── v0.23.0 additions — slot-based form shell ────────────────────────────────\n// Pure layout (back slot + header + animated-border compartment + 8/4 bento).\n// No auth/router — the app injects its own gate (around children) + back button.\nexport { ServiceFormShell } from \"./components/service-form-shell.js\";\nexport type { ServiceFormShellProps } from \"./components/service-form-shell.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;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;AAC3B,6BAA+B;AAG/B,sBAA+C;AAE/C,gBAGO;AAEP,0BAEO;AAEP,6BAA8B;AAC9B,oCAAqC;AACrC,mCAAoC;AACpC,+BAAgC;AAChC,uCAAwC;AAExC,gCAAsE;AACtE,mBAAsB;AAGtB,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAA8B;AAE9B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAE7C,wBAA6C;AAG7C,mBAGO;AACP,uBAA2F;AAC3F,4BAGO;AAGP,kBAAmC;AACnC,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAAoC;AAEpC,2BAAsE;AAItE,gCAA6E;AAC7E,6BAA+B;AAG/B,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,8BAAgC;AAOhC,8BAAsC;AAOtC,4BAA8B;AAE9B,wBAA0B;AAM1B,gCAAiC;","names":["import_launchpad_services"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ── Utils ─────────────────────────────────────────────────────────────────────\nexport { cn } from \"./utils/cn.js\";\nexport { formatDisplayPrice, parsePriceDisplay } from \"./utils/format.js\";\nexport { shortenAddress } from \"./utils/address.js\";\nexport { ipfsToHttp } from \"./utils/ipfs.js\";\nexport { licenseSummary } from \"./utils/license-summary.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 {\n IP_TYPES, LICENSE_TYPES, GEOGRAPHIC_SCOPES, AI_POLICIES,\n DERIVATIVES_OPTIONS, LICENSE_TRAIT_TYPES,\n} from \"./data/ip.js\";\nexport type { IPType, LicenseType } from \"./data/ip.js\";\nexport {\n IP_TEMPLATES, EMBED_PLATFORM_META, SOCIAL_PLATFORM_META, TEMPLATE_TRAIT_TYPES, DOC_UPLOAD,\n} from \"./data/ip-templates.js\";\nexport type { EmbedPlatform, SocialPlatform, TraitSuggestion, IPTemplate, DocUploadConfig } from \"./data/ip-templates.js\";\nexport { IPTypeDisplay } from \"./components/ip-type-display.js\";\nexport { AssetOverviewContent } from \"./components/asset-overview-content.js\";\nexport { AssetLicenseSummary } from \"./components/asset-license-summary.js\";\nexport { AssetMarketsTab } from \"./components/asset-markets-tab.js\";\nexport { ParentAttributionBanner } from \"./components/parent-attribution-banner.js\";\nexport type { ParentBannerProps } from \"./components/parent-attribution-banner.js\";\nexport { AssetMediaColumn, AssetHeaderBlock, buildEditionStats } from \"./components/asset-top-sections.js\";\nexport { AssetCollectionBar } from \"./components/asset-collection-bar.js\";\nexport type { AssetCollectionBarProps, AssetCollectionBarSibling } from \"./components/asset-collection-bar.js\";\nexport { AssetMarketplacePanel } from \"./components/asset-marketplace-panel.js\";\nexport type { AssetMarketplacePanelProps, ApiOrderLike } from \"./components/asset-marketplace-panel.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 { PageContainer } from \"./components/page-container.js\";\nexport type { PageContainerProps } from \"./components/page-container.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\";\nexport { AssetCard, AssetCardSkeleton } from \"./components/asset-card.js\";\nexport type { AssetCardProps, AssetCardPrice } from \"./components/asset-card.js\";\n// ── Coin discovery (chain-agnostic; price/data/href injected by the app) ─────\nexport {\n coinKind, formatCoinPrice, formatFdv,\n type CoinKind, type CoinCollectionLike, type CoinPriceLike,\n} from \"./data/coins.js\";\nexport { CoinCard, CoinRow, CoinCardSkeleton, type UseCoinPrice, type CoinTileProps } from \"./components/coin-card.js\";\nexport {\n CoinsExplorer,\n type CoinsExplorerProps, type CoinFilter, type CoinSort, type UseCoins,\n} from \"./components/coins-explorer.js\";\n\n// ── v0.3 additions ────────────────────────────────────────────────────────────\nexport { timeAgo, timeUntil } 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 { 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\";\nexport { ActivityCard, ActivityCardSkeleton, ACTIVITY_MESSAGES } from \"./components/activity-card.js\";\nexport type { ActivityCardProps } from \"./components/activity-card.js\";\n\n// ── Launchpad (grouped sections — single page-UI source since 0.8.0) ─────────\nexport { LaunchpadGroupedSections, LaunchpadServiceCard, SERVICE_HUES } from \"./components/launchpad-services.js\";\nexport { LaunchpadStrip } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadStripProps } from \"./components/launchpad-strip.js\";\nexport type { LaunchpadGroupedSectionsProps, LaunchpadServiceCardProps, ServiceOverride, ServiceOverrides } from \"./components/launchpad-services.js\";\nexport { LAUNCHPAD_SERVICE_DEFINITIONS, LAUNCHPAD_SERVICE_GROUPS } from \"./data/launchpad-services.js\";\nexport type { ServiceDefinition, ServiceStatus, ServiceCategory, ServiceGroup, ServiceGroupDefinition } from \"./data/launchpad-services.js\";\n\n// ── v0.5.0 additions ─────────────────────────────────────────────────────────\nexport { NavCommandMenu, useNavCommandMenu } from \"./components/nav-command-menu.js\";\nexport type { NavCommand, NavCommandGroup, NavCommandMenuProps } from \"./components/nav-command-menu.js\";\n\n// ── v0.6.0 additions — portfolio subnav + counts ────────────────────────────\nexport { PortfolioSubnav } from \"./components/portfolio-subnav.js\";\nexport type {\n PortfolioSubnavProps,\n PortfolioNavItem,\n PortfolioNavGroup,\n PortfolioBadgeVariant,\n} from \"./components/portfolio-subnav.js\";\nexport { derivePortfolioCounts } from \"./utils/portfolio-counts.js\";\nexport type { PortfolioCounts, CountableOrder } from \"./utils/portfolio-counts.js\";\n\n// ── v0.22.0 additions — launchpad/claim form template primitives ─────────────\n// Pure-presentation header + rail shared by every launchpad/claim form. The\n// app supplies its own gate, back button, and form logic. Requires the\n// `.btn-border-animated` class (in @medialane/ui/styles) for the form shell.\nexport { ServiceHeader } from \"./components/service-header.js\";\nexport type { ServiceHeaderProps } from \"./components/service-header.js\";\nexport { ClaimRail } from \"./components/claim-rail.js\";\nexport type { ClaimRailProps } from \"./components/claim-rail.js\";\n\n// ── v0.23.0 additions — slot-based form shell ────────────────────────────────\n// Pure layout (back slot + header + animated-border compartment + 8/4 bento).\n// No auth/router — the app injects its own gate (around children) + back button.\nexport { ServiceFormShell } from \"./components/service-form-shell.js\";\nexport type { ServiceFormShellProps } from \"./components/service-form-shell.js\";\nexport { StepNav } from \"./components/step-nav.js\";\nexport type { StepNavProps, StepNavStep } from \"./components/step-nav.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;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,oBAAsD;AACtD,qBAA+B;AAC/B,kBAA2B;AAC3B,6BAA+B;AAG/B,sBAA+C;AAE/C,gBAGO;AAEP,0BAEO;AAEP,6BAA8B;AAC9B,oCAAqC;AACrC,mCAAoC;AACpC,+BAAgC;AAChC,uCAAwC;AAExC,gCAAsE;AACtE,kCAAmC;AAEnC,qCAAsC;AAEtC,mBAAsB;AAGtB,2BAA6C;AAG7C,2BAAyD;AAGzD,6BAA+B;AAG/B,wBAA8B;AAE9B,wBAAkC;AAIlC,+BAAyF;AACzF,4BAA8B;AAE9B,4BAA8B;AAE9B,0BAA4B;AAE5B,6BAAuD;AAEvD,wBAA6C;AAE7C,wBAA6C;AAG7C,mBAGO;AACP,uBAA2F;AAC3F,4BAGO;AAGP,kBAAmC;AACnC,sBAAmD;AAEnD,yBAA+C;AAE/C,6BAA+B;AAE/B,0BAAiD;AAEjD,0BAA4B;AAE5B,iCAAkC;AAElC,2BAA4B;AAI5B,2BAA6B;AAE7B,+BAA2D;AAE3D,wCAAyC;AAEzC,qCAAsC;AAEtC,mCAAoC;AAEpC,2BAAsE;AAItE,gCAA6E;AAC7E,6BAA+B;AAG/B,IAAAA,6BAAwE;AAIxE,8BAAkD;AAIlD,8BAAgC;AAOhC,8BAAsC;AAOtC,4BAA8B;AAE9B,wBAA0B;AAM1B,gCAAiC;AAEjC,sBAAwB;","names":["import_launchpad_services"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { cn } from './utils/cn.cjs';
2
- export { formatDisplayPrice } from './utils/format.cjs';
2
+ export { formatDisplayPrice, parsePriceDisplay } from './utils/format.cjs';
3
3
  export { shortenAddress } from './utils/address.cjs';
4
4
  export { ipfsToHttp } from './utils/ipfs.cjs';
5
5
  export { licenseSummary } from './utils/license-summary.cjs';
@@ -12,6 +12,8 @@ export { AssetLicenseSummary } from './components/asset-license-summary.cjs';
12
12
  export { AssetMarketsTab } from './components/asset-markets-tab.cjs';
13
13
  export { ParentAttributionBanner, ParentBannerProps } from './components/parent-attribution-banner.cjs';
14
14
  export { AssetHeaderBlock, AssetMediaColumn, buildEditionStats } from './components/asset-top-sections.cjs';
15
+ export { AssetCollectionBar, AssetCollectionBarProps, AssetCollectionBarSibling } from './components/asset-collection-bar.cjs';
16
+ export { ApiOrderLike, AssetMarketplacePanel, AssetMarketplacePanelProps } from './components/asset-marketplace-panel.cjs';
15
17
  export { BRAND } from './data/brand.cjs';
16
18
  export { CurrencyAmount, CurrencyAmountProps, CurrencyIcon, CurrencyIconProps } from './components/currency-icon.cjs';
17
19
  export { IP_TYPE_CONFIG, IP_TYPE_MAP, IpTypeBadge, IpTypeBadgeProps, IpTypeConfig } from './components/ip-type-badge.cjs';
@@ -51,9 +53,10 @@ export { CountableOrder, PortfolioCounts, derivePortfolioCounts } from './utils/
51
53
  export { ServiceHeader, ServiceHeaderProps } from './components/service-header.cjs';
52
54
  export { ClaimRail, ClaimRailProps } from './components/claim-rail.cjs';
53
55
  export { ServiceFormShell, ServiceFormShellProps } from './components/service-form-shell.cjs';
56
+ export { StepNav, StepNavProps, StepNavStep } from './components/step-nav.cjs';
54
57
  import 'clsx';
55
58
  import 'lucide-react';
56
59
  import 'react/jsx-runtime';
57
60
  import '@medialane/sdk';
58
- import 'framer-motion';
59
61
  import 'react';
62
+ import 'framer-motion';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { cn } from './utils/cn.js';
2
- export { formatDisplayPrice } from './utils/format.js';
2
+ export { formatDisplayPrice, parsePriceDisplay } from './utils/format.js';
3
3
  export { shortenAddress } from './utils/address.js';
4
4
  export { ipfsToHttp } from './utils/ipfs.js';
5
5
  export { licenseSummary } from './utils/license-summary.js';
@@ -12,6 +12,8 @@ export { AssetLicenseSummary } from './components/asset-license-summary.js';
12
12
  export { AssetMarketsTab } from './components/asset-markets-tab.js';
13
13
  export { ParentAttributionBanner, ParentBannerProps } from './components/parent-attribution-banner.js';
14
14
  export { AssetHeaderBlock, AssetMediaColumn, buildEditionStats } from './components/asset-top-sections.js';
15
+ export { AssetCollectionBar, AssetCollectionBarProps, AssetCollectionBarSibling } from './components/asset-collection-bar.js';
16
+ export { ApiOrderLike, AssetMarketplacePanel, AssetMarketplacePanelProps } from './components/asset-marketplace-panel.js';
15
17
  export { BRAND } from './data/brand.js';
16
18
  export { CurrencyAmount, CurrencyAmountProps, CurrencyIcon, CurrencyIconProps } from './components/currency-icon.js';
17
19
  export { IP_TYPE_CONFIG, IP_TYPE_MAP, IpTypeBadge, IpTypeBadgeProps, IpTypeConfig } from './components/ip-type-badge.js';
@@ -51,9 +53,10 @@ export { CountableOrder, PortfolioCounts, derivePortfolioCounts } from './utils/
51
53
  export { ServiceHeader, ServiceHeaderProps } from './components/service-header.js';
52
54
  export { ClaimRail, ClaimRailProps } from './components/claim-rail.js';
53
55
  export { ServiceFormShell, ServiceFormShellProps } from './components/service-form-shell.js';
56
+ export { StepNav, StepNavProps, StepNavStep } from './components/step-nav.js';
54
57
  import 'clsx';
55
58
  import 'lucide-react';
56
59
  import 'react/jsx-runtime';
57
60
  import '@medialane/sdk';
58
- import 'framer-motion';
59
61
  import 'react';
62
+ import 'framer-motion';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { cn } from "./utils/cn.js";
2
- import { formatDisplayPrice } from "./utils/format.js";
2
+ import { formatDisplayPrice, parsePriceDisplay } from "./utils/format.js";
3
3
  import { shortenAddress } from "./utils/address.js";
4
4
  import { ipfsToHttp } from "./utils/ipfs.js";
5
5
  import { licenseSummary } from "./utils/license-summary.js";
@@ -25,6 +25,8 @@ import { AssetLicenseSummary } from "./components/asset-license-summary.js";
25
25
  import { AssetMarketsTab } from "./components/asset-markets-tab.js";
26
26
  import { ParentAttributionBanner } from "./components/parent-attribution-banner.js";
27
27
  import { AssetMediaColumn, AssetHeaderBlock, buildEditionStats } from "./components/asset-top-sections.js";
28
+ import { AssetCollectionBar } from "./components/asset-collection-bar.js";
29
+ import { AssetMarketplacePanel } from "./components/asset-marketplace-panel.js";
28
30
  import { BRAND } from "./data/brand.js";
29
31
  import { CurrencyIcon, CurrencyAmount } from "./components/currency-icon.js";
30
32
  import { IpTypeBadge, IP_TYPE_CONFIG, IP_TYPE_MAP } from "./components/ip-type-badge.js";
@@ -70,6 +72,7 @@ import { derivePortfolioCounts } from "./utils/portfolio-counts.js";
70
72
  import { ServiceHeader } from "./components/service-header.js";
71
73
  import { ClaimRail } from "./components/claim-rail.js";
72
74
  import { ServiceFormShell } from "./components/service-form-shell.js";
75
+ import { StepNav } from "./components/step-nav.js";
73
76
  export {
74
77
  ACTIVITY_MESSAGES,
75
78
  ACTIVITY_TYPE_CONFIG,
@@ -82,8 +85,10 @@ export {
82
85
  AddressDisplay,
83
86
  AssetCard,
84
87
  AssetCardSkeleton,
88
+ AssetCollectionBar,
85
89
  AssetHeaderBlock,
86
90
  AssetLicenseSummary,
91
+ AssetMarketplacePanel,
87
92
  AssetMarketsTab,
88
93
  AssetMediaColumn,
89
94
  AssetOverviewContent,
@@ -146,6 +151,7 @@ export {
146
151
  ShareButton,
147
152
  Stagger,
148
153
  StaggerItem,
154
+ StepNav,
149
155
  TEMPLATE_TRAIT_TYPES,
150
156
  TYPE_FILTERS,
151
157
  TokenCard,
@@ -159,6 +165,7 @@ export {
159
165
  formatFdv,
160
166
  ipfsToHttp,
161
167
  licenseSummary,
168
+ parsePriceDisplay,
162
169
  shortenAddress,
163
170
  timeAgo,
164
171
  timeUntil,