Skip to content

Conversation

@malberts
Copy link
Contributor

@malberts malberts commented Aug 30, 2025

Initial implementation for #67

Bootstrap Examples using https://github.com/malberts/BootstrapExamples, with standalone Bootstrap in LocalSettings (not using Chameleon):

wfLoadExtension( 'Bootstrap' );
wfLoadExtension( 'BootstrapExamples' );
$wgHooks['SetupAfterCache'][] = function(){
	\Bootstrap\BootstrapManager::getInstance()->addAllBootstrapModules();
	return true;
};

$wgHooks['BeforePageDisplay'][]=function( MediaWiki\Output\OutputPage $out, Skin $skin ){
	$out->addModuleStyles( ['ext.bootstrap.styles'] );
	$out->addModules( ['ext.bootstrap.scripts'] );
	return true;
};

There might be some visual anomalies caused by either MediaWiki CSS or the example HTML itself. However, this generally looks fine and JS is loaded (e.g. dropdowns, close button, accordion, offcanvas).

image

Summary by CodeRabbit

  • New Features

    • Updated Bootstrap framework from v4 to v5.3.8
    • Added CSS custom properties for dynamic theming across components
    • Introduced new form components and modular styling structure
  • Chores

    • Updated PHP requirement from 8.0+ to 8.1+
    • Updated MediaWiki requirement from 1.39+ to 1.43+
    • Updated Composer dependencies to latest versions
    • Removed Bootstrap v4-specific JavaScript components

✏️ Tip: You can customize this high-level summary in your review settings.

@malberts malberts force-pushed the bs53 branch 8 times, most recently from 9b5ecf6 to 09a43d1 Compare August 30, 2025 22:38
@malberts malberts force-pushed the bs53 branch 3 times, most recently from 366bd61 to c9a7cfb Compare December 20, 2025 18:23
Comment on lines +93 to +94
// General JavaScript requirements
'js' => [ 'scripts' => [ 'bootstrap.bundle.js' ] ],
Copy link
Contributor Author

@malberts malberts Dec 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could not get MediaWiki ResourceLoader to work with the individual Bootstrap JS files. The BS4 JS dependencies were simpler and more standalone, whereas it's more complicated now and seems incompatible with MW RL.

AI also thinks it might not be worth it

Why Individual JS Files Don't Work in Bootstrap 5

Bootstrap 4 had relatively standalone JS files. Each component like modal.js had simple dependencies (maybe util.js and popper.js).

Bootstrap 5 restructured everything with a complex dependency graph. Look at modal.js:

require('./base-component.js'), require('./dom/event-handler.js'), 
require('./dom/selector-engine.js'), require('./util/backdrop.js'), 
require('./util/component-functions.js'), require('./util/focustrap.js'), 
require('./util/index.js'), require('./util/scrollbar.js')

MediaWiki's ResourceLoader doesn't resolve these CommonJS require() paths automatically.

Your Options

Option 1: Keep Using the Bundle (Recommended) ✅

Your current approach with bootstrap.bundle.js is actually the correct solution for Bootstrap 5:

  • ✅ All dependencies pre-resolved
  • ✅ Includes Popper.js built-in
  • ✅ Officially recommended by Bootstrap
  • ✅ ~80KB minified, cached after first load
  • ✅ No complex dependency management

Option 2: Use MediaWiki packageFiles with ES Modules

MediaWiki 1.43+ supports packageFiles which can handle ES module imports. Bootstrap 5 has ES module source files in js/src/. However, you'd need to configure the entire dependency tree.

Would you like me to explore setting this up? It would involve:

  1. Creating a packageFiles configuration in SetupAfterCache.php
  2. Mapping each component to its ES module dependencies
  3. Using type: es6 modules

But honestly, for most use cases, the bundle approach is superior - it's what Bootstrap recommends, and the file size difference between loading the bundle vs. individual components is minimal after gzip compression.

Summary

Your V5ModuleDefinition structure is correct. The switch to bootstrap.bundle.js is the right approach for Bootstrap 5. The module definition still allows users to:

  1. Load only CSS for components they need (granular control)
  2. Include JS when needed via the 'js' module (loads the full bundle)

This is a reasonable trade-off - granular SCSS, bundled JS.

When AI tried to implement individual JS loading, it ended up pulling in a bundler like Rollup to build the JS. This becomes way overcomplicated, and for practical purposes most users would've loaded all resources all the time anyway via addAllBootstrapModules() in Chameleon, or as per the Extension:Bootstrap docs.

