Object › Graph › Column… was a menu stub, so a graph's columns and bars
were always plain rectangles. The reference app fills them with a graph
design, vertically scaled, uniformly scaled, repeated with a value for
each copy, or stretched at a guide line.
graph.column (Column…) draws the columns, bars or stacked segments and
the legend swatch of the series picked with Group Selection with a
design saved by Object › Graph › Design. Vertically Scaled stretches the
design to each column's length at the column's width. Uniformly Scaled
scales it both ways to that length and centers it on the column.
Repeating stacks a copy for each Each Design Represents value out from
the zero line, and For Fractions chops the last copy at the value or
scales it down. Sliding keeps the part above the design's horizontal
guide line in proportion and stretches the part below. The design and
its options are saved with the graph, and the graph follows the design
when it is renamed or deleted. Columns drawn with a design cast no drop
shadow.
A marker or legend design made of one path is now drawn in a group of
its own. Painting a series with Group Selection then leaves the design's
paint alone, as it already did for designs of several objects.
Docs: docs/mcp.md, docs/target-app-parity.md.
Found while testing crates/doc/src/graph.rs:429 (GraphSpec::to_csv) and crates/engine/src/cmd/graph.rs:85 (parse_csv)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
VariableKind::Graph binds a graph root; dataset rows supply CSV as graph.setData.
Make Graph Dynamic, Variables dialog, capture/apply, and pt-br for the new strings.
Co-authored-by: Cursor <cursoragent@cursor.com>
Rarely set fields move into one optional boxed NodeExtras, and large NodeKind payloads (images,
live shapes, blends, envelopes) are boxed. Every object, and every undo step that copies it,
shrinks: a 50k-path move keeps ~24.5 MB per step instead of ~40 MB. Files stay byte-identical
(Node keeps its flat JSON through a borrowed Serialize and a from-wire Deserialize, no flatten),
and loading is slightly faster. Undo and redo reuse their step's size estimate instead of
walking the document again (8.3 -> 5.6 ms for a 50k-path move).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmMmc1J8XeNLxhRihWv9cc
# Conflicts:
# crates/engine/src/cmd/graph.rs
# crates/svg/src/export.rs
Text formatted in a graph, as
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/format-the-text-in-graphs.html
describes (the whole graph with the Selection tool, or labels picked
with Group Selection, through the Character and Appearance controls),
now survives the graph being drawn again from its data.
- A graph keeps a character style per kind of label: value axis
numbers, category labels (category axis, radar spokes, pie names)
and legend labels (beside or across the top, or in wedges).
- text.setStyle, text.setFormat and fill/stroke changes on a graph's
labels apply the same change to their kind's kept style, so only what
the user changed is kept and every label of that kind follows. A
change to part of a label's text isn't kept.
- Labels are told apart by where the graph draws them, not by their
text, so a category named "2" and the value axis' 2 stay apart.
- Label spacing follows a kept size (legend rows, offsets from the axes
and wedges), so bigger labels don't overlap; at 9 pt it's as before.
Wedge labels stay white on dark wedges unless given a colour.
- A kept style from a file is held to the Character controls' limits.
Own choice, as the page doesn't say what happens on a data change:
formatting one label formats its whole kind, since the labels are drawn
again from the data. Other ways of restyling text (eyedropper,
character styles, Find Font) aren't kept yet. New fields are written
only when set; graphs without kept formatting draw the same art as
before.
Graph Type's column, bar and cluster widths from 1% to 1000%, overlapping
past 100%, the overlap order, and Draw Filled Lines, as
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/format-columns-bars-and-lines.html
describes.
- Column and cluster widths take 1–1000% and are drawn as set: past
100% columns (or clusters) overlap. The legend moves past columns
that reach beyond the plot.
- firstColumnInFront draws the first series over the others (in each
layer); firstRowInFront draws each series' first category over the
next. Across series the series order decides, so each series stays
one group for Group Selection.
- filledLines draws the connecting lines of line, scatter and radar
graphs as 3 pt bands filled with the series colour (set as a fill or,
on a thin line, a stroke) with a thin black outline. A run with no
outline to make, or a graph past 20,000 data points, keeps thin lines.
- The Graph Type query lists the overlap options only for graphs with
columns or bars, and filled lines only for graphs with lines.
Own choices, as the page doesn't say: both overlap options start off
(today's order), and the band is 3 pt wide. New fields are written only
when set. Graphs with default options draw the same art as before.
Graph Type's Add Drop Shadow, as
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/add-drop-shadows.html
describes, and Add Legend Across Top, as
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/change-the-position-of-legends.html
describes.
- dropShadow: a shadow behind each column, bar, stacked segment, line
(line, scatter and radar) and pie wedge, just behind the series of
its layer, so areas and columns drawn in front don't hide the shadows
of the layer behind them.
- legendAcrossTop: the legend's swatches and labels left to right from
the plot's left edge, wrapping at the plot's width, the last row just
above the plot and anything drawn over it (radar and stacked-pie
labels).
Own choices, as the pages don't say: a shadow is a black copy 2 pt down
and right at 35% opacity; markers, areas and legend swatches cast none,
nor do stacked segments of 0; a graph with more than 200,000 shadowed
marks draws none.
New fields are written only when set. Graphs with default options draw
the same art as before.
Graph Data's Transpose row/column and Switch x/y, as
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/add-graph-data.html
describes, a `|` in a label as a line break, as
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/add-graph-labels-and-data-sets.html
describes, and the pie graph options of
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/format-pie-graphs.html
- graph.setData {transpose: true} swaps rows and columns (after any new
data in the same call); a graph with more categories than a graph can
have series (256) is refused rather than cut. {switchXY: true} swaps
each scatter series' y and x columns, labels included.
- A `|` in a category or series label starts a new line: legend rows
grow with their lines, labels beside an axis or in a wedge centre
theirs. A label of only `|` is blank.
- Pie graphs: pieLegend none|standard|wedges (Legends in Wedges puts the
series labels inside their wedges, in white on dark wedges, drawn over
the pies), piePosition ratio|even|stacked and pieSort all|first|none,
as dropdowns in the Graph Type dialog, which lists them for pie graphs
only.
Own choices, as the page doesn't say: Position and Sort keep today's
drawing by default (Even, None); Ratio sizes pies by area, the biggest
keeping the full size; Stacked pies share a centre, each drawn as the
ring outside the next smaller one so none covers another, with their
names over them.
New fields are written only when set. Graphs with default options draw
the same art as before.
Graph designs are named art a graph draws in place of its default
marks. Marker designs follow
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/apply-marker-designs-to-graphs.html
and the Graph Design dialog
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/reuse-graph-designs.html
- graph.design saves the selected art as a named design (Save Design),
pastes a copy of a design into the document, selected, to edit and
save again (Paste Design), and deletes one; graphs drawing a deleted
design go back to their default marks.
- graph.marker draws the data points and legend swatches of the series
picked with Group Selection (or listed, or every series) with a
design: its backmost object is scaled to fill the default marker's
square, strokes, effects and pattern tiles scaling with it. Line,
scatter and radar series; null goes back to the default square.
- Object › Graph › Design… and Marker… open dialogs listing the
document's designs.
Own choices, as the pages don't say: the backmost object's bounds, not
only a rectangle's, set the size (a single object uses its own bounds);
Delete Design manages the list; a design keeps its own paint, so
painting a series doesn't recolour it.
Designs are stored in a new `graphDesigns` list and series designs in
`seriesMarkers`, written only when present. A graph saved as a design is
kept as the plain art it draws. A design holds at most 2,000 objects, a
document 1,000 designs, and a graph whose designs would draw more than
200,000 objects draws default squares; a file's designs are tidied the
same way on open. Global swatch edits, image relinking and placed
documents see design art like symbol art. Graphs without marker designs
draw the same art as before.
Each axis now takes its own tick marks, and the value axes a prefix and
suffix for their numbers:
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/change-graph-value-axes.html
- Value axes (the left one, or a bar graph's bottom one, and the right
one): tick marks of no, short or full length, and a count per
division; labels stay at the divisions.
- Category axis: the same, at the labels or, with Draw Tick Marks
Between Labels, between them (halfway between labels when they sit
at the plot's edges).
- Add Labels: prefix and suffix per value axis ($, %).
- The Graph Type dialog offers the lengths and value axis sides as
choices, and counts it sends back as floats are read.
Own choices, as the page doesn't say: the lengths are none, short (the
4 pt ticks as before) and full (across the plot); category axes start
with no tick marks, as they had none before. Counts are capped at 20
per division and 10,000 category tick marks, affixes at one line of 64
characters. A full-length tick on the zero line or an axis line is left
out.
The legend moves past a bar graph's last value label when a suffix
runs it into the legend's gap. New fields are written only when set;
graphs with the default options draw the same art as before.
The value axis can now go on the left side (as before), the right side
or both sides of column, stacked column, line, area and scatter graphs:
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/change-graph-value-axes.html
With the axis on both sides, Separate Scales gives the series assigned
to the right axis a scale of their own there, with its own tick values
(rightTicks, rightAxisMin, rightAxisMax):
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/assign-different-scales-to-value-axes.html
- A series goes on an axis with Group Selection (or `seriesIndexes`)
and `valueAxis` left or right. Without separate scales both sides
show the one scale.
- Each axis stacks its own stacked columns and areas; stacked columns
of the two axes take a slot of the cluster each instead of covering
each other.
- An axis with no series of its own shows the other one's scale. The
right scale's zero gets a line of its own when it isn't the left's.
- The right axis' labels push the legend further right.
- With series on both axes picked, the Graph Type query returns no
value axis, so the dialog's OK leaves each series where it is.
- Graph Data drops right-axis assignments for series the new data no
longer has.
Own choices, as the pages don't say: bar graphs keep their value axis
along the bottom, and scatter graphs draw every series on one scale.
New fields (valueAxis, separateScales, rightSeries, rightTicks,
rightAxisMin, rightAxisMax) are written only when set, so other files
are unchanged and older versions draw the left axis as before. Graphs
with the axis on the left draw the same art as before.
Graph Type on series picked with Group Selection (or listed in the new
`seriesIndexes` param) now sets the type of those series only, so a
column graph can carry a line series:
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/combine-different-graph-types.html
- Column, stacked column, line and area mix on the vertical value axis;
bar and stacked bar on the horizontal one. Scatter, pie and radar take
no other type. The help page doesn't list which types mix, so this is
our own choice: types that share the value axis.
- Stacked columns take one slot of the column cluster (a graph of
stacked columns only is unchanged); stacked series stack with each
other, areas with each other, and the value axis covers both totals.
- Areas draw at the back, lines in front of columns. Category labels,
areas and lines sit at the category centres once a series that isn't
edge to edge is in the graph.
- With only series selected, the Graph Type query returns their type,
so the dialog's OK keeps it, and they stay selected after the change.
An explicit `id`, or anything else in the selection, is the whole
graph, as before.
- A series given the graph's own type follows the graph again. A type
the graph's type can't take is drawn as the graph's and kept.
Series types are stored in a new `seriesKinds` field, written only when
a series has its own type; versions that don't know it draw the whole
graph as the graph's type. Graphs of one type draw the same art as
before.
A graph's data can now hold blank cells: an empty CSV cell, a null in
`rows` (any cell that isn't a finite number), the rest of a short row,
or a row that has only a label.
- Columns, bars and stacked segments leave a blank cell out instead of
drawing a zero-height mark.
- Line and scatter graphs break their lines around it and draw no
marker there; the value axis ignores it.
- Area, pie and radar graphs draw it as 0, which is what it adds to
them.
The help pages don't describe blank cells, so this is our own choice:
a cell with no value has nothing to draw, which also matches how a
series with a missing year reads in a report.
In the file a blank cell keeps a 0 in `rows` and is listed in a new
`blanks` field ([category, series] pairs, written only when there are
any). A version that doesn't know blanks ignores the field and reads
the zeros, so files still open there, and files without blanks are
unchanged.
A number in straight quotes is a label, as the help page on graph
labels says (a year as a category name, for one). The CSV reader used
to strip the quotes first and read it as a value. Label columns are now
decided for the whole column: once any row starts with a label, every
row's first cell is its label, so a row with an empty label no longer
shifts its values one place left. The data window writes a header row,
labels that are empty, read as numbers or have spaces around them in
quotes, and blanks as empty cells, so they come back as they were.
graph.setData {} returns blanks in `rows` as null, so the rows it
returns can be edited and sent back. A label-only row keeps its place
with blank values; a row with neither a value nor a label is dropped,
and a first row that is a label followed by empty cells (`Year,,`) is
still read as a header with no series names.
The data grid is built in full for drawing and for the data window, so
it now stops at 10,000 categories of 256 series, which keeps a file
with one very long row from allocating without bound.
Behaviour (quoted labels): Add graph labels and data sets:
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/add-graph-labels-and-data-sets.html
New line graphs put their points at the centres of their categories, the
option's default in the reference app; graphs saved before the option
existed were drawn edge to edge and keep it (a field default of its own).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Line graphs take the Edge-to-Edge Lines option (`edgeToEdge` on
graph.setType). On, the lines run across the whole plot, which is how
they always drew and stays the default, so existing graphs and files
look the same. Off, the points sit at the centres of their categories,
like the columns of a column graph, so a line graph lines up with a
column graph of the same size. The page describes only what the option
does when on; the off position is its opposite.
Radar graphs drew their ring and markers whatever Mark Data Points and
Connect Data Points said. They now follow both, like line and scatter
graphs.
Behaviour: Format columns, bars, and lines, Graph Type options for
line, scatter and radar graphs (Mark Data Points, Edge-to-Edge Lines,
Connect Data Points):
https://helpx.adobe.com/illustrator/desktop/automate-visualize-data/visualize-data/format-columns-bars-and-lines.html
Group Selection's fill and stroke on a graph series are kept on the graph,
separately per series, and reapplied when its data, type or size changes,
and through save, open and undo.