> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bfl.ml/llms.txt
> Use this file to discover all available pages before exploring further.

# Style, Aesthetics & Text

> Photographic looks, camera and lens language, art styles, lighting, target colors, and how to put text in FLUX 3 images

export const FLUX3_STYLE_EXAMPLES = [{
  "key": "tiger-poster",
  "title": "Tiger poster",
  "image": "/images/flux3-image/layouts/tiger-poster.webp",
  "width": 1050,
  "height": 1400,
  "aspect_ratio": "3:4",
  "caption": "Full-color digital scan of a flat, vertical graphic design poster exhibiting a minimalist, mid-century Japanese aesthetic and a two-dimensional, screen-printed quality. The composition is entirely bounded by a thick, matte black border <border_1> that encloses a solid, flat ultramarine blue background <background_1>. The lighting is perfectly even, with no gradients or shadows, emphasizing a restricted four-color palette of blue, golden yellow, black, and white. In the center, a stylized tiger <tiger_1> is depicted in a dynamic, downward-prowling pose. Typography is arranged cleanly around the central figure in a stark white sans-serif font. In the upper-right corner sits a date <En_Text_1>. Running vertically down the left edge is a series of stacked text <Ja_Text_1>. In the lower-right corner, a large, bold kanji character <Ja_Text_2> is prominently displayed. Finally, in the bottom-left corner, a small attribution line <En_Text_2> rests just inside the dark border.",
  "rows": [{
    "id": "border_1",
    "bbox": [0, 0, 1000, 1000],
    "desc": "A thick, matte black rectangular border framing the entire composition."
  }, {
    "id": "background_1",
    "bbox": [40, 40, 960, 960],
    "desc": "A solid, flat ultramarine blue rectangular field providing a high-contrast backdrop, devoid of any gradients, texture, or shadows."
  }, {
    "id": "tiger_1",
    "bbox": [250, 200, 800, 850],
    "desc": "A stylized tiger rendered in a vibrant yellow-gold hue with thick, expressive black outlines. Its body features irregular, organic black stripes resembling ink brushstrokes. The tiger is in a downward-prowling pose with an arched back, its head positioned toward the lower-left and its tail curving smoothly upward and back toward the center, ending in a small flick. The face is shown in profile, displaying a wide, circular eye and a slightly open mouth revealing teeth, reflecting an Ukiyo-e influence."
  }, {
    "id": "En_Text_1",
    "bbox": [80, 780, 140, 920],
    "desc": "The numbers \"1958\" printed in a clean, stark white sans-serif font."
  }, {
    "id": "Ja_Text_1",
    "bbox": [200, 80, 750, 140],
    "desc": "The text \"日本\\nJAPANESE\\nDESIGN\\nSERIES\" printed in a stark white sans-serif font, arranged to run vertically down the edge. The Japanese characters for Japan are at the top, followed by the capitalized English words stacked below."
  }, {
    "id": "Ja_Text_2",
    "bbox": [780, 780, 920, 920],
    "desc": "A large, bold, stark white kanji character \"虎\"."
  }, {
    "id": "En_Text_2",
    "bbox": [900, 80, 930, 350],
    "desc": "The small attribution \"design by gk.dsn\" written in a lowercase, stark white sans-serif font."
  }]
}, {
  "key": "character",
  "title": "Character sheet",
  "image": "/images/flux3-image/layouts/character.webp",
  "width": 1400,
  "height": 927,
  "aspect_ratio": "3:2",
  "caption": "Digital illustration character model sheet against a plain white background, featuring clean, thick linework and a color palette of red, green, and cream. Soft, pinkish-red rim lighting illuminates the edges of the figures, suggesting a low-sunlight environment. On the left, a young male character <character_1> stands on a patch of grassy earth, wearing a school uniform and smiling with his mouth closed as a white rugby ball <ball_1> floats above his upturned hand. In the upper-middle area, a close-up bust <character_2> shows him in the same uniform with a wide, teeth-baring grin. Below this is a headshot <character_3> of the character wearing a red jacket, looking upward with his mouth slightly open. The right side contains wide, exaggerated action poses: at the top right, he is shown in a horizontal mid-air dive <character_4>, reaching for another rugby ball <ball_2> in a green and white athletic kit. In the bottom right, he is depicted in a full-body sprint <character_5> across a grassy patch, leaning sharply forward in a red jacket and white shorts. Centered in the lower-middle area, a block of text <En_Text_1> sits above smaller subtext and a signature <En_Text_2>. Just below the text, a final profile headshot <character_6> shows the character with a calm, closed-mouth smile.",
  "rows": [{
    "id": "character_1",
    "bbox": [100, 50, 900, 300],
    "desc": "A young male character standing in a full-body pose on a small patch of grassy earth, drawn with clean, thick linework and pinkish-red rim lighting on his left side. He has spiky reddish-brown hair, large eyes with yellow irises, and a small, rounded nose. He wears a formal school uniform: a light-cream long-sleeved shirt, a dark striped tie, a green sweater vest with a yellow crest, dark grey trousers, and a black belt with a gold buckle. He looks toward the viewer with a closed-mouth smile."
  }, {
    "id": "ball_1",
    "bbox": [450, 220, 530, 290],
    "desc": "A white, oval-shaped rugby ball with distinct seam lines, floating mid-air directly above the character's open, upturned palm."
  }, {
    "id": "character_2",
    "bbox": [100, 350, 450, 550],
    "desc": "A close-up bust of the young male character in his green sweater vest and striped tie. His head is turned slightly, and he sports a wide, teeth-baring grin, his large yellow irises looking forward. Pinkish-red rim lighting highlights the edges of his spiky reddish-brown hair."
  }, {
    "id": "character_3",
    "bbox": [480, 350, 680, 550],
    "desc": "A headshot of the character looking sharply upward, his mouth slightly open in surprise. He wears a bright red jacket layered over a dark shirt. Warm pinkish-red rim lighting catches the side of his face and the tips of his spiky hair."
  }, {
    "id": "character_4",
    "bbox": [100, 600, 450, 950],
    "desc": "The character depicted mid-air in a horizontal diving pose, reaching out with both hands to catch a ball. He wears a green and white athletic jersey, white shorts, and green wristbands. His face shows intense focus, illuminated by pinkish-red rim light."
  }, {
    "id": "ball_2",
    "bbox": [200, 850, 300, 940],
    "desc": "A white rugby ball positioned just ahead of the diving character's outstretched hands."
  }, {
    "id": "character_5",
    "bbox": [500, 600, 950, 950],
    "desc": "A full-body depiction of the character in mid-sprint across a small patch of green grass. His body leans sharply forward, arms pumping, with a focused expression. He is dressed in a bright red zip-up jacket over a dark t-shirt, white shorts, and red athletic shoes, with pinkish-red rim lighting accentuating his trailing edges."
  }, {
    "id": "En_Text_1",
    "bbox": [700, 350, 760, 550],
    "desc": "Black text reading \"ARTHUR\" in a thick, brush-stroke font."
  }, {
    "id": "En_Text_2",
    "bbox": [770, 350, 840, 550],
    "desc": "Smaller typography arranged in multiple lines. The text reads \"OVALON / 2014\\n2 MINUTES / I CAN FLY\" in green and orange. Below this is a cursive signature reading \"Fabien Mense\"."
  }, {
    "id": "character_6",
    "bbox": [850, 380, 980, 520],
    "desc": "A profile-view headshot of the character facing left. He has a calm, closed-mouth smile, with his spiky reddish-brown hair and facial profile cleanly outlined and accented by soft pinkish-red rim light."
  }]
}, {
  "key": "categories",
  "title": "Design categories",
  "image": "/images/flux3-image/layouts/categories.webp",
  "width": 1400,
  "height": 1050,
  "aspect_ratio": "4:3",
  "caption": "Flat-color digital illustration of a minimalist graphic design presented against a solid black background. The composition is organized into a vertical list of horizontal rows separated by thin, crisp white lines that span the full width of the frame. The lighting is perfectly flat and even, with no shadows, gradients, or textures, emphasizing a high-contrast, Swiss-inspired geometric layout. The framing is a tight, medium-close shot focusing on the middle section of the list. At the top edge, a partially visible upper row <row_1> is cut off by the frame. Below it, the first fully visible row <row_2> spans the width. The list continues downwards with four more complete, identically structured rows: the second full row <row_3>, the third full row <row_4>, the fourth full row <row_5>, and the fifth full row <row_6>. Each full row places a vibrant, colored circular badge with a black two-digit number on the left, followed by a bold, white sans-serif text label on the right. At the very bottom, another partially cropped lower row <row_7> extends off the lower edge of the canvas.",
  "rows": [{
    "id": "row_1",
    "bbox": [0, 0, 60, 1000],
    "desc": "A partially cropped horizontal list row set against a solid black background. On the left, only the bottom sliver of a yellow circular badge is present. To its right, the bottom portion of bold, white sans-serif text reads \"Logo\". A thin white horizontal line forms the bottom boundary of the row."
  }, {
    "id": "row_2",
    "bbox": [60, 0, 220, 1000],
    "desc": "A complete horizontal list row set against a solid black background. On the left sits a bright pink circular badge containing the number \"02\" in black. To the right of the badge is the word \"Colors\" in a bold, white sans-serif typeface reminiscent of Helvetica or Inter. A thin white horizontal line runs across the bottom edge."
  }, {
    "id": "row_3",
    "bbox": [220, 0, 380, 1000],
    "desc": "A horizontal list row featuring a bright green circular badge on the left, containing the black number \"03\". Beside it is the word \"Typography\" in bold, white sans-serif text. A thin white horizontal line marks the bottom edge."
  }, {
    "id": "row_4",
    "bbox": [380, 0, 540, 1000],
    "desc": "A horizontal list row with a vibrant orange circular badge on the left displaying the black number \"04\". To its right, the text \"Graphic Elements\" appears in bold, white sans-serif typography. A thin white horizontal line spans the bottom."
  }, {
    "id": "row_5",
    "bbox": [540, 0, 700, 1000],
    "desc": "A horizontal list row containing a saturated blue circular badge on the left with the black number \"05\". The phrase \"Grid & Composition\" is written to its right in bold, white sans-serif letters. A thin white horizontal line defines the bottom border."
  }, {
    "id": "row_6",
    "bbox": [700, 0, 860, 1000],
    "desc": "A horizontal list row showing a bold red circular badge on the left that holds the black number \"06\". Next to it is the word \"Photography\" in bold, white sans-serif text. A thin white horizontal line runs along the bottom."
  }, {
    "id": "row_7",
    "bbox": [860, 0, 1000, 1000],
    "desc": "A partially cropped horizontal list row set against a solid black background. On the left, the top half of a yellow circular badge is present. To its right, the top halves of bold, white sans-serif letters spell out the beginning of the phrase \"Social Media\"."
  }]
}];

