@statistikzh/leu 0.16.0 → 0.18.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 (93) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/dist/Accordion.js +1 -1
  4. package/dist/Button.js +1 -1
  5. package/dist/ButtonGroup.js +1 -1
  6. package/dist/ChartWrapper.js +1 -1
  7. package/dist/Checkbox.js +1 -1
  8. package/dist/CheckboxGroup.js +1 -1
  9. package/dist/Chip.js +1 -1
  10. package/dist/ChipGroup.js +1 -1
  11. package/dist/ChipLink.js +1 -1
  12. package/dist/ChipRemovable.js +3 -1
  13. package/dist/ChipSelectable.js +1 -1
  14. package/dist/Dialog.js +3 -1
  15. package/dist/Dropdown.js +1 -1
  16. package/dist/Icon.d.ts +130 -2
  17. package/dist/Icon.js +96 -69
  18. package/dist/Input.js +3 -1
  19. package/dist/{LeuElement-C0BZ_nPB.js → LeuElement-DlQXnrk8.js} +1 -1
  20. package/dist/Menu.js +3 -1
  21. package/dist/MenuItem.js +3 -1
  22. package/dist/Message.js +1 -1
  23. package/dist/Pagination.js +1 -1
  24. package/dist/Placeholder.js +1 -1
  25. package/dist/Popup.js +1 -1
  26. package/dist/Radio.js +1 -1
  27. package/dist/RadioGroup.js +1 -1
  28. package/dist/Range.js +1 -1
  29. package/dist/ScrollTop.js +1 -1
  30. package/dist/Select.js +1 -1
  31. package/dist/Spinner.js +1 -1
  32. package/dist/Table.js +2 -2
  33. package/dist/Tag.d.ts +17 -0
  34. package/dist/Tag.js +75 -0
  35. package/dist/VisuallyHidden.js +1 -1
  36. package/dist/components/icon/Icon.d.ts +5 -2
  37. package/dist/components/icon/Icon.d.ts.map +1 -1
  38. package/dist/components/icon/paths.d.ts +48 -23
  39. package/dist/components/icon/paths.d.ts.map +1 -1
  40. package/dist/components/icon/stories/icon.stories.d.ts.map +1 -1
  41. package/dist/components/tag/Tag.d.ts +13 -0
  42. package/dist/components/tag/Tag.d.ts.map +1 -0
  43. package/dist/components/tag/leu-tag.d.ts +3 -0
  44. package/dist/components/tag/leu-tag.d.ts.map +1 -0
  45. package/dist/components/tag/stories/tag.stories.d.ts +136 -0
  46. package/dist/components/tag/stories/tag.stories.d.ts.map +1 -0
  47. package/dist/components/tag/test/tag.test.d.ts +2 -0
  48. package/dist/components/tag/test/tag.test.d.ts.map +1 -0
  49. package/dist/index.js +1 -1
  50. package/dist/leu-accordion.js +1 -1
  51. package/dist/leu-button-group.js +1 -1
  52. package/dist/leu-button.js +1 -1
  53. package/dist/leu-chart-wrapper.js +1 -1
  54. package/dist/leu-checkbox-group.js +1 -1
  55. package/dist/leu-checkbox.js +1 -1
  56. package/dist/leu-chip-group.js +1 -1
  57. package/dist/leu-chip-link.js +1 -1
  58. package/dist/leu-chip-removable.js +3 -1
  59. package/dist/leu-chip-selectable.js +1 -1
  60. package/dist/leu-dialog.js +3 -1
  61. package/dist/leu-dropdown.js +1 -1
  62. package/dist/leu-icon.js +3 -1
  63. package/dist/leu-input.js +3 -1
  64. package/dist/leu-menu-item.js +3 -1
  65. package/dist/leu-menu.js +3 -1
  66. package/dist/leu-message.js +1 -1
  67. package/dist/leu-pagination.js +1 -1
  68. package/dist/leu-placeholder.js +1 -1
  69. package/dist/leu-popup.js +1 -1
  70. package/dist/leu-radio-group.js +1 -1
  71. package/dist/leu-radio.js +1 -1
  72. package/dist/leu-range.js +1 -1
  73. package/dist/leu-scroll-top.js +1 -1
  74. package/dist/leu-select.js +1 -1
  75. package/dist/leu-spinner.js +1 -1
  76. package/dist/leu-table.js +3 -3
  77. package/dist/leu-tag.d.ts +4 -0
  78. package/dist/leu-tag.js +9 -0
  79. package/dist/leu-visually-hidden.js +1 -1
  80. package/dist/vscode.html-custom-data.json +21 -1
  81. package/dist/vue/index.d.ts +20 -0
  82. package/dist/web-types.json +30 -2
  83. package/package.json +1 -1
  84. package/src/components/icon/Icon.ts +7 -10
  85. package/src/components/icon/paths.ts +126 -77
  86. package/src/components/icon/stories/icon.stories.ts +5 -0
  87. package/src/components/icon/test/icon.test.ts +5 -4
  88. package/src/components/tag/Tag.ts +28 -0
  89. package/src/components/tag/leu-tag.ts +5 -0
  90. package/src/components/tag/stories/tag.stories.ts +107 -0
  91. package/src/components/tag/tag.css +42 -0
  92. package/src/components/tag/test/tag.test.ts +28 -0
  93. package/src/docs/theme.mdx +49 -2
