@medialane/ui 0.145.0 → 0.146.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 (71) hide show
  1. package/dist/components/collapsible-section.cjs +69 -0
  2. package/dist/components/collapsible-section.cjs.map +1 -0
  3. package/dist/components/collapsible-section.d.cts +15 -0
  4. package/dist/components/collapsible-section.d.ts +15 -0
  5. package/dist/components/collapsible-section.js +45 -0
  6. package/dist/components/collapsible-section.js.map +1 -0
  7. package/dist/components/drop-create-form.cjs +341 -0
  8. package/dist/components/drop-create-form.cjs.map +1 -0
  9. package/dist/components/drop-create-form.d.cts +39 -0
  10. package/dist/components/drop-create-form.d.ts +39 -0
  11. package/dist/components/drop-create-form.js +322 -0
  12. package/dist/components/drop-create-form.js.map +1 -0
  13. package/dist/components/drop-preview-card.cjs +79 -0
  14. package/dist/components/drop-preview-card.cjs.map +1 -0
  15. package/dist/components/drop-preview-card.d.cts +17 -0
  16. package/dist/components/drop-preview-card.d.ts +17 -0
  17. package/dist/components/drop-preview-card.js +55 -0
  18. package/dist/components/drop-preview-card.js.map +1 -0
  19. package/dist/components/drop-preview-card.test.cjs +57 -0
  20. package/dist/components/drop-preview-card.test.cjs.map +1 -0
  21. package/dist/components/drop-preview-card.test.d.cts +2 -0
  22. package/dist/components/drop-preview-card.test.d.ts +2 -0
  23. package/dist/components/drop-preview-card.test.js +56 -0
  24. package/dist/components/drop-preview-card.test.js.map +1 -0
  25. package/dist/components/drop-status-display.cjs +103 -0
  26. package/dist/components/drop-status-display.cjs.map +1 -0
  27. package/dist/components/drop-status-display.d.cts +15 -0
  28. package/dist/components/drop-status-display.d.ts +15 -0
  29. package/dist/components/drop-status-display.js +77 -0
  30. package/dist/components/drop-status-display.js.map +1 -0
  31. package/dist/components/drop-status-display.test.cjs +29 -0
  32. package/dist/components/drop-status-display.test.cjs.map +1 -0
  33. package/dist/components/drop-status-display.test.d.cts +2 -0
  34. package/dist/components/drop-status-display.test.d.ts +2 -0
  35. package/dist/components/drop-status-display.test.js +28 -0
  36. package/dist/components/drop-status-display.test.js.map +1 -0
  37. package/dist/components/exclusive-content-section.cjs +88 -0
  38. package/dist/components/exclusive-content-section.cjs.map +1 -0
  39. package/dist/components/exclusive-content-section.d.cts +10 -0
  40. package/dist/components/exclusive-content-section.d.ts +10 -0
  41. package/dist/components/exclusive-content-section.js +64 -0
  42. package/dist/components/exclusive-content-section.js.map +1 -0
  43. package/dist/data/drop-create-schema.cjs +8 -1
  44. package/dist/data/drop-create-schema.cjs.map +1 -1
  45. package/dist/data/drop-create-schema.d.cts +20 -0
  46. package/dist/data/drop-create-schema.d.ts +20 -0
  47. package/dist/data/drop-create-schema.js +8 -1
  48. package/dist/data/drop-create-schema.js.map +1 -1
  49. package/dist/data/gated-content-types.cjs +39 -0
  50. package/dist/data/gated-content-types.cjs.map +1 -0
  51. package/dist/data/gated-content-types.d.cts +12 -0
  52. package/dist/data/gated-content-types.d.ts +12 -0
  53. package/dist/data/gated-content-types.js +14 -0
  54. package/dist/data/gated-content-types.js.map +1 -0
  55. package/dist/data/launchpad-services.cjs +4 -4
  56. package/dist/data/launchpad-services.cjs.map +1 -1
  57. package/dist/data/launchpad-services.js +4 -4
  58. package/dist/data/launchpad-services.js.map +1 -1
  59. package/dist/index.cjs +27 -0
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +8 -1
  62. package/dist/index.d.ts +8 -1
  63. package/dist/index.js +17 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/utils/drop-status.cjs +37 -0
  66. package/dist/utils/drop-status.cjs.map +1 -0
  67. package/dist/utils/drop-status.d.cts +12 -0
  68. package/dist/utils/drop-status.d.ts +12 -0
  69. package/dist/utils/drop-status.js +13 -0
  70. package/dist/utils/drop-status.js.map +1 -0
  71. package/package.json +1 -1
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { Lock } from "lucide-react";
4
+ import { FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription } from "./form.js";
5
+ import { Input } from "./input.js";
6
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.js";
7
+ import { Switch } from "./switch.js";
8
+ import { CollapsibleSection } from "./collapsible-section.js";
9
+ import { GATED_CONTENT_TYPES } from "../data/gated-content-types.js";
10
+ const CONTENT_TYPES = Object.keys(GATED_CONTENT_TYPES).map((value) => ({
11
+ value,
12
+ label: value.charAt(0) + value.slice(1).toLowerCase()
13
+ }));
14
+ function ExclusiveContentSection({ form }) {
15
+ const gatedEnabled = form.watch("gatedEnabled");
16
+ return /* @__PURE__ */ jsxs(
17
+ CollapsibleSection,
18
+ {
19
+ open: gatedEnabled,
20
+ onOpenChange: (o) => form.setValue("gatedEnabled", o),
21
+ icon: /* @__PURE__ */ jsx(Lock, { className: "h-4 w-4 text-primary" }),
22
+ label: "Exclusive Content",
23
+ hint: gatedEnabled ? "Holders get a locked tab with this content" : "Optional \xB7 reward holders with gated content",
24
+ children: [
25
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Reward your holders with exclusive access \u2014 video, audio, documents, or any link. Only verified token holders can access this content." }),
26
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
27
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: "Enable exclusive content" }),
28
+ /* @__PURE__ */ jsx(
29
+ Switch,
30
+ {
31
+ checked: gatedEnabled,
32
+ onCheckedChange: (checked) => form.setValue("gatedEnabled", checked)
33
+ }
34
+ )
35
+ ] }),
36
+ gatedEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
37
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "gatedContentTitle", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
38
+ /* @__PURE__ */ jsx(FormLabel, { children: "Content title" }),
39
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { placeholder: "e.g. Behind-the-scenes footage", ...field }) }),
40
+ /* @__PURE__ */ jsx(FormMessage, {})
41
+ ] }) }),
42
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "gatedContentUrl", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
43
+ /* @__PURE__ */ jsx(FormLabel, { children: "Content URL" }),
44
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(Input, { placeholder: "https://\u2026", ...field }) }),
45
+ /* @__PURE__ */ jsx(FormDescription, { children: "Only holders will see this URL. Use a private or unlisted link." }),
46
+ /* @__PURE__ */ jsx(FormMessage, {})
47
+ ] }) }),
48
+ /* @__PURE__ */ jsx(FormField, { control: form.control, name: "gatedContentType", render: ({ field }) => /* @__PURE__ */ jsxs(FormItem, { children: [
49
+ /* @__PURE__ */ jsx(FormLabel, { children: "Content type" }),
50
+ /* @__PURE__ */ jsxs(Select, { value: field.value, onValueChange: field.onChange, children: [
51
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select type" }) }) }),
52
+ /* @__PURE__ */ jsx(SelectContent, { children: CONTENT_TYPES.map(({ value, label }) => /* @__PURE__ */ jsx(SelectItem, { value, children: label }, value)) })
53
+ ] }),
54
+ /* @__PURE__ */ jsx(FormMessage, {})
55
+ ] }) })
56
+ ] })
57
+ ]
58
+ }
59
+ );
60
+ }
61
+ export {
62
+ ExclusiveContentSection
63
+ };
64
+ //# sourceMappingURL=exclusive-content-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/exclusive-content-section.tsx"],"sourcesContent":["\"use client\";\n\nimport type { UseFormReturn } from \"react-hook-form\";\nimport { Lock } from \"lucide-react\";\nimport { FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription } from \"./form.js\";\nimport { Input } from \"./input.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"./select.js\";\nimport { Switch } from \"./switch.js\";\nimport { CollapsibleSection } from \"./collapsible-section.js\";\nimport { GATED_CONTENT_TYPES } from \"../data/gated-content-types.js\";\nimport type { DropCreateFormValues } from \"../data/drop-create-schema.js\";\n\nconst CONTENT_TYPES = Object.keys(GATED_CONTENT_TYPES).map((value) => ({\n value,\n label: value.charAt(0) + value.slice(1).toLowerCase(),\n}));\n\nexport function ExclusiveContentSection({ form }: { form: UseFormReturn<DropCreateFormValues> }) {\n const gatedEnabled = form.watch(\"gatedEnabled\");\n\n return (\n <CollapsibleSection\n open={gatedEnabled}\n onOpenChange={(o) => form.setValue(\"gatedEnabled\", o)}\n icon={<Lock className=\"h-4 w-4 text-primary\" />}\n label=\"Exclusive Content\"\n hint={gatedEnabled ? \"Holders get a locked tab with this content\" : \"Optional · reward holders with gated content\"}\n >\n <p className=\"text-xs text-muted-foreground\">\n Reward your holders with exclusive access — video, audio, documents, or any link.\n Only verified token holders can access this content.\n </p>\n\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-medium\">Enable exclusive content</p>\n <Switch\n checked={gatedEnabled}\n onCheckedChange={(checked) => form.setValue(\"gatedEnabled\", checked)}\n />\n </div>\n\n {gatedEnabled && (\n <>\n <FormField control={form.control} name=\"gatedContentTitle\" render={({ field }) => (\n <FormItem>\n <FormLabel>Content title</FormLabel>\n <FormControl><Input placeholder=\"e.g. Behind-the-scenes footage\" {...field} /></FormControl>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"gatedContentUrl\" render={({ field }) => (\n <FormItem>\n <FormLabel>Content URL</FormLabel>\n <FormControl><Input placeholder=\"https://…\" {...field} /></FormControl>\n <FormDescription>Only holders will see this URL. Use a private or unlisted link.</FormDescription>\n <FormMessage />\n </FormItem>\n )} />\n\n <FormField control={form.control} name=\"gatedContentType\" render={({ field }) => (\n <FormItem>\n <FormLabel>Content type</FormLabel>\n <Select value={field.value} onValueChange={field.onChange}>\n <FormControl><SelectTrigger><SelectValue placeholder=\"Select type\" /></SelectTrigger></FormControl>\n <SelectContent>\n {CONTENT_TYPES.map(({ value, label }) => <SelectItem key={value} value={value}>{label}</SelectItem>)}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )} />\n </>\n )}\n </CollapsibleSection>\n );\n}\n"],"mappings":";AAwBY,SAkBJ,UAlBI,KASN,YATM;AArBZ,SAAS,YAAY;AACrB,SAAS,aAAa,WAAW,UAAU,WAAW,aAAa,uBAAuB;AAC1F,SAAS,aAAa;AACtB,SAAS,QAAQ,eAAe,YAAY,eAAe,mBAAmB;AAC9E,SAAS,cAAc;AACvB,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AAGpC,MAAM,gBAAgB,OAAO,KAAK,mBAAmB,EAAE,IAAI,CAAC,WAAW;AAAA,EACrE;AAAA,EACA,OAAO,MAAM,OAAO,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,YAAY;AACtD,EAAE;AAEK,SAAS,wBAAwB,EAAE,KAAK,GAAkD;AAC/F,QAAM,eAAe,KAAK,MAAM,cAAc;AAE9C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,cAAc,CAAC,MAAM,KAAK,SAAS,gBAAgB,CAAC;AAAA,MACpD,MAAM,oBAAC,QAAK,WAAU,wBAAuB;AAAA,MAC7C,OAAM;AAAA,MACN,MAAM,eAAe,+CAA+C;AAAA,MAEpE;AAAA,4BAAC,OAAE,WAAU,iCAAgC,yJAG7C;AAAA,QAEA,qBAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,OAAE,WAAU,uBAAsB,sCAAwB;AAAA,UAC3D;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,iBAAiB,CAAC,YAAY,KAAK,SAAS,gBAAgB,OAAO;AAAA;AAAA,UACrE;AAAA,WACF;AAAA,QAEC,gBACC,iCACE;AAAA,8BAAC,aAAU,SAAS,KAAK,SAAS,MAAK,qBAAoB,QAAQ,CAAC,EAAE,MAAM,MAC1E,qBAAC,YACC;AAAA,gCAAC,aAAU,2BAAa;AAAA,YACxB,oBAAC,eAAY,8BAAC,SAAM,aAAY,kCAAkC,GAAG,OAAO,GAAE;AAAA,YAC9E,oBAAC,eAAY;AAAA,aACf,GACC;AAAA,UAEH,oBAAC,aAAU,SAAS,KAAK,SAAS,MAAK,mBAAkB,QAAQ,CAAC,EAAE,MAAM,MACxE,qBAAC,YACC;AAAA,gCAAC,aAAU,yBAAW;AAAA,YACtB,oBAAC,eAAY,8BAAC,SAAM,aAAY,kBAAa,GAAG,OAAO,GAAE;AAAA,YACzD,oBAAC,mBAAgB,6EAA+D;AAAA,YAChF,oBAAC,eAAY;AAAA,aACf,GACC;AAAA,UAEH,oBAAC,aAAU,SAAS,KAAK,SAAS,MAAK,oBAAmB,QAAQ,CAAC,EAAE,MAAM,MACzE,qBAAC,YACC;AAAA,gCAAC,aAAU,0BAAY;AAAA,YACvB,qBAAC,UAAO,OAAO,MAAM,OAAO,eAAe,MAAM,UAC/C;AAAA,kCAAC,eAAY,8BAAC,iBAAc,8BAAC,eAAY,aAAY,eAAc,GAAE,GAAgB;AAAA,cACrF,oBAAC,iBACE,wBAAc,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM,oBAAC,cAAuB,OAAe,mBAAtB,KAA4B,CAAa,GACrG;AAAA,eACF;AAAA,YACA,oBAAC,eAAY;AAAA,aACf,GACC;AAAA,WACL;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -58,7 +58,11 @@ const dropCreateSchema = z.object({
58
58
  endTime: z.string().default("23:59"),
