Skip to main content

pbir-visual-json

Use when editing visual.json inside a Power BI PBIR report's visuals/ folder. Covers top-level structure (name, position, visual vs visualGroup mutually exclusive, filterConfig sibling NOT child of visual, root-level isHidden for bookmark toggles), expression literal suffixes — string 'text', double 14D, integer 14L, decimal 2.4M, hex '#FF0000', datetime literal, null — with exceptions (transparency uses L inside dropShadow, labelPrecision L, labelDisplayUnits D, triple-quoted font fallback chains), field reference patterns (Column, Measure, Aggregation, HierarchyLevel, SparklineData), visual-type to query-role map (card, tableEx, pivotTable, slicer, lineChart, barChart, kpi, scatterChart), objects vs visualContainerObjects split, sortDefinition, slicer default values via objects.general.properties.filter, visual groups, table column widths. Invoke when user edits visual.json, sets a visual property, debugs silently-ignored container props, or writes SQExpr literals.

跳到安装

来源信息

仓库
wardawgmalvicious/claude-config
最近来源活动
2026年5月5日 20:49
检测到的 SKILL.md 语言
英语
星标
2
分支
1

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
2 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
pbir-visual-json
description
Use when editing visual.json inside a Power BI PBIR report's visuals/ folder. Covers top-level structure (name, position, visual vs visualGroup mutually exclusive, filterConfig sibling NOT child of visual, root-level isHidden for bookmark toggles), expression literal suffixes — string 'text', double 14D, integer 14L, decimal 2.4M, hex '#FF0000', datetime literal, null — with exceptions (transparency uses L inside dropShadow, labelPrecision L, labelDisplayUnits D, triple-quoted font fallback chains), field reference patterns (Column, Measure, Aggregation, HierarchyLevel, SparklineData), visual-type to query-role map (card, tableEx, pivotTable, slicer, lineChart, barChart, kpi, scatterChart), objects vs visualContainerObjects split, sortDefinition, slicer default values via objects.general.properties.filter, visual groups, table column widths. Invoke when user edits visual.json, sets a visual property, debugs silently-ignored container props, or writes SQExpr literals.
paths
["**/visuals/**/visual.json"]
## PBIR visual.json Reference Path: `Report.Report/definition/pages/{PageName}/visuals/{VisualName}/visual.json` ### Top-Level Structure | Property | Type | Required | Notes | |---|---|---|---| | `$schema` | string | yes | `.../visualContainer/2.7.0/schema.json` | | `name` | string | yes | Stable visual ID — referenced by bookmarks, interactions | | `position` | object | yes | `x`, `y`, `z`, `width`, `height`, `tabOrder` | | `visual` | object | one of | Regular visual — mutually exclusive with `visualGroup` | | `visualGroup` | object | one of | Group container | | `parentGroupName` | string | no | Set on children of a `visualGroup` | | `filterConfig` | object | no | Visual-scoped filters — sibling of `visual`, NOT nested | | `isHidden` | boolean | no | Root-level. Visual still processes data; common for bookmark toggles | ### position ```json {"x": 100, "y": 50, "z": 1000, "width": 400, "height": 300, "tabOrder": 0} ``` `z` layer order: higher = front. Common values `0, 1000, 2000, 3000, 5000, 8000, 15000`. ### visual Object | Property | Notes | |---|---| | `visualType` | See visual type table below | | `query.queryState` | Role → projections map | | `query.sortDefinition` | `sort[]` + `isDefaultSort` | | `objects` | Visual-specific formatting (axes, legend, dataPoint, labels, lineStyles) | | `visualContainerObjects` | Container formatting (title, subTitle, background, border, dropShadow, padding, divider, visualHeader, visualTooltip) | | `drillFilterOtherVisuals` | boolean | | `syncGroup` | Slicer cross-page sync: `groupName`, `fieldChanges`, `filterChanges` | | `expansionStates` | pivotTable row/column expansion | **Critical**: `objects` vs `visualContainerObjects` are distinct in schema 2.4.0+. Container properties in `objects` fail silently. `visualContainerObjects` at root errors. ### Expression Literal Suffixes All formatting values inside `visual.json` use `{"expr": {"Literal": {"Value": "..."}}}` wrappers. Theme JSON uses bare values. | Type | Example | Notes | |---|---|---| | String | `"'smooth'"` | Inner single quotes required | | Double | `"14D"` | Font sizes, percentages, most numerics | | Integer | `"14L"` | Pixel counts, enum values, `labelPrecision` | | Decimal | `"2.4M"` | Money/decimal precision | | Boolean | `"true"` | Lowercase, no quotes, no suffix | | DateTime | `"datetime'2024-01-15T00:00:00.0000000'"` | Closing `'` required | | Hex color | `"'#FF0000'"` | Inner single quotes; 6-digit RGB or 8-digit ARGB | | Null | `"null"` | Lowercase, no quotes | Non-literal expressions: | Type | Shape | |---|---| | Theme color | `{"expr": {"ThemeDataColor": {"ColorId": 0, "Percent": 0}}}` | | Extension measure | `{"expr": {"Measure": {"Expression": {"SourceRef": {"Schema": "extension", "Entity": "_Formatting"}}, "Property": "Color"}}}` | **Gotchas**: `transparency` uses `D` normally but `L` inside `dropShadow`. `labelPrecision` always `L`, `labelDisplayUnits` always `D`. String escaping: single quotes doubled (`"'O''Brien'"`). Font fallback chains: `"'''Segoe UI Semibold'', helvetica, sans-serif'"`. (Yes — three single quotes. The outer pair wraps the SQExpr string literal; the inner pair escapes the space-containing font name. Not a typo.) ### Field Reference Patterns | Pattern | Shape | |---|---| | Column | `{"Column": {"Expression": {"SourceRef": {"Entity": "Table"}}, "Property": "Col"}}` | | Measure (model) | `{"Measure": {"Expression": {"SourceRef": {"Entity": "Table"}}, "Property": "M"}}` | | Measure (extension) | `{"Measure": {"Expression": {"SourceRef": {"Schema": "extension", "Entity": "_Fmt"}}, "Property": "M"}}` | | Aggregation | `{"Aggregation": {"Expression": {"Column": {...}}, "Function": 0}}` | | Hierarchy level | `{"HierarchyLevel": {"Expression": {"Hierarchy": {...}}, "Level": "Level"}}` | | SparklineData | `{"SparklineData": {"Measure": {...}, "Groupings": [{"Column": {...}}]}}` | `QueryAggregateFunction`: `0`=Sum, `1`=Avg, `2`=DistinctCount, `3`=Min, `4`=Max, `5`=Count, `6`=Median, `7`=StdDev, `8`=Var **Filter SourceRef gotcha**: inside filter `Where` conditions, SourceRef uses `"Source": "alias"` (from `From`), NOT `"Entity"`. Query projections use `"Entity"`. ### Visual Types and Query Roles | visualType | Roles | |---|---| | `card` | Values | | `cardVisual` (new card) | Data | | `tableEx` | Values | | `pivotTable` | Rows, Columns, Values | | `slicer` / `advancedSlicerVisual` | Values | | `pieChart` / `donutChart` | Category, Y | | `lineChart` | Category, Y, Y2 (combo) | | `areaChart` / `stackedAreaChart` | Category, Y, Series | | `barChart` / `clusteredBarChart` / `hundredPercentStackedBarChart` | Category, Y | | `columnChart` / `clusteredColumnChart` / `hundredPercentStackedColumnChart` | Category, Y | | `lineClusteredColumnComboChart` / `lineStackedColumnComboChart` | Category, Y, Y2 | | `ribbonChart` / `waterfallChart` | Category, Y | | `scatterChart` | Category, X, Y, Size, Tooltips | | `gauge` | Y, TargetValue | | `kpi` | Indicator, Goal, TrendLine | | `textbox` | none (uses `objects.general.paragraphs`) | | `shape` / `actionButton` / `image` | none | | `scriptVisual` / `pythonVisual` | Values | | `PBI_CV_<GUID>` | varies (custom visuals) | | `deneb<GUID>` | dataset | ### Projection Properties | Property | Notes | |---|---| | `queryRef` | `Table.Field` — internal reference | | `nativeQueryRef` | Display label | | `displayName` | Optional override | | `active` | Boolean — hierarchy level expanded | Visual calculations (`NativeVisualCalculation`) always have `queryRef: "select"`. ### sortDefinition ```json "sortDefinition": { "sort": [{ "field": {"Measure": {"Expression": {"SourceRef": {"Entity": "Sales"}}, "Property": "Revenue"}}, "direction": "Descending" }], "isDefaultSort": true } ``` ### Slicer Default Selected Values Store in `objects.general.properties.filter` — NOT `filterConfig`. `filterConfig` filters data going *into* the slicer; `objects.general.properties.filter` pre-selects values. ### Hiding Visuals and Fields - Hide whole visual: `"isHidden": true` at root (outside `visual`). - Hide fields from display: omit from `queryState` — still referenceable by extension measures / filters. ### Visual Groups ```json { "name": "kpi_group", "position": {"x": 0, "y": 0, "z": 0, "width": 800, "height": 400}, "visualGroup": { "displayName": "KPI Section", "groupMode": "ScaleMode", "objects": {"background": [...], "general": [...], "lockAspect": [...]} } } ``` `groupMode`: `ScaleMode` (scale contents) or `ScrollMode`. Children set `parentGroupName`. Group objects limited to `background`, `general`, `lockAspect`. ### Table / Matrix Column Widths ```json "columnWidth": [{ "properties": {"value": {"expr": {"Literal": {"Value": "215D"}}}}, "selector": {"metadata": "Orders.Order Lines"} }] ``` ### mobile.json Optional sibling file at `visuals/{VisualName}/mobile.json`. Mirrors `visual.json` position fields with mobile coordinates. Typically authored via Desktop. ### Gotchas | Issue | Cause | Fix | |---|---|---| | Container props silently ignored | Placed in `objects` instead of `visualContainerObjects` | Move title/border/background/dropShadow/padding to `visualContainerObjects` | | Root-level error on `visualContainerObjects` | Placed at `visual.json` root instead of inside `visual` | Nest under `visual` (container objects still live inside `visual`) | | `filterConfig` ignored | Nested inside `visual` | Must be sibling of `visual` at root of visual.json | | Slicer default values don't stick | Stored in `filterConfig` | Use `objects.general.properties.filter` | | `transparency` parse error in dropShadow | Used `D` suffix | Use `L` inside `dropShadow` | | String literal unterminated | Missing closing single quote on `datetime'...'` | Always close datetime literals with `'` | | Filter Where condition broken | Used `SourceRef.Entity` instead of `SourceRef.Source` | Reference the alias from `From[]` | | Font fallback chain broken | Single-level quotes | Triple-quote primary font: `"'''Segoe UI Semibold'', sans-serif'"` | | `labelPrecision` rejected | Used `D` suffix | Always `L` | | `labelDisplayUnits` rejected | Used `L` suffix | Always `D` | | Sparkline formatting ignored | `selector.metadata` doesn't match projection `queryRef` | Copy exact `SparklineData(...)` queryRef into selector | | `visual` and `visualGroup` both present | Mutually exclusive | Pick one per visual.json | ### April 2026 visual changes | Visual | Change | Authoring impact | |---|---|---| | `cardVisual` / `slicer` (button-slicer / list-slicer modes) | Multicard layout exposes a **Fixed size** toggle (exact pixel dimensions). Mutually exclusive with **Fit to space** (renamed from `Autogrid`). | Property names not yet documented as a JSON-schema keys — verify in a saved visual.json before authoring. Existing reports with `Autogrid` formatting will surface under `Fit to space` in the Format pane. | | `cardVisual` | Theme JSON keys `paddingUniform` (default 12) and `backgroundTransparency` documented under `cardVisual` style preset. Category headers participate in Edit interactions; Multi-category layout `Autogrid` capped at 4 rows (toggle off for more). | When clearing legacy padding, write `"paddingUniform": 0`. Theme schema URL is `reportThemeSchema-2.149.json`. | | `narrativeVisual` (smart narrative) | Defaults to **Copilot mode** for users with a Copilot license. Character limit raised to **10,000**. | Narrative visual.json content beyond 10,000 chars should now load; treat default-mode probes carefully — un-licensed users still land in classic mode. | ### Reference - Microsoft Learn: [Visualizations overview in Power BI](https://learn.microsoft.com/power-bi/visuals/power-bi-visualizations-overview) - Microsoft Learn: [Visualization types in Power BI](https://learn.microsoft.com/power-bi/visuals/power-bi-visualization-types-for-reports-and-q-and-a) - Microsoft Learn: [Power BI Desktop project — report folder](https://learn.microsoft.com/power-bi/developer/projects/projects-report) - Microsoft Learn: [Card visual — Fixed size, Fit to space, theme keys](https://learn.microsoft.com/power-bi/visuals/power-bi-visualization-card) - Microsoft Learn: [Smart narrative visual](https://learn.microsoft.com/power-bi/visuals/power-bi-visualization-smart-narrative)
在 GitHub 查看
这个 SKILL.md 很大,SkillsMP 这里只预览前一段内容。 在 GitHub 查看