export const LayoutExplorer = ({examples = [], mediaBase = "", initial = 0}) => {
  const COLORS = ["#e8b04a", "#6fb3d9", "#e0708a", "#8fcf7a", "#b99af0", "#f08b5b", "#5fd0c0", "#d9d36f", "#9fb0c8", "#f2a3c7", "#7aa0f0", "#c7e07a"];
  const [index, setIndex] = useState(initial);
  const [active, setActive] = useState(null);
  const [showBoxes, setShowBoxes] = useState(true);
  const [cursor, setCursor] = useState(null);
  const [copied, setCopied] = useState(false);
  const [expanded, setExpanded] = useState(false);
  const stage = useRef(null);
  const [loaded, setLoaded] = useState({});
  const [failedSource, setFailedSource] = useState("");
  const ex = examples[index];
  if (!ex) return null;
  const source = mediaBase + ex.image;
  const ready = Boolean(loaded[source]);
  const reveal = async (image, key) => {
    try {
      await image.decode();
      setLoaded(current => ({
        ...current,
        [key]: true
      }));
    } catch {
      setFailedSource(key);
    }
  };
  const preload = example => {
    const image = new Image();
    image.src = mediaBase + example.image;
  };
  const hidden = new Set(ex.hidden || []);
  const color = id => COLORS[ex.rows.findIndex(r => r.id === id) % COLORS.length];
  const pct = ([y0, x0, y1, x1]) => ({
    top: y0 / 10 + "%",
    left: x0 / 10 + "%",
    height: (y1 - y0) / 10 + "%",
    width: (x1 - x0) / 10 + "%"
  });
  const prompt = ex.caption + " " + JSON.stringify(ex.rows.map(({id, bbox, desc}) => ({
    id,
    bbox,
    desc
  })));
  const pick = i => {
    setCopied(false);
    setIndex(i);
    setActive(null);
    setExpanded(false);
  };
  const copy = async () => {
    try {
      await navigator.clipboard.writeText(JSON.stringify({
        prompt,
        aspect_ratio: ex.aspect_ratio
      }, null, 2));
      setCopied(true);
      setTimeout(() => setCopied(false), 1800);
    } catch (e) {
      setCopied(false);
    }
  };
  const onMove = e => {
    const r = stage.current.getBoundingClientRect();
    const k = v => Math.max(0, Math.min(1000, Math.round(v * 1000)));
    setCursor([k((e.clientY - r.top) / r.height), k((e.clientX - r.left) / r.width)]);
  };
  const parts = ex.caption.split(/(<[A-Za-z0-9_]+>)/g).filter(Boolean);
  const rows = expanded ? ex.rows : ex.rows.slice(0, 6);
  const hot = id => ({
    onMouseEnter: () => setActive(id),
    onMouseLeave: () => setActive(null),
    onFocus: () => setActive(id),
    onBlur: () => setActive(null)
  });
  return <section className="not-prose layout-explorer" aria-label="Layout prompt explorer">
      <style>{`
.layout-explorer{container-type:inline-size;margin:1.5rem 0 2rem;border:1px solid rgba(128,128,128,.25);border-radius:1rem;overflow:hidden;background:rgba(127,127,127,.04)}
.layout-explorer .lx-picker{display:flex;align-items:center;font-size:.85rem;gap:.4rem;flex-wrap:wrap;padding:.85rem;border-bottom:1px solid rgba(128,128,128,.2)}
.layout-explorer .lx-pills{display:flex;flex-wrap:wrap;gap:.4rem}
.layout-explorer .lx-pills button{font:inherit;font-size:.8rem;padding:.3rem .75rem;border:1px solid rgba(128,128,128,.35);border-radius:999px;background:transparent;color:inherit;cursor:pointer}
.layout-explorer .lx-pills button:hover{border-color:var(--aspen-evergreen,#486a58)}
.layout-explorer .lx-pills button[aria-pressed="true"]{background:var(--aspen-evergreen,#486a58);border-color:var(--aspen-evergreen,#486a58);color:#fff}
.layout-explorer .lx-body{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:1.25rem;padding:1.1rem}
.layout-explorer .lx-stage{position:relative;overflow:hidden;border-radius:.6rem;background:#111;cursor:crosshair;align-self:start}
.layout-explorer .lx-visual{opacity:0;transition:opacity .18s ease}
.layout-explorer .lx-visual.is-ready{opacity:1}
.layout-explorer .lx-loading{position:absolute;inset:0;display:grid;place-items:center;color:#ccc;font-size:.8rem;padding:1rem;text-align:center}
.layout-explorer .lx-stage img{display:block;width:100%;height:auto;margin:0}
.layout-explorer .lx-box{position:absolute;border:2px solid var(--c);border-radius:3px;background:transparent;transition:background .15s,opacity .2s,border-width .15s;pointer-events:none}
.layout-explorer .lx-box span{position:absolute;left:-2px;top:-2px;transform:translateY(-100%);background:var(--c);color:#141414;font:600 10px/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;padding:1px 5px;border-radius:3px 3px 0 0;white-space:nowrap;max-width:14rem;overflow:hidden;text-overflow:ellipsis}
.layout-explorer .lx-box.is-inside span{transform:none;border-radius:0 0 3px 0}
.layout-explorer .lx-box.is-dim{opacity:.18}
.layout-explorer .lx-box.is-hot{border-width:3px;background:color-mix(in srgb,var(--c) 22%,transparent);opacity:1;z-index:2}
.layout-explorer .lx-readout{position:absolute;right:.5rem;bottom:.5rem;font:500 11px ui-monospace,SFMono-Regular,Menlo,monospace;background:rgba(0,0,0,.72);color:#f2f2f2;padding:.25rem .5rem;border-radius:.35rem;pointer-events:none}
.layout-explorer .lx-tools{display:flex;gap:.5rem;align-items:center;justify-content:space-between;margin-top:.6rem;font-size:.8rem;opacity:.85}
.layout-explorer .lx-tools label{display:flex;gap:.4rem;align-items:center;cursor:pointer}
.layout-explorer summary{font-size:.85rem;cursor:pointer;padding:.3rem 0}
.layout-explorer details[open] summary{margin-bottom:.4rem}
.layout-explorer .lx-side{display:flex;flex-direction:column;gap:.9rem;min-width:0}
.layout-explorer .lx-h{font:600 .7rem/1 system-ui,sans-serif;letter-spacing:.08em;text-transform:uppercase;opacity:.6;margin:0 0 .4rem}
.layout-explorer .lx-caption{font-size:.88rem;line-height:1.65;margin:0}
.layout-explorer .lx-token{display:inline;font:600 .75rem ui-monospace,SFMono-Regular,Menlo,monospace;padding:.05rem .35rem;margin:0 .1rem;border-radius:.3rem;border:1px solid var(--c);background:color-mix(in srgb,var(--c) 14%,transparent);color:inherit;cursor:default}
.layout-explorer .lx-token.is-hot{background:var(--c);color:#141414}
.layout-explorer .lx-rows{display:flex;flex-direction:column;gap:.35rem;margin:0;padding:0;list-style:none}
.layout-explorer .lx-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.2rem .6rem;padding:.45rem .6rem;border-radius:.5rem;border:1px solid transparent;background:rgba(127,127,127,.07);outline:none}
.layout-explorer .lx-row.is-hot,.layout-explorer .lx-row:focus-visible{border-color:var(--c)}
.layout-explorer .lx-row code{font-size:.72rem;background:none;padding:0}
.layout-explorer .lx-row .lx-id{display:flex;align-items:center;gap:.35rem;font-weight:600}
.layout-explorer .lx-row .lx-id i{width:.6rem;height:.6rem;border-radius:2px;background:var(--c);display:inline-block}
.layout-explorer .lx-row .lx-bbox{justify-self:end;opacity:.7}
.layout-explorer .lx-row .lx-desc{grid-column:1/-1;margin:0;font-size:.78rem;line-height:1.45;opacity:.8;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.layout-explorer .lx-row.is-hot .lx-desc{-webkit-line-clamp:unset}
.layout-explorer .lx-more,.layout-explorer .lx-copy{align-self:flex-start;font-size:.78rem;font-weight:600;padding:.45rem .8rem;border-radius:.45rem;cursor:pointer}
.layout-explorer .lx-more{background:transparent;border:1px solid rgba(128,128,128,.35);color:inherit}
.layout-explorer .lx-copy{background:var(--aspen-evergreen,#486a58);border:1px solid var(--aspen-evergreen,#486a58);color:#fff}
.layout-explorer .lx-idea p:last-child{margin:.25rem 0 0;font-size:.9rem;line-height:1.5}
.layout-explorer .lx-actions{display:flex;gap:.5rem;flex-wrap:wrap}
@container (max-width:760px){.layout-explorer .lx-body{grid-template-columns:minmax(0,1fr)}}
@media (prefers-reduced-motion:reduce){.layout-explorer *{transition:none!important}}
      `}</style>

      {examples.length > 1 ? <div className="lx-picker">
        <div className="lx-pills" role="group" aria-label="Example" onFocus={() => examples.forEach(preload)} onMouseEnter={() => examples.forEach(preload)}>
          {examples.map((example, i) => <button key={example.key} type="button" aria-pressed={i === index} onClick={() => pick(i)}>{example.title}</button>)}
        </div>
      </div> : null}

      <div className="lx-body">
        <div>
          <div className="lx-stage" style={{
    aspectRatio: `${ex.width} / ${ex.height}`
  }} aria-busy={!ready} ref={stage} onPointerMove={onMove} onPointerLeave={() => setCursor(null)}>
            {!ready && <div className="lx-loading" role="status">{failedSource === source ? "Image unavailable. Choose another example or reload to retry." : "Loading example…"}</div>}
            <div className={ready ? "lx-visual is-ready" : "lx-visual"} aria-hidden={!ready}>
            <img key={source} src={source} onLoad={event => reveal(event.currentTarget, source)} onError={() => setFailedSource(source)} alt={ex.title + ", generated with FLUX 3 from the layout shown alongside"} width={ex.width} height={ex.height} />
            {showBoxes && ex.rows.map(r => {
    if (hidden.has(r.id) && active !== r.id) return null;
    const cls = ["lx-box"];
    if (r.bbox[0] < 40) cls.push("is-inside");
    if (active && active !== r.id) cls.push("is-dim");
    if (active === r.id) cls.push("is-hot");
    return <div key={r.id} className={cls.join(" ")} style={{
      ...pct(r.bbox),
      "--c": color(r.id)
    }}>
                  <span>{r.id}</span>
                </div>;
  })}
            </div>
            {ready && cursor && <div className="lx-readout">y {cursor[0]} · x {cursor[1]}</div>}
          </div>
          <div className="lx-tools">
            <label>
              <input type="checkbox" checked={showBoxes} onChange={e => setShowBoxes(e.target.checked)} />
              Show boxes
            </label>
            <span>{ex.rows.length} boxes · {ex.aspect_ratio}</span>
          </div>
        </div>

        <div className="lx-side">
          {ex.idea && <div className="lx-idea">
              <p className="lx-h">Short prompt</p>
              <p>{ex.idea}</p>
            </div>}
          <details>
            <summary>Full prompt</summary>
            <p className="lx-caption">
              {parts.map((part, i) => {
    const m = part.match(/^<([A-Za-z0-9_]+)>$/);
    if (!m) return <span key={i}>{part}</span>;
    const id = m[1];
    return <span key={i} tabIndex={0} className={active === id ? "lx-token is-hot" : "lx-token"} style={{
      "--c": color(id)
    }} {...hot(id)}>
                    {"<" + id + ">"}
                  </span>;
  })}
            </p>
          </details>
          <div>
            <p className="lx-h">Elements</p>
            <ul className="lx-rows">
              {rows.map(r => <li key={r.id} tabIndex={0} className={active === r.id ? "lx-row is-hot" : "lx-row"} style={{
    "--c": color(r.id)
  }} {...hot(r.id)}>
                  <code className="lx-id"><i aria-hidden="true" />{r.id}</code>
                  <code className="lx-bbox">[{r.bbox.join(", ")}]</code>
                  <div className="lx-desc">{r.desc}</div>
                </li>)}
            </ul>
          </div>
          <div className="lx-actions">
            {ex.rows.length > 6 && <button type="button" className="lx-more" onClick={() => setExpanded(!expanded)}>
                {expanded ? "Show fewer rows" : "Show all " + ex.rows.length + " rows"}
              </button>}
            <button type="button" className="lx-copy" onClick={copy} aria-live="polite">
              {copied ? "Copied" : "Copy request body"}
            </button>
          </div>
        </div>
      </div>
    </section>;
};

