@statistikzh/leu 0.18.0 → 0.19.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.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +15 -0
- package/dist/Accordion.js +1 -1
- package/dist/Button.js +1 -1
- package/dist/ButtonGroup.js +1 -1
- package/dist/ChartWrapper.js +1 -1
- package/dist/Checkbox.js +1 -1
- package/dist/CheckboxGroup.js +1 -1
- package/dist/Chip.js +1 -1
- package/dist/ChipGroup.js +1 -1
- package/dist/ChipLink.js +1 -1
- package/dist/ChipRemovable.js +1 -1
- package/dist/ChipSelectable.js +1 -1
- package/dist/Dialog.js +1 -1
- package/dist/Dropdown.js +1 -1
- package/dist/FileInput.d.ts +59 -0
- package/dist/FileInput.js +383 -0
- package/dist/Icon.js +1 -1
- package/dist/Input.d.ts +0 -9
- package/dist/Input.js +4 -25
- package/dist/{LeuElement-DlQXnrk8.js → LeuElement-CKq5epyY.js} +1 -1
- package/dist/Menu.js +1 -1
- package/dist/MenuItem.js +1 -1
- package/dist/Message.js +1 -1
- package/dist/Pagination.js +1 -1
- package/dist/Placeholder.js +1 -1
- package/dist/Popup.js +1 -1
- package/dist/ProgressBar.d.ts +29 -0
- package/dist/ProgressBar.js +166 -0
- package/dist/Radio.js +1 -1
- package/dist/RadioGroup.js +1 -1
- package/dist/Range.js +1 -1
- package/dist/ScrollTop.js +1 -1
- package/dist/Select.js +1 -1
- package/dist/Spinner.js +1 -1
- package/dist/Table.js +1 -1
- package/dist/Tag.js +1 -1
- package/dist/VisuallyHidden.js +1 -1
- package/dist/components/file-input/FileInput.d.ts +54 -0
- package/dist/components/file-input/FileInput.d.ts.map +1 -0
- package/dist/components/file-input/leu-file-input.d.ts +3 -0
- package/dist/components/file-input/leu-file-input.d.ts.map +1 -0
- package/dist/components/file-input/stories/file-input.stories.d.ts +30 -0
- package/dist/components/file-input/stories/file-input.stories.d.ts.map +1 -0
- package/dist/components/file-input/test/file-input.test.d.ts +2 -0
- package/dist/components/file-input/test/file-input.test.d.ts.map +1 -0
- package/dist/components/input/Input.d.ts +0 -9
- package/dist/components/input/Input.d.ts.map +1 -1
- package/dist/components/progress-bar/ProgressBar.d.ts +25 -0
- package/dist/components/progress-bar/ProgressBar.d.ts.map +1 -0
- package/dist/components/progress-bar/leu-progress-bar.d.ts +3 -0
- package/dist/components/progress-bar/leu-progress-bar.d.ts.map +1 -0
- package/dist/components/progress-bar/stories/progress-bar.stories.d.ts +48 -0
- package/dist/components/progress-bar/stories/progress-bar.stories.d.ts.map +1 -0
- package/dist/components/progress-bar/test/progress-bar.test.d.ts +2 -0
- package/dist/components/progress-bar/test/progress-bar.test.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/leu-accordion.js +1 -1
- package/dist/leu-button-group.js +1 -1
- package/dist/leu-button.js +1 -1
- package/dist/leu-chart-wrapper.js +1 -1
- package/dist/leu-checkbox-group.js +1 -1
- package/dist/leu-checkbox.js +1 -1
- package/dist/leu-chip-group.js +1 -1
- package/dist/leu-chip-link.js +1 -1
- package/dist/leu-chip-removable.js +1 -1
- package/dist/leu-chip-selectable.js +1 -1
- package/dist/leu-dialog.js +1 -1
- package/dist/leu-dropdown.js +1 -1
- package/dist/leu-file-input.d.ts +8 -0
- package/dist/leu-file-input.js +42 -0
- package/dist/leu-icon.js +1 -1
- package/dist/leu-input.js +1 -1
- package/dist/leu-menu-item.js +1 -1
- package/dist/leu-menu.js +1 -1
- package/dist/leu-message.js +1 -1
- package/dist/leu-pagination.js +1 -1
- package/dist/leu-placeholder.js +1 -1
- package/dist/leu-popup.js +1 -1
- package/dist/leu-progress-bar.d.ts +4 -0
- package/dist/leu-progress-bar.js +10 -0
- package/dist/leu-radio-group.js +1 -1
- package/dist/leu-radio.js +1 -1
- package/dist/leu-range.js +1 -1
- package/dist/leu-scroll-top.js +1 -1
- package/dist/leu-select.js +1 -1
- package/dist/leu-spinner.js +1 -1
- package/dist/leu-table.js +1 -1
- package/dist/leu-tag.js +1 -1
- package/dist/leu-visually-hidden.js +1 -1
- package/dist/vscode.html-custom-data.json +65 -0
- package/dist/vue/index.d.ts +48 -0
- package/dist/web-types.json +119 -1
- package/package.json +1 -1
- package/scripts/generate-component/templates/test/[name].test.ts +4 -3
- package/src/components/file-input/FileInput.ts +266 -0
- package/src/components/file-input/file-input.css +118 -0
- package/src/components/file-input/leu-file-input.ts +5 -0
- package/src/components/file-input/stories/file-input.stories.ts +38 -0
- package/src/components/file-input/test/file-input.test.ts +25 -0
- package/src/components/input/Input.ts +3 -29
- package/src/components/progress-bar/ProgressBar.ts +52 -0
- package/src/components/progress-bar/leu-progress-bar.ts +5 -0
- package/src/components/progress-bar/progress-bar.css +97 -0
- package/src/components/progress-bar/stories/progress-bar.stories.ts +39 -0
- package/src/components/progress-bar/test/progress-bar.test.ts +61 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { html, nothing } from "lit"
|
|
2
|
+
import { ifDefined } from "lit/directives/if-defined.js"
|
|
3
|
+
import { property } from "lit/decorators.js"
|
|
4
|
+
|
|
5
|
+
import { LeuElement } from "../../lib/LeuElement.js"
|
|
6
|
+
|
|
7
|
+
import styles from "./progress-bar.css"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* An indicator showing the completion progress of a task
|
|
11
|
+
*
|
|
12
|
+
* @tagname leu-progress-bar
|
|
13
|
+
*/
|
|
14
|
+
export class LeuProgressBar extends LeuElement {
|
|
15
|
+
static styles = [LeuElement.styles, styles]
|
|
16
|
+
|
|
17
|
+
static shadowRootOptions = {
|
|
18
|
+
...LeuElement.shadowRootOptions,
|
|
19
|
+
delegatesFocus: true,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Progress as a percentage from 0 to 100 */
|
|
23
|
+
@property({ type: Number, reflect: true })
|
|
24
|
+
value: number = 0
|
|
25
|
+
|
|
26
|
+
/** Label that is displayed below the progress bar */
|
|
27
|
+
@property({ type: String, reflect: true })
|
|
28
|
+
label: string = ""
|
|
29
|
+
|
|
30
|
+
/** Whether the progress bar is in indeterminate state. */
|
|
31
|
+
@property({ type: Boolean, reflect: true })
|
|
32
|
+
indeterminate: boolean = false
|
|
33
|
+
|
|
34
|
+
render() {
|
|
35
|
+
return html`
|
|
36
|
+
<progress
|
|
37
|
+
class="progress"
|
|
38
|
+
max=${ifDefined(!this.indeterminate ? 100 : undefined)}
|
|
39
|
+
value=${ifDefined(!this.indeterminate ? this.value : undefined)}
|
|
40
|
+
id="progress"
|
|
41
|
+
></progress>
|
|
42
|
+
<div class="info">
|
|
43
|
+
${this.label
|
|
44
|
+
? html`<label class="label" for="progress">${this.label}</label>`
|
|
45
|
+
: html`<div class="label label--placeholder"></div>`}
|
|
46
|
+
${this.indeterminate
|
|
47
|
+
? nothing
|
|
48
|
+
: html`<span class="value">${Math.round(this.value)} %</span>`}
|
|
49
|
+
</div>
|
|
50
|
+
`
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* :host {
|
|
2
|
+
--progress-bar-font-regular: var(--leu-font-family-regular);
|
|
3
|
+
--progress-bar-font-black: var(--leu-font-family-black);
|
|
4
|
+
|
|
5
|
+
font-family: var(--progress-bar-font-regular);
|
|
6
|
+
} */
|
|
7
|
+
|
|
8
|
+
.progress {
|
|
9
|
+
--_height: 0.5rem;
|
|
10
|
+
--_border-radius: 0.25rem;
|
|
11
|
+
--_progress-color: var(--leu-color-func-cyan);
|
|
12
|
+
--_indeterminate-animation: indeterminate 2s ease infinite;
|
|
13
|
+
--_indeterminate-width: 25%;
|
|
14
|
+
|
|
15
|
+
appearance: none;
|
|
16
|
+
display: block;
|
|
17
|
+
width: 100%;
|
|
18
|
+
height: var(--_height);
|
|
19
|
+
|
|
20
|
+
background-color: var(--leu-color-black-transp-10);
|
|
21
|
+
border: none;
|
|
22
|
+
border-radius: var(--_border-radius);
|
|
23
|
+
margin-bottom: 0.5rem;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.progress::-webkit-progress-bar {
|
|
27
|
+
background: transparent;
|
|
28
|
+
border-radius: var(--_border-radius);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Progress bar */
|
|
32
|
+
.progress::-moz-progress-bar {
|
|
33
|
+
background-color: var(--_progress-color);
|
|
34
|
+
border-radius: var(--_border-radius);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.progress::-webkit-progress-value {
|
|
38
|
+
background-color: var(--_progress-color);
|
|
39
|
+
border-radius: var(--_border-radius);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Indeterminate state */
|
|
43
|
+
.progress:indeterminate::-moz-progress-bar {
|
|
44
|
+
width: var(--_indeterminate-width);
|
|
45
|
+
animation: var(--_indeterminate-animation);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Safari */
|
|
49
|
+
.progress:indeterminate::-webkit-progress-value {
|
|
50
|
+
display: block;
|
|
51
|
+
width: var(--_indeterminate-width);
|
|
52
|
+
animation: var(--_indeterminate-animation);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Chrome */
|
|
56
|
+
.progress:indeterminate::before {
|
|
57
|
+
content: "";
|
|
58
|
+
display: block;
|
|
59
|
+
width: var(--_indeterminate-width);
|
|
60
|
+
height: var(--_height);
|
|
61
|
+
background-color: var(--_progress-color);
|
|
62
|
+
border-radius: var(--_border-radius);
|
|
63
|
+
animation: var(--_indeterminate-animation);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@keyframes indeterminate {
|
|
67
|
+
0% {
|
|
68
|
+
margin-left: 0%;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
50% {
|
|
72
|
+
margin-left: 75%;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
100% {
|
|
76
|
+
margin-left: 0%;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Info section (text label and value) */
|
|
81
|
+
.info {
|
|
82
|
+
display: flex;
|
|
83
|
+
justify-content: space-between;
|
|
84
|
+
align-items: center;
|
|
85
|
+
flex-wrap: wrap;
|
|
86
|
+
gap: 0.25rem;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.label,
|
|
90
|
+
.value {
|
|
91
|
+
font: var(--leu-t-tiny-regular-font);
|
|
92
|
+
color: var(--leu-color-black-60);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.value {
|
|
96
|
+
/* margin-left: auto; */
|
|
97
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Meta, StoryObj } from "@storybook/web-components"
|
|
2
|
+
import { html } from "lit"
|
|
3
|
+
import { ifDefined } from "lit/directives/if-defined.js"
|
|
4
|
+
|
|
5
|
+
import "../leu-progress-bar.js"
|
|
6
|
+
import { LeuProgressBar } from "../ProgressBar.js"
|
|
7
|
+
|
|
8
|
+
type StoryArgs = LeuProgressBar
|
|
9
|
+
type Story = StoryObj<StoryArgs>
|
|
10
|
+
|
|
11
|
+
export default {
|
|
12
|
+
title: "Components/ProgressBar",
|
|
13
|
+
component: "leu-progress-bar",
|
|
14
|
+
} satisfies Meta<StoryArgs>
|
|
15
|
+
|
|
16
|
+
const Template: Story = {
|
|
17
|
+
render: ({ label, value, indeterminate }) =>
|
|
18
|
+
html` <leu-progress-bar
|
|
19
|
+
.label="${ifDefined(label)}"
|
|
20
|
+
.value="${ifDefined(value)}"
|
|
21
|
+
?indeterminate=${indeterminate}
|
|
22
|
+
></leu-progress-bar>`,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const Regular = {
|
|
26
|
+
...Template,
|
|
27
|
+
args: {
|
|
28
|
+
value: 50,
|
|
29
|
+
label: "Datei hochladen",
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const Indeterminate = {
|
|
34
|
+
...Template,
|
|
35
|
+
args: {
|
|
36
|
+
indeterminate: true,
|
|
37
|
+
label: "Datei hochladen",
|
|
38
|
+
},
|
|
39
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { html } from "lit"
|
|
2
|
+
import { fixture, expect } from "@open-wc/testing"
|
|
3
|
+
import { ifDefined } from "lit/directives/if-defined.js"
|
|
4
|
+
|
|
5
|
+
import "../leu-progress-bar.js"
|
|
6
|
+
import { type LeuProgressBar } from "../ProgressBar.js"
|
|
7
|
+
|
|
8
|
+
async function defaultFixture({
|
|
9
|
+
value,
|
|
10
|
+
label,
|
|
11
|
+
indeterminate,
|
|
12
|
+
}: { value?: number; label?: string; indeterminate?: boolean } = {}) {
|
|
13
|
+
return fixture<LeuProgressBar>(
|
|
14
|
+
html`<leu-progress-bar
|
|
15
|
+
value=${ifDefined(value)}
|
|
16
|
+
label=${ifDefined(label)}
|
|
17
|
+
?indeterminate=${indeterminate}
|
|
18
|
+
></leu-progress-bar>`,
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
describe("LeuProgressBar", () => {
|
|
23
|
+
it("is a defined element", async () => {
|
|
24
|
+
const el = customElements.get("leu-progress-bar")
|
|
25
|
+
|
|
26
|
+
expect(el).not.to.be.undefined
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it("passes the a11y audit", async () => {
|
|
30
|
+
const el = await defaultFixture({ value: 65, label: "Datei hochladen" })
|
|
31
|
+
|
|
32
|
+
await expect(el).shadowDom.to.be.accessible()
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it("renders the text labels and applies the value", async () => {
|
|
36
|
+
const el = await defaultFixture({ value: 65, label: "Datei hochladen" })
|
|
37
|
+
|
|
38
|
+
const label = el.shadowRoot?.querySelector(".label")
|
|
39
|
+
const value = el.shadowRoot?.querySelector(".value")
|
|
40
|
+
const progress = el.shadowRoot?.querySelector("progress")
|
|
41
|
+
|
|
42
|
+
expect(label?.textContent).to.equal("Datei hochladen")
|
|
43
|
+
expect(value?.textContent).to.equal("65 %")
|
|
44
|
+
expect(progress?.value).to.equal(65)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it("applies the indeterminate state", async () => {
|
|
48
|
+
const el = await defaultFixture({
|
|
49
|
+
value: 65,
|
|
50
|
+
label: "Datei hochladen",
|
|
51
|
+
indeterminate: true,
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
const value = el.shadowRoot?.querySelector(".value")
|
|
55
|
+
const progress = el.shadowRoot?.querySelector("progress")
|
|
56
|
+
|
|
57
|
+
expect(value).to.not.exist
|
|
58
|
+
expect(progress).to.not.have.attribute("value")
|
|
59
|
+
expect(progress).to.not.have.attribute("max")
|
|
60
|
+
})
|
|
61
|
+
})
|