@statistikzh/leu 0.28.1 → 0.28.3

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