Skip to content

component

A C4 component diagram (level 3): the components inside a container and what they depend on, placed in a named grid.

This page lists everything a component diagram may contain. The same grammar is available as data with dgr grammar component --json, and the overview explains how lines, texts and attributes are written and lists the codes every kind shares.

diagram component "Title" [subtitle=<text>] [label=<text>] [look=<plain|cards|blocks|paper|columns>] [decisions=<right|below|auto>] [layout=<adaptive>] [locale=<en|de>]

Every component diagram starts with this line.

PartKindValueMeaning
subtitle=attributea text in double quotes like "Order service"Second line below the title.
label=attributea text in double quotes like "Order service"Name before the title instead of the kind; an empty label="" leaves only the title.
look=attributeone of plain, cards, blocks, paper, columnsplain (default) boxes with a legend, cards toned icon cards, blocks filled blocks as in pattern books, paper a quiet print look: Inter on paper, zones as areas, the core in yellow, decisions in the margin, columns a technical sheet: columns in bands under grey heads, names in the top edge of square boxes, the focus flow heavy.
decisions=attributeone of right, below, autoWhere a look that writes decisions as notes sets them: right (default) in a column beside the picture, below side by side under it, auto below once the picture is wider than 1,100 pixels, as a printed page needs.
layout=attributeone of adaptiveColumns grow to their content and edges find their own way around obstacles; without it the grid is fixed.
locale=attributeone of en, deLanguage of the texts Diagrist adds to the picture and of the description: en (default) or de.

Example:

diagram component "Title"

Each statement is one line that starts with its keyword. Statements inside blocks are indented below them. Like every kind, component also has use, variant, set and drop, described in the overview.

StatementWhereWhat it does
gridtop levelThe named columns from left to right, or the rows from top to bottom.
layertop levelNames a row in a box right of the picture, joined by one bracket for all layers; needs layout=adaptive.
grouptop levelA frame around elements by responsibility; it grows from its members.
styletop levelNamed values for elements, and a tone for edges, so sizes and colours stand in one place.
persontop levelA person who uses the system, drawn as a stick figure with name and role below it.
containertop levelA container: an application or data store that runs on its own, such as a service or a database.
componenttop levelA component inside a container, such as a module or an adapter.
nodetop levelA neutral element for any level, such as a queue, a job or a layer of a pattern.
edgetop levelAn edge outside of flows, without number.
flowtop levelA numbered path: its steps are indented below it.
notetop levelA dashed note above an element, with a tip pointing at it.
adrtop levelAn architecture decision in the bar below the picture: question, the chosen option after =, and the consequence after =>.
grid <axis> <names>

The named columns from left to right, or the rows from top to bottom. Names with the same prefix before a dot stand close, such as api.1,api.2.

Written at the top level.

PartKindValueMeaning
<axis>argumentone of cols, rowscols for the columns, rows for the rows.
<names>argumentnames separated by commas without spaces, like user,api.1,api.2The names in order, separated by commas without spaces.

Examples:

grid cols user,backend.1,backend.2,edge
grid rows top,main,data
layer <row> <label>

Names a row in a box right of the picture, joined by one bracket for all layers; needs layout=adaptive.

Written at the top level.

PartKindValueMeaning
<row>argumenta column or row name like api or backend.1The row it names.
<label>argumenta text in double quotes like "Order service"Name of the layer.

Example:

layer business "Business logic"
group <id> <title> [in <ref>] [team=<text>] [heading=<top|side>] [tag=<text>] [cover=<grid-name>] [tone=<choice>] [own] [shared] [external]

A frame around elements by responsibility; it grows from its members. Exactly one of own, shared, external. in nests it into another group; an empty title draws only the frame.

Written at the top level.

PartKindValueMeaning
<id>argumentan identifier like api (letters, digits, _ and -, starting with a letter)Id that in of elements and groups and the ends of edges use.
<title>argumenta text in double quotes like "Order service"Title in the head of the frame.
in <ref>clausethe id of a group declared in this diagramThe group whose frame holds this one.
team=attributea text in double quotes like "Order service"Who is responsible; second line of the head, else the role in words.
heading=attributeone of top, sidetop (default) or side: title left in the middle, as for layer bands.
tag=attributea text in double quotes like "Order service"A tag right in the frame, such as "CLOSED" for a closed layer.
cover=attributea column or row name like api or backend.1A column the frame also covers, at the height of its members; needs layout=adaptive.
tone=attributeone of blue, indigo, purple, maroon, green, teal, slate, red, orange, peach, skyFills the frame lightly in this tone; in look=blocks the colour of its area.
ownflagOur own system: a solid frame on a light area.
sharedflagShared infrastructure: its elements are drawn muted.
externalflagSomeone else’s system: a dashed frame.