export const ImageExamples = ({examples = []}) => {
  const [copied, setCopied] = useState(null);
  const [expanded, setExpanded] = useState({});
  const [viewer, setViewer] = useState(null);
  const [actualSize, setActualSize] = useState(false);
  const openViewer = index => {
    setActualSize(false);
    setViewer(index);
  };
  const copyPrompt = async (prompt, index) => {
    try {
      await navigator.clipboard.writeText(prompt);
      setCopied(index);
      setTimeout(() => setCopied(null), 2000);
    } catch {
      setCopied(null);
    }
  };
  return <div className="not-prose flux3-image-examples" style={{
    "--example-columns": examples.length
  }}>
      <style>{`
        .flux3-image-examples {
          display: grid;
          grid-template-columns: repeat(var(--example-columns), minmax(0, 1fr));
          gap: 1rem;
          margin: 1.5rem 0;
        }
        .flux3-image-examples figure {
          display: flex;
          flex-direction: column;
          min-width: 0;
          margin: 0;
        }
        .flux3-image-examples .image-example-frame {
          display: flex;
          align-items: center;
          justify-content: center;
          aspect-ratio: 3 / 2;
          overflow: hidden;
          background: rgba(127, 127, 127, 0.08);
          border-radius: 0.75rem;
        }
        .flux3-image-examples .image-example-frame img {
          display: block;
          width: 100%;
          height: 100%;
          object-fit: contain;
          margin: 0;
          border-radius: 0;
        }
        .flux3-image-examples figcaption {
          margin-top: 0.75rem;
          font-size: 0.875rem;
        }
        .flux3-image-examples .image-example-prompt {
          display: flex;
          flex: 1;
          flex-direction: column;
          gap: 1rem;
          padding: 1.25rem;
          border-radius: 0.75rem;
          background: rgba(127, 127, 127, 0.08);
        }
        .flux3-image-examples .image-example-prompt p {
          margin: 0;
          line-height: 1.6;
        }
        .flux3-image-examples .image-example-prompt button {
          padding: 0.35rem 0.65rem;
          border-radius: 0.375rem;
          background: var(--aspen-evergreen, #486A58);
          color: white;
          font-size: 0.75rem;
          font-weight: 600;
          cursor: pointer;
        }
        .flux3-image-examples .image-example-frame button {
          display: block;
          width: 100%;
          height: 100%;
          padding: 0;
          border: 0;
          background: none;
          cursor: zoom-in;
        }
        .flux3-image-examples .image-example-prompt p.is-clamped {
          display: -webkit-box;
          -webkit-line-clamp: 4;
          -webkit-box-orient: vertical;
          overflow: hidden;
        }
        .flux3-image-examples .image-example-actions {
          display: flex;
          justify-content: flex-end;
          gap: 0.5rem;
          margin-top: auto;
        }
        .flux3-image-examples .image-example-actions .image-example-more {
          background: transparent;
          color: inherit;
          border: 1px solid rgba(128, 128, 128, 0.35);
        }
        .flux3-image-viewer {
          width: 100vw;
          height: 100vh;
          max-width: none;
          max-height: none;
          margin: 0;
          padding: 0;
          border: 0;
          overflow: auto;
          background: rgba(0, 0, 0, 0.95);
          cursor: zoom-out;
        }
        .flux3-image-viewer::backdrop {
          background: rgba(0, 0, 0, 0.6);
        }
        .flux3-image-viewer img {
          display: block;
          margin: auto;
          border-radius: 0;
        }
        .flux3-image-viewer.is-fit {
          display: flex;
          align-items: center;
          justify-content: center;
          padding: 2rem;
        }
        .flux3-image-viewer.is-fit img {
          max-width: 100%;
          max-height: 100%;
          object-fit: contain;
        }
        .flux3-image-viewer .flux3-image-viewer__bar {
          position: fixed;
          top: 1rem;
          right: 1rem;
          display: flex;
          gap: 0.5rem;
        }
        .flux3-image-viewer .flux3-image-viewer__bar button {
          padding: 0.35rem 0.75rem;
          border-radius: 0.375rem;
          background: rgba(255, 255, 255, 0.15);
          color: white;
          font-size: 0.8rem;
          font-weight: 600;
          cursor: pointer;
        }
        @media (max-width: 640px) {
          .flux3-image-examples { grid-template-columns: minmax(0, 1fr); }
        }
      `}</style>
      {examples.map(({src, alt, label, prompt, zoom, focus = "50% 50%"}, index) => <figure key={`${src}-${index}`}>
          <div className="image-example-frame">
            <button type="button" onClick={() => openViewer(index)} aria-label={`View full size: ${alt}`}>
              <img src={src} alt={alt} loading="lazy" style={zoom ? {
    transform: `scale(${zoom})`,
    transformOrigin: focus
  } : undefined} />
            </button>
          </div>
          {prompt ? <figcaption className="image-example-prompt">
              <p className={expanded[index] ? undefined : "is-clamped"}>{prompt}</p>
              <div className="image-example-actions">
                {prompt.length > 240 ? <button type="button" className="image-example-more" aria-expanded={!!expanded[index]} onClick={() => setExpanded({
    ...expanded,
    [index]: !expanded[index]
  })}>
                    {expanded[index] ? "Show less" : "Full prompt"}
                  </button> : null}
                <button type="button" onClick={() => copyPrompt(prompt, index)} aria-live="polite">
                  {copied === index ? "Copied!" : "Copy prompt"}
                </button>
              </div>
            </figcaption> : label ? <figcaption>{label}</figcaption> : null}
        </figure>)}
      {viewer !== null ? <dialog className={actualSize ? "flux3-image-viewer" : "flux3-image-viewer is-fit"} aria-label={examples[viewer].alt} ref={node => {
    if (node && !node.open) node.showModal();
  }} onClose={() => setViewer(null)} onClick={() => setViewer(null)}>
          <img src={examples[viewer].full || examples[viewer].src} alt={examples[viewer].alt} style={{
    cursor: actualSize ? "zoom-out" : "zoom-in"
  }} onClick={event => {
    event.stopPropagation();
    setActualSize(!actualSize);
  }} />
          <div className="flux3-image-viewer__bar" onClick={event => event.stopPropagation()}>
            <button type="button" onClick={() => setActualSize(!actualSize)}>
              {actualSize ? "Fit to screen" : "Actual size"}
            </button>
            <button type="button" onClick={() => setViewer(null)}>Close</button>
          </div>
        </dialog> : null}
    </div>;
};

