@statistikzh/leu 0.3.0 → 0.5.0

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 (295) hide show
  1. package/.github/workflows/deploy-github-pages.yaml +33 -0
  2. package/.storybook/main.js +27 -1
  3. package/.storybook/manager-head.html +1 -0
  4. package/.storybook/manager.js +9 -0
  5. package/.storybook/preview-head.html +1 -1
  6. package/.storybook/preview.js +59 -6
  7. package/.storybook/static/logo.svg +19 -0
  8. package/.storybook/theme.js +7 -0
  9. package/CHANGELOG.md +54 -0
  10. package/README.md +1 -1
  11. package/custom-elements-manifest.config.js +46 -0
  12. package/dist/Accordion.d.ts +31 -0
  13. package/dist/Accordion.d.ts.map +1 -0
  14. package/dist/Accordion.js +257 -0
  15. package/dist/Breadcrumb.d.ts +69 -0
  16. package/dist/Breadcrumb.d.ts.map +1 -0
  17. package/dist/Breadcrumb.js +392 -0
  18. package/dist/Button-da11d064.d.ts +84 -0
  19. package/dist/Button-da11d064.d.ts.map +1 -0
  20. package/dist/Button-da11d064.js +542 -0
  21. package/dist/Button.d.ts +2 -0
  22. package/dist/Button.d.ts.map +1 -0
  23. package/dist/Button.js +6 -423
  24. package/dist/ButtonGroup.d.ts +24 -0
  25. package/dist/ButtonGroup.d.ts.map +1 -0
  26. package/dist/ButtonGroup.js +72 -43
  27. package/dist/Checkbox.d.ts +13 -0
  28. package/dist/Checkbox.d.ts.map +1 -0
  29. package/dist/Checkbox.js +101 -84
  30. package/dist/CheckboxGroup.d.ts +13 -0
  31. package/dist/CheckboxGroup.d.ts.map +1 -0
  32. package/dist/CheckboxGroup.js +41 -37
  33. package/dist/Chip.d.ts +5 -0
  34. package/dist/Chip.d.ts.map +1 -0
  35. package/dist/{Chip-5f70d04f.js → Chip.js} +21 -6
  36. package/dist/ChipGroup.d.ts +28 -0
  37. package/dist/ChipGroup.d.ts.map +1 -0
  38. package/dist/ChipGroup.js +64 -10
  39. package/dist/ChipLink.d.ts +15 -0
  40. package/dist/ChipLink.d.ts.map +1 -0
  41. package/dist/ChipLink.js +4 -7
  42. package/dist/ChipRemovable.d.ts +13 -0
  43. package/dist/ChipRemovable.d.ts.map +1 -0
  44. package/dist/ChipRemovable.js +5 -8
  45. package/dist/ChipSelectable.d.ts +22 -0
  46. package/dist/ChipSelectable.d.ts.map +1 -0
  47. package/dist/ChipSelectable.js +8 -11
  48. package/dist/Dropdown.d.ts +15 -0
  49. package/dist/Dropdown.d.ts.map +1 -0
  50. package/dist/Dropdown.js +73 -26
  51. package/dist/Input.d.ts +154 -0
  52. package/dist/Input.d.ts.map +1 -0
  53. package/dist/Input.js +42 -35
  54. package/dist/Menu.d.ts +8 -0
  55. package/dist/Menu.d.ts.map +1 -0
  56. package/dist/Menu.js +2 -5
  57. package/dist/MenuItem.d.ts +21 -0
  58. package/dist/MenuItem.d.ts.map +1 -0
  59. package/dist/MenuItem.js +32 -17
  60. package/dist/Pagination.d.ts +27 -0
  61. package/dist/Pagination.d.ts.map +1 -0
  62. package/dist/Pagination.js +121 -89
  63. package/dist/Popup.d.ts +18 -0
  64. package/dist/Popup.d.ts.map +1 -0
  65. package/dist/Popup.js +215 -0
  66. package/dist/Radio.d.ts +12 -0
  67. package/dist/Radio.d.ts.map +1 -0
  68. package/dist/Radio.js +9 -8
  69. package/dist/RadioGroup.d.ts +20 -0
  70. package/dist/RadioGroup.d.ts.map +1 -0
  71. package/dist/RadioGroup.js +41 -39
  72. package/dist/ScrollTop.d.ts +19 -0
  73. package/dist/ScrollTop.d.ts.map +1 -0
  74. package/dist/ScrollTop.js +122 -0
  75. package/dist/Select.d.ts +98 -0
  76. package/dist/Select.d.ts.map +1 -0
  77. package/dist/Select.js +79 -122
  78. package/dist/Table.d.ts +48 -0
  79. package/dist/Table.d.ts.map +1 -0
  80. package/dist/Table.js +141 -121
  81. package/dist/VisuallyHidden.d.ts +8 -0
  82. package/dist/VisuallyHidden.d.ts.map +1 -0
  83. package/dist/VisuallyHidden.js +28 -0
  84. package/dist/_rollupPluginBabelHelpers-20f659f4.d.ts +3 -0
  85. package/dist/_rollupPluginBabelHelpers-20f659f4.d.ts.map +1 -0
  86. package/dist/{defineElement-ba770aed.js → _rollupPluginBabelHelpers-20f659f4.js} +1 -15
  87. package/dist/defineElement-40372b4b.d.ts +9 -0
  88. package/dist/defineElement-40372b4b.d.ts.map +1 -0
  89. package/dist/defineElement-40372b4b.js +15 -0
  90. package/dist/icon-03e86700.d.ts +11 -0
  91. package/dist/icon-03e86700.d.ts.map +1 -0
  92. package/dist/index.js.d.ts +21 -0
  93. package/dist/index.js.d.ts.map +1 -0
  94. package/dist/index.js.js +42 -0
  95. package/dist/leu-accordion.d.ts +3 -0
  96. package/dist/leu-accordion.d.ts.map +1 -0
  97. package/dist/leu-accordion.js +9 -0
  98. package/dist/leu-breadcrumb.d.ts +3 -0
  99. package/dist/leu-breadcrumb.d.ts.map +1 -0
  100. package/dist/leu-breadcrumb.js +23 -0
  101. package/dist/leu-button-group.d.ts +3 -0
  102. package/dist/leu-button-group.d.ts.map +1 -0
  103. package/dist/leu-button-group.js +6 -6
  104. package/dist/leu-button.d.ts +3 -0
  105. package/dist/leu-button.d.ts.map +1 -0
  106. package/dist/leu-button.js +7 -3
  107. package/dist/leu-checkbox-group.d.ts +3 -0
  108. package/dist/leu-checkbox-group.d.ts.map +1 -0
  109. package/dist/leu-checkbox-group.js +6 -3
  110. package/dist/leu-checkbox.d.ts +3 -0
  111. package/dist/leu-checkbox.d.ts.map +1 -0
  112. package/dist/leu-checkbox.js +6 -3
  113. package/dist/leu-chip-group.d.ts +3 -0
  114. package/dist/leu-chip-group.d.ts.map +1 -0
  115. package/dist/leu-chip-group.js +7 -3
  116. package/dist/leu-chip-link.d.ts +3 -0
  117. package/dist/leu-chip-link.d.ts.map +1 -0
  118. package/dist/leu-chip-link.js +7 -4
  119. package/dist/leu-chip-removable.d.ts +3 -0
  120. package/dist/leu-chip-removable.d.ts.map +1 -0
  121. package/dist/leu-chip-removable.js +7 -4
  122. package/dist/leu-chip-selectable.d.ts +3 -0
  123. package/dist/leu-chip-selectable.d.ts.map +1 -0
  124. package/dist/leu-chip-selectable.js +7 -4
  125. package/dist/leu-dropdown.d.ts +3 -0
  126. package/dist/leu-dropdown.d.ts.map +1 -0
  127. package/dist/leu-dropdown.js +15 -4
  128. package/dist/leu-input.d.ts +3 -0
  129. package/dist/leu-input.d.ts.map +1 -0
  130. package/dist/leu-input.js +7 -3
  131. package/dist/leu-menu-item.d.ts +3 -0
  132. package/dist/leu-menu-item.d.ts.map +1 -0
  133. package/dist/leu-menu-item.js +8 -3
  134. package/dist/leu-menu.d.ts +3 -0
  135. package/dist/leu-menu.d.ts.map +1 -0
  136. package/dist/leu-menu.js +6 -3
  137. package/dist/leu-pagination.d.ts +3 -0
  138. package/dist/leu-pagination.d.ts.map +1 -0
  139. package/dist/leu-pagination.js +12 -4
  140. package/dist/leu-popup.d.ts +3 -0
  141. package/dist/leu-popup.d.ts.map +1 -0
  142. package/dist/leu-popup.js +9 -0
  143. package/dist/leu-radio-group.d.ts +3 -0
  144. package/dist/leu-radio-group.d.ts.map +1 -0
  145. package/dist/leu-radio-group.js +6 -3
  146. package/dist/leu-radio.d.ts +3 -0
  147. package/dist/leu-radio.d.ts.map +1 -0
  148. package/dist/leu-radio.js +6 -3
  149. package/dist/leu-scroll-top.d.ts +3 -0
  150. package/dist/leu-scroll-top.d.ts.map +1 -0
  151. package/dist/leu-scroll-top.js +14 -0
  152. package/dist/leu-select.d.ts +3 -0
  153. package/dist/leu-select.d.ts.map +1 -0
  154. package/dist/leu-select.js +16 -4
  155. package/dist/leu-table.d.ts +3 -0
  156. package/dist/leu-table.d.ts.map +1 -0
  157. package/dist/leu-table.js +13 -4
  158. package/dist/leu-visually-hidden.d.ts +3 -0
  159. package/dist/leu-visually-hidden.d.ts.map +1 -0
  160. package/dist/leu-visually-hidden.js +8 -0
  161. package/dist/theme.css +386 -2
  162. package/dist/utils-65469421.d.ts +16 -0
  163. package/dist/utils-65469421.d.ts.map +1 -0
  164. package/dist/utils-65469421.js +35 -0
  165. package/index.js +3 -0
  166. package/package.json +47 -17
  167. package/postcss.config.cjs +2 -0
  168. package/rollup.config.js +21 -40
  169. package/scripts/generate-component/templates/[Name].js +0 -5
  170. package/scripts/generate-component/templates/[name].css +3 -3
  171. package/scripts/generate-component/templates/[namespace]-[name].js +5 -2
  172. package/scripts/postcss-leu-font-styles.cjs +160 -0
  173. package/src/components/accordion/Accordion.js +0 -6
  174. package/src/components/accordion/accordion.css +2 -2
  175. package/src/components/accordion/leu-accordion.js +5 -2
  176. package/src/components/accordion/stories/accordion.stories.js +8 -4
  177. package/src/components/accordion/test/accordion.test.js +95 -3
  178. package/src/components/breadcrumb/Breadcrumb.js +311 -0
  179. package/src/components/breadcrumb/breadcrumb.css +103 -0
  180. package/src/components/breadcrumb/leu-breadcrumb.js +6 -0
  181. package/src/components/breadcrumb/stories/breadcrumb.stories.js +73 -0
  182. package/src/components/breadcrumb/test/breadcrumb.test.js +141 -0
  183. package/src/components/button/Button.js +76 -20
  184. package/src/components/button/button.css +13 -5
  185. package/src/components/button/leu-button.js +5 -2
  186. package/src/components/button/stories/button.stories.js +79 -105
  187. package/src/components/button/test/button.test.js +184 -3
  188. package/src/components/button-group/ButtonGroup.js +76 -40
  189. package/src/components/button-group/leu-button-group.js +5 -2
  190. package/src/components/button-group/stories/button-group.stories.js +19 -6
  191. package/src/components/button-group/test/button-group.test.js +87 -4
  192. package/src/components/checkbox/Checkbox.js +6 -85
  193. package/src/components/checkbox/CheckboxGroup.js +8 -38
  194. package/src/components/checkbox/checkbox-group.css +29 -0
  195. package/src/components/checkbox/checkbox.css +76 -0
  196. package/src/components/checkbox/leu-checkbox-group.js +5 -2
  197. package/src/components/checkbox/leu-checkbox.js +5 -2
  198. package/src/components/checkbox/stories/checkbox-group.stories.js +44 -21
  199. package/src/components/checkbox/stories/checkbox.stories.js +7 -1
  200. package/src/components/checkbox/test/checkbox-group.test.js +124 -0
  201. package/src/components/checkbox/test/checkbox.test.js +72 -59
  202. package/src/components/chip/Chip.js +1 -0
  203. package/src/components/chip/ChipGroup.js +42 -7
  204. package/src/components/chip/ChipLink.js +1 -6
  205. package/src/components/chip/ChipRemovable.js +2 -7
  206. package/src/components/chip/ChipSelectable.js +5 -10
  207. package/src/components/chip/chip-group.css +12 -2
  208. package/src/components/chip/chip.css +14 -3
  209. package/src/components/chip/exports.js +4 -10
  210. package/src/components/chip/leu-chip-group.js +5 -2
  211. package/src/components/chip/leu-chip-link.js +5 -2
  212. package/src/components/chip/leu-chip-removable.js +5 -2
  213. package/src/components/chip/leu-chip-selectable.js +5 -2
  214. package/src/components/chip/stories/chip-group.stories.js +110 -44
  215. package/src/components/chip/stories/chip-link.stories.js +16 -4
  216. package/src/components/chip/stories/chip-removable.stories.js +15 -4
  217. package/src/components/chip/stories/chip-selectable.stories.js +13 -3
  218. package/src/components/chip/test/chip-group.test.js +124 -0
  219. package/src/components/chip/test/chip-link.test.js +58 -0
  220. package/src/components/chip/test/chip-removable.test.js +79 -0
  221. package/src/components/chip/test/chip-selectable.test.js +95 -0
  222. package/src/components/chip/test/chip.test.js +1 -1
  223. package/src/components/dropdown/Dropdown.js +72 -24
  224. package/src/components/dropdown/dropdown.css +1 -2
  225. package/src/components/dropdown/leu-dropdown.js +5 -2
  226. package/src/components/dropdown/stories/dropdown.stories.js +11 -5
  227. package/src/components/dropdown/test/dropdown.test.js +6 -6
  228. package/src/components/icon/icon.js +1 -1
  229. package/src/components/icon/test/icon.test.js +66 -0
  230. package/src/components/input/Input.js +25 -28
  231. package/src/components/input/input.css +11 -8
  232. package/src/components/input/leu-input.js +5 -2
  233. package/src/components/input/stories/input.stories.js +21 -2
  234. package/src/components/input/test/input.test.js +432 -4
  235. package/src/components/menu/Menu.js +0 -5
  236. package/src/components/menu/MenuItem.js +20 -13
  237. package/src/components/menu/leu-menu-item.js +5 -2
  238. package/src/components/menu/leu-menu.js +5 -2
  239. package/src/components/menu/menu-item.css +7 -4
  240. package/src/components/menu/stories/menu-item.stories.js +13 -4
  241. package/src/components/menu/stories/menu.stories.js +11 -5
  242. package/src/components/menu/test/menu-item.test.js +180 -0
  243. package/src/components/menu/test/menu.test.js +10 -2
  244. package/src/components/pagination/Pagination.js +118 -99
  245. package/src/components/pagination/leu-pagination.js +5 -2
  246. package/src/components/pagination/pagination.css +6 -1
  247. package/src/components/pagination/stories/pagination.stories.js +30 -9
  248. package/src/components/pagination/test/pagination.test.js +191 -5
  249. package/src/components/popup/Popup.js +200 -0
  250. package/src/components/popup/leu-popup.js +6 -0
  251. package/src/components/popup/popup.css +27 -0
  252. package/src/components/popup/stories/popup.stories.js +58 -0
  253. package/src/components/popup/test/popup.test.js +29 -0
  254. package/src/components/radio/Radio.js +2 -6
  255. package/src/components/radio/RadioGroup.js +6 -38
  256. package/src/components/radio/leu-radio-group.js +5 -2
  257. package/src/components/radio/leu-radio.js +5 -2
  258. package/src/components/radio/radio-group.css +29 -0
  259. package/src/components/radio/radio.css +1 -1
  260. package/src/components/radio/stories/radio-group.stories.js +38 -19
  261. package/src/components/radio/stories/radio.stories.js +7 -1
  262. package/src/components/radio/test/radio-group.test.js +86 -0
  263. package/src/components/radio/test/radio.test.js +108 -17
  264. package/src/components/scroll-top/ScrollTop.js +87 -0
  265. package/src/components/scroll-top/leu-scroll-top.js +6 -0
  266. package/src/components/scroll-top/scroll-top.css +34 -0
  267. package/src/components/scroll-top/stories/scroll-top.stories.js +217 -0
  268. package/src/components/scroll-top/test/scroll-top.test.js +22 -0
  269. package/src/components/select/Select.js +58 -37
  270. package/src/components/select/leu-select.js +5 -2
  271. package/src/components/select/select.css +15 -15
  272. package/src/components/select/stories/select.stories.js +15 -168
  273. package/src/components/select/test/fixtures.js +162 -0
  274. package/src/components/select/test/select.test.js +236 -12
  275. package/src/components/table/Table.js +43 -118
  276. package/src/components/table/leu-table.js +5 -2
  277. package/src/components/table/stories/table.stories.js +20 -10
  278. package/src/components/table/table.css +99 -0
  279. package/src/components/table/test/table.test.js +1 -1
  280. package/src/components/visually-hidden/VisuallyHidden.js +13 -0
  281. package/src/components/visually-hidden/leu-visually-hidden.js +6 -0
  282. package/src/components/visually-hidden/stories/visually-hidden.stories.js +22 -0
  283. package/src/components/visually-hidden/test/visually-hidden.test.js +36 -0
  284. package/src/components/visually-hidden/visually-hidden.css +10 -0
  285. package/src/lib/defineElement.js +1 -1
  286. package/src/lib/hasSlotController.js +5 -3
  287. package/src/lib/utils.js +35 -0
  288. package/src/styles/custom-properties.css +6 -2
  289. package/src/styles/font-definitions.json +202 -0
  290. package/stylelint.config.mjs +2 -0
  291. package/tsconfig.build.json +21 -0
  292. package/tsconfig.json +16 -0
  293. package/{web-dev-server-storybook.config.mjs → web-dev-server.config.mjs} +1 -2
  294. package/web-test-runner.config.mjs +15 -2
  295. package/dist/index.js +0 -26
