// Quill Keyboard — two-up comparison, lives-where-text, action gallery function SectionHead({ eyebrow, title, sub, light, max = 620 }) { return (
{eyebrow}

{title}

{sub &&

{sub}

}
); } function TwoUp() { return (
{[['standard', 'Any keyboard', 'You type. Then you switch apps, paste into a chatbot, copy the answer, switch back, paste again.'], ['ai', 'Quill Keyboard', 'Tap Summarize. Claude reads the field and rewrites it in place — no app-switching, no clipboard relay.']].map(([kind, name, body]) => (
{kind === 'ai' && } {name}

{body}

))}
); } function LivesWhereText() { const points = [ ['layers-2', 'Stays in context', 'It acts on the surrounding text in the field you’re in — Messages, Mail, Notes, Slack, Safari.'], ['arrow-down-to-line', 'Insert or read first', 'Each action either types the result straight in, or shows it in a popup you Insert with one tap.'], ['clipboard-list', 'Clipboard on hand', 'Your last 20 copies sit in their own tab, ready to drop into any field.'], ]; return (
Lives where the text is

You never leave the app.

The action runs where your text already is. The result lands inline, or appears in a quick glass popup above the keys that you can read, then insert.

{points.map(([ic, t, b]) => (
{t}
{b}
))}
); } function ActionGallery() { const show = ACTIONS; return (
{show.map(a => (
{a.name}
{a.desc}
))}
See the full action library
); } Object.assign(window, { TwoUp, LivesWhereText, ActionGallery, SectionHead });