# Block Kit layouts, elements and input handling

*Slack Developer Study Guide · Design the Interactive Flow of Your App · Last updated October 21, 2026 · https://www.certifyforce.com/study-guide/slack-developer/design-the-interactive-flow-of-your-app/block-kit-layouts-elements-and-input-handling*

Building valid Block Kit layouts: block and field limits, header and modal view rules, buttons with action_id, style and confirm, static versus external select menus, reading view.state.values, returning validation errors, and updating a modal without losing input.

- Certification: Salesforce Slack Developer
- Exam section: Design the Interactive Flow of Your App
- Study guide: https://www.certifyforce.com/study-guide/slack-developer

**Official exam objective:**

> Build a UI for your app's surfaces using Block Kit.

## What the exam expects

- Diagnose invalid layouts from block limits, section `fields` limits, header text type and modal view rules.
- Configure buttons: unique `action_id`, `style` `primary` or `danger`, a `confirm` dialog, and link buttons that still need an acknowledgement.
- Choose a static or external select menu from the size and volatility of the option list.
- Read submitted values from `view.state.values`, return `response_action: errors`, and react to input changes with `dispatch_action`.
- Update a modal without losing typed input or applying stale updates.

Key terms: **block** (a visual component in a surface's `blocks` array); **block element** (usually interactive, such as a button or menu); **composition object** (text, option or confirm object used inside them); **`action_id`** (identifies the element in payloads); **`view.state.values`** (submitted values keyed by `block_id`, then `action_id`); **`dispatch_action`** (makes an input block send `block_actions`).

## Key facts

| Fact | Detail | Source |
|---|---|---|
| Block limits | 50 per message; 100 per modal or Home tab | [Blocks](https://docs.slack.dev/reference/block-kit/blocks/) |
| Section `fields` | Maximum 10 items | [Section block](https://docs.slack.dev/reference/block-kit/blocks/section-block) |
| Header text | `plain_text`, max 150 characters | [Header block](https://docs.slack.dev/reference/block-kit/blocks/header-block) |
| Button `style` | `primary` or `danger` only | [Button element](https://docs.slack.dev/reference/block-kit/block-elements/button-element) |
| Link button | Still sends a payload that must be acknowledged | [Button element](https://docs.slack.dev/reference/block-kit/block-elements/button-element) |
| Confirm dialog | `title`, `text`, `confirm`, `deny` required | [Confirmation dialog object](https://docs.slack.dev/reference/block-kit/composition-objects/confirmation-dialog-object) |
| `static_select` options | Maximum 100 `options`, or 100 `option_groups` | [Select menu element](https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element) |
| `external_select` typeahead | `min_query_length` default 3 | [Select menu element](https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element) |
| Modal title | `plain_text`, max 24 characters | [Modal views](https://docs.slack.dev/reference/views/modal-views) |
| `submit` | Required when the view has an input block | [Modal views](https://docs.slack.dev/reference/views/modal-views) |
| `dispatch_action` | Input block field, default false | [Input block](https://docs.slack.dev/reference/block-kit/blocks/input-block) |

## Check yourself

- Why can't two buttons in one actions block share an `action_id`?
- When should an app choose `external_select` over `static_select`?
- Which path reads the text typed into a plain-text input `a1` in block `b1`?
- Why pass `hash` to `views.update`?

## Sources

- [Block Kit](https://docs.slack.dev/block-kit/)
- [Blocks](https://docs.slack.dev/reference/block-kit/blocks/)
- [Section block](https://docs.slack.dev/reference/block-kit/blocks/section-block)
- [Header block](https://docs.slack.dev/reference/block-kit/blocks/header-block)
- [Button element](https://docs.slack.dev/reference/block-kit/block-elements/button-element)
- [Confirmation dialog object](https://docs.slack.dev/reference/block-kit/composition-objects/confirmation-dialog-object)
- [Select menu element](https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element)
- [Input block](https://docs.slack.dev/reference/block-kit/blocks/input-block)
- [Modal views](https://docs.slack.dev/reference/views/modal-views)
- [Modals](https://docs.slack.dev/surfaces/modals)
- [View interaction payloads](https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload)
- [block_actions payload](https://docs.slack.dev/reference/interaction-payloads/block_actions-payload)

## About the full unit

The "Core concepts", "Exam traps" and "Worked scenario" sections of this unit, its 12 linked practice questions, and unlimited timed mock exams are included with the Slack Developer pack (USD $19): https://www.certifyforce.com/practice-exams
