RemixRemix

Introduction

Build custom Flutter interfaces with Remix behavior and Mix styling

Remix is a Flutter component library built on Mix, which defines styling, and Naked UI, which supplies unstyled interaction primitives. Remix provides interaction behavior, focus handling, and accessibility semantics while leaving the visual design to your application.

Why Remix?

Custom controls need more than a different color. Buttons need loading and disabled behavior; menus need focus and keyboard handling; dialogs need to work with the application's navigator. Remix supplies those component behaviors so you can concentrate on the interface and its application state.

Use a component styler to define appearance, reuse it across instances, and change styles in response to hover, focus, or press. Your application still owns layout, values, callbacks, and persistence.

Quick Start

Choose the workflow that matches what you want to own:

WorkflowWhat you writeStart here
Use Remix directlyComponent instances and Mix stylersInstall and render a button
Install editable recipesLocal theme and component source, plus your applicationOpen Code reference
Learn through a complete screenA settings form, save behavior, dialog, and sidebarCLI settings-screen tutorial

The CLI tutorial uses a pinned checkout, not an assumed published CLI release. It covers the small vanilla preset and the separate fortal preset.

Styling components

A styler defines appearance; the widget supplies behavior. Start with the styling guide for states, animation, and reuse. The Styler API documents the canonical methods and shorthand rules. Individual component pages cover their own slots and interaction contracts.

Theming with Fortal

The Fortal preset provides a Radix Themes-inspired starting point. The CLI installs its tokens, scope, and recipes into your application. You own those files; the preset does not add a remix_fortal dependency to your app.

Use the tutorial's Fortal step to compare it with the Vanilla preset. Keep the two presets in separate initialized projects: their token systems and component constructors differ.

Host capabilities

Remix composes inside your Flutter host. It does not require a MaterialApp, Scaffold, or Remix-owned application wrapper.

UICaller provides
Ordinary Remix* widgetsThe inherited Flutter services used by the widget subtree
Widgets styled by the Fortal presetThe preset's token scope, plus the widget's normal Flutter services
Menu, select, popover, and tooltipAn Overlay; use Overlay.wrap when no Navigator is needed
showRemixDialog and showRemixAlertDialogA caller-owned Navigator above the invoking context

For a portal-based interface without routing, provide an overlay:

import 'package:flutter/widgets.dart';
import 'package:remix/remix.dart';

Widget buildPortalHost() {
  return WidgetsApp(
    color: const Color(0xFFFFFFFF),
    builder: (_, _) => Overlay.wrap(
      child: Center(
        child: RemixMenu<String>(
          trigger: const RemixMenuTrigger(label: 'Actions'),
          items: const [
            RemixMenuItem(value: 'share', label: 'Share'),
          ],
        ),
      ),
    ),
  );
}

Material, Cupertino, Widgets, and router-based hosts can all supply these services. The settings-screen tutorial shows a complete host, including the scope placement used by its dialog.

Examples

The repository also contains apps/dashboard, apps/demo, packages/remix/example, and registry_source/example. The last is an authoring-package example, not a dependency the CLI adds to consumer apps.

View page source on GitHub

On this page