Examples:

group backend "Backend" own team="Kotlin · Team Ausleihe"
group api "API" own in backend
style <id> [icon=<choice>] [shape=<db|queue|store|job|app>] [width=<integer>] [height=<integer>] [tone=<choice>] [form=<card|circle|text>]

Named values for elements, and a tone for edges, so sizes and colours stand in one place. style=name applies them where the element or edge sets none.

Written at the top level.

PartKindValueMeaning
<id>argumentan identifier like api (letters, digits, _ and -, starting with a letter)Name that style= refers to.
icon=attributeone of apachekafka, archive, boxes, brick-wall, building-2, chart-line, cloud, container, copy, cpu, database, earth, file-cog, file-text, files, flame, folder, gauge, globe, hard-drive, hexagon, key-round, keycloak, kubernetes, layers, layout-dashboard, lock, map-pin, minio, monitor, network, package, postgresql, puzzle, receipt, route, router, server, server-cog, settings, shield, shield-check, smartphone, split, springboot, terminal, user-cog, user-round, users, vuedotjs, warehouse, waypoints, workflowPictogram before the name: the technology or the role of the element.
shape=attributeone of db, queue, store, job, appForm of the box: db cylinder, queue tube, store folded sheet, job, app.
width=attributea whole number from 48 to 960Width of the box in pixels; needs layout=adaptive.
height=attributea whole number from 24 to 480Height of the box in pixels; needs layout=adaptive.
tone=attributeone of blue, indigo, purple, maroon, green, teal, slate, red, orange, peach, skyColour of the icon circle in look=cards and of the block in look=blocks.
form=attributeone of card, circle, textcard or circle in look=cards; text draws only the name in look=blocks.

Examples:

style component height=80
style store shape=db height=96
person <id> <label> [at <place>] [in <ref>] [tech=<text>] [icon=<choice>] [shape=<db|queue|store|job|app>] [width=<integer>] [height=<integer>] [tone=<choice>] [form=<card|circle|text>] [status=<planned|deprecated>] [replicas=<integer>] [span=<span>] [slot=<slot>] [style=<ref>] [mark=<ref>] [emph]

A person who uses the system, drawn as a stick figure with name and role below it. at places it in the grid, in puts it into a group. emph marks a core decision with a thick border.

Written at the top level.

PartKindValueMeaning
<id>argumentan identifier like api (letters, digits, _ and -, starting with a letter)Id that edges, flows, notes and in use for this element.
<label>argumenta text in double quotes like "Order service"Name in the picture.
at <place>clausea place column/row like backend.1/mainPlace in the grid as column/row. Required.
in <ref>clausethe id of a group declared in this diagramThe group whose frame holds the element.
tech=attributea text in double quotes like "Order service"Second line: technology or role, such as "PostgreSQL".
icon=attributeone of apachekafka, archive, boxes, brick-wall, building-2, chart-line, cloud, container, copy, cpu, database, earth, file-cog, file-text, files, flame, folder, gauge, globe, hard-drive, hexagon, key-round, keycloak, kubernetes, layers, layout-dashboard, lock, map-pin, minio, monitor, network, package, postgresql, puzzle, receipt, route, router, server, server-cog, settings, shield, shield-check, smartphone, split, springboot, terminal, user-cog, user-round, users, vuedotjs, warehouse, waypoints, workflowPictogram before the name: the technology or the role of the element.
shape=attributeone of db, queue, store, job, appForm of the box: db cylinder, queue tube, store folded sheet, job, app.
width=attributea whole number from 48 to 960Width of the box in pixels; needs layout=adaptive.
height=attributea whole number from 24 to 480Height of the box in pixels; needs layout=adaptive.
tone=attributeone of blue, indigo, purple, maroon, green, teal, slate, red, orange, peach, skyColour of the icon circle in look=cards and of the block in look=blocks.
form=attributeone of card, circle, textcard or circle in look=cards; text draws only the name in look=blocks.
status=attributeone of planned, deprecatedplanned draws the box dashed, deprecated grey; both name it beside tech.
replicas=attributea whole number from 2 to 99Number of instances from 2, shown as x3 in the corner.
span=attributethe last column like mobile, or column/row like edge/dataLast column, or column/row, of the area the element covers; needs layout=adaptive.
slot=attributei/n with 1 ≤ i ≤ n ≤ 64, like 2/3Takes place i of n equal places in its area, like 2/3; needs layout=adaptive.
style=attributethe id of a style declared in this diagramA style whose values apply where the element sets none.
mark=attributethe id of an adr declared in this diagramId of a decision of the bar below, such as E1; the mark stands at the corner.
emphflagDraws the border thick: the core decision of the picture.

