@statistikzh/leu 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/.github/workflows/deploy-github-pages.yaml +33 -0
  2. package/.storybook/main.js +27 -1
  3. package/.storybook/manager-head.html +1 -0
  4. package/.storybook/manager.js +9 -0
  5. package/.storybook/preview-head.html +1 -1
  6. package/.storybook/preview.js +59 -6
  7. package/.storybook/static/logo.svg +19 -0
  8. package/.storybook/theme.js +7 -0
  9. package/CHANGELOG.md +54 -0
  10. package/README.md +1 -1
  11. package/custom-elements-manifest.config.js +46 -0
  12. package/dist/Accordion.d.ts +31 -0
  13. package/dist/Accordion.d.ts.map +1 -0
  14. package/dist/Accordion.js +257 -0
  15. package/dist/Breadcrumb.d.ts +69 -0
  16. package/dist/Breadcrumb.d.ts.map +1 -0
  17. package/dist/Breadcrumb.js +392 -0
  18. package/dist/Button-da11d064.d.ts +84 -0
  19. package/dist/Button-da11d064.d.ts.map +1 -0
  20. package/dist/Button-da11d064.js +542 -0
  21. package/dist/Button.d.ts +2 -0
  22. package/dist/Button.d.ts.map +1 -0
  23. package/dist/Button.js +6 -423
  24. package/dist/ButtonGroup.d.ts +24 -0
  25. package/dist/ButtonGroup.d.ts.map +1 -0
  26. package/dist/ButtonGroup.js +72 -43
  27. package/dist/Checkbox.d.ts +13 -0
  28. package/dist/Checkbox.d.ts.map +1 -0
  29. package/dist/Checkbox.js +101 -84
  30. package/dist/CheckboxGroup.d.ts +13 -0
  31. package/dist/CheckboxGroup.d.ts.map +1 -0
  32. package/dist/CheckboxGroup.js +41 -37
  33. package/dist/Chip.d.ts +5 -0
  34. package/dist/Chip.d.ts.map +1 -0
  35. package/dist/{Chip-5f70d04f.js → Chip.js} +21 -6
  36. package/dist/ChipGroup.d.ts +28 -0
  37. package/dist/ChipGroup.d.ts.map +1 -0
  38. package/dist/ChipGroup.js +64 -10
  39. package/dist/ChipLink.d.ts +15 -0
  40. package/dist/ChipLink.d.ts.map +1 -0
  41. package/dist/ChipLink.js +4 -7
  42. package/dist/ChipRemovable.d.ts +13 -0
  43. package/dist/ChipRemovable.d.ts.map +1 -0
  44. package/dist/ChipRemovable.js +5 -8
  45. package/dist/ChipSelectable.d.ts +22 -0
  46. package/dist/ChipSelectable.d.ts.map +1 -0
  47. package/dist/ChipSelectable.js +8 -11
  48. package/dist/Dropdown.d.ts +15 -0
  49. package/dist/Dropdown.d.ts.map +1 -0
  50. package/dist/Dropdown.js +73 -26
  51. package/dist/Input.d.ts +154 -0
  52. package/dist/Input.d.ts.map +1 -0
  53. package/dist/Input.js +42 -35
  54. package/dist/Menu.d.ts +8 -0
  55. package/dist/Menu.d.ts.map +1 -0
  56. package/dist/Menu.js +2 -5
  57. package/dist/MenuItem.d.ts +21 -0
  58. package/dist/MenuItem.d.ts.map +1 -0
  59. package/dist/MenuItem.js +32 -17
  60. package/dist/Pagination.d.ts +27 -0
  61. package/dist/Pagination.d.ts.map +1 -0
  62. package/dist/Pagination.js +121 -89
  63. package/dist/Popup.d.ts +18 -0
  64. package/dist/Popup.d.ts.map +1 -0
  65. package/dist/Popup.js +215 -0
  66. package/dist/Radio.d.ts +12 -0
  67. package/dist/Radio.d.ts.map +1 -0
  68. package/dist/Radio.js +9 -8
  69. package/dist/RadioGroup.d.ts +20 -0
  70. package/dist/RadioGroup.d.ts.map +1 -0
  71. package/dist/RadioGroup.js +41 -39
  72. package/dist/ScrollTop.d.ts +19 -0
  73. package/dist/ScrollTop.d.ts.map +1 -0
  74. package/dist/ScrollTop.js +122 -0
  75. package/dist/Select.d.ts +98 -0
  76. package/dist/Select.d.ts.map +1 -0
  77. package/dist/Select.js +79 -122
  78. package/dist/Table.d.ts +48 -0
  79. package/dist/Table.d.ts.map +1 -0
  80. package/dist/Table.js +141 -121
  81. package/dist/VisuallyHidden.d.ts +8 -0
  82. package/dist/VisuallyHidden.d.ts.map +1 -0
  83. package/dist/VisuallyHidden.js +28 -0
  84. package/dist/_rollupPluginBabelHelpers-20f659f4.d.ts +3 -0
  85. package/dist/_rollupPluginBabelHelpers-20f659f4.d.ts.map +1 -0
  86. package/dist/{defineElement-ba770aed.js → _rollupPluginBabelHelpers-20f659f4.js} +1 -15
  87. package/dist/defineElement-40372b4b.d.ts +9 -0
  88. package/dist/defineElement-40372b4b.d.ts.map +1 -0
  89. package/dist/defineElement-40372b4b.js +15 -0
  90. package/dist/icon-03e86700.d.ts +11 -0
  91. package/dist/icon-03e86700.d.ts.map +1 -0
  92. package/dist/index.js.d.ts +21 -0
  93. package/dist/index.js.d.ts.map +1 -0
  94. package/dist/index.js.js +42 -0
  95. package/dist/leu-accordion.d.ts +3 -0
  96. package/dist/leu-accordion.d.ts.map +1 -0
  97. package/dist/leu-accordion.js +9 -0
  98. package/dist/leu-breadcrumb.d.ts +3 -0
  99. package/dist/leu-breadcrumb.d.ts.map +1 -0
  100. package/dist/leu-breadcrumb.js +23 -0
  101. package/dist/leu-button-group.d.ts +3 -0
  102. package/dist/leu-button-group.d.ts.map +1 -0
  103. package/dist/leu-button-group.js +6 -6
  104. package/dist/leu-button.d.ts +3 -0
  105. package/dist/leu-button.d.ts.map +1 -0
  106. package/dist/leu-button.js +7 -3
  107. package/dist/leu-checkbox-group.d.ts +3 -0
  108. package/dist/leu-checkbox-group.d.ts.map +1 -0
  109. package/dist/leu-checkbox-group.js +6 -3
  110. package/dist/leu-checkbox.d.ts +3 -0
  111. package/dist/leu-checkbox.d.ts.map +1 -0
  112. package/dist/leu-checkbox.js +6 -3
  113. package/dist/leu-chip-group.d.ts +3 -0
  114. package/dist/leu-chip-group.d.ts.map +1 -0
  115. package/dist/leu-chip-group.js +7 -3
  116. package/dist/leu-chip-link.d.ts +3 -0
  117. package/dist/leu-chip-link.d.ts.map +1 -0
  118. package/dist/leu-chip-link.js +7 -4
  119. package/dist/leu-chip-removable.d.ts +3 -0
  120. package/dist/leu-chip-removable.d.ts.map +1 -0
  121. package/dist/leu-chip-removable.js +7 -4
  122. package/dist/leu-chip-selectable.d.ts +3 -0
  123. package/dist/leu-chip-selectable.d.ts.map +1 -0
  124. package/dist/leu-chip-selectable.js +7 -4
  125. package/dist/leu-dropdown.d.ts +3 -0
  126. package/dist/leu-dropdown.d.ts.map +1 -0
  127. package/dist/leu-dropdown.js +15 -4
  128. package/dist/leu-input.d.ts +3 -0
  129. package/dist/leu-input.d.ts.map +1 -0
  130. package/dist/leu-input.js +7 -3
  131. package/dist/leu-menu-item.d.ts +3 -0
  132. package/dist/leu-menu-item.d.ts.map +1 -0
  133. package/dist/leu-menu-item.js +8 -3
  134. package/dist/leu-menu.d.ts +3 -0
  135. package/dist/leu-menu.d.ts.map +1 -0
  136. package/dist/leu-menu.js +6 -3
  137. package/dist/leu-pagination.d.ts +3 -0
  138. package/dist/leu-pagination.d.ts.map +1 -0
  139. package/dist/leu-pagination.js +12 -4
  140. package/dist/leu-popup.d.ts +3 -0
  141. package/dist/leu-popup.d.ts.map +1 -0
  142. package/dist/leu-popup.js +9 -0
  143. package/dist/leu-radio-group.d.ts +3 -0
  144. package/dist/leu-radio-group.d.ts.map +1 -0
  145. package/dist/leu-radio-group.js +6 -3
  146. package/dist/leu-radio.d.ts +3 -0
  147. package/dist/leu-radio.d.ts.map +1 -0
  148. package/dist/leu-radio.js +6 -3
  149. package/dist/leu-scroll-top.d.ts +3 -0
  150. package/dist/leu-scroll-top.d.ts.map +1 -0
  151. package/dist/leu-scroll-top.js +14 -0
  152. package/dist/leu-select.d.ts +3 -0
  153. package/dist/leu-select.d.ts.map +1 -0
  154. package/dist/leu-select.js +16 -4
  155. package/dist/leu-table.d.ts +3 -0
  156. package/dist/leu-table.d.ts.map +1 -0
  157. package/dist/leu-table.js +13 -4
  158. package/dist/leu-visually-hidden.d.ts +3 -0
  159. package/dist/leu-visually-hidden.d.ts.map +1 -0
  160. package/dist/leu-visually-hidden.js +8 -0
  161. package/dist/theme.css +386 -2
  162. package/dist/utils-65469421.d.ts +16 -0
  163. package/dist/utils-65469421.d.ts.map +1 -0
  164. package/dist/utils-65469421.js +35 -0
  165. package/index.js +3 -0
  166. package/package.json +47 -17
  167. package/postcss.config.cjs +2 -0
  168. package/rollup.config.js +21 -40
  169. package/scripts/generate-component/templates/[Name].js +0 -5
  170. package/scripts/generate-component/templates/[name].css +3 -3
  171. package/scripts/generate-component/templates/[namespace]-[name].js +5 -2
  172. package/scripts/postcss-leu-font-styles.cjs +160 -0
  173. package/src/components/accordion/Accordion.js +0 -6
  174. package/src/components/accordion/accordion.css +2 -2
  175. package/src/components/accordion/leu-accordion.js +5 -2
  176. package/src/components/accordion/stories/accordion.stories.js +8 -4
  177. package/src/components/accordion/test/accordion.test.js +95 -3
  178. package/src/components/breadcrumb/Breadcrumb.js +311 -0
  179. package/src/components/breadcrumb/breadcrumb.css +103 -0
  180. package/src/components/breadcrumb/leu-breadcrumb.js +6 -0
  181. package/src/components/breadcrumb/stories/breadcrumb.stories.js +73 -0
  182. package/src/components/breadcrumb/test/breadcrumb.test.js +141 -0
  183. package/src/components/button/Button.js +76 -20
  184. package/src/components/button/button.css +13 -5
  185. package/src/components/button/leu-button.js +5 -2
  186. package/src/components/button/stories/button.stories.js +79 -105
  187. package/src/components/button/test/button.test.js +184 -3
  188. package/src/components/button-group/ButtonGroup.js +76 -40
  189. package/src/components/button-group/leu-button-group.js +5 -2
  190. package/src/components/button-group/stories/button-group.stories.js +19 -6
  191. package/src/components/button-group/test/button-group.test.js +87 -4
  192. package/src/components/checkbox/Checkbox.js +6 -85
  193. package/src/components/checkbox/CheckboxGroup.js +8 -38
  194. package/src/components/checkbox/checkbox-group.css +29 -0
  195. package/src/components/checkbox/checkbox.css +76 -0
  196. package/src/components/checkbox/leu-checkbox-group.js +5 -2
  197. package/src/components/checkbox/leu-checkbox.js +5 -2
  198. package/src/components/checkbox/stories/checkbox-group.stories.js +44 -21
  199. package/src/components/checkbox/stories/checkbox.stories.js +7 -1
  200. package/src/components/checkbox/test/checkbox-group.test.js +124 -0
  201. package/src/components/checkbox/test/checkbox.test.js +72 -59
  202. package/src/components/chip/Chip.js +1 -0
  203. package/src/components/chip/ChipGroup.js +42 -7
  204. package/src/components/chip/ChipLink.js +1 -6
  205. package/src/components/chip/ChipRemovable.js +2 -7
  206. package/src/components/chip/ChipSelectable.js +5 -10
  207. package/src/components/chip/chip-group.css +12 -2
  208. package/src/components/chip/chip.css +14 -3
  209. package/src/components/chip/exports.js +4 -10
  210. package/src/components/chip/leu-chip-group.js +5 -2
  211. package/src/components/chip/leu-chip-link.js +5 -2
  212. package/src/components/chip/leu-chip-removable.js +5 -2
  213. package/src/components/chip/leu-chip-selectable.js +5 -2
  214. package/src/components/chip/stories/chip-group.stories.js +110 -44
  215. package/src/components/chip/stories/chip-link.stories.js +16 -4
  216. package/src/components/chip/stories/chip-removable.stories.js +15 -4
  217. package/src/components/chip/stories/chip-selectable.stories.js +13 -3
  218. package/src/components/chip/test/chip-group.test.js +124 -0
  219. package/src/components/chip/test/chip-link.test.js +58 -0
  220. package/src/components/chip/test/chip-removable.test.js +79 -0
  221. package/src/components/chip/test/chip-selectable.test.js +95 -0
  222. package/src/components/chip/test/chip.test.js +1 -1
  223. package/src/components/dropdown/Dropdown.js +72 -24
  224. package/src/components/dropdown/dropdown.css +1 -2
  225. package/src/components/dropdown/leu-dropdown.js +5 -2
  226. package/src/components/dropdown/stories/dropdown.stories.js +11 -5
  227. package/src/components/dropdown/test/dropdown.test.js +6 -6
  228. package/src/components/icon/icon.js +1 -1
  229. package/src/components/icon/test/icon.test.js +66 -0
  230. package/src/components/input/Input.js +25 -28
  231. package/src/components/input/input.css +11 -8
  232. package/src/components/input/leu-input.js +5 -2
  233. package/src/components/input/stories/input.stories.js +21 -2
  234. package/src/components/input/test/input.test.js +432 -4
  235. package/src/components/menu/Menu.js +0 -5
  236. package/src/components/menu/MenuItem.js +20 -13
  237. package/src/components/menu/leu-menu-item.js +5 -2
  238. package/src/components/menu/leu-menu.js +5 -2
  239. package/src/components/menu/menu-item.css +7 -4
  240. package/src/components/menu/stories/menu-item.stories.js +13 -4
  241. package/src/components/menu/stories/menu.stories.js +11 -5
  242. package/src/components/menu/test/menu-item.test.js +180 -0
  243. package/src/components/menu/test/menu.test.js +10 -2
  244. package/src/components/pagination/Pagination.js +118 -99
  245. package/src/components/pagination/leu-pagination.js +5 -2
  246. package/src/components/pagination/pagination.css +6 -1
  247. package/src/components/pagination/stories/pagination.stories.js +30 -9
  248. package/src/components/pagination/test/pagination.test.js +191 -5
  249. package/src/components/popup/Popup.js +200 -0
  250. package/src/components/popup/leu-popup.js +6 -0
  251. package/src/components/popup/popup.css +27 -0
  252. package/src/components/popup/stories/popup.stories.js +58 -0
  253. package/src/components/popup/test/popup.test.js +29 -0
  254. package/src/components/radio/Radio.js +2 -6
  255. package/src/components/radio/RadioGroup.js +6 -38
  256. package/src/components/radio/leu-radio-group.js +5 -2
  257. package/src/components/radio/leu-radio.js +5 -2
  258. package/src/components/radio/radio-group.css +29 -0
  259. package/src/components/radio/radio.css +1 -1
  260. package/src/components/radio/stories/radio-group.stories.js +38 -19
  261. package/src/components/radio/stories/radio.stories.js +7 -1
  262. package/src/components/radio/test/radio-group.test.js +86 -0
  263. package/src/components/radio/test/radio.test.js +108 -17
  264. package/src/components/scroll-top/ScrollTop.js +87 -0
  265. package/src/components/scroll-top/leu-scroll-top.js +6 -0
  266. package/src/components/scroll-top/scroll-top.css +34 -0
  267. package/src/components/scroll-top/stories/scroll-top.stories.js +217 -0
  268. package/src/components/scroll-top/test/scroll-top.test.js +22 -0
  269. package/src/components/select/Select.js +58 -37
  270. package/src/components/select/leu-select.js +5 -2
  271. package/src/components/select/select.css +15 -15
  272. package/src/components/select/stories/select.stories.js +15 -168
  273. package/src/components/select/test/fixtures.js +162 -0
  274. package/src/components/select/test/select.test.js +236 -12
  275. package/src/components/table/Table.js +43 -118
  276. package/src/components/table/leu-table.js +5 -2
  277. package/src/components/table/stories/table.stories.js +20 -10
  278. package/src/components/table/table.css +99 -0
  279. package/src/components/table/test/table.test.js +1 -1
  280. package/src/components/visually-hidden/VisuallyHidden.js +13 -0
  281. package/src/components/visually-hidden/leu-visually-hidden.js +6 -0
  282. package/src/components/visually-hidden/stories/visually-hidden.stories.js +22 -0
  283. package/src/components/visually-hidden/test/visually-hidden.test.js +36 -0
  284. package/src/components/visually-hidden/visually-hidden.css +10 -0
  285. package/src/lib/defineElement.js +1 -1
  286. package/src/lib/hasSlotController.js +5 -3
  287. package/src/lib/utils.js +35 -0
  288. package/src/styles/custom-properties.css +6 -2
  289. package/src/styles/font-definitions.json +202 -0
  290. package/stylelint.config.mjs +2 -0
  291. package/tsconfig.build.json +21 -0
  292. package/tsconfig.json +16 -0
  293. package/{web-dev-server-storybook.config.mjs → web-dev-server.config.mjs} +1 -2
  294. package/web-test-runner.config.mjs +15 -2
  295. package/dist/index.js +0 -26
