Build Azure Portal pages from screenshots, descriptions, or design specs using the Pydantic PageSchema pipeline. Generates a validated .schema.json and .tsx page component, registers it in App.tsx, and produces a build report listing every component used, every component created from scratch, and the decisions made. Use this skill whenever the user asks to "create a page", "build a page", "generate a page", "make a page", "recreate this portal page", or provides a screenshot of an Azure Portal page and wants it built. Also triggers on: "build this", "create this", "make this look like the portal", "page from screenshot".
Build Azure Portal pages using the Pydantic PageSchema pipeline. This skill takes a user's intent (screenshot, description, or spec), produces a .schema.json conforming to the PageSchema Pydantic model, generates a React .tsx component, registers it in App.tsx, and finishes with a structured build report.
schemas/page.py (Pydantic models), schemas/codegen.py (TSX generator), schemas/validator.py, schemas/loader.pypython pipeline.py schema.json (parse → validate → generate)src/pages/ — each page is a <Name>.tsx + <Name>.schema.json pairsrc/App.tsx — import and add to the pages record@azure-fluent-storybook/componentspackage.json@fluentui/react-components + @fluentui/react-iconsFollow these steps in order. Do not skip steps.
Before writing any component code, you MUST consult Storybook MCP to understand each component's API, variants, best practices, and gotchas:
getComponentList to see all available composed components and templates.getComponentsProps for every component you plan to use — read the full Storybook documentation for each one. This tells you the correct props, available variants, do's and don'ts, and usage patterns. This is critical for greenfield builds and when modifying existing designs.@azure-fluent-storybook/components — this is a real npm package in the project dependencies. Both components and themes are exported from this single package.@fluentui/react-components for elements that have no equivalent in @azure-fluent-storybook/components.If Storybook MCP is not running, STOP and tell the user:
"The Storybook MCP server isn't running. Open the Command Palette (
Cmd+Shift+P), type MCP: List Servers, and click Start next to storybook."
Determine what the user wants to build. Input can be:
Extract these details from the input:
Read references/layout-decision.md for the layout decision guide.
Apply this rule:
The PageSchema supports 5 content template types. Pick the right one:
| Template | When to Use |
|---|---|
list-table | Data tables, resource lists, browse pages with columns |
form | Create/edit forms with input fields |
cards-grid | Dashboard overviews, KPI cards, service tiles |
detail | Property sheets, overview sections with subsections |
custom | Anything that doesn't fit the above — compose freely |
If the page doesn't fit any standard template (e.g., it has tabs, cards, illustrations, and mixed content like a resource overview "Get started" tab), use custom as the template kind in the schema but build the TSX by hand — the codegen only handles structured templates.
Create src/pages/<PageName>.schema.json conforming to the PageSchema Pydantic model.
Read references/schema-reference.md for the full schema structure and field descriptions.
The schema answers 6 questions:
"azure" or "sre"SideNavConfig with entries (NavItem/NavGroup), defaultSelected, widthTitleConfig with resourceName, pageName, icon, breadcrumbsCommandBar with items (StoryRef-backed buttons)list-table, form, cards-grid, detail, customEssentialsConfig with key-value fields (or null)For command bar items, use these StoryRef patterns:
{
"story": {
"storyId": "components-button--subtle",
"instanceId": "<unique-id>",
"argOverrides": { "label": "Button Text", "icon": "IconName" }
},
"isSeparator": false
}
For standard templates (list-table, form, cards-grid, detail):
Run the pipeline to generate the TSX:
python pipeline.py src/pages/<PageName>.schema.json
For custom/complex pages (resource overviews with tabs, mixed content):
Build the TSX by hand, following the established patterns. Read existing pages in src/pages/ as references.
Read references/component-catalog.md for the full list of available shared components and their props.
When building by hand:
@azure-fluent-storybook/components — NEVER recreate what already exists@fluentui/react-components for standard UI primitivesmakeStyles + tokens for styling (never hardcode colors/fonts)Add the new page to src/App.tsx:
import <PageName> from './pages/<PageName>';pages record: '<Display Name>': <PageName>,npx tsc --noEmit and confirm no new errors from your pageAfter completing the page, produce a structured build report. This is mandatory — it gives the user visibility into exactly what happened.
Report format:
## Build Report: <Page Name>
### Files Created
- `src/pages/<Name>.schema.json` — Page schema definition
- `src/pages/<Name>.tsx` — React page component
### Files Modified
- `src/App.tsx` — Registered page as "<Display Name>"
### Shared Components Used
List every component imported from `@azure-fluent-storybook/components`:
- `AzureGlobalHeader` — Top application bar
- `PageHeader` — Title with icon, pin, more-actions
- (etc.)
### Fluent UI Components Used
List every component from `@fluentui/react-components`:
- `DataGrid` — Data table
- `Text` — Typography
- (etc.)
### Fluent Icons Used
- `Delete20Regular`
- (etc.)
### Custom Components Created
List any UI elements you built from scratch that don't exist in the shared library:
- `ProductionCard` — Checklist card with icon, title, description, status dot
- (etc.)
If none, state: "None — all UI composed from shared components."
### Layout Decisions
- Layout type: Side Panel / Full Width
- Template type: list-table / form / cards-grid / detail / custom
- Rationale: (why this layout and template were chosen)
### Schema Summary (6 Questions)
1. Container: azure / sre
2. Side nav: Yes/No (N items, M groups)
3. Title: "<title string>"
4. Breadcrumbs: Home > ...
5. Template: <kind>
6. Essentials: Yes/No
After the build report is complete, run the page-review skill to validate quality.
.github/skills/page-review/SKILL.md.Do NOT skip this step. The page is not considered finished until the review passes.
@azure-fluent-storybook/components already provides it. Call getComponentList from Storybook MCP to verify. Read references/component-catalog.md.tokens.* values.makeStyles for all styling. No inline CSS objects except for truly dynamic values.tokens.colorNeutralBackground1). Do not use grey or tinted backgrounds for the page body unless the user explicitly requests dark mode.iconcloud-browser skill for icons. When you need to find, search for, or download an icon (Azure service icon, Fluent icon, or any Microsoft icon), invoke the iconcloud-browser skill. Do NOT guess icon names, suggest icons from memory, or provide a text-based list of icon suggestions. The skill browses IconCloud.design to find the correct icon with its exact name, collection, and SVG. This applies to page icons, nav icons, command bar icons, and any other icon needed during page building.