59
59
  maxPerWallet: z.string().regex(/^\d+$/, "Must be a positive integer").refine((v) => parseInt(v, 10) >= 1, "Minimum 1").default("1"),
60
60
  whitelistEnabled: z.boolean().default(false),
61
- allowlistAddresses: z.string().default("")
61
+ allowlistAddresses: z.string().default(""),
62
+ gatedEnabled: z.boolean().default(false),
63
+ gatedContentTitle: z.string().max(100).default(""),
64
+ gatedContentUrl: z.string().default(""),
65
+ gatedContentType: z.string().default("")
62
66
  }).superRefine((values, ctx) => {
63
67
  const start = parseDateTime(values.startDate, values.startTime);
64
68
  const end = parseDateTime(values.endDate, values.endTime);
@@ -77,6 +81,9 @@ const dropCreateSchema = z.object({
77
81
  ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["allowlistAddresses"], message: "Add at least one address, or turn the whitelist off" });
78
82
  }
79
83
  }
84
+ if (values.gatedEnabled && values.gatedContentUrl.trim() === "") {
85
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["gatedContentUrl"], message: "Add a content URL, or turn exclusive content off" });
86
+ }
80
87
  });
81
88
  // Annotate the CommonJS export names for ESM import in node:
82
89
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data/drop-create-schema.ts"],"sourcesContent":["\"use client\";\n\nimport * as z from \"zod\";\nimport { IP_TYPES } from \"./ip.js\";\n\nfunction parseDateTime(date: string, time: string): number | null {\n const t = new Date(`${date}T${time}:00`).getTime();\n return Number.isNaN(t) ? null : t;\n}\n\nexport const dropCreateSchema = z\n .object({\n name: z.string().min(1, \"Collection name required\").max(100),\n symbol: z\n .string()\n .min(1, \"Symbol required\")\n .max(10)\n .regex(/^[A-Z0-9]+$/, \"Uppercase letters and numbers only\"),\n\n ipType: z.enum(IP_TYPES),\n licenseType: z.string().min(1, \"License required\"),\n commercialUse: z.string().default(\"\"),\n derivatives: z.string().default(\"\"),\n attribution: z.string().default(\"\"),\n geographicScope: z.string().default(\"Worldwide\"),\n aiPolicy: z.string().default(\"\"),\n royalty: z.coerce.number().min(0).max(50).default(0),\n descriptionTemplate: z.string().max(500).optional(),\n\n priceAmount: z\n .string()\n .default(\"\")\n .refine((v: string) => v === \"\" || !Number.isNaN(Number(v)), \"Enter a valid price\")\n .refine((v: string) => v === \"\" || Number(v) >= 0, \"Price must be zero or greater\"),\n paymentToken: z.string(),\n startDate: z.string().min(1, \"Start date required\"),\n startTime: z.string().default(\"00:00\"),\n endDate: z.string().min(1, \"End date required\"),\n endTime: z.string().default(\"23:59\"),\n maxPerWallet: z\n .string()\n .regex(/^\\d+$/, \"Must be a positive integer\")\n .refine((v: string) => parseInt(v, 10) >= 1, \"Minimum 1\")\n .default(\"1\"),\n\n whitelistEnabled: z.boolean().default(false),\n allowlistAddresses: z.string().default(\"\"),\n })\n .superRefine((values, ctx) => {\n const start = parseDateTime(values.startDate, values.startTime);\n const end = parseDateTime(values.endDate, values.endTime);\n if (start === null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"startDate\"], message: \"Enter a valid start date and time\" });\n }\n if (end === null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"endDate\"], message: \"Enter a valid end date and time\" });\n }\n if (start !== null && end !== null && end <= start) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"endDate\"], message: \"End time must be after the start time\" });\n }\n\n if (values.whitelistEnabled) {\n const addrs = values.allowlistAddresses.split(/[\\n,\\s]+/).map((a) => a.trim()).filter(Boolean);\n if (addrs.length === 0) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"allowlistAddresses\"], message: \"Add at least one address, or turn the whitelist off\" });\n }\n }\n });\n\nexport type DropCreateFormValues = z.infer<typeof dropCreateSchema>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/data/drop-create-schema.ts"],"sourcesContent":["\"use client\";\n\nimport * as z from \"zod\";\nimport { IP_TYPES } from \"./ip.js\";\n\nfunction parseDateTime(date: string, time: string): number | null {\n const t = new Date(`${date}T${time}:00`).getTime();\n return Number.isNaN(t) ? null : t;\n}\n\nexport const dropCreateSchema = z\n .object({\n name: z.string().min(1, \"Collection name required\").max(100),\n symbol: z\n .string()\n .min(1, \"Symbol required\")\n .max(10)\n .regex(/^[A-Z0-9]+$/, \"Uppercase letters and numbers only\"),\n\n ipType: z.enum(IP_TYPES),\n licenseType: z.string().min(1, \"License required\"),\n commercialUse: z.string().default(\"\"),\n derivatives: z.string().default(\"\"),\n attribution: z.string().default(\"\"),\n geographicScope: z.string().default(\"Worldwide\"),\n aiPolicy: z.string().default(\"\"),\n royalty: z.coerce.number().min(0).max(50).default(0),\n descriptionTemplate: z.string().max(500).optional(),\n\n priceAmount: z\n .string()\n .default(\"\")\n .refine((v: string) => v === \"\" || !Number.isNaN(Number(v)), \"Enter a valid price\")\n .refine((v: string) => v === \"\" || Number(v) >= 0, \"Price must be zero or greater\"),\n paymentToken: z.string(),\n startDate: z.string().min(1, \"Start date required\"),\n startTime: z.string().default(\"00:00\"),\n endDate: z.string().min(1, \"End date required\"),\n endTime: z.string().default(\"23:59\"),\n maxPerWallet: z\n .string()\n .regex(/^\\d+$/, \"Must be a positive integer\")\n .refine((v: string) => parseInt(v, 10) >= 1, \"Minimum 1\")\n .default(\"1\"),\n\n whitelistEnabled: z.boolean().default(false),\n allowlistAddresses: z.string().default(\"\"),\n\n gatedEnabled: z.boolean().default(false),\n gatedContentTitle: z.string().max(100).default(\"\"),\n gatedContentUrl: z.string().default(\"\"),\n gatedContentType: z.string().default(\"\"),\n })\n .superRefine((values, ctx) => {\n const start = parseDateTime(values.startDate, values.startTime);\n const end = parseDateTime(values.endDate, values.endTime);\n if (start === null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"startDate\"], message: \"Enter a valid start date and time\" });\n }\n if (end === null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"endDate\"], message: \"Enter a valid end date and time\" });\n }\n if (start !== null && end !== null && end <= start) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"endDate\"], message: \"End time must be after the start time\" });\n }\n\n if (values.whitelistEnabled) {\n const addrs = values.allowlistAddresses.split(/[\\n,\\s]+/).map((a) => a.trim()).filter(Boolean);\n if (addrs.length === 0) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"allowlistAddresses\"], message: \"Add at least one address, or turn the whitelist off\" });\n }\n }\n\n if (values.gatedEnabled && values.gatedContentUrl.trim() === \"\") {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"gatedContentUrl\"], message: \"Add a content URL, or turn exclusive content off\" });\n }\n });\n\nexport type DropCreateFormValues = z.infer<typeof dropCreateSchema>;\n"],"mappings":"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","names":[]}
@@ -21,6 +21,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
21
21
  maxPerWallet: z.ZodDefault<z.ZodEffects<z.ZodString, string, string>>;