@@ -2,16 +2,17 @@ import { html } from "lit"
2
2
  import { fixture, expect } from "@open-wc/testing"
3
3
 
4
4
  import "../leu-icon.js"
5
+ import { IconPathName } from "../paths.js"
5
6
 
6
- async function defaultFixture(name = "close") {
7
+ async function defaultFixture(name: IconPathName | "" = "close") {
7
8
  return fixture(html` <leu-icon name=${name}></leu-icon> `)
8
9
  }
9
10
 
10
11
  describe("LeuIcon", () => {
11
12
  it("is a defined element", async () => {
12
- const el = await customElements.get("leu-icon")
13
+ const el = customElements.get("leu-icon")
13
14
 
14
- await expect(el).not.to.be.undefined
15
+ expect(el).not.to.be.undefined
15
16
  })
16
17
 
17
18
  it("passes the a11y audit", async () => {
@@ -30,7 +31,7 @@ describe("LeuIcon", () => {
30
31
  })
31
32
 
32
33
  it("renders the correct icon path", async () => {
33
- const el = await defaultFixture("angleDropup")
34
+ const el = await defaultFixture("angleDropUp")
34
35
 
35
36
  const path = el.shadowRoot.querySelector("path")
36
37
  expect(path).to.have.attribute("d", "M7 14.5L12 9.5L17 14.5H7Z")
@@ -0,0 +1,28 @@
1
+ import { html } from "lit"
2
+ import { property } from "lit/decorators.js"
3
+
4
+ import { LeuElement } from "../../lib/LeuElement.js"
5
+
6
+ import styles from "./tag.css"
7
+
8
+ /**
9
+ * @tagname leu-tag
10
+ * @cssprop --leu-tag-accent-color - The color of the tag
11
+ * @slot default - The label of the tag
12
+ * @slot icon - An icon to display in the tag
13
+ */
14
+ export class LeuTag extends LeuElement {
15
+ static styles = [LeuElement.styles, styles]
16
+
17
+ @property({ type: String })
18
+ variant: "solid" | "outline" | "ghost" = "solid"
19
+
20
+ render() {
21
+ return html`
22
+ <div class="tag tag--${this.variant}">
23
+ <slot class="tag__icon" name="icon"></slot>
24
+ <slot class="tag__label"></slot>
25
+ </div>
26
+ `
27
+ }
28
+ }
@@ -0,0 +1,5 @@
1
+ import { LeuTag } from "./Tag.js"
2
+
3
+ export { LeuTag }
4
+
5
+ LeuTag.define("leu-tag")
@@ -0,0 +1,107 @@
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-tag.js"
6
+ import "../../icon/leu-icon.js"
7
+ import { LeuTag } from "../Tag.js"
8
+
9
+ import { paths as iconPaths } from "../../icon/paths.js"
10
+
11
+ type StoryArgs = LeuTag
12
+ type Story = StoryObj<StoryArgs>
13
+
14
+ export default {
15
+ title: "Components/Tag",
16
+ component: "leu-tag",
17
+ parameters: {
18
+ design: {
19
+ type: "figma",
20
+ url: "https://www.figma.com/design/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?node-id=21161-184432&t=QMYWpoD4FMWFrUkK-11",
21
+ },
22
+ },
23
+ argTypes: {
24
+ variant: {
25
+ control: "select",
26
+ options: ["solid", "outline", "ghost"],
27
+ },
28
+ "--leu-tag-accent-color": {
29
+ control: {
30
+ type: "color",
31
+ presetColors: [
32
+ "#0076bd",
33
+ "#00407c",
34
+ "#00797b",
35
+ "#1a7f1f",
36
+ "#b01657",
37
+ "#d40053",
38
+ "#7f3da7",
39
+ "#666666",
40
+ "#009ee0",
41
+ "#d93c1a",
42
+ "#1a7f1f",
43
+ ],
44
+ },
45
+ },
46
+ icon: { control: "select", options: Object.keys(iconPaths) },
47
+ },
48
+ args: {
49
+ variant: "solid",
50
+ icon: "confirm",
51
+ default: "Abgeschlossen",
52
+ "--leu-tag-accent-color": "#7f3da7",
53
+ },
54
+ } satisfies Meta<StoryArgs>
55
+
56
+ const Template: Story = {
57
+ render: (args: StoryArgs) =>
58
+ html` <leu-tag
59
+ variant=${ifDefined(args.variant)}
60
+ style="--leu-tag-accent-color: ${args["--leu-tag-accent-color"] ??
61
+ "unset"}"
62
+ >
63
+ ${args.icon
64
+ ? html`<leu-icon slot="icon" name=${args.icon}></leu-icon>`
65
+ : ""}
66
+ ${args.default}</leu-tag
67
+ >`,
68
+ }
69
+
70
+ export const Solid = {
71
+ ...Template,
72
+ args: {
73
+ variant: "solid",
74
+ },
75
+ }
76
+
77
+ export const Outline = {
78
+ ...Template,
79
+ args: {
80
+ variant: "outline",
81
+ },
82
+ }
83
+
84
+ export const Ghost = {
85
+ ...Template,
86
+ args: {
87
+ variant: "ghost",
88
+ },
89
+ }
90
+
91
+ export const Warning = {
92
+ ...Template,
93
+ args: {
94
+ variant: "solid",
95
+ "--leu-tag-accent-color": "#d93c1a",
96
+ default: "Abgelaufen",
97
+ },
98
+ }
99
+
100
+ export const NoIcon = {
101
+ ...Template,
102
+ args: {
103
+ variant: "solid",
104
+ "--leu-tag-accent-color": "#7f3da7",
105
+ icon: undefined,
106
+ },
107
+ }
@@ -0,0 +1,42 @@
1
+ :host {
2
+ /* --tag-font-regular: var(--leu-font-family-regular);
3
+ --tag-font-black: var(--leu-font-family-black);
4
+
5
+ font-family: var(--tag-font-regular); */
6
+ }
7
+
8
+ .tag {
9
+ --_accent-color: var(--leu-tag-accent-color, var(--leu-color-black-60));
10
+
11
+ display: inline-flex;
12
+ align-items: center;
13
+ padding: 0.25rem 0.5rem;
14
+ gap: 0.25rem;
15
+ border-radius: 0.25rem;
16
+
17
+ background-color: var(--_accent-color);
18
+ border: 2px solid var(--_accent-color);
19
+ color: var(--leu-color-black-0);
20
+ }
21
+
22
+ .tag--outline {
23
+ background-color: transparent;
24
+ border-color: var(--_accent-color);
25
+ color: var(--_accent-color);
26
+ }
27
+
28
+ .tag--ghost {
29
+ background-color: transparent;
30
+ border-color: transparent;
31
+ color: var(--_accent-color);
32
+ }
33
+
34
+ .tag__icon {
35
+ --leu-icon-size: 1rem;
36
+ }
37
+
38
+ .tag__label {
39
+ display: block;
40
+ font: var(--leu-t-tiny-regular-font);
41
+ line-height: 1rem;
42
+ }
@@ -0,0 +1,28 @@
1
+ import { html } from "lit"
2
+ import { fixture, expect } from "@open-wc/testing"
3
+
4
+ import "../leu-tag.js"
5
+
6
+ async function defaultFixture() {
7
+ return fixture(html`<leu-tag>Abgeschlossen</leu-tag>`)
8
+ }
9
+
10
+ describe("LeuTag", () => {
11
+ it("is a defined element", async () => {
12
+ const el = customElements.get("leu-tag")
13
+
14
+ 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
+
23
+ it("renders with default slot content", async () => {
24
+ const el = await defaultFixture()
25
+
26
+ expect(el).to.have.trimmed.text("Abgeschlossen")
27
+ })
28
+ })
@@ -59,6 +59,7 @@ This is helpful if you want to use the it to style your application or to build
59
59
  ## Table of Contents
60
60
 
61
61
  - [Design System](#design-system)
62
+ - [Quick start](#quick-start)
62
63
  - [Structure of the file](#structure-of-the-file)
63
64
  - [Custom property naming](#custom-property-naming)
64
65
  - [Colors](#colors)
@@ -75,6 +76,50 @@ The theme is based on the official [design system](https://www.zh.ch/de/webangeb
75
76
  Currently there is no automatic workflow that generates the theme from the design system. The theme is manually updated when the design system changes.
76
77
  If you spot any inconsistencies between the theme and the design system, please open an issue.
77
78
 
79
+ ## Quick start
80
+
81
+ The following css snippet is a good starting point when you want to use the theme to style your application.
82
+ Details about the specific definitions can be found in the content below.
83
+
84
+ ```css
85
+ html {
86
+ font-family: var(--leu-font-family-regular);
87
+ font-feature-settings: var(--leu-t-font-feature-settings);
88
+
89
+ /* Prevent browser from synthesizing font weights */
90
+ font-synthesis-weight: none;
91
+ }
92
+
93
+ strong {
94
+ font-family: var(--leu-font-family-black);
95
+ }
96
+
97
+ /* Heading style mapping. Use whatever selector make sense in your project. */
98
+ h1 {
99
+ font: var(--leu-t-curve-huge-black-font);
100
+ }
101
+
102
+ h2 {
103
+ font: var(--leu-t-curve-large-black-font);
104
+ }
105
+
106
+ h3 {
107
+ font: var(--leu-t-curve-medium-black-font);
108
+ }
109
+
110
+ h4 {
111
+ font: var(--leu-t-curve-regular-black-font);
112
+ }
113
+
114
+ /*
115
+ * Prevent "Flash of Unstyled Custom Elements" (FOUCE)
116
+ * https://www.abeautifulsite.net/posts/flash-of-undefined-custom-elements
117
+ */
118
+ :not(:defined) {
119
+ visibility: hidden;
120
+ }
121
+ ```
122
+
78
123
  ## Structure of the file
79
124
 
80
125
  The theme contains custom properties for:
@@ -175,6 +220,8 @@ box-shadow: var(--leu-box-shadow-short);
175
220
 
176
221
  ## z-index
177
222
 
223
+ TODO
224
+
178
225
  ## Typography
179
226
 
180
227
  The design system is based on the [Inter](https://rsms.me/inter/) font family. It just uses the `regular` and `black` weights.
@@ -306,9 +353,9 @@ h1 {
306
353
 
307
354
  As the theme only consist of custom properties, it isn't possible to provide a full set of grid classes.
308
355
  Instead the theme contains just five necessary values that can be applied directly.
356
+ This approach helps us to keep the css footprint as small as possible.
309
357
  Most components don't need a grid anyway and those who do mostly have a very simple configuration.
310
- Alternatively you can use to build your own classes for your application.
311
- This aproach helps us to keep the css footprint small.
358
+ Alternatively you can use the variables to build your own classes. You can find a possible implementation in this [GitHub Gist](https://gist.github.com/daenub/735d657cc0bf297e9a7d2015f003084c).
312
359
 
313
360
  The official design system uses a 6 columns system on smaller screens.
314
361
  For simplicity we use a 12 column grid for all breakpoints.