Skip to content

Commit 048a650

Browse files
chore(merge main): patched commit → 8e5dada (#2162)
Co-authored-by: Louis-Maxime Piton <louismaxime.piton@orange.com>
1 parent 965b7f2 commit 048a650

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+6232
-4928
lines changed

.bundlewatch.config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
},
1111
{
1212
"path": "./dist/css/boosted-reboot.css",
13-
"maxSize": "4.5 kB"
13+
"maxSize": "4.25 kB"
1414
},
1515
{
1616
"path": "./dist/css/boosted-reboot.min.css",
@@ -34,7 +34,7 @@
3434
},
3535
{
3636
"path": "./dist/js/boosted.bundle.js",
37-
"maxSize": "48.5 kB"
37+
"maxSize": "48.25 kB"
3838
},
3939
{
4040
"path": "./dist/js/boosted.bundle.min.js",

build/.pa11yci.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"axe"
1616
],
1717
"useIncognitoBrowserContext": false,
18-
"hideElements": "iframe, #text-decoration + p + div a.text-decoration-none, .accordion-collapse, #offcanvas, #offcanvasDark, #offcanvasResponsive, #bdSidebar",
18+
"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",
1919
"ignore": [
2020
"color-contrast"
2121
]

build/zip-examples.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ const jsFiles = [
3333
const imgFiles = [
3434
'orange-logo.svg'
3535
]
36+
const staticJsFiles = [
37+
'color-modes.js'
38+
]
3639

3740
sh.config.fatal = true
3841

@@ -50,7 +53,8 @@ sh.mkdir('-p', [
5053
distFolder,
5154
`${distFolder}/assets/brand/`,
5255
`${distFolder}/assets/dist/css/`,
53-
`${distFolder}/assets/dist/js/`
56+
`${distFolder}/assets/dist/js/`,
57+
`${distFolder}/assets/js/`
5458
])
5559

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

74+
for (const file of staticJsFiles) {
75+
sh.cp('-f', `${docsDir}/assets/js/${file}`, `${distFolder}/assets/js/`)
76+
}
77+
7078
sh.rm(`${distFolder}/index.html`)
7179

7280
// get all examples' HTML files

hugo.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ security:
88
getenv:
99
- ^HUGO_
1010
- NETLIFY
11+
gotemplates:
12+
allowActionJSTmpl: true
1113

1214
markup:
1315
goldmark:

js/src/tab.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ const ARROW_LEFT_KEY = 'ArrowLeft'
3030
const ARROW_RIGHT_KEY = 'ArrowRight'
3131
const ARROW_UP_KEY = 'ArrowUp'
3232
const ARROW_DOWN_KEY = 'ArrowDown'
33+
const HOME_KEY = 'Home'
34+
const END_KEY = 'End'
3335

3436
const CLASS_NAME_ACTIVE = 'active'
3537
const CLASS_NAME_FADE = 'fade'
@@ -151,14 +153,22 @@ class Tab extends BaseComponent {
151153
}
152154

153155
_keydown(event) {
154-
if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key))) {
156+
if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {
155157
return
156158
}
157159

158160
event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page
159161
event.preventDefault()
160-
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)
161-
const nextActiveElement = getNextActiveElement(this._getChildren().filter(element => !isDisabled(element)), event.target, isNext, true)
162+
163+
const children = this._getChildren().filter(element => !isDisabled(element))
164+
let nextActiveElement
165+
166+
if ([HOME_KEY, END_KEY].includes(event.key)) {
167+
nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]
168+
} else {
169+
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)
170+
nextActiveElement = getNextActiveElement(children, event.target, isNext, true)
171+
}
162172