22
22
  whitelistEnabled: z.ZodDefault<z.ZodBoolean>;
23
23
  allowlistAddresses: z.ZodDefault<z.ZodString>;
24
+ gatedEnabled: z.ZodDefault<z.ZodBoolean>;
25
+ gatedContentTitle: z.ZodDefault<z.ZodString>;
26
+ gatedContentUrl: z.ZodDefault<z.ZodString>;
27
+ gatedContentType: z.ZodDefault<z.ZodString>;
24
28
  }, "strip", z.ZodTypeAny, {
25
29
  symbol: string;
26
30
  name: string;
@@ -41,6 +45,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
41
45
  maxPerWallet: string;
42
46
  whitelistEnabled: boolean;
43
47
  allowlistAddresses: string;
48
+ gatedEnabled: boolean;
49
+ gatedContentTitle: string;
50
+ gatedContentUrl: string;
51
+ gatedContentType: string;
44
52
  descriptionTemplate?: string | undefined;
45
53
  }, {
46
54
  symbol: string;
@@ -63,6 +71,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
63
71
  maxPerWallet?: string | undefined;
64
72
  whitelistEnabled?: boolean | undefined;
65
73
  allowlistAddresses?: string | undefined;
74
+ gatedEnabled?: boolean | undefined;
75
+ gatedContentTitle?: string | undefined;
76
+ gatedContentUrl?: string | undefined;
77
+ gatedContentType?: string | undefined;
66
78
  }>, {
67
79
  symbol: string;
68
80
  name: string;
@@ -83,6 +95,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
83
95
  maxPerWallet: string;
84
96
  whitelistEnabled: boolean;
85
97
  allowlistAddresses: string;
98
+ gatedEnabled: boolean;
99
+ gatedContentTitle: string;
100
+ gatedContentUrl: string;
101
+ gatedContentType: string;
86
102
  descriptionTemplate?: string | undefined;
87
103
  }, {
88
104
  symbol: string;
@@ -105,6 +121,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
105
121
  maxPerWallet?: string | undefined;
106
122
  whitelistEnabled?: boolean | undefined;
107
123
  allowlistAddresses?: string | undefined;
124
+ gatedEnabled?: boolean | undefined;
125
+ gatedContentTitle?: string | undefined;
126
+ gatedContentUrl?: string | undefined;
127
+ gatedContentType?: string | undefined;
108
128
  }>;
109
129
  type DropCreateFormValues = z.infer<typeof dropCreateSchema>;
110
130
 
@@ -21,6 +21,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
21
21
  maxPerWallet: z.ZodDefault<z.ZodEffects<z.ZodString, string, string>>;
22
22
  whitelistEnabled: z.ZodDefault<z.ZodBoolean>;
23
23
  allowlistAddresses: z.ZodDefault<z.ZodString>;
