// Monifest.ai homepage — two variations
const { useState, useMemo } = React;
const I = window.MonifestIcons;
const APPS = window.MonifestApps;
// ----------------------------- shared bits -----------------------------
function ThemeToggle({ dark, onToggle, accent = "#00C46A" }) {
return (
);
}
function SearchPill({ placeholder = "Search tools" }) {
return (
{placeholder}
⌘K
);
}
function StatusBadge({ status, variant = "luxe", accent }) {
const live = status === "live";
if (variant === "luxe") {
return (
{live ? "Live" : "Coming soon"}
);
}
// playful pill
return (
{live ? "Live" : "Coming soon"}
);
}
// ----------- Flamingo button (2 variants) ------------
function openFlamingo() {
const password = window.prompt("Enter Flamingo password");
if (password === "etoro2026") {
window.location.href = "https://im5.flamingo.fm/";
} else if (password !== null) {
window.alert("Wrong password");
}
}
function FlamingoButton({ variant = "pink", compact = false }) {
if (variant === "pink") {
const pink = "#FF8FB1";
return (
);
}
// gold / champagne
const gold = "#D9B872";
return (
);
}
function IconFlamingoLocal({ size = 14, stroke = 1.5, color = "currentColor" }) {
return (
);
}
// ----------- Team line (small uppercase label + names + tooltips) -----------
function TeamLine({ team, muted, dim, fg, compact = false }) {
if (!team || team.length === 0) return null;
return (
Team
{team.map((p, i) => (
{i > 0 && ·}
{p.name}
))}
);
}
// ----------- Utilities strip --------------------------------------------
function UtilitiesStrip({ fg, dim, hair, dark, accent, compact = false }) {
const UTIL = window.MonifestUtilities || [];
const tint = dark ? "rgba(255,255,255,0.025)" : "rgba(0,0,0,0.025)";
return (
Team utilities
internal docs
Swipe →
{UTIL.map((u) => {
if (u.status === "placeholder") {
return (
Coming soon
);
}
const IconCmp = I[u.icon] || I.Roadmap;
return (
u.url && (window.location.href = u.url)}
role={u.url ? "link" : undefined}
tabIndex={u.url ? 0 : undefined}
onKeyDown={(e) => { if (u.url && (e.key === "Enter" || e.key === " ")) window.location.href = u.url; }}
style={{
background: tint,
border: `1px solid ${hair}`,
borderRadius: 12,
padding: "12px 14px",
display: "flex",
gap: 12,
minHeight: 78,
cursor: "pointer",
alignItems: "flex-start",
}}
>
{u.short ? (
<>
{u.name.replace(` (${u.short})`, "").replace(u.short, "").trim()}{" "}
({u.short})
>
) : (
u.name
)}
{u.desc}
{u.team && (
Team
{u.team.map((p, i) => (
{i > 0 && " · "}
{p.name}
))}
)}
);
})}
);
}
window.FlamingoButton = FlamingoButton;
// =====================================================================
// VARIATION A — LUXE (2 cols, editorial, hairline)
// =====================================================================
function MonifestLuxe({ initialDark = true, flamingo = "pink" }) {
const [dark, setDark] = useState(initialDark);
const accent = "#00C46A";
const bg = dark ? "#0B0E10" : "#F4F1EC";
const fg = dark ? "#E8E4DC" : "#13171A";
const dim = dark ? "#8C8780" : "#6A6760";
const hair = dark ? "#1F2326" : "#D9D3C8";
const cardBg = dark ? "#0F1316" : "#FBF9F5";
return (
{/* Header */}
{/* Welcome */}
● CryptoMoney · internal
Money,
manifested.
AI tools by the CryptoMoney team at eToro.
{/* Section header */}
The library
{APPS.filter((a) => a.status === "live").length} live · {APPS.filter((a) => a.status === "soon").length} coming
All
Live
Upcoming
{/* Card grid */}
{APPS.map((app, i) => {
const IconCmp = I[app.icon];
const muted = app.status !== "live";
return (
app.url && (window.location.href = app.url)}
role={app.url ? "link" : undefined}
tabIndex={app.url ? 0 : undefined}
onKeyDown={(e) => { if (app.url && (e.key === "Enter" || e.key === " ")) window.location.href = app.url; }}
style={{
position: "relative",
padding: "26px 30px 26px",
borderRight: `1px solid ${hair}`,
borderBottom: `1px solid ${hair}`,
background: cardBg,
display: "flex",
gap: 22,
minHeight: 132,
cursor: app.url ? "pointer" : "default",
transition: "background 0.2s",
}}
>
{app.status === "live" && (
)}
);
})}
{/* Footer */}
);
}
// =====================================================================
// VARIATION B — PLAYFUL (3 cols, tonal cards, more rhythm)
// =====================================================================
function MonifestPlayful({ initialDark = true, flamingo = "pink" }) {
const [dark, setDark] = useState(initialDark);
const accent = "#00C46A";
const bg = dark ? "#0C0F11" : "#F2EFE9";
const fg = dark ? "#EEEAE2" : "#15191C";
const dim = dark ? "#8E8980" : "#65625B";
const hair = dark ? "#1E2225" : "#DBD5CA";
// Per-app tonal accent in OKLCH neighborhood — same chroma, varied hue
const palettes = dark
? {
club: { tint: "oklch(0.22 0.04 80)", ink: "oklch(0.86 0.08 80)" }, // amber
roundup: { tint: "oklch(0.22 0.04 150)", ink: "oklch(0.86 0.10 150)" }, // green
nium: { tint: "oklch(0.22 0.04 220)", ink: "oklch(0.86 0.08 220)" }, // blue
goal: { tint: "oklch(0.22 0.04 30)", ink: "oklch(0.86 0.08 30)" }, // coral
"fam-invest":{ tint: "oklch(0.22 0.04 110)", ink: "oklch(0.86 0.08 110)" }, // lime
"fam-bank": { tint: "oklch(0.22 0.04 320)", ink: "oklch(0.86 0.08 320)" }, // pink
jpm: { tint: "oklch(0.22 0.04 260)", ink: "oklch(0.86 0.08 260)" }, // violet
zengo: { tint: "oklch(0.22 0.04 190)", ink: "oklch(0.86 0.08 190)" }, // teal
}
: {
club: { tint: "oklch(0.94 0.04 80)", ink: "oklch(0.30 0.10 80)" },
roundup: { tint: "oklch(0.94 0.04 150)", ink: "oklch(0.30 0.10 150)" },
nium: { tint: "oklch(0.94 0.04 220)", ink: "oklch(0.30 0.10 220)" },
goal: { tint: "oklch(0.94 0.04 30)", ink: "oklch(0.30 0.10 30)" },
"fam-invest":{ tint: "oklch(0.94 0.04 110)", ink: "oklch(0.30 0.10 110)" },
"fam-bank": { tint: "oklch(0.94 0.04 320)", ink: "oklch(0.30 0.10 320)" },
jpm: { tint: "oklch(0.94 0.04 260)", ink: "oklch(0.30 0.10 260)" },
zengo: { tint: "oklch(0.94 0.04 190)", ink: "oklch(0.30 0.10 190)" },
};
return (
{/* Header */}
{/* Welcome — playful split */}
Welcome back
Money,{" "}
manifested.
AI tools by the CryptoMoney team at eToro. Pick one and get to work.
3 live
5 coming
{/* Team utilities */}
{/* Card grid 3-col */}
{APPS.map((app) => {
const IconCmp = I[app.icon];
const muted = app.status !== "live";
const pal = palettes[app.id];
return (
app.url && (window.location.href = app.url)}
role={app.url ? "link" : undefined}
tabIndex={app.url ? 0 : undefined}
onKeyDown={(e) => { if (app.url && (e.key === "Enter" || e.key === " ")) window.location.href = app.url; }}
style={{
position: "relative",
background: pal.tint,
color: fg,
borderRadius: 14,
padding: "18px 18px 16px",
display: "flex",
flexDirection: "column",
gap: 14,
minHeight: 168,
cursor: app.url ? "pointer" : "default",
border: `1px solid ${hair}`,
opacity: muted ? 0.92 : 1,
transition: "transform 0.2s",
}}
>
);
})}
{/* Footer */}
);
}
// =====================================================================
// VARIATION B — MOBILE (single-column, tonal cards)
// =====================================================================
function MonifestPlayfulMobile({ initialDark = true, flamingo = "pink" }) {
const [dark, setDark] = useState(initialDark);
const accent = "#00C46A";
const bg = dark ? "#0C0F11" : "#F2EFE9";
const fg = dark ? "#EEEAE2" : "#15191C";
const dim = dark ? "#8E8980" : "#65625B";
const hair = dark ? "#1E2225" : "#DBD5CA";
const palettes = dark
? {
club: { tint: "oklch(0.22 0.04 80)", ink: "oklch(0.86 0.08 80)" },
roundup: { tint: "oklch(0.22 0.04 150)", ink: "oklch(0.86 0.10 150)" },
nium: { tint: "oklch(0.22 0.04 220)", ink: "oklch(0.86 0.08 220)" },
goal: { tint: "oklch(0.22 0.04 30)", ink: "oklch(0.86 0.08 30)" },
"fam-invest":{ tint: "oklch(0.22 0.04 110)", ink: "oklch(0.86 0.08 110)" },
"fam-bank": { tint: "oklch(0.22 0.04 320)", ink: "oklch(0.86 0.08 320)" },
jpm: { tint: "oklch(0.22 0.04 260)", ink: "oklch(0.86 0.08 260)" },
zengo: { tint: "oklch(0.22 0.04 190)", ink: "oklch(0.86 0.08 190)" },
}
: {
club: { tint: "oklch(0.94 0.04 80)", ink: "oklch(0.30 0.10 80)" },
roundup: { tint: "oklch(0.94 0.04 150)", ink: "oklch(0.30 0.10 150)" },
nium: { tint: "oklch(0.94 0.04 220)", ink: "oklch(0.30 0.10 220)" },
goal: { tint: "oklch(0.94 0.04 30)", ink: "oklch(0.30 0.10 30)" },
"fam-invest":{ tint: "oklch(0.94 0.04 110)", ink: "oklch(0.30 0.10 110)" },
"fam-bank": { tint: "oklch(0.94 0.04 320)", ink: "oklch(0.30 0.10 320)" },
jpm: { tint: "oklch(0.94 0.04 260)", ink: "oklch(0.30 0.10 260)" },
zengo: { tint: "oklch(0.94 0.04 190)", ink: "oklch(0.30 0.10 190)" },
};
const live = APPS.filter((a) => a.status === "live");
const soon = APPS.filter((a) => a.status === "soon");
return (
{/* Header */}
{/* Welcome */}
Welcome back
Money, manifested.
AI tools by the CryptoMoney team at eToro.
{/* count chips */}
{live.length} live
{soon.length} coming
{/* Team utilities */}
{/* Live section label */}
Live now
{live.map((app) => (
))}
Coming soon
{soon.map((app) => (
))}
{/* Footer */}
);
}
function MobileCard({ app, palette, fg, dim, hair, dark, accent }) {
const IconCmp = I[app.icon];
const muted = app.status !== "live";
return (
app.url && (window.location.href = app.url)}
role={app.url ? "link" : undefined}
tabIndex={app.url ? 0 : undefined}
onKeyDown={(e) => { if (app.url && (e.key === "Enter" || e.key === " ")) window.location.href = app.url; }}
style={{
background: palette.tint,
color: fg,
borderRadius: 14,
padding: "14px 14px 14px",
display: "flex",
gap: 14,
border: `1px solid ${hair}`,
opacity: muted ? 0.95 : 1,
cursor: app.url ? "pointer" : "default",
}}
>
);
}
window.MonifestLuxe = MonifestLuxe;
window.MonifestPlayful = MonifestPlayful;
window.MonifestPlayfulMobile = MonifestPlayfulMobile;