SKILL.md
PBIR Visual Creator
Create Power BI visuals for PBIR (.Report folder) projects using validated templates.
When to Use This Skill
Use when the user wants to:
- Add a new visual to a Power BI report page
- Create a card, chart, table, matrix, slicer, or map visual
- Generate visual.json files for PBIR projects
- Bind measures or columns to visuals
Available Templates
Search visual-templates/ in this plugin for available templates:
| Template | Visual Type | Use Case |
|---|---|---|
card-single-measure.json |
Card | Single KPI display |
line-chart-category-y.json |
Line Chart | Trend over category |
line-chart-multi-y.json |
Line Chart | Multiple measures on Y |
line-chart-with-series.json |
Line Chart | Category + legend series |
bar-chart-category-y.json |
Bar Chart | Horizontal bars |
bar-chart-with-series.json |
Bar Chart | Grouped/stacked bars |
clustered-column-multi-measure.json |
Column Chart | Side-by-side columns |
table-basic.json |
Table | Columnar data |
matrix-basic.json |
Matrix | Pivot table |
pie-chart.json |
Pie Chart | Part-to-whole |
scatter-bubble-chart.json |
Scatter/Bubble | X-Y relationship |
azure-map-gradient.json |
Azure Map | Filled regions |
azure-map-bubble.json |
Azure Map | Bubble markers |
slicer-between-date.json |
Slicer | Date range filter |
slicer-dropdown.json |
Slicer | Dropdown selection |
slicer-list-multiselect.json |
Slicer | Multi-select list |
image-static.json |
Image | Static logo/image |
Workflow
Step 1: Gather Requirements
Ask the user:
- Visual type - What kind of visual? (card, bar chart, line chart, etc.)
- Data bindings - Which measures/columns?
- Position - Where on the page? (or use layout defaults)
- Title - Visual title text
- Target page - Which report page folder?
Step 2: Select Template
# Find matching template
Glob: visual-templates/*.json
# Read template
Read: visual-templates/[selected-template].json
Step 3: Substitute Placeholders
Replace {{PLACEHOLDER}} values:
Common:
{{VISUAL_NAME}}- Unique identifier (e.g.,TotalSalesCard){{X}},{{Y}}- Position coordinates{{WIDTH}},{{HEIGHT}}- Dimensions{{Z}}- Z-order (typically 2000+){{TAB_ORDER}}- Keyboard navigation order{{TITLE}}- Visual title text{{FILTERGUID}}- Generate withsecrets.tokenhex(10)
Data Bindings:
{{TABLENAME}},{{MEASURENAME}}- Primary measure{{CATEGORYTABLE}},{{CATEGORYCOLUMN}}- X-axis dimension{{SERIESTABLE}},{{SERIESCOLUMN}}- Legend/series
Step 4: Generate visual.json
Create folder structure:
.Report/definition/pages/[PageGUID]/visuals/[VisualGUID]/visual.json
Generate GUID: VisualContainer + 8 random hex digits
Step 5: Validate Output
Before writing, verify:
- JSON is well-formed
- All placeholders replaced
- Measure/column references are correct
- Position within canvas (1600x900)
Example: Create a Card Visual
User request: "Add a Total Sales card to the Dashboard page"
Process:
- Read
visual-templates/card-single-measure.json - Replace placeholders:
`` {{VISUALNAME}} → "TotalSalesCard" {{TABLENAME}} → "FactSales" {{MEASURENAME}} → "Total Sales" {{TITLE}} → "Total Sales" {{X}} → "24" {{Y}} → "80" {{WIDTH}} → "300" {{HEIGHT}} → "180" {{Z}} → "2000" {{TABORDER}} → "0" {{FILTERGUID}} → "a1b2c3d4e5f6789012ab" {{FONTSIZE}} → "32" {{DISPLAYUNITS}} → "1" ``
- Write to
.Report/definition/pages/ReportSection.../visuals/VisualContainerABCD1234/visual.json
Data Binding Patterns
Measure reference:
{
"field": {
"Measure": {
"Expression": { "SourceRef": { "Entity": "TableName" } },
"Property": "Measure Name"
}
},
"queryRef": "TableName.Measure Name",
"nativeQueryRef": "Measure Name"
}
Column reference:
{
"field": {
"Column": {
"Expression": { "SourceRef": { "Entity": "TableName" } },
"Property": "column_name"
}
},
"queryRef": "TableName.column_name",
"nativeQueryRef": "column_name",
"active": true
}
Schema Version
All templates use PBIR schema version 2.4.0:
https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/2.4.0/schema.json
Constraints
- Templates are read-only (don't modify originals)
- Always generate unique visual GUIDs
- Validate JSON before writing
- Use
queryState/projectionsstructure (not legacy config blobs)