model_tier: medium
name: blade-ui
description: "Use when the project's frontend stack is Blade — dispatched by directives/ui/{apply,review,polish}.py. Covers views, components, partials, layouts, and view logic."
domain: engineering
workspaces:
- engineering
packs:
- laravel
trust:
level: professional
install:
default: false
removable: true
blade-ui
Grounded stack guidance: pull idiomatic Do/Don't + docs URLs from the adopted stack corpus before improvising —
ground.py search --manifest <skills-root>/design-intelligence/data/manifest.json --stack laravel "<topic>"(thelaravelstack file is Blade/UI-scoped, not general Laravel). Seedesign-intelligence.
Positioning — dispatched, not standalone
blade-ui is the apply-step executor for the Blade stack. It is
invoked by directives/ui/apply.py
once the design brief is locked, and revisited by review.py /
polish.py during the design-review loop. It does not own the
flow, does not drive the audit, and does not lock the design.
| Concern | Owner |
|---|---|
| Audit + token inventory (mandatory pre-step) | existing-ui-audit |
| Design brief (layout / states / microcopy) | directives/ui/design.py |
| Universal design heuristics | fe-design |
| Review + polish loop | directives/ui/review.py + polish.py |
When to use
Cite this skill when:
state.stack.frontend == "blade"(or the project is clearly Blade-only without Livewire / Flux) anddirectives/ui/apply.pydispatches to this skill- Editing or creating Blade views, components, partials, layouts, or forms
Do NOT use when:
- API-only endpoints (use
api-endpointskill) - Livewire components (use
livewireskill — it composes Blade views internally) - Flux UI components (use
fluxskill) - Driving the full UI flow yourself — that is the
directives/ui/orchestrator
Procedure: Create Blade view or component
Step 0: Inspect
- Confirm Blade is used — check
resources/views, components, layouts. - Inspect existing UI patterns — layouts, partials, component naming, CSS conventions.
- Check form handling style — old input, validation errors, session flashes, reusable field partials.
- Inspect neighboring templates — match indentation, directives, slot usage, classes.
- Determine data flow — what belongs in controller/view model vs. template.
Step 1: Create the template
- Use the project's existing layout system.
- Keep template presentation-focused — no business logic, no DB queries.
- Extract repeated sections into partials or components.
Step 2: Handle forms (if applicable)
- Follow project's form style for labels, inputs, validation messages.
- Use CSRF protection correctly.
- Render validation errors consistently.
- Preserve user input with
old()or project conventions. - Reuse existing field components — don't duplicate.
Step 3: Validate
- Check escaping —
{{ }}by default,{!! !!}only when explicitly safe. - Check styling — Tailwind utility classes, not inline styles.
- Check accessibility — labels for form fields, semantic HTML.
Conventions
→ See guideline php/blade-ui.md for full conventions.
Output format
- Blade view or component file(s) following project conventions
- Component class (if applicable) with typed props
Review pass — a11y findings + preview envelope
When this skill is dispatched by directives/ui/review.py (test slot)
or directives/ui/polish.py (verify slot) — i.e. a review/polish run,
not the initial apply — it also emits:
state.ui_review.a11y—{violations: [{rule, selector, severity}, ...], severity_floor?, accepted_violations?}. Use the same(rule, selector)shape asstate.ui_audit.a11y_baselineso the engine's de-dup matches pre-existing entries on replay. Omit the envelope on apply passes; the engine's_apply_a11y_gateonly fires when a baseline is present.state.ui_review.preview—{render_ok: bool, screenshot_path?, dom_dump_path?, error?, skipped?, skip_reason?}. Render evidence is required, not optional on a review/polish pass: you MUST drive the headless browser (Playwright + axe-core) against the rendered output and writerender_ok. Omitting it now triggers thepreview_render_requiredhalt — a render-capable stack can no longer claim success without rendering.render_ok: falsewitherrorpopulated triggers thepreview_render_failedhalt;render_ok: truewithscreenshot_paththreads the screenshot into the delivery report'sartifactslist. The only no-render path is an explicit, reasoned skip: setskipped: trueplus askip_reason(e.g. no Playwright runner in this env). Browser tooling (Playwright/Cypress/…) is a consumer-project dependency — this package does not ship one.
Polish dispatch: when the dispatcher skips review because a previous
review pass already returned SUCCESS, this skill MUST itself
synthesise the updated state.ui_review.findings (including any
remaining a11y_violation entries) so the engine's gate sees the
current state on the next polish round.
Gotcha
@includeshares parent scope — components don't. Know the difference.- Always use Tailwind utility classes — not inline styles.
- Don't put business logic in templates — use view composers or Livewire.
Do NOT
- Do NOT use
{!! !!}with user input — XSS risk. - Do NOT put business logic in Blade templates — use Livewire or view composers.
- Do NOT use inline styles — use Tailwind utility classes.
Anti-slop
Before shipping a Blade view, pull
docs/guidelines/design-antipatterns.md
and scan Visual / Typography / Layout — the Blade markup is where side-stripe
accents (V1), icon-tile feature cards (T3), and the centered-hero + 3-column
template (L1/L2) concretely land. Stack-specific Tailwind class/hex bans live in
tailwind-engineer.
Auto-trigger keywords
- Blade template
- Blade component
- Laravel view
- partial
- view logic