@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,570 +0,0 @@
1
- import { html, nothing, PropertyValues } from "lit"
2
- import { classMap } from "lit/directives/class-map.js"
3
- import { createRef, ref } from "lit/directives/ref.js"
4
- import { property, state } from "lit/decorators.js"
5
-
6
- import { ifDefined } from "lit/directives/if-defined.js"
7
- import { LeuElement } from "../../lib/LeuElement.js"
8
- import { HasSlotController } from "../../lib/hasSlotController.js"
9
- import { FormAssociatedMixin } from "../../lib/mixins/FormAssociatedMixin.js"
10
-
11
- import { LeuButton } from "../button/Button.js"
12
- import { LeuMenu } from "../menu/Menu.js"
13
- import { LeuMenuItem } from "../menu/MenuItem.js"
14
- import { LeuIcon } from "../icon/Icon.js"
15
- import { LeuInput } from "../input/Input.js"
16
- import { LeuPopup } from "../popup/Popup.js"
17
-
18
- import styles from "./select.css?inline"
19
-
20
- /**
21
- * @tagname leu-select
22
- * @slot before - Optional content the appears before the option list
23
- * @slot after - Optional content the appears after the option list
24
- * @attribute {string} value - The selected values separated by commas.
25
- */
26
- export class LeuSelect extends FormAssociatedMixin(LeuElement) {
27
- static dependencies = {
28
- "leu-button": LeuButton,
29
- "leu-menu": LeuMenu,
30
- "leu-menu-item": LeuMenuItem,
31
- "leu-icon": LeuIcon,
32
- "leu-input": LeuInput,
33
- "leu-popup": LeuPopup,
34
- }
35
-
36
- static styles = [LeuElement.styles, styles]
37
-
38
- /**
39
- * @internal
40
- */
41
- static shadowRootOptions = {
42
- ...LeuElement.shadowRootOptions,
43
- delegatesFocus: true,
44
- }
45
-
46
- /**
47
- * The label of the select
48
- */
49
- @property({ type: String, reflect: true })
50
- label: string = ""
51
-
52
- /**
53
- * The default value of the select. Corresponds to the `value` HTML attribute.
54
- */
55
- @property({
56
- reflect: true,
57
- attribute: "value",
58
- converter: {
59
- fromAttribute(value) {
60
- if (value) {
61
- return value.split(",").map((v) => v.trim())
62
- }
63
- return []
64
- },
65
- toAttribute(value: Array<string>) {
66
- return value.length > 0 ? value.join(",") : null
67
- },
68
- },
69
- })
70
- defaultValue: Array<string> = []
71
-
72
- /** @internal */
73
- protected _value: Array<string> | undefined
74
-
75
- /**
76
- * List of selected values. If they're set from outside the component, the select element
77
- * finds all the options that match the given values and selects them.
78
- */
79
- @property({ type: Array, attribute: false })
80
- set value(value: Array<string>) {
81
- /**
82
- * @todo Check if all of the value items are actually present in the options
83
- */
84
- this._value = value
85
- }
86
-
87
- get value(): Array<string> {
88
- return this._value ?? this.defaultValue
89
- }
90
-
91
- /**
92
- * Show a clearable button to reset the value
93
- */
94
- @property({ type: Boolean, reflect: true })
95
- clearable: boolean = false
96
-
97
- /**
98
- * Show an input field to filter the options inside the popup
99
- */
100
- @property({ type: Boolean, reflect: true })
101
- filterable: boolean = false
102
-
103
- /**
104
- * Allow multiple selections
105
- */
106
- @property({ type: Boolean, reflect: true })
107
- multiple: boolean = false
108
-
109
- /** Marks the input element as required */
110
- @property({ type: Boolean, reflect: true })
111
- required: boolean = false
112
-
113
- /**
114
- * The expanded state of the popup
115
- */
116
- @state()
117
- protected open: boolean = false
118
-
119
- @state()
120
- protected _optionFilter: string = ""
121
-
122
- @state()
123
- protected _hasFilterResults: boolean = true
124
-
125
- @state()
126
- protected _displayValue: string = ""
127
-
128
- static getOptionLabel(option) {
129
- if (typeof option === "object" && option !== null) {
130
- return option.label
131
- }
132
- return option
133
- }
134
-
135
- /** @internal */
136
- protected _deferedChangeEvent = false
137
-
138
- /** @internal */
139
- protected _optionFilterRef = createRef<LeuInput>()
140
-
141
- /** @internal */
142
- protected _toggleButtonRef = createRef<HTMLButtonElement>()
143
-
144
- /** @internal */
145
- protected _menuRef = createRef<LeuMenu>()
146
-
147
- /**
148
- * @internal
149
- */
150
- hasSlotController = new HasSlotController(this, ["before", "after"])
151
-
152
- protected setFormValue(): void {
153
- const isEmpty = this.value.length === 0 || !this.value.some((v) => v !== "") // At least one value is not an empty string
154
-
155
- if (isEmpty || this.disabled) {
156
- this.internals.setFormValue(null)
157
- } else if (this.multiple) {
158
- const formData = new FormData()
159
- this.value.forEach((v) => formData.append(this.name ?? "", v))
160
- this.internals.setFormValue(formData)
161
- } else {
162
- this.internals.setFormValue(this.value[0])
163
- }
164
-
165
- if (this.required && isEmpty) {
166
- this.internals.setValidity(
167
- { valueMissing: true },
168
- "Bitte wählen Sie eine Option aus.",
169
- )
170
- } else {
171
- this.internals.setValidity({})
172
- }
173
- }
174
-
175
- public formResetCallback() {
176
- super.formResetCallback()
177
- this.value = this.defaultValue
178
- this._displayValue = ""
179
- }
180
-
181
- protected willUpdate(changedProperties: PropertyValues<this>) {
182
- super.willUpdate(changedProperties)
183
-
184
- if (
185
- changedProperties.has("defaultValue") &&
186
- !changedProperties.has("value") &&
187
- !this.hasInteracted
188
- ) {
189
- this.value = this.defaultValue
190
- }
191
-
192
- if (
193
- changedProperties.has("value") ||
194
- changedProperties.has("defaultValue") ||
195
- changedProperties.has("name") ||
196
- changedProperties.has("disabled") ||
197
- changedProperties.has("required")
198
- ) {
199
- this.setFormValue()
200
- }
201
- }
202
-
203
- connectedCallback() {
204
- super.connectedCallback()
205
- document.addEventListener("click", this._handleDocumentClick)
206
- }
207
-
208
- disconnectedCallback() {
209
- super.disconnectedCallback()
210
- document.removeEventListener("click", this._handleDocumentClick)
211
- }
212
-
213
- updated(changedProperties: PropertyValues<this>) {
214
- if (changedProperties.has("open") && this.open) {
215
- if (this.filterable) {
216
- this._optionFilterRef.value.focus()
217
- } else {
218
- this._menuRef.value.focusItem(0)
219
- }
220
- } else if (changedProperties.has("open") && !this.open) {
221
- // TODO: Check if the ref is guaranteed to be set
222
- // in the updated method.
223
- // According to the lit documentation, a ref callback
224
- // CAN be called with undefined.
225
- this._toggleButtonRef.value?.focus()
226
- }
227
-
228
- if (
229
- changedProperties.has("value") ||
230
- changedProperties.has("_optionFilter") ||
231
- changedProperties.has("multiple")
232
- ) {
233
- this._updateMenuItems({
234
- value: changedProperties.has("value"),
235
- optionFilter: changedProperties.has("_optionFilter"),
236
- multiple: changedProperties.has("multiple"),
237
- })
238
- }
239
- }
240
-
241
- public click() {
242
- this._toggleButtonRef.value?.click()
243
- }
244
-
245
- /**
246
- * Apply the current state to the menu items.
247
- * - Set the active property when the value property has changed.
248
- * - Hide menu items that do not match the filter.
249
- */
250
- async _updateMenuItems(changed) {
251
- const menu = this._menuRef.value
252
-
253
- await menu.updateComplete
254
-
255
- const menuItems = menu.getMenuItems()
256
- let hasFilterResults = false
257
-
258
- if (changed.value && this.value.length === 0) {
259
- this._displayValue = ""
260
- }
261
-
262
- menuItems.forEach((menuItem) => {
263
- if (changed.multiple) {
264
- menuItem.multipleSelection = this.multiple
265
- }
266
-
267
- if (changed.optionFilter) {
268
- menuItem.hidden =
269
- this._optionFilter !== "" &&
270
- !menuItem.textContent
271
- .toLowerCase()
272
- .includes(this._optionFilter.toLowerCase())
273
-
274
- hasFilterResults = hasFilterResults || !menuItem.hidden
275
- }
276
-
277
- if (changed.value) {
278
- menuItem.active = this._isSelected(menuItem.getValue())
279
-
280
- if (!this.multiple && menuItem.active) {
281
- this._displayValue = menuItem.textContent
282
- }
283
- }
284
- })
285
-
286
- if (changed.optionFilter) {
287
- this._hasFilterResults = hasFilterResults
288
- menu.setCurrentItem(0)
289
- }
290
- }
291
-
292
- /**
293
- * Update all the menu items when the slot changes
294
- * to make sure that the menu items are in sync
295
- * with the state of the component.
296
- * @internal
297
- */
298
- _handleItemSlotChange() {
299
- this._updateMenuItems({
300
- value: true,
301
- optionFilter: true,
302
- multiple: true,
303
- })
304
- }
305
-
306
- /**
307
- * Handles clicks outside of the component to close the dropdown.
308
- * @internal
309
- */
310
- _handleDocumentClick = (event: MouseEvent) => {
311
- if (!event.composedPath().includes(this) && this.open) {
312
- this._closeDropdown()
313
- }
314
- }
315
-
316
- /**
317
- * @internal
318
- */
319
- _handleKeyDown = (event: KeyboardEvent) => {
320
- if (event.key === "Escape") {
321
- this._closeDropdown()
322
- }
323
- }
324
-
325
- /**
326
- * @internal
327
- */
328
- async _handleToggleKeyDown(event: KeyboardEvent) {
329
- if (["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key)) {
330
- event.preventDefault()
331
-
332
- const menu = this._menuRef.value
333
-
334
- this.open = true
335
- await this.updateComplete
336
-
337
- if (event.key === "ArrowDown" || event.key === "Home") {
338
- menu.focusItem(0)
339
- } else if (event.key === "ArrowUp" || event.key === "End") {
340
- menu.focusItem(-1)
341
- }
342
- }
343
- }
344
-
345
- /**
346
- * @internal
347
- */
348
- _handleFilterInputKeyDown(event: KeyboardEvent) {
349
- if (event.key === "ArrowDown") {
350
- this._menuRef.value.focusItem(0)
351
- } else if (event.key === "ArrowUp") {
352
- this._menuRef.value.focusItem(-1)
353
- }
354
- }
355
-
356
- /**
357
- * Determines the value or label that should be displayed inside the toggle button.
358
- */
359
- _getDisplayValue() {
360
- if (this.multiple) {
361
- return this.value.length === 0 ? `` : `${this.value.length} gewählt`
362
- }
363
-
364
- return this._displayValue ?? nothing
365
- }
366
-
367
- _emitInputEvent() {
368
- const inputevent = new CustomEvent("input", {
369
- composed: true,
370
- bubbles: true,
371
- })
372
- this.dispatchEvent(inputevent)
373
- }
374
-
375
- _emitChangeEvent() {
376
- const changeevent = new CustomEvent("change", {
377
- composed: true,
378
- bubbles: true,
379
- })
380
- this.dispatchEvent(changeevent)
381
- }
382
-
383
- _clearValue(event: MouseEvent) {
384
- if (!this.disabled) {
385
- event.stopPropagation()
386
- this.hasInteracted = true
387
- this.value = []
388
- }
389
-
390
- this._emitInputEvent()
391
- this._emitChangeEvent()
392
- }
393
-
394
- _toggleDropdown() {
395
- if (!this.disabled) {
396
- this.open = !this.open
397
- }
398
- }
399
-
400
- _closeDropdown() {
401
- this.open = false
402
-
403
- if (this._deferedChangeEvent) {
404
- this._emitChangeEvent()
405
- this._deferedChangeEvent = false
406
- }
407
- }
408
-
409
- _handleFilterInput(event: InputEvent) {
410
- this._optionFilter = (event.target as HTMLInputElement).value
411
- }
412
-
413
- /**
414
- * Checks if the given value is selected.
415
- */
416
- _isSelected(menuItemValue: string) {
417
- return this.value.includes(menuItemValue)
418
- }
419
-
420
- _handleMenuItemClick(event: MouseEvent) {
421
- if (!(event.target instanceof LeuMenuItem) || event.target.disabled) {
422
- return
423
- }
424
-
425
- const menuItem = event.target
426
-
427
- const value = menuItem.getValue()
428
- const isSelected = this._isSelected(value)
429
-
430
- this.hasInteracted = true
431
-
432
- if (this.multiple) {
433
- this.value = isSelected
434
- ? this.value.filter((v) => v !== value)
435
- : this.value.concat(value)
436
-
437
- this._deferedChangeEvent = true
438
- } else if (this.clearable || !isSelected) {
439
- // Only clear if clearable is true or if the value is not selected.
440
- this.value = isSelected ? [] : [value]
441
- this._displayValue = isSelected ? "" : menuItem.textContent
442
- }
443
-
444
- this._emitInputEvent()
445
-
446
- if (!this.multiple) {
447
- this._closeDropdown()
448
- }
449
- }
450
-
451
- _renderFilterInput() {
452
- if (this.filterable) {
453
- return html` <leu-input
454
- class="select-search"
455
- size="small"
456
- @input=${this._handleFilterInput}
457
- @keydown=${this._handleFilterInputKeyDown}
458
- clearable
459
- ref=${ref(this._optionFilterRef)}
460
- label="Nach Stichwort filtern"
461
- ></leu-input>`
462
- }
463
-
464
- return nothing
465
- }
466
-
467
- _renderApplyButton() {
468
- if (this.multiple) {
469
- return html`
470
- <div class="apply-button-wrapper">
471
- <leu-button
472
- type="button"
473
- class="apply-button"
474
- @click=${this._closeDropdown}
475
- >Anwenden</leu-button
476
- >
477
- </div>
478
- `
479
- }
480
-
481
- return nothing
482
- }
483
-
484
- _renderToggleButton() {
485
- const toggleClasses = {
486
- "select-toggle": true,
487
- open: this.open,
488
- filled: this.value.length !== 0 && this.value !== null,
489
- labeled: this.label !== "",
490
- }
491
-
492
- return html`<button
493
- ${ref(this._toggleButtonRef)}
494
- type="button"
495
- class=${classMap(toggleClasses)}
496
- @click=${this._toggleDropdown}
497
- @keydown=${this._handleToggleKeyDown}
498
- ?disabled=${this.disabled}
499
- aria-controls="select-popup"
500
- aria-expanded="${this.open}"
501
- aria-labelledby="select-label"
502
- role="combobox"
503
- slot="anchor"
504
- >
505
- <span class="label" id="select-label">${this.label}</span>
506
- <span class="value"> ${this._getDisplayValue()} </span>
507
- <span class="arrow-icon">
508
- <leu-icon name="angleDropDown"></leu-icon>
509
- </span>
510
- ${this.clearable && this.value.length !== 0
511
- ? html`<button
512
- type="button"
513
- class="clear-button"
514
- @click=${this._clearValue}
515
- aria-label=${`${this.label} zurücksetzen`}
516
- ?disabled=${this.disabled}
517
- >
518
- <leu-icon name="clear"></leu-icon>
519
- </button>`
520
- : nothing}
521
- </button>`
522
- }
523
-
524
- render() {
525
- const selectClasses = {
526
- select: true,
527
- "select--has-before": this.hasSlotController.test("before"),
528
- "select--has-after": this.hasSlotController.test("after"),
529
- }
530
-
531
- return html`<div
532
- class=${classMap(selectClasses)}
533
- @keydown=${this._handleKeyDown}
534
- >
535
- <leu-popup
536
- ?active=${this.open}
537
- placement="bottom-start"
538
- flip
539
- matchSize="width"
540
- autoSize="height"
541
- autoSizePadding="8"
542
- >
543
- ${this._renderToggleButton()}
544
- <div id="select-popup" class="select-menu-container">
545
- <slot name="before" class="before"></slot>
546
- ${this._renderFilterInput()}
547
- <leu-menu
548
- ref=${ref(this._menuRef)}
549
- role="listbox"
550
- aria-multiselectable=${ifDefined(
551
- this.multiple ? "true" : undefined,
552
- )}
553
- class="menu"
554
- @click=${this._handleMenuItemClick}
555
- aria-labelledby="select-label"
556
- >
557
- <slot @slotchange=${this._handleItemSlotChange}> </slot>
558
- </leu-menu>
559
- ${this._hasFilterResults || this._optionFilter === ""
560
- ? nothing
561
- : html` <p class="filter-message-empty" aria-live="polite">
562
- Keine Resultate
563
- </p>`}
564
- ${this._renderApplyButton()}
565
- <slot name="after" class="after"></slot>
566
- </div>
567
- </leu-popup>
568
- </div>`
569
- }
570
- }
@@ -1,11 +0,0 @@
1
- import { LeuSelect } from "./Select.js"
2
-
3
- export { LeuSelect }
4
-
5
- LeuSelect.define("leu-select")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-select": LeuSelect
10
- }
11
- }