@@ -1,7 +1,9 @@
1
1
  import { html, nothing, LitElement } from "lit"
2
2
  import { classMap } from "lit/directives/class-map.js"
3
+ import { ifDefined } from "lit/directives/if-defined.js"
4
+
3
5
  import { Icon } from "../icon/icon.js"
4
- import { defineElement } from "../../lib/defineElement.js"
6
+ import { HasSlotController } from "../../lib/hasSlotController.js"
5
7
 
6
8
  import styles from "./button.css"
7
9
 
@@ -14,7 +16,7 @@ const BUTTON_VARIANTS = ["primary", "secondary", "ghost"]
14
16
  Object.freeze(BUTTON_VARIANTS)
15
17
  export { BUTTON_VARIANTS }
16
18
 
17
- const BUTTON_SIZES = ["normal", "small"]
19
+ const BUTTON_SIZES = ["regular", "small"]
18
20
  Object.freeze(BUTTON_SIZES)
19
21
  export { BUTTON_SIZES }
20
22
 
@@ -22,9 +24,36 @@ const BUTTON_TYPES = ["button", "submit", "reset"]
22
24
  Object.freeze(BUTTON_TYPES)
23
25
  export { BUTTON_TYPES }
24
26
 
25
- export const BUTTON_EXPANDED_OPTIONS = ["open", "closed"]
27
+ export const BUTTON_EXPANDED_OPTIONS = ["true", "false"]
26
28
  Object.freeze(BUTTON_EXPANDED_OPTIONS)