@@ -1,40 +1,59 @@
1
1
  import { html } from "lit"
2
2
  import "../leu-radio.js"
3
3
  import "../leu-radio-group.js"
4
+ import { ifDefined } from "lit/directives/if-defined.js"
4
5
 
5
6
  export default {
6
7
  title: "Radio/Group",
7
8
  component: "leu-radio-group",
8
9
  argTypes: {
9
- legend: { control: "text" },
10
+ label: { control: "text" },
10
11
  orientation: {
11
12
  options: ["VERTICAL", "HORIZONTAL"],
12
13
  control: { type: "radio" },
13
14
  },
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
+ },
15
22
  }
16
23
 
17
- function Template({ legend, orientation }) {
24
+ function Template({ label, orientation }) {
18
25
  return html`
19
- <leu-radio-group orientation=${orientation}>
20
- <span slot="legend">${legend}</span>
21
- <leu-radio identifier="1" value="1" name="radio-button" disabled
22
- >Kurz</leu-radio
23
- >
24
- <leu-radio identifier="2" value="2" name="radio-button"
25
- >Etwas Länger</leu-radio
26
- >
27
- <leu-radio identifier="3" value="3" name="radio-button"
28
- >Ein langes Label um sicher ein umbruch zu erzwingen</leu-radio
29
- >
26
+ <leu-radio-group
27
+ orientation=${ifDefined(orientation)}
28
+ label=${ifDefined(label)}
29
+ >
30
+ <leu-radio
31
+ identifier="1"
32
+ value="1"
33
+ name="radio-button"
34
+ label="Kurz"
35
+ disabled
36
+ ></leu-radio>
37
+ <leu-radio
38
+ identifier="2"
39
+ value="2"
40
+ name="radio-button"
41
+ label="Etwas Länger"
42
+ ></leu-radio>
43
+ <leu-radio
44
+ identifier="3"
45
+ value="3"
46
+ name="radio-button"
47
+ label="Ein langes Label um sicher ein umbruch zu erzwingen"
48
+ ></leu-radio>
30
49
  </leu-radio-group>
31
50
  `
32
51
  }
33
52
 
34
53
  export const Horizontal = Template.bind({})
35
- export const HorizontalLegend = Template.bind({})
36
- HorizontalLegend.args = {
37
- legend: "Anrede",
54
+ export const HorizontalLabel = Template.bind({})
55
+ HorizontalLabel.args = {
56
+ label: "Anrede",
38
57
  }
39
58
 
40
59
  export const Vertical = Template.bind({})
@@ -42,8 +61,8 @@ Vertical.args = {
42
61
  orientation: "VERTICAL",
43
62
  }
44
63
 
45
- export const VerticalLegend = Template.bind({})
46
- VerticalLegend.args = {
64
+ export const VerticalLabel = Template.bind({})
65
+ VerticalLabel.args = {
47
66
  orientation: "VERTICAL",
48
- legend: "Anrede",
67
+ label: "Anrede",
49
68
  }
@@ -9,6 +9,12 @@ export default {
9
9
  control: "text",
10
10
  },
11
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
+ },
12
18
  }
13
19
 
14
20
  function Template({
@@ -23,8 +29,8 @@ function Template({
23
29
  ?checked=${checked}
24
30
  ?disabled=${disabled}
25
31
  identifier=${"radio-1"}
32
+ label=${label}
26
33
  >
27
- ${label}
28
34
  </leu-radio>
29
35
  `
30
36
  }
@@ -0,0 +1,86 @@
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
+ identifier="1"
13
+ value="1"
14
+ name="radio-button"
15
+ disabled
16
+ label="Kurz"
17
+ ?checked=${args.checkedValue === "1"}
18
+ ></leu-radio>
19
+ <leu-radio
20
+ identifier="2"
21
+ value="2"
22
+ name="radio-button"
23
+ label="Etwas Länger"
24
+ ?checked=${args.checkedValue === "2"}
25
+ ></leu-radio>
26
+ <leu-radio
27
+ identifier="3"
28
+ value="3"
29
+ name="radio-button"
30
+ label="Ein langes Label um sicher ein umbruch zu erzwingen"
31
+ ?checked=${args.checkedValue === "3"}
32
+ ></leu-radio>
33
+ </leu-radio-group>
34
+ `)
35
+ }
36
+
37
+ describe("LeuRadio", () => {
38
+ it("is a defined element", async () => {
39
+ const elRadioGroup = customElements.get("leu-radio-group")
40
+
41
+ await expect(elRadioGroup).not.to.be.undefined
42
+ })
43
+
44
+ it("passes the a11y audit", async () => {
45
+ const el = await defaultFixture()
46
+
47
+ await expect(el).shadowDom.to.be.accessible()
48
+ })
49
+
50
+ it("has an empty default value", async () => {
51
+ const el = await defaultFixture()
52
+
53
+ expect(el.value).to.equal("")
54
+ })
55
+
56
+ it("updates the value when a radio button is checked", async () => {
57
+ const el = await defaultFixture()
58
+ const leuRadio = el.querySelector('leu-radio[value="2"]')
59
+ const radio = leuRadio.shadowRoot.querySelector("input")
60
+
61
+ radio.click()
62
+
63
+ expect(el.value).to.equal("2")
64
+ })
65
+
66
+ it("doesn't allow multiple radio buttons to be checked", async () => {
67
+ const el = await defaultFixture()
68
+ const leuRadio2 = el.querySelector('leu-radio[value="2"]')
69
+ const leuRadio3 = el.querySelector('leu-radio[value="3"]')
70
+ const radio2 = leuRadio2.shadowRoot.querySelector("input")
71
+ const radio3 = leuRadio3.shadowRoot.querySelector("input")
72
+
73
+ radio2.click()
74
+ radio3.click()
75
+
76
+ expect(el.value).to.equal("3")
77
+ expect(leuRadio2.checked).to.be.false
78
+ expect(leuRadio3.checked).to.be.true
79
+ })
80
+
81
+ it("has a default value that reflects the checked radio button", async () => {
82
+ const el = await defaultFixture({ checkedValue: "2" })
83
+
84
+ expect(el.value).to.deep.equal("2")
85
+ })
86
+ })
@@ -1,33 +1,25 @@
1
1
  import { html } from "lit"
2
- import { fixture, expect } from "@open-wc/testing"
2
+ import { fixture, expect, elementUpdated, oneEvent } from "@open-wc/testing"
3
+ import { sendKeys } from "@web/test-runner-commands"
3
4
 
4
5
  import "../leu-radio.js"
5
- import "../leu-radio-group.js"
6
6
 
7
7
  async function defaultFixture() {
8
8
  return fixture(html`
9
- <leu-radio-group>
10
- <span slot="legend">Legende</span>
11
- <leu-radio identifier="1" value="1" name="radio-button" disabled
12
- >Kurz</leu-radio
13
- >
14
- <leu-radio identifier="2" value="2" name="radio-button"
15
- >Etwas Länger</leu-radio
16
- >
17
- <leu-radio identifier="3" value="3" name="radio-button"
18
- >Ein langes Label um sicher ein umbruch zu erzwingen</leu-radio
19
- >
20
- </leu-radio-group>
9
+ <leu-radio
10
+ identifier="b"
11
+ value="3"
12
+ name="radio-button"
13
+ label="Ein langes Label um sicher ein umbruch zu erzwingen"
14
+ ></leu-radio>
21
15
  `)
22
16
  }
23
17
 
24
18
  describe("LeuRadio", () => {
25
19
  it("is a defined element", async () => {
26
- const elRadio = await customElements.get("leu-radio")
27
- const elRadioGroup = await customElements.get("leu-radio-group")
20
+ const elRadio = customElements.get("leu-radio")
28
21
 
29
22
  await expect(elRadio).not.to.be.undefined
30
- await expect(elRadioGroup).not.to.be.undefined
31
23
  })
32
24
 
33
25
  it("passes the a11y audit", async () => {
@@ -35,4 +27,103 @@ describe("LeuRadio", () => {
35
27
 
36
28
  await expect(el).shadowDom.to.be.accessible()
37
29
  })
30
+
31
+ it("is not checked by default", async () => {
32
+ const el = await defaultFixture()
33
+
34
+ expect(el.checked).to.be.false
35
+ })
36
+
37
+ it("sets the checked property when the checkbox", async () => {
38
+ const el = await defaultFixture()
39
+ const checkbox = el.shadowRoot.querySelector("input")
40
+
41
+ checkbox.click()
42
+ await elementUpdated(el)
43
+
44
+ expect(el.checked).to.be.true
45
+
46
+ checkbox.click()
47
+ await elementUpdated(el)
48
+
49
+ expect(el.checked).to.be.true
50
+ })
51
+
52
+ it("sets the checked property when the checkbox", async () => {
53
+ const el = await defaultFixture()
54
+ const label = el.shadowRoot.querySelector("label")
55
+
56
+ label.click()
57
+ await elementUpdated(el)
58
+
59
+ expect(el.checked).to.be.true
60
+
61
+ label.click()
62
+ await elementUpdated(el)
63
+
64
+ expect(el.checked).to.be.true
65
+ })
66
+
67
+ it("does not set the checked property when disabled", async () => {
68
+ const el = await defaultFixture()
69
+ const checkbox = el.shadowRoot.querySelector("input")
70
+ const label = el.shadowRoot.querySelector("label")
71
+
72
+ el.disabled = true
73
+ await elementUpdated(el)
74
+
75
+ checkbox.click()
76
+ await elementUpdated(el)
77
+
78
+ expect(el.checked).to.be.false
79
+
80
+ label.click()
81
+ await elementUpdated(el)
82
+
83
+ expect(el.checked).to.be.false
84
+ })
85
+
86
+ it("toggles the checked property when the space key is pressed", async () => {
87
+ const el = await defaultFixture()
88
+ el.focus()
89
+
90
+ await sendKeys({
91
+ press: "Space",
92
+ })
93
+
94
+ expect(el.checked).to.be.true
95
+
96
+ await sendKeys({
97
+ press: "Space",
98
+ })
99
+
100
+ expect(el.checked).to.be.true
101
+ })
102
+
103
+ it("fires a change event when clicked", async () => {
104
+ const el = await defaultFixture()
105
+ const checkbox = el.shadowRoot.querySelector("input")
106
+
107
+ setTimeout(() => checkbox.click())
108
+ const event = await oneEvent(el, "change")
109
+
110
+ expect(event).to.exist
111
+ })
112
+
113
+ it("fires an input event when clicked", async () => {
114
+ const el = await defaultFixture()
115
+ const checkbox = el.shadowRoot.querySelector("input")
116
+
117
+ setTimeout(() => checkbox.click())
118
+ const event = await oneEvent(el, "input")
119
+
120
+ expect(event).to.exist
121
+ })
122
+
123
+ it("applies the identifier to the input and the label", async () => {
124
+ const el = await defaultFixture()
125
+
126
+ expect(el.shadowRoot.querySelector("input").id).to.equal("b")
127
+ expect(el.shadowRoot.querySelector("label").htmlFor).to.equal("b")
128
+ })
38
129
  })
@@ -0,0 +1,87 @@
1
+ import { html, LitElement } from "lit"
2
+ import { classMap } from "lit/directives/class-map.js"
3
+
4
+ import styles from "./scroll-top.css"
5
+ import "../button/leu-button.js"
6
+ import { throttle } from "../../lib/utils.js"
7
+
8
+ /**
9
+ * @tagname leu-scroll-top
10
+ */
11
+ export class LeuScrollTop extends LitElement {
12
+ static styles = styles
13
+
14
+ static properties = {
15
+ _showButton: { state: true },
16
+ }
17
+
18
+ constructor() {
19
+ super()
20
+ /** @internal */
21
+ this._prevYPos = 0
22
+ /** @internal */
23
+ this._showButton = false
24
+ /** @internal */
25
+ this._scrollDown = false
26
+
27
+ /** @internal */
28
+ this._scrollListener = undefined
29
+ }
30
+
31
+ scroll = () => {
32
+ const delta = window.scrollY - this._prevYPos
33
+
34
+ if (this._scrollDown) {
35
+ if (delta < 0) {
36
+ this._scrollDown = false
37
+ }
38
+ } else if (delta > 0) {
39
+ this._scrollDown = true
40
+ }
41
+
42
+ /**
43
+ * Only show the button when
44
+ * ... the current scroll position is greater than the window height (below-the-fold) and when
45
+ * ... scrolling up
46
+ */
47
+ this._showButton = window.scrollY > window.innerHeight && !this._scrollDown
48
+ this._prevYPos = window.scrollY
49
+ }
50
+
51
+ connectedCallback() {
52
+ super.connectedCallback()
53
+ this._scrollListener = throttle(this.scroll, 100)
54
+ document.addEventListener("scroll", this._scrollListener, true)
55
+ }
56
+
57
+ disconnectedCallback() {
58
+ document.removeEventListener("scroll", this._scrollListener, true)
59
+ super.disconnectedCallback()
60
+ }
61
+
62
+ static scrollToTop() {
63
+ window.scrollTo({
64
+ top: 0,
65
+ left: 0,
66
+ behavior: "smooth",
67
+ })
68
+ }
69
+
70
+ render() {
71
+ const cssClasses = {
72
+ "scroll-top": true,
73
+ hide: !this._showButton,
74
+ }
75
+ return html`
76
+ <div class=${classMap(cssClasses)}>
77
+ <leu-button
78
+ icon="arrowUp"
79
+ label="Zum Seitenanfang"
80
+ round
81
+ @click="${() => LeuScrollTop.scrollToTop()}"
82
+ >
83
+ </leu-button>
84
+ </div>
85
+ `
86
+ }
87
+ }
@@ -0,0 +1,6 @@
1
+ import { defineElement } from "../../lib/defineElement.js"
2
+ import { LeuScrollTop } from "./ScrollTop.js"
3
+
4
+ export { LeuScrollTop }
5
+
6
+ defineElement("scroll-top", LeuScrollTop)
@@ -0,0 +1,34 @@
1
+ .scroll-top {
2
+ overflow: hidden;
3
+ position: fixed;
4
+ right: 1.5rem;
5
+ z-index: 1099;
6
+ bottom: 8.125rem;
7
+
8
+ /* show */
9
+ height: 50px;
10
+ pointer-events: auto;
11
+ transition: height, bottom 0.9s, 0.6s ease;
12
+ }
13
+
14
+ .hide {
15
+ height: 0;
16
+ pointer-events: none;
17
+ transition: height, top 0.9s, 0.6s ease;
18
+ }
19
+
20
+ @keyframes hide-animation {
21
+ 0% {
22
+ transform: rotate(0deg);
23
+ }
24
+
25
+ 100% {
26
+ transform: rotate(90deg);
27
+ }
28
+ }
29
+
30
+ .hide leu-button {
31
+ animation-name: hide-animation;
32
+ animation-duration: 0.45s;
33
+ animation-timing-function: ease;
34
+ }
@@ -0,0 +1,217 @@
1
+ import { html } from "lit"
2
+ import "../leu-scroll-top.js"
3
+
4
+ export default {
5
+ title: "ScrollTop",
6
+ component: "leu-scroll-top",
7
+ }
8
+
9
+ function Template() {
10
+ return html`
11
+ <p>
12
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
13
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
14
+ voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
15
+ clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
16
+ amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
17
+ nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed
18
+ diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
19
+ Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor
20
+ sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
21
+ diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
22
+ erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea
23
+ rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum
24
+ dolor sit amet.
25
+ </p>
26
+ <p>
27
+ Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse
28
+ molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero
29
+ eros et accumsan et iusto odio dignissim qui blandit praesent luptatum
30
+ zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum
31
+ dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh
32
+ euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
33
+ </p>
34
+ <p>
35
+ Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper
36
+ suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel
37
+ eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,
38
+ vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et
39
+ iusto odio dignissim qui blandit praesent luptatum zzril delenit augue
40
+ duis dolore te feugait nulla facilisi.
41
+ </p>
42
+ <p>
43
+ Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet
44
+ doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit
45
+ amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
46
+ tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad
47
+ minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
48
+ nisl ut aliquip ex ea commodo consequat.
49
+ </p>
50
+ <p>
51
+ Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse
52
+ molestie consequat, vel illum dolore eu feugiat nulla facilisis.
53
+ </p>
54
+ <p>
55
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
56
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem
57
+ ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
58
+ tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
59
+ voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
60
+ clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
61
+ amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam
62
+ aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed
63
+ tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna
64
+ no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor
65
+ sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
66
+ diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
67
+ erat.
68
+ </p>
69
+ <p>
70
+ Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
71
+ labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
72
+ accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no
73
+ sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit
74
+ amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
75
+ ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
76
+ accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no
77
+ sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit
78
+ amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
79
+ ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
80
+ accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no
81
+ sea takimata sanctus.
82
+ </p>
83
+ <p>
84
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
85
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
86
+ voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
87
+ clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
88
+ amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
89
+ nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed
90
+ diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
91
+ Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor
92
+ sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
93
+ diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
94
+ erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea
95
+ rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum
96
+ dolor sit amet.
97
+ </p>
98
+ <p>
99
+ Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse
100
+ molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero
101
+ eros et accumsan et iusto odio dignissim qui blandit praesent luptatum
102
+ zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum
103
+ dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh
104
+ euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
105
+ </p>
106
+ <p>
107
+ Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper
108
+ suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel
109
+ eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,
110
+ vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et
111
+ iusto odio dignissim qui blandit praesent luptatum zzril delenit augue
112
+ duis dolore te feugait nulla facilisi.
113
+ </p>
114
+ <p>
115
+ Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet
116
+ doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit
117
+ amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
118
+ tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad
119
+ minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
120
+ nisl ut aliquip ex ea commodo consequat.
121
+ </p>
122
+ <p>
123
+ Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse
124
+ molestie consequat, vel illum dolore eu feugiat nulla facilisis.
125
+ </p>
126
+ <p>
127
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
128
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem
129
+ ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
130
+ tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
131
+ voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
132
+ clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
133
+ amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam
134
+ aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed
135
+ tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna
136
+ no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor
137
+ sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
138
+ diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
139
+ erat.
140
+ </p>
141
+ <p>
142
+ Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
143
+ labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
144
+ accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no
145
+ sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit
146
+ amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
147
+ ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
148
+ accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no
149
+ sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit
150
+ amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
151
+ ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
152
+ accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no
153
+ sea takimata sanctus.
154
+ </p>
155
+ <p>
156
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
157
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
158
+ voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
159
+ clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
160
+ amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
161
+ nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed
162
+ diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
163
+ Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor
164
+ sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
165
+ diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
166
+ erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea
167
+ rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum
168
+ dolor sit amet.
169
+ </p>
170
+ <p>
171
+ Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse
172
+ molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero
173
+ eros et accumsan et iusto odio dignissim qui blandit praesent luptatum
174
+ zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum
175
+ dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh
176
+ euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
177
+ </p>
178
+ <p>
179
+ Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper
180
+ suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel
181
+ eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,
182
+ vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et
183
+ iusto odio dignissim qui blandit praesent luptatum zzril delenit augue
184
+ duis dolore te feugait nulla facilisi.
185
+ </p>
186
+ <p>
187
+ Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet
188
+ doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit
189
+ amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
190
+ tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad
191
+ minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
192
+ nisl ut aliquip ex ea commodo consequat.
193
+ </p>
194
+ <p>
195
+ Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse
196
+ molestie consequat, vel illum dolore eu feugiat nulla facilisis.
197
+ </p>
198
+ <p>
199
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
200
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem
201
+ ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
202
+ tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
203
+ voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
204
+ clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
205
+ amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam
206
+ aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed
207
+ tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna
208
+ no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor
209
+ sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
210
+ diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
211
+ erat.
212
+ </p>
213
+ <leu-scroll-top />
214
+ `
215
+ }
216
+
217
+ export const Regular = Template.bind({})