163173
if (nextActiveElement) {
164174
nextActiveElement.focus({ preventScroll: true })

js/tests/unit/tab.spec.js

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,58 @@ describe('Tab', () => {
630630
expect(spyPrevent).toHaveBeenCalledTimes(2)
631631
})
632632

633+
it('if keydown event is Home, handle it', () => {
634+
fixtureEl.innerHTML = [
635+
'<div class="nav">',
636+
' <span id="tab1" class="nav-link" data-bs-toggle="tab"></span>',
637+
' <span id="tab2" class="nav-link" data-bs-toggle="tab"></span>',
638+
' <span id="tab3" class="nav-link" data-bs-toggle="tab"></span>',
639+
'</div>'
640+
].join('')
641+
642+
const tabEl1 = fixtureEl.querySelector('#tab1')
643+
const tabEl3 = fixtureEl.querySelector('#tab3')
644+
645+
const tab3 = new Tab(tabEl3)
646+
tab3.show()
647+
648+
const spyShown = jasmine.createSpy()
649+
tabEl1.addEventListener('shown.bs.tab', spyShown)
650+
651+
const keydown = createEvent('keydown')
652+
keydown.key = 'Home'
653+
654+
tabEl3.dispatchEvent(keydown)
655+
656+
expect(spyShown).toHaveBeenCalled()
657+
})
658+
659+
it('if keydown event is End, handle it', () => {
660+
fixtureEl.innerHTML = [
661+
'<div class="nav">',
662+
' <span id="tab1" class="nav-link" data-bs-toggle="tab"></span>',
663+
' <span id="tab2" class="nav-link" data-bs-toggle="tab"></span>',
664+
' <span id="tab3" class="nav-link" data-bs-toggle="tab"></span>',
665+
'</div>'
666+
].join('')
667+
668+
const tabEl1 = fixtureEl.querySelector('#tab1')
669+
const tabEl3 = fixtureEl.querySelector('#tab3')
670+
671+
const tab1 = new Tab(tabEl1)
672+
tab1.show()
673+
674+
const spyShown = jasmine.createSpy()
675+
tabEl3.addEventListener('shown.bs.tab', spyShown)
676+
677+
const keydown = createEvent('keydown')
678+
keydown.key = 'End'
679+
680+
tabEl1.dispatchEvent(keydown)
681+
682+
expect(spyShown).toHaveBeenCalled()
683+
})
684+
633685
it('if keydown event is right arrow and next element is disabled', () => {
634686
fixtureEl.innerHTML = [
635687
'<div class="nav">',
@@ -711,6 +763,66 @@ describe('Tab', () => {
711763
expect(spyFocus2).not.toHaveBeenCalled()
712764
expect(spyFocus1).toHaveBeenCalledTimes(1)
713765
})
766+
767+
it('if keydown event is Home and first element is disabled', () => {
768+
fixtureEl.innerHTML = [
769+
'<div class="nav">',
770+
' <span id="tab1" class="nav-link disabled" data-bs-toggle="tab" disabled></span>',
771+
' <span id="tab2" class="nav-link" data-bs-toggle="tab"></span>',
772+
' <span id="tab3" class="nav-link" data-bs-toggle="tab"></span>',
773+
'</div>'
774+
].join('')
775+
776+
const tabEl1 = fixtureEl.querySelector('#tab1')
777+
const tabEl2 = fixtureEl.querySelector('#tab2')
778+
const tabEl3 = fixtureEl.querySelector('#tab3')
779+
const tab3 = new Tab(tabEl3)
780+
781+
tab3.show()
782+
783+
const spyShown1 = jasmine.createSpy()
784+
const spyShown2 = jasmine.createSpy()
785+
tabEl1.addEventListener('shown.bs.tab', spyShown1)
786+
tabEl2.addEventListener('shown.bs.tab', spyShown2)
787+
788+
const keydown = createEvent('keydown')
789+
keydown.key = 'Home'
790+
791+
tabEl3.dispatchEvent(keydown)
792+
793+
expect(spyShown1).not.toHaveBeenCalled()
794+
expect(spyShown2).toHaveBeenCalled()
795+
})
796+
797+
it('if keydown event is End and last element is disabled', () => {
798+
fixtureEl.innerHTML = [
799+
'<div class="nav">',
800+
' <span id="tab1" class="nav-link" data-bs-toggle="tab"></span>',
801+
' <span id="tab2" class="nav-link" data-bs-toggle="tab"></span>',
802+
' <span id="tab3" class="nav-link" data-bs-toggle="tab" disabled></span>',
803+
'</div>'
804+
].join('')
805+
806+
const tabEl1 = fixtureEl.querySelector('#tab1')
807+
const tabEl2 = fixtureEl.querySelector('#tab2')
808+
const tabEl3 = fixtureEl.querySelector('#tab3')
809+
const tab1 = new Tab(tabEl1)
810+
811+
tab1.show()
812+
813+
const spyShown2 = jasmine.createSpy()
814+
const spyShown3 = jasmine.createSpy()
815+
tabEl2.addEventListener('shown.bs.tab', spyShown2)
816+
tabEl3.addEventListener('shown.bs.tab', spyShown3)
817+
818+
const keydown = createEvent('keydown')
819+
keydown.key = 'End'
820+
821+
tabEl1.dispatchEvent(keydown)
822+
823+
expect(spyShown3).not.toHaveBeenCalled()
824+
expect(spyShown2).toHaveBeenCalled()
825+
})
714826
})
715827

716828
describe('jQueryInterface', () => {

js/tests/visual/tab.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,12 @@ <h4>Tabs with fade (no initially active pane)</h4>
161161

162162
<h4>Tabs with nav and using links (with fade)</h4>
163163
<nav>
164-
<div class="nav nav-pills" id="nav-tab" role="tablist">
164+
<div class="nav nav-pills" id="nav-tab" role="tablist">
165165
<a class="nav-link nav-item active" role="tab" data-bs-toggle="tab" href="#home5">Home</a>
166166
<a class="nav-link nav-item" role="tab" data-bs-toggle="tab" href="#profile5">Profile</a>
167167
<a class="nav-link nav-item" role="tab" data-bs-toggle="tab" href="#fat5">@fat</a>
168168
<a class="nav-link nav-item" role="tab" data-bs-toggle="tab" href="#mdo5">@mdo</a>
169-
<a class="nav-link nav-item disabled" role="tab" href="#">Disabled</a>
169+
<a class="nav-link nav-item disabled" role="tab" href="#" aria-disabled="true">Disabled</a>
170170
</div>
171171
</nav>
172172

0 commit comments

Comments
 (0)