export const PromptDisplay = ({prompt}) => {
  const [copied, setCopied] = useState(false);
  const copy = () => {
    navigator.clipboard.writeText(prompt);
    setCopied(true);
    setTimeout(() => setCopied(false), 2000);
  };
  return <div className="not-prose" style={{
    marginTop: "1rem"
  }}>
      <div style={{
    backgroundColor: "#1a1a1a",
    borderRadius: "1rem",
    padding: "1.25rem 1.5rem",
    display: "flex",
    flexDirection: "column",
    gap: "1rem"
  }}>
        <p style={{
    color: "#e5e5e5",
    fontSize: "1rem",
    lineHeight: 1.6,
    margin: 0,
    fontFamily: "inherit"
  }}>
          {prompt}
        </p>
        <div style={{
    display: "flex",
    justifyContent: "flex-end"
  }}>
          <button onClick={copy} style={{
    backgroundColor: copied ? "#3d8a5b" : "var(--aspen-evergreen, #486A58)",
    color: "#fff",
    border: "none",
    borderRadius: "0.375rem",
    padding: "0.25rem 0.6rem",
    fontSize: "0.7rem",
    fontWeight: 600,
    cursor: "pointer",
    transition: "background-color 0.2s"
  }}>
            {copied ? "Copied!" : "Copy prompt"}
          </button>
        </div>
      </div>
    </div>;
};