Example:

person customer "Customer" tech="account holder" at user/main
container <id> <label> [at <place>] [in <ref>] [tech=<text>] [icon=<choice>] [shape=<db|queue|store|job|app>] [width=<integer>] [height=<integer>] [tone=<choice>] [form=<card|circle|text>] [status=<planned|deprecated>] [replicas=<integer>] [span=<span>] [slot=<slot>] [style=<ref>] [mark=<ref>] [emph]

A container: an application or data store that runs on its own, such as a service or a database. at places it in the grid, in puts it into a group. emph marks a core decision with a thick border.

Written at the top level.

PartKindValueMeaning
<id>argumentan identifier like api (letters, digits, _ and -, starting with a letter)Id that edges, flows, notes and in use for this element.
<label>argumenta text in double quotes like "Order service"Name in the picture.
at <place>clausea place column/row like backend.1/mainPlace in the grid as column/row. Required.
in <ref>clausethe id of a group declared in this diagramThe group whose frame holds the element.
tech=attributea text in double quotes like "Order service"Second line: technology or role, such as "PostgreSQL".
icon=attributeone of apachekafka, archive, boxes, brick-wall, building-2, chart-line, cloud, container, copy, cpu, database, earth, file-cog, file-text, files, flame, folder, gauge, globe, hard-drive, hexagon, key-round, keycloak, kubernetes, layers, layout-dashboard, lock, map-pin, minio, monitor, network, package, postgresql, puzzle, receipt, route, router, server, server-cog, settings, shield, shield-check, smartphone, split, springboot, terminal, user-cog, user-round, users, vuedotjs, warehouse, waypoints, workflowPictogram before the name: the technology or the role of the element.
shape=attributeone of db, queue, store, job, appForm of the box: db cylinder, queue tube, store folded sheet, job, app.
width=attributea whole number from 48 to 960Width of the box in pixels; needs layout=adaptive.
height=attributea whole number from 24 to 480Height of the box in pixels; needs layout=adaptive.
tone=attributeone of blue, indigo, purple, maroon, green, teal, slate, red, orange, peach, skyColour of the icon circle in look=cards and of the block in look=blocks.
form=attributeone of card, circle, textcard or circle in look=cards; text draws only the name in look=blocks.
status=attributeone of planned, deprecatedplanned draws the box dashed, deprecated grey; both name it beside tech.
replicas=attributea whole number from 2 to 99Number of instances from 2, shown as x3 in the corner.
span=attributethe last column like mobile, or column/row like edge/dataLast column, or column/row, of the area the element covers; needs layout=adaptive.
slot=attributei/n with 1 ≤ i ≤ n ≤ 64, like 2/3Takes place i of n equal places in its area, like 2/3; needs layout=adaptive.
style=attributethe id of a style declared in this diagramA style whose values apply where the element sets none.
mark=attributethe id of an adr declared in this diagramId of a decision of the bar below, such as E1; the mark stands at the corner.
emphflagDraws the border thick: the core decision of the picture.

Example:

container db "Database" tech="PostgreSQL" icon=postgresql at infra/data in infra
component <id> <label> [at <place>] [in <ref>] [tech=<text>] [icon=<choice>] [shape=<db|queue|store|job|app>] [width=<integer>] [height=<integer>] [tone=<choice>] [form=<card|circle|text>] [status=<planned|deprecated>] [replicas=<integer>] [span=<span>] [slot=<slot>] [style=<ref>] [mark=<ref>] [emph]

