@statistikzh/leu 0.28.1 → 0.28.3

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 (351) hide show
  1. package/dist/{Accordion-CwkI7sfx.js → Accordion-EwJ1WHFd.js} +1 -1
  2. package/dist/Accordion.js +2 -2
  3. package/dist/{Button-DcuvEVkC.d.ts → Button-BywuwtT2.d.ts} +0 -1
  4. package/dist/{Button-D1aYnunQ.js → Button-q4GeKj_3.js} +3 -4
  5. package/dist/Button.d.ts +1 -1
  6. package/dist/Button.js +4 -4
  7. package/dist/{ButtonGroup-CqThYjzX.js → ButtonGroup-BeU3Prei.js} +2 -2
  8. package/dist/ButtonGroup.js +5 -5
  9. package/dist/{ChartWrapper-BjVT4x-H.js → ChartWrapper-Bdb0_n2z.js} +2 -2
  10. package/dist/ChartWrapper.js +3 -3
  11. package/dist/{Checkbox-HxYqp2w4.js → Checkbox-BC0gAuaH.js} +2 -2
  12. package/dist/Checkbox.js +3 -3
  13. package/dist/{CheckboxGroup-DYws2rwt.js → CheckboxGroup-CiOgcwmo.js} +2 -2
  14. package/dist/CheckboxGroup.js +4 -4
  15. package/dist/{Chip-gKxD6IaZ.js → Chip-CYlPzmTG.js} +1 -1
  16. package/dist/Chip.js +2 -2
  17. package/dist/{ChipGroup-ZvBzX_wd.js → ChipGroup-3IMW_Mp7.js} +1 -1
  18. package/dist/ChipGroup.js +3 -3
  19. package/dist/ChipLink.js +2 -2
  20. package/dist/ChipRemovable.js +3 -3
  21. package/dist/ChipSelectable.js +2 -2
  22. package/dist/{Dialog-BYpzTprV.js → Dialog-DCl5qSXY.js} +3 -4
  23. package/dist/Dialog.js +3 -3
  24. package/dist/{Dropdown-C4CgE4E-.js → Dropdown-COmpmOev.js} +5 -5
  25. package/dist/Dropdown.d.ts +1 -1
  26. package/dist/Dropdown.js +8 -8
  27. package/dist/{FileInput-nsnSQCaU.js → FileInput-DXjoqKB4.js} +4 -4
  28. package/dist/FileInput.d.ts +1 -1
  29. package/dist/FileInput.js +6 -6
  30. package/dist/{Icon-D8HTPEFH.js → Icon-Bmk7lLWY.js} +1 -1
  31. package/dist/Icon.js +2 -2
  32. package/dist/{Input-OrILqlax.js → Input-B9FwAPKO.js} +2 -2
  33. package/dist/Input.js +3 -3
  34. package/dist/{LeuElement-C_lcHzQI.js → LeuElement-CQJQi8TB.js} +1 -1
  35. package/dist/{Menu-CFLCnI34.js → Menu-bWCAn0rT.js} +2 -2
  36. package/dist/Menu.js +4 -4
  37. package/dist/{MenuItem-ICjLCGim.js → MenuItem-CzCFZi8o.js} +2 -2
  38. package/dist/MenuItem.js +3 -3
  39. package/dist/{Message-Dw5D_0i1.js → Message-DMaM9ukF.js} +2 -2
  40. package/dist/Message.js +3 -3
  41. package/dist/{Pagination-D1tP5FrM.js → Pagination-870u3UgQ.js} +4 -4
  42. package/dist/{Pagination-9eZ8WMvR.d.ts → Pagination-B-mTHZiw.d.ts} +1 -1
  43. package/dist/Pagination.d.ts +1 -1
  44. package/dist/Pagination.js +6 -6
  45. package/dist/{Placeholder-CnGzCZ5-.js → Placeholder-DvvzGB1p.js} +1 -1
  46. package/dist/Placeholder.js +2 -2
  47. package/dist/{Popup-BiN_tZDN.js → Popup-BpG_7twr.js} +1 -1
  48. package/dist/Popup.js +2 -2
  49. package/dist/{ProgressBar-BfJo_KyU.js → ProgressBar-BkskTLWK.js} +1 -1
  50. package/dist/ProgressBar.js +2 -2
  51. package/dist/{Radio-CV7vuQUj.js → Radio-BS7UUhR3.js} +1 -1
  52. package/dist/Radio.js +2 -2
  53. package/dist/{RadioGroup-C3XWSScc.js → RadioGroup-Cpo9kAjB.js} +2 -2
  54. package/dist/RadioGroup.js +3 -3
  55. package/dist/{Range-C8RVrIM9.js → Range-Dh0p5UWA.js} +1 -1
  56. package/dist/Range.js +2 -2
  57. package/dist/{ScrollTop-B_TJ_k4m.js → ScrollTop-CtPidICZ.js} +3 -3
  58. package/dist/ScrollTop.d.ts +1 -1
  59. package/dist/ScrollTop.js +5 -5
  60. package/dist/{Select-CbPTrL3G.js → Select-W1KqDOgx.js} +7 -7
  61. package/dist/Select.d.ts +1 -1
  62. package/dist/Select.js +9 -9
  63. package/dist/{Spinner-ChKJQJTN.js → Spinner-CmAYIFws.js} +1 -1
  64. package/dist/Spinner.js +2 -2
  65. package/dist/{Tab-BJbzY1xd.js → Tab-7Cww5fSx.js} +1 -1
  66. package/dist/Tab.js +2 -2
  67. package/dist/{TabGroup-BIaCHrKR.js → TabGroup-tURfCrlw.js} +3 -3
  68. package/dist/TabGroup.js +4 -4
  69. package/dist/{TabPanel-CTyw410b.js → TabPanel-DIZcmcMV.js} +1 -1
  70. package/dist/TabPanel.js +2 -2
  71. package/dist/{Table-D3QmePJd.js → Table-BVYjYXP9.js} +3 -3
  72. package/dist/Table.d.ts +1 -1
  73. package/dist/Table.js +7 -7
  74. package/dist/{Tag-nUnWtHYy.js → Tag-x0KmEDEa.js} +1 -1
  75. package/dist/Tag.js +2 -2
  76. package/dist/{VisuallyHidden-DF2q9pTa.js → VisuallyHidden-CXRfGsaZ.js} +1 -1
  77. package/dist/VisuallyHidden.js +2 -2
  78. package/dist/custom-elements.json +6445 -0
  79. package/dist/index.d.ts +2 -2
  80. package/dist/index.js +30 -30
  81. package/dist/leu-accordion.js +2 -2
  82. package/dist/leu-button-group.js +5 -5
  83. package/dist/leu-button.d.ts +1 -1
  84. package/dist/leu-button.js +4 -4
  85. package/dist/leu-chart-wrapper.js +3 -3
  86. package/dist/leu-checkbox-group.js +4 -4
  87. package/dist/leu-checkbox.js +3 -3
  88. package/dist/leu-chip-group.js +3 -3
  89. package/dist/leu-chip-link.js +2 -2
  90. package/dist/leu-chip-removable.js +3 -3
  91. package/dist/leu-chip-selectable.js +2 -2
  92. package/dist/leu-dialog.js +3 -3
  93. package/dist/leu-dropdown.js +8 -8
  94. package/dist/leu-file-input.js +6 -6
  95. package/dist/leu-icon.js +2 -2
  96. package/dist/leu-input.js +3 -3
  97. package/dist/leu-menu-item.js +3 -3
  98. package/dist/leu-menu.js +4 -4
  99. package/dist/leu-message.js +3 -3
  100. package/dist/leu-pagination.d.ts +1 -1
  101. package/dist/leu-pagination.js +6 -6
  102. package/dist/leu-placeholder.js +2 -2
  103. package/dist/leu-popup.js +2 -2
  104. package/dist/leu-progress-bar.js +2 -2
  105. package/dist/leu-radio-group.js +3 -3
  106. package/dist/leu-radio.js +2 -2
  107. package/dist/leu-range.js +2 -2
  108. package/dist/leu-scroll-top.js +5 -5
  109. package/dist/leu-select.js +9 -9
  110. package/dist/leu-spinner.js +2 -2
  111. package/dist/leu-tab-group.js +4 -4
  112. package/dist/leu-tab-panel.js +2 -2
  113. package/dist/leu-tab.js +2 -2
  114. package/dist/leu-table.js +7 -7
  115. package/dist/leu-tag.js +2 -2
  116. package/dist/leu-visually-hidden.js +2 -2
  117. package/dist/vscode.html-custom-data.json +11 -11
  118. package/dist/vue/index.d.ts +20 -20
  119. package/dist/web-types.json +28 -28
  120. package/package.json +4 -1
  121. package/.editorconfig +0 -29
  122. package/.github/workflows/ci.yml +0 -81
  123. package/.github/workflows/deploy-github-pages.yaml +0 -34
  124. package/.github/workflows/publish.yml +0 -28
  125. package/.github/workflows/release-please.yml +0 -19
  126. package/.husky/commit-msg +0 -1
  127. package/.husky/pre-commit +0 -1
  128. package/.nvmrc +0 -1
  129. package/.prettierignore +0 -2
  130. package/.release-please-manifest.json +0 -3
  131. package/.storybook/main.ts +0 -34
  132. package/.storybook/manager-head.html +0 -1
  133. package/.storybook/manager.ts +0 -6
  134. package/.storybook/preview.ts +0 -96
  135. package/.storybook/static/fonts/Inter-Black.woff2 +0 -0
  136. package/.storybook/static/fonts/Inter-Regular.woff2 +0 -0
  137. package/.storybook/static/fonts.css +0 -11
  138. package/.storybook/static/global.css +0 -5
  139. package/.storybook/static/logo.svg +0 -19
  140. package/.storybook/theme.ts +0 -8
  141. package/AGENTS.md +0 -162
  142. package/CHANGELOG.md +0 -601
  143. package/CODE_OF_CONDUCT.md +0 -128
  144. package/CONTRIBUTING.md +0 -42
  145. package/commitlint.config.cjs +0 -1
  146. package/custom-elements-manifest.config.js +0 -46
  147. package/eslint.config.mjs +0 -79
  148. package/postcss.config.cjs +0 -16
  149. package/release-please-config.json +0 -9
  150. package/scripts/generate-component/generate.js +0 -167
  151. package/scripts/generate-component/templates/[Name].ts +0 -31
  152. package/scripts/generate-component/templates/[name].css +0 -6
  153. package/scripts/generate-component/templates/[namespace]-[name].ts +0 -11
  154. package/scripts/generate-component/templates/stories/[name].stories.ts +0 -26
  155. package/scripts/generate-component/templates/test/[name].test.ts +0 -23
  156. package/scripts/postcss-leu-font-styles.cjs +0 -154
  157. package/src/components/accordion/Accordion.ts +0 -108
  158. package/src/components/accordion/accordion.css +0 -150
  159. package/src/components/accordion/leu-accordion.ts +0 -11
  160. package/src/components/accordion/stories/accordion.stories.ts +0 -62
  161. package/src/components/accordion/test/accordion.test.ts +0 -118
  162. package/src/components/button/Button.ts +0 -286
  163. package/src/components/button/button.css +0 -317
  164. package/src/components/button/leu-button.ts +0 -11
  165. package/src/components/button/stories/button.stories.ts +0 -366
  166. package/src/components/button/test/button.test.ts +0 -417
  167. package/src/components/button-group/ButtonGroup.ts +0 -97
  168. package/src/components/button-group/button-group.css +0 -5
  169. package/src/components/button-group/leu-button-group.ts +0 -11
  170. package/src/components/button-group/stories/button-group.stories.ts +0 -54
  171. package/src/components/button-group/test/button-group.test.ts +0 -105
  172. package/src/components/chart-wrapper/ChartWrapper.ts +0 -78
  173. package/src/components/chart-wrapper/chart-wrapper.css +0 -87
  174. package/src/components/chart-wrapper/leu-chart-wrapper.ts +0 -11
  175. package/src/components/chart-wrapper/stories/chart-wrapper.stories.ts +0 -58
  176. package/src/components/chart-wrapper/test/chart-wrapper.test.ts +0 -77
  177. package/src/components/checkbox/Checkbox.ts +0 -129
  178. package/src/components/checkbox/CheckboxGroup.ts +0 -57
  179. package/src/components/checkbox/checkbox-group.css +0 -29
  180. package/src/components/checkbox/checkbox.css +0 -81
  181. package/src/components/checkbox/leu-checkbox-group.ts +0 -11
  182. package/src/components/checkbox/leu-checkbox.ts +0 -11
  183. package/src/components/checkbox/stories/checkbox-group.stories.ts +0 -59
  184. package/src/components/checkbox/stories/checkbox.stories.ts +0 -72
  185. package/src/components/checkbox/test/checkbox-group.test.ts +0 -109
  186. package/src/components/checkbox/test/checkbox.test.ts +0 -247
  187. package/src/components/chip/Chip.ts +0 -19
  188. package/src/components/chip/ChipGroup.ts +0 -122
  189. package/src/components/chip/ChipLink.ts +0 -24
  190. package/src/components/chip/ChipRemovable.ts +0 -45
  191. package/src/components/chip/ChipSelectable.ts +0 -80
  192. package/src/components/chip/chip-group.css +0 -15
  193. package/src/components/chip/chip.css +0 -139
  194. package/src/components/chip/exports.ts +0 -4
  195. package/src/components/chip/leu-chip-group.ts +0 -11
  196. package/src/components/chip/leu-chip-link.ts +0 -11
  197. package/src/components/chip/leu-chip-removable.ts +0 -11
  198. package/src/components/chip/leu-chip-selectable.ts +0 -11
  199. package/src/components/chip/stories/chip-group.stories.ts +0 -159
  200. package/src/components/chip/stories/chip-link.stories.ts +0 -45
  201. package/src/components/chip/stories/chip-removable.stories.ts +0 -42
  202. package/src/components/chip/stories/chip-selectable.stories.ts +0 -54
  203. package/src/components/chip/test/chip-group.test.ts +0 -171
  204. package/src/components/chip/test/chip-link.test.ts +0 -54
  205. package/src/components/chip/test/chip-removable.test.ts +0 -105
  206. package/src/components/chip/test/chip-selectable.test.ts +0 -101
  207. package/src/components/chip/test/chip.test.ts +0 -22
  208. package/src/components/dialog/Dialog.ts +0 -86
  209. package/src/components/dialog/dialog.css +0 -157
  210. package/src/components/dialog/leu-dialog.ts +0 -11
  211. package/src/components/dialog/stories/dialog.stories.ts +0 -142
  212. package/src/components/dialog/test/dialog.test.ts +0 -85
  213. package/src/components/dropdown/Dropdown.ts +0 -152
  214. package/src/components/dropdown/dropdown.css +0 -16
  215. package/src/components/dropdown/leu-dropdown.ts +0 -11
  216. package/src/components/dropdown/stories/dropdown.stories.ts +0 -58
  217. package/src/components/dropdown/test/dropdown.test.ts +0 -59
  218. package/src/components/file-input/FileInput.ts +0 -324
  219. package/src/components/file-input/file-input.css +0 -118
  220. package/src/components/file-input/leu-file-input.ts +0 -11
  221. package/src/components/file-input/stories/file-input.stories.ts +0 -45
  222. package/src/components/file-input/test/file-input.test.ts +0 -62
  223. package/src/components/icon/Icon.ts +0 -47
  224. package/src/components/icon/icon.css +0 -10
  225. package/src/components/icon/leu-icon.ts +0 -11
  226. package/src/components/icon/paths.ts +0 -219
  227. package/src/components/icon/stories/icon.stories.ts +0 -79
  228. package/src/components/icon/test/icon.test.ts +0 -50
  229. package/src/components/input/Input.ts +0 -469
  230. package/src/components/input/input.css +0 -238
  231. package/src/components/input/leu-input.ts +0 -11
  232. package/src/components/input/stories/input.stories.ts +0 -204
  233. package/src/components/input/test/input.test.ts +0 -603
  234. package/src/components/menu/Menu.ts +0 -149
  235. package/src/components/menu/MenuItem.ts +0 -168
  236. package/src/components/menu/leu-menu-item.ts +0 -11
  237. package/src/components/menu/leu-menu.ts +0 -11
  238. package/src/components/menu/menu-item.css +0 -77
  239. package/src/components/menu/menu.css +0 -19
  240. package/src/components/menu/stories/menu-item.stories.ts +0 -81
  241. package/src/components/menu/stories/menu.stories.ts +0 -54
  242. package/src/components/menu/test/menu-item.test.ts +0 -210
  243. package/src/components/menu/test/menu.test.ts +0 -125
  244. package/src/components/message/Message.ts +0 -118
  245. package/src/components/message/leu-message.ts +0 -11
  246. package/src/components/message/message.css +0 -163
  247. package/src/components/message/stories/message.mdx +0 -76
  248. package/src/components/message/stories/message.stories.ts +0 -149
  249. package/src/components/message/test/message.test.ts +0 -96
  250. package/src/components/pagination/Pagination.ts +0 -192
  251. package/src/components/pagination/leu-pagination.ts +0 -11
  252. package/src/components/pagination/pagination.css +0 -54
  253. package/src/components/pagination/stories/pagination.stories.ts +0 -115
  254. package/src/components/pagination/test/pagination.test.ts +0 -210
  255. package/src/components/placeholder/Placeholder.ts +0 -33
  256. package/src/components/placeholder/leu-placeholder.ts +0 -11
  257. package/src/components/placeholder/placeholder.css +0 -59
  258. package/src/components/placeholder/stories/placeholder.stories.ts +0 -34
  259. package/src/components/placeholder/test/placeholder.test.ts +0 -31
  260. package/src/components/popup/Popup.ts +0 -264
  261. package/src/components/popup/leu-popup.ts +0 -11
  262. package/src/components/popup/popup.css +0 -24
  263. package/src/components/popup/stories/popup.stories.ts +0 -117
  264. package/src/components/popup/test/popup.test.ts +0 -90
  265. package/src/components/progress-bar/ProgressBar.ts +0 -52
  266. package/src/components/progress-bar/leu-progress-bar.ts +0 -11
  267. package/src/components/progress-bar/progress-bar.css +0 -97
  268. package/src/components/progress-bar/stories/progress-bar.stories.ts +0 -39
  269. package/src/components/progress-bar/test/progress-bar.test.ts +0 -61
  270. package/src/components/radio/Radio.ts +0 -59
  271. package/src/components/radio/RadioGroup.ts +0 -181
  272. package/src/components/radio/leu-radio-group.ts +0 -11
  273. package/src/components/radio/leu-radio.ts +0 -11
  274. package/src/components/radio/radio-group.css +0 -29
  275. package/src/components/radio/radio.css +0 -76
  276. package/src/components/radio/stories/radio-group.stories.ts +0 -54
  277. package/src/components/radio/stories/radio.stories.ts +0 -55
  278. package/src/components/radio/test/radio-group.test.ts +0 -83
  279. package/src/components/radio/test/radio.test.ts +0 -119
  280. package/src/components/range/Range.ts +0 -400
  281. package/src/components/range/leu-range.ts +0 -11
  282. package/src/components/range/range.css +0 -227
  283. package/src/components/range/stories/range.stories.ts +0 -185
  284. package/src/components/range/test/range.test.ts +0 -228
  285. package/src/components/scroll-top/ScrollTop.ts +0 -91
  286. package/src/components/scroll-top/leu-scroll-top.ts +0 -11
  287. package/src/components/scroll-top/scroll-top.css +0 -50
  288. package/src/components/scroll-top/stories/scroll-top.stories.ts +0 -217
  289. package/src/components/scroll-top/test/scroll-top.test.ts +0 -22
  290. package/src/components/select/Select.ts +0 -570
  291. package/src/components/select/leu-select.ts +0 -11
  292. package/src/components/select/select.css +0 -222
  293. package/src/components/select/stories/select.stories.ts +0 -173
  294. package/src/components/select/test/fixtures.ts +0 -162
  295. package/src/components/select/test/select.test.ts +0 -937
  296. package/src/components/spinner/Spinner.ts +0 -31
  297. package/src/components/spinner/leu-spinner.ts +0 -11
  298. package/src/components/spinner/spinner.css +0 -20
  299. package/src/components/spinner/stories/spinner.stories.ts +0 -29
  300. package/src/components/spinner/test/spinner.test.ts +0 -30
  301. package/src/components/tab/Tab.ts +0 -72
  302. package/src/components/tab/TabGroup.ts +0 -267
  303. package/src/components/tab/TabPanel.ts +0 -59
  304. package/src/components/tab/leu-tab-group.ts +0 -11
  305. package/src/components/tab/leu-tab-panel.ts +0 -11
  306. package/src/components/tab/leu-tab.ts +0 -11
  307. package/src/components/tab/stories/tab.stories.ts +0 -97
  308. package/src/components/tab/tab-group.css +0 -63
  309. package/src/components/tab/tab-panel.css +0 -10
  310. package/src/components/tab/tab.css +0 -54
  311. package/src/components/tab/test/tab-group.test.ts +0 -426
  312. package/src/components/tab/test/tab-panel.test.ts +0 -102
  313. package/src/components/tab/test/tab.test.ts +0 -139
  314. package/src/components/table/Table.ts +0 -253
  315. package/src/components/table/leu-table.ts +0 -11
  316. package/src/components/table/stories/table.stories.ts +0 -131
  317. package/src/components/table/table.css +0 -112
  318. package/src/components/table/test/table.test.ts +0 -37
  319. package/src/components/tag/Tag.ts +0 -28
  320. package/src/components/tag/leu-tag.ts +0 -11
  321. package/src/components/tag/stories/tag.stories.ts +0 -107
  322. package/src/components/tag/tag.css +0 -42
  323. package/src/components/tag/test/tag.test.ts +0 -28
  324. package/src/components/visually-hidden/VisuallyHidden.ts +0 -16
  325. package/src/components/visually-hidden/leu-visually-hidden.ts +0 -11
  326. package/src/components/visually-hidden/stories/visually-hidden.stories.ts +0 -22
  327. package/src/components/visually-hidden/test/visually-hidden.test.ts +0 -34
  328. package/src/components/visually-hidden/visually-hidden.css +0 -10
  329. package/src/docs/contributing.mdx +0 -154
  330. package/src/docs/installation.mdx +0 -35
  331. package/src/docs/theme.mdx +0 -400
  332. package/src/docs/usage.mdx +0 -73
  333. package/src/global.d.ts +0 -11
  334. package/src/index.ts +0 -29
  335. package/src/lib/LeuElement.ts +0 -43
  336. package/src/lib/a11y.ts +0 -26
  337. package/src/lib/hasSlotController.ts +0 -74
  338. package/src/lib/mixins/FormAssociatedMixin.ts +0 -115
  339. package/src/lib/styleMap.ts +0 -139
  340. package/src/lib/utils.ts +0 -45
  341. package/src/styles/common-styles.css +0 -14
  342. package/src/styles/custom-media.css +0 -6
  343. package/src/styles/font-definitions.json +0 -210
  344. package/src/styles/style.stories.ts +0 -64
  345. package/src/styles/theme.css +0 -90
  346. package/stat_zh.png +0 -0
  347. package/stylelint.config.mjs +0 -23
  348. package/tsconfig.build.json +0 -24
  349. package/tsconfig.json +0 -14
  350. package/tsdown.config.ts +0 -35
  351. package/web-test-runner.config.mjs +0 -102
