@statistikzh/leu 0.2.0 → 0.4.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 (153) 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 -5
  7. package/.storybook/static/logo.svg +19 -0
  8. package/.storybook/theme.js +7 -0
  9. package/CHANGELOG.md +43 -0
  10. package/README.md +1 -1
  11. package/dist/Button.js +39 -30
  12. package/dist/ButtonGroup.js +5 -7
  13. package/dist/Checkbox.js +107 -88
  14. package/dist/CheckboxGroup.js +43 -38
  15. package/dist/{Chip-389013ff.js → Chip-dac7337d.js} +7 -2
  16. package/dist/ChipGroup.js +4 -6
  17. package/dist/ChipLink.js +6 -8
  18. package/dist/ChipRemovable.js +4 -7
  19. package/dist/ChipSelectable.js +10 -10
  20. package/dist/Dropdown.js +57 -27
  21. package/dist/Input.js +59 -43
  22. package/dist/Menu.js +2 -5
  23. package/dist/MenuItem.js +34 -17
  24. package/dist/Pagination.js +57 -55
  25. package/dist/Radio.js +13 -10
  26. package/dist/RadioGroup.js +43 -40
  27. package/dist/Select.js +57 -44
  28. package/dist/Table.js +147 -125
  29. package/dist/{defineElement-ba770aed.js → _rollupPluginBabelHelpers-20f659f4.js} +1 -15
  30. package/dist/defineElement-47d4f665.js +15 -0
  31. package/dist/index.js +29 -19
  32. package/dist/leu-button-group.js +7 -3
  33. package/dist/leu-button.js +6 -3
  34. package/dist/leu-checkbox-group.js +6 -3
  35. package/dist/leu-checkbox.js +6 -3
  36. package/dist/leu-chip-group.js +6 -3
  37. package/dist/leu-chip-link.js +7 -4
  38. package/dist/leu-chip-removable.js +7 -4
  39. package/dist/leu-chip-selectable.js +7 -4
  40. package/dist/leu-dropdown.js +13 -3
  41. package/dist/leu-input.js +7 -3
  42. package/dist/leu-menu-item.js +8 -3
  43. package/dist/leu-menu.js +6 -3
  44. package/dist/leu-pagination.js +8 -3
  45. package/dist/leu-popup-4bf6f1f4.js +216 -0
  46. package/dist/leu-radio-group.js +6 -3
  47. package/dist/leu-radio.js +6 -3
  48. package/dist/leu-select.js +14 -3
  49. package/dist/leu-table.js +9 -3
  50. package/package.json +29 -12
  51. package/scripts/generate-component/templates/[Name].js +0 -5
  52. package/scripts/generate-component/templates/[name].css +1 -1
  53. package/scripts/generate-component/templates/[namespace]-[name].js +5 -2
  54. package/src/components/accordion/Accordion.js +3 -9
  55. package/src/components/accordion/leu-accordion.js +5 -2
  56. package/src/components/accordion/stories/accordion.stories.js +7 -4
  57. package/src/components/accordion/test/accordion.test.js +92 -2
  58. package/src/components/breadcrumb/Breadcrumb.js +310 -0
  59. package/src/components/breadcrumb/breadcrumb.css +114 -0
  60. package/src/components/breadcrumb/leu-breadcrumb.js +6 -0
  61. package/src/components/breadcrumb/stories/breadcrumb.stories.js +73 -0
  62. package/src/components/breadcrumb/test/breadcrumb.test.js +141 -0
  63. package/src/components/button/Button.js +22 -27
  64. package/src/components/button/button.css +3 -3
  65. package/src/components/button/leu-button.js +5 -2
  66. package/src/components/button/stories/button.stories.js +58 -37
  67. package/src/components/button/test/button.test.js +112 -2
  68. package/src/components/button-group/ButtonGroup.js +1 -7
  69. package/src/components/button-group/leu-button-group.js +5 -2
  70. package/src/components/button-group/stories/button-group.stories.js +6 -0
  71. package/src/components/button-group/test/button-group.test.js +79 -3
  72. package/src/components/checkbox/Checkbox.js +9 -89
  73. package/src/components/checkbox/CheckboxGroup.js +9 -39
  74. package/src/components/checkbox/checkbox-group.css +29 -0
  75. package/src/components/checkbox/checkbox.css +76 -0
  76. package/src/components/checkbox/leu-checkbox-group.js +5 -2
  77. package/src/components/checkbox/leu-checkbox.js +5 -2
  78. package/src/components/checkbox/stories/checkbox-group.stories.js +44 -21
  79. package/src/components/checkbox/stories/checkbox.stories.js +7 -1
  80. package/src/components/checkbox/test/checkbox-group.test.js +124 -0
  81. package/src/components/checkbox/test/checkbox.test.js +72 -59
  82. package/src/components/chip/Chip.js +2 -1
  83. package/src/components/chip/ChipGroup.js +1 -6
  84. package/src/components/chip/ChipLink.js +2 -8
  85. package/src/components/chip/ChipRemovable.js +1 -6
  86. package/src/components/chip/ChipSelectable.js +4 -9
  87. package/src/components/chip/exports.js +4 -10
  88. package/src/components/chip/leu-chip-group.js +5 -2
  89. package/src/components/chip/leu-chip-link.js +5 -2
  90. package/src/components/chip/leu-chip-removable.js +5 -2
  91. package/src/components/chip/leu-chip-selectable.js +5 -2
  92. package/src/components/chip/stories/chip-group.stories.js +18 -6
  93. package/src/components/chip/stories/chip-link.stories.js +16 -4
  94. package/src/components/chip/stories/chip-removable.stories.js +15 -4
  95. package/src/components/chip/stories/chip-selectable.stories.js +13 -3
  96. package/src/components/chip/test/chip-group.test.js +124 -0
  97. package/src/components/chip/test/chip-link.test.js +58 -0
  98. package/src/components/chip/test/chip-removable.test.js +79 -0
  99. package/src/components/chip/test/chip-selectable.test.js +95 -0
  100. package/src/components/chip/test/chip.test.js +1 -1
  101. package/src/components/dropdown/Dropdown.js +53 -25
  102. package/src/components/dropdown/dropdown.css +1 -2
  103. package/src/components/dropdown/leu-dropdown.js +5 -2
  104. package/src/components/dropdown/stories/dropdown.stories.js +11 -5
  105. package/src/components/dropdown/test/dropdown.test.js +6 -6
  106. package/src/components/icon/icon.js +1 -1
  107. package/src/components/icon/test/icon.test.js +66 -0
  108. package/src/components/input/Input.js +33 -39
  109. package/src/components/input/input.css +9 -6
  110. package/src/components/input/leu-input.js +5 -2
  111. package/src/components/input/stories/input.stories.js +8 -2
  112. package/src/components/input/test/input.test.js +431 -4
  113. package/src/components/menu/Menu.js +0 -5
  114. package/src/components/menu/MenuItem.js +22 -15
  115. package/src/components/menu/leu-menu-item.js +5 -2
  116. package/src/components/menu/leu-menu.js +5 -2
  117. package/src/components/menu/menu-item.css +5 -2
  118. package/src/components/menu/stories/menu-item.stories.js +13 -4
  119. package/src/components/menu/stories/menu.stories.js +11 -5
  120. package/src/components/menu/test/menu-item.test.js +180 -0
  121. package/src/components/menu/test/menu.test.js +10 -2
  122. package/src/components/pagination/Pagination.js +53 -65
  123. package/src/components/pagination/leu-pagination.js +5 -2
  124. package/src/components/pagination/stories/pagination.stories.js +17 -9
  125. package/src/components/pagination/test/pagination.test.js +191 -5
  126. package/src/components/popup/Popup.js +200 -0
  127. package/src/components/popup/leu-popup.js +6 -0
  128. package/src/components/popup/popup.css +27 -0
  129. package/src/components/popup/stories/popup.stories.js +58 -0
  130. package/src/components/popup/test/popup.test.js +29 -0
  131. package/src/components/radio/Radio.js +5 -10
  132. package/src/components/radio/RadioGroup.js +7 -39
  133. package/src/components/radio/leu-radio-group.js +5 -2
  134. package/src/components/radio/leu-radio.js +5 -2
  135. package/src/components/radio/radio-group.css +29 -0
  136. package/src/components/radio/stories/radio-group.stories.js +38 -19
  137. package/src/components/radio/stories/radio.stories.js +7 -1
  138. package/src/components/radio/test/radio-group.test.js +86 -0
  139. package/src/components/radio/test/radio.test.js +108 -17
  140. package/src/components/select/Select.js +35 -32
  141. package/src/components/select/leu-select.js +5 -2
  142. package/src/components/select/select.css +13 -13
  143. package/src/components/select/stories/select.stories.js +15 -168
  144. package/src/components/select/test/fixtures.js +162 -0
  145. package/src/components/select/test/select.test.js +236 -12
  146. package/src/components/table/Table.js +48 -123
  147. package/src/components/table/leu-table.js +5 -2
  148. package/src/components/table/stories/table.stories.js +20 -10
  149. package/src/components/table/table.css +99 -0
  150. package/src/components/table/test/table.test.js +1 -1
  151. package/src/lib/utils.js +17 -0
  152. package/{web-dev-server-storybook.config.mjs → web-dev-server.config.mjs} +1 -2
  153. package/web-test-runner.config.mjs +15 -2
@@ -2,10 +2,17 @@ import { html } from "lit"
2
2
  import { ifDefined } from "lit/directives/if-defined.js"
3
3
 
4
4
  import "../leu-select.js"
5
+ import { MUNICIPALITIES } from "../test/fixtures.js"
5
6
 
6
7
  export default {
7
- title: "select",
8
+ title: "Select",
8
9
  component: "leu-select",
10
+ parameters: {
11
+ design: {
12
+ type: "figma",
13
+ url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-82208&mode=design&t=lzVrtq8lxYVJU5TB-11",
14
+ },
15
+ },
9
16
  }
10
17
 
11
18
  const OPTIONS_EXAMPLES = [
@@ -14,168 +21,6 @@ const OPTIONS_EXAMPLES = [
14
21
  "Option 3",
15
22
  "Sehr lange Option um zu schauen was passiert, wenn es zu lang wird.",
16
23
  ]
17
- const OPTIONS_MUNICIPALITIES = [
18
- "Aeugst am Albis",
19
- "Affoltern am Albis",
20
- "Bonstetten",
21
- "Hausen am Albis",
22
- "Hedingen",
23
- "Kappel am Albis",
24
- "Knonau",
25
- "Maschwanden",
26
- "Mettmenstetten",
27
- "Obfelden",
28
- "Ottenbach",
29
- "Rifferswil",
30
- "Stallikon",
31
- "Wettswil am Albis",
32
- "Benken (ZH)",
33
- "Berg am Irchel",
34
- "Buch am Irchel",
35
- "Dachsen",
36
- "Dorf",
37
- "Feuerthalen",
38
- "Flaach",
39
- "Flurlingen",
40
- "Henggart",
41
- "Kleinandelfingen",
42
- "Laufen-Uhwiesen",
43
- "Marthalen",
44
- "Ossingen",
45
- "Rheinau",
46
- "Thalheim an der Thur",
47
- "Trüllikon",
48
- "Truttikon",
49
- "Volken",
50
- "Bachenbülach",
51
- "Bassersdorf",
52
- "Bülach",
53
- "Dietlikon",
54
- "Eglisau",
55
- "Embrach",
56
- "Freienstein-Teufen",
57
- "Glattfelden",
58
- "Hochfelden",
59
- "Höri",
60
- "Hüntwangen",
61
- "Kloten",
62
- "Lufingen",
63
- "Nürensdorf",
64
- "Oberembrach",
65
- "Opfikon",
66
- "Rafz",
67
- "Rorbas",
68
- "Wallisellen",
69
- "Wasterkingen",
70
- "Wil (ZH)",
71
- "Winkel",
72
- "Bachs",
73
- "Boppelsen",
74
- "Buchs (ZH)",
75
- "Dällikon",
76
- "Dänikon",
77
- "Dielsdorf",
78
- "Hüttikon",
79
- "Neerach",
80
- "Niederglatt",
81
- "Niederhasli",
82
- "Niederweningen",
83
- "Oberglatt",
84
- "Oberweningen",
85
- "Otelfingen",
86
- "Regensberg",
87
- "Regensdorf",
88
- "Rümlang",
89
- "Schleinikon",
90
- "Schöfflisdorf",
91
- "Stadel",
92
- "Steinmaur",
93
- "Weiach",
94
- "Bäretswil",
95
- "Bubikon",
96
- "Dürnten",
97
- "Fischenthal",
98
- "Gossau (ZH)",
99
- "Grüningen",
100
- "Hinwil",
101
- "Rüti (ZH)",
102
- "Seegräben",
103
- "Wald (ZH)",
104
- "Wetzikon (ZH)",
105
- "Adliswil",
106
- "Kilchberg (ZH)",
107
- "Langnau am Albis",
108
- "Oberrieden",
109
- "Richterswil",
110
- "Rüschlikon",
111
- "Thalwil",
112
- "Erlenbach (ZH)",
113
- "Herrliberg",
114
- "Hombrechtikon",
115
- "Küsnacht (ZH)",
116
- "Männedorf",
117
- "Meilen",
118
- "Oetwil am See",
119
- "Stäfa",
120
- "Uetikon am See",
121
- "Zumikon",
122
- "Zollikon",
123
- "Fehraltorf",
124
- "Hittnau",
125
- "Lindau",
126
- "Pfäffikon",
127
- "Russikon",
128
- "Weisslingen",
129
- "Wila",
130
- "Wildberg",
131
- "Dübendorf",
132
- "Egg",
133
- "Fällanden",
134
- "Greifensee",
135
- "Maur",
136
- "Mönchaltorf",
137
- "Schwerzenbach",
138
- "Uster",
139
- "Volketswil",
140
- "Wangen-Brüttisellen",
141
- "Altikon",
142
- "Brütten",
143
- "Dägerlen",
144
- "Dättlikon",
145
- "Dinhard",
146
- "Ellikon an der Thur",
147
- "Elsau",
148
- "Hagenbuch",
149
- "Hettlingen",
150
- "Neftenbach",
151
- "Pfungen",
152
- "Rickenbach (ZH)",
153
- "Schlatt (ZH)",
154
- "Seuzach",
155
- "Turbenthal",
156
- "Winterthur",
157
- "Zell (ZH)",
158
- "Aesch (ZH)",
159
- "Birmensdorf (ZH)",
160
- "Dietikon",
161
- "Geroldswil",
162
- "Oberengstringen",
163
- "Oetwil an der Limmat",
164
- "Schlieren",
165
- "Uitikon",
166
- "Unterengstringen",
167
- "Urdorf",
168
- "Weiningen (ZH)",
169
- "Zürich",
170
- "Andelfingen",
171
- "Stammheim",
172
- "Wädenswil",
173
- "Elgg",
174
- "Horgen",
175
- "Illnau-Effretikon",
176
- "Bauma",
177
- "Wiesendangen",
178
- ]
179
24
 
180
25
  function Template({
181
26
  label,
@@ -189,6 +34,7 @@ function Template({
189
34
  after,
190
35
  }) {
191
36
  return html`
37
+ <div style="margin-top: 50vh"></div>
192
38
  <leu-select
193
39
  class="dropdown"
194
40
  .options=${options}
@@ -202,6 +48,7 @@ function Template({
202
48
  ${before ? html`<div slot="before">${before}</div>` : ""}
203
49
  ${after ? html`<div slot="after">${after}</div>` : ""}
204
50
  </leu-select>
51
+ <div style="margin-top: 50vh"></div>
205
52
  `
206
53
  }
207
54
 
@@ -263,7 +110,7 @@ DisabledFilled.args = {
263
110
  export const Filterable = Template.bind({})
264
111
  Filterable.args = {
265
112
  label: "Gemeinde",
266
- options: OPTIONS_MUNICIPALITIES,
113
+ options: MUNICIPALITIES,
267
114
  clearable: true,
268
115
  disabled: false,
269
116
  filterable: true,
@@ -273,7 +120,7 @@ Filterable.args = {
273
120
  export const BeforeAfterSlot = TemplateSlots.bind({})
274
121
  BeforeAfterSlot.args = {
275
122
  label: "Gemeinde",
276
- options: OPTIONS_MUNICIPALITIES,
123
+ options: MUNICIPALITIES,
277
124
  clearable: true,
278
125
  disabled: false,
279
126
  filterable: false,
@@ -283,7 +130,7 @@ BeforeAfterSlot.args = {
283
130
  export const Multiple = Template.bind({})
284
131
  Multiple.args = {
285
132
  label: "Gemeinde",
286
- options: OPTIONS_MUNICIPALITIES,
133
+ options: MUNICIPALITIES,
287
134
  clearable: true,
288
135
  disabled: false,
289
136
  filterable: true,
@@ -293,8 +140,8 @@ Multiple.args = {
293
140
  export const MultipleFilled = Template.bind({})
294
141
  MultipleFilled.args = {
295
142
  label: "Gemeinde",
296
- options: OPTIONS_MUNICIPALITIES,
297
- value: OPTIONS_MUNICIPALITIES.slice(0, 2),
143
+ options: MUNICIPALITIES,
144
+ value: MUNICIPALITIES.slice(0, 2),
298
145
  clearable: true,
299
146
  disabled: false,
300
147
  filterable: true,
@@ -0,0 +1,162 @@
1
+ export const MUNICIPALITIES = [
2
+ "Aeugst am Albis",
3
+ "Affoltern am Albis",
4
+ "Bonstetten",
5
+ "Hausen am Albis",
6
+ "Hedingen",
7
+ "Kappel am Albis",
8
+ "Knonau",
9
+ "Maschwanden",
10
+ "Mettmenstetten",
11
+ "Obfelden",
12
+ "Ottenbach",
13
+ "Rifferswil",
14
+ "Stallikon",
15
+ "Wettswil am Albis",
16
+ "Benken (ZH)",
17
+ "Berg am Irchel",
18
+ "Buch am Irchel",
19
+ "Dachsen",
20
+ "Dorf",
21
+ "Feuerthalen",
22
+ "Flaach",
23
+ "Flurlingen",
24
+ "Henggart",
25
+ "Kleinandelfingen",
26
+ "Laufen-Uhwiesen",
27
+ "Marthalen",
28
+ "Ossingen",
29
+ "Rheinau",
30
+ "Thalheim an der Thur",
31
+ "Trüllikon",
32
+ "Truttikon",
33
+ "Volken",
34
+ "Bachenbülach",
35
+ "Bassersdorf",
36
+ "Bülach",
37
+ "Dietlikon",
38
+ "Eglisau",
39
+ "Embrach",
40
+ "Freienstein-Teufen",
41
+ "Glattfelden",
42
+ "Hochfelden",
43
+ "Höri",
44
+ "Hüntwangen",
45
+ "Kloten",
46
+ "Lufingen",
47
+ "Nürensdorf",
48
+ "Oberembrach",
49
+ "Opfikon",
50
+ "Rafz",
51
+ "Rorbas",
52
+ "Wallisellen",
53
+ "Wasterkingen",
54
+ "Wil (ZH)",
55
+ "Winkel",
56
+ "Bachs",
57
+ "Boppelsen",
58
+ "Buchs (ZH)",
59
+ "Dällikon",
60
+ "Dänikon",
61
+ "Dielsdorf",
62
+ "Hüttikon",
63
+ "Neerach",
64
+ "Niederglatt",
65
+ "Niederhasli",
66
+ "Niederweningen",
67
+ "Oberglatt",
68
+ "Oberweningen",
69
+ "Otelfingen",
70
+ "Regensberg",
71
+ "Regensdorf",
72
+ "Rümlang",
73
+ "Schleinikon",
74
+ "Schöfflisdorf",
75
+ "Stadel",
76
+ "Steinmaur",
77
+ "Weiach",
78
+ "Bäretswil",
79
+ "Bubikon",
80
+ "Dürnten",
81
+ "Fischenthal",
82
+ "Gossau (ZH)",
83
+ "Grüningen",
84
+ "Hinwil",
85
+ "Rüti (ZH)",
86
+ "Seegräben",
87
+ "Wald (ZH)",
88
+ "Wetzikon (ZH)",
89
+ "Adliswil",
90
+ "Kilchberg (ZH)",
91
+ "Langnau am Albis",
92
+ "Oberrieden",
93
+ "Richterswil",
94
+ "Rüschlikon",
95
+ "Thalwil",
96
+ "Erlenbach (ZH)",
97
+ "Herrliberg",
98
+ "Hombrechtikon",
99
+ "Küsnacht (ZH)",
100
+ "Männedorf",
101
+ "Meilen",
102
+ "Oetwil am See",
103
+ "Stäfa",
104
+ "Uetikon am See",
105
+ "Zumikon",
106
+ "Zollikon",
107
+ "Fehraltorf",
108
+ "Hittnau",
109
+ "Lindau",
110
+ "Pfäffikon",
111
+ "Russikon",
112
+ "Weisslingen",
113
+ "Wila",
114
+ "Wildberg",
115
+ "Dübendorf",
116
+ "Egg",
117
+ "Fällanden",
118
+ "Greifensee",
119
+ "Maur",
120
+ "Mönchaltorf",
121
+ "Schwerzenbach",
122
+ "Uster",
123
+ "Volketswil",
124
+ "Wangen-Brüttisellen",
125
+ "Altikon",
126
+ "Brütten",
127
+ "Dägerlen",
128
+ "Dättlikon",
129
+ "Dinhard",
130
+ "Ellikon an der Thur",
131
+ "Elsau",
132
+ "Hagenbuch",
133
+ "Hettlingen",
134
+ "Neftenbach",
135
+ "Pfungen",
136
+ "Rickenbach (ZH)",
137
+ "Schlatt (ZH)",
138
+ "Seuzach",
139
+ "Turbenthal",
140
+ "Winterthur",
141
+ "Zell (ZH)",
142
+ "Aesch (ZH)",
143
+ "Birmensdorf (ZH)",
144
+ "Dietikon",
145
+ "Geroldswil",
146
+ "Oberengstringen",
147
+ "Oetwil an der Limmat",
148
+ "Schlieren",
149
+ "Uitikon",
150
+ "Unterengstringen",
151
+ "Urdorf",
152
+ "Weiningen (ZH)",
153
+ "Zürich",
154
+ "Andelfingen",
155
+ "Stammheim",
156
+ "Wädenswil",
157
+ "Elgg",
158
+ "Horgen",
159
+ "Illnau-Effretikon",
160
+ "Bauma",
161
+ "Wiesendangen",
162
+ ]
@@ -1,29 +1,253 @@
1
1
  import { html } from "lit"
2
- import { fixture, expect } from "@open-wc/testing"
2
+ import { ifDefined } from "lit/directives/if-defined.js"
3
+ import { fixture, expect, elementUpdated } from "@open-wc/testing"
4
+ import { sendKeys } from "@web/test-runner-commands"
3
5
 
4
6
  import "../leu-select.js"
7
+ import { MUNICIPALITIES } from "./fixtures.js"
5
8
 
6
- async function defaultFixture() {
7
- return fixture(html`
8
- <leu-select
9
- options='[{"label":"Option 1", "value":"1"}, "Option 2", "Option 3", "Sehr lange Option um zu schauen was passiert, wenn es zu lang wird."]'
10
- label="Label"
11
- value=${null}
12
- >
13
- </leu-select>
14
- `)
9
+ async function defaultFixture(args = {}) {
10
+ return fixture(html`<leu-select
11
+ .options=${args.options}
12
+ label=${ifDefined(args.label)}
13
+ .value=${args.value ?? []}
14
+ ?clearable=${args.clearable}
15
+ ?disabled=${args.disabled}
16
+ ?filterable=${args.filterable}
17
+ ?multiple=${args.multiple}
18
+ >
19
+ </leu-select> `)
15
20
  }
16
21
 
17
22
  describe("LeuSelect", () => {
18
23
  it("is a defined element", async () => {
19
- const el = await customElements.get("leu-select")
24
+ const el = customElements.get("leu-select")
20
25
 
21
26
  await expect(el).not.to.be.undefined
22
27
  })
23
28
 
24
29
  it("passes the a11y audit", async () => {
25
- const el = await defaultFixture()
30
+ const el = await defaultFixture({
31
+ options: MUNICIPALITIES,
32
+ label: "Gemeinde",
33
+ })
26
34
 
27
35
  await expect(el).shadowDom.to.be.accessible()
28
36
  })
37
+
38
+ it("passes the a11y audit in the open state", async () => {
39
+ const el = await defaultFixture({
40
+ options: MUNICIPALITIES,
41
+ label: "Gemeinde",
42
+ open: true,
43
+ })
44
+
45
+ await expect(el).shadowDom.to.be.accessible()
46
+ })
47
+
48
+ it("renders a label", async () => {
49
+ const el = await defaultFixture({
50
+ options: MUNICIPALITIES,
51
+ label: "Gemeinde",
52
+ })
53
+
54
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
55
+
56
+ expect(toggleButton).to.have.trimmed.text("Gemeinde")
57
+ })
58
+
59
+ it("doesn't show the list of options by default", async () => {
60
+ const el = await defaultFixture({
61
+ options: MUNICIPALITIES,
62
+ label: "Gemeinde",
63
+ })
64
+
65
+ const dialog = el.shadowRoot.querySelector("dialog")
66
+
67
+ expect(dialog).to.not.have.attribute("open")
68
+ })
69
+
70
+ it("opens the list of options when the toggle button is clicked", async () => {
71
+ const el = await defaultFixture({
72
+ options: MUNICIPALITIES,
73
+ label: "Gemeinde",
74
+ })
75
+
76
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
77
+ toggleButton.click()
78
+
79
+ const dialog = el.shadowRoot.querySelector("dialog")
80
+ await elementUpdated(el)
81
+
82
+ expect(dialog).to.have.attribute("open")
83
+ })
84
+
85
+ it("has a default value of an empty array", async () => {
86
+ const el = await defaultFixture({
87
+ options: MUNICIPALITIES,
88
+ label: "Gemeinde",
89
+ })
90
+
91
+ expect(el.value).to.deep.equal([])
92
+ })
93
+
94
+ it("marks the menu item as selected a the value is set", async () => {
95
+ const el = await defaultFixture({
96
+ options: MUNICIPALITIES,
97
+ label: "Gemeinde",
98
+ value: "Affoltern am Albis",
99
+ })
100
+
101
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
102
+ toggleButton.click()
103
+
104
+ const menuItem = el.shadowRoot.querySelector(
105
+ "leu-menu-item[label='Affoltern am Albis']"
106
+ )
107
+
108
+ expect(menuItem).to.have.attribute("active")
109
+ expect(menuItem).to.have.attribute("aria-selected")
110
+ })
111
+
112
+ it("shows the clear button when a value is set", async () => {
113
+ const el = await defaultFixture({
114
+ options: MUNICIPALITIES,
115
+ label: "Gemeinde",
116
+ value: "Affoltern am Albis",
117
+ clearable: true,
118
+ })
119
+
120
+ const clearButton = el.shadowRoot.querySelector(".clear-button")
121
+
122
+ expect(clearButton).to.exist
123
+ })
124
+
125
+ it("renders a input field to filter the options", async () => {
126
+ const el = await defaultFixture({
127
+ options: MUNICIPALITIES,
128
+ label: "Gemeinde",
129
+ filterable: true,
130
+ })
131
+
132
+ const filterInput = el.shadowRoot.querySelector(".select-search")
133
+
134
+ expect(filterInput).to.exist
135
+ })
136
+
137
+ it("filters the options when the filter input is changed", async () => {
138
+ const el = await defaultFixture({
139
+ options: MUNICIPALITIES,
140
+ label: "Gemeinde",
141
+ filterable: true,
142
+ })
143
+
144
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
145
+ toggleButton.click()
146
+
147
+ const filterInput = el.shadowRoot.querySelector(".select-search")
148
+ filterInput.focus()
149
+
150
+ await sendKeys({ type: "am albis" })
151
+
152
+ const menuItems = el.shadowRoot.querySelectorAll("leu-menu-item")
153
+ expect(menuItems.length).to.equal(6)
154
+ })
155
+
156
+ it("resets the filter when the filter input is cleared", async () => {
157
+ const el = await defaultFixture({
158
+ options: MUNICIPALITIES,
159
+ label: "Gemeinde",
160
+ filterable: true,
161
+ })
162
+
163
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
164
+ toggleButton.click()
165
+
166
+ const filterInput = el.shadowRoot.querySelector(".select-search")
167
+ filterInput.focus()
168
+
169
+ await sendKeys({ type: "am albis" })
170
+
171
+ const clearFilterButton =
172
+ filterInput.shadowRoot.querySelector(".clear-button")
173
+ clearFilterButton.click()
174
+ await elementUpdated(el)
175
+
176
+ const menuItems = el.shadowRoot.querySelectorAll("leu-menu-item")
177
+ expect(menuItems.length).to.equal(MUNICIPALITIES.length)
178
+ })
179
+
180
+ it("renders a message when no options are available", async () => {
181
+ const el = await defaultFixture({
182
+ options: [],
183
+ label: "Gemeinde",
184
+ })
185
+
186
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
187
+ toggleButton.click()
188
+
189
+ const menuItem = el.shadowRoot.querySelector("leu-menu-item")
190
+ expect(menuItem).to.have.attribute("label", "Keine Optionen")
191
+ })
192
+
193
+ it("renders a message when no options are available after filtering", async () => {
194
+ const el = await defaultFixture({
195
+ options: MUNICIPALITIES,
196
+ label: "Gemeinde",
197
+ filterable: true,
198
+ })
199
+
200
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
201
+ toggleButton.click()
202
+
203
+ const filterInput = el.shadowRoot.querySelector(".select-search")
204
+ filterInput.focus()
205
+
206
+ await sendKeys({ type: "am albissss" })
207
+
208
+ const menuItem = el.shadowRoot.querySelector("leu-menu-item")
209
+ expect(menuItem).to.have.attribute("label", "Keine Resultate")
210
+ })
211
+
212
+ it("renders a apply button when multiple selection is allowed", async () => {
213
+ const el = await defaultFixture({
214
+ options: MUNICIPALITIES,
215
+ label: "Gemeinde",
216
+ multiple: true,
217
+ })
218
+
219
+ const applyButton = el.shadowRoot.querySelector("leu-menu + .apply-button")
220
+ expect(applyButton).to.exist
221
+ })
222
+
223
+ it("updates the value when an option is selected", async () => {
224
+ const el = await defaultFixture({
225
+ options: MUNICIPALITIES,
226
+ label: "Gemeinde",
227
+ })
228
+
229
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
230
+ toggleButton.click()
231
+
232
+ const menuItem = el.shadowRoot.querySelector("leu-menu-item[label='Maur']")
233
+ menuItem.click()
234
+
235
+ expect(el.value).to.deep.equal(["Maur"])
236
+ })
237
+
238
+ it("allows a value with multiple values", async () => {
239
+ const el = await defaultFixture({
240
+ options: MUNICIPALITIES,
241
+ label: "Gemeinde",
242
+ multiple: true,
243
+ })
244
+
245
+ const toggleButton = el.shadowRoot.querySelector(".select-toggle")
246
+ toggleButton.click()
247
+
248
+ el.shadowRoot.querySelector("leu-menu-item[label='Maur']").click()
249
+ el.shadowRoot.querySelector("leu-menu-item[label='Zollikon']").click()
250
+
251
+ expect(el.value).to.deep.equal(["Maur", "Zollikon"])
252
+ })
29
253
  })