A component inside a container, such as a module or an adapter. at places it in the grid, in puts it into a group. emph marks a core decision with a thick border.

Written at the top level.

PartKindValueMeaning
<id>argumentan identifier like api (letters, digits, _ and -, starting with a letter)Id that edges, flows, notes and in use for this element.
<label>argumenta text in double quotes like "Order service"Name in the picture.
at <place>clausea place column/row like backend.1/mainPlace in the grid as column/row. Required.
in <ref>clausethe id of a group declared in this diagramThe group whose frame holds the element.
tech=attributea text in double quotes like "Order service"Second line: technology or role, such as "PostgreSQL".
icon=attributeone of apachekafka, archive, boxes, brick-wall, building-2, chart-line, cloud, container, copy, cpu, database, earth, file-cog, file-text, files, flame, folder, gauge, globe, hard-drive, hexagon, key-round, keycloak, kubernetes, layers, layout-dashboard, lock, map-pin, minio, monitor, network, package, postgresql, puzzle, receipt, route, router, server, server-cog, settings, shield, shield-check, smartphone, split, springboot, terminal, user-cog, user-round, users, vuedotjs, warehouse, waypoints, workflowPictogram before the name: the technology or the role of the element.
shape=attributeone of db, queue, store, job, appForm of the box: db cylinder, queue tube, store folded sheet, job, app.
width=attributea whole number from 48 to 960Width of the box in pixels; needs layout=adaptive.
height=attributea whole number from 24 to 480Height of the box in pixels; needs layout=adaptive.
tone=attributeone of blue, indigo, purple, maroon, green, teal, slate, red, orange, peach, skyColour of the icon circle in look=cards and of the block in look=blocks.
form=attributeone of card, circle, textcard or circle in look=cards; text draws only the name in look=blocks.
status=attributeone of planned, deprecatedplanned draws the box dashed, deprecated grey; both name it beside tech.
replicas=attributea whole number from 2 to 99Number of instances from 2, shown as x3 in the corner.
span=attributethe last column like mobile, or column/row like edge/dataLast column, or column/row, of the area the element covers; needs layout=adaptive.
slot=attributei/n with 1 ≤ i ≤ n ≤ 64, like 2/3Takes place i of n equal places in its area, like 2/3; needs layout=adaptive.
style=attributethe id of a style declared in this diagramA style whose values apply where the element sets none.
mark=attributethe id of an adr declared in this diagramId of a decision of the bar below, such as E1; the mark stands at the corner.
emphflagDraws the border thick: the core decision of the picture.

Example:

component api "REST API" tech="Spring Boot" icon=springboot at backend.2/main in backend
node <id> <label> [at <place>] [in <ref>] [tech=<text>] [icon=<choice>] [shape=<db|queue|store|job|app>] [width=<integer>] [height=<integer>] [tone=<choice>] [form=<card|circle|text>] [status=<planned|deprecated>] [replicas=<integer>] [span=<span>] [slot=<slot>] [style=<ref>] [mark=<ref>] [emph]

A neutral element for any level, such as a queue, a job or a layer of a pattern. at places it in the grid, in puts it into a group. emph marks a core decision with a thick border.

Written at the top level.

