@warp-ds/elements 2.10.0-next.15 → 2.10.0-next.18
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/.storybook/utilities.js +4 -4
- package/dist/api.js.map +2 -2
- package/dist/custom-elements.json +174 -56
- package/dist/docs/affix/affix.md +2 -2
- package/dist/docs/affix/api.md +2 -2
- package/dist/docs/alert/alert.md +4 -4
- package/dist/docs/alert/api.md +4 -4
- package/dist/docs/attention/api.md +2 -2
- package/dist/docs/attention/attention.md +2 -2
- package/dist/docs/badge/api.md +50 -4
- package/dist/docs/badge/badge.md +50 -4
- package/dist/docs/box/api.md +2 -2
- package/dist/docs/box/box.md +2 -2
- package/dist/docs/breadcrumb-item/api.md +27 -0
- package/dist/docs/breadcrumb-item/breadcrumb-item.md +34 -0
- package/dist/docs/breadcrumbs/accessibility.md +8 -18
- package/dist/docs/breadcrumbs/breadcrumbs.md +57 -34
- package/dist/docs/breadcrumbs/examples.md +8 -8
- package/dist/docs/breadcrumbs/styling.md +33 -0
- package/dist/docs/breadcrumbs/usage.md +8 -8
- package/dist/docs/checkbox/api.md +2 -2
- package/dist/docs/checkbox/checkbox.md +176 -2
- package/dist/docs/checkbox/styling.md +173 -0
- package/dist/docs/checkbox-group/checkbox-group.md +43 -30
- package/dist/docs/checkbox-group/styling.md +31 -29
- package/dist/docs/combobox/api.md +12 -12
- package/dist/docs/combobox/combobox.md +12 -12
- package/dist/docs/datepicker/api.md +6 -6
- package/dist/docs/datepicker/datepicker.md +6 -6
- package/dist/docs/icon/api.md +3 -3
- package/dist/docs/icon/icon.md +3 -3
- package/dist/docs/index.md +2 -1
- package/dist/docs/radio-group/api.md +4 -4
- package/dist/docs/radio-group/radio-group.md +183 -68
- package/dist/docs/radio-group/styling.md +179 -64
- package/dist/docs/snackbar/api.md +1 -1
- package/dist/docs/snackbar/snackbar.md +1 -1
- package/dist/docs/snackbar-item/api.md +2 -2
- package/dist/docs/snackbar-item/snackbar-item.md +2 -2
- package/dist/index.d.ts +109 -2
- package/dist/packages/affix/affix.d.ts +4 -4
- package/dist/packages/affix/affix.hydration.test.d.ts +1 -1
- package/dist/packages/affix/affix.hydration.test.js +15 -15
- package/dist/packages/affix/affix.js +345 -315
- package/dist/packages/affix/affix.js.map +2 -2
- package/dist/packages/affix/affix.react.stories.d.ts +2 -2
- package/dist/packages/affix/affix.react.stories.js +3 -3
- package/dist/packages/affix/affix.react.test.js +5 -3
- package/dist/packages/affix/affix.stories.d.ts +3 -3
- package/dist/packages/affix/affix.stories.js +10 -10
- package/dist/packages/affix/affix.test.d.ts +1 -1
- package/dist/packages/affix/affix.test.js +10 -10
- package/dist/packages/affix/react.d.ts +2 -2
- package/dist/packages/affix/react.js +6 -6
- package/dist/packages/affix/styles.js +1 -1
- package/dist/packages/alert/alert.d.ts +3 -3
- package/dist/packages/alert/alert.hydration.test.d.ts +1 -1
- package/dist/packages/alert/alert.hydration.test.js +21 -21
- package/dist/packages/alert/alert.js +344 -319
- package/dist/packages/alert/alert.js.map +2 -2
- package/dist/packages/alert/alert.react.stories.d.ts +2 -2
- package/dist/packages/alert/alert.react.stories.js +13 -13
- package/dist/packages/alert/alert.stories.d.ts +4 -4
- package/dist/packages/alert/alert.stories.js +29 -27
- package/dist/packages/alert/alert.test.d.ts +1 -1
- package/dist/packages/alert/alert.test.js +34 -21
- package/dist/packages/alert/react.d.ts +1 -1
- package/dist/packages/alert/react.js +4 -4
- package/dist/packages/alert/styles.js +1 -1
- package/dist/packages/attention/attention.d.ts +7 -7
- package/dist/packages/attention/attention.hydration.test.d.ts +1 -1
- package/dist/packages/attention/attention.hydration.test.js +29 -29
- package/dist/packages/attention/attention.js +1725 -1683
- package/dist/packages/attention/attention.js.map +2 -2
- package/dist/packages/attention/attention.react.stories.d.ts +3 -3
- package/dist/packages/attention/attention.react.stories.js +13 -13
- package/dist/packages/attention/attention.react.test.js +11 -7
- package/dist/packages/attention/attention.stories.d.ts +4 -4
- package/dist/packages/attention/attention.stories.js +126 -117
- package/dist/packages/attention/attention.test.d.ts +1 -1
- package/dist/packages/attention/attention.test.js +18 -10
- package/dist/packages/attention/layout-styles.js +900 -900
- package/dist/packages/attention/react.d.ts +4 -4
- package/dist/packages/attention/react.js +13 -11
- package/dist/packages/attention/styles.js +1 -1
- package/dist/packages/badge/badge.d.ts +3 -3
- package/dist/packages/badge/badge.hydration.test.d.ts +1 -1
- package/dist/packages/badge/badge.hydration.test.js +25 -25
- package/dist/packages/badge/badge.js +276 -276
- package/dist/packages/badge/badge.js.map +2 -2
- package/dist/packages/badge/badge.react.stories.d.ts +3 -3
- package/dist/packages/badge/badge.react.stories.js +17 -17
- package/dist/packages/badge/badge.stories.d.ts +3 -3
- package/dist/packages/badge/badge.stories.js +22 -20
- package/dist/packages/badge/badge.test.d.ts +1 -1
- package/dist/packages/badge/badge.test.js +13 -11
- package/dist/packages/badge/react.d.ts +1 -1
- package/dist/packages/badge/react.js +4 -4
- package/dist/packages/badge/styles.js +1 -1
- package/dist/packages/box/box.d.ts +1 -1
- package/dist/packages/box/box.hydration.test.d.ts +1 -1
- package/dist/packages/box/box.hydration.test.js +14 -14
- package/dist/packages/box/box.js +283 -283
- package/dist/packages/box/box.js.map +2 -2
- package/dist/packages/box/box.react.stories.d.ts +3 -3
- package/dist/packages/box/box.react.stories.js +8 -8
- package/dist/packages/box/box.stories.d.ts +3 -3
- package/dist/packages/box/box.stories.js +25 -19
- package/dist/packages/box/box.test.d.ts +1 -1
- package/dist/packages/box/box.test.js +6 -6
- package/dist/packages/box/react.d.ts +1 -1
- package/dist/packages/box/react.js +4 -4
- package/dist/packages/box/slot.test.d.ts +1 -1
- package/dist/packages/box/slot.test.js +6 -6
- package/dist/packages/box/styles.js +1 -1
- package/dist/packages/breadcrumb-item/breadcrumb-item.d.ts +29 -0
- package/dist/packages/breadcrumb-item/breadcrumb-item.js +2520 -0
- package/dist/packages/breadcrumb-item/breadcrumb-item.js.map +7 -0
- package/dist/packages/breadcrumb-item/react.d.ts +2 -0
- package/dist/packages/breadcrumb-item/react.js +11 -0
- package/dist/packages/breadcrumb-item/styles.d.ts +4 -0
- package/dist/packages/breadcrumb-item/styles.js +72 -0
- package/dist/packages/breadcrumbs/breadcrumbs.d.ts +3 -1
- package/dist/packages/breadcrumbs/breadcrumbs.hydration.test.d.ts +1 -1
- package/dist/packages/breadcrumbs/breadcrumbs.hydration.test.js +55 -49
- package/dist/packages/breadcrumbs/breadcrumbs.js +285 -281
- package/dist/packages/breadcrumbs/breadcrumbs.js.map +3 -3
- package/dist/packages/breadcrumbs/breadcrumbs.react.stories.d.ts +3 -3
- package/dist/packages/breadcrumbs/breadcrumbs.react.stories.js +17 -16
- package/dist/packages/breadcrumbs/breadcrumbs.stories.d.ts +7 -8
- package/dist/packages/breadcrumbs/breadcrumbs.stories.js +30 -26
- package/dist/packages/breadcrumbs/breadcrumbs.test.d.ts +1 -1
- package/dist/packages/breadcrumbs/breadcrumbs.test.js +19 -17
- package/dist/packages/breadcrumbs/react.d.ts +1 -1
- package/dist/packages/breadcrumbs/react.js +4 -4
- package/dist/packages/breadcrumbs/styles.js +1 -1
- package/dist/packages/button/button.d.ts +5 -5
- package/dist/packages/button/button.hydration.test.d.ts +1 -1
- package/dist/packages/button/button.hydration.test.js +19 -19
- package/dist/packages/button/button.js +741 -715
- package/dist/packages/button/button.js.map +2 -2
- package/dist/packages/button/button.react.stories.d.ts +3 -3
- package/dist/packages/button/button.react.stories.js +30 -30
- package/dist/packages/button/button.react.test.js +13 -13
- package/dist/packages/button/button.stories.d.ts +4 -4
- package/dist/packages/button/button.stories.js +276 -167
- package/dist/packages/button/button.test.d.ts +1 -1
- package/dist/packages/button/button.test.js +36 -34
- package/dist/packages/button/react.d.ts +2 -2
- package/dist/packages/button/react.js +7 -7
- package/dist/packages/button/styles.js +373 -347
- package/dist/packages/card/card.d.ts +1 -1
- package/dist/packages/card/card.hydration.test.d.ts +1 -1
- package/dist/packages/card/card.hydration.test.js +14 -14
- package/dist/packages/card/card.js +305 -290
- package/dist/packages/card/card.js.map +2 -2
- package/dist/packages/card/card.react.stories.d.ts +3 -3
- package/dist/packages/card/card.react.stories.js +11 -11
- package/dist/packages/card/card.stories.d.ts +3 -3
- package/dist/packages/card/card.stories.js +36 -24
- package/dist/packages/card/card.test.d.ts +1 -1
- package/dist/packages/card/card.test.js +6 -6
- package/dist/packages/card/react.d.ts +1 -1
- package/dist/packages/card/react.js +4 -4
- package/dist/packages/card/styles.js +1 -1
- package/dist/packages/checkbox/checkbox.a11y.test.d.ts +1 -1
- package/dist/packages/checkbox/checkbox.a11y.test.js +47 -33
- package/dist/packages/checkbox/checkbox.d.ts +2 -2
- package/dist/packages/checkbox/checkbox.hydration.test.d.ts +1 -1
- package/dist/packages/checkbox/checkbox.hydration.test.js +21 -21
- package/dist/packages/checkbox/checkbox.js +475 -424
- package/dist/packages/checkbox/checkbox.js.map +2 -2
- package/dist/packages/checkbox/checkbox.react.stories.d.ts +2 -2
- package/dist/packages/checkbox/checkbox.react.stories.js +3 -3
- package/dist/packages/checkbox/checkbox.stories.d.ts +4 -4
- package/dist/packages/checkbox/checkbox.stories.js +99 -91
- package/dist/packages/checkbox/checkbox.test.d.ts +1 -1
- package/dist/packages/checkbox/checkbox.test.js +64 -64
- package/dist/packages/checkbox/react.d.ts +1 -1
- package/dist/packages/checkbox/react.js +6 -6
- package/dist/packages/checkbox/styles.js +183 -132
- package/dist/packages/checkbox-group/checkbox-group.a11y.test.d.ts +2 -2
- package/dist/packages/checkbox-group/checkbox-group.a11y.test.js +83 -73
- package/dist/packages/checkbox-group/checkbox-group.d.ts +16 -2
- package/dist/packages/checkbox-group/checkbox-group.hydration.test.d.ts +2 -2
- package/dist/packages/checkbox-group/checkbox-group.hydration.test.js +36 -19
- package/dist/packages/checkbox-group/checkbox-group.js +60 -55
- package/dist/packages/checkbox-group/checkbox-group.js.map +2 -2
- package/dist/packages/checkbox-group/checkbox-group.react.test.js +4 -4
- package/dist/packages/checkbox-group/checkbox-group.test.d.ts +2 -2
- package/dist/packages/checkbox-group/checkbox-group.test.js +96 -90
- package/dist/packages/checkbox-group/react.d.ts +2 -2
- package/dist/packages/checkbox-group/react.js +6 -6
- package/dist/packages/combobox/combobox.a11y.test.d.ts +2 -2
- package/dist/packages/combobox/combobox.a11y.test.js +72 -49
- package/dist/packages/combobox/combobox.d.ts +2 -2
- package/dist/packages/combobox/combobox.hydration.test.d.ts +1 -1
- package/dist/packages/combobox/combobox.hydration.test.js +45 -45
- package/dist/packages/combobox/combobox.js +332 -332
- package/dist/packages/combobox/combobox.js.map +3 -3
- package/dist/packages/combobox/combobox.react.stories.d.ts +3 -3
- package/dist/packages/combobox/combobox.react.stories.js +29 -29
- package/dist/packages/combobox/combobox.react.test.js +8 -8
- package/dist/packages/combobox/combobox.stories.d.ts +4 -4
- package/dist/packages/combobox/combobox.stories.js +100 -94
- package/dist/packages/combobox/combobox.test.d.ts +2 -2
- package/dist/packages/combobox/combobox.test.js +148 -133
- package/dist/packages/combobox/react.d.ts +2 -2
- package/dist/packages/combobox/react.js +14 -14
- package/dist/packages/combobox/styles.js +1 -1
- package/dist/packages/datepicker/DatePicker.test.d.ts +2 -2
- package/dist/packages/datepicker/DatePicker.test.js +46 -41
- package/dist/packages/datepicker/datepicker.d.ts +3 -3
- package/dist/packages/datepicker/datepicker.hydration.test.d.ts +1 -1
- package/dist/packages/datepicker/datepicker.hydration.test.js +21 -21
- package/dist/packages/datepicker/datepicker.js +665 -625
- package/dist/packages/datepicker/datepicker.js.map +3 -3
- package/dist/packages/datepicker/datepicker.react.stories.d.ts +3 -3
- package/dist/packages/datepicker/datepicker.react.stories.js +9 -9
- package/dist/packages/datepicker/datepicker.react.test.js +6 -6
- package/dist/packages/datepicker/datepicker.stories.d.ts +4 -4
- package/dist/packages/datepicker/datepicker.stories.js +32 -32
- package/dist/packages/datepicker/datepicker.test.d.ts +2 -2
- package/dist/packages/datepicker/datepicker.test.js +77 -79
- package/dist/packages/datepicker/react.d.ts +2 -2
- package/dist/packages/datepicker/react.js +16 -14
- package/dist/packages/datepicker/styles/w-datepicker-calendar.styles.js +13 -12
- package/dist/packages/datepicker/styles/w-datepicker-day.styles.js +58 -55
- package/dist/packages/datepicker/styles/w-datepicker-month.styles.js +60 -57
- package/dist/packages/datepicker/styles/w-datepicker.styles.js +87 -87
- package/dist/packages/datepicker/utils.d.ts +1 -1
- package/dist/packages/datepicker/utils.js +25 -19
- package/dist/packages/datepicker/utils.test.js +20 -20
- package/dist/packages/expandable/expandable.d.ts +4 -4
- package/dist/packages/expandable/expandable.hydration.test.d.ts +1 -1
- package/dist/packages/expandable/expandable.hydration.test.js +21 -21
- package/dist/packages/expandable/expandable.js +353 -326
- package/dist/packages/expandable/expandable.js.map +2 -2
- package/dist/packages/expandable/expandable.react.stories.d.ts +3 -3
- package/dist/packages/expandable/expandable.react.stories.js +7 -7
- package/dist/packages/expandable/expandable.react.test.js +15 -7
- package/dist/packages/expandable/expandable.stories.d.ts +5 -5
- package/dist/packages/expandable/expandable.stories.js +51 -45
- package/dist/packages/expandable/expandable.test.d.ts +1 -1
- package/dist/packages/expandable/expandable.test.js +19 -17
- package/dist/packages/expandable/react.d.ts +2 -2
- package/dist/packages/expandable/react.js +9 -9
- package/dist/packages/expandable/styles.js +1 -1
- package/dist/packages/global.js +2 -2
- package/dist/packages/i18n.d.ts +1 -1
- package/dist/packages/i18n.js +37 -29
- package/dist/packages/icon/icon.d.ts +3 -3
- package/dist/packages/icon/icon.hydration.test.d.ts +1 -1
- package/dist/packages/icon/icon.hydration.test.js +25 -25
- package/dist/packages/icon/icon.js +30 -25
- package/dist/packages/icon/icon.js.map +2 -2
- package/dist/packages/icon/icon.react.stories.d.ts +1 -1
- package/dist/packages/icon/icon.react.stories.js +283 -284
- package/dist/packages/icon/icon.stories.d.ts +3 -3
- package/dist/packages/icon/icon.stories.js +299 -298
- package/dist/packages/icon/icon.test.d.ts +1 -1
- package/dist/packages/icon/icon.test.js +36 -28
- package/dist/packages/icon/react.d.ts +1 -1
- package/dist/packages/icon/react.js +4 -4
- package/dist/packages/icon/style.js +24 -25
- package/dist/packages/interaction-type-detection.js +9 -9
- package/dist/packages/link/link.d.ts +2 -2
- package/dist/packages/link/link.hydration.test.d.ts +1 -1
- package/dist/packages/link/link.hydration.test.js +27 -27
- package/dist/packages/link/link.js +709 -683
- package/dist/packages/link/link.js.map +2 -2
- package/dist/packages/link/link.react.stories.d.ts +3 -3
- package/dist/packages/link/link.react.stories.js +42 -42
- package/dist/packages/link/link.react.test.js +5 -3
- package/dist/packages/link/link.stories.d.ts +3 -3
- package/dist/packages/link/link.stories.js +51 -51
- package/dist/packages/link/link.test.d.ts +1 -1
- package/dist/packages/link/link.test.js +11 -7
- package/dist/packages/link/react.d.ts +2 -2
- package/dist/packages/link/react.js +6 -6
- package/dist/packages/link/styles.js +57 -57
- package/dist/packages/modal/index.d.ts +7 -7
- package/dist/packages/modal/index.js +7 -7
- package/dist/packages/modal/modal.d.ts +1 -1
- package/dist/packages/modal/modal.hydration.test.d.ts +1 -1
- package/dist/packages/modal/modal.hydration.test.js +12 -12
- package/dist/packages/modal/modal.js +404 -404
- package/dist/packages/modal/modal.js.map +2 -2
- package/dist/packages/modal/modal.react.stories.d.ts +3 -3
- package/dist/packages/modal/modal.react.stories.js +7 -6
- package/dist/packages/modal/modal.react.test.js +5 -5
- package/dist/packages/modal/modal.stories.d.ts +6 -6
- package/dist/packages/modal/modal.stories.js +253 -238
- package/dist/packages/modal/react.d.ts +4 -4
- package/dist/packages/modal/react.js +13 -13
- package/dist/packages/modal/util.js +2 -2
- package/dist/packages/modal-footer/modal-footer.d.ts +1 -1
- package/dist/packages/modal-footer/modal-footer.js +291 -291
- package/dist/packages/modal-footer/modal-footer.js.map +2 -2
- package/dist/packages/modal-footer/react.d.ts +1 -1
- package/dist/packages/modal-footer/react.js +4 -4
- package/dist/packages/modal-header/modal-header.d.ts +2 -2
- package/dist/packages/modal-header/modal-header.js +437 -416
- package/dist/packages/modal-header/modal-header.js.map +2 -2
- package/dist/packages/modal-header/modal-header.react.test.js +5 -3
- package/dist/packages/modal-header/react.d.ts +2 -2
- package/dist/packages/modal-header/react.js +8 -8
- package/dist/packages/page-indicator/page-indicator.d.ts +1 -1
- package/dist/packages/page-indicator/page-indicator.hydration.test.d.ts +1 -1
- package/dist/packages/page-indicator/page-indicator.hydration.test.js +22 -22
- package/dist/packages/page-indicator/page-indicator.js +26 -26
- package/dist/packages/page-indicator/page-indicator.js.map +2 -2
- package/dist/packages/page-indicator/page-indicator.react.stories.d.ts +3 -3
- package/dist/packages/page-indicator/page-indicator.react.stories.js +11 -11
- package/dist/packages/page-indicator/page-indicator.react.test.js +5 -5
- package/dist/packages/page-indicator/page-indicator.stories.d.ts +3 -3
- package/dist/packages/page-indicator/page-indicator.stories.js +56 -27
- package/dist/packages/page-indicator/page-indicator.test.d.ts +1 -1
- package/dist/packages/page-indicator/page-indicator.test.js +110 -70
- package/dist/packages/page-indicator/react.d.ts +2 -2
- package/dist/packages/page-indicator/react.js +7 -7
- package/dist/packages/page-indicator/style.js +21 -21
- package/dist/packages/pagination/pagination.a11y.test.d.ts +1 -1
- package/dist/packages/pagination/pagination.a11y.test.js +59 -25
- package/dist/packages/pagination/pagination.d.ts +3 -3
- package/dist/packages/pagination/pagination.hydration.test.d.ts +1 -1
- package/dist/packages/pagination/pagination.hydration.test.js +19 -19
- package/dist/packages/pagination/pagination.js +380 -349
- package/dist/packages/pagination/pagination.js.map +2 -2
- package/dist/packages/pagination/pagination.react.stories.d.ts +7 -7
- package/dist/packages/pagination/pagination.react.stories.js +8 -8
- package/dist/packages/pagination/pagination.react.test.js +6 -6
- package/dist/packages/pagination/pagination.stories.d.ts +3 -3
- package/dist/packages/pagination/pagination.stories.js +18 -18
- package/dist/packages/pagination/pagination.test.d.ts +1 -1
- package/dist/packages/pagination/pagination.test.js +146 -69
- package/dist/packages/pagination/react.d.ts +4 -4
- package/dist/packages/pagination/react.js +12 -10
- package/dist/packages/pagination/styles.js +1 -1
- package/dist/packages/pill/pill.d.ts +2 -2
- package/dist/packages/pill/pill.hydration.test.d.ts +1 -1
- package/dist/packages/pill/pill.hydration.test.js +14 -14
- package/dist/packages/pill/pill.js +331 -308
- package/dist/packages/pill/pill.js.map +2 -2
- package/dist/packages/pill/pill.react.stories.d.ts +3 -3
- package/dist/packages/pill/pill.react.stories.js +3 -3
- package/dist/packages/pill/pill.react.test.js +8 -8
- package/dist/packages/pill/pill.stories.d.ts +3 -3
- package/dist/packages/pill/pill.stories.js +8 -8
- package/dist/packages/pill/pill.test.d.ts +1 -1
- package/dist/packages/pill/pill.test.js +17 -15
- package/dist/packages/pill/react.d.ts +2 -2
- package/dist/packages/pill/react.js +18 -14
- package/dist/packages/pill/styles.js +1 -1
- package/dist/packages/radio/base-element.d.ts +3 -3
- package/dist/packages/radio/base-element.js +3 -3
- package/dist/packages/radio/custom-error-validator.d.ts +1 -1
- package/dist/packages/radio/custom-error-validator.js +3 -3
- package/dist/packages/radio/form-associated-element.d.ts +8 -8
- package/dist/packages/radio/form-associated-element.js +27 -26
- package/dist/packages/radio/host-styles.js +9 -9
- package/dist/packages/radio/invalid.d.ts +1 -1
- package/dist/packages/radio/invalid.js +1 -1
- package/dist/packages/radio/radio-styles.js +199 -160
- package/dist/packages/radio/radio.a11y.test.d.ts +2 -2
- package/dist/packages/radio/radio.a11y.test.js +60 -58
- package/dist/packages/radio/radio.d.ts +3 -3
- package/dist/packages/radio/radio.hydration.test.d.ts +1 -1
- package/dist/packages/radio/radio.hydration.test.js +23 -14
- package/dist/packages/radio/radio.js +485 -446
- package/dist/packages/radio/radio.js.map +3 -3
- package/dist/packages/radio/radio.react.stories.d.ts +2 -2
- package/dist/packages/radio/radio.react.stories.js +3 -3
- package/dist/packages/radio/radio.stories.d.ts +4 -4
- package/dist/packages/radio/radio.stories.js +152 -136
- package/dist/packages/radio/radio.test.d.ts +1 -1
- package/dist/packages/radio/radio.test.js +74 -73
- package/dist/packages/radio/react.d.ts +1 -1
- package/dist/packages/radio/react.js +4 -4
- package/dist/packages/radio/required-validator.d.ts +1 -1
- package/dist/packages/radio/required-validator.js +12 -7
- package/dist/packages/radio/slot.d.ts +1 -1
- package/dist/packages/radio/slot.js +11 -8
- package/dist/packages/radio/watch.d.ts +1 -1
- package/dist/packages/radio/watch.js +3 -1
- package/dist/packages/radio-group/radio-group-styles.js +121 -88
- package/dist/packages/radio-group/radio-group.a11y.test.d.ts +2 -2
- package/dist/packages/radio-group/radio-group.a11y.test.js +81 -79
- package/dist/packages/radio-group/radio-group.d.ts +14 -5
- package/dist/packages/radio-group/radio-group.hydration.test.d.ts +2 -2
- package/dist/packages/radio-group/radio-group.hydration.test.js +29 -18
- package/dist/packages/radio-group/radio-group.js +648 -560
- package/dist/packages/radio-group/radio-group.js.map +3 -3
- package/dist/packages/radio-group/radio-group.react.test.js +4 -4
- package/dist/packages/radio-group/radio-group.test.d.ts +2 -2
- package/dist/packages/radio-group/radio-group.test.js +234 -229
- package/dist/packages/radio-group/react.d.ts +2 -2
- package/dist/packages/radio-group/react.js +10 -10
- package/dist/packages/select/react.d.ts +2 -2
- package/dist/packages/select/react.js +11 -11
- package/dist/packages/select/select.a11y.test.d.ts +1 -1
- package/dist/packages/select/select.a11y.test.js +98 -91
- package/dist/packages/select/select.d.ts +4 -4
- package/dist/packages/select/select.hydration.test.d.ts +1 -1
- package/dist/packages/select/select.hydration.test.js +16 -16
- package/dist/packages/select/select.js +348 -329
- package/dist/packages/select/select.js.map +2 -2
- package/dist/packages/select/select.react.stories.d.ts +3 -3
- package/dist/packages/select/select.react.stories.js +7 -7
- package/dist/packages/select/select.react.test.js +6 -6
- package/dist/packages/select/select.stories.d.ts +3 -3
- package/dist/packages/select/select.stories.js +51 -48
- package/dist/packages/select/select.test.d.ts +1 -1
- package/dist/packages/select/select.test.js +175 -178
- package/dist/packages/select/styles.js +1 -1
- package/dist/packages/slider/Slider.d.ts +1 -1
- package/dist/packages/slider/Slider.js +4 -4
- package/dist/packages/slider/index.d.ts +2 -2
- package/dist/packages/slider/index.js +2 -2
- package/dist/packages/slider/react.d.ts +3 -3
- package/dist/packages/slider/react.js +9 -9
- package/dist/packages/slider/slider.d.ts +3 -3
- package/dist/packages/slider/slider.hydration.test.d.ts +1 -1
- package/dist/packages/slider/slider.hydration.test.js +39 -20
- package/dist/packages/slider/slider.js +480 -462
- package/dist/packages/slider/slider.js.map +2 -2
- package/dist/packages/slider/slider.react.stories.d.ts +3 -3
- package/dist/packages/slider/slider.react.stories.js +31 -34
- package/dist/packages/slider/slider.react.test.js +6 -6
- package/dist/packages/slider/slider.stories.d.ts +7 -7
- package/dist/packages/slider/slider.stories.js +332 -340
- package/dist/packages/slider/slider.test.d.ts +5 -5
- package/dist/packages/slider/slider.test.js +367 -334
- package/dist/packages/slider/styles/w-slider.styles.js +166 -148
- package/dist/packages/slider/styles.js +1 -1
- package/dist/packages/slider-thumb/SliderThumb.d.ts +1 -1
- package/dist/packages/slider-thumb/SliderThumb.js +4 -4
- package/dist/packages/slider-thumb/oddbird-css-anchor-positioning.d.ts +1 -1
- package/dist/packages/slider-thumb/oddbird-css-anchor-positioning.js +1 -1
- package/dist/packages/slider-thumb/react.d.ts +3 -3
- package/dist/packages/slider-thumb/react.js +11 -9
- package/dist/packages/slider-thumb/slider-thumb.d.ts +3 -3
- package/dist/packages/slider-thumb/slider-thumb.hydration.test.d.ts +1 -1
- package/dist/packages/slider-thumb/slider-thumb.hydration.test.js +26 -17
- package/dist/packages/slider-thumb/slider-thumb.js +545 -548
- package/dist/packages/slider-thumb/slider-thumb.js.map +3 -3
- package/dist/packages/slider-thumb/slider-thumb.react.test.js +9 -5
- package/dist/packages/slider-thumb/styles/w-slider-thumb.styles.js +189 -188
- package/dist/packages/slider-thumb/styles.js +1 -1
- package/dist/packages/snackbar/react.d.ts +1 -1
- package/dist/packages/snackbar/react.js +4 -4
- package/dist/packages/snackbar/snackbar.d.ts +3 -3
- package/dist/packages/snackbar/snackbar.hydration.test.d.ts +1 -1
- package/dist/packages/snackbar/snackbar.hydration.test.js +6 -6
- package/dist/packages/snackbar/snackbar.js +487 -468
- package/dist/packages/snackbar/snackbar.js.map +2 -2
- package/dist/packages/snackbar/snackbar.react.stories.js +3 -3
- package/dist/packages/snackbar/snackbar.stories.d.ts +11 -11
- package/dist/packages/snackbar/snackbar.stories.js +253 -181
- package/dist/packages/snackbar/snackbar.test.d.ts +4 -4
- package/dist/packages/snackbar/snackbar.test.js +11 -11
- package/dist/packages/snackbar/styles.js +29 -29
- package/dist/packages/snackbar-item/react.d.ts +2 -2
- package/dist/packages/snackbar-item/react.js +6 -5
- package/dist/packages/snackbar-item/snackbar-item.d.ts +4 -4
- package/dist/packages/snackbar-item/snackbar-item.js +454 -435
- package/dist/packages/snackbar-item/snackbar-item.js.map +2 -2
- package/dist/packages/snackbar-item/snackbar-item.react.test.js +4 -4
- package/dist/packages/snackbar-item/styles.js +130 -108
- package/dist/packages/step/react.d.ts +1 -1
- package/dist/packages/step/react.js +4 -4
- package/dist/packages/step/step.d.ts +2 -2
- package/dist/packages/step/step.hydration.test.d.ts +1 -1
- package/dist/packages/step/step.hydration.test.js +10 -10
- package/dist/packages/step/step.js +330 -308
- package/dist/packages/step/step.js.map +2 -2
- package/dist/packages/step-indicator/index.d.ts +2 -2
- package/dist/packages/step-indicator/index.js +2 -2
- package/dist/packages/step-indicator/react.d.ts +2 -2
- package/dist/packages/step-indicator/react.js +5 -5
- package/dist/packages/step-indicator/step-indicator.a11y.test.d.ts +2 -2
- package/dist/packages/step-indicator/step-indicator.a11y.test.js +48 -46
- package/dist/packages/step-indicator/step-indicator.d.ts +1 -1
- package/dist/packages/step-indicator/step-indicator.hydration.test.d.ts +1 -1
- package/dist/packages/step-indicator/step-indicator.hydration.test.js +10 -10
- package/dist/packages/step-indicator/step-indicator.js +280 -276
- package/dist/packages/step-indicator/step-indicator.js.map +2 -2
- package/dist/packages/step-indicator/stepindicator.react.stories.d.ts +2 -2
- package/dist/packages/step-indicator/stepindicator.react.stories.js +3 -3
- package/dist/packages/step-indicator/stepindicator.stories.d.ts +3 -3
- package/dist/packages/step-indicator/stepindicator.stories.js +129 -129
- package/dist/packages/step-indicator/styles.js +1 -1
- package/dist/packages/styles.js +274 -274
- package/dist/packages/switch/react.d.ts +1 -1
- package/dist/packages/switch/react.js +6 -6
- package/dist/packages/switch/styles.js +1 -1
- package/dist/packages/switch/switch.a11y.test.d.ts +1 -1
- package/dist/packages/switch/switch.a11y.test.js +46 -38
- package/dist/packages/switch/switch.d.ts +1 -1
- package/dist/packages/switch/switch.hydration.test.d.ts +1 -1
- package/dist/packages/switch/switch.hydration.test.js +23 -23
- package/dist/packages/switch/switch.js +299 -299
- package/dist/packages/switch/switch.js.map +2 -2
- package/dist/packages/switch/switch.react.stories.d.ts +2 -2
- package/dist/packages/switch/switch.react.stories.js +2 -2
- package/dist/packages/switch/switch.stories.d.ts +2 -2
- package/dist/packages/switch/switch.stories.js +42 -37
- package/dist/packages/switch/switch.test.d.ts +1 -1
- package/dist/packages/switch/switch.test.js +30 -35
- package/dist/packages/tab/react.d.ts +6 -4
- package/dist/packages/tab/react.js +11 -10
- package/dist/packages/tab/styles.d.ts +1 -0
- package/dist/packages/tab/styles.js +2 -0
- package/dist/packages/tab/tab.d.ts +5 -5
- package/dist/packages/tab/tab.hydration.test.d.ts +1 -1
- package/dist/packages/tab/tab.hydration.test.js +18 -12
- package/dist/packages/tab/tab.js +305 -304
- package/dist/packages/tab/tab.js.map +3 -3
- package/dist/packages/tab/tab.react.test.js +5 -3
- package/dist/packages/tab-panel/react.d.ts +3 -2
- package/dist/packages/tab-panel/react.js +11 -5
- package/dist/packages/tab-panel/tab-panel.d.ts +3 -3
- package/dist/packages/tab-panel/tab-panel.hydration.test.d.ts +1 -1
- package/dist/packages/tab-panel/tab-panel.hydration.test.js +13 -10
- package/dist/packages/tab-panel/tab-panel.js +289 -287
- package/dist/packages/tab-panel/tab-panel.js.map +2 -2
- package/dist/packages/tabs/index.d.ts +4 -4
- package/dist/packages/tabs/index.js +3 -3
- package/dist/packages/tabs/react.d.ts +27 -8
- package/dist/packages/tabs/react.js +30 -9
- package/dist/packages/tabs/styles.js +1 -1
- package/dist/packages/tabs/tabs.a11y.test.d.ts +3 -3
- package/dist/packages/tabs/tabs.a11y.test.js +188 -169
- package/dist/packages/tabs/tabs.d.ts +3 -3
- package/dist/packages/tabs/tabs.hydration.test.d.ts +3 -1
- package/dist/packages/tabs/tabs.hydration.test.js +22 -8
- package/dist/packages/tabs/tabs.js +289 -282
- package/dist/packages/tabs/tabs.js.map +2 -2
- package/dist/packages/tabs/tabs.react.stories.d.ts +12 -10
- package/dist/packages/tabs/tabs.react.stories.js +28 -28
- package/dist/packages/tabs/tabs.stories.d.ts +4 -4
- package/dist/packages/tabs/tabs.stories.js +101 -95
- package/dist/packages/tabs/tabs.test.d.ts +3 -3
- package/dist/packages/tabs/tabs.test.js +136 -122
- package/dist/packages/textarea/react.d.ts +2 -2
- package/dist/packages/textarea/react.js +17 -17
- package/dist/packages/textarea/styles.js +1 -1
- package/dist/packages/textarea/textarea.a11y.test.d.ts +1 -1
- package/dist/packages/textarea/textarea.a11y.test.js +89 -57
- package/dist/packages/textarea/textarea.d.ts +1 -1
- package/dist/packages/textarea/textarea.hydration.test.d.ts +1 -1
- package/dist/packages/textarea/textarea.hydration.test.js +19 -19
- package/dist/packages/textarea/textarea.js +300 -298
- package/dist/packages/textarea/textarea.js.map +2 -2
- package/dist/packages/textarea/textarea.react.stories.d.ts +3 -3
- package/dist/packages/textarea/textarea.react.stories.js +13 -13
- package/dist/packages/textarea/textarea.react.test.js +7 -7
- package/dist/packages/textarea/textarea.stories.d.ts +3 -3
- package/dist/packages/textarea/textarea.stories.js +44 -42
- package/dist/packages/textarea/textarea.test.d.ts +1 -1
- package/dist/packages/textarea/textarea.test.js +124 -88
- package/dist/packages/textfield/react.d.ts +2 -2
- package/dist/packages/textfield/react.js +17 -17
- package/dist/packages/textfield/styles/w-textfield.styles.js +60 -58
- package/dist/packages/textfield/styles.js +1 -1
- package/dist/packages/textfield/textfield.d.ts +3 -3
- package/dist/packages/textfield/textfield.hydration.test.d.ts +1 -1
- package/dist/packages/textfield/textfield.hydration.test.js +19 -19
- package/dist/packages/textfield/textfield.js +376 -368
- package/dist/packages/textfield/textfield.js.map +3 -3
- package/dist/packages/textfield/textfield.react.stories.d.ts +3 -3
- package/dist/packages/textfield/textfield.react.stories.js +31 -31
- package/dist/packages/textfield/textfield.react.test.js +7 -7
- package/dist/packages/textfield/textfield.stories.d.ts +4 -4
- package/dist/packages/textfield/textfield.stories.js +107 -89
- package/dist/packages/textfield/textfield.test.d.ts +2 -2
- package/dist/packages/textfield/textfield.test.js +103 -71
- package/dist/packages/toast/api.d.ts +1 -1
- package/dist/packages/toast/api.js +3 -3
- package/dist/packages/toast/index.d.ts +5 -5
- package/dist/packages/toast/index.js +5 -5
- package/dist/packages/toast/styles.js +1 -1
- package/dist/packages/toast/toast.d.ts +4 -4
- package/dist/packages/toast/toast.js +346 -317
- package/dist/packages/toast/toast.js.map +2 -2
- package/dist/packages/toast/toast.stories.d.ts +4 -4
- package/dist/packages/toast/toast.stories.js +37 -16
- package/dist/packages/toast/toast.test.d.ts +1 -1
- package/dist/packages/toast/toast.test.js +48 -31
- package/dist/packages/toast/types.d.ts +1 -1
- package/dist/packages/toast-container/styles.js +1 -1
- package/dist/packages/toast-container/toast-container.d.ts +2 -2
- package/dist/packages/toast-container/toast-container.js +292 -291
- package/dist/packages/toast-container/toast-container.js.map +3 -3
- package/dist/packages/utils/element-collapse.js +38 -28
- package/dist/packages/utils/expand-transition.d.ts +1 -1
- package/dist/packages/utils/expand-transition.js +12 -10
- package/dist/packages/utils/unstyled-heading.d.ts +1 -1
- package/dist/packages/utils/unstyled-heading.js +4 -4
- package/dist/packages/utils/window-exists.js +1 -1
- package/dist/packages/utils.js +2 -2
- package/dist/setup-tests.d.ts +3 -3
- package/dist/setup-tests.js +16 -13
- package/dist/tests/react-hydration.js +29 -30
- package/dist/tests/react-ssr-attributes.d.ts +1 -1
- package/dist/tests/react-ssr-attributes.js +4 -4
- package/dist/web-types.json +61 -22
- package/eik/index.js +12 -12
- package/package.json +18 -16
|
@@ -1,210 +1,220 @@
|
|
|
1
|
-
import { userEvent } from
|
|
2
|
-
import { html } from
|
|
3
|
-
import { expect, test } from
|
|
4
|
-
import { render } from
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
test(
|
|
1
|
+
import { userEvent } from "vitest/browser";
|
|
2
|
+
import { html } from "lit";
|
|
3
|
+
import { expect, test } from "vitest";
|
|
4
|
+
import { render } from "vitest-browser-lit";
|
|
5
|
+
import "../attention/attention.js";
|
|
6
|
+
import "../affix/affix.js";
|
|
7
|
+
import "../textfield/textfield.js";
|
|
8
|
+
import "./slider.js";
|
|
9
|
+
import "../slider-thumb/slider-thumb.js";
|
|
10
|
+
test("single slider starts with a default value equal to max", async () => {
|
|
11
11
|
const component = html `
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
<form data-testid="form">
|
|
13
|
+
<w-slider label="Single" min="0" max="100">
|
|
14
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
15
|
+
</w-slider>
|
|
16
|
+
</form>
|
|
17
|
+
`;
|
|
18
18
|
const page = render(component);
|
|
19
|
-
await expect
|
|
19
|
+
await expect
|
|
20
|
+
.element(page.getByLabelText("Single").first())
|
|
21
|
+
.toHaveValue("100");
|
|
20
22
|
});
|
|
21
|
-
test(
|
|
23
|
+
test("range slider starts with a default from value equal to min, and to value equal to max", async () => {
|
|
22
24
|
const component = html `
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
<form data-testid="form">
|
|
26
|
+
<w-slider label="Range" min="0" max="100">
|
|
27
|
+
<w-slider-thumb
|
|
28
|
+
aria-label="From"
|
|
29
|
+
name="rangefrom"
|
|
30
|
+
slot="from"
|
|
31
|
+
></w-slider-thumb>
|
|
32
|
+
<w-slider-thumb
|
|
33
|
+
aria-label="To"
|
|
34
|
+
name="rangeto"
|
|
35
|
+
slot="to"
|
|
36
|
+
></w-slider-thumb>
|
|
37
|
+
</w-slider>
|
|
38
|
+
</form>
|
|
39
|
+
`;
|
|
30
40
|
const page = render(component);
|
|
31
|
-
await expect.element(page.getByLabelText(
|
|
32
|
-
await expect.element(page.getByLabelText(
|
|
41
|
+
await expect.element(page.getByLabelText("From").first()).toHaveValue("0");
|
|
42
|
+
await expect.element(page.getByLabelText("To").first()).toHaveValue("100");
|
|
33
43
|
});
|
|
34
|
-
test(
|
|
44
|
+
test("can set slider value via the range input", async () => {
|
|
35
45
|
const component = html `
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
46
|
+
<form data-testid="form">
|
|
47
|
+
<w-slider label="Single" min="0" max="100">
|
|
48
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
49
|
+
</w-slider>
|
|
50
|
+
</form>
|
|
51
|
+
`;
|
|
42
52
|
const page = render(component);
|
|
43
|
-
await userEvent.type(page.getByLabelText(
|
|
44
|
-
await expect.element(page.getByLabelText(
|
|
45
|
-
await expect.element(page.getByRole(
|
|
46
|
-
const formData = new FormData(page.getByTestId(
|
|
47
|
-
expect(formData.get(
|
|
53
|
+
await userEvent.type(page.getByLabelText("Single").first(), "{ArrowLeft}{ArrowLeft}{ArrowLeft}");
|
|
54
|
+
await expect.element(page.getByLabelText("Single").first()).toHaveValue("97");
|
|
55
|
+
await expect.element(page.getByRole("spinbutton")).toHaveValue(97); // keeps value in sync between inputs
|
|
56
|
+
const formData = new FormData(page.getByTestId("form").element());
|
|
57
|
+
expect(formData.get("value")).toBe("97");
|
|
48
58
|
});
|
|
49
|
-
test(
|
|
59
|
+
test("can set slider value via the number input", async () => {
|
|
50
60
|
const component = html `
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
<form data-testid="form">
|
|
62
|
+
<w-slider label="Single" min="0" max="100">
|
|
63
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
64
|
+
</w-slider>
|
|
65
|
+
</form>
|
|
66
|
+
`;
|
|
57
67
|
const page = render(component);
|
|
58
|
-
await page.getByRole(
|
|
59
|
-
await expect.element(page.getByRole(
|
|
60
|
-
await expect.element(page.getByLabelText(
|
|
61
|
-
const formData = new FormData(page.getByTestId(
|
|
62
|
-
expect(formData.get(
|
|
68
|
+
await page.getByRole("spinbutton").fill("50");
|
|
69
|
+
await expect.element(page.getByRole("spinbutton")).toHaveValue(50);
|
|
70
|
+
await expect.element(page.getByLabelText("Single").first()).toHaveValue("50"); // keeps value in sync between inputs
|
|
71
|
+
const formData = new FormData(page.getByTestId("form").element());
|
|
72
|
+
expect(formData.get("value")).toBe("50");
|
|
63
73
|
});
|
|
64
|
-
test(
|
|
74
|
+
test("can increment and decrement the slider values with arrow keys in the number input", async () => {
|
|
65
75
|
const component = html `
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
name="to-year"
|
|
82
|
-
></w-slider-thumb>
|
|
83
|
-
</w-slider>
|
|
84
|
-
</form>
|
|
85
|
-
`;
|
|
76
|
+
<form data-testid="form">
|
|
77
|
+
<w-slider label="Model year" min="1950" max="2025" open-ended>
|
|
78
|
+
<w-slider-thumb
|
|
79
|
+
slot="from"
|
|
80
|
+
aria-label="From year"
|
|
81
|
+
name="from-year"
|
|
82
|
+
></w-slider-thumb>
|
|
83
|
+
<w-slider-thumb
|
|
84
|
+
slot="to"
|
|
85
|
+
aria-label="To year"
|
|
86
|
+
name="to-year"
|
|
87
|
+
></w-slider-thumb>
|
|
88
|
+
</w-slider>
|
|
89
|
+
</form>
|
|
90
|
+
`;
|
|
86
91
|
const page = render(component);
|
|
87
|
-
await userEvent.type(page.getByRole(
|
|
92
|
+
await userEvent.type(page.getByRole("spinbutton").first(), "{ArrowUp}");
|
|
88
93
|
// Go from Min "beyond" 1950 to 1950
|
|
89
|
-
await expect.element(page.getByRole(
|
|
90
|
-
await expect
|
|
91
|
-
|
|
94
|
+
await expect.element(page.getByRole("spinbutton").first()).toHaveValue(1950);
|
|
95
|
+
await expect
|
|
96
|
+
.element(page.getByLabelText("From year").first())
|
|
97
|
+
.toHaveValue("1950"); // keeps value in sync between inputs
|
|
98
|
+
await userEvent.type(page.getByRole("spinbutton").last(), "{ArrowDown}");
|
|
92
99
|
// Go from Max "beyond" 2025 to 2025
|
|
93
|
-
await expect.element(page.getByRole(
|
|
94
|
-
await expect
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
await expect.element(page.getByRole("spinbutton").last()).toHaveValue(2025);
|
|
101
|
+
await expect
|
|
102
|
+
.element(page.getByLabelText("To year").first())
|
|
103
|
+
.toHaveValue("2025"); // keeps value in sync between inputs
|
|
104
|
+
const formData = new FormData(page.getByTestId("form").element());
|
|
105
|
+
expect(formData.get("from-year")).toBe("1950");
|
|
106
|
+
expect(formData.get("to-year")).toBe("2025");
|
|
98
107
|
});
|
|
99
|
-
test(
|
|
108
|
+
test("going down from Min and up from Max sets value to min - 1 and max + a respectively", async () => {
|
|
100
109
|
const component = html `
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
name="to-year"
|
|
117
|
-
></w-slider-thumb>
|
|
118
|
-
</w-slider>
|
|
119
|
-
</form>
|
|
120
|
-
`;
|
|
110
|
+
<form data-testid="form">
|
|
111
|
+
<w-slider label="Model year" min="1950" max="2025" open-ended>
|
|
112
|
+
<w-slider-thumb
|
|
113
|
+
slot="from"
|
|
114
|
+
aria-label="From year"
|
|
115
|
+
name="from-year"
|
|
116
|
+
></w-slider-thumb>
|
|
117
|
+
<w-slider-thumb
|
|
118
|
+
slot="to"
|
|
119
|
+
aria-label="To year"
|
|
120
|
+
name="to-year"
|
|
121
|
+
></w-slider-thumb>
|
|
122
|
+
</w-slider>
|
|
123
|
+
</form>
|
|
124
|
+
`;
|
|
121
125
|
const page = render(component);
|
|
122
|
-
await userEvent.type(page.getByRole(
|
|
123
|
-
await expect.element(page.getByRole(
|
|
124
|
-
await expect
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
await
|
|
128
|
-
|
|
129
|
-
expect
|
|
130
|
-
|
|
126
|
+
await userEvent.type(page.getByRole("spinbutton").first(), "{ArrowDown}");
|
|
127
|
+
await expect.element(page.getByRole("spinbutton").first()).toHaveValue(1949);
|
|
128
|
+
await expect
|
|
129
|
+
.element(page.getByLabelText("From year").first())
|
|
130
|
+
.toHaveValue("1949"); // keeps value in sync between inputs
|
|
131
|
+
await userEvent.type(page.getByRole("spinbutton").last(), "{ArrowUp}");
|
|
132
|
+
await expect.element(page.getByRole("spinbutton").last()).toHaveValue(2026);
|
|
133
|
+
await expect
|
|
134
|
+
.element(page.getByLabelText("To year").first())
|
|
135
|
+
.toHaveValue("2026"); // keeps value in sync between inputs
|
|
136
|
+
const formData = new FormData(page.getByTestId("form").element());
|
|
137
|
+
expect(formData.get("from-year")).toBe("1949");
|
|
138
|
+
expect(formData.get("to-year")).toBe("2026");
|
|
131
139
|
});
|
|
132
|
-
test(
|
|
140
|
+
test("slider without suffix syncs empty suffix to thumb", async () => {
|
|
133
141
|
render(html `
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const slider = document.querySelector(
|
|
139
|
-
const thumb = document.querySelector(
|
|
142
|
+
<w-slider label="Single" min="0" max="100">
|
|
143
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
144
|
+
</w-slider>
|
|
145
|
+
`);
|
|
146
|
+
const slider = document.querySelector("w-slider");
|
|
147
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
140
148
|
await slider.updateComplete;
|
|
141
149
|
await thumb.updateComplete;
|
|
142
150
|
expect(slider.suffix).toBeUndefined();
|
|
143
|
-
expect(thumb.suffix).toBe(
|
|
151
|
+
expect(thumb.suffix).toBe("");
|
|
144
152
|
});
|
|
145
|
-
test(
|
|
153
|
+
test("deleting from number input works as expected", async () => {
|
|
146
154
|
const component = html `
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
+
<form data-testid="form">
|
|
156
|
+
<w-slider label="Production year" min="1950" max="2025" over under>
|
|
157
|
+
<p slot="description">Try typing a from value higher than a to value</p>
|
|
158
|
+
<w-slider-thumb slot="from" name="from"></w-slider-thumb>
|
|
159
|
+
<w-slider-thumb slot="to" name="to"></w-slider-thumb>
|
|
160
|
+
</w-slider>
|
|
161
|
+
</form>
|
|
162
|
+
`;
|
|
155
163
|
const page = render(component);
|
|
156
|
-
await expect.element(page.getByRole(
|
|
157
|
-
await userEvent.type(page.getByRole(
|
|
158
|
-
await expect.element(page.getByRole(
|
|
159
|
-
await userEvent.type(page.getByRole(
|
|
160
|
-
await expect.element(page.getByRole(
|
|
161
|
-
await userEvent.type(page.getByRole(
|
|
162
|
-
await expect.element(page.getByRole(
|
|
163
|
-
await userEvent.type(page.getByRole(
|
|
164
|
-
await expect.element(page.getByRole(
|
|
164
|
+
await expect.element(page.getByRole("spinbutton").last()).toHaveValue(2025);
|
|
165
|
+
await userEvent.type(page.getByRole("spinbutton").last(), "{Backspace}");
|
|
166
|
+
await expect.element(page.getByRole("spinbutton").last()).toHaveValue(202);
|
|
167
|
+
await userEvent.type(page.getByRole("spinbutton").last(), "{Backspace}");
|
|
168
|
+
await expect.element(page.getByRole("spinbutton").last()).toHaveValue(20);
|
|
169
|
+
await userEvent.type(page.getByRole("spinbutton").last(), "{Backspace}");
|
|
170
|
+
await expect.element(page.getByRole("spinbutton").last()).toHaveValue(2);
|
|
171
|
+
await userEvent.type(page.getByRole("spinbutton").last(), "{Backspace}");
|
|
172
|
+
await expect.element(page.getByRole("spinbutton").last()).not.toHaveValue();
|
|
165
173
|
});
|
|
166
|
-
test(
|
|
174
|
+
test("can reset slider by resetting surrounding form", async () => {
|
|
167
175
|
render(html `
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
const
|
|
176
|
+
<form>
|
|
177
|
+
<w-slider label="Slider from 0 - 10" min="0" max="10">
|
|
178
|
+
<p slot="description">
|
|
179
|
+
If you want to slide between 0 and 10, this slider has you covered.
|
|
180
|
+
</p>
|
|
181
|
+
<w-slider-thumb name="zero-ten" value="3"></w-slider-thumb>
|
|
182
|
+
</w-slider>
|
|
183
|
+
</form>
|
|
184
|
+
`);
|
|
185
|
+
const form = document.querySelector("form");
|
|
186
|
+
const wSlider = document.querySelector("w-slider");
|
|
187
|
+
const wSliderThumb = wSlider.querySelector("w-slider-thumb");
|
|
178
188
|
// sanity
|
|
179
189
|
expect(form).not.toBeNull();
|
|
180
190
|
expect(wSlider).not.toBeNull();
|
|
181
191
|
expect(wSliderThumb).not.toBeNull();
|
|
182
|
-
expect(wSliderThumb.value).toBe(
|
|
183
|
-
expect(Object.fromEntries(new FormData(form).entries())[
|
|
184
|
-
wSliderThumb.value =
|
|
192
|
+
expect(wSliderThumb.value).toBe("3");
|
|
193
|
+
expect(Object.fromEntries(new FormData(form).entries())["zero-ten"]).toBe("3");
|
|
194
|
+
wSliderThumb.value = "5";
|
|
185
195
|
await wSliderThumb.updateComplete;
|
|
186
|
-
expect(wSliderThumb.value).toBe(
|
|
187
|
-
expect(Object.fromEntries(new FormData(form).entries())[
|
|
196
|
+
expect(wSliderThumb.value).toBe("5");
|
|
197
|
+
expect(Object.fromEntries(new FormData(form).entries())["zero-ten"]).toBe("5");
|
|
188
198
|
// Reset the form
|
|
189
199
|
form.reset();
|
|
190
200
|
await wSliderThumb.updateComplete;
|
|
191
|
-
expect(wSliderThumb.value).toBe(
|
|
192
|
-
expect(Object.fromEntries(new FormData(form).entries())[
|
|
201
|
+
expect(wSliderThumb.value).toBe("3");
|
|
202
|
+
expect(Object.fromEntries(new FormData(form).entries())["zero-ten"]).toBe("3");
|
|
193
203
|
});
|
|
194
204
|
// labelFormatter tests
|
|
195
|
-
test(
|
|
205
|
+
test("labelFormatter formats min and max labels", async () => {
|
|
196
206
|
const component = html `
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
207
|
+
<w-slider label="Production year" min="1950" max="2025">
|
|
208
|
+
<w-slider-thumb slot="from" name="from"></w-slider-thumb>
|
|
209
|
+
<w-slider-thumb slot="to" name="to"></w-slider-thumb>
|
|
210
|
+
</w-slider>
|
|
211
|
+
`;
|
|
202
212
|
render(component);
|
|
203
|
-
const slider = document.querySelector(
|
|
213
|
+
const slider = document.querySelector("w-slider");
|
|
204
214
|
slider.labelFormatter = (slot) => {
|
|
205
|
-
if (slot ===
|
|
206
|
-
return
|
|
207
|
-
return
|
|
215
|
+
if (slot === "from")
|
|
216
|
+
return "Before 1950";
|
|
217
|
+
return "2025+";
|
|
208
218
|
};
|
|
209
219
|
await slider.updateComplete;
|
|
210
220
|
const fromThumb = document.querySelector('w-slider-thumb[slot="from"]');
|
|
@@ -212,72 +222,72 @@ test('labelFormatter formats min and max labels', async () => {
|
|
|
212
222
|
await fromThumb.updateComplete;
|
|
213
223
|
await toThumb.updateComplete;
|
|
214
224
|
// Check the visible labels are formatted
|
|
215
|
-
const fromMarker = fromThumb.shadowRoot.querySelector(
|
|
216
|
-
const toMarker = toThumb.shadowRoot.querySelector(
|
|
217
|
-
expect(fromMarker.textContent.trim()).toBe(
|
|
218
|
-
expect(toMarker.textContent.trim()).toBe(
|
|
225
|
+
const fromMarker = fromThumb.shadowRoot.querySelector(".w-slider-thumb__from-marker");
|
|
226
|
+
const toMarker = toThumb.shadowRoot.querySelector(".w-slider-thumb__to-marker");
|
|
227
|
+
expect(fromMarker.textContent.trim()).toBe("Before 1950");
|
|
228
|
+
expect(toMarker.textContent.trim()).toBe("2025+");
|
|
219
229
|
});
|
|
220
|
-
test(
|
|
230
|
+
test("labelFormatter can hide labels by returning empty string", async () => {
|
|
221
231
|
const component = html `
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
232
|
+
<w-slider label="Hidden labels" min="0" max="100">
|
|
233
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
234
|
+
</w-slider>
|
|
235
|
+
`;
|
|
226
236
|
render(component);
|
|
227
|
-
const slider = document.querySelector(
|
|
228
|
-
slider.labelFormatter = () =>
|
|
237
|
+
const slider = document.querySelector("w-slider");
|
|
238
|
+
slider.labelFormatter = () => "";
|
|
229
239
|
await slider.updateComplete;
|
|
230
|
-
const thumb = document.querySelector(
|
|
240
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
231
241
|
await thumb.updateComplete;
|
|
232
|
-
const fromMarker = thumb.shadowRoot.querySelector(
|
|
233
|
-
const toMarker = thumb.shadowRoot.querySelector(
|
|
234
|
-
expect(fromMarker.textContent.trim()).toBe(
|
|
235
|
-
expect(toMarker.textContent.trim()).toBe(
|
|
242
|
+
const fromMarker = thumb.shadowRoot.querySelector(".w-slider-thumb__from-marker");
|
|
243
|
+
const toMarker = thumb.shadowRoot.querySelector(".w-slider-thumb__to-marker");
|
|
244
|
+
expect(fromMarker.textContent.trim()).toBe("");
|
|
245
|
+
expect(toMarker.textContent.trim()).toBe("");
|
|
236
246
|
});
|
|
237
247
|
// valueFormatter tests
|
|
238
|
-
test(
|
|
248
|
+
test("valueFormatter formats tooltip display value", async () => {
|
|
239
249
|
const component = html `
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
250
|
+
<w-slider label="Price" min="0" max="100000">
|
|
251
|
+
<w-slider-thumb name="price" value="50000"></w-slider-thumb>
|
|
252
|
+
</w-slider>
|
|
253
|
+
`;
|
|
244
254
|
render(component);
|
|
245
|
-
const slider = document.querySelector(
|
|
255
|
+
const slider = document.querySelector("w-slider");
|
|
246
256
|
// Format with custom suffix
|
|
247
257
|
slider.valueFormatter = (value) => {
|
|
248
258
|
if (!value)
|
|
249
|
-
return
|
|
259
|
+
return "0";
|
|
250
260
|
return `${value} formatted`;
|
|
251
261
|
};
|
|
252
262
|
await slider.updateComplete;
|
|
253
|
-
const thumb = document.querySelector(
|
|
263
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
254
264
|
await thumb.updateComplete;
|
|
255
265
|
// Check the tooltip message content in w-attention
|
|
256
266
|
const tooltipMessage = thumb.shadowRoot.querySelector('w-attention span[slot="message"]');
|
|
257
|
-
expect(tooltipMessage.textContent.trim()).toBe(
|
|
267
|
+
expect(tooltipMessage.textContent.trim()).toBe("50000 formatted");
|
|
258
268
|
});
|
|
259
269
|
// tooltipFormatter tests
|
|
260
|
-
test(
|
|
270
|
+
test("tooltipFormatter formats tooltip display value", async () => {
|
|
261
271
|
const component = html `
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
272
|
+
<w-slider label="Hestekrefter" min="50" max="300" open-ended suffix="hk">
|
|
273
|
+
<w-slider-thumb slot="from" name="from-power" value="50"></w-slider-thumb>
|
|
274
|
+
<w-slider-thumb slot="to" name="to-power" value=""></w-slider-thumb>
|
|
275
|
+
</w-slider>
|
|
276
|
+
`;
|
|
267
277
|
render(component);
|
|
268
|
-
const slider = document.querySelector(
|
|
278
|
+
const slider = document.querySelector("w-slider");
|
|
269
279
|
slider.valueFormatter = (value, slot) => {
|
|
270
|
-
if (slot ===
|
|
271
|
-
return
|
|
280
|
+
if (slot === "from" && value === "") {
|
|
281
|
+
return "Min";
|
|
272
282
|
}
|
|
273
|
-
if (slot ===
|
|
274
|
-
return
|
|
283
|
+
if (slot === "to" && value === "") {
|
|
284
|
+
return "Max";
|
|
275
285
|
}
|
|
276
286
|
return value;
|
|
277
287
|
};
|
|
278
288
|
// Use 300+ hk in the tooltip
|
|
279
289
|
slider.tooltipFormatter = (value, slot) => {
|
|
280
|
-
if (slot ===
|
|
290
|
+
if (slot === "to" && value === "") {
|
|
281
291
|
return `${300}+`;
|
|
282
292
|
}
|
|
283
293
|
return value;
|
|
@@ -287,76 +297,87 @@ test('tooltipFormatter formats tooltip display value', async () => {
|
|
|
287
297
|
await thumb.updateComplete;
|
|
288
298
|
// Check the tooltip message content in w-attention
|
|
289
299
|
const tooltipMessage = thumb.shadowRoot.querySelector('w-attention span[slot="message"]');
|
|
290
|
-
expect(tooltipMessage.textContent.trim()).toBe(
|
|
300
|
+
expect(tooltipMessage.textContent.trim()).toBe("300+ hk");
|
|
291
301
|
});
|
|
292
302
|
// WCAG 2.1 Accessibility Tests
|
|
293
303
|
// Fieldset and legend tests (WCAG 1.3.1 Info and Relationships, 4.1.2 Name, Role, Value)
|
|
294
|
-
test(
|
|
304
|
+
test("slider uses fieldset with legend for proper grouping", async () => {
|
|
295
305
|
const component = html `
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
306
|
+
<w-slider label="Volume control" min="0" max="100">
|
|
307
|
+
<w-slider-thumb name="volume"></w-slider-thumb>
|
|
308
|
+
</w-slider>
|
|
309
|
+
`;
|
|
300
310
|
render(component);
|
|
301
|
-
const slider = document.querySelector(
|
|
311
|
+
const slider = document.querySelector("w-slider");
|
|
302
312
|
await slider.updateComplete;
|
|
303
|
-
const fieldset = slider.shadowRoot.querySelector(
|
|
304
|
-
const legend = fieldset.querySelector(
|
|
313
|
+
const fieldset = slider.shadowRoot.querySelector("fieldset");
|
|
314
|
+
const legend = fieldset.querySelector("legend");
|
|
305
315
|
expect(fieldset).not.toBeNull();
|
|
306
316
|
expect(legend).not.toBeNull();
|
|
307
|
-
expect(legend.textContent.trim()).toBe(
|
|
317
|
+
expect(legend.textContent.trim()).toBe("Volume control");
|
|
308
318
|
});
|
|
309
|
-
test(
|
|
319
|
+
test("range slider fieldset groups both thumbs together", async () => {
|
|
310
320
|
const component = html `
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
321
|
+
<w-slider label="Price range" min="0" max="1000">
|
|
322
|
+
<w-slider-thumb
|
|
323
|
+
slot="from"
|
|
324
|
+
aria-label="Minimum price"
|
|
325
|
+
name="min"
|
|
326
|
+
></w-slider-thumb>
|
|
327
|
+
<w-slider-thumb
|
|
328
|
+
slot="to"
|
|
329
|
+
aria-label="Maximum price"
|
|
330
|
+
name="max"
|
|
331
|
+
></w-slider-thumb>
|
|
332
|
+
</w-slider>
|
|
333
|
+
`;
|
|
316
334
|
render(component);
|
|
317
|
-
const slider = document.querySelector(
|
|
335
|
+
const slider = document.querySelector("w-slider");
|
|
318
336
|
await slider.updateComplete;
|
|
319
|
-
const fieldset = slider.shadowRoot.querySelector(
|
|
320
|
-
const legend = fieldset.querySelector(
|
|
337
|
+
const fieldset = slider.shadowRoot.querySelector("fieldset");
|
|
338
|
+
const legend = fieldset.querySelector("legend");
|
|
321
339
|
expect(fieldset).not.toBeNull();
|
|
322
|
-
expect(legend.textContent.trim()).toBe(
|
|
340
|
+
expect(legend.textContent.trim()).toBe("Price range");
|
|
323
341
|
// Both thumbs should be slotted within the fieldset
|
|
324
|
-
const slots = fieldset.querySelectorAll(
|
|
342
|
+
const slots = fieldset.querySelectorAll("slot");
|
|
325
343
|
expect(slots.length).toBeGreaterThan(0);
|
|
326
344
|
});
|
|
327
345
|
// Input type range accessibility (WCAG 4.1.2 Name, Role, Value)
|
|
328
|
-
test(
|
|
346
|
+
test("range input has proper aria-label", async () => {
|
|
329
347
|
const component = html `
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
348
|
+
<w-slider label="Brightness" min="0" max="100">
|
|
349
|
+
<w-slider-thumb name="brightness"></w-slider-thumb>
|
|
350
|
+
</w-slider>
|
|
351
|
+
`;
|
|
334
352
|
render(component);
|
|
335
|
-
const thumb = document.querySelector(
|
|
353
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
336
354
|
await thumb.updateComplete;
|
|
337
355
|
const rangeInput = thumb.shadowRoot.querySelector('input[type="range"]');
|
|
338
|
-
expect(rangeInput.getAttribute(
|
|
356
|
+
expect(rangeInput.getAttribute("aria-label")).toBe("Brightness");
|
|
339
357
|
});
|
|
340
|
-
test(
|
|
358
|
+
test("range input uses explicit aria-label when provided", async () => {
|
|
341
359
|
const component = html `
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
360
|
+
<w-slider label="Volume" min="0" max="100">
|
|
361
|
+
<w-slider-thumb
|
|
362
|
+
aria-label="Custom volume control"
|
|
363
|
+
name="volume"
|
|
364
|
+
></w-slider-thumb>
|
|
365
|
+
</w-slider>
|
|
366
|
+
`;
|
|
346
367
|
render(component);
|
|
347
|
-
const thumb = document.querySelector(
|
|
368
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
348
369
|
await thumb.updateComplete;
|
|
349
370
|
const rangeInput = thumb.shadowRoot.querySelector('input[type="range"]');
|
|
350
|
-
expect(rangeInput.getAttribute(
|
|
371
|
+
expect(rangeInput.getAttribute("aria-label")).toBe("Custom volume control");
|
|
351
372
|
});
|
|
352
373
|
// Range slider accessibility for from/to labels
|
|
353
|
-
test(
|
|
374
|
+
test("range slider thumbs get appropriate aria-labels when not explicitly set", async () => {
|
|
354
375
|
const component = html `
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
376
|
+
<w-slider label="Year range" min="2000" max="2025">
|
|
377
|
+
<w-slider-thumb slot="from" name="from-year"></w-slider-thumb>
|
|
378
|
+
<w-slider-thumb slot="to" name="to-year"></w-slider-thumb>
|
|
379
|
+
</w-slider>
|
|
380
|
+
`;
|
|
360
381
|
render(component);
|
|
361
382
|
const fromThumb = document.querySelector('w-slider-thumb[slot="from"]');
|
|
362
383
|
const toThumb = document.querySelector('w-slider-thumb[slot="to"]');
|
|
@@ -365,170 +386,182 @@ test('range slider thumbs get appropriate aria-labels when not explicitly set',
|
|
|
365
386
|
const fromRange = fromThumb.shadowRoot.querySelector('input[type="range"]');
|
|
366
387
|
const toRange = toThumb.shadowRoot.querySelector('input[type="range"]');
|
|
367
388
|
// Should append min/max to the parent label
|
|
368
|
-
expect(fromRange.getAttribute(
|
|
369
|
-
expect(toRange.getAttribute(
|
|
389
|
+
expect(fromRange.getAttribute("aria-label")).toBe("Year range min");
|
|
390
|
+
expect(toRange.getAttribute("aria-label")).toBe("Year range max");
|
|
370
391
|
});
|
|
371
392
|
// Input type number accessibility (WCAG 4.1.2 Name, Role, Value)
|
|
372
|
-
test(
|
|
393
|
+
test("number input (textfield) has proper aria-label", async () => {
|
|
373
394
|
const component = html `
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
395
|
+
<w-slider label="Quantity" min="0" max="100">
|
|
396
|
+
<w-slider-thumb name="qty"></w-slider-thumb>
|
|
397
|
+
</w-slider>
|
|
398
|
+
`;
|
|
378
399
|
render(component);
|
|
379
|
-
const thumb = document.querySelector(
|
|
400
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
380
401
|
await thumb.updateComplete;
|
|
381
|
-
const textfield = thumb.shadowRoot.querySelector(
|
|
382
|
-
expect(textfield.getAttribute(
|
|
402
|
+
const textfield = thumb.shadowRoot.querySelector("w-textfield");
|
|
403
|
+
expect(textfield.getAttribute("aria-label")).toBe("Quantity");
|
|
383
404
|
});
|
|
384
405
|
// Disabled state accessibility
|
|
385
|
-
test(
|
|
406
|
+
test("disabled slider marks all inputs as disabled", async () => {
|
|
386
407
|
const component = html `
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
408
|
+
<w-slider label="Disabled slider" min="0" max="100" disabled>
|
|
409
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
410
|
+
</w-slider>
|
|
411
|
+
`;
|
|
391
412
|
render(component);
|
|
392
|
-
const thumb = document.querySelector(
|
|
413
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
393
414
|
await thumb.updateComplete;
|
|
394
415
|
const rangeInput = thumb.shadowRoot.querySelector('input[type="range"]');
|
|
395
|
-
const textfield = thumb.shadowRoot.querySelector(
|
|
416
|
+
const textfield = thumb.shadowRoot.querySelector("w-textfield");
|
|
396
417
|
expect(rangeInput.disabled).toBe(true);
|
|
397
|
-
expect(textfield.hasAttribute(
|
|
418
|
+
expect(textfield.hasAttribute("disabled")).toBe(true);
|
|
398
419
|
});
|
|
399
|
-
test(
|
|
420
|
+
test("disabled fieldset communicates disabled state", async () => {
|
|
400
421
|
const component = html `
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
422
|
+
<w-slider label="Disabled control" min="0" max="100" disabled>
|
|
423
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
424
|
+
</w-slider>
|
|
425
|
+
`;
|
|
405
426
|
render(component);
|
|
406
|
-
const slider = document.querySelector(
|
|
427
|
+
const slider = document.querySelector("w-slider");
|
|
407
428
|
await slider.updateComplete;
|
|
408
|
-
const fieldset = slider.shadowRoot.querySelector(
|
|
429
|
+
const fieldset = slider.shadowRoot.querySelector("fieldset");
|
|
409
430
|
expect(fieldset.disabled).toBe(true);
|
|
410
431
|
});
|
|
411
432
|
// Error state accessibility (WCAG 3.3.1 Error Identification)
|
|
412
|
-
test(
|
|
433
|
+
test("invalid slider sets aria-invalid on fieldset", async () => {
|
|
413
434
|
const component = html `
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
435
|
+
<w-slider
|
|
436
|
+
label="Invalid slider"
|
|
437
|
+
min="0"
|
|
438
|
+
max="100"
|
|
439
|
+
invalid
|
|
440
|
+
error="Please select a value"
|
|
441
|
+
>
|
|
442
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
443
|
+
</w-slider>
|
|
444
|
+
`;
|
|
418
445
|
render(component);
|
|
419
|
-
const slider = document.querySelector(
|
|
446
|
+
const slider = document.querySelector("w-slider");
|
|
420
447
|
await slider.updateComplete;
|
|
421
448
|
// Wait for the state update triggered in connectedCallback
|
|
422
449
|
await slider.updateComplete;
|
|
423
|
-
const fieldset = slider.shadowRoot.querySelector(
|
|
424
|
-
expect(fieldset.getAttribute(
|
|
450
|
+
const fieldset = slider.shadowRoot.querySelector("fieldset");
|
|
451
|
+
expect(fieldset.getAttribute("aria-invalid")).toBe("true");
|
|
425
452
|
});
|
|
426
|
-
test(
|
|
453
|
+
test("error message is visible when slider is invalid", async () => {
|
|
427
454
|
const component = html `
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
455
|
+
<w-slider
|
|
456
|
+
label="Error slider"
|
|
457
|
+
min="0"
|
|
458
|
+
max="100"
|
|
459
|
+
invalid
|
|
460
|
+
error="Value is required"
|
|
461
|
+
>
|
|
462
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
463
|
+
</w-slider>
|
|
464
|
+
`;
|
|
432
465
|
render(component);
|
|
433
|
-
const slider = document.querySelector(
|
|
466
|
+
const slider = document.querySelector("w-slider");
|
|
434
467
|
await slider.updateComplete;
|
|
435
468
|
// Wait for the state update triggered in connectedCallback
|
|
436
469
|
await slider.updateComplete;
|
|
437
|
-
const errorMessage = slider.shadowRoot.querySelector(
|
|
470
|
+
const errorMessage = slider.shadowRoot.querySelector(".w-slider__error");
|
|
438
471
|
expect(errorMessage).not.toBeNull();
|
|
439
|
-
expect(errorMessage.textContent.trim()).toBe(
|
|
472
|
+
expect(errorMessage.textContent.trim()).toBe("Value is required");
|
|
440
473
|
});
|
|
441
474
|
// Screen reader min/max range announcement
|
|
442
|
-
test(
|
|
475
|
+
test("screen reader can access min and max range values", async () => {
|
|
443
476
|
const component = html `
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
477
|
+
<w-slider label="Range with bounds" min="10" max="90">
|
|
478
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
479
|
+
</w-slider>
|
|
480
|
+
`;
|
|
448
481
|
render(component);
|
|
449
|
-
const slider = document.querySelector(
|
|
482
|
+
const slider = document.querySelector("w-slider");
|
|
450
483
|
await slider.updateComplete;
|
|
451
|
-
const thumb = document.querySelector(
|
|
484
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
452
485
|
await thumb.updateComplete;
|
|
453
486
|
// Screen reader only text should contain min and max info
|
|
454
|
-
const srOnlyText = thumb.shadowRoot.querySelector(
|
|
487
|
+
const srOnlyText = thumb.shadowRoot.querySelector(".sr-only");
|
|
455
488
|
expect(srOnlyText).not.toBeNull();
|
|
456
|
-
expect(srOnlyText.textContent).toContain(
|
|
457
|
-
expect(srOnlyText.textContent).toContain(
|
|
489
|
+
expect(srOnlyText.textContent).toContain("10");
|
|
490
|
+
expect(srOnlyText.textContent).toContain("90");
|
|
458
491
|
});
|
|
459
|
-
test(
|
|
492
|
+
test("screen reader range announcement uses labelFormatter values", async () => {
|
|
460
493
|
const component = html `
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
494
|
+
<w-slider label="Formatted range" min="0" max="100">
|
|
495
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
496
|
+
</w-slider>
|
|
497
|
+
`;
|
|
465
498
|
render(component);
|
|
466
|
-
const slider = document.querySelector(
|
|
499
|
+
const slider = document.querySelector("w-slider");
|
|
467
500
|
slider.labelFormatter = (slot) => {
|
|
468
|
-
if (slot ===
|
|
469
|
-
return
|
|
470
|
-
return
|
|
501
|
+
if (slot === "from")
|
|
502
|
+
return "Zero";
|
|
503
|
+
return "One hundred";
|
|
471
504
|
};
|
|
472
505
|
await slider.updateComplete;
|
|
473
|
-
const thumb = document.querySelector(
|
|
506
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
474
507
|
await thumb.updateComplete;
|
|
475
|
-
const srOnlyText = thumb.shadowRoot.querySelector(
|
|
476
|
-
expect(srOnlyText.textContent).toContain(
|
|
477
|
-
expect(srOnlyText.textContent).toContain(
|
|
508
|
+
const srOnlyText = thumb.shadowRoot.querySelector(".sr-only");
|
|
509
|
+
expect(srOnlyText.textContent).toContain("Zero");
|
|
510
|
+
expect(srOnlyText.textContent).toContain("One hundred");
|
|
478
511
|
});
|
|
479
512
|
// Required field accessibility (WCAG 3.3.2 Labels or Instructions)
|
|
480
|
-
test(
|
|
513
|
+
test("required slider passes required state to thumb", async () => {
|
|
481
514
|
render(html `
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
const slider = document.querySelector(
|
|
515
|
+
<w-slider label="Required slider" min="0" max="100" required>
|
|
516
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
517
|
+
</w-slider>
|
|
518
|
+
`);
|
|
519
|
+
const slider = document.querySelector("w-slider");
|
|
487
520
|
await slider.updateComplete;
|
|
488
|
-
const thumb = document.querySelector(
|
|
521
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
489
522
|
await thumb.updateComplete;
|
|
490
523
|
// The required state should be synced from slider to thumb
|
|
491
524
|
expect(thumb.required).toBe(true);
|
|
492
525
|
// Verify the slider has required attribute in HTML
|
|
493
|
-
expect(slider.hasAttribute(
|
|
526
|
+
expect(slider.hasAttribute("required")).toBe(true);
|
|
494
527
|
});
|
|
495
528
|
// Hydration mismatch prevention tests
|
|
496
|
-
test(
|
|
529
|
+
test("aria-label is not set as host attribute (to avoid hydration mismatch)", async () => {
|
|
497
530
|
const component = html `
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
531
|
+
<w-slider label="Slider label" min="0" max="100">
|
|
532
|
+
<w-slider-thumb name="value"></w-slider-thumb>
|
|
533
|
+
</w-slider>
|
|
534
|
+
`;
|
|
502
535
|
render(component);
|
|
503
|
-
const slider = document.querySelector(
|
|
536
|
+
const slider = document.querySelector("w-slider");
|
|
504
537
|
await slider.updateComplete;
|
|
505
|
-
const thumb = document.querySelector(
|
|
538
|
+
const thumb = document.querySelector("w-slider-thumb");
|
|
506
539
|
await thumb.updateComplete;
|
|
507
540
|
// aria-label should NOT be a host attribute (to avoid hydration mismatch)
|
|
508
|
-
expect(thumb.hasAttribute(
|
|
541
|
+
expect(thumb.hasAttribute("aria-label")).toBe(false);
|
|
509
542
|
// But the property should be set by the parent
|
|
510
|
-
expect(thumb.ariaLabel).toBe(
|
|
543
|
+
expect(thumb.ariaLabel).toBe("Slider label");
|
|
511
544
|
// And the internal input should have the aria-label
|
|
512
545
|
const rangeInput = thumb.shadowRoot.querySelector('input[type="range"]');
|
|
513
|
-
expect(rangeInput.getAttribute(
|
|
546
|
+
expect(rangeInput.getAttribute("aria-label")).toBe("Slider label");
|
|
514
547
|
});
|
|
515
|
-
test(
|
|
548
|
+
test("aria-description is not set as host attribute (to avoid hydration mismatch)", async () => {
|
|
516
549
|
const component = html `
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
550
|
+
<w-slider label="Range" min="0" max="100">
|
|
551
|
+
<w-slider-thumb slot="from" name="from"></w-slider-thumb>
|
|
552
|
+
<w-slider-thumb slot="to" name="to"></w-slider-thumb>
|
|
553
|
+
</w-slider>
|
|
554
|
+
`;
|
|
522
555
|
render(component);
|
|
523
|
-
const slider = document.querySelector(
|
|
556
|
+
const slider = document.querySelector("w-slider");
|
|
524
557
|
await slider.updateComplete;
|
|
525
558
|
const fromThumb = document.querySelector('w-slider-thumb[slot="from"]');
|
|
526
559
|
const toThumb = document.querySelector('w-slider-thumb[slot="to"]');
|
|
527
560
|
await fromThumb.updateComplete;
|
|
528
561
|
await toThumb.updateComplete;
|
|
529
562
|
// aria-description should NOT be a host attribute (to avoid hydration mismatch)
|
|
530
|
-
expect(fromThumb.hasAttribute(
|
|
531
|
-
expect(toThumb.hasAttribute(
|
|
563
|
+
expect(fromThumb.hasAttribute("aria-description")).toBe(false);
|
|
564
|
+
expect(toThumb.hasAttribute("aria-description")).toBe(false);
|
|
532
565
|
// But the properties should be set
|
|
533
566
|
expect(fromThumb.ariaDescription).toBeTruthy();
|
|
534
567
|
expect(toThumb.ariaDescription).toBeTruthy();
|