@statistikzh/leu 0.4.0 → 0.5.1

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 (220) hide show
  1. package/.storybook/preview.js +1 -2
  2. package/CHANGELOG.md +32 -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-5326c982.d.ts +84 -0
  11. package/dist/Button-5326c982.d.ts.map +1 -0
  12. package/dist/Button-5326c982.js +555 -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 +30 -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.d.ts +21 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.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/dist/vscode.html-custom-data.json +579 -0
  156. package/dist/vue/index.d.ts +678 -0
  157. package/dist/web-types.json +1076 -0
  158. package/index.js +3 -0
  159. package/package.json +30 -12
  160. package/postcss.config.cjs +2 -0
  161. package/rollup.config.js +21 -40
  162. package/scripts/generate-component/templates/[name].css +2 -2
  163. package/scripts/postcss-leu-font-styles.cjs +160 -0
  164. package/src/components/accordion/accordion.css +2 -2
  165. package/src/components/accordion/stories/accordion.stories.js +2 -1
  166. package/src/components/accordion/test/accordion.test.js +4 -2
  167. package/src/components/breadcrumb/Breadcrumb.js +2 -1
  168. package/src/components/breadcrumb/breadcrumb.css +2 -13
  169. package/src/components/button/Button.js +69 -8
  170. package/src/components/button/button.css +23 -2
  171. package/src/components/button/stories/button.stories.js +43 -90
  172. package/src/components/button/test/button.test.js +90 -19
  173. package/src/components/button-group/ButtonGroup.js +76 -34
  174. package/src/components/button-group/stories/button-group.stories.js +13 -6
  175. package/src/components/button-group/test/button-group.test.js +38 -31
  176. package/src/components/checkbox/checkbox-group.css +2 -2
  177. package/src/components/checkbox/checkbox.css +1 -1
  178. package/src/components/chip/ChipGroup.js +42 -2
  179. package/src/components/chip/ChipRemovable.js +1 -1
  180. package/src/components/chip/ChipSelectable.js +4 -4
  181. package/src/components/chip/chip-group.css +12 -2
  182. package/src/components/chip/chip.css +14 -3
  183. package/src/components/chip/stories/chip-group.stories.js +100 -46
  184. package/src/components/chip/test/chip-removable.test.js +3 -3
  185. package/src/components/dropdown/Dropdown.js +24 -3
  186. package/src/components/dropdown/dropdown.css +4 -0
  187. package/src/components/input/Input.js +7 -4
  188. package/src/components/input/input.css +2 -2
  189. package/src/components/input/stories/input.stories.js +13 -0
  190. package/src/components/input/test/input.test.js +1 -0
  191. package/src/components/menu/menu-item.css +3 -3
  192. package/src/components/pagination/Pagination.js +91 -60
  193. package/src/components/pagination/pagination.css +6 -1
  194. package/src/components/pagination/stories/pagination.stories.js +15 -2
  195. package/src/components/pagination/test/pagination.test.js +15 -15
  196. package/src/components/popup/popup.css +2 -2
  197. package/src/components/popup/stories/popup.stories.js +1 -1
  198. package/src/components/radio/radio-group.css +2 -2
  199. package/src/components/radio/radio.css +1 -1
  200. package/src/components/scroll-top/ScrollTop.js +87 -0
  201. package/src/components/scroll-top/leu-scroll-top.js +6 -0
  202. package/src/components/scroll-top/scroll-top.css +34 -0
  203. package/src/components/scroll-top/stories/scroll-top.stories.js +217 -0
  204. package/src/components/scroll-top/test/scroll-top.test.js +22 -0
  205. package/src/components/select/Select.js +24 -6
  206. package/src/components/select/select.css +2 -2
  207. package/src/components/table/table.css +2 -2
  208. package/src/components/visually-hidden/VisuallyHidden.js +13 -0
  209. package/src/components/visually-hidden/leu-visually-hidden.js +6 -0
  210. package/src/components/visually-hidden/stories/visually-hidden.stories.js +22 -0
  211. package/src/components/visually-hidden/test/visually-hidden.test.js +36 -0
  212. package/src/components/visually-hidden/visually-hidden.css +10 -0
  213. package/src/lib/defineElement.js +1 -1
  214. package/src/lib/hasSlotController.js +5 -3
  215. package/src/lib/utils.js +21 -3
  216. package/src/styles/custom-properties.css +6 -2
  217. package/src/styles/font-definitions.json +202 -0
  218. package/stylelint.config.mjs +2 -0
  219. package/tsconfig.build.json +21 -0
  220. package/tsconfig.json +16 -0
@@ -42,12 +42,15 @@ function Template(args) {
42
42
  max,
43
43
  minlength,
44
44
  maxlength,
45
+ step,
45
46
  disabled = false,
46
47
  required = false,
47
48
  clearable = false,
48
49
  novalidate = false,
49
50
  } = args
50
51
 
