@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,469 +0,0 @@
1
- import { html, nothing, PropertyValues } from "lit"
2
- import { classMap } from "lit/directives/class-map.js"
3
- import { ifDefined } from "lit/directives/if-defined.js"
4
- import { live } from "lit/directives/live.js"
5
- import { createRef, ref } from "lit/directives/ref.js"
6
- import { property, state } from "lit/decorators.js"
7
-
8
- import { LeuElement } from "../../lib/LeuElement.js"
9
- import { LeuIcon } from "../icon/Icon.js"
10
-
11
- import styles from "./input.css?inline"
12
- import { IconPathName } from "../icon/paths.js"
13
- import { FormAssociatedMixin } from "../../lib/mixins/FormAssociatedMixin.js"
14
-
15
- export const SIZES = Object.freeze({
16
- SMALL: "small",
17
- REGULAR: "regular",
18
- })
19
-
20
- type InputType =
21
- | "date"
22
- | "datetime-local"
23
- | "email"
24
- | "month"
25
- | "number"
26
- | "password"
27
- | "search"
28
- | "tel"
29
- | "text"
30
- | "time"
31
- | "week"
32
-
33
- /**
34
- * TODO:
35
- * - Add section to docs about how to mark up suffix and prefix for screenreaders
36
- * - Handle validation
37
- * - Infotext attribute or slot?
38
- */
39
-
40
- const VALIDATION_MESSAGES = {
41
- badInput: "Bitte überprüfen Sie das Format.",
42
- patternMismatch: "Bitte überprüfen Sie das Format.",
43
- rangeOverflow: (max) => `Der Wert darf nicht grösser als ${max} sein.`,
44
- rangeUnderflow: (min) => `Der Wert darf nicht kleiner als ${min} sein.`,
45
- stepMismatch: "Bitte überprüfen Sie das Format.",
46
- tooLong: (maxlength) =>
47
- `Die Eingabe muss kürzer als ${maxlength} Zeichen sein.`,
48
- tooShort: (minlength) =>
49
- `Die Eingabe muss länger als ${minlength} Zeichen sein.`,
50
- typeMismatch: "Bitte überprüfen Sie das Format.",
51
- valueMissing: "Bitte füllen Sie das Feld aus.",
52
- }
53
-
54
- /**
55
- * A text input element.
56
- *
57
- * @fires {CustomEvent} input - Dispatched when the value of the input element changes.
58
- * @fires {CustomEvent} change - Dispatched when the value of the input element changes and the input element loses focus.
59
- *
60
- * @tagname leu-input
61
- */
62
- export class LeuInput extends FormAssociatedMixin(LeuElement) {
63
- static dependencies = {
64
- "leu-icon": LeuIcon,
65
- }
66
-
67
- static styles = [LeuElement.styles, styles]
68
-
69
- /**
70
- * @internal
71
- */
72
- static shadowRootOptions = {
73
- ...LeuElement.shadowRootOptions,
74
- delegatesFocus: true,
75
- }
76
-
77
- /** Disables the input element. */
78
- @property({ type: Boolean, reflect: true })
79
- disabled: boolean = false
80
-
81
- /** Marks the input element as required */
82
- @property({ type: Boolean, reflect: true })
83
- required: boolean = false
84
-
85
- /** Adds a button to clear the input element */
86
- @property({ type: Boolean, reflect: true })
87
- clearable: boolean = false
88
-
89
- /** A custom error that is completely independent of the validity state. Useful for displaying server side errors. */
90
- @property({ type: String, reflect: true })
91
- error: string = ""
92
-
93
- /** The label of the input element */
94
- @property({ type: String, reflect: true })
95
- label: string = ""
96
-
97
- /** A prefix that relates to the value of the input (e.g. CHF) */
98
- @property({ type: String, reflect: true })
99
- prefix: string
100
-
101
- /** A suffix that relates to the value of the input (e.g. mm). */
102
- @property({ type: String, reflect: true })
103
- suffix: string
104
-
105
- /** The size of the input element */
106
- @property({ type: String, reflect: true })
107
- size: "small" | "regular" = "regular"
108
-
109
- /** The icon that is displayed at the end of the input element */
110
- @property({ type: String, reflect: true })
111
- icon: IconPathName
112
-
113
- /** A regular expression that the value is checked against. */
114
- @property({ type: String, reflect: true })
115
- pattern: string
116
-
117
- /** The type of the input element. */
118
- @property({ type: String, reflect: true })
119
- type: InputType = "text"
120
-
121
- /** The minimum value of the input element. */
122
- @property({ type: Number, reflect: true })
123
- min: number
124
-
125
- /** The maximum value of the input element. */
126
- @property({ type: Number, reflect: true })
127
- max: number
128
-
129
- /** The step value of the input element. */
130
- @property({ type: Number, reflect: true })
131
- step: number
132
-
133
- /** The maximum length of the input element. */
134
- @property({ type: Number, reflect: true })
135
- maxlength: number
136
-
137
- /** The minimum length of the input element. */
138
- @property({ type: Number, reflect: true })
139
- minlength: number
140
-
141
- /** Custom validation messages. The key is the name of the validity state and the value is the message. */
142
- @property({ type: Object })
143
- validationMessages: Record<string, string> = {}
144
-
145
- /** Disables the browser's validation. */
146
- @property({ type: Boolean, reflect: true })
147
- novalidate: boolean = false
148
-
149
- /** The default value of the input element. */
150
- @property({ type: String, reflect: true, attribute: "value" })
151
- defaultValue: string = ""
152
-
153
- protected _value: string
154
-
155
- /** The value of the input element. */
156
- @property({ type: String, attribute: false })
157
- set value(value: string) {
158
- this._value = value
159
- }
160
-
161
- get value(): string {
162
- if (typeof this._value === "string") {
163
- return this._value
164
- }
165
-
166
- return this.defaultValue
167
- }
168
-
169
- @state()
170
- _validity: ValidityState | null = null
171
-
172
- static resolveErrorMessage(message, refernceValue) {
173
- if (typeof message === "function") {
174
- return message(refernceValue)
175
- }
176
-
177
- return message
178
- }
179
-
180
- protected _inputRef = createRef<HTMLInputElement>()
181
-
182
- get valueAsNumber() {
183
- if (this.value === "") {
184
- return NaN
185
- }
186
- return Number(this.value)
187
- }
188
-
189
- formResetCallback() {
190
- this.value = this.defaultValue
191
- }
192
-
193
- protected setFormValue(): void {
194
- this.internals.setFormValue(this.disabled ? null : this.value)
195
- }
196
-
197
- protected willUpdate(changedProperties: PropertyValues<this>): void {
198
- super.willUpdate(changedProperties)
199
- let valueChanged = false
200
-
201
- if (
202
- changedProperties.has("defaultValue") &&
203
- !changedProperties.has("value") &&
204
- !this.hasInteracted
205
- ) {
206
- this.value = this.defaultValue
207
- valueChanged = true
208
- }
209
-
210
- if (
211
- valueChanged ||
212
- changedProperties.has("value") ||
213
- changedProperties.has("name") ||
214
- changedProperties.has("disabled")
215
- ) {
216
- this.setFormValue()
217
- }
218
- }
219
-
220
- /**
221
- * Method for handling the click event of the wrapper element.
222
- * Redirect every click on the wrapper to the input element.
223
- * This is only necessary for click events because the wrapper element
224
- * looks like the input element. But the actual input field does not
225
- * completely fill the wrapper element. Keyboard events don't need to be
226
- * handled because the actual input element is focusable.
227
- */
228
- protected handleWrapperClick(event: MouseEvent | PointerEvent) {
229
- if (event.target === event.currentTarget) {
230
- this._inputRef.value.focus()
231
- }
232
- }
233
-
234
- /**
235
- * Method for handling the blur event of the input element.
236
- * Checks validity of the input element and sets the validity state.
237
- */
238
- protected handleBlur(event: FocusEvent & { target: HTMLInputElement }) {
239
- this._validity = null
240
-
241
- if (!this.novalidate) {
242
- event.target.checkValidity()
243
- }
244
- }
245
-
246
- /**
247
- * Method for handling the invalid event of the input element.
248
- * Sets the validity state.
249
- */
250
- protected handleInvalid(event: Event & { target: HTMLInputElement }) {
251
- this._validity = event.target.validity
252
- }
253
-
254
- /**
255
- * Method for handling the change event of the input element.
256
- * Sets the value property and dispatches a change event so that
257
- * the event can be handled outside the shadow DOM.
258
- * @fires {CustomEvent} change
259
- */
260
- protected handleChange(event: Event & { target: HTMLInputElement }) {
261
- this.hasInteracted = true
262
- if (event.target.validity.valid) {
263
- this.value = event.target.value
264
- }
265
-
266
- const customEvent = new CustomEvent(event.type, event)
267
- this.dispatchEvent(customEvent)
268
- }
269
-
270
- /**
271
- * Method for handling the input event of the input element.
272
- * Sets the value property and dispatches an input event so that
273
- * the event can be handled outside the shadow DOM.
274
- */
275
- protected handleInput(event: Event & { target: HTMLInputElement }) {
276
- this.hasInteracted = true
277
- this.value = event.target.value
278
-
279
- const customEvent = new CustomEvent("input", {
280
- bubbles: true,
281
- composed: true,
282
- })
283
- this.dispatchEvent(customEvent)
284
- }
285
-
286
- /**
287
- * Method for clearing the input element.
288
- * Sets the value property to an empty string and dispatches
289
- * an input and a change event.
290
- * @fires {CustomEvent} input
291
- * @fires {CustomEvent} change
292
- */
293
- protected clear() {
294
- this.value = ""
295
-
296
- this._inputRef.value.focus()
297
-
298
- this.dispatchEvent(
299
- new CustomEvent("input", { bubbles: true, composed: true }),
300
- )
301
- this.dispatchEvent(
302
- new CustomEvent("change", { bubbles: true, composed: true }),
303
- )
304
- }
305
-
306
- /**
307
- * Merge custom and default validation messages.
308
- * A validation message can be a function or a string.
309
- * If it s a function, the function is called with the corresponding
310
- * attribute value as argument.
311
- * e.g.
312
- * `tooLong(this.maxlength)`
313
- * This way the framework user can create reasonable validation messages
314
- */
315
- protected getValidationMessages() {
316
- const validationMessages = {
317
- ...VALIDATION_MESSAGES,
318
- ...this.validationMessages,
319
- }
320
-
321
- const { tooLong, tooShort, rangeOverflow, rangeUnderflow } =
322
- validationMessages
323
-
324
- validationMessages.tooLong = LeuInput.resolveErrorMessage(
325
- tooLong,
326
- this.maxlength,
327
- )
328
- validationMessages.tooShort = LeuInput.resolveErrorMessage(
329
- tooShort,
330
- this.minlength,
331
- )
332
- validationMessages.rangeOverflow = LeuInput.resolveErrorMessage(
333
- rangeOverflow,
334
- this.max,
335
- )
336
- validationMessages.rangeUnderflow = LeuInput.resolveErrorMessage(
337
- rangeUnderflow,
338
- this.min,
339
- )
340
-
341
- return validationMessages
342
- }
343
-
344
- isInvalid() {
345
- if (this.error) {
346
- return true
347
- }
348
-
349
- return this._validity === null || this.novalidate || this.disabled
350
- ? false
351
- : !this._validity.valid
352
- }
353
-
354
- /**
355
- * Check input validation
356
- */
357
- checkValidity() {
358
- return this._inputRef.value?.checkValidity() ?? false
359
- }
360
-
361
- /**
362
- * Creates an error list with an item for the given validity state.
363
- */
364
- protected renderErrorMessages() {
365
- if (!this.isInvalid()) {
366
- return nothing
367
- }
368
-
369
- const validationMessages = this.getValidationMessages()
370
- let errorMessages = this._validity
371
- ? Object.entries(validationMessages)
372
- .filter(([prop]) => this._validity[prop])
373
- .map(([_, message]) => message)
374
- : []
375
-
376
- if (this.error !== "") {
377
- errorMessages = [this.error, errorMessages]
378
- }
379
-
380
- return html`
381
- <ul class="error" aria-errormessage="input">
382
- ${errorMessages.map(
383
- (message) => html`<li class="error-message">${message}</li>`,
384
- )}
385
- </ul>
386
- `
387
- }
388
-
389
- /**
390
- * Determines the content that is displayed after the input element.
391
- * This can be either an icon, a clear button or an error indicator icon.
392
- */
393
- protected renderAfterContent() {
394
- if (this.isInvalid()) {
395
- return html`<div class="error-icon">
396
- <leu-icon name="caution"></leu-icon>
397
- </div>`
398
- }
399
-
400
- if (this.clearable && this.value) {
401
- return html`<button
402
- class="clear-button"
403
- @click=${this.clear}
404
- aria-label="Eingabefeld zurücksetzen"
405
- ?disabled=${this.disabled}
406
- >
407
- <leu-icon name="clear"></leu-icon>
408
- </button>`
409
- }
410
-
411
- if (this.icon) {
412
- return html`<div class="icon">
413
- <leu-icon name=${this.icon}></leu-icon>
414
- </div>`
415
- }
416
-
417
- return nothing
418
- }
419
-
420
- render() {
421
- const isInvalid = this.isInvalid()
422
-
423
- const inputWrapperClasses = {
424
- "input-wrapper": true,
425
- "input-wrapper--empty": !this.value,
426
- "input-wrapper--invalid": isInvalid,
427
- }
428
-
429
- /* See the description of the handleWrapperClick method on why this rule is disabled */
430
- /* eslint-disable lit-a11y/click-events-have-key-events */
431
- return html`
432
- <div
433
- @click=${this.handleWrapperClick}
434
- class=${classMap(inputWrapperClasses)}
435
- >
436
- <input
437
- class="input"
438
- id="input"
439
- type=${this.type}
440
- name=${this.name}
441
- @change=${this.handleChange}
442
- @blur=${this.handleBlur}
443
- @input=${this.handleInput}
444
- @invalid=${this.handleInvalid}
445
- ?disabled=${this.disabled}
446
- ?required=${this.required}
447
- .value=${live(this.value ?? "")}
448
- pattern=${ifDefined(this.pattern)}
449
- min=${ifDefined(this.min)}
450
- max=${ifDefined(this.max)}
451
- maxlength=${ifDefined(this.maxlength)}
452
- minlength=${ifDefined(this.minlength)}
453
- step=${ifDefined(this.step)}
454
- ref=${ref(this._inputRef)}
455
- aria-invalid=${isInvalid}
456
- />
457
- <label for="input" class="label">${this.label}</label>
458
- ${this.prefix
459
- ? html`<div class="prefix" .aria-hidden=${true}>${this.prefix}</div>`
460
- : nothing}
461
- ${this.suffix
462
- ? html`<div class="suffix" .aria-hidden=${true}>${this.suffix}</div>`
463
- : nothing}
464
- ${this.renderAfterContent()}
465
- </div>
466
- ${this.renderErrorMessages()}
467
- `
468
- }
469
- }
@@ -1,238 +0,0 @@
1
- :host {
2
- --input-color: var(--leu-color-black-100);
3
- --input-color-disabled: var(--leu-color-black-20);
4
- --input-color-invalid: var(--leu-color-func-red);
5
- --input-color-focus: var(--leu-color-func-cyan);
6
- --input-border-width: 2px;
7
-
8
- --input-label-color: var(--leu-color-black-100);
9
- --input-label-color-disabled: var(--input-color-disabled);
10
- --input-label-color-empty: var(--leu-color-black-60);
11
-
12
- --input-affix-color: var(--leu-color-black-60);
13
- --input-affix-color-disabled: var(--input-color-disabled);
14
-
15
- --input-border-color: var(--leu-color-black-40);
16
- --input-border-color-focus: var(--input-color-focus);
17
- --input-border-color-disabled: var(--leu-color-black-20);
18
- --input-border-color-invalid: var(--input-color-invalid);
19
-
20
- --input-error-color: var(--leu-color-black-0);
21
-
22
- --input-clear-color: var(--leu-color-black-60);
23
-
24
- --input-font-regular: var(--leu-font-family-regular);
25
- --input-font-black: var(--leu-font-family-black);
26
-
27
- --input-height: 4.5rem;
28
- --input-height-small: 3rem;
29
-
30
- display: block;
31
- font-family: var(--input-font-regular);
32
- }
33
-
34
- :host([disabled]) {
35
- --input-color: var(--input-color-disabled);
36
- --input-border-color: var(--input-border-color-disabled);
37
- --input-label-color: var(--input-color-disabled);
38
- --input-color-focus: var(--input-color-disabled);
39
- --input-affix-color: var(--input-color-disabled);
40
- }
41
-
42
- :host(:focus-within) {
43
- outline: 2px solid var(--input-color-focus);
44
- outline-offset: 2px;
45
- }
46
-
47
- .input-wrapper {
48
- position: relative;
49
- display: flex;
50
- gap: 0.5rem;
51
- padding-inline: 0.875rem;
52
-
53
- border: var(--input-border-width) solid var(--input-border-color);
54
- border-radius: 2px;
55
- background: var(--leu-color-black-0);
56
-
57
- line-height: 1;
58
- }
59
-
60
- .input-wrapper:focus-within,
61
- .input-wrapper:hover {
62
- --input-border-color: var(--input-border-color-focus);
63
- }
64
-
65
- .input-wrapper--invalid,
66
- .input-wrapper--invalid:is(:hover, :focus-within) {
67
- --input-border-color: var(--input-border-color-invalid);
68
- border-radius: 2px 2px 0 0;
69
- }
70
-
71
- .input {
72
- appearance: none;
73
- display: block;
74
- width: 100%;
75
-
76
- font-size: 1rem;
77
- line-height: 1;
78
- color: var(--input-color);
79
-
80
- border: 0;
81
- background: var(--leu-color-black-0);
82
-
83
- padding-block: 2rem 1rem;
84
- height: calc(var(--input-height) - var(--input-border-width) * 2);
85
- }
86
-
87
- .input:focus-visible {
88
- outline: none;
89
- }
90
-
91
- :host([size="small"]) .input {
92
- --input-height: var(--input-height-small);
93
- padding-block: 0.75rem;
94
- }
95
-
96
- .prefix,
97
- .suffix {
98
- padding-block: calc(2rem - var(--input-border-width))
99
- calc(1rem - var(--input-border-width));
100
- font-size: 1rem;
101
- line-height: 1.5;
102
- color: var(--input-affix-color);
103
- pointer-events: none;
104
- }
105
-
106
- .prefix {
107
- order: -1;
108
- }
109
-
110
- /* Label styles for when the input has focus OR contains a value */
111
- .label {
112
- position: absolute;
113
- left: 1rem;
114
-
115
- line-height: 1.5;
116
- color: var(--input-label-color);
117
- }
118
-
119
- /* is size regular AND (has focus OR contains a value) */
120
- .input-wrapper--invalid .label,
121
- :host(:not([size])) .label,
122
- :host([size="regular"]) .label {
123
- top: calc(0.75rem - var(--input-border-width));
124
-
125
- font-size: 0.75rem;
126
- font-family: var(--input-font-black);
127
-
128
- transition: 0.15s ease-out;
129
- transition-property: font-size, top;
130
- }
131
-
132
- /* is size small AND (has focus OR contains a value) */
133
- :host([size="small"]) .label {
134
- opacity: 0;
135
- visibility: hidden;
136
-
137
- font-size: 1rem;
138
- }
139
-
140
- :host([required]) .label::after {
141
- content: "*";
142
- }
143
-
144
- /* is not disabled AND has focus AND is empty */
145
- :host(:not([disabled], :focus-within)) .input-wrapper--empty .label {
146
- --input-label-color: var(--input-label-color-empty);
147
- }
148
-
149
- /* is empty AND has no focus */
150
- :host(:not(:focus-within))
151
- .input-wrapper--empty:not(.input-wrapper--invalid)
152
- .label {
153
- font-family: var(--input-font-regular);
154
- font-size: 1rem;
155
- top: calc(1.5rem - var(--input-border-width));
156
- }
157
-
158
- /* is size small AND has no focus AND is empty */
159
- :host(:not(:focus-within)[size="small"])
160
- .input-wrapper--empty:not(.input-wrapper--invalid)
161
- .label {
162
- top: calc(0.75rem - var(--input-border-width));
163
- opacity: 1;
164
- visibility: visible;
165
- }
166
-
167
- /* The label has to behave a bit different when the input has a suffix or a prefix */
168
- :host(:is([suffix], [prefix]))
169
- .input-wrapper--empty
170
- .input:not(:focus)
171
- + .label {
172
- top: calc(0.75rem - var(--input-border-width));
173
-
174
- font-family: var(--input-font-black);
175
- font-size: 0.75rem;
176
- }
177
-
178
- .error {
179
- list-style: none;
180
- padding: 0.0625rem 1rem 0.1875rem;
181
- margin: 0;
182
-
183
- color: var(--input-error-color);
184
- font-size: 0.75rem;
185
- line-height: 1.5;
186
-
187
- border: 2px solid var(--input-color-invalid);
188
- border-radius: 0 0 2px 2px;
189
-
190
- background-color: var(--input-color-invalid);
191
- }
192
-
193
- .clear-button {
194
- --_length: 1.5rem;
195
-
196
- align-self: center;
197
-
198
- width: var(--_length);
199
- height: var(--_length);
200
- padding: 0;
201
-
202
- cursor: pointer;
203
-
204
- background: none;
205
- color: var(--input-clear-color);
206
- border: none;
207
-
208
- /* border-radius is only defined for a nice focus outline */
209
- border-radius: 2px;
210
- }
211
-
212
- .clear-button:focus-visible {
213
- outline: 2px solid var(--input-color-focus);
214
- outline-offset: 2px;
215
- }
216
-
217
- .clear-button:disabled {
218
- cursor: default;
219
- color: var(--input-color-disabled);
220
- }
221
-
222
- .icon {
223
- align-self: center;
224
- color: var(--input-color);
225
- }
226
-
227
- :host(:not([disabled], :focus-within)) .input-wrapper--empty .icon {
228
- color: var(--input-label-color-empty);
229
- }
230
-
231
- .error-icon {
232
- align-self: center;
233
- color: var(--input-color-invalid);
234
- }
235
-
236
- :is(.icon, .error-icon) leu-icon {
237
- display: block;
238
- }
@@ -1,11 +0,0 @@
1
- import { LeuInput } from "./Input.js"
2
-
3
- export { LeuInput }
4
-
5
- LeuInput.define("leu-input")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-input": LeuInput
10
- }
11
- }