Skip to content

Commit a1aaa19

Browse files
Merge branch 'main' into patrickhlauke-navs-tabs
2 parents fe10f28 + 22d8e34 commit a1aaa19

30 files changed

+427
-258
lines changed

js/src/dropdown.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ const PLACEMENT_RIGHT = isRTL ? 'left-start' : 'right-start'
7272
const PLACEMENT_LEFT = isRTL ? 'right-start' : 'left-start'
7373

7474
const Default = {
75-
offset: [0, 0],
75+
offset: [0, 2],
7676
flip: true,
7777
boundary: 'clippingParents',
7878
reference: 'toggle',
@@ -194,20 +194,19 @@ class Dropdown extends BaseComponent {
194194

195195
this._menu.classList.toggle(CLASS_NAME_SHOW)
196196
this._element.classList.toggle(CLASS_NAME_SHOW)
197-
EventHandler.trigger(parent, EVENT_SHOWN, relatedTarget)
197+
EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)
198198
}
199199

200200
hide() {
201201
if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
202202
return
203203
}
204204

205-
const parent = Dropdown.getParentFromElement(this._element)
206205
const relatedTarget = {
207206
relatedTarget: this._element
208207
}
209208

210-
const hideEvent = EventHandler.trigger(parent, EVENT_HIDE, relatedTarget)
209+
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)
211210

212211
if (hideEvent.defaultPrevented) {
213212
return
@@ -219,7 +218,7 @@ class Dropdown extends BaseComponent {
219218

220219
this._menu.classList.toggle(CLASS_NAME_SHOW)
221220
this._element.classList.toggle(CLASS_NAME_SHOW)
222-
EventHandler.trigger(parent, EVENT_HIDDEN, relatedTarget)
221+
EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)
223222
}
224223

225224
dispose() {
@@ -319,7 +318,7 @@ class Dropdown extends BaseComponent {
319318
name: 'preventOverflow',
320319
options: {
321320
altBoundary: this._config.flip,
322-
rootBoundary: this._config.boundary
321+
boundary: this._config.boundary
323322
}
324323
},
325324
{
@@ -383,7 +382,6 @@ class Dropdown extends BaseComponent {
383382
const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)
384383

385384
for (let i = 0, len = toggles.length; i < len; i++) {
386-
const parent = Dropdown.getParentFromElement(toggles[i])
387385
const context = Data.getData(toggles[i], DATA_KEY)
388386
const relatedTarget = {
389387
relatedTarget: toggles[i]
@@ -409,7 +407,7 @@ class Dropdown extends BaseComponent {
409407
continue
410408
}
411409

412-
const hideEvent = EventHandler.trigger(parent, EVENT_HIDE, relatedTarget)
410+
const hideEvent = EventHandler.trigger(toggles[i], EVENT_HIDE, relatedTarget)
413411
if (hideEvent.defaultPrevented) {
414412
continue
415413
}
@@ -429,7 +427,7 @@ class Dropdown extends BaseComponent {
429427

430428
dropdownMenu.classList.remove(CLASS_NAME_SHOW)
431429
toggles[i].classList.remove(CLASS_NAME_SHOW)
432-
EventHandler.trigger(parent, EVENT_HIDDEN, relatedTarget)
430+
EventHandler.trigger(toggles[i], EVENT_HIDDEN, relatedTarget)
433431
}
434432
}
435433

@@ -470,6 +468,12 @@ class Dropdown extends BaseComponent {
470468
return
471469
}
472470

471+
if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
472+
const button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]
473+
button.click()
474+
return
475+
}
476+
473477
if (!isActive || event.key === SPACE_KEY) {
474478
Dropdown.clearMenus()
475479
return

js/src/popover.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
2525
const Default = {
2626
...Tooltip.Default,
2727
placement: 'right',
28+
offset: [0, 8],
2829
trigger: 'click',
2930
content: '',
3031
template: '<div class="popover" role="tooltip">' +

js/src/tooltip.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ class Tooltip extends BaseComponent {
509509
{
510510
name: 'preventOverflow',
511511
options: {
512-
rootBoundary: this.config.boundary
512+
boundary: this.config.boundary
513513
}
514514
},
515515
{

js/src/util/index.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,20 @@ const getSelector = element => {
3636
let selector = element.getAttribute('data-bs-target')
3737

3838
if (!selector || selector === '#') {
39-
const hrefAttr = element.getAttribute('href')
39+
let hrefAttr = element.getAttribute('href')
40+
41+
// The only valid content that could double as a selector are IDs or classes,
42+
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
43+
// `document.querySelector` will rightfully complain it is invalid.
44+
// See https://github.com/twbs/bootstrap/issues/32273
45+
if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {
46+
return null
47+
}
48+
49+
// Just in case some CMS puts out a full URL with the anchor appended
50+
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
51+
hrefAttr = '#' + hrefAttr.split('#')[1]
52+
}
4053

4154
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null
4255
}

0 commit comments

Comments
 (0)