27
29
 
30
+ /**
31
+ * All roles that are associated with a aria-checked attribute
32
+ * @link https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-checked
33
+ */
34
+ const ARIA_ROLES_CHECKED = [
35
+ "checkbox",
36
+ "menuitemcheckbox",
37
+ "menuitemradio",
38
+ "option",
39
+ "radio",
40
+ "switch",
41
+ ]
42
+
43
+ /**
44
+ * All roles that are associated with a aria-selected attribute
45
+ * @link https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-selected
46
+ */
47
+ const ARIA_ROLES_SELECTED = [
48
+ "gridcell",
49
+ "option",
50
+ "row",
51
+ "tab",
52
+ "columnheader",
53
+ "rowheader",
54
+ "treeitem",
55
+ ]
56
+
28
57
  /**
29
58
  * @tagname leu-button
30
59
  */
@@ -39,13 +68,19 @@ export class LeuButton extends LitElement {
39
68
  delegatesFocus: true,
40
69
  }
41
70
 
71
+ /**
72
+ * @internal
73
+ */
74
+ hasSlotController = new HasSlotController(this, ["[default]"])
75
+
42
76
  static properties = {
43
77
  label: { type: String, reflect: true },
44
78
  icon: { type: String, reflect: true },
45
- iconAfter: { type: String, reflect: true },
79
+ iconPosition: { type: String, reflect: true },
46
80
  size: { type: String, reflect: true },
47
81
  variant: { type: String, reflect: true },
48
82
  type: { type: String, reflect: true },
83
+ componentRole: { type: String, reflect: true },
49
84
 
50
85
  disabled: { type: Boolean, reflect: true },
51
86
  round: { type: Boolean, reflect: true },
@@ -61,13 +96,13 @@ export class LeuButton extends LitElement {
61
96
  this.label = null
62
97
  /** @type {string} */
63
98
  this.icon = null
64
- /** @type {string} - Only taken into account if Label and no Icon is set */
65
- this.iconAfter = null
99
+ /** @type {("before" | "after")} - Only taken into account if Label and no Icon is set */
100
+ this.iconPosition = "before"
66
101
  /** @type {string} */
67
- this.size = "normal"
102
+ this.size = "regular"
68
103
  /** @type {string} */
69
104
  this.variant = "primary"
70
- /** @type {string} */
105
+ /** @type {"button" | "submit" | "reset"} */
71
106
  this.type = "button"
72
107
 
73
108
  /** @type {boolean} */
@@ -84,7 +119,7 @@ export class LeuButton extends LitElement {
84
119
 
85
120
  /**
86
121
  * Only taken into account if variant is "ghost"
87
- * @type {("open" | "closed" | undefined)}
122
+ * @type {("true" | "false" | undefined)}
88
123
  */
89
124
  this.expanded = undefined
90
125
  }
@@ -94,7 +129,7 @@ export class LeuButton extends LitElement {
94
129
  }
95
130
 
96
131
  renderIconBefore() {
97
- if (this.icon) {
132
+ if (this.icon && this.iconPosition === "before") {
98
133
  return html`<div class="icon-wrapper icon-wrapper--before">
99
134
  ${Icon(this.icon, this.getIconSize())}
100
135
  </div>`
@@ -104,9 +139,9 @@ export class LeuButton extends LitElement {
104
139
  }
105
140
 
106
141
  renderIconAfter() {
107
- if (this.iconAfter && this.label && !this.icon) {
142
+ if (this.icon && this.iconPosition === "after") {
108
143
  return html`<div class="icon-wrapper icon-wrapper--after">
109
- ${Icon(this.iconAfter, this.getIconSize())}
144
+ ${Icon(this.icon, this.getIconSize())}
110
145
  </div>`
111
146
  }
112
147
 
@@ -123,10 +158,30 @@ export class LeuButton extends LitElement {
123
158
  return nothing
124
159
  }
125
160
 
161
+ getAriaAttributes() {
162
+ const attributes = {
163
+ role: this.componentRole,
164
+ label: this.label,
165
+ }
166
+
167
+ if (this.componentRole) {
168
+ if (ARIA_ROLES_CHECKED.includes(this.componentRole)) {
169
+ attributes.checked = this.active ? "true" : "false"
170
+ } else if (ARIA_ROLES_SELECTED.includes(this.componentRole)) {
171
+ attributes.selected = this.active ? "true" : "false"
172
+ }
173
+ }
174
+
175
+ return attributes
176
+ }
177
+
126
178
  render() {
179
+ const hasContent = this.hasSlotController.test("[default]")
180
+ const aria = this.getAriaAttributes()
181
+
127
182
  const cssClasses = {
128
- icon: !this.label && this.icon && !this.iconAfter,
129
- round: !this.label && this.icon && !this.iconAfter && this.round,
183
+ icon: !hasContent && this.icon,
184
+ round: !hasContent && this.icon && this.round,
130
185
  active: this.active,
131
186
  inverted: this.inverted,
132
187
  [this.variant]: true,
@@ -134,17 +189,18 @@ export class LeuButton extends LitElement {
134
189
  }
135
190
  return html`
136
191
  <button
192
+ aria-label=${ifDefined(aria.label)}
193
+ aria-selected=${ifDefined(aria.selected)}
194
+ aria-checked=${ifDefined(aria.checked)}
195
+ role=${ifDefined(aria.role)}
137
196
  class=${classMap(cssClasses)}
138
197
  ?disabled=${this.disabled}
139
198
  type=${this.type}
140
199
  >
141
- ${this.renderIconBefore()} ${this.label} ${this.renderIconAfter()}
142
- ${this.renderExpandingIcon()}
200
+ ${this.renderIconBefore()}
201
+ <slot></slot>
202
+ ${this.renderIconAfter()} ${this.renderExpandingIcon()}
143
203
  </button>
144
204
  `
145
205
  }
146
206
  }
147
-
148
- export function defineButtonElements() {
149
- defineElement("button", LeuButton)
150
- }
@@ -3,7 +3,7 @@
3
3
  }
4
4
 
5
5
  button {
6
- font-family: var(--leu-font-black);
6
+ font-family: var(--leu-font-family-black);
7
7
  text-align: center;
8
8
  appearance: none;
9
9
  transition: background 0.1s ease;
@@ -38,14 +38,14 @@ button.inverted:focus-visible {
38
38
  justify-content: center;
39
39
  }
40
40
 
41
- /* size - normal */
42
- button.normal {
41
+ /* size - regular */
42
+ button.regular {
43
43
  padding: 12px 24px;
44
44
  font-size: 16px;
45
45
  line-height: 24px;
46
46
  }
47
47
 
48
- button.normal.icon {
48
+ button.regular.icon {
49
49
  padding: 12px;
50
50
  }
51
51
 
@@ -76,6 +76,10 @@ button.primary.active {
76
76
  background: var(--leu-color-black-100);
77
77
  }
78
78
 
79
+ button.primary.active:hover {
80
+ background: var(--leu-color-black-transp-80);
81
+ }
82
+
79
83
  button.primary:disabled {
80
84
  color: var(--leu-color-black-0);
81
85
  background: var(--leu-color-black-transp-20);
@@ -97,6 +101,10 @@ button.secondary.active {
97
101
  background: var(--leu-color-black-100);
98
102
  }
99
103
 
104
+ button.secondary.active:hover {
105
+ background: var(--leu-color-black-transp-80);
106
+ }
107
+
100
108
  button.secondary:disabled {
101
109
  color: var(--leu-color-black-transp-20);
102
110
  background: var(--leu-color-black-transp-5);
@@ -107,7 +115,7 @@ button.ghost {
107
115
  background: transparent;
108
116
  padding: 0 0.5rem;
109
117
  color: var(--leu-color-black-60);
110
- font-family: var(--leu-font-regular);
118
+ font-family: var(--leu-font-family-regular);
111
119
  }
112
120
 
113
121
  button.ghost:hover {
@@ -1,3 +1,6 @@
1
- import { defineButtonElements } from "./Button.js"
1
+ import { defineElement } from "../../lib/defineElement.js"
2
+ import { LeuButton } from "./Button.js"
2
3
 
3
- defineButtonElements()
4
+ export { LeuButton }
5
+
6
+ defineElement("button", LeuButton)
@@ -10,59 +10,44 @@ import {
10
10
  BUTTON_EXPANDED_OPTIONS,
11
11
  } from "../Button.js"
12
12
 
13
- function copyContent(params) {
14
- const string = `<leu-button${Object.values(params)
15
- .filter((o) => o)
16
- .join("")}>\n</leu-button>`
17
- navigator.clipboard.writeText(string)
13
+ function copyContent(e) {
14
+ navigator.clipboard.writeText(e.target.outerHTML.replace(/<!--.*?-->/g, ""))
18
15
  }
19
16
 
20
17
  export default {
21
18
  title: "Button",
22
19
  component: "leu-button",
20
+ parameters: {
21
+ design: {
22
+ type: "figma",
23
+ url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=4-1444&mode=design&t=xu5Vii8jXKKCKDez-0",
24
+ },
25
+ html: {
26
+ root: "[data-root]",
27
+ },
28
+ },
23
29
  }
24
30
 
25
- function Template({
26
- label,
27
- round,
28
- size,
29
- active,
30
- inverted,
31
- variant,
32
- disabled,
33
- icon,
34
- iconAfter,
35
- type,
36
- expanded,
37
- }) {
38
- const params = {
39
- label: label ? ` label="${label}"` : undefined,
40
- size: size === "small" ? ' size="small"' : undefined,
41
- variant: variant !== "primary" ? ` variant="${variant}"` : undefined,
42
- icon: icon ? ` icon="${icon}"` : undefined,
43
- iconAfter: iconAfter ? ` icon="${iconAfter}"` : undefined,
44
- round: round ? " round" : undefined,
45
- active: active ? " active" : undefined,
46
- disabled: disabled ? " disabled" : undefined,
47
- inverted: inverted ? " inverted" : undefined,
48
- expanded: expanded ? ` expanded="${expanded}"` : undefined,
49
- }
31
+ function Template(args = {}) {
50
32
  const component = html`
51
- <leu-button
52
- label=${ifDefined(label)}
53
- size=${ifDefined(size)}
54
- variant=${ifDefined(variant)}
55
- icon=${ifDefined(icon)}
56
- iconAfter=${ifDefined(iconAfter)}
57
- type=${ifDefined(type)}
58
- expanded=${expanded}
59
- ?round=${round}
60
- ?active=${active}
61
- ?inverted=${inverted}
62
- ?disabled=${disabled}
63
- @click=${() => copyContent(params)}
64
- >
65
- </leu-button>
33
+ <div data-root>
34
+ <leu-button
35
+ content=${ifDefined(args.content)}
36
+ size=${ifDefined(args.size)}
37
+ variant=${ifDefined(args.variant)}
38
+ icon=${ifDefined(args.icon)}
39
+ iconPosition=${ifDefined(args.iconPosition)}
40
+ type=${ifDefined(args.type)}
41
+ expanded=${ifDefined(args.expanded)}
42
+ ?round=${args.round}
43
+ ?active=${args.active}
44
+ ?inverted=${args.inverted}
45
+ ?disabled=${args.disabled}
46
+ @click=${copyContent}
47
+ >
48
+ ${args.content}
49
+ </leu-button>
50
+ </div>
66
51
  <br />
67
52
  <p>Click the button to copy the code to the clipboard</p>
68
53
  `
@@ -74,8 +59,8 @@ function Template({
74
59
  }
75
60
  </style>
76
61
  <div
77
- style="${inverted
78
- ? "background:var(--leu-color-accent-blue);"
62
+ style="${args.inverted
63
+ ? "background:var(--leu-color-accent-blue); color: var(--leu-color-white-transp-90);"
79
64
  : ""}padding:40px;"
80
65
  >
81
66
  ${component}
@@ -85,40 +70,45 @@ function Template({
85
70
 
86
71
  export const Regular = Template.bind({})
87
72
  Regular.argTypes = {
88
- label: { type: "string" },
73
+ content: { type: "string" },
89
74
  icon: { control: "select", options: ICON_NAMES },
90
- iconAfter: { control: "select", options: ICON_NAMES },
75
+ iconPosition: { control: "select", options: ["before", "after"] },
91
76
  type: { control: "radio", options: BUTTON_TYPES },
92
77
  size: { control: "radio", options: BUTTON_SIZES },
93
78
  variant: { control: "radio", options: BUTTON_VARIANTS },
94
79
  expanded: { control: "radio", options: BUTTON_EXPANDED_OPTIONS },
95
80
  }
96
81
  Regular.args = {
97
- label: "Click Mich...",
82
+ content: "Click Mich...",
98
83
  round: false,
99
84
  disabled: false,
100
85
  active: false,
101
86
  inverted: false,
102
87
 
103
88
  icon: null,
104
- iconAfter: null,
89
+ iconPosition: null,
105
90
  size: null,
106
91
  variant: null,
107
92
  type: null,
108
93
  }
109
94
 
110
95
  const items = [
111
- { label: "Normal" },
112
- { label: "Active", active: true },
113
- { label: "Disabled", disabled: true },
96
+ { content: "Normal" },
97
+ { content: "Active", active: true },
98
+ { content: "Disabled", disabled: true },
114
99
 
115
- { label: "Normal", icon: "calendar" },
116
- { label: "Active", icon: "calendar", active: true },
117
- { label: "Disabled", icon: "calendar", disabled: true },
100
+ { content: "Normal", icon: "calendar" },
101
+ { content: "Active", icon: "calendar", active: true },
102
+ { content: "Disabled", icon: "calendar", disabled: true },
118
103
 
119
- { label: "Normal", iconAfter: "calendar" },
120
- { label: "Active", iconAfter: "calendar", active: true },
121
- { label: "Disabled", iconAfter: "calendar", disabled: true },
104
+ { content: "Normal", icon: "calendar", iconPosition: "after" },
105
+ { content: "Active", icon: "calendar", iconPosition: "after", active: true },
106
+ {
107
+ content: "Disabled",
108
+ icon: "calendar",
109
+ iconPosition: "after",
110
+ disabled: true,
111
+ },
122
112
 
123
113
  { icon: "calendar" },
124
114
  { icon: "calendar", active: true },
@@ -130,22 +120,27 @@ const items = [
130
120
  ]
131
121
 
132
122
  const ghostItems = [
133
- { label: "Normal", icon: "calendar" },
134
- { label: "Active", icon: "calendar", active: true },
135
- { label: "Disabled", icon: "calendar", disabled: true },
123
+ { content: "Normal", icon: "calendar" },
124
+ { content: "Active", icon: "calendar", active: true },
125
+ { content: "Disabled", icon: "calendar", disabled: true },
136
126
 
137
- { label: "Normal", icon: "calendar", expanded: "closed" },
138
- { label: "Active", icon: "calendar", active: true, expanded: "closed" },
139
- { label: "Disabled", icon: "calendar", disabled: true, expanded: "closed" },
127
+ { content: "Normal", icon: "calendar", expanded: "closed" },
128
+ { content: "Active", icon: "calendar", active: true, expanded: "closed" },
129
+ { content: "Disabled", icon: "calendar", disabled: true, expanded: "closed" },
140
130
 
141
- { label: "Normal", iconAfter: "calendar" },
142
- { label: "Active", iconAfter: "calendar", active: true },
143
- { label: "Disabled", iconAfter: "calendar", disabled: true },
131
+ { content: "Normal", icon: "calendar", iconPosition: "after" },
132
+ { content: "Active", icon: "calendar", iconPosition: "after", active: true },
133
+ {
134
+ content: "Disabled",
135
+ icon: "calendar",
136
+ iconPosition: "after",
137
+ disabled: true,
138
+ },
144
139
  ]
145
140
 
146
141
  const sizes = [
147
142
  {
148
- size: "normal",
143
+ size: "regular",
149
144
  items,
150
145
  },
151
146
  {
@@ -168,7 +163,7 @@ const groups = [
168
163
  {
169
164
  inverted: false,
170
165
  variant: "ghost",
171
- sizes: [{ size: "normal", items: ghostItems }],
166
+ sizes: [{ size: "regular", items: ghostItems }],
172
167
  },
173
168
  {
174
169
  inverted: true,
@@ -183,11 +178,11 @@ const groups = [
183
178
  {
184
179
  inverted: true,
185
180
  variant: "ghost",
186
- sizes: [{ size: "normal", items: ghostItems }],
181
+ sizes: [{ size: "regular", items: ghostItems }],
187
182
  },
188
183
  ]
189
184
 
190
- function TemplateDev() {
185
+ function TemplateOverview() {
191
186
  return html` <style>
192
187
  .codeblock {
193
188
  position: relative;
@@ -267,47 +262,26 @@ function TemplateDev() {
267
262
  (size) =>
268
263
  html`
269
264
  <div>
270
- <div class=${classMap({ table: true })}>
271
- ${size.items.map((item) => {
272
- const params = {
273
- label: item.label
274
- ? ` label="${item.label}"`
275
- : undefined,
276
- size:
277
- size.size === "small" ? ' size="small"' : undefined,
278
- variant:
279
- group.variant !== "primary"
280
- ? ` variant="${group.variant}"`
281
- : undefined,
282
- icon: item.icon ? ` icon="${item.icon}"` : undefined,
283
- iconAfter: item.iconAfter
284
- ? ` icon="${item.iconAfter}"`
285
- : undefined,
286
- round: item.round ? " round" : undefined,
287
- active: item.active ? " active" : undefined,
288
- disabled: item.disabled ? " disabled" : undefined,
289
- inverted: group.inverted ? " inverted" : undefined,
290
- expanded: item.expanded
291
- ? ` expanded="${item.expanded}"`
292
- : undefined,
293
- }
294
- return html`
265
+ <div class=${classMap({ table: true })} data-root>
266
+ ${size.items.map(
267
+ (item) => html`
295
268
  <leu-button
296
269
  label=${ifDefined(item.label)}
297
270
  size=${ifDefined(size.size)}
298
271
  variant=${ifDefined(group.variant)}
299
272
  icon=${ifDefined(item.icon)}
300
- iconAfter=${ifDefined(item.iconAfter)}
273
+ iconPosition=${ifDefined(item.iconPosition)}
301
274
  expanded=${ifDefined(item.expanded)}
302
275
  ?round=${item.round}
303
276
  ?active=${item.active}
304
277
  ?disabled=${item.disabled}
305
278
  ?inverted=${group.inverted}
306
- @click=${() => copyContent(params)}
279
+ @click=${copyContent}
307
280
  >
281
+ ${item.content}
308
282
  </leu-button>
309
283
  `
310
- })}
284
+ )}
311
285
  </div>
312
286
  </div>
313
287
  `
@@ -318,11 +292,11 @@ function TemplateDev() {
318
292
  )}`
319
293
  }
320
294
 
321
- export const Dev = TemplateDev.bind({})
322
- Dev.argTypes = {
323
- label: { table: { disable: true } },
295
+ export const Overview = TemplateOverview.bind({})
296
+ Overview.argTypes = {
297
+ content: { table: { disable: true } },
324
298
  icon: { table: { disable: true } },
325
- iconAfter: { table: { disable: true } },
299
+ iconPosition: { table: { disable: true } },
326
300
  size: { table: { disable: true } },
327
301
  variant: { table: { disable: true } },
328
302
  type: { table: { disable: true } },