Skip to content
Merged
4 changes: 4 additions & 0 deletions docs/ff-designer/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"label": "Welcome",
"position": 1
}
4 changes: 4 additions & 0 deletions docs/ff-designer/components/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"label": "Components",
"position": 3
}
143 changes: 143 additions & 0 deletions docs/ff-designer/components/components.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
---
slug: /designer/components
title: Components
description: Learn how to create reusable UI components, add variants and toggles, and manage dynamic behavior using parameters and expressions in FlutterFlow Designer.
tags: [Components, FlutterFlow Designer, FlutterFlow, Design]
sidebar_position: 0
keywords: [FlutterFlow components, reusable UI, component variants, toggles, has expression, design system, UI components]
---

# Components

A **component** is a reusable UI building block that you can use across your app design. Instead of creating the same UI again and again, you build it once as a component and reuse it wherever needed. This helps keep your app design consistent and easier to maintain.

When you update a component, all places where it is used automatically get updated.

Imagine you are having a settings screen with multiple rows, such as:

- Notification toggle
- Privacy option
- Account settings

Each row has a similar layout with an icon, text, and an action such as switch or arrow. Instead of having each row separately, you can create one **Settings Item component** and reuse it multiple times with different content.

### Creating Component

To create a new component, start by selecting an existing UI block on the canvas. Then click **Create Component** from the right-side panel, give your component a name, and choose the parameters you want to include (such as text, image, or icon). Once you confirm, the component is created and opens in Component Studio.

Inside Component Studio, you can bind these parameters to different UI elements. Select an element, then connect its properties (like text or image) to a parameter from the right panel. You can also add new parameters if needed. This allows each instance of the component to display different content while keeping the same structure and design.

