@statistikzh/leu 0.4.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 (216) hide show
  1. package/.storybook/preview.js +1 -2
  2. package/CHANGELOG.md +24 -0
  3. package/custom-elements-manifest.config.js +46 -0
  4. package/dist/Accordion.d.ts +31 -0
  5. package/dist/Accordion.d.ts.map +1 -0
  6. package/dist/Accordion.js +257 -0
  7. package/dist/Breadcrumb.d.ts +69 -0
  8. package/dist/Breadcrumb.d.ts.map +1 -0
  9. package/dist/Breadcrumb.js +392 -0
  10. package/dist/Button-da11d064.d.ts +84 -0
  11. package/dist/Button-da11d064.d.ts.map +1 -0
  12. package/dist/Button-da11d064.js +542 -0
  13. package/dist/Button.d.ts +2 -0
  14. package/dist/Button.d.ts.map +1 -0
  15. package/dist/Button.js +6 -420
  16. package/dist/ButtonGroup.d.ts +24 -0
  17. package/dist/ButtonGroup.d.ts.map +1 -0
  18. package/dist/ButtonGroup.js +70 -39
  19. package/dist/Checkbox.d.ts +13 -0
  20. package/dist/Checkbox.d.ts.map +1 -0
  21. package/dist/Checkbox.js +2 -2
  22. package/dist/CheckboxGroup.d.ts +13 -0
  23. package/dist/CheckboxGroup.d.ts.map +1 -0
  24. package/dist/CheckboxGroup.js +3 -3
  25. package/dist/Chip.d.ts +5 -0
  26. package/dist/Chip.d.ts.map +1 -0
  27. package/dist/{Chip-dac7337d.js → Chip.js} +16 -5
  28. package/dist/ChipGroup.d.ts +28 -0
  29. package/dist/ChipGroup.d.ts.map +1 -0
  30. package/dist/ChipGroup.js +62 -5
  31. package/dist/ChipLink.d.ts +15 -0
  32. package/dist/ChipLink.d.ts.map +1 -0
  33. package/dist/ChipLink.js +1 -1
  34. package/dist/ChipRemovable.d.ts +13 -0
  35. package/dist/ChipRemovable.d.ts.map +1 -0
  36. package/dist/ChipRemovable.js +2 -2
  37. package/dist/ChipSelectable.d.ts +22 -0
  38. package/dist/ChipSelectable.d.ts.map +1 -0
  39. package/dist/ChipSelectable.js +5 -5
  40. package/dist/Dropdown.d.ts +15 -0
  41. package/dist/Dropdown.d.ts.map +1 -0
  42. package/dist/Dropdown.js +25 -7
  43. package/dist/Input.d.ts +154 -0
  44. package/dist/Input.d.ts.map +1 -0
  45. package/dist/Input.js +13 -7
  46. package/dist/Menu.d.ts +8 -0
  47. package/dist/Menu.d.ts.map +1 -0
  48. package/dist/MenuItem.d.ts +21 -0
  49. package/dist/MenuItem.d.ts.map +1 -0
  50. package/dist/MenuItem.js +3 -3
  51. package/dist/Pagination.d.ts +27 -0
  52. package/dist/Pagination.d.ts.map +1 -0
  53. package/dist/Pagination.js +93 -61
  54. package/dist/Popup.d.ts +18 -0
  55. package/dist/Popup.d.ts.map +1 -0
  56. package/dist/{leu-popup-4bf6f1f4.js → Popup.js} +4 -5
  57. package/dist/Radio.d.ts +12 -0
  58. package/dist/Radio.d.ts.map +1 -0
  59. package/dist/Radio.js +2 -2
  60. package/dist/RadioGroup.d.ts +20 -0
  61. package/dist/RadioGroup.d.ts.map +1 -0
  62. package/dist/RadioGroup.js +3 -3
  63. package/dist/ScrollTop.d.ts +19 -0
  64. package/dist/ScrollTop.d.ts.map +1 -0
  65. package/dist/ScrollTop.js +122 -0
  66. package/dist/Select.d.ts +98 -0
  67. package/dist/Select.d.ts.map +1 -0
  68. package/dist/Select.js +27 -82
  69. package/dist/Table.d.ts +48 -0
  70. package/dist/Table.d.ts.map +1 -0
  71. package/dist/Table.js +7 -4
  72. package/dist/VisuallyHidden.d.ts +8 -0
  73. package/dist/VisuallyHidden.d.ts.map +1 -0
  74. package/dist/VisuallyHidden.js +28 -0
  75. package/dist/_rollupPluginBabelHelpers-20f659f4.d.ts +3 -0
  76. package/dist/_rollupPluginBabelHelpers-20f659f4.d.ts.map +1 -0
  77. package/dist/defineElement-40372b4b.d.ts +9 -0
  78. package/dist/defineElement-40372b4b.d.ts.map +1 -0
  79. package/dist/{defineElement-47d4f665.js → defineElement-40372b4b.js} +1 -1
  80. package/dist/icon-03e86700.d.ts +11 -0
  81. package/dist/icon-03e86700.d.ts.map +1 -0
  82. package/dist/index.js.d.ts +21 -0
  83. package/dist/index.js.d.ts.map +1 -0
  84. package/dist/{index.js → index.js.js} +14 -8
  85. package/dist/leu-accordion.d.ts +3 -0
  86. package/dist/leu-accordion.d.ts.map +1 -0
  87. package/dist/leu-accordion.js +9 -0
  88. package/dist/leu-breadcrumb.d.ts +3 -0
  89. package/dist/leu-breadcrumb.d.ts.map +1 -0
  90. package/dist/leu-breadcrumb.js +23 -0
  91. package/dist/leu-button-group.d.ts +3 -0
  92. package/dist/leu-button-group.d.ts.map +1 -0
  93. package/dist/leu-button-group.js +1 -5
  94. package/dist/leu-button.d.ts +3 -0
  95. package/dist/leu-button.d.ts.map +1 -0
  96. package/dist/leu-button.js +3 -2
  97. package/dist/leu-checkbox-group.d.ts +3 -0
  98. package/dist/leu-checkbox-group.d.ts.map +1 -0
  99. package/dist/leu-checkbox-group.js +1 -1
  100. package/dist/leu-checkbox.d.ts +3 -0
  101. package/dist/leu-checkbox.d.ts.map +1 -0
  102. package/dist/leu-checkbox.js +1 -1
  103. package/dist/leu-chip-group.d.ts +3 -0
  104. package/dist/leu-chip-group.d.ts.map +1 -0
  105. package/dist/leu-chip-group.js +2 -1
  106. package/dist/leu-chip-link.d.ts +3 -0
  107. package/dist/leu-chip-link.d.ts.map +1 -0
  108. package/dist/leu-chip-link.js +2 -2
  109. package/dist/leu-chip-removable.d.ts +3 -0
  110. package/dist/leu-chip-removable.d.ts.map +1 -0
  111. package/dist/leu-chip-removable.js +2 -2
  112. package/dist/leu-chip-selectable.d.ts +3 -0
  113. package/dist/leu-chip-selectable.d.ts.map +1 -0
  114. package/dist/leu-chip-selectable.js +2 -2
  115. package/dist/leu-dropdown.d.ts +3 -0
  116. package/dist/leu-dropdown.d.ts.map +1 -0
  117. package/dist/leu-dropdown.js +5 -4
  118. package/dist/leu-input.d.ts +3 -0
  119. package/dist/leu-input.d.ts.map +1 -0
  120. package/dist/leu-input.js +1 -1
  121. package/dist/leu-menu-item.d.ts +3 -0
  122. package/dist/leu-menu-item.d.ts.map +1 -0
  123. package/dist/leu-menu-item.js +1 -1
  124. package/dist/leu-menu.d.ts +3 -0
  125. package/dist/leu-menu.d.ts.map +1 -0
  126. package/dist/leu-menu.js +1 -1
  127. package/dist/leu-pagination.d.ts +3 -0
  128. package/dist/leu-pagination.d.ts.map +1 -0
  129. package/dist/leu-pagination.js +5 -2
  130. package/dist/leu-popup.d.ts +3 -0
  131. package/dist/leu-popup.d.ts.map +1 -0
  132. package/dist/leu-popup.js +9 -0
  133. package/dist/leu-radio-group.d.ts +3 -0
  134. package/dist/leu-radio-group.d.ts.map +1 -0
  135. package/dist/leu-radio-group.js +1 -1
  136. package/dist/leu-radio.d.ts +3 -0
  137. package/dist/leu-radio.d.ts.map +1 -0
  138. package/dist/leu-radio.js +1 -1
  139. package/dist/leu-scroll-top.d.ts +3 -0
  140. package/dist/leu-scroll-top.d.ts.map +1 -0
  141. package/dist/leu-scroll-top.js +14 -0
  142. package/dist/leu-select.d.ts +3 -0
  143. package/dist/leu-select.d.ts.map +1 -0
  144. package/dist/leu-select.js +4 -3
  145. package/dist/leu-table.d.ts +3 -0
  146. package/dist/leu-table.d.ts.map +1 -0
  147. package/dist/leu-table.js +5 -2
  148. package/dist/leu-visually-hidden.d.ts +3 -0
  149. package/dist/leu-visually-hidden.d.ts.map +1 -0
  150. package/dist/leu-visually-hidden.js +8 -0
  151. package/dist/theme.css +386 -2
  152. package/dist/utils-65469421.d.ts +16 -0
  153. package/dist/utils-65469421.d.ts.map +1 -0
  154. package/dist/utils-65469421.js +35 -0
  155. package/index.js +3 -0
  156. package/package.json +30 -12
  157. package/postcss.config.cjs +2 -0
  158. package/rollup.config.js +21 -40
  159. package/scripts/generate-component/templates/[name].css +2 -2
  160. package/scripts/postcss-leu-font-styles.cjs +160 -0
  161. package/src/components/accordion/accordion.css +2 -2
  162. package/src/components/accordion/stories/accordion.stories.js +2 -1
  163. package/src/components/accordion/test/accordion.test.js +4 -2
  164. package/src/components/breadcrumb/Breadcrumb.js +2 -1
  165. package/src/components/breadcrumb/breadcrumb.css +2 -13
  166. package/src/components/button/Button.js +69 -8
  167. package/src/components/button/button.css +10 -2
  168. package/src/components/button/stories/button.stories.js +43 -90
  169. package/src/components/button/test/button.test.js +90 -19
  170. package/src/components/button-group/ButtonGroup.js +76 -34
  171. package/src/components/button-group/stories/button-group.stories.js +13 -6
  172. package/src/components/button-group/test/button-group.test.js +38 -31
  173. package/src/components/checkbox/checkbox-group.css +2 -2
  174. package/src/components/checkbox/checkbox.css +1 -1
  175. package/src/components/chip/ChipGroup.js +42 -2
  176. package/src/components/chip/ChipRemovable.js +1 -1
  177. package/src/components/chip/ChipSelectable.js +4 -4
  178. package/src/components/chip/chip-group.css +12 -2
  179. package/src/components/chip/chip.css +14 -3
  180. package/src/components/chip/stories/chip-group.stories.js +100 -46
  181. package/src/components/chip/test/chip-removable.test.js +3 -3
  182. package/src/components/dropdown/Dropdown.js +23 -3
  183. package/src/components/input/Input.js +7 -4
  184. package/src/components/input/input.css +2 -2
  185. package/src/components/input/stories/input.stories.js +13 -0
  186. package/src/components/input/test/input.test.js +1 -0
  187. package/src/components/menu/menu-item.css +3 -3
  188. package/src/components/pagination/Pagination.js +91 -60
  189. package/src/components/pagination/pagination.css +6 -1
  190. package/src/components/pagination/stories/pagination.stories.js +15 -2
  191. package/src/components/pagination/test/pagination.test.js +15 -15
  192. package/src/components/popup/popup.css +2 -2
  193. package/src/components/popup/stories/popup.stories.js +1 -1
  194. package/src/components/radio/radio-group.css +2 -2
  195. package/src/components/radio/radio.css +1 -1
  196. package/src/components/scroll-top/ScrollTop.js +87 -0
  197. package/src/components/scroll-top/leu-scroll-top.js +6 -0
  198. package/src/components/scroll-top/scroll-top.css +34 -0
  199. package/src/components/scroll-top/stories/scroll-top.stories.js +217 -0
  200. package/src/components/scroll-top/test/scroll-top.test.js +22 -0
  201. package/src/components/select/Select.js +24 -6
  202. package/src/components/select/select.css +2 -2
  203. package/src/components/table/table.css +2 -2
  204. package/src/components/visually-hidden/VisuallyHidden.js +13 -0
  205. package/src/components/visually-hidden/leu-visually-hidden.js +6 -0
  206. package/src/components/visually-hidden/stories/visually-hidden.stories.js +22 -0
  207. package/src/components/visually-hidden/test/visually-hidden.test.js +36 -0
  208. package/src/components/visually-hidden/visually-hidden.css +10 -0
  209. package/src/lib/defineElement.js +1 -1
  210. package/src/lib/hasSlotController.js +5 -3
  211. package/src/lib/utils.js +21 -3
  212. package/src/styles/custom-properties.css +6 -2
  213. package/src/styles/font-definitions.json +202 -0
  214. package/stylelint.config.mjs +2 -0
  215. package/tsconfig.build.json +21 -0
  216. package/tsconfig.json +16 -0