24
+ gatedEnabled: z.ZodDefault<z.ZodBoolean>;
25
+ gatedContentTitle: z.ZodDefault<z.ZodString>;
26
+ gatedContentUrl: z.ZodDefault<z.ZodString>;
27
+ gatedContentType: z.ZodDefault<z.ZodString>;
24
28
  }, "strip", z.ZodTypeAny, {
25
29
  symbol: string;
26
30
  name: string;
@@ -41,6 +45,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
41
45
  maxPerWallet: string;
42
46
  whitelistEnabled: boolean;
43
47
  allowlistAddresses: string;
48
+ gatedEnabled: boolean;
49
+ gatedContentTitle: string;
50
+ gatedContentUrl: string;
51
+ gatedContentType: string;
44
52
  descriptionTemplate?: string | undefined;
45
53
  }, {
46
54
  symbol: string;
@@ -63,6 +71,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
63
71
  maxPerWallet?: string | undefined;
64
72
  whitelistEnabled?: boolean | undefined;
65
73
  allowlistAddresses?: string | undefined;
74
+ gatedEnabled?: boolean | undefined;
75
+ gatedContentTitle?: string | undefined;
76
+ gatedContentUrl?: string | undefined;
77
+ gatedContentType?: string | undefined;
66
78
  }>, {
67
79
  symbol: string;
68
80
  name: string;
@@ -83,6 +95,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
83
95
  maxPerWallet: string;
84
96
  whitelistEnabled: boolean;
85
97
  allowlistAddresses: string;
98
+ gatedEnabled: boolean;
99
+ gatedContentTitle: string;
100
+ gatedContentUrl: string;
101
+ gatedContentType: string;
86
102
  descriptionTemplate?: string | undefined;
87
103
  }, {
88
104
  symbol: string;
@@ -105,6 +121,10 @@ declare const dropCreateSchema: z.ZodEffects<z.ZodObject<{
105
121
  maxPerWallet?: string | undefined;
106
122
  whitelistEnabled?: boolean | undefined;
107
123
  allowlistAddresses?: string | undefined;
124
+ gatedEnabled?: boolean | undefined;
125
+ gatedContentTitle?: string | undefined;
126
+ gatedContentUrl?: string | undefined;
127
+ gatedContentType?: string | undefined;
108
128
  }>;
109
129
  type DropCreateFormValues = z.infer<typeof dropCreateSchema>;
110
130
 
@@ -25,7 +25,11 @@ const dropCreateSchema = z.object({
25
25
  endTime: z.string().default("23:59"),
26
26
  maxPerWallet: z.string().regex(/^\d+$/, "Must be a positive integer").refine((v) => parseInt(v, 10) >= 1, "Minimum 1").default("1"),
27
27
  whitelistEnabled: z.boolean().default(false),
28
- allowlistAddresses: z.string().default("")
28
+ allowlistAddresses: z.string().default(""),
29
+ gatedEnabled: z.boolean().default(false),
30
+ gatedContentTitle: z.string().max(100).default(""),
31
+ gatedContentUrl: z.string().default(""),
32
+ gatedContentType: z.string().default("")
29
33
  }).superRefine((values, ctx) => {
30
34
  const start = parseDateTime(values.startDate, values.startTime);
31
35
  const end = parseDateTime(values.endDate, values.endTime);
@@ -44,6 +48,9 @@ const dropCreateSchema = z.object({
44
48
  ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["allowlistAddresses"], message: "Add at least one address, or turn the whitelist off" });
45
49
  }
46
50
  }
51
+ if (values.gatedEnabled && values.gatedContentUrl.trim() === "") {
52
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["gatedContentUrl"], message: "Add a content URL, or turn exclusive content off" });
53
+ }
47
54
  });