52
+ console.log(min, max)
53
+
51
54
  return html`
52
55
  <leu-input
53
56
  value=${ifDefined(value)}
@@ -62,6 +65,7 @@ function Template(args) {
62
65
  max=${ifDefined(max)}
63
66
  minlength=${ifDefined(minlength)}
64
67
  maxlength=${ifDefined(maxlength)}
68
+ step=${ifDefined(step)}
65
69
  label=${label}
66
70
  ?disabled=${disabled}
67
71
  ?required=${required}
@@ -189,3 +193,12 @@ Search.parameters = {
189
193
  },
190
194
  },
191
195
  }
196
+
197
+ export const Step = Template.bind({})
198
+ Step.args = {
199
+ label: "Tage",
200
+ type: "number",
201
+ min: "1",
202
+ max: "7",
203
+ step: "1",
204
+ }
@@ -21,6 +21,7 @@ async function defaultFixture(args = {}) {
21
21
  max=${ifDefined(args.max)}
22
22
  minlength=${ifDefined(args.minlength)}
23
23
  maxlength=${ifDefined(args.maxlength)}
24
+ step=${ifDefined(args.step)}
24
25
  label=${args.label || "Label"}
25
26
  ?disabled=${args.disabled}
26
27
  ?required=${args.required}
@@ -10,10 +10,10 @@
10
10
  --background-disabled: var(--leu-color-black-black-0);
11
11
  --color: var(--leu-color-black-transp-60);
12
12
  --color-disabled: var(--leu-color-black-transp-20);
13
- --font-regular: var(--leu-font-regular);
14
- --font-black: var(--leu-font-black);
13
+ --font-regular: var(--leu-font-family-regular);
14
+ --font-black: var(--leu-font-family-black);
15
15
 
16
- font-family: var(--leu-font-regular);
16
+ font-family: var(--leu-font-family-regular);
17
17
  }
18
18
 
19
19
  .button {
@@ -4,6 +4,8 @@ import { live } from "lit/directives/live.js"
4
4
  import "../button/leu-button.js"
5
5
  import styles from "./pagination.css"
6
6
 
7
+ import "../visually-hidden/leu-visually-hidden.js"
8
+
7
9
  const MIN_PAGE = 1
8
10
 
9
11
  /**
@@ -20,62 +22,84 @@ export class LeuPagination extends LitElement {
20
22
  delegatesFocus: true,
21
23
  }
22
24
 
23
- static events = {
24
- range: {},
25
- }
26
-
27
25
  static properties = {
28
- page: { type: Number, reflect: true },
26
+ defaultPage: { type: Number, reflect: true },
29
27
  itemsPerPage: { type: Number, reflect: true },
30
28
  numOfItems: { type: Number, reflect: true },
29
+
30
+ /**
31
+ * Internal page state that contains an
32
+ * already clamped page number. Should only
33
+ * be accessed through the `page` getter and
34
+ * setter.
35
+ * @type {Number}
36
+ * @internal
37
+ */
38
+ _page: { state: true },
31
39
  }
32
40
 
33
41
  constructor() {
34
42
  super()
35
- /** @type {number} */
36
- this.page = 1
37
- /** @type {number} */
43
+
44
+ /** @type {Number} */
38
45
  this.numOfItems = 1
39
- /** @type {number} */
46
+ /** @type {Number} */
40
47
  this.itemsPerPage = 1
48
+ /** @type {Number} */
49
+ this._page = 1
41
50
  }
42
51
 
43
- get maxPage() {
52
+ attributeChangedCallback(name, oldVal, newVal) {
53
+ super.attributeChangedCallback(name, oldVal, newVal)
54
+
55
+ if (name === "defaultpage" && newVal !== oldVal) {
56
+ this.page = parseInt(newVal, 10)
57
+ }
58
+ }
59
+
60
+ get page() {
61
+ return this._page
62
+ }
63
+
64
+ set page(page) {
65
+ this._page = this._clampPage(page)
66
+ }
67
+
68
+ get startIndex() {
69
+ return (this.page - 1) * this.itemsPerPage
70
+ }
71
+
72
+ get endIndex() {
73
+ return Math.min(this.startIndex + this.itemsPerPage, this.numOfItems)
74
+ }
75
+
76
+ get _maxPage() {
44
77
  return Math.ceil(this.numOfItems / this.itemsPerPage)
45
78
  }
46
79
 
47
- get firstPage() {
48
- return this.boundPage === MIN_PAGE
80
+ _isFirstPage() {
81
+ return this.page === MIN_PAGE
49
82
  }
50
83
 
51
- get lastPage() {
52
- return this.boundPage === this.maxPage
84
+ _isLastPage() {
85
+ return this.page === this._maxPage
53
86
  }
54
87
 
55
- /**
56
- * The boundPage getter is necessary to ensure that the current page (this.page) is always within the valid range of pages.
57
- * It prevents the page number from going below the minimum page limit (MIN_PAGE) or above the maximum page limit (this.maxPage).
58
- * This is important for the correct functioning of the pagination system, as it prevents users from navigating to non-existent pages.
59
- *
60
- * @returns {number}
61
- */
62
- get boundPage() {
63
- return Math.min(Math.max(this.page, MIN_PAGE), this.maxPage)
88
+ _clampPage(page) {
89
+ return Math.min(Math.max(page, MIN_PAGE), this._maxPage)
64
90
  }
65
91
 
66
- numberUpdate(number) {
92
+ _updatePage(page) {
67
93
  const prevPage = this.page
68
- this.page = number
94
+ this.page = this._clampPage(page)
69
95
 
70
96
  if (this.page !== prevPage) {
71
- const startIndex = (this.boundPage - 1) * this.itemsPerPage
72
- const endIndex = Math.min(startIndex + this.itemsPerPage, this.numOfItems)
73
97
  this.dispatchEvent(
74
98
  new CustomEvent("leu:pagechange", {
75
99
  detail: {
76
- startIndex,
77
- endIndex,
78
- page: this.boundPage,
100
+ startIndex: this.startIndex,
101
+ endIndex: this.endIndex,
102
+ page: this.page,
79
103
  },
80
104
  bubbles: false,
81
105
  })
@@ -83,58 +107,65 @@ export class LeuPagination extends LitElement {
83
107
  }
84
108
  }
85
109
 
86
- change(event) {
87
- this.numberUpdate(parseInt(event.target.value, 10) || 0)
110
+ _handleChange(event) {
111
+ this._updatePage(parseInt(event.target.value, 10) || 0)
88
112
  }
89
113
 
90
- input(event) {
114
+ _handleInput(event) {
91
115
  if (event.target.value !== "") {
92
116
  event.preventDefault()
93
- this.change(event)
117
+ this._handleChange(event)
94
118
  }
95
119
  }
96
120
 
97
- keydown(event) {
121
+ _handleKeyDown(event) {
98
122
  if (event.key === "ArrowUp") {
99
123
  event.preventDefault()
100
- this.numberUpdate(this.boundPage + 1)
124
+ this._updatePage(this.page + 1)
101
125
  }
102
126
  if (event.key === "ArrowDown") {
103
127
  event.preventDefault()
104
- this.numberUpdate(this.boundPage - 1)
128
+ this._updatePage(this.page - 1)
105
129
  }
106
130
  }
107
131
 
108
132
  render() {
109
133
  return html`
