dataface 0.3.2.dev22__py3-none-any.whl → 0.3.2.dev111__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. dataface/__init__.py +70 -23
  2. dataface/agent_api/__init__.py +162 -68
  3. dataface/agent_api/_paths.py +9 -3
  4. dataface/agent_api/docs/yaml-reference.md +240 -106
  5. dataface/agent_api/init.py +1 -1
  6. dataface/agent_api/project_session.py +2 -1
  7. dataface/agent_api/serve.py +115 -0
  8. dataface/ai/agent.py +28 -2
  9. dataface/cli/_project.py +100 -1
  10. dataface/cli/commands/board_artifact.py +5 -2
  11. dataface/cli/commands/describe.py +7 -3
  12. dataface/cli/commands/docs.py +12 -3
  13. dataface/cli/commands/init.py +7 -14
  14. dataface/cli/commands/inspect.py +6 -1
  15. dataface/cli/commands/mcp_init.py +23 -43
  16. dataface/cli/commands/migrate.py +8 -3
  17. dataface/cli/commands/query.py +11 -8
  18. dataface/cli/commands/render.py +20 -9
  19. dataface/cli/commands/search.py +8 -2
  20. dataface/cli/commands/serve.py +26 -76
  21. dataface/cli/commands/skills_init.py +2 -19
  22. dataface/cli/commands/validate.py +7 -2
  23. dataface/cli/filesystem_project.py +5 -4
  24. dataface/cli/main.py +2 -19
  25. dataface/core/__init__.py +73 -28
  26. dataface/core/{compile/colors.py → colors.py} +20 -5
  27. dataface/core/compile/compiler.py +97 -34
  28. dataface/core/compile/data_table.py +7 -2
  29. dataface/core/compile/enrich.py +18 -44
  30. dataface/core/compile/face_warnings.py +46 -8
  31. dataface/core/compile/format.py +47 -1
  32. dataface/core/compile/inherit_graph.py +3 -3
  33. dataface/core/compile/inherit_registry.yaml +1 -1
  34. dataface/core/compile/migrations.py +112 -9
  35. dataface/core/compile/models/chart/normalized/kpi.py +0 -4
  36. dataface/core/compile/models/chart/resolved/_base.py +28 -10
  37. dataface/core/compile/models/chart/resolved/callout.py +2 -3
  38. dataface/core/compile/models/chart/resolved/kpi.py +7 -3
  39. dataface/core/compile/models/chart/resolved/table.py +16 -2
  40. dataface/core/compile/models/markers.py +1 -1
  41. dataface/core/compile/models/primitives.py +175 -2
  42. dataface/core/compile/models/source.py +5 -5
  43. dataface/core/compile/models/style/authored/__init__.py +32 -8
  44. dataface/core/compile/models/style/authored/_base.py +126 -69
  45. dataface/core/compile/models/style/authored/table.py +61 -3
  46. dataface/core/compile/models/style/resolved/__init__.py +12 -2
  47. dataface/core/compile/models/style/resolved/_base.py +142 -57
  48. dataface/core/compile/models/style/resolved/_cartesian.py +6 -11
  49. dataface/core/compile/models/style/resolved/_cascade.py +141 -54
  50. dataface/core/compile/models/style/resolved/area.py +1 -1
  51. dataface/core/compile/models/style/resolved/bar.py +1 -1
  52. dataface/core/compile/models/style/resolved/line.py +1 -1
  53. dataface/core/compile/models/style/resolved/scatter.py +3 -2
  54. dataface/core/compile/models/style/theme/__init__.py +36 -14
  55. dataface/core/compile/models/style/theme/_chart_base.py +17 -9
  56. dataface/core/compile/models/style/theme/axis.py +432 -312
  57. dataface/core/compile/models/style/theme/charts.py +10 -6
  58. dataface/core/compile/models/style/theme/kpi.py +2 -1
  59. dataface/core/compile/models/style/theme/page.py +5 -2
  60. dataface/core/compile/models/style/theme/table.py +2 -2
  61. dataface/core/compile/models/vega_lite/config.py +1 -1
  62. dataface/core/compile/normalize_charts.py +6 -2
  63. dataface/core/compile/normalize_queries.py +21 -7
  64. dataface/core/compile/resolve/__init__.py +2 -0
  65. dataface/core/compile/resolve/_axes.py +147 -44
  66. dataface/core/compile/resolve/_channels.py +1 -1
  67. dataface/core/compile/resolve/_dispatch.py +1 -1
  68. dataface/core/compile/resolve/_domain.py +49 -32
  69. dataface/core/compile/resolve/_kwargs.py +39 -12
  70. dataface/core/compile/resolve/_marks.py +8 -3
  71. dataface/core/compile/resolve/_palette.py +7 -3
  72. dataface/core/compile/resolve/_table.py +124 -33
  73. dataface/core/compile/resolve/area.py +48 -18
  74. dataface/core/compile/resolve/bar.py +245 -64
  75. dataface/core/compile/resolve/geo.py +10 -3
  76. dataface/core/compile/resolve/heatmap.py +16 -8
  77. dataface/core/compile/resolve/line.py +35 -12
  78. dataface/core/compile/resolve/pie.py +4 -1
  79. dataface/core/compile/resolve/pie_attachment.py +1 -1
  80. dataface/core/compile/resolve/scatter.py +25 -13
  81. dataface/core/compile/resolve/simple.py +25 -2
  82. dataface/core/compile/schema_renderers/prompt.py +1 -1
  83. dataface/core/compile/schema_renderers/textmate_grammar.py +8 -1
  84. dataface/core/compile/source_map.py +211 -28
  85. dataface/core/compile/style_cascade.py +126 -55
  86. dataface/core/compile/yaml_error_formatter.py +1 -1
  87. dataface/core/connections.py +10 -3
  88. dataface/core/dashboard.py +24 -18
  89. dataface/core/defaults/themes/_base.yaml +49 -39
  90. dataface/core/defaults/themes/cream.yaml +4 -4
  91. dataface/core/defaults/themes/diagnostics-title-baseline.yaml +1 -1
  92. dataface/core/defaults/themes/diagnostics-title-color-extreme.yaml +1 -1
  93. dataface/core/defaults/themes/diagnostics-title-font-extreme.yaml +1 -1
  94. dataface/core/defaults/themes/diagnostics-title-size-extreme.yaml +1 -1
  95. dataface/core/defaults/themes/diagnostics-title-weight-extreme.yaml +1 -1
  96. dataface/core/defaults/themes/editorial.yaml +6 -6
  97. dataface/core/defaults/themes/neon.yaml +15 -8
  98. dataface/core/defaults/themes/plain.yaml +6 -4
  99. dataface/core/defaults/themes/stark.yaml +16 -7
  100. dataface/core/defaults/themes/vivid.yaml +15 -8
  101. dataface/core/diagnostics/__init__.py +2 -2
  102. dataface/core/diagnostics/codes_compile.py +13 -31
  103. dataface/core/diagnostics/codes_execute.py +79 -0
  104. dataface/core/diagnostics/codes_render.py +87 -28
  105. dataface/core/diagnostics/diagnostic.py +30 -0
  106. dataface/core/diagnostics/hints.py +19 -0
  107. dataface/core/dialects/base.py +17 -0
  108. dataface/core/dialects/postgres.py +14 -0
  109. dataface/core/dialects/redshift.py +5 -0
  110. dataface/core/execute/__init__.py +59 -14
  111. dataface/core/execute/adapters/dbt_adapter.py +4 -1
  112. dataface/core/execute/adapters/dbt_adapter_factory.py +19 -0
  113. dataface/core/execute/adapters/dbt_utils.py +84 -20
  114. dataface/core/execute/adapters/postgres_connection_manager.py +48 -0
  115. dataface/core/execute/adapters/sql_adapter.py +72 -4
  116. dataface/core/execute/dbt_jinja.py +65 -10
  117. dataface/core/execute/executor.py +69 -16
  118. dataface/core/font_measure.py +28 -0
  119. dataface/core/fonts.py +8 -5
  120. dataface/core/inspect/__init__.py +46 -6
  121. dataface/core/project.py +13 -1
  122. dataface/core/render/chart/data_table_attachment.py +14 -12
  123. dataface/core/render/chart/emitters/_cartesian.py +21 -18
  124. dataface/core/render/chart/emitters/_channels.py +56 -8
  125. dataface/core/render/chart/emitters/_label_overlap.py +18 -15
  126. dataface/core/render/chart/emitters/_measured_label_padding.py +4 -4
  127. dataface/core/render/chart/emitters/area.py +3 -3
  128. dataface/core/render/chart/emitters/bar.py +60 -35
  129. dataface/core/render/chart/emitters/geo.py +8 -13
  130. dataface/core/render/chart/emitters/heatmap.py +20 -26
  131. dataface/core/render/chart/emitters/line.py +2 -2
  132. dataface/core/render/chart/emitters/scatter.py +7 -30
  133. dataface/core/render/chart/features/baseline.py +22 -9
  134. dataface/core/render/chart/features/endpoint_labels.py +55 -32
  135. dataface/core/render/chart/features/mirror_axis.py +12 -9
  136. dataface/core/render/chart/features/value_labels.py +1 -1
  137. dataface/core/render/chart/kpi.py +11 -90
  138. dataface/core/render/chart/presentation.py +6 -8
  139. dataface/core/render/chart/rendering.py +3 -12
  140. dataface/core/render/chart/session.py +10 -0
  141. dataface/core/render/chart/spec.py +3 -0
  142. dataface/core/render/chart/spec_builders.py +18 -18
  143. dataface/core/render/chart/table.py +81 -36
  144. dataface/core/render/chart/table_support.py +2 -53
  145. dataface/core/render/chart/time_unit_detect.py +3 -2
  146. dataface/core/render/chart/translate.py +82 -44
  147. dataface/core/render/chart/type_inference.py +45 -25
  148. dataface/core/render/chart/validation.py +91 -0
  149. dataface/core/render/chart/vega_lite.py +30 -11
  150. dataface/core/render/chart/vl_field_maps.py +111 -76
  151. dataface/core/render/converters/chart.py +16 -6
  152. dataface/core/render/faces.py +3 -2
  153. dataface/core/render/fonts/DFTSerifOldstyleProportional-Regular.woff2 +0 -0
  154. dataface/core/render/fonts/DFTSerifOldstyleTabular-Regular.woff2 +0 -0
  155. dataface/core/render/fonts/SOURCE_CODE_PRO_LICENSE.txt +93 -93
  156. dataface/core/render/fonts/_font_face.css +10 -0
  157. dataface/core/render/layout_sizing.py +267 -238
  158. dataface/core/render/numeral_expr.py +80 -0
  159. dataface/core/render/warnings/bar_band_width_too_narrow.py +64 -6
  160. dataface/core/render/warnings/layered_chart_shared_y_axis_scale_mismatch.py +25 -3
  161. dataface/core/render/warnings/likely_currency_or_percent_missing_formatter.py +12 -6
  162. dataface/core/render/warnings/palette_unsupported.py +6 -0
  163. dataface/core/render/warnings/pie_dominant_segment.py +1 -0
  164. dataface/core/render/warnings/pie_too_many_segments.py +1 -0
  165. dataface/core/render/warnings/point_map_out_of_projection.py +1 -0
  166. dataface/core/render/warnings/query_returned_zero_rows.py +1 -0
  167. dataface/core/render/warnings/redundant_encoding.py +20 -1
  168. dataface/core/render/warnings/registry.py +7 -3
  169. dataface/core/render/warnings/temporal_single_point.py +1 -0
  170. dataface/core/render/warnings/too_many_color_categories.py +1 -0
  171. dataface/core/render/warnings/too_many_x_categories.py +18 -2
  172. dataface/core/render/warnings/value_labels_crowd_width.py +9 -0
  173. dataface/core/render/warnings/y_encoding_mostly_null.py +1 -0
  174. dataface/core/render_format.py +18 -0
  175. dataface/core/text/format_d3.py +56 -0
  176. dataface/core/text/numeral_scale.py +218 -0
  177. dataface/core/utils.py +103 -10
  178. dataface/data/schemas/board-resolved/board-resolved.schema.json +9487 -7978
  179. dataface/data/schemas/yaml/0.3.2.json +1 -0
  180. dataface/data/schemas/yaml/manifest.json +7 -0
  181. {dataface-0.3.2.dev22.dist-info → dataface-0.3.2.dev111.dist-info}/METADATA +1 -1
  182. {dataface-0.3.2.dev22.dist-info → dataface-0.3.2.dev111.dist-info}/RECORD +185 -177
  183. {dataface-0.3.2.dev22.dist-info → dataface-0.3.2.dev111.dist-info}/WHEEL +0 -0
  184. {dataface-0.3.2.dev22.dist-info → dataface-0.3.2.dev111.dist-info}/entry_points.txt +0 -0
  185. {dataface-0.3.2.dev22.dist-info → dataface-0.3.2.dev111.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ {"$defs":{"AreaChart":{"additionalProperties":false,"description":"Authored patch for area charts.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel: bare column name only."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"data_table":{"anyOf":[{"$ref":"#/$defs/ChartDataTable"},{"type":"null"}],"description":"Optional mini data-grid attached below/above the chart."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"height":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Explicit chart height in pixels. Positive number only. When set, overrides aspect_ratio and theme cascade. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"layers":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/$defs/BarLayer"},{"$ref":"#/$defs/LineLayer"},{"$ref":"#/$defs/AreaLayer"},{"$ref":"#/$defs/ScatterLayer"}]},"type":"array"},{"type":"null"}],"description":"Typed overlay layers on this chart."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"multiples":{"anyOf":[{"$ref":"#/$defs/MultiplesConfig"},{"type":"null"}],"description":"Partition this chart into small multiples by a `rows` column (vertical stack), a `columns` column (side by side), or both (grid). Panels share one measure scale by default."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"sort":{"anyOf":[{"$ref":"#/$defs/ChartSort"},{"type":"null"}],"description":"Sort configuration: column to sort by and direction (asc/desc)."},"style":{"anyOf":[{"$ref":"#/$defs/AreaChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"Area chart type.","enum":["area"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"width":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Positive number only. Contributes to the dashboard's intrinsic width without overriding the final layout slot \u2014 the chart still fills its allocated container. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name from the query result."},"x_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the X axis."},"y":{"anyOf":[{"type":"string"},{"type":"array"},{"type":"null"}],"description":"Y-axis column name(s). Accepts a single column or list for multi-series charts."},"y_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the Y axis."}},"required":["type"],"type":"object"},"AreaChartMarksStyle":{"additionalProperties":false,"description":"Area-family mark overrides.","properties":{"area":{"$ref":"#/$defs/AreaMarkStyle","description":"Area fill mark overrides; inherits from global."},"line":{"$ref":"#/$defs/AreaLineStyle","description":"Top-edge line stroke/halo/label overrides; inherits from global."},"point":{"$ref":"#/$defs/PointMarkStyle","description":"Point-overlay mark overrides; inherits from global."}},"type":"object"},"AreaChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for AreaChartMarksStyle. Area-family mark overrides.","properties":{"area":{"anyOf":[{"$ref":"#/$defs/AreaMarkStylePatch"},{"type":"null"}],"description":"Area fill mark overrides; inherits from global."},"line":{"anyOf":[{"$ref":"#/$defs/AreaLineStylePatch"},{"type":"null"}],"description":"Top-edge line stroke/halo/label overrides; inherits from global."},"point":{"anyOf":[{"$ref":"#/$defs/PointMarkStylePatch"},{"type":"null"}],"description":"Point-overlay mark overrides; inherits from global."}},"type":"object"},"AreaChartStyle":{"additionalProperties":false,"description":"Area chart style: chart-level fields + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"endpoint_labels":{"$ref":"#/$defs/EndpointLabelsConfig","description":"Endpoint label pane configuration for area charts."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/AreaChartMarksStyle","description":"Area-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"stack":{"description":"Default stack mode for area charts: 'none', 'zero', 'normalize', or 'center'.","enum":["none","zero","normalize","center"]},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"required":["stack","endpoint_labels"],"type":"object"},"AreaChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for AreaChartStyle. Area chart style: chart-level fields + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"endpoint_labels":{"anyOf":[{"$ref":"#/$defs/EndpointLabelsConfigPatch"},{"type":"null"}],"description":"Endpoint label pane configuration for area charts."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/AreaChartMarksStylePatch"},{"type":"null"}],"description":"Area-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"stack":{"anyOf":[{"enum":["none","zero","normalize","center"]},{"type":"null"}],"description":"Default stack mode for area charts: 'none', 'zero', 'normalize', or 'center'."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"AreaLayer":{"additionalProperties":false,"description":"An area-type layer on a cartesian chart.","properties":{"axis_y":{"anyOf":[{"$ref":"#/$defs/LayerAxisYStyle"},{"type":"null"}],"description":"Y-axis settings for this layer (orientation, title)."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel for this layer: bare column name only."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Label column name for this layer."},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Query name for this layer's data (overrides chart-level query)."},"style":{"anyOf":[{"$ref":"#/$defs/AreaLayerStylePatch"},{"type":"null"}],"description":"Area layer mark style overrides."},"type":{"description":"Area mark layer.","enum":["area"]},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name for this layer."},"y":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Y-axis column name for this layer."}},"required":["type"],"type":"object"},"AreaLayerStylePatch":{"additionalProperties":false,"description":"Authored overlay for AreaLayerStyle. Required wrapper for area-layer mark overrides (built into a Patch by build_patch_model).","properties":{"marks":{"anyOf":[{"$ref":"#/$defs/AreaChartMarksStylePatch"},{"type":"null"}],"description":"Mark overrides for this area layer."}},"type":"object"},"AreaLineStyle":{"additionalProperties":false,"description":"Stroke/halo/labels for an area chart's top-edge line and value labels.","properties":{"halo_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Halo stroke width multiplier relative to stroke.width; 0 disables the halo."},"labels":{"$ref":"#/$defs/PointLabelsStyle","description":"Value label style for the area's plotted points; inherits from global."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Area top-edge line stroke style."}},"type":"object"},"AreaLineStylePatch":{"additionalProperties":false,"description":"Authored overlay for AreaLineStyle. Stroke/halo/labels for an area chart's top-edge line and value labels.","properties":{"halo_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Halo stroke width multiplier relative to stroke.width; 0 disables the halo."},"labels":{"anyOf":[{"$ref":"#/$defs/PointLabelsStylePatch"},{"type":"null"}],"description":"Value label style for the area's plotted points; inherits from global."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Area top-edge line stroke style."}},"type":"object"},"AreaMarkStyle":{"additionalProperties":false,"description":"Area mark fill opacity and shape.","properties":{"backdrop":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether to paint an opaque fill backdrop behind the area."},"curve":{"anyOf":[{"enum":["linear","monotone","natural","basis","cardinal","step","step-before","step-after"]},{"type":"null"}],"description":"Area interpolation curve, one of a fixed set: 'linear', 'monotone', 'natural', 'basis', 'cardinal', 'step', 'step-before', 'step-after'. On a categorical (nominal/ordinal) x-axis, 'step' draws a full-band-width plateau per x-value instead of VL's centered step; on a continuous (temporal/quantitative) x-axis it passes straight through to VL's native step. Applied to both the fill and its edge line (marks.line) so they trace the same path."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Area fill opacity (0\u20131)."},"stacked":{"anyOf":[{"$ref":"#/$defs/AreaStackedMarkStyle"},{"type":"null"}],"description":"Recipe override applied when the chart's stack mode is non-false: solid fill + full-perimeter background-color stroke."}},"type":"object"},"AreaMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for AreaMarkStyle. Area mark fill opacity and shape.","properties":{"backdrop":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether to paint an opaque fill backdrop behind the area."},"curve":{"anyOf":[{"enum":["linear","monotone","natural","basis","cardinal","step","step-before","step-after"]},{"type":"null"}],"description":"Area interpolation curve, one of a fixed set: 'linear', 'monotone', 'natural', 'basis', 'cardinal', 'step', 'step-before', 'step-after'. On a categorical (nominal/ordinal) x-axis, 'step' draws a full-band-width plateau per x-value instead of VL's centered step; on a continuous (temporal/quantitative) x-axis it passes straight through to VL's native step. Applied to both the fill and its edge line (marks.line) so they trace the same path."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Area fill opacity (0\u20131)."},"stacked":{"anyOf":[{"$ref":"#/$defs/AreaStackedMarkStylePatch"},{"type":"null"}],"description":"Recipe override applied when the chart's stack mode is non-false: solid fill + full-perimeter background-color stroke."}},"type":"object"},"AreaStackedMarkStyle":{"additionalProperties":false,"description":"Stacked / streamgraph area recipe override: solid fill + perimeter stroke.","properties":{"halo_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Halo stroke width multiplier for the stacked recipe; 0 disables the halo."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Area fill opacity (0\u20131) for the stacked recipe."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Perimeter stroke style for the stacked recipe."}},"type":"object"},"AreaStackedMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for AreaStackedMarkStyle. Stacked / streamgraph area recipe override: solid fill + perimeter stroke.","properties":{"halo_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Halo stroke width multiplier for the stacked recipe; 0 disables the halo."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Area fill opacity (0\u20131) for the stacked recipe."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Perimeter stroke style for the stacked recipe."}},"type":"object"},"AuthoredChart":{"allOf":[{"if":{"properties":{"type":{"enum":["bar","histogram"]}},"required":["type"]},"then":{"$ref":"#/$defs/BarChart"}},{"if":{"properties":{"type":{"enum":["line"]}},"required":["type"]},"then":{"$ref":"#/$defs/LineChart"}},{"if":{"properties":{"type":{"enum":["area"]}},"required":["type"]},"then":{"$ref":"#/$defs/AreaChart"}},{"if":{"properties":{"type":{"enum":["scatter"]}},"required":["type"]},"then":{"$ref":"#/$defs/ScatterChart"}},{"if":{"properties":{"type":{"enum":["heatmap"]}},"required":["type"]},"then":{"$ref":"#/$defs/HeatmapChart"}},{"if":{"properties":{"type":{"enum":["donut","pie"]}},"required":["type"]},"then":{"$ref":"#/$defs/PieChart"}},{"if":{"properties":{"type":{"enum":["kpi"]}},"required":["type"]},"then":{"$ref":"#/$defs/KpiChart"}},{"if":{"properties":{"type":{"enum":["table"]}},"required":["type"]},"then":{"$ref":"#/$defs/TableChart"}},{"if":{"properties":{"type":{"enum":["bubble_map","point_map"]}},"required":["type"]},"then":{"$ref":"#/$defs/PointMapChart"}},{"if":{"properties":{"type":{"enum":["geoshape","map"]}},"required":["type"]},"then":{"$ref":"#/$defs/GeoshapeChart"}},{"if":{"properties":{"type":{"enum":["callout"]}},"required":["type"]},"then":{"$ref":"#/$defs/CalloutChart"}},{"if":{"properties":{"type":{"enum":["spark_bar"]}},"required":["type"]},"then":{"$ref":"#/$defs/SparkBarChart"}}],"description":"Discriminated union of per-family chart patches. type: is mandatory; missing or unknown type raises ValidationError.","properties":{"type":{"description":"Chart family selector. One of: area, bar, bubble_map, callout, donut, geoshape, heatmap, histogram, kpi, line, map, pie, point_map, scatter, spark_bar, table.","enum":["area","bar","bubble_map","callout","donut","geoshape","heatmap","histogram","kpi","line","map","pie","point_map","scatter","spark_bar","table"]}},"required":["type"],"type":"object"},"AuthoredCompactValuesQuery":{"additionalProperties":false,"description":"Inline data authored as column names plus positional row values.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy override for this query, e.g. cache: 5m \u2014 refines the policy inherited from the source and project scopes; cache: false opts out of result caching entirely. Queries with cache: false cannot be used as {{ queries.X.cache }} upstream references."},"columns":{"description":"Column names for the compact syntax. Every compact values query also requires values.","type":"array"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description of the query. Used by AI search and tooling."},"ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Diagnostic codes to suppress for this query (e.g., ['WARN-FANOUT-RISK', 'WARN-REAGGREGATION'])."},"source":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Source name reference, or an inline file path (e.g. `./data/sales.csv`). File paths are detected by `/` or data file extension. An inline connection-bearing dict (`{type: postgres, ...}`) is rejected at compile time \u2014 reference a named source instead."},"type":{"default":"values","description":"Query adapter type.","enum":["values"]},"values":{"description":"Inline row-oriented data (list of lists) for the compact syntax. Every compact values query also requires columns.","type":"array"}},"required":["columns","values"],"type":"object"},"AuthoredHttpQuery":{"additionalProperties":false,"description":"REST API query.","properties":{"body":{"anyOf":[{"type":"object"},{"type":"string"},{"type":"null"}],"description":"HTTP request body for POST/PUT queries."},"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy override for this query, e.g. cache: 5m \u2014 refines the policy inherited from the source and project scopes; cache: false opts out of result caching entirely. Queries with cache: false cannot be used as {{ queries.X.cache }} upstream references."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description of the query. Used by AI search and tooling."},"headers":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"HTTP request headers."},"ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Diagnostic codes to suppress for this query (e.g., ['WARN-FANOUT-RISK', 'WARN-REAGGREGATION'])."},"json_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JSONPath expression to extract tabular data from the HTTP response."},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of rows returned."},"method":{"anyOf":[{"enum":["GET","POST","PUT","DELETE","PATCH"]},{"type":"null"}],"description":"HTTP method (GET, POST, PUT, DELETE, PATCH)."},"params":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"HTTP query string parameters."},"source":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Source name reference, or an inline file path (e.g. `./data/sales.csv`). File paths are detected by `/` or data file extension. An inline connection-bearing dict (`{type: postgres, ...}`) is rejected at compile time \u2014 reference a named source instead."},"type":{"default":"http","description":"Query adapter type.","enum":["http"]},"url":{"description":"HTTP endpoint URL for REST API queries.","type":"string"}},"required":["url"],"type":"object"},"AuthoredLookmlMergeQuery":{"additionalProperties":false,"description":"LookML query that merges multiple sources.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy override for this query, e.g. cache: 5m \u2014 refines the policy inherited from the source and project scopes; cache: false opts out of result caching entirely. Queries with cache: false cannot be used as {{ queries.X.cache }} upstream references."},"column_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Looker column_limit \u2014 caps wrapped-pivot columns."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description of the query. Used by AI search and tooling."},"dynamic_fields":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Looker dynamic fields: custom measures / custom dimensions synthesized into SQL. Table calculations compose as a derived wrapper query, not here."},"fields":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Qualified 'view.field' refs to select. Optional at authoring time: collected from chart channels when absent."},"filter_expression":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Looker query-level free-form boolean filter over ${view.field} refs."},"filters":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"RAW Looker filter expressions keyed by 'view.field' (e.g. \"13 months\", \"gold\") \u2014 translated to SQL predicates by likeml."},"ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Diagnostic codes to suppress for this query (e.g., ['WARN-FANOUT-RISK', 'WARN-REAGGREGATION'])."},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of rows returned."},"merge":{"description":"LookML merge sources \u2014 a list of source specs. Each is either an explore spec ({explore, fields, filters?, merge_on?}) or a query reference ({query, columns, merge_on?}) for a derived source such as a table-calc wrapper. First is the primary; each secondary's `merge_on` maps its key to the primary's. Presence of this key infers type: lookml. Compiled to a FULL OUTER JOIN via likeml.","type":"array"},"pivots":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Qualified 'view.field' refs to pivot on."},"pivots_unwrapped":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Which of Looker's two pivot SQL shapes to emit: False/None = wrapped (5-layer DENSE_RANK), True = plain GROUP BY."},"sorts":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Looker sort clauses, e.g. ['view.field', 'view.other desc']. Lowered to ORDER BY via likeml."},"source":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Source name reference, or an inline file path (e.g. `./data/sales.csv`). File paths are detected by `/` or data file extension. An inline connection-bearing dict (`{type: postgres, ...}`) is rejected at compile time \u2014 reference a named source instead."},"subtotals":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Dimension refs to subtotal via GROUP BY ROLLUP."},"total":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Looker grand-totals flag."},"type":{"default":"lookml","description":"Query adapter type.","enum":["lookml"]}},"required":["merge"],"type":"object"},"AuthoredLookmlQuery":{"additionalProperties":false,"description":"LookML query rooted at one explore.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy override for this query, e.g. cache: 5m \u2014 refines the policy inherited from the source and project scopes; cache: false opts out of result caching entirely. Queries with cache: false cannot be used as {{ queries.X.cache }} upstream references."},"column_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Looker column_limit \u2014 caps wrapped-pivot columns."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description of the query. Used by AI search and tooling."},"dynamic_fields":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Looker dynamic fields: custom measures / custom dimensions synthesized into SQL. Table calculations compose as a derived wrapper query, not here."},"explore":{"description":"LookML explore name. Presence of this key infers type: lookml. Use a merge query instead to combine multiple sources.","type":"string"},"fields":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Qualified 'view.field' refs to select. Optional at authoring time: collected from chart channels when absent."},"filter_expression":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Looker query-level free-form boolean filter over ${view.field} refs."},"filters":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"RAW Looker filter expressions keyed by 'view.field' (e.g. \"13 months\", \"gold\") \u2014 translated to SQL predicates by likeml."},"ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Diagnostic codes to suppress for this query (e.g., ['WARN-FANOUT-RISK', 'WARN-REAGGREGATION'])."},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of rows returned."},"pivots":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Qualified 'view.field' refs to pivot on."},"pivots_unwrapped":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Which of Looker's two pivot SQL shapes to emit: False/None = wrapped (5-layer DENSE_RANK), True = plain GROUP BY."},"sorts":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Looker sort clauses, e.g. ['view.field', 'view.other desc']. Lowered to ORDER BY via likeml."},"source":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Source name reference, or an inline file path (e.g. `./data/sales.csv`). File paths are detected by `/` or data file extension. An inline connection-bearing dict (`{type: postgres, ...}`) is rejected at compile time \u2014 reference a named source instead."},"subtotals":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Dimension refs to subtotal via GROUP BY ROLLUP."},"total":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Looker grand-totals flag."},"type":{"default":"lookml","description":"Query adapter type.","enum":["lookml"]}},"required":["explore"],"type":"object"},"AuthoredMetricflowQuery":{"additionalProperties":false,"description":"dbt Semantic Layer (MetricFlow) query.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy override for this query, e.g. cache: 5m \u2014 refines the policy inherited from the source and project scopes; cache: false opts out of result caching entirely. Queries with cache: false cannot be used as {{ queries.X.cache }} upstream references."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description of the query. Used by AI search and tooling."},"dimensions":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"MetricFlow dimensions to include in the result."},"ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Diagnostic codes to suppress for this query (e.g., ['WARN-FANOUT-RISK', 'WARN-REAGGREGATION'])."},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of rows returned."},"metrics":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"MetricFlow metric names to query."},"source":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Source name reference, or an inline file path (e.g. `./data/sales.csv`). File paths are detected by `/` or data file extension. An inline connection-bearing dict (`{type: postgres, ...}`) is rejected at compile time \u2014 reference a named source instead."},"time_grain":{"anyOf":[{"enum":["day","week","month","quarter","year"]},{"type":"null"}],"description":"MetricFlow time grain for time-series dimensions (day, week, month, quarter, year)."},"type":{"default":"metricflow","description":"Query adapter type.","enum":["metricflow"]},"where":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"SQL predicates over the query's MetricFlow group-by names. Literal predicates (no Jinja) bake into MetricFlow at compile time and may reference any dimension; predicates with {{ }} resolve per render and must reference a selected dimension (in dimensions: or the time_grain column)."}},"type":"object"},"AuthoredQuery":{"anyOf":[{"$ref":"#/$defs/AuthoredSqlQuery"},{"$ref":"#/$defs/AuthoredMetricflowQuery"},{"$ref":"#/$defs/AuthoredHttpQuery"},{"$ref":"#/$defs/AuthoredValuesQuery"},{"$ref":"#/$defs/AuthoredCompactValuesQuery"},{"$ref":"#/$defs/AuthoredSchemaQuery"},{"$ref":"#/$defs/AuthoredLookmlQuery"},{"$ref":"#/$defs/AuthoredLookmlMergeQuery"}],"description":"Union of per-type authored query shapes. type: is inferred from key presence when omitted (bare SQL string, sql: -> sql; metrics: -> metricflow; explore:/merge: -> lookml; url: -> http; rows:/values: -> values)."},"AuthoredSchemaQuery":{"additionalProperties":false,"description":"dbt source schema query.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy override for this query, e.g. cache: 5m \u2014 refines the policy inherited from the source and project scopes; cache: false opts out of result caching entirely. Queries with cache: false cannot be used as {{ queries.X.cache }} upstream references."},"column":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column name for schema queries."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description of the query. Used by AI search and tooling."},"ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Diagnostic codes to suppress for this query (e.g., ['WARN-FANOUT-RISK', 'WARN-REAGGREGATION'])."},"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Schema name for schema queries (YAML key: schema)."},"source":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Source name reference, or an inline file path (e.g. `./data/sales.csv`). File paths are detected by `/` or data file extension. An inline connection-bearing dict (`{type: postgres, ...}`) is rejected at compile time \u2014 reference a named source instead."},"table":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Table name for schema queries."},"type":{"default":"schema","description":"Query adapter type.","enum":["schema"]}},"type":"object"},"AuthoredSqlQuery":{"additionalProperties":false,"description":"Raw SQL query \u2014 the default query type.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy override for this query, e.g. cache: 5m \u2014 refines the policy inherited from the source and project scopes; cache: false opts out of result caching entirely. Queries with cache: false cannot be used as {{ queries.X.cache }} upstream references."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description of the query. Used by AI search and tooling."},"ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Diagnostic codes to suppress for this query (e.g., ['WARN-FANOUT-RISK', 'WARN-REAGGREGATION'])."},"setup_sql":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Non-nestable SQL preamble executed before the main query (e.g., CREATE TEMP FUNCTION)."},"source":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Source name reference, or an inline file path (e.g. `./data/sales.csv`). File paths are detected by `/` or data file extension. An inline connection-bearing dict (`{type: postgres, ...}`) is rejected at compile time \u2014 reference a named source instead."},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SQL query string. Supports Jinja2 templates referencing variables."},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"dbt target name for queries against a dbt_profile source (defaults to 'dev')."},"type":{"default":"sql","description":"Query adapter type.","enum":["sql"]}},"type":"object"},"AuthoredValuesQuery":{"additionalProperties":false,"description":"Inline data authored as a list of row mappings.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy override for this query, e.g. cache: 5m \u2014 refines the policy inherited from the source and project scopes; cache: false opts out of result caching entirely. Queries with cache: false cannot be used as {{ queries.X.cache }} upstream references."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description of the query. Used by AI search and tooling."},"ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Diagnostic codes to suppress for this query (e.g., ['WARN-FANOUT-RISK', 'WARN-REAGGREGATION'])."},"rows":{"description":"Inline data rows (list of row dicts). Use the compact columns-and-values form instead when row values are positional.","type":"array"},"source":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Source name reference, or an inline file path (e.g. `./data/sales.csv`). File paths are detected by `/` or data file extension. An inline connection-bearing dict (`{type: postgres, ...}`) is rejected at compile time \u2014 reference a named source instead."},"type":{"default":"values","description":"Query adapter type.","enum":["values"]}},"required":["rows"],"type":"object"},"AxisGridZeroStyle":{"additionalProperties":false,"description":"Zero-baseline gridline color and width overrides.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color of the zero-baseline grid line; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Width of the zero-baseline grid line in pixels; None inherits from parent axis."}},"type":"object"},"AxisGridZeroStylePatch":{"additionalProperties":false,"description":"Authored overlay for AxisGridZeroStyle. Zero-baseline gridline color and width overrides.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color of the zero-baseline grid line; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Width of the zero-baseline grid line in pixels; None inherits from parent axis."}},"type":"object"},"AxisLabelOverlapConfig":{"additionalProperties":false,"description":"Two-bool overlap strategy enablement for x-axis labels.","properties":{"skip":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Enable temporal label thinning; ignored on categorical axes; None inherits from parent axis."},"tilt":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Enable label tilt strategy; None inherits from parent axis."}},"type":"object"},"AxisLabelOverlapConfigPatch":{"additionalProperties":false,"description":"Authored overlay for AxisLabelOverlapConfig. Two-bool overlap strategy enablement for x-axis labels.","properties":{"skip":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Enable temporal label thinning; ignored on categorical axes; None inherits from parent axis."},"tilt":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Enable label tilt strategy; None inherits from parent axis."}},"type":"object"},"AxisLabelStyle":{"additionalProperties":false,"description":"Axis label: font + padding + VL-passthrough.","properties":{"align":{"anyOf":[{"enum":["left","right","center","inward","outward"]},{"type":"null"}],"description":"Horizontal text alignment of labels. 'left'/'right'/'center' are absolute. 'inward' hugs the plot (own-side: left on a left axis, right on a right axis); 'outward' hugs away from the plot (Vega-Lite's default growth direction). inward/outward are a no-op on an axis with no left/right edge. None uses Vega-Lite's default."},"angle":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Label rotation angle in degrees; None uses Vega-Lite's default."},"bound":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"null"}],"description":"Hide labels that overflow the axis range; None uses Vega-Lite's default."},"expr":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom Vega expression for label text; None uses smart temporal defaults when applicable."},"flush":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"null"}],"description":"Align first/last label flush with the scale range; None uses Vega-Lite's default."},"font":{"$ref":"#/$defs/FontStyle","description":"Axis element font style overrides. Unset fields fall back to `style.charts.font`."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick value format string; None uses auto-format."},"max_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum label width in pixels; None uses Vega-Lite's default (180px)."},"min_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum pixel gap between labels; None uses Vega-Lite's default (0px)."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pixel offset of the label from its tick anchor; None uses Vega-Lite's default."},"overlap":{"anyOf":[{"$ref":"#/$defs/AxisLabelOverlapConfig"},{"type":"null"}],"description":"Label overlap strategy enablement. None inherits from the theme cascade. Set individual bools to enable/disable; the resolver applies them in fixed order skip\u2192tilt. On bucketed temporal axes, skip thins label visibility to a coarser calendar period without changing the axis or label time unit."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between axis labels and ticks in pixels; None inherits from parent axis."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show axis labels; None uses Vega-Lite's default (labels shown)."}},"type":"object"},"AxisLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for AxisLabelStyle. Axis label: font + padding + VL-passthrough.","properties":{"align":{"anyOf":[{"enum":["left","right","center","inward","outward"]},{"type":"null"}],"description":"Horizontal text alignment of labels. 'left'/'right'/'center' are absolute. 'inward' hugs the plot (own-side: left on a left axis, right on a right axis); 'outward' hugs away from the plot (Vega-Lite's default growth direction). inward/outward are a no-op on an axis with no left/right edge. None uses Vega-Lite's default."},"angle":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Label rotation angle in degrees; None uses Vega-Lite's default."},"bound":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"null"}],"description":"Hide labels that overflow the axis range; None uses Vega-Lite's default."},"expr":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom Vega expression for label text; None uses smart temporal defaults when applicable."},"flush":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"null"}],"description":"Align first/last label flush with the scale range; None uses Vega-Lite's default."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Axis element font style overrides. Unset fields fall back to `style.charts.font`."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick value format string; None uses auto-format."},"max_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum label width in pixels; None uses Vega-Lite's default (180px)."},"min_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum pixel gap between labels; None uses Vega-Lite's default (0px)."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pixel offset of the label from its tick anchor; None uses Vega-Lite's default."},"overlap":{"anyOf":[{"$ref":"#/$defs/AxisLabelOverlapConfigPatch"},{"type":"null"}],"description":"Label overlap strategy enablement. None inherits from the theme cascade. Set individual bools to enable/disable; the resolver applies them in fixed order skip\u2192tilt. On bucketed temporal axes, skip thins label visibility to a coarser calendar period without changing the axis or label time unit."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between axis labels and ticks in pixels; None inherits from parent axis."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show axis labels; None uses Vega-Lite's default (labels shown)."}},"type":"object"},"AxisLineStyle":{"additionalProperties":false,"description":"Axis domain/baseline line style. Renamed from ``AxisDomainStyle`` \u2014","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Domain line color; None uses Vega-Lite's default."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the axis domain line; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Domain line width in pixels; None uses Vega-Lite's default."}},"type":"object"},"AxisLineStylePatch":{"additionalProperties":false,"description":"Authored overlay for AxisLineStyle. Axis domain/baseline line style. Renamed from ``AxisDomainStyle`` \u2014","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Domain line color; None uses Vega-Lite's default."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the axis domain line; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Domain line width in pixels; None uses Vega-Lite's default."}},"type":"object"},"AxisMirrorStyle":{"additionalProperties":false,"description":"Per-edge label override for the mirrored ``axis_y.mirror`` ghost axis.","properties":{"expr":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom Vega expression for the mirrored edge's label text; None reuses the primary axis's label expression."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick value format string for the mirrored edge; None reuses the primary axis's format."}},"type":"object"},"AxisTicksStyle":{"additionalProperties":false,"description":"Universal tick config. ``step``-anchored cadence needs a named time","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick color; None uses Vega-Lite's default."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Target number of axis ticks. On a quantitative axis the renderer computes explicit tickValues so VL emits exactly this many ticks \u2014 VL's tickCount is advisory and frequently ignored there. On a temporal axis_x, count is passed through as VL's axis.tickCount, which VL's time-scale tick logic honours as a target."},"length":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tick length in pixels; None uses Vega-Lite's default."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pixel offset of ticks from their default position; None means no offset."},"step":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Step multiple for a step-anchored tick cadence (e.g. on DimensionTicksStyle: time_unit: year, step: 5 -> ticks every 5 years). Inert on this base class alone \u2014 a channel that wants step-anchored cadence adds the unit field (DimensionTicksStyle.time_unit)."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show axis ticks; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tick stroke width in pixels; None uses Vega-Lite's default."}},"type":"object"},"AxisTicksStylePatch":{"additionalProperties":false,"description":"Authored overlay for AxisTicksStyle. Universal tick config. ``step``-anchored cadence needs a named time","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick color; None uses Vega-Lite's default."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Target number of axis ticks. On a quantitative axis the renderer computes explicit tickValues so VL emits exactly this many ticks \u2014 VL's tickCount is advisory and frequently ignored there. On a temporal axis_x, count is passed through as VL's axis.tickCount, which VL's time-scale tick logic honours as a target."},"length":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tick length in pixels; None uses Vega-Lite's default."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pixel offset of ticks from their default position; None means no offset."},"step":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Step multiple for a step-anchored tick cadence (e.g. on DimensionTicksStyle: time_unit: year, step: 5 -> ticks every 5 years). Inert on this base class alone \u2014 a channel that wants step-anchored cadence adds the unit field (DimensionTicksStyle.time_unit)."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show axis ticks; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tick stroke width in pixels; None uses Vega-Lite's default."}},"type":"object"},"AxisTitleStyle":{"additionalProperties":false,"description":"Axis title typography \u2014 deliberately thin. A title is one short static","properties":{"align":{"anyOf":[{"enum":["left","right","center","inward","outward"]},{"type":"null"}],"description":"Horizontal text alignment of the title. 'left'/'right'/'center' are absolute. 'inward'/'outward' resolve against the axis's own left/right edge, same as label.align; a no-op on an axis with no left/right edge. None uses Vega-Lite's default."},"angle":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Title rotation angle in degrees; None uses Vega-Lite's default."},"font":{"$ref":"#/$defs/FontStyle","description":"Axis title font style overrides. Unset fields fall back to `style.charts.font`."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between axis title and labels in pixels; None uses Vega-Lite's default."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the axis title; None uses Vega-Lite's default (title shown)."}},"type":"object"},"AxisTitleStylePatch":{"additionalProperties":false,"description":"Authored overlay for AxisTitleStyle. Axis title typography \u2014 deliberately thin. A title is one short static","properties":{"align":{"anyOf":[{"enum":["left","right","center","inward","outward"]},{"type":"null"}],"description":"Horizontal text alignment of the title. 'left'/'right'/'center' are absolute. 'inward'/'outward' resolve against the axis's own left/right edge, same as label.align; a no-op on an axis with no left/right edge. None uses Vega-Lite's default."},"angle":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Title rotation angle in degrees; None uses Vega-Lite's default."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Axis title font style overrides. Unset fields fall back to `style.charts.font`."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between axis title and labels in pixels; None uses Vega-Lite's default."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the axis title; None uses Vega-Lite's default (title shown)."}},"type":"object"},"AxisXStyle":{"additionalProperties":false,"description":"Dimension/category-time axis style. Theme slot: axis_x.","properties":{"fill":{"description":"Fill for synthesized missing-bucket rows: null, zero, linear, step-after / step-before / step-center (Looker step), or curve (smoothstep).","enum":["null","zero","linear","step-after","step-before","step-center","curve"]},"fiscal_year_start_month":{"description":"Calendar month (1=Jan..12=Dec) that opens a fiscal year/quarter for year/yearquarter bucketing; theme default 1 is the calendar convention (Q1=Jan-Mar). A non-default value always wins over axis_x.type: temporal for year/yearquarter grains - Vega-Lite's native timeUnit transform has no fiscal-offset concept and would otherwise silently discard the offset.","type":"integer"},"grid":{"$ref":"#/$defs/BaseAxisGridStyle","description":"Grid line style for this axis."},"labels":{"$ref":"#/$defs/DimensionLabelStyle","description":"Dimension axis label style."},"line":{"$ref":"#/$defs/AxisLineStyle","description":"Domain line style for this axis."},"position":{"anyOf":[{"enum":["top","bottom"]},{"type":"null"}],"description":"X-axis position; None uses Vega-Lite's default (bottom)."},"scale":{"anyOf":[{"$ref":"#/$defs/XScaleStyle"},{"type":"null"}],"description":"X-axis scale overrides including x_reverse; None means no override."},"ticks":{"$ref":"#/$defs/DimensionTicksStyle","description":"Dimension axis tick style."},"time_unit":{"anyOf":[{"enum":["auto","year","yearquarter","yearmonth","yearweek","yearmonthdate","monthofyear","dayofweek","dayofmonth","dayofyear","hourofday","none"]},{"type":"null"}],"description":"Time-unit bucketing for temporal x-axes; None or 'auto' auto-detects from data."},"title":{"$ref":"#/$defs/AxisTitleStyle","description":"Axis title style."},"type":{"anyOf":[{"enum":["auto","ordinal","temporal"]},{"type":"null"}],"description":"Scale type for bucketed-time x-axes; None/'auto' infers from time_unit grain."}},"required":["fill","fiscal_year_start_month"],"type":"object"},"AxisXStylePatch":{"additionalProperties":false,"description":"Authored overlay for AxisXStyle. Dimension/category-time axis style. Theme slot: axis_x.","properties":{"fill":{"anyOf":[{"enum":["null","zero","linear","step-after","step-before","step-center","curve"]},{"type":"null"}],"description":"Fill for synthesized missing-bucket rows: null, zero, linear, step-after / step-before / step-center (Looker step), or curve (smoothstep)."},"fiscal_year_start_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Calendar month (1=Jan..12=Dec) that opens a fiscal year/quarter for year/yearquarter bucketing; theme default 1 is the calendar convention (Q1=Jan-Mar). A non-default value always wins over axis_x.type: temporal for year/yearquarter grains - Vega-Lite's native timeUnit transform has no fiscal-offset concept and would otherwise silently discard the offset."},"grid":{"anyOf":[{"$ref":"#/$defs/BaseAxisGridStylePatch"},{"type":"null"}],"description":"Grid line style for this axis."},"labels":{"anyOf":[{"$ref":"#/$defs/DimensionLabelStylePatch"},{"type":"null"}],"description":"Dimension axis label style."},"line":{"anyOf":[{"$ref":"#/$defs/AxisLineStylePatch"},{"type":"null"}],"description":"Domain line style for this axis."},"position":{"anyOf":[{"enum":["top","bottom"]},{"type":"null"}],"description":"X-axis position; None uses Vega-Lite's default (bottom)."},"scale":{"anyOf":[{"$ref":"#/$defs/XScaleStylePatch"},{"type":"null"}],"description":"X-axis scale overrides including x_reverse; None means no override."},"ticks":{"anyOf":[{"$ref":"#/$defs/DimensionTicksStylePatch"},{"type":"null"}],"description":"Dimension axis tick style."},"time_unit":{"anyOf":[{"enum":["auto","year","yearquarter","yearmonth","yearweek","yearmonthdate","monthofyear","dayofweek","dayofmonth","dayofyear","hourofday","none"]},{"type":"null"}],"description":"Time-unit bucketing for temporal x-axes; None or 'auto' auto-detects from data."},"title":{"anyOf":[{"$ref":"#/$defs/AxisTitleStylePatch"},{"type":"null"}],"description":"Axis title style."},"type":{"anyOf":[{"enum":["auto","ordinal","temporal"]},{"type":"null"}],"description":"Scale type for bucketed-time x-axes; None/'auto' infers from time_unit grain."}},"type":"object"},"AxisYStyle":{"additionalProperties":false,"description":"Measure axis style. Theme slot: axis_y.","properties":{"grid":{"$ref":"#/$defs/MeasureGridStyle","description":"Measure axis grid style (includes zero-baseline override)."},"labels":{"$ref":"#/$defs/AxisLabelStyle","description":"Axis label style."},"line":{"$ref":"#/$defs/AxisLineStyle","description":"Domain line style for this axis."},"mirror":{"anyOf":[{"$ref":"#/$defs/AxisMirrorStyle"},{"type":"boolean"},{"type":"null"}],"description":"Draw the y-scale on both left and right edges (wide charts). true mirrors the primary axis's label verbatim; an object (format/expr) relabels only the mirrored edge \u2014 e.g. a percent-of-total right axis next to an absolute-value left axis \u2014 while ticks stay aligned to the single shared scale. Only meaningful on axis_y."},"position":{"anyOf":[{"enum":["left","right","auto"]},{"type":"null"}],"description":"Y-axis position; auto flips when endpoint labels are on the right."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Per-axis scale overrides; None means no override."},"ticks":{"$ref":"#/$defs/AxisTicksStyle","description":"Tick mark style for this axis."},"title":{"$ref":"#/$defs/AxisTitleStyle","description":"Axis title style."}},"type":"object"},"AxisYStylePatch":{"additionalProperties":false,"description":"Authored overlay for AxisYStyle. Measure axis style. Theme slot: axis_y.","properties":{"grid":{"anyOf":[{"$ref":"#/$defs/MeasureGridStylePatch"},{"type":"null"}],"description":"Measure axis grid style (includes zero-baseline override)."},"labels":{"anyOf":[{"$ref":"#/$defs/AxisLabelStylePatch"},{"type":"null"}],"description":"Axis label style."},"line":{"anyOf":[{"$ref":"#/$defs/AxisLineStylePatch"},{"type":"null"}],"description":"Domain line style for this axis."},"mirror":{"anyOf":[{"$ref":"#/$defs/AxisMirrorStyle"},{"type":"boolean"},{"type":"null"}],"description":"Draw the y-scale on both left and right edges (wide charts). true mirrors the primary axis's label verbatim; an object (format/expr) relabels only the mirrored edge \u2014 e.g. a percent-of-total right axis next to an absolute-value left axis \u2014 while ticks stay aligned to the single shared scale. Only meaningful on axis_y."},"position":{"anyOf":[{"enum":["left","right","auto"]},{"type":"null"}],"description":"Y-axis position; auto flips when endpoint labels are on the right."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Per-axis scale overrides; None means no override."},"ticks":{"anyOf":[{"$ref":"#/$defs/AxisTicksStylePatch"},{"type":"null"}],"description":"Tick mark style for this axis."},"title":{"anyOf":[{"$ref":"#/$defs/AxisTitleStylePatch"},{"type":"null"}],"description":"Axis title style."}},"type":"object"},"BandAxisStylePatch":{"additionalProperties":false,"description":"Authored overlay for BandAxisStyle. Scale-type overlay for band (categorical) axes. Theme slot: axis_band.","properties":{"band_position":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Band position within the step (0\u20131); None uses Vega-Lite's default."},"grid":{"anyOf":[{"$ref":"#/$defs/BaseAxisGridStylePatch"},{"type":"null"}],"description":"Grid line style for this axis."},"labels":{"anyOf":[{"$ref":"#/$defs/AxisLabelStylePatch"},{"type":"null"}],"description":"Axis label style."},"line":{"anyOf":[{"$ref":"#/$defs/AxisLineStylePatch"},{"type":"null"}],"description":"Domain line style for this axis."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Per-axis scale overrides; None means no override."},"ticks":{"anyOf":[{"$ref":"#/$defs/AxisTicksStylePatch"},{"type":"null"}],"description":"Tick mark style for this axis."},"title":{"anyOf":[{"$ref":"#/$defs/AxisTitleStylePatch"},{"type":"null"}],"description":"Axis title style."}},"type":"object"},"BarChart":{"additionalProperties":false,"description":"Authored patch for bar and histogram charts.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel: bare column name only."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"data_table":{"anyOf":[{"$ref":"#/$defs/ChartDataTable"},{"type":"null"}],"description":"Optional mini data-grid attached below/above the chart."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"height":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Explicit chart height in pixels. Positive number only. When set, overrides aspect_ratio and theme cascade. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"layers":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/$defs/BarLayer"},{"$ref":"#/$defs/LineLayer"},{"$ref":"#/$defs/AreaLayer"},{"$ref":"#/$defs/ScatterLayer"}]},"type":"array"},{"type":"null"}],"description":"Typed overlay layers on this chart."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"multiples":{"anyOf":[{"$ref":"#/$defs/MultiplesConfig"},{"type":"null"}],"description":"Partition this chart into small multiples by a `rows` column (vertical stack), a `columns` column (side by side), or both (grid). Panels share one measure scale by default."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"sort":{"anyOf":[{"$ref":"#/$defs/ChartSort"},{"type":"null"}],"description":"Sort configuration: column to sort by and direction (asc/desc)."},"style":{"anyOf":[{"$ref":"#/$defs/BarChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"Bar or histogram chart type.","enum":["bar","histogram"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"width":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Positive number only. Contributes to the dashboard's intrinsic width without overriding the final layout slot \u2014 the chart still fills its allocated container. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name from the query result."},"x_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the X axis."},"y":{"anyOf":[{"type":"string"},{"type":"array"},{"type":"null"}],"description":"Y-axis column name(s). Accepts a single column or list for multi-series charts."},"y_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the Y axis."}},"required":["type"],"type":"object"},"BarChartMarksStyle":{"additionalProperties":false,"description":"Bar-family mark overrides. Only bar and text (endpoint labels) are valid.","properties":{"bar":{"$ref":"#/$defs/BarMarkStyle","description":"Bar mark overrides for bar charts; inherits from global."},"text":{"$ref":"#/$defs/TextMarkStyle","description":"Text mark overrides for bar endpoint labels; inherits from global."}},"type":"object"},"BarChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for BarChartMarksStyle. Bar-family mark overrides. Only bar and text (endpoint labels) are valid.","properties":{"bar":{"anyOf":[{"$ref":"#/$defs/BarMarkStylePatch"},{"type":"null"}],"description":"Bar mark overrides for bar charts; inherits from global."},"text":{"anyOf":[{"$ref":"#/$defs/TextMarkStylePatch"},{"type":"null"}],"description":"Text mark overrides for bar endpoint labels; inherits from global."}},"type":"object"},"BarChartStyle":{"additionalProperties":false,"description":"Bar chart style: chart-level fields + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"endpoint_labels":{"$ref":"#/$defs/EndpointLabelsConfig","description":"Endpoint label pane configuration for bar charts."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/BarChartMarksStyle","description":"Bar-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"orientation":{"anyOf":[{"enum":["horizontal","vertical","auto"]},{"type":"null"}],"description":"Preferred bar orientation; None uses the renderer default (vertical)."},"overlap":{"anyOf":[{"enum":["auto","none","flush","partial","full"]},{"type":"number"},{"type":"null"}],"description":"Within-group spacing for grouped bars. Keywords: 'auto' (2 series \u2192 partial, 3+ \u2192 none), 'none' (small gap), 'flush' (bars touch), 'partial' (25% overlap), 'full' (bars coincide). Or a number as a fraction of bar width: >0 overlaps, 0 touches, <0 gaps; 1 is the maximum (bars fully coincide, same as 'full') and values above 1 are clamped to 1 \u2014 bars never cross past each other. None uses the renderer default ('auto'). Only applies to grouped bars; setting it together with an active stack mode is an error."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"stack":{"description":"Default stack mode for bar charts; none renders side-by-side columns.","enum":["none","zero","normalize","center"]},"stack_order":{"anyOf":[{"enum":["value","data","alphabetical"]},{"type":"null"}],"description":"Z-order of stacked segments. None/'value' puts the largest aggregate at baseline. 'data' follows SQL row order (orientation-stable not guaranteed). 'alphabetical' sorts by color column name. Ignored when stacking is off or no color."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"required":["stack","endpoint_labels"],"type":"object"},"BarChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for BarChartStyle. Bar chart style: chart-level fields + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"endpoint_labels":{"anyOf":[{"$ref":"#/$defs/EndpointLabelsConfigPatch"},{"type":"null"}],"description":"Endpoint label pane configuration for bar charts."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/BarChartMarksStylePatch"},{"type":"null"}],"description":"Bar-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"orientation":{"anyOf":[{"enum":["horizontal","vertical","auto"]},{"type":"null"}],"description":"Preferred bar orientation; None uses the renderer default (vertical)."},"overlap":{"anyOf":[{"enum":["auto","none","flush","partial","full"]},{"type":"number"},{"type":"null"}],"description":"Within-group spacing for grouped bars. Keywords: 'auto' (2 series \u2192 partial, 3+ \u2192 none), 'none' (small gap), 'flush' (bars touch), 'partial' (25% overlap), 'full' (bars coincide). Or a number as a fraction of bar width: >0 overlaps, 0 touches, <0 gaps; 1 is the maximum (bars fully coincide, same as 'full') and values above 1 are clamped to 1 \u2014 bars never cross past each other. None uses the renderer default ('auto'). Only applies to grouped bars; setting it together with an active stack mode is an error."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"stack":{"anyOf":[{"enum":["none","zero","normalize","center"]},{"type":"null"}],"description":"Default stack mode for bar charts; none renders side-by-side columns."},"stack_order":{"anyOf":[{"enum":["value","data","alphabetical"]},{"type":"null"}],"description":"Z-order of stacked segments. None/'value' puts the largest aggregate at baseline. 'data' follows SQL row order (orientation-stable not guaranteed). 'alphabetical' sorts by color column name. Ignored when stacking is off or no color."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"BarLabelsStyle":{"additionalProperties":false,"description":"Bar mark value-label config. Extends MarkLabelsStyle with bar-specific positions.","properties":{"dx":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Horizontal pixel offset for value labels; overrides the position default."},"dy":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Vertical pixel offset for value labels; overrides the position default."},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column to source label text from; None uses the chart's y-field."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Value label font style (color, size, family, etc.)."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Number format string for value labels."},"position":{"anyOf":[{"enum":["above","top","middle","middle_aligned","bottom"]},{"type":"null"}],"description":"Label position relative to the bar. 'above' places labels above the bar top (outside). 'top' places labels just inside the top edge. 'middle' centers labels vertically in the bar. 'middle_aligned' centers all labels at a common height (mean of bar heights / 2). 'bottom' places labels just inside the bottom edge."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show numeric value labels on each mark; False by default."}},"type":"object"},"BarLabelsStylePatch":{"additionalProperties":false,"description":"Authored overlay for BarLabelsStyle. Bar mark value-label config. Extends MarkLabelsStyle with bar-specific positions.","properties":{"dx":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Horizontal pixel offset for value labels; overrides the position default."},"dy":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Vertical pixel offset for value labels; overrides the position default."},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column to source label text from; None uses the chart's y-field."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Value label font style (color, size, family, etc.)."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Number format string for value labels."},"position":{"anyOf":[{"enum":["above","top","middle","middle_aligned","bottom"]},{"type":"null"}],"description":"Label position relative to the bar. 'above' places labels above the bar top (outside). 'top' places labels just inside the top edge. 'middle' centers labels vertically in the bar. 'middle_aligned' centers all labels at a common height (mean of bar heights / 2). 'bottom' places labels just inside the bottom edge."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show numeric value labels on each mark; False by default."}},"type":"object"},"BarLayer":{"additionalProperties":false,"description":"A bar-type layer on a cartesian chart.","properties":{"axis_y":{"anyOf":[{"$ref":"#/$defs/LayerAxisYStyle"},{"type":"null"}],"description":"Y-axis settings for this layer (orientation, title)."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel for this layer: bare column name only."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Label column name for this layer."},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Query name for this layer's data (overrides chart-level query)."},"style":{"anyOf":[{"$ref":"#/$defs/BarLayerStylePatch"},{"type":"null"}],"description":"Bar layer mark style overrides."},"type":{"description":"Bar mark layer.","enum":["bar"]},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name for this layer."},"y":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Y-axis column name for this layer."}},"required":["type"],"type":"object"},"BarLayerStylePatch":{"additionalProperties":false,"description":"Authored overlay for BarLayerStyle. Required wrapper for bar-layer mark overrides (built into a Patch by build_patch_model).","properties":{"marks":{"anyOf":[{"$ref":"#/$defs/BarChartMarksStylePatch"},{"type":"null"}],"description":"Mark overrides for this bar layer."}},"type":"object"},"BarMarkStyle":{"additionalProperties":false,"description":"Bar mark geometry and stroke. Chart-level bar fields live on BarChartStyle.","properties":{"band_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bar width as a fraction of the band step (0\u20131)."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStyle"},{"type":"null"}],"description":"Bar border style (color/width also serve as the bar stroke)."},"labels":{"$ref":"#/$defs/BarLabelsStyle","description":"Value label style for bar marks."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding around bar marks in pixels."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bar width in pixels (fixed-width mode)."},"total_label":{"$ref":"#/$defs/BarTotalLabelStyle","description":"Stack total label style. Only takes effect on stacked bar charts; ignored otherwise."}},"type":"object"},"BarMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for BarMarkStyle. Bar mark geometry and stroke. Chart-level bar fields live on BarChartStyle.","properties":{"band_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bar width as a fraction of the band step (0\u20131)."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Bar border style (color/width also serve as the bar stroke)."},"labels":{"anyOf":[{"$ref":"#/$defs/BarLabelsStylePatch"},{"type":"null"}],"description":"Value label style for bar marks."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding around bar marks in pixels."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bar width in pixels (fixed-width mode)."},"total_label":{"anyOf":[{"$ref":"#/$defs/BarTotalLabelStylePatch"},{"type":"null"}],"description":"Stack total label style. Only takes effect on stacked bar charts; ignored otherwise."}},"type":"object"},"BarTotalLabelStyle":{"additionalProperties":false,"description":"Stack total label style for bar marks.","properties":{"dx":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Horizontal pixel offset for stack total labels."},"dy":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Vertical pixel offset for stack total labels."},"font":{"$ref":"#/$defs/FontStyle","description":"Stack total label font style overrides; cascade fills missing fields from charts.font. Unset fields fall back to `style.charts.font`."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Number format string for stack total labels."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show stack total labels above each bar stack. Only takes effect on stacked bar charts; ignored otherwise."}},"type":"object"},"BarTotalLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for BarTotalLabelStyle. Stack total label style for bar marks.","properties":{"dx":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Horizontal pixel offset for stack total labels."},"dy":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Vertical pixel offset for stack total labels."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Stack total label font style overrides; cascade fills missing fields from charts.font. Unset fields fall back to `style.charts.font`."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Number format string for stack total labels."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show stack total labels above each bar stack. Only takes effect on stacked bar charts; ignored otherwise."}},"type":"object"},"BaseAxisGridStyle":{"additionalProperties":false,"description":"Grid line style for all axis variants.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Grid line color; None uses Vega-Lite's default."},"dash":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Dash pattern for grid lines; None renders a solid line."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Grid line opacity; None uses Vega-Lite's default."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show grid lines; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Grid line width in pixels; None uses Vega-Lite's default."}},"type":"object"},"BaseAxisGridStylePatch":{"additionalProperties":false,"description":"Authored overlay for BaseAxisGridStyle. Grid line style for all axis variants.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Grid line color; None uses Vega-Lite's default."},"dash":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Dash pattern for grid lines; None renders a solid line."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Grid line opacity; None uses Vega-Lite's default."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show grid lines; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Grid line width in pixels; None uses Vega-Lite's default."}},"type":"object"},"BaseAxisStyle":{"additionalProperties":false,"description":"Universal axis surface \u2014 grid/line/ticks/labels/title/scale.","properties":{"grid":{"$ref":"#/$defs/BaseAxisGridStyle","description":"Grid line style for this axis."},"labels":{"$ref":"#/$defs/AxisLabelStyle","description":"Axis label style."},"line":{"$ref":"#/$defs/AxisLineStyle","description":"Domain line style for this axis."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Per-axis scale overrides; None means no override."},"ticks":{"$ref":"#/$defs/AxisTicksStyle","description":"Tick mark style for this axis."},"title":{"$ref":"#/$defs/AxisTitleStyle","description":"Axis title style."}},"type":"object"},"BaseAxisStylePatch":{"additionalProperties":false,"description":"Authored overlay for BaseAxisStyle. Universal axis surface \u2014 grid/line/ticks/labels/title/scale.","properties":{"grid":{"anyOf":[{"$ref":"#/$defs/BaseAxisGridStylePatch"},{"type":"null"}],"description":"Grid line style for this axis."},"labels":{"anyOf":[{"$ref":"#/$defs/AxisLabelStylePatch"},{"type":"null"}],"description":"Axis label style."},"line":{"anyOf":[{"$ref":"#/$defs/AxisLineStylePatch"},{"type":"null"}],"description":"Domain line style for this axis."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Per-axis scale overrides; None means no override."},"ticks":{"anyOf":[{"$ref":"#/$defs/AxisTicksStylePatch"},{"type":"null"}],"description":"Tick mark style for this axis."},"title":{"anyOf":[{"$ref":"#/$defs/AxisTitleStylePatch"},{"type":"null"}],"description":"Axis title style."}},"type":"object"},"BaseScaleStyle":{"additionalProperties":false,"description":"Universal + continuous-only scale config.","properties":{"clamp":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Clamp values to scale domain; None uses Vega-Lite's default (no clamping)."},"continuous":{"anyOf":[{"$ref":"#/$defs/ScaleContinuousStyle"},{"type":"null"}],"description":"Continuous-scale overrides (type, domain, zero, log/pow/symlog params); None means no override."},"headroom":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Fractional breathing room at measure-axis edges, exact (never nice-rounded). Zero-anchored axes (bar; line/area/scatter near zero): domain_max = data_max * (1 + headroom). Zoomed axes (line/area/scatter far from zero): both edges expand \u2014 domain_max = data_max + headroom * span; domain_min = data_min - headroom * span. None inherits the theme default; 0 disables headroom. Ignored with an explicit `domain` or `stack: normalize`."},"nice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Round scale domain to nice values; None uses Vega-Lite's default."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Unified scale padding shortcut; dispatches to band, point, or continuous padding per scale type."},"round":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Round scale outputs to nearest integer; None uses Vega-Lite's default (no rounding)."},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit tick values; None uses Vega-Lite's auto tick values."}},"type":"object"},"BaseScaleStylePatch":{"additionalProperties":false,"description":"Authored overlay for BaseScaleStyle. Universal + continuous-only scale config.","properties":{"clamp":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Clamp values to scale domain; None uses Vega-Lite's default (no clamping)."},"continuous":{"anyOf":[{"$ref":"#/$defs/ScaleContinuousStylePatch"},{"type":"null"}],"description":"Continuous-scale overrides (type, domain, zero, log/pow/symlog params); None means no override."},"headroom":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Fractional breathing room at measure-axis edges, exact (never nice-rounded). Zero-anchored axes (bar; line/area/scatter near zero): domain_max = data_max * (1 + headroom). Zoomed axes (line/area/scatter far from zero): both edges expand \u2014 domain_max = data_max + headroom * span; domain_min = data_min - headroom * span. None inherits the theme default; 0 disables headroom. Ignored with an explicit `domain` or `stack: normalize`."},"nice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Round scale domain to nice values; None uses Vega-Lite's default."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Unified scale padding shortcut; dispatches to band, point, or continuous padding per scale type."},"round":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Round scale outputs to nearest integer; None uses Vega-Lite's default (no rounding)."},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit tick values; None uses Vega-Lite's auto tick values."}},"type":"object"},"BasemapConfig":{"additionalProperties":false,"description":"Styled geographic background layer for point_map and bubble_map charts.","properties":{"fill":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fill color for geographic boundary overlay."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Named geographic boundary source (e.g. 'us-states') for overlay rendering."},"stroke":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stroke color for geographic boundary overlay."}},"type":"object"},"BasemapStyle":{"additionalProperties":false,"description":"Background map layer for geo charts (especially point maps).","properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Background topo source identifier; None means no base layer."}},"type":"object"},"BasemapStylePatch":{"additionalProperties":false,"description":"Authored overlay for BasemapStyle. Background map layer for geo charts (especially point maps).","properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Background topo source identifier; None means no base layer."}},"type":"object"},"BigQuerySourceConfig":{"additionalProperties":false,"description":"BigQuery source configuration.","properties":{"api_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"BigQuery API endpoint override."},"attribution":{"description":"Cost-attribution pairs sent with every query against this source, e.g. attribution: {team: analytics}. Emitted as BigQuery job labels and as a query comment elsewhere. Keys and values must match BigQuery's label rules ([a-z][a-z0-9_-]{0,62} / [a-z0-9_-]{0,63}); the dft_ prefix is reserved for the engine's own identity.","type":"object"},"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth client identifier."},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth client secret."},"compute_region":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dataproc compute region."},"dataproc_batch":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Dataproc batch configuration."},"dataproc_cluster_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dataproc cluster name."},"dataset":{"description":"BigQuery dataset name (equivalent to schema).","type":"string"},"execution_project":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"GCP project billed for BigQuery execution."},"gcs_bucket":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cloud Storage bucket for Dataproc submission."},"impersonate_service_account":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Service account to impersonate for BigQuery jobs."},"job_creation_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Timeout in seconds while creating a BigQuery job."},"job_execution_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Timeout in seconds while executing a BigQuery job."},"job_retries":{"default":1,"description":"Number of BigQuery job retry attempts (dbt accepts retries as an input alias).","type":"integer"},"job_retry_deadline_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Deadline in seconds for retrying a BigQuery job."},"keyfile":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Path to service account JSON key file."},"keyfile_json":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Inline service account JSON dict."},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dataset location (e.g. US, EU)."},"lookml_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relative path to the directory of .lkml files backing this source's models."},"max_query_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum execution time for one query in seconds. Overrides execution.max_query_duration_seconds for this source."},"maximum_bytes_billed":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum bytes a BigQuery job may bill."},"method":{"anyOf":[{"enum":["oauth","oauth-secrets","service-account","service-account-json","external-oauth-wif"]},{"type":"null"}],"description":"dbt-bigquery authentication method. Inferred from keyfile/keyfile_json when omitted: 'service-account-json' if keyfile_json set, 'service-account' if keyfile set, 'oauth' (Application Default Credentials) otherwise."},"models":{"additionalProperties":{"$ref":"#/$defs/LookMLModelConfig"},"description":"Named LookML model collections nested under this source.","type":"object"},"priority":{"anyOf":[{"enum":["interactive","batch"]},{"type":"null"}],"description":"BigQuery job priority."},"project":{"description":"GCP project ID.","type":"string"},"quota_project":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"GCP project used for quota attribution."},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth refresh token."},"scopes":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"OAuth scopes requested for BigQuery credentials."},"service_account_impersonation_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Service-account impersonation endpoint URL."},"submission_method":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"dbt-bigquery Dataproc submission method."},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth access token."},"token_endpoint":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"OAuth token endpoint configuration."},"token_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth token endpoint URI."},"type":{"description":"Source type identifier.","enum":["bigquery"]},"workload_pool_provider_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workload identity pool provider resource path."}},"required":["type","project","dataset"],"type":"object"},"BlockMarginStyle":{"additionalProperties":false,"description":"Top and bottom margin for a prose block role, in line-height units.","properties":{"margin_bottom":{"description":"Space below the block, in line-height units (lh \u00d7 font_size \u00d7 value).","type":"number"},"margin_top":{"description":"Space above the block, in line-height units (lh \u00d7 font_size \u00d7 value).","type":"number"}},"required":["margin_top","margin_bottom"],"type":"object"},"BlockMarginStylePatch":{"additionalProperties":false,"description":"Authored overlay for BlockMarginStyle. Top and bottom margin for a prose block role, in line-height units.","properties":{"margin_bottom":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Space below the block, in line-height units (lh \u00d7 font_size \u00d7 value)."},"margin_top":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Space above the block, in line-height units (lh \u00d7 font_size \u00d7 value)."}},"type":"object"},"BoardStyle":{"additionalProperties":false,"description":"Face-level structural dimensions. Do NOT cascade to child faces.","properties":{"card_gap":{"description":"Gap between cards in pixels.","type":"number"},"card_padding":{"description":"Padding added to each card side in pixels.","type":"number"},"margin":{"description":"Board outer margin in pixels.","type":"number"},"min_height":{"description":"Minimum board height in pixels.","type":"number"},"width":{"description":"Maximum dashboard width in pixels. Caps the measured layout width, setting the board's proportions. Rendered as an on-screen pixel maximum everywhere except the dft HTML page (dft serve, dft render --format html), which scales the board to its container.","type":"number"}},"required":["width","min_height","margin","card_padding","card_gap"],"type":"object"},"BoardStylePatch":{"additionalProperties":false,"description":"Authored overlay for BoardStyle. Face-level structural dimensions. Do NOT cascade to child faces.","properties":{"card_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between cards in pixels."},"card_padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding added to each card side in pixels."},"margin":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Board outer margin in pixels."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum board height in pixels."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum dashboard width in pixels. Caps the measured layout width, setting the board's proportions. Rendered as an on-screen pixel maximum everywhere except the dft HTML page (dft serve, dft render --format html), which scales the board to its container."}},"type":"object"},"BorderStyle":{"additionalProperties":false,"description":"Box border \u2014 all fields required. Produced by cascade from theme YAML.","properties":{"color":{"description":"Border color as a CSS color string.","type":"string"},"radius":{"description":"Border corner radius in pixels.","type":"number"},"width":{"description":"Border width in pixels.","type":"number"}},"required":["width","color","radius"],"type":"object"},"BorderStylePatch":{"additionalProperties":false,"description":"Box border. Does NOT cascade (ADR-003: box properties reset per level).","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Border color (CSS color string)."},"radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Border corner radius in pixels."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Border width in pixels."}},"type":"object"},"CachePatch":{"additionalProperties":false,"description":"Cache policy at one scope: cache: 1h / forever / true / false (the only opt-out).","properties":{"ttl":{"anyOf":[{"enum":["forever"]},{"type":"string"},{"type":"null"}],"description":"Expire cached results after this wall-clock age (lazy: the next read recomputes). Short-duration string: units s/m/h/d/w, m = minutes, compound allowed ('1h30m'). Omit to inherit from the parent scope; write 'forever' to override an inherited ttl with never-auto-expire (manual refresh always remains available)."}},"type":"object"},"CalloutChart":{"additionalProperties":false,"description":"Static callout/message chart. Minimal \u2014 no chrome, no styling, no query.","properties":{"message":{"description":"Static message content.","type":"string"},"style":{"anyOf":[{"$ref":"#/$defs/CalloutChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides (tone)."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional chart title shown above the message."},"type":{"description":"Callout chart type.","enum":["callout"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."}},"required":["type","message"],"type":"object"},"CalloutChartStyle":{"additionalProperties":false,"description":"Chart-family style for ``type: callout`` charts and runtime chart-error fallback cards.","properties":{"background":{"description":"Callout card background color (info.bg default).","type":"string"},"border":{"$ref":"#/$defs/BorderStyle","description":"Callout card border style."},"message":{"$ref":"#/$defs/CalloutElementStyle","description":"Callout message element style."},"padding":{"$ref":"#/$defs/PaddingStyle","description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"description":"Preferred callout width in pixels.","type":"number"},"section_gap":{"description":"Vertical gap between callout title and message in pixels.","type":"number"},"title":{"$ref":"#/$defs/CalloutElementStyle","description":"Callout title element style."},"tone":{"description":"Semantic tone for palette-role lookup (info | positive | negative | warning).","enum":["positive","negative","warning","info"]}},"required":["preferred_width","tone","background","border","padding","section_gap","title","message"],"type":"object"},"CalloutChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for CalloutChartStyle. Chart-family style for ``type: callout`` charts and runtime chart-error fallback cards.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Callout card background color (info.bg default)."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Callout card border style."},"message":{"anyOf":[{"$ref":"#/$defs/CalloutElementStylePatch"},{"type":"null"}],"description":"Callout message element style."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred callout width in pixels."},"section_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical gap between callout title and message in pixels."},"title":{"anyOf":[{"$ref":"#/$defs/CalloutElementStylePatch"},{"type":"null"}],"description":"Callout title element style."},"tone":{"anyOf":[{"enum":["positive","negative","warning","info"]},{"type":"null"}],"description":"Semantic tone for palette-role lookup (info | positive | negative | warning)."}},"type":"object"},"CalloutElementStyle":{"additionalProperties":false,"description":"Font + y_offset for a callout title or message.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Element font style overrides. Unset fields fall back to `style.charts.font`."},"y_offset":{"description":"Vertical offset from the element's anchor in pixels.","type":"number"}},"required":["y_offset"],"type":"object"},"CalloutElementStylePatch":{"additionalProperties":false,"description":"Authored overlay for CalloutElementStyle. Font + y_offset for a callout title or message.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Element font style overrides. Unset fields fall back to `style.charts.font`."},"y_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical offset from the element's anchor in pixels."}},"type":"object"},"CategoricalColorStyle":{"additionalProperties":false,"description":"Categorical palette config: per-series colors and single-series ink list.","properties":{"palette":{"anyOf":[{"type":"array"},{"type":"string"},{"type":"null"}],"description":"Categorical color palette: list of stops or a named palette. Expanded to list[str] at validation time."},"single_series_palette":{"anyOf":[{"type":"array"},{"type":"string"},{"type":"null"}],"description":"Ordered list of single-series mark inks (must be non-empty when set), or a palette name."}},"type":"object"},"CategoricalColorStylePatch":{"additionalProperties":false,"description":"Authored overlay for CategoricalColorStyle. Categorical palette config: per-series colors and single-series ink list.","properties":{"palette":{"anyOf":[{"type":"array"},{"type":"string"},{"type":"null"}],"description":"Categorical color palette: list of stops or a named palette. Expanded to list[str] at validation time."},"single_series_palette":{"anyOf":[{"type":"array"},{"type":"string"},{"type":"null"}],"description":"Ordered list of single-series mark inks (must be non-empty when set), or a palette name."}},"type":"object"},"ChartDataTable":{"anyOf":[{"additionalProperties":false,"description":"Container for a chart's data_table block.","properties":{"entries":{"description":"List of data-table entries (source, aggregate, or per-series rows).","items":{"anyOf":[{"$ref":"#/$defs/ChartDataTableSource"},{"$ref":"#/$defs/ChartDataTableAggregate"},{"$ref":"#/$defs/ChartDataTablePerSeries"}]},"type":"array"}},"required":["entries"],"type":"object"},{"items":{"anyOf":[{"$ref":"#/$defs/ChartDataTableSource"},{"$ref":"#/$defs/ChartDataTableAggregate"},{"$ref":"#/$defs/ChartDataTablePerSeries"}]},"minItems":1,"type":"array"}]},"ChartDataTableAggregate":{"additionalProperties":false,"description":"A data_table row that reads an aggregate of a column grouped by x.","properties":{"aggregate":{"description":"Aggregate operation applied per x-group. One of: sum, avg, min, max, median, count, count_distinct. Exact names only \u2014 no aliases (spec G4).","enum":["sum","avg","min","max","median","count","count_distinct"]},"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"D3 format string or format config object for the aggregated value. Optional."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column header label override for this row."},"source":{"description":"Query column being aggregated. Always required alongside `aggregate:` (spec G2).","type":"string"}},"required":["aggregate","source"],"type":"object"},"ChartDataTablePerSeries":{"additionalProperties":false,"description":"A data_table entry that expands into one row per color: series.","properties":{"by_measure":{"default":false,"description":"When True, expand one row reading the named measure field directly (no color: groupby). Required for multi-y charts where each measure is its own y-field rather than a color-encoded series.","type":"boolean"},"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"D3 format string or format config object. Optional."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Row label displayed in the strip's label gutter. When None and by_measure=True, the per_series column name is used. Has no effect when by_measure=False (series name is the label)."},"per_series":{"description":"Query column the row reads from (per-x, per-series value).","type":"string"}},"required":["per_series"],"type":"object"},"ChartDataTableSource":{"additionalProperties":false,"description":"A data_table row that reads a column's raw per-x value.","properties":{"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"D3 format string or format config object. Optional; inherits the chart measure format when omitted and source matches chart.y."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Left-stub row label. Optional."},"source":{"description":"Query column the row reads from (per-x raw value).","type":"string"}},"required":["source"],"type":"object"},"ChartRef":{"additionalProperties":false,"description":"Cross-file chart reference. Bare string is coerced automatically.","properties":{"ref":{"description":"Reference path: '<file>.charts.<name>'. May start with one or more '../' segments to reach a sibling directory. A bare string value is coerced automatically.","type":"string"}},"required":["ref"],"type":"object"},"ChartSort":{"additionalProperties":false,"description":"Chart-level sort configuration for categorical axes.","properties":{"by":{"description":"Column name to sort by.","type":"string"},"order":{"default":"asc","description":"Sort direction (asc or desc).","enum":["asc","desc"]}},"required":["by"],"type":"object"},"ChartTotal":{"additionalProperties":false,"description":"Donut center total \u2014 auto-rendered sum at the center of a donut, with author override.","properties":{"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"Number format (D3 spec, preset, or FormatConfig)."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Caption text displayed below the center total value."},"visible":{"default":true,"description":"Whether to render the donut center total. Defaults True; set False to suppress the auto-rendered center on donuts whose theta values aren't a meaningful sum (e.g. pre-aggregated percentage shares).","type":"boolean"}},"type":"object"},"ChartsStyle":{"additionalProperties":false,"description":"Registry of all chart-type styles plus shared chart configuration.","properties":{"animation_duration":{"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`.","type":"number"},"area":{"$ref":"#/$defs/AreaChartStyle","description":"Area chart style."},"aspect_ratio":{"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`.","type":"number"},"axis":{"$ref":"#/$defs/BaseAxisStyle","description":"Shared axis style applied to all axes before per-axis overrides."},"axis_quantitative":{"$ref":"#/$defs/QuantitativeAxisStyle","description":"Quantitative axis style overrides applied after axis_x/axis_y. Unset fields fall back to style.charts.axis."},"axis_x":{"$ref":"#/$defs/AxisXStyle","description":"X-axis style overrides applied after the shared axis. Unset fields fall back to style.charts.axis."},"axis_y":{"$ref":"#/$defs/AxisYStyle","description":"Y-axis style overrides applied after the shared axis. Unset fields fall back to style.charts.axis."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart canvas background; None inherits from the board background via apply_inherit. Falls back to `style.background`."},"bar":{"$ref":"#/$defs/BarChartStyle","description":"Bar chart style."},"border":{"$ref":"#/$defs/BorderStyle","description":"Chart card border style."},"callout":{"$ref":"#/$defs/CalloutChartStyle","description":"Callout chart-family style for type:callout and runtime fallback cards."},"color":{"$ref":"#/$defs/ColorStyle","description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"dashes":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Ordered list of Vega-Lite strokeDash arrays for line-family categorical encoding; None disables dash emission."},"data_table":{"$ref":"#/$defs/DataTableStyle","description":"Attached data_table strip style."},"default_chart_height":{"description":"Fallback chart height in pixels when aspect-ratio sizing is unavailable.","type":"number"},"default_table_height":{"description":"Placeholder table height in pixels; replaced by data-aware row-count sizing at render time.","type":"number"},"font":{"$ref":"#/$defs/FontStyle","description":"Chart-level font overrides. Unset fields fall back to `style.font`."},"geoshape":{"$ref":"#/$defs/GeoshapeChartStyle","description":"Geoshape (choropleth) chart style."},"heatmap":{"$ref":"#/$defs/HeatmapChartStyle","description":"Heatmap chart style."},"histogram":{"$ref":"#/$defs/HistogramChartStyle","description":"Histogram chart style."},"kpi":{"$ref":"#/$defs/KpiChartStyle","description":"KPI card chart style."},"label_usable_ratio":{"description":"Fraction of chart width usable for axis labels (0\u20131); labels are tilted when full labels exceed this width.","type":"number"},"legend":{"$ref":"#/$defs/LegendStyle","description":"Chart legend style."},"line":{"$ref":"#/$defs/LineChartStyle","description":"Line chart style."},"marks":{"$ref":"#/$defs/GlobalMarksStyle","description":"Global mark defaults (tier-1 of the marks cascade)."},"max_height":{"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`.","type":"number"},"min_height":{"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`.","type":"number"},"padding":{"$ref":"#/$defs/PaddingStyle","description":"Per-chart-type padding override; 4 sides in pixels."},"pie":{"$ref":"#/$defs/PieChartStyle","description":"Pie/donut chart style."},"point_map":{"$ref":"#/$defs/PointMapChartStyle","description":"Point map chart style."},"preferred_width":{"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`.","type":"number"},"scatter":{"$ref":"#/$defs/ScatterChartStyle","description":"Scatter chart style."},"series_label":{"$ref":"#/$defs/SeriesLabelStyle","description":"Shared series-label typography for endpoint and stack labels."},"spark_bar":{"$ref":"#/$defs/SparkBarChartStyle","description":"Spark_bar (full-chart horizontal bar) style."},"table":{"$ref":"#/$defs/TableChartStyle","description":"Table chart style."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStyle"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"$ref":"#/$defs/TooltipStyle","description":"Chart tooltip style."},"view":{"$ref":"#/$defs/ViewStyle","description":"Vega-Lite view dimensions and border."}},"required":["preferred_width","aspect_ratio","min_height","max_height","padding","border","animation_duration","legend","tooltip","color","default_chart_height","default_table_height","label_usable_ratio","axis","axis_x","axis_y","axis_quantitative","view","bar","line","area","scatter","histogram","heatmap","geoshape","point_map","pie","series_label","kpi","table","spark_bar","data_table","callout"],"type":"object"},"ChartsStylePatch":{"additionalProperties":false,"description":"Authored overlay for ChartsStyle. Registry of all chart-type styles plus shared chart configuration.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"area":{"anyOf":[{"$ref":"#/$defs/AreaChartStylePatch"},{"type":"null"}],"description":"Area chart style."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Shared axis style applied to all axes before per-axis overrides."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Quantitative axis style overrides applied after axis_x/axis_y. Unset fields fall back to style.charts.axis."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"X-axis style overrides applied after the shared axis. Unset fields fall back to style.charts.axis."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Y-axis style overrides applied after the shared axis. Unset fields fall back to style.charts.axis."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart canvas background; None inherits from the board background via apply_inherit. Falls back to `style.background`."},"bar":{"anyOf":[{"$ref":"#/$defs/BarChartStylePatch"},{"type":"null"}],"description":"Bar chart style."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"callout":{"anyOf":[{"$ref":"#/$defs/CalloutChartStylePatch"},{"type":"null"}],"description":"Callout chart-family style for type:callout and runtime fallback cards."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"dashes":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Ordered list of Vega-Lite strokeDash arrays for line-family categorical encoding; None disables dash emission."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Attached data_table strip style."},"default_chart_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Fallback chart height in pixels when aspect-ratio sizing is unavailable."},"default_table_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Placeholder table height in pixels; replaced by data-aware row-count sizing at render time."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides. Unset fields fall back to `style.font`."},"geoshape":{"anyOf":[{"$ref":"#/$defs/GeoshapeChartStylePatch"},{"type":"null"}],"description":"Geoshape (choropleth) chart style."},"heatmap":{"anyOf":[{"$ref":"#/$defs/HeatmapChartStylePatch"},{"type":"null"}],"description":"Heatmap chart style."},"histogram":{"anyOf":[{"$ref":"#/$defs/HistogramChartStylePatch"},{"type":"null"}],"description":"Histogram chart style."},"kpi":{"anyOf":[{"$ref":"#/$defs/KpiChartStylePatch"},{"type":"null"}],"description":"KPI card chart style."},"label_usable_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Fraction of chart width usable for axis labels (0\u20131); labels are tilted when full labels exceed this width."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"line":{"anyOf":[{"$ref":"#/$defs/LineChartStylePatch"},{"type":"null"}],"description":"Line chart style."},"marks":{"anyOf":[{"$ref":"#/$defs/GlobalMarksStylePatch"},{"type":"null"}],"description":"Global mark defaults (tier-1 of the marks cascade)."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels."},"pie":{"anyOf":[{"$ref":"#/$defs/PieChartStylePatch"},{"type":"null"}],"description":"Pie/donut chart style."},"point_map":{"anyOf":[{"$ref":"#/$defs/PointMapChartStylePatch"},{"type":"null"}],"description":"Point map chart style."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scatter":{"anyOf":[{"$ref":"#/$defs/ScatterChartStyle"},{"type":"null"}],"description":"Scatter chart style."},"series_label":{"anyOf":[{"$ref":"#/$defs/SeriesLabelStylePatch"},{"type":"null"}],"description":"Shared series-label typography for endpoint and stack labels."},"spark_bar":{"anyOf":[{"$ref":"#/$defs/SparkBarChartStylePatch"},{"type":"null"}],"description":"Spark_bar (full-chart horizontal bar) style."},"table":{"anyOf":[{"$ref":"#/$defs/TableChartStylePatch"},{"type":"null"}],"description":"Table chart style."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Chart tooltip style."},"view":{"anyOf":[{"$ref":"#/$defs/ViewStylePatch"},{"type":"null"}],"description":"Vega-Lite view dimensions and border."}},"type":"object"},"CircleMarkStyle":{"additionalProperties":false,"description":"Circle mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Mark stroke style; None means not overridden at this level."}},"type":"object"},"CircleMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for CircleMarkStyle. Circle mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Mark stroke style; None means not overridden at this level."}},"type":"object"},"ColorStyle":{"additionalProperties":false,"description":"Unified chart color config: static paint, categorical palette, gradient scale.","properties":{"categorical":{"anyOf":[{"$ref":"#/$defs/CategoricalColorStyle"},{"type":"null"}],"description":"Categorical color and single-series palette config."},"gradient":{"anyOf":[{"$ref":"#/$defs/ScaleTargetConfig"},{"type":"null"}],"description":"Continuous gradient scale for the color encoding."},"static":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Static mark color override."}},"type":"object"},"ColorStylePatch":{"additionalProperties":false,"description":"Authored overlay for ColorStyle. Unified chart color config: static paint, categorical palette, gradient scale.","properties":{"categorical":{"anyOf":[{"$ref":"#/$defs/CategoricalColorStylePatch"},{"type":"null"}],"description":"Categorical color and single-series palette config."},"gradient":{"anyOf":[{"$ref":"#/$defs/ScaleTargetConfigPatch"},{"type":"null"}],"description":"Continuous gradient scale for the color encoding."},"static":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Static mark color override."}},"type":"object"},"ColumnScaleConfig":{"additionalProperties":false,"description":"Scale-based continuous color mapping for a table column.","properties":{"background":{"anyOf":[{"$ref":"#/$defs/ScaleTargetConfig"},{"type":"null"}],"description":"Continuous background color mapping for this column."},"color":{"anyOf":[{"$ref":"#/$defs/ScaleTargetConfig"},{"type":"null"}],"description":"Continuous text color mapping for this column."}},"type":"object"},"ConditionalRule":{"additionalProperties":false,"description":"A single conditional formatting rule.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cell background color applied when the rule matches."},"between":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Match rows where the column value falls in [low, high] (inclusive)."},"default":{"anyOf":[{"enum":[true]},{"type":"null"}],"description":"Catch-all rule that matches any row not matched by earlier rules. Must be the last entry."},"eq":{"description":"Match rows where the column value equals this value."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Font style overrides (color, weight, style, decoration) applied when the rule matches."},"glyph":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Glyph character prepended to the cell value when the rule matches."},"glyph_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color for the glyph when the rule matches. Requires glyph to be set."},"gt":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Match rows where the column value is greater than this number."},"gte":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Match rows where the column value is greater than or equal to this number."},"in":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Match rows where the column value is in this list."},"is_null":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Match null rows (true) or non-null rows (false)."},"lt":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Match rows where the column value is less than this number."},"lte":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Match rows where the column value is less than or equal to this number."},"ne":{"description":"Match rows where the column value does not equal this value."},"tone":{"anyOf":[{"enum":["positive","negative","warning","info"]},{"type":"null"}],"description":"Semantic tone (positive|negative|warning|info) that colors the glyph via the theme's tone palette \u2014 the preferred, theme-adaptive alternative to a raw glyph_color. Requires glyph. Explicit glyph_color wins."}},"type":"object"},"CsvSourceConfig":{"additionalProperties":false,"description":"CSV file source configuration.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"delimiter":{"default":",","description":"Field delimiter character.","type":"string"},"encoding":{"default":"utf-8","description":"File encoding.","type":"string"},"files":{"description":"Mapping of table_name \u2192 file path. Each key is the SQL table name; the value is the path relative to the project root. Required and must not be empty.","type":"object"},"type":{"description":"Source type identifier.","enum":["csv"]}},"required":["type","files"],"type":"object"},"DataTableLabelStyle":{"additionalProperties":false,"description":"Row label styling.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Row label font style overrides. Unset fields fall back to `style.charts.data_table.font`."}},"type":"object"},"DataTableLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for DataTableLabelStyle. Row label styling.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Row label font style overrides. Unset fields fall back to `style.charts.data_table.font`."}},"type":"object"},"DataTableRowPaddingStyle":{"additionalProperties":false,"properties":{"horizontal":{"description":"Horizontal (left/right) padding inside data_table rows in pixels.","type":"number"},"vertical":{"description":"Vertical (top/bottom) padding inside data_table rows in pixels.","type":"number"}},"required":["vertical","horizontal"],"type":"object"},"DataTableRowPaddingStylePatch":{"additionalProperties":false,"description":"Authored overlay for DataTableRowPaddingStyle.","properties":{"horizontal":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Horizontal (left/right) padding inside data_table rows in pixels."},"vertical":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical (top/bottom) padding inside data_table rows in pixels."}},"type":"object"},"DataTableRowStyle":{"additionalProperties":false,"properties":{"padding":{"$ref":"#/$defs/DataTableRowPaddingStyle","description":"Row padding style."},"rule":{"$ref":"#/$defs/RuleStyle","description":"Row bottom rule style."}},"required":["padding","rule"],"type":"object"},"DataTableRowStylePatch":{"additionalProperties":false,"description":"Authored overlay for DataTableRowStyle.","properties":{"padding":{"anyOf":[{"$ref":"#/$defs/DataTableRowPaddingStylePatch"},{"type":"null"}],"description":"Row padding style."},"rule":{"anyOf":[{"$ref":"#/$defs/RuleStylePatch"},{"type":"null"}],"description":"Row bottom rule style."}},"type":"object"},"DataTableStyle":{"additionalProperties":false,"description":"Attached data_table style. Lives at style.charts.data_table.*.","properties":{"divider":{"$ref":"#/$defs/RuleStyle","description":"Rule at the boundary between the chart plot and the data strip. For position='bottom': rule sits above the strip (below the axis). For position='top': rule sits below the strip rows (above the plot top)."},"font":{"$ref":"#/$defs/FontStyle","description":"Data_table font style overrides. Unset fields fall back to `style.charts.font`."},"label":{"$ref":"#/$defs/DataTableLabelStyle","description":"Row label (series name) style."},"label_max_lines":{"description":"Number of x-axis label lines to reserve in the axis gap (only used for position='bottom'; ignored for position='top'). Typically 1 or 2.","type":"integer"},"padding_bottom":{"description":"Padding below the last strip row in pixels. For position='bottom': space below the last row. For position='top': gap between the last row and the plot top edge.","type":"number"},"padding_top":{"description":"Padding above the topmost strip row in pixels. For position='bottom': gap between axis labels and the first row. For position='top': space above the topmost row (outer edge of strip).","type":"number"},"position":{"description":"Strip placement relative to the chart plot. 'top' places the strip above the plot (no x-axis gap needed); 'bottom' places it below with the x-axis between plot and strip.","enum":["top","bottom"]},"row":{"$ref":"#/$defs/DataTableRowStyle","description":"Data_table row padding and rule style."}},"required":["divider","row","label","padding_top","padding_bottom","label_max_lines","position"],"type":"object"},"DataTableStylePatch":{"additionalProperties":false,"description":"Authored overlay for DataTableStyle. Attached data_table style. Lives at style.charts.data_table.*.","properties":{"divider":{"anyOf":[{"$ref":"#/$defs/RuleStylePatch"},{"type":"null"}],"description":"Rule at the boundary between the chart plot and the data strip. For position='bottom': rule sits above the strip (below the axis). For position='top': rule sits below the strip rows (above the plot top)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Data_table font style overrides. Unset fields fall back to `style.charts.font`."},"label":{"anyOf":[{"$ref":"#/$defs/DataTableLabelStylePatch"},{"type":"null"}],"description":"Row label (series name) style."},"label_max_lines":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of x-axis label lines to reserve in the axis gap (only used for position='bottom'; ignored for position='top'). Typically 1 or 2."},"padding_bottom":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding below the last strip row in pixels. For position='bottom': space below the last row. For position='top': gap between the last row and the plot top edge."},"padding_top":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding above the topmost strip row in pixels. For position='bottom': gap between axis labels and the first row. For position='top': space above the topmost row (outer edge of strip)."},"position":{"anyOf":[{"enum":["top","bottom"]},{"type":"null"}],"description":"Strip placement relative to the chart plot. 'top' places the strip above the plot (no x-axis gap needed); 'bottom' places it below with the x-axis between plot and strip."},"row":{"anyOf":[{"$ref":"#/$defs/DataTableRowStylePatch"},{"type":"null"}],"description":"Data_table row padding and rule style."}},"type":"object"},"DbtProfileSourceConfig":{"additionalProperties":false,"description":"Reference to a dbt profile.","properties":{"attribution":{"description":"Cost-attribution pairs sent with every query against this source, e.g. attribution: {team: analytics}. Emitted as BigQuery job labels and as a query comment elsewhere. Keys and values must match BigQuery's label rules ([a-z][a-z0-9_-]{0,62} / [a-z0-9_-]{0,63}); the dft_ prefix is reserved for the engine's own identity.","type":"object"},"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"profile":{"description":"dbt profile name from profiles.yml.","type":"string"},"profiles_dir":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Directory containing profiles.yml, relative to the dataface project root. Use when profiles.yml is in a subdirectory (e.g. services/dbt). Resolution order: profiles_dir \u2192 $DBT_PROFILES_DIR \u2192 project root \u2192 ~/.dbt."},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"dbt target to use; defaults to the profile's default target."},"type":{"description":"Source type identifier.","enum":["dbt_profile"]}},"required":["type","profile"],"type":"object"},"DetailsArrowFontStyle":{"additionalProperties":false,"description":"Font style for the expand/collapse arrow glyph.","properties":{"size":{"description":"Font size of the arrow glyph in pixels.","type":"number"}},"required":["size"],"type":"object"},"DetailsArrowFontStylePatch":{"additionalProperties":false,"description":"Authored overlay for DetailsArrowFontStyle. Font style for the expand/collapse arrow glyph.","properties":{"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Font size of the arrow glyph in pixels."}},"type":"object"},"DetailsArrowStyle":{"additionalProperties":false,"description":"Layout and font style for the expand/collapse arrow chevron.","properties":{"font":{"$ref":"#/$defs/DetailsArrowFontStyle","description":"Arrow glyph font style."},"x":{"description":"X position of the arrow in pixels.","type":"number"}},"required":["x","font"],"type":"object"},"DetailsArrowStylePatch":{"additionalProperties":false,"description":"Authored overlay for DetailsArrowStyle. Layout and font style for the expand/collapse arrow chevron.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/DetailsArrowFontStylePatch"},{"type":"null"}],"description":"Arrow glyph font style."},"x":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"X position of the arrow in pixels."}},"type":"object"},"DetailsStyle":{"additionalProperties":false,"properties":{"arrow":{"$ref":"#/$defs/DetailsArrowStyle","description":"Expand/collapse arrow glyph layout and font style."},"border":{"$ref":"#/$defs/BorderStyle","description":"Details element border style."},"content_y_offset":{"description":"Y offset of the expanded details content area in pixels.","type":"number"},"font":{"$ref":"#/$defs/FontStyle","description":"Details summary font style overrides. Unset fields fall back to `style.font`."},"label_x":{"description":"X position of the details summary label text in pixels.","type":"number"},"summary_height":{"description":"Height of the details summary (collapsed) row in pixels.","type":"number"},"text_baseline_offset":{"description":"Vertical offset to align SVG details text baseline in pixels.","type":"number"}},"required":["summary_height","border","arrow","label_x","text_baseline_offset","content_y_offset"],"type":"object"},"DetailsStylePatch":{"additionalProperties":false,"description":"Authored overlay for DetailsStyle.","properties":{"arrow":{"anyOf":[{"$ref":"#/$defs/DetailsArrowStylePatch"},{"type":"null"}],"description":"Expand/collapse arrow glyph layout and font style."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Details element border style."},"content_y_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Y offset of the expanded details content area in pixels."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Details summary font style overrides. Unset fields fall back to `style.font`."},"label_x":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"X position of the details summary label text in pixels."},"summary_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Height of the details summary (collapsed) row in pixels."},"text_baseline_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical offset to align SVG details text baseline in pixels."}},"type":"object"},"DimensionLabelStyle":{"additionalProperties":false,"description":"AxisLabelStyle + dimension-axis-only label fields.","properties":{"align":{"anyOf":[{"enum":["left","right","center","inward","outward"]},{"type":"null"}],"description":"Horizontal text alignment of labels. 'left'/'right'/'center' are absolute. 'inward' hugs the plot (own-side: left on a left axis, right on a right axis); 'outward' hugs away from the plot (Vega-Lite's default growth direction). inward/outward are a no-op on an axis with no left/right edge. None uses Vega-Lite's default."},"angle":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Label rotation angle in degrees; None uses Vega-Lite's default."},"bound":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"null"}],"description":"Hide labels that overflow the axis range; None uses Vega-Lite's default."},"expr":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom Vega expression for label text; None uses smart temporal defaults when applicable."},"flush":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"null"}],"description":"Align first/last label flush with the scale range; None uses Vega-Lite's default."},"font":{"$ref":"#/$defs/FontStyle","description":"Axis element font style overrides. Unset fields fall back to `style.charts.font`."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick value format string; None uses auto-format."},"max_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum label width in pixels; None uses Vega-Lite's default (180px)."},"min_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum pixel gap between labels; None uses Vega-Lite's default (0px)."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pixel offset of the label from its tick anchor; None uses Vega-Lite's default."},"overlap":{"anyOf":[{"$ref":"#/$defs/AxisLabelOverlapConfig"},{"type":"null"}],"description":"Label overlap strategy enablement. None inherits from the theme cascade. Set individual bools to enable/disable; the resolver applies them in fixed order skip\u2192tilt. On bucketed temporal axes, skip thins label visibility to a coarser calendar period without changing the axis or label time unit."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between axis labels and ticks in pixels; None inherits from parent axis."},"tilt_increments":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Descending tilt angles for label overlap resolution on discrete x-axes; None disables tilt."},"time_unit":{"anyOf":[{"enum":["auto","year","yearquarter","yearmonth","yearweek","yearmonthdate","monthofyear","dayofweek","dayofmonth","dayofyear","hourofday","none"]},{"type":"null"}],"description":"Label cadence for temporal axes; None inherits from the parent axis time_unit."},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Dates to keep label text on, chosen from among the axis's ticks (whatever axis_x.values or the auto-fill cadence already produced) \u2014 this filters which ticks show text, it does not add or remove ticks. Every tick not in this list keeps its position and gridline but has its label blanked. Set axis_x.values separately to change tick/grid density itself. Temporal x-axes only; None labels every tick as usual."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show axis labels; None uses Vega-Lite's default (labels shown)."}},"type":"object"},"DimensionLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for DimensionLabelStyle. AxisLabelStyle + dimension-axis-only label fields.","properties":{"align":{"anyOf":[{"enum":["left","right","center","inward","outward"]},{"type":"null"}],"description":"Horizontal text alignment of labels. 'left'/'right'/'center' are absolute. 'inward' hugs the plot (own-side: left on a left axis, right on a right axis); 'outward' hugs away from the plot (Vega-Lite's default growth direction). inward/outward are a no-op on an axis with no left/right edge. None uses Vega-Lite's default."},"angle":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Label rotation angle in degrees; None uses Vega-Lite's default."},"bound":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"null"}],"description":"Hide labels that overflow the axis range; None uses Vega-Lite's default."},"expr":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom Vega expression for label text; None uses smart temporal defaults when applicable."},"flush":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"null"}],"description":"Align first/last label flush with the scale range; None uses Vega-Lite's default."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Axis element font style overrides. Unset fields fall back to `style.charts.font`."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick value format string; None uses auto-format."},"max_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum label width in pixels; None uses Vega-Lite's default (180px)."},"min_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum pixel gap between labels; None uses Vega-Lite's default (0px)."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pixel offset of the label from its tick anchor; None uses Vega-Lite's default."},"overlap":{"anyOf":[{"$ref":"#/$defs/AxisLabelOverlapConfigPatch"},{"type":"null"}],"description":"Label overlap strategy enablement. None inherits from the theme cascade. Set individual bools to enable/disable; the resolver applies them in fixed order skip\u2192tilt. On bucketed temporal axes, skip thins label visibility to a coarser calendar period without changing the axis or label time unit."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between axis labels and ticks in pixels; None inherits from parent axis."},"tilt_increments":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Descending tilt angles for label overlap resolution on discrete x-axes; None disables tilt."},"time_unit":{"anyOf":[{"enum":["auto","year","yearquarter","yearmonth","yearweek","yearmonthdate","monthofyear","dayofweek","dayofmonth","dayofyear","hourofday","none"]},{"type":"null"}],"description":"Label cadence for temporal axes; None inherits from the parent axis time_unit."},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Dates to keep label text on, chosen from among the axis's ticks (whatever axis_x.values or the auto-fill cadence already produced) \u2014 this filters which ticks show text, it does not add or remove ticks. Every tick not in this list keeps its position and gridline but has its label blanked. Set axis_x.values separately to change tick/grid density itself. Temporal x-axes only; None labels every tick as usual."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show axis labels; None uses Vega-Lite's default (labels shown)."}},"type":"object"},"DimensionTicksStyle":{"additionalProperties":false,"description":"axis_x-only: step-anchored tick cadence needs a named time unit.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick color; None uses Vega-Lite's default."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Target number of axis ticks. On a quantitative axis the renderer computes explicit tickValues so VL emits exactly this many ticks \u2014 VL's tickCount is advisory and frequently ignored there. On a temporal axis_x, count is passed through as VL's axis.tickCount, which VL's time-scale tick logic honours as a target."},"length":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tick length in pixels; None uses Vega-Lite's default."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pixel offset of ticks from their default position; None means no offset."},"step":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Step multiple for a step-anchored tick cadence (e.g. on DimensionTicksStyle: time_unit: year, step: 5 -> ticks every 5 years). Inert on this base class alone \u2014 a channel that wants step-anchored cadence adds the unit field (DimensionTicksStyle.time_unit)."},"time_unit":{"anyOf":[{"enum":["auto","year","yearquarter","yearmonth","yearweek","yearmonthdate","monthofyear","dayofweek","dayofmonth","dayofyear","hourofday","none"]},{"type":"null"}],"description":"Step-anchored tick cadence unit; None disables step-anchored ticks."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show axis ticks; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tick stroke width in pixels; None uses Vega-Lite's default."}},"type":"object"},"DimensionTicksStylePatch":{"additionalProperties":false,"description":"Authored overlay for DimensionTicksStyle. axis_x-only: step-anchored tick cadence needs a named time unit.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tick color; None uses Vega-Lite's default."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Target number of axis ticks. On a quantitative axis the renderer computes explicit tickValues so VL emits exactly this many ticks \u2014 VL's tickCount is advisory and frequently ignored there. On a temporal axis_x, count is passed through as VL's axis.tickCount, which VL's time-scale tick logic honours as a target."},"length":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tick length in pixels; None uses Vega-Lite's default."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Pixel offset of ticks from their default position; None means no offset."},"step":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Step multiple for a step-anchored tick cadence (e.g. on DimensionTicksStyle: time_unit: year, step: 5 -> ticks every 5 years). Inert on this base class alone \u2014 a channel that wants step-anchored cadence adds the unit field (DimensionTicksStyle.time_unit)."},"time_unit":{"anyOf":[{"enum":["auto","year","yearquarter","yearmonth","yearweek","yearmonthdate","monthofyear","dayofweek","dayofmonth","dayofyear","hourofday","none"]},{"type":"null"}],"description":"Step-anchored tick cadence unit; None disables step-anchored ticks."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show axis ticks; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tick stroke width in pixels; None uses Vega-Lite's default."}},"type":"object"},"DuckDBSourceConfig":{"additionalProperties":false,"description":"DuckDB source configuration.","properties":{"attach":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Databases to attach to the DuckDB connection."},"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"disable_transactions":{"default":false,"description":"Whether dbt-duckdb disables statement transactions.","type":"boolean"},"duckdb_config":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"DuckDB connection configuration values, such as enable_external_access."},"extensions":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"DuckDB extensions to install and load."},"external_root":{"default":".","description":"Root path for dbt-duckdb external materializations.","type":"string"},"filesystems":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"fsspec filesystem configurations attached to DuckDB."},"is_ducklake":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether this source uses DuckLake."},"keep_open":{"default":true,"description":"Whether dbt-duckdb keeps its connection open.","type":"boolean"},"lookml_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relative path to the directory of .lkml files backing this source's models."},"max_query_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum execution time for one query in seconds. Overrides execution.max_query_duration_seconds for this source."},"models":{"additionalProperties":{"$ref":"#/$defs/LookMLModelConfig"},"description":"Named LookML model collections nested under this source.","type":"object"},"module_paths":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Python module paths dbt-duckdb loads."},"path":{"default":":memory:","description":"DuckDB file path or ':memory:' for an in-memory database.","type":"string"},"plugins":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"dbt-duckdb plugin configurations."},"remote":{"description":"Remote DuckDB connection configuration."},"retries":{"description":"dbt-duckdb connection and query retry configuration."},"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default schema for unqualified table names (sets search_path)."},"secrets":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"DuckDB secret definitions for external services."},"settings":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"DuckDB settings and pragma values."},"type":{"description":"Source type identifier.","enum":["duckdb"]},"use_credential_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Credential-provider chain used for external services."}},"required":["type"],"type":"object"},"EndpointLabelsConfig":{"additionalProperties":false,"description":"Endpoint label pane config \u2014 shared across line, area, and bar.","properties":{"height":{"description":"Height in pixels of the endpoint-label pane (top_rail layout).","type":"number"},"label_offset":{"description":"Spacing in pixels between the chart pane and the label pane.","type":"number"},"visible":{"description":"Show endpoint labels; theme sets false, authors opt in per chart.","type":"boolean"}},"required":["visible","label_offset","height"],"type":"object"},"EndpointLabelsConfigPatch":{"additionalProperties":false,"description":"Authored overlay for EndpointLabelsConfig. Endpoint label pane config \u2014 shared across line, area, and bar.","properties":{"height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Height in pixels of the endpoint-label pane (top_rail layout)."},"label_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Spacing in pixels between the chart pane and the label pane."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show endpoint labels; theme sets false, authors opt in per chart."}},"type":"object"},"FaceDetails":{"additionalProperties":false,"description":"Collapsible section metadata for a face.","properties":{"expanded":{"default":false,"description":"Whether the section is open by default.","type":"boolean"},"expanded_title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Label shown when the section is expanded. Defaults to summary."},"summary":{"description":"Label shown when the section is collapsed.","type":"string"}},"required":["summary"],"type":"object"},"FieldConditionalFormatting":{"additionalProperties":false,"description":"Conditional formatting rules scoped to a single column.","properties":{"when":{"description":"Ordered list of conditional rules. The first matching rule applies; a 'default: true' rule must be last.","items":{"$ref":"#/$defs/ConditionalRule"},"type":"array"}},"required":["when"],"type":"object"},"FontColorStrokeStyle":{"additionalProperties":false,"description":"Stroke for tick/rule marks whose color defaults to the root font color.","properties":{"cap":{"anyOf":[{"enum":["butt","round","square"]},{"type":"null"}],"description":"Stroke line cap style (butt, round, or square)."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stroke color. Falls back to `style.font.color`."},"dasharray":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SVG stroke-dasharray pattern (e.g. '4 2')."},"join":{"anyOf":[{"enum":["miter","round","bevel"]},{"type":"null"}],"description":"Stroke line join style (miter, round, or bevel)."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Stroke width in pixels."}},"type":"object"},"FontColorStrokeStylePatch":{"additionalProperties":false,"description":"Authored overlay for FontColorStrokeStyle. Stroke for tick/rule marks whose color defaults to the root font color.","properties":{"cap":{"anyOf":[{"enum":["butt","round","square"]},{"type":"null"}],"description":"Stroke line cap style (butt, round, or square)."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stroke color. Falls back to `style.font.color`."},"dasharray":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SVG stroke-dasharray pattern (e.g. '4 2')."},"join":{"anyOf":[{"enum":["miter","round","bevel"]},{"type":"null"}],"description":"Stroke line join style (miter, round, or bevel)."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Stroke width in pixels."}},"type":"object"},"FontStyle":{"additionalProperties":false,"description":"Text appearance. Merged as a unit.","properties":{"case":{"anyOf":[{"enum":["none","sentence","title","upper","lower","slug","camel"]},{"type":"null"}],"description":"Letter-case transform applied at render time. 'title' uses Chicago/Gruber rules and preserves tokens with internal capitals (ARR, iPhone). 'sentence' uppercases only the first character. 'none' (default) emits the string without any letter-case change."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Text color as a CSS color string."},"decoration":{"anyOf":[{"enum":["none","line-through","underline"]},{"type":"null"}],"description":"Text decoration (underline, line-through, or none)."},"family":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Font family name (e.g., 'sans-serif', 'Roboto')."},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Line height as a unitless multiple of font size. Cascades through Style.font to all text roles that carry a FontStyle slot. Body prose defaults to 1.25; titles override tighter via their font patch in theme YAML."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Font size in pixels."},"style":{"anyOf":[{"enum":["normal","italic"]},{"type":"null"}],"description":"Font style (normal or italic)."},"weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"description":"Font weight (e.g., 'bold', 400, 700)."}},"type":"object"},"FooterRule":{"additionalProperties":false,"description":"Hairline rule above the footer attribution text. None = no rule.","properties":{"color":{"description":"Rule stroke color.","type":"string"},"stroke_width":{"description":"Rule stroke width in pixels.","type":"number"}},"required":["color","stroke_width"],"type":"object"},"FooterRulePatch":{"additionalProperties":false,"description":"Authored overlay for FooterRule. Hairline rule above the footer attribution text. None = no rule.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Rule stroke color."},"stroke_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Rule stroke width in pixels."}},"type":"object"},"FooterStyle":{"additionalProperties":false,"description":"Page footer chrome: visibility, attribution text, font, and rule.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Footer text font style (size and color required)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL the footer brand word 'dataface' links to; null renders plain text."},"rule":{"anyOf":[{"$ref":"#/$defs/FooterRule"},{"type":"null"}],"description":"Hairline rule above footer text; null disables the rule."},"text":{"description":"Attribution text shown in the footer.","type":"string"},"visible":{"description":"Show the footer attribution line.","type":"boolean"},"y_offset":{"description":"Vertical offset from bottom edge in pixels.","type":"number"}},"required":["visible","text","y_offset"],"type":"object"},"FooterStylePatch":{"additionalProperties":false,"description":"Authored overlay for FooterStyle. Page footer chrome: visibility, attribution text, font, and rule.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Footer text font style (size and color required)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL the footer brand word 'dataface' links to; null renders plain text."},"rule":{"anyOf":[{"$ref":"#/$defs/FooterRulePatch"},{"type":"null"}],"description":"Hairline rule above footer text; null disables the rule."},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Attribution text shown in the footer."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the footer attribution line."},"y_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical offset from bottom edge in pixels."}},"type":"object"},"ForeachConfig":{"additionalProperties":false,"description":"foreach loop configuration.","properties":{"as":{"description":"Variable name bound to each row (accessible as {{ as.field }}).","type":"string"},"items":{"description":"Layout item templates resolved once per data row.","items":{"anyOf":[{"anyOf":[{"$ref":"#"},{"$ref":"#/$defs/AuthoredChart"},{"$ref":"#/$defs/ForeachItem"},{"type":"string"}]},{"additionalProperties":{"$ref":"#/$defs/AuthoredChart"},"type":"object"}]},"type":"array"},"query":{"$ref":"#/$defs/ForeachQuery","description":"Inline data source providing the rows to iterate over."}},"required":["query","as","items"],"type":"object"},"ForeachItem":{"additionalProperties":false,"description":"Top-level foreach construct in a layout list.","properties":{"foreach":{"$ref":"#/$defs/ForeachConfig","description":"foreach loop configuration with query, as, and items."}},"required":["foreach"],"type":"object"},"ForeachQuery":{"additionalProperties":false,"description":"Inline data source for compile-time foreach loops.","properties":{"data":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Inline row data for compile-time iteration."},"palette":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Palette name to iterate its live stops from the palette YAML source of truth (one row per stop: {n: 1-indexed position, hex: sRGB hex}). Accepts the same 'name:steps' / 'name_r' shorthand as palette()."},"static_data":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Alias for data; inline row data for compile-time iteration."}},"type":"object"},"FormatConfig":{"additionalProperties":false,"description":"Format configuration for value display.","properties":{"notation":{"anyOf":[{"enum":["analytic","narrative"]},{"type":"null"}],"description":"Notation style: 'analytic' for SI-prefix (1 B, 1 M) or 'narrative' for prose-style (1bn, 1mn)."},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom prefix prepended to the formatted value (e.g., '$')."},"spec":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"D3 format string (e.g., ',.0f'), preset name (e.g., 'currency'), or Excel pattern."},"suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom suffix appended to the formatted value (e.g., ' USD', '%')."}},"type":"object"},"GeoshapeChart":{"additionalProperties":false,"description":"Authored patch for map and geoshape charts.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel: bare column name only."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"geo":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Named GeoJSON boundary source, or inline GeoJSON spec, for geoshape charts."},"geo_source":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Named geographic data source for loading GeoJSON boundaries."},"height":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Explicit chart height in pixels. Positive number only."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"lookup":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Data column to join against geographic data (map join key)."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"projection":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Map projection name or Vega-Lite projection config."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"style":{"anyOf":[{"$ref":"#/$defs/GeoshapeChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"Map or geoshape chart type.","enum":["map","geoshape"]},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Data column mapped to the fill color."},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"width":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Positive number only. Contributes to the dashboard's intrinsic width without overriding the final layout slot \u2014 the chart still fills its allocated container."}},"required":["type"],"type":"object"},"GeoshapeChartMarksStyle":{"additionalProperties":false,"description":"Geoshape-family mark overrides.","properties":{"geoshape":{"$ref":"#/$defs/GeoshapeMarkStyle","description":"Geoshape mark overrides; inherits from global."}},"type":"object"},"GeoshapeChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for GeoshapeChartMarksStyle. Geoshape-family mark overrides.","properties":{"geoshape":{"anyOf":[{"$ref":"#/$defs/GeoshapeMarkStylePatch"},{"type":"null"}],"description":"Geoshape mark overrides; inherits from global."}},"type":"object"},"GeoshapeChartStyle":{"additionalProperties":false,"description":"Geoshape (choropleth) chart style.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"basemap":{"$ref":"#/$defs/BasemapStyle","description":"Background map layer; None source = no topo layer."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/StaticGradientColorStyle"},{"type":"null"}],"description":"Geo color: static paint or gradient scale only (no categorical arm)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/GeoshapeChartMarksStyle","description":"Geoshape-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"projection":{"$ref":"#/$defs/ProjectionStyle","description":"Vega-Lite projection configuration for this geo family."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"required":["projection"],"type":"object"},"GeoshapeChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for GeoshapeChartStyle. Geoshape (choropleth) chart style.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"basemap":{"anyOf":[{"$ref":"#/$defs/BasemapStylePatch"},{"type":"null"}],"description":"Background map layer; None source = no topo layer."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/StaticGradientColorStylePatch"},{"type":"null"}],"description":"Geo color: static paint or gradient scale only (no categorical arm)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/GeoshapeChartMarksStylePatch"},{"type":"null"}],"description":"Geoshape-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"projection":{"anyOf":[{"$ref":"#/$defs/ProjectionStylePatch"},{"type":"null"}],"description":"Vega-Lite projection configuration for this geo family."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"GeoshapeMarkStyle":{"additionalProperties":false,"description":"Geoshape (choropleth) mark fill and boundary stroke.","properties":{"fill":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Neutral geoshape fill color."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Geoshape boundary stroke style."}},"type":"object"},"GeoshapeMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for GeoshapeMarkStyle. Geoshape (choropleth) mark fill and boundary stroke.","properties":{"fill":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Neutral geoshape fill color."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Geoshape boundary stroke style."}},"type":"object"},"GlobalMarksStyle":{"additionalProperties":false,"description":"Global mark defaults: one <Mark>MarkStyle per VL mark type.","properties":{"area":{"$ref":"#/$defs/AreaMarkStyle","description":"Global area mark defaults."},"bar":{"$ref":"#/$defs/BarMarkStyle","description":"Global bar mark defaults."},"circle":{"$ref":"#/$defs/CircleMarkStyle","description":"Global circle mark defaults."},"geoshape":{"$ref":"#/$defs/GeoshapeMarkStyle","description":"Global geoshape mark defaults."},"line":{"$ref":"#/$defs/LineMarkStyle","description":"Global line mark defaults."},"point":{"$ref":"#/$defs/PointMarkStyle","description":"Global point mark defaults."},"rect":{"$ref":"#/$defs/RectMarkStyle","description":"Global rect mark defaults."},"rule":{"$ref":"#/$defs/RuleMarkStyle","description":"Global rule mark defaults."},"slice":{"$ref":"#/$defs/SliceMarkStyle","description":"Global slice (arc/pie) mark defaults."},"square":{"$ref":"#/$defs/SquareMarkStyle","description":"Global square mark defaults."},"text":{"$ref":"#/$defs/TextMarkStyle","description":"Global text mark defaults."},"tick":{"$ref":"#/$defs/TickMarkStyle","description":"Global tick mark defaults."},"trail":{"$ref":"#/$defs/TrailMarkStyle","description":"Global trail mark defaults."}},"type":"object"},"GlobalMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for GlobalMarksStyle. Global mark defaults: one <Mark>MarkStyle per VL mark type.","properties":{"area":{"anyOf":[{"$ref":"#/$defs/AreaMarkStylePatch"},{"type":"null"}],"description":"Global area mark defaults."},"bar":{"anyOf":[{"$ref":"#/$defs/BarMarkStylePatch"},{"type":"null"}],"description":"Global bar mark defaults."},"circle":{"anyOf":[{"$ref":"#/$defs/CircleMarkStylePatch"},{"type":"null"}],"description":"Global circle mark defaults."},"geoshape":{"anyOf":[{"$ref":"#/$defs/GeoshapeMarkStylePatch"},{"type":"null"}],"description":"Global geoshape mark defaults."},"line":{"anyOf":[{"$ref":"#/$defs/LineMarkStylePatch"},{"type":"null"}],"description":"Global line mark defaults."},"point":{"anyOf":[{"$ref":"#/$defs/PointMarkStylePatch"},{"type":"null"}],"description":"Global point mark defaults."},"rect":{"anyOf":[{"$ref":"#/$defs/RectMarkStylePatch"},{"type":"null"}],"description":"Global rect mark defaults."},"rule":{"anyOf":[{"$ref":"#/$defs/RuleMarkStylePatch"},{"type":"null"}],"description":"Global rule mark defaults."},"slice":{"anyOf":[{"$ref":"#/$defs/SliceMarkStylePatch"},{"type":"null"}],"description":"Global slice (arc/pie) mark defaults."},"square":{"anyOf":[{"$ref":"#/$defs/SquareMarkStylePatch"},{"type":"null"}],"description":"Global square mark defaults."},"text":{"anyOf":[{"$ref":"#/$defs/TextMarkStylePatch"},{"type":"null"}],"description":"Global text mark defaults."},"tick":{"anyOf":[{"$ref":"#/$defs/TickMarkStylePatch"},{"type":"null"}],"description":"Global tick mark defaults."},"trail":{"anyOf":[{"$ref":"#/$defs/TrailMarkStylePatch"},{"type":"null"}],"description":"Global trail mark defaults."}},"type":"object"},"GridItem":{"additionalProperties":false,"description":"Grid layout item with position and span.","properties":{"col":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Column position (0-indexed). Auto-placed if omitted."},"col_span":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of columns to span (width in grid units)."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional metadata for AI search and context tooltips."},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Alias for row_span (more intuitive name)."},"item":{"anyOf":[{"$ref":"#"},{"$ref":"#/$defs/AuthoredChart"},{"$ref":"#/$defs/ForeachItem"},{"type":"string"}],"description":"Chart name or inline chart/face definition to place in this grid cell."},"row":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Row position (0-indexed). Auto-placed if omitted."},"row_span":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of rows to span (height in grid units)."},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Alias for col_span (more intuitive name)."}},"required":["item"],"type":"object"},"GridLayout":{"additionalProperties":false,"description":"Grid layout configuration.","properties":{"columns":{"default":24,"description":"Number of grid columns (default: 24).","type":"integer"},"default_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Default row span for items that don't specify height."},"default_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Default column span for items that don't specify width."},"gap":{"anyOf":[{"enum":["sm","md","lg","xl"]},{"type":"null"}],"description":"Gap between grid cells (sm, md, lg, xl)."},"items":{"description":"List of grid items with position and span configuration.","items":{"$ref":"#/$defs/GridItem"},"type":"array"},"row_height":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default row height as a CSS value (e.g., '200px')."}},"required":["items"],"type":"object"},"GridLayoutStyle":{"additionalProperties":false,"properties":{"columns":{"description":"Number of columns in the grid layout.","type":"integer"},"gap":{"description":"Gap between grid cells in pixels.","type":"number"}},"required":["columns","gap"],"type":"object"},"GridLayoutStylePatch":{"additionalProperties":false,"description":"Authored overlay for GridLayoutStyle.","properties":{"columns":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of columns in the grid layout."},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between grid cells in pixels."}},"type":"object"},"HeatmapChart":{"additionalProperties":false,"description":"Authored patch for heatmap charts.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel: bare column name only."},"data_table":{"anyOf":[{"$ref":"#/$defs/ChartDataTable"},{"type":"null"}],"description":"Optional mini data-grid attached below/above the chart."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"height":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Explicit chart height in pixels. Positive number only. When set, overrides aspect_ratio and theme cascade. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"multiples":{"anyOf":[{"$ref":"#/$defs/MultiplesConfig"},{"type":"null"}],"description":"Partition this chart into small multiples by a `rows` column (vertical stack), a `columns` column (side by side), or both (grid). Panels share one measure scale by default."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"sort":{"anyOf":[{"$ref":"#/$defs/ChartSort"},{"type":"null"}],"description":"Sort configuration: column to sort by and direction (asc/desc)."},"style":{"anyOf":[{"$ref":"#/$defs/HeatmapChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"Heatmap chart type.","enum":["heatmap"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"width":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Positive number only. Contributes to the dashboard's intrinsic width without overriding the final layout slot \u2014 the chart still fills its allocated container. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name from the query result."},"x_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the X axis."},"y":{"anyOf":[{"type":"string"},{"type":"array"},{"type":"null"}],"description":"Y-axis column name(s). Accepts a single column or list for multi-series charts."},"y_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the Y axis."}},"required":["type"],"type":"object"},"HeatmapChartMarksStyle":{"additionalProperties":false,"description":"Heatmap-family mark overrides.","properties":{"rect":{"$ref":"#/$defs/RectMarkStyle","description":"Rect mark overrides; inherits from global."},"text":{"anyOf":[{"$ref":"#/$defs/TextMarkStyle"},{"type":"null"}],"description":"Text mark overrides; None inherits global."}},"type":"object"},"HeatmapChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for HeatmapChartMarksStyle. Heatmap-family mark overrides.","properties":{"rect":{"anyOf":[{"$ref":"#/$defs/RectMarkStylePatch"},{"type":"null"}],"description":"Rect mark overrides; inherits from global."},"text":{"anyOf":[{"$ref":"#/$defs/TextMarkStylePatch"},{"type":"null"}],"description":"Text mark overrides; None inherits global."}},"type":"object"},"HeatmapChartStyle":{"additionalProperties":false,"description":"Heatmap chart style.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"cell_padding":{"description":"Padding between heatmap cells in pixels.","type":"number"},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/HeatmapChartMarksStyle","description":"Heatmap-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"required":["cell_padding"],"type":"object"},"HeatmapChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for HeatmapChartStyle. Heatmap chart style.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"cell_padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between heatmap cells in pixels."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/HeatmapChartMarksStylePatch"},{"type":"null"}],"description":"Heatmap-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"HistogramChartMarksStyle":{"additionalProperties":false,"description":"Histogram-family mark overrides.","properties":{"bar":{"$ref":"#/$defs/BarMarkStyle","description":"Bar mark overrides; inherits from global."},"rule":{"anyOf":[{"$ref":"#/$defs/RuleMarkStyle"},{"type":"null"}],"description":"Rule mark overrides; None inherits global."}},"type":"object"},"HistogramChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for HistogramChartMarksStyle. Histogram-family mark overrides.","properties":{"bar":{"anyOf":[{"$ref":"#/$defs/BarMarkStylePatch"},{"type":"null"}],"description":"Bar mark overrides; inherits from global."},"rule":{"anyOf":[{"$ref":"#/$defs/RuleMarkStylePatch"},{"type":"null"}],"description":"Rule mark overrides; None inherits global."}},"type":"object"},"HistogramChartStyle":{"additionalProperties":false,"description":"Histogram chart style.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"bin_maxbins":{"description":"Maximum number of bins for auto-binning.","type":"integer"},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/HistogramChartMarksStyle","description":"Histogram-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"required":["bin_maxbins"],"type":"object"},"HistogramChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for HistogramChartStyle. Histogram chart style.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"bin_maxbins":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of bins for auto-binning."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/HistogramChartMarksStylePatch"},{"type":"null"}],"description":"Histogram-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"HttpSourceConfig":{"additionalProperties":false,"description":"HTTP/REST API source configuration.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"headers":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Default HTTP headers (e.g. Authorization)."},"type":{"description":"Source type identifier.","enum":["http"]},"url":{"description":"Base URL for HTTP requests.","type":"string"}},"required":["type","url"],"type":"object"},"InputStyle":{"additionalProperties":false,"properties":{"background":{"description":"Input background color.","type":"string"},"border":{"$ref":"#/$defs/BorderStyle","description":"Input border style."},"focus_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Input focus ring color. Falls back to `style.accent`."},"height":{"description":"Input control height in pixels.","type":"number"},"padding":{"$ref":"#/$defs/SpacingValues","description":"Input inner padding in pixels."},"range":{"$ref":"#/$defs/RangeDefaults","description":"Range input default min/max/step values."},"widths":{"$ref":"#/$defs/InputWidths","description":"Per-input-type default widths."}},"required":["height","border","background","padding","widths","range"],"type":"object"},"InputStylePatch":{"additionalProperties":false,"description":"Authored overlay for InputStyle.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Input background color."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Input border style."},"focus_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Input focus ring color. Falls back to `style.accent`."},"height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Input control height in pixels."},"padding":{"anyOf":[{"$ref":"#/$defs/SpacingValues"},{"type":"null"}],"description":"Input inner padding in pixels."},"range":{"anyOf":[{"$ref":"#/$defs/RangeDefaultsPatch"},{"type":"null"}],"description":"Range input default min/max/step values."},"widths":{"anyOf":[{"$ref":"#/$defs/InputWidthsPatch"},{"type":"null"}],"description":"Per-input-type default widths."}},"type":"object"},"InputWidths":{"additionalProperties":false,"properties":{"checkbox":{"description":"Default width for checkbox inputs in pixels.","type":"number"},"daterange":{"description":"Default width for daterange chip triggers in pixels.","type":"number"},"number":{"description":"Default width for number inputs in pixels.","type":"number"},"range":{"description":"Default width for range inputs in pixels.","type":"number"},"slider_value_min":{"description":"Minimum width for slider value display in pixels.","type":"number"},"text":{"description":"Default width for text inputs in pixels.","type":"number"}},"required":["text","number","range","slider_value_min","checkbox","daterange"],"type":"object"},"InputWidthsPatch":{"additionalProperties":false,"description":"Authored overlay for InputWidths.","properties":{"checkbox":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default width for checkbox inputs in pixels."},"daterange":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default width for daterange chip triggers in pixels."},"number":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default width for number inputs in pixels."},"range":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default width for range inputs in pixels."},"slider_value_min":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum width for slider value display in pixels."},"text":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default width for text inputs in pixels."}},"type":"object"},"JsonSourceConfig":{"additionalProperties":false,"description":"JSON file source configuration.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"files":{"description":"Mapping of table_name \u2192 file path. Each key is the SQL table name; the value is the path relative to the project root. Required and must not be empty.","type":"object"},"type":{"description":"Source type identifier.","enum":["json"]}},"required":["type","files"],"type":"object"},"KpiChart":{"additionalProperties":false,"description":"Authored patch for KPI (key performance indicator) charts.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Gradient background channel \u2014 {column, scale} shape. Paints the card background by the value's position in the scale. See channel.py parse_style_channel for the full grammar."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"KPI label rendered above the headline value."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"style":{"anyOf":[{"$ref":"#/$defs/KpiChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"support":{"anyOf":[{"$ref":"#/$defs/KpiSupportConfig"},{"type":"null"}],"description":"Optional support line beneath the KPI value."},"type":{"description":"KPI chart type.","enum":["kpi"]},"value":{"description":"Column reference (string column name) for the headline number/text.","type":"string"},"variant":{"default":"stacked","description":"Layout variant. 'stacked' (default) shows value, label, and support on three vertical lines. 'inline' lays value, label, and support out on a single baseline-aligned row. 'compact' is 2-column \u2014 big value on the left, up to two stacked lines on the right with the bottom line sharing baseline with the value; a lone `support` block splits across the two right-column lines.","enum":["stacked","inline","compact"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."}},"required":["type","value"],"type":"object"},"KpiChartStyle":{"additionalProperties":false,"description":"Produced by cascade from theme YAML.","properties":{"affix":{"$ref":"#/$defs/KpiSlotStyle","description":"Currency/percent affix slot."},"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"$ref":"#/$defs/BorderStyle","description":"KPI card border style."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"KPI value/glyph static paint. No categorical or gradient arm \u2014 KPI has no series axis."},"content_padding":{"$ref":"#/$defs/SpacingValues","description":"Inner inset (top/right/bottom/left) for KPI card content in pixels."},"default_height":{"description":"Default KPI card height in pixels.","type":"number"},"font":{"$ref":"#/$defs/FontStyle","description":"KPI chart-level font overrides. Unset fields fall back to `style.charts.font`."},"glyph":{"$ref":"#/$defs/KpiSlotStyle","description":"Indicator glyph (\u25b2\u25bc\u25cf) slot."},"label":{"$ref":"#/$defs/KpiSlotStyle","description":"KPI card label slot."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_card_width":{"description":"Minimum KPI card width in pixels.","type":"number"},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tone":{"anyOf":[{"enum":["positive","negative","warning","info"]},{"type":"null"}],"description":"Semantic tone selector (positive | negative | warning | info). None = default chrome."},"tones":{"$ref":"#/$defs/KpiTonesStyle","description":"Semantic tone color palette for KPI values and glyphs."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."},"value":{"$ref":"#/$defs/KpiValueStyle","description":"KPI headline value slot."}},"required":["border","value","label","affix","glyph","min_card_width","default_height","content_padding","tones"],"type":"object"},"KpiChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for KpiChartStyle. Produced by cascade from theme YAML.","properties":{"affix":{"anyOf":[{"$ref":"#/$defs/KpiSlotStylePatch"},{"type":"null"}],"description":"Currency/percent affix slot."},"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"KPI card border style."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"KPI value/glyph static paint. No categorical or gradient arm \u2014 KPI has no series axis."},"content_padding":{"anyOf":[{"$ref":"#/$defs/SpacingValues"},{"type":"null"}],"description":"Inner inset (top/right/bottom/left) for KPI card content in pixels."},"default_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default KPI card height in pixels."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"KPI chart-level font overrides. Unset fields fall back to `style.charts.font`."},"glyph":{"anyOf":[{"$ref":"#/$defs/KpiSlotStylePatch"},{"type":"null"}],"description":"Indicator glyph (\u25b2\u25bc\u25cf) slot."},"label":{"anyOf":[{"$ref":"#/$defs/KpiSlotStylePatch"},{"type":"null"}],"description":"KPI card label slot."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"min_card_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum KPI card width in pixels."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tone":{"anyOf":[{"enum":["positive","negative","warning","info"]},{"type":"null"}],"description":"Semantic tone selector (positive | negative | warning | info). None = default chrome."},"tones":{"anyOf":[{"$ref":"#/$defs/KpiTonesStylePatch"},{"type":"null"}],"description":"Semantic tone color palette for KPI values and glyphs."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."},"value":{"anyOf":[{"$ref":"#/$defs/KpiValueStylePatch"},{"type":"null"}],"description":"KPI headline value slot."}},"type":"object"},"KpiSlotStyle":{"additionalProperties":false,"description":"KPI per-slot style for label, affix, and glyph slots.","properties":{"character":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Glyph character to render (e.g. '\u25b2'). None = no glyph."},"font":{"$ref":"#/$defs/FontStyle","description":"Slot font style. Unset fields fall back to `style.charts.kpi.font`."}},"type":"object"},"KpiSlotStylePatch":{"additionalProperties":false,"description":"Authored overlay for KpiSlotStyle. KPI per-slot style for label, affix, and glyph slots.","properties":{"character":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Glyph character to render (e.g. '\u25b2'). None = no glyph."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Slot font style. Unset fields fall back to `style.charts.kpi.font`."}},"type":"object"},"KpiSupportConfig":{"additionalProperties":false,"description":"Support-line block authored alongside a KPI's main value.","properties":{"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"Number format (D3 spec, preset, or FormatConfig)."},"glyph":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional prefix glyph (e.g. '\u25b2', '\u25bc', '\u25cf')."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Trailing explainer text rendered beside the support value."},"tone":{"anyOf":[{"enum":["positive","negative","warning","info"]},{"type":"null"}],"description":"Semantic styling for the support value/glyph."},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column reference (string column name) for the support number/text."}},"type":"object"},"KpiTonesStyle":{"additionalProperties":false,"description":"Semantic tone palette for KPI value/glyph and table conditional glyphs.","properties":{"info":{"description":"Color for neutral/informational tone indicators.","type":"string"},"negative":{"description":"Color for negative/bad tone indicators.","type":"string"},"positive":{"description":"Color for positive/good tone indicators.","type":"string"},"warning":{"description":"Color for warning/caution tone indicators.","type":"string"}},"required":["positive","negative","warning","info"],"type":"object"},"KpiTonesStylePatch":{"additionalProperties":false,"description":"Authored overlay for KpiTonesStyle. Semantic tone palette for KPI value/glyph and table conditional glyphs.","properties":{"info":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color for neutral/informational tone indicators."},"negative":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color for negative/bad tone indicators."},"positive":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color for positive/good tone indicators."},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color for warning/caution tone indicators."}},"type":"object"},"KpiValueStyle":{"additionalProperties":false,"description":"KPI headline value slot: font and format. Theme populates font.size directly.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"KPI value font style. Unset fields fall back to `style.charts.kpi.font`."},"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"Number format for the KPI headline value: D3 format string, preset name, or FormatConfig object."}},"type":"object"},"KpiValueStylePatch":{"additionalProperties":false,"description":"Authored overlay for KpiValueStyle. KPI headline value slot: font and format. Theme populates font.size directly.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"KPI value font style. Unset fields fall back to `style.charts.kpi.font`."},"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"Number format for the KPI headline value: D3 format string, preset name, or FormatConfig object."}},"type":"object"},"LabelsDefaultTemplate":{"additionalProperties":false,"description":"Default Jinja templates for per-slice pie/donut labels.","properties":{"no_color":{"description":"Default per-slice label template when the chart has no color binding.","type":"string"},"with_color":{"description":"Default per-slice label template when the chart has a color binding.","type":"string"}},"required":["with_color","no_color"],"type":"object"},"LabelsDefaultTemplatePatch":{"additionalProperties":false,"description":"Authored overlay for LabelsDefaultTemplate. Default Jinja templates for per-slice pie/donut labels.","properties":{"no_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default per-slice label template when the chart has no color binding."},"with_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default per-slice label template when the chart has a color binding."}},"type":"object"},"LayerAxisYGrid":{"additionalProperties":false,"description":"Per-layer y-axis grid patch.","properties":{"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether to show grid lines on this layer's y axis."}},"type":"object"},"LayerAxisYLabel":{"additionalProperties":false,"description":"Per-layer y-axis label format patch.","properties":{"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"d3 format string for this layer's y-axis tick labels."}},"type":"object"},"LayerAxisYScale":{"additionalProperties":false,"description":"Per-layer y-axis scale patch.","properties":{"domain":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit [min, max] domain for this layer's y scale."}},"type":"object"},"LayerAxisYStyle":{"additionalProperties":false,"description":"Per-layer y-axis settings on a layered chart.","properties":{"grid":{"anyOf":[{"$ref":"#/$defs/LayerAxisYGrid"},{"type":"null"}],"description":"Grid overrides for this layer's y axis."},"label":{"anyOf":[{"$ref":"#/$defs/LayerAxisYLabel"},{"type":"null"}],"description":"Label format override for this layer's y axis."},"position":{"anyOf":[{"enum":["left","right"]},{"type":"null"}],"description":"Y-axis side for this layer (left or right)."},"scale":{"anyOf":[{"$ref":"#/$defs/LayerAxisYScale"},{"type":"null"}],"description":"Scale overrides for this layer's y axis."},"ticks":{"anyOf":[{"$ref":"#/$defs/LayerAxisYTicks"},{"type":"null"}],"description":"Tick overrides for this layer's y axis."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Y-axis title override for this layer."}},"type":"object"},"LayerAxisYTicks":{"additionalProperties":false,"description":"Per-layer y-axis tick patch.","properties":{"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Requested number of y-axis ticks for this layer."}},"type":"object"},"LayoutGapStyle":{"additionalProperties":false,"properties":{"gap":{"description":"Gap between layout items in pixels.","type":"number"}},"required":["gap"],"type":"object"},"LayoutGapStylePatch":{"additionalProperties":false,"description":"Authored overlay for LayoutGapStyle.","properties":{"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between layout items in pixels."}},"type":"object"},"LayoutStyle":{"additionalProperties":false,"properties":{"cols":{"$ref":"#/$defs/LayoutGapStyle","description":"Column layout gap configuration."},"details":{"$ref":"#/$defs/DetailsStyle","description":"Details (accordion) layout style."},"grid":{"$ref":"#/$defs/GridLayoutStyle","description":"Grid layout configuration."},"rows":{"$ref":"#/$defs/LayoutGapStyle","description":"Row layout gap configuration."},"tabs":{"$ref":"#/$defs/TabsStyle","description":"Tabs layout style."}},"required":["rows","cols","grid","tabs","details"],"type":"object"},"LayoutStylePatch":{"additionalProperties":false,"description":"Authored overlay for LayoutStyle.","properties":{"cols":{"anyOf":[{"$ref":"#/$defs/LayoutGapStylePatch"},{"type":"null"}],"description":"Column layout gap configuration."},"details":{"anyOf":[{"$ref":"#/$defs/DetailsStylePatch"},{"type":"null"}],"description":"Details (accordion) layout style."},"grid":{"anyOf":[{"$ref":"#/$defs/GridLayoutStylePatch"},{"type":"null"}],"description":"Grid layout configuration."},"rows":{"anyOf":[{"$ref":"#/$defs/LayoutGapStylePatch"},{"type":"null"}],"description":"Row layout gap configuration."},"tabs":{"anyOf":[{"$ref":"#/$defs/TabsStylePatch"},{"type":"null"}],"description":"Tabs layout style."}},"type":"object"},"LegendLabelStyle":{"additionalProperties":false,"properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Legend element font style overrides. Unset fields fall back to `style.charts.font`."},"max_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum label width in pixels; maps to VL labelLimit. None uses Vega-Lite's default."},"padding":{"description":"Padding between legend symbol and element text in pixels.","type":"number"}},"required":["padding"],"type":"object"},"LegendLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for LegendLabelStyle.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Legend element font style overrides. Unset fields fall back to `style.charts.font`."},"max_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum label width in pixels; maps to VL labelLimit. None uses Vega-Lite's default."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between legend symbol and element text in pixels."}},"type":"object"},"LegendStyle":{"additionalProperties":false,"properties":{"columns":{"description":"Legend entry columns. Zero keeps the renderer default; positive values set Vega-Lite legend columns.","type":"integer"},"compact_columns":{"description":"Entry columns for an automatic compact top-horizontal legend.","type":"integer"},"direction":{"description":"Legend layout direction.","enum":["horizontal","vertical"]},"interactive_legend":{"description":"Emit a dft_legend point-selection param for single-click series toggle.","type":"boolean"},"label":{"$ref":"#/$defs/LegendLabelStyle","description":"Legend label style."},"position":{"description":"Legend position (VL legend orient).","enum":["none","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"]},"symbol_fill":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"When False, emits symbolFillColor='transparent' to produce a hollow legend glyph. None uses Vega-Lite's default (filled symbol)."},"symbol_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of legend entries to display; maps to VL symbolLimit. None uses Vega-Lite's default (no cap). Set to a positive integer to prevent legend overflow on high-cardinality series."},"symbol_shape":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override the legend glyph shape; maps to VL legend.symbolType. None uses the mark-aware glyph derived from the chart's mark type."},"title":{"$ref":"#/$defs/LegendTitleStyle","description":"Legend title style."},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit legend entry order/filter; maps to VL legend.values. None lets the renderer infer order from the data."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the legend. None = legend visible; False = explicitly suppressed."}},"required":["position","direction","columns","compact_columns","label","title","interactive_legend"],"type":"object"},"LegendStylePatch":{"additionalProperties":false,"description":"Authored overlay for LegendStyle.","properties":{"columns":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Legend entry columns. Zero keeps the renderer default; positive values set Vega-Lite legend columns."},"compact_columns":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Entry columns for an automatic compact top-horizontal legend."},"direction":{"anyOf":[{"enum":["horizontal","vertical"]},{"type":"null"}],"description":"Legend layout direction."},"interactive_legend":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Emit a dft_legend point-selection param for single-click series toggle."},"label":{"anyOf":[{"$ref":"#/$defs/LegendLabelStylePatch"},{"type":"null"}],"description":"Legend label style."},"position":{"anyOf":[{"enum":["none","left","right","top","bottom","top-left","top-right","bottom-left","bottom-right"]},{"type":"null"}],"description":"Legend position (VL legend orient)."},"symbol_fill":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"When False, emits symbolFillColor='transparent' to produce a hollow legend glyph. None uses Vega-Lite's default (filled symbol)."},"symbol_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of legend entries to display; maps to VL symbolLimit. None uses Vega-Lite's default (no cap). Set to a positive integer to prevent legend overflow on high-cardinality series."},"symbol_shape":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override the legend glyph shape; maps to VL legend.symbolType. None uses the mark-aware glyph derived from the chart's mark type."},"title":{"anyOf":[{"$ref":"#/$defs/LegendTitleStylePatch"},{"type":"null"}],"description":"Legend title style."},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit legend entry order/filter; maps to VL legend.values. None lets the renderer infer order from the data."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the legend. None = legend visible; False = explicitly suppressed."}},"type":"object"},"LegendTitleStyle":{"additionalProperties":false,"properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Legend element font style overrides. Unset fields fall back to `style.charts.font`."},"padding":{"description":"Padding between legend symbol and element text in pixels.","type":"number"},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the legend title; None = shown, False = suppressed (VL legend.title: null)."}},"required":["padding"],"type":"object"},"LegendTitleStylePatch":{"additionalProperties":false,"description":"Authored overlay for LegendTitleStyle.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Legend element font style overrides. Unset fields fall back to `style.charts.font`."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Padding between legend symbol and element text in pixels."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the legend title; None = shown, False = suppressed (VL legend.title: null)."}},"type":"object"},"LineChart":{"additionalProperties":false,"description":"Authored patch for line charts.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel: bare column name only."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"data_table":{"anyOf":[{"$ref":"#/$defs/ChartDataTable"},{"type":"null"}],"description":"Optional mini data-grid attached below/above the chart."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"height":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Explicit chart height in pixels. Positive number only. When set, overrides aspect_ratio and theme cascade. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"layers":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/$defs/BarLayer"},{"$ref":"#/$defs/LineLayer"},{"$ref":"#/$defs/AreaLayer"},{"$ref":"#/$defs/ScatterLayer"}]},"type":"array"},{"type":"null"}],"description":"Typed overlay layers on this chart."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"multiples":{"anyOf":[{"$ref":"#/$defs/MultiplesConfig"},{"type":"null"}],"description":"Partition this chart into small multiples by a `rows` column (vertical stack), a `columns` column (side by side), or both (grid). Panels share one measure scale by default."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"sort":{"anyOf":[{"$ref":"#/$defs/ChartSort"},{"type":"null"}],"description":"Sort configuration: column to sort by and direction (asc/desc)."},"style":{"anyOf":[{"$ref":"#/$defs/LineChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"Line chart type.","enum":["line"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"width":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Positive number only. Contributes to the dashboard's intrinsic width without overriding the final layout slot \u2014 the chart still fills its allocated container. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name from the query result."},"x_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the X axis."},"y":{"anyOf":[{"type":"string"},{"type":"array"},{"type":"null"}],"description":"Y-axis column name(s). Accepts a single column or list for multi-series charts."},"y_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the Y axis."}},"required":["type"],"type":"object"},"LineChartMarksStyle":{"additionalProperties":false,"description":"Line-family mark overrides.","properties":{"line":{"$ref":"#/$defs/LineMarkStyle","description":"Line mark overrides; inherits from global."},"point":{"$ref":"#/$defs/PointMarkStyle","description":"Point mark overrides; inherits from global."},"rule":{"anyOf":[{"$ref":"#/$defs/RuleMarkStyle"},{"type":"null"}],"description":"Rule mark overrides; None inherits global."},"text":{"$ref":"#/$defs/TextMarkStyle","description":"Text mark overrides; inherits from global."}},"type":"object"},"LineChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for LineChartMarksStyle. Line-family mark overrides.","properties":{"line":{"anyOf":[{"$ref":"#/$defs/LineMarkStylePatch"},{"type":"null"}],"description":"Line mark overrides; inherits from global."},"point":{"anyOf":[{"$ref":"#/$defs/PointMarkStylePatch"},{"type":"null"}],"description":"Point mark overrides; inherits from global."},"rule":{"anyOf":[{"$ref":"#/$defs/RuleMarkStylePatch"},{"type":"null"}],"description":"Rule mark overrides; None inherits global."},"text":{"anyOf":[{"$ref":"#/$defs/TextMarkStylePatch"},{"type":"null"}],"description":"Text mark overrides; inherits from global."}},"type":"object"},"LineChartStyle":{"additionalProperties":false,"description":"Line chart style: chart-level fields + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"endpoint_labels":{"$ref":"#/$defs/EndpointLabelsConfig","description":"Endpoint label pane configuration for line charts."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/LineChartMarksStyle","description":"Line-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"required":["endpoint_labels"],"type":"object"},"LineChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for LineChartStyle. Line chart style: chart-level fields + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"endpoint_labels":{"anyOf":[{"$ref":"#/$defs/EndpointLabelsConfigPatch"},{"type":"null"}],"description":"Endpoint label pane configuration for line charts."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/LineChartMarksStylePatch"},{"type":"null"}],"description":"Line-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"LineLayer":{"additionalProperties":false,"description":"A line-type layer on a cartesian chart.","properties":{"axis_y":{"anyOf":[{"$ref":"#/$defs/LayerAxisYStyle"},{"type":"null"}],"description":"Y-axis settings for this layer (orientation, title)."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel for this layer: bare column name only."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Label column name for this layer."},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Query name for this layer's data (overrides chart-level query)."},"style":{"anyOf":[{"$ref":"#/$defs/LineLayerStylePatch"},{"type":"null"}],"description":"Line layer mark style overrides."},"type":{"description":"Line mark layer.","enum":["line"]},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name for this layer."},"y":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Y-axis column name for this layer."}},"required":["type"],"type":"object"},"LineLayerStylePatch":{"additionalProperties":false,"description":"Authored overlay for LineLayerStyle. Required wrapper for line-layer mark overrides (built into a Patch by build_patch_model).","properties":{"marks":{"anyOf":[{"$ref":"#/$defs/LineChartMarksStylePatch"},{"type":"null"}],"description":"Mark overrides for this line layer."}},"type":"object"},"LineMarkStyle":{"additionalProperties":false,"description":"Line mark stroke, interpolation, and halo. Point mark lives on PointMarkStyle.","properties":{"connect":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"For curve='step' on a categorical (band) x-axis, whether adjacent band plateaus are joined by vertical jumps (True/None) or left as disconnected segments (False). No-op for other curves or a continuous x-axis."},"curve":{"anyOf":[{"enum":["linear","monotone","natural","basis","cardinal","step","step-before","step-after"]},{"type":"null"}],"description":"Line interpolation curve, one of a fixed set: 'linear', 'monotone', 'natural', 'basis', 'cardinal', 'step', 'step-before', 'step-after'. On a categorical (nominal/ordinal) x-axis, 'step' draws a full-band-width plateau per x-value instead of VL's centered step; on a continuous (temporal/quantitative) x-axis it passes straight through to VL's native step."},"halo_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Halo stroke width multiplier relative to stroke.width; 0 disables the halo."},"labels":{"$ref":"#/$defs/PointLabelsStyle","description":"Value label style for line marks."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Line stroke style."}},"type":"object"},"LineMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for LineMarkStyle. Line mark stroke, interpolation, and halo. Point mark lives on PointMarkStyle.","properties":{"connect":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"For curve='step' on a categorical (band) x-axis, whether adjacent band plateaus are joined by vertical jumps (True/None) or left as disconnected segments (False). No-op for other curves or a continuous x-axis."},"curve":{"anyOf":[{"enum":["linear","monotone","natural","basis","cardinal","step","step-before","step-after"]},{"type":"null"}],"description":"Line interpolation curve, one of a fixed set: 'linear', 'monotone', 'natural', 'basis', 'cardinal', 'step', 'step-before', 'step-after'. On a categorical (nominal/ordinal) x-axis, 'step' draws a full-band-width plateau per x-value instead of VL's centered step; on a continuous (temporal/quantitative) x-axis it passes straight through to VL's native step."},"halo_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Halo stroke width multiplier relative to stroke.width; 0 disables the halo."},"labels":{"anyOf":[{"$ref":"#/$defs/PointLabelsStylePatch"},{"type":"null"}],"description":"Value label style for line marks."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Line stroke style."}},"type":"object"},"LookMLModelConfig":{"additionalProperties":false,"description":"One LookML model: a named collection of explores under a warehouse source.","properties":{"explores":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit list of explore names in this model."},"group_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"LookML group_label selecting this model's explores. Not yet enforced at compile time."},"lkml":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Path to a specific .lkml model file, relative to the project root."}},"type":"object"},"MeasureGridStyle":{"additionalProperties":false,"description":"BaseAxisGridStyle + zero-baseline override for the measure (y) axis.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Grid line color; None uses Vega-Lite's default."},"dash":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Dash pattern for grid lines; None renders a solid line."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Grid line opacity; None uses Vega-Lite's default."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show grid lines; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Grid line width in pixels; None uses Vega-Lite's default."},"zero":{"anyOf":[{"$ref":"#/$defs/AxisGridZeroStyle"},{"type":"null"}],"description":"Zero-baseline gridline style; None inherits from parent axis."}},"type":"object"},"MeasureGridStylePatch":{"additionalProperties":false,"description":"Authored overlay for MeasureGridStyle. BaseAxisGridStyle + zero-baseline override for the measure (y) axis.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Grid line color; None uses Vega-Lite's default."},"dash":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Dash pattern for grid lines; None renders a solid line."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Grid line opacity; None uses Vega-Lite's default."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show grid lines; None inherits from parent axis."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Grid line width in pixels; None uses Vega-Lite's default."},"zero":{"anyOf":[{"$ref":"#/$defs/AxisGridZeroStylePatch"},{"type":"null"}],"description":"Zero-baseline gridline style; None inherits from parent axis."}},"type":"object"},"MultiplesConfig":{"additionalProperties":false,"description":"Small-multiples partition, keyed by layout direction.","properties":{"columns":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column whose distinct values become side-by-side panel columns."},"rows":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column whose distinct values become vertically stacked panel rows."},"scale":{"default":"shared","description":"Measure-scale sharing across panels. 'shared' (default) makes panels visually comparable; 'independent' gives each panel its own scale.","enum":["shared","independent"]}},"type":"object"},"MySQLSourceConfig":{"additionalProperties":false,"description":"MySQL source configuration.","properties":{"attribution":{"description":"Cost-attribution pairs sent with every query against this source, e.g. attribution: {team: analytics}. Emitted as BigQuery job labels and as a query comment elsewhere. Keys and values must match BigQuery's label rules ([a-z][a-z0-9_-]{0,62} / [a-z0-9_-]{0,63}); the dft_ prefix is reserved for the engine's own identity.","type":"object"},"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"database":{"description":"MySQL database name.","type":"string"},"host":{"description":"MySQL host name or IP address.","type":"string"},"lookml_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relative path to the directory of .lkml files backing this source's models."},"max_query_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum execution time for one query in seconds. Overrides execution.max_query_duration_seconds for this source."},"models":{"additionalProperties":{"$ref":"#/$defs/LookMLModelConfig"},"description":"Named LookML model collections nested under this source.","type":"object"},"password":{"description":"MySQL password.","type":"string"},"port":{"default":3306,"description":"MySQL port number.","type":"integer"},"schema":{"default":"","description":"Default schema for queries.","type":"string"},"type":{"description":"Source type identifier.","enum":["mysql"]},"user":{"description":"MySQL user name.","type":"string"}},"required":["type","host","database","user","password"],"type":"object"},"PaddingStyle":{"additionalProperties":false,"description":"Per-chart padding inset (px). All 4 sides required; theme YAML supplies defaults.","properties":{"bottom":{"description":"Bottom padding in pixels.","type":"number"},"left":{"description":"Left padding in pixels.","type":"number"},"right":{"description":"Right padding in pixels.","type":"number"},"top":{"description":"Top padding in pixels.","type":"number"}},"required":["left","right","top","bottom"],"type":"object"},"PaddingStylePatch":{"additionalProperties":false,"description":"Authored overlay for PaddingStyle. Per-chart padding inset (px). All 4 sides required; theme YAML supplies defaults.","properties":{"bottom":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bottom padding in pixels."},"left":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Left padding in pixels."},"right":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Right padding in pixels."},"top":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Top padding in pixels."}},"type":"object"},"PageStyle":{"additionalProperties":false,"description":"Page-level (outer HTML canvas) styling.","properties":{"background":{"description":"Page canvas background color (behind the face board).","type":"string"}},"required":["background"],"type":"object"},"PageStylePatch":{"additionalProperties":false,"description":"Authored overlay for PageStyle. Page-level (outer HTML canvas) styling.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Page canvas background color (behind the face board)."}},"type":"object"},"PaginationConfig":{"additionalProperties":false,"description":"Table pagination configuration.","properties":{"enabled":{"default":true,"description":"Enable client-side pagination for table charts.","type":"boolean"},"page_rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Rows per page. When enabled and None, the renderer auto-fits page size to the cell \u2014 set explicitly to pin the page size."}},"type":"object"},"PaginatorStyle":{"additionalProperties":false,"description":"Visual style for the paginator control (chevrons + page numbers).","properties":{"color_active":{"description":"Current page and live chevron color (theme body ink).","type":"string"},"color_disabled":{"description":"Chevron color when at first/last page (signals disabled by tone).","type":"string"},"color_inactive":{"description":"Other pages and ellipsis color (theme secondary text).","type":"string"},"font":{"$ref":"#/$defs/FontStyle","description":"Paginator font overrides (size, family)."},"item_width":{"description":"Per-item slot width in pixels (drives layout step).","type":"number"},"weight_active":{"description":"Font weight for the current (selected) page number.","type":"integer"},"weight_chevron":{"description":"Font weight for the prev/next chevrons (live and disabled). Usually heavier than weight_active so the chevrons read as interactive affordances against the lighter page numbers.","type":"integer"},"weight_inactive":{"description":"Font weight for other pages and ellipsis.","type":"integer"}},"required":["color_active","color_inactive","color_disabled","weight_active","weight_inactive","weight_chevron","item_width"],"type":"object"},"PaginatorStylePatch":{"additionalProperties":false,"description":"Authored overlay for PaginatorStyle. Visual style for the paginator control (chevrons + page numbers).","properties":{"color_active":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Current page and live chevron color (theme body ink)."},"color_disabled":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chevron color when at first/last page (signals disabled by tone)."},"color_inactive":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Other pages and ellipsis color (theme secondary text)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Paginator font overrides (size, family)."},"item_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Per-item slot width in pixels (drives layout step)."},"weight_active":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Font weight for the current (selected) page number."},"weight_chevron":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Font weight for the prev/next chevrons (live and disabled). Usually heavier than weight_active so the chevrons read as interactive affordances against the lighter page numbers."},"weight_inactive":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Font weight for other pages and ellipsis."}},"type":"object"},"ParquetSourceConfig":{"additionalProperties":false,"description":"Parquet file source configuration.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"files":{"description":"Mapping of table_name \u2192 file path. Each key is the SQL table name; the value is the path relative to the project root. Required and must not be empty.","type":"object"},"type":{"description":"Source type identifier.","enum":["parquet"]}},"required":["type","files"],"type":"object"},"PieChart":{"additionalProperties":false,"description":"Authored patch for pie and donut charts.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel: bare column name only."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"height":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Explicit chart height in pixels. Positive number only."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"style":{"anyOf":[{"$ref":"#/$defs/PieChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"theta":{"description":"Column for angular encoding in pie (arc) charts.","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"total":{"anyOf":[{"$ref":"#/$defs/ChartTotal"},{"type":"null"}],"description":"Donut center total."},"type":{"description":"Pie or donut chart type.","enum":["pie","donut"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"width":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Positive number only. Contributes to the dashboard's intrinsic width without overriding the final layout slot \u2014 the chart still fills its allocated container."}},"required":["type","theta"],"type":"object"},"PieChartMarksStyle":{"additionalProperties":false,"description":"Pie/donut-family mark overrides.","properties":{"slice":{"$ref":"#/$defs/SliceMarkStyle","description":"Slice mark overrides; inherits from global."},"text":{"anyOf":[{"$ref":"#/$defs/TextMarkStyle"},{"type":"null"}],"description":"Text mark overrides; None inherits global."}},"type":"object"},"PieChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for PieChartMarksStyle. Pie/donut-family mark overrides.","properties":{"slice":{"anyOf":[{"$ref":"#/$defs/SliceMarkStylePatch"},{"type":"null"}],"description":"Slice mark overrides; inherits from global."},"text":{"anyOf":[{"$ref":"#/$defs/TextMarkStylePatch"},{"type":"null"}],"description":"Text mark overrides; None inherits global."}},"type":"object"},"PieChartStyle":{"additionalProperties":false,"description":"Pie/donut chart style: geometry + total (flat) + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"description":"Aspect ratio (width/height) of the pie chart viewport.","type":"number"},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"inner_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Hole-to-disk ratio 0\u20131 (inner radius / outer radius). None = solid pie (no hole)."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/PieChartMarksStyle","description":"Pie-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."},"total":{"$ref":"#/$defs/TotalStyle","description":"Donut center total paint (value and label)."}},"required":["aspect_ratio","total"],"type":"object"},"PieChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for PieChartStyle. Pie/donut chart style: geometry + total (flat) + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Aspect ratio (width/height) of the pie chart viewport."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"inner_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Hole-to-disk ratio 0\u20131 (inner radius / outer radius). None = solid pie (no hole)."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/PieChartMarksStylePatch"},{"type":"null"}],"description":"Pie-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."},"total":{"anyOf":[{"$ref":"#/$defs/TotalStylePatch"},{"type":"null"}],"description":"Donut center total paint (value and label)."}},"type":"object"},"PlaceholderOverlay":{"additionalProperties":false,"properties":{"background":{"description":"Overlay background color.","type":"string"},"font":{"$ref":"#/$defs/FontStyle","description":"Overlay font style overrides. Unset fields fall back to `style.font`."},"text":{"description":"Placeholder overlay text shown on empty charts.","type":"string"}},"required":["text","background"],"type":"object"},"PlaceholderOverlayPatch":{"additionalProperties":false,"description":"Authored overlay for PlaceholderOverlay.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Overlay background color."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Overlay font style overrides. Unset fields fall back to `style.font`."},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Placeholder overlay text shown on empty charts."}},"type":"object"},"PlaceholderStyle":{"additionalProperties":false,"properties":{"opacity":{"description":"Opacity of the placeholder overlay (0\u20131).","type":"number"},"overlay":{"$ref":"#/$defs/PlaceholderOverlay","description":"Overlay text and background style."}},"required":["opacity","overlay"],"type":"object"},"PlaceholderStylePatch":{"additionalProperties":false,"description":"Authored overlay for PlaceholderStyle.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Opacity of the placeholder overlay (0\u20131)."},"overlay":{"anyOf":[{"$ref":"#/$defs/PlaceholderOverlayPatch"},{"type":"null"}],"description":"Overlay text and background style."}},"type":"object"},"PointLabelsStyle":{"additionalProperties":false,"description":"Point/line mark value-label config. Used by both LineMarkStyle and PointMarkStyle.","properties":{"dx":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Horizontal pixel offset for value labels; overrides the position default."},"dy":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Vertical pixel offset for value labels; overrides the position default."},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column to source label text from; None uses the chart's y-field."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Value label font style (color, size, family, etc.)."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Number format string for value labels."},"position":{"anyOf":[{"enum":["top","bottom","left","right","middle"]},{"type":"null"}],"description":"Label position relative to the point. 'top' places labels above the point. 'bottom' places labels below. 'left' to the left. 'right' to the right. 'middle' centers on the point."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show numeric value labels on each mark; False by default."}},"type":"object"},"PointLabelsStylePatch":{"additionalProperties":false,"description":"Authored overlay for PointLabelsStyle. Point/line mark value-label config. Used by both LineMarkStyle and PointMarkStyle.","properties":{"dx":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Horizontal pixel offset for value labels; overrides the position default."},"dy":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Vertical pixel offset for value labels; overrides the position default."},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column to source label text from; None uses the chart's y-field."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Value label font style (color, size, family, etc.)."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Number format string for value labels."},"position":{"anyOf":[{"enum":["top","bottom","left","right","middle"]},{"type":"null"}],"description":"Label position relative to the point. 'top' places labels above the point. 'bottom' places labels below. 'left' to the left. 'right' to the right. 'middle' centers on the point."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show numeric value labels on each mark; False by default."}},"type":"object"},"PointMapChart":{"additionalProperties":false,"description":"Authored patch for point_map and bubble_map charts.","properties":{"basemap":{"anyOf":[{"$ref":"#/$defs/BasemapConfig"},{"type":"null"}],"description":"Styled geographic background layer."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel: bare column name only."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"geo":{"anyOf":[{"type":"string"},{"type":"object"},{"type":"null"}],"description":"Named GeoJSON boundary source, or inline GeoJSON spec, for geoshape charts."},"geo_source":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Named geographic data source for loading GeoJSON boundaries."},"height":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Explicit chart height in pixels. Positive number only."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"latitude":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column containing latitude values for point/bubble maps."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"longitude":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column containing longitude values for point/bubble maps."},"lookup":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Data column to join against geographic data (map join key)."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"projection":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Map projection name or Vega-Lite projection config."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Data column used to scale bubble radius (quantitative). Only meaningful on bubble_map."},"style":{"anyOf":[{"$ref":"#/$defs/PointMapChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"Point map or bubble map chart type.","enum":["point_map","bubble_map"]},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Data column mapped to the fill color."},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"width":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Positive number only. Contributes to the dashboard's intrinsic width without overriding the final layout slot \u2014 the chart still fills its allocated container."}},"required":["type"],"type":"object"},"PointMapChartMarksStyle":{"additionalProperties":false,"description":"Point map-family mark overrides.","properties":{"point":{"$ref":"#/$defs/PointMarkStyle","description":"Point mark overrides; inherits from global."}},"type":"object"},"PointMapChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for PointMapChartMarksStyle. Point map-family mark overrides.","properties":{"point":{"anyOf":[{"$ref":"#/$defs/PointMarkStylePatch"},{"type":"null"}],"description":"Point mark overrides; inherits from global."}},"type":"object"},"PointMapChartStyle":{"additionalProperties":false,"description":"Point map chart style.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"basemap":{"$ref":"#/$defs/BasemapStyle","description":"Background map layer; None source = no topo layer."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/StaticGradientColorStyle"},{"type":"null"}],"description":"Geo color: static paint or gradient scale only (no categorical arm)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/PointMapChartMarksStyle","description":"Point-map-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"projection":{"$ref":"#/$defs/ProjectionStyle","description":"Vega-Lite projection configuration for this geo family."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"required":["projection"],"type":"object"},"PointMapChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for PointMapChartStyle. Point map chart style.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"basemap":{"anyOf":[{"$ref":"#/$defs/BasemapStylePatch"},{"type":"null"}],"description":"Background map layer; None source = no topo layer."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/StaticGradientColorStylePatch"},{"type":"null"}],"description":"Geo color: static paint or gradient scale only (no categorical arm)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/PointMapChartMarksStylePatch"},{"type":"null"}],"description":"Point-map-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"projection":{"anyOf":[{"$ref":"#/$defs/ProjectionStylePatch"},{"type":"null"}],"description":"Vega-Lite projection configuration for this geo family."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"PointMarkStyle":{"additionalProperties":false,"description":"Point mark style (data-point markers on scatter/point/line/area charts).","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Point color; None inherits the series color."},"fill":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Point interior fill color; only applied when filled=false."},"filled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether points are filled; None uses VL default."},"labels":{"$ref":"#/$defs/PointLabelsStyle","description":"Value label style for point marks. On line charts, setting marks.point.labels is an alias for marks.line.labels."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Point opacity 0\u20131; None uses VL default."},"shape":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Point shape (e.g. 'circle', 'square'); None uses VL default."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Point size in square pixels; 0 disables points on line charts."},"stroke_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Stroke width in pixels for hollow point rings; None uses VL default."}},"type":"object"},"PointMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for PointMarkStyle. Point mark style (data-point markers on scatter/point/line/area charts).","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Point color; None inherits the series color."},"fill":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Point interior fill color; only applied when filled=false."},"filled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether points are filled; None uses VL default."},"labels":{"anyOf":[{"$ref":"#/$defs/PointLabelsStylePatch"},{"type":"null"}],"description":"Value label style for point marks. On line charts, setting marks.point.labels is an alias for marks.line.labels."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Point opacity 0\u20131; None uses VL default."},"shape":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Point shape (e.g. 'circle', 'square'); None uses VL default."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Point size in square pixels; 0 disables points on line charts."},"stroke_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Stroke width in pixels for hollow point rings; None uses VL default."}},"type":"object"},"PostgresSourceConfig":{"additionalProperties":false,"description":"Postgres source configuration.","properties":{"application_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"dbt","description":"Application name reported to PostgreSQL."},"attribution":{"description":"Cost-attribution pairs sent with every query against this source, e.g. attribution: {team: analytics}. Emitted as BigQuery job labels and as a query comment elsewhere. Keys and values must match BigQuery's label rules ([a-z][a-z0-9_-]{0,62} / [a-z0-9_-]{0,63}); the dft_ prefix is reserved for the engine's own identity.","type":"object"},"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"connect_timeout":{"default":10,"description":"Connection timeout in seconds.","type":"integer"},"dbname":{"description":"Database name (dbt accepts database as an input alias).","type":"string"},"host":{"description":"Database host name or IP address.","type":"string"},"keepalives_idle":{"default":0,"description":"Idle seconds before TCP keepalives begin.","type":"integer"},"lookml_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relative path to the directory of .lkml files backing this source's models."},"max_query_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum execution time for one query in seconds. Overrides execution.max_query_duration_seconds for this source."},"models":{"additionalProperties":{"$ref":"#/$defs/LookMLModelConfig"},"description":"Named LookML model collections nested under this source.","type":"object"},"password":{"description":"Database password (dbt accepts pass as an input alias).","type":"string"},"port":{"default":5432,"description":"Database port number.","type":"integer"},"retries":{"default":1,"description":"Number of connection retry attempts.","type":"integer"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PostgreSQL role to assume after connecting."},"schema":{"default":"public","description":"Default schema for queries.","type":"string"},"search_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PostgreSQL search_path for the connection."},"sslcert":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Path to the client SSL certificate."},"sslkey":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Path to the client SSL private key."},"sslmode":{"anyOf":[{"enum":["disable","allow","prefer","require","verify-ca","verify-full"]},{"type":"null"}],"description":"libpq SSL mode forwarded to psycopg2. None lets libpq decide its default."},"sslrootcert":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Path to the trusted SSL certificate authority file."},"type":{"description":"Source type identifier.","enum":["postgres"]},"user":{"description":"Database user name.","type":"string"}},"required":["type","host","dbname","user","password"],"type":"object"},"ProjectionStyle":{"additionalProperties":false,"description":"Vega-Lite map projection configuration for geo chart families.","properties":{"type":{"description":"Vega-Lite projection type (e.g. 'mercator', 'albersUsa', 'equalEarth').","type":"string"}},"required":["type"],"type":"object"},"ProjectionStylePatch":{"additionalProperties":false,"description":"Authored overlay for ProjectionStyle. Vega-Lite map projection configuration for geo chart families.","properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Vega-Lite projection type (e.g. 'mercator', 'albersUsa', 'equalEarth')."}},"type":"object"},"QuantitativeAxisStyle":{"additionalProperties":false,"description":"Scale-type overlay for quantitative axes. Theme slot: axis_quantitative.","properties":{"grid":{"$ref":"#/$defs/BaseAxisGridStyle","description":"Grid line style for this axis."},"labels":{"$ref":"#/$defs/AxisLabelStyle","description":"Axis label style."},"line":{"$ref":"#/$defs/AxisLineStyle","description":"Domain line style for this axis."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Per-axis scale overrides; None means no override."},"ticks":{"$ref":"#/$defs/AxisTicksStyle","description":"Tick mark style for this axis."},"title":{"$ref":"#/$defs/AxisTitleStyle","description":"Axis title style."}},"type":"object"},"QuantitativeAxisStylePatch":{"additionalProperties":false,"description":"Authored overlay for QuantitativeAxisStyle. Scale-type overlay for quantitative axes. Theme slot: axis_quantitative.","properties":{"grid":{"anyOf":[{"$ref":"#/$defs/BaseAxisGridStylePatch"},{"type":"null"}],"description":"Grid line style for this axis."},"labels":{"anyOf":[{"$ref":"#/$defs/AxisLabelStylePatch"},{"type":"null"}],"description":"Axis label style."},"line":{"anyOf":[{"$ref":"#/$defs/AxisLineStylePatch"},{"type":"null"}],"description":"Domain line style for this axis."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Per-axis scale overrides; None means no override."},"ticks":{"anyOf":[{"$ref":"#/$defs/AxisTicksStylePatch"},{"type":"null"}],"description":"Tick mark style for this axis."},"title":{"anyOf":[{"$ref":"#/$defs/AxisTitleStylePatch"},{"type":"null"}],"description":"Axis title style."}},"type":"object"},"QueryRef":{"additionalProperties":false,"description":"Cross-file query reference. Bare string is coerced automatically.","properties":{"ref":{"description":"Reference path: '<file>.queries.<name>'. May start with one or more '../' segments to reach a sibling directory. A bare string value is coerced automatically.","type":"string"}},"required":["ref"],"type":"object"},"RangeDefaults":{"additionalProperties":false,"properties":{"default_max":{"description":"Default maximum value for range inputs.","type":"number"},"default_min":{"description":"Default minimum value for range inputs.","type":"number"},"default_step":{"description":"Default step size for range inputs.","type":"number"}},"required":["default_min","default_max","default_step"],"type":"object"},"RangeDefaultsPatch":{"additionalProperties":false,"description":"Authored overlay for RangeDefaults.","properties":{"default_max":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default maximum value for range inputs."},"default_min":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default minimum value for range inputs."},"default_step":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default step size for range inputs."}},"type":"object"},"RectMarkStyle":{"additionalProperties":false,"description":"Rect mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Mark stroke style; None means not overridden at this level."}},"type":"object"},"RectMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for RectMarkStyle. Rect mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Mark stroke style; None means not overridden at this level."}},"type":"object"},"RedshiftSourceConfig":{"additionalProperties":false,"description":"Redshift source configuration.","properties":{"access_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"AWS access key identifier."},"attribution":{"description":"Cost-attribution pairs sent with every query against this source, e.g. attribution: {team: analytics}. Emitted as BigQuery job labels and as a query comment elsewhere. Keys and values must match BigQuery's label rules ([a-z][a-z0-9_-]{0,62} / [a-z0-9_-]{0,63}); the dft_ prefix is reserved for the engine's own identity.","type":"object"},"autocommit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"Whether Redshift statements autocommit."},"autocreate":{"default":false,"description":"Whether dbt may create the database user.","type":"boolean"},"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Redshift cluster identifier for IAM authentication."},"connect_timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Connection timeout in seconds."},"db_groups":{"description":"Redshift database groups assigned to the user.","type":"array"},"dbname":{"description":"Redshift database name (dbt accepts database as an input alias).","type":"string"},"host":{"description":"Redshift cluster host name.","type":"string"},"iam_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"IAM profile ARN used for Redshift authentication."},"idc_client_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"Amazon Redshift driver","description":"IAM Identity Center client display name."},"idc_region":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"AWS IAM Identity Center region."},"idp_listen_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":7890,"description":"Local port used for identity-provider callbacks."},"idp_response_timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Identity-provider response timeout in seconds."},"is_serverless":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the target is Redshift Serverless."},"issuer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Identity-provider issuer URL."},"lookml_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relative path to the directory of .lkml files backing this source's models."},"max_query_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum execution time for one query in seconds. Overrides execution.max_query_duration_seconds for this source."},"method":{"default":"database","description":"Redshift authentication method.","type":"string"},"models":{"additionalProperties":{"$ref":"#/$defs/LookMLModelConfig"},"description":"Named LookML model collections nested under this source.","type":"object"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Redshift password. Omit for IAM-based authentication when supported."},"port":{"default":5439,"description":"Redshift port number.","type":"integer"},"ra3_node":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"Whether the target uses Redshift RA3 nodes."},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"AWS region containing the Redshift target."},"retries":{"default":1,"description":"Number of Redshift connection retry attempts.","type":"integer"},"retry_all":{"default":false,"description":"Whether all connection errors are retried.","type":"boolean"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"IAM role ARN used for Redshift operations."},"schema":{"default":"public","description":"Default schema for queries.","type":"string"},"secret_access_key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"AWS secret access key."},"serverless_acct_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"AWS account identifier for Redshift Serverless."},"serverless_work_group":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Redshift Serverless workgroup name."},"sslmode":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"prefer","description":"SSL verification mode for the Redshift connection."},"tcp_keepalive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"Whether TCP keepalives are enabled."},"tcp_keepalive_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of TCP keepalive probes before failure."},"tcp_keepalive_idle":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Idle seconds before TCP keepalives begin."},"tcp_keepalive_interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Seconds between TCP keepalive probes."},"token_endpoint":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Identity-provider token endpoint configuration."},"type":{"description":"Source type identifier.","enum":["redshift"]},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Redshift user name. Omit for IAM-based authentication when supported."}},"required":["type","host","dbname"],"type":"object"},"RootFontStyle":{"additionalProperties":false,"description":"Root-level font configuration: FontStyle fields plus a required emoji mode.","properties":{"case":{"anyOf":[{"enum":["none","sentence","title","upper","lower","slug","camel"]},{"type":"null"}],"description":"Letter-case transform applied at render time. 'title' uses Chicago/Gruber rules and preserves tokens with internal capitals (ARR, iPhone). 'sentence' uppercases only the first character. 'none' (default) emits the string without any letter-case change."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Text color as a CSS color string."},"decoration":{"anyOf":[{"enum":["none","line-through","underline"]},{"type":"null"}],"description":"Text decoration (underline, line-through, or none)."},"emoji":{"description":"Emoji rendering mode for the dashboard font stack.","enum":["monochrome","color","system-default","disabled"]},"family":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Font family name (e.g., 'sans-serif', 'Roboto')."},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Line height as a unitless multiple of font size. Cascades through Style.font to all text roles that carry a FontStyle slot. Body prose defaults to 1.25; titles override tighter via their font patch in theme YAML."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Font size in pixels."},"style":{"anyOf":[{"enum":["normal","italic"]},{"type":"null"}],"description":"Font style (normal or italic)."},"weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"description":"Font weight (e.g., 'bold', 400, 700)."}},"required":["emoji"],"type":"object"},"RootFontStylePatch":{"additionalProperties":false,"description":"Authored overlay for RootFontStyle. Root-level font configuration: FontStyle fields plus a required emoji mode.","properties":{"case":{"anyOf":[{"enum":["none","sentence","title","upper","lower","slug","camel"]},{"type":"null"}],"description":"Letter-case transform applied at render time. 'title' uses Chicago/Gruber rules and preserves tokens with internal capitals (ARR, iPhone). 'sentence' uppercases only the first character. 'none' (default) emits the string without any letter-case change."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Text color as a CSS color string."},"decoration":{"anyOf":[{"enum":["none","line-through","underline"]},{"type":"null"}],"description":"Text decoration (underline, line-through, or none)."},"emoji":{"anyOf":[{"enum":["monochrome","color","system-default","disabled"]},{"type":"null"}],"description":"Emoji rendering mode for the dashboard font stack."},"family":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Font family name (e.g., 'sans-serif', 'Roboto')."},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Line height as a unitless multiple of font size. Cascades through Style.font to all text roles that carry a FontStyle slot. Body prose defaults to 1.25; titles override tighter via their font patch in theme YAML."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Font size in pixels."},"style":{"anyOf":[{"enum":["normal","italic"]},{"type":"null"}],"description":"Font style (normal or italic)."},"weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"description":"Font weight (e.g., 'bold', 400, 700)."}},"type":"object"},"RuleMarkStyle":{"additionalProperties":false,"description":"Rule (reference line) mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"$ref":"#/$defs/FontColorStrokeStyle","description":"Mark stroke style."}},"type":"object"},"RuleMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for RuleMarkStyle. Rule (reference line) mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/FontColorStrokeStylePatch"},{"type":"null"}],"description":"Mark stroke style."}},"type":"object"},"RuleStyle":{"additionalProperties":false,"description":"Shared rule-line primitive: width, color, continuous mode.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Rule color; None inherits from theme."},"continuous":{"description":"Draw a continuous full-width rule (true) or only under columns (false).","type":"boolean"},"width":{"description":"Rule line width in pixels.","type":"number"}},"required":["width","continuous"],"type":"object"},"RuleStylePatch":{"additionalProperties":false,"description":"Authored overlay for RuleStyle. Shared rule-line primitive: width, color, continuous mode.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Rule color; None inherits from theme."},"continuous":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Draw a continuous full-width rule (true) or only under columns (false)."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Rule line width in pixels."}},"type":"object"},"SQLiteSourceConfig":{"additionalProperties":false,"description":"SQLite source configuration.","properties":{"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"lookml_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relative path to the directory of .lkml files backing this source's models."},"models":{"additionalProperties":{"$ref":"#/$defs/LookMLModelConfig"},"description":"Named LookML model collections nested under this source.","type":"object"},"path":{"description":"Path to the SQLite database file.","type":"string"},"type":{"description":"Source type identifier.","enum":["sqlite"]}},"required":["type","path"],"type":"object"},"ScaleContinuousStyle":{"additionalProperties":false,"description":"Continuous-scale-only config: type, domain, zero-baseline, log/pow/symlog params.","properties":{"domain":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit [low, high] scale domain; None lets Vega-Lite auto-determine from data. Must have exactly 2 elements \u2014 Dataface only wires a continuous range override through to Vega-Lite, not an explicit category enumeration. When ``type: temporal`` is set, both elements must be ISO-8601 date/datetime strings."},"domain_strategy":{"anyOf":[{"enum":["stable","auto"]},{"type":"null"}],"description":"How the numeric domain responds to filter-variable changes when no explicit `domain` is authored. 'stable' (the default when None) pins the domain to the chart query's full unfiltered extent \u2014 the same value lands at the same pixel across variable changes. 'auto' rescales the domain to the current filtered subset on every variable change. An explicit `domain` always wins over either strategy."},"log":{"anyOf":[{"$ref":"#/$defs/ScaleLogStyle"},{"type":"null"}],"description":"Log-scale param (base); only meaningful with type: log."},"pow":{"anyOf":[{"$ref":"#/$defs/ScalePowStyle"},{"type":"null"}],"description":"Power-scale param (exponent); only meaningful with type: pow."},"symlog":{"anyOf":[{"$ref":"#/$defs/ScaleSymlogStyle"},{"type":"null"}],"description":"Symlog-scale param (constant); only meaningful with type: symlog."},"type":{"anyOf":[{"enum":["linear","log","pow","sqrt","symlog","temporal"]},{"type":"null"}],"description":"Scale type override. 'linear'/'log'/'pow'/'sqrt'/'symlog' pass straight through to Vega-Lite's quantitative scale.type. 'temporal' is a Dataface escape hatch for a cartesian x-axis: it forces a continuous temporal scale instead of the auto-inferred ordinal/nominal bucketed type, which is required before an authored ``domain`` of ISO dates can extend the visible range past the data extent. None lets Dataface/Vega-Lite infer from the field type."},"zero":{"anyOf":[{"enum":["auto"]},{"type":"boolean"},{"type":"null"}],"description":"Force scale zero-baseline: True/False pins it; \"auto\" runs the Dataface smart-zero heuristic; None passes through to Vega-Lite."}},"type":"object"},"ScaleContinuousStylePatch":{"additionalProperties":false,"description":"Authored overlay for ScaleContinuousStyle. Continuous-scale-only config: type, domain, zero-baseline, log/pow/symlog params.","properties":{"domain":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit [low, high] scale domain; None lets Vega-Lite auto-determine from data. Must have exactly 2 elements \u2014 Dataface only wires a continuous range override through to Vega-Lite, not an explicit category enumeration. When ``type: temporal`` is set, both elements must be ISO-8601 date/datetime strings."},"domain_strategy":{"anyOf":[{"enum":["stable","auto"]},{"type":"null"}],"description":"How the numeric domain responds to filter-variable changes when no explicit `domain` is authored. 'stable' (the default when None) pins the domain to the chart query's full unfiltered extent \u2014 the same value lands at the same pixel across variable changes. 'auto' rescales the domain to the current filtered subset on every variable change. An explicit `domain` always wins over either strategy."},"log":{"anyOf":[{"$ref":"#/$defs/ScaleLogStylePatch"},{"type":"null"}],"description":"Log-scale param (base); only meaningful with type: log."},"pow":{"anyOf":[{"$ref":"#/$defs/ScalePowStylePatch"},{"type":"null"}],"description":"Power-scale param (exponent); only meaningful with type: pow."},"symlog":{"anyOf":[{"$ref":"#/$defs/ScaleSymlogStylePatch"},{"type":"null"}],"description":"Symlog-scale param (constant); only meaningful with type: symlog."},"type":{"anyOf":[{"enum":["linear","log","pow","sqrt","symlog","temporal"]},{"type":"null"}],"description":"Scale type override. 'linear'/'log'/'pow'/'sqrt'/'symlog' pass straight through to Vega-Lite's quantitative scale.type. 'temporal' is a Dataface escape hatch for a cartesian x-axis: it forces a continuous temporal scale instead of the auto-inferred ordinal/nominal bucketed type, which is required before an authored ``domain`` of ISO dates can extend the visible range past the data extent. None lets Dataface/Vega-Lite infer from the field type."},"zero":{"anyOf":[{"enum":["auto"]},{"type":"boolean"},{"type":"null"}],"description":"Force scale zero-baseline: True/False pins it; \"auto\" runs the Dataface smart-zero heuristic; None passes through to Vega-Lite."}},"type":"object"},"ScaleLogStyle":{"additionalProperties":false,"description":"Log-scale-only param.","properties":{"base":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Log base; only meaningful with type: log. None lets Vega-Lite apply its own default (10)."}},"type":"object"},"ScaleLogStylePatch":{"additionalProperties":false,"description":"Authored overlay for ScaleLogStyle. Log-scale-only param.","properties":{"base":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Log base; only meaningful with type: log. None lets Vega-Lite apply its own default (10)."}},"type":"object"},"ScalePowStyle":{"additionalProperties":false,"description":"Power-scale-only param.","properties":{"exponent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Power exponent; only meaningful with type: pow. None uses Vega-Lite's default."}},"type":"object"},"ScalePowStylePatch":{"additionalProperties":false,"description":"Authored overlay for ScalePowStyle. Power-scale-only param.","properties":{"exponent":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Power exponent; only meaningful with type: pow. None uses Vega-Lite's default."}},"type":"object"},"ScaleSymlogStyle":{"additionalProperties":false,"description":"Symlog-scale-only param.","properties":{"constant":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Symlog constant; only meaningful with type: symlog. None uses Vega-Lite's default."}},"type":"object"},"ScaleSymlogStylePatch":{"additionalProperties":false,"description":"Authored overlay for ScaleSymlogStyle. Symlog-scale-only param.","properties":{"constant":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Symlog constant; only meaningful with type: symlog. None uses Vega-Lite's default."}},"type":"object"},"ScaleTargetConfig":{"additionalProperties":false,"description":"Scale configuration for a single style target (background or color).","properties":{"arm_mode":{"default":"asymmetric","description":"How diverging scale arms are stretched: 'asymmetric' (proportional) or 'symmetric' (equal arms).","enum":["asymmetric","symmetric"]},"domain":{"anyOf":[{"enum":["data"]},{"type":"null"}],"default":"data","description":"Scale domain source ('data' uses the data extent; None uses explicit min/max)."},"hinge":{"anyOf":[{"enum":["auto"]},{"type":"number"},{"type":"null"}],"description":"Diverging scale midpoint value, or 'auto' to use the data midpoint."},"max":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"null"}],"description":"Maximum scale domain value (overrides data maximum)."},"min":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"null"}],"description":"Minimum scale domain value (overrides data minimum)."},"null_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color assigned to null values."},"palette":{"anyOf":[{"type":"array"},{"type":"string"}],"description":"Color palette: CSS color list for categorical, float list for relative stops, or a named Vega scheme."}},"required":["palette"],"type":"object"},"ScaleTargetConfigPatch":{"additionalProperties":false,"description":"Authored overlay for ScaleTargetConfig. Scale configuration for a single style target (background or color).","properties":{"arm_mode":{"anyOf":[{"enum":["asymmetric","symmetric"]},{"type":"null"}],"description":"How diverging scale arms are stretched: 'asymmetric' (proportional) or 'symmetric' (equal arms)."},"domain":{"anyOf":[{"enum":["data"]},{"type":"null"}],"description":"Scale domain source ('data' uses the data extent; None uses explicit min/max)."},"hinge":{"anyOf":[{"enum":["auto"]},{"type":"number"},{"type":"null"}],"description":"Diverging scale midpoint value, or 'auto' to use the data midpoint."},"max":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"null"}],"description":"Maximum scale domain value (overrides data maximum)."},"min":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"null"}],"description":"Minimum scale domain value (overrides data minimum)."},"null_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color assigned to null values."},"palette":{"anyOf":[{"type":"array"},{"type":"string"},{"type":"null"}],"description":"Color palette: CSS color list for categorical, float list for relative stops, or a named Vega scheme."}},"type":"object"},"ScatterChart":{"additionalProperties":false,"description":"Authored patch for scatter charts.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel: bare column name only."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"data_table":{"anyOf":[{"$ref":"#/$defs/ChartDataTable"},{"type":"null"}],"description":"Optional mini data-grid attached below/above the chart."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"height":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Explicit chart height in pixels. Positive number only. When set, overrides aspect_ratio and theme cascade. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"layers":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/$defs/BarLayer"},{"$ref":"#/$defs/LineLayer"},{"$ref":"#/$defs/AreaLayer"},{"$ref":"#/$defs/ScatterLayer"}]},"type":"array"},{"type":"null"}],"description":"Typed overlay layers on this chart."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"multiples":{"anyOf":[{"$ref":"#/$defs/MultiplesConfig"},{"type":"null"}],"description":"Partition this chart into small multiples by a `rows` column (vertical stack), a `columns` column (side by side), or both (grid). Panels share one measure scale by default."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"shape":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column used to shape-encode data points (categorical)."},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column used to size-encode data points (quantitative)."},"sort":{"anyOf":[{"$ref":"#/$defs/ChartSort"},{"type":"null"}],"description":"Sort configuration: column to sort by and direction (asc/desc)."},"style":{"anyOf":[{"$ref":"#/$defs/ScatterChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"Scatter chart type.","enum":["scatter"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"width":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Positive number only. Contributes to the dashboard's intrinsic width without overriding the final layout slot \u2014 the chart still fills its allocated container. Valid on cartesian chart families (area, bar, heatmap, histogram, line, scatter), pie/donut, and geo families (geoshape, map, point_map, bubble_map). Other chart families use renderer-owned or layout-owned sizing contracts."},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name from the query result."},"x_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the X axis."},"y":{"anyOf":[{"type":"string"},{"type":"array"},{"type":"null"}],"description":"Y-axis column name(s). Accepts a single column or list for multi-series charts."},"y_label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom label for the Y axis."}},"required":["type"],"type":"object"},"ScatterChartMarksStyle":{"additionalProperties":false,"description":"Scatter-family mark overrides.","properties":{"point":{"$ref":"#/$defs/PointMarkStyle","description":"Point mark overrides; inherits from global."},"text":{"$ref":"#/$defs/TextMarkStyle","description":"Text mark overrides; inherits from global."}},"type":"object"},"ScatterChartMarksStylePatch":{"additionalProperties":false,"description":"Authored overlay for ScatterChartMarksStyle. Scatter-family mark overrides.","properties":{"point":{"anyOf":[{"$ref":"#/$defs/PointMarkStylePatch"},{"type":"null"}],"description":"Point mark overrides; inherits from global."},"text":{"anyOf":[{"$ref":"#/$defs/TextMarkStylePatch"},{"type":"null"}],"description":"Text mark overrides; inherits from global."}},"type":"object"},"ScatterChartStyle":{"additionalProperties":false,"description":"Scatter chart style: chart-level fields + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"$ref":"#/$defs/ScatterChartMarksStyle","description":"Scatter-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStyle"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"ScatterChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for ScatterChartStyle. Scatter chart style: chart-level fields + marks sub-block.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"axis":{"anyOf":[{"$ref":"#/$defs/BaseAxisStylePatch"},{"type":"null"}],"description":"Override applied to both x and y axes; None inherits the global axis at render."},"axis_band":{"anyOf":[{"$ref":"#/$defs/BandAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type categorical (band) axis overrides; None inherits the global band axis at render."},"axis_quantitative":{"anyOf":[{"$ref":"#/$defs/QuantitativeAxisStylePatch"},{"type":"null"}],"description":"Per-chart-type quantitative-axis overrides; None inherits the global axis_quantitative at render."},"axis_x":{"anyOf":[{"$ref":"#/$defs/AxisXStylePatch"},{"type":"null"}],"description":"Per-chart-type x-axis style overrides; None inherits the global axis_x at render."},"axis_y":{"anyOf":[{"$ref":"#/$defs/AxisYStylePatch"},{"type":"null"}],"description":"Per-chart-type y-axis style overrides; None inherits the global axis_y at render."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart-local background color override; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Chart card border style."},"color":{"anyOf":[{"$ref":"#/$defs/ColorStylePatch"},{"type":"null"}],"description":"Chart color: static mark paint, categorical palette, and/or gradient scale."},"data_table":{"anyOf":[{"$ref":"#/$defs/DataTableStylePatch"},{"type":"null"}],"description":"Per-chart-type data_table style override. Unset fields fall back to `style.charts.data_table`."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Chart-level font overrides."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"marks":{"anyOf":[{"$ref":"#/$defs/ScatterChartMarksStylePatch"},{"type":"null"}],"description":"Scatter-family mark overrides. Unset fields fall back to `style.charts.marks`."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default number format for axes and tooltips (D3 format string); None inherits from theme."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"scale":{"anyOf":[{"$ref":"#/$defs/BaseScaleStylePatch"},{"type":"null"}],"description":"Chart-type encoding scale overrides applied to both x and y; None means no override."},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default time format for temporal axes (D3 time format string); None inherits from theme."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."}},"type":"object"},"ScatterLayer":{"additionalProperties":false,"description":"A scatter-type layer on a cartesian chart.","properties":{"axis_y":{"anyOf":[{"$ref":"#/$defs/LayerAxisYStyle"},{"type":"null"}],"description":"Y-axis settings for this layer (orientation, title)."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color data channel for this layer: bare column name only."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Label column name for this layer."},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Query name for this layer's data (overrides chart-level query)."},"style":{"anyOf":[{"$ref":"#/$defs/ScatterLayerStylePatch"},{"type":"null"}],"description":"Scatter layer mark style overrides."},"type":{"description":"Scatter (point) mark layer.","enum":["scatter"]},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis column name for this layer."},"y":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Y-axis column name for this layer."}},"required":["type"],"type":"object"},"ScatterLayerStylePatch":{"additionalProperties":false,"description":"Authored overlay for ScatterLayerStyle. Required wrapper for scatter-layer mark overrides (built into a Patch by build_patch_model).","properties":{"marks":{"anyOf":[{"$ref":"#/$defs/ScatterChartMarksStylePatch"},{"type":"null"}],"description":"Mark overrides for this scatter layer."}},"type":"object"},"SeriesLabelFontStyle":{"additionalProperties":false,"description":"Series-label typography with a compact width-tier size.","properties":{"case":{"anyOf":[{"enum":["none","sentence","title","upper","lower","slug","camel"]},{"type":"null"}],"description":"Letter-case transform applied at render time. 'title' uses Chicago/Gruber rules and preserves tokens with internal capitals (ARR, iPhone). 'sentence' uppercases only the first character. 'none' (default) emits the string without any letter-case change."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Text color as a CSS color string."},"compact_size":{"description":"Series-label font size in pixels on tiny and narrow cards.","type":"number"},"compact_weight":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Series-label font weight on tiny and narrow cards."},"decoration":{"anyOf":[{"enum":["none","line-through","underline"]},{"type":"null"}],"description":"Text decoration (underline, line-through, or none)."},"family":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Font family name (e.g., 'sans-serif', 'Roboto')."},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Line height as a unitless multiple of font size. Cascades through Style.font to all text roles that carry a FontStyle slot. Body prose defaults to 1.25; titles override tighter via their font patch in theme YAML."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Font size in pixels."},"style":{"anyOf":[{"enum":["normal","italic"]},{"type":"null"}],"description":"Font style (normal or italic)."},"weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"description":"Font weight (e.g., 'bold', 400, 700)."}},"required":["compact_size","compact_weight"],"type":"object"},"SeriesLabelFontStylePatch":{"additionalProperties":false,"description":"Authored overlay for SeriesLabelFontStyle. Series-label typography with a compact width-tier size.","properties":{"case":{"anyOf":[{"enum":["none","sentence","title","upper","lower","slug","camel"]},{"type":"null"}],"description":"Letter-case transform applied at render time. 'title' uses Chicago/Gruber rules and preserves tokens with internal capitals (ARR, iPhone). 'sentence' uppercases only the first character. 'none' (default) emits the string without any letter-case change."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Text color as a CSS color string."},"compact_size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Series-label font size in pixels on tiny and narrow cards."},"compact_weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"description":"Series-label font weight on tiny and narrow cards."},"decoration":{"anyOf":[{"enum":["none","line-through","underline"]},{"type":"null"}],"description":"Text decoration (underline, line-through, or none)."},"family":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Font family name (e.g., 'sans-serif', 'Roboto')."},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Line height as a unitless multiple of font size. Cascades through Style.font to all text roles that carry a FontStyle slot. Body prose defaults to 1.25; titles override tighter via their font patch in theme YAML."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Font size in pixels."},"style":{"anyOf":[{"enum":["normal","italic"]},{"type":"null"}],"description":"Font style (normal or italic)."},"weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"description":"Font weight (e.g., 'bold', 400, 700)."}},"type":"object"},"SeriesLabelStyle":{"additionalProperties":false,"description":"Series-label primitive \u2014 typography for any text mark that names a","properties":{"font":{"$ref":"#/$defs/SeriesLabelFontStyle","description":"Series label font style overrides; cascade fills missing fields from charts.font. Unset fields fall back to `style.charts.font`."}},"required":["font"],"type":"object"},"SeriesLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for SeriesLabelStyle. Series-label primitive \u2014 typography for any text mark that names a","properties":{"font":{"anyOf":[{"$ref":"#/$defs/SeriesLabelFontStylePatch"},{"type":"null"}],"description":"Series label font style overrides; cascade fills missing fields from charts.font. Unset fields fall back to `style.charts.font`."}},"type":"object"},"SingleRowBoolProbe":{"additionalProperties":false,"description":"Single-row boolean query probe.","properties":{"column":{"description":"Column in the single result row holding the boolean value.","type":"string"},"query":{"description":"Name of the query to execute.","type":"string"}},"required":["query","column"],"type":"object"},"SliceLabelsStyle":{"additionalProperties":false,"description":"Pie labels: typography + positioning offsets for per-slice text.","properties":{"default_template":{"$ref":"#/$defs/LabelsDefaultTemplate","description":"Default Jinja templates for per-slice labels when template is not authored."},"font":{"$ref":"#/$defs/FontStyle","description":"Slice label font style overrides. Unset fields fall back to `style.charts.font`."},"line_height":{"description":"Line height for slice labels in pixels. Reserved vertical space above the disk is ``line_height \u00d7 <rendered lines>`` per row, so the same value handles 1-line, 2-line, and multi-line templates.","type":"number"},"offset":{"description":"Radial offset of slice labels from the arc in pixels.","type":"number"},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Jinja2 label template. Overrides default_template when authored."},"where":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Jinja2 boolean filter \u2014 labels only render on rows where this is truthy."}},"required":["offset","line_height","default_template"],"type":"object"},"SliceLabelsStylePatch":{"additionalProperties":false,"description":"Authored overlay for SliceLabelsStyle. Pie labels: typography + positioning offsets for per-slice text.","properties":{"default_template":{"anyOf":[{"$ref":"#/$defs/LabelsDefaultTemplatePatch"},{"type":"null"}],"description":"Default Jinja templates for per-slice labels when template is not authored."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Slice label font style overrides. Unset fields fall back to `style.charts.font`."},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Line height for slice labels in pixels. Reserved vertical space above the disk is ``line_height \u00d7 <rendered lines>`` per row, so the same value handles 1-line, 2-line, and multi-line templates."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Radial offset of slice labels from the arc in pixels."},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Jinja2 label template. Overrides default_template when authored."},"where":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Jinja2 boolean filter \u2014 labels only render on rows where this is truthy."}},"type":"object"},"SliceMarkStyle":{"additionalProperties":false,"description":"Pie/donut slice mark \u2014 mark-level paint and layout only.","properties":{"corner_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Corner radius of arc slices in pixels."},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Angular gap between slices in radians."},"labels":{"anyOf":[{"$ref":"#/$defs/SliceLabelsStyle"},{"type":"null"}],"description":"Per-slice label style."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Arc slice opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Arc slice stroke style."}},"type":"object"},"SliceMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for SliceMarkStyle. Pie/donut slice mark \u2014 mark-level paint and layout only.","properties":{"corner_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Corner radius of arc slices in pixels."},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Angular gap between slices in radians."},"labels":{"anyOf":[{"$ref":"#/$defs/SliceLabelsStylePatch"},{"type":"null"}],"description":"Per-slice label style."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Arc slice opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Arc slice stroke style."}},"type":"object"},"SnowflakeSourceConfig":{"additionalProperties":false,"description":"Snowflake source configuration.","properties":{"account":{"description":"Snowflake account identifier (e.g. xy12345.us-east-1).","type":"string"},"attribution":{"description":"Cost-attribution pairs sent with every query against this source, e.g. attribution: {team: analytics}. Emitted as BigQuery job labels and as a query comment elsewhere. Keys and values must match BigQuery's label rules ([a-z][a-z0-9_-]{0,62} / [a-z0-9_-]{0,63}); the dft_ prefix is reserved for the engine's own identity.","type":"object"},"authenticator":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snowflake authenticator name or external-browser mode."},"cache":{"anyOf":[{"$ref":"#/$defs/CachePatch"},{"type":"null"}],"description":"Cache policy default for every query against this source, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts them out."},"client_session_keep_alive":{"default":false,"description":"Whether Snowflake keeps the client session alive.","type":"boolean"},"connect_retries":{"default":1,"description":"Number of retries while opening a connection.","type":"integer"},"connect_timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Connection timeout in seconds."},"database":{"description":"Snowflake database name.","type":"string"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snowflake host override."},"insecure_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"Whether TLS certificate verification is disabled."},"lookml_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relative path to the directory of .lkml files backing this source's models."},"max_query_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum execution time for one query in seconds. Overrides execution.max_query_duration_seconds for this source."},"models":{"additionalProperties":{"$ref":"#/$defs/LookMLModelConfig"},"description":"Named LookML model collections nested under this source.","type":"object"},"oauth_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth client identifier."},"oauth_client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth client secret."},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snowflake password. Omit when using OAuth or key-pair auth."},"platform_detection_timeout_seconds":{"default":0.0,"description":"Timeout for Snowflake platform detection.","type":"number"},"port":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Snowflake port override."},"private_key":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PEM private key used for key-pair authentication."},"private_key_passphrase":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Passphrase for the configured private key."},"private_key_path":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Path to a PEM private key for key-pair authentication."},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Network protocol for the Snowflake connection."},"proxy_host":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"HTTP proxy host for Snowflake connections."},"proxy_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"HTTP proxy port for Snowflake connections."},"query_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snowflake query tag applied to statements."},"retry_all":{"default":false,"description":"Whether all connection errors are retried.","type":"boolean"},"retry_on_database_errors":{"default":false,"description":"Whether database errors are retried.","type":"boolean"},"reuse_connections":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether dbt reuses Snowflake connections."},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snowflake role to assume for the session."},"s3_stage_vpce_dns_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Private VPC endpoint DNS name for S3 staging."},"schema":{"default":"PUBLIC","description":"Default schema for queries.","type":"string"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth access token for token authentication."},"type":{"description":"Source type identifier.","enum":["snowflake"]},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snowflake user name. Omit for token-based authentication when supported."},"warehouse":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snowflake virtual warehouse name."}},"required":["type","account","database"],"type":"object"},"SpacingValues":{"additionalProperties":false,"description":"Pre-parsed CSS spacing (margin/padding).","properties":{"bottom":{"default":0.0,"description":"Bottom spacing in pixels.","type":"number"},"left":{"default":0.0,"description":"Left spacing in pixels.","type":"number"},"right":{"default":0.0,"description":"Right spacing in pixels.","type":"number"},"top":{"default":0.0,"description":"Top spacing in pixels.","type":"number"}},"type":"object"},"SparkAreaStyle":{"additionalProperties":false,"properties":{"fill_opacity":{"description":"Spark area fill opacity (0\u20131).","type":"number"}},"required":["fill_opacity"],"type":"object"},"SparkAreaStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkAreaStyle.","properties":{"fill_opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Spark area fill opacity (0\u20131)."}},"type":"object"},"SparkBarBarStyle":{"additionalProperties":false,"description":"Bar geometry sub-block for SparkBarChartStyle.","properties":{"background":{"description":"Bar track background color - fill-grade, pinned per theme.","type":"string"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bar fill color; None seeds from style.charts.color.categorical.single_series_palette[0]."},"height":{"description":"Height of each bar in pixels.","type":"number"},"padding":{"description":"Vertical padding between bars in pixels.","type":"number"}},"required":["height","padding","background"],"type":"object"},"SparkBarBarStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkBarBarStyle. Bar geometry sub-block for SparkBarChartStyle.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bar track background color - fill-grade, pinned per theme."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bar fill color; None seeds from style.charts.color.categorical.single_series_palette[0]."},"height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Height of each bar in pixels."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical padding between bars in pixels."}},"type":"object"},"SparkBarCellStyle":{"additionalProperties":false,"description":"Inline `spark.type: bar` and `bar-normalize` (single horizontal bar) defaults.","properties":{"background":{"description":"Track background color - fill-grade, pinned per theme.","type":"string"},"border":{"$ref":"#/$defs/BorderStyle","description":"Spark bar border style."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bar fill color; None seeds from style.charts.color.categorical.single_series_palette[0]."},"default_max":{"description":"Default maximum value for bar scale when no explicit max is authored.","type":"number"},"font":{"$ref":"#/$defs/FontStyle","description":"Spark bar cell font style overrides. Unset fields fall back to `style.charts.font`."},"label":{"$ref":"#/$defs/SparkBarLabelStyle","description":"Spark bar inline label style."}},"required":["background","default_max","border","label"],"type":"object"},"SparkBarCellStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkBarCellStyle. Inline `spark.type: bar` and `bar-normalize` (single horizontal bar) defaults.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Track background color - fill-grade, pinned per theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Spark bar border style."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bar fill color; None seeds from style.charts.color.categorical.single_series_palette[0]."},"default_max":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default maximum value for bar scale when no explicit max is authored."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Spark bar cell font style overrides. Unset fields fall back to `style.charts.font`."},"label":{"anyOf":[{"$ref":"#/$defs/SparkBarLabelStylePatch"},{"type":"null"}],"description":"Spark bar inline label style."}},"type":"object"},"SparkBarChart":{"additionalProperties":false,"description":"Authored patch for spark_bar charts (compact horizontal bars).","properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"style":{"anyOf":[{"$ref":"#/$defs/SparkBarChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"SparkBar chart type.","enum":["spark_bar"]},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"X-axis (label) column name."},"y":{"anyOf":[{"type":"string"},{"type":"array"},{"type":"null"}],"description":"Y-axis (value) column name(s)."}},"required":["type"],"type":"object"},"SparkBarChartLabelStyle":{"additionalProperties":false,"description":"Category-label sub-block for SparkBarChartStyle.","properties":{"visible":{"description":"Show series label text next to bars.","type":"boolean"},"width":{"description":"Reserved width for bar label text in pixels.","type":"number"}},"required":["visible","width"],"type":"object"},"SparkBarChartLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkBarChartLabelStyle. Category-label sub-block for SparkBarChartStyle.","properties":{"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show series label text next to bars."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Reserved width for bar label text in pixels."}},"type":"object"},"SparkBarChartStyle":{"additionalProperties":false,"description":"Produced by cascade from theme YAML.","properties":{"bar":{"$ref":"#/$defs/SparkBarBarStyle","description":"Bar geometry (height, padding, color)."},"border":{"$ref":"#/$defs/BorderStyle","description":"Spark_bar outer border style."},"count":{"$ref":"#/$defs/SparkBarCountStyle","description":"Count-value column (visibility, reserved width)."},"font":{"$ref":"#/$defs/FontStyle","description":"Spark_bar font style overrides. Unset fields fall back to `style.charts.font`."},"label":{"$ref":"#/$defs/SparkBarChartLabelStyle","description":"Category-label column (visibility, reserved width)."},"max_bars":{"description":"Maximum number of bars to render.","type":"integer"},"min_width":{"description":"Minimum spark_bar chart width in pixels.","type":"number"},"padding":{"$ref":"#/$defs/PaddingStyle","description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"description":"Preferred spark_bar chart width in pixels.","type":"number"},"subtitle":{"$ref":"#/$defs/SubtitleStyle","description":"Spark_bar subtitle font-sizing constants."}},"required":["preferred_width","min_width","padding","bar","label","count","max_bars","border","subtitle"],"type":"object"},"SparkBarChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkBarChartStyle. Produced by cascade from theme YAML.","properties":{"bar":{"anyOf":[{"$ref":"#/$defs/SparkBarBarStylePatch"},{"type":"null"}],"description":"Bar geometry (height, padding, color)."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Spark_bar outer border style."},"count":{"anyOf":[{"$ref":"#/$defs/SparkBarCountStylePatch"},{"type":"null"}],"description":"Count-value column (visibility, reserved width)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Spark_bar font style overrides. Unset fields fall back to `style.charts.font`."},"label":{"anyOf":[{"$ref":"#/$defs/SparkBarChartLabelStylePatch"},{"type":"null"}],"description":"Category-label column (visibility, reserved width)."},"max_bars":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of bars to render."},"min_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum spark_bar chart width in pixels."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred spark_bar chart width in pixels."},"subtitle":{"anyOf":[{"$ref":"#/$defs/SubtitleStylePatch"},{"type":"null"}],"description":"Spark_bar subtitle font-sizing constants."}},"type":"object"},"SparkBarCountStyle":{"additionalProperties":false,"description":"Count-value sub-block for SparkBarChartStyle.","properties":{"visible":{"description":"Show count/value text next to bars.","type":"boolean"},"width":{"description":"Reserved width for bar count text in pixels.","type":"number"}},"required":["visible","width"],"type":"object"},"SparkBarCountStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkBarCountStyle. Count-value sub-block for SparkBarChartStyle.","properties":{"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show count/value text next to bars."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Reserved width for bar count text in pixels."}},"type":"object"},"SparkBarLabelStyle":{"additionalProperties":false,"properties":{"fill":{"description":"Label text fill color.","type":"string"},"fill_opacity":{"description":"Label text fill opacity (0\u20131).","type":"number"},"height_offset":{"description":"Vertical offset of the label from its bar top in pixels.","type":"number"},"inset_x":{"description":"Horizontal inset for the spark bar label in pixels.","type":"number"},"min_size":{"description":"Minimum bar fill width required to show the label in pixels.","type":"number"}},"required":["inset_x","fill","fill_opacity","min_size","height_offset"],"type":"object"},"SparkBarLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkBarLabelStyle.","properties":{"fill":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Label text fill color."},"fill_opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Label text fill opacity (0\u20131)."},"height_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical offset of the label from its bar top in pixels."},"inset_x":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Horizontal inset for the spark bar label in pixels."},"min_size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum bar fill width required to show the label in pixels."}},"type":"object"},"SparkColumnStyle":{"additionalProperties":false,"description":"Inline `spark.type: column` (single vertical bar) defaults.","properties":{"height":{"description":"Spark column default height in pixels.","type":"number"},"width":{"description":"Spark column default width in pixels.","type":"number"}},"required":["width","height"],"type":"object"},"SparkColumnStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkColumnStyle. Inline `spark.type: column` (single vertical bar) defaults.","properties":{"height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Spark column default height in pixels."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Spark column default width in pixels."}},"type":"object"},"SparkColumnsStyle":{"additionalProperties":false,"description":"Inline `spark.type: columns` (multi-value vertical bars) defaults.","properties":{"border":{"$ref":"#/$defs/BorderStyle","description":"Column bar border style."},"gap":{"description":"Gap between column bars in pixels.","type":"number"},"min_bar_height":{"description":"Minimum rendered bar height in pixels.","type":"number"},"padding":{"description":"Horizontal outer padding of the columns sparkline in pixels.","type":"number"}},"required":["gap","padding","min_bar_height","border"],"type":"object"},"SparkColumnsStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkColumnsStyle. Inline `spark.type: columns` (multi-value vertical bars) defaults.","properties":{"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Column bar border style."},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between column bars in pixels."},"min_bar_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum rendered bar height in pixels."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Horizontal outer padding of the columns sparkline in pixels."}},"type":"object"},"SparkConfig":{"additionalProperties":false,"description":"Configuration for spark charts (inline sparklines) in table columns.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Background track color for bar-normalize chart."},"border_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Border radius for bar-normalize track in pixels."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color for the spark mark."},"fill_opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Fill opacity for area spark charts (0\u20131)."},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Spark chart height in pixels."},"last_visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Highlight the last data point (line/area spark charts)."},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum value for bar-normalize range scaling."},"min_max_visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Annotate the min and max data points (line/area spark charts)."},"thresholds":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Color thresholds for bar / bar-normalize: {value: CSS color string}."},"type":{"default":"line","description":"Spark chart type (line, area, bar, bar-normalize, column, columns).","enum":["line","area","bar","bar-normalize","column","columns"]},"value_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Suffix appended to the displayed value label (e.g., '%')."},"value_visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show numeric value label alongside the bar."},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Spark chart width in pixels."}},"type":"object"},"SparkEmptyStyle":{"additionalProperties":false,"properties":{"inset_x":{"description":"Horizontal inset for the empty sparkline placeholder in pixels.","type":"number"},"stroke":{"$ref":"#/$defs/StrokeStyle","description":"Empty-state placeholder stroke style."}},"required":["inset_x","stroke"],"type":"object"},"SparkEmptyStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkEmptyStyle.","properties":{"inset_x":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Horizontal inset for the empty sparkline placeholder in pixels."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Empty-state placeholder stroke style."}},"type":"object"},"SparkSingleValueStyle":{"additionalProperties":false,"properties":{"inset_x":{"description":"Horizontal inset for the single-value sparkline in pixels.","type":"number"},"marker_radius":{"description":"Radius of the single-value marker circle in pixels.","type":"number"}},"required":["inset_x","marker_radius"],"type":"object"},"SparkSingleValueStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkSingleValueStyle.","properties":{"inset_x":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Horizontal inset for the single-value sparkline in pixels."},"marker_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Radius of the single-value marker circle in pixels."}},"type":"object"},"SparkStyle":{"additionalProperties":false,"description":"Inline sparkline defaults (inside table cells).","properties":{"area":{"$ref":"#/$defs/SparkAreaStyle","description":"Style for area sparklines."},"bar":{"$ref":"#/$defs/SparkBarCellStyle","description":"Style for bar/bar-normalize sparklines."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sparkline line/point color; None seeds from style.charts.color.categorical.single_series_palette[0]."},"column":{"$ref":"#/$defs/SparkColumnStyle","description":"Style for the single vertical `column` spark mark."},"columns":{"$ref":"#/$defs/SparkColumnsStyle","description":"Style for column-type sparklines."},"empty":{"$ref":"#/$defs/SparkEmptyStyle","description":"Style for empty/no-data sparklines."},"padding":{"$ref":"#/$defs/SpacingValues","description":"Cell padding around the sparkline in pixels."},"single_value":{"$ref":"#/$defs/SparkSingleValueStyle","description":"Style for single-data-point sparklines."}},"required":["padding","empty","single_value","columns","column","bar","area"],"type":"object"},"SparkStylePatch":{"additionalProperties":false,"description":"Authored overlay for SparkStyle. Inline sparkline defaults (inside table cells).","properties":{"area":{"anyOf":[{"$ref":"#/$defs/SparkAreaStylePatch"},{"type":"null"}],"description":"Style for area sparklines."},"bar":{"anyOf":[{"$ref":"#/$defs/SparkBarCellStylePatch"},{"type":"null"}],"description":"Style for bar/bar-normalize sparklines."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sparkline line/point color; None seeds from style.charts.color.categorical.single_series_palette[0]."},"column":{"anyOf":[{"$ref":"#/$defs/SparkColumnStylePatch"},{"type":"null"}],"description":"Style for the single vertical `column` spark mark."},"columns":{"anyOf":[{"$ref":"#/$defs/SparkColumnsStylePatch"},{"type":"null"}],"description":"Style for column-type sparklines."},"empty":{"anyOf":[{"$ref":"#/$defs/SparkEmptyStylePatch"},{"type":"null"}],"description":"Style for empty/no-data sparklines."},"padding":{"anyOf":[{"$ref":"#/$defs/SpacingValues"},{"type":"null"}],"description":"Cell padding around the sparkline in pixels."},"single_value":{"anyOf":[{"$ref":"#/$defs/SparkSingleValueStylePatch"},{"type":"null"}],"description":"Style for single-data-point sparklines."}},"type":"object"},"SquareMarkStyle":{"additionalProperties":false,"description":"Square mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Mark stroke style; None means not overridden at this level."}},"type":"object"},"SquareMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for SquareMarkStyle. Square mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Mark stroke style; None means not overridden at this level."}},"type":"object"},"StaticGradientColorStyle":{"additionalProperties":false,"description":"Color config for geo/point_map/table families \u2014 no categorical arm.","properties":{"gradient":{"anyOf":[{"$ref":"#/$defs/ScaleTargetConfig"},{"type":"null"}],"description":"Continuous gradient scale for the color encoding."},"static":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Static mark color override."}},"type":"object"},"StaticGradientColorStylePatch":{"additionalProperties":false,"description":"Authored overlay for StaticGradientColorStyle. Color config for geo/point_map/table families \u2014 no categorical arm.","properties":{"gradient":{"anyOf":[{"$ref":"#/$defs/ScaleTargetConfigPatch"},{"type":"null"}],"description":"Continuous gradient scale for the color encoding."},"static":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Static mark color override."}},"type":"object"},"StrokeStyle":{"additionalProperties":false,"description":"Stroke appearance sub-block shared across mark families.","properties":{"cap":{"anyOf":[{"enum":["butt","round","square"]},{"type":"null"}],"description":"Stroke line cap style (butt, round, or square)."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stroke color as a CSS color string."},"dasharray":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SVG stroke-dasharray pattern (e.g. '4 2')."},"join":{"anyOf":[{"enum":["miter","round","bevel"]},{"type":"null"}],"description":"Stroke line join style (miter, round, or bevel)."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Stroke width in pixels."}},"type":"object"},"StrokeStylePatch":{"additionalProperties":false,"description":"Authored overlay for StrokeStyle. Stroke appearance sub-block shared across mark families.","properties":{"cap":{"anyOf":[{"enum":["butt","round","square"]},{"type":"null"}],"description":"Stroke line cap style (butt, round, or square)."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stroke color as a CSS color string."},"dasharray":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SVG stroke-dasharray pattern (e.g. '4 2')."},"join":{"anyOf":[{"enum":["miter","round","bevel"]},{"type":"null"}],"description":"Stroke line join style (miter, round, or bevel)."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Stroke width in pixels."}},"type":"object"},"Style":{"additionalProperties":false,"description":"Authoritative compiled style. Built from a single theme YAML file.","properties":{"accent":{"description":"Accent color token cascaded to sparklines, bars, and focus rings.","type":"string"},"background":{"description":"Working-surface background color (board and card fills).","type":"string"},"board":{"$ref":"#/$defs/BoardStyle","description":"Face-level structural board dimensions."},"border":{"$ref":"#/$defs/BorderStyle","description":"Default border style cascaded to all chart cards."},"box_shadow":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CSS box shadow for chart cards; None means no shadow."},"charts":{"$ref":"#/$defs/ChartsStyle","description":"Root of all chart-type styles and shared chart configuration."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Per-face text color override as a CSS color string."},"font":{"$ref":"#/$defs/RootFontStyle","description":"Root font configuration including emoji mode."},"footer":{"$ref":"#/$defs/FooterStyle","description":"Page footer chrome visibility."},"formats":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Format alias map; None means no aliases at this cascade level."},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Per-face gap between layout items in pixels."},"layout":{"$ref":"#/$defs/LayoutStyle","description":"Layout container styles (rows, cols, grid, tabs, details)."},"margin":{"anyOf":[{"$ref":"#/$defs/SpacingValues"},{"type":"null"}],"description":"Per-face margin override (CSS shorthand or structured)."},"muted":{"description":"Muted secondary-text color token (KPI support rows, table and spark subtitles).","type":"string"},"opacity":{"description":"Default mark opacity (0\u20131).","type":"number"},"padding":{"anyOf":[{"$ref":"#/$defs/SpacingValues"},{"type":"null"}],"description":"Per-face padding override (CSS shorthand or structured)."},"page":{"$ref":"#/$defs/PageStyle","description":"Page-level canvas style (behind the board)."},"palettes":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Theme palette role assignments: open dict mapping role name to palette file name. Default seed: chrome, info, negative, positive, warning, category, sequence, diverge."},"placeholder":{"$ref":"#/$defs/PlaceholderStyle","description":"Placeholder overlay style for empty charts."},"roles":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Optional top-level theme role aliases: bare name \u2192 role.alias. e.g. ink: chrome.heading"},"text":{"$ref":"#/$defs/TextStyle","description":"Markdown and plain text content style."},"timestamp":{"$ref":"#/$defs/TimestampStyle","description":"Data-freshness chrome: visibility, placement, format, and font."},"title":{"$ref":"#/$defs/TitleStyle","description":"Board and face title style."},"variables":{"$ref":"#/$defs/VariablesStyle","description":"Variable controls chrome style."}},"required":["board","background","accent","muted","font","border","opacity","title","text","placeholder","charts","layout","variables","page","footer","timestamp"],"type":"object"},"StylePatch":{"additionalProperties":false,"description":"Authored overlay for Style \u2014 all fields optional. Adds CSS shorthand coercers.","properties":{"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accent color token cascaded to sparklines, bars, and focus rings."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Working-surface background color (board and card fills)."},"board":{"anyOf":[{"$ref":"#/$defs/BoardStylePatch"},{"type":"null"}],"description":"Face-level structural board dimensions."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Default border style cascaded to all chart cards."},"box_shadow":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CSS box shadow for chart cards; None means no shadow."},"charts":{"anyOf":[{"$ref":"#/$defs/ChartsStylePatch"},{"type":"null"}],"description":"Root of all chart-type styles and shared chart configuration."},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Per-face text color override as a CSS color string."},"font":{"anyOf":[{"$ref":"#/$defs/RootFontStylePatch"},{"type":"null"}],"description":"Root font configuration including emoji mode."},"footer":{"anyOf":[{"$ref":"#/$defs/FooterStylePatch"},{"type":"null"}],"description":"Page footer chrome visibility."},"formats":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Format alias map; None means no aliases at this cascade level."},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Per-face gap between layout items in pixels."},"layout":{"anyOf":[{"$ref":"#/$defs/LayoutStylePatch"},{"type":"null"}],"description":"Layout container styles (rows, cols, grid, tabs, details)."},"margin":{"anyOf":[{"$ref":"#/$defs/SpacingValues"},{"type":"null"}],"description":"Per-face margin override (CSS shorthand or structured)."},"muted":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Muted secondary-text color token (KPI support rows, table and spark subtitles)."},"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default mark opacity (0\u20131)."},"padding":{"anyOf":[{"$ref":"#/$defs/SpacingValues"},{"type":"null"}],"description":"Per-face padding override (CSS shorthand or structured)."},"page":{"anyOf":[{"$ref":"#/$defs/PageStylePatch"},{"type":"null"}],"description":"Page-level canvas style (behind the board)."},"palettes":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Theme palette role assignments: open dict mapping role name to palette file name. Default seed: chrome, info, negative, positive, warning, category, sequence, diverge."},"placeholder":{"anyOf":[{"$ref":"#/$defs/PlaceholderStylePatch"},{"type":"null"}],"description":"Placeholder overlay style for empty charts."},"roles":{"anyOf":[{"type":"object"},{"type":"null"}],"description":"Optional top-level theme role aliases: bare name \u2192 role.alias. e.g. ink: chrome.heading"},"text":{"anyOf":[{"$ref":"#/$defs/TextStylePatch"},{"type":"null"}],"description":"Markdown and plain text content style."},"timestamp":{"anyOf":[{"$ref":"#/$defs/TimestampStylePatch"},{"type":"null"}],"description":"Data-freshness chrome: visibility, placement, format, and font."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Board and face title style."},"variables":{"anyOf":[{"$ref":"#/$defs/VariablesStylePatch"},{"type":"null"}],"description":"Variable controls chrome style."}},"type":"object"},"SubtitleStyle":{"additionalProperties":false,"description":"Subtitle font style for chart subtitles (Table, SparkBar).","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Subtitle font style; theme populates font.size directly."}},"type":"object"},"SubtitleStylePatch":{"additionalProperties":false,"description":"Authored overlay for SubtitleStyle. Subtitle font style for chart subtitles (Table, SparkBar).","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Subtitle font style; theme populates font.size directly."}},"type":"object"},"TabItem":{"additionalProperties":false,"description":"Tab layout item.","properties":{"cols":{"anyOf":[{"items":{"anyOf":[{"anyOf":[{"$ref":"#"},{"$ref":"#/$defs/AuthoredChart"},{"$ref":"#/$defs/ForeachItem"},{"type":"string"}]},{"additionalProperties":{"$ref":"#/$defs/AuthoredChart"},"type":"object"}]},"type":"array"},{"type":"null"}],"description":"Horizontal layout for this tab's content."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional metadata for AI search and context tooltips."},"grid":{"anyOf":[{"$ref":"#/$defs/GridLayout"},{"type":"null"}],"description":"CSS-grid layout for this tab's content."},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional icon shown in the tab (e.g., emoji or icon name)."},"rows":{"anyOf":[{"items":{"anyOf":[{"anyOf":[{"$ref":"#"},{"$ref":"#/$defs/AuthoredChart"},{"$ref":"#/$defs/ForeachItem"},{"type":"string"}]},{"additionalProperties":{"$ref":"#/$defs/AuthoredChart"},"type":"object"}]},"type":"array"},{"type":"null"}],"description":"Vertical stack layout for this tab's content."},"style":{"anyOf":[{"$ref":"#/$defs/StylePatch"},{"type":"null"}],"description":"Style patch for this tab's content area."},"tabs":{"anyOf":[{"$ref":"#/$defs/TabLayout"},{"type":"null"}],"description":"Nested tab layout (tabs within tabs)."},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Markdown text content shown in this tab."},"title":{"description":"Tab label displayed in the tab bar.","type":"string"}},"required":["title"],"type":"object"},"TabLayout":{"additionalProperties":false,"description":"Tab layout configuration.","properties":{"default":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default tab title to activate on load."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Variable name and URL param base for tab selection (auto-generated if omitted)."},"items":{"description":"List of tab items.","items":{"$ref":"#/$defs/TabItem"},"type":"array"},"position":{"default":"top","description":"Tab bar position (top or left).","enum":["top","left"]}},"required":["items"],"type":"object"},"TableChart":{"additionalProperties":false,"description":"Authored patch for table charts.","properties":{"columns":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Fields whose distinct values become column headers in a pivot cross-tab. Multiple fields create a nested multi-dimension pivot (outer \u2192 inner). Omit for flat tables."},"conditional_formatting":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/FieldConditionalFormatting"},"type":"object"},{"type":"null"}],"description":"Discrete rule-driven style overrides indexed by column name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Human-readable description used by AI search and context tooltips."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit chart ID (auto-generated from the chart's YAML key if omitted)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Click-through URL template for drill-down links."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Semantic-layer entry point, two dot-joined names: 'model.explore' for a LookML source, or 'source.semantic_model' for a dbt_profile (MetricFlow) source. Channel fields name the model's fields directly; roles are inferred from the LookML catalog / dbt semantic manifest. Mutually exclusive with `query:`."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Named query reference, inline AuthoredQuery, or SQL string shorthand."},"rows":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Fields whose distinct values form the row dimension of a pivot cross-tab. Each string is a column name from the query result. Omit for flat (non-pivot) tables."},"style":{"anyOf":[{"$ref":"#/$defs/TableChartStylePatch"},{"type":"null"}],"description":"Chart-local style overrides."},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart subtitle displayed below the title."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chart title displayed above the chart (not used on type: kpi)."},"type":{"description":"Table chart type.","enum":["table"]},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Measure fields that fill pivot cells. Each string is a column name from the query result. When omitted, all query columns not claimed by rows or columns are used."},"warnings_ignore":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Codes of render warnings to suppress for this chart."}},"required":["type"],"type":"object"},"TableChartStyle":{"additionalProperties":false,"description":"Table chart style overrides layered on top of shared chart defaults.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"aspect_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Chart aspect ratio (width/height). Falls back to `style.charts.aspect_ratio`."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Table background color; None inherits from theme."},"border":{"$ref":"#/$defs/BorderStyle","description":"Table outer border style."},"bottom_padding":{"description":"Extra bottom padding below the last row in pixels.","type":"number"},"color":{"anyOf":[{"$ref":"#/$defs/StaticGradientColorStyle"},{"type":"null"}],"description":"Table color: static text paint or gradient scale only (no categorical arm)."},"column_defaults":{"anyOf":[{"$ref":"#/$defs/TableColumnDefaultsConfig"},{"type":"null"}],"description":"Table-level column defaults applied to every column; None means no defaults authored."},"column_layout":{"$ref":"#/$defs/TableColumnsStyle","description":"Default column width and cell padding settings."},"columns":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/TableColumnConfig"},"type":"object"},{"type":"null"}],"description":"Per-column display configuration keyed by column name (label, format, width, etc.)."},"empty_state":{"$ref":"#/$defs/TableEdgeStyle","description":"Style for the empty-state (no data) indicator."},"font":{"$ref":"#/$defs/FontStyle","description":"Table chart-level font overrides. Unset fields fall back to `style.charts.font`."},"header":{"$ref":"#/$defs/TableHeaderStyle","description":"Table header row style."},"header_overflow":{"anyOf":[{"enum":["clip","truncate","wrap-two","wrap"]},{"type":"null"}],"description":"Table column header text overflow mode; None inherits from theme."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"max_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum chart height in pixels. Falls back to `style.charts.max_height`."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum chart height in pixels. Falls back to `style.charts.min_height`."},"more_rows":{"$ref":"#/$defs/TableEdgeStyle","description":"Style for the 'more rows' edge-case indicator."},"outer_padding":{"description":"Outer table padding in pixels.","type":"number"},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"pagination":{"$ref":"#/$defs/PaginationConfig","description":"Client-side pagination defaults for table charts."},"paginator":{"$ref":"#/$defs/PaginatorStyle","description":"Visual style for the paginator control (chevrons + page numbers)."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"row":{"$ref":"#/$defs/TableRowStyle","description":"Table body row style."},"row_numbers":{"$ref":"#/$defs/TableRowNumbersStyle","description":"Leading row-number column configuration."},"rule":{"anyOf":[{"$ref":"#/$defs/TableRuleStyle"},{"type":"null"}],"description":"Table rule style overrides (color). None = no override; inherits from theme."},"spark":{"$ref":"#/$defs/SparkStyle","description":"Inline sparkline defaults for table cells."},"subtitle":{"$ref":"#/$defs/SubtitleStyle","description":"Table subtitle font-sizing constants."},"symbol_mode":{"description":"Where to show currency-prefix and magnitude/unit suffix symbols in a numeric column. 'all' shows the full formatted value on every row; 'anchors' shows it only on the first data row and summary/total rows, stripping prefix and suffix from plain middle rows so the anchors guide the reader at the top and bottom of the value field.","type":"string"},"text_baseline_offset":{"description":"Vertical offset to align SVG text baseline with cell grid in pixels.","type":"number"},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"title_baseline_offset":{"description":"Vertical offset to align SVG title baseline in pixels.","type":"number"},"title_row":{"$ref":"#/$defs/TableTitleStyle","description":"Table title row style."},"title_subtitle_gap":{"description":"Gap between table title and subtitle lines in pixels.","type":"number"},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."},"transpose":{"default":false,"description":"When True, render a single wide data row as N (label, value) rows \u2014 one per column. Raises ChartDataError when data has more than one row. Used for Looker single-value summary tiles with multiple measures.","type":"boolean"},"wrap":{"description":"Allow cell text wrapping; false clips to single line.","type":"boolean"}},"required":["border","outer_padding","bottom_padding","column_layout","header","row","title_row","wrap","pagination","paginator","symbol_mode","more_rows","empty_state","spark","text_baseline_offset","title_baseline_offset","title_subtitle_gap","subtitle"],"type":"object"},"TableChartStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableChartStyle. Table chart style overrides layered on top of shared chart defaults.","properties":{"animation_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vega-Lite animation duration in milliseconds. Falls back to `style.charts.animation_duration`."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Table background color; None inherits from theme."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Table outer border style."},"bottom_padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Extra bottom padding below the last row in pixels."},"color":{"anyOf":[{"$ref":"#/$defs/StaticGradientColorStylePatch"},{"type":"null"}],"description":"Table color: static text paint or gradient scale only (no categorical arm)."},"column_defaults":{"anyOf":[{"$ref":"#/$defs/TableColumnDefaultsConfig"},{"type":"null"}],"description":"Table-level column defaults applied to every column; None means no defaults authored."},"column_layout":{"anyOf":[{"$ref":"#/$defs/TableColumnsStylePatch"},{"type":"null"}],"description":"Default column width and cell padding settings."},"columns":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/TableColumnConfig"},"type":"object"},{"type":"null"}],"description":"Per-column display configuration keyed by column name (label, format, width, etc.)."},"empty_state":{"anyOf":[{"$ref":"#/$defs/TableEdgeStylePatch"},{"type":"null"}],"description":"Style for the empty-state (no data) indicator."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Table chart-level font overrides. Unset fields fall back to `style.charts.font`."},"header":{"anyOf":[{"$ref":"#/$defs/TableHeaderStylePatch"},{"type":"null"}],"description":"Table header row style."},"header_overflow":{"anyOf":[{"enum":["clip","truncate","wrap-two","wrap"]},{"type":"null"}],"description":"Table column header text overflow mode; None inherits from theme."},"legend":{"anyOf":[{"$ref":"#/$defs/LegendStylePatch"},{"type":"null"}],"description":"Chart legend style."},"more_rows":{"anyOf":[{"$ref":"#/$defs/TableEdgeStylePatch"},{"type":"null"}],"description":"Style for the 'more rows' edge-case indicator."},"outer_padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Outer table padding in pixels."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Per-chart-type padding override; 4 sides in pixels. Unset fields fall back to `style.charts.padding`."},"pagination":{"anyOf":[{"$ref":"#/$defs/PaginationConfig"},{"type":"null"}],"description":"Client-side pagination defaults for table charts."},"paginator":{"anyOf":[{"$ref":"#/$defs/PaginatorStylePatch"},{"type":"null"}],"description":"Visual style for the paginator control (chevrons + page numbers)."},"preferred_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Preferred chart width in pixels. Falls back to `style.charts.preferred_width`."},"row":{"anyOf":[{"$ref":"#/$defs/TableRowStylePatch"},{"type":"null"}],"description":"Table body row style."},"row_numbers":{"anyOf":[{"$ref":"#/$defs/TableRowNumbersStylePatch"},{"type":"null"}],"description":"Leading row-number column configuration."},"rule":{"anyOf":[{"$ref":"#/$defs/TableRuleStylePatch"},{"type":"null"}],"description":"Table rule style overrides (color). None = no override; inherits from theme."},"spark":{"anyOf":[{"$ref":"#/$defs/SparkStylePatch"},{"type":"null"}],"description":"Inline sparkline defaults for table cells."},"subtitle":{"anyOf":[{"$ref":"#/$defs/SubtitleStylePatch"},{"type":"null"}],"description":"Table subtitle font-sizing constants."},"symbol_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Where to show currency-prefix and magnitude/unit suffix symbols in a numeric column. 'all' shows the full formatted value on every row; 'anchors' shows it only on the first data row and summary/total rows, stripping prefix and suffix from plain middle rows so the anchors guide the reader at the top and bottom of the value field."},"text_baseline_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical offset to align SVG text baseline with cell grid in pixels."},"title":{"anyOf":[{"$ref":"#/$defs/TitleStylePatch"},{"type":"null"}],"description":"Chart-level title style override; None inherits the theme title style."},"title_baseline_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical offset to align SVG title baseline in pixels."},"title_row":{"anyOf":[{"$ref":"#/$defs/TableTitleStylePatch"},{"type":"null"}],"description":"Table title row style."},"title_subtitle_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between table title and subtitle lines in pixels."},"tooltip":{"anyOf":[{"$ref":"#/$defs/TooltipStylePatch"},{"type":"null"}],"description":"Per-chart-type tooltip style override; None uses the universal style.charts.tooltip."},"transpose":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"When True, render a single wide data row as N (label, value) rows \u2014 one per column. Raises ChartDataError when data has more than one row. Used for Looker single-value summary tiles with multiple measures."},"wrap":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Allow cell text wrapping; false clips to single line."}},"type":"object"},"TableColumnConfig":{"additionalProperties":false,"description":"Configuration for a single table column.","properties":{"align":{"anyOf":[{"enum":["left","center","right"]},{"type":"null"}],"description":"Text alignment in cells (left, center, right)."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cell background color (CSS color string)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Cell font style overrides."},"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"Number format (D3 string, preset name, or FormatConfig)."},"glyph":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Glyph character prepended to cell values."},"glyph_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Color for the glyph. Requires glyph to be set."},"header_link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL template for the column header link."},"header_overflow":{"anyOf":[{"enum":["clip","truncate","wrap-two","wrap"]},{"type":"null"}],"description":"Header text overflow mode (clip, truncate, wrap-two, wrap)."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Display header label (defaults to column name)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL template for cell values (Jinja template with row fields available)."},"max_width":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Maximum column width for auto-sized text columns (integer pixels or CSS string like '30%'). Cannot be set together with width:."},"scale":{"anyOf":[{"$ref":"#/$defs/ColumnScaleConfig"},{"type":"null"}],"description":"Continuous color mapping configuration for this column."},"spark":{"anyOf":[{"$ref":"#/$defs/SparkConfig"},{"enum":["line","area","bar","bar-normalize","column","columns"]},{"type":"null"}],"description":"Inline spark chart config or spark type name."},"swatch":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"When True, render this column's cells as small rounded color squares instead of text. Cell value must be a CSS color string (e.g. '#3164a3'). Useful for series-keyed tables \u2014 e.g. a 'Series' column where each row is identified by its color in the parent chart's palette."},"width":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Column width (integer pixels or CSS string like '10%')."}},"type":"object"},"TableColumnDefaultsConfig":{"additionalProperties":false,"description":"Table-level defaults applied to every column unless overridden per-column.","properties":{"align":{"anyOf":[{"enum":["left","center","right"]},{"type":"null"}],"description":"Override cell text alignment (left, center, or right)."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override cell background color (CSS color string)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Override cell font style (size, weight, color, family)."},"format":{"anyOf":[{"$ref":"#/$defs/FormatConfig"},{"type":"string"},{"type":"null"}],"description":"Override cell value format (D3 format string or format config object)."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override column header label text."},"width":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Override column width in pixels (integer) or a CSS width string."}},"type":"object"},"TableColumnsStyle":{"additionalProperties":false,"properties":{"cell_padding":{"description":"Horizontal padding inside table cells in pixels.","type":"number"},"content_headroom":{"description":"Fractional breathing room added above the raw p95 column demand when pinning compact columns in mixed (compact + text) tables. 0.10 means each compact column is pinned at 10 % above its measured demand; the extra width is funded by the text-column budget. Has no effect on all-compact tables (proportional scaling already fills the budget). 0.0 disables headroom.","type":"number"},"default_width":{"description":"Default column width in pixels.","type":"number"},"width_similarity_threshold":{"description":"Auto-width columns whose min/max ratio >= this threshold are snapped to a shared width before budget allocation. 1.0 disables clustering; 0.0 forces all auto-columns to equal width.","type":"number"}},"required":["default_width","cell_padding","width_similarity_threshold","content_headroom"],"type":"object"},"TableColumnsStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableColumnsStyle.","properties":{"cell_padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Horizontal padding inside table cells in pixels."},"content_headroom":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Fractional breathing room added above the raw p95 column demand when pinning compact columns in mixed (compact + text) tables. 0.10 means each compact column is pinned at 10 % above its measured demand; the extra width is funded by the text-column budget. Has no effect on all-compact tables (proportional scaling already fills the budget). 0.0 disables headroom."},"default_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default column width in pixels."},"width_similarity_threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Auto-width columns whose min/max ratio >= this threshold are snapped to a shared width before budget allocation. 1.0 disables clustering; 0.0 forces all auto-columns to equal width."}},"type":"object"},"TableEdgeStyle":{"additionalProperties":false,"description":"more_rows or empty_state edge-case UI.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Edge-case UI (more_rows / empty_state) font style overrides. Unset fields fall back to `style.charts.table.font`."}},"type":"object"},"TableEdgeStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableEdgeStyle. more_rows or empty_state edge-case UI.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Edge-case UI (more_rows / empty_state) font style overrides. Unset fields fall back to `style.charts.table.font`."}},"type":"object"},"TableHeaderStyle":{"additionalProperties":false,"properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Header background color; None means no fill (rule alone separates header from body)."},"font":{"$ref":"#/$defs/FontStyle","description":"Header font style overrides. Unset fields fall back to `style.charts.table.font`."},"font_compact":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Compact-tier font overrides applied when body size \u226411px; None means no compact override."},"height":{"description":"Header row height in pixels.","type":"number"},"overflow":{"description":"Header text overflow mode (clip, truncate, wrap-two, wrap).","enum":["clip","truncate","wrap-two","wrap"]},"rule":{"$ref":"#/$defs/RuleStyle","description":"Header bottom rule style."},"visible":{"description":"Show the header row (column labels + rule). Set to False on series-keyed tables where column meanings are obvious from context (e.g. donut-attached tables: swatch / share / name / value). Theme YAML supplies the UX default (true) via _base.yaml.","type":"boolean"}},"required":["visible","height","overflow","rule"],"type":"object"},"TableHeaderStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableHeaderStyle.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Header background color; None means no fill (rule alone separates header from body)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Header font style overrides. Unset fields fall back to `style.charts.table.font`."},"font_compact":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Compact-tier font overrides applied when body size \u226411px; None means no compact override."},"height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Header row height in pixels."},"overflow":{"anyOf":[{"enum":["clip","truncate","wrap-two","wrap"]},{"type":"null"}],"description":"Header text overflow mode (clip, truncate, wrap-two, wrap)."},"rule":{"anyOf":[{"$ref":"#/$defs/RuleStylePatch"},{"type":"null"}],"description":"Header bottom rule style."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the header row (column labels + rule). Set to False on series-keyed tables where column meanings are obvious from context (e.g. donut-attached tables: swatch / share / name / value). Theme YAML supplies the UX default (true) via _base.yaml."}},"type":"object"},"TableRowNumbersStyle":{"additionalProperties":false,"description":"Leading row-number column (style.table.row_numbers).","properties":{"align":{"default":"right","description":"Text alignment for the row-number column.","enum":["left","right"]},"header":{"default":"#","description":"Header label for the row-number column.","type":"string"},"visible":{"default":false,"description":"Show a leading row-number column; false by default.","type":"boolean"}},"type":"object"},"TableRowNumbersStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableRowNumbersStyle. Leading row-number column (style.table.row_numbers).","properties":{"align":{"anyOf":[{"enum":["left","right"]},{"type":"null"}],"description":"Text alignment for the row-number column."},"header":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Header label for the row-number column."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show a leading row-number column; false by default."}},"type":"object"},"TableRowRoleStyle":{"additionalProperties":false,"properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Per-role row background color; None means no override."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Per-role font style override; None uses the default row font."},"rule_width":{"description":"Rule width above rows with this role in pixels.","type":"number"}},"required":["rule_width"],"type":"object"},"TableRowRoleStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableRowRoleStyle.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Per-role row background color; None means no override."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Per-role font style override; None uses the default row font."},"rule_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Rule width above rows with this role in pixels."}},"type":"object"},"TableRowRolesStyle":{"additionalProperties":false,"properties":{"summary":{"$ref":"#/$defs/TableRowRoleStyle","description":"Style for summary role rows."},"total":{"$ref":"#/$defs/TableRowRoleStyle","description":"Style for total role rows."}},"required":["summary","total"],"type":"object"},"TableRowRolesStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableRowRolesStyle.","properties":{"summary":{"anyOf":[{"$ref":"#/$defs/TableRowRoleStylePatch"},{"type":"null"}],"description":"Style for summary role rows."},"total":{"anyOf":[{"$ref":"#/$defs/TableRowRoleStylePatch"},{"type":"null"}],"description":"Style for total role rows."}},"type":"object"},"TableRowStripeStyle":{"additionalProperties":false,"description":"Alternating row stripe style.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Alternating stripe background color; None means no alternating row fill."}},"type":"object"},"TableRowStripeStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableRowStripeStyle. Alternating row stripe style.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Alternating stripe background color; None means no alternating row fill."}},"type":"object"},"TableRowStyle":{"additionalProperties":false,"properties":{"height":{"description":"Body row height in pixels.","type":"number"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default row role assignment; None means plain body row."},"roles":{"$ref":"#/$defs/TableRowRolesStyle","description":"Per-role style overrides for summary and total rows."},"rule":{"$ref":"#/$defs/RuleStyle","description":"Row bottom rule style."},"stripe":{"anyOf":[{"$ref":"#/$defs/TableRowStripeStyle"},{"type":"null"}],"description":"Alternating row stripe style; None means no stripe."}},"required":["height","rule","roles"],"type":"object"},"TableRowStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableRowStyle.","properties":{"height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Body row height in pixels."},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default row role assignment; None means plain body row."},"roles":{"anyOf":[{"$ref":"#/$defs/TableRowRolesStylePatch"},{"type":"null"}],"description":"Per-role style overrides for summary and total rows."},"rule":{"anyOf":[{"$ref":"#/$defs/RuleStylePatch"},{"type":"null"}],"description":"Row bottom rule style."},"stripe":{"anyOf":[{"$ref":"#/$defs/TableRowStripeStylePatch"},{"type":"null"}],"description":"Alternating row stripe style; None means no stripe."}},"type":"object"},"TableRuleStyle":{"additionalProperties":false,"description":"Table rule color override block.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Table rule color; None uses the theme default."}},"type":"object"},"TableRuleStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableRuleStyle. Table rule color override block.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Table rule color; None uses the theme default."}},"type":"object"},"TableTitleStyle":{"additionalProperties":false,"properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Table title font style overrides. Unset fields fall back to `style.charts.table.font`."},"height":{"description":"Table title row height in pixels.","type":"number"}},"required":["height"],"type":"object"},"TableTitleStylePatch":{"additionalProperties":false,"description":"Authored overlay for TableTitleStyle.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Table title font style overrides. Unset fields fall back to `style.charts.table.font`."},"height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Table title row height in pixels."}},"type":"object"},"TabsStyle":{"additionalProperties":false,"properties":{"active_weight":{"description":"Font weight for the active tab label.","type":"string"},"bar_height":{"description":"Tab bar height in pixels.","type":"number"},"border":{"$ref":"#/$defs/BorderStyle","description":"Tab bar border style."},"font":{"$ref":"#/$defs/FontStyle","description":"Tab label font style overrides. Unset fields fall back to `style.font`."},"inactive_weight":{"description":"Font weight for inactive tab labels.","type":"string"},"title_baseline_offset":{"description":"Vertical offset to align SVG tab label baseline in pixels.","type":"number"}},"required":["bar_height","border","active_weight","inactive_weight","title_baseline_offset"],"type":"object"},"TabsStylePatch":{"additionalProperties":false,"description":"Authored overlay for TabsStyle.","properties":{"active_weight":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Font weight for the active tab label."},"bar_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tab bar height in pixels."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Tab bar border style."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Tab label font style overrides. Unset fields fall back to `style.font`."},"inactive_weight":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Font weight for inactive tab labels."},"title_baseline_offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Vertical offset to align SVG tab label baseline in pixels."}},"type":"object"},"TextBlockquoteStyle":{"additionalProperties":false,"description":"Blockquote prose. Box group; border is the left rule.","properties":{"background":{"description":"Box background fill.","type":"string"},"border":{"$ref":"#/$defs/BorderStyle","description":"Box border (width, color, radius)."},"font":{"$ref":"#/$defs/FontStyle","description":"Box text font overrides \u2014 full FontStyle (family, color, size, weight, style, decoration, case)."}},"required":["background","border"],"type":"object"},"TextBlockquoteStylePatch":{"additionalProperties":false,"description":"Authored overlay for TextBlockquoteStyle. Blockquote prose. Box group; border is the left rule.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Box background fill."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Box border (width, color, radius)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Box text font overrides \u2014 full FontStyle (family, color, size, weight, style, decoration, case)."}},"type":"object"},"TextBoldStyle":{"additionalProperties":false,"description":"Inline **bold** text runs in markdown prose, distinct from heading weight.","properties":{"weight":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"CSS font-weight for bold text runs and bold table cells."}},"required":["weight"],"type":"object"},"TextBoldStylePatch":{"additionalProperties":false,"description":"Authored overlay for TextBoldStyle. Inline **bold** text runs in markdown prose, distinct from heading weight.","properties":{"weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"description":"CSS font-weight for bold text runs and bold table cells."}},"type":"object"},"TextCodeStyle":{"additionalProperties":false,"description":"Inline and fenced code spans in markdown prose. Box group; mono font by default.","properties":{"background":{"description":"Box background fill.","type":"string"},"border":{"$ref":"#/$defs/BorderStyle","description":"Box border (width, color, radius)."},"font":{"$ref":"#/$defs/FontStyle","description":"Box text font overrides \u2014 full FontStyle (family, color, size, weight, style, decoration, case)."},"highlight":{"description":"Syntax-highlight fenced markdown code blocks.","type":"boolean"},"theme":{"description":"Pygments style name for fenced markdown code tokens.","type":"string"}},"required":["background","border","highlight","theme"],"type":"object"},"TextCodeStylePatch":{"additionalProperties":false,"description":"Authored overlay for TextCodeStyle. Inline and fenced code spans in markdown prose. Box group; mono font by default.","properties":{"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Box background fill."},"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Box border (width, color, radius)."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Box text font overrides \u2014 full FontStyle (family, color, size, weight, style, decoration, case)."},"highlight":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Syntax-highlight fenced markdown code blocks."},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pygments style name for fenced markdown code tokens."}},"type":"object"},"TextColumnStyle":{"additionalProperties":false,"description":"Multi-column layout for face body text (CSS column-count/gap/rule/max_chars).","properties":{"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between columns in pixels. None = use layout gap token."},"max_chars":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Target column width as a character count. The pixel width is derived at render time via fonttools OS/2.xAvgCharWidth \u00d7 max_chars; column count auto-derives as ceil(available / col_width_px)."},"number":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Fixed column count. None = single column."},"rule":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CSS column-rule shorthand, e.g. '1px solid #e5e7eb'. None = no rule."}},"type":"object"},"TextColumnStylePatch":{"additionalProperties":false,"description":"Authored overlay for TextColumnStyle. Multi-column layout for face body text (CSS column-count/gap/rule/max_chars).","properties":{"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between columns in pixels. None = use layout gap token."},"max_chars":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Target column width as a character count. The pixel width is derived at render time via fonttools OS/2.xAvgCharWidth \u00d7 max_chars; column count auto-derives as ceil(available / col_width_px)."},"number":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Fixed column count. None = single column."},"rule":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CSS column-rule shorthand, e.g. '1px solid #e5e7eb'. None = no rule."}},"type":"object"},"TextMarkStyle":{"additionalProperties":false,"properties":{"align":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Horizontal text alignment for text marks."},"font":{"$ref":"#/$defs/FontStyle","description":"Text mark font style overrides. Unset fields fall back to `style.charts.font`."}},"type":"object"},"TextMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for TextMarkStyle.","properties":{"align":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Horizontal text alignment for text marks."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Text mark font style overrides. Unset fields fall back to `style.charts.font`."}},"type":"object"},"TextStyle":{"additionalProperties":false,"description":"Markdown / plain text content.","properties":{"align":{"description":"Text alignment for the face body-text block.","enum":["left","center","right"]},"blockquote":{"$ref":"#/$defs/TextBlockquoteStyle","description":"Blockquote box styling (font, background, border/left-rule)."},"bold":{"$ref":"#/$defs/TextBoldStyle","description":"Inline bold-run styling (weight), distinct from heading weight."},"code":{"$ref":"#/$defs/TextCodeStyle","description":"Inline + fenced code box styling (font, background, border)."},"column":{"$ref":"#/$defs/TextColumnStyle","description":"Multi-column layout for the face body-text block."},"font":{"$ref":"#/$defs/FontStyle","description":"Text font style overrides. Unset fields fall back to `style.font`."},"heading":{"$ref":"#/$defs/BlockMarginStyle","description":"Spacing above/below heading blocks (H1\u2013H6) in line-height units."},"paragraph":{"$ref":"#/$defs/BlockMarginStyle","description":"Spacing above/below each paragraph block (in line-height units)."}},"required":["align","paragraph","heading","code","blockquote","bold"],"type":"object"},"TextStylePatch":{"additionalProperties":false,"description":"Authored overlay for TextStyle. Markdown / plain text content.","properties":{"align":{"anyOf":[{"enum":["left","center","right"]},{"type":"null"}],"description":"Text alignment for the face body-text block."},"blockquote":{"anyOf":[{"$ref":"#/$defs/TextBlockquoteStylePatch"},{"type":"null"}],"description":"Blockquote box styling (font, background, border/left-rule)."},"bold":{"anyOf":[{"$ref":"#/$defs/TextBoldStylePatch"},{"type":"null"}],"description":"Inline bold-run styling (weight), distinct from heading weight."},"code":{"anyOf":[{"$ref":"#/$defs/TextCodeStylePatch"},{"type":"null"}],"description":"Inline + fenced code box styling (font, background, border)."},"column":{"anyOf":[{"$ref":"#/$defs/TextColumnStylePatch"},{"type":"null"}],"description":"Multi-column layout for the face body-text block."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Text font style overrides. Unset fields fall back to `style.font`."},"heading":{"anyOf":[{"$ref":"#/$defs/BlockMarginStylePatch"},{"type":"null"}],"description":"Spacing above/below heading blocks (H1\u2013H6) in line-height units."},"paragraph":{"anyOf":[{"$ref":"#/$defs/BlockMarginStylePatch"},{"type":"null"}],"description":"Spacing above/below each paragraph block (in line-height units)."}},"type":"object"},"TickMarkStyle":{"additionalProperties":false,"description":"Tick mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"$ref":"#/$defs/FontColorStrokeStyle","description":"Mark stroke style."}},"type":"object"},"TickMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for TickMarkStyle. Tick mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/FontColorStrokeStylePatch"},{"type":"null"}],"description":"Mark stroke style."}},"type":"object"},"TimestampStyle":{"additionalProperties":false,"description":"Authored data-freshness chrome: visibility, placement, strftime format, font, and y-offset.","properties":{"align":{"description":"Timestamp horizontal alignment within its row.","enum":["left","right"]},"font":{"$ref":"#/$defs/FontStyle","description":"Timestamp font style overrides (size, color, weight, ...)."},"format":{"description":"strftime format for the data-freshness line, including any literal label text (e.g. '%H:%M %Z on %-d %b %Y'). The value is always UTC; a format that prints a clock must disclose the zone (%Z or a literal 'UTC'), else compile rejects it \u2014 an unlabeled clock reads as local.","type":"string"},"position":{"description":"Timestamp row: top page chrome or footer baseline.","enum":["top","footer"]},"visible":{"description":"Show the data-freshness line.","type":"boolean"},"y":{"description":"Y-coordinate for top-positioned timestamp in pixels.","type":"number"}},"required":["visible","position","align","format","y"],"type":"object"},"TimestampStylePatch":{"additionalProperties":false,"description":"Authored overlay for TimestampStyle. Authored data-freshness chrome: visibility, placement, strftime format, font, and y-offset.","properties":{"align":{"anyOf":[{"enum":["left","right"]},{"type":"null"}],"description":"Timestamp horizontal alignment within its row."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Timestamp font style overrides (size, color, weight, ...)."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"strftime format for the data-freshness line, including any literal label text (e.g. '%H:%M %Z on %-d %b %Y'). The value is always UTC; a format that prints a clock must disclose the zone (%Z or a literal 'UTC'), else compile rejects it \u2014 an unlabeled clock reads as local."},"position":{"anyOf":[{"enum":["top","footer"]},{"type":"null"}],"description":"Timestamp row: top page chrome or footer baseline."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the data-freshness line."},"y":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Y-coordinate for top-positioned timestamp in pixels."}},"type":"object"},"TitlePositionStyle":{"additionalProperties":false,"description":"Vega-Lite title positioning pass-throughs grouped as a sub-object.","properties":{"anchor":{"description":"Title anchor position; theme always sets this.","type":"string"},"angle":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Title rotation angle in degrees; None lets Vega-Lite choose."},"baseline":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Title text baseline alignment; None uses Vega-Lite's default."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Title offset from its anchor in pixels; None uses Vega-Lite's default."}},"required":["anchor"],"type":"object"},"TitlePositionStylePatch":{"additionalProperties":false,"description":"Authored overlay for TitlePositionStyle. Vega-Lite title positioning pass-throughs grouped as a sub-object.","properties":{"anchor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Title anchor position; theme always sets this."},"angle":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Title rotation angle in degrees; None lets Vega-Lite choose."},"baseline":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Title text baseline alignment; None uses Vega-Lite's default."},"offset":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Title offset from its anchor in pixels; None uses Vega-Lite's default."}},"type":"object"},"TitleStyle":{"additionalProperties":false,"description":"Board and face titles.","properties":{"compact_weight":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Object-title font weight on tiny cards."},"font":{"$ref":"#/$defs/FontStyle","description":"Title font style overrides. Unset fields fall back to `style.font`."},"level":{"anyOf":[{"enum":["auto"]},{"type":"integer"}],"description":"Heading level override for face titles. ``'auto'`` (default) computes the level semantically as the count of titled ancestors. An integer value locks all titles in this face and its descendants to that H-level."},"min_height":{"description":"Minimum title row height in pixels.","type":"number"},"overflow":{"description":"Text overflow mode (clip, truncate, wrap-two, wrap).","enum":["clip","truncate","wrap-two","wrap"]},"position":{"$ref":"#/$defs/TitlePositionStyle","description":"Vega-Lite title positioning: anchor, angle, offset, baseline."},"sizes":{"description":"Font sizes for the H1\u2013H6 heading ramp, indexed by ``face.level - 1``. Face/prose titles index this ramp directly (no width input). Object titles (chart/table/spark) combine ``width_offsets`` with a fixed object-title anchor to pick a slot.","type":"array"},"subtitle":{"$ref":"#/$defs/TitleSubtitleStyle","description":"Subtitle font styles."},"width_offsets":{"$ref":"#/$defs/TitleWidthOffsetsStyle","description":"Additive level offsets by card width (tiny/narrow/medium/wide). Consumed by ``chart_title_spec`` only \u2014 object titles add the tier offset to a fixed anchor to pick an H slot from ``sizes``. Face/prose titles are level-only and do not consult these."}},"required":["compact_weight","sizes","width_offsets","min_height","overflow","position","level"],"type":"object"},"TitleStylePatch":{"additionalProperties":false,"description":"Authored overlay for TitleStyle. Board and face titles.","properties":{"compact_weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"description":"Object-title font weight on tiny cards."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Title font style overrides. Unset fields fall back to `style.font`."},"level":{"anyOf":[{"enum":["auto"]},{"type":"integer"},{"type":"null"}],"description":"Heading level override for face titles. ``'auto'`` (default) computes the level semantically as the count of titled ancestors. An integer value locks all titles in this face and its descendants to that H-level."},"min_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum title row height in pixels."},"overflow":{"anyOf":[{"enum":["clip","truncate","wrap-two","wrap"]},{"type":"null"}],"description":"Text overflow mode (clip, truncate, wrap-two, wrap)."},"position":{"anyOf":[{"$ref":"#/$defs/TitlePositionStylePatch"},{"type":"null"}],"description":"Vega-Lite title positioning: anchor, angle, offset, baseline."},"sizes":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Font sizes for the H1\u2013H6 heading ramp, indexed by ``face.level - 1``. Face/prose titles index this ramp directly (no width input). Object titles (chart/table/spark) combine ``width_offsets`` with a fixed object-title anchor to pick a slot."},"subtitle":{"anyOf":[{"$ref":"#/$defs/TitleSubtitleStylePatch"},{"type":"null"}],"description":"Subtitle font styles."},"width_offsets":{"anyOf":[{"$ref":"#/$defs/TitleWidthOffsetsStylePatch"},{"type":"null"}],"description":"Additive level offsets by card width (tiny/narrow/medium/wide). Consumed by ``chart_title_spec`` only \u2014 object titles add the tier offset to a fixed anchor to pick an H slot from ``sizes``. Face/prose titles are level-only and do not consult these."}},"type":"object"},"TitleSubtitleStyle":{"additionalProperties":false,"description":"VL subtitle font pass-through, grouped for consistency with TitleStyle.font.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Subtitle font style overrides (color, family, size, weight). Unset fields fall back to `style.font`."},"overflow":{"anyOf":[{"enum":["clip","truncate","wrap-two","wrap"]},{"type":"null"}],"description":"Text overflow mode for the subtitle (clip, truncate, wrap-two, wrap). None means not set at this cascade level (theme floor is wrap-two)."}},"type":"object"},"TitleSubtitleStylePatch":{"additionalProperties":false,"description":"Authored overlay for TitleSubtitleStyle. VL subtitle font pass-through, grouped for consistency with TitleStyle.font.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Subtitle font style overrides (color, family, size, weight). Unset fields fall back to `style.font`."},"overflow":{"anyOf":[{"enum":["clip","truncate","wrap-two","wrap"]},{"type":"null"}],"description":"Text overflow mode for the subtitle (clip, truncate, wrap-two, wrap). None means not set at this cascade level (theme floor is wrap-two)."}},"type":"object"},"TitleWidthOffsetsStyle":{"additionalProperties":false,"description":"Additive level offsets applied to a face/chart title's heading level, by card pixel width.","properties":{"medium":{"description":"Level offset for the medium tier (cards ~560\u20131099px).","type":"integer"},"narrow":{"description":"Level offset for the narrow tier (cards ~360\u2013559px).","type":"integer"},"tiny":{"description":"Level offset for the tiny tier (cards narrower than ~360px).","type":"integer"},"wide":{"description":"Level offset for the wide tier (cards ~1100px and up).","type":"integer"}},"required":["tiny","narrow","medium","wide"],"type":"object"},"TitleWidthOffsetsStylePatch":{"additionalProperties":false,"description":"Authored overlay for TitleWidthOffsetsStyle. Additive level offsets applied to a face/chart title's heading level, by card pixel width.","properties":{"medium":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Level offset for the medium tier (cards ~560\u20131099px)."},"narrow":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Level offset for the narrow tier (cards ~360\u2013559px)."},"tiny":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Level offset for the tiny tier (cards narrower than ~360px)."},"wide":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Level offset for the wide tier (cards ~1100px and up)."}},"type":"object"},"TooltipBorderStyle":{"additionalProperties":false,"description":"Tooltip box border \u2014 all fields required; theme YAML supplies defaults.","properties":{"color":{"description":"Border color as a CSS color string.","type":"string"},"radius":{"description":"Border corner radius in pixels.","type":"number"},"width":{"description":"Border width in pixels.","type":"number"}},"required":["color","width","radius"],"type":"object"},"TooltipBorderStylePatch":{"additionalProperties":false,"description":"Authored overlay for TooltipBorderStyle. Tooltip box border \u2014 all fields required; theme YAML supplies defaults.","properties":{"color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Border color as a CSS color string."},"radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Border corner radius in pixels."},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Border width in pixels."}},"type":"object"},"TooltipShadowStyle":{"additionalProperties":false,"description":"Tooltip drop-shadow toggle. JS applies the shadow expression when visible=true.","properties":{"visible":{"description":"Show a drop-shadow on the tooltip box; theme always provides this.","type":"boolean"}},"required":["visible"],"type":"object"},"TooltipShadowStylePatch":{"additionalProperties":false,"description":"Authored overlay for TooltipShadowStyle. Tooltip drop-shadow toggle. JS applies the shadow expression when visible=true.","properties":{"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show a drop-shadow on the tooltip box; theme always provides this."}},"type":"object"},"TooltipSlotStyle":{"additionalProperties":false,"description":"Typography for a single tooltip slot (label or value).","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Font overrides for this tooltip slot (color, weight). Unset fields fall back to `style.charts.font`."}},"type":"object"},"TooltipSlotStylePatch":{"additionalProperties":false,"description":"Authored overlay for TooltipSlotStyle. Typography for a single tooltip slot (label or value).","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Font overrides for this tooltip slot (color, weight). Unset fields fall back to `style.charts.font`."}},"type":"object"},"TooltipStyle":{"additionalProperties":false,"description":"Tooltip box style \u2014 all cascade keys for the hover bubble.","properties":{"active_marker":{"description":"How the hovered row is marked in a multi-row (x-unified) tooltip: 'fill' tints the row background (default); 'triangle' draws an edge-flush wedge in the box's left padding instead. Theme always provides this.","enum":["fill","triangle"]},"background":{"description":"Tooltip background color (CSS color string); theme always provides this.","type":"string"},"border":{"$ref":"#/$defs/TooltipBorderStyle","description":"Tooltip border style; theme always provides this."},"font":{"$ref":"#/$defs/FontStyle","description":"Tooltip font overrides (size etc.); cascade fills missing fields. Unset fields fall back to `style.charts.font`."},"format":{"description":"Default tooltip value format string; theme always provides this.","type":"string"},"gap":{"description":"Gap in pixels between label and value columns; theme always provides this.","type":"number"},"label":{"$ref":"#/$defs/TooltipSlotStyle","description":"Label-column font overrides (color, weight)."},"line_height":{"description":"Tooltip line-height multiplier; theme always provides this.","type":"number"},"max_width":{"description":"Maximum tooltip width in pixels; theme always provides this.","type":"number"},"padding":{"$ref":"#/$defs/PaddingStyle","description":"Tooltip inner padding (4 sides in pixels); theme always provides this."},"shadow":{"$ref":"#/$defs/TooltipShadowStyle","description":"Tooltip drop-shadow config; theme always provides this."},"swatch":{"$ref":"#/$defs/TooltipSwatchStyle","description":"Series colour swatch size/shape; theme always provides this."},"value":{"$ref":"#/$defs/TooltipSlotStyle","description":"Value-column font overrides (color, weight)."}},"required":["format","background","line_height","max_width","gap","padding","border","shadow","swatch","active_marker"],"type":"object"},"TooltipStylePatch":{"additionalProperties":false,"description":"Authored overlay for TooltipStyle. Tooltip box style \u2014 all cascade keys for the hover bubble.","properties":{"active_marker":{"anyOf":[{"enum":["fill","triangle"]},{"type":"null"}],"description":"How the hovered row is marked in a multi-row (x-unified) tooltip: 'fill' tints the row background (default); 'triangle' draws an edge-flush wedge in the box's left padding instead. Theme always provides this."},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tooltip background color (CSS color string); theme always provides this."},"border":{"anyOf":[{"$ref":"#/$defs/TooltipBorderStylePatch"},{"type":"null"}],"description":"Tooltip border style; theme always provides this."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Tooltip font overrides (size etc.); cascade fills missing fields. Unset fields fall back to `style.charts.font`."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default tooltip value format string; theme always provides this."},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap in pixels between label and value columns; theme always provides this."},"label":{"anyOf":[{"$ref":"#/$defs/TooltipSlotStylePatch"},{"type":"null"}],"description":"Label-column font overrides (color, weight)."},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Tooltip line-height multiplier; theme always provides this."},"max_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Maximum tooltip width in pixels; theme always provides this."},"padding":{"anyOf":[{"$ref":"#/$defs/PaddingStylePatch"},{"type":"null"}],"description":"Tooltip inner padding (4 sides in pixels); theme always provides this."},"shadow":{"anyOf":[{"$ref":"#/$defs/TooltipShadowStylePatch"},{"type":"null"}],"description":"Tooltip drop-shadow config; theme always provides this."},"swatch":{"anyOf":[{"$ref":"#/$defs/TooltipSwatchStylePatch"},{"type":"null"}],"description":"Series colour swatch size/shape; theme always provides this."},"value":{"anyOf":[{"$ref":"#/$defs/TooltipSlotStylePatch"},{"type":"null"}],"description":"Value-column font overrides (color, weight)."}},"type":"object"},"TooltipSwatchStyle":{"additionalProperties":false,"description":"Series colour swatch in the tooltip \u2014 the mark-coloured chip next to each","properties":{"radius":{"description":"Swatch corner radius in pixels (0 = square, ~half of size = circle).","type":"number"},"size":{"description":"Swatch edge length in pixels (square).","type":"number"}},"required":["size","radius"],"type":"object"},"TooltipSwatchStylePatch":{"additionalProperties":false,"description":"Authored overlay for TooltipSwatchStyle. Series colour swatch in the tooltip \u2014 the mark-coloured chip next to each","properties":{"radius":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Swatch corner radius in pixels (0 = square, ~half of size = circle)."},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Swatch edge length in pixels (square)."}},"type":"object"},"TotalSlotStyle":{"additionalProperties":false,"description":"Theme slot for one text element of the donut center total.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Donut center total element font style overrides. Unset fields fall back to `style.charts.font`."}},"type":"object"},"TotalSlotStylePatch":{"additionalProperties":false,"description":"Authored overlay for TotalSlotStyle. Theme slot for one text element of the donut center total.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Donut center total element font style overrides. Unset fields fall back to `style.charts.font`."}},"type":"object"},"TotalStyle":{"additionalProperties":false,"description":"Donut center total paint: value (the number) and label (the caption).","properties":{"label":{"$ref":"#/$defs/TotalSlotStyle","description":"Style for the donut center label (the caption)."},"value":{"$ref":"#/$defs/TotalSlotStyle","description":"Style for the donut center value (the number)."}},"required":["value","label"],"type":"object"},"TotalStylePatch":{"additionalProperties":false,"description":"Authored overlay for TotalStyle. Donut center total paint: value (the number) and label (the caption).","properties":{"label":{"anyOf":[{"$ref":"#/$defs/TotalSlotStylePatch"},{"type":"null"}],"description":"Style for the donut center label (the caption)."},"value":{"anyOf":[{"$ref":"#/$defs/TotalSlotStylePatch"},{"type":"null"}],"description":"Style for the donut center value (the number)."}},"type":"object"},"TrailMarkStyle":{"additionalProperties":false,"description":"Trail mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStyle"},{"type":"null"}],"description":"Mark stroke style; None means not overridden at this level."}},"type":"object"},"TrailMarkStylePatch":{"additionalProperties":false,"description":"Authored overlay for TrailMarkStyle. Trail mark opacity and stroke.","properties":{"opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Mark opacity (0\u20131); None means not overridden at this level."},"stroke":{"anyOf":[{"$ref":"#/$defs/StrokeStylePatch"},{"type":"null"}],"description":"Mark stroke style; None means not overridden at this level."}},"type":"object"},"Variable":{"additionalProperties":false,"description":"Variable definition from YAML.","properties":{"column":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column name in the query result to use as option values."},"data_type":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Upstream data-type hint preserved through migrations (e.g. 'string', 'number'). Informational; not currently consumed at compile time."},"default":{"description":"Default value used when no URL param is set."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Help text shown below the input control."},"dimension":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"MetricFlow dimension name for populating options."},"enabled":{"anyOf":[{"$ref":"#/$defs/SingleRowBoolProbe"},{"type":"boolean"},{"type":"string"},{"type":"null"}],"description":"Enable this control. Accepts: static bool; a variable name or Jinja boolean expression string (no {{ }} required \u2014 bare names auto-wrap); or a {query, column} form that reads a single boolean cell from a named query. None = enabled. Absent variable in a string expression raises (use a default)."},"input":{"default":"auto","description":"UI control type (select, multiselect, slider, daterange, etc.). 'auto' detects from options.","enum":["auto","select","multiselect","input","text","number","textarea","slider","range","date","datepicker","daterange","checkbox","radio"]},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Display label shown above the input control."},"max":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Maximum value for slider/range inputs."},"measure":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"MetricFlow measure name for populating options."},"min":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Minimum value for slider/range inputs."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"dbt model name for populating options."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SQL operator used when generating filter expressions (e.g., '=', 'IN', 'LIKE')."},"options":{"anyOf":[{"$ref":"#/$defs/VariableOptions"},{"type":"null"}],"description":"Static or query-driven option list configuration."},"placeholder":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Placeholder text shown in the input when empty."},"query":{"anyOf":[{"$ref":"#/$defs/AuthoredQuery"},{"type":"string"},{"type":"null"}],"description":"Query name or inline query definition for populating options."},"required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"When True, a value must be provided before queries execute."},"step":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"description":"Step size for slider/range inputs."},"visible":{"default":true,"description":"When False, the variable is not rendered in the UI but can still be set via URL params.","type":"boolean"}},"type":"object"},"VariableOptions":{"additionalProperties":false,"description":"Options configuration for variable inputs.","properties":{"column":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column in the query result to use as option values."},"label_column":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Column in the query result to use as display labels (separate from values)."},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Query name whose result rows provide option values."},"static":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"List of static option values (strings or numbers)."}},"type":"object"},"VariableRef":{"additionalProperties":false,"description":"Cross-file variable reference. Bare string is coerced automatically.","properties":{"ref":{"description":"Reference path: '<file>.variables.<name>'. May start with one or more '../' segments to reach a sibling directory. A bare string value is coerced automatically.","type":"string"}},"required":["ref"],"type":"object"},"VariablesLabelStyle":{"additionalProperties":false,"description":"Per-label font substyle for variable controls. Cascades from variables.font.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Variable label font style overrides. Unset fields fall back to `style.variables.font`."}},"type":"object"},"VariablesLabelStylePatch":{"additionalProperties":false,"description":"Authored overlay for VariablesLabelStyle. Per-label font substyle for variable controls. Cascades from variables.font.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Variable label font style overrides. Unset fields fall back to `style.variables.font`."}},"type":"object"},"VariablesPlaceholderStyle":{"additionalProperties":false,"description":"Per-placeholder font substyle for variable controls.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Variable placeholder-text font style overrides. Unset fields fall back to `style.variables.font`."}},"type":"object"},"VariablesPlaceholderStylePatch":{"additionalProperties":false,"description":"Authored overlay for VariablesPlaceholderStyle. Per-placeholder font substyle for variable controls.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Variable placeholder-text font style overrides. Unset fields fall back to `style.variables.font`."}},"type":"object"},"VariablesStyle":{"additionalProperties":false,"description":"Variable controls chrome styling.","properties":{"border":{"$ref":"#/$defs/BorderStyle","description":"Variables panel border style."},"container_height":{"description":"Height of the variables panel container in pixels.","type":"number"},"container_padding":{"description":"Inner padding of the variables panel container in pixels.","type":"number"},"control_gap":{"description":"Gap between label and input within a single control in pixels.","type":"number"},"font":{"$ref":"#/$defs/FontStyle","description":"Variables panel base font style overrides. Unset fields fall back to `style.font`."},"gap":{"description":"Gap between variable controls in pixels.","type":"number"},"input":{"$ref":"#/$defs/InputStyle","description":"Input control style."},"label":{"$ref":"#/$defs/VariablesLabelStyle","description":"Variable label typography."},"label_position":{"description":"Position of labels relative to their input controls (e.g. 'left', 'top').","type":"string"},"line_height":{"description":"Line height for variable control text in pixels.","type":"number"},"padding":{"description":"Outer padding around the variables panel in pixels.","type":"number"},"placeholder":{"$ref":"#/$defs/VariablesPlaceholderStyle","description":"Style for unselected/hint text in variable inputs."},"popover_rail_background":{"description":"Background color for the preset rail (left column) inside the daterange chip's popover. Typically the theme's `surface-subtle` step \u2014 gray-50 on white-canvas themes, a cream-toned light on warm-canvas themes. Distinct from the popover card itself, which is always white-equivalent.","type":"string"},"position":{"description":"Variables strip placement: stacked under the title (top/bottom) or on one horizontal band with the face title (title-inline).","enum":["top","bottom","title-inline"]},"title_inline_band_bottom_pad":{"description":"Bottom padding in pixels added below the title-inline band.","type":"number"},"title_inline_title_max_width":{"description":"When position is title-inline: max title column width in px. 0 means no cap (title uses remaining width after reserving space for variables).","type":"number"},"value":{"$ref":"#/$defs/VariablesValueStyle","description":"Variable value typography."},"visible":{"description":"Show the variables control panel.","type":"boolean"}},"required":["visible","position","title_inline_band_bottom_pad","gap","label_position","title_inline_title_max_width","label","value","placeholder","line_height","padding","container_height","container_padding","border","control_gap","input","popover_rail_background"],"type":"object"},"VariablesStylePatch":{"additionalProperties":false,"description":"Authored overlay for VariablesStyle. Variable controls chrome styling.","properties":{"border":{"anyOf":[{"$ref":"#/$defs/BorderStylePatch"},{"type":"null"}],"description":"Variables panel border style."},"container_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Height of the variables panel container in pixels."},"container_padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Inner padding of the variables panel container in pixels."},"control_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between label and input within a single control in pixels."},"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Variables panel base font style overrides. Unset fields fall back to `style.font`."},"gap":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Gap between variable controls in pixels."},"input":{"anyOf":[{"$ref":"#/$defs/InputStylePatch"},{"type":"null"}],"description":"Input control style."},"label":{"anyOf":[{"$ref":"#/$defs/VariablesLabelStylePatch"},{"type":"null"}],"description":"Variable label typography."},"label_position":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Position of labels relative to their input controls (e.g. 'left', 'top')."},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Line height for variable control text in pixels."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Outer padding around the variables panel in pixels."},"placeholder":{"anyOf":[{"$ref":"#/$defs/VariablesPlaceholderStylePatch"},{"type":"null"}],"description":"Style for unselected/hint text in variable inputs."},"popover_rail_background":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Background color for the preset rail (left column) inside the daterange chip's popover. Typically the theme's `surface-subtle` step \u2014 gray-50 on white-canvas themes, a cream-toned light on warm-canvas themes. Distinct from the popover card itself, which is always white-equivalent."},"position":{"anyOf":[{"enum":["top","bottom","title-inline"]},{"type":"null"}],"description":"Variables strip placement: stacked under the title (top/bottom) or on one horizontal band with the face title (title-inline)."},"title_inline_band_bottom_pad":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bottom padding in pixels added below the title-inline band."},"title_inline_title_max_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"When position is title-inline: max title column width in px. 0 means no cap (title uses remaining width after reserving space for variables)."},"value":{"anyOf":[{"$ref":"#/$defs/VariablesValueStylePatch"},{"type":"null"}],"description":"Variable value typography."},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Show the variables control panel."}},"type":"object"},"VariablesValueStyle":{"additionalProperties":false,"description":"Per-value font substyle for variable controls. Cascades from variables.font.","properties":{"font":{"$ref":"#/$defs/FontStyle","description":"Variable value font style overrides. Unset fields fall back to `style.variables.font`."},"numeric_variant":{"description":"OpenType numeric feature for value displays ('normal' or 'tabular-nums').","enum":["normal","tabular-nums"]}},"required":["numeric_variant"],"type":"object"},"VariablesValueStylePatch":{"additionalProperties":false,"description":"Authored overlay for VariablesValueStyle. Per-value font substyle for variable controls. Cascades from variables.font.","properties":{"font":{"anyOf":[{"$ref":"#/$defs/FontStyle"},{"type":"null"}],"description":"Variable value font style overrides. Unset fields fall back to `style.variables.font`."},"numeric_variant":{"anyOf":[{"enum":["normal","tabular-nums"]},{"type":"null"}],"description":"OpenType numeric feature for value displays ('normal' or 'tabular-nums')."}},"type":"object"},"ViewStyle":{"additionalProperties":false,"properties":{"continuous_height":{"description":"Default plot height for continuous (quantitative) scales in pixels.","type":"number"},"continuous_width":{"description":"Default plot width for continuous (quantitative) scales in pixels.","type":"number"},"discrete_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default plot height for discrete (ordinal/nominal) scales in pixels; None means auto."},"discrete_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default plot width for discrete (ordinal/nominal) scales in pixels; None means auto."},"stroke":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Plot area border stroke color; None means no border."}},"required":["stroke","continuous_width","continuous_height"],"type":"object"},"ViewStylePatch":{"additionalProperties":false,"description":"Authored overlay for ViewStyle.","properties":{"continuous_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default plot height for continuous (quantitative) scales in pixels."},"continuous_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default plot width for continuous (quantitative) scales in pixels."},"discrete_height":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default plot height for discrete (ordinal/nominal) scales in pixels; None means auto."},"discrete_width":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Default plot width for discrete (ordinal/nominal) scales in pixels; None means auto."},"stroke":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Plot area border stroke color; None means no border."}},"type":"object"},"XScaleStyle":{"additionalProperties":false,"description":"Scale config for axis_x.scale only.","properties":{"clamp":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Clamp values to scale domain; None uses Vega-Lite's default (no clamping)."},"continuous":{"anyOf":[{"$ref":"#/$defs/ScaleContinuousStyle"},{"type":"null"}],"description":"Continuous-scale overrides (type, domain, zero, log/pow/symlog params); None means no override."},"headroom":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Fractional breathing room at measure-axis edges, exact (never nice-rounded). Zero-anchored axes (bar; line/area/scatter near zero): domain_max = data_max * (1 + headroom). Zoomed axes (line/area/scatter far from zero): both edges expand \u2014 domain_max = data_max + headroom * span; domain_min = data_min - headroom * span. None inherits the theme default; 0 disables headroom. Ignored with an explicit `domain` or `stack: normalize`."},"nice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Round scale domain to nice values; None uses Vega-Lite's default."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Unified scale padding shortcut; dispatches to band, point, or continuous padding per scale type."},"round":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Round scale outputs to nearest integer; None uses Vega-Lite's default (no rounding)."},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit tick values; None uses Vega-Lite's auto tick values."},"x_reverse":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Reverse the x-axis scale direction; None means no reversal."}},"type":"object"},"XScaleStylePatch":{"additionalProperties":false,"description":"Authored overlay for XScaleStyle. Scale config for axis_x.scale only.","properties":{"clamp":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Clamp values to scale domain; None uses Vega-Lite's default (no clamping)."},"continuous":{"anyOf":[{"$ref":"#/$defs/ScaleContinuousStylePatch"},{"type":"null"}],"description":"Continuous-scale overrides (type, domain, zero, log/pow/symlog params); None means no override."},"headroom":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Fractional breathing room at measure-axis edges, exact (never nice-rounded). Zero-anchored axes (bar; line/area/scatter near zero): domain_max = data_max * (1 + headroom). Zoomed axes (line/area/scatter far from zero): both edges expand \u2014 domain_max = data_max + headroom * span; domain_min = data_min - headroom * span. None inherits the theme default; 0 disables headroom. Ignored with an explicit `domain` or `stack: normalize`."},"nice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Round scale domain to nice values; None uses Vega-Lite's default."},"padding":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Unified scale padding shortcut; dispatches to band, point, or continuous padding per scale type."},"round":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Round scale outputs to nearest integer; None uses Vega-Lite's default (no rounding)."},"values":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Explicit tick values; None uses Vega-Lite's auto tick values."},"x_reverse":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Reverse the x-axis scale direction; None means no reversal."}},"type":"object"}},"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"description":"AuthoredFace (dataface) definition from YAML.","properties":{"aliases":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Additional URLs that redirect to this face's canonical file-path URL. Each entry must be absolute (leading /). Requests to these URLs are redirected (302) to the face's real path, query string preserved. Valid on .yml, .yaml, .md, and folder index.* faces."},"allow_html":{"default":false,"description":"Render the face's body text as raw HTML via foreignObject instead of markdown. TRUSTED-CONTENT ONLY: the HTML (including any Jinja-interpolated values) is rendered as-authored \u2014 this is NOT a security sandbox. mdsvg strips <script>/event-handlers as a best-effort guard, not a guarantee. Enable only on first-party faces you fully control.","type":"boolean"},"auto_link":{"default":false,"description":"When True, table charts with no explicit link: automatically link each row to its canonical /data/<source>/<schema>/<table>/detail/ page. Default off. Explicit link: always wins; set link: ~ to suppress per chart.","type":"boolean"},"cache":{"$ref":"#/$defs/CachePatch","description":"Cache policy for every query in this dashboard, e.g. cache: 1h \u2014 queries inherit it and may refine it; cache: false opts the whole dashboard out. Inheritable via the meta.yaml cascade."},"card_gap":{"default":false,"description":"When True, adds gap between cards. Default: cards are edge-to-edge (0 gap).","type":"boolean"},"chart_focus":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Render only this named chart with its dependent variables (useful for embedding or SVG export)."},"charts":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/$defs/BarChart"},{"$ref":"#/$defs/LineChart"},{"$ref":"#/$defs/AreaChart"},{"$ref":"#/$defs/ScatterChart"},{"$ref":"#/$defs/HeatmapChart"},{"$ref":"#/$defs/PieChart"},{"$ref":"#/$defs/KpiChart"},{"$ref":"#/$defs/TableChart"},{"$ref":"#/$defs/PointMapChart"},{"$ref":"#/$defs/GeoshapeChart"},{"$ref":"#/$defs/CalloutChart"},{"$ref":"#/$defs/SparkBarChart"}]},"type":"object"},{"type":"null"}],"description":"Named chart definitions. When no explicit layout is present, charts render as an implicit row layout in authored order."},"cols":{"anyOf":[{"items":{"anyOf":[{"anyOf":[{"$ref":"#"},{"$ref":"#/$defs/AuthoredChart"},{"$ref":"#/$defs/ForeachItem"},{"type":"string"}]},{"additionalProperties":{"$ref":"#/$defs/AuthoredChart"},"type":"object"}]},"type":"array"},{"type":"null"}],"description":"Horizontal layout: list of chart names or inline chart/face definitions."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Description text for the dashboard."},"details":{"anyOf":[{"$ref":"#/$defs/FaceDetails"},{"type":"null"}],"description":"Collapsible section metadata. String shorthand: details: 'text' \u2192 FaceDetails(summary='text'). Block form: details: {summary: ..., expanded_title: ..., expanded: false}."},"extends":{"anyOf":[{"type":"string"},{"type":"array"},{"type":"null"}],"description":"Face name(s) or relative path(s) this face inherits from, low to high priority."},"grid":{"anyOf":[{"$ref":"#/$defs/GridLayout"},{"type":"null"}],"description":"CSS-grid style layout with explicit row/column placement."},"height":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"description":"Height when nested (e.g., '300px' or an integer in pixels)."},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit ID for this face. Auto-generated from filename if omitted."},"queries":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/$defs/AuthoredSqlQuery"},{"$ref":"#/$defs/AuthoredMetricflowQuery"},{"$ref":"#/$defs/AuthoredHttpQuery"},{"$ref":"#/$defs/AuthoredValuesQuery"},{"$ref":"#/$defs/AuthoredCompactValuesQuery"},{"$ref":"#/$defs/AuthoredSchemaQuery"},{"$ref":"#/$defs/AuthoredLookmlQuery"},{"$ref":"#/$defs/AuthoredLookmlMergeQuery"}]},"type":"object"},{"type":"null"}],"description":"Named query definitions (SQL, CSV, MetricFlow, HTTP, etc.)."},"rows":{"anyOf":[{"items":{"anyOf":[{"anyOf":[{"$ref":"#"},{"$ref":"#/$defs/AuthoredChart"},{"$ref":"#/$defs/ForeachItem"},{"type":"string"}]},{"additionalProperties":{"$ref":"#/$defs/AuthoredChart"},"type":"object"}]},"type":"array"},{"type":"null"}],"description":"Vertical stack layout: list of chart names or inline chart/face definitions."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default source name for all queries in this face. Inheritable via meta.yaml cascade."},"style":{"anyOf":[{"$ref":"#/$defs/StylePatch"},{"type":"null"}],"description":"Style patch (background, padding, border, etc.). Background and semantic color tokens (accent, muted) cascade to nested child faces."},"tabs":{"anyOf":[{"$ref":"#/$defs/TabLayout"},{"type":"null"}],"description":"Tabbed navigation layout where each tab contains its own layout."},"tags":{"anyOf":[{"type":"array"},{"type":"null"}],"description":"Tags for categorization and search."},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Markdown text content for text-only sections."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dashboard title displayed at the top."},"variables":{"anyOf":[{"additionalProperties":{"$ref":"#/$defs/Variable"},"type":"object"},{"type":"null"}],"description":"Variable definitions for dynamic filtering and UI controls."},"visible":{"anyOf":[{"$ref":"#/$defs/SingleRowBoolProbe"},{"type":"boolean"},{"type":"string"},{"type":"null"}],"description":"Controls whether this layout item is rendered. Accepts a bool, variable name, Jinja expression, or {query, column} probe."},"width":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"description":"Width when nested (e.g., '50%', '400px', or an integer in pixels). On the root face there is no parent to place it into, so it instead sets the board's own width (equivalent to 'style.board.width') \u2014 percentages are rejected there since there's nothing to size relative to."}},"title":"AuthoredFace","type":"object"}