diff --git a/skills/bootstrap-v5-v6-migration/SKILL.md b/skills/bootstrap-v5-v6-migration/SKILL.md new file mode 100644 index 000000000000..56ab128c9413 --- /dev/null +++ b/skills/bootstrap-v5-v6-migration/SKILL.md @@ -0,0 +1,490 @@ +--- +name: bootstrap-v5-v6-migration +description: Migrate projects from Bootstrap 5 to Bootstrap 6. Use when upgrading Bootstrap, migrating v5 to v6, or updating Bootstrap class names, components, Sass, or JavaScript to the latest version. +--- + +# Bootstrap v5 to v6 Migration + +## Workflow + +Work through each phase in order. After each phase, search the codebase for remaining v5 patterns before moving on. + +- [ ] Phase 1: Update dependencies and build setup +- [ ] Phase 2: Rename CSS classes and data attributes +- [ ] Phase 3: Restructure component HTML +- [ ] Phase 4: Update JavaScript +- [ ] Phase 5: Update Sass +- [ ] Phase 6: Verify + +--- + +## Phase 1: Dependencies & Build + +1. Update `package.json`: `"bootstrap": "^6.0.0"` +2. Replace `@popperjs/core` with `@floating-ui/dom` +3. If using Datepicker, add peer dep `vanilla-calendar-pro` +4. Sass: replace all `@import` with `@use` (Node Sass is no longer supported) + +```scss +// v5 +@import "bootstrap/scss/bootstrap"; + +// v6 +@use "bootstrap/scss/bootstrap"; + +// v6 with overrides +@use "bootstrap/scss/bootstrap" with ( + $spacer: 1rem +); +``` + +--- + +## Phase 2: CSS Class & Attribute Renames + +### Responsive & state prefix syntax + +v6 moves breakpoints and pseudo-states from infix/suffix to prefix with colon. Also renames `xxl` to `2xl`. + +**Pattern:** `.{class}-{bp}-{value}` becomes `.{bp}:{class}-{value}` and `.{class}-{bp}` becomes `.{bp}:{class}` + +| v5 | v6 | +|---|---| +| `.d-md-none`, `.p-lg-3` | `.md:d-none`, `.lg:p-3` | +| `.col-md-6` | `.md:col-6` | +| `.row-cols-md-3` | `.md:row-cols-3` | +| `.offset-md-2` | `.md:offset-2` | +| `.g-md-3`, `.gx-md-3` | `.md:g-3`, `.md:gx-3` | +| `.g-col-md-4` | `.md:g-col-4` | +| `.container-sm` | `.sm:container` | +| `.navbar-expand-md` | `.md:navbar-expand` | +| `.offcanvas-md` | `.md:drawer` | +| `.table-responsive-md` | `.md:table-responsive` | +| `.list-group-horizontal-md` | `.md:list-group-horizontal` | +| `.sticky-md-top` | `.md:sticky-top` | +| `.vstack-md` | `.md:vstack` | +| `.dialog-fullscreen-sm-down` | `.sm-down:dialog-fullscreen` | +| `.d-print-none` | `.print:d-none` | +| `.opacity-50-hover` | `.hover:opacity-50` | + +### Component renames + +Three components have been fully renamed. Find-and-replace these prefixes across classes, data attributes, events, JS imports, and CSS variables. + +**Modal -> Dialog** + +| Scope | v5 | v6 | +|---|---|---| +| Classes | `.modal`, `.modal-header/body/footer/title` | `.dialog`, `.dialog-header/body/footer/title` | +| Sizes | `.modal-sm/lg/xl/fullscreen` | `.dialog-sm/lg/xl/fullscreen` | +| Data attrs | `data-bs-toggle="modal"`, `data-bs-dismiss="modal"` | `data-bs-toggle="dialog"`, `data-bs-dismiss="dialog"` | +| JS export | `Modal` | `Dialog` | +| Events | `*.bs.modal` | `*.bs.dialog` | +| CSS vars | `--modal-*` | `--dialog-*` | +| Body class | `.modal-open` on `
` | `.dialog-open` on `` | + +Remove `.modal-dialog` and `.modal-content` wrappers entirely — see Phase 3. + +**Offcanvas -> Drawer** + +| Scope | v5 | v6 | +|---|---|---| +| Classes | `.offcanvas`, `.offcanvas-start/end/top/bottom/header/body/title` | `.drawer`, `.drawer-start/end/top/bottom/header/body/title` | +| Data attrs | `data-bs-toggle="offcanvas"`, `data-bs-dismiss="offcanvas"` | `data-bs-toggle="drawer"`, `data-bs-dismiss="drawer"` | +| JS export | `Offcanvas` | `Drawer` | +| Events | `*.bs.offcanvas` | `*.bs.drawer` | +| CSS vars | `--offcanvas-*` | `--drawer-*` | +| Sass | `$zindex-offcanvas` | `$zindex-drawer` | + +**Dropdown -> Menu** + +| Scope | v5 | v6 | +|---|---|---| +| Classes | `.dropdown-menu`, `.dropdown-item`, `.dropdown-divider`, `.dropdown-header` | `.menu`, `.menu-item`, `.menu-divider`, `.menu-header` | +| Data attrs | `data-bs-toggle="dropdown"` | `data-bs-toggle="menu"` | +| JS export | `Dropdown` | `Menu` | +| Events | `*.bs.dropdown` | `*.bs.menu` | +| Sass | `$zindex-dropdown` | `$zindex-menu` | + +Also remove: `.dropdown-toggle` (no longer needed), `.dropdown` wrapper, `.dropdown-toggle-split`. See Phase 3 for new markup. + +### Button & badge variants -> theme tokens + +Per-color classes are replaced by variant + `.theme-*` composition. Apply to all colors (`primary`, `secondary`, `success`, `danger`, `warning`, `info`, `light`, `dark`). + +| v5 | v6 | +|---|---| +| `.btn-primary` | `.btn-solid .theme-primary` | +| `.btn-outline-primary` | `.btn-outline .theme-primary` | +| `.alert-primary` | `.alert .theme-primary` | +| `.badge.bg-primary` | `.badge-subtle .theme-primary` | + +New button variants: `.btn-solid`, `.btn-outline`, `.btn-subtle`, `.btn-text`, `.btn-styled`, `.btn-link`. + +### Utility class renames + +| v5 | v6 | +|---|---| +| `.text-primary`, `.text-danger`, etc. | `.fg-primary`, `.fg-danger`, etc. | +| `.text-muted` | `.fg-secondary` | +| `.mh-*` | `.max-h-*` | +| `.mw-*` | `.max-w-*` | +| `.form-select` | `.form-control` (on `