Skip to content

Port v5 elements to v6 #3110

@bennypowers

Description

@bennypowers

PatternFly Elements v6 Migration Plan

Ordered PR plan for issue #3110. UPDATE PRs first (rename existing v5 elements
to v6 and port APIs), then CREATE PRs (new elements not in v5).

CRITICAL: All PRs MUST target staging/pfv6 branch, NOT main

Phase 0: Infrastructure (do first)

These PRs unblock everything else.

PR 0.1: Remove/replace dev server with cem serve (#3102)

  • Issue #3110 calls out hardcoded tag names in dev server
  • cem serve handles import maps, CSS transforms, chromeless testing
  • Remove tools/pfe-tools/dev-server/ and wire up cem serve
  • Update npm run dev / npm start scripts

PR 0.2: Rename tooling and config for v6 prefix (#3130)

  • Update eslint.config.js ignore globs (icon demo path) to include pf-v6 as
    well as pf-v5 paths
  • Update commitlint.config.js to handle pf- prefix (no v5)
  • Audit elements/package.json exports for orphaned entries
  • Update tsconfig paths if needed
  • Update web-test-runner.config.js and playwright.config.ts globs

Keep v5 prefix until all elements are updated.

PR 0.3: Update docs scaffolding (#3131)

  • Update docs/_snippets/ for v6 element names
  • Update docs/framework-integration/ examples
  • Update docs/components/ templates

Phase 1: UPDATE PRs (rename v5 -> v6, port to v6 API)

Existing v5 elements renamed to pf-v6-{name} and updated to v6 PatternFly
design tokens, CSS, and React API parity. Order by dependency graph:
leaf components first, then composites.

Tier 1: Zero-dependency leaf elements

These elements don't depend on other PF elements. Port first.

# Element v5 name Notes Issue
1.1 pf-v6-spinner pf-v5-spinner Pure CSS animation, simplest possible port #3037
1.2 pf-v6-badge pf-v5-badge Simple text + count #2982
1.3 pf-v6-avatar pf-v5-avatar Image with fallback #2979
1.4 pf-v6-banner pf-v5-banner Simple status bar #2983
1.5 pf-v6-icon pf-v5-icon Icon loading, used by many others #3014
1.6 pf-v6-tooltip pf-v5-tooltip Floating UI, no PF deps #3048
1.7 pf-v6-progress pf-v5-progress Progress bar, ARIA managed internally #3031
1.8 pf-v6-switch pf-v5-switch FACE element, toggle #3038
1.9 pf-v6-text-input pf-v5-text-input FACE element #3043
1.10 pf-v6-text-area pf-v5-text-area FACE element #3041
1.11 pf-v6-timestamp pf-v5-timestamp Date formatting #3045
1.12 pf-v6-back-to-top pf-v5-back-to-top Scroll button #2981
1.13 pf-v6-background-image pf-v5-background-image Background container #2980
1.14 pf-v6-helper-text pf-v5-helper-text Form helper text #3012

Tier 2: Single-dependency elements

Depend on one or more Tier 1 elements.

# Element v5 name Depends on Issue
2.1 pf-v6-button pf-v5-button icon, spinner #2984
2.2 pf-v6-label pf-v5-label icon, button #3017
2.3 pf-v6-chip pf-v5-chip icon, button
2.4 pf-v6-hint pf-v5-hint (light deps) #3013
2.5 pf-v6-panel pf-v5-panel (light deps) #3029
2.6 pf-v6-code-block pf-v5-code-block button (copy) #3002
2.7 pf-v6-clipboard-copy pf-v5-clipboard-copy button, tooltip #3001
2.8 pf-v6-progress-stepper pf-v5-progress-stepper icon #3032
2.9 pf-v6-tile pf-v5-tile icon

Tier 3: Composite elements

Depend on multiple Tier 1-2 elements.

# Element v5 name Depends on Issue
3.1 pf-v6-alert pf-v5-alert icon, button #2978
3.2 pf-v6-card pf-v5-card (slots-heavy) #2986
3.3 pf-v6-accordion pf-v5-accordion expandable pattern #2976
3.4 pf-v6-tabs pf-v5-tabs RTI controller #3040
3.5 pf-v6-label-group pf-v5-label-group label, chip
3.6 pf-v6-popover pf-v5-popover floating UI, button #3030
3.7 pf-v6-modal pf-v5-modal native dialog, button #3022
3.8 pf-v6-table pf-v5-table complex, many sub-elements #3039
3.9 pf-v6-jump-links pf-v5-jump-links navigation pattern #3016
3.10 pf-v6-search-input pf-v5-search-input text-input, button #3033
3.11 pf-v6-dropdown pf-v5-dropdown floating UI, menu pattern #3008
3.12 pf-v6-select pf-v5-select floating UI, FACE, menu #3034

Phase 2: CREATE PRs (new elements not in v5)

Components that exist in React v6 but have no v5 web component equivalent.
Order by dependency and complexity.

Tier 4: Simple new elements

# Element React source Notes Issue
4.1 pf-v6-divider Divider <hr> with variants, very simple
4.2 pf-v6-skeleton Skeleton Loading placeholder, CSS-only #2940
4.3 pf-v6-truncate Truncate Text truncation with tooltip #3050
4.4 pf-v6-content Content Typography wrapper
4.5 pf-v6-title Title Heading with size variants
4.6 pf-v6-radio Radio FACE element #2566
4.7 pf-v6-checkbox Checkbox FACE element #2574
4.8 pf-v6-skip-to-content SkipToContent A11y skip link #2941
4.9 pf-v6-brand Brand Logo/brand image
4.10 pf-v6-backdrop Backdrop Modal overlay

Tier 5: Medium complexity new elements

# Element React source Notes Issue
5.1 pf-v6-expandable-section ExpandableSection <details> based #2932
5.2 pf-v6-description-list DescriptionList <dl> semantic #2931
5.3 pf-v6-breadcrumb Breadcrumb Navigation with <nav> #2688
5.4 pf-v6-list List Ordered/unordered with variants
5.5 pf-v6-notification-badge NotificationBadge Badge with icon #2937
5.6 pf-v6-number-input NumberInput FACE, stepper #3026
5.7 pf-v6-form-select FormSelect Native <select> wrapper, FACE #3011
5.8 pf-v6-slider Slider Range input, FACE #3036
5.9 pf-v6-simple-list SimpleList Selection list #3035
5.10 pf-v6-action-list ActionList Button group layout #2977
5.11 pf-v6-input-group InputGroup Form input composition #3015
5.12 pf-v6-toggle-group ToggleGroup Segmented control #3046
5.13 pf-v6-empty-state EmptyState Empty content placeholder #3010
5.14 pf-v6-hero Hero Hero banner section

Tier 6: Complex new elements

# Element React source Notes Issue
6.1 pf-v6-menu Menu Complex, foundation for dropdown/select #3020
6.2 pf-v6-menu-toggle MenuToggle Toggle for menu/dropdown #3021
6.3 pf-v6-nav Nav Navigation sidebar #3024
6.4 pf-v6-pagination Pagination Page navigation controls #2938
6.5 pf-v6-toolbar Toolbar Action bar with groups #3047
6.6 pf-v6-drawer Drawer Sliding panel #3007
6.7 pf-v6-sidebar Sidebar Layout sidebar
6.8 pf-v6-notification-drawer NotificationDrawer Notifications panel #3025
6.9 pf-v6-overflow-menu OverflowMenu Responsive menu overflow #3027
6.10 pf-v6-data-list DataList Flexible data display #3005
6.11 pf-v6-masthead Masthead App header bar #3019
6.12 pf-v6-page Page App page layout #3028
6.13 pf-v6-form Form Form layout and validation #1663
6.14 pf-v6-text-input-group TextInputGroup Composite input #3042
6.15 pf-v6-dual-list-selector DualListSelector Two-list transfer #3009

Tier 7: High-complexity

# Element React source Notes Issue
7.1 pf-v6-calendar-month CalendarMonth Date picker calendar #2985
7.2 pf-v6-date-picker DatePicker Full date picker #2536
7.3 pf-v6-time-picker TimePicker Time selection #3044
7.4 pf-v6-file-upload FileUpload File upload with preview #2693
7.5 pf-v6-multiple-file-upload MultipleFileUpload Multi-file upload #3023
7.6 pf-v6-wizard Wizard Multi-step flow #3051
7.7 pf-v6-tree-view TreeView Hierarchical tree #3049
7.8 pf-v6-login-page LoginPage Full login pattern #3018
7.9 pf-v6-about-modal AboutModal Branded about dialog #2926

Layout Components (NOT converted to custom elements)

These use PatternFly CSS layout classes directly. Document usage, don't wrap.

  • Bullseye, Flex, Gallery, Grid, Level, Split, Stack, List, Simple List, Divider

Per-PR Checklist

Use /update-element for Phase 1 PRs, /create-element for Phase 2 PRs.

For each PR:

  1. API designed per .claude/ADVICE.md rules
  2. CSS custom properties match computed CSS and Stylesheets of react demos on patternfly.org via chrome MCP
  3. Element source with @summary, JSDoc
  4. CSS with tokens, logical properties, nesting
  5. Demos matching patternfly.org (name parity)
  6. Tests (public API, a11ySnapshot, form submission if FACE)
  7. /review-api audit
  8. /review-demos audit
  9. /review-a11y audit
  10. Lint passes (eslint, stylelint)
  11. Visual parity verified via Chrome MCP

Checklist for v6 rename (beyond element source files):

Dev Server

Important

NB: likely remove dev server altogether in favour of cem serve

  • tools/pfe-tools/dev-server/plugins/templates/index.html - element tag names hardcoded in shell UI (nav button, card). Update alongside rename.
  • tools/pfe-tools/dev-server/bundle.ts - icon export hardcoded. Update.

Repo

  • eslint.config.js ignore glob - icon demo path hardcoded with element name. Update.
  • elements/package.json exports - orphaned entries from renamed elements linger silently. no-missing-package-exports catches missing but not extra. Audit manually.

Docs

  • docs/_snippets/ - independent of component docs, easy to miss.
  • docs/framework-integration/ - inline code examples with element names.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions