Generated banner for Plan UI Change
Generated logo for Plan UI Change

Plan UI Change

.NET (Microsoft)OfficialPublished by .NET (Microsoft)

  • Skill
  • Workflow
  • Software development
  • MIT
  • No issues found

From the author

Plan complex Blazor UI features by decomposing them into focused components. USE FOR: building a complex Blazor page with multiple sections, planning component decomposition, designing a multi-section dashboard or layout, breaking down a large UI feature into composable components, pages with sidebars and content panels, any page with 3+ distinct visual sections or multiple interacting sub-features, identifying parent-child relationships and data flow. DO NOT USE FOR: creating new Blazor projects or apps from scratch (use create-blazor-project), implementing a single individual component (use author-component), writing component code with parameters and EventCallback (use author-component), or simple single-component pages.
— the description by .NET (Microsoft)

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The plan-ui-change skill provides a systematic approach to building complex Blazor interfaces. It mandates a planning phase where developers map out visual regions, define component hierarchies, establish data ownership, and determine communication patterns via parameters and EventCallbacks. By enforcing a bottom-up implementation strategy, it helps prevent the creation of monolithic, unmaintainable components and ensures that state management is handled predictably across the application.

What it does

  • Maps complex UI designs into a hierarchical component tree.
  • Defines clear state ownership and data flow between parent and child components.
  • Provides a standardized table for tracking component actions, render modes, and estimated size.
  • Establishes a bottom-up implementation order to ensure code dependencies are met.
  • Identifies opportunities for component reuse and generic template extraction.
  • Enforces a workflow that moves immediately from planning to implementation.

When to use it

  • When building a complex Blazor page with multiple distinct sections.
  • When designing dashboards or layouts that require nested sub-features.
  • When a UI feature is expected to exceed 200 lines of code.
  • When you need to clarify parent-child relationships and data flow for a new feature.

Advantages

  • Reduces technical debt by preventing monolithic component growth.
  • Improves code maintainability through focused, single-responsibility components.
  • Ensures predictable data flow using standard Blazor patterns.
  • Facilitates easier testing by breaking down UI into smaller, isolated units.

Usage examples

“Plan the UI for a new customer management dashboard with a sidebar, search filters, and a data grid.”
The agent will generate a component tree, a classification table, a data flow map, and an implementation order, then immediately begin creating the necessary .razor files.
“I need to build a complex order processing page. How should I structure it?”
The agent will outline the decomposition of the page into smaller components like OrderSummary, OrderFilters, and OrderTable, followed by the implementation of these components.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/dotnet/plan-ui-change/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip plan-ui-change.zip -d .agents/skills

Documentation by .NET (Microsoft)

Plan a Blazor UI Change

When asked to build a complex UI feature, plan the component decomposition first, then immediately implement it. A single monolithic page component is almost never the right answer — break the UI into focused, composable components.

Planning Workflow

Step 1 — Map the Visual Regions

Read the request and identify every distinct visual region. Each region that has its own data, behavior, or layout responsibility is a candidate component.

Draw the component tree:

InventoryDashboard          (page — owns data, orchestrates layout)
├── StockSummaryBar         (read-only stats: total items, low-stock count, value)
├── InventoryFilters        (search box, category dropdown, stock-level toggle)
├── InventoryTable          (sortable table of products)
│   └── InventoryRow        (single product row with inline edit/delete)
└── AddProductForm          (slide-out form for new products)

Rules for identifying components:

  • Distinct responsibility — a region owns its own state or behavior → separate component

  • Repeated structure — items in a list, cards in a grid → extract the item template

  • Independent interactivity — a section that handles user input separately from its siblings → separate component

  • Size — any section that would exceed ~150 lines of markup on its own → split it

Step 2 — Classify Each Component

For every component in the tree, determine:

ComponentActionRender ModeState OwnedLines (est.)
InventoryDashboardCreateInteractiveServerproduct list, filter state~80
StockSummaryBarCreate(inherits)none — receives data~30
InventoryFiltersCreate(inherits)search text, selected category~60
InventoryTableCreate(inherits)sort column, sort direction~50
InventoryRowCreate(inherits)inline-edit mode flag~60
AddProductFormCreate(inherits)form model~80

A page component that exceeds ~200 lines of combined markup + code is too large. If your estimate puts a single component above that, split further.