@@ -1,149 +0,0 @@
1
- import { html, PropertyValues } from "lit"
2
- import { property } from "lit/decorators.js"
3
-
4
- import { LeuElement } from "../../lib/LeuElement.js"
5
-
6
- import { LeuMenuItem } from "./MenuItem.js"
7
-
8
- import styles from "./menu.css?inline"
9
-
10
- /**
11
- * @typedef {'single' | 'multiple' | 'none'} SelectsType
12
- */
13
-
14
- /**
15
- * @tagname leu-menu
16
- * @property {SelectsType} selects - This has only an effect when the role is 'menu'. It defines which role the menu items will get. Default is 'none'.
17
- */
18
- export class LeuMenu extends LeuElement {
19
- static styles = [LeuElement.styles, styles]
20
-
21
- static shadowRootOptions = {
22
- ...LeuElement.shadowRootOptions,
23
- delegatesFocus: true,
24
- }
25
-
26
- @property({ type: String, reflect: true })
27
- selects: "single" | "multiple" | "none" = "none"
28
-
29
- connectedCallback() {
30
- super.connectedCallback()
31
-
32
- if (!this.getAttribute("role")) {
33
- this.setAttribute("role", "menu")
34
- }
35
-
36
- this.addEventListener("keydown", this._handleKeyDown)
37
- }
38
-
39
- disconnectedCallback() {
40
- super.disconnectedCallback()
41
- this.removeEventListener("keydown", this._handleKeyDown)
42
- }
43
-
44
- _handleSlotChange() {
45
- this.setCurrentItem(0)
46
- this._setMenuItemRoles()
47
- }
48
-
49
- _setMenuItemRoles() {
50
- const menuRole = this.getAttribute("role")
51
- let menuItemRole
52
-
53
- if (menuRole === "menu") {
54
- if (this.selects === "multiple") {
55
- menuItemRole = "menuitemcheckbox"
56
- } else if (this.selects === "single") {
57
- menuItemRole = "menuitemradio"
58
- } else {
59
- menuItemRole = "menuitem"
60
- }
61
- } else if (menuRole === "listbox") {
62
- menuItemRole = "option"
63
- }
64
-
65
- if (menuItemRole) {
66
- this.getMenuItems().forEach((menuItem) => {
67
- menuItem.componentRole = menuItemRole
68
- })
69
- }
70
- }
71
-
72
- /**
73
- *
74
- * @returns {import("./MenuItem").LeuMenuItem[]}
75
- */
76
- getMenuItems() {
77
- const slot = this.shadowRoot.querySelector("slot")
78
- return slot
79
- .assignedElements({ flatten: true })
80
- .filter((el) => el instanceof LeuMenuItem)
81
- }
82
-
83
- getVisibleMenuItems() {
84
- return this.getMenuItems().filter((menuItem) => !menuItem.hidden)
85
- }
86
-
87
- _handleKeyDown(event) {
88
- if (["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key)) {
89
- event.preventDefault()
90
-
91
- const menuItems = this.getVisibleMenuItems()
92
- let index = menuItems.findIndex((menuItem) => menuItem.tabbable)
93
-
94
- if (event.key === "ArrowDown") {
95
- index += 1
96
- } else if (event.key === "ArrowUp") {
97
- index -= 1
98
- } else if (event.key === "Home") {
99
- index = 0
100
- } else if (event.key === "End") {
101
- index = menuItems.length - 1
102
- }
103
-
104
- this.focusItem(index)
105
- }
106
- }
107
-
108
- setCurrentItem(index) {
109
- const menuItems = this.getVisibleMenuItems()
110
- let currentItem = null
111
-
112
- const currentItemIndex = (index + menuItems.length) % menuItems.length
113
-
114
- menuItems.forEach((menuItem, i) => {
115
- if (i === currentItemIndex) {
116
- currentItem = menuItem
117
- menuItem.tabbable = true
118
- } else {
119
- menuItem.tabbable = false
120
- }
121
- })
122
-
123
- return currentItem
124
- }
125
-
126
- focusItem(index) {
127
- const currentItem = this.setCurrentItem(index)
128
-
129
- currentItem?.focus()
130
- }
131
-
132
- firstUpdated() {
133
- this.setCurrentItem(0)
134
- }
135
-
136
- updated(changedProperties: PropertyValues<this>) {
137
- if (changedProperties.has("selects")) {
138
- this._setMenuItemRoles()
139
- }
140
- }
141
-
142
- render() {
143
- return html`
144
- <div class="container">
145
- <slot></slot>
146
- </div>
147
- `
148
- }
149
- }
@@ -1,168 +0,0 @@
1
- import { html, nothing, TemplateResult } 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
- import { LeuIcon } from "../icon/Icon.js"
7
-
8
- import styles from "./menu-item.css?inline"
9
-
10
- type MenuItemRole =
11
- | "menuitem"
12
- | "menuitemcheckbox"
13
- | "menuitemradio"
14
- | "option"
15
- | "none"
16
-
17
- /**
18
- * @tagname leu-menu-item
19
- * @slot - The label of the menu item
20
- */
21
- export class LeuMenuItem extends LeuElement {
22
- static dependencies = {
23
- "leu-icon": LeuIcon,
24
- }
25
-
26
- static styles = [LeuElement.styles, styles]
27
-
28
- /**
29
- * @internal
30
- */
31
- static shadowRootOptions = {
32
- ...LeuElement.shadowRootOptions,
33
- delegatesFocus: true,
34
- }
35
-
36
- /** Defines if the item is selected or checked */
37
- @property({ type: Boolean, reflect: true })
38
- active: boolean = false
39
-
40
- /** If the item is part of a multiple selection. Renders a checkmark before the label when active */
41
- @property({ type: Boolean, reflect: true })
42
- multipleSelection: boolean = false
43
-
44
- /** Disables the underlying button or link */
45
- @property({ type: Boolean, reflect: true })
46
- disabled: boolean = false
47
-
48
- /** If the item should be focusable. Will be reflected as `tabindex` to the underlying button or link */
49
- @property({ type: Boolean, reflect: true })
50
- tabbable: boolean
51
-
52
- /** The href of the underlying link */
53
- @property({ type: String, reflect: true })
54
- href: string
55
-
56
- /** The value of the item. It must not contain commas. See `getValue()` */
57
- @property({ type: String, reflect: true })
58
- value: string
59
-
60
- /** The role of the item. This will be reflected as `role` to the underlying button or link. Default is `'menuitem'.` */
61
- @property({ type: String, reflect: true })
62
- componentRole: MenuItemRole = "menuitem"
63
-
64
- connectedCallback() {
65
- super.connectedCallback()
66
- this.addEventListener("click", this._handleClick, true)
67
- }
68
-
69
- disconnectedCallback() {
70
- super.disconnectedCallback()
71
- this.removeEventListener("click", this._handleClick, true)
72
- }
73
-
74
- protected _handleClick(event: MouseEvent) {
75
- if (this.disabled) {
76
- event.stopPropagation()
77
- event.preventDefault()
78
- }
79
- }
80
-
81
- /**
82
- * Returns the value of the item. If `value` is not set, it will return the inner text
83
- */
84
- getValue() {
85
- return this.value || this.textContent.trim()
86
- }
87
-
88
- protected _getAria() {
89
- const commonAttributes = {
90
- disabled: this.disabled,
91
- }
92
-
93
- if (this.href) {
94
- return commonAttributes
95
- }
96
-
97
- return {
98
- ...commonAttributes,
99
- checked:
100
- this.componentRole === "menuitemcheckbox" ||
101
- this.componentRole === "menuitemradio"
102
- ? this.active
103
- : undefined,
104
- selected: this.componentRole === "option" ? this.active : undefined,
105
- role: this.componentRole === "none" ? undefined : this.componentRole,
106
- }
107
- }
108
-
109
- protected _getTabIndex() {
110
- if (typeof this.tabbable === "boolean") {
111
- return this.tabbable ? 0 : -1
112
- }
113
-
114
- return undefined
115
- }
116
-
117
- protected _renderLink(content: TemplateResult) {
118
- const aria = this._getAria()
119
-
120
- return html`<a
121
- class="button"
122
- href=${this.href}
123
- aria-disabled=${ifDefined(aria.disabled)}
124
- aria-checked=${ifDefined(aria.checked)}
125
- aria-selected=${ifDefined(aria.selected)}
126
- role=${ifDefined(aria.role)}
127
- tabindex=${ifDefined(this._getTabIndex())}
128
- >${content}</a
129
- >`
130
- }
131
-
132
- protected _renderButton(content: TemplateResult) {
133
- const aria = this._getAria()
134
-
135
- return html`<button
136
- class="button"
137
- aria-disabled=${ifDefined(aria.disabled)}
138
- aria-checked=${ifDefined(aria.checked)}
139
- aria-selected=${ifDefined(aria.selected)}
140
- role=${ifDefined(aria.role)}
141
- tabindex=${ifDefined(this._getTabIndex())}
142
- >
143
- ${content}
144
- </button>`
145
- }
146
-
147
- _renderBeforeSlotDefault() {
148
- if (!this.multipleSelection) {
149
- return nothing
150
- }
151
-
152
- return this.active
153
- ? html`<leu-icon name="check"></leu-icon>`
154
- : html`<leu-icon></leu-icon>`
155
- }
156
-
157
- render() {
158
- const content = html`
159
- <slot class="before" name="before"
160
- >${this._renderBeforeSlotDefault()}</slot
161
- >
162
- <span class="label"><slot></slot></span>
163
- <slot class="after" name="after"></slot>
164
- `
165
-
166
- return this.href ? this._renderLink(content) : this._renderButton(content)
167
- }
168
- }
@@ -1,11 +0,0 @@
1
- import { LeuMenuItem } from "./MenuItem.js"
2
-
3
- export { LeuMenuItem }
4
-
5
- LeuMenuItem.define("leu-menu-item")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-menu-item": LeuMenuItem
10
- }
11
- }
@@ -1,11 +0,0 @@
1
- import { LeuMenu } from "./Menu.js"
2
-
3
- export { LeuMenu }
4
-
5
- LeuMenu.define("leu-menu")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-menu": LeuMenu
10
- }
11
- }
@@ -1,77 +0,0 @@
1
- :host {
2
- --background: var(--leu-color-black-0);
3
- --background-hover: var(--leu-color-black-10);
4
- --background-active: var(--leu-color-func-cyan);
5
- --background-disabled: var(--leu-color-black-black-0);
6
- --color: var(--leu-color-black-transp-60);
7
- --color-active: var(--leu-color-black-100);
8
- --color-disabled: var(--leu-color-black-transp-20);
9
- --font-regular: var(--leu-font-family-regular);
10
- --font-black: var(--leu-font-family-black);
11
-
12
- font-family: var(--leu-font-family-regular);
13
- }
14
-
15
- .button {
16
- text-decoration: none;
17
- appearance: none;
18
- border: none;
19
- cursor: pointer;
20
-
21
- display: flex;
22
- align-items: center;
23
- gap: 0.5rem;
24
- width: 100%;
25
-
26
- padding: 0.75rem;
27
-
28
- font-family: inherit;
29
- font-size: 1rem;
30
- line-height: 1.5;
31
- text-align: left;
32
-
33
- background: var(--background);
34
- color: var(--color);
35
- }
36
-
37
- .button:focus-visible {
38
- outline: 2px solid var(--leu-color-func-cyan);
39
- outline-offset: 2px;
40
- }
41
-
42
- .button:hover,
43
- .button:focus-visible {
44
- --background: var(--background-hover);
45
- }
46
-
47
- /*
48
- * These colors do not match with the design system (yet).
49
- * But at least they are compliant with the WCAG AA contrast ratio.
50
- */
51
- :host([active]) .button {
52
- --background: var(--background-active);
53
- --color: var(--color-active);
54
- }
55
-
56
- :host([disabled]) .button {
57
- --background: var(--background-disabled);
58
- --color: var(--color-disabled);
59
- cursor: not-allowed;
60
- }
61
-
62
- :is(.before, .after) leu-icon {
63
- display: block;
64
- }
65
-
66
- .label {
67
- flex: 1;
68
- overflow: hidden;
69
- text-overflow: ellipsis;
70
- white-space: nowrap;
71
- }
72
-
73
- .icon-placeholder {
74
- display: block;
75
- width: 1.5rem;
76
- aspect-ratio: 1;
77
- }
@@ -1,19 +0,0 @@
1
- :host {
2
- --menu-divider-color: var(--leu-color-black-transp-20);
3
- }
4
-
5
- /*
6
- * Set styles with important as the hr element is part of the
7
- * light dom and therefore is affected by the global styles.
8
- */
9
- :host ::slotted(hr) {
10
- border: 0 !important;
11
- border-top: 1px solid var(--menu-divider-color) !important;
12
- margin: 0.5rem 0 !important;
13
- padding: 0 !important;
14
- background: none !important;
15
- }
16
-
17
- .container {
18
- background-color: var(--leu-color-black-0);
19
- }
@@ -1,81 +0,0 @@
1
- import { html, nothing } from "lit"
2
- import { ifDefined } from "lit/directives/if-defined.js"
3
-
4
- import "../leu-menu-item.js"
5
- import "../../icon/leu-icon.js"
6
- import { paths as iconPaths } from "../../icon/paths.js"
7
-
8
- function isIcon(name) {
9
- return name === "EMPTY" || Object.keys(iconPaths).includes(name)
10
- }
11
-
12
- export default {
13
- title: "Components/Menu/Item",
14
- component: "leu-menu-item",
15
- args: {
16
- label: "Menu Item",
17
- },
18
- parameters: {
19
- design: {
20
- type: "figma",
21
- url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-82208&mode=design&t=lzVrtq8lxYVJU5TB-11",
22
- },
23
- },
24
- }
25
-
26
- function Template(args) {
27
- return html`
28
- <leu-menu-item
29
- href=${ifDefined(args.href)}
30
- ?active=${args.active}
31
- ?disabled=${args.disabled}
32
- ?multipleSelection=${args.multipleSelection}
33
- >
34
- ${args.before
35
- ? isIcon(args.before)
36
- ? html`<leu-icon slot="before" name=${args.before}></leu-icon>`
37
- : html`<span slot="before">${args.before}</span>`
38
- : nothing}
39
- ${args.label}
40
- ${args.after
41
- ? isIcon(args.after)
42
- ? html`<leu-icon slot="after" name=${args.after}></leu-icon>`
43
- : html`<span slot="after">${args.after}</span>`
44
- : null}
45
- </leu-menu-item>
46
- `
47
- }
48
-
49
- export const Regular = Template.bind({})
50
-
51
- export const Active = Template.bind({})
52
- Active.args = {
53
- active: true,
54
- }
55
-
56
- export const IconBefore = Template.bind({})
57
- IconBefore.args = {
58
- before: "download",
59
- }
60
-
61
- export const IconAfterLink = Template.bind({})
62
- IconAfterLink.args = {
63
- after: "arrowRight",
64
- href: "https://www.zh.ch",
65
- }
66
-
67
- export const IconAndTextLabel = Template.bind({})
68
- IconAndTextLabel.args = {
69
- before: "pin",
70
- after: "CH",
71
- }
72
-
73
- export const IconPlaceholder = Template.bind({})
74
- IconPlaceholder.args = {
75
- before: "EMPTY",
76
- }
77
-
78
- export const MultipleSelection = Template.bind({})
79
- MultipleSelection.args = {
80
- multipleSelection: true,
81
- }
@@ -1,54 +0,0 @@
1
- import { html } from "lit"
2
- import "../leu-menu.js"
3
- import "../leu-menu-item.js"
4
- import "../../icon/leu-icon.js"
5
- import { ifDefined } from "lit/directives/if-defined.js"
6
-
7
- export default {
8
- title: "Components/Menu",
9
- component: "leu-menu",
10
- parameters: {
11
- design: {
12
- type: "figma",
13
- url: "https://www.figma.com/file/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?type=design&node-id=17340-82208&mode=design&t=lzVrtq8lxYVJU5TB-11",
14
- },
15
- },
16
- argTypes: {
17
- selects: {
18
- control: "select",
19
- options: ["single", "multiple"],
20
- },
21
- role: {
22
- control: "select",
23
- options: ["menu", "listbox"],
24
- },
25
- },
26
- }
27
-
28
- function Template(args) {
29
- return html` <leu-menu
30
- role=${ifDefined(args.role)}
31
- selects=${ifDefined(args.selects)}
32
- >
33
- <leu-menu-item
34
- ><leu-icon slot="before"></leu-icon>Menu Item 1</leu-menu-item
35
- >
36
- <leu-menu-item active
37
- ><leu-icon slot="before" name="check"></leu-icon>Menu Item
38
- 2</leu-menu-item
39
- >
40
- <leu-menu-item
41
- ><leu-icon slot="before"></leu-icon>Menu Item 3</leu-menu-item
42
- >
43
- <hr />
44
- <leu-menu-item
45
- ><leu-icon slot="before" name="pin"></leu-icon>Menu Item 3<span
46
- slot="after"
47
- >CH</span
48
- ></leu-menu-item
49
- >
50
- <leu-menu-item>Menu Item 4</leu-menu-item>
51
- </leu-menu>`
52
- }
53
-
54
- export const Menu = Template.bind({})