@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,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
- })