Step 3 — Design Data Flow

Identify the state owner for each piece of data, then map how it flows:

InventoryDashboard (owns: products[], filters)
  │
  ├─ [Parameter] products ──→ StockSummaryBar (reads aggregate stats)
  │
  ├─ [Parameter] filters ──→ InventoryFilters
  │   └─ EventCallback<Filters> OnFiltersChanged ──→ InventoryDashboard
  │
  ├─ [Parameter] filteredProducts ──→ InventoryTable
  │   └─ [Parameter] product ──→ InventoryRow
  │       ├─ EventCallback<Product> OnSave ──→ InventoryTable ──→ InventoryDashboard
  │       └─ EventCallback<Product> OnDelete ──→ InventoryTable ──→ InventoryDashboard
  │
  └─ EventCallback<Product> OnProductAdded ←── AddProductForm

Rules:

  • Data always flows down through [Parameter]

  • Events always flow up through EventCallback<T>

  • The page/parent owns the data and passes filtered/transformed views to children

  • Children never mutate parameters — they notify the parent via callbacks

  • If data must cross more than 2 levels without intermediate components needing it, use a cascading value or a scoped service

Step 4 — Identify Reuse Opportunities

Before creating a new component, check if an existing component in the project can serve the purpose. Look for:

  • Existing list-item components that match the structure

  • Shared filter/search components already in the project

  • Generic components (e.g., DataTable<T>, Pagination) that accept templates

If a component will be used in more than one page, place it in a Shared/ or Components/ folder.

Step 5 — Order the Implementation

Build bottom-up — leaf components first, then parents that compose them:

  1. Models/DTOs — define the data shapes

  2. Services — data access, business logic (interface + implementation)

  3. Leaf components — components with no children (InventoryRow, StockSummaryBar)

  4. Container components — components that compose leaves (InventoryTable, InventoryFilters)

  5. Page component — wires everything together, registers routes

  6. Configuration — DI registration, render mode setup

Each component should be independently compilable. Never reference a component that doesn't exist yet.

Output Format

Present the plan briefly, then immediately proceed to implement — never stop at just the plan or ask for confirmation before writing code. The plan is a thinking tool, not a deliverable.

## Component Plan: [Feature Name]

### Component Tree
[ASCII tree showing parent-child relationships]

### Component Table
| Component | Action | Render Mode | Purpose | Est. Lines |
|-----------|--------|-------------|---------|------------|
| ... | ... | ... | ... | ... |

### Data Flow
[State owner] → [Parameters down] → [EventCallbacks up]

### Implementation Order
1. [First file to create — why]
2. [Second file — why]
...

After outputting the plan, immediately begin implementing the components in the order listed. Do not wait for approval or ask "shall I proceed?" — the plan is a guide for you to follow, not a proposal for the user to approve.

Anti-Patterns to Avoid

Anti-PatternWhy It's WrongCorrect Approach
One page component with 500+ linesImpossible to test, reuse, or maintainDecompose into focused components
Passing 10+ parameters through intermediate componentsParameter drilling obscures intentUse cascading values or a scoped state service
Child component fetching its own data from an APIMultiple components making redundant callsParent owns data, passes via parameters
Inline rendering of list items with complex markupDuplicated logic, no reuse, hard to testExtract item template into its own component
Building everything in one file then "refactoring later"Refactoring rarely happens; the monolith shipsPlan the decomposition upfront
Generic components for one-off usageOver-engineering adds complexityOnly extract generics when reuse is proven

Guidelines

  • Plan briefly, then implement. Write a concise component table and data flow map, then immediately create the .razor files — never stop at just the plan.

  • Prefer many small components over one large one. A component with a single clear purpose is easier to understand, test, and reuse.

  • State ownership is the first decision. Before writing fetch logic, decide which component owns the data.

  • Build bottom-up. Create leaf components first so parent components can reference them immediately.

  • Name components after what they render, not what they do internally: ProductCard not ProductRenderer, OrderFilters not FilterHandler.

Files

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
.NET (Microsoft)
Publisher
.NET (Microsoft) (Official)
Source
dotnet/skills · plugins/dotnet-blazor/skills/plan-ui-change · commit 96c3d68
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by .NET (Microsoft).

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download plan-ui-change.zip