@statistikzh/leu 0.28.0 → 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 (346) hide show
  1. package/dist/{Accordion-D9kLsiBW.js → Accordion-CaDTUDJG.js} +1 -1
  2. package/dist/Accordion.js +2 -2
  3. package/dist/{Button-DyNVOHCd.js → Button-BF3_6xgs.js} +3 -3
  4. package/dist/Button.js +4 -4
  5. package/dist/{ButtonGroup-MEh4vb5a.js → ButtonGroup-grJiWGHI.js} +2 -2
  6. package/dist/ButtonGroup.js +5 -5
  7. package/dist/{ChartWrapper-DAl91BIN.js → ChartWrapper-CeolXijF.js} +2 -2
  8. package/dist/ChartWrapper.js +3 -3
  9. package/dist/{Checkbox-CGGyUW9U.js → Checkbox-DGUZ1XtB.js} +2 -2
  10. package/dist/Checkbox.js +3 -3
  11. package/dist/{CheckboxGroup-DXt5iMdj.js → CheckboxGroup-CGdyk_RP.js} +2 -2
  12. package/dist/CheckboxGroup.js +4 -4
  13. package/dist/{Chip-BGs71WGH.js → Chip-BpKH3_Nk.js} +1 -1
  14. package/dist/Chip.js +2 -2
  15. package/dist/{ChipGroup-BcGyusP-.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-BzuyL1U3.js → Dialog-CC674l80.js} +2 -2
  21. package/dist/Dialog.js +3 -3
  22. package/dist/{Dropdown-plyBTM15.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-BT3Fe-0J.js → FileInput-D4kyWFkL.js} +8 -6
  26. package/dist/FileInput.d.ts +1 -1
  27. package/dist/FileInput.js +6 -6
  28. package/dist/{Icon-D83qesg5.js → Icon-DOcb_NlX.js} +1 -1
  29. package/dist/Icon.js +2 -2
  30. package/dist/{Input-D7zS50oz.js → Input-6Xu1N2sA.js} +2 -2
  31. package/dist/Input.js +3 -3
  32. package/dist/{LeuElement-DQI8cqZV.js → LeuElement-C3HedxlQ.js} +1 -1
  33. package/dist/{Menu-DRU1LiMM.js → Menu-CJtyuUvP.js} +2 -2
  34. package/dist/{Menu-Z2b7dsB5.d.ts → Menu-txbYINTW.d.ts} +1 -1
  35. package/dist/Menu.d.ts +1 -1
  36. package/dist/Menu.js +4 -4
  37. package/dist/{MenuItem-LY4TRIho.d.ts → MenuItem-9TTOrL0Z.d.ts} +1 -1
  38. package/dist/{MenuItem-DCttylRO.js → MenuItem-ClSE3auh.js} +2 -2
  39. package/dist/MenuItem.d.ts +1 -1
  40. package/dist/MenuItem.js +3 -3
  41. package/dist/{Message-0NxnKEqw.js → Message-C55ydBaU.js} +2 -2
  42. package/dist/Message.js +3 -3
  43. package/dist/{Pagination-CIy7YvWE.js → Pagination-BVwKLcd5.js} +4 -4
  44. package/dist/Pagination.js +6 -6
  45. package/dist/{Placeholder-Dol_X5Hp.js → Placeholder-DFNppiVf.js} +1 -1
  46. package/dist/Placeholder.js +2 -2
  47. package/dist/{Popup-nJrJHGSy.js → Popup-D91ZiFWh.js} +1 -1
  48. package/dist/Popup.js +2 -2
  49. package/dist/{ProgressBar-Dmq9veqU.js → ProgressBar-DQGO2we8.js} +1 -1
  50. package/dist/ProgressBar.js +2 -2
  51. package/dist/{Radio-W5ck_IJI.js → Radio-BetZNoUQ.js} +1 -1
  52. package/dist/Radio.js +2 -2
  53. package/dist/{RadioGroup-De5x2YCO.js → RadioGroup-DzW5z_SD.js} +2 -2
  54. package/dist/RadioGroup.js +3 -3
  55. package/dist/{Range-NCdfDkeD.js → Range-9ijUzrty.js} +1 -1
  56. package/dist/Range.js +2 -2
  57. package/dist/{ScrollTop-DwcNIKmN.js → ScrollTop-uDL4K_C6.js} +3 -3
  58. package/dist/ScrollTop.js +5 -5
  59. package/dist/{Select-Bpicra9q.js → Select-ClGNTYfp.js} +7 -7
  60. package/dist/Select.d.ts +2 -2
  61. package/dist/Select.js +9 -9
  62. package/dist/{Spinner-BBiVZxFH.js → Spinner-B7ikVfUZ.js} +1 -1
  63. package/dist/Spinner.js +2 -2
  64. package/dist/{Tab-Ce9nrDok.js → Tab-CSHR71IX.js} +1 -1
  65. package/dist/Tab.js +2 -2
  66. package/dist/{TabGroup-C-cd4Wcx.js → TabGroup-D7YbKXm8.js} +3 -3
  67. package/dist/TabGroup.js +4 -4
  68. package/dist/{TabPanel-BW1ydVBT.js → TabPanel-D_RHF3lv.js} +1 -1
  69. package/dist/TabPanel.js +2 -2
  70. package/dist/{Table-DiYqIzBu.js → Table-CdosaNFb.js} +3 -3
  71. package/dist/Table.js +7 -7
  72. package/dist/{Tag-Ct8Hhv7W.js → Tag-BQBgkkAs.js} +1 -1
  73. package/dist/Tag.js +2 -2
  74. package/dist/{VisuallyHidden-CpYXyuC7.js → VisuallyHidden-CEBTA6hv.js} +1 -1
  75. package/dist/VisuallyHidden.js +2 -2
  76. package/dist/custom-elements.json +6445 -0
  77. package/dist/index.d.ts +2 -2
  78. package/dist/index.js +30 -30
  79. package/dist/leu-accordion.js +2 -2
  80. package/dist/leu-button-group.js +5 -5
  81. package/dist/leu-button.js +4 -4
  82. package/dist/leu-chart-wrapper.js +3 -3
  83. package/dist/leu-checkbox-group.js +4 -4
  84. package/dist/leu-checkbox.js +3 -3
  85. package/dist/leu-chip-group.js +3 -3
  86. package/dist/leu-chip-link.js +2 -2
  87. package/dist/leu-chip-removable.js +3 -3
  88. package/dist/leu-chip-selectable.js +2 -2
  89. package/dist/leu-dialog.js +3 -3
  90. package/dist/leu-dropdown.js +8 -8
  91. package/dist/leu-file-input.js +6 -6
  92. package/dist/leu-icon.js +2 -2
  93. package/dist/leu-input.js +3 -3
  94. package/dist/leu-menu-item.d.ts +1 -1
  95. package/dist/leu-menu-item.js +3 -3
  96. package/dist/leu-menu.d.ts +1 -1
  97. package/dist/leu-menu.js +4 -4
  98. package/dist/leu-message.js +3 -3
  99. package/dist/leu-pagination.js +6 -6
  100. package/dist/leu-placeholder.js +2 -2
  101. package/dist/leu-popup.js +2 -2
  102. package/dist/leu-progress-bar.js +2 -2
  103. package/dist/leu-radio-group.js +3 -3
  104. package/dist/leu-radio.js +2 -2
  105. package/dist/leu-range.js +2 -2
  106. package/dist/leu-scroll-top.js +5 -5
  107. package/dist/leu-select.js +9 -9
  108. package/dist/leu-spinner.js +2 -2
  109. package/dist/leu-tab-group.js +4 -4
  110. package/dist/leu-tab-panel.js +2 -2
  111. package/dist/leu-tab.js +2 -2
  112. package/dist/leu-table.js +7 -7
  113. package/dist/leu-tag.js +2 -2
  114. package/dist/leu-visually-hidden.js +2 -2
  115. package/dist/web-types.json +1 -1
  116. package/package.json +9 -4
  117. package/.editorconfig +0 -29
  118. package/.github/workflows/ci.yml +0 -81
  119. package/.github/workflows/deploy-github-pages.yaml +0 -34
  120. package/.github/workflows/publish.yml +0 -30
  121. package/.github/workflows/release-please.yml +0 -19
  122. package/.husky/commit-msg +0 -1
  123. package/.husky/pre-commit +0 -1
  124. package/.nvmrc +0 -1
  125. package/.prettierignore +0 -2
  126. package/.release-please-manifest.json +0 -3
  127. package/.storybook/main.ts +0 -34
  128. package/.storybook/manager-head.html +0 -1
  129. package/.storybook/manager.ts +0 -6
  130. package/.storybook/preview.ts +0 -96
  131. package/.storybook/static/fonts/Inter-Black.woff2 +0 -0
  132. package/.storybook/static/fonts/Inter-Regular.woff2 +0 -0
  133. package/.storybook/static/fonts.css +0 -11
  134. package/.storybook/static/global.css +0 -5
  135. package/.storybook/static/logo.svg +0 -19
  136. package/.storybook/theme.ts +0 -8
  137. package/CHANGELOG.md +0 -594
  138. package/CODE_OF_CONDUCT.md +0 -128
  139. package/CONTRIBUTING.md +0 -42
  140. package/commitlint.config.cjs +0 -1
  141. package/custom-elements-manifest.config.js +0 -46
  142. package/eslint.config.mjs +0 -79
  143. package/postcss.config.cjs +0 -16
  144. package/release-please-config.json +0 -9
  145. package/scripts/generate-component/generate.js +0 -167
  146. package/scripts/generate-component/templates/[Name].ts +0 -31
  147. package/scripts/generate-component/templates/[name].css +0 -6
  148. package/scripts/generate-component/templates/[namespace]-[name].ts +0 -11
  149. package/scripts/generate-component/templates/stories/[name].stories.ts +0 -26
  150. package/scripts/generate-component/templates/test/[name].test.ts +0 -23
  151. package/scripts/postcss-leu-font-styles.cjs +0 -154
  152. package/src/components/accordion/Accordion.ts +0 -108
  153. package/src/components/accordion/accordion.css +0 -150
  154. package/src/components/accordion/leu-accordion.ts +0 -11
  155. package/src/components/accordion/stories/accordion.stories.ts +0 -62
  156. package/src/components/accordion/test/accordion.test.ts +0 -118
  157. package/src/components/button/Button.ts +0 -286
  158. package/src/components/button/button.css +0 -317
  159. package/src/components/button/leu-button.ts +0 -11
  160. package/src/components/button/stories/button.stories.ts +0 -366
  161. package/src/components/button/test/button.test.ts +0 -417
  162. package/src/components/button-group/ButtonGroup.ts +0 -97
  163. package/src/components/button-group/button-group.css +0 -5
  164. package/src/components/button-group/leu-button-group.ts +0 -11
  165. package/src/components/button-group/stories/button-group.stories.ts +0 -54
  166. package/src/components/button-group/test/button-group.test.ts +0 -105
  167. package/src/components/chart-wrapper/ChartWrapper.ts +0 -78
  168. package/src/components/chart-wrapper/chart-wrapper.css +0 -87
  169. package/src/components/chart-wrapper/leu-chart-wrapper.ts +0 -11
  170. package/src/components/chart-wrapper/stories/chart-wrapper.stories.ts +0 -58
  171. package/src/components/chart-wrapper/test/chart-wrapper.test.ts +0 -77
  172. package/src/components/checkbox/Checkbox.ts +0 -129
  173. package/src/components/checkbox/CheckboxGroup.ts +0 -57
  174. package/src/components/checkbox/checkbox-group.css +0 -29
  175. package/src/components/checkbox/checkbox.css +0 -81
  176. package/src/components/checkbox/leu-checkbox-group.ts +0 -11
  177. package/src/components/checkbox/leu-checkbox.ts +0 -11
  178. package/src/components/checkbox/stories/checkbox-group.stories.ts +0 -59
  179. package/src/components/checkbox/stories/checkbox.stories.ts +0 -72
  180. package/src/components/checkbox/test/checkbox-group.test.ts +0 -109
  181. package/src/components/checkbox/test/checkbox.test.ts +0 -247
  182. package/src/components/chip/Chip.ts +0 -19
  183. package/src/components/chip/ChipGroup.ts +0 -122
  184. package/src/components/chip/ChipLink.ts +0 -24
  185. package/src/components/chip/ChipRemovable.ts +0 -45
  186. package/src/components/chip/ChipSelectable.ts +0 -80
  187. package/src/components/chip/chip-group.css +0 -15
  188. package/src/components/chip/chip.css +0 -139
  189. package/src/components/chip/exports.ts +0 -4
  190. package/src/components/chip/leu-chip-group.ts +0 -11
  191. package/src/components/chip/leu-chip-link.ts +0 -11
  192. package/src/components/chip/leu-chip-removable.ts +0 -11
  193. package/src/components/chip/leu-chip-selectable.ts +0 -11
  194. package/src/components/chip/stories/chip-group.stories.ts +0 -159
  195. package/src/components/chip/stories/chip-link.stories.ts +0 -45
  196. package/src/components/chip/stories/chip-removable.stories.ts +0 -42
  197. package/src/components/chip/stories/chip-selectable.stories.ts +0 -54
  198. package/src/components/chip/test/chip-group.test.ts +0 -171
  199. package/src/components/chip/test/chip-link.test.ts +0 -54
  200. package/src/components/chip/test/chip-removable.test.ts +0 -105
  201. package/src/components/chip/test/chip-selectable.test.ts +0 -101
  202. package/src/components/chip/test/chip.test.ts +0 -22
  203. package/src/components/dialog/Dialog.ts +0 -86
  204. package/src/components/dialog/dialog.css +0 -157
  205. package/src/components/dialog/leu-dialog.ts +0 -11
  206. package/src/components/dialog/stories/dialog.stories.ts +0 -142
  207. package/src/components/dialog/test/dialog.test.ts +0 -85
  208. package/src/components/dropdown/Dropdown.ts +0 -152
  209. package/src/components/dropdown/dropdown.css +0 -16
  210. package/src/components/dropdown/leu-dropdown.ts +0 -11
  211. package/src/components/dropdown/stories/dropdown.stories.ts +0 -58
  212. package/src/components/dropdown/test/dropdown.test.ts +0 -59
  213. package/src/components/file-input/FileInput.ts +0 -322
  214. package/src/components/file-input/file-input.css +0 -118
  215. package/src/components/file-input/leu-file-input.ts +0 -11
  216. package/src/components/file-input/stories/file-input.stories.ts +0 -45
  217. package/src/components/file-input/test/file-input.test.ts +0 -38
  218. package/src/components/icon/Icon.ts +0 -47
  219. package/src/components/icon/icon.css +0 -10
  220. package/src/components/icon/leu-icon.ts +0 -11
  221. package/src/components/icon/paths.ts +0 -219
  222. package/src/components/icon/stories/icon.stories.ts +0 -79
  223. package/src/components/icon/test/icon.test.ts +0 -50
  224. package/src/components/input/Input.ts +0 -469
  225. package/src/components/input/input.css +0 -238
  226. package/src/components/input/leu-input.ts +0 -11
  227. package/src/components/input/stories/input.stories.ts +0 -204
  228. package/src/components/input/test/input.test.ts +0 -603
  229. package/src/components/menu/Menu.ts +0 -149
  230. package/src/components/menu/MenuItem.ts +0 -168
  231. package/src/components/menu/leu-menu-item.ts +0 -11
  232. package/src/components/menu/leu-menu.ts +0 -11
  233. package/src/components/menu/menu-item.css +0 -77
  234. package/src/components/menu/menu.css +0 -19
  235. package/src/components/menu/stories/menu-item.stories.ts +0 -81
  236. package/src/components/menu/stories/menu.stories.ts +0 -54
  237. package/src/components/menu/test/menu-item.test.ts +0 -210
  238. package/src/components/menu/test/menu.test.ts +0 -125
  239. package/src/components/message/Message.ts +0 -118
  240. package/src/components/message/leu-message.ts +0 -11
  241. package/src/components/message/message.css +0 -163
  242. package/src/components/message/stories/message.mdx +0 -76
  243. package/src/components/message/stories/message.stories.ts +0 -149
  244. package/src/components/message/test/message.test.ts +0 -96
  245. package/src/components/pagination/Pagination.ts +0 -192
  246. package/src/components/pagination/leu-pagination.ts +0 -11
  247. package/src/components/pagination/pagination.css +0 -54
  248. package/src/components/pagination/stories/pagination.stories.ts +0 -115
  249. package/src/components/pagination/test/pagination.test.ts +0 -210
  250. package/src/components/placeholder/Placeholder.ts +0 -33
  251. package/src/components/placeholder/leu-placeholder.ts +0 -11
  252. package/src/components/placeholder/placeholder.css +0 -59
  253. package/src/components/placeholder/stories/placeholder.stories.ts +0 -34
  254. package/src/components/placeholder/test/placeholder.test.ts +0 -31
  255. package/src/components/popup/Popup.ts +0 -264
  256. package/src/components/popup/leu-popup.ts +0 -11
  257. package/src/components/popup/popup.css +0 -24
  258. package/src/components/popup/stories/popup.stories.ts +0 -117
  259. package/src/components/popup/test/popup.test.ts +0 -90
  260. package/src/components/progress-bar/ProgressBar.ts +0 -52
  261. package/src/components/progress-bar/leu-progress-bar.ts +0 -11
  262. package/src/components/progress-bar/progress-bar.css +0 -97
  263. package/src/components/progress-bar/stories/progress-bar.stories.ts +0 -39
  264. package/src/components/progress-bar/test/progress-bar.test.ts +0 -61
  265. package/src/components/radio/Radio.ts +0 -59
  266. package/src/components/radio/RadioGroup.ts +0 -181
  267. package/src/components/radio/leu-radio-group.ts +0 -11
  268. package/src/components/radio/leu-radio.ts +0 -11
  269. package/src/components/radio/radio-group.css +0 -29
  270. package/src/components/radio/radio.css +0 -76
  271. package/src/components/radio/stories/radio-group.stories.ts +0 -54
  272. package/src/components/radio/stories/radio.stories.ts +0 -55
  273. package/src/components/radio/test/radio-group.test.ts +0 -83
  274. package/src/components/radio/test/radio.test.ts +0 -119
  275. package/src/components/range/Range.ts +0 -400
  276. package/src/components/range/leu-range.ts +0 -11
  277. package/src/components/range/range.css +0 -227
  278. package/src/components/range/stories/range.stories.ts +0 -185
  279. package/src/components/range/test/range.test.ts +0 -228
  280. package/src/components/scroll-top/ScrollTop.ts +0 -91
  281. package/src/components/scroll-top/leu-scroll-top.ts +0 -11
  282. package/src/components/scroll-top/scroll-top.css +0 -50
  283. package/src/components/scroll-top/stories/scroll-top.stories.ts +0 -217
  284. package/src/components/scroll-top/test/scroll-top.test.ts +0 -22
  285. package/src/components/select/Select.ts +0 -570
  286. package/src/components/select/leu-select.ts +0 -11
  287. package/src/components/select/select.css +0 -222
  288. package/src/components/select/stories/select.stories.ts +0 -173
  289. package/src/components/select/test/fixtures.ts +0 -162
  290. package/src/components/select/test/select.test.ts +0 -937
  291. package/src/components/spinner/Spinner.ts +0 -31
  292. package/src/components/spinner/leu-spinner.ts +0 -11
  293. package/src/components/spinner/spinner.css +0 -20
  294. package/src/components/spinner/stories/spinner.stories.ts +0 -29
  295. package/src/components/spinner/test/spinner.test.ts +0 -30
  296. package/src/components/tab/Tab.ts +0 -72
  297. package/src/components/tab/TabGroup.ts +0 -267
  298. package/src/components/tab/TabPanel.ts +0 -59
  299. package/src/components/tab/leu-tab-group.ts +0 -11
  300. package/src/components/tab/leu-tab-panel.ts +0 -11
  301. package/src/components/tab/leu-tab.ts +0 -11
  302. package/src/components/tab/stories/tab.stories.ts +0 -97
  303. package/src/components/tab/tab-group.css +0 -63
  304. package/src/components/tab/tab-panel.css +0 -10
  305. package/src/components/tab/tab.css +0 -54
  306. package/src/components/tab/test/tab-group.test.ts +0 -426
  307. package/src/components/tab/test/tab-panel.test.ts +0 -102
  308. package/src/components/tab/test/tab.test.ts +0 -139
  309. package/src/components/table/Table.ts +0 -253
  310. package/src/components/table/leu-table.ts +0 -11
  311. package/src/components/table/stories/table.stories.ts +0 -131
  312. package/src/components/table/table.css +0 -112
  313. package/src/components/table/test/table.test.ts +0 -37
  314. package/src/components/tag/Tag.ts +0 -28
  315. package/src/components/tag/leu-tag.ts +0 -11
  316. package/src/components/tag/stories/tag.stories.ts +0 -107
  317. package/src/components/tag/tag.css +0 -42
  318. package/src/components/tag/test/tag.test.ts +0 -28
  319. package/src/components/visually-hidden/VisuallyHidden.ts +0 -16
  320. package/src/components/visually-hidden/leu-visually-hidden.ts +0 -11
  321. package/src/components/visually-hidden/stories/visually-hidden.stories.ts +0 -22
  322. package/src/components/visually-hidden/test/visually-hidden.test.ts +0 -34
  323. package/src/components/visually-hidden/visually-hidden.css +0 -10
  324. package/src/docs/contributing.mdx +0 -154
  325. package/src/docs/installation.mdx +0 -35
  326. package/src/docs/theme.mdx +0 -400
  327. package/src/docs/usage.mdx +0 -73
  328. package/src/global.d.ts +0 -11
  329. package/src/index.ts +0 -29
  330. package/src/lib/LeuElement.ts +0 -43
  331. package/src/lib/a11y.ts +0 -26
  332. package/src/lib/hasSlotController.ts +0 -74
  333. package/src/lib/mixins/FormAssociatedMixin.ts +0 -115
  334. package/src/lib/styleMap.ts +0 -139
  335. package/src/lib/utils.ts +0 -45
  336. package/src/styles/common-styles.css +0 -14
  337. package/src/styles/custom-media.css +0 -6
  338. package/src/styles/font-definitions.json +0 -210
  339. package/src/styles/style.stories.ts +0 -64
  340. package/src/styles/theme.css +0 -90
  341. package/stat_zh.png +0 -0
  342. package/stylelint.config.mjs +0 -23
  343. package/tsconfig.build.json +0 -24
  344. package/tsconfig.json +0 -14
  345. package/tsdown.config.ts +0 -35
  346. package/web-test-runner.config.mjs +0 -102