At this point getting BS5 to work is more important than optimising the JS files. We can always add the separate JS files later if anyone has a need for it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also means there is some redundancy in the definitions, since all these JS interdependencies end up referring to the same bundled file. But I'll leave that as-is "just in case".

@malberts malberts changed the title WIP Add Bootstrap 5.3 Update to Bootstrap 5.3 Dec 20, 2025
@malberts malberts marked this pull request as ready for review December 20, 2025 23:02
@coderabbitai
Copy link

coderabbitai bot commented Dec 20, 2025

Warning

Rate limit exceeded

@malberts has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 16 minutes and 30 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 20912f1 and 9a8332f.

⛔ Files ignored due to path filters (15)
  • package-lock.json is excluded by !**/package-lock.json
  • resources/bootstrap/js/alert.js.map is excluded by !**/*.map
  • resources/bootstrap/js/bootstrap.bundle.js.map is excluded by !**/*.map
  • resources/bootstrap/js/button.js.map is excluded by !**/*.map
  • resources/bootstrap/js/carousel.js.map is excluded by !**/*.map
  • resources/bootstrap/js/collapse.js.map is excluded by !**/*.map
  • resources/bootstrap/js/dropdown.js.map is excluded by !**/*.map
  • resources/bootstrap/js/modal.js.map is excluded by !**/*.map
  • resources/bootstrap/js/popover.js.map is excluded by !**/*.map
  • resources/bootstrap/js/popper.js.map is excluded by !**/*.map
  • resources/bootstrap/js/scrollspy.js.map is excluded by !**/*.map
  • resources/bootstrap/js/tab.js.map is excluded by !**/*.map
  • resources/bootstrap/js/toast.js.map is excluded by !**/*.map
  • resources/bootstrap/js/tooltip.js.map is excluded by !**/*.map
  • resources/bootstrap/js/util.js.map is excluded by !**/*.map