48
55
  export {
49
56
  dropCreateSchema
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data/drop-create-schema.ts"],"sourcesContent":["\"use client\";\n\nimport * as z from \"zod\";\nimport { IP_TYPES } from \"./ip.js\";\n\nfunction parseDateTime(date: string, time: string): number | null {\n const t = new Date(`${date}T${time}:00`).getTime();\n return Number.isNaN(t) ? null : t;\n}\n\nexport const dropCreateSchema = z\n .object({\n name: z.string().min(1, \"Collection name required\").max(100),\n symbol: z\n .string()\n .min(1, \"Symbol required\")\n .max(10)\n .regex(/^[A-Z0-9]+$/, \"Uppercase letters and numbers only\"),\n\n ipType: z.enum(IP_TYPES),\n licenseType: z.string().min(1, \"License required\"),\n commercialUse: z.string().default(\"\"),\n derivatives: z.string().default(\"\"),\n attribution: z.string().default(\"\"),\n geographicScope: z.string().default(\"Worldwide\"),\n aiPolicy: z.string().default(\"\"),\n royalty: z.coerce.number().min(0).max(50).default(0),\n descriptionTemplate: z.string().max(500).optional(),\n\n priceAmount: z\n .string()\n .default(\"\")\n .refine((v: string) => v === \"\" || !Number.isNaN(Number(v)), \"Enter a valid price\")\n .refine((v: string) => v === \"\" || Number(v) >= 0, \"Price must be zero or greater\"),\n paymentToken: z.string(),\n startDate: z.string().min(1, \"Start date required\"),\n startTime: z.string().default(\"00:00\"),\n endDate: z.string().min(1, \"End date required\"),\n endTime: z.string().default(\"23:59\"),\n maxPerWallet: z\n .string()\n .regex(/^\\d+$/, \"Must be a positive integer\")\n .refine((v: string) => parseInt(v, 10) >= 1, \"Minimum 1\")\n .default(\"1\"),\n\n whitelistEnabled: z.boolean().default(false),\n allowlistAddresses: z.string().default(\"\"),\n })\n .superRefine((values, ctx) => {\n const start = parseDateTime(values.startDate, values.startTime);\n const end = parseDateTime(values.endDate, values.endTime);\n if (start === null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"startDate\"], message: \"Enter a valid start date and time\" });\n }\n if (end === null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"endDate\"], message: \"Enter a valid end date and time\" });\n }\n if (start !== null && end !== null && end <= start) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"endDate\"], message: \"End time must be after the start time\" });\n }\n\n if (values.whitelistEnabled) {\n const addrs = values.allowlistAddresses.split(/[\\n,\\s]+/).map((a) => a.trim()).filter(Boolean);\n if (addrs.length === 0) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"allowlistAddresses\"], message: \"Add at least one address, or turn the whitelist off\" });\n }\n }\n });\n\nexport type DropCreateFormValues = z.infer<typeof dropCreateSchema>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/data/drop-create-schema.ts"],"sourcesContent":["\"use client\";\n\nimport * as z from \"zod\";\nimport { IP_TYPES } from \"./ip.js\";\n\nfunction parseDateTime(date: string, time: string): number | null {\n const t = new Date(`${date}T${time}:00`).getTime();\n return Number.isNaN(t) ? null : t;\n}\n\nexport const dropCreateSchema = z\n .object({\n name: z.string().min(1, \"Collection name required\").max(100),\n symbol: z\n .string()\n .min(1, \"Symbol required\")\n .max(10)\n .regex(/^[A-Z0-9]+$/, \"Uppercase letters and numbers only\"),\n\n ipType: z.enum(IP_TYPES),\n licenseType: z.string().min(1, \"License required\"),\n commercialUse: z.string().default(\"\"),\n derivatives: z.string().default(\"\"),\n attribution: z.string().default(\"\"),\n geographicScope: z.string().default(\"Worldwide\"),\n aiPolicy: z.string().default(\"\"),\n royalty: z.coerce.number().min(0).max(50).default(0),\n descriptionTemplate: z.string().max(500).optional(),\n\n priceAmount: z\n .string()\n .default(\"\")\n .refine((v: string) => v === \"\" || !Number.isNaN(Number(v)), \"Enter a valid price\")\n .refine((v: string) => v === \"\" || Number(v) >= 0, \"Price must be zero or greater\"),\n paymentToken: z.string(),\n startDate: z.string().min(1, \"Start date required\"),\n startTime: z.string().default(\"00:00\"),\n endDate: z.string().min(1, \"End date required\"),\n endTime: z.string().default(\"23:59\"),\n maxPerWallet: z\n .string()\n .regex(/^\\d+$/, \"Must be a positive integer\")\n .refine((v: string) => parseInt(v, 10) >= 1, \"Minimum 1\")\n .default(\"1\"),\n\n whitelistEnabled: z.boolean().default(false),\n allowlistAddresses: z.string().default(\"\"),\n\n gatedEnabled: z.boolean().default(false),\n gatedContentTitle: z.string().max(100).default(\"\"),\n gatedContentUrl: z.string().default(\"\"),\n gatedContentType: z.string().default(\"\"),\n })\n .superRefine((values, ctx) => {\n const start = parseDateTime(values.startDate, values.startTime);\n const end = parseDateTime(values.endDate, values.endTime);\n if (start === null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"startDate\"], message: \"Enter a valid start date and time\" });\n }\n if (end === null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"endDate\"], message: \"Enter a valid end date and time\" });\n }\n if (start !== null && end !== null && end <= start) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"endDate\"], message: \"End time must be after the start time\" });\n }\n\n if (values.whitelistEnabled) {\n const addrs = values.allowlistAddresses.split(/[\\n,\\s]+/).map((a) => a.trim()).filter(Boolean);\n if (addrs.length === 0) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"allowlistAddresses\"], message: \"Add at least one address, or turn the whitelist off\" });\n }\n }\n\n if (values.gatedEnabled && values.gatedContentUrl.trim() === \"\") {\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"gatedContentUrl\"], message: \"Add a content URL, or turn exclusive content off\" });\n }\n });\n\nexport type DropCreateFormValues = z.infer<typeof dropCreateSchema>;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,39 @@
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 gated_content_types_exports = {};
20
+ __export(gated_content_types_exports, {
21
+ GATED_CONTENT_TYPES: () => GATED_CONTENT_TYPES,
22
+ GATED_CONTENT_TYPE_FALLBACK: () => GATED_CONTENT_TYPE_FALLBACK
23
+ });
24
+ module.exports = __toCommonJS(gated_content_types_exports);
25
+ var import_lucide_react = require("lucide-react");
26
+ const GATED_CONTENT_TYPES = {
27
+ VIDEO: { icon: import_lucide_react.Play, cta: "Watch now" },
28
+ AUDIO: { icon: import_lucide_react.Music, cta: "Listen now" },
29
+ STREAM: { icon: import_lucide_react.Radio, cta: "Watch live" },
30
+ DOCUMENT: { icon: import_lucide_react.FileText, cta: "Open document" },
31
+ LINK: { icon: import_lucide_react.Link2, cta: "Access content" }
32
+ };
33
+ const GATED_CONTENT_TYPE_FALLBACK = GATED_CONTENT_TYPES.LINK;
34
+ // Annotate the CommonJS export names for ESM import in node:
35
+ 0 && (module.exports = {
36
+ GATED_CONTENT_TYPES,
37
+ GATED_CONTENT_TYPE_FALLBACK
38
+ });
39
+ //# sourceMappingURL=gated-content-types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/gated-content-types.ts"],"sourcesContent":["import { Play, Music, Radio, FileText, Link2 } from \"lucide-react\";\nimport type { ComponentType } from \"react\";\n\nexport interface ContentTypeConfig {\n icon: ComponentType<{ className?: string }>;\n cta: string;\n}\n\nexport const GATED_CONTENT_TYPES: Record<string, ContentTypeConfig> = {\n VIDEO: { icon: Play, cta: \"Watch now\" },\n AUDIO: { icon: Music, cta: \"Listen now\" },\n STREAM: { icon: Radio, cta: \"Watch live\" },\n DOCUMENT: { icon: FileText, cta: \"Open document\" },\n LINK: { icon: Link2, cta: \"Access content\" },\n};\n\nexport const GATED_CONTENT_TYPE_FALLBACK = GATED_CONTENT_TYPES.LINK;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAoD;AAQ7C,MAAM,sBAAyD;AAAA,EACpE,OAAU,EAAE,MAAM,0BAAU,KAAK,YAAY;AAAA,EAC7C,OAAU,EAAE,MAAM,2BAAU,KAAK,aAAa;AAAA,EAC9C,QAAU,EAAE,MAAM,2BAAU,KAAK,aAAa;AAAA,EAC9C,UAAU,EAAE,MAAM,8BAAU,KAAK,gBAAgB;AAAA,EACjD,MAAU,EAAE,MAAM,2BAAU,KAAK,iBAAiB;AACpD;AAEO,MAAM,8BAA8B,oBAAoB;","names":[]}
@@ -0,0 +1,12 @@
1
+ import { ComponentType } from 'react';
2
+
3
+ interface ContentTypeConfig {
4
+ icon: ComponentType<{
5
+ className?: string;
6
+ }>;
7
+ cta: string;
8
+ }
9
+ declare const GATED_CONTENT_TYPES: Record<string, ContentTypeConfig>;
10
+ declare const GATED_CONTENT_TYPE_FALLBACK: ContentTypeConfig;
11
+
12
+ export { type ContentTypeConfig, GATED_CONTENT_TYPES, GATED_CONTENT_TYPE_FALLBACK };
@@ -0,0 +1,12 @@
1
+ import { ComponentType } from 'react';
2
+
3
+ interface ContentTypeConfig {
4
+ icon: ComponentType<{
5
+ className?: string;
6
+ }>;
7
+ cta: string;
8
+ }
9
+ declare const GATED_CONTENT_TYPES: Record<string, ContentTypeConfig>;
10
+ declare const GATED_CONTENT_TYPE_FALLBACK: ContentTypeConfig;
11
+
12
+ export { type ContentTypeConfig, GATED_CONTENT_TYPES, GATED_CONTENT_TYPE_FALLBACK };
@@ -0,0 +1,14 @@
1
+ import { Play, Music, Radio, FileText, Link2 } from "lucide-react";
2
+ const GATED_CONTENT_TYPES = {
3
+ VIDEO: { icon: Play, cta: "Watch now" },
4
+ AUDIO: { icon: Music, cta: "Listen now" },
5
+ STREAM: { icon: Radio, cta: "Watch live" },
6
+ DOCUMENT: { icon: FileText, cta: "Open document" },
7
+ LINK: { icon: Link2, cta: "Access content" }
8
+ };
9
+ const GATED_CONTENT_TYPE_FALLBACK = GATED_CONTENT_TYPES.LINK;
10
+ export {
11
+ GATED_CONTENT_TYPES,
12
+ GATED_CONTENT_TYPE_FALLBACK
13
+ };
14
+ //# sourceMappingURL=gated-content-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/gated-content-types.ts"],"sourcesContent":["import { Play, Music, Radio, FileText, Link2 } from \"lucide-react\";\nimport type { ComponentType } from \"react\";\n\nexport interface ContentTypeConfig {\n icon: ComponentType<{ className?: string }>;\n cta: string;\n}\n\nexport const GATED_CONTENT_TYPES: Record<string, ContentTypeConfig> = {\n VIDEO: { icon: Play, cta: \"Watch now\" },\n AUDIO: { icon: Music, cta: \"Listen now\" },\n STREAM: { icon: Radio, cta: \"Watch live\" },\n DOCUMENT: { icon: FileText, cta: \"Open document\" },\n LINK: { icon: Link2, cta: \"Access content\" },\n};\n\nexport const GATED_CONTENT_TYPE_FALLBACK = GATED_CONTENT_TYPES.LINK;\n"],"mappings":"AAAA,SAAS,MAAM,OAAO,OAAO,UAAU,aAAa;AAQ7C,MAAM,sBAAyD;AAAA,EACpE,OAAU,EAAE,MAAM,MAAU,KAAK,YAAY;AAAA,EAC7C,OAAU,EAAE,MAAM,OAAU,KAAK,aAAa;AAAA,EAC9C,QAAU,EAAE,MAAM,OAAU,KAAK,aAAa;AAAA,EAC9C,UAAU,EAAE,MAAM,UAAU,KAAK,gBAAgB;AAAA,EACjD,MAAU,EAAE,MAAM,OAAU,KAAK,iBAAiB;AACpD;AAEO,MAAM,8BAA8B,oBAAoB;","names":[]}
@@ -62,7 +62,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
62
62
  key: "nfts",
63
63
  cta: "Create",
64
64
  blurb: "Publish each work as a single copy in a collection you own.",
65
- title: "Single Edition NFTs",
65
+ title: "Single Edition NFT",
66
66
  subtitle: "Each work is minted once",
67
67
  description: "Publish any photo, video, audio, or document, minted once inside your collection. Licensing, provenance, and ownership live on-chain.",
68
68
  features: ["One mint per work", "Collections with their own page and name", "You set the license terms"],
@@ -75,7 +75,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
75
75
  key: "limited-editions",
76
76
  cta: "Mint",
77
77
  blurb: "Release your work in numbered copies that can be collected and traded.",
78
- title: "Limited Editions",
78
+ title: "Limited Editions NFT",
79
79
  subtitle: "Numbered copies from a collection you own",
80
80
  description: "Create an editions collection and release each work in as many numbered copies as you choose.",
81
81
  features: ["Numbered copies, set by you", "Fans collect and trade", "One home for every release"],
@@ -88,7 +88,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
88
88
  key: "create-collection",
89
89
  cta: "Create",
90
90
  blurb: "Deploy your own collection to mint single-edition works into.",
91
- title: "Create NFT Collection",
91
+ title: "NFT Collection",
92
92
  subtitle: "Your own ERC-721 collection, ready to mint into",
93
93
  description: "Deploy a collection you own and control, with its own name, symbol, and page. Mint single-edition works into it whenever you're ready.",
94
94
  features: ["Your own collection contract", "Set the name and symbol", "Mint into it anytime"],
@@ -114,7 +114,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
114
114
  key: "create-1155",
115
115
  cta: "Create",
116
116
  blurb: "Deploy your own collection to release numbered editions from.",
117
- title: "Create Limited Editions Collection",
117
+ title: "Limited Editions Collection",
118
118
  subtitle: "Your own ERC-1155 collection, ready for editions",
119
119
  description: "Deploy an editions collection you own and control. Release each work in as many numbered copies as you choose.",
120
120
  features: ["Your own collection contract", "Set the name and symbol", "Release editions anytime"],
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data/launchpad-services.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport {\n ImagePlus, Layers, GitBranch,\n Award, Package,\n Ticket, Users, Handshake,\n Coins, TrendingUp,\n AtSign, FolderInput, Link2,\n LayoutGrid, Boxes,\n} from \"lucide-react\";\nimport { hasCapability } from \"@medialane/sdk\";\n\nconst TICKETS_TRANSFERABLE_FEATURE = hasCapability(\"ip-tickets\", \"transfer\")\n ? \"Freely transferable\"\n : \"Stays with the original holder\";\n\nexport type ServiceStatus = \"live\" | \"building\" | \"soon\";\n\nexport type ServiceGroup =\n | \"nfts\"\n | \"limited-editions\"\n | \"coins\"\n | \"community\"\n | \"claims\"\n | \"coming-soon\";\n\nexport interface ServiceGroupDefinition {\n key: ServiceGroup;\n title: string;\n\n tagline: string;\n\n badge?: string;\n}\n\nexport const LAUNCHPAD_SERVICE_GROUPS: ServiceGroupDefinition[] = [\n {\n key: \"nfts\",\n title: \"Originals\",\n tagline: \"Singular works, your own collections, timed drops, and remixes.\",\n },\n {\n key: \"limited-editions\",\n title: \"Limited Editions\",\n tagline: \"Numbered copies of your work.\",\n },\n {\n key: \"coins\",\n title: \"Coins\",\n tagline: \"Launch your own coin, or bring one you already made.\",\n },\n {\n key: \"community\",\n title: \"Community\",\n tagline: \"Badges, tickets, memberships, and direct sponsorship.\",\n },\n {\n key: \"claims\",\n title: \"Claims\",\n tagline: \"Reserve your username, your collection's name, or bring in a collection you already made.\",\n },\n {\n key: \"coming-soon\",\n title: \"Coming soon\",\n tagline: \"More ways to earn are on the way.\",\n },\n];\n\nexport interface ServiceDefinition {\n key: string;\n title: string;\n subtitle: string;\n description: string;\n features: string[];\n icon: LucideIcon;\n status: ServiceStatus;\n group: ServiceGroup;\n\n blurb: string;\n\n cta: string;\n\n example?: string;\n\n browseLinkLabel?: string;\n}\n\nexport const LAUNCHPAD_SERVICE_DEFINITIONS: ServiceDefinition[] = [\n\n {\n key: \"nfts\",\n cta: \"Create\",\n blurb: \"Publish each work as a single copy in a collection you own.\",\n title: \"Single Edition NFTs\",\n subtitle: \"Each work is minted once\",\n description:\n \"Publish any photo, video, audio, or document, minted once inside your collection. Licensing, provenance, and ownership live on-chain.\",\n features: [\"One mint per work\", \"Collections with their own page and name\", \"You set the license terms\"],\n example: \"A song, a photo, an ebook, a short film\",\n icon: ImagePlus,\n status: \"live\",\n group: \"nfts\",\n },\n {\n key: \"limited-editions\",\n cta: \"Mint\",\n blurb: \"Release your work in numbered copies that can be collected and traded.\",\n title: \"Limited Editions\",\n subtitle: \"Numbered copies from a collection you own\",\n description:\n \"Create an editions collection and release each work in as many numbered copies as you choose.\",\n features: [\"Numbered copies, set by you\", \"Fans collect and trade\", \"One home for every release\"],\n example: \"50 copies of a limited print, a music EP in 100 editions\",\n icon: Layers,\n status: \"live\",\n group: \"limited-editions\",\n },\n {\n key: \"create-collection\",\n cta: \"Create\",\n blurb: \"Deploy your own collection to mint single-edition works into.\",\n title: \"Create NFT Collection\",\n subtitle: \"Your own ERC-721 collection, ready to mint into\",\n description:\n \"Deploy a collection you own and control, with its own name, symbol, and page. Mint single-edition works into it whenever you're ready.\",\n features: [\"Your own collection contract\", \"Set the name and symbol\", \"Mint into it anytime\"],\n example: \"A photography collection, an album of singles\",\n icon: LayoutGrid,\n status: \"live\",\n group: \"nfts\",\n },\n {\n key: \"remix-asset\",\n cta: \"Browse\",\n blurb: \"Create from another work. Credit and royalties are handled automatically.\",\n title: \"Remix Asset\",\n subtitle: \"Derivative works with on-chain attribution\",\n description:\n \"Create a licensed derivative of another work. Attribution and provenance flow back to the original creator.\",\n features: [\"Credit handled automatically\", \"Royalties flow to the original\", \"License respected at mint\"],\n example: \"A remix of a song, an artwork inspired by an original\",\n icon: GitBranch,\n status: \"live\",\n group: \"nfts\",\n },\n\n {\n key: \"create-1155\",\n cta: \"Create\",\n blurb: \"Deploy your own collection to release numbered editions from.\",\n title: \"Create Limited Editions Collection\",\n subtitle: \"Your own ERC-1155 collection, ready for editions\",\n description:\n \"Deploy an editions collection you own and control. Release each work in as many numbered copies as you choose.\",\n features: [\"Your own collection contract\", \"Set the name and symbol\", \"Release editions anytime\"],\n example: \"A print series, a music EP with numbered editions\",\n icon: Boxes,\n status: \"live\",\n group: \"limited-editions\",\n },\n {\n key: \"pop-protocol\",\n cta: \"Create\",\n blurb: \"Badges your community claims and keeps forever.\",\n title: \"POP Protocol\",\n subtitle: \"Proof-of-participation badges for your community\",\n description:\n \"Give out permanent badges. Each person can claim one, and it cannot be transferred or faked.\",\n features: [\"Free for your community to claim\", \"Invite-list gating optional\", \"Branded claim page to share\"],\n example: \"Hackathon attendance badge, community membership, conference pass\",\n icon: Award,\n browseLinkLabel: \"Browse badges\",\n status: \"live\",\n group: \"community\",\n },\n {\n key: \"collection-drop\",\n cta: \"Launch\",\n blurb: \"Release a limited run at a set price and time window.\",\n title: \"Collection Drop\",\n subtitle: \"Timed NFT releases with mint windows\",\n description:\n \"Set a price, a supply, and a start and end time. Collectors mint directly from your drop page.\",\n features: [\"You set price and supply\", \"Opens and closes on your schedule\", \"Branded drop page to share\"],\n example: \"A 48-hour drop of 200 pieces at 5 USDC each\",\n icon: Package,\n browseLinkLabel: \"Browse drops\",\n status: \"live\",\n group: \"nfts\",\n },\n {\n key: \"ip-tickets\",\n cta: \"Create\",\n blurb: \"Create on-chain tickets your audience can hold and trade.\",\n title: \"IP Tickets\",\n subtitle: \"Verifiable tickets, held in the wallet\",\n description:\n \"Create tickets with their own supply and validity window, then mint them to attendees. Every ticket is verifiable on-chain.\",\n features: [\"Verifiable at the door\", \"Supply and validity you set\", TICKETS_TRANSFERABLE_FEATURE],\n icon: Ticket,\n browseLinkLabel: \"Browse tickets\",\n\n status: \"live\",\n group: \"community\",\n },\n {\n key: \"ip-club\",\n cta: \"Create\",\n blurb: \"Membership cards for your community.\",\n title: \"IP Club\",\n subtitle: \"Membership tiers, minted as cards\",\n description:\n \"Create a club with membership tiers — fans, supporters, press, season passes. Mint the cards and sell them like any collection.\",\n features: [\"Membership tiers\", \"Optional validity window\", \"Trade like any collection\"],\n icon: Users,\n browseLinkLabel: \"Browse clubs\",\n\n status: \"live\",\n group: \"community\",\n },\n {\n key: \"ip-sponsorship\",\n cta: \"Browse\",\n blurb: \"Let a sponsor back your work directly, for a license in return.\",\n title: \"IP Sponsorship\",\n subtitle: \"Direct sponsorship offers, settled asset-to-asset\",\n description:\n \"Create a sponsorship offer on an asset you own. Sponsors bid, you accept, and they receive a license. Payment settles directly between sponsor and author.\",\n features: [\"Direct settlement\", \"Owner-verified on-chain\", \"Open bidding or one invited sponsor\"],\n example: \"Sponsor a song, an artwork, or a patent for a license\",\n icon: Handshake,\n browseLinkLabel: \"Browse offers\",\n\n status: \"live\",\n group: \"community\",\n },\n\n {\n key: \"creator-coins\",\n cta: \"Launch\",\n blurb: \"Launch your coin in a few clicks and stay in control of it.\",\n title: \"Creator Coin\",\n subtitle: \"Your own coin, your liquidity\",\n description:\n \"Launch your own coin with a public trading pool. You set the supply and allocation and stay in control of the liquidity.\",\n features: [\"Launch in a few clicks\", \"You keep control of the liquidity\", \"Traded on a public pool\"],\n example: \"A fan coin for your channel, a coin for your music project\",\n icon: TrendingUp,\n status: \"live\",\n group: \"coins\",\n },\n\n {\n key: \"claim-memecoin\",\n cta: \"Claim\",\n blurb: \"Add a coin you already launched to your profile.\",\n title: \"Claim Memecoin\",\n subtitle: \"Bring a coin you already launched\",\n description:\n \"Claim a coin you already launched to list it on the Coins page and your profile. Claims are reviewed before going live.\",\n features: [\"Bring a coin you already launched\", \"Reviewed by our team\", \"Featured on the Coins page\"],\n example: \"Your unrug memecoin, listed on your creator profile\",\n icon: Coins,\n status: \"live\",\n group: \"coins\",\n },\n {\n key: \"claim-username\",\n cta: \"Claim\",\n blurb: \"Reserve your name and get your own creator page.\",\n title: \"Claim Username\",\n subtitle: \"Reserve your creator page URL\",\n description:\n \"Claim your username to get a shareable creator page, your public portfolio at a clean, memorable URL.\",\n features: [\"Free claim\", \"Shareable creator page\", \"Your public portfolio\"],\n example: \"medialane.io/your-name — your portfolio at your own name\",\n icon: AtSign,\n status: \"live\",\n group: \"claims\",\n },\n {\n key: \"claim-collection\",\n cta: \"Claim\",\n blurb: \"Made a collection somewhere else? Bring it to your profile.\",\n title: \"Claim Collection\",\n subtitle: \"Bring a collection you already made\",\n description:\n \"Claim a collection you made elsewhere to link it to your profile and give it a branded collection page.\",\n features: [\"Bring an existing collection\", \"Linked to your profile\", \"Branded collection page\"],\n example: \"A collection you made elsewhere joins your profile\",\n icon: FolderInput,\n status: \"live\",\n group: \"claims\",\n },\n {\n key: \"claim-collection-name\",\n cta: \"Claim\",\n blurb: \"Give your collection a clean, memorable web address of its own.\",\n title: \"Claim Collection Name\",\n subtitle: \"Reserve your collection page URL\",\n description:\n \"Claim a custom name for your collection page and get a clean, shareable URL instead of a long technical address.\",\n features: [\"Free claim\", \"Clean shareable URL\", \"Easy to remember and share\"],\n example: \"medialane.io/collections/your-collection\",\n icon: Link2,\n status: \"live\",\n group: \"claims\",\n },\n];\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/data/launchpad-services.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport {\n ImagePlus, Layers, GitBranch,\n Award, Package,\n Ticket, Users, Handshake,\n Coins, TrendingUp,\n AtSign, FolderInput, Link2,\n LayoutGrid, Boxes,\n} from \"lucide-react\";\nimport { hasCapability } from \"@medialane/sdk\";\n\nconst TICKETS_TRANSFERABLE_FEATURE = hasCapability(\"ip-tickets\", \"transfer\")\n ? \"Freely transferable\"\n : \"Stays with the original holder\";\n\nexport type ServiceStatus = \"live\" | \"building\" | \"soon\";\n\nexport type ServiceGroup =\n | \"nfts\"\n | \"limited-editions\"\n | \"coins\"\n | \"community\"\n | \"claims\"\n | \"coming-soon\";\n\nexport interface ServiceGroupDefinition {\n key: ServiceGroup;\n title: string;\n\n tagline: string;\n\n badge?: string;\n}\n\nexport const LAUNCHPAD_SERVICE_GROUPS: ServiceGroupDefinition[] = [\n {\n key: \"nfts\",\n title: \"Originals\",\n tagline: \"Singular works, your own collections, timed drops, and remixes.\",\n },\n {\n key: \"limited-editions\",\n title: \"Limited Editions\",\n tagline: \"Numbered copies of your work.\",\n },\n {\n key: \"coins\",\n title: \"Coins\",\n tagline: \"Launch your own coin, or bring one you already made.\",\n },\n {\n key: \"community\",\n title: \"Community\",\n tagline: \"Badges, tickets, memberships, and direct sponsorship.\",\n },\n {\n key: \"claims\",\n title: \"Claims\",\n tagline: \"Reserve your username, your collection's name, or bring in a collection you already made.\",\n },\n {\n key: \"coming-soon\",\n title: \"Coming soon\",\n tagline: \"More ways to earn are on the way.\",\n },\n];\n\nexport interface ServiceDefinition {\n key: string;\n title: string;\n subtitle: string;\n description: string;\n features: string[];\n icon: LucideIcon;\n status: ServiceStatus;\n group: ServiceGroup;\n\n blurb: string;\n\n cta: string;\n\n example?: string;\n\n browseLinkLabel?: string;\n}\n\nexport const LAUNCHPAD_SERVICE_DEFINITIONS: ServiceDefinition[] = [\n\n {\n key: \"nfts\",\n cta: \"Create\",\n blurb: \"Publish each work as a single copy in a collection you own.\",\n title: \"Single Edition NFT\",\n subtitle: \"Each work is minted once\",\n description:\n \"Publish any photo, video, audio, or document, minted once inside your collection. Licensing, provenance, and ownership live on-chain.\",\n features: [\"One mint per work\", \"Collections with their own page and name\", \"You set the license terms\"],\n example: \"A song, a photo, an ebook, a short film\",\n icon: ImagePlus,\n status: \"live\",\n group: \"nfts\",\n },\n {\n key: \"limited-editions\",\n cta: \"Mint\",\n blurb: \"Release your work in numbered copies that can be collected and traded.\",\n title: \"Limited Editions NFT\",\n subtitle: \"Numbered copies from a collection you own\",\n description:\n \"Create an editions collection and release each work in as many numbered copies as you choose.\",\n features: [\"Numbered copies, set by you\", \"Fans collect and trade\", \"One home for every release\"],\n example: \"50 copies of a limited print, a music EP in 100 editions\",\n icon: Layers,\n status: \"live\",\n group: \"limited-editions\",\n },\n {\n key: \"create-collection\",\n cta: \"Create\",\n blurb: \"Deploy your own collection to mint single-edition works into.\",\n title: \"NFT Collection\",\n subtitle: \"Your own ERC-721 collection, ready to mint into\",\n description:\n \"Deploy a collection you own and control, with its own name, symbol, and page. Mint single-edition works into it whenever you're ready.\",\n features: [\"Your own collection contract\", \"Set the name and symbol\", \"Mint into it anytime\"],\n example: \"A photography collection, an album of singles\",\n icon: LayoutGrid,\n status: \"live\",\n group: \"nfts\",\n },\n {\n key: \"remix-asset\",\n cta: \"Browse\",\n blurb: \"Create from another work. Credit and royalties are handled automatically.\",\n title: \"Remix Asset\",\n subtitle: \"Derivative works with on-chain attribution\",\n description:\n \"Create a licensed derivative of another work. Attribution and provenance flow back to the original creator.\",\n features: [\"Credit handled automatically\", \"Royalties flow to the original\", \"License respected at mint\"],\n example: \"A remix of a song, an artwork inspired by an original\",\n icon: GitBranch,\n status: \"live\",\n group: \"nfts\",\n },\n\n {\n key: \"create-1155\",\n cta: \"Create\",\n blurb: \"Deploy your own collection to release numbered editions from.\",\n title: \"Limited Editions Collection\",\n subtitle: \"Your own ERC-1155 collection, ready for editions\",\n description:\n \"Deploy an editions collection you own and control. Release each work in as many numbered copies as you choose.\",\n features: [\"Your own collection contract\", \"Set the name and symbol\", \"Release editions anytime\"],\n example: \"A print series, a music EP with numbered editions\",\n icon: Boxes,\n status: \"live\",\n group: \"limited-editions\",\n },\n {\n key: \"pop-protocol\",\n cta: \"Create\",\n blurb: \"Badges your community claims and keeps forever.\",\n title: \"POP Protocol\",\n subtitle: \"Proof-of-participation badges for your community\",\n description:\n \"Give out permanent badges. Each person can claim one, and it cannot be transferred or faked.\",\n features: [\"Free for your community to claim\", \"Invite-list gating optional\", \"Branded claim page to share\"],\n example: \"Hackathon attendance badge, community membership, conference pass\",\n icon: Award,\n browseLinkLabel: \"Browse badges\",\n status: \"live\",\n group: \"community\",\n },\n {\n key: \"collection-drop\",\n cta: \"Launch\",\n blurb: \"Release a limited run at a set price and time window.\",\n title: \"Collection Drop\",\n subtitle: \"Timed NFT releases with mint windows\",\n description:\n \"Set a price, a supply, and a start and end time. Collectors mint directly from your drop page.\",\n features: [\"You set price and supply\", \"Opens and closes on your schedule\", \"Branded drop page to share\"],\n example: \"A 48-hour drop of 200 pieces at 5 USDC each\",\n icon: Package,\n browseLinkLabel: \"Browse drops\",\n status: \"live\",\n group: \"nfts\",\n },\n {\n key: \"ip-tickets\",\n cta: \"Create\",\n blurb: \"Create on-chain tickets your audience can hold and trade.\",\n title: \"IP Tickets\",\n subtitle: \"Verifiable tickets, held in the wallet\",\n description:\n \"Create tickets with their own supply and validity window, then mint them to attendees. Every ticket is verifiable on-chain.\",\n features: [\"Verifiable at the door\", \"Supply and validity you set\", TICKETS_TRANSFERABLE_FEATURE],\n icon: Ticket,\n browseLinkLabel: \"Browse tickets\",\n\n status: \"live\",\n group: \"community\",\n },\n {\n key: \"ip-club\",\n cta: \"Create\",\n blurb: \"Membership cards for your community.\",\n title: \"IP Club\",\n subtitle: \"Membership tiers, minted as cards\",\n description:\n \"Create a club with membership tiers — fans, supporters, press, season passes. Mint the cards and sell them like any collection.\",\n features: [\"Membership tiers\", \"Optional validity window\", \"Trade like any collection\"],\n icon: Users,\n browseLinkLabel: \"Browse clubs\",\n\n status: \"live\",\n group: \"community\",\n },\n {\n key: \"ip-sponsorship\",\n cta: \"Browse\",\n blurb: \"Let a sponsor back your work directly, for a license in return.\",\n title: \"IP Sponsorship\",\n subtitle: \"Direct sponsorship offers, settled asset-to-asset\",\n description:\n \"Create a sponsorship offer on an asset you own. Sponsors bid, you accept, and they receive a license. Payment settles directly between sponsor and author.\",\n features: [\"Direct settlement\", \"Owner-verified on-chain\", \"Open bidding or one invited sponsor\"],\n example: \"Sponsor a song, an artwork, or a patent for a license\",\n icon: Handshake,\n browseLinkLabel: \"Browse offers\",\n\n status: \"live\",\n group: \"community\",\n },\n\n {\n key: \"creator-coins\",\n cta: \"Launch\",\n blurb: \"Launch your coin in a few clicks and stay in control of it.\",\n title: \"Creator Coin\",\n subtitle: \"Your own coin, your liquidity\",\n description:\n \"Launch your own coin with a public trading pool. You set the supply and allocation and stay in control of the liquidity.\",\n features: [\"Launch in a few clicks\", \"You keep control of the liquidity\", \"Traded on a public pool\"],\n example: \"A fan coin for your channel, a coin for your music project\",\n icon: TrendingUp,\n status: \"live\",\n group: \"coins\",\n },\n\n {\n key: \"claim-memecoin\",\n cta: \"Claim\",\n blurb: \"Add a coin you already launched to your profile.\",\n title: \"Claim Memecoin\",\n subtitle: \"Bring a coin you already launched\",\n description:\n \"Claim a coin you already launched to list it on the Coins page and your profile. Claims are reviewed before going live.\",\n features: [\"Bring a coin you already launched\", \"Reviewed by our team\", \"Featured on the Coins page\"],\n example: \"Your unrug memecoin, listed on your creator profile\",\n icon: Coins,\n status: \"live\",\n group: \"coins\",\n },\n {\n key: \"claim-username\",\n cta: \"Claim\",\n blurb: \"Reserve your name and get your own creator page.\",\n title: \"Claim Username\",\n subtitle: \"Reserve your creator page URL\",\n description:\n \"Claim your username to get a shareable creator page, your public portfolio at a clean, memorable URL.\",\n features: [\"Free claim\", \"Shareable creator page\", \"Your public portfolio\"],\n example: \"medialane.io/your-name — your portfolio at your own name\",\n icon: AtSign,\n status: \"live\",\n group: \"claims\",\n },\n {\n key: \"claim-collection\",\n cta: \"Claim\",\n blurb: \"Made a collection somewhere else? Bring it to your profile.\",\n title: \"Claim Collection\",\n subtitle: \"Bring a collection you already made\",\n description:\n \"Claim a collection you made elsewhere to link it to your profile and give it a branded collection page.\",\n features: [\"Bring an existing collection\", \"Linked to your profile\", \"Branded collection page\"],\n example: \"A collection you made elsewhere joins your profile\",\n icon: FolderInput,\n status: \"live\",\n group: \"claims\",\n },\n {\n key: \"claim-collection-name\",\n cta: \"Claim\",\n blurb: \"Give your collection a clean, memorable web address of its own.\",\n title: \"Claim Collection Name\",\n subtitle: \"Reserve your collection page URL\",\n description:\n \"Claim a custom name for your collection page and get a clean, shareable URL instead of a long technical address.\",\n features: [\"Free claim\", \"Clean shareable URL\", \"Easy to remember and share\"],\n example: \"medialane.io/collections/your-collection\",\n icon: Link2,\n status: \"live\",\n group: \"claims\",\n },\n];\n"],"mappings":"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","names":[]}
@@ -54,7 +54,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
54
54
  key: "nfts",