@@ -1,8 +1,11 @@
1
1
  import { html } from "lit"
2
+ import { action } from "@storybook/addon-actions"
3
+
2
4
  import "../leu-pagination.js"
3
5
 
4
6
  // https://stackoverflow.com/questions/72566428/storybook-angular-how-to-dynamically-update-args-from-the-template
5
7
  import { UPDATE_STORY_ARGS } from "@storybook/core-events" // eslint-disable-line
8
+ import { ifDefined } from "lit/directives/if-defined.js"
6
9
  function updateStorybookArgss(id, args) {
7
10
  const channel = window.__STORYBOOK_ADDONS_CHANNEL__
8
11
  channel.emit(UPDATE_STORY_ARGS, {
@@ -56,6 +59,9 @@ const items = [
56
59
  export default {
57
60
  title: "Pagination",
58
61
  component: "leu-pagination",
62
+ args: {
63
+ onPageChange: action("leu:pagechange"),
64
+ },
59
65
  parameters: {
60
66
  design: {
61
67
  type: "figma",
@@ -64,15 +70,20 @@ export default {
64
70
  },
65
71
  }
66
72
 
67
- function Template({ startIndex, endIndex }, { id }) {
73
+ function Template(
74
+ { startIndex, endIndex, onPageChange, itemsPerPage, defaultPage },
75
+ { id }
76
+ ) {
68
77
  return html`
69
78
  ${items
70
79
  .slice(startIndex, endIndex)
71
80
  .map((item) => html`<div>${item.label}</div>`)}
72
81
  <leu-pagination
73
82
  numOfItems=${items.length}
74
- itemsPerPage="5"
83
+ itemsPerPage=${ifDefined(itemsPerPage)}
84
+ defaultPage=${ifDefined(defaultPage)}
75
85
  @leu:pagechange=${(e) => {
86
+ onPageChange(e)
76
87
  updateStorybookArgss(id, {
77
88
  startIndex: e.detail.startIndex,
78
89
  endIndex: e.detail.endIndex,
@@ -87,4 +98,6 @@ export const Regular = Template.bind({})
87
98
  Regular.args = {
88
99
  startIndex: 0,
89
100
  endIndex: 5,
101
+ itemsPerPage: 5,
102
+ // defaultPage: 2,
90
103
  }
@@ -10,7 +10,7 @@ async function defaultFixture(args = {}) {
10
10
  return fixture(html`<leu-pagination
11
11
  numOfItems=${ifDefined(args.numOfItems)}
12
12
  itemsPerPage=${ifDefined(args.itemsPerPage)}
13
- page=${ifDefined(args.page)}
13
+ defaultPage=${ifDefined(args.defaultPage)}
14
14
  >
15
15
  </leu-pagination>`)
16
16
  }
@@ -26,7 +26,7 @@ describe("LeuPagination", () => {
26
26
  const el = await defaultFixture({
27
27
  numOfItems: 98,
28
28
  itemsPerPage: 7,
29
- page: 1,
29
+ defaultPage: 1,
30
30
  })
31
31
 
32
32
  await expect(el).shadowDom.to.be.accessible()
@@ -36,7 +36,7 @@ describe("LeuPagination", () => {
36
36
  const el = await defaultFixture({
37
37
  numOfItems: 98,
38
38
  itemsPerPage: 7,
39
- page: 1,
39
+ defaultPage: 1,
40
40
  })
41
41
 
42
42
  const previous = el.shadowRoot.querySelectorAll("leu-button")[0]
@@ -48,7 +48,7 @@ describe("LeuPagination", () => {
48
48
  const el = await defaultFixture({
49
49
  numOfItems: 98,
50
50
  itemsPerPage: 7,
51
- page: 14,
51
+ defaultPage: 14,
52
52
  })
53
53
 
54
54
  const next = el.shadowRoot.querySelectorAll("leu-button")[1]
@@ -60,7 +60,7 @@ describe("LeuPagination", () => {
60
60
  const el = await defaultFixture({
61
61
  numOfItems: 98,
62
62
  itemsPerPage: 7,
63
- page: 1,
63
+ defaultPage: 1,
64
64
  })
65
65
 
66
66
  const label = el.shadowRoot.querySelectorAll(".label")
@@ -72,7 +72,7 @@ describe("LeuPagination", () => {
72
72
  const el = await defaultFixture({
73
73
  numOfItems: 98,
74
74
  itemsPerPage: 7,
75
- page: 2,
75
+ defaultPage: 2,
76
76
  })
77
77
 
78
78
  const input = el.shadowRoot.querySelector("input")
@@ -84,7 +84,7 @@ describe("LeuPagination", () => {
84
84
  const el = await defaultFixture({
85
85
  numOfItems: 98,
86
86
  itemsPerPage: 7,
87
- page: 1,
87
+ defaultPage: 1,
88
88
  })
89
89
 
90
90
  const next = el.shadowRoot.querySelectorAll("leu-button")[1]
@@ -99,7 +99,7 @@ describe("LeuPagination", () => {
99
99
  const el = await defaultFixture({
100
100
  numOfItems: 98,
101
101
  itemsPerPage: 7,
102
- page: 10,
102
+ defaultPage: 10,
103
103
  })
104
104
 
105
105
  const next = el.shadowRoot.querySelectorAll("leu-button")[0]
@@ -114,7 +114,7 @@ describe("LeuPagination", () => {
114
114
  const el = await defaultFixture({
115
115
  numOfItems: 98,
116
116
  itemsPerPage: 7,
117
- page: 1,
117
+ defaultPage: 1,
118
118
  })
119
119
 
120
120
  el.focus()
@@ -131,7 +131,7 @@ describe("LeuPagination", () => {
131
131
  const el = await defaultFixture({
132
132
  numOfItems: 98,
133
133
  itemsPerPage: 7,
134
- page: 13,
134
+ defaultPage: 13,
135
135
  })
136
136
 
137
137
  el.focus()
@@ -148,18 +148,18 @@ describe("LeuPagination", () => {
148
148
  const el = await defaultFixture({
149
149
  numOfItems: 50,
150
150
  itemsPerPage: 10,
151
- page: 6,
151
+ defaultPage: 6,
152
152
  })
153
153
 
154
154
  const input = el.shadowRoot.querySelector("input")
155
155
 
156
- expect(el.boundPage).to.equal(5)
156
+ expect(el.page).to.equal(5)
157
157
  expect(input.value).to.equal("5")
158
158
 
159
159
  el.page = 0
160
160
  await elementUpdated(el)
161
161
 
162
- expect(el.boundPage).to.equal(1)
162
+ expect(el.page).to.equal(1)
163
163
  expect(input.value).to.equal("1")
164
164
 
165
165
  el.focus()
@@ -169,7 +169,7 @@ describe("LeuPagination", () => {
169
169
  })
170
170
  await elementUpdated(el)
171
171
 
172
- expect(el.boundPage).to.equal(1)
172
+ expect(el.page).to.equal(1)
173
173
  expect(input.value).to.equal("1")
174
174
 
175
175
  await sendKeys({ press: "ArrowUp" })
@@ -178,7 +178,7 @@ describe("LeuPagination", () => {
178
178
  await sendKeys({ press: "ArrowUp" })
179
179
  await sendKeys({ press: "ArrowUp" })
180
180
 
181
- expect(el.boundPage).to.equal(5)
181
+ expect(el.page).to.equal(5)
182
182
  expect(input.value).to.equal("5")
183
183
  })
184
184
 
@@ -4,8 +4,8 @@
4
4
  }
5
5
 
6
6
  :host {
7
- --popup-font-regular: var(--leu-font-regular);
8
- --popup-font-black: var(--leu-font-black);
7
+ --popup-font-regular: var(--leu-font-family-regular);
8
+ --popup-font-black: var(--leu-font-family-black);
9
9
 
10
10
  font-family: var(--popup-font-regular);
11
11
  }
@@ -44,7 +44,7 @@ function Template(args = {}) {
44
44
  ?shift=${args.shift}
45
45
  placement=${ifDefined(args.placement)}
46
46
  >
47
- <leu-button slot="anchor" label="Open popup"></leu-button>
47
+ <leu-button slot="anchor">Open popup</leu-button>
48
48
  <div style=${styleMap(popupStyles)}>Popup content</div>
49
49
  </leu-popup>`
50
50
  }
@@ -1,6 +1,6 @@
1
1
  :host {
2
- --group-font-regular: var(--leu-font-regular);
3
- --group-font-black: var(--leu-font-black);
2
+ --group-font-regular: var(--leu-font-family-regular);
3
+ --group-font-black: var(--leu-font-family-black);
4
4
 
5
5
  font-family: var(--group-font-regular);
6
6
  }
@@ -6,7 +6,7 @@
6
6
  --radio-label-color: var(--leu-color-black-100);
7
7
  --radio-label-color-disabled: var(--radio-color-disabled);
8
8
 
9
- --radio-font-regular: var(--leu-font-regular);
9
+ --radio-font-regular: var(--leu-font-family-regular);
10
10
 
11
11
  display: inline-flex;
12
12
  align-items: flex-start;
@@ -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({})
@@ -0,0 +1,22 @@
1
+ import { html } from "lit"
2
+ import { fixture, expect } from "@open-wc/testing"
3
+
4
+ import "../leu-scroll-top.js"
5
+
6
+ async function defaultFixture() {
7
+ return fixture(html` <leu-scroll-top /> `)
8
+ }
9
+
10
+ describe("LeuScrollTop", () => {
11
+ it("is a defined element", async () => {
12
+ const el = await customElements.get("leu-scroll-top")
13
+
14
+ await expect(el).not.to.be.undefined
15
+ })
16
+
17
+ it("passes the a11y audit", async () => {
18
+ const el = await defaultFixture()
19
+
20
+ await expect(el).shadowDom.to.be.accessible()
21
+ })
22
+ })
@@ -13,6 +13,7 @@ import "../menu/leu-menu-item.js"
13
13
  import "../input/leu-input.js"
14
14
  import "../popup/leu-popup.js"
15
15
 
16
+ // @ts-ignore
16
17
  import styles from "./select.css"
17
18
 
18
19
  /**
@@ -25,8 +26,7 @@ export class LeuSelect extends LitElement {
25
26
 
26
27
  static get properties() {
27
28
  return {
28
- open: { type: Boolean, attribute: "open" },
29
-
29
+ open: { type: Boolean, reflect: true },
30
30
  label: { type: String, reflect: true },
31
31
  options: { type: Array },
32
32
  value: { type: Array },
@@ -53,9 +53,14 @@ export class LeuSelect extends LitElement {
53
53
  constructor() {
54
54
  super()
55
55
  this.open = false
56
+ this.disabled = false
57
+ this.open = false
58
+ this.multiple = false
56
59
  this.clearable = false
60
+ this.filterable = false
57
61
  this.value = []
58
62
  this.options = []
63
+ this.label = ""
59
64
 
60
65
  /** @internal */
61
66
  this._arrowIcon = Icon("angleDropDown")
@@ -69,8 +74,17 @@ export class LeuSelect extends LitElement {
69
74
  /** @internal */
70
75
  this.deferedChangeEvent = false
71
76
 
77
+ /**
78
+ * @type {import("lit/directives/ref").Ref<import("../menu/Menu").LeuMenu>}
79
+ */
72
80
  this.menuRef = createRef()
81
+ /**
82
+ * @type {import("lit/directives/ref").Ref<import("../input/Input").LeuInput>}
83
+ */
73
84
  this.optionFilterRef = createRef()
85
+ /**
86
+ * @type {import("lit/directives/ref").Ref<HTMLButtonElement>}
87
+ */
74
88
  this.toggleButtonRef = createRef()
75
89
  }
76
90
 
@@ -102,7 +116,11 @@ export class LeuSelect extends LitElement {
102
116
  * @param {MouseEvent} event
103
117
  */
104
118
  handleDocumentClick = (event) => {
105
- if (!this.contains(event.target) && this.open) {
119
+ if (
120
+ event.target instanceof Node &&
121
+ !this.contains(event.target) &&
122
+ this.open
123
+ ) {
106
124
  this.closeDropdown()
107
125
  }
108
126
  }
@@ -289,9 +307,9 @@ export class LeuSelect extends LitElement {
289
307
  type="button"
290
308
  class="apply-button"
291
309
  @click=${this.handleApplyClick}
292
- label="Anwenden"
293
310
  fluid
294
- ></leu-button>
311
+ >Anwenden</leu-button
312
+ >
295
313
  `
296
314
  }
297
315
 
@@ -320,7 +338,7 @@ export class LeuSelect extends LitElement {
320
338
  <span class="label" id="select-label">${this.label}</span>
321
339
  <span class="value"> ${this.getDisplayValue(this.value)} </span>
322
340
  <span class="arrow-icon"> ${this._arrowIcon} </span>
323
- ${this.clearable && this.value !== "" && this.value.length !== 0
341
+ ${this.clearable && this.value.length !== 0
324
342
  ? html`<button
325
343
  type="button"
326
344
  class="clear-button"
@@ -26,8 +26,8 @@
26
26
 
27
27
  --select-clear-color: var(--leu-color-black-60);
28
28
 
29
- --select-font-regular: var(--leu-font-regular);
30
- --select-font-black: var(--leu-font-black);
29
+ --select-font-regular: var(--leu-font-family-regular);
30
+ --select-font-black: var(--leu-font-family-black);
31
31
 
32
32
  --select-apply-button-color: var(--leu-color-black-100);
33
33
  --select-apply-button-color-focus: var(--leu-color-black-80);