📒 Files selected for processing (107)
  • .coderabbit.yaml (1 hunks)
  • .github/workflows/ci.yml (1 hunks)
  • README.md (2 hunks)
  • composer.json (2 hunks)
  • docs/release-notes.md (1 hunks)
  • extension.json (1 hunks)
  • package.json (1 hunks)
  • resources/bootstrap/js/alert.js (0 hunks)
  • resources/bootstrap/js/button.js (0 hunks)
  • resources/bootstrap/js/carousel.js (0 hunks)
  • resources/bootstrap/js/collapse.js (0 hunks)
  • resources/bootstrap/js/dropdown.js (0 hunks)
  • resources/bootstrap/js/index.js (0 hunks)
  • resources/bootstrap/js/modal.js (0 hunks)
  • resources/bootstrap/js/popover.js (0 hunks)
  • resources/bootstrap/js/popper.js (0 hunks)
  • resources/bootstrap/js/scrollspy.js (0 hunks)
  • resources/bootstrap/js/tab.js (0 hunks)
  • resources/bootstrap/js/toast.js (0 hunks)
  • resources/bootstrap/js/tooltip.js (0 hunks)
  • resources/bootstrap/js/util.js (0 hunks)
  • resources/bootstrap/scss/_accordion.scss (1 hunks)
  • resources/bootstrap/scss/_alert.scss (3 hunks)
  • resources/bootstrap/scss/_badge.scss (1 hunks)
  • resources/bootstrap/scss/_breadcrumb.scss (1 hunks)
  • resources/bootstrap/scss/_button-group.scss (5 hunks)
  • resources/bootstrap/scss/_buttons.scss (4 hunks)
  • resources/bootstrap/scss/_card.scss (9 hunks)
  • resources/bootstrap/scss/_carousel.scss (7 hunks)
  • resources/bootstrap/scss/_close.scss (1 hunks)
  • resources/bootstrap/scss/_code.scss (0 hunks)
  • resources/bootstrap/scss/_containers.scss (1 hunks)
  • resources/bootstrap/scss/_custom-forms.scss (0 hunks)
  • resources/bootstrap/scss/_dropdown.scss (4 hunks)
  • resources/bootstrap/scss/_forms.scss (1 hunks)
  • resources/bootstrap/scss/_functions.scss (2 hunks)
  • resources/bootstrap/scss/_grid.scss (1 hunks)
  • resources/bootstrap/scss/_helpers.scss (1 hunks)
  • resources/bootstrap/scss/_input-group.scss (0 hunks)
  • resources/bootstrap/scss/_jumbotron.scss (0 hunks)
  • resources/bootstrap/scss/_list-group.scss (5 hunks)
  • resources/bootstrap/scss/_maps.scss (1 hunks)
  • resources/bootstrap/scss/_media.scss (0 hunks)
  • resources/bootstrap/scss/_mixins.scss (1 hunks)
  • resources/bootstrap/scss/_modal.scss (6 hunks)
  • resources/bootstrap/scss/_nav.scss (5 hunks)
  • resources/bootstrap/scss/_navbar.scss (8 hunks)
  • resources/bootstrap/scss/_offcanvas.scss (1 hunks)
  • resources/bootstrap/scss/_pagination.scss (2 hunks)
  • resources/bootstrap/scss/_placeholders.scss (1 hunks)
  • resources/bootstrap/scss/_popover.scss (3 hunks)
  • resources/bootstrap/scss/_print.scss (0 hunks)
  • resources/bootstrap/scss/_progress.scss (1 hunks)
  • resources/bootstrap/scss/_reboot.scss (7 hunks)
  • resources/bootstrap/scss/_root.scss (1 hunks)
  • resources/bootstrap/scss/_spinners.scss (2 hunks)
  • resources/bootstrap/scss/_tables.scss (1 hunks)
  • resources/bootstrap/scss/_toasts.scss (1 hunks)
  • resources/bootstrap/scss/_tooltip.scss (2 hunks)
  • resources/bootstrap/scss/_transitions.scss (1 hunks)
  • resources/bootstrap/scss/_type.scss (2 hunks)
  • resources/bootstrap/scss/_utilities.scss (1 hunks)
  • resources/bootstrap/scss/_variables-dark.scss (1 hunks)
  • resources/bootstrap/scss/bootstrap-grid.scss (1 hunks)
  • resources/bootstrap/scss/bootstrap-reboot.scss (1 hunks)
  • resources/bootstrap/scss/bootstrap-utilities.scss (1 hunks)
  • resources/bootstrap/scss/bootstrap.scss (2 hunks)
  • resources/bootstrap/scss/forms/_floating-labels.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-check.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-control.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-range.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-select.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-text.scss (1 hunks)
  • resources/bootstrap/scss/forms/_input-group.scss (1 hunks)
  • resources/bootstrap/scss/forms/_labels.scss (1 hunks)
  • resources/bootstrap/scss/forms/_validation.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_color-bg.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_colored-links.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_focus-ring.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_icon-link.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_position.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_ratio.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_stacks.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_stretched-link.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_text-truncation.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_visually-hidden.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_vr.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_alert.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_backdrop.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_background-variant.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_badge.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_banner.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_border-radius.scss (2 hunks)
  • resources/bootstrap/scss/mixins/_box-shadow.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_breakpoints.scss (3 hunks)
  • resources/bootstrap/scss/mixins/_buttons.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_caret.scss (2 hunks)
  • resources/bootstrap/scss/mixins/_clearfix.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_color-mode.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_color-scheme.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_container.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_float.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_forms.scss (4 hunks)
  • resources/bootstrap/scss/mixins/_gradients.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_grid-framework.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_grid.scss (2 hunks)
  • resources/bootstrap/scss/mixins/_hover.scss (0 hunks)

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'review'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Walkthrough

This pull request upgrades from Bootstrap 4.6.2 to 5.3.8, including updates to MediaWiki (1.39→1.43) and PHP (8.0→8.1). The change removes Bootstrap 4 JavaScript components, restructures SCSS files into modular form components, and migrates styling properties from Sass variables to CSS custom properties for runtime theming flexibility.

Changes