PartKindValueMeaning
<id>argumentan identifier like api (letters, digits, _ and -, starting with a letter)Id that edges, flows, notes and in use for this element.
<label>argumenta text in double quotes like "Order service"Name in the picture.
at <place>clausea place column/row like backend.1/mainPlace in the grid as column/row. Required.
in <ref>clausethe id of a group declared in this diagramThe group whose frame holds the element.
tech=attributea text in double quotes like "Order service"Second line: technology or role, such as "PostgreSQL".
icon=attributeone of apachekafka, archive, boxes, brick-wall, building-2, chart-line, cloud, container, copy, cpu, database, earth, file-cog, file-text, files, flame, folder, gauge, globe, hard-drive, hexagon, key-round, keycloak, kubernetes, layers, layout-dashboard, lock, map-pin, minio, monitor, network, package, postgresql, puzzle, receipt, route, router, server, server-cog, settings, shield, shield-check, smartphone, split, springboot, terminal, user-cog, user-round, users, vuedotjs, warehouse, waypoints, workflowPictogram before the name: the technology or the role of the element.
shape=attributeone of db, queue, store, job, appForm of the box: db cylinder, queue tube, store folded sheet, job, app.
width=attributea whole number from 48 to 960Width of the box in pixels; needs layout=adaptive.
height=attributea whole number from 24 to 480Height of the box in pixels; needs layout=adaptive.
tone=attributeone of blue, indigo, purple, maroon, green, teal, slate, red, orange, peach, skyColour of the icon circle in look=cards and of the block in look=blocks.
form=attributeone of card, circle, textcard or circle in look=cards; text draws only the name in look=blocks.
status=attributeone of planned, deprecatedplanned draws the box dashed, deprecated grey; both name it beside tech.
replicas=attributea whole number from 2 to 99Number of instances from 2, shown as x3 in the corner.
span=attributethe last column like mobile, or column/row like edge/dataLast column, or column/row, of the area the element covers; needs layout=adaptive.
slot=attributei/n with 1 ≤ i ≤ n ≤ 64, like 2/3Takes place i of n equal places in its area, like 2/3; needs layout=adaptive.
style=attributethe id of a style declared in this diagramA style whose values apply where the element sets none.
mark=attributethe id of an adr declared in this diagramId of a decision of the bar below, such as E1; the mark stands at the corner.
emphflagDraws the border thick: the core decision of the picture.

Example:

node orders "Orders" tech="business logic" replicas=3 at web/business in cloud
edge <from> <arrow> <to> [label] [via=<text>] [schedule=<text>] [volume=<text>] [sla=<text>] [mark=<ref>] [bundle=<word>] [lane=<grid-name>] [tone=<choice>] [style=<ref>]

An edge outside of flows, without number. Its ends may be groups too.

Written at the top level.

PartKindValueMeaning
<from>argumentthe id of a person, container, component, node or group declared in this diagramWhere it starts: an element or a group.
<arrow>argumentone of the arrows -> synchronous call (filled head), ~> asynchronous message or event (dashed, open head), --> dependency (dashed, open head), => data flow (thick line, filled head), -- connection without direction (no head), <-> call in both directions (a head at each end)The kind of edge, which also decides how it is drawn.
<to>argumentthe id of a person, container, component, node or group declared in this diagramWhere it ends: an element or a group.
[label]optional argumenta text in double quotes like "Order service"What happens, such as "reads documents"; first line of the label.
via=attributea text in double quotes like "Order service"Protocol or transport, such as HTTPS; second line of the label.
schedule=attributea text in double quotes like "Order service"When it runs, such as "nightly 02:00"; joins the second line.
volume=attributea text in double quotes like "Order service"How much, such as "10k/day"; joins the second line.
sla=attributea text in double quotes like "Order service"What is promised, such as "< 200 ms"; joins the second line.
mark=attributethe id of an adr declared in this diagramId of a decision of the bar below, such as E1; the mark stands near the end.
bundle=attributea single word without quotesEdges with the same bundle and a shared end share one trunk; needs layout=adaptive.
lane=attributea column or row name like api or backend.1Column a vertical edge runs in, reaching into frames at its ends; needs layout=adaptive.
tone=attributeone of blue, indigo, purple, maroon, green, teal, slate, red, orange, peach, skyColour of line and heads, such as red for a highlighted way.
style=attributethe id of a style declared in this diagramA style whose tone applies when the edge sets none.

The values of arrow and what they mean:

ValueMeaning
->synchronous call (filled head)
~>asynchronous message or event (dashed, open head)
-->dependency (dashed, open head)
=>data flow (thick line, filled head)
--connection without direction (no head)
<->call in both directions (a head at each end)

Examples:

edge abgleich => db "check inventory" schedule="daily 03:00"
edge web -> gateway via=HTTPS
flow <id> [primary] [accent]

A numbered path: its steps are indented below it. Numbers run on across all flows in source order.

Written at the top level.

PartKindValueMeaning
<id>argumentan identifier like api (letters, digits, _ and -, starting with a letter)Name of the flow, shown in the legend.
primaryflagDraws the steps in the line colour (default).
accentflagDraws the steps, their labels and numbers in the accent colour.

Example:

flow import primary

Indented lines that start without one of these keywords have this form:

<from> <arrow> <to> [label] [via=<text>] [schedule=<text>] [volume=<text>] [sla=<text>] [mark=<ref>] [bundle=<word>] [lane=<grid-name>] [tone=<choice>] [style=<ref>]

