Skip to content

Keyboards

VibeGram provides a declarative Markup builder for constructing Telegram keyboards.

Inline Keyboards

Inline keyboards appear directly below messages:

typescript
import { Markup } from 'vibegram';

const keyboard = Markup.inlineKeyboard([
    [Markup.button.callback('Buy', 'buy_1'), Markup.button.callback('Cancel', 'cancel')],
    [Markup.button.url('Website', 'https://example.com')]
]);

await ctx.reply('Choose an option:', { reply_markup: keyboard });

Button Types

MethodDescription
Markup.button.callback(text, data)Callback button — triggers bot.action()
Markup.button.url(text, url)Opens a URL
Markup.button.switchInlineQuery(text, query)Opens inline query in another chat
Markup.button.switchInlineQueryCurrentChat(text, query)Opens inline query in current chat
Markup.button.login(text, url)Telegram Login button
Markup.button.pay(text)Payment button
Markup.button.webApp(text, url)Opens a Mini App
Markup.button.game(text)Game button

Reply Keyboards

Reply keyboards replace the device keyboard:

typescript
const keyboard = Markup.keyboard([
    [Markup.replyButton.text('📢 News'), Markup.replyButton.text('⚙️ Settings')],
    [Markup.replyButton.requestContact('📱 Share Phone')],
    [Markup.replyButton.requestLocation('📍 Share Location')],
    [Markup.replyButton.requestPoll('📊 Create Poll')]
], {
    resize_keyboard: true,
    one_time_keyboard: false
});

await ctx.reply('Menu:', { reply_markup: keyboard });

Reply Button Types

MethodDescription
Markup.replyButton.text(text)Plain text button
Markup.replyButton.requestContact(text)Request phone number
Markup.replyButton.requestLocation(text)Request location
Markup.replyButton.requestPoll(text)Request poll creation

Remove Keyboard

typescript
await ctx.reply('Keyboard removed.', {
    reply_markup: Markup.removeKeyboard()
});

Force Reply

Force the user to reply to your message:

typescript
await ctx.reply('What is your name?', {
    reply_markup: Markup.forceReply({
        input_field_placeholder: 'Type your name...'
    })
});

Released under the ISC License.