Cohort / File(s) Summary
CI/Dependency Version Updates
.github/workflows/ci.yml, composer.json, package.json, extension.json, README.md, docs/release-notes.md
Updated CI matrix to test MediaWiki 1.43–1.45 and PHP 8.1–8.5; bumped Bootstrap to 5.3.8 and Popper to 2.11.8; updated minimum requirements (PHP 8.1+, MediaWiki 1.43+); version bumped to 6.0.0-dev across manifests.
Removed Bootstrap 4 JavaScript Components
resources/bootstrap/js/alert.js, button.js, carousel.js, collapse.js, dropdown.js, index.js, modal.js, popover.js, popper.js, scrollspy.js, tab.js, toast.js, tooltip.js, util.js
Deleted entire Bootstrap 4 component implementations (14 files), removing jQuery plugins, public APIs, and data-API wiring for alerts, buttons, carousels, modals, dropdowns, tooltips, and popovers.
SCSS Variable/Mixin Refactoring
resources/bootstrap/scss/_alert.scss, _badge.scss, _breadcrumb.scss, _button-group.scss, _buttons.scss, _card.scss, _carousel.scss, _close.scss, _dropdown.scss, _list-group.scss, _modal.scss, _nav.scss, _navbar.scss, _pagination.scss, _popover.scss, _progress.scss, _spinners.scss, _tables.scss, _toasts.scss, _tooltip.scss
Migrated component styling from Sass variables to CSS custom properties (--prefix-...), introduced new color/state variables, and updated mixins to emit CSS variables instead of direct property values.
Form Components Modularization
resources/bootstrap/scss/_forms.scss, resources/bootstrap/scss/forms/_floating-labels.scss, _form-check.scss, _form-control.scss, _form-range.scss, _form-select.scss, _form-text.scss, _labels.scss, _input-group.scss, _validation.scss
Restructured form styling from monolithic _forms.scss into modular partials (labels, text, control, select, check, range, input-group, validation), enabling fine-grained component imports.
New Components and Utilities
resources/bootstrap/scss/_accordion.scss, _offcanvas.scss, _placeholders.scss, resources/bootstrap/scss/helpers/_color-bg.scss, _colored-links.scss, _focus-ring.scss, _icon-link.scss, _position.scss, _ratio.scss, _stacks.scss, _stretched-link.scss, _text-truncation.scss, _visually-hidden.scss, _vr.scss
Added new Bootstrap 5 components (accordion, offcanvas, placeholders) and helpers (color-bg, colored-links, focus-ring, icon-link, position, ratio, stacks); introduced modular helper structure.
Removed/Deprecated Components
resources/bootstrap/scss/_code.scss, _custom-forms.scss, _jumbotron.scss, _media.scss, _input-group.scss, _print.scss
Deleted styling partials for code elements, custom form controls, jumbotron, media objects, input groups (moved to forms), and print styles; simplified component surface.
Core Framework Refactoring
resources/bootstrap/scss/_variables-dark.scss, _maps.scss, _functions.scss, _root.scss, _grid.scss, _transitions.scss, _reboot.scss, _type.scss, _utilities.scss
Introduced dark theme variables, added color/utility maps with CSS var generation, refactored color-contrast functions, updated root variable scope (added [data-bs-theme="light"]), reworked grid to CSS Grid approach, and consolidated utilities into data-driven map.
Mixin Library Updates
resources/bootstrap/scss/mixins/_alert.scss, _badge.scss, _banner.scss, _border-radius.scss, _box-shadow.scss, _breakpoints.scss, _buttons.scss, _caret.scss, _clearfix.scss, _color-mode.scss, _color-scheme.scss, _container.scss, _float.scss, _forms.scss, _gradients.scss, _grid-framework.scss, _grid.scss, _hover.scss, _image.scss
Introduced new mixins (banner, color-mode, color-scheme, container, backdrop); removed deprecated mixins (hover, plain-hover-focus, hover-focus-active, float-left/right, badge-variant, background-variant); updated signatures (buttons, caret, border-radius, gradients) to support CSS variables and refactored logic.
Main Bootstrap Import Files
resources/bootstrap/scss/bootstrap.scss, bootstrap-grid.scss, bootstrap-reboot.scss, bootstrap-utilities.scss
Reorganized imports to include new modules (accordion, offcanvas, placeholders, helpers), removed deprecated ones (code, custom-forms, jumbotron, media, print), and added dark-theme variables; introduced bootstrap-utilities.scss entry point.
Documentation and Configuration
resources/bootstrap/scss/_helpers.scss
Added aggregator module consolidating helper partials (clearfix, color-bg, colored-links, focus-ring, icon-link, ratio, position, stacks, visually-hidden, stretched-link, text-truncation, vr).

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Specific areas requiring extra attention:

  • Bootstrap 4→5 JavaScript removal: Verify all removed JS components (alert, button, carousel, collapse, dropdown, modal, popover, scrollspy, tab, toast, tooltip) have no remaining runtime dependencies; confirm Popper.js bundle is correctly integrated.
  • CSS variable migration: Review all SCSS variable-to-CSS-custom-property refactorings in color, spacing, and component styling to ensure fallback behavior and theming consistency across light/dark modes.
  • Grid system refactoring: Examine changes from negative-margin-based row/column layout to CSS Grid approach; verify breakpoint-specific grid classes and responsive behavior remain intact.
  • Form component modularization: Validate that split form files (labels, control, check, range, select) maintain expected selector specificity and state behavior; check floating labels and validation state transitions.
  • Dark mode implementation: Verify conditional @if $enable-dark-mode blocks, color-mode() mixin invocations, and [data-bs-theme="light"] selector logic work correctly across all themed components.
  • Mixin signature changes: Review button-variant, border-radius, caret, gradient, and form-validation-state signature updates to ensure all call sites pass correct parameters.
  • Entry point changes: Confirm bootstrap.scss, bootstrap-grid.scss, and new bootstrap-utilities.scss imports include all necessary partials and maintain expected CSS output order.

