Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chore merge from d8883d7 to 8e5dada #2162

Merged
merged 72 commits into from
Jul 26, 2023
Merged
Show file tree
Hide file tree
Changes from 71 commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
08ac1f5
d8883d753f45d819234b4533b58da161c4ab1e8b
julien-deramond Jul 24, 2023
4f8f099
2f617215755b066904248525a8c56ea425dde871
julien-deramond Jul 24, 2023
80d0945
5036f70e1c80cebb270aca8c1b422f8d4d4bd47f
julien-deramond Jul 24, 2023
6464736
e4741f7e1e234ef41c119020fb16ea0661366012
julien-deramond Jul 24, 2023
4b52ed9
f722615d35b6d2b0348ca19af054c2ec39755e51
julien-deramond Jul 24, 2023
f9a03f9
3a8c7587a33926e3253730c103650fd098f415fa
julien-deramond Jul 24, 2023
7371ee3
e946bf7e9434a99d750baf9a0786fcf52c5ff8f7
julien-deramond Jul 24, 2023
c51197c
8321397656762cf2007bcf028de1b938ce58b058
julien-deramond Jul 24, 2023
4ccf02a
9369cd93fb177a967ae3d59485721491bb388d1d
julien-deramond Jul 25, 2023
f51b3ab
14292b4a22b3390a633184b97043e3e4a85db93a
julien-deramond Jul 25, 2023
6ff517d
213888e17e6f9fe9ea7ae67e9d9c1c3e8494867a
julien-deramond Jul 25, 2023
49d9add
787dfea8a29db138d5ff6100fc894f457ccd4169
julien-deramond Jul 25, 2023
4198441
221862fe9447bce74e383e3ee1cbd8a116c4f499
julien-deramond Jul 25, 2023
ebe4721
e244dbc9d8efa8827d24d4f95651e73804c3216d
julien-deramond Jul 25, 2023
039d3b5
5370ddc4d336fc7f1810e8b0e35e1562da49e897
julien-deramond Jul 25, 2023
8eac5c7
88c488515f6e1a81b5ac3ce5941a78b4e73384b6
julien-deramond Jul 25, 2023
08e9665
d333d70e52dd8b13d043a0c11ccef9282a27ccd4
julien-deramond Jul 25, 2023
bb8a9e6
1ab75c8d14b101d7f2ab8d31f0addf549c70def7
julien-deramond Jul 25, 2023
888f42f
43e4bf97a8b892af42f5a03ce7056efb6efa3b58
julien-deramond Jul 25, 2023
35e7694
e0d54ffd3202b7f6a6b2b738ca6ec15017748925
julien-deramond Jul 25, 2023
e16fadf
4315801856b690d30091e804fb1de5d6233fe306
julien-deramond Jul 25, 2023
8de2d95
e2854b94da6ead85753c9b9816b2ffdf3964a882
julien-deramond Jul 25, 2023
efe47f4
52d53696d25782ecfa10930d5a297b60e2fc445e
julien-deramond Jul 25, 2023
f4932a2
3515ac16a171ca4bbb131237ff3324a6b0eb8743
julien-deramond Jul 25, 2023
7576c8e
6301ca1ee070b1614ff1fd9fc23b0f1bf869475e
julien-deramond Jul 25, 2023
e211122
bd7a0452c07aaf665f778afa50988b1fbcc8088a
julien-deramond Jul 25, 2023
25a94a8
fef8958209accdc9e2117ba6d67446aadc2c6425
julien-deramond Jul 25, 2023
cafd67c
609e6457cc5706fb5de439edc5073641b1a695d5
julien-deramond Jul 25, 2023
f394e0e
df382155853952de8a2663774c63c8088f2c89b6
julien-deramond Jul 25, 2023
637276f
42a055c7a8e611523c2d10650a465d75d0bb362b
julien-deramond Jul 25, 2023
fcb9910
4617a7610cde5b3912cb01c8e3471368d9dd1f5e
julien-deramond Jul 25, 2023
93d1325
5bcb0fafad4e69ac437f6b4c358b485d13de42b3
julien-deramond Jul 25, 2023
e7459e1
79e196a9760456e5d3b4e30d9212cda280de5d72
julien-deramond Jul 25, 2023
c1ad701
9ff96a497ca005e4028a438e2f6838756a8a0cb1
julien-deramond Jul 25, 2023
36b3fa9
e2de56d74038077d36bd1edf7f45f7d299f0414a
julien-deramond Jul 25, 2023
91e7f9f
2990534463f2ed7c9ba378d091658fb1b1f18808
julien-deramond Jul 25, 2023
1942d6c
afa2fc447f0ab22402715e1ab92a13bf67ec1732
julien-deramond Jul 25, 2023
1c8f0cb
de69649b3aca7bbe2eb6b6fb294cb508d8d6ad04
julien-deramond Jul 25, 2023
33fbbe8
a5c7303fa23a2c88d930c233b26da4643aeba5d9
julien-deramond Jul 25, 2023
b0186f8
a0931d0f6b43d36a95840237979ba6ee2b447a01
julien-deramond Jul 25, 2023
d279efa
ccc73058c1e1bcd5fdab971b4073eaf5dbe1523a
julien-deramond Jul 25, 2023
697705b
877e6725e679007c93c1e5663d209216807fb3ee
julien-deramond Jul 25, 2023
f1cecce
8c135169e7ef5a4d6b92b99e21630711d7830963
julien-deramond Jul 25, 2023
8c0f6ef
6a9b9af59e0e279e3fc6eb46a043f9a4eae578fe
julien-deramond Jul 25, 2023
e6e063c
674ea99c8c70d8833bb2437d1cd3d098af8c5edb
julien-deramond Jul 25, 2023
bcab0b4
7dfa9c58902eaa05ba65945dd6f3ca6c501b7a3e
julien-deramond Jul 25, 2023
35f917b
3ea4168cb62f40b1ee3801d827c59333e5996bfb
julien-deramond Jul 25, 2023
94f9391
9205ffe6311dc20578f6b6b77757f8955867d199
julien-deramond Jul 25, 2023
fc960ee
303e56758d9f531699aa6703eea8c032ad2525d2
julien-deramond Jul 25, 2023
5fc7033
cf074cd3b95d9cc08fc8cc8725e80327d5f3071f
julien-deramond Jul 25, 2023
97d0e54
ae255aaefc6a1fcd458429b03bf579e19e347943
julien-deramond Jul 25, 2023
2b4a1dc
83e5ec81752148e6b4e0a9d31053f840fbad23ec
julien-deramond Jul 25, 2023
df31c6c
fb348b6bddb99cbb73554ecf42e63b0ecfaab90b
julien-deramond Jul 25, 2023
a3b6fcf
86c5371ac8da1636f0e8406f62e3a1610cad4b0f
julien-deramond Jul 25, 2023
ba2283f
fd0a4e67a01162d39bf1844ec70ae3e8cc022102
julien-deramond Jul 25, 2023
02e39c0
a814733ad749ff73f4f3534b37ccee97d3887029
julien-deramond Jul 25, 2023
20b2835
8fcfce1ebd988fd4e5ed2f51acaa5c49e6b301c9
julien-deramond Jul 25, 2023
53652a4
Some fixes (lint + docs)
julien-deramond Jul 25, 2023
bab0e65
d45cc7ef516de676bfaa2b97fe10b71e98ff6f3e
julien-deramond Jul 25, 2023
87a7063
1c80bd9c4b3929c51f6d654ab1f1d721b6212e47
julien-deramond Jul 25, 2023
d5a013b
4271d22b902e8aa2c56c22c39737930946ecf6b9
julien-deramond Jul 25, 2023
65c74a1
92d779f83c265a447b72d0e6df2f0e68c3d1fb40
julien-deramond Jul 25, 2023
629fca4
ea21de16740d8eb4f1bdccbb7db8860d8ba36c7a
julien-deramond Jul 25, 2023
4bfc17a
57ddb42bafe3cbc4b983fc8acd10b8561218cea0
julien-deramond Jul 25, 2023
2307b60
Hide pa11y issues
julien-deramond Jul 26, 2023
12fe483
Missing Sass var in migration guide
julien-deramond Jul 26, 2023
224b131
Fix missing `aria-disabled='true'` in list group dark example
julien-deramond Jul 26, 2023
be7817f
Remove disabled rules from .nav-underline + adapt bundlewatch
julien-deramond Jul 26, 2023
05ebff5
Fix missing update in docs-versions.yml
julien-deramond Jul 26, 2023
32477ce
Add `aria-disabled='true'` modifs in migration guide
julien-deramond Jul 26, 2023
26ff4ca
Add `aria-disabled='true'` modifs to nested tabs
julien-deramond Jul 26, 2023
cac57bd
Update site/content/docs/5.3/components/navs-tabs.md
julien-deramond Jul 26, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .bundlewatch.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
},
{
"path": "./dist/css/boosted-reboot.css",
"maxSize": "4.5 kB"
"maxSize": "4.25 kB"
},
{
"path": "./dist/css/boosted-reboot.min.css",
Expand All @@ -34,7 +34,7 @@
},
{
"path": "./dist/js/boosted.bundle.js",
"maxSize": "48.5 kB"
"maxSize": "48.25 kB"
},
{
"path": "./dist/js/boosted.bundle.min.js",
Expand Down
2 changes: 1 addition & 1 deletion build/.pa11yci.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"axe"
],
"useIncognitoBrowserContext": false,
"hideElements": "iframe, #text-decoration + p + div a.text-decoration-none, .accordion-collapse, #offcanvas, #offcanvasDark, #offcanvasResponsive, #bdSidebar",
"hideElements": "iframe, #text-decoration + p + div a.text-decoration-none, .accordion-collapse, #offcanvas, #offcanvasDark, #offcanvasResponsive, #bdSidebar, .overflow-y-scroll, .overflow-y-auto, .overflow-x-scroll, .overflow-x-auto, .table-responsive",
"ignore": [
"color-contrast"
]
Expand Down
10 changes: 9 additions & 1 deletion build/zip-examples.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ const jsFiles = [
const imgFiles = [
'orange-logo.svg'
]
const staticJsFiles = [
'color-modes.js'
]

sh.config.fatal = true

Expand All @@ -50,7 +53,8 @@ sh.mkdir('-p', [
distFolder,
`${distFolder}/assets/brand/`,
`${distFolder}/assets/dist/css/`,
`${distFolder}/assets/dist/js/`
`${distFolder}/assets/dist/js/`,
`${distFolder}/assets/js/`
])

sh.cp('-Rf', `${docsDir}/examples/*`, distFolder)
Expand All @@ -67,6 +71,10 @@ for (const file of imgFiles) {
sh.cp('-f', `${docsDir}/assets/brand/${file}`, `${distFolder}/assets/brand/`)
}

for (const file of staticJsFiles) {
sh.cp('-f', `${docsDir}/assets/js/${file}`, `${distFolder}/assets/js/`)
}

sh.rm(`${distFolder}/index.html`)

// get all examples' HTML files
Expand Down
2 changes: 2 additions & 0 deletions hugo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ security:
getenv:
- ^HUGO_
- NETLIFY
gotemplates:
allowActionJSTmpl: true

markup:
goldmark:
Expand Down
16 changes: 13 additions & 3 deletions js/src/tab.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ const ARROW_LEFT_KEY = 'ArrowLeft'
const ARROW_RIGHT_KEY = 'ArrowRight'
const ARROW_UP_KEY = 'ArrowUp'
const ARROW_DOWN_KEY = 'ArrowDown'
const HOME_KEY = 'Home'
const END_KEY = 'End'

const CLASS_NAME_ACTIVE = 'active'
const CLASS_NAME_FADE = 'fade'
Expand Down Expand Up @@ -151,14 +153,22 @@ class Tab extends BaseComponent {
}

_keydown(event) {
if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key))) {
if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {
return
}

event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page
event.preventDefault()
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)
const nextActiveElement = getNextActiveElement(this._getChildren().filter(element => !isDisabled(element)), event.target, isNext, true)