134
+ <leu-visually-hidden>
135
+ <label for="page-input">Aktuelle Seite</label>
136
+ </leu-visually-hidden>
110
137
  <input
138
+ id="page-input"
111
139
  class="input"
112
140
  min=${MIN_PAGE}
113
- max=${this.maxPage}
114
- .value=${live(this.boundPage.toString())}
115
- @input=${this.input}
116
- @change=${this.change}
117
- @keydown=${this.keydown}
141
+ max=${this._maxPage}
142
+ .value=${live(this.page.toString())}
143
+ @input=${this._handleInput}
144
+ @change=${this._handleChange}
145
+ @keydown=${this._handleKeyDown}
118
146
  type="number"
119
147
  />
120
- <div class="label">von ${this.maxPage}</div>
121
- <leu-button
122
- icon="angleLeft"
123
- variant="secondary"
124
- @click=${(_) => {
125
- this.numberUpdate(this.boundPage - 1)
126
- }}
127
- ?disabled=${this.firstPage}
128
- ></leu-button>
129
- <leu-button
130
- icon="angleRight"
131
- variant="secondary"
132
- @click=${(_) => {
133
- this.numberUpdate(this.boundPage + 1)
134
- }}
135
- ?disabled=${this.lastPage}
136
- style="margin-left:4px;"
137
- ></leu-button>
148
+ <div class="label">von ${this._maxPage}</div>
149
+ <div class="button-group">
150
+ <leu-button
151
+ icon="angleLeft"
152
+ variant="secondary"
153
+ label="Vorherige Seite"
154
+ @click=${(_) => {
155
+ this._updatePage(this.page - 1)
156
+ }}
157
+ ?disabled=${this._isFirstPage()}
158
+ ></leu-button>
159
+ <leu-button
160
+ icon="angleRight"
161
+ variant="secondary"
162
+ label="Nächste Seite"
163
+ @click=${(_) => {
164
+ this._updatePage(this.page + 1)
165
+ }}
166
+ ?disabled=${this._isLastPage()}
167
+ ></leu-button>
168
+ </div>
138
169
  `
139
170
  }
140
171
  }
@@ -2,7 +2,7 @@
2
2
  margin-top: 16px;
3
3
  display: flex;
4
4
  justify-content: end;
5
- font-family: var(--leu-font-regular);
5
+ font-family: var(--leu-font-family-regular);
6
6
  }
7
7
 
8
8
  .input {
@@ -47,3 +47,8 @@
47
47
  color: var(--leu-color-black-transp-60);
48
48
  white-space: nowrap;
49
49
  }
50
+
51
+ .button-group {
52
+ display: flex;
53
+ gap: 0.25rem;
54
+ }
@@ -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
+ }