<div style={{
position: 'relative',
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/UL7BkkQMcum84CQnfFAT?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>

:::tip

Once the component is created, you can also use AI to quickly update your component by describing the changes instead of manually editing everything.

:::

### Create Variants

A **variant** is a different version of the same component that allows you to change its appearance without creating a new component. Variants help you manage multiple styles, states, or layouts in one place to make your components more flexible and reusable. For example, a button component can have variants like **Filled** and **Outlined**.

To create a variant, first open your component and click **Add variant**. This creates a new option for the current component, such as an alternate style or layout. Once the new variant appears, select it and customize its properties to make it visually different from the default version, such as changing borders, spacing, colors, or other styling details.

If you want to introduce a completely new category of variation, click **+ Add variant** again to create a new dimension for the component.


<div style={{
position: 'relative',
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/KBmUhJavLxBjxwA8IqjE?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>

### Add Toggle

A **toggle** lets you switch between two states of a component, such as on/off or active/inactive, within the same component. For example, a settings item can have a toggle to show **enabled** or **disabled** states, or a card can toggle between **selected** and **unselected** styles.

To add a toggle, open your component and click **Add toggle** from the variants panel. This creates a new toggle dimension for your component. Once added, you’ll see two states (i.e., true/false). Select each state and customize the component to define how it should look in each case.

<div style={{
position: 'relative',
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/fN1S8VFY034VMJU0vJ0p?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>

#### The `Has` Expression

The `Has` expression lets you automatically control a Boolean property based on whether a component parameter has been provided. This is useful when you want part of a component to appear only when data exists, without manually setting a separate true/false value each time.

For example:

- Show an image only when `image_url` is set
- Show a subtitle only when `subtitle` is set
- Show a time row only when `time` is set

A `Has` expression checks whether a parameter contains a value. If it does, the result is `true`. If it does not, the result is `false`.

Suppose you have a flight booking card component with an optional image on the right side. Instead of adding both `image_url` and a separate `show_image` flag, you can just use `image_url` and bind the **Visible** property to `has(image_url)`. If an image is provided, the card displays the image, and if not, it just appears as a text-only layout.

![control-using-has-expression](imgs/control-using-has-expression.avif)
4 changes: 4 additions & 0 deletions docs/ff-designer/designing/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"label": "Designing",
"position": 2
}
197 changes: 197 additions & 0 deletions docs/ff-designer/designing/iterate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
---
slug: /designer/iterate
title: Iterate
description: Refine and improve your generated screens visually, with AI prompts, or by editing the global theme.
tags: [Iterate, FlutterFlow Designer, FlutterFlow, Design]
sidebar_position: 1
keywords: [iterate design, edit visually, ai prompt, properties panel, theme editor]
---

# Iterate

After generating your initial storyboard, you can refine and improve your screens in two ways: [editing visually](#edit-visually) on the canvas and [using AI prompts](#use-ai-prompt). Each method is useful depending on the type of change you want to make.

## Edit Visually

This is useful when you want precise control over layout and structure. It makes it easy to quickly add or adjust elements exactly where you want them.

To start, click on any UI element in the canvas. The selected element will be highlighted, and small dots will appear around it. You can click any of these dots to add a new UI element at that position. When you click a dot, a selector pop-up opens, allowing you to choose and insert a new element.

<div style={{
position: 'relative',
paddingBottom: 'calc(52.67989417989418% + 41px)',
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/AcWFYJYNcqzMDoNEngxx?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>

You can also rearrange elements using drag and drop. Simply select an element and move it to a new position within the layout.

<div style={{
position: 'relative',
paddingBottom: 'calc(52.67989417989418% + 41px)',
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/6EktGdKPOazdR6fwXFg5?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>

### Use Properties Panel

The Properties Panel allows you to make precise adjustments to any selected widget. When you click on an element in the canvas, its editable properties appear on the right side. From there, you can modify properties such as text content, typography settings, spacing, alignment, colors, borders, and other styling attributes. This gives you direct control over how each element looks and behaves without needing to regenerate the entire screen.

Unlike AI-driven changes, edits made here are exact and predictable, making it ideal for polishing the design once the overall layout and structure are already in place.

<div style={{
position: 'relative',
paddingBottom: 'calc(52.67989417989418% + 41px)',
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/p6jxl3xcPgjPIZckXwNV?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>

## Use AI Prompt

This method is best for structural, layout, or multi-element changes. To make a change using AI Prompt:

1. Click on the screen (frame) you want to update from the canvas or Frames panel.
2. Use the prompt bar at the bottom to clearly describe what you want to modify.
3. If you're not satisfied with the result, use the regenerate option to explore a new variation of the same instruction.
4. You can click directly on a widget. The selected widget will automatically be added to the prompt bar as context for your next instruction, allowing more precise AI updates.

<div style={{
position: 'relative',
paddingBottom: 'calc(52.67989417989418% + 41px)',
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/baHBozUa0iwMy6WQON49?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>

You can also select a page and ask the AI to generate variations of it. This helps you quickly explore different design directions.

<div style={{
position: 'relative',
paddingBottom: 'calc(52.67989417989418% + 41px)',
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/aWwn7YP7dyz99oDWqWHQ?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>

## Edit Theme

Editing a **Theme** allows you to modify the global design system of your entire storyboard at once. Instead of adjusting individual widgets, you can change core styling elements such as brand colors, typography, spacing, corner radius, and text scaling. Any updates made in the Theme Editor automatically apply across all screens, ensuring visual consistency without manual updates on each page.

<div style={{
position: 'relative',
paddingBottom: 'calc(52.67989417989418% + 41px)',
height: 0,
width: '100%'}}>
<iframe
src="https://demo.arcade.software/m9gaNdcurgtuh5xnw0YP?embed&show_copy_link=true"
title=""
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
colorScheme: 'light'
}}
frameborder="0"
loading="lazy"
webkitAllowFullScreen
mozAllowFullScreen
allowFullScreen
allow="clipboard-write">
</iframe>
</div>
<p></p>
Loading
Loading