Specify the medium, texture, and lighting: a flash snapshot, a grainy night photograph, or an anime poster. Concrete descriptions give more direction than labels such as "aesthetic" or "professional".

## Photorealistic Styles

Describe the photograph you want: the era, the camera or film stock, and what that look does to the image (grain, color cast, flash, focus).

| Style | Key Descriptors |
| - | - |
| **Modern Digital** | “shot on Sony A7IV, clean sharp, high dynamic range” |
| **2000s Digicam** | “early digital camera, slight noise, flash photography, candid, 2000s digicam style” |
| **80s Vintage** | “film grain, warm color cast, soft focus, 80s vintage photo” |
| **Analog Film** | “shot on Kodak Portra 400, natural grain, organic colors” |

The layout captions shown here open with one sentence that sets the medium and the look. For photographs, it reads like this:

<ImageExamples
  examples={[
{
src: "https://cdn.sanity.io/images/2gpum2i6/production/1c91f02039d9af9fbffa95a034c72f01dd1006a5-927x1400.webp",
alt: "FLUX 3 Image: two men and a gray humanoid figure sit on a wooden bench against a light-wood wall, lit by direct flash.",
label: "FLUX 3 Image: \"Full-color indoor 35mm photograph with a slight film grain and a warm color cast, lit by harsh, direct camera flash that casts sharp shadows against the background.\""
},
{
src: "https://cdn.sanity.io/images/2gpum2i6/production/fde725f913d4233ba898bed181c5bdded8fd32e7-1400x927.webp",
alt: "FLUX 3 Image: diners in deep red light at a restaurant table, beside a window onto a pine tree lit green at night.",
label: "FLUX 3 Image: \"High-angle, full-color 35mm indoor-outdoor film photograph captured at night, featuring visible grain, deep shadows, and a shallow depth of field that renders the foreground in an atmospheric blur.\""
}
]}
/>

Both were generated from a full caption plus a [layout](/flux_3/flux3_image_layout). The quoted sentence is the part that sets the look.

The tabs below show more photographic styles, all generated with FLUX 3 Image:

<Tabs>
  <Tab title="Modern Photorealism">
    <Frame caption="FLUX 3 Image">
      <img src="https://mintcdn.com/bfl/2M9j52sP07XkdzRL/images/flux3-image/regen/F2-16.webp?fit=max&auto=format&n=2M9j52sP07XkdzRL&q=85&s=92b54ae5399bdefc9a92884fc492f200" alt="Wet tiger cub under a banana leaf in a rainy jungle" width="1600" height="1060" data-path="images/flux3-image/regen/F2-16.webp" />
    </Frame>

    <PromptDisplay prompt={"A close-up wildlife photograph of a soaking-wet tiger cub sheltering beneath a broad banana leaf in a rainy jungle. The leaf arches just above the cub, raindrops gather along its edge, and wet fur clumps into fine strands around the cub's eyes and muzzle. Soft daylight filtered through the canopy lights the face; the deeper green foliage falls out of focus behind it. The face and front paws remain clearly visible beneath the leaf."} />
  </Tab>

  <Tab title="2000s Digicam">
    <Frame caption="FLUX 3 Image">
      <img src="https://mintcdn.com/bfl/2M9j52sP07XkdzRL/images/flux3-image/regen/F2-18.webp?fit=max&auto=format&n=2M9j52sP07XkdzRL&q=85&s=b2aadd2be11d42bc8e3aa4a743cf0266" alt="Sloth drinking at a street table in Bangkok at night, lit by direct flash, with a 2006 date stamp" width="1600" height="898" data-path="images/flux3-image/regen/F2-18.webp" />
    </Frame>

    <PromptDisplay prompt="Sloth out drinking in Bangkok at night in a street full of party folks, 2000s digicam style, people in the background fading" />
  </Tab>

  <Tab title="80s Vintage">
    <Frame caption="FLUX 3 Image">
      <img src="https://mintcdn.com/bfl/2M9j52sP07XkdzRL/images/flux3-image/regen/F2-20.webp?fit=max&auto=format&n=2M9j52sP07XkdzRL&q=85&s=b65720443f2a7816e6cb1274dcf9aac1" alt="Baby penguins jumping in a trampoline park, in faded 1980s print colors" width="1600" height="898" data-path="images/flux3-image/regen/F2-20.webp" />
    </Frame>

    <PromptDisplay prompt="A group of baby penguins in a trampoline park, having the time of their lives, 80s vintage photo" />
  </Tab>

  <Tab title="Analog Photography">
    <Frame caption="FLUX 3 Image">
      <img src="https://mintcdn.com/bfl/2M9j52sP07XkdzRL/images/flux3-image/regen/F2-22.webp?fit=max&auto=format&n=2M9j52sP07XkdzRL&q=85&s=abff03e30aa2035a926ccd58cb6866c9" alt="Faded, creased print of a family of five standing in front of a wooden farmhouse" width="1600" height="898" data-path="images/flux3-image/regen/F2-22.webp" />
    </Frame>

    <PromptDisplay prompt="An old faded family portrait photograph from the early 2000s showing a family of five standing stiffly in front of their modest wooden farmhouse" />
  </Tab>