@@ -1,181 +0,0 @@
1
- import { html } from "lit"
2
- import { classMap } from "lit/directives/class-map.js"
3
- import { property } from "lit/decorators.js"
4
-
5
- import { LeuElement } from "../../lib/LeuElement.js"
6
-
7
- import styles from "./radio-group.css?inline"
8
- import { LeuRadio } from "./Radio.js"
9
-
10
- /**
11
- * @summary Handles a group of radio buttons, allowing only one to be selected at a time. It provides keyboard navigation and manages focus within the group.
12
- * @slot - Place the radio buttons inside the default slot.
13
- * @tagname leu-radio-group
14
- */
15
- export class LeuRadioGroup extends LeuElement {
16
- static styles = [LeuElement.styles, styles]
17
-
18
- /**
19
- * Defines how the radio buttons should be aligned.
20
- */
21
- @property({ type: String, reflect: true })
22
- orientation: "horizontal" | "vertical" = "horizontal"
23
-
24
- /**
25
- * The label of the radio group
26
- */
27
- @property({ type: String, reflect: true })
28
- label?: string
29
-
30
- /**
31
- * Index of the radio button that would be focused
32
- * when the focus moves into the group.
33
- */
34
- private currentIndex = 0
35
-
36
- private items: LeuRadio[] = []
37
-
38
- get value() {
39
- const checkedValues = this.items
40
- .filter((i) => i.checked)
41
- .map((i) => i.value)
42
- return checkedValues.length > 0 ? checkedValues[0] : ""
43
- }
44
-
45
- connectedCallback() {
46
- super.connectedCallback()
47
- this.handleItems()
48
- this.addEventListeners()
49
- }
50
-
51
- disconnectedCallback() {
52
- super.disconnectedCallback()
53
- this.removeEventListeners()
54
- }
55
-
56
- private addEventListeners() {
57
- /**
58
- * It is technically possible to add an event listener to the host element
59
- * before it is connected to the dom. In that case the outside event listener would
60
- * be called before the following event listener. But at this point multiple
61
- * radio buttons could be selected at the same time because `handleInput` hasn't been
62
- * called yet. That's why we use the capture phase.
63
- */
64
- this.addEventListener("input", this.handleInput, { capture: true })
65
- this.addEventListener("focusin", this.handleFocusIn)
66
- this.addEventListener("keydown", this.handleKeyDown)
67
- }
68
-
69
- private removeEventListeners() {
70
- this.removeEventListener("input", this.handleInput, { capture: true })
71
- this.removeEventListener("focusin", this.handleFocusIn)
72
- this.removeEventListener("keydown", this.handleKeyDown)
73
- }
74
-
75
- private handleSlotChange() {
76
- this.handleItems()
77
- }
78
-
79
- private handleFocusIn = (e: FocusEvent & { target: LeuRadio }) => {
80
- this.currentIndex = this.items.indexOf(e.target)
81
- }
82
-
83
- private handleKeyDown = (e: KeyboardEvent & { target: LeuRadio }) => {
84
- const currentIndex = this.items.indexOf(e.target)
85
-
86
- switch (e.key) {
87
- case "ArrowUp":
88
- case "ArrowLeft":
89
- this.selectNextItem(currentIndex, -1)
90
- break
91
- case "ArrowDown":
92
- case "ArrowRight":
93
- this.selectNextItem(currentIndex, 1)
94
- break
95
- case "Home":
96
- this.selectItem(this.items.find((item) => !item.disabled))
97
- break
98
- case "End":
99
- this.selectItem(this.items.findLast((item) => !item.disabled))
100
- break
101
- default:
102
- }
103
-
104
- this.setTabIndex()
105
- }
106
-
107
- private handleInput = (e: InputEvent & { target: LeuRadio }) => {
108
- this.items.forEach((item) => {
109
- item.checked = item === e.target
110
- })
111
- }
112
-
113
- private selectItem(selectingItem: LeuRadio) {
114
- this.items.forEach((item) => {
115
- item.checked = item === selectingItem
116
- })
117
- }
118
-
119
- private selectNextItem(startingIndex: number, direction: -1 | 1) {
120
- let selected = false
121
-
122
- for (let index = 0; index < this.items.length; index += 1) {
123
- const currentIndex =
124
- (this.items.length + index * direction + startingIndex + direction) %
125
- this.items.length
126
- const currentItem = this.items[currentIndex]
127
-
128
- if (!selected && !currentItem.disabled) {
129
- currentItem.checked = true
130
- currentItem.focus()
131
- selected = true
132
- } else if (selected) {
133
- currentItem.checked = false
134
- }
135
- }
136
- }
137
-
138
- private setTabIndex() {
139
- this.items.forEach((item, index) => {
140
- if (index === this.currentIndex) {
141
- item.tabIndex = 0
142
- } else {
143
- item.tabIndex = -1
144
- }
145
- })
146
- }
147
-
148
- private handleItems() {
149
- this.items = Array.from(
150
- this.querySelectorAll(":scope > *:not([slot])"),
151
- ).filter((el) => el instanceof LeuRadio)
152
-
153
- this.initializeIndex()
154
- this.setTabIndex()
155
- }
156
-
157
- private initializeIndex() {
158
- const index = this.items.findIndex(
159
- (item) => item.hasAttribute("checked") && !item.hasAttribute("disabled"),
160
- )
161
- const nextEnabledIndex = this.items.findIndex(
162
- (item) => !item.hasAttribute("disabled"),
163
- )
164
-
165
- this.currentIndex = index >= 0 ? index : nextEnabledIndex
166
- }
167
-
168
- render() {
169
- const fieldsetClasses = {
170
- fieldset: "true",
171
- "fieldset--vertical": this.orientation === "vertical",
172
- }
173
-
174
- return html`
175
- <fieldset class=${classMap(fieldsetClasses)}>
176
- <legend class="legend">${this.label}</legend>
177
- <slot @slotchange=${this.handleSlotChange}></slot>
178
- </fieldset>
179
- `
180
- }
181
- }
@@ -1,11 +0,0 @@
1
- import { LeuRadioGroup } from "./RadioGroup.js"
2
-
3
- export { LeuRadioGroup }
4
-
5
- LeuRadioGroup.define("leu-radio-group")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-radio-group": LeuRadioGroup
10
- }
11
- }
@@ -1,11 +0,0 @@
1
- import { LeuRadio } from "./Radio.js"
2
-
3
- export { LeuRadio }
4
-
5
- LeuRadio.define("leu-radio")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-radio": LeuRadio
10
- }
11
- }
@@ -1,29 +0,0 @@
1
- :host {
2
- --group-font-regular: var(--leu-font-family-regular);
3
- --group-font-black: var(--leu-font-family-black);
4
-
5
- font-family: var(--group-font-regular);
6
- }
7
-
8
- .fieldset {
9
- display: flex;
10
- align-items: flex-start;
11
- flex-wrap: wrap;
12
- gap: 0.5rem 1rem;
13
-
14
- border: none;
15
- padding: 0;
16
- }
17
-
18
- .fieldset--vertical {
19
- flex-direction: column;
20
- gap: 1rem;
21
- }
22
-
23
- .legend {
24
- font-family: var(--group-font-black);
25
- font-size: 1.125rem;
26
- line-height: 1.5;
27
-
28
- margin-bottom: 0.5rem;
29
- }
@@ -1,76 +0,0 @@
1
- :host {
2
- --radio-color: var(--leu-color-black-40);
3
- --radio-color-disabled: var(--leu-color-black-20);
4
- --radio-color-focus: var(--leu-color-func-cyan);
5
-
6
- --radio-label-color: var(--leu-color-black-100);
7
- --radio-label-color-disabled: var(--radio-color-disabled);
8
-
9
- --radio-font-regular: var(--leu-font-family-regular);
10
-
11
- display: inline-flex;
12
- align-items: flex-start;
13
- gap: 0.5rem;
14
-
15
- font-family: var(--radio-font-regular);
16
- }
17
-
18
- .radio {
19
- --_length: 1.5rem;
20
- appearance: none;
21
- cursor: pointer;
22
-
23
- width: var(--_length);
24
- height: var(--_length);
25
- margin: 0;
26
-
27
- border: 2px solid var(--radio-color);
28
- border-radius: 50%;
29
-
30
- flex: 1 0 var(--_length);
31
-
32
- display: grid;
33
- place-items: center;
34
- }
35
-
36
- .radio::before {
37
- content: "";
38
- width: 0.75rem;
39
- height: 0.75rem;
40
-
41
- border-radius: 50%;
42
- background-color: var(--radio-color);
43
-
44
- transform: scale(0);
45
- }
46
-
47
- .radio:checked::before {
48
- transform: scale(1);
49
- }
50
-
51
- .radio:is(:hover, :checked, :focus) {
52
- --radio-color: var(--radio-color-focus);
53
- }
54
-
55
- .radio:focus-visible {
56
- outline: 2px solid var(--radio-color-focus);
57
- outline-offset: 2px;
58
- }
59
-
60
- .radio:disabled {
61
- --radio-color: var(--radio-color-disabled);
62
- cursor: not-allowed;
63
- }
64
-
65
- .label {
66
- cursor: pointer;
67
-
68
- color: var(--radio-label-color);
69
- font-size: 1rem;
70
- line-height: 1.5;
71
- }
72
-
73
- .radio:disabled + .label {
74
- --radio-label-color: var(--radio-label-color-disabled);
75
- cursor: not-allowed;
76
- }
@@ -1,54 +0,0 @@
1
- import { html } from "lit"
2
- import "../leu-radio.js"
3
- import "../leu-radio-group.js"
4
- import { ifDefined } from "lit/directives/if-defined.js"
5
-
6
- export default {
7
- title: "Components/Radio/Group",
8
- component: "leu-radio-group",
9
- argTypes: {
10
- label: { control: "text" },
11
- orientation: {
12
- options: ["vertical", "horizontal"],
13
- control: { type: "radio" },
14
- },
15
- },
16
- parameters: {
17
- design: {
18
- type: "figma",
19
- url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-81935&mode=design&t=lzVrtq8lxYVJU5TB-11",
20
- },
21
- },
22
- }
23
-
24
- function Template({ label, orientation }) {
25
- return html`
26
- <leu-radio-group
27
- orientation=${ifDefined(orientation)}
28
- label=${ifDefined(label)}
29
- >
30
- <leu-radio value="1" name="radio-button" disabled>Kurz</leu-radio>
31
- <leu-radio value="2" name="radio-button">Etwas Länger</leu-radio>
32
- <leu-radio value="3" name="radio-button"
33
- >Ein langes Label um sicher ein umbruch zu erzwingen</leu-radio
34
- >
35
- </leu-radio-group>
36
- `
37
- }
38
-
39
- export const Horizontal = Template.bind({})
40
- export const HorizontalLabel = Template.bind({})
41
- HorizontalLabel.args = {
42
- label: "Anrede",
43
- }
44
-
45
- export const Vertical = Template.bind({})
46
- Vertical.args = {
47
- orientation: "vertical",
48
- }
49
-
50
- export const VerticalLabel = Template.bind({})
51
- VerticalLabel.args = {
52
- orientation: "vertical",
53
- label: "Anrede",
54
- }
@@ -1,55 +0,0 @@
1
- import { html } from "lit"
2
- import "../leu-radio.js"
3
-
4
- export default {
5
- title: "Components/Radio",
6
- component: "leu-radio",
7
- argTypes: {
8
- label: {
9
- control: "text",
10
- },
11
- },
12
- parameters: {
13
- design: {
14
- type: "figma",
15
- url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-81935&mode=design&t=lzVrtq8lxYVJU5TB-11",
16
- },
17
- },
18
- }
19
-
20
- function Template({
21
- label = "Label",
22
- value = "",
23
- checked = false,
24
- disabled = false,
25
- name = "",
26
- }) {
27
- return html`
28
- <leu-radio
29
- .value=${value}
30
- ?checked=${checked}
31
- ?disabled=${disabled}
32
- name=${name}
33
- >
34
- ${label}
35
- </leu-radio>
36
- `
37
- }
38
-
39
- export const Regular = Template.bind({})
40
-
41
- export const Checked = Template.bind({})
42
- Checked.args = {
43
- checked: true,
44
- }
45
-
46
- export const Disabled = Template.bind({})
47
- Disabled.args = {
48
- disabled: true,
49
- }
50
-
51
- export const CheckedDisabled = Template.bind({})
52
- CheckedDisabled.args = {
53
- checked: true,
54
- disabled: true,
55
- }
@@ -1,83 +0,0 @@
1
- import { html } from "lit"
2
- import { fixture, expect } from "@open-wc/testing"
3
-
4
- import "../leu-radio.js"
5
- import "../leu-radio-group.js"
6
-
7
- async function defaultFixture(args = {}) {
8
- return fixture(html`
9
- <leu-radio-group>
10
- <span slot="legend">Legende</span>
11
- <leu-radio
12
- value="1"
13
- name="radio-button"
14
- disabled
15
- ?checked=${args.checkedValue === "1"}
16
- >Kurz</leu-radio
17
- >
18
- <leu-radio
19
- value="2"
20
- name="radio-button"
21
- ?checked=${args.checkedValue === "2"}
22
- >Etwas Länger</leu-radio
23
- >
24
- <leu-radio
25
- value="3"
26
- name="radio-button"
27
- ?checked=${args.checkedValue === "3"}
28
- >Ein langes Label um sicher ein umbruch zu erzwingen</leu-radio
29
- >
30
- </leu-radio-group>
31
- `)
32
- }
33
-
34
- describe("LeuRadio", () => {
35
- it("is a defined element", async () => {
36
- const elRadioGroup = customElements.get("leu-radio-group")
37
-
38
- await expect(elRadioGroup).not.to.be.undefined
39
- })
40
-
41
- it("passes the a11y audit", async () => {
42
- const el = await defaultFixture()
43
-
44
- await expect(el).shadowDom.to.be.accessible()
45
- })
46
-
47
- it("has an empty default value", async () => {
48
- const el = await defaultFixture()
49
-
50
- expect(el.value).to.equal("")
51
- })
52
-
53
- it("updates the value when a radio button is checked", async () => {
54
- const el = await defaultFixture()
55
- const leuRadio = el.querySelector('leu-radio[value="2"]')
56
- const radio = leuRadio.shadowRoot.querySelector("input")
57
-
58
- radio.click()
59
-
60
- expect(el.value).to.equal("2")
61
- })
62
-
63
- it("doesn't allow multiple radio buttons to be checked", async () => {
64
- const el = await defaultFixture()
65
- const leuRadio2 = el.querySelector('leu-radio[value="2"]')
66
- const leuRadio3 = el.querySelector('leu-radio[value="3"]')
67
- const radio2 = leuRadio2.shadowRoot.querySelector("input")
68
- const radio3 = leuRadio3.shadowRoot.querySelector("input")
69
-
70
- radio2.click()
71
- radio3.click()
72
-
73
- expect(el.value).to.equal("3")
74
- expect(leuRadio2.checked).to.be.false
75
- expect(leuRadio3.checked).to.be.true
76
- })
77
-
78
- it("has a default value that reflects the checked radio button", async () => {
79
- const el = await defaultFixture({ checkedValue: "2" })
80
-
81
- expect(el.value).to.deep.equal("2")
82
- })
83
- })
@@ -1,119 +0,0 @@
1
- import { html } from "lit"
2
- import { fixture, expect, elementUpdated, oneEvent } from "@open-wc/testing"
3
- import { sendKeys } from "@web/test-runner-commands"
4
-
5
- import "../leu-radio.js"
6
-
7
- async function defaultFixture() {
8
- return fixture(html`
9
- <leu-radio identifier="b" value="3" name="radio-button"
10
- >Ein langes Label um sicher ein umbruch zu erzwingen</leu-radio
11
- >
12
- `)
13
- }
14
-
15
- describe("LeuRadio", () => {
16
- it("is a defined element", async () => {
17
- const elRadio = customElements.get("leu-radio")
18
-
19
- await expect(elRadio).not.to.be.undefined
20
- })
21
-
22
- it("passes the a11y audit", async () => {
23
- const el = await defaultFixture()
24
-
25
- await expect(el).shadowDom.to.be.accessible()
26
- })
27
-
28
- it("is not checked by default", async () => {
29
- const el = await defaultFixture()
30
-
31
- expect(el.checked).to.be.false
32
- })
33
-
34
- it("sets the checked property when the checkbox", async () => {
35
- const el = await defaultFixture()
36
- const checkbox = el.shadowRoot.querySelector("input")
37
-
38
- checkbox.click()
39
- await elementUpdated(el)
40
-
41
- expect(el.checked).to.be.true
42
-
43
- checkbox.click()
44
- await elementUpdated(el)
45
-
46
- expect(el.checked).to.be.true
47
- })
48
-
49
- it("sets the checked property when the checkbox", async () => {
50
- const el = await defaultFixture()
51
- const label = el.shadowRoot.querySelector("label")
52
-
53
- label.click()
54
- await elementUpdated(el)
55
-
56
- expect(el.checked).to.be.true
57
-
58
- label.click()
59
- await elementUpdated(el)
60
-
61
- expect(el.checked).to.be.true
62
- })
63
-
64
- it("does not set the checked property when disabled", async () => {
65
- const el = await defaultFixture()
66
- const checkbox = el.shadowRoot.querySelector("input")
67
- const label = el.shadowRoot.querySelector("label")
68
-
69
- el.disabled = true
70
- await elementUpdated(el)
71
-
72
- checkbox.click()
73
- await elementUpdated(el)
74
-
75
- expect(el.checked).to.be.false
76
-
77
- label.click()
78
- await elementUpdated(el)
79
-
80
- expect(el.checked).to.be.false
81
- })
82
-
83
- it("toggles the checked property when the space key is pressed", async () => {
84
- const el = await defaultFixture()
85
- el.focus()
86
-
87
- await sendKeys({
88
- press: "Space",
89
- })
90
-
91
- expect(el.checked).to.be.true
92
-
93
- await sendKeys({
94
- press: "Space",
95
- })
96
-
97
- expect(el.checked).to.be.true
98
- })
99
-
100
- it("fires a change event when clicked", async () => {
101
- const el = await defaultFixture()
102
- const checkbox = el.shadowRoot.querySelector("input")
103
-
104
- setTimeout(() => checkbox.click())
105
- const event = await oneEvent(el, "change")
106
-
107
- expect(event).to.exist
108
- })
109
-
110
- it("fires an input event when clicked", async () => {
111
- const el = await defaultFixture()
112
- const checkbox = el.shadowRoot.querySelector("input")
113
-
114
- setTimeout(() => checkbox.click())
115
- const event = await oneEvent(el, "input")
116
-
117
- expect(event).to.exist
118
- })
119
- })