import { beVisible, haveClasses, haveFocus, html, notBeVisible, notHaveClasses, test } from '../../../utils' test('can use tabs to toggle panels', [html` <div x-data x-tabs> <div x-tabs:list> <button x-tabs:tab button-1>First</button> <button x-tabs:tab button-2>Second</button> </div> <div x-tabs:panels> <div x-tabs:panel panel-1>First Panel</div> <div x-tabs:panel panel-2>Second Panel</div> </div> </div> `], ({ get }) => { get('[panel-1]').should(beVisible()) get('[panel-2]').should(notBeVisible()) get('[button-2]').click() get('[panel-1]').should(notBeVisible()) get('[panel-2]').should(beVisible()) }, ) test('can use arrow keys to cycle through tabs', [html` <div x-data x-tabs> <div x-tabs:list> <button x-tabs:tab button-1>First</button> <button x-tabs:tab button-2>Second</button> </div> <div x-tabs:panels> <div x-tabs:panel panel-1>First Panel</div> <div x-tabs:panel panel-2>Second Panel</div> </div> </div> `], ({ get }) => { get('[panel-1]').should(beVisible()) get('[panel-2]').should(notBeVisible()) get('[button-2]').click() get('[button-2]').should(haveFocus()) get('[panel-1]').should(notBeVisible()) get('[panel-2]').should(beVisible()) get('[button-2]').type('{rightArrow}') get('[button-1]').should(haveFocus()) get('[panel-1]').should(beVisible()) get('[panel-2]').should(notBeVisible()) get('[button-1]').type('{rightArrow}') get('[button-2]').should(haveFocus()) get('[panel-1]').should(notBeVisible()) get('[panel-2]').should(beVisible()) }, ) test('cant tab through tabs, can only use arrows', [html` <div> <button button-1>first focusable</button> <div x-data x-tabs> <div x-tabs:list> <button x-tabs:tab button-2>First</button> <button x-tabs:tab button-3>Second</button> </div> <div x-tabs:panels> <div x-tabs:panel panel-1>First Panel</div> <div x-tabs:panel panel-2>Second Panel</div> </div> </div> <button button-4>first focusable</button> </div> `], ({ get }) => { get('[button-1]').click() get('[button-1]').should(haveFocus()) get('[button-1]').tab() get('[button-2]').should(haveFocus()) get('[button-2]').tab() get('[panel-1]').should(haveFocus()) get('[panel-1]').tab() get('[button-4]').should(haveFocus()) }, ) test('can detect the selected tab & panel', [html` <div x-data x-tabs> <div x-tabs:list> <button x-tabs:tab button-1 :class="$tab.isSelected && 'active'">First</button> <button x-tabs:tab button-2 :class="$tab.isSelected && 'active'">Second</button> </div> <div x-tabs:panels> <div x-tabs:panel panel-1 :class="$panel.isSelected && 'active'">First Panel</div> <div x-tabs:panel panel-2 :class="$panel.isSelected && 'active'">Second Panel</div> </div> </div> `], ({ get }) => { get('[panel-1]').should(beVisible()) get('[panel-2]').should(notBeVisible()) get('[button-1]').should(haveClasses(['active'])) get('[panel-1]').should(haveClasses(['active'])) get('[button-2]').should(notHaveClasses(['active'])) get('[panel-2]').should(notHaveClasses(['active'])) get('[button-2]').click() get('[button-1]').should(notHaveClasses(['active'])) get('[panel-1]').should(notHaveClasses(['active'])) get('[button-2]').should(haveClasses(['active'])) get('[panel-2]').should(haveClasses(['active'])) get('[panel-1]').should(notBeVisible()) get('[panel-2]').should(beVisible()) }, ) test('can disable a tab', [html` <div x-data x-tabs> <div x-tabs:list> <button x-tabs:tab button-1>First</button> <button x-tabs:tab button-2 disabled :class="$tab.isDisabled && 'disabled'">Second</button> <button x-tabs:tab button-3>Third</button> </div> <div x-tabs:panels> <div x-tabs:panel panel-1>First Panel</div> <div x-tabs:panel panel-2>Second Panel</div> <div x-tabs:panel panel-3>Third Panel</div> </div> </div> `], ({ get }) => { get('[button-2]').should(haveClasses(['disabled'])) get('[button-1]').click() get('[button-1]').should(haveFocus()) get('[panel-1]').should(beVisible()) get('[panel-2]').should(notBeVisible()) get('[button-1]').type('{rightArrow}') get('[panel-1]').should(notBeVisible()) get('[panel-3]').should(beVisible()) get('[button-3]').type('{rightArrow}') get('[panel-3]').should(notBeVisible()) get('[panel-1]').should(beVisible()) }, ) test('can traverse tabs manually', [html` <div x-data x-tabs manual> <div x-tabs:list> <button x-tabs:tab button-1>First</button> <button x-tabs:tab button-2>Second</button> </div> <div x-tabs:panels> <div x-tabs:panel panel-1>First Panel</div> <div x-tabs:panel panel-2>Second Panel</div> </div> </div> `], ({ get }) => { get('[button-1]').click() get('[button-1]').should(haveFocus()) get('[panel-1]').should(beVisible()) get('[panel-2]').should(notBeVisible()) get('[button-1]').type('{rightArrow}') get('[button-2]').should(haveFocus()) get('[panel-1]').should(beVisible()) get('[panel-2]').should(notBeVisible()) get('[button-2]').click() get('[panel-1]').should(notBeVisible()) get('[panel-2]').should(beVisible()) }, ) test('can set a default index', [html` <div x-data x-tabs default-index="1"> <div x-tabs:list> <button x-tabs:tab button-1>First</button> <button x-tabs:tab button-2>Second</button> </div> <div x-tabs:panels> <div x-tabs:panel panel-1>First Panel</div> <div x-tabs:panel panel-2>Second Panel</div> </div> </div> `], ({ get }) => { get('[panel-1]').should(notBeVisible()) get('[panel-2]').should(beVisible()) }, ) test('can programmatically control the selected tab', [html` <div x-data="{ selectedIndex: 1 }"> <button @click="selectedIndex = selectedIndex ? 0 : 1" button-toggle>Toggle tabs</button> <div x-tabs x-model="selectedIndex"> <div x-tabs:list> <button x-tabs:tab button-1>First</button> <button x-tabs:tab button-2>Second</button> </div> <div x-tabs:panels> <div x-tabs:panel panel-1>First Panel</div> <div x-tabs:panel panel-2>Second Panel</div> </div> </div> </div> `], ({ get }) => { get('[panel-1]').should(notBeVisible()) get('[panel-2]').should(beVisible()) get('[button-toggle]').click() get('[panel-2]').should(notBeVisible()) get('[panel-1]').should(beVisible()) get('[button-toggle]').click() get('[panel-1]').should(notBeVisible()) get('[panel-2]').should(beVisible()) }, )