/* ============================================================ mascots.jsx — ドット(8bit)2案:ピコ & ぽやん(パンダ) props.pose: "stand" | "wave" | "sleep" ============================================================ */ const ZZZ = () => (
Zzz
); /* ---------- ピクセル描画 ---------- */ function PixelSprite({ rows, palette, cell = 11 }) { const W = Math.max(...rows.map((r) => r.length)); const H = rows.length; const cells = []; rows.forEach((row, r) => { for (let c = 0; c < row.length; c++) { const ch = row[c]; if (ch === "." || ch === " ") continue; const isEye = ch === "d"; const closed = ch === "-"; if ((isEye || closed) && palette.dbase) { // 目の下に黒(またはボディ色)のベースを敷く → まばたきで縮んでも背景が透けない cells.push( ); } cells.push( ); } }); return ( {cells} ); } /* ---------- 汎用ピクセルキャラ ---------- */ function PixelCreature({ pose = "stand", cls, palette, stand, sleep, wave, handColor }) { const rows = pose === "sleep" ? sleep : pose === "wave" ? (wave || stand) : stand; const sq = (bg) => ({ width: 11, height: 11, background: bg }); return (
{pose === "wave" && (
)}
); } /* ============================================================ ① ピコ — 8bitドット(セージ)/頭ぺたんこ・両手つき ============================================================ */ const PICO_PAL = { o: "var(--sage)", s: "var(--sage-d)", a: "var(--sage)", d: "var(--ink)", dbase: "var(--sage)", p: "var(--blush)", m: "var(--ink)", "-": "var(--ink)", }; // 0123456789012345 const PICO_STAND = [ "...oooooooooo...", "..oooooooooooo..", "..oooooooooooo..", "..oooooooooooo..", "..oodoooooodoo..", ".aopooommooopoa.", "a.oooooooooooo.a", "..oooooooooooo..", "...oo......oo...", "...ss......ss...", ]; const PICO_WAVE = [ "...oooooooooo...", "..oooooooooooo..", "..oooooooooooo..", "..oooooooooooo..", "..oodoooooodoo..", ".aopooommooopo..", "a.oooooooooooo..", "..oooooooooooo..", "...oo......oo...", "...ss......ss...", ]; const PICO_SLEEP = [ "...oooooooooo...", "..oooooooooooo..", "..oooooooooooo..", "..oooooooooooo..", "..oo-oooooo-oo..", ".aopooommooopoa.", "a.oooooooooooo.a", "..oooooooooooo..", "...oo......oo...", "...ss......ss...", ]; function Pixel({ pose = "stand" }) { return ( ); } /* ============================================================ ② ぽやん — ドット化パンダ(ピコとおそろいの8bit) ============================================================ */ const PANDA_PAL = { o: "oklch(0.93 0.006 80)", k: "var(--ink)", a: "var(--ink)", s: "var(--ink)", d: "#ffffff", dbase: "var(--ink)", p: "var(--blush)", m: "var(--ink)", "-": "var(--ink)", }; // 0123456789012345 const PANDA_STAND = [ "...kk......kk...", "..oooooooooooo..", "..ookkooookkoo..", "..oodkooookdoo..", "..opoookkooopo..", "..ooooommooooo..", ".kooooooooooook.", "k.oooooooooooo.k", "...oooooooooo...", "...kk......kk...", "...kk......kk...", ]; const PANDA_WAVE = [ "...kk......kk...", "..oooooooooooo..", "..ookkooookkoo..", "..oodkooookdoo..", "..opoookkooopo..", "..ooooommooooo..", ".koooooooooooo..", "k.oooooooooooo..", "...oooooooooo...", "...kk......kk...", "...kk......kk...", ]; const PANDA_SLEEP = [ "...kk......kk...", "..oooooooooooo..", "..ookkooookkoo..", "..ookkooookkoo..", "..opoookkooopo..", "..ooooommooooo..", ".kooooooooooook.", "k.oooooooooooo.k", "...oooooooooo...", "...kk......kk...", "...kk......kk...", ]; function PixelPanda({ pose = "stand" }) { return ( ); } /* ---------- アイコン用クロップ ---------- */ function Avatar({ Comp, scale, ty, bg }) { return (
); } /* ---------- レジストリ(2案) ---------- */ const MASCOTS = [ { id: "pico", no: "01", name: "ピコ", roman: "Piko", Comp: Pixel, tint: "var(--sage)", desc: "8bitドットの相棒。頭はぺたんと平ら、両手をぱたぱた。", avatar: { scale: 1.35, ty: 3, bg: "oklch(0.94 0.02 150)" }, }, { id: "poyan", no: "02", name: "ぽやん", roman: "Poyan", Comp: PixelPanda, tint: "oklch(0.80 0.05 235)", desc: "パンダをドットに。ピコとおそろいの8bit仲間。", avatar: { scale: 1.2, ty: 0, bg: "oklch(0.93 0.03 235)" }, }, ]; Object.assign(window, { Pixel, PixelPanda, PixelSprite, PixelCreature, Avatar, ZZZ, MASCOTS });