@statistikzh/leu 0.28.1 → 0.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Accordion-CwkI7sfx.js → Accordion-CaDTUDJG.js} +1 -1
- package/dist/Accordion.js +2 -2
- package/dist/{Button-D1aYnunQ.js → Button-BF3_6xgs.js} +3 -3
- package/dist/Button.js +4 -4
- package/dist/{ButtonGroup-CqThYjzX.js → ButtonGroup-grJiWGHI.js} +2 -2
- package/dist/ButtonGroup.js +5 -5
- package/dist/{ChartWrapper-BjVT4x-H.js → ChartWrapper-CeolXijF.js} +2 -2
- package/dist/ChartWrapper.js +3 -3
- package/dist/{Checkbox-HxYqp2w4.js → Checkbox-DGUZ1XtB.js} +2 -2
- package/dist/Checkbox.js +3 -3
- package/dist/{CheckboxGroup-DYws2rwt.js → CheckboxGroup-CGdyk_RP.js} +2 -2
- package/dist/CheckboxGroup.js +4 -4
- package/dist/{Chip-gKxD6IaZ.js → Chip-BpKH3_Nk.js} +1 -1
- package/dist/Chip.js +2 -2
- package/dist/{ChipGroup-ZvBzX_wd.js → ChipGroup-dSAMpfy1.js} +1 -1
- package/dist/ChipGroup.js +3 -3
- package/dist/ChipLink.js +2 -2
- package/dist/ChipRemovable.js +3 -3
- package/dist/ChipSelectable.js +2 -2
- package/dist/{Dialog-BYpzTprV.js → Dialog-CC674l80.js} +2 -2
- package/dist/Dialog.js +3 -3
- package/dist/{Dropdown-C4CgE4E-.js → Dropdown-B9YTM5N_.js} +5 -5
- package/dist/Dropdown.d.ts +2 -2
- package/dist/Dropdown.js +8 -8
- package/dist/{FileInput-nsnSQCaU.js → FileInput-D4kyWFkL.js} +4 -4
- package/dist/FileInput.js +6 -6
- package/dist/{Icon-D8HTPEFH.js → Icon-DOcb_NlX.js} +1 -1
- package/dist/Icon.js +2 -2
- package/dist/{Input-OrILqlax.js → Input-6Xu1N2sA.js} +2 -2
- package/dist/Input.js +3 -3
- package/dist/{LeuElement-C_lcHzQI.js → LeuElement-C3HedxlQ.js} +1 -1
- package/dist/{Menu-CFLCnI34.js → Menu-CJtyuUvP.js} +2 -2
- package/dist/{Menu-Z2b7dsB5.d.ts → Menu-txbYINTW.d.ts} +1 -1
- package/dist/Menu.d.ts +1 -1
- package/dist/Menu.js +4 -4
- package/dist/{MenuItem-LY4TRIho.d.ts → MenuItem-9TTOrL0Z.d.ts} +1 -1
- package/dist/{MenuItem-ICjLCGim.js → MenuItem-ClSE3auh.js} +2 -2
- package/dist/MenuItem.d.ts +1 -1
- package/dist/MenuItem.js +3 -3
- package/dist/{Message-Dw5D_0i1.js → Message-C55ydBaU.js} +2 -2
- package/dist/Message.js +3 -3
- package/dist/{Pagination-D1tP5FrM.js → Pagination-BVwKLcd5.js} +4 -4
- package/dist/Pagination.js +6 -6
- package/dist/{Placeholder-CnGzCZ5-.js → Placeholder-DFNppiVf.js} +1 -1
- package/dist/Placeholder.js +2 -2
- package/dist/{Popup-BiN_tZDN.js → Popup-D91ZiFWh.js} +1 -1
- package/dist/Popup.js +2 -2
- package/dist/{ProgressBar-BfJo_KyU.js → ProgressBar-DQGO2we8.js} +1 -1
- package/dist/ProgressBar.js +2 -2
- package/dist/{Radio-CV7vuQUj.js → Radio-BetZNoUQ.js} +1 -1
- package/dist/Radio.js +2 -2
- package/dist/{RadioGroup-C3XWSScc.js → RadioGroup-DzW5z_SD.js} +2 -2
- package/dist/RadioGroup.js +3 -3
- package/dist/{Range-C8RVrIM9.js → Range-9ijUzrty.js} +1 -1
- package/dist/Range.js +2 -2
- package/dist/{ScrollTop-B_TJ_k4m.js → ScrollTop-uDL4K_C6.js} +3 -3
- package/dist/ScrollTop.js +5 -5
- package/dist/{Select-CbPTrL3G.js → Select-ClGNTYfp.js} +7 -7
- package/dist/Select.d.ts +2 -2
- package/dist/Select.js +9 -9
- package/dist/{Spinner-ChKJQJTN.js → Spinner-B7ikVfUZ.js} +1 -1
- package/dist/Spinner.js +2 -2
- package/dist/{Tab-BJbzY1xd.js → Tab-CSHR71IX.js} +1 -1
- package/dist/Tab.js +2 -2
- package/dist/{TabGroup-BIaCHrKR.js → TabGroup-D7YbKXm8.js} +3 -3
- package/dist/TabGroup.js +4 -4
- package/dist/{TabPanel-CTyw410b.js → TabPanel-D_RHF3lv.js} +1 -1
- package/dist/TabPanel.js +2 -2
- package/dist/{Table-D3QmePJd.js → Table-CdosaNFb.js} +3 -3
- package/dist/Table.js +7 -7
- package/dist/{Tag-nUnWtHYy.js → Tag-BQBgkkAs.js} +1 -1
- package/dist/Tag.js +2 -2
- package/dist/{VisuallyHidden-DF2q9pTa.js → VisuallyHidden-CEBTA6hv.js} +1 -1
- package/dist/VisuallyHidden.js +2 -2
- package/dist/custom-elements.json +6445 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +30 -30
- package/dist/leu-accordion.js +2 -2
- package/dist/leu-button-group.js +5 -5
- package/dist/leu-button.js +4 -4
- package/dist/leu-chart-wrapper.js +3 -3
- package/dist/leu-checkbox-group.js +4 -4
- package/dist/leu-checkbox.js +3 -3
- package/dist/leu-chip-group.js +3 -3
- package/dist/leu-chip-link.js +2 -2
- package/dist/leu-chip-removable.js +3 -3
- package/dist/leu-chip-selectable.js +2 -2
- package/dist/leu-dialog.js +3 -3
- package/dist/leu-dropdown.js +8 -8
- package/dist/leu-file-input.js +6 -6
- package/dist/leu-icon.js +2 -2
- package/dist/leu-input.js +3 -3
- package/dist/leu-menu-item.d.ts +1 -1
- package/dist/leu-menu-item.js +3 -3
- package/dist/leu-menu.d.ts +1 -1
- package/dist/leu-menu.js +4 -4
- package/dist/leu-message.js +3 -3
- package/dist/leu-pagination.js +6 -6
- package/dist/leu-placeholder.js +2 -2
- package/dist/leu-popup.js +2 -2
- package/dist/leu-progress-bar.js +2 -2
- package/dist/leu-radio-group.js +3 -3
- package/dist/leu-radio.js +2 -2
- package/dist/leu-range.js +2 -2
- package/dist/leu-scroll-top.js +5 -5
- package/dist/leu-select.js +9 -9
- package/dist/leu-spinner.js +2 -2
- package/dist/leu-tab-group.js +4 -4
- package/dist/leu-tab-panel.js +2 -2
- package/dist/leu-tab.js +2 -2
- package/dist/leu-table.js +7 -7
- package/dist/leu-tag.js +2 -2
- package/dist/leu-visually-hidden.js +2 -2
- package/dist/vscode.html-custom-data.json +11 -11
- package/dist/vue/index.d.ts +20 -20
- package/dist/web-types.json +28 -28
- package/package.json +4 -1
- package/.editorconfig +0 -29
- package/.github/workflows/ci.yml +0 -81
- package/.github/workflows/deploy-github-pages.yaml +0 -34
- package/.github/workflows/publish.yml +0 -28
- package/.github/workflows/release-please.yml +0 -19
- package/.husky/commit-msg +0 -1
- package/.husky/pre-commit +0 -1
- package/.nvmrc +0 -1
- package/.prettierignore +0 -2
- package/.release-please-manifest.json +0 -3
- package/.storybook/main.ts +0 -34
- package/.storybook/manager-head.html +0 -1
- package/.storybook/manager.ts +0 -6
- package/.storybook/preview.ts +0 -96
- package/.storybook/static/fonts/Inter-Black.woff2 +0 -0
- package/.storybook/static/fonts/Inter-Regular.woff2 +0 -0
- package/.storybook/static/fonts.css +0 -11
- package/.storybook/static/global.css +0 -5
- package/.storybook/static/logo.svg +0 -19
- package/.storybook/theme.ts +0 -8
- package/AGENTS.md +0 -162
- package/CHANGELOG.md +0 -601
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -42
- package/commitlint.config.cjs +0 -1
- package/custom-elements-manifest.config.js +0 -46
- package/eslint.config.mjs +0 -79
- package/postcss.config.cjs +0 -16
- package/release-please-config.json +0 -9
- package/scripts/generate-component/generate.js +0 -167
- package/scripts/generate-component/templates/[Name].ts +0 -31
- package/scripts/generate-component/templates/[name].css +0 -6
- package/scripts/generate-component/templates/[namespace]-[name].ts +0 -11
- package/scripts/generate-component/templates/stories/[name].stories.ts +0 -26
- package/scripts/generate-component/templates/test/[name].test.ts +0 -23
- package/scripts/postcss-leu-font-styles.cjs +0 -154
- package/src/components/accordion/Accordion.ts +0 -108
- package/src/components/accordion/accordion.css +0 -150
- package/src/components/accordion/leu-accordion.ts +0 -11
- package/src/components/accordion/stories/accordion.stories.ts +0 -62
- package/src/components/accordion/test/accordion.test.ts +0 -118
- package/src/components/button/Button.ts +0 -286
- package/src/components/button/button.css +0 -317
- package/src/components/button/leu-button.ts +0 -11
- package/src/components/button/stories/button.stories.ts +0 -366
- package/src/components/button/test/button.test.ts +0 -417
- package/src/components/button-group/ButtonGroup.ts +0 -97
- package/src/components/button-group/button-group.css +0 -5
- package/src/components/button-group/leu-button-group.ts +0 -11
- package/src/components/button-group/stories/button-group.stories.ts +0 -54
- package/src/components/button-group/test/button-group.test.ts +0 -105
- package/src/components/chart-wrapper/ChartWrapper.ts +0 -78
- package/src/components/chart-wrapper/chart-wrapper.css +0 -87
- package/src/components/chart-wrapper/leu-chart-wrapper.ts +0 -11
- package/src/components/chart-wrapper/stories/chart-wrapper.stories.ts +0 -58
- package/src/components/chart-wrapper/test/chart-wrapper.test.ts +0 -77
- package/src/components/checkbox/Checkbox.ts +0 -129
- package/src/components/checkbox/CheckboxGroup.ts +0 -57
- package/src/components/checkbox/checkbox-group.css +0 -29
- package/src/components/checkbox/checkbox.css +0 -81
- package/src/components/checkbox/leu-checkbox-group.ts +0 -11
- package/src/components/checkbox/leu-checkbox.ts +0 -11
- package/src/components/checkbox/stories/checkbox-group.stories.ts +0 -59
- package/src/components/checkbox/stories/checkbox.stories.ts +0 -72
- package/src/components/checkbox/test/checkbox-group.test.ts +0 -109
- package/src/components/checkbox/test/checkbox.test.ts +0 -247
- package/src/components/chip/Chip.ts +0 -19
- package/src/components/chip/ChipGroup.ts +0 -122
- package/src/components/chip/ChipLink.ts +0 -24
- package/src/components/chip/ChipRemovable.ts +0 -45
- package/src/components/chip/ChipSelectable.ts +0 -80
- package/src/components/chip/chip-group.css +0 -15
- package/src/components/chip/chip.css +0 -139
- package/src/components/chip/exports.ts +0 -4
- package/src/components/chip/leu-chip-group.ts +0 -11
- package/src/components/chip/leu-chip-link.ts +0 -11
- package/src/components/chip/leu-chip-removable.ts +0 -11
- package/src/components/chip/leu-chip-selectable.ts +0 -11
- package/src/components/chip/stories/chip-group.stories.ts +0 -159
- package/src/components/chip/stories/chip-link.stories.ts +0 -45
- package/src/components/chip/stories/chip-removable.stories.ts +0 -42
- package/src/components/chip/stories/chip-selectable.stories.ts +0 -54
- package/src/components/chip/test/chip-group.test.ts +0 -171
- package/src/components/chip/test/chip-link.test.ts +0 -54
- package/src/components/chip/test/chip-removable.test.ts +0 -105
- package/src/components/chip/test/chip-selectable.test.ts +0 -101
- package/src/components/chip/test/chip.test.ts +0 -22
- package/src/components/dialog/Dialog.ts +0 -86
- package/src/components/dialog/dialog.css +0 -157
- package/src/components/dialog/leu-dialog.ts +0 -11
- package/src/components/dialog/stories/dialog.stories.ts +0 -142
- package/src/components/dialog/test/dialog.test.ts +0 -85
- package/src/components/dropdown/Dropdown.ts +0 -152
- package/src/components/dropdown/dropdown.css +0 -16
- package/src/components/dropdown/leu-dropdown.ts +0 -11
- package/src/components/dropdown/stories/dropdown.stories.ts +0 -58
- package/src/components/dropdown/test/dropdown.test.ts +0 -59
- package/src/components/file-input/FileInput.ts +0 -324
- package/src/components/file-input/file-input.css +0 -118
- package/src/components/file-input/leu-file-input.ts +0 -11
- package/src/components/file-input/stories/file-input.stories.ts +0 -45
- package/src/components/file-input/test/file-input.test.ts +0 -62
- package/src/components/icon/Icon.ts +0 -47
- package/src/components/icon/icon.css +0 -10
- package/src/components/icon/leu-icon.ts +0 -11
- package/src/components/icon/paths.ts +0 -219
- package/src/components/icon/stories/icon.stories.ts +0 -79
- package/src/components/icon/test/icon.test.ts +0 -50
- package/src/components/input/Input.ts +0 -469
- package/src/components/input/input.css +0 -238
- package/src/components/input/leu-input.ts +0 -11
- package/src/components/input/stories/input.stories.ts +0 -204
- package/src/components/input/test/input.test.ts +0 -603
- package/src/components/menu/Menu.ts +0 -149
- package/src/components/menu/MenuItem.ts +0 -168
- package/src/components/menu/leu-menu-item.ts +0 -11
- package/src/components/menu/leu-menu.ts +0 -11
- package/src/components/menu/menu-item.css +0 -77
- package/src/components/menu/menu.css +0 -19
- package/src/components/menu/stories/menu-item.stories.ts +0 -81
- package/src/components/menu/stories/menu.stories.ts +0 -54
- package/src/components/menu/test/menu-item.test.ts +0 -210
- package/src/components/menu/test/menu.test.ts +0 -125
- package/src/components/message/Message.ts +0 -118
- package/src/components/message/leu-message.ts +0 -11
- package/src/components/message/message.css +0 -163
- package/src/components/message/stories/message.mdx +0 -76
- package/src/components/message/stories/message.stories.ts +0 -149
- package/src/components/message/test/message.test.ts +0 -96
- package/src/components/pagination/Pagination.ts +0 -192
- package/src/components/pagination/leu-pagination.ts +0 -11
- package/src/components/pagination/pagination.css +0 -54
- package/src/components/pagination/stories/pagination.stories.ts +0 -115
- package/src/components/pagination/test/pagination.test.ts +0 -210
- package/src/components/placeholder/Placeholder.ts +0 -33
- package/src/components/placeholder/leu-placeholder.ts +0 -11
- package/src/components/placeholder/placeholder.css +0 -59
- package/src/components/placeholder/stories/placeholder.stories.ts +0 -34
- package/src/components/placeholder/test/placeholder.test.ts +0 -31
- package/src/components/popup/Popup.ts +0 -264
- package/src/components/popup/leu-popup.ts +0 -11
- package/src/components/popup/popup.css +0 -24
- package/src/components/popup/stories/popup.stories.ts +0 -117
- package/src/components/popup/test/popup.test.ts +0 -90
- package/src/components/progress-bar/ProgressBar.ts +0 -52
- package/src/components/progress-bar/leu-progress-bar.ts +0 -11
- package/src/components/progress-bar/progress-bar.css +0 -97
- package/src/components/progress-bar/stories/progress-bar.stories.ts +0 -39
- package/src/components/progress-bar/test/progress-bar.test.ts +0 -61
- package/src/components/radio/Radio.ts +0 -59
- package/src/components/radio/RadioGroup.ts +0 -181
- package/src/components/radio/leu-radio-group.ts +0 -11
- package/src/components/radio/leu-radio.ts +0 -11
- package/src/components/radio/radio-group.css +0 -29
- package/src/components/radio/radio.css +0 -76
- package/src/components/radio/stories/radio-group.stories.ts +0 -54
- package/src/components/radio/stories/radio.stories.ts +0 -55
- package/src/components/radio/test/radio-group.test.ts +0 -83
- package/src/components/radio/test/radio.test.ts +0 -119
- package/src/components/range/Range.ts +0 -400
- package/src/components/range/leu-range.ts +0 -11
- package/src/components/range/range.css +0 -227
- package/src/components/range/stories/range.stories.ts +0 -185
- package/src/components/range/test/range.test.ts +0 -228
- package/src/components/scroll-top/ScrollTop.ts +0 -91
- package/src/components/scroll-top/leu-scroll-top.ts +0 -11
- package/src/components/scroll-top/scroll-top.css +0 -50
- package/src/components/scroll-top/stories/scroll-top.stories.ts +0 -217
- package/src/components/scroll-top/test/scroll-top.test.ts +0 -22
- package/src/components/select/Select.ts +0 -570
- package/src/components/select/leu-select.ts +0 -11
- package/src/components/select/select.css +0 -222
- package/src/components/select/stories/select.stories.ts +0 -173
- package/src/components/select/test/fixtures.ts +0 -162
- package/src/components/select/test/select.test.ts +0 -937
- package/src/components/spinner/Spinner.ts +0 -31
- package/src/components/spinner/leu-spinner.ts +0 -11
- package/src/components/spinner/spinner.css +0 -20
- package/src/components/spinner/stories/spinner.stories.ts +0 -29
- package/src/components/spinner/test/spinner.test.ts +0 -30
- package/src/components/tab/Tab.ts +0 -72
- package/src/components/tab/TabGroup.ts +0 -267
- package/src/components/tab/TabPanel.ts +0 -59
- package/src/components/tab/leu-tab-group.ts +0 -11
- package/src/components/tab/leu-tab-panel.ts +0 -11
- package/src/components/tab/leu-tab.ts +0 -11
- package/src/components/tab/stories/tab.stories.ts +0 -97
- package/src/components/tab/tab-group.css +0 -63
- package/src/components/tab/tab-panel.css +0 -10
- package/src/components/tab/tab.css +0 -54
- package/src/components/tab/test/tab-group.test.ts +0 -426
- package/src/components/tab/test/tab-panel.test.ts +0 -102
- package/src/components/tab/test/tab.test.ts +0 -139
- package/src/components/table/Table.ts +0 -253
- package/src/components/table/leu-table.ts +0 -11
- package/src/components/table/stories/table.stories.ts +0 -131
- package/src/components/table/table.css +0 -112
- package/src/components/table/test/table.test.ts +0 -37
- package/src/components/tag/Tag.ts +0 -28
- package/src/components/tag/leu-tag.ts +0 -11
- package/src/components/tag/stories/tag.stories.ts +0 -107
- package/src/components/tag/tag.css +0 -42
- package/src/components/tag/test/tag.test.ts +0 -28
- package/src/components/visually-hidden/VisuallyHidden.ts +0 -16
- package/src/components/visually-hidden/leu-visually-hidden.ts +0 -11
- package/src/components/visually-hidden/stories/visually-hidden.stories.ts +0 -22
- package/src/components/visually-hidden/test/visually-hidden.test.ts +0 -34
- package/src/components/visually-hidden/visually-hidden.css +0 -10
- package/src/docs/contributing.mdx +0 -154
- package/src/docs/installation.mdx +0 -35
- package/src/docs/theme.mdx +0 -400
- package/src/docs/usage.mdx +0 -73
- package/src/global.d.ts +0 -11
- package/src/index.ts +0 -29
- package/src/lib/LeuElement.ts +0 -43
- package/src/lib/a11y.ts +0 -26
- package/src/lib/hasSlotController.ts +0 -74
- package/src/lib/mixins/FormAssociatedMixin.ts +0 -115
- package/src/lib/styleMap.ts +0 -139
- package/src/lib/utils.ts +0 -45
- package/src/styles/common-styles.css +0 -14
- package/src/styles/custom-media.css +0 -6
- package/src/styles/font-definitions.json +0 -210
- package/src/styles/style.stories.ts +0 -64
- package/src/styles/theme.css +0 -90
- package/stat_zh.png +0 -0
- package/stylelint.config.mjs +0 -23
- package/tsconfig.build.json +0 -24
- package/tsconfig.json +0 -14
- package/tsdown.config.ts +0 -35
- package/web-test-runner.config.mjs +0 -102
|
@@ -1,417 +0,0 @@
|
|
|
1
|
-
import { html } from "lit"
|
|
2
|
-
import { fixture, expect, elementUpdated, oneEvent } from "@open-wc/testing"
|
|
3
|
-
|
|
4
|
-
import "../leu-button.js"
|
|
5
|
-
import type { LeuButton } from "../leu-button.js"
|
|
6
|
-
import "../../icon/leu-icon.js"
|
|
7
|
-
|
|
8
|
-
async function defaultFixture() {
|
|
9
|
-
return fixture<LeuButton>(html` <leu-button>button</leu-button>`)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
describe("LeuButton", () => {
|
|
13
|
-
it("is a defined element", async () => {
|
|
14
|
-
const el = customElements.get("leu-button")
|
|
15
|
-
|
|
16
|
-
await expect(el).not.to.be.undefined
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
it("passes the a11y audit", async () => {
|
|
20
|
-
const el = await defaultFixture()
|
|
21
|
-
|
|
22
|
-
await expect(el).shadowDom.to.be.accessible()
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it("passes the a11y audit with no visible text", async () => {
|
|
26
|
-
const el = await fixture(
|
|
27
|
-
html` <leu-button label="sichern">
|
|
28
|
-
<leu-icon name="download"></leu-icon>
|
|
29
|
-
</leu-button>`,
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
await expect(el).shadowDom.to.be.accessible()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it("passes the a11y audit when rendered as link", async () => {
|
|
36
|
-
const el = await fixture(
|
|
37
|
-
html` <leu-button href="https://datenkatalog.statistik.zh.ch/"
|
|
38
|
-
>Link</leu-button
|
|
39
|
-
>`,
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
await expect(el).shadowDom.to.be.accessible()
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it("renders the label", async () => {
|
|
46
|
-
const el = await fixture(html` <leu-button>Sichern</leu-button>`)
|
|
47
|
-
|
|
48
|
-
expect(el).to.have.trimmed.text("Sichern")
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it("sets the aria-label attribute", async () => {
|
|
52
|
-
const el = await fixture(
|
|
53
|
-
html` <leu-button label="Dokument herunterladen"
|
|
54
|
-
><leu-icon name="download"></leu-icon
|
|
55
|
-
></leu-button>`,
|
|
56
|
-
)
|
|
57
|
-
const button = el.shadowRoot.querySelector("button")
|
|
58
|
-
|
|
59
|
-
expect(button).to.have.attribute("aria-label", "Dokument herunterladen")
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it("renders the icon slots at the correct position", async () => {
|
|
63
|
-
const el = await fixture(
|
|
64
|
-
html` <leu-button
|
|
65
|
-
><leu-icon name="addNew" slot="before"></leu-icon>Sichern</leu-button
|
|
66
|
-
>`,
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
const button = el.shadowRoot.querySelector("button")
|
|
70
|
-
|
|
71
|
-
expect(button).dom.to.equal(
|
|
72
|
-
"<button><div><slot name='before'></slot></div><span><slot></slot></span><div><slot name='after'></slot></div></button>",
|
|
73
|
-
{ ignoreAttributes: ["class", "type"] },
|
|
74
|
-
)
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
it("renders the expanded icon only when the variant is ghost", async () => {
|
|
78
|
-
const el = await fixture<LeuButton>(
|
|
79
|
-
html` <leu-button variant="ghost" expanded="true"
|
|
80
|
-
><leu-icon name="addNew" slot="before"></leu-icon>Sichern</leu-button
|
|
81
|
-
>`,
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
const button = el.shadowRoot.querySelector("button")
|
|
85
|
-
|
|
86
|
-
expect(button).dom.to.equal(
|
|
87
|
-
"<button aria-expanded='true'><div><slot name='before'></slot></div><span><slot></slot></span><div><slot name='after'></slot></div><div class='icon-expanded'><leu-icon name='angleDropDown' size='24'></leu-icon></div></button>",
|
|
88
|
-
{ ignoreAttributes: ["class", "type"] },
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
el.variant = "primary"
|
|
92
|
-
|
|
93
|
-
await elementUpdated(el)
|
|
94
|
-
|
|
95
|
-
expect(button).dom.to.equal(
|
|
96
|
-
"<button class='primary regular' aria-expanded='true'><div><slot name='before'></slot></div><span><slot></slot></span><div><slot name='after'></slot></div></button>",
|
|
97
|
-
{ ignoreAttributes: ["class", "type"] },
|
|
98
|
-
)
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
it("sets the dissabled attrbiute", async () => {
|
|
102
|
-
const el = await fixture<LeuButton>(
|
|
103
|
-
html` <leu-button variant="ghost" expanded="true" disabled>
|
|
104
|
-
<leu-icon name="addNew" slot="before"></leu-icon>
|
|
105
|
-
Sichern
|
|
106
|
-
</leu-button>`,
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
const button = el.shadowRoot.querySelector("button")
|
|
110
|
-
|
|
111
|
-
expect(button).to.have.attribute("disabled")
|
|
112
|
-
|
|
113
|
-
el.disabled = false
|
|
114
|
-
await elementUpdated(el)
|
|
115
|
-
|
|
116
|
-
expect(button).to.not.have.attribute("disabled")
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it("reflects the role attribute", async () => {
|
|
120
|
-
const el = await fixture<LeuButton>(
|
|
121
|
-
html` <leu-button variant="ghost" componentRole="menuitemradio"
|
|
122
|
-
><leu-icon name="addNew" slot="before"></leu-icon>Sichern</leu-button
|
|
123
|
-
>`,
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
const button = el.shadowRoot.querySelector("button")
|
|
127
|
-
|
|
128
|
-
expect(button).to.have.attribute("role", "menuitemradio")
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
it("sets the either checked or selected attribute depending on the role", async () => {
|
|
132
|
-
const el = await fixture<LeuButton>(
|
|
133
|
-
html` <leu-button variant="ghost" componentRole="menuitemradio" active
|
|
134
|
-
><leu-icon name="addNew" slot="before"></leu-icon>Sichern</leu-button
|
|
135
|
-
>`,
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
const button = el.shadowRoot.querySelector("button")
|
|
139
|
-
|
|
140
|
-
expect(button).to.have.attribute("aria-checked", "true")
|
|
141
|
-
expect(button).to.not.have.attribute("aria-selected")
|
|
142
|
-
|
|
143
|
-
el.componentRole = "tab"
|
|
144
|
-
|
|
145
|
-
await elementUpdated(el)
|
|
146
|
-
|
|
147
|
-
expect(button).to.have.attribute("aria-selected", "true")
|
|
148
|
-
expect(button).to.not.have.attribute("aria-checked")
|
|
149
|
-
|
|
150
|
-
el.componentRole = "checkbox"
|
|
151
|
-
el.active = false
|
|
152
|
-
|
|
153
|
-
await elementUpdated(el)
|
|
154
|
-
|
|
155
|
-
expect(button).to.have.attribute("aria-checked", "false")
|
|
156
|
-
expect(button).to.not.have.attribute("aria-selected")
|
|
157
|
-
|
|
158
|
-
el.componentRole = undefined
|
|
159
|
-
el.active = true
|
|
160
|
-
|
|
161
|
-
await elementUpdated(el)
|
|
162
|
-
|
|
163
|
-
expect(button).to.not.have.attribute("aria-checked")
|
|
164
|
-
expect(button).to.not.have.attribute("aria-selected")
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
it("dispatches the click event", async () => {
|
|
168
|
-
const button = await fixture<LeuButton>(
|
|
169
|
-
html` <leu-button>Sichern</leu-button>`,
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
setTimeout(() => button.click())
|
|
173
|
-
|
|
174
|
-
const event = await oneEvent(button, "click")
|
|
175
|
-
|
|
176
|
-
expect(event).to.exist
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
it("disables the button when loading", async () => {
|
|
180
|
-
const el = await fixture<LeuButton>(
|
|
181
|
-
html` <leu-button loading>Sichern</leu-button>`,
|
|
182
|
-
)
|
|
183
|
-
|
|
184
|
-
const button = el.shadowRoot.querySelector("button")
|
|
185
|
-
|
|
186
|
-
expect(button).to.have.attribute("disabled")
|
|
187
|
-
})
|
|
188
|
-
|
|
189
|
-
it("doesn't dispatch click events when loading", async () => {
|
|
190
|
-
const button = await fixture<LeuButton>(
|
|
191
|
-
html` <leu-button loading>Sichern</leu-button>`,
|
|
192
|
-
)
|
|
193
|
-
|
|
194
|
-
let clicked = false
|
|
195
|
-
|
|
196
|
-
button.addEventListener("click", () => {
|
|
197
|
-
clicked = true
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
button.click()
|
|
201
|
-
|
|
202
|
-
expect(clicked).to.be.false
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
it("renders as an anchor when href is set", async () => {
|
|
206
|
-
const el = await fixture(
|
|
207
|
-
html` <leu-button
|
|
208
|
-
href="https://datenkatalog.statistik.zh.ch/"
|
|
209
|
-
target="_blank"
|
|
210
|
-
>Zu den Daten <leu-icon name="link" slot="before"></leu-icon
|
|
211
|
-
></leu-button>`,
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
const anchor = el.shadowRoot.querySelector("a")
|
|
215
|
-
|
|
216
|
-
expect(anchor).to.exist
|
|
217
|
-
expect(anchor).to.have.attribute(
|
|
218
|
-
"href",
|
|
219
|
-
"https://datenkatalog.statistik.zh.ch/",
|
|
220
|
-
)
|
|
221
|
-
expect(anchor).to.have.attribute("target", "_blank")
|
|
222
|
-
})
|
|
223
|
-
|
|
224
|
-
it("does not set disabled or type attribute on anchor", async () => {
|
|
225
|
-
const el = await fixture(
|
|
226
|
-
html` <leu-button
|
|
227
|
-
href="https://datenkatalog.statistik.zh.ch/"
|
|
228
|
-
disabled
|
|
229
|
-
type="submit"
|
|
230
|
-
>Zu den Daten <leu-icon name="link" slot="before"></leu-icon
|
|
231
|
-
></leu-button>`,
|
|
232
|
-
)
|
|
233
|
-
|
|
234
|
-
const anchor = el.shadowRoot.querySelector("a")
|
|
235
|
-
|
|
236
|
-
expect(anchor).to.exist
|
|
237
|
-
expect(anchor).to.not.have.attribute("disabled")
|
|
238
|
-
expect(anchor).to.not.have.attribute("type")
|
|
239
|
-
})
|
|
240
|
-
|
|
241
|
-
describe("form association", () => {
|
|
242
|
-
it("submits the form when type is submit", async () => {
|
|
243
|
-
const form = await fixture<HTMLFormElement>(html`
|
|
244
|
-
<form @submit=${(e: Event) => e.preventDefault()}>
|
|
245
|
-
<leu-button type="submit">Submit</leu-button>
|
|
246
|
-
</form>
|
|
247
|
-
`)
|
|
248
|
-
|
|
249
|
-
const button = form.querySelector<LeuButton>("leu-button")
|
|
250
|
-
|
|
251
|
-
setTimeout(() => button.click())
|
|
252
|
-
const event = await oneEvent(form, "submit")
|
|
253
|
-
|
|
254
|
-
expect(event).to.exist
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
it("submits the form with the button name and value", async () => {
|
|
258
|
-
let submittedData: FormData | null = null
|
|
259
|
-
|
|
260
|
-
const form = await fixture<HTMLFormElement>(html`
|
|
261
|
-
<form
|
|
262
|
-
@submit=${(e: SubmitEvent) => {
|
|
263
|
-
e.preventDefault()
|
|
264
|
-
submittedData = new FormData(form, e.submitter)
|
|
265
|
-
}}
|
|
266
|
-
>
|
|
267
|
-
<input type="text" name="field" value="test" />
|
|
268
|
-
<leu-button type="submit" name="action" value="save">Save</leu-button>
|
|
269
|
-
</form>
|
|
270
|
-
`)
|
|
271
|
-
|
|
272
|
-
const button = form.querySelector<LeuButton>("leu-button")
|
|
273
|
-
|
|
274
|
-
setTimeout(() => button.click())
|
|
275
|
-
await oneEvent(form, "submit")
|
|
276
|
-
|
|
277
|
-
expect(submittedData).to.not.be.null
|
|
278
|
-
expect(submittedData.get("action")).to.equal("save")
|
|
279
|
-
expect(submittedData.get("field")).to.equal("test")
|
|
280
|
-
})
|
|
281
|
-
|
|
282
|
-
it("submits an empty string as value when no value attribute is set", async () => {
|
|
283
|
-
let submittedData: FormData | null = null
|
|
284
|
-
|
|
285
|
-
const form = await fixture<HTMLFormElement>(html`
|
|
286
|
-
<form
|
|
287
|
-
@submit=${(e: SubmitEvent) => {
|
|
288
|
-
e.preventDefault()
|
|
289
|
-
submittedData = new FormData(form, e.submitter)
|
|
290
|
-
}}
|
|
291
|
-
>
|
|
292
|
-
<leu-button type="submit" name="action">Submit</leu-button>
|
|
293
|
-
</form>
|
|
294
|
-
`)
|
|
295
|
-
|
|
296
|
-
const button = form.querySelector<LeuButton>("leu-button")
|
|
297
|
-
|
|
298
|
-
setTimeout(() => button.click())
|
|
299
|
-
await oneEvent(form, "submit")
|
|
300
|
-
|
|
301
|
-
expect(submittedData.get("action")).to.equal("")
|
|
302
|
-
})
|
|
303
|
-
|
|
304
|
-
it("resets the form when type is reset", async () => {
|
|
305
|
-
const form = await fixture<HTMLFormElement>(html`
|
|
306
|
-
<form>
|
|
307
|
-
<input type="text" name="field" value="initial" />
|
|
308
|
-
<leu-button type="reset">Reset</leu-button>
|
|
309
|
-
</form>
|
|
310
|
-
`)
|
|
311
|
-
|
|
312
|
-
const input = form.querySelector<HTMLInputElement>("input")
|
|
313
|
-
input.value = "modified"
|
|
314
|
-
expect(input.value).to.equal("modified")
|
|
315
|
-
|
|
316
|
-
const button = form.querySelector<LeuButton>("leu-button")
|
|
317
|
-
button.click()
|
|
318
|
-
|
|
319
|
-
expect(input.value).to.equal("initial")
|
|
320
|
-
})
|
|
321
|
-
|
|
322
|
-
it("does not submit or reset the form when type is button", async () => {
|
|
323
|
-
let submitted = false
|
|
324
|
-
let reset = false
|
|
325
|
-
|
|
326
|
-
const form = await fixture<HTMLFormElement>(html`
|
|
327
|
-
<form
|
|
328
|
-
@submit=${(e: Event) => {
|
|
329
|
-
e.preventDefault()
|
|
330
|
-
submitted = true
|
|
331
|
-
}}
|
|
332
|
-
@reset=${() => {
|
|
333
|
-
reset = true
|
|
334
|
-
}}
|
|
335
|
-
>
|
|
336
|
-
<leu-button type="button">Click</leu-button>
|
|
337
|
-
</form>
|
|
338
|
-
`)
|
|
339
|
-
|
|
340
|
-
const button = form.querySelector<LeuButton>("leu-button")
|
|
341
|
-
button.click()
|
|
342
|
-
|
|
343
|
-
expect(submitted).to.be.false
|
|
344
|
-
expect(reset).to.be.false
|
|
345
|
-
})
|
|
346
|
-
|
|
347
|
-
it("does not submit or reset when the button is not inside a form", async () => {
|
|
348
|
-
const el = await fixture<LeuButton>(
|
|
349
|
-
html`<leu-button type="submit">Submit</leu-button>`,
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
// Should not throw
|
|
353
|
-
el.click()
|
|
354
|
-
})
|
|
355
|
-
|
|
356
|
-
it("does not submit or reset the form when disabled", async () => {
|
|
357
|
-
let submitted = false
|
|
358
|
-
let reset = false
|
|
359
|
-
|
|
360
|
-
const form = await fixture<HTMLFormElement>(html`
|
|
361
|
-
<form
|
|
362
|
-
@submit=${(e: Event) => {
|
|
363
|
-
e.preventDefault()
|
|
364
|
-
submitted = true
|
|
365
|
-
}}
|
|
366
|
-
@reset=${() => {
|
|
367
|
-
reset = true
|
|
368
|
-
}}
|
|
369
|
-
>
|
|
370
|
-
<leu-button type="submit" disabled>Submit</leu-button>
|
|
371
|
-
<leu-button type="reset" disabled>Reset</leu-button>
|
|
372
|
-
</form>
|
|
373
|
-
`)
|
|
374
|
-
|
|
375
|
-
const submitBtn = form.querySelectorAll<LeuButton>("leu-button")[0]
|
|
376
|
-
const resetBtn = form.querySelectorAll<LeuButton>("leu-button")[1]
|
|
377
|
-
|
|
378
|
-
submitBtn.click()
|
|
379
|
-
resetBtn.click()
|
|
380
|
-
|
|
381
|
-
expect(submitted).to.be.false
|
|
382
|
-
expect(reset).to.be.false
|
|
383
|
-
})
|
|
384
|
-
|
|
385
|
-
it("is form associated", async () => {
|
|
386
|
-
const form = await fixture<HTMLFormElement>(html`
|
|
387
|
-
<form>
|
|
388
|
-
<leu-button type="submit" name="btn">Submit</leu-button>
|
|
389
|
-
</form>
|
|
390
|
-
`)
|
|
391
|
-
|
|
392
|
-
const button = form.querySelector<LeuButton>("leu-button")
|
|
393
|
-
|
|
394
|
-
expect(button.form).to.equal(form)
|
|
395
|
-
})
|
|
396
|
-
|
|
397
|
-
it("responds to formDisabledCallback", async () => {
|
|
398
|
-
const form = await fixture<HTMLFormElement>(html`
|
|
399
|
-
<form>
|
|
400
|
-
<fieldset>
|
|
401
|
-
<leu-button type="submit">Submit</leu-button>
|
|
402
|
-
</fieldset>
|
|
403
|
-
</form>
|
|
404
|
-
`)
|
|
405
|
-
|
|
406
|
-
const fieldset = form.querySelector("fieldset")
|
|
407
|
-
const button = form.querySelector<LeuButton>("leu-button")
|
|
408
|
-
|
|
409
|
-
expect(button.disabled).to.be.false
|
|
410
|
-
|
|
411
|
-
fieldset.disabled = true
|
|
412
|
-
await elementUpdated(button)
|
|
413
|
-
|
|
414
|
-
expect(button.disabled).to.be.true
|
|
415
|
-
})
|
|
416
|
-
})
|
|
417
|
-
})
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { html } from "lit"
|
|
2
|
-
|
|
3
|
-
import { LeuElement } from "../../lib/LeuElement.js"
|
|
4
|
-
import { LeuButton } from "../button/Button.js"
|
|
5
|
-
|
|
6
|
-
import styles from "./button-group.css?inline"
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* A radio input-like button group component.
|
|
10
|
-
* It allows only one button to be active at a time.
|
|
11
|
-
* @tagname leu-button-group
|
|
12
|
-
* @slot - Slot for the buttons
|
|
13
|
-
* @fires input - When the value of the group changes by clicking a button
|
|
14
|
-
*/
|
|
15
|
-
export class LeuButtonGroup extends LeuElement {
|
|
16
|
-
static styles = [LeuElement.styles, styles]
|
|
17
|
-
|
|
18
|
-
private _items: LeuButton[] = []
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Retrieves the value or the text content of a given LeuButton element.
|
|
22
|
-
*/
|
|
23
|
-
private static getButtonValue(button: LeuButton) {
|
|
24
|
-
return button.getAttribute("value") ?? button.textContent.trim()
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The value of the currently selected (active) button
|
|
29
|
-
*/
|
|
30
|
-
get value() {
|
|
31
|
-
const activeButton = this._items.find((item) => item.active)
|
|
32
|
-
return activeButton ? LeuButtonGroup.getButtonValue(activeButton) : null
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
set value(newValue) {
|
|
36
|
-
this._items.forEach((item) => {
|
|
37
|
-
item.active = LeuButtonGroup.getButtonValue(item) === newValue
|
|
38
|
-
})
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
private _handleSlotChange() {
|
|
42
|
-
/**
|
|
43
|
-
* Remove all event listeners that were added before.
|
|
44
|
-
* Just because a slotchange event was fired, it doesn't mean that all of the
|
|
45
|
-
* children of the slot have changed.
|
|
46
|
-
*/
|
|
47
|
-
this._items.forEach((item) => {
|
|
48
|
-
item.removeEventListener("click", this._handleButtonClick)
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
const slot = this.shadowRoot.querySelector("slot")
|
|
52
|
-
this._items = slot
|
|
53
|
-
.assignedElements({ flatten: true })
|
|
54
|
-
.filter((el) => el instanceof LeuButton)
|
|
55
|
-
|
|
56
|
-
let foundActiveButtonBefore = false
|
|
57
|
-
|
|
58
|
-
this._items.forEach((item) => {
|
|
59
|
-
item.addEventListener("click", this._handleButtonClick)
|
|
60
|
-
item.componentRole = "menuitemradio"
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* In case there are multiple active buttons
|
|
64
|
-
* only the first one will be kept active.
|
|
65
|
-
*/
|
|
66
|
-
if (item.active && foundActiveButtonBefore) {
|
|
67
|
-
item.active = false
|
|
68
|
-
} else if (item.active) {
|
|
69
|
-
foundActiveButtonBefore = true
|
|
70
|
-
}
|
|
71
|
-
})
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
private _handleButtonClick = (event: MouseEvent) => {
|
|
75
|
-
const button = event.currentTarget as LeuButton
|
|
76
|
-
|
|
77
|
-
if (!button.active) {
|
|
78
|
-
this.value = LeuButtonGroup.getButtonValue(button)
|
|
79
|
-
|
|
80
|
-
this.dispatchEvent(
|
|
81
|
-
new CustomEvent("input", {
|
|
82
|
-
bubbles: true,
|
|
83
|
-
composed: true,
|
|
84
|
-
detail: { value: LeuButtonGroup.getButtonValue(button) },
|
|
85
|
-
}),
|
|
86
|
-
)
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
render() {
|
|
91
|
-
return html`
|
|
92
|
-
<div role="menubar" class="group">
|
|
93
|
-
<slot @slotchange=${this._handleSlotChange}></slot>
|
|
94
|
-
</div>
|
|
95
|
-
`
|
|
96
|
-
}
|
|
97
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { html } from "lit"
|
|
2
|
-
import "../leu-button-group.js"
|
|
3
|
-
import "../../button/leu-button.js"
|
|
4
|
-
|
|
5
|
-
// https://stackoverflow.com/questions/72566428/storybook-angular-how-to-dynamically-update-args-from-the-template
|
|
6
|
-
import { UPDATE_STORY_ARGS } from "storybook/internal/core-events"
|
|
7
|
-
function updateStorybookArgss(id, args) {
|
|
8
|
-
const channel = window.__STORYBOOK_ADDONS_CHANNEL__
|
|
9
|
-
channel.emit(UPDATE_STORY_ARGS, {
|
|
10
|
-
storyId: id,
|
|
11
|
-
updatedArgs: args,
|
|
12
|
-
})
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export default {
|
|
16
|
-
title: "Components/ButtonGroup",
|
|
17
|
-
component: "leu-button-group",
|
|
18
|
-
parameters: {
|
|
19
|
-
design: {
|
|
20
|
-
type: "figma",
|
|
21
|
-
url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=18180-165796&mode=design&t=lzVrtq8lxYVJU5TB-11",
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function Template({ items, value }, { id }) {
|
|
27
|
-
return html` <leu-button-group
|
|
28
|
-
.value=${value}
|
|
29
|
-
@input=${(event) => {
|
|
30
|
-
updateStorybookArgss(id, {
|
|
31
|
-
value: event.target.value,
|
|
32
|
-
})
|
|
33
|
-
}}
|
|
34
|
-
>
|
|
35
|
-
${items.map(
|
|
36
|
-
(i) =>
|
|
37
|
-
html`<leu-button
|
|
38
|
-
variant="secondary"
|
|
39
|
-
?active=${value === i || value === `${i}-attr`}
|
|
40
|
-
value=${`${i}-attr`}
|
|
41
|
-
>${i}
|
|
42
|
-
</leu-button>`,
|
|
43
|
-
)}
|
|
44
|
-
</leu-button-group>
|
|
45
|
-
<br />
|
|
46
|
-
<br />
|
|
47
|
-
<pre>value = '${value}'</pre>`
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export const Regular = Template.bind({})
|
|
51
|
-
Regular.args = {
|
|
52
|
-
items: ["Eins", "Zwei", "Drei"],
|
|
53
|
-
value: "Zwei",
|
|
54
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { html } from "lit"
|
|
2
|
-
import {
|
|
3
|
-
fixture,
|
|
4
|
-
expect,
|
|
5
|
-
oneEvent,
|
|
6
|
-
elementUpdated,
|
|
7
|
-
aTimeout,
|
|
8
|
-
} from "@open-wc/testing"
|
|
9
|
-
|
|
10
|
-
import "../leu-button-group.js"
|
|
11
|
-
import "../../button/leu-button.js"
|
|
12
|
-
|
|
13
|
-
async function defaultFixture() {
|
|
14
|
-
return fixture(html`
|
|
15
|
-
<leu-button-group>
|
|
16
|
-
<leu-button variant="secondary" value="Eins">Eins</leu-button>
|
|
17
|
-
<leu-button variant="secondary" value="Zweierlei">Zwei</leu-button>
|
|
18
|
-
<leu-button variant="secondary">Drei</leu-button>
|
|
19
|
-
</leu-button-group>
|
|
20
|
-
`)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
describe("LeuButtonGroup", () => {
|
|
24
|
-
it("is a defined element", async () => {
|
|
25
|
-
const el = customElements.get("leu-button-group")
|
|
26
|
-
|
|
27
|
-
await expect(el).not.to.be.undefined
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
it("passes the a11y audit", async () => {
|
|
31
|
-
const el = await defaultFixture()
|
|
32
|
-
|
|
33
|
-
await expect(el).to.be.accessible()
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it("has no value by default", async () => {
|
|
37
|
-
const el = await defaultFixture()
|
|
38
|
-
|
|
39
|
-
await expect(el.value).to.be.null
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
it("has the correct value after clicking a button", async () => {
|
|
43
|
-
const el = await defaultFixture()
|
|
44
|
-
|
|
45
|
-
const buttons = Array.from(el.querySelectorAll("leu-button"))
|
|
46
|
-
|
|
47
|
-
setTimeout(() => buttons[1].click())
|
|
48
|
-
await oneEvent(el, "input")
|
|
49
|
-
await expect(el.value).to.equal("Zweierlei")
|
|
50
|
-
|
|
51
|
-
setTimeout(() => buttons[0].click())
|
|
52
|
-
await oneEvent(el, "input")
|
|
53
|
-
await expect(el.value).to.equal("Eins")
|
|
54
|
-
|
|
55
|
-
setTimeout(() => buttons[2].click())
|
|
56
|
-
await oneEvent(el, "input")
|
|
57
|
-
await expect(el.value).to.equal("Drei")
|
|
58
|
-
|
|
59
|
-
// Should not change after clicking the same button again
|
|
60
|
-
setTimeout(() => buttons[2].click())
|
|
61
|
-
await aTimeout(100) // There is no event to wait for so
|
|
62
|
-
await expect(el.value).to.equal("Drei")
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it("sets the active attribute on the active button", async () => {
|
|
66
|
-
const el = await defaultFixture()
|
|
67
|
-
el.value = "Zweierlei"
|
|
68
|
-
await elementUpdated(el)
|
|
69
|
-
|
|
70
|
-
const buttons = el.querySelectorAll("leu-button")
|
|
71
|
-
|
|
72
|
-
await expect(buttons[0].active).to.be.false
|
|
73
|
-
await expect(buttons[1].active).to.be.true
|
|
74
|
-
await expect(buttons[2].active).to.be.false
|
|
75
|
-
|
|
76
|
-
buttons[0].click()
|
|
77
|
-
|
|
78
|
-
await expect(buttons[0].variant).to.equal("secondary")
|
|
79
|
-
await expect(buttons[1].variant).to.equal("secondary")
|
|
80
|
-
await expect(buttons[2].variant).to.equal("secondary")
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it("sets the menuitemradio role on the buttons", async () => {
|
|
84
|
-
const el = await defaultFixture()
|
|
85
|
-
const buttons = el.querySelectorAll("leu-button")
|
|
86
|
-
|
|
87
|
-
await expect(buttons[0].componentRole).to.equal("menuitemradio")
|
|
88
|
-
await expect(buttons[1].componentRole).to.equal("menuitemradio")
|
|
89
|
-
await expect(buttons[2].componentRole).to.equal("menuitemradio")
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it("dispatches an input event when the value changes", async () => {
|
|
93
|
-
const el = await defaultFixture()
|
|
94
|
-
el.value = "Drei"
|
|
95
|
-
await elementUpdated(el)
|
|
96
|
-
|
|
97
|
-
const buttons = el.querySelectorAll("leu-button")
|
|
98
|
-
|
|
99
|
-
setTimeout(() => buttons[0].click())
|
|
100
|
-
|
|
101
|
-
const inputEvent = await oneEvent(el, "input")
|
|
102
|
-
|
|
103
|
-
await expect(inputEvent.detail.value).to.be.equal("Eins")
|
|
104
|
-
})
|
|
105
|
-
})
|