Possibly related PRs

  • Update CI #81: Updates CI workflow matrix for MediaWiki and PHP versions, directly related to this PR's CI configuration changes.

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title 'Update to Bootstrap 5.3' clearly summarizes the main change—a major version upgrade of Bootstrap from 4.x to 5.3—which is the most significant modification evident across the changeset (dependency updates, SCSS modernization, JavaScript component removals, and version bumps).
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
composer.json (1)

4-4: Description references Bootstrap 4 but should reference Bootstrap 5.

The description still says "Bootstrap 4 web front-end framework" but this PR upgrades to Bootstrap 5.3. This should be updated for accuracy.

🔎 Suggested fix
-	"description": "Provides the Bootstrap 4 web front-end framework to MediaWiki skins and extensions",
+	"description": "Provides the Bootstrap 5 web front-end framework to MediaWiki skins and extensions",
🧹 Nitpick comments (10)
resources/bootstrap/scss/mixins/_image.scss (1)

1-3: Consider updating the comment to reflect removed functionality.

The comment on line 3 still references "Retina image," but the retina image mixin has been removed in this update. Consider removing this line from the header comment for consistency.

🔎 Suggested fix
 // Image Mixins
 // - Responsive image
-// - Retina image
resources/bootstrap/scss/mixins/_box-shadow.scss (1)

7-22: Edge case: Mixed special values and shadow definitions.

The current logic allows passing both special keywords (none, inherit, etc.) and actual shadow values. If this occurs, the special keyword silently takes precedence (lines 18-19). This is likely intentional, but consider whether a warning would be helpful for debugging.

Additionally, if multiple special keywords are passed, only the last one is retained.

🔎 Optional: Add warning for mixed usage
     @if $has-single-value {
+      @if length($result) > 0 {
+        @warn "box-shadow mixin received both special value `#{$single-value}` and shadow values; using special value only.";
+      }
       box-shadow: $single-value;
     } @else if (length($result) > 0) {
       box-shadow: $result;
     }
resources/bootstrap/scss/_functions.scss (1)

41-49: Minor: Missing @else before second @if on line 44.

The condition on line 44 should use @else if instead of @if for proper conditional chaining. While functionally similar in this case (due to the returns), using @else if is more explicit and conventional.

Suggested fix
 @function rgba-css-var($identifier, $target) {
   @if $identifier == "body" and $target == "bg" {
     @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));
-  } @if $identifier == "body" and $target == "text" {
+  } @else if $identifier == "body" and $target == "text" {
     @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));
   } @else {
     @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));
   }
 }
resources/bootstrap/scss/forms/_form-range.scss (1)

43-52: Clean up unclear inline comments.