</Tabs>

<Tip>Name the camera, lens, or film stock instead of writing "professional photo": "Shot on Fujifilm X-T5, 35mm f/1.4". Then describe what it looks like: "visible grain", "a warm color cast", "slight chromatic aberration at the edges".</Tip>

### Camera and Lens Simulation

Be specific about camera settings:

```
Shot on Hasselblad X2D, 80mm lens, f/2.8, natural lighting
```

```
Canon 5D Mark IV, 24-70mm at 35mm, golden hour, shallow depth of field
```

## Art Styles & Illustration

FLUX 3 renders a wide range of styles beyond photographs. Name the style specifically and describe its visual characteristics: the FLUX 3 Tokyo poster below opens with "A stylized digital illustration in a flat, graphic anime style, resembling a modern pop-art poster with non-directional, uniform lighting."

These three FLUX 3 Image examples also open the caption with the medium and the style:

* **Tiger poster:** "Full-color digital scan of a flat, vertical graphic design poster exhibiting a minimalist, mid-century Japanese aesthetic and a two-dimensional, screen-printed quality."
* **Character sheet:** "Digital illustration character model sheet against a plain white background, featuring clean, thick linework and a color palette of red, green, and cream."
* **Design categories:** "Flat-color digital illustration of a minimalist graphic design presented against a solid black background."

<LayoutExplorer examples={FLUX3_STYLE_EXAMPLES} />

A plain prompt can set a style too. These FLUX 3 Image results each come from the prompt below them:

<ImageExamples
  examples={[
{
src: "/images/flux3-image/regen/art-1990s-editorial.webp",
alt: "A woman in a rust-brown two-piece sits on a green exercise ball in a beige studio.",
label: "1990s fashion editorial",
prompt: "A restrained 1990s fashion editorial photograph in a warm beige studio. An adult woman with tousled shoulder-length brown hair sits barefoot on a large muted-green exercise ball. She wears a fitted rust-brown sleeveless crop top and matching high-waisted briefs. Her hands rest together in her lap; one leg extends diagonally toward the camera and the other bends beside the ball. Full-body framing with generous plain wall above her, soft directional daylight, gentle floor shadows, warm skin tones, slightly muted color print and fine film grain. The ribbed green ball remains fully readable beneath her."
},
{
src: "/images/flux3-image/regen/art-surreal-interior.webp",
alt: "Two bison face each other inside a cobalt-blue room, seen through a tall archway.",
label: "Surreal interior",
prompt: "A surreal architectural photograph of exactly two large bison standing inside a cobalt-blue room, seen symmetrically through a tall rounded archway. The bison face each other with their heads lowered near the center, their shaggy brown fur and pale curved horns sharply resolved. Pale oak floorboards, exposed honey-colored ceiling beams, a round wooden pendant centered overhead and a tall white rectangular recess on the back wall. Soft natural illumination reveals fur, wood grain and the matte blue walls. The arch, lamp and wall recess align on the central vertical axis, with believable animal scale and clean architectural perspective."
},
{
src: "/images/flux3-image/regen/art-golden-silhouette.webp",
alt: "A silhouetted guitar player on a rocky rise against a low orange sun.",
label: "Golden-hour silhouette",
prompt: "A high-contrast golden-hour photograph of a lone person playing an acoustic guitar on a rocky rise. The person stands slightly right of center in a dark silhouette, with the guitar body and neck clearly separated from the torso and the neck angled upward to the right. The low orange sun sits just beside the person's head. A leafless tree frames the left edge; distant hills form quiet horizontal bands below a glowing amber sky. Jagged foreground rocks stay dark against the sunset. Portrait framing, natural backlighting and a warm saturated color print."
}
]}
/>

**Style fusion**: Combine two styles with a unifying palette. This example was generated with an earlier FLUX model.

<Card title="Style Fusion Example" horizontal img="https://cdn.sanity.io/images/gsvmb6gz/production/f11c404eed10d12b215b7a07e601bf41e7fcc4bb-1392x752.jpg">
  *"Ancient Greek marble statue precision and anatomical detail, infused with cyberpunk neon lighting, holographic overlays, and electric blue/magenta glow effects, set against dark futuristic environments"*
</Card>

**Style + mood annotations** (documented for FLUX.2 \[klein]): Add explicit tags at the end of your prompt for consistent aesthetics:

```
[Scene description]. Style: Country chic meets luxury lifestyle editorial.
Mood: Serene, romantic, grounded.
```

```
[Scene description]. Shot on 35mm film (Kodak Portra 400) with shallow
depth of field: subject razor-sharp, background softly blurred.
```

### Style from a reference image

When a style is hard to put into words, send an image of it. FLUX 3 Image takes up to 10 references in `images`; refer to them by position in the prompt. Here, image 1 is the subject and image 2 is the style:

<ImageExamples
  examples={[
{
src: "https://cdn.sanity.io/images/2gpum2i6/production/ababcf5c9cf86074d71c92d6362ff63545d90661-1800x1201.webp",
alt: "Image 1: a sandstone temple with three towers under a pale sky.",
label: "Image 1: the subject"
},
{
src: "https://cdn.sanity.io/images/2gpum2i6/production/dc642f5b01040c4afc46c1b4f8c4945152932683-1350x1800.webp",
alt: "Image 2: a watercolor illustration of a witch hanging a crescent moon on a line between bare trees, on speckled paper.",
label: "Image 2: the style"
},
{
src: "https://cdn.sanity.io/images/2gpum2i6/production/c1923cb51f693f1abee0c35fc41f9a0be6104e66-1248x832.webp",
alt: "FLUX 3 Image result: the temple under a dark, speckled night sky with a textured paper look.",
label: "FLUX 3 Image result"
}
]}
/>

<PromptDisplay prompt="Turn Image 1 in the Style of Image 2" />

The result keeps the temple's architecture and takes the speckled night sky and textured paper look from image 2. See [Multi reference](/flux_3/flux3_image_layout#multi-reference) for the request, and [Multi-Reference Editing](/guides/prompting_editing_multi_reference) for more style and material transfers.

## Lighting

Name the light source, direction, and quality. For example, "soft window light from the left" describes more than "good lighting".

**What to describe:**

* **Source**: natural, artificial, ambient
* **Quality**: soft, harsh, diffused, direct
* **Direction**: side, back, overhead, fill
* **Temperature**: warm, cool, golden, blue
* **Interaction**: catches, filters, reflects on surfaces

The FLUX 3 launch prompts name the source and say what the light does:

* "lit by harsh, direct camera flash that casts sharp shadows against the background"
* "A strong spotlight illuminates the center of the stage, casting long, soft shadows across the floor and highlighting the stiff tulle of the costumes"
* "Dappled natural sunlight filters through the trees, creating bright highlights against earthy brown and deep green shadows"
* "under flat, even studio-style lighting"

The lighting examples below were generated with an earlier FLUX model.

