// JIPANDITJI mobile kit — tokens, icons, primitives const JP = { saffron: '#F6912F', saffronDeep: '#E2741B', saffron50: '#FFF1DC', saffron100: '#FFE3BC', teal: '#0C7C8C', tealDeep: '#08606D', teal50: '#E2F0F1', teal100: '#C6E3E6', kumkum: '#8E1B2A', kumkum50: '#FBE9EA', gold: '#C9922E', gold50: '#FBF3E2', ink: '#17201F', ink2: '#4A5654', muted: '#7A8584', line: '#E6EAE9', line2: '#EEF1F0', cream: '#FFFCEF', surface: '#F5F7F6', white: '#fff', green: '#1E8A4C', green50: '#E5F4EA', f: "'Hanken Grotesk', 'Noto Sans Devanagari', sans-serif", hi: "'Tiro Devanagari Hindi', 'Noto Sans Devanagari', serif", }; // ---------- Icons (24 grid, 1.8 stroke) ---------- const IP = { back: 'M15 5l-7 7 7 7', chevR: 'M9 5l7 7-7 7', chevD: 'M6 9l6 6 6-6', chevU: 'M6 15l6-6 6 6', search: 'M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14zM20 20l-3.5-3.5', bell: 'M6 17V11a6 6 0 0 1 12 0v6l1.5 2h-15L6 17zM10 21h4', mic: 'M12 3a3 3 0 0 0-3 3v5a3 3 0 0 0 6 0V6a3 3 0 0 0-3-3zM6 11a6 6 0 0 0 12 0M12 17v4', pin: 'M12 21s-7-6.2-7-11.5A7 7 0 0 1 19 9.5C19 14.8 12 21 12 21zM12 7a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5z', cal: 'M4 7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V7zM4 10h16M8 3v4M16 3v4', clock: 'M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18zM12 7v5l3 2', star: 'M12 3.5l2.6 5.3 5.9.9-4.3 4.1 1 5.8L12 16.9 6.8 19.6l1-5.8-4.3-4.1 5.9-.9L12 3.5z', check: 'M5 12.5l4.5 4.5L19 7.5', plus: 'M12 5v14M5 12h14', minus: 'M5 12h14', x: 'M6 6l12 12M18 6L6 18', bag: 'M5 8h14l-1 12H6L5 8zM9 8V6a3 3 0 0 1 6 0v2', home: 'M4 11l8-7 8 7v9a1 1 0 0 1-1 1h-4v-6h-6v6H5a1 1 0 0 1-1-1v-9z', diya: 'M12 3c1.6 2 2.2 3.4 2.2 4.5a2.2 2.2 0 0 1-4.4 0C9.8 6.4 10.4 5 12 3zM3.5 12h17c0 3.6-3.8 6.5-8.5 6.5S3.5 15.6 3.5 12zM9 21h6', kalash: 'M8 8h8M9 8c-3 1.5-4 4-4 6.5C5 18 8 21 12 21s7-3 7-6.5c0-2.5-1-5-4-6.5M10 8V6h4v2M12 6c-2-3-5-3-6-2 1.5.3 3 1 4 2M12 6c2-3 5-3 6-2-1.5.3-3 1-4 2', sun: 'M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zM12 2v2M12 20v2M4.2 4.2l1.4 1.4M18.4 18.4l1.4 1.4M2 12h2M20 12h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4', moon: 'M20 14.5A8 8 0 1 1 9.5 4 6.5 6.5 0 0 0 20 14.5z', temple: 'M12 2.5v2M8 9l4-4.5L16 9M6 9h12v2H6zM7 11v8M12 11v8M17 11v8M4 21h16M5 19h14', user: 'M12 4a4 4 0 1 0 0 8 4 4 0 0 0 0-8zM4.5 20.5c1-3.6 4-5.5 7.5-5.5s6.5 1.9 7.5 5.5', users: 'M9 5a3.5 3.5 0 1 0 0 7 3.5 3.5 0 0 0 0-7zM2.5 20c.8-3.2 3.3-5 6.5-5s5.7 1.8 6.5 5M16 5.2a3.3 3.3 0 0 1 0 6.4M18 15.3c1.8.6 3 2.2 3.5 4.7', phone: 'M5 4h3.5l1.8 4.5-2.3 1.4a11 11 0 0 0 6.1 6.1l1.4-2.3L20 15.5V19a1.5 1.5 0 0 1-1.6 1.5C10.6 20 4 13.4 3.5 5.6A1.5 1.5 0 0 1 5 4z', chat: 'M4 5h16v11H9l-5 4V5z', video: 'M3 7h12v10H3zM15 10.5l6-3.5v10l-6-3.5', heart: 'M12 20s-8-4.8-8-10.5A4.5 4.5 0 0 1 12 7a4.5 4.5 0 0 1 8 2.5C20 15.2 12 20 12 20z', share: 'M12 3v12M7 8l5-5 5 5M5 13v7h14v-7', shield: 'M12 3l7.5 3v5.5c0 4.6-3.2 8.3-7.5 9.5-4.3-1.2-7.5-4.9-7.5-9.5V6L12 3zM8.5 12l2.5 2.5 4.5-5', filter: 'M4 6h16M7 12h10M10 18h4', gift: 'M4 10h16v10H4zM3 7h18v3H3zM12 7v13M12 7c-1-3-5-4-5-1.5S12 7 12 7zM12 7c1-3 5-4 5-1.5S12 7 12 7z', wallet: 'M4 7h15a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7zM4 7l12-3v3M16 13.5h2', card: 'M3 6h18v12H3zM3 10h18M7 15h3', truck: 'M2 6h12v10H2zM14 9h4l3 3.5V16h-7M6 18.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM17 18.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z', live: 'M8.5 8.5a5 5 0 0 0 0 7M15.5 8.5a5 5 0 0 1 0 7M5.6 5.6a9 9 0 0 0 0 12.8M18.4 5.6a9 9 0 0 1 0 12.8M12 10.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z', edit: 'M4 20h4L19 9l-4-4L4 16v4zM13.5 6.5l4 4', spark: 'M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8L12 3zM19 16l.7 2 2 .7-2 .7-.7 2-.7-2-2-.7 2-.7.7-2z', flame: 'M12 21c-3.9 0-6.5-2.6-6.5-6.2C5.5 10 10 8 10.5 3c3 2 4 4.5 3.8 7 1-.6 1.7-1.6 2-2.8 1.6 1.7 2.2 4.1 2.2 6.3C18.5 18.4 15.9 21 12 21z', lotus: 'M12 5c-2 2.2-3 4.6-3 7.2 0 2.4 1.3 4.6 3 5.8 1.7-1.2 3-3.4 3-5.8 0-2.6-1-5-3-7.2zM12 18c-3.8 0-7.5-2-9-6 2.4-.4 4.6.2 6.2 1.4M12 18c3.8 0 7.5-2 9-6-2.4-.4-4.6.2-6.2 1.4M5 20h14', book: 'M4 5a2 2 0 0 1 2-2h13v16H6a2 2 0 0 0-2 2V5zM4 19a2 2 0 0 1 2-2h13v4H6', help: 'M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18zM9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .9-1 1.6v.6M12 17h.01', logout: 'M10 4H5v16h5M14 8l4 4-4 4M18 12H9', globe: 'M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18zM3 12h18M12 3c2.5 2.5 3.8 5.5 3.8 9s-1.3 6.5-3.8 9c-2.5-2.5-3.8-5.5-3.8-9S9.5 5.5 12 3z', bolt: 'M13 2L4 14h7l-1 8 9-12h-7l1-8z', tag: 'M3 12V4h8l10 10-8 8L3 12zM7.5 7.5h.01', om: 'M7 8.5c1.6-1.6 5-1.5 5 1.2 0 2-2.3 2.6-3.6 2.3 2.4.2 4.6 1.3 4.6 3.8 0 2.8-3.4 3.8-6.2 1.6M13.5 12c1.5-1.8 5.5-1.6 5.5 2.2 0 3-2.6 4.8-4.6 3.8M15 4.5c1 .9 2.2 1 3.2.3M15.5 7.5h.01', doc: 'M6 3h9l4 4v14H6zM14 3v5h5M9 13h7M9 17h5', eye: 'M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7S2 12 2 12zM12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6z', mala: 'M12 3a6 6 0 0 0-6 6c0 4 3 6 6 9 3-3 6-5 6-9a6 6 0 0 0-6-6zM12 18v3', lock: 'M6 11h12v10H6zM8.5 11V8a3.5 3.5 0 0 1 7 0v3', }; function Ic({ n, s = 22, c = 'currentColor', w = 1.8, fill = 'none', style }) { return ( ); } // ---------- Layout ---------- function Screen({ bg = JP.surface, h = 844, children, style }) { return (
{children}
); } function Status({ light, bg = 'transparent' }) { const c = light ? '#fff' : JP.ink; return (
9:41
); } function TopBar({ title, sub, right, back = true, bg, light }) { return (
{back && }
{title}
{sub &&
{sub}
}
{right}
); } function IconBtn({ n, light, badge, bg, c }) { return (
{badge && {badge}}
); } // ---------- Primitives ---------- function Btn({ kind = 'primary', children, icon, iconR, full, sm, style }) { const k = { primary: { background: JP.teal, color: '#fff', border: 'none' }, saffron: { background: JP.saffron, color: '#fff', border: 'none' }, kumkum: { background: JP.kumkum, color: '#fff', border: 'none' }, outline: { background: '#fff', color: JP.teal, border: `1.5px solid ${JP.teal}` }, ghost: { background: JP.surface, color: JP.ink, border: 'none' }, white: { background: '#fff', color: JP.ink, border: 'none' }, }[kind]; return (
{icon && }{children}{iconR && }
); } function Add({ label = 'ADD', qty, sm }) { if (qty) return (
{qty}
); return (
{label}
); } function Chip({ on, children, icon, tone }) { return (
{icon && }{children}
); } function Tag({ tone = 'teal', children, icon, style }) { const t = { teal: [JP.teal50, JP.tealDeep], saffron: [JP.saffron50, '#A9530C'], green: [JP.green50, JP.green], kumkum: [JP.kumkum50, JP.kumkum], gray: [JP.surface, JP.ink2], gold: [JP.gold50, '#8A5E12'], dark: ['rgba(0,0,0,.55)', '#fff'], white: ['#fff', JP.ink] }[tone]; return ( {icon && }{children} ); } // Image placeholder — warm, patterned; label tells the team which photo goes here function Ph({ label, h = 120, w = '100%', r = 14, tone = 'saffron', icon, style, children }) { const t = { saffron: ['#F9DDB5', '#F3C68A', '#9A5A16'], kumkum: ['#E9B9A9', '#C97A6A', '#6E1A22'], teal: ['#CFE6E8', '#9FCBD0', '#0A5A66'], gold: ['#F2E2BE', '#E2C584', '#7A5512'], rose: ['#F6D6CF', '#EDB3A6', '#7E2E25'], dusk: ['#3B2A4A', '#8E1B2A', '#FFE3BC'], }[tone]; return (
{icon &&
} {label &&
{label}
} {children}
); } function Avatar({ i, tone = 'saffron', s = 48 }) { const t = { saffron: [JP.saffron50, '#B4600F'], teal: [JP.teal50, JP.tealDeep], gray: ['#ECEFEE', JP.ink2], kumkum: [JP.kumkum50, JP.kumkum] }[tone]; return
{i}
; } function Sec({ title, hi, action, sub, style }) { return (
{title}{hi && {hi}}
{action &&
{action}
}
{sub &&
{sub}
}
); } function Card({ children, style, pad = 16 }) { return
{children}
; } function Rupee({ v, strike, size = 18, c = JP.ink }) { return ( ₹{v} {strike && ₹{strike}} ); } function BottomBar({ children, style }) { return (
{children}
); } function PayBar({ label = 'TOTAL', amount, sub, cta, icon = 'chevR', kind }) { return (
{label}
₹{amount}
{sub &&
{sub}
}
{cta}
); } function TabBar({ active = 'home', cart }) { const tabs = [['home', 'Home', 'home'], ['puja', 'Puja', 'diya'], ['panchang', 'Panchang', 'sun'], ['samagri', 'Samagri', 'bag'], ['profile', 'Profile', 'user']]; return (
{cart && (
{['saffron', 'gold', 'rose'].map((t, i) => )}
View cart
{cart}
)}
{tabs.map(([k, l, n]) => { const on = k === active; return (
{on && }
{l}
); })}
); } function Field({ label, value, ph, icon, right, style, prefix }) { return (
{label &&
{label}
}
{icon && } {prefix && {prefix}} {value || ph} {right}
); } function Radio({ on }) { return {on && }; } function Check({ on }) { return {on && }; } function Steps({ n, total = 3, label }) { return (
{Array.from({ length: total }).map((_, i) =>
)}
{label &&
Step {n} of {total} · {label}
}
); } function Logo({ h = 22 }) { return ; } const Hi = ({ children, s = 14, c = JP.muted, style }) => {children}; const Row = ({ children, gap = 8, style, a = 'center' }) =>
{children}
; const Divider = ({ m = 0 }) =>
; Object.assign(window, { JP, Ic, Screen, Status, TopBar, IconBtn, Btn, Add, Chip, Tag, Ph, Avatar, Sec, Card, Rupee, BottomBar, PayBar, TabBar, Field, Radio, Check, Steps, Logo, Hi, Row, Divider });