Lines 46 and 75 contain questioning comments (// Why? and // Firefox specific?) that appear to be leftover notes rather than meaningful documentation. These should either be removed or replaced with proper explanations.

The color: transparent on track elements is intentional to prevent text selection highlighting from appearing on the track.

🔎 Suggested documentation fixes
   &::-webkit-slider-runnable-track {
     width: $form-range-track-width;
     height: $form-range-track-height;
-    color: transparent; // Why?
+    color: transparent; // Prevents text selection highlighting
     cursor: $form-range-track-cursor;
     background-color: $form-range-track-bg;
     border-color: transparent;
   &::-moz-range-track {
     width: $form-range-track-width;
     height: $form-range-track-height;
     color: transparent;
     cursor: $form-range-track-cursor;
     background-color: $form-range-track-bg;
-    border-color: transparent; // Firefox specific?
+    border-color: transparent;
     @include border-radius($form-range-track-border-radius);
resources/bootstrap/scss/forms/_form-check.scss (1)

168-181: Consider using clip-path instead of deprecated clip.

The clip property is deprecated in favor of clip-path. While clip: rect(0, 0, 0, 0) still works for accessibility hiding, modern implementations prefer clip-path: inset(50%).

🔎 Suggested update
 .btn-check {
   position: absolute;
-  clip: rect(0, 0, 0, 0);
+  clip-path: inset(50%);
   pointer-events: none;

Note: This is a minor update as Bootstrap 5.3 upstream may still use clip for broader browser support. Verify upstream Bootstrap source if consistency is desired.

resources/bootstrap/scss/_toasts.scss (1)

40-52: Duplicate --toast-zindex declaration.

The --#{$prefix}toast-zindex variable is already defined in .toast (line 3). While not breaking (CSS variables are scoped), this redundancy could be intentional for container-specific overrides. Consider whether .toast-container should inherit from .toast or if this duplication is desired for independent theming.

resources/bootstrap/scss/_accordion.scss (1)

127-144: Minor inconsistency in pseudo-class usage.

The flush variant uses :first-child/:last-child (lines 133-134) while the main .accordion-item rules use :first-of-type/:last-of-type (lines 90, 98, 103). This could cause subtle differences if non-.accordion-item elements are mixed in. Consider aligning to use :first-of-type/:last-of-type for consistency.

🔎 Suggested alignment
-    &:first-child { border-top: 0; }
-    &:last-child { border-bottom: 0; }
+    &:first-of-type { border-top: 0; }
+    &:last-of-type { border-bottom: 0; }
resources/bootstrap/scss/_dropdown.scss (1)

71-81: Minor: Extra blank line inside conditional block.

There's an extra blank line before the closing brace on line 81.

Suggested fix
     > .dropdown-item:last-child,
     > li:last-child .dropdown-item {
       @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius));
     }
-
   }
resources/bootstrap/scss/_carousel.scss (1)

205-226: Dark mode implementation follows Bootstrap 5.3 pattern.

The carousel-dark() mixin and conditional color-mode(dark, true) application correctly implement the Bootstrap 5.3 theming system.

One consideration: the :root, [data-bs-theme="light"] block (lines 215-220) is declared after .carousel-dark. While this works due to CSS specificity (:root has lower specificity than a class), placing root/light defaults before the dark variant would improve readability and match the pattern used in other Bootstrap components.

resources/bootstrap/scss/_variables-dark.scss (1)

82-96: Consider moving carousel/close-button vars inside the scss-docs block.

The scss-docs-end sass-dark-mode-vars marker is at line 87, but carousel and close-button dark mode variables follow at lines 94-102. For documentation consistency, consider either extending the docs block or adding separate markers for these sections.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3adc909 and 20912f1.

⛔ Files ignored due to path filters (15)
  • package-lock.json is excluded by !**/package-lock.json
  • resources/bootstrap/js/alert.js.map is excluded by !**/*.map
  • resources/bootstrap/js/bootstrap.bundle.js.map is excluded by !**/*.map
  • resources/bootstrap/js/button.js.map is excluded by !**/*.map
  • resources/bootstrap/js/carousel.js.map is excluded by !**/*.map
  • resources/bootstrap/js/collapse.js.map is excluded by !**/*.map
  • resources/bootstrap/js/dropdown.js.map is excluded by !**/*.map
  • resources/bootstrap/js/modal.js.map is excluded by !**/*.map
  • resources/bootstrap/js/popover.js.map is excluded by !**/*.map
  • resources/bootstrap/js/popper.js.map is excluded by !**/*.map
  • resources/bootstrap/js/scrollspy.js.map is excluded by !**/*.map
  • resources/bootstrap/js/tab.js.map is excluded by !**/*.map
  • resources/bootstrap/js/toast.js.map is excluded by !**/*.map
  • resources/bootstrap/js/tooltip.js.map is excluded by !**/*.map
  • resources/bootstrap/js/util.js.map is excluded by !**/*.map
📒 Files selected for processing (107)
  • .github/workflows/ci.yml (1 hunks)
  • README.md (2 hunks)
  • composer.json (2 hunks)
  • docs/release-notes.md (1 hunks)
  • extension.json (1 hunks)
  • package.json (1 hunks)
  • resources/bootstrap/js/alert.js (0 hunks)
  • resources/bootstrap/js/button.js (0 hunks)
  • resources/bootstrap/js/carousel.js (0 hunks)
  • resources/bootstrap/js/collapse.js (0 hunks)
  • resources/bootstrap/js/dropdown.js (0 hunks)
  • resources/bootstrap/js/index.js (0 hunks)
  • resources/bootstrap/js/modal.js (0 hunks)
  • resources/bootstrap/js/popover.js (0 hunks)
  • resources/bootstrap/js/popper.js (0 hunks)
  • resources/bootstrap/js/scrollspy.js (0 hunks)
  • resources/bootstrap/js/tab.js (0 hunks)
  • resources/bootstrap/js/toast.js (0 hunks)
  • resources/bootstrap/js/tooltip.js (0 hunks)
  • resources/bootstrap/js/util.js (0 hunks)
  • resources/bootstrap/scss/_accordion.scss (1 hunks)
  • resources/bootstrap/scss/_alert.scss (3 hunks)
  • resources/bootstrap/scss/_badge.scss (1 hunks)
  • resources/bootstrap/scss/_breadcrumb.scss (1 hunks)
  • resources/bootstrap/scss/_button-group.scss (5 hunks)
  • resources/bootstrap/scss/_buttons.scss (4 hunks)
  • resources/bootstrap/scss/_card.scss (9 hunks)
  • resources/bootstrap/scss/_carousel.scss (7 hunks)
  • resources/bootstrap/scss/_close.scss (1 hunks)
  • resources/bootstrap/scss/_code.scss (0 hunks)
  • resources/bootstrap/scss/_containers.scss (1 hunks)
  • resources/bootstrap/scss/_custom-forms.scss (0 hunks)
  • resources/bootstrap/scss/_dropdown.scss (4 hunks)
  • resources/bootstrap/scss/_forms.scss (1 hunks)
  • resources/bootstrap/scss/_functions.scss (2 hunks)
  • resources/bootstrap/scss/_grid.scss (1 hunks)
  • resources/bootstrap/scss/_helpers.scss (1 hunks)
  • resources/bootstrap/scss/_input-group.scss (0 hunks)
  • resources/bootstrap/scss/_jumbotron.scss (0 hunks)
  • resources/bootstrap/scss/_list-group.scss (5 hunks)
  • resources/bootstrap/scss/_maps.scss (1 hunks)
  • resources/bootstrap/scss/_media.scss (0 hunks)
  • resources/bootstrap/scss/_mixins.scss (1 hunks)
  • resources/bootstrap/scss/_modal.scss (6 hunks)
  • resources/bootstrap/scss/_nav.scss (5 hunks)
  • resources/bootstrap/scss/_navbar.scss (8 hunks)
  • resources/bootstrap/scss/_offcanvas.scss (1 hunks)
  • resources/bootstrap/scss/_pagination.scss (2 hunks)
  • resources/bootstrap/scss/_placeholders.scss (1 hunks)
  • resources/bootstrap/scss/_popover.scss (3 hunks)
  • resources/bootstrap/scss/_print.scss (0 hunks)
  • resources/bootstrap/scss/_progress.scss (1 hunks)
  • resources/bootstrap/scss/_reboot.scss (7 hunks)
  • resources/bootstrap/scss/_root.scss (1 hunks)
  • resources/bootstrap/scss/_spinners.scss (2 hunks)
  • resources/bootstrap/scss/_tables.scss (1 hunks)
  • resources/bootstrap/scss/_toasts.scss (1 hunks)
  • resources/bootstrap/scss/_tooltip.scss (2 hunks)
  • resources/bootstrap/scss/_transitions.scss (1 hunks)
  • resources/bootstrap/scss/_type.scss (2 hunks)
  • resources/bootstrap/scss/_utilities.scss (1 hunks)
  • resources/bootstrap/scss/_variables-dark.scss (1 hunks)
  • resources/bootstrap/scss/bootstrap-grid.scss (1 hunks)
  • resources/bootstrap/scss/bootstrap-reboot.scss (1 hunks)
  • resources/bootstrap/scss/bootstrap-utilities.scss (1 hunks)
  • resources/bootstrap/scss/bootstrap.scss (2 hunks)
  • resources/bootstrap/scss/forms/_floating-labels.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-check.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-control.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-range.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-select.scss (1 hunks)
  • resources/bootstrap/scss/forms/_form-text.scss (1 hunks)
  • resources/bootstrap/scss/forms/_input-group.scss (1 hunks)
  • resources/bootstrap/scss/forms/_labels.scss (1 hunks)
  • resources/bootstrap/scss/forms/_validation.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_color-bg.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_colored-links.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_focus-ring.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_icon-link.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_position.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_ratio.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_stacks.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_stretched-link.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_text-truncation.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_visually-hidden.scss (1 hunks)
  • resources/bootstrap/scss/helpers/_vr.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_alert.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_backdrop.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_background-variant.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_badge.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_banner.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_border-radius.scss (2 hunks)
  • resources/bootstrap/scss/mixins/_box-shadow.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_breakpoints.scss (3 hunks)
  • resources/bootstrap/scss/mixins/_buttons.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_caret.scss (2 hunks)
  • resources/bootstrap/scss/mixins/_clearfix.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_color-mode.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_color-scheme.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_container.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_float.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_forms.scss (4 hunks)
  • resources/bootstrap/scss/mixins/_gradients.scss (1 hunks)
  • resources/bootstrap/scss/mixins/_grid-framework.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_grid.scss (2 hunks)
  • resources/bootstrap/scss/mixins/_hover.scss (0 hunks)
  • resources/bootstrap/scss/mixins/_image.scss (1 hunks)
⛔ Files not processed due to max files limit (36)
  • resources/bootstrap/scss/mixins/_list-group.scss
  • resources/bootstrap/scss/mixins/_lists.scss
  • resources/bootstrap/scss/mixins/_nav-divider.scss
  • resources/bootstrap/scss/mixins/_pagination.scss
  • resources/bootstrap/scss/mixins/_reset-text.scss
  • resources/bootstrap/scss/mixins/_screen-reader.scss
  • resources/bootstrap/scss/mixins/_size.scss
  • resources/bootstrap/scss/mixins/_table-row.scss
  • resources/bootstrap/scss/mixins/_table-variants.scss
  • resources/bootstrap/scss/mixins/_text-emphasis.scss
  • resources/bootstrap/scss/mixins/_text-hide.scss
  • resources/bootstrap/scss/mixins/_transition.scss
  • resources/bootstrap/scss/mixins/_utilities.scss
  • resources/bootstrap/scss/mixins/_visibility.scss
  • resources/bootstrap/scss/mixins/_visually-hidden.scss
  • resources/bootstrap/scss/utilities/_align.scss
  • resources/bootstrap/scss/utilities/_api.scss
  • resources/bootstrap/scss/utilities/_background.scss
  • resources/bootstrap/scss/utilities/_borders.scss
  • resources/bootstrap/scss/utilities/_display.scss
  • resources/bootstrap/scss/utilities/_embed.scss
  • resources/bootstrap/scss/utilities/_flex.scss
  • resources/bootstrap/scss/utilities/_float.scss
  • resources/bootstrap/scss/utilities/_interactions.scss
  • resources/bootstrap/scss/utilities/_overflow.scss
  • resources/bootstrap/scss/utilities/_position.scss
  • resources/bootstrap/scss/utilities/_screenreaders.scss
  • resources/bootstrap/scss/utilities/_shadows.scss
  • resources/bootstrap/scss/utilities/_sizing.scss
  • resources/bootstrap/scss/utilities/_spacing.scss
  • resources/bootstrap/scss/utilities/_stretched-link.scss
  • resources/bootstrap/scss/utilities/_text.scss
  • resources/bootstrap/scss/utilities/_visibility.scss
  • resources/bootstrap/scss/vendor/_rfs.scss
  • src/BootstrapManager.php
  • src/Definition/V5ModuleDefinition.php
💤 Files with no reviewable changes (25)
  • resources/bootstrap/scss/_media.scss
  • resources/bootstrap/scss/mixins/_background-variant.scss
  • resources/bootstrap/scss/mixins/_grid-framework.scss
  • resources/bootstrap/js/util.js
  • resources/bootstrap/scss/_code.scss
  • resources/bootstrap/js/button.js
  • resources/bootstrap/js/alert.js
  • resources/bootstrap/scss/_custom-forms.scss
  • resources/bootstrap/scss/mixins/_badge.scss
  • resources/bootstrap/js/popper.js
  • resources/bootstrap/scss/mixins/_float.scss
  • resources/bootstrap/js/scrollspy.js
  • resources/bootstrap/js/tooltip.js
  • resources/bootstrap/scss/_print.scss
  • resources/bootstrap/js/popover.js
  • resources/bootstrap/js/dropdown.js
  • resources/bootstrap/js/carousel.js
  • resources/bootstrap/scss/mixins/_hover.scss
  • resources/bootstrap/scss/_input-group.scss
  • resources/bootstrap/js/index.js
  • resources/bootstrap/js/tab.js
  • resources/bootstrap/scss/_jumbotron.scss
  • resources/bootstrap/js/collapse.js
  • resources/bootstrap/js/modal.js
  • resources/bootstrap/js/toast.js

@malberts malberts merged commit 130416e into master Dec 20, 2025
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants