Marketing

Bento Features

Responsive bento grid for explaining a product's strongest capabilities.

Open Markdown
Built for product teams

One system from first sketch to production.

Compose dependable primitives, keep every design decision visible, and ship server-rendered experiences without a client-side tax.

01

Rust all the way down

Render typed components on the server and add browser behavior only where the experience earns it.

Fast path by default →

hero.rs
html_sync! {
    <section class="grid gap-8">
        <h1>Ship in Rust</h1>
        {product_preview}
    </section>
}
0 hydrationtyped HTML7.6ms SSR
02

Accessible by construction

Clear semantics, keyboard-ready patterns, and ARIA wiring live alongside the component API.

Keyboard navigationReady
Focus managementReady
03

Tokens stay coherent

Theme primitives and typed recipes keep every surface on-brand without class-string sprawl.

04

Change every layer

Copy the source, adapt the API, and evolve the system with your product. No opaque runtime and no design-system dead end.

SourceRecipesThemesControl
FreeBento Features

Responsive bento grid for explaining a product's strongest capabilities.

Browse block source
features_bento.rs
// SPDX-FileCopyrightText: 2026 Proa Labs, Inc.
// SPDX-License-Identifier: (MIT OR Apache-2.0) AND MIT

// Adapted from MIT-licensed sources:
// - Tailark, `packages/mist-kit/blocks/features/eight/index.tsx`
//   https://github.com/tailark/blocks @ 8eadeb3389ccccc4bfc4a10bca959c1b39e47b71 (MIT License)
// - TWBlocks, `blocks/feature/feature7.tsx`
//   https://github.com/tommyjepsen/twblocks @ ff88cb951dab0dc01198b6570ec5f5cf21250d45 (MIT License)
//! Bento features block — asymmetric product stories with lightweight previews.

use proa_macros::html_sync;
use proa_ui::{Badge, BadgeVariant, Card};

/// Copy-paste-ready block composition.
pub struct FeaturesBentoBlock;

impl<B: proa_core::WriteBuf, L: proa_core::DataLoader> proa_core::WebRenderSync<L, B> for FeaturesBentoBlock {
    fn render(
        self,
        cx: &mut proa_core::WebContext<L, B>,
    ) -> Result<(), proa_core::WriteError> {
        html_sync! {

Search

Type at least 2 characters

Customize

Make it yours

Palette

Radius

Overview
Components
Settings

Build your own

Themed Proa UI surface

Preview
Components52
RecipesTyped
customer-portal