@medialane/ui 0.286.0 → 0.288.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 (53) hide show
  1. package/dist/components/badge.d.cts +1 -1
  2. package/dist/components/badge.d.ts +1 -1
  3. package/dist/components/button.d.cts +1 -1
  4. package/dist/components/button.d.ts +1 -1
  5. package/dist/components/collection-settings.cjs +350 -0
  6. package/dist/components/collection-settings.cjs.map +1 -0
  7. package/dist/components/collection-settings.d.cts +7 -0
  8. package/dist/components/collection-settings.d.ts +7 -0
  9. package/dist/components/collection-settings.js +335 -0
  10. package/dist/components/collection-settings.js.map +1 -0
  11. package/dist/components/collection-slug-claim.cjs +219 -0
  12. package/dist/components/collection-slug-claim.cjs.map +1 -0
  13. package/dist/components/collection-slug-claim.d.cts +10 -0
  14. package/dist/components/collection-slug-claim.d.ts +10 -0
  15. package/dist/components/collection-slug-claim.js +185 -0
  16. package/dist/components/collection-slug-claim.js.map +1 -0
  17. package/dist/components/launchpad/edition-mint-schema.d.cts +2 -2
  18. package/dist/components/launchpad/edition-mint-schema.d.ts +2 -2
  19. package/dist/components/medialane-app.cjs.map +1 -1
  20. package/dist/components/medialane-app.d.cts +1 -0
  21. package/dist/components/medialane-app.d.ts +1 -0
  22. package/dist/components/medialane-app.js.map +1 -1
  23. package/dist/components/mint-landing.cjs +232 -0
  24. package/dist/components/mint-landing.cjs.map +1 -0
  25. package/dist/components/mint-landing.d.cts +77 -0
  26. package/dist/components/mint-landing.d.ts +77 -0
  27. package/dist/components/mint-landing.js +212 -0
  28. package/dist/components/mint-landing.js.map +1 -0
  29. package/dist/components/settings-section.cjs +65 -0
  30. package/dist/components/settings-section.cjs.map +1 -0
  31. package/dist/components/settings-section.d.cts +24 -0
  32. package/dist/components/settings-section.d.ts +24 -0
  33. package/dist/components/settings-section.js +38 -0
  34. package/dist/components/settings-section.js.map +1 -0
  35. package/dist/index.cjs +6 -0
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +2 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +4 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/utils/collection-settings-form.cjs +77 -0
  42. package/dist/utils/collection-settings-form.cjs.map +1 -0
  43. package/dist/utils/collection-settings-form.d.cts +21 -0
  44. package/dist/utils/collection-settings-form.d.ts +21 -0
  45. package/dist/utils/collection-settings-form.js +51 -0
  46. package/dist/utils/collection-settings-form.js.map +1 -0
  47. package/dist/utils/use-collection-settings.cjs +83 -0
  48. package/dist/utils/use-collection-settings.cjs.map +1 -0
  49. package/dist/utils/use-collection-settings.d.cts +58 -0
  50. package/dist/utils/use-collection-settings.d.ts +58 -0
  51. package/dist/utils/use-collection-settings.js +59 -0
  52. package/dist/utils/use-collection-settings.js.map +1 -0
  53. package/package.json +1 -1
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function CollectionSlugClaimSection({ contract, profile, }: {
4
+ contract: string;
5
+ profile: {
6
+ slug?: string | null;
7
+ } | null;
8
+ }): react_jsx_runtime.JSX.Element;
9
+
10
+ export { CollectionSlugClaimSection };
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function CollectionSlugClaimSection({ contract, profile, }: {
4
+ contract: string;
5
+ profile: {
6
+ slug?: string | null;
7
+ } | null;
8
+ }): react_jsx_runtime.JSX.Element;
9
+
10
+ export { CollectionSlugClaimSection };
@@ -0,0 +1,185 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef } from "react";
4
+ import { normalizeAddress } from "@medialane/sdk";
5
+ import { Gem } from "lucide-react";
6
+ import { Button } from "./button.js";
7
+ import { Badge } from "./badge.js";
8
+ import Link from "./link.js";
9
+ import { useMedialaneApp } from "./medialane-app.js";
10
+ import { SectionCard, SectionHeader } from "./settings-section.js";
11
+ import { describeError } from "../utils/describe-error.js";
12
+ function CollectionSlugClaimSection({
13
+ contract,
14
+ profile
15
+ }) {
16
+ const { getClient, ensureSignedIn, verifyEmailHref } = useMedialaneApp();
17
+ const [slugInput, setSlugInput] = useState("");
18
+ const [checkState, setCheckState] = useState("idle");
19
+ const [checkReason, setCheckReason] = useState(null);
20
+ const [submitState, setSubmitState] = useState("idle");
21
+ const [submitError, setSubmitError] = useState(null);
22
+ const [pendingSlug, setPendingSlug] = useState(null);
23
+ const loadedRef = useRef(false);
24
+ useEffect(() => {
25
+ if (loadedRef.current) return;
26
+ loadedRef.current = true;
27
+ (async () => {
28
+ try {
29
+ const { claims } = await getClient().api.collections.mySlugClaims();
30
+ const match = claims.find(
31
+ (c) => normalizeAddress("STARKNET", c.contractAddress) === normalizeAddress("STARKNET", contract) && c.status === "PENDING"
32
+ );
33
+ if (match) setPendingSlug(match.slug);
34
+ } catch {
35
+ }
36
+ })();
37
+ }, [contract, getClient]);
38
+ const handleCheck = async () => {
39
+ const slug = slugInput.toLowerCase().trim();
40
+ if (!slug) return;
41
+ setCheckState("checking");
42
+ setCheckReason(null);
43
+ try {
44
+ const result = await getClient().api.collections.slugAvailability(slug);
45
+ setCheckState(result.available ? "available" : "taken");
46
+ if (!result.available) setCheckReason(result.reason ?? "That slug is not available.");
47
+ } catch {
48
+ setCheckState("invalid");
49
+ setCheckReason("Unable to check availability. Try again.");
50
+ }
51
+ };
52
+ const handleSubmit = async () => {
53
+ const slug = slugInput.toLowerCase().trim();
54
+ if (!slug || checkState !== "available") return;
55
+ setSubmitState("submitting");
56
+ setSubmitError(null);
57
+ try {
58
+ await ensureSignedIn?.();
59
+ const { claim } = await getClient().api.collections.submitSlugClaim(contract, slug);
60
+ setPendingSlug(claim.slug);
61
+ setSubmitState("done");
62
+ } catch (err) {
63
+ const msg = describeError(err).message;
64
+ setSubmitError(msg);
65
+ setSubmitState("error");
66
+ }
67
+ };
68
+ if (profile?.slug) {
69
+ return /* @__PURE__ */ jsxs(SectionCard, { className: "border-emerald-500/20 bg-emerald-500/[0.02]", children: [
70
+ /* @__PURE__ */ jsx(
71
+ SectionHeader,
72
+ {
73
+ icon: Gem,
74
+ title: "Collection URL",
75
+ description: `medialane.io/collection/${profile.slug}`,
76
+ iconClass: "text-emerald-500",
77
+ bgClass: "bg-emerald-500/15",
78
+ badge: /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-2xs h-4 px-1.5 text-emerald-600 border-emerald-500/30", children: "Active" })
79
+ }
80
+ ),
81
+ /* @__PURE__ */ jsx("div", { className: "pt-1 border-t border-border", children: /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
82
+ "Your collection is accessible at",
83
+ " ",
84
+ /* @__PURE__ */ jsxs("span", { className: "tabular-nums text-foreground", children: [
85
+ "medialane.io/collection/",
86
+ profile.slug
87
+ ] })
88
+ ] }) })
89
+ ] });
90
+ }
91
+ if (pendingSlug) {
92
+ return /* @__PURE__ */ jsxs(SectionCard, { className: "border-primary/20 bg-primary/[0.02]", children: [
93
+ /* @__PURE__ */ jsx(
94
+ SectionHeader,
95
+ {
96
+ icon: Gem,
97
+ title: "Claim your collection URL",
98
+ description: `medialane.io/collection/${pendingSlug}`,
99
+ iconClass: "text-primary",
100
+ bgClass: "bg-primary/15",
101
+ badge: /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-2xs h-4 px-1.5 text-amber-600 border-amber-500/30", children: "Pending review" })
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsx("div", { className: "pt-1 border-t border-border", children: /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
105
+ "Your claim for",
106
+ " ",
107
+ /* @__PURE__ */ jsxs("span", { className: "tabular-nums text-foreground", children: [
108
+ "medialane.io/collection/",
109
+ pendingSlug
110
+ ] }),
111
+ " is under review. You'll be notified once it's approved."
112
+ ] }) })
113
+ ] });
114
+ }
115
+ return /* @__PURE__ */ jsxs(SectionCard, { className: "border-primary/20 bg-primary/[0.02]", children: [
116
+ /* @__PURE__ */ jsx(
117
+ SectionHeader,
118
+ {
119
+ icon: Gem,
120
+ title: "Claim your collection URL",
121
+ description: "Reserve a unique URL \u2014 medialane.io/collection/your-name",
122
+ iconClass: "text-primary",
123
+ bgClass: "bg-primary/15"
124
+ }
125
+ ),
126
+ /* @__PURE__ */ jsxs("div", { className: "pt-3 border-t border-border space-y-3", children: [
127
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
128
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 flex items-center rounded-lg border border-border bg-muted/40 px-3 py-2", children: [
129
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground whitespace-nowrap shrink-0", children: "medialane.io/collection/" }),
130
+ /* @__PURE__ */ jsx(
131
+ "input",
132
+ {
133
+ type: "text",
134
+ className: "flex-1 bg-transparent text-xs text-foreground outline-none placeholder:text-muted-foreground/50 min-w-0",
135
+ placeholder: "your-name",
136
+ value: slugInput,
137
+ onChange: (e) => {
138
+ setSlugInput(e.target.value.toLowerCase().replace(/[^a-z0-9_-]/g, ""));
139
+ setCheckState("idle");
140
+ },
141
+ onKeyDown: (e) => {
142
+ if (e.key === "Enter") handleCheck();
143
+ },
144
+ maxLength: 20
145
+ }
146
+ )
147
+ ] }),
148
+ /* @__PURE__ */ jsx(
149
+ Button,
150
+ {
151
+ variant: "outline",
152
+ size: "sm",
153
+ onClick: handleCheck,
154
+ disabled: !slugInput.trim() || checkState === "checking",
155
+ className: "shrink-0",
156
+ children: checkState === "checking" ? "Checking\u2026" : "Check"
157
+ }
158
+ )
159
+ ] }),
160
+ checkState === "available" && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
161
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-emerald-600 font-medium truncate", children: [
162
+ "\u2713 Available \u2014 ",
163
+ /* @__PURE__ */ jsxs("span", { className: "tabular-nums", children: [
164
+ "medialane.io/collection/",
165
+ slugInput
166
+ ] })
167
+ ] }),
168
+ /* @__PURE__ */ jsx(Button, { size: "sm", onClick: handleSubmit, disabled: submitState === "submitting", className: "shrink-0", children: submitState === "submitting" ? "Claiming\u2026" : "Claim this URL" })
169
+ ] }),
170
+ (checkState === "taken" || checkState === "invalid") && /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: checkReason ?? "That slug is not available." }),
171
+ submitState === "error" && /* @__PURE__ */ jsxs("p", { className: "text-xs text-destructive", children: [
172
+ submitError,
173
+ verifyEmailHref && submitError === "Verify your email to claim a collection." && /* @__PURE__ */ jsxs(Fragment, { children: [
174
+ " ",
175
+ /* @__PURE__ */ jsx(Link, { href: verifyEmailHref, className: "underline font-medium hover:text-foreground", children: "Verify email" })
176
+ ] })
177
+ ] }),
178
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "3\u201320 characters, lowercase letters, numbers, underscores or hyphens. Claims are reviewed before going live." })
179
+ ] })
180
+ ] });
181
+ }
182
+ export {
183
+ CollectionSlugClaimSection
184
+ };
185
+ //# sourceMappingURL=collection-slug-claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/collection-slug-claim.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport { Gem } from \"lucide-react\";\nimport { Button } from \"./button.js\";\nimport { Badge } from \"./badge.js\";\nimport Link from \"./link.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport { SectionCard, SectionHeader } from \"./settings-section.js\";\nimport { describeError } from \"../utils/describe-error.js\";\n\nexport function CollectionSlugClaimSection({\n contract,\n profile,\n}: {\n contract: string;\n profile: { slug?: string | null } | null;\n}) {\n const { getClient, ensureSignedIn, verifyEmailHref } = useMedialaneApp();\n const [slugInput, setSlugInput] = useState(\"\");\n const [checkState, setCheckState] = useState<\"idle\" | \"checking\" | \"available\" | \"taken\" | \"invalid\">(\"idle\");\n const [checkReason, setCheckReason] = useState<string | null>(null);\n const [submitState, setSubmitState] = useState<\"idle\" | \"submitting\" | \"done\" | \"error\">(\"idle\");\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [pendingSlug, setPendingSlug] = useState<string | null>(null);\n const loadedRef = useRef(false);\n\n useEffect(() => {\n if (loadedRef.current) return;\n loadedRef.current = true;\n (async () => {\n try {\n const { claims } = await getClient().api.collections.mySlugClaims();\n const match = claims.find(\n (c) => normalizeAddress(\"STARKNET\", c.contractAddress) === normalizeAddress(\"STARKNET\", contract) && c.status === \"PENDING\"\n );\n if (match) setPendingSlug(match.slug);\n } catch {}\n })();\n }, [contract, getClient]);\n\n const handleCheck = async () => {\n const slug = slugInput.toLowerCase().trim();\n if (!slug) return;\n setCheckState(\"checking\");\n setCheckReason(null);\n try {\n const result = await getClient().api.collections.slugAvailability(slug);\n setCheckState(result.available ? \"available\" : \"taken\");\n if (!result.available) setCheckReason(result.reason ?? \"That slug is not available.\");\n } catch {\n setCheckState(\"invalid\");\n setCheckReason(\"Unable to check availability. Try again.\");\n }\n };\n\n const handleSubmit = async () => {\n const slug = slugInput.toLowerCase().trim();\n if (!slug || checkState !== \"available\") return;\n setSubmitState(\"submitting\");\n setSubmitError(null);\n try {\n await ensureSignedIn?.();\n const { claim } = await getClient().api.collections.submitSlugClaim(contract, slug);\n setPendingSlug(claim.slug);\n setSubmitState(\"done\");\n } catch (err: unknown) {\n const msg = describeError(err).message;\n setSubmitError(msg);\n setSubmitState(\"error\");\n }\n };\n\n if (profile?.slug) {\n return (\n <SectionCard className=\"border-emerald-500/20 bg-emerald-500/[0.02]\">\n <SectionHeader\n icon={Gem}\n title=\"Collection URL\"\n description={`medialane.io/collection/${profile.slug}`}\n iconClass=\"text-emerald-500\"\n bgClass=\"bg-emerald-500/15\"\n badge={\n <Badge variant=\"outline\" className=\"text-2xs h-4 px-1.5 text-emerald-600 border-emerald-500/30\">\n Active\n </Badge>\n }\n />\n <div className=\"pt-1 border-t border-border\">\n <p className=\"text-xs text-muted-foreground\">\n Your collection is accessible at{\" \"}\n <span className=\"tabular-nums text-foreground\">medialane.io/collection/{profile.slug}</span>\n </p>\n </div>\n </SectionCard>\n );\n }\n\n if (pendingSlug) {\n return (\n <SectionCard className=\"border-primary/20 bg-primary/[0.02]\">\n <SectionHeader\n icon={Gem}\n title=\"Claim your collection URL\"\n description={`medialane.io/collection/${pendingSlug}`}\n iconClass=\"text-primary\"\n bgClass=\"bg-primary/15\"\n badge={\n <Badge variant=\"outline\" className=\"text-2xs h-4 px-1.5 text-amber-600 border-amber-500/30\">\n Pending review\n </Badge>\n }\n />\n <div className=\"pt-1 border-t border-border\">\n <p className=\"text-xs text-muted-foreground\">\n Your claim for{\" \"}\n <span className=\"tabular-nums text-foreground\">medialane.io/collection/{pendingSlug}</span> is under\n review. You&apos;ll be notified once it&apos;s approved.\n </p>\n </div>\n </SectionCard>\n );\n }\n\n return (\n <SectionCard className=\"border-primary/20 bg-primary/[0.02]\">\n <SectionHeader\n icon={Gem}\n title=\"Claim your collection URL\"\n description=\"Reserve a unique URL — medialane.io/collection/your-name\"\n iconClass=\"text-primary\"\n bgClass=\"bg-primary/15\"\n />\n <div className=\"pt-3 border-t border-border space-y-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 flex items-center rounded-lg border border-border bg-muted/40 px-3 py-2\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap shrink-0\">\n medialane.io/collection/\n </span>\n <input\n type=\"text\"\n className=\"flex-1 bg-transparent text-xs text-foreground outline-none placeholder:text-muted-foreground/50 min-w-0\"\n placeholder=\"your-name\"\n value={slugInput}\n onChange={(e) => {\n setSlugInput(e.target.value.toLowerCase().replace(/[^a-z0-9_-]/g, \"\"));\n setCheckState(\"idle\");\n }}\n onKeyDown={(e) => { if (e.key === \"Enter\") handleCheck(); }}\n maxLength={20}\n />\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCheck}\n disabled={!slugInput.trim() || checkState === \"checking\"}\n className=\"shrink-0\"\n >\n {checkState === \"checking\" ? \"Checking…\" : \"Check\"}\n </Button>\n </div>\n\n {checkState === \"available\" && (\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-xs text-emerald-600 font-medium truncate\">\n ✓ Available — <span className=\"tabular-nums\">medialane.io/collection/{slugInput}</span>\n </p>\n <Button size=\"sm\" onClick={handleSubmit} disabled={submitState === \"submitting\"} className=\"shrink-0\">\n {submitState === \"submitting\" ? \"Claiming…\" : \"Claim this URL\"}\n </Button>\n </div>\n )}\n\n {(checkState === \"taken\" || checkState === \"invalid\") && (\n <p className=\"text-xs text-destructive\">{checkReason ?? \"That slug is not available.\"}</p>\n )}\n\n {submitState === \"error\" && (\n <p className=\"text-xs text-destructive\">\n {submitError}\n {verifyEmailHref && submitError === \"Verify your email to claim a collection.\" && (\n <>\n {\" \"}\n <Link href={verifyEmailHref} className=\"underline font-medium hover:text-foreground\">\n Verify email\n </Link>\n </>\n )}\n </p>\n )}\n\n <p className=\"text-xs text-muted-foreground\">\n 3–20 characters, lowercase letters, numbers, underscores or hyphens. Claims are reviewed before\n going live.\n </p>\n </div>\n </SectionCard>\n );\n}\n"],"mappings":"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","names":[]}
@@ -16,6 +16,7 @@ declare const editionMintSchema: zod.ZodObject<{
16
16
  royalty: zod.ZodNumber;
17
17
  }, "strip", zod.ZodTypeAny, {
18
18
  name: string;
19
+ value: string;
19
20
  ipType: "Audio" | "Video" | "Art" | "Photography" | "NFT" | "Software" | "RWA" | "Patents" | "Posts" | "Publications" | "Documents" | "Custom";
20
21
  licenseType: string;
21
22
  commercialUse: "Yes" | "No";
@@ -24,12 +25,12 @@ declare const editionMintSchema: zod.ZodObject<{
24
25
  geographicScope: string;
25
26
  aiPolicy: "Allowed" | "Not Allowed" | "Training Only";
26
27
  royalty: number;
27
- value: string;
28
28
  recipient: string;
29
29
  description?: string | undefined;
30
30
  external_url?: string | undefined;
31
31
  }, {
32
32
  name: string;
33
+ value: string;
33
34
  ipType: "Audio" | "Video" | "Art" | "Photography" | "NFT" | "Software" | "RWA" | "Patents" | "Posts" | "Publications" | "Documents" | "Custom";
34
35
  licenseType: string;
35
36
  commercialUse: "Yes" | "No";
@@ -38,7 +39,6 @@ declare const editionMintSchema: zod.ZodObject<{
38
39
  geographicScope: string;
39
40
  aiPolicy: "Allowed" | "Not Allowed" | "Training Only";
40
41
  royalty: number;
41
- value: string;
42
42
  recipient: string;
43
43
  description?: string | undefined;
44
44
  external_url?: string | undefined;
@@ -16,6 +16,7 @@ declare const editionMintSchema: zod.ZodObject<{
16
16
  royalty: zod.ZodNumber;
17
17
  }, "strip", zod.ZodTypeAny, {
18
18
  name: string;
19
+ value: string;
19
20
  ipType: "Audio" | "Video" | "Art" | "Photography" | "NFT" | "Software" | "RWA" | "Patents" | "Posts" | "Publications" | "Documents" | "Custom";
20
21
  licenseType: string;
21
22
  commercialUse: "Yes" | "No";
@@ -24,12 +25,12 @@ declare const editionMintSchema: zod.ZodObject<{
24
25
  geographicScope: string;
25
26
  aiPolicy: "Allowed" | "Not Allowed" | "Training Only";
26
27
  royalty: number;
27
- value: string;
28
28
  recipient: string;
29
29
  description?: string | undefined;
30
30
  external_url?: string | undefined;
31
31
  }, {
32
32
  name: string;
33
+ value: string;
33
34
  ipType: "Audio" | "Video" | "Art" | "Photography" | "NFT" | "Software" | "RWA" | "Patents" | "Posts" | "Publications" | "Documents" | "Custom";
34
35
  licenseType: string;
35
36
  commercialUse: "Yes" | "No";
@@ -38,7 +39,6 @@ declare const editionMintSchema: zod.ZodObject<{
38
39
  geographicScope: string;
39
40
  aiPolicy: "Allowed" | "Not Allowed" | "Training Only";
40
41
  royalty: number;
41
- value: string;
42
42
  recipient: string;
43
43
  description?: string | undefined;
44
44
  external_url?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/medialane-app.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, type ComponentType, type ElementType, type ReactNode } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { FastMintSigner } from \"./fast-mint/types.js\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport type { ImageResolver } from \"../utils/ipfs.js\";\n\nexport type AssetRef = Pick<ApiToken, \"chain\" | \"contractAddress\" | \"tokenId\">;\n\nexport interface CompanionApp {\n title: string;\n description: string;\n icon: ElementType;\n origin: string;\n}\n\nexport type ReportTarget =\n | { type: \"TOKEN\"; contract: string; tokenId: string; name?: string }\n | { type: \"COLLECTION\"; contract: string; name?: string }\n | { type: \"CREATOR\"; address: string; name?: string }\n | { type: \"COMMENT\"; commentId: string };\n\nexport type ReportDialogSlot = ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; target: ReportTarget }>;\n\nexport interface MedialaneApp {\n getClient: () => MedialaneClient;\n getSigner: () => Promise<FastMintSigner> | FastMintSigner;\n walletAddress: string | null;\n walletLoading?: boolean;\n onRequireWallet: () => void;\n releaseSigner?: () => void;\n ensureSignedIn?: () => Promise<void>;\n connectLabel?: string;\n companion?: CompanionApp;\n ReportDialog?: ReportDialogSlot;\n resolveImage?: ImageResolver;\n}\n\nexport const MedialaneAppContext = createContext<MedialaneApp | null>(null);\n\nexport function MedialaneAppProvider({ value, children }: { value: MedialaneApp; children: ReactNode }) {\n return <MedialaneAppContext.Provider value={value}>{children}</MedialaneAppContext.Provider>;\n}\n\nexport function useMedialaneApp(): MedialaneApp {\n const app = useContext(MedialaneAppContext);\n if (!app) throw new Error(\"MedialaneAppProvider missing\");\n return app;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CS;AAxCT,mBAAgG;AAqCzF,MAAM,0BAAsB,4BAAmC,IAAI;AAEnE,SAAS,qBAAqB,EAAE,OAAO,SAAS,GAAiD;AACtG,SAAO,4CAAC,oBAAoB,UAApB,EAA6B,OAAe,UAAS;AAC/D;AAEO,SAAS,kBAAgC;AAC9C,QAAM,UAAM,yBAAW,mBAAmB;AAC1C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8BAA8B;AACxD,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/components/medialane-app.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, type ComponentType, type ElementType, type ReactNode } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { FastMintSigner } from \"./fast-mint/types.js\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport type { ImageResolver } from \"../utils/ipfs.js\";\n\nexport type AssetRef = Pick<ApiToken, \"chain\" | \"contractAddress\" | \"tokenId\">;\n\nexport interface CompanionApp {\n title: string;\n description: string;\n icon: ElementType;\n origin: string;\n}\n\nexport type ReportTarget =\n | { type: \"TOKEN\"; contract: string; tokenId: string; name?: string }\n | { type: \"COLLECTION\"; contract: string; name?: string }\n | { type: \"CREATOR\"; address: string; name?: string }\n | { type: \"COMMENT\"; commentId: string };\n\nexport type ReportDialogSlot = ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; target: ReportTarget }>;\n\nexport interface MedialaneApp {\n getClient: () => MedialaneClient;\n getSigner: () => Promise<FastMintSigner> | FastMintSigner;\n walletAddress: string | null;\n walletLoading?: boolean;\n onRequireWallet: () => void;\n releaseSigner?: () => void;\n ensureSignedIn?: () => Promise<void>;\n connectLabel?: string;\n verifyEmailHref?: string;\n companion?: CompanionApp;\n ReportDialog?: ReportDialogSlot;\n resolveImage?: ImageResolver;\n}\n\nexport const MedialaneAppContext = createContext<MedialaneApp | null>(null);\n\nexport function MedialaneAppProvider({ value, children }: { value: MedialaneApp; children: ReactNode }) {\n return <MedialaneAppContext.Provider value={value}>{children}</MedialaneAppContext.Provider>;\n}\n\nexport function useMedialaneApp(): MedialaneApp {\n const app = useContext(MedialaneAppContext);\n if (!app) throw new Error(\"MedialaneAppProvider missing\");\n return app;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CS;AAzCT,mBAAgG;AAsCzF,MAAM,0BAAsB,4BAAmC,IAAI;AAEnE,SAAS,qBAAqB,EAAE,OAAO,SAAS,GAAiD;AACtG,SAAO,4CAAC,oBAAoB,UAApB,EAA6B,OAAe,UAAS;AAC/D;AAEO,SAAS,kBAAgC;AAC9C,QAAM,UAAM,yBAAW,mBAAmB;AAC1C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8BAA8B;AACxD,SAAO;AACT;","names":[]}
@@ -45,6 +45,7 @@ interface MedialaneApp {
45
45
  releaseSigner?: () => void;
46
46
  ensureSignedIn?: () => Promise<void>;
47
47
  connectLabel?: string;
48
+ verifyEmailHref?: string;
48
49
  companion?: CompanionApp;
49
50
  ReportDialog?: ReportDialogSlot;
50
51
  resolveImage?: ImageResolver;
@@ -45,6 +45,7 @@ interface MedialaneApp {
45
45
  releaseSigner?: () => void;
46
46
  ensureSignedIn?: () => Promise<void>;
47
47
  connectLabel?: string;
48
+ verifyEmailHref?: string;
48
49
  companion?: CompanionApp;
49
50
  ReportDialog?: ReportDialogSlot;
50
51
  resolveImage?: ImageResolver;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/medialane-app.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, type ComponentType, type ElementType, type ReactNode } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { FastMintSigner } from \"./fast-mint/types.js\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport type { ImageResolver } from \"../utils/ipfs.js\";\n\nexport type AssetRef = Pick<ApiToken, \"chain\" | \"contractAddress\" | \"tokenId\">;\n\nexport interface CompanionApp {\n title: string;\n description: string;\n icon: ElementType;\n origin: string;\n}\n\nexport type ReportTarget =\n | { type: \"TOKEN\"; contract: string; tokenId: string; name?: string }\n | { type: \"COLLECTION\"; contract: string; name?: string }\n | { type: \"CREATOR\"; address: string; name?: string }\n | { type: \"COMMENT\"; commentId: string };\n\nexport type ReportDialogSlot = ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; target: ReportTarget }>;\n\nexport interface MedialaneApp {\n getClient: () => MedialaneClient;\n getSigner: () => Promise<FastMintSigner> | FastMintSigner;\n walletAddress: string | null;\n walletLoading?: boolean;\n onRequireWallet: () => void;\n releaseSigner?: () => void;\n ensureSignedIn?: () => Promise<void>;\n connectLabel?: string;\n companion?: CompanionApp;\n ReportDialog?: ReportDialogSlot;\n resolveImage?: ImageResolver;\n}\n\nexport const MedialaneAppContext = createContext<MedialaneApp | null>(null);\n\nexport function MedialaneAppProvider({ value, children }: { value: MedialaneApp; children: ReactNode }) {\n return <MedialaneAppContext.Provider value={value}>{children}</MedialaneAppContext.Provider>;\n}\n\nexport function useMedialaneApp(): MedialaneApp {\n const app = useContext(MedialaneAppContext);\n if (!app) throw new Error(\"MedialaneAppProvider missing\");\n return app;\n}\n"],"mappings":";AA0CS;AAxCT,SAAS,eAAe,kBAAwE;AAqCzF,MAAM,sBAAsB,cAAmC,IAAI;AAEnE,SAAS,qBAAqB,EAAE,OAAO,SAAS,GAAiD;AACtG,SAAO,oBAAC,oBAAoB,UAApB,EAA6B,OAAe,UAAS;AAC/D;AAEO,SAAS,kBAAgC;AAC9C,QAAM,MAAM,WAAW,mBAAmB;AAC1C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8BAA8B;AACxD,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/components/medialane-app.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, type ComponentType, type ElementType, type ReactNode } from \"react\";\nimport type { MedialaneClient } from \"@medialane/sdk/starknet\";\nimport type { FastMintSigner } from \"./fast-mint/types.js\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport type { ImageResolver } from \"../utils/ipfs.js\";\n\nexport type AssetRef = Pick<ApiToken, \"chain\" | \"contractAddress\" | \"tokenId\">;\n\nexport interface CompanionApp {\n title: string;\n description: string;\n icon: ElementType;\n origin: string;\n}\n\nexport type ReportTarget =\n | { type: \"TOKEN\"; contract: string; tokenId: string; name?: string }\n | { type: \"COLLECTION\"; contract: string; name?: string }\n | { type: \"CREATOR\"; address: string; name?: string }\n | { type: \"COMMENT\"; commentId: string };\n\nexport type ReportDialogSlot = ComponentType<{ open: boolean; onOpenChange: (open: boolean) => void; target: ReportTarget }>;\n\nexport interface MedialaneApp {\n getClient: () => MedialaneClient;\n getSigner: () => Promise<FastMintSigner> | FastMintSigner;\n walletAddress: string | null;\n walletLoading?: boolean;\n onRequireWallet: () => void;\n releaseSigner?: () => void;\n ensureSignedIn?: () => Promise<void>;\n connectLabel?: string;\n verifyEmailHref?: string;\n companion?: CompanionApp;\n ReportDialog?: ReportDialogSlot;\n resolveImage?: ImageResolver;\n}\n\nexport const MedialaneAppContext = createContext<MedialaneApp | null>(null);\n\nexport function MedialaneAppProvider({ value, children }: { value: MedialaneApp; children: ReactNode }) {\n return <MedialaneAppContext.Provider value={value}>{children}</MedialaneAppContext.Provider>;\n}\n\nexport function useMedialaneApp(): MedialaneApp {\n const app = useContext(MedialaneAppContext);\n if (!app) throw new Error(\"MedialaneAppProvider missing\");\n return app;\n}\n"],"mappings":";AA2CS;AAzCT,SAAS,eAAe,kBAAwE;AAsCzF,MAAM,sBAAsB,cAAmC,IAAI;AAEnE,SAAS,qBAAqB,EAAE,OAAO,SAAS,GAAiD;AACtG,SAAO,oBAAC,oBAAoB,UAApB,EAA6B,OAAe,UAAS;AAC/D;AAEO,SAAS,kBAAgC;AAC9C,QAAM,MAAM,WAAW,mBAAmB;AAC1C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8BAA8B;AACxD,SAAO;AACT;","names":[]}
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var mint_landing_exports = {};
31
+ __export(mint_landing_exports, {
32
+ MintLanding: () => MintLanding
33
+ });
34
+ module.exports = __toCommonJS(mint_landing_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = require("react");
37
+ var import_lucide_react = require("lucide-react");
38
+ var import_image = __toESM(require("./image.js"), 1);
39
+ var import_link = __toESM(require("./link.js"), 1);
40
+ var import_brand_logo = require("./brand-logo.js");
41
+ const DOCS = "https://docs.medialane.io";
42
+ const FUND_STYLES = [
43
+ { icon: import_lucide_react.FileCheck, color: "text-blue-400", bg: "bg-blue-500/10" },
44
+ { icon: import_lucide_react.Coins, color: "text-yellow-500", bg: "bg-yellow-500/10" },
45
+ { icon: import_lucide_react.Users, color: "text-purple-400", bg: "bg-purple-500/10" }
46
+ ];
47
+ function EventCard({ image }) {
48
+ const [errored, setErrored] = (0, import_react.useState)(false);
49
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative rounded-3xl overflow-hidden border border-border/40 shadow-2xl shadow-black/20 aspect-square w-full", children: errored ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "w-full h-full bg-gradient-to-br from-yellow-500/10 via-orange-500/10 to-purple-500/10 flex flex-col items-center justify-center gap-3", children: [
50
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-16 w-16 rounded-2xl bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ImageIcon, { className: "h-8 w-8 text-primary/40" }) }),
51
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground font-medium", children: image.fallback })
52
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
53
+ import_image.default,
54
+ {
55
+ src: image.src,
56
+ alt: image.alt,
57
+ fill: true,
58
+ sizes: "(min-width: 1024px) 50vw, 100vw",
59
+ className: "object-cover",
60
+ onError: () => setErrored(true)
61
+ }
62
+ ) });
63
+ }
64
+ const DocLink = ({ path, className, children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: `${DOCS}${path}`, target: "_blank", rel: "noopener noreferrer", className, children });
65
+ function MintLanding({ copy, mint }) {
66
+ const { how, phases, eligibility, disclaimer, footer } = copy;
67
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-h-screen flex flex-col bg-background", children: [
68
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", { className: "px-6 py-4 flex items-center border-b border-border/30", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_brand_logo.MedialaneLogoFull, {}) }) }),
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex-1 w-full", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "max-w-5xl mx-auto px-5 sm:px-8", children: [
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", { className: "py-10 lg:py-16", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-16 items-start", children: [
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-5", children: [
72
+ copy.badge && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "inline-flex items-center gap-2 rounded-full border border-yellow-500/30 bg-yellow-500/5 px-3 py-1", children: [
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Sparkles, { className: "h-3.5 w-3.5 text-yellow-500" }),
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-semibold text-yellow-600 dark:text-yellow-400", children: copy.badge })
75
+ ] }),
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h1", { className: "text-4xl sm:text-5xl lg:text-6xl font-semibold tracking-tight leading-[1.05]", children: [
77
+ copy.headline.lead,
78
+ " ",
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "bg-gradient-to-r from-yellow-400 to-orange-500 bg-clip-text text-transparent", children: copy.headline.highlight })
80
+ ] }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1.5", children: copy.chips.map((t) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-1.5 text-xs text-muted-foreground/80", children: [
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCircle2, { className: "h-3 w-3 text-emerald-500/70" }),
83
+ t
84
+ ] }, t)) }),
85
+ mint,
86
+ copy.intro && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground leading-relaxed", children: copy.intro })
87
+ ] }),
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "lg:sticky lg:top-24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EventCard, { image: copy.image }) })
89
+ ] }) }),
90
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("details", { className: "group border-t border-border/30", children: [
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("summary", { className: "flex items-center justify-center gap-2 py-6 cursor-pointer list-none text-sm font-medium text-muted-foreground hover:text-foreground transition-colors [&::-webkit-details-marker]:hidden", children: [
92
+ copy.learnMore,
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronDown, { className: "h-4 w-4 transition-transform group-open:rotate-180" })
94
+ ] }),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "pb-8 space-y-0", children: [
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "py-8 border-t border-border/30 space-y-6", children: [
97
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-2xl sm:text-3xl font-black", children: copy.fund.title }),
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-4", children: copy.fund.cards.map(({ title, body }, i) => {
99
+ const { icon: Icon, color, bg } = FUND_STYLES[i];
100
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-4 p-5 rounded-2xl border border-border/40 bg-card/30", children: [
101
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: `h-11 w-11 rounded-xl ${bg} flex items-center justify-center shrink-0`, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: `h-5 w-5 ${color}` }) }),
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-bold", children: title }),
104
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground mt-1 leading-relaxed", children: body })
105
+ ] })
106
+ ] }, title);
107
+ }) })
108
+ ] }),
109
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "py-8 border-t border-border/30 space-y-6", children: [
110
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "max-w-2xl", children: [
111
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground mb-1", children: how.eyebrow }),
112
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-2xl sm:text-3xl font-black", children: how.title })
113
+ ] }),
114
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "rounded-2xl border-2 border-emerald-500/30 bg-emerald-500/5 p-6", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start gap-4", children: [
115
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-12 w-12 rounded-xl bg-emerald-500/15 flex items-center justify-center shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.UserCheck, { className: "h-6 w-6 text-emerald-500" }) }),
116
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex-1", children: [
117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 flex-wrap", children: [
118
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-black text-lg", children: how.account.title }),
119
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-bold bg-emerald-500/15 text-emerald-600 dark:text-emerald-400 px-2.5 py-0.5 rounded-full", children: how.account.tag })
120
+ ] }),
121
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground mt-1 leading-relaxed", children: how.account.body })
122
+ ] })
123
+ ] }) }),
124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [
125
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-2xl border border-border/40 bg-card/30 p-5 space-y-3", children: [
126
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-3", children: [
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-10 w-10 rounded-xl bg-purple-500/10 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.PenLine, { className: "h-5 w-5 text-purple-400" }) }),
128
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-semibold text-purple-400 bg-purple-500/10 px-2.5 py-1 rounded-full", children: how.create.tag })
129
+ ] }),
130
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
131
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-bold", children: how.create.title }),
132
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground mt-1 leading-relaxed", children: how.create.body })
133
+ ] })
134
+ ] }),
135
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-2xl border border-border/40 bg-card/30 p-5 space-y-3", children: [
136
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-3", children: [
137
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-10 w-10 rounded-xl bg-orange-500/10 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ShoppingCart, { className: "h-5 w-5 text-orange-400" }) }),
138
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-semibold text-orange-400 bg-orange-500/10 px-2.5 py-1 rounded-full", children: how.trade.tag })
139
+ ] }),
140
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
141
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-bold", children: how.trade.title }),
142
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground mt-1 leading-relaxed", children: how.trade.body })
143
+ ] })
144
+ ] })
145
+ ] })
146
+ ] }),
147
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "py-8 border-t border-border/30 space-y-6", children: [
148
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "max-w-2xl", children: [
149
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground mb-1", children: phases.eyebrow }),
150
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-2xl sm:text-3xl font-black", children: phases.title })
151
+ ] }),
152
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [
153
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-2xl border border-blue-500/30 bg-blue-500/5 p-5 space-y-3", children: [
154
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-3", children: [
155
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-bold text-lg", children: phases.first.title }),
156
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-semibold bg-blue-500/10 text-blue-400 px-2.5 py-1 rounded-full", children: phases.first.tag })
157
+ ] }),
158
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground leading-relaxed", children: phases.first.body })
159
+ ] }),
160
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-2xl border border-purple-500/30 bg-purple-500/5 p-5 space-y-3", children: [
161
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-3", children: [
162
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-bold text-lg", children: phases.second.title }),
163
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs font-semibold bg-purple-500/10 text-purple-400 px-2.5 py-1 rounded-full", children: phases.second.tag })
164
+ ] }),
165
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground leading-relaxed", children: phases.second.body })
166
+ ] })
167
+ ] }),
168
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "rounded-2xl border border-border/40 bg-muted/10 p-4 flex items-start gap-3", children: [
169
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Info, { className: "h-4 w-4 text-muted-foreground shrink-0 mt-0.5" }),
170
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground leading-relaxed", children: phases.note })
171
+ ] })
172
+ ] }),
173
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", { className: "py-8 border-t border-border/30", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-10", children: [
174
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-4", children: [
175
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
176
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground mb-1", children: eligibility.eyebrow }),
177
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-2xl font-black", children: eligibility.title })
178
+ ] }),
179
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "space-y-2.5 text-sm", children: eligibility.items.map(({ ok, text }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start gap-3", children: [
180
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: `h-5 w-5 rounded-full flex items-center justify-center shrink-0 mt-0.5 ${ok ? "bg-emerald-500/10" : "bg-destructive/10"}`, children: ok ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCircle2, { className: "h-3 w-3 text-emerald-500" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.XCircle, { className: "h-3 w-3 text-destructive" }) }),
181
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground leading-relaxed", children: text })
182
+ ] }, text)) })
183
+ ] }),
184
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-4", children: [
185
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
186
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Shield, { className: "h-4 w-4 text-muted-foreground" }),
187
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-2xl font-black", children: disclaimer.title })
188
+ ] }),
189
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-3 text-sm text-muted-foreground leading-relaxed", children: [
190
+ disclaimer.paragraphs.map((p) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: p }, p)),
191
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { children: [
192
+ disclaimer.agree.lead,
193
+ " ",
194
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DocLink, { path: "/guidelines/campaign-terms", className: "underline underline-offset-2 hover:text-foreground transition-colors", children: disclaimer.agree.campaignTerms }),
195
+ " ",
196
+ disclaimer.agree.and,
197
+ " ",
198
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DocLink, { path: "/guidelines/terms", className: "underline underline-offset-2 hover:text-foreground transition-colors", children: disclaimer.agree.terms }),
199
+ "."
200
+ ] })
201
+ ] })
202
+ ] })
203
+ ] }) })
204
+ ] })
205
+ ] }),
206
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "pb-12" })
207
+ ] }) }),
208
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("footer", { className: "border-t border-border/40", children: [
209
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-2xs text-center text-muted-foreground/50 px-5 pt-4", children: [
210
+ footer.line,
211
+ " ",
212
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DocLink, { path: "/guidelines/campaign-terms", className: "underline underline-offset-2 hover:text-muted-foreground/80 transition-colors", children: footer.campaignTerms })
213
+ ] }),
214
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "px-5 py-4 flex items-center justify-center gap-5 text-xs text-muted-foreground flex-wrap", children: [
215
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DocLink, { path: "/guidelines/terms", className: "hover:text-foreground transition-colors", children: footer.links.terms }),
216
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DocLink, { path: "/guidelines/privacy", className: "hover:text-foreground transition-colors", children: footer.links.privacy }),
217
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DocLink, { path: "/guidelines/campaign-terms", className: "hover:text-foreground transition-colors", children: footer.links.campaign }),
218
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DocLink, { path: "/about", className: "hover:text-foreground transition-colors", children: footer.links.about }),
219
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
220
+ "\xA9 ",
221
+ (/* @__PURE__ */ new Date()).getFullYear(),
222
+ " Medialane"
223
+ ] })
224
+ ] })
225
+ ] })
226
+ ] });
227
+ }
228
+ // Annotate the CommonJS export names for ESM import in node:
229
+ 0 && (module.exports = {
230
+ MintLanding
231
+ });
232
+ //# sourceMappingURL=mint-landing.cjs.map