A step of the flow: an edge without keyword, numbered after the steps before it, across all flows.

PartKindValueMeaning
<from>argumentthe id of a person, container, component, node or group declared in this diagramWhere it starts: an element or a group.
<arrow>argumentone of the arrows -> synchronous call (filled head), ~> asynchronous message or event (dashed, open head), --> dependency (dashed, open head), => data flow (thick line, filled head), -- connection without direction (no head), <-> call in both directions (a head at each end)The kind of edge, which also decides how it is drawn.
<to>argumentthe id of a person, container, component, node or group declared in this diagramWhere it ends: an element or a group.
[label]optional argumenta text in double quotes like "Order service"What happens, such as "reads documents"; first line of the label.
via=attributea text in double quotes like "Order service"Protocol or transport, such as HTTPS; second line of the label.
schedule=attributea text in double quotes like "Order service"When it runs, such as "nightly 02:00"; joins the second line.
volume=attributea text in double quotes like "Order service"How much, such as "10k/day"; joins the second line.
sla=attributea text in double quotes like "Order service"What is promised, such as "< 200 ms"; joins the second line.
mark=attributethe id of an adr declared in this diagramId of a decision of the bar below, such as E1; the mark stands near the end.
bundle=attributea single word without quotesEdges with the same bundle and a shared end share one trunk; needs layout=adaptive.
lane=attributea column or row name like api or backend.1Column a vertical edge runs in, reaching into frames at its ends; needs layout=adaptive.
tone=attributeone of blue, indigo, purple, maroon, green, teal, slate, red, orange, peach, skyColour of line and heads, such as red for a highlighted way.
style=attributethe id of a style declared in this diagramA style whose tone applies when the edge sets none.

The values of arrow and what they mean:

ValueMeaning
->synchronous call (filled head)
~>asynchronous message or event (dashed, open head)
-->dependency (dashed, open head)
=>data flow (thick line, filled head)
--connection without direction (no head)
<->call in both directions (a head at each end)

Examples:

kafka ~> importer "consume event"
storage -> bucket "read object" via="S3 HEAD"
note <text> [on <ref>]

A dashed note above an element, with a tip pointing at it. It is no element and no edge.

Written at the top level.

PartKindValueMeaning
<text>argumenta text in double quotes like "Order service"What the note says.
on <ref>clausethe id of a person, container, component or node declared in this diagramThe element it points at. Required.

Example:

note "replaced in Q3" on portal
adr <id> <question> <equals> <choice> [then] [consequence] [open=<text>]

An architecture decision in the bar below the picture: question, the chosen option after =, and the consequence after =>. mark= with its id puts the mark into the picture.

Written at the top level.

PartKindValueMeaning
<id>argumentan identifier like api (letters, digits, _ and -, starting with a letter)Id of the decision, such as E1; mark=E1 refers to it.
<question>argumenta text in double quotes like "Order service"The question that was decided.
<equals>argumentone of the arrows =Separates the question from the choice.
<choice>argumenta text in double quotes like "Order service"The chosen option.
[then]optional argumentone of the arrows =>Introduces the consequence.
[consequence]optional argumenta text in double quotes like "Order service"What follows from the choice.
open=attributea text in double quotes like "Order service"Who still decides an open question; the card is drawn dashed.

Example:

adr E1 "How do the services coordinate?" = "Events over Kafka" => "No central coordinator"

Besides the codes of the language and the kernel, listed in the overview, the rules of component report these. An error stops the build; a warning is printed and the picture is still drawn.

CodeSeverityWhat it checks
A001errorA note names the element it points at with on.
A007errorA group has exactly one role: own, shared or external. The role draws its frame and mutes shared elements.
A008errorEvery element has a place in the grid with at column/row.
A103errorColumn and row of at are names of the grid.
A105errorAn edge connects two different elements or groups.
A106errorEvery column and every row is named once.
A107errorAn edge does not lead from an element to the group that holds it, or back.
A109errorAreas (span, slot, width, height), bundles and layers need layout=adaptive; areas reach right and down within the grid; cover names a column; groups nest without a cycle; a bundle shares an end and a kind; a row has one layer.
A710warningAn edge says what happens: a label or a protocol (via=).
A801warningA decision of the bar has a mark in the picture, on an element or a step (mark=).