@medialane/ui 0.12.0 → 0.13.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 (49) hide show
  1. package/dist/components/asset-markets-tab.cjs +111 -0
  2. package/dist/components/asset-markets-tab.cjs.map +1 -0
  3. package/dist/components/asset-markets-tab.d.cts +16 -0
  4. package/dist/components/asset-markets-tab.d.ts +16 -0
  5. package/dist/components/asset-markets-tab.js +87 -0
  6. package/dist/components/asset-markets-tab.js.map +1 -0
  7. package/dist/components/asset-overview-content.cjs +102 -0
  8. package/dist/components/asset-overview-content.cjs.map +1 -0
  9. package/dist/components/asset-overview-content.d.cts +14 -0
  10. package/dist/components/asset-overview-content.d.ts +14 -0
  11. package/dist/components/asset-overview-content.js +78 -0
  12. package/dist/components/asset-overview-content.js.map +1 -0
  13. package/dist/components/ip-type-display.cjs +201 -0
  14. package/dist/components/ip-type-display.cjs.map +1 -0
  15. package/dist/components/ip-type-display.d.cts +12 -0
  16. package/dist/components/ip-type-display.d.ts +12 -0
  17. package/dist/components/ip-type-display.js +181 -0
  18. package/dist/components/ip-type-display.js.map +1 -0
  19. package/dist/components/launchpad-strip.cjs +150 -0
  20. package/dist/components/launchpad-strip.cjs.map +1 -0
  21. package/dist/components/launchpad-strip.d.cts +16 -0
  22. package/dist/components/launchpad-strip.d.ts +16 -0
  23. package/dist/components/launchpad-strip.js +116 -0
  24. package/dist/components/launchpad-strip.js.map +1 -0
  25. package/dist/data/ip-templates.cjs +206 -0
  26. package/dist/data/ip-templates.cjs.map +1 -0
  27. package/dist/data/ip-templates.d.cts +45 -0
  28. package/dist/data/ip-templates.d.ts +45 -0
  29. package/dist/data/ip-templates.js +200 -0
  30. package/dist/data/ip-templates.js.map +1 -0
  31. package/dist/data/ip.cjs +163 -0
  32. package/dist/data/ip.cjs.map +1 -0
  33. package/dist/data/ip.d.cts +18 -0
  34. package/dist/data/ip.d.ts +18 -0
  35. package/dist/data/ip.js +134 -0
  36. package/dist/data/ip.js.map +1 -0
  37. package/dist/index.cjs +36 -0
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +9 -3
  40. package/dist/index.d.ts +9 -3
  41. package/dist/index.js +34 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/utils/time.cjs +15 -2
  44. package/dist/utils/time.cjs.map +1 -1
  45. package/dist/utils/time.d.cts +3 -1
  46. package/dist/utils/time.d.ts +3 -1
  47. package/dist/utils/time.js +13 -1
  48. package/dist/utils/time.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /** Homepage launchpad strip — cards derive from the shared launchpad service
4
+ * definitions: creator language, one blurb, one example, one vivid verb pill.
5
+ * No tech chips, no long descriptions. Apps inject only hrefs. */
6
+ interface LaunchpadStripProps {
7
+ /** Per-service destinations, keyed by service key. Services without an href are skipped. */
8
+ hrefs: Record<string, string>;
9
+ /** Marketplace card destination (omit to hide the marketplace card) */
10
+ marketplaceHref?: string;
11
+ /** "Explore" header link */
12
+ launchpadHref?: string;
13
+ }
14
+ declare function LaunchpadStrip({ hrefs, marketplaceHref, launchpadHref, }: LaunchpadStripProps): react_jsx_runtime.JSX.Element;
15
+
16
+ export { LaunchpadStrip, type LaunchpadStripProps };
@@ -0,0 +1,116 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import Link from "next/link";
4
+ import { ShoppingBag, ArrowRight, Rocket } from "lucide-react";
5
+ import { ScrollSection } from "./scroll-section.js";
6
+ import { SERVICE_HUES } from "./launchpad-services.js";
7
+ import { LAUNCHPAD_SERVICE_DEFINITIONS } from "../data/launchpad-services.js";
8
+ import { cn } from "../utils/cn.js";
9
+ const DEF_BY_KEY = Object.fromEntries(LAUNCHPAD_SERVICE_DEFINITIONS.map((d) => [d.key, d]));
10
+ const STRIP_ORDER = [
11
+ "mint-ip-asset",
12
+ "create-collection",
13
+ "ip-collection-1155",
14
+ "mint-editions",
15
+ "collection-drop",
16
+ "pop-protocol"
17
+ ];
18
+ const MARKETPLACE_HUE = {
19
+ text: "text-indigo-600 dark:text-indigo-400",
20
+ solid: "bg-indigo-500",
21
+ border: "border-indigo-500/25",
22
+ pill: "bg-gradient-to-r from-indigo-500 to-blue-600"
23
+ };
24
+ function ServiceCard({ card }) {
25
+ const { icon: Icon, title, blurb, example, cta, hue, href } = card;
26
+ return /* @__PURE__ */ jsxs(
27
+ Link,
28
+ {
29
+ href,
30
+ className: cn(
31
+ "relative rounded-2xl border bg-card overflow-hidden flex flex-col h-full min-h-[280px]",
32
+ "transition-transform active:scale-[0.99]",
33
+ hue.border
34
+ ),
35
+ children: [
36
+ /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "absolute -right-7 -bottom-9 opacity-[0.04] select-none pointer-events-none", children: /* @__PURE__ */ jsx(Icon, { className: "h-36 w-36" }) }),
37
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col flex-1 p-6 gap-3.5", children: [
38
+ /* @__PURE__ */ jsxs("div", { className: "relative w-fit", children: [
39
+ /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: cn("absolute -inset-3 rounded-full blur-2xl opacity-30", hue.solid) }),
40
+ /* @__PURE__ */ jsx(Icon, { className: cn("relative h-8 w-8", hue.text) })
41
+ ] }),
42
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
43
+ /* @__PURE__ */ jsx("h3", { className: "text-xl font-black tracking-tight leading-snug", children: title }),
44
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: blurb }),
45
+ example && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground/70 italic leading-relaxed", children: [
46
+ "e.g. ",
47
+ example
48
+ ] })
49
+ ] }),
50
+ /* @__PURE__ */ jsx("div", { className: "mt-auto pt-1 flex justify-end", children: /* @__PURE__ */ jsxs(
51
+ "span",
52
+ {
53
+ className: cn(
54
+ "inline-flex items-center gap-2 h-9 px-4 rounded-full",
55
+ "text-sm font-semibold text-white shadow-lg shadow-black/25",
56
+ hue.pill
57
+ ),
58
+ children: [
59
+ cta,
60
+ /* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5" })
61
+ ]
62
+ }
63
+ ) })
64
+ ] })
65
+ ]
66
+ }
67
+ );
68
+ }
69
+ function LaunchpadStrip({
70
+ hrefs,
71
+ marketplaceHref,
72
+ launchpadHref = "/launchpad"
73
+ }) {
74
+ const cards = [
75
+ ...STRIP_ORDER.flatMap((key) => {
76
+ const def = DEF_BY_KEY[key];
77
+ const href = hrefs[key];
78
+ if (!def || !href) return [];
79
+ return [{
80
+ key,
81
+ href,
82
+ icon: def.icon,
83
+ title: def.title,
84
+ blurb: def.blurb,
85
+ example: def.example,
86
+ cta: def.cta,
87
+ hue: SERVICE_HUES[key] ?? MARKETPLACE_HUE
88
+ }];
89
+ }),
90
+ ...marketplaceHref ? [{
91
+ key: "marketplace",
92
+ href: marketplaceHref,
93
+ icon: ShoppingBag,
94
+ title: "Marketplace",
95
+ blurb: "Discover and trade works from creators \u2014 gasless, instantly settled.",
96
+ example: "Buy an art print, make an offer on a music track",
97
+ cta: "Browse",
98
+ hue: MARKETPLACE_HUE
99
+ }] : []
100
+ ];
101
+ return /* @__PURE__ */ jsx(
102
+ ScrollSection,
103
+ {
104
+ icon: /* @__PURE__ */ jsx(Rocket, { className: "h-3.5 w-3.5 text-white" }),
105
+ iconBg: "bg-gradient-to-br from-primary to-blue-600 shadow-md shadow-primary/20",
106
+ title: "Launchpad",
107
+ href: launchpadHref,
108
+ linkLabel: "Explore",
109
+ children: cards.map((card) => /* @__PURE__ */ jsx("div", { className: "w-64 sm:w-72 snap-start shrink-0 flex", children: /* @__PURE__ */ jsx(ServiceCard, { card }) }, card.key))
110
+ }
111
+ );
112
+ }
113
+ export {
114
+ LaunchpadStrip
115
+ };
116
+ //# sourceMappingURL=launchpad-strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/launchpad-strip.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ShoppingBag, ArrowRight, Rocket } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { ScrollSection } from \"./scroll-section.js\";\nimport { SERVICE_HUES } from \"./launchpad-services.js\";\nimport { LAUNCHPAD_SERVICE_DEFINITIONS } from \"../data/launchpad-services.js\";\nimport { cn } from \"../utils/cn.js\";\n\n/** Homepage launchpad strip — cards derive from the shared launchpad service\n * definitions: creator language, one blurb, one example, one vivid verb pill.\n * No tech chips, no long descriptions. Apps inject only hrefs. */\n\nexport interface LaunchpadStripProps {\n /** Per-service destinations, keyed by service key. Services without an href are skipped. */\n hrefs: Record<string, string>;\n /** Marketplace card destination (omit to hide the marketplace card) */\n marketplaceHref?: string;\n /** \"Explore\" header link */\n launchpadHref?: string;\n}\n\ninterface StripCard {\n key: string;\n href: string;\n icon: LucideIcon;\n title: string;\n blurb: string;\n example?: string;\n cta: string;\n hue: { text: string; solid: string; border: string; pill: string };\n}\n\nconst DEF_BY_KEY = Object.fromEntries(LAUNCHPAD_SERVICE_DEFINITIONS.map((d) => [d.key, d]));\n\n/** Display order on the homepage strip */\nconst STRIP_ORDER = [\n \"mint-ip-asset\",\n \"create-collection\",\n \"ip-collection-1155\",\n \"mint-editions\",\n \"collection-drop\",\n \"pop-protocol\",\n];\n\nconst MARKETPLACE_HUE = {\n text: \"text-indigo-600 dark:text-indigo-400\",\n solid: \"bg-indigo-500\",\n border: \"border-indigo-500/25\",\n pill: \"bg-gradient-to-r from-indigo-500 to-blue-600\",\n};\n\nfunction ServiceCard({ card }: { card: StripCard }) {\n const { icon: Icon, title, blurb, example, cta, hue, href } = card;\n return (\n <Link\n href={href}\n className={cn(\n \"relative rounded-2xl border bg-card overflow-hidden flex flex-col h-full min-h-[280px]\",\n \"transition-transform active:scale-[0.99]\",\n hue.border,\n )}\n >\n {/* Ghosted watermark icon (launchpad card language) */}\n <div aria-hidden className=\"absolute -right-7 -bottom-9 opacity-[0.04] select-none pointer-events-none\">\n <Icon className=\"h-36 w-36\" />\n </div>\n\n <div className=\"relative flex flex-col flex-1 p-6 gap-3.5\">\n <div className=\"relative w-fit\">\n <div aria-hidden className={cn(\"absolute -inset-3 rounded-full blur-2xl opacity-30\", hue.solid)} />\n <Icon className={cn(\"relative h-8 w-8\", hue.text)} />\n </div>\n\n <div className=\"space-y-1.5\">\n <h3 className=\"text-xl font-black tracking-tight leading-snug\">{title}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">{blurb}</p>\n {example && (\n <p className=\"text-xs text-muted-foreground/70 italic leading-relaxed\">e.g. {example}</p>\n )}\n </div>\n\n <div className=\"mt-auto pt-1 flex justify-end\">\n <span\n className={cn(\n \"inline-flex items-center gap-2 h-9 px-4 rounded-full\",\n \"text-sm font-semibold text-white shadow-lg shadow-black/25\",\n hue.pill,\n )}\n >\n {cta}\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </span>\n </div>\n </div>\n </Link>\n );\n}\n\nexport function LaunchpadStrip({\n hrefs,\n marketplaceHref,\n launchpadHref = \"/launchpad\",\n}: LaunchpadStripProps) {\n const cards: StripCard[] = [\n ...STRIP_ORDER.flatMap((key) => {\n const def = DEF_BY_KEY[key];\n const href = hrefs[key];\n if (!def || !href) return [];\n return [{\n key,\n href,\n icon: def.icon,\n title: def.title,\n blurb: def.blurb,\n example: def.example,\n cta: def.cta,\n hue: SERVICE_HUES[key] ?? MARKETPLACE_HUE,\n }];\n }),\n ...(marketplaceHref\n ? [{\n key: \"marketplace\",\n href: marketplaceHref,\n icon: ShoppingBag,\n title: \"Marketplace\",\n blurb: \"Discover and trade works from creators — gasless, instantly settled.\",\n example: \"Buy an art print, make an offer on a music track\",\n cta: \"Browse\",\n hue: MARKETPLACE_HUE,\n }]\n : []),\n ];\n\n return (\n <ScrollSection\n icon={<Rocket className=\"h-3.5 w-3.5 text-white\" />}\n iconBg=\"bg-gradient-to-br from-primary to-blue-600 shadow-md shadow-primary/20\"\n title=\"Launchpad\"\n href={launchpadHref}\n linkLabel=\"Explore\"\n >\n {cards.map((card) => (\n <div key={card.key} className=\"w-64 sm:w-72 snap-start shrink-0 flex\">\n <ServiceCard card={card} />\n </div>\n ))}\n </ScrollSection>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,206 @@
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 ip_templates_exports = {};
20
+ __export(ip_templates_exports, {
21
+ EMBED_PLATFORM_META: () => EMBED_PLATFORM_META,
22
+ IP_TEMPLATES: () => IP_TEMPLATES,
23
+ SOCIAL_PLATFORM_META: () => SOCIAL_PLATFORM_META,
24
+ TEMPLATE_TRAIT_TYPES: () => TEMPLATE_TRAIT_TYPES
25
+ });
26
+ module.exports = __toCommonJS(ip_templates_exports);
27
+ var import_lucide_react = require("lucide-react");
28
+ const EMBED_PLATFORM_META = {
29
+ spotify: { label: "Spotify", icon: import_lucide_react.Music2, traitKey: "Spotify URL", placeholder: "https://open.spotify.com/\u2026" },
30
+ soundcloud: { label: "SoundCloud", icon: import_lucide_react.AudioLines, traitKey: "SoundCloud URL", placeholder: "https://soundcloud.com/\u2026" },
31
+ youtube: { label: "YouTube", icon: import_lucide_react.Youtube, traitKey: "YouTube URL", placeholder: "https://youtube.com/watch?v=\u2026" },
32
+ tiktok: { label: "TikTok", icon: import_lucide_react.Video, traitKey: "TikTok URL", placeholder: "https://tiktok.com/@\u2026/video/\u2026" },
33
+ vimeo: { label: "Vimeo", icon: import_lucide_react.Video, traitKey: "Vimeo URL", placeholder: "https://vimeo.com/\u2026" }
34
+ };
35
+ const SOCIAL_PLATFORM_META = {
36
+ x: { label: "X", icon: import_lucide_react.Twitter, traitKey: "X", placeholder: "https://x.com/\u2026" },
37
+ instagram: { label: "Instagram", icon: import_lucide_react.Instagram, traitKey: "Instagram", placeholder: "https://instagram.com/\u2026" },
38
+ facebook: { label: "Facebook", icon: import_lucide_react.Facebook, traitKey: "Facebook", placeholder: "https://facebook.com/\u2026" },
39
+ tiktok: { label: "TikTok", icon: import_lucide_react.Video, traitKey: "TikTok", placeholder: "https://tiktok.com/@\u2026" },
40
+ website: { label: "Website", icon: import_lucide_react.Globe, traitKey: "Website", placeholder: "https://\u2026" }
41
+ };
42
+ const IP_TEMPLATES = {
43
+ Audio: {
44
+ type: "Audio",
45
+ label: "Audio",
46
+ description: "Music, podcasts, sound effects, audio art",
47
+ icon: import_lucide_react.Music,
48
+ color: { bg: "bg-blue-500/10", text: "text-blue-400", border: "border-blue-500/20" },
49
+ embeds: ["spotify", "soundcloud"],
50
+ traitSuggestions: [
51
+ { key: "Artist" },
52
+ { key: "Genre", placeholder: "Soundtrack" },
53
+ { key: "Mood" },
54
+ { key: "Label" }
55
+ ]
56
+ },
57
+ Video: {
58
+ type: "Video",
59
+ label: "Video",
60
+ description: "Films, animations, short-form video content",
61
+ icon: import_lucide_react.Clapperboard,
62
+ color: { bg: "bg-red-500/10", text: "text-red-400", border: "border-red-500/20" },
63
+ embeds: ["youtube", "tiktok", "vimeo"],
64
+ traitSuggestions: [
65
+ { key: "Director" },
66
+ { key: "Genre" },
67
+ { key: "Cast" },
68
+ { key: "Studio" }
69
+ ]
70
+ },
71
+ Art: {
72
+ type: "Art",
73
+ label: "Art",
74
+ description: "Digital and physical artwork, illustrations, generative art",
75
+ icon: import_lucide_react.Palette,
76
+ color: { bg: "bg-purple-500/10", text: "text-purple-400", border: "border-purple-500/20" },
77
+ traitSuggestions: [
78
+ { key: "Medium", placeholder: "Oil on canvas" },
79
+ { key: "Style", placeholder: "Impressionism" },
80
+ { key: "Materials" },
81
+ { key: "Series" }
82
+ ]
83
+ },
84
+ Photography: {
85
+ type: "Photography",
86
+ label: "Photography",
87
+ description: "Photography, photo essays, visual documentation",
88
+ icon: import_lucide_react.Camera,
89
+ color: { bg: "bg-orange-500/10", text: "text-orange-400", border: "border-orange-500/20" },
90
+ traitSuggestions: [
91
+ { key: "Camera", placeholder: "Sony A7 IV" },
92
+ { key: "Location" },
93
+ { key: "Series" },
94
+ { key: "Edition" }
95
+ ]
96
+ },
97
+ Posts: {
98
+ type: "Posts",
99
+ label: "Posts",
100
+ description: "Articles, blog posts, social media content, essays",
101
+ icon: import_lucide_react.MessageSquare,
102
+ color: { bg: "bg-sky-500/10", text: "text-sky-400", border: "border-sky-500/20" },
103
+ socials: ["x", "instagram", "facebook", "tiktok", "website"],
104
+ traitSuggestions: [
105
+ { key: "Author" },
106
+ { key: "Topic" },
107
+ { key: "Category" }
108
+ ]
109
+ },
110
+ Publications: {
111
+ type: "Publications",
112
+ label: "Publications",
113
+ description: "Books, journals, magazines, academic papers",
114
+ icon: import_lucide_react.BookOpen,
115
+ color: { bg: "bg-indigo-500/10", text: "text-indigo-400", border: "border-indigo-500/20" },
116
+ socials: ["x", "instagram", "website"],
117
+ traitSuggestions: [
118
+ { key: "Author" },
119
+ { key: "Publisher" },
120
+ { key: "Language", placeholder: "English" },
121
+ { key: "Edition" }
122
+ ]
123
+ },
124
+ Documents: {
125
+ type: "Documents",
126
+ label: "Documents",
127
+ description: "Contracts, reports, whitepapers, legal documents",
128
+ icon: import_lucide_react.FileText,
129
+ color: { bg: "bg-zinc-500/10", text: "text-zinc-400", border: "border-zinc-500/20" },
130
+ traitSuggestions: [
131
+ { key: "Author" },
132
+ { key: "Category" },
133
+ { key: "Language", placeholder: "English" }
134
+ ]
135
+ },
136
+ Patents: {
137
+ type: "Patents",
138
+ label: "Patents",
139
+ description: "Patents, inventions, technical innovations",
140
+ icon: import_lucide_react.Award,
141
+ color: { bg: "bg-amber-500/10", text: "text-amber-400", border: "border-amber-500/20" },
142
+ traitSuggestions: [
143
+ { key: "Inventor" },
144
+ { key: "Field" },
145
+ { key: "Status" }
146
+ ]
147
+ },
148
+ Software: {
149
+ type: "Software",
150
+ label: "Software",
151
+ description: "Applications, scripts, algorithms, code libraries",
152
+ icon: import_lucide_react.Code2,
153
+ color: { bg: "bg-violet-500/10", text: "text-violet-400", border: "border-violet-500/20" },
154
+ socials: ["website"],
155
+ traitSuggestions: [
156
+ { key: "Language", placeholder: "TypeScript" },
157
+ { key: "License" },
158
+ { key: "Platform" }
159
+ ]
160
+ },
161
+ NFT: {
162
+ type: "NFT",
163
+ label: "NFT",
164
+ description: "Blockchain-native digital assets and collectibles",
165
+ icon: import_lucide_react.Hexagon,
166
+ color: { bg: "bg-teal-500/10", text: "text-teal-400", border: "border-teal-500/20" },
167
+ traitSuggestions: [
168
+ { key: "Collection" },
169
+ { key: "Edition" },
170
+ { key: "Rarity", options: ["Common", "Uncommon", "Rare", "Epic", "Legendary"] }
171
+ ]
172
+ },
173
+ RWA: {
174
+ type: "RWA",
175
+ label: "Real World Asset",
176
+ description: "Tokenized physical assets: real estate, commodities, collectibles",
177
+ icon: import_lucide_react.Building2,
178
+ color: { bg: "bg-emerald-500/10", text: "text-emerald-400", border: "border-emerald-500/20" },
179
+ traitSuggestions: [
180
+ { key: "Asset Type" },
181
+ { key: "Location" },
182
+ { key: "Category" }
183
+ ]
184
+ },
185
+ Custom: {
186
+ type: "Custom",
187
+ label: "Custom",
188
+ description: "Custom IP type \u2014 add your own trait pairs for any metadata",
189
+ icon: import_lucide_react.Layers,
190
+ color: { bg: "bg-muted/50", text: "text-muted-foreground", border: "border-border" }
191
+ }
192
+ };
193
+ const TEMPLATE_TRAIT_TYPES = /* @__PURE__ */ new Set([
194
+ "IP Type",
195
+ ...Object.values(EMBED_PLATFORM_META).map((m) => m.traitKey),
196
+ ...Object.values(SOCIAL_PLATFORM_META).map((m) => m.traitKey),
197
+ ...Object.values(IP_TEMPLATES).flatMap((t) => (t.traitSuggestions ?? []).map((s) => s.key))
198
+ ]);
199
+ // Annotate the CommonJS export names for ESM import in node:
200
+ 0 && (module.exports = {
201
+ EMBED_PLATFORM_META,
202
+ IP_TEMPLATES,
203
+ SOCIAL_PLATFORM_META,
204
+ TEMPLATE_TRAIT_TYPES
205
+ });
206
+ //# sourceMappingURL=ip-templates.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/data/ip-templates.ts"],"sourcesContent":["import {\n Music, Palette, FileText, Hexagon, Clapperboard, Camera,\n Award, MessageSquare, BookOpen, Building2, Code2, Layers,\n Music2, AudioLines, Youtube, Video, Twitter, Instagram, Facebook, Globe,\n type LucideIcon,\n} from \"lucide-react\";\nimport type { IPType } from \"./ip.js\";\n\n// ── Embeds (inline iframe players) ──────────────────────────────────────────\n// Only platforms with clean iframe embeds. Each maps to a stored trait_type key\n// so the asset page can render the player from metadata attributes.\nexport type EmbedPlatform = \"spotify\" | \"soundcloud\" | \"youtube\" | \"tiktok\" | \"vimeo\";\n\nexport const EMBED_PLATFORM_META: Record<\n EmbedPlatform,\n { label: string; icon: LucideIcon; traitKey: string; placeholder: string }\n> = {\n spotify: { label: \"Spotify\", icon: Music2, traitKey: \"Spotify URL\", placeholder: \"https://open.spotify.com/…\" },\n soundcloud: { label: \"SoundCloud\", icon: AudioLines, traitKey: \"SoundCloud URL\", placeholder: \"https://soundcloud.com/…\" },\n youtube: { label: \"YouTube\", icon: Youtube, traitKey: \"YouTube URL\", placeholder: \"https://youtube.com/watch?v=…\" },\n tiktok: { label: \"TikTok\", icon: Video, traitKey: \"TikTok URL\", placeholder: \"https://tiktok.com/@…/video/…\" },\n vimeo: { label: \"Vimeo\", icon: Video, traitKey: \"Vimeo URL\", placeholder: \"https://vimeo.com/…\" },\n};\n\n// ── Socials (icon-chip links — open in a new tab, never iframed) ────────────\n// X / Instagram / Facebook need fragile JS SDKs and sites block iframing, so\n// these render as clickable platform chips on the asset page, not players.\nexport type SocialPlatform = \"x\" | \"instagram\" | \"facebook\" | \"tiktok\" | \"website\";\n\nexport const SOCIAL_PLATFORM_META: Record<\n SocialPlatform,\n { label: string; icon: LucideIcon; traitKey: string; placeholder: string }\n> = {\n x: { label: \"X\", icon: Twitter, traitKey: \"X\", placeholder: \"https://x.com/…\" },\n instagram: { label: \"Instagram\", icon: Instagram, traitKey: \"Instagram\", placeholder: \"https://instagram.com/…\" },\n facebook: { label: \"Facebook\", icon: Facebook, traitKey: \"Facebook\", placeholder: \"https://facebook.com/…\" },\n tiktok: { label: \"TikTok\", icon: Video, traitKey: \"TikTok\", placeholder: \"https://tiktok.com/@…\" },\n website: { label: \"Website\", icon: Globe, traitKey: \"Website\", placeholder: \"https://…\" },\n};\n\n// ── Trait suggestions (friendly, no dates / no technical fields) ────────────\n// Tapping a suggestion pre-fills a trait row. Optional `options` renders the\n// value as a select (e.g. Rarity).\nexport interface TraitSuggestion {\n key: string;\n placeholder?: string;\n options?: string[];\n}\n\nexport interface IPTemplate {\n type: IPType;\n label: string;\n description: string;\n icon: LucideIcon;\n color: { bg: string; text: string; border: string };\n embeds?: EmbedPlatform[];\n socials?: SocialPlatform[];\n traitSuggestions?: TraitSuggestion[];\n}\n\nexport const IP_TEMPLATES: Record<IPType, IPTemplate> = {\n Audio: {\n type: \"Audio\",\n label: \"Audio\",\n description: \"Music, podcasts, sound effects, audio art\",\n icon: Music,\n color: { bg: \"bg-blue-500/10\", text: \"text-blue-400\", border: \"border-blue-500/20\" },\n embeds: [\"spotify\", \"soundcloud\"],\n traitSuggestions: [\n { key: \"Artist\" }, { key: \"Genre\", placeholder: \"Soundtrack\" }, { key: \"Mood\" }, { key: \"Label\" },\n ],\n },\n Video: {\n type: \"Video\",\n label: \"Video\",\n description: \"Films, animations, short-form video content\",\n icon: Clapperboard,\n color: { bg: \"bg-red-500/10\", text: \"text-red-400\", border: \"border-red-500/20\" },\n embeds: [\"youtube\", \"tiktok\", \"vimeo\"],\n traitSuggestions: [\n { key: \"Director\" }, { key: \"Genre\" }, { key: \"Cast\" }, { key: \"Studio\" },\n ],\n },\n Art: {\n type: \"Art\",\n label: \"Art\",\n description: \"Digital and physical artwork, illustrations, generative art\",\n icon: Palette,\n color: { bg: \"bg-purple-500/10\", text: \"text-purple-400\", border: \"border-purple-500/20\" },\n traitSuggestions: [\n { key: \"Medium\", placeholder: \"Oil on canvas\" },\n { key: \"Style\", placeholder: \"Impressionism\" },\n { key: \"Materials\" },\n { key: \"Series\" },\n ],\n },\n Photography: {\n type: \"Photography\",\n label: \"Photography\",\n description: \"Photography, photo essays, visual documentation\",\n icon: Camera,\n color: { bg: \"bg-orange-500/10\", text: \"text-orange-400\", border: \"border-orange-500/20\" },\n traitSuggestions: [\n { key: \"Camera\", placeholder: \"Sony A7 IV\" },\n { key: \"Location\" },\n { key: \"Series\" },\n { key: \"Edition\" },\n ],\n },\n Posts: {\n type: \"Posts\",\n label: \"Posts\",\n description: \"Articles, blog posts, social media content, essays\",\n icon: MessageSquare,\n color: { bg: \"bg-sky-500/10\", text: \"text-sky-400\", border: \"border-sky-500/20\" },\n socials: [\"x\", \"instagram\", \"facebook\", \"tiktok\", \"website\"],\n traitSuggestions: [\n { key: \"Author\" }, { key: \"Topic\" }, { key: \"Category\" },\n ],\n },\n Publications: {\n type: \"Publications\",\n label: \"Publications\",\n description: \"Books, journals, magazines, academic papers\",\n icon: BookOpen,\n color: { bg: \"bg-indigo-500/10\", text: \"text-indigo-400\", border: \"border-indigo-500/20\" },\n socials: [\"x\", \"instagram\", \"website\"],\n traitSuggestions: [\n { key: \"Author\" }, { key: \"Publisher\" }, { key: \"Language\", placeholder: \"English\" }, { key: \"Edition\" },\n ],\n },\n Documents: {\n type: \"Documents\",\n label: \"Documents\",\n description: \"Contracts, reports, whitepapers, legal documents\",\n icon: FileText,\n color: { bg: \"bg-zinc-500/10\", text: \"text-zinc-400\", border: \"border-zinc-500/20\" },\n traitSuggestions: [\n { key: \"Author\" }, { key: \"Category\" }, { key: \"Language\", placeholder: \"English\" },\n ],\n },\n Patents: {\n type: \"Patents\",\n label: \"Patents\",\n description: \"Patents, inventions, technical innovations\",\n icon: Award,\n color: { bg: \"bg-amber-500/10\", text: \"text-amber-400\", border: \"border-amber-500/20\" },\n traitSuggestions: [\n { key: \"Inventor\" }, { key: \"Field\" }, { key: \"Status\" },\n ],\n },\n Software: {\n type: \"Software\",\n label: \"Software\",\n description: \"Applications, scripts, algorithms, code libraries\",\n icon: Code2,\n color: { bg: \"bg-violet-500/10\", text: \"text-violet-400\", border: \"border-violet-500/20\" },\n socials: [\"website\"],\n traitSuggestions: [\n { key: \"Language\", placeholder: \"TypeScript\" }, { key: \"License\" }, { key: \"Platform\" },\n ],\n },\n NFT: {\n type: \"NFT\",\n label: \"NFT\",\n description: \"Blockchain-native digital assets and collectibles\",\n icon: Hexagon,\n color: { bg: \"bg-teal-500/10\", text: \"text-teal-400\", border: \"border-teal-500/20\" },\n traitSuggestions: [\n { key: \"Collection\" },\n { key: \"Edition\" },\n { key: \"Rarity\", options: [\"Common\", \"Uncommon\", \"Rare\", \"Epic\", \"Legendary\"] },\n ],\n },\n RWA: {\n type: \"RWA\",\n label: \"Real World Asset\",\n description: \"Tokenized physical assets: real estate, commodities, collectibles\",\n icon: Building2,\n color: { bg: \"bg-emerald-500/10\", text: \"text-emerald-400\", border: \"border-emerald-500/20\" },\n traitSuggestions: [\n { key: \"Asset Type\" }, { key: \"Location\" }, { key: \"Category\" },\n ],\n },\n Custom: {\n type: \"Custom\",\n label: \"Custom\",\n description: \"Custom IP type — add your own trait pairs for any metadata\",\n icon: Layers,\n color: { bg: \"bg-muted/50\", text: \"text-muted-foreground\", border: \"border-border\" },\n },\n};\n\n/**\n * All trait_type keys owned by templates (embeds + socials + suggestions), plus\n * \"IP Type\" itself. Used to filter template-managed attributes out of other\n * attribute grids so they aren't duplicated.\n */\nexport const TEMPLATE_TRAIT_TYPES = new Set<string>([\n \"IP Type\",\n ...Object.values(EMBED_PLATFORM_META).map((m) => m.traitKey),\n ...Object.values(SOCIAL_PLATFORM_META).map((m) => m.traitKey),\n ...Object.values(IP_TEMPLATES).flatMap((t) => (t.traitSuggestions ?? []).map((s) => s.key)),\n]);\n"],"mappings":"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","names":[]}
@@ -0,0 +1,45 @@
1
+ import { LucideIcon } from 'lucide-react';
2
+ import { IPType } from './ip.cjs';
3
+
4
+ type EmbedPlatform = "spotify" | "soundcloud" | "youtube" | "tiktok" | "vimeo";
5
+ declare const EMBED_PLATFORM_META: Record<EmbedPlatform, {
6
+ label: string;
7
+ icon: LucideIcon;
8
+ traitKey: string;
9
+ placeholder: string;
10
+ }>;
11
+ type SocialPlatform = "x" | "instagram" | "facebook" | "tiktok" | "website";
12
+ declare const SOCIAL_PLATFORM_META: Record<SocialPlatform, {
13
+ label: string;
14
+ icon: LucideIcon;
15
+ traitKey: string;
16
+ placeholder: string;
17
+ }>;
18
+ interface TraitSuggestion {
19
+ key: string;
20
+ placeholder?: string;
21
+ options?: string[];
22
+ }
23
+ interface IPTemplate {
24
+ type: IPType;
25
+ label: string;
26
+ description: string;
27
+ icon: LucideIcon;
28
+ color: {
29
+ bg: string;
30
+ text: string;
31
+ border: string;
32
+ };
33
+ embeds?: EmbedPlatform[];
34
+ socials?: SocialPlatform[];
35
+ traitSuggestions?: TraitSuggestion[];
36
+ }
37
+ declare const IP_TEMPLATES: Record<IPType, IPTemplate>;
38
+ /**
39
+ * All trait_type keys owned by templates (embeds + socials + suggestions), plus
40
+ * "IP Type" itself. Used to filter template-managed attributes out of other
41
+ * attribute grids so they aren't duplicated.
42
+ */
43
+ declare const TEMPLATE_TRAIT_TYPES: Set<string>;
44
+
45
+ export { EMBED_PLATFORM_META, type EmbedPlatform, type IPTemplate, IP_TEMPLATES, SOCIAL_PLATFORM_META, type SocialPlatform, TEMPLATE_TRAIT_TYPES, type TraitSuggestion };
@@ -0,0 +1,45 @@
1
+ import { LucideIcon } from 'lucide-react';
2
+ import { IPType } from './ip.js';
3
+
4
+ type EmbedPlatform = "spotify" | "soundcloud" | "youtube" | "tiktok" | "vimeo";
5
+ declare const EMBED_PLATFORM_META: Record<EmbedPlatform, {
6
+ label: string;
7
+ icon: LucideIcon;
8
+ traitKey: string;
9
+ placeholder: string;
10
+ }>;
11
+ type SocialPlatform = "x" | "instagram" | "facebook" | "tiktok" | "website";
12
+ declare const SOCIAL_PLATFORM_META: Record<SocialPlatform, {
13
+ label: string;
14
+ icon: LucideIcon;
15
+ traitKey: string;
16
+ placeholder: string;
17
+ }>;
18
+ interface TraitSuggestion {
19
+ key: string;
20
+ placeholder?: string;
21
+ options?: string[];
22
+ }
23
+ interface IPTemplate {
24
+ type: IPType;
25
+ label: string;
26
+ description: string;
27
+ icon: LucideIcon;
28
+ color: {
29
+ bg: string;
30
+ text: string;
31
+ border: string;
32
+ };
33
+ embeds?: EmbedPlatform[];
34
+ socials?: SocialPlatform[];
35
+ traitSuggestions?: TraitSuggestion[];
36
+ }
37
+ declare const IP_TEMPLATES: Record<IPType, IPTemplate>;
38
+ /**
39
+ * All trait_type keys owned by templates (embeds + socials + suggestions), plus
40
+ * "IP Type" itself. Used to filter template-managed attributes out of other
41
+ * attribute grids so they aren't duplicated.
42
+ */
43
+ declare const TEMPLATE_TRAIT_TYPES: Set<string>;
44
+
45
+ export { EMBED_PLATFORM_META, type EmbedPlatform, type IPTemplate, IP_TEMPLATES, SOCIAL_PLATFORM_META, type SocialPlatform, TEMPLATE_TRAIT_TYPES, type TraitSuggestion };