<AccordionGroup>
  <Accordion title="Portrait Lighting">
    **Rembrandt lighting** (45° key light): triangle of light on the face for dramatic portraits:

    *"Portrait with Rembrandt lighting, key light at 45 degrees, dramatic chiaroscuro effect"*

    **Split lighting** (90° side light): half-face illuminated for high contrast:

    *"Artistic portrait, split lighting, strong side illumination, dramatic contrast"*

    <Columns cols={2}>
      <Frame caption="Rembrandt lighting">
        <img src="https://cdn.sanity.io/images/gsvmb6gz/production/ae53f6422efdaf3f51e1e0bd928d7c3952e8a7de-1392x752.jpg" alt="Rembrandt lighting" />
      </Frame>

      <Frame caption="Split lighting">
        <img src="https://cdn.sanity.io/images/gsvmb6gz/production/284c21b1028f62e395461f7e7e3142f2c7823386-1392x752.png" alt="Split lighting" />
      </Frame>
    </Columns>
  </Accordion>

  <Accordion title="Environmental Light Quality">
    **Window light** = soft, even illumination

    **Golden hour** = warm and soft

    **Blue hour** = cool and moody

    **Overhead artificial** = harsh and dramatic

    <Columns cols={2}>
      <Frame caption="Window Light">
        <img src="https://cdn.sanity.io/images/gsvmb6gz/production/d95a5129f006cd34e184451a5e813be3f3237409-1392x752.jpg" alt="Window light" />
      </Frame>

      <Frame caption="Golden hour">
        <img src="https://cdn.sanity.io/images/gsvmb6gz/production/b9635dc280dfaaba1684083b0f8bbb145eeb3ebf-1392x752.jpg" alt="Golden hour" />
      </Frame>

      <Frame caption="Blue hour">
        <img src="https://cdn.sanity.io/images/gsvmb6gz/production/6fcccf61808d5cb23b8339a52ade9cd7adf435e3-1392x752.jpg" alt="Blue hour" />
      </Frame>

      <Frame caption="Overhead artificial light">
        <img src="https://cdn.sanity.io/images/gsvmb6gz/production/9487dd7f4c2ac8a16f5a4ce130ffa010fa57f7f2-1392x752.jpg" alt="Overhead artificial light" />
      </Frame>
    </Columns>
  </Accordion>

  <Accordion title="Cinematic Lighting">
    **Chiaroscuro**: high contrast light/shadow for drama:

    *"Film noir detective scene, single practical desk lamp, strong chiaroscuro lighting"*

    **Practical lighting**: visible light sources in scene for realism:

    *"Cyberpunk street scene, neon signs and LED strips providing atmospheric lighting"*

    <Columns cols={2}>
      <Frame caption="Chiaroscuro">
        <img src="https://cdn.sanity.io/images/gsvmb6gz/production/4ac0d069fa68429339f919d528e7c88e403184d6-1392x752.jpg" alt="Chiaroscuro" />
      </Frame>

      <Frame caption="Practical lighting">
        <img src="https://cdn.sanity.io/images/gsvmb6gz/production/ae31cf4f6cd3d434bddbf7d5659be68fd03c3d91-1392x752.jpg" alt="Practical lighting" />
      </Frame>
    </Columns>
  </Accordion>
</AccordionGroup>

## Exact colors with hex codes

A hex code names an exact color. In this FLUX 3 Image edit, the prompt picks out one bird and gives it a hex value. That bird turns pink and the rest of the flock stays black:

<ImageExamples
  examples={[
{
src: "https://cdn.sanity.io/images/2gpum2i6/production/4792198dfeba9223bf3ecf020fed2942de7f0bd7-1800x1200.webp",
alt: "Source image: a flock of black bird silhouettes on a pale sky.",
label: "Source"
},
{
src: "https://cdn.sanity.io/images/2gpum2i6/production/6995df5d4ab590ca0b4eec142c27a643582a5f01-1248x832.webp",
alt: "FLUX 3 Image edit: one bird at the center is now pink, every other bird is still black.",
label: "FLUX 3 Image edit"
},
{
src: "https://cdn.sanity.io/images/2gpum2i6/production/6995df5d4ab590ca0b4eec142c27a643582a5f01-1248x832.webp",
alt: "Close-up of the center of the edited image, showing the single pink bird among black ones.",
label: "Edited, center enlarged 4×",
zoom: 4,
focus: "51% 49%"
}
]}
/>

<PromptDisplay prompt="change the color of only one bird in the middle to #e01075" />

Tie each hex code to one named object ("only one bird in the middle"), so the model knows where the color goes.

## Text in Images

FLUX 3 renders text in images, from one word on a sign to multi-line poster typography and Japanese text. For each block of text, put three things in the prompt:

<Steps>
  <Step title="Quote the exact words">
    Put every string in quotation marks, with the capitalization and punctuation you want: `"東京"`, `"Cabin"`, `"LE FESTIVAL DU SOLEIL"`.
  </Step>

  <Step title="Say where it goes">
    Place each block in the frame: *"runs down the left side of the frame"*, *"At the bottom center, a line of bright text … sits directly above a smaller line of text"*.
  </Step>

  <Step title="Describe the type">
    Give weight, case, color, and character: *"Large, bold red kanji and katakana characters arranged vertically, featuring distressed, spray-paint-like edges"* or *"a clean, sans-serif black font"*.
  </Step>
</Steps>

For posters, packaging, and signage, give each text block its own box in a layout. To specify placement, quote the words in the box's `desc`, and cite the box in the caption where the text belongs. See [Describe each element](/guides/prompting_layout#describe-each-element).

### How the FLUX 3 examples specify text