const children = this._getChildren().filter(element => !isDisabled(element))
let nextActiveElement

if ([HOME_KEY, END_KEY].includes(event.key)) {
nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]
} else {
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)
nextActiveElement = getNextActiveElement(children, event.target, isNext, true)
}

if (nextActiveElement) {
nextActiveElement.focus({ preventScroll: true })
Expand Down
112 changes: 112 additions & 0 deletions js/tests/unit/tab.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -630,6 +630,58 @@ describe('Tab', () => {
expect(spyPrevent).toHaveBeenCalledTimes(2)
})

it('if keydown event is Home, handle it', () => {
fixtureEl.innerHTML = [
'<div class="nav">',
' <span id="tab1" class="nav-link" data-bs-toggle="tab"></span>',
' <span id="tab2" class="nav-link" data-bs-toggle="tab"></span>',
' <span id="tab3" class="nav-link" data-bs-toggle="tab"></span>',
'</div>'
].join('')

const tabEl1 = fixtureEl.querySelector('#tab1')
const tabEl3 = fixtureEl.querySelector('#tab3')

const tab3 = new Tab(tabEl3)
tab3.show()

const spyShown = jasmine.createSpy()
tabEl1.addEventListener('shown.bs.tab', spyShown)

const keydown = createEvent('keydown')
keydown.key = 'Home'

tabEl3.dispatchEvent(keydown)

expect(spyShown).toHaveBeenCalled()
})

it('if keydown event is End, handle it', () => {
fixtureEl.innerHTML = [
'<div class="nav">',
' <span id="tab1" class="nav-link" data-bs-toggle="tab"></span>',
' <span id="tab2" class="nav-link" data-bs-toggle="tab"></span>',
' <span id="tab3" class="nav-link" data-bs-toggle="tab"></span>',
'</div>'
].join('')

const tabEl1 = fixtureEl.querySelector('#tab1')
const tabEl3 = fixtureEl.querySelector('#tab3')

const tab1 = new Tab(tabEl1)
tab1.show()

const spyShown = jasmine.createSpy()
tabEl3.addEventListener('shown.bs.tab', spyShown)

const keydown = createEvent('keydown')
keydown.key = 'End'

tabEl1.dispatchEvent(keydown)

expect(spyShown).toHaveBeenCalled()
})

it('if keydown event is right arrow and next element is disabled', () => {
fixtureEl.innerHTML = [
'<div class="nav">',
Expand Down Expand Up @@ -711,6 +763,66 @@ describe('Tab', () => {
expect(spyFocus2).not.toHaveBeenCalled()
expect(spyFocus1).toHaveBeenCalledTimes(1)
})

it('if keydown event is Home and first element is disabled', () => {
fixtureEl.innerHTML = [
'<div class="nav">',
' <span id="tab1" class="nav-link disabled" data-bs-toggle="tab" disabled></span>',
' <span id="tab2" class="nav-link" data-bs-toggle="tab"></span>',
' <span id="tab3" class="nav-link" data-bs-toggle="tab"></span>',
'</div>'
].join('')

const tabEl1 = fixtureEl.querySelector('#tab1')
const tabEl2 = fixtureEl.querySelector('#tab2')
const tabEl3 = fixtureEl.querySelector('#tab3')
const tab3 = new Tab(tabEl3)

tab3.show()

const spyShown1 = jasmine.createSpy()
const spyShown2 = jasmine.createSpy()
tabEl1.addEventListener('shown.bs.tab', spyShown1)
tabEl2.addEventListener('shown.bs.tab', spyShown2)

const keydown = createEvent('keydown')
keydown.key = 'Home'

tabEl3.dispatchEvent(keydown)

expect(spyShown1).not.toHaveBeenCalled()
expect(spyShown2).toHaveBeenCalled()
})

it('if keydown event is End and last element is disabled', () => {
fixtureEl.innerHTML = [
'<div class="nav">',
' <span id="tab1" class="nav-link" data-bs-toggle="tab"></span>',
' <span id="tab2" class="nav-link" data-bs-toggle="tab"></span>',
' <span id="tab3" class="nav-link" data-bs-toggle="tab" disabled></span>',
'</div>'
].join('')

const tabEl1 = fixtureEl.querySelector('#tab1')
const tabEl2 = fixtureEl.querySelector('#tab2')
const tabEl3 = fixtureEl.querySelector('#tab3')
const tab1 = new Tab(tabEl1)

tab1.show()

const spyShown2 = jasmine.createSpy()
const spyShown3 = jasmine.createSpy()
tabEl2.addEventListener('shown.bs.tab', spyShown2)
tabEl3.addEventListener('shown.bs.tab', spyShown3)

const keydown = createEvent('keydown')
keydown.key = 'End'

tabEl1.dispatchEvent(keydown)

expect(spyShown3).not.toHaveBeenCalled()
expect(spyShown2).toHaveBeenCalled()
})
})

describe('jQueryInterface', () => {
Expand Down
4 changes: 2 additions & 2 deletions js/tests/visual/tab.html
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,12 @@ <h4>Tabs with fade (no initially active pane)</h4>

<h4>Tabs with nav and using links (with fade)</h4>
<nav>
<div class="nav nav-pills" id="nav-tab" role="tablist">
<div class="nav nav-pills" id="nav-tab" role="tablist">
<a class="nav-link nav-item active" role="tab" data-bs-toggle="tab" href="#home5">Home</a>
<a class="nav-link nav-item" role="tab" data-bs-toggle="tab" href="#profile5">Profile</a>
<a class="nav-link nav-item" role="tab" data-bs-toggle="tab" href="#fat5">@fat</a>
<a class="nav-link nav-item" role="tab" data-bs-toggle="tab" href="#mdo5">@mdo</a>
<a class="nav-link nav-item disabled" role="tab" href="#">Disabled</a>
<a class="nav-link nav-item disabled" role="tab" href="#" aria-disabled="true">Disabled</a>
</div>
</nav>

Expand Down
Loading