// Shared UI primitives used inside phones // Big pill button — the Resume Aura signature function PillButton({ children, variant = 'primary', onClick, style = {}, icon }) { const variants = { primary: { background: '#1a0d2e', color: '#fae14b', border: 'none' }, lemon: { background: '#fae14b', color: '#1a0d2e', border: 'none' }, aura: { background: 'linear-gradient(90deg, #ff4db8, #8a5cf6, #4dd6ff)', color: '#fff', border: 'none' }, ghost: { background: 'transparent', color: '#1a0d2e', border: '1.5px solid #1a0d2e' }, cream: { background: '#fffdf7', color: '#1a0d2e', border: '1px solid rgba(26,13,46,0.1)' }, }; return ( ); } // Chip/tag function Chip({ children, color = '#1a0d2e', bg = '#fffdf7', style = {} }) { return {children}; } // Sparkle icon (particle shape — used inside the orb halo, not as a button accent) function Sparkle({ size = 14, color = 'currentColor' }) { return ; } // SF Symbols approximations — matches the iconography used in the iOS app // (Image(systemName: ...)) so the web prototype reads as the same surface. // All paths drawn on a 24x24 grid; `color` flows through via currentColor. const SF_SYMBOLS = { 'star.fill': ( ), 'pencil.line': ( <> ), 'clock': ( <> ), 'person.crop.circle': ( <> ), 'bolt.fill': ( ), 'number': ( ), 'arrow.left.arrow.right': ( <> ), 'textformat.abc': ( Aa ), 'questionmark': ( <> ), 'plus': ( ), 'ruler': ( <> ), 'arrow.up.doc': ( <> ), 'arrow.down.to.line': ( ), 'square.and.arrow.up': ( <> ), 'bubble.left.fill': ( ), 'ellipsis': ( <> ), 'xmark': ( ), 'checkmark': ( ), 'arrow.right': ( ), 'arrow.up.right': ( ), 'gearshape': ( <> ), 'chevron.right': ( ), 'chevron.left': ( ), 'chevron.down': ( ), 'arrow.clockwise': ( <> ), 'arrow.counterclockwise': ( <> ), 'exclamationmark.circle.fill': ( <> ), 'exclamationmark.triangle.fill': ( <> ), 'questionmark.circle': ( <> ), 'crown.fill': ( ), 'doc.badge.plus': ( <> ), 'gift.fill': ( <> ), 'trash': ( <> ), 'infinity': ( ), }; function SFIcon({ name, size = 18, color = 'currentColor', style = {} }) { const body = SF_SYMBOLS[name]; if (!body) return null; return ( {body} ); } // Issue dot function IssueDot({ type, size = 8 }) { return
; } // Back chevron function Chevron({ dir = 'left', size = 16, color = '#1a0d2e' }) { const d = { left: 'M11 3 L5 9 L11 15', right: 'M5 3 L11 9 L5 15', down: 'M3 5 L9 11 L15 5' }[dir]; return ; } // Phone header (custom, used inside screens instead of default nav bar) function PhoneHeader({ platform, title, onBack, right, dark = false, sub }) { const isIOS = platform === 'ios'; return (
{onBack && ( )}
{sub &&
{sub}
}
{title}
{right}
); } Object.assign(window, { PillButton, Chip, Sparkle, SFIcon, IssueDot, Chevron, PhoneHeader });