These four launch-post images were each generated from a caption plus an element table, with one box per text block. The tables below quote the caption for placement and the box `desc` for the words and type. Open them in the [layout explorer](/flux_3/flux3_image_bounding_boxes#examples) to see every box.

<Tabs>
  <Tab title="Tokyo poster">
    <Frame caption="FLUX 3 Image, 2:3. Japanese and English text, generated with a layout.">
      <img src={"https://cdn.sanity.io/images/2gpum2i6/production/04cedf90362e61a3227028a045e8f1113c0168be-927x1400.webp"} alt="Flat anime-style poster: a horned woman with lavender hair on a yellow background, with large red Japanese text on the left and upper right, a red seal, and a small caption at the bottom." style={{ width: "100%", maxWidth: "420px", margin: "0 auto", display: "block" }} />
    </Frame>

    | Box | Placement (caption) | Words and type (`desc`) |
    | - | - | - |
    | `Ja_Text_1` | "runs down the left side of the frame" | "Large, bold red kanji and katakana characters arranged vertically, featuring distressed, spray-paint-like edges. The text reads `"ストリート\n悪魔"`." |
    | `Ja_Text_2` | "positioned in the upper right section" | "Large, bold red kanji characters arranged vertically … The text reads "東京"." |
    | `Ja_Text_3` | "In the lower right corner rests a square seal" | "A red square seal … resembling a traditional Japanese hanko stamp. The text reads "印"." |
    | `Ja_Text_4` | "At the bottom center, a line of bright text" | "The text "たうのさん" written horizontally in a vibrant yellow, clean, flat sans-serif font." |
    | `Unknown_Text_1` | "a smaller line of text", below `Ja_Text_4` | "A line of small, less legible white text written horizontally, reading "ORIGINAL ARTWORK"." |

    `\n` inside the quoted string marks a line break. "arranged vertically" sets the reading direction.
  </Tab>

  <Tab title="Title over a photo">
    <Frame caption="FLUX 3 Image, 3:4. A serif title in the sky of a photograph, generated with a layout.">
      <img src={"https://cdn.sanity.io/images/2gpum2i6/production/e0a80c721e2962973d76903f966160e06d7e5ed7-1050x1400.webp"} alt="Vertical photograph of a pale concrete dome glowing orange in a twilight bay, a crowd on the beach in front, and the title LE FESTIVAL DU SOLEIL in thin cream serif capitals at the top." style={{ width: "100%", maxWidth: "420px", margin: "0 auto", display: "block" }} />
    </Frame>

    | Box | Placement (caption) | Words and type (`desc`) |
    | - | - | - |
    | `Fr_Text_1` | "Centered at the top is a cream-colored title" | "`"LE FESTIVAL DU SOLEIL"` written in a thin, elegant, serif typeface in a light cream color" |

    One short row is enough when the title has a quiet part of the frame to itself. The box `[40, 200, 100, 800]` is a thin band across the sky, so the title sits above the mountains instead of over the dome.
  </Tab>

  <Tab title="Bilingual stamp panels">
    <Frame caption="FLUX 3 Image, 3:4. Five lines of English and Japanese text on two panels, generated with a layout.">
      <img src={"https://cdn.sanity.io/images/2gpum2i6/production/64091d4e438efef0fcc67d2e7f76592180f86837-1050x1400.webp"} alt="Two tall ukiyo-e postage-stamp panels on black, a waterfall scene on the left and a house above a river on the right, with white English and Japanese text at the top, middle, and bottom of the panels." style={{ width: "100%", maxWidth: "420px", margin: "0 auto", display: "block" }} />
    </Frame>

    | Box | Placement (caption) | Words and type (`desc`) |
    | - | - | - |
    | `En_Text_1`, `En_Text_2` | "White text overlays the left panel at the top … and bottom" | "White sans-serif typography … reading `"i could stay here with you\n愛してる"`, with the English text positioned above the Japanese characters." and "… reading "永遠 forever and ever"." |
    | `En_Text_3` to `En_Text_5` | "White text is overlaid on the right panel at the top …, middle …, and bottom" | "… reading `"Someday You’ll Find Me\nどこか"`", "… reading `"Somewhere Quiet\n静か"`", "… reading `"In the Peace & Tranquil\n平和"`" |

    Five text blocks, five boxes, each with its own quoted string and the same type description. The rows say which script sits on top, and the caption says which panel and which band each block belongs to. Use the same pattern for any long run of text.
  </Tab>

  <Tab title="Cabin, Sauna">
    <Frame caption="FLUX 3 Image, 3:2. Signage over a photograph, generated with a layout.">
      <img src={"https://cdn.sanity.io/images/2gpum2i6/production/d78185f6a0cc1639c2493b30d4779aefd03edb5d-1400x927.webp"} alt="A sunlit forest with a translucent rectangular overlay; two chartreuse squares hold arrow signs reading Cabin, pointing right, and Sauna, pointing left." />
    </Frame>

    | Box | Placement (caption) | Words and type (`desc`) |
    | - | - | - |
    | `En_Text_1` | "ending in a solid chartreuse square on the far right that contains a black directional sign" | "A thin, black, right-pointing arrow centered above the word "Cabin" in a clean, sans-serif black font." |
    | `En_Text_2` | "ending in a solid chartreuse square on the far left that holds another black directional sign" | "A thin, black, left-pointing arrow centered above the word "Sauna" in a clean, sans-serif black font." |

    Describe the graphics that belong to the text (here, the arrow and its direction) in the same box as the words.
  </Tab>
</Tabs>

### Short text in a plain prompt

A word or a short line does not need a layout. Quote it and say where it goes, for example `a paper poster on the wall that reads "OPEN LATE"`. These FLUX.2 examples use the same pattern:

<Tabs>
  <Tab title="Neon Sign">
    !['Open' neon sign](https://cdn.sanity.io/images/2gpum2i6/production/324a5024e679ee8a693821fc5bbdedb2c3fde129-1888x1056.png)

    <PromptDisplay prompt="A Entry of a Sushi Restaurant, The text 'OPEN' appears in red neon letters above the door" />
  </Tab>

  <Tab title="Product Advertisement">
    <Frame>
      <img src="https://cdn.sanity.io/images/2gpum2i6/production/7730d0482ee19d0d3207b5cbbb55074c3b66d554-1456x1920.png" alt="Phone advertisement" style={{ maxWidth:"420px",margin:"0 auto",display:"block" }} />
    </Frame>

    <PromptDisplay prompt="Samsung Galaxy S25 Ultra product advertisement, 'Ultra-strong titanium' headline, 'Shielded in a strong titanium frame, your Galaxy S25 Ultra always stays protected' subtext, close-up of phone edge showing titanium frame, dark gradient background, clean minimalist tech aesthetic, professional product photography" />
  </Tab>

  <Tab title="Retro Poster">
    <Frame>
      <img src="https://cdn.sanity.io/images/2gpum2i6/production/6d99bf4508c927ab16b67359b6ff70cdc992b279-1456x1920.png" alt="Groovy retro poster" style={{ maxWidth:"420px",margin:"0 auto",display:"block" }} />
    </Frame>

    <PromptDisplay prompt={'Groovy retro poster with the quote "If you love me let me sleep". Bold 70s typography in deep red and warm pink tones. Cream background and bold orange doodle around the text. Funky layout with playful shadow. Style: bold vintage aesthetic, dopamine decor'} />
  </Tab>

  <Tab title="Magazine Cover">
    <Frame>
      <img src="https://cdn.sanity.io/images/2gpum2i6/production/00ddd4ce8b582891f3b174462dc635dac4e45d46-1456x1920.jpg" alt="Magazine cover" style={{ maxWidth:"420px",margin:"0 auto",display:"block" }} />
    </Frame>

    <PromptDisplay prompt="Women's Health magazine cover, April 2025 issue, 'Spring forward' headline, woman in green outfit sitting on orange blocks, white sneakers, 'Covid: five years on' feature text, '15 skincare habits' callout, professional editorial photography, magazine layout with multiple text elements" />
  </Tab>
</Tabs>

### Text Rendering Tips

* **Use quotation marks** around exact text you want rendered, with the case and punctuation you want
* **Mark line breaks and direction**: `\n` inside the quoted text, "arranged vertically", "arranged in two centered lines"
* **Describe the type**: weight, case, color, and texture. A font name works as a comparison: "a bold, white sans-serif typeface reminiscent of Helvetica or Inter"
* **Describe color and effects**: "red neon letters", "gold serif lettering", "chalk on blackboard"
* **Specify font character**: serif = traditional/formal, sans-serif = modern, script = elegant, display = bold/impactful
* **Give each text block its own box** when placement matters: see [Describe each element](/guides/prompting_layout#describe-each-element)
* **Split long text into blocks**: one box per line or row, as in the stamp panels
* **Proofread every quoted string** in the output before you publish it, especially small print and long lines

### Typography Styles Reference

| Style | Effect | Example |
| - | - | - |
| **3D text** | Dimensional, impactful | “raised chrome letters with realistic metal reflections” |
| **Neon effects** | Atmospheric, glowing | “glowing neon text with electric blue light” |
| **Vintage signs** | Authentic, weathered | “weathered painted text with chipped paint and rust” |
| **Environmental** | Integrated into scene | “carved directly into the ancient stone wall” |
| **Object-based** | Printed on props | “printed on a newspaper being read by the character” |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.