@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.
Files changed (348) hide show
  1. package/dist/{Accordion-CwkI7sfx.js → Accordion-CaDTUDJG.js} +1 -1
  2. package/dist/Accordion.js +2 -2
  3. package/dist/{Button-D1aYnunQ.js → Button-BF3_6xgs.js} +3 -3
  4. package/dist/Button.js +4 -4
  5. package/dist/{ButtonGroup-CqThYjzX.js → ButtonGroup-grJiWGHI.js} +2 -2
  6. package/dist/ButtonGroup.js +5 -5
  7. package/dist/{ChartWrapper-BjVT4x-H.js → ChartWrapper-CeolXijF.js} +2 -2
  8. package/dist/ChartWrapper.js +3 -3
  9. package/dist/{Checkbox-HxYqp2w4.js → Checkbox-DGUZ1XtB.js} +2 -2
  10. package/dist/Checkbox.js +3 -3
  11. package/dist/{CheckboxGroup-DYws2rwt.js → CheckboxGroup-CGdyk_RP.js} +2 -2
  12. package/dist/CheckboxGroup.js +4 -4
  13. package/dist/{Chip-gKxD6IaZ.js → Chip-BpKH3_Nk.js} +1 -1
  14. package/dist/Chip.js +2 -2
  15. package/dist/{ChipGroup-ZvBzX_wd.js → ChipGroup-dSAMpfy1.js} +1 -1
  16. package/dist/ChipGroup.js +3 -3
  17. package/dist/ChipLink.js +2 -2
  18. package/dist/ChipRemovable.js +3 -3
  19. package/dist/ChipSelectable.js +2 -2
  20. package/dist/{Dialog-BYpzTprV.js → Dialog-CC674l80.js} +2 -2
  21. package/dist/Dialog.js +3 -3
  22. package/dist/{Dropdown-C4CgE4E-.js → Dropdown-B9YTM5N_.js} +5 -5
  23. package/dist/Dropdown.d.ts +2 -2
  24. package/dist/Dropdown.js +8 -8
  25. package/dist/{FileInput-nsnSQCaU.js → FileInput-D4kyWFkL.js} +4 -4
  26. package/dist/FileInput.js +6 -6
  27. package/dist/{Icon-D8HTPEFH.js → Icon-DOcb_NlX.js} +1 -1
  28. package/dist/Icon.js +2 -2
  29. package/dist/{Input-OrILqlax.js → Input-6Xu1N2sA.js} +2 -2
  30. package/dist/Input.js +3 -3
  31. package/dist/{LeuElement-C_lcHzQI.js → LeuElement-C3HedxlQ.js} +1 -1
  32. package/dist/{Menu-CFLCnI34.js → Menu-CJtyuUvP.js} +2 -2
  33. package/dist/{Menu-Z2b7dsB5.d.ts → Menu-txbYINTW.d.ts} +1 -1
  34. package/dist/Menu.d.ts +1 -1
  35. package/dist/Menu.js +4 -4
  36. package/dist/{MenuItem-LY4TRIho.d.ts → MenuItem-9TTOrL0Z.d.ts} +1 -1
  37. package/dist/{MenuItem-ICjLCGim.js → MenuItem-ClSE3auh.js} +2 -2
  38. package/dist/MenuItem.d.ts +1 -1
  39. package/dist/MenuItem.js +3 -3
  40. package/dist/{Message-Dw5D_0i1.js → Message-C55ydBaU.js} +2 -2
  41. package/dist/Message.js +3 -3
  42. package/dist/{Pagination-D1tP5FrM.js → Pagination-BVwKLcd5.js} +4 -4
  43. package/dist/Pagination.js +6 -6
  44. package/dist/{Placeholder-CnGzCZ5-.js → Placeholder-DFNppiVf.js} +1 -1
  45. package/dist/Placeholder.js +2 -2
  46. package/dist/{Popup-BiN_tZDN.js → Popup-D91ZiFWh.js} +1 -1
  47. package/dist/Popup.js +2 -2
  48. package/dist/{ProgressBar-BfJo_KyU.js → ProgressBar-DQGO2we8.js} +1 -1
  49. package/dist/ProgressBar.js +2 -2
  50. package/dist/{Radio-CV7vuQUj.js → Radio-BetZNoUQ.js} +1 -1
  51. package/dist/Radio.js +2 -2
  52. package/dist/{RadioGroup-C3XWSScc.js → RadioGroup-DzW5z_SD.js} +2 -2
  53. package/dist/RadioGroup.js +3 -3
  54. package/dist/{Range-C8RVrIM9.js → Range-9ijUzrty.js} +1 -1
  55. package/dist/Range.js +2 -2
  56. package/dist/{ScrollTop-B_TJ_k4m.js → ScrollTop-uDL4K_C6.js} +3 -3
  57. package/dist/ScrollTop.js +5 -5
  58. package/dist/{Select-CbPTrL3G.js → Select-ClGNTYfp.js} +7 -7
  59. package/dist/Select.d.ts +2 -2
  60. package/dist/Select.js +9 -9
  61. package/dist/{Spinner-ChKJQJTN.js → Spinner-B7ikVfUZ.js} +1 -1
  62. package/dist/Spinner.js +2 -2
  63. package/dist/{Tab-BJbzY1xd.js → Tab-CSHR71IX.js} +1 -1
  64. package/dist/Tab.js +2 -2
  65. package/dist/{TabGroup-BIaCHrKR.js → TabGroup-D7YbKXm8.js} +3 -3
  66. package/dist/TabGroup.js +4 -4
  67. package/dist/{TabPanel-CTyw410b.js → TabPanel-D_RHF3lv.js} +1 -1
  68. package/dist/TabPanel.js +2 -2
  69. package/dist/{Table-D3QmePJd.js → Table-CdosaNFb.js} +3 -3
  70. package/dist/Table.js +7 -7
  71. package/dist/{Tag-nUnWtHYy.js → Tag-BQBgkkAs.js} +1 -1
  72. package/dist/Tag.js +2 -2
  73. package/dist/{VisuallyHidden-DF2q9pTa.js → VisuallyHidden-CEBTA6hv.js} +1 -1
  74. package/dist/VisuallyHidden.js +2 -2
  75. package/dist/custom-elements.json +6445 -0
  76. package/dist/index.d.ts +2 -2
  77. package/dist/index.js +30 -30
  78. package/dist/leu-accordion.js +2 -2
  79. package/dist/leu-button-group.js +5 -5
  80. package/dist/leu-button.js +4 -4
  81. package/dist/leu-chart-wrapper.js +3 -3
  82. package/dist/leu-checkbox-group.js +4 -4
  83. package/dist/leu-checkbox.js +3 -3
  84. package/dist/leu-chip-group.js +3 -3
  85. package/dist/leu-chip-link.js +2 -2
  86. package/dist/leu-chip-removable.js +3 -3
  87. package/dist/leu-chip-selectable.js +2 -2
  88. package/dist/leu-dialog.js +3 -3
  89. package/dist/leu-dropdown.js +8 -8
  90. package/dist/leu-file-input.js +6 -6
  91. package/dist/leu-icon.js +2 -2
  92. package/dist/leu-input.js +3 -3
  93. package/dist/leu-menu-item.d.ts +1 -1
  94. package/dist/leu-menu-item.js +3 -3
  95. package/dist/leu-menu.d.ts +1 -1
  96. package/dist/leu-menu.js +4 -4
  97. package/dist/leu-message.js +3 -3
  98. package/dist/leu-pagination.js +6 -6
  99. package/dist/leu-placeholder.js +2 -2
  100. package/dist/leu-popup.js +2 -2
  101. package/dist/leu-progress-bar.js +2 -2
  102. package/dist/leu-radio-group.js +3 -3
  103. package/dist/leu-radio.js +2 -2
  104. package/dist/leu-range.js +2 -2
  105. package/dist/leu-scroll-top.js +5 -5
  106. package/dist/leu-select.js +9 -9
  107. package/dist/leu-spinner.js +2 -2
  108. package/dist/leu-tab-group.js +4 -4
  109. package/dist/leu-tab-panel.js +2 -2
  110. package/dist/leu-tab.js +2 -2
  111. package/dist/leu-table.js +7 -7
  112. package/dist/leu-tag.js +2 -2
  113. package/dist/leu-visually-hidden.js +2 -2
  114. package/dist/vscode.html-custom-data.json +11 -11
  115. package/dist/vue/index.d.ts +20 -20
  116. package/dist/web-types.json +28 -28
  117. package/package.json +4 -1
  118. package/.editorconfig +0 -29
  119. package/.github/workflows/ci.yml +0 -81
  120. package/.github/workflows/deploy-github-pages.yaml +0 -34
  121. package/.github/workflows/publish.yml +0 -28
  122. package/.github/workflows/release-please.yml +0 -19
  123. package/.husky/commit-msg +0 -1
  124. package/.husky/pre-commit +0 -1
  125. package/.nvmrc +0 -1
  126. package/.prettierignore +0 -2
  127. package/.release-please-manifest.json +0 -3
  128. package/.storybook/main.ts +0 -34
  129. package/.storybook/manager-head.html +0 -1
  130. package/.storybook/manager.ts +0 -6
  131. package/.storybook/preview.ts +0 -96
  132. package/.storybook/static/fonts/Inter-Black.woff2 +0 -0
  133. package/.storybook/static/fonts/Inter-Regular.woff2 +0 -0
  134. package/.storybook/static/fonts.css +0 -11
  135. package/.storybook/static/global.css +0 -5
  136. package/.storybook/static/logo.svg +0 -19
  137. package/.storybook/theme.ts +0 -8
  138. package/AGENTS.md +0 -162
  139. package/CHANGELOG.md +0 -601
  140. package/CODE_OF_CONDUCT.md +0 -128
  141. package/CONTRIBUTING.md +0 -42
  142. package/commitlint.config.cjs +0 -1
  143. package/custom-elements-manifest.config.js +0 -46
  144. package/eslint.config.mjs +0 -79
  145. package/postcss.config.cjs +0 -16
  146. package/release-please-config.json +0 -9
  147. package/scripts/generate-component/generate.js +0 -167
  148. package/scripts/generate-component/templates/[Name].ts +0 -31
  149. package/scripts/generate-component/templates/[name].css +0 -6
  150. package/scripts/generate-component/templates/[namespace]-[name].ts +0 -11
  151. package/scripts/generate-component/templates/stories/[name].stories.ts +0 -26
  152. package/scripts/generate-component/templates/test/[name].test.ts +0 -23
  153. package/scripts/postcss-leu-font-styles.cjs +0 -154
  154. package/src/components/accordion/Accordion.ts +0 -108
  155. package/src/components/accordion/accordion.css +0 -150
  156. package/src/components/accordion/leu-accordion.ts +0 -11
  157. package/src/components/accordion/stories/accordion.stories.ts +0 -62
  158. package/src/components/accordion/test/accordion.test.ts +0 -118
  159. package/src/components/button/Button.ts +0 -286
  160. package/src/components/button/button.css +0 -317
  161. package/src/components/button/leu-button.ts +0 -11
  162. package/src/components/button/stories/button.stories.ts +0 -366
  163. package/src/components/button/test/button.test.ts +0 -417
  164. package/src/components/button-group/ButtonGroup.ts +0 -97
  165. package/src/components/button-group/button-group.css +0 -5
  166. package/src/components/button-group/leu-button-group.ts +0 -11
  167. package/src/components/button-group/stories/button-group.stories.ts +0 -54
  168. package/src/components/button-group/test/button-group.test.ts +0 -105
  169. package/src/components/chart-wrapper/ChartWrapper.ts +0 -78
  170. package/src/components/chart-wrapper/chart-wrapper.css +0 -87
  171. package/src/components/chart-wrapper/leu-chart-wrapper.ts +0 -11
  172. package/src/components/chart-wrapper/stories/chart-wrapper.stories.ts +0 -58
  173. package/src/components/chart-wrapper/test/chart-wrapper.test.ts +0 -77
  174. package/src/components/checkbox/Checkbox.ts +0 -129
  175. package/src/components/checkbox/CheckboxGroup.ts +0 -57
  176. package/src/components/checkbox/checkbox-group.css +0 -29
  177. package/src/components/checkbox/checkbox.css +0 -81
  178. package/src/components/checkbox/leu-checkbox-group.ts +0 -11
  179. package/src/components/checkbox/leu-checkbox.ts +0 -11
  180. package/src/components/checkbox/stories/checkbox-group.stories.ts +0 -59
  181. package/src/components/checkbox/stories/checkbox.stories.ts +0 -72
  182. package/src/components/checkbox/test/checkbox-group.test.ts +0 -109
  183. package/src/components/checkbox/test/checkbox.test.ts +0 -247
  184. package/src/components/chip/Chip.ts +0 -19
  185. package/src/components/chip/ChipGroup.ts +0 -122
  186. package/src/components/chip/ChipLink.ts +0 -24
  187. package/src/components/chip/ChipRemovable.ts +0 -45
  188. package/src/components/chip/ChipSelectable.ts +0 -80
  189. package/src/components/chip/chip-group.css +0 -15
  190. package/src/components/chip/chip.css +0 -139
  191. package/src/components/chip/exports.ts +0 -4
  192. package/src/components/chip/leu-chip-group.ts +0 -11
  193. package/src/components/chip/leu-chip-link.ts +0 -11
  194. package/src/components/chip/leu-chip-removable.ts +0 -11
  195. package/src/components/chip/leu-chip-selectable.ts +0 -11
  196. package/src/components/chip/stories/chip-group.stories.ts +0 -159
  197. package/src/components/chip/stories/chip-link.stories.ts +0 -45
  198. package/src/components/chip/stories/chip-removable.stories.ts +0 -42
  199. package/src/components/chip/stories/chip-selectable.stories.ts +0 -54
  200. package/src/components/chip/test/chip-group.test.ts +0 -171
  201. package/src/components/chip/test/chip-link.test.ts +0 -54
  202. package/src/components/chip/test/chip-removable.test.ts +0 -105
  203. package/src/components/chip/test/chip-selectable.test.ts +0 -101
  204. package/src/components/chip/test/chip.test.ts +0 -22
  205. package/src/components/dialog/Dialog.ts +0 -86
  206. package/src/components/dialog/dialog.css +0 -157
  207. package/src/components/dialog/leu-dialog.ts +0 -11
  208. package/src/components/dialog/stories/dialog.stories.ts +0 -142
  209. package/src/components/dialog/test/dialog.test.ts +0 -85
  210. package/src/components/dropdown/Dropdown.ts +0 -152
  211. package/src/components/dropdown/dropdown.css +0 -16
  212. package/src/components/dropdown/leu-dropdown.ts +0 -11
  213. package/src/components/dropdown/stories/dropdown.stories.ts +0 -58
  214. package/src/components/dropdown/test/dropdown.test.ts +0 -59
  215. package/src/components/file-input/FileInput.ts +0 -324
  216. package/src/components/file-input/file-input.css +0 -118
  217. package/src/components/file-input/leu-file-input.ts +0 -11
  218. package/src/components/file-input/stories/file-input.stories.ts +0 -45
  219. package/src/components/file-input/test/file-input.test.ts +0 -62
  220. package/src/components/icon/Icon.ts +0 -47
  221. package/src/components/icon/icon.css +0 -10
  222. package/src/components/icon/leu-icon.ts +0 -11
  223. package/src/components/icon/paths.ts +0 -219
  224. package/src/components/icon/stories/icon.stories.ts +0 -79
  225. package/src/components/icon/test/icon.test.ts +0 -50
  226. package/src/components/input/Input.ts +0 -469
  227. package/src/components/input/input.css +0 -238
  228. package/src/components/input/leu-input.ts +0 -11
  229. package/src/components/input/stories/input.stories.ts +0 -204
  230. package/src/components/input/test/input.test.ts +0 -603
  231. package/src/components/menu/Menu.ts +0 -149
  232. package/src/components/menu/MenuItem.ts +0 -168
  233. package/src/components/menu/leu-menu-item.ts +0 -11
  234. package/src/components/menu/leu-menu.ts +0 -11
  235. package/src/components/menu/menu-item.css +0 -77
  236. package/src/components/menu/menu.css +0 -19
  237. package/src/components/menu/stories/menu-item.stories.ts +0 -81
  238. package/src/components/menu/stories/menu.stories.ts +0 -54
  239. package/src/components/menu/test/menu-item.test.ts +0 -210
  240. package/src/components/menu/test/menu.test.ts +0 -125
  241. package/src/components/message/Message.ts +0 -118
  242. package/src/components/message/leu-message.ts +0 -11
  243. package/src/components/message/message.css +0 -163
  244. package/src/components/message/stories/message.mdx +0 -76
  245. package/src/components/message/stories/message.stories.ts +0 -149
  246. package/src/components/message/test/message.test.ts +0 -96
  247. package/src/components/pagination/Pagination.ts +0 -192
  248. package/src/components/pagination/leu-pagination.ts +0 -11
  249. package/src/components/pagination/pagination.css +0 -54
  250. package/src/components/pagination/stories/pagination.stories.ts +0 -115
  251. package/src/components/pagination/test/pagination.test.ts +0 -210
  252. package/src/components/placeholder/Placeholder.ts +0 -33
  253. package/src/components/placeholder/leu-placeholder.ts +0 -11
  254. package/src/components/placeholder/placeholder.css +0 -59
  255. package/src/components/placeholder/stories/placeholder.stories.ts +0 -34
  256. package/src/components/placeholder/test/placeholder.test.ts +0 -31
  257. package/src/components/popup/Popup.ts +0 -264
  258. package/src/components/popup/leu-popup.ts +0 -11
  259. package/src/components/popup/popup.css +0 -24
  260. package/src/components/popup/stories/popup.stories.ts +0 -117
  261. package/src/components/popup/test/popup.test.ts +0 -90
  262. package/src/components/progress-bar/ProgressBar.ts +0 -52
  263. package/src/components/progress-bar/leu-progress-bar.ts +0 -11
  264. package/src/components/progress-bar/progress-bar.css +0 -97
  265. package/src/components/progress-bar/stories/progress-bar.stories.ts +0 -39
  266. package/src/components/progress-bar/test/progress-bar.test.ts +0 -61
  267. package/src/components/radio/Radio.ts +0 -59
  268. package/src/components/radio/RadioGroup.ts +0 -181
  269. package/src/components/radio/leu-radio-group.ts +0 -11
  270. package/src/components/radio/leu-radio.ts +0 -11
  271. package/src/components/radio/radio-group.css +0 -29
  272. package/src/components/radio/radio.css +0 -76
  273. package/src/components/radio/stories/radio-group.stories.ts +0 -54
  274. package/src/components/radio/stories/radio.stories.ts +0 -55
  275. package/src/components/radio/test/radio-group.test.ts +0 -83
  276. package/src/components/radio/test/radio.test.ts +0 -119
  277. package/src/components/range/Range.ts +0 -400
  278. package/src/components/range/leu-range.ts +0 -11
  279. package/src/components/range/range.css +0 -227
  280. package/src/components/range/stories/range.stories.ts +0 -185
  281. package/src/components/range/test/range.test.ts +0 -228
  282. package/src/components/scroll-top/ScrollTop.ts +0 -91
  283. package/src/components/scroll-top/leu-scroll-top.ts +0 -11
  284. package/src/components/scroll-top/scroll-top.css +0 -50
  285. package/src/components/scroll-top/stories/scroll-top.stories.ts +0 -217
  286. package/src/components/scroll-top/test/scroll-top.test.ts +0 -22
  287. package/src/components/select/Select.ts +0 -570
  288. package/src/components/select/leu-select.ts +0 -11
  289. package/src/components/select/select.css +0 -222
  290. package/src/components/select/stories/select.stories.ts +0 -173
  291. package/src/components/select/test/fixtures.ts +0 -162
  292. package/src/components/select/test/select.test.ts +0 -937
  293. package/src/components/spinner/Spinner.ts +0 -31
  294. package/src/components/spinner/leu-spinner.ts +0 -11
  295. package/src/components/spinner/spinner.css +0 -20
  296. package/src/components/spinner/stories/spinner.stories.ts +0 -29
  297. package/src/components/spinner/test/spinner.test.ts +0 -30
  298. package/src/components/tab/Tab.ts +0 -72
  299. package/src/components/tab/TabGroup.ts +0 -267
  300. package/src/components/tab/TabPanel.ts +0 -59
  301. package/src/components/tab/leu-tab-group.ts +0 -11
  302. package/src/components/tab/leu-tab-panel.ts +0 -11
  303. package/src/components/tab/leu-tab.ts +0 -11
  304. package/src/components/tab/stories/tab.stories.ts +0 -97
  305. package/src/components/tab/tab-group.css +0 -63
  306. package/src/components/tab/tab-panel.css +0 -10
  307. package/src/components/tab/tab.css +0 -54
  308. package/src/components/tab/test/tab-group.test.ts +0 -426
  309. package/src/components/tab/test/tab-panel.test.ts +0 -102
  310. package/src/components/tab/test/tab.test.ts +0 -139
  311. package/src/components/table/Table.ts +0 -253
  312. package/src/components/table/leu-table.ts +0 -11
  313. package/src/components/table/stories/table.stories.ts +0 -131
  314. package/src/components/table/table.css +0 -112
  315. package/src/components/table/test/table.test.ts +0 -37
  316. package/src/components/tag/Tag.ts +0 -28
  317. package/src/components/tag/leu-tag.ts +0 -11
  318. package/src/components/tag/stories/tag.stories.ts +0 -107
  319. package/src/components/tag/tag.css +0 -42
  320. package/src/components/tag/test/tag.test.ts +0 -28
  321. package/src/components/visually-hidden/VisuallyHidden.ts +0 -16
  322. package/src/components/visually-hidden/leu-visually-hidden.ts +0 -11
  323. package/src/components/visually-hidden/stories/visually-hidden.stories.ts +0 -22
  324. package/src/components/visually-hidden/test/visually-hidden.test.ts +0 -34
  325. package/src/components/visually-hidden/visually-hidden.css +0 -10
  326. package/src/docs/contributing.mdx +0 -154
  327. package/src/docs/installation.mdx +0 -35
  328. package/src/docs/theme.mdx +0 -400
  329. package/src/docs/usage.mdx +0 -73
  330. package/src/global.d.ts +0 -11
  331. package/src/index.ts +0 -29
  332. package/src/lib/LeuElement.ts +0 -43
  333. package/src/lib/a11y.ts +0 -26
  334. package/src/lib/hasSlotController.ts +0 -74
  335. package/src/lib/mixins/FormAssociatedMixin.ts +0 -115
  336. package/src/lib/styleMap.ts +0 -139
  337. package/src/lib/utils.ts +0 -45
  338. package/src/styles/common-styles.css +0 -14
  339. package/src/styles/custom-media.css +0 -6
  340. package/src/styles/font-definitions.json +0 -210
  341. package/src/styles/style.stories.ts +0 -64
  342. package/src/styles/theme.css +0 -90
  343. package/stat_zh.png +0 -0
  344. package/stylelint.config.mjs +0 -23
  345. package/tsconfig.build.json +0 -24
  346. package/tsconfig.json +0 -14
  347. package/tsdown.config.ts +0 -35
  348. 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,5 +0,0 @@
1
- .group {
2
- display: flex;
3
- gap: 0.5rem;
4
- flex-wrap: wrap;
5
- }
@@ -1,11 +0,0 @@
1
- import { LeuButtonGroup } from "./ButtonGroup.js"
2
-
3
- export { LeuButtonGroup }
4
-
5
- LeuButtonGroup.define("leu-button-group")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-button-group": LeuButtonGroup
10
- }
11
- }
@@ -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
- })