55
55
  cta: "Create",
56
56
  blurb: "Publish each work as a single copy in a collection you own.",
57
- title: "Single Edition NFTs",
57
+ title: "Single Edition NFT",
58
58
  subtitle: "Each work is minted once",
59
59
  description: "Publish any photo, video, audio, or document, minted once inside your collection. Licensing, provenance, and ownership live on-chain.",
60
60
  features: ["One mint per work", "Collections with their own page and name", "You set the license terms"],
@@ -67,7 +67,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
67
67
  key: "limited-editions",
68
68
  cta: "Mint",
69
69
  blurb: "Release your work in numbered copies that can be collected and traded.",
70
- title: "Limited Editions",
70
+ title: "Limited Editions NFT",
71
71
  subtitle: "Numbered copies from a collection you own",
72
72
  description: "Create an editions collection and release each work in as many numbered copies as you choose.",
73
73
  features: ["Numbered copies, set by you", "Fans collect and trade", "One home for every release"],
@@ -80,7 +80,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
80
80
  key: "create-collection",
81
81
  cta: "Create",
82
82
  blurb: "Deploy your own collection to mint single-edition works into.",
83
- title: "Create NFT Collection",
83
+ title: "NFT Collection",
84
84
  subtitle: "Your own ERC-721 collection, ready to mint into",
85
85
  description: "Deploy a collection you own and control, with its own name, symbol, and page. Mint single-edition works into it whenever you're ready.",
86
86
  features: ["Your own collection contract", "Set the name and symbol", "Mint into it anytime"],
@@ -106,7 +106,7 @@ const LAUNCHPAD_SERVICE_DEFINITIONS = [
106
106
  key: "create-1155",
107
107
  cta: "Create",
108
108
  blurb: "Deploy your own collection to release numbered editions from.",
109
- title: "Create Limited Editions Collection",
109
+ title: "Limited Editions Collection",
110
110
  subtitle: "Your own ERC-1155 collection, ready for editions",
111
111
  description: "Deploy an editions collection you own and control. Release each work in as many numbered copies as you choose.",
112
112
  features: ["Your own collection contract", "Set the name and symbol", "Release editions anytime"],