/proto · contentitem/chart.proto

contentitem/chart.proto

High-Low-Open-Close / volume-HLC

Messages
19
Enums
20
Fields
214
Source
23.5 KB
Imports
0
ChartType enum · 18 values
# name notes
0 CHART_UNKNOWN
1 CHART_BAR
2 CHART_LINE
3 CHART_PIE
4 CHART_SCATTER
5 CHART_AREA
6 CHART_DOUGHNUT
7 CHART_RADAR
8 CHART_BUBBLE
9 CHART_BAR_3D
10 CHART_LINE_3D
11 CHART_PIE_3D
12 CHART_AREA_3D
13 CHART_COMBO
14 CHART_STOCK
15 CHART_SURFACE High-Low-Open-Close / volume-HLC
16 CHART_SURFACE_3D 2D wireframe surface
17 CHART_OF_PIE 3D surface mesh
LineDash enum · 12 values
pie-of-pie / bar-of-pie
# name notes
0 LINE_DASH_UNKNOWN
1 LINE_DASH_SOLID
2 LINE_DASH_DOT
3 LINE_DASH_DASH
4 LINE_DASH_LARGE_DASH
5 LINE_DASH_DASH_DOT
6 LINE_DASH_LARGE_DASH_DOT
7 LINE_DASH_LARGE_DASH_DOT_DOT
8 LINE_DASH_SYS_DASH
9 LINE_DASH_SYS_DOT
10 LINE_DASH_SYS_DASH_DOT
11 LINE_DASH_SYS_DASH_DOT_DOT
MarkerStyle enum · 13 values
# name notes
0 MARKER_UNKNOWN
1 MARKER_NONE
2 MARKER_CIRCLE
3 MARKER_SQUARE
4 MARKER_DIAMOND
5 MARKER_TRIANGLE
6 MARKER_X
7 MARKER_STAR
8 MARKER_PLUS
9 MARKER_DASH
10 MARKER_DOT
11 MARKER_PICTURE
12 MARKER_AUTO
LegendPosition enum · 7 values
# name notes
0 LEGEND_POS_UNKNOWN
1 LEGEND_POS_NONE
2 LEGEND_POS_RIGHT
3 LEGEND_POS_TOP
4 LEGEND_POS_LEFT
5 LEGEND_POS_BOTTOM
6 LEGEND_POS_TOP_RIGHT
Grouping enum · 5 values
How a series' values combine across categories. For bar/col/line/area.
# name notes
0 GROUPING_UNKNOWN
1 GROUPING_CLUSTERED
2 GROUPING_STACKED side-by-side
3 GROUPING_PERCENT_STACKED absolute stack
4 GROUPING_STANDARD 100% stack
BarDirection enum · 3 values
line/area default Orientation for bar/col charts.
# name notes
0 BAR_DIR_UNKNOWN
1 BAR_DIR_COL
2 BAR_DIR_BAR vertical (default)
TickMark enum · 5 values
horizontal Axis tick-mark style.
# name notes
0 TICK_MARK_UNKNOWN
1 TICK_MARK_NONE
2 TICK_MARK_IN
3 TICK_MARK_OUT
4 TICK_MARK_CROSS
TickLabelPos enum · 5 values
Where axis tick labels render.
# name notes
0 TICK_LBL_POS_UNKNOWN
1 TICK_LBL_POS_NONE
2 TICK_LBL_POS_LOW
3 TICK_LBL_POS_HIGH
4 TICK_LBL_POS_NEXT_TO
ScatterStyle enum · 7 values
default — next to the axis Scatter-chart sub-style.
# name notes
0 SCATTER_STYLE_UNKNOWN
1 SCATTER_STYLE_LINE
2 SCATTER_STYLE_LINE_MARKER
3 SCATTER_STYLE_MARKER
4 SCATTER_STYLE_SMOOTH
5 SCATTER_STYLE_SMOOTH_MARKER
6 SCATTER_STYLE_NONE
RadarStyle enum · 4 values
Radar-chart sub-style.
# name notes
0 RADAR_STYLE_UNKNOWN
1 RADAR_STYLE_STANDARD
2 RADAR_STYLE_MARKER
3 RADAR_STYLE_FILLED
DispBlanksAs enum · 4 values
How to treat empty cells in the chart data range.
# name notes
0 DISP_BLANKS_UNKNOWN
1 DISP_BLANKS_GAP
2 DISP_BLANKS_ZERO leave a gap (default)
3 DISP_BLANKS_SPAN treat as zero
AxisCrosses enum · 5 values
connect data points across the gap Axis crossing behavior — where the perpendicular axis crosses this one.
# name notes
0 AXIS_CROSSES_UNKNOWN
1 AXIS_CROSSES_AUTO_ZERO
2 AXIS_CROSSES_MIN default — cross at 0 / first category
3 AXIS_CROSSES_MAX cross at axis minimum
4 AXIS_CROSSES_CUSTOM cross at axis maximum
DispUnits enum · 11 values
cross at AxisConfig.crosses_at value Axis display-units scaling — divides tick labels by a power of 10.
# name notes
0 DISP_UNITS_UNKNOWN
1 DISP_UNITS_NONE
2 DISP_UNITS_HUNDREDS
3 DISP_UNITS_THOUSANDS
4 DISP_UNITS_TEN_THOUSANDS
5 DISP_UNITS_HUNDRED_THOUSANDS
6 DISP_UNITS_MILLIONS
7 DISP_UNITS_TEN_MILLIONS
8 DISP_UNITS_HUNDRED_MILLIONS
9 DISP_UNITS_BILLIONS
10 DISP_UNITS_TRILLIONS
OfPieType enum · 3 values
Of-pie sub-chart type and split rule (for CHART_OF_PIE).
# name notes
0 OF_PIE_TYPE_UNKNOWN
1 OF_PIE_TYPE_PIE
2 OF_PIE_TYPE_BAR second chart is a pie
OfPieSplit enum · 6 values
second chart is a bar
# name notes
0 OF_PIE_SPLIT_UNKNOWN
1 OF_PIE_SPLIT_AUTO
2 OF_PIE_SPLIT_POS
3 OF_PIE_SPLIT_VAL split by position (last N)
4 OF_PIE_SPLIT_PERCENT split by value threshold
5 OF_PIE_SPLIT_CUSTOM split by percentage threshold
DataPoint message · 11 fields
explicit per-point flags
# label type name notes
1 single double value
2 optional string label
3 optional uint32 override_color_rgba
4 optional double x_value For scatter/bubble: one point carries its own X and, for bubble, a size. Line/bar/pie charts ignore these and use `value` as Y.
5 optional double bubble_size
6 optional Marker marker Per-point overrides (rare; fall back to series-level when unset).
7 optional LineStyle line per-point marker style
8 optional double explosion per-point line stroke (for dPt.spPr.ln)
9 optional string custom_text per-slice pull for pie/doughnut
10 optional bool bubble_3d c:dLbl > c:tx > c:rich override text
11 optional int32 ohlc_role per-bubble 3D flag For stock charts: which of the OHLC roles this point represents. 0=unset (default), 1=open, 2=high, 3=low, 4=close, 5=volume.
FrameStyle message · 7 fields
Reserved for forward extensibility. Reusable shape styling — shared by chart area, plot area, and other rectangular frame decorations. Any omitted field means "inherit from the surrounding style (theme, preset, parent frame)".
# label type name notes
1 optional uint32 fill_color_rgba
2 optional uint32 border_color_rgba
3 optional int32 border_width_mpx
4 optional LineDash border_dash
5 optional int32 fill_opacity Opacity of the frame fill (0..1000, 1000 = opaque). Frame border is always opaque; use the dedicated color field for transparency there.
6 optional int32 border_radius_mpx Border corner radius in milli-pixels (0 = square).
7 optional string fill_desc Serialized rich fill (gradient/pattern/image) as a CSS-ish descriptor. When present, `fill_color_rgba` is the solid-color fallback.
TextStyle message · 9 fields
Reusable text styling — used for axis labels, data labels, chart title. Field semantics match the DrawingML a:defRPr / a:rPr pair.
# label type name notes
1 optional string font_family
2 optional int32 size_hundredths_pt
3 optional uint32 color_rgba sz attribute (100 == 1pt)
4 optional bool bold
5 optional bool italic
6 optional bool underline
7 optional bool strikethrough
8 optional int32 rotation_60k Rotation in 1/60000 of a degree (matches DrawingML a:bodyPr @rot). Positive = clockwise. Keeps full OOXML precision without float.
9 optional string fill_desc Text fill as gradient / pattern descriptor (rare for chart text).
DLblPos enum · 10 values
Placement of data labels relative to the data point / bar / slice.
# name notes
0 DLBL_POS_UNKNOWN
1 DLBL_POS_CTR
2 DLBL_POS_IN_END centered
3 DLBL_POS_OUT_END bar/col: top-inside of bar
4 DLBL_POS_IN_BASE bar/col: outside top
5 DLBL_POS_BEST_FIT bar/col: inside base
6 DLBL_POS_TOP pie: auto-fit
7 DLBL_POS_BOTTOM
8 DLBL_POS_LEFT
9 DLBL_POS_RIGHT
Trendline message · 10 fields
# label type name notes
1 single Type type
2 optional int32 order
3 optional string name poly degree (2..6)
4 optional bool display_equation
5 optional bool display_r_squared
6 optional LineStyle line
7 optional double forward
8 optional double backward extrapolate forward N units
9 optional double intercept extrapolate backward N units
10 optional int32 period force a Y-intercept value Moving-average period (c:period) — only for TRENDLINE_MOVING_AVG. When type == TRENDLINE_POLY use `order` instead.
Trendline. Type enum · 7 values
# name notes
0 TRENDLINE_UNKNOWN
1 TRENDLINE_LINEAR
2 TRENDLINE_LOG
3 TRENDLINE_POLY
4 TRENDLINE_POWER
5 TRENDLINE_EXP
6 TRENDLINE_MOVING_AVG
ErrorBars message · 10 fields
# label type name notes
1 single ValType val_type
2 single ErrDir direction
3 single ErrBarType bar_type
4 optional double value
5 optional bool no_end_cap
6 optional LineStyle line
7 optional double plus_value Asymmetric error values (c:plus / c:minus). When present, `value` is ignored in favor of these explicit bounds. For ERR_VAL_CUST with per-point arrays, use `plus_values` / `minus_values` packed arrays.
8 optional double minus_value
9 repeated double plus_values [packed = true]
10 repeated double minus_values [packed = true]
ErrorBars. ValType enum · 6 values
# name notes
0 ERR_VAL_UNKNOWN
1 ERR_VAL_FIXED
2 ERR_VAL_PERCENTAGE
3 ERR_VAL_STDDEV
4 ERR_VAL_STDERR
5 ERR_VAL_CUST
ErrorBars. ErrDir enum · 3 values
# name notes
0 ERR_DIR_UNKNOWN
1 ERR_DIR_X
2 ERR_DIR_Y
ErrorBars. ErrBarType enum · 4 values
# name notes
0 ERR_BAR_UNKNOWN
1 ERR_BAR_BOTH
2 ERR_BAR_MINUS
3 ERR_BAR_PLUS
LineStyle message · 8 fields
# label type name notes
1 optional uint32 color_rgba
2 optional int32 width_mpx
3 optional LineDash dash 1000 = 1px
4 optional bool smooth
5 optional int32 cap Bezier smoothing Line cap: 0=unset (flat), 1=flat/butt, 2=round, 3=square.
6 optional int32 compound Line compound: 0=single, 1=double, 2=thickThin, 3=thinThick, 4=triple.
7 optional int32 join Line join: 0=unset (miter), 1=miter, 2=round, 3=bevel.
8 repeated int32 custom_dash_mpx Custom dash as alternating mpx segments (when dash == LINE_DASH_UNKNOWN but the user supplied a bespoke pattern). Empty → use `dash` enum. [packed = true]
Marker message · 5 fields
# label type name notes
1 single MarkerStyle style
2 optional int32 size_mpx
3 optional uint32 color_rgba 1000 = 1px
4 optional LineStyle stroke Marker stroke (border around marker glyph). Falls back to series line.
5 optional string picture_src For MARKER_PICTURE — image filename ref in the asset sidecar registry.
DataLabels message · 13 fields
# label type name notes
1 single bool show_value
2 single bool show_category_name
3 single bool show_series_name
4 single bool show_percentage
5 single bool show_legend_key
6 optional string number_format
7 optional DLblPos position
8 optional TextStyle text_style
9 optional bool show_bubble_size Extensions.
10 optional string separator c:showBubbleSize
11 optional bool show_leader_lines text between label parts (e.g. "\n" or ", ")
12 optional LineStyle leader_line_style pie/doughnut only
13 optional FrameStyle fill_style stroke of the leader connector
Legend message · 4 fields
background rect of the label
# label type name notes
1 single LegendPosition position
2 single bool overlay
3 optional FrameStyle frame_style Styling of the legend frame + entry text (rare but OOXML allows it).
4 optional TextStyle text_style
Series message · 21 fields
# label type name notes
1 optional string name
2 repeated DataPoint points
3 optional uint32 color_rgba
4 optional LineStyle line
5 optional Marker marker
6 optional DataLabels data_labels
7 optional ChartType chart_type Combo-chart support: the series' own chart-type (bar vs line etc.) and whether it plots against the secondary value axis.
8 optional bool on_secondary_axis
9 optional bool smooth Series-level rendering tweaks.
10 optional bool invert_if_negative line/scatter Bezier smoothing
11 optional double explosion bar/col flip color for negative
12 repeated Trendline trendlines pie slice pull, 0.0 .. 1.0 (or raw %)
13 repeated ErrorBars error_bars
14 optional string value_formula Data source expressions (c:f formula strings) — opaque to the renderer but preserved so an editor can re-bind the series to a spreadsheet cell range.
15 optional string category_formula c:val/c:yVal/c:numRef/c:f
16 optional string bubble_size_formula c:cat/c:xVal/c:strRef or numRef/c:f
17 optional string name_formula c:bubbleSize/c:numRef/c:f
18 optional string fill_desc c:tx/c:strRef/c:f Fill that's a gradient / pattern / image rather than a solid color. When present, `color_rgba` is the fallback (first stop / fg color) and the renderer should prefer this field. Serialized as a compact CSS-ish descriptor string; full structured fill is stored via the shared Fill primitive on page.proto. Kept as string here to avoid a cross-proto dependency inside the chart sidecar.
19 optional LineStyle leader_line_style Leader-line style (pie/doughnut) — inherits from chart-level DataLabels.leader_line_style when unset.
20 optional int32 picture_options Picture-fill options for bar/column series with an image fill: 0=stretch, 1=stack, 2=stackScale.
21 optional bool hidden Hidden/deleted series flag (c:hidden or c:spPr > a:noFill + empty values). Series stays in data model so axis scale is preserved but renderer hides it.
ManualLayout message · 8 fields
Manual layout override (c:layout > c:manualLayout) for chart frame subregions (title / legend / plot area). Coordinates are fractions of the parent chart-area bounding box in the 0.0 .. 1.0 range (mirrors OOXML's 0..1 ST_LayoutMode="factor" semantics). Missing fields mean "auto-lay-out this dimension".
# label type name notes
1 optional double x
2 optional double y left, fraction of parent width
3 optional double width top, fraction of parent height
4 optional double height fraction of parent width
5 optional int32 x_mode fraction of parent height When present, selects between "factor" (fraction of parent bbox) and "edge" (absolute offset from top-left) semantics per axis. 0 = unspecified (factor), 1 = edge, 2 = factor.
6 optional int32 y_mode
7 optional int32 w_mode
8 optional int32 h_mode
UpDownBars message · 3 fields
Up/Down bars for line + stock charts (c:upDownBars).
# label type name notes
1 optional int32 gap_width_pct
2 optional FrameStyle up_style c:gapWidth (default 150)
3 optional FrameStyle down_style up bars (when close > open)
HiLowLines message · 1 field
down bars (when close < open) Hi-Low lines for line/stock charts (c:hiLowLines) — vertical lines connecting the highest and lowest series at each category.
# label type name notes
1 optional LineStyle line
DropLines message · 1 field
Drop lines for line/area charts (c:dropLines) — vertical lines from each data point down to the category axis.
# label type name notes
1 optional LineStyle line
OfPieConfig message · 7 fields
Of-pie secondary chart configuration (c:ofPieChart).
# label type name notes
1 single OfPieType of_pie_type
2 single OfPieSplit split_type
3 optional double split_pos
4 repeated int32 custom_split threshold value when split_type != AUTO [packed = true]
5 optional int32 second_pie_size_pct per-point 0/1 assignment
6 optional int32 gap_width_pct size of the secondary chart (5..200)
7 optional LineStyle series_line c:gapWidth between primary and secondary
ThemeContext message · 9 fields
line connecting the two pies Theme context snapshot — the slide-master/theme values resolved at extract time so the chart renders identically even when detached from the page or its theme is later edited. All fields optional; the renderer falls back to built-in defaults for anything absent.
# label type name notes
1 repeated uint32 accent_rgba [packed = true]
2 optional string major_font_family accent1..accent6 RGBA
3 optional string minor_font_family theme +mj-lt / mj-ea / mj-cs latin
4 optional int32 default_font_size_mpx theme +mn-lt / mn-ea / mn-cs latin
5 optional uint32 text_primary_rgba body text size in mpx (1000 = 1px)
6 optional uint32 background_rgba primary text color (lt1/dk1 resolved)
7 optional uint32 hyperlink_rgba slide bg resolved color
8 optional uint32 followed_hyperlink_rgba
9 repeated int32 line_width_mpx Format scheme (fillStyleLst / lnStyleLst) default line weights in mpx — index 0 = first subtle, 1 = moderate, 2 = intense. Used when a chart references a style_id that expects theme line widths. [packed = true]
AxisConfig message · 33 fields
# label type name notes
1 optional string title
2 optional double min_val
3 optional double max_val
4 optional string number_format
5 optional bool show_gridlines
6 optional int32 label_rotation_deg major gridlines
7 optional bool log_scale
8 optional int32 log_base
9 optional bool show_minor_gridlines Visual axis style.
10 optional TickMark major_tick_mark
11 optional TickMark minor_tick_mark
12 optional TickLabelPos tick_label_pos
13 optional double major_unit Axis scale steps.
14 optional double minor_unit
15 optional uint32 line_color_rgba Axis line color/width, drawn with the tick marks.
16 optional int32 line_width_mpx
17 optional TextStyle label_style Axis label text styling (font / size / color / bold / italic).
18 optional string base_time_unit Date axis (when the category axis is a c:dateAx): base unit for formatting, plus majorUnit / minorUnit time-unit expressed as a string ("days" | "months" | "years") because the numeric major_unit above is unit-agnostic.
19 optional string major_time_unit
20 optional string minor_time_unit
21 optional AxisCrosses crosses Crossing behavior — where the perpendicular axis crosses this one.
22 optional double crosses_at
23 optional int32 label_offset_pct used when crosses == CUSTOM Label offset (c:lblOffset) — 0..1000 as 1/1000 of a percentage. Default 100 in OOXML.
24 optional int32 label_alignment Label alignment on category axis: "ctr"/"l"/"r" → 0=unset,1=ctr,2=l,3=r.
25 optional int32 tick_label_skip Skip every N tick labels (c:tickLblSkip). 1 = show every label.
26 optional int32 tick_mark_skip Skip every N tick marks (c:tickMarkSkip). 1 = show every tick.
27 optional DispUnits display_units Display-units scaling and label (c:dispUnits).
28 optional bool show_display_units_label
29 optional string display_units_label
30 optional int32 axis_position Axis position on chart frame: 0=unset, 1=b(bottom), 2=t(top), 3=l(left), 4=r(right). Mirrors c:axPos.
31 optional bool delete_axis Axis deletion — c:delete. When true, hides the axis line and ticks but keeps the axis in the scale calculation.
32 optional bool reversed Reversed plot order (c:scaling > c:orientation val="maxMin").
33 optional bool auto_scale Auto-scaling flag (c:auto) — when true, min/max are computed from data rather than taken from min_val/max_val above.
ChartData message · 51 fields
# label type name notes
1 single int32 slide_index
2 single int32 chart_index
3 single ChartType type
4 repeated string categories
5 repeated Series series
6 optional AxisConfig category_axis
7 optional AxisConfig value_axis
8 optional string title
9 repeated int32 bounds Position on slide (milli-pixels): [left, top, width, height, z] [packed = true]
10 optional Legend legend
11 optional DataLabels data_labels
12 optional AxisConfig secondary_value_axis Second value axis for dual-scale / combo charts. Series with on_secondary_axis=true plot against this axis.
13 optional Grouping grouping Chart-type-specific modifiers.
14 optional BarDirection bar_direction bar/col/line/area grouping
15 optional int32 bar_gap_width bar/col orientation
16 optional int32 bar_overlap between category groups, percent (150 = 150%)
17 optional int32 first_slice_angle between bars within a group, -100..100 percent
18 optional int32 doughnut_hole_size pie: start angle in degrees
19 optional ScatterStyle scatter_style doughnut hole size, percent 10..90
20 optional RadarStyle radar_style
21 optional DispBlanksAs disp_blanks_as
22 optional bool plot_visible_only
23 optional int32 view3d_rot_x_deg plotVisOnly flag 3D-chart view angles (valid for bar3D/line3D/pie3D/area3D).
24 optional int32 view3d_rot_y_deg -90..90
25 optional int32 view3d_depth_pct 0..359
26 optional int32 view3d_perspective
27 optional FrameStyle chart_area_style 0..100 Chart framing — the two rectangular regions every chart has: chart_area = the entire chart bounding box plot_area = the inner area where series are drawn
28 optional FrameStyle plot_area_style
29 optional TextStyle title_style Font for the chart title (text comes from `title` above).
30 optional int32 bubble_scale_pct Bubble-chart modifiers (when type == CHART_BUBBLE).
31 optional bool bubble_size_represents_width 0..300 (% of default)
32 optional bool show_neg_bubbles false = area (default)
33 optional bool bubble_3d
34 optional bool auto_title_deleted Title auto-deletion flag — when true, renderer must not auto-generate a title from the single-series name even if `title` is empty.
35 optional bool date_1904 1904 epoch for date-axis numeric values. Default (false) = 1900 epoch.
36 optional int32 view3d_h_pct Additional 3D view angles.
37 optional bool view3d_r_ang_ax height % (5..500)
38 optional ManualLayout title_layout right-angle axes (no perspective distortion) Manual layout overrides for chart frame subregions.
39 optional ManualLayout legend_layout
40 optional ManualLayout plot_layout
41 optional ThemeContext theme_context Theme context snapshot — baked at extract time so rendering is independent of live theme state. Renderer uses this to assign default series colors (accent1..6 cycle) and default fonts.
42 optional UpDownBars up_down_bars Line/stock chart drop-shadow overlays.
43 optional HiLowLines hi_low_lines
44 optional DropLines drop_lines
45 optional OfPieConfig of_pie CHART_OF_PIE specific configuration. Only meaningful when type == CHART_OF_PIE.
46 optional int32 style_id ChartEx style catalog reference (c:style val="N" for 2007-2013, cs:chartStyle @styleId for 2016+). 0 = no style, 1..48 = built-in catalog entry. The renderer consults its baked-in style catalog to resolve fills, strokes, fonts in the absence of inline overrides.
47 repeated int32 hidden_legend_entries Axis label text and styling for the secondary value axis legend entry (c:legendEntry > c:delete per-entry hide, rare). [packed = true]
48 repeated int32 clr_map_override ChartEx style variant — some decks declare `c:clrMapOvr` overriding the slide theme's color map inside the chart. Stored as an array of 8 mapping ints (bg1,tx1,bg2,tx2,accent1..6 each resolved to theme slot index). Empty array = no override. [packed = true]
49 optional Marker default_marker Chart-level default marker (c:marker under chart type group) applied when series don't set their own.
50 optional uint32 content_item_id Owning page ContentItem id. Page order and placement stay in page.pb; chart.pb remains the cold/native chart model for that visible item.
100 optional bytes unknown_ext Forward-compatible extension bytes. Unknown future extensions can be round-tripped without schema changes.
Charts message · 3 fields
# label type name notes
1 repeated ChartData charts
2 optional int32 schema_version Schema version — increment on incompatible layout changes so the renderer can fall back to a migration path.
3 optional ThemeContext deck_theme_context Deck-level theme context — when every chart shares a single theme (common case), this is populated once and per-chart `theme_context` is left unset to save bytes. Renderer merges deck-level with per-chart (per-chart wins on collision).

§Raw schema

syntax = "proto3";

package eddocu.chart.v3;

enum ChartType {
  CHART_UNKNOWN = 0;
  CHART_BAR = 1;
  CHART_LINE = 2;
  CHART_PIE = 3;
  CHART_SCATTER = 4;
  CHART_AREA = 5;
  CHART_DOUGHNUT = 6;
  CHART_RADAR = 7;
  CHART_BUBBLE = 8;
  CHART_BAR_3D = 9;
  CHART_LINE_3D = 10;
  CHART_PIE_3D = 11;
  CHART_AREA_3D = 12;
  CHART_COMBO = 13;
  CHART_STOCK = 14;      // High-Low-Open-Close / volume-HLC
  CHART_SURFACE = 15;    // 2D wireframe surface
  CHART_SURFACE_3D = 16; // 3D surface mesh
  CHART_OF_PIE = 17;     // pie-of-pie / bar-of-pie
}

enum LineDash {
  LINE_DASH_UNKNOWN = 0;
  LINE_DASH_SOLID = 1;
  LINE_DASH_DOT = 2;
  LINE_DASH_DASH = 3;
  LINE_DASH_LARGE_DASH = 4;
  LINE_DASH_DASH_DOT = 5;
  LINE_DASH_LARGE_DASH_DOT = 6;
  LINE_DASH_LARGE_DASH_DOT_DOT = 7;
  LINE_DASH_SYS_DASH = 8;
  LINE_DASH_SYS_DOT = 9;
  LINE_DASH_SYS_DASH_DOT = 10;
  LINE_DASH_SYS_DASH_DOT_DOT = 11;
}

enum MarkerStyle {
  MARKER_UNKNOWN = 0;
  MARKER_NONE = 1;
  MARKER_CIRCLE = 2;
  MARKER_SQUARE = 3;
  MARKER_DIAMOND = 4;
  MARKER_TRIANGLE = 5;
  MARKER_X = 6;
  MARKER_STAR = 7;
  MARKER_PLUS = 8;
  MARKER_DASH = 9;
  MARKER_DOT = 10;
  MARKER_PICTURE = 11;
  MARKER_AUTO = 12;
}

enum LegendPosition {
  LEGEND_POS_UNKNOWN = 0;
  LEGEND_POS_NONE = 1;
  LEGEND_POS_RIGHT = 2;
  LEGEND_POS_TOP = 3;
  LEGEND_POS_LEFT = 4;
  LEGEND_POS_BOTTOM = 5;
  LEGEND_POS_TOP_RIGHT = 6;
}

// How a series' values combine across categories. For bar/col/line/area.
enum Grouping {
  GROUPING_UNKNOWN = 0;
  GROUPING_CLUSTERED = 1;      // side-by-side
  GROUPING_STACKED = 2;        // absolute stack
  GROUPING_PERCENT_STACKED = 3;// 100% stack
  GROUPING_STANDARD = 4;       // line/area default
}

// Orientation for bar/col charts.
enum BarDirection {
  BAR_DIR_UNKNOWN = 0;
  BAR_DIR_COL = 1;  // vertical (default)
  BAR_DIR_BAR = 2;  // horizontal
}

// Axis tick-mark style.
enum TickMark {
  TICK_MARK_UNKNOWN = 0;
  TICK_MARK_NONE = 1;
  TICK_MARK_IN = 2;
  TICK_MARK_OUT = 3;
  TICK_MARK_CROSS = 4;
}

// Where axis tick labels render.
enum TickLabelPos {
  TICK_LBL_POS_UNKNOWN = 0;
  TICK_LBL_POS_NONE = 1;
  TICK_LBL_POS_LOW = 2;
  TICK_LBL_POS_HIGH = 3;
  TICK_LBL_POS_NEXT_TO = 4; // default — next to the axis
}

// Scatter-chart sub-style.
enum ScatterStyle {
  SCATTER_STYLE_UNKNOWN = 0;
  SCATTER_STYLE_LINE = 1;
  SCATTER_STYLE_LINE_MARKER = 2;
  SCATTER_STYLE_MARKER = 3;
  SCATTER_STYLE_SMOOTH = 4;
  SCATTER_STYLE_SMOOTH_MARKER = 5;
  SCATTER_STYLE_NONE = 6;
}

// Radar-chart sub-style.
enum RadarStyle {
  RADAR_STYLE_UNKNOWN = 0;
  RADAR_STYLE_STANDARD = 1;
  RADAR_STYLE_MARKER = 2;
  RADAR_STYLE_FILLED = 3;
}

// How to treat empty cells in the chart data range.
enum DispBlanksAs {
  DISP_BLANKS_UNKNOWN = 0;
  DISP_BLANKS_GAP = 1;   // leave a gap (default)
  DISP_BLANKS_ZERO = 2;  // treat as zero
  DISP_BLANKS_SPAN = 3;  // connect data points across the gap
}

// Axis crossing behavior — where the perpendicular axis crosses this one.
enum AxisCrosses {
  AXIS_CROSSES_UNKNOWN = 0;
  AXIS_CROSSES_AUTO_ZERO = 1; // default — cross at 0 / first category
  AXIS_CROSSES_MIN = 2;       // cross at axis minimum
  AXIS_CROSSES_MAX = 3;       // cross at axis maximum
  AXIS_CROSSES_CUSTOM = 4;    // cross at AxisConfig.crosses_at value
}

// Axis display-units scaling — divides tick labels by a power of 10.
enum DispUnits {
  DISP_UNITS_UNKNOWN = 0;
  DISP_UNITS_NONE = 1;
  DISP_UNITS_HUNDREDS = 2;
  DISP_UNITS_THOUSANDS = 3;
  DISP_UNITS_TEN_THOUSANDS = 4;
  DISP_UNITS_HUNDRED_THOUSANDS = 5;
  DISP_UNITS_MILLIONS = 6;
  DISP_UNITS_TEN_MILLIONS = 7;
  DISP_UNITS_HUNDRED_MILLIONS = 8;
  DISP_UNITS_BILLIONS = 9;
  DISP_UNITS_TRILLIONS = 10;
}

// Of-pie sub-chart type and split rule (for CHART_OF_PIE).
enum OfPieType {
  OF_PIE_TYPE_UNKNOWN = 0;
  OF_PIE_TYPE_PIE = 1;   // second chart is a pie
  OF_PIE_TYPE_BAR = 2;   // second chart is a bar
}
enum OfPieSplit {
  OF_PIE_SPLIT_UNKNOWN = 0;
  OF_PIE_SPLIT_AUTO = 1;
  OF_PIE_SPLIT_POS = 2;     // split by position (last N)
  OF_PIE_SPLIT_VAL = 3;     // split by value threshold
  OF_PIE_SPLIT_PERCENT = 4; // split by percentage threshold
  OF_PIE_SPLIT_CUSTOM = 5;  // explicit per-point flags
}

message DataPoint {
  double value = 1;
  optional string label = 2;
  optional uint32 override_color_rgba = 3;

  // For scatter/bubble: one point carries its own X and, for bubble, a
  // size. Line/bar/pie charts ignore these and use `value` as Y.
  optional double x_value = 4;
  optional double bubble_size = 5;

  // Per-point overrides (rare; fall back to series-level when unset).
  optional Marker marker = 6;               // per-point marker style
  optional LineStyle line = 7;              // per-point line stroke (for dPt.spPr.ln)
  optional double explosion = 8;            // per-slice pull for pie/doughnut
  optional string custom_text = 9;          // c:dLbl > c:tx > c:rich override text
  optional bool bubble_3d = 10;             // per-bubble 3D flag

  // For stock charts: which of the OHLC roles this point represents.
  // 0=unset (default), 1=open, 2=high, 3=low, 4=close, 5=volume.
  optional int32 ohlc_role = 11;

  // Reserved for forward extensibility.
}

// Reusable shape styling — shared by chart area, plot area, and other
// rectangular frame decorations. Any omitted field means "inherit from
// the surrounding style (theme, preset, parent frame)".
message FrameStyle {
  optional uint32 fill_color_rgba = 1;
  optional uint32 border_color_rgba = 2;
  optional int32  border_width_mpx = 3;
  optional LineDash border_dash = 4;

  // Opacity of the frame fill (0..1000, 1000 = opaque). Frame border is
  // always opaque; use the dedicated color field for transparency there.
  optional int32 fill_opacity = 5;

  // Border corner radius in milli-pixels (0 = square).
  optional int32 border_radius_mpx = 6;

  // Serialized rich fill (gradient/pattern/image) as a CSS-ish descriptor.
  // When present, `fill_color_rgba` is the solid-color fallback.
  optional string fill_desc = 7;

}

// Reusable text styling — used for axis labels, data labels, chart title.
// Field semantics match the DrawingML a:defRPr / a:rPr pair.
message TextStyle {
  optional string font_family = 1;
  optional int32  size_hundredths_pt = 2; // sz attribute (100 == 1pt)
  optional uint32 color_rgba = 3;
  optional bool   bold = 4;
  optional bool   italic = 5;

  optional bool   underline = 6;
  optional bool   strikethrough = 7;
  // Rotation in 1/60000 of a degree (matches DrawingML a:bodyPr @rot).
  // Positive = clockwise. Keeps full OOXML precision without float.
  optional int32  rotation_60k = 8;
  // Text fill as gradient / pattern descriptor (rare for chart text).
  optional string fill_desc = 9;

}

// Placement of data labels relative to the data point / bar / slice.
enum DLblPos {
  DLBL_POS_UNKNOWN = 0;
  DLBL_POS_CTR = 1;      // centered
  DLBL_POS_IN_END = 2;   // bar/col: top-inside of bar
  DLBL_POS_OUT_END = 3;  // bar/col: outside top
  DLBL_POS_IN_BASE = 4;  // bar/col: inside base
  DLBL_POS_BEST_FIT = 5; // pie: auto-fit
  DLBL_POS_TOP = 6;
  DLBL_POS_BOTTOM = 7;
  DLBL_POS_LEFT = 8;
  DLBL_POS_RIGHT = 9;
}

message Trendline {
  enum Type {
    TRENDLINE_UNKNOWN = 0;
    TRENDLINE_LINEAR = 1;
    TRENDLINE_LOG = 2;
    TRENDLINE_POLY = 3;
    TRENDLINE_POWER = 4;
    TRENDLINE_EXP = 5;
    TRENDLINE_MOVING_AVG = 6;
  }
  Type type = 1;
  optional int32 order = 2;      // poly degree (2..6)
  optional string name = 3;
  optional bool display_equation = 4;
  optional bool display_r_squared = 5;
  optional LineStyle line = 6;
  optional double forward = 7;   // extrapolate forward N units
  optional double backward = 8;  // extrapolate backward N units
  optional double intercept = 9; // force a Y-intercept value

  // Moving-average period (c:period) — only for TRENDLINE_MOVING_AVG.
  // When type == TRENDLINE_POLY use `order` instead.
  optional int32 period = 10;

}

message ErrorBars {
  enum ValType {
    ERR_VAL_UNKNOWN = 0;
    ERR_VAL_FIXED = 1;
    ERR_VAL_PERCENTAGE = 2;
    ERR_VAL_STDDEV = 3;
    ERR_VAL_STDERR = 4;
    ERR_VAL_CUST = 5;
  }
  enum ErrDir {
    ERR_DIR_UNKNOWN = 0;
    ERR_DIR_X = 1;
    ERR_DIR_Y = 2;
  }
  enum ErrBarType {
    ERR_BAR_UNKNOWN = 0;
    ERR_BAR_BOTH = 1;
    ERR_BAR_MINUS = 2;
    ERR_BAR_PLUS = 3;
  }
  ValType val_type = 1;
  ErrDir  direction = 2;
  ErrBarType bar_type = 3;
  optional double value = 4;
  optional bool no_end_cap = 5;
  optional LineStyle line = 6;

  // Asymmetric error values (c:plus / c:minus). When present, `value` is
  // ignored in favor of these explicit bounds. For ERR_VAL_CUST with
  // per-point arrays, use `plus_values` / `minus_values` packed arrays.
  optional double plus_value = 7;
  optional double minus_value = 8;
  repeated double plus_values = 9 [packed=true];
  repeated double minus_values = 10 [packed=true];

}

message LineStyle {
  optional uint32 color_rgba = 1;
  optional int32  width_mpx = 2;   // 1000 = 1px
  optional LineDash dash = 3;
  optional bool smooth = 4;         // Bezier smoothing

  // Line cap: 0=unset (flat), 1=flat/butt, 2=round, 3=square.
  optional int32 cap = 5;
  // Line compound: 0=single, 1=double, 2=thickThin, 3=thinThick, 4=triple.
  optional int32 compound = 6;
  // Line join: 0=unset (miter), 1=miter, 2=round, 3=bevel.
  optional int32 join = 7;
  // Custom dash as alternating mpx segments (when dash == LINE_DASH_UNKNOWN
  // but the user supplied a bespoke pattern). Empty → use `dash` enum.
  repeated int32 custom_dash_mpx = 8 [packed=true];

}

message Marker {
  MarkerStyle style = 1;
  optional int32 size_mpx = 2;      // 1000 = 1px
  optional uint32 color_rgba = 3;

  // Marker stroke (border around marker glyph). Falls back to series line.
  optional LineStyle stroke = 4;
  // For MARKER_PICTURE — image filename ref in the asset sidecar registry.
  optional string picture_src = 5;

}

message DataLabels {
  bool show_value = 1;
  bool show_category_name = 2;
  bool show_series_name = 3;
  bool show_percentage = 4;
  bool show_legend_key = 5;
  optional string number_format = 6;
  optional DLblPos position = 7;
  optional TextStyle text_style = 8;

  // Extensions.
  optional bool show_bubble_size = 9;        // c:showBubbleSize
  optional string separator = 10;            // text between label parts (e.g. "\n" or ", ")
  optional bool show_leader_lines = 11;      // pie/doughnut only
  optional LineStyle leader_line_style = 12; // stroke of the leader connector
  optional FrameStyle fill_style = 13;       // background rect of the label

}

message Legend {
  LegendPosition position = 1;
  bool overlay = 2;

  // Styling of the legend frame + entry text (rare but OOXML allows it).
  optional FrameStyle frame_style = 3;
  optional TextStyle text_style = 4;

}

message Series {
  optional string name = 1;
  repeated DataPoint points = 2;
  optional uint32 color_rgba = 3;

  optional LineStyle line = 4;
  optional Marker marker = 5;
  optional DataLabels data_labels = 6;

  // Combo-chart support: the series' own chart-type (bar vs line etc.)
  // and whether it plots against the secondary value axis.
  optional ChartType chart_type = 7;
  optional bool on_secondary_axis = 8;

  // Series-level rendering tweaks.
  optional bool smooth = 9;                 // line/scatter Bezier smoothing
  optional bool invert_if_negative = 10;    // bar/col flip color for negative
  optional double explosion = 11;           // pie slice pull, 0.0 .. 1.0 (or raw %)

  repeated Trendline trendlines = 12;
  repeated ErrorBars error_bars = 13;

  // Data source expressions (c:f formula strings) — opaque to the renderer
  // but preserved so an editor can re-bind the series to a spreadsheet
  // cell range.
  optional string value_formula = 14;       // c:val/c:yVal/c:numRef/c:f
  optional string category_formula = 15;    // c:cat/c:xVal/c:strRef or numRef/c:f
  optional string bubble_size_formula = 16; // c:bubbleSize/c:numRef/c:f
  optional string name_formula = 17;        // c:tx/c:strRef/c:f

  // Fill that's a gradient / pattern / image rather than a solid color.
  // When present, `color_rgba` is the fallback (first stop / fg color)
  // and the renderer should prefer this field. Serialized as a compact
  // CSS-ish descriptor string; full structured fill is stored via the
  // shared Fill primitive on page.proto. Kept as string here to avoid
  // a cross-proto dependency inside the chart sidecar.
  optional string fill_desc = 18;

  // Leader-line style (pie/doughnut) — inherits from chart-level
  // DataLabels.leader_line_style when unset.
  optional LineStyle leader_line_style = 19;

  // Picture-fill options for bar/column series with an image fill:
  // 0=stretch, 1=stack, 2=stackScale.
  optional int32 picture_options = 20;

  // Hidden/deleted series flag (c:hidden or c:spPr > a:noFill + empty values).
  // Series stays in data model so axis scale is preserved but renderer hides it.
  optional bool hidden = 21;

}

// Manual layout override (c:layout > c:manualLayout) for chart frame
// subregions (title / legend / plot area). Coordinates are fractions of
// the parent chart-area bounding box in the 0.0 .. 1.0 range (mirrors
// OOXML's 0..1 ST_LayoutMode="factor" semantics). Missing fields mean
// "auto-lay-out this dimension".
message ManualLayout {
  optional double x = 1;       // left, fraction of parent width
  optional double y = 2;       // top,  fraction of parent height
  optional double width = 3;   // fraction of parent width
  optional double height = 4;  // fraction of parent height

  // When present, selects between "factor" (fraction of parent bbox) and
  // "edge" (absolute offset from top-left) semantics per axis.
  // 0 = unspecified (factor), 1 = edge, 2 = factor.
  optional int32 x_mode = 5;
  optional int32 y_mode = 6;
  optional int32 w_mode = 7;
  optional int32 h_mode = 8;

}

// Up/Down bars for line + stock charts (c:upDownBars).
message UpDownBars {
  optional int32 gap_width_pct = 1;   // c:gapWidth (default 150)
  optional FrameStyle up_style = 2;   // up bars (when close > open)
  optional FrameStyle down_style = 3; // down bars (when close < open)
}

// Hi-Low lines for line/stock charts (c:hiLowLines) — vertical lines
// connecting the highest and lowest series at each category.
message HiLowLines {
  optional LineStyle line = 1;
}

// Drop lines for line/area charts (c:dropLines) — vertical lines from
// each data point down to the category axis.
message DropLines {
  optional LineStyle line = 1;
}

// Of-pie secondary chart configuration (c:ofPieChart).
message OfPieConfig {
  OfPieType of_pie_type = 1;
  OfPieSplit split_type = 2;
  optional double split_pos = 3;       // threshold value when split_type != AUTO
  repeated int32 custom_split = 4 [packed=true]; // per-point 0/1 assignment
  optional int32 second_pie_size_pct = 5; // size of the secondary chart (5..200)
  optional int32 gap_width_pct = 6;    // c:gapWidth between primary and secondary
  optional LineStyle series_line = 7;  // line connecting the two pies
}

// Theme context snapshot — the slide-master/theme values resolved at
// extract time so the chart renders identically even when detached from
// the page or its theme is later edited. All fields optional; the
// renderer falls back to built-in defaults for anything absent.
message ThemeContext {
  repeated uint32 accent_rgba = 1 [packed=true];    // accent1..accent6 RGBA
  optional string major_font_family = 2;            // theme +mj-lt / mj-ea / mj-cs latin
  optional string minor_font_family = 3;            // theme +mn-lt / mn-ea / mn-cs latin
  optional int32  default_font_size_mpx = 4;        // body text size in mpx (1000 = 1px)
  optional uint32 text_primary_rgba = 5;            // primary text color (lt1/dk1 resolved)
  optional uint32 background_rgba = 6;              // slide bg resolved color
  optional uint32 hyperlink_rgba = 7;
  optional uint32 followed_hyperlink_rgba = 8;

  // Format scheme (fillStyleLst / lnStyleLst) default line weights in mpx —
  // index 0 = first subtle, 1 = moderate, 2 = intense. Used when a chart
  // references a style_id that expects theme line widths.
  repeated int32 line_width_mpx = 9 [packed=true];

}

message AxisConfig {
  optional string title = 1;
  optional double min_val = 2;
  optional double max_val = 3;

  optional string number_format = 4;
  optional bool show_gridlines = 5;       // major gridlines
  optional int32 label_rotation_deg = 6;
  optional bool log_scale = 7;
  optional int32 log_base = 8;

  // Visual axis style.
  optional bool show_minor_gridlines = 9;
  optional TickMark major_tick_mark = 10;
  optional TickMark minor_tick_mark = 11;
  optional TickLabelPos tick_label_pos = 12;

  // Axis scale steps.
  optional double major_unit = 13;
  optional double minor_unit = 14;

  // Axis line color/width, drawn with the tick marks.
  optional uint32 line_color_rgba = 15;
  optional int32  line_width_mpx = 16;

  // Axis label text styling (font / size / color / bold / italic).
  optional TextStyle label_style = 17;

  // Date axis (when the category axis is a c:dateAx): base unit for
  // formatting, plus majorUnit / minorUnit time-unit expressed as a
  // string ("days" | "months" | "years") because the numeric major_unit
  // above is unit-agnostic.
  optional string base_time_unit = 18;
  optional string major_time_unit = 19;
  optional string minor_time_unit = 20;

  // Crossing behavior — where the perpendicular axis crosses this one.
  optional AxisCrosses crosses = 21;
  optional double crosses_at = 22;       // used when crosses == CUSTOM

  // Label offset (c:lblOffset) — 0..1000 as 1/1000 of a percentage.
  // Default 100 in OOXML.
  optional int32 label_offset_pct = 23;
  // Label alignment on category axis: "ctr"/"l"/"r" → 0=unset,1=ctr,2=l,3=r.
  optional int32 label_alignment = 24;
  // Skip every N tick labels (c:tickLblSkip). 1 = show every label.
  optional int32 tick_label_skip = 25;
  // Skip every N tick marks (c:tickMarkSkip). 1 = show every tick.
  optional int32 tick_mark_skip = 26;

  // Display-units scaling and label (c:dispUnits).
  optional DispUnits display_units = 27;
  optional bool     show_display_units_label = 28;
  optional string   display_units_label = 29;

  // Axis position on chart frame: 0=unset, 1=b(bottom), 2=t(top),
  // 3=l(left), 4=r(right). Mirrors c:axPos.
  optional int32 axis_position = 30;

  // Axis deletion — c:delete. When true, hides the axis line and ticks
  // but keeps the axis in the scale calculation.
  optional bool delete_axis = 31;

  // Reversed plot order (c:scaling > c:orientation val="maxMin").
  optional bool reversed = 32;

  // Auto-scaling flag (c:auto) — when true, min/max are computed from
  // data rather than taken from min_val/max_val above.
  optional bool auto_scale = 33;

}

message ChartData {
  int32 slide_index = 1;
  int32 chart_index = 2;
  ChartType type = 3;

  repeated string categories = 4;
  repeated Series series = 5;

  optional AxisConfig category_axis = 6;
  optional AxisConfig value_axis = 7;

  optional string title = 8;

  // Position on slide (milli-pixels): [left, top, width, height, z]
  repeated int32 bounds = 9 [packed=true];

  optional Legend legend = 10;
  optional DataLabels data_labels = 11;

  // Second value axis for dual-scale / combo charts. Series with
  // on_secondary_axis=true plot against this axis.
  optional AxisConfig secondary_value_axis = 12;

  // Chart-type-specific modifiers.
  optional Grouping grouping = 13;       // bar/col/line/area grouping
  optional BarDirection bar_direction = 14; // bar/col orientation
  optional int32 bar_gap_width = 15;     // between category groups, percent (150 = 150%)
  optional int32 bar_overlap = 16;       // between bars within a group, -100..100 percent
  optional int32 first_slice_angle = 17; // pie: start angle in degrees
  optional int32 doughnut_hole_size = 18;// doughnut hole size, percent 10..90
  optional ScatterStyle scatter_style = 19;
  optional RadarStyle radar_style = 20;
  optional DispBlanksAs disp_blanks_as = 21;
  optional bool plot_visible_only = 22;  // plotVisOnly flag

  // 3D-chart view angles (valid for bar3D/line3D/pie3D/area3D).
  optional int32 view3d_rot_x_deg = 23;  // -90..90
  optional int32 view3d_rot_y_deg = 24;  // 0..359
  optional int32 view3d_depth_pct = 25;
  optional int32 view3d_perspective = 26;// 0..100

  // Chart framing — the two rectangular regions every chart has:
  //   chart_area = the entire chart bounding box
  //   plot_area  = the inner area where series are drawn
  optional FrameStyle chart_area_style = 27;
  optional FrameStyle plot_area_style = 28;

  // Font for the chart title (text comes from `title` above).
  optional TextStyle title_style = 29;

  // Bubble-chart modifiers (when type == CHART_BUBBLE).
  optional int32 bubble_scale_pct = 30;       // 0..300 (% of default)
  optional bool  bubble_size_represents_width = 31; // false = area (default)
  optional bool  show_neg_bubbles = 32;
  optional bool  bubble_3d = 33;

  // Title auto-deletion flag — when true, renderer must not auto-generate
  // a title from the single-series name even if `title` is empty.
  optional bool auto_title_deleted = 34;

  // 1904 epoch for date-axis numeric values. Default (false) = 1900 epoch.
  optional bool date_1904 = 35;

  // Additional 3D view angles.
  optional int32 view3d_h_pct = 36;       // height % (5..500)
  optional bool  view3d_r_ang_ax = 37;    // right-angle axes (no perspective distortion)

  // Manual layout overrides for chart frame subregions.
  optional ManualLayout title_layout = 38;
  optional ManualLayout legend_layout = 39;
  optional ManualLayout plot_layout = 40;

  // Theme context snapshot — baked at extract time so rendering is
  // independent of live theme state. Renderer uses this to assign
  // default series colors (accent1..6 cycle) and default fonts.
  optional ThemeContext theme_context = 41;

  // Line/stock chart drop-shadow overlays.
  optional UpDownBars up_down_bars = 42;
  optional HiLowLines hi_low_lines = 43;
  optional DropLines  drop_lines = 44;

  // CHART_OF_PIE specific configuration. Only meaningful when type == CHART_OF_PIE.
  optional OfPieConfig of_pie = 45;

  // ChartEx style catalog reference (c:style val="N" for 2007-2013,
  // cs:chartStyle @styleId for 2016+). 0 = no style, 1..48 = built-in
  // catalog entry. The renderer consults its baked-in style catalog
  // to resolve fills, strokes, fonts in the absence of inline overrides.
  optional int32 style_id = 46;

  // Axis label text and styling for the secondary value axis legend
  // entry (c:legendEntry > c:delete per-entry hide, rare).
  repeated int32 hidden_legend_entries = 47 [packed=true];

  // ChartEx style variant — some decks declare `c:clrMapOvr` overriding
  // the slide theme's color map inside the chart. Stored as an array of
  // 8 mapping ints (bg1,tx1,bg2,tx2,accent1..6 each resolved to theme
  // slot index). Empty array = no override.
  repeated int32 clr_map_override = 48 [packed=true];

  // Chart-level default marker (c:marker under chart type group) applied
  // when series don't set their own.
  optional Marker default_marker = 49;

  // Owning page ContentItem id. Page order and placement stay in page.pb;
  // chart.pb remains the cold/native chart model for that visible item.
  optional uint32 content_item_id = 50;

  // Forward-compatible extension bytes. Unknown future extensions can be
  // round-tripped without schema changes.
  optional bytes unknown_ext = 100;
}

message Charts {
  repeated ChartData charts = 1;

  // Schema version — increment on incompatible layout changes so the
  // renderer can fall back to a migration path.
  optional int32 schema_version = 2;

  // Deck-level theme context — when every chart shares a single theme
  // (common case), this is populated once and per-chart `theme_context`
  // is left unset to save bytes. Renderer merges deck-level with
  // per-chart (per-chart wins on collision).
  optional ThemeContext deck_theme_context = 3;

}