@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,5 +1,4 @@
1
1
  import { html } from "lit"
2
- import { defineElement } from "../../lib/defineElement.js"
3
2
 
4
3
  import { LeuChipBase } from "./Chip.js"
5
4
 
@@ -9,7 +8,7 @@ export const SIZES = {
9
8
  }
10
9
 
11
10
  export const VARIANTS = {
12
- default: "default",
11
+ toggle: "toggle",
13
12
  radio: "radio",
14
13
  }
15
14
 
@@ -31,11 +30,11 @@ export class LeuChipSelectable extends LeuChipBase {
31
30
 
32
31
  /**
33
32
  * The variant of the chip. Has an effect not only on the visual appearance but also on the behavior.
34
- * - `default`: The chip behaves like a toggle button.
33
+ * - `toggle`: The chip behaves like a toggle button.
35
34
  * - `radio`: The chip behaves like a radio button.
36
35
  *
37
36
  * @type {keyof typeof VARIANTS}
38
- * @default "default"
37
+ * @default "toggle"
39
38
  */
40
39
  variant: { type: String, reflect: true },
41
40
 
@@ -79,13 +78,9 @@ export class LeuChipSelectable extends LeuChipBase {
79
78
  return html`<button
80
79
  @click=${(e) => this.handleClick(e)}
81
80
  class="button"
82
- aria-selected=${this.selected ? "true" : "false"}
81
+ aria-pressed=${this.selected ? "true" : "false"}
83
82
  >
84
- <span class="label"><slot></slot></span>
83
+ <span class="label">${this.label}</span>
85
84
  </button>`
86
85
  }
87
86
  }
88
-
89
- export function defineChipSelectableElements() {
90
- defineElement("chip-selectable", LeuChipSelectable)
91
- }
@@ -1,5 +1,15 @@
1
- :host {
1
+ .label {
2
+ margin: 0 0 0.5rem;
3
+ font: var(--leu-t-curve-35-black-font);
4
+ color: var(--leu-color-black-100);
5
+ }
6
+
7
+ :host([inverted]) .label {
8
+ color: var(--leu-color-black-0);
9
+ }
10
+
11
+ .group {
2
12
  display: flex;
3
13
  flex-wrap: wrap;
4
- gap: 0.5rem;
14
+ gap: var(--leu-chip-group-gap, 0.5rem);
5
15
  }
@@ -20,8 +20,8 @@
20
20
  --chip-radio-background-default: var(--leu-color-black-0);
21
21
  --chip-radio-background-selected: var(--leu-color-func-cyan);
22
22
 
23
- --chip-font-regular: var(--leu-font-regular);
24
- --chip-font-black: var(--leu-font-black);
23
+ --chip-font-regular: var(--leu-font-family-regular);
24
+ --chip-font-black: var(--leu-font-family-black);
25
25
 
26
26
  --chip-background-color: var(--chip-background-color-default);
27
27
  --chip-color: var(--chip-color-default);
@@ -29,6 +29,9 @@
29
29
  --chip-radio-background: var(--chip-radio-background-default);
30
30
 
31
31
  font-family: var(--chip-font-regular);
32
+
33
+ /* Allow shrinking to achieve text truncation (ellipsis) */
34
+ min-width: 0;
32
35
  }
33
36
 
34
37
  :host([inverted]) {
@@ -61,8 +64,11 @@
61
64
  cursor: pointer;
62
65
 
63
66
  display: inline-flex;
64
- align-items: center;
65
67
  gap: 0.5rem;
68
+
69
+ /* Allow shrinking to achieve text truncation (ellipsis) */
70
+ min-width: 0;
71
+ max-width: 100%;
66
72
  }
67
73
 
68
74
  .button:hover,
@@ -109,6 +115,7 @@
109
115
 
110
116
  :host([variant="radio"]) .button::before {
111
117
  content: "";
118
+ flex: 0 0 1rem;
112
119
  width: 1rem;
113
120
  height: 1rem;
114
121
  background-color: var(--chip-radio-background);
@@ -123,6 +130,10 @@
123
130
  .label {
124
131
  position: relative;
125
132
  top: -0.0625rem;
133
+
134
+ overflow: hidden;
135
+ text-overflow: ellipsis;
136
+ white-space: nowrap;
126
137
  }
127
138
 
128
139
  .icon svg {
@@ -1,10 +1,4 @@
1
- export { LeuChipGroup, defineChipGroupElements } from "./ChipGroup.js"
2
- export { LeuChipLink, defineChipLinkElements } from "./ChipLink.js"
3
- export {
4
- LeuChipRemovable,
5
- defineChipRemovableElements,
6
- } from "./ChipRemovable.js"
7
- export {
8
- LeuChipSelectable,
9
- defineChipSelectableElements,
10
- } from "./ChipSelectable.js"
1
+ export { LeuChipGroup } from "./ChipGroup.js"
2
+ export { LeuChipLink } from "./ChipLink.js"
3
+ export { LeuChipRemovable } from "./ChipRemovable.js"
4
+ export { LeuChipSelectable } from "./ChipSelectable.js"
@@ -1,3 +1,6 @@
1
- import { defineChipGroupElements } from "./ChipGroup.js"
1
+ import { defineElement } from "../../lib/defineElement.js"
2
+ import { LeuChipGroup } from "./ChipGroup.js"
2
3
 
3
- defineChipGroupElements()
4
+ export { LeuChipGroup }
5
+
6
+ defineElement("chip-group", LeuChipGroup)
@@ -1,3 +1,6 @@
1
- import { defineChipLinkElements } from "./ChipLink.js"
1
+ import { defineElement } from "../../lib/defineElement.js"
2
+ import { LeuChipLink } from "./ChipLink.js"
2
3
 
3
- defineChipLinkElements()
4
+ export { LeuChipLink }
5
+
6
+ defineElement("chip-link", LeuChipLink)
@@ -1,3 +1,6 @@
1
- import { defineChipRemovableElements } from "./ChipRemovable.js"
1
+ import { defineElement } from "../../lib/defineElement.js"
2
+ import { LeuChipRemovable } from "./ChipRemovable.js"
2
3
 
3
- defineChipRemovableElements()
4
+ export { LeuChipRemovable }
5
+
6
+ defineElement("chip-removable", LeuChipRemovable)
@@ -1,3 +1,6 @@
1
- import { defineChipSelectableElements } from "./ChipSelectable.js"
1
+ import { defineElement } from "../../lib/defineElement.js"
2
+ import { LeuChipSelectable } from "./ChipSelectable.js"
2
3
 
3
- defineChipSelectableElements()
4
+ export { LeuChipSelectable }
5
+
6
+ defineElement("chip-selectable", LeuChipSelectable)
@@ -1,92 +1,155 @@
1
1
  import { html } from "lit"
2
+ import { ifDefined } from "lit/directives/if-defined.js"
3
+ import { styleMap } from "lit/directives/style-map.js"
2
4
 
3
5
  import "../leu-chip-selectable.js"
4
6
  import "../leu-chip-removable.js"
7
+ import "../leu-chip-link.js"
5
8
  import "../leu-chip-group.js"
6
9
 
7
10
  import { SELECTION_MODES } from "../ChipGroup.js"
8
11
  import { VARIANTS as SELECTABLE_VARIANTS } from "../ChipSelectable.js"
9
12
 
10
13
  export default {
11
- title: "Chip Group",
14
+ title: "Chip/Group",
12
15
  component: "leu-chip-group",
13
16
  argTypes: {
14
17
  selectionMode: {
15
18
  control: "select",
16
19
  options: Object.values(SELECTION_MODES),
17
20
  },
18
- inverted: { control: "boolean" },
21
+ headingLevel: {
22
+ control: "select",
23
+ options: [1, 2, 3, 4, 5, 6],
24
+ },
25
+ "--leu-chip-group-gap": {
26
+ control: "text",
27
+ },
19
28
  },
20
29
  args: {
21
30
  selectionMode: "",
22
31
  inverted: false,
23
32
  },
33
+ parameters: {
34
+ design: {
35
+ type: "figma",
36
+ url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-81933&mode=design&t=lzVrtq8lxYVJU5TB-11",
37
+ },
38
+ html: {
39
+ root: "[data-root]",
40
+ },
41
+ },
24
42
  }
25
43
 
26
- const chips = ["Chip 1", "Chip 2", "Chip 3"]
44
+ const chips = [
45
+ "Chip mit einem sehr langen Text der dann hoffentlich mal abgeschnitten wird",
46
+ "Chip 2",
47
+ "Chip 3",
48
+ ]
27
49
 
28
- function invertedBackground(args, content) {
29
- return html`
30
- <div
31
- style="background: ${args.inverted
32
- ? "hsla(209, 83%, 59%, 1)"
33
- : "var(--leu-color-black-5)"}; padding: 1rem;"
50
+ const links = [
51
+ "Steuererklärung",
52
+ "Abstimmungen",
53
+ "Zentrale Aufnahmeprüfung",
54
+ "Pass & Identitätskarte",
55
+ "Arbeiten beim Kanton",
56
+ ]
57
+
58
+ function invertedBackground({ args, content }) {
59
+ return {
60
+ content: html`
61
+ <div
62
+ style="background: ${args.inverted
63
+ ? "hsla(209, 83%, 59%, 1)"
64
+ : "var(--leu-color-black-5)"}; padding: 1rem;"
65
+ data-root
66
+ >
67
+ ${content}
68
+ </div>
69
+ `,
70
+ args,
71
+ }
72
+ }
73
+
74
+ function chipGroup({ args, content }) {
75
+ const styles = {
76
+ "--leu-chip-group-gap": args["--leu-chip-group-gap"],
77
+ }
78
+
79
+ const nextContent = html`
80
+ <leu-chip-group
81
+ style=${styleMap(styles)}
82
+ selection-mode=${ifDefined(args.selectionMode)}
83
+ heading-level=${ifDefined(args.headingLevel)}
84
+ label=${ifDefined(args.label)}
85
+ ?inverted=${args.inverted}
34
86
  >
35
87
  ${content}
36
- </div>
88
+ </leu-chip-group>
37
89
  `
90
+
91
+ return { args, content: nextContent }
38
92
  }
39
93
 
40
94
  function DefaultTemplate(args) {
41
95
  const content = html`
42
- <leu-chip-group selection-mode=${args.selectionMode}>
43
- ${chips.map(
44
- (chip) => html`
45
- <leu-chip-removable ?inverted=${args.inverted}>
46
- ${chip}
47
- </leu-chip-removable>
48
- `
49
- )}
50
- </leu-chip-group>
96
+ ${chips.map(
97
+ (chip) => html`
98
+ <leu-chip-removable ?inverted=${args.inverted} label=${chip}>
99
+ </leu-chip-removable>
100
+ `
101
+ )}
51
102
  `
52
103
 
53
- return invertedBackground(args, content)
104
+ return invertedBackground(chipGroup({ args, content })).content
54
105
  }
55
106
 
56
107
  function SingleTemplate(args) {
57
108
  const content = html`
58
- <leu-chip-group selection-mode=${args.selectionMode}>
59
- ${chips.map(
60
- (chip) => html`
61
- <leu-chip-selectable
62
- ?inverted=${args.inverted}
63
- variant=${SELECTABLE_VARIANTS.radio}
64
- value="chip-${chip}"
65
- >
66
- ${chip}
67
- </leu-chip-selectable>
68
- `
69
- )}
70
- </leu-chip-group>
109
+ ${chips.map(
110
+ (chip) => html`
111
+ <leu-chip-selectable
112
+ ?inverted=${args.inverted}
113
+ variant=${SELECTABLE_VARIANTS.radio}
114
+ value="chip-${chip}"
115
+ label=${chip}
116
+ >
117
+ </leu-chip-selectable>
118
+ `
119
+ )}
71
120
  `
72
121
 
73
- return invertedBackground(args, content)
122
+ return invertedBackground(chipGroup({ args, content })).content
74
123
  }
75
124
 
76
125
  function MultipleTemplate(args) {
77
126
  const content = html`
78
- <leu-chip-group selection-mode=${args.selectionMode}>
79
- ${chips.map(
80
- (chip) => html`
81
- <leu-chip-selectable ?inverted=${args.inverted} value="chip-${chip}">
82
- ${chip}
83
- </leu-chip-selectable>
84
- `
85
- )}
86
- </leu-chip-group>
127
+ ${chips.map(
128
+ (chip) => html`
129
+ <leu-chip-selectable
130
+ ?inverted=${args.inverted}
131
+ value="chip-${chip}"
132
+ label=${chip}
133
+ >
134
+ </leu-chip-selectable>
135
+ `
136
+ )}
137
+ `
138
+
139
+ return invertedBackground(chipGroup({ args, content })).content
140
+ }
141
+
142
+ function LabeledTemplate(args) {
143
+ const content = html`
144
+ ${links.map(
145
+ (chip) => html`
146
+ <leu-chip-link ?inverted=${args.inverted} label=${chip}>
147
+ </leu-chip-link>
148
+ `
149
+ )}
87
150
  `
88
151
 
89
- return invertedBackground(args, content)
152
+ return invertedBackground(chipGroup({ args, content })).content
90
153
  }
91
154
 
92
155
  export const Default = DefaultTemplate.bind({})
@@ -97,3 +160,6 @@ Single.args = { selectionMode: SELECTION_MODES.single }
97
160
 
98
161
  export const Multiple = MultipleTemplate.bind({})
99
162
  Multiple.args = { selectionMode: SELECTION_MODES.multiple }
163
+
164
+ export const Labeled = LabeledTemplate.bind({})
165
+ Labeled.args = { label: "Top Themen" }
@@ -6,7 +6,7 @@ import "../leu-chip-link.js"
6
6
  import { SIZES } from "../ChipLink.js"
7
7
 
8
8
  export default {
9
- title: "Chip Link",
9
+ title: "Chip/Link",
10
10
  component: "leu-chip-link",
11
11
  argTypes: {
12
12
  size: { control: "select", options: Object.values(SIZES) },
@@ -14,6 +14,15 @@ export default {
14
14
  args: {
15
15
  label: "Publikationen",
16
16
  },
17
+ parameters: {
18
+ design: {
19
+ type: "figma",
20
+ url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-81933&mode=design&t=lzVrtq8lxYVJU5TB-11",
21
+ },
22
+ html: {
23
+ root: "[data-root]",
24
+ },
25
+ },
17
26
  }
18
27
 
19
28
  function Template(args) {
@@ -22,10 +31,13 @@ function Template(args) {
22
31
  style="background: ${args.inverted
23
32
  ? "hsla(209, 83%, 59%, 1)"
24
33
  : "var(--leu-color-black-5)"}; padding: 1rem;"
34
+ data-root
25
35
  >
26
- <leu-chip-link size=${ifDefined(args.size)} ?inverted=${args.inverted}
27
- >${args.label}</leu-chip-link
28
- >
36
+ <leu-chip-link
37
+ size=${ifDefined(args.size)}
38
+ ?inverted=${args.inverted}
39
+ label=${args.label}
40
+ ></leu-chip-link>
29
41
  </div>
30
42
  `
31
43
  }
@@ -3,11 +3,20 @@ import { html } from "lit"
3
3
  import "../leu-chip-removable.js"
4
4
 
5
5
  export default {
6
- title: "Chip Removable",
6
+ title: "Chip/Removable",
7
7
  component: "leu-chip-removable",
8
8
  args: {
9
9
  label: "Publikationen",
10
10
  },
11
+ parameters: {
12
+ design: {
13
+ type: "figma",
14
+ url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-81933&mode=design&t=lzVrtq8lxYVJU5TB-11",
15
+ },
16
+ html: {
17
+ root: "[data-root]",
18
+ },
19
+ },
11
20
  }
12
21
 
13
22
  function Template(args) {
@@ -16,10 +25,12 @@ function Template(args) {
16
25
  style="background: ${args.inverted
17
26
  ? "hsla(209, 83%, 59%, 1)"
18
27
  : "var(--leu-color-black-5)"}; padding: 1rem;"
28
+ data-root
19
29
  >
20
- <leu-chip-removable ?inverted=${args.inverted}
21
- >${args.label}</leu-chip-removable
22
- >
30
+ <leu-chip-removable
31
+ ?inverted=${args.inverted}
32
+ label=${args.label}
33
+ ></leu-chip-removable>
23
34
  </div>
24
35
  `
25
36
  }
@@ -6,7 +6,7 @@ import "../leu-chip-selectable.js"
6
6
  import { SIZES, VARIANTS } from "../ChipSelectable.js"
7
7
 
8
8
  export default {
9
- title: "Chip Selectable",
9
+ title: "Chip/Selectable",
10
10
  component: "leu-chip-selectable",
11
11
  argTypes: {
12
12
  variant: { control: "select", options: Object.values(VARIANTS) },
@@ -16,6 +16,15 @@ export default {
16
16
  args: {
17
17
  label: "Publikationen",
18
18
  },
19
+ parameters: {
20
+ design: {
21
+ type: "figma",
22
+ url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-81933&mode=design&t=lzVrtq8lxYVJU5TB-11",
23
+ },
24
+ html: {
25
+ root: "[data-root]",
26
+ },
27
+ },
19
28
  }
20
29
 
21
30
  function Template(args) {
@@ -24,14 +33,15 @@ function Template(args) {
24
33
  style="background: ${args.inverted
25
34
  ? "hsla(209, 83%, 59%, 1)"
26
35
  : "var(--leu-color-black-5)"}; padding: 1rem;"
36
+ data-root
27
37
  >
28
38
  <leu-chip-selectable
29
39
  size=${ifDefined(args.size)}
30
40
  variant=${ifDefined(args.variant)}
41
+ label=${args.label}
31
42
  ?selected=${args.selected}
32
43
  ?inverted=${args.inverted}
33
- >${args.label}</leu-chip-selectable
34
- >
44
+ ></leu-chip-selectable>
35
45
  </div>
36
46
  `
37
47
  }
@@ -0,0 +1,124 @@
1
+ import { html } from "lit"
2
+ import { fixture, expect, oneEvent } from "@open-wc/testing"
3
+
4
+ import "../leu-chip-selectable.js"
5
+ import "../leu-chip-removable.js"
6
+ import "../leu-chip-group.js"
7
+
8
+ async function removableFixture() {
9
+ return fixture(
10
+ html`
11
+ <leu-chip-group>
12
+ <leu-chip-removable label="Publikationen"></leu-chip-removable>
13
+ <leu-chip-removable label="Daten" value="2"></leu-chip-removable>
14
+ <leu-chip-removable
15
+ label="Schnittstellen"
16
+ value="3"
17
+ ></leu-chip-removable>
18
+ </leu-chip-group>
19
+ `
20
+ )
21
+ }
22
+
23
+ async function singleSelectionFixture() {
24
+ return fixture(
25
+ html`
26
+ <leu-chip-group selection-mode="single">
27
+ <leu-chip-selectable
28
+ label="Publikationen"
29
+ value="1"
30
+ variant="radio"
31
+ ></leu-chip-selectable>
32
+ <leu-chip-selectable
33
+ label="Daten"
34
+ value="2"
35
+ variant="radio"
36
+ ></leu-chip-selectable>
37
+ <leu-chip-selectable
38
+ label="Schnittstellen"
39
+ value="3"
40
+ variant="radio"
41
+ ></leu-chip-selectable>
42
+ </leu-chip-group>
43
+ `
44
+ )
45
+ }
46
+
47
+ async function multipleSelectionFixture() {
48
+ return fixture(
49
+ html`
50
+ <leu-chip-group selection-mode="multiple">
51
+ <leu-chip-selectable
52
+ label="Publikationen"
53
+ value="1"
54
+ ></leu-chip-selectable>
55
+ <leu-chip-selectable label="Daten" value="2"></leu-chip-selectable>
56
+ <leu-chip-selectable
57
+ label="Schnittstellen"
58
+ value="3"
59
+ ></leu-chip-selectable>
60
+ </leu-chip-group>
61
+ `
62
+ )
63
+ }
64
+
65
+ describe("LeuChipGroup", () => {
66
+ it("is a defined element", async () => {
67
+ const el = customElements.get("leu-chip-selectable")
68
+
69
+ await expect(el).not.to.be.undefined
70
+ })
71
+
72
+ it("passes the a11y audit with removable chips", async () => {
73
+ const el = await removableFixture()
74
+
75
+ await expect(el).shadowDom.to.be.accessible()
76
+ })
77
+
78
+ it("passes the a11y audit with selectable chips", async () => {
79
+ const el = await multipleSelectionFixture()
80
+
81
+ await expect(el).shadowDom.to.be.accessible()
82
+ })
83
+
84
+ it("passes the a11y audit with selectable radio chips", async () => {
85
+ const el = await singleSelectionFixture()
86
+
87
+ await expect(el).shadowDom.to.be.accessible()
88
+ })
89
+
90
+ it("updates the value when a chip is selected", async () => {
91
+ const el = await singleSelectionFixture()
92
+ const chip = el.querySelector("leu-chip-selectable")
93
+ const chipButton = chip.shadowRoot.querySelector("button")
94
+ chipButton.click()
95
+
96
+ await expect(el.value).to.deep.equal(["1"])
97
+ })
98
+
99
+ it("updates the value when multiple chips are selected", async () => {
100
+ const el = await multipleSelectionFixture()
101
+ const chips = el.querySelectorAll("leu-chip-selectable")
102
+ const chipButton2 = chips[1].shadowRoot.querySelector("button")
103
+ const chipButton3 = chips[2].shadowRoot.querySelector("button")
104
+
105
+ chipButton2.click()
106
+ chipButton3.click()
107
+
108
+ await expect(el.value).to.deep.equal(["2", "3"])
109
+ })
110
+
111
+ it("fires an input event when a chip is selected", async () => {
112
+ const el = await singleSelectionFixture()
113
+ const chip = el.querySelector("leu-chip-selectable")
114
+ const chipButton = chip.shadowRoot.querySelector("button")
115
+
116
+ setTimeout(() => {
117
+ chipButton.click()
118
+ }, 0)
119
+
120
+ const event = await oneEvent(el, "input")
121
+
122
+ await expect(event).to.exist
123
+ })
124
+ })
@@ -0,0 +1,58 @@
1
+ import { html } from "lit"
2
+ import { fixture, expect } from "@open-wc/testing"
3
+
4
+ import "../leu-chip-link.js"
5
+
6
+ async function defaultFixture() {
7
+ return fixture(
8
+ html`
9
+ <leu-chip-link label="Daten" href="https://zh.ch/daten"></leu-chip-link>
10
+ `
11
+ )
12
+ }
13
+
14
+ describe("LeuChipLink", () => {
15
+ it("is a defined element", async () => {
16
+ const el = customElements.get("leu-chip-link")
17
+
18
+ await expect(el).not.to.be.undefined
19
+ })
20
+
21
+ it("passes the a11y audit", async () => {
22
+ const el = await defaultFixture()
23
+
24
+ await expect(el).shadowDom.to.be.accessible()
25
+ })
26
+
27
+ it("renders the label", async () => {
28
+ const el = await defaultFixture()
29
+
30
+ const link = el.shadowRoot.querySelector("a")
31
+
32
+ expect(link).to.have.trimmed.text("Daten")
33
+ })
34
+
35
+ it("renders a link element", async () => {
36
+ const el = await defaultFixture()
37
+
38
+ expect(el.shadowRoot.querySelector("a")).to.exist
39
+ })
40
+
41
+ it("passes the href attribute to the link", async () => {
42
+ const el = await defaultFixture()
43
+
44
+ expect(el.shadowRoot.querySelector("a").getAttribute("href")).to.equal(
45
+ "https://zh.ch/daten"
46
+ )
47
+ })
48
+
49
+ it("delegates the focus to the a element", async () => {
50
+ const el = await defaultFixture()
51
+
52
+ el.focus()
53
+
54
+ expect(el.shadowRoot.querySelector("a")).to.equal(
55
+ el.shadowRoot.activeElement
56
+ )
57
+ })
58
+ })