@statistikzh/leu 0.28.0 → 0.28.2

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 (346) hide show
  1. package/dist/{Accordion-D9kLsiBW.js → Accordion-CaDTUDJG.js} +1 -1
  2. package/dist/Accordion.js +2 -2
  3. package/dist/{Button-DyNVOHCd.js → Button-BF3_6xgs.js} +3 -3
  4. package/dist/Button.js +4 -4
  5. package/dist/{ButtonGroup-MEh4vb5a.js → ButtonGroup-grJiWGHI.js} +2 -2
  6. package/dist/ButtonGroup.js +5 -5
  7. package/dist/{ChartWrapper-DAl91BIN.js → ChartWrapper-CeolXijF.js} +2 -2
  8. package/dist/ChartWrapper.js +3 -3
  9. package/dist/{Checkbox-CGGyUW9U.js → Checkbox-DGUZ1XtB.js} +2 -2
  10. package/dist/Checkbox.js +3 -3
  11. package/dist/{CheckboxGroup-DXt5iMdj.js → CheckboxGroup-CGdyk_RP.js} +2 -2
  12. package/dist/CheckboxGroup.js +4 -4
  13. package/dist/{Chip-BGs71WGH.js → Chip-BpKH3_Nk.js} +1 -1
  14. package/dist/Chip.js +2 -2
  15. package/dist/{ChipGroup-BcGyusP-.js → ChipGroup-dSAMpfy1.js} +1 -1
  16. package/dist/ChipGroup.js +3 -3
  17. package/dist/ChipLink.js +2 -2
  18. package/dist/ChipRemovable.js +3 -3
  19. package/dist/ChipSelectable.js +2 -2
  20. package/dist/{Dialog-BzuyL1U3.js → Dialog-CC674l80.js} +2 -2
  21. package/dist/Dialog.js +3 -3
  22. package/dist/{Dropdown-plyBTM15.js → Dropdown-B9YTM5N_.js} +5 -5
  23. package/dist/Dropdown.d.ts +2 -2
  24. package/dist/Dropdown.js +8 -8
  25. package/dist/{FileInput-BT3Fe-0J.js → FileInput-D4kyWFkL.js} +8 -6
  26. package/dist/FileInput.d.ts +1 -1
  27. package/dist/FileInput.js +6 -6
  28. package/dist/{Icon-D83qesg5.js → Icon-DOcb_NlX.js} +1 -1
  29. package/dist/Icon.js +2 -2
  30. package/dist/{Input-D7zS50oz.js → Input-6Xu1N2sA.js} +2 -2
  31. package/dist/Input.js +3 -3
  32. package/dist/{LeuElement-DQI8cqZV.js → LeuElement-C3HedxlQ.js} +1 -1
  33. package/dist/{Menu-DRU1LiMM.js → Menu-CJtyuUvP.js} +2 -2
  34. package/dist/{Menu-Z2b7dsB5.d.ts → Menu-txbYINTW.d.ts} +1 -1
  35. package/dist/Menu.d.ts +1 -1
  36. package/dist/Menu.js +4 -4
  37. package/dist/{MenuItem-LY4TRIho.d.ts → MenuItem-9TTOrL0Z.d.ts} +1 -1
  38. package/dist/{MenuItem-DCttylRO.js → MenuItem-ClSE3auh.js} +2 -2
  39. package/dist/MenuItem.d.ts +1 -1
  40. package/dist/MenuItem.js +3 -3
  41. package/dist/{Message-0NxnKEqw.js → Message-C55ydBaU.js} +2 -2
  42. package/dist/Message.js +3 -3
  43. package/dist/{Pagination-CIy7YvWE.js → Pagination-BVwKLcd5.js} +4 -4
  44. package/dist/Pagination.js +6 -6
  45. package/dist/{Placeholder-Dol_X5Hp.js → Placeholder-DFNppiVf.js} +1 -1
  46. package/dist/Placeholder.js +2 -2
  47. package/dist/{Popup-nJrJHGSy.js → Popup-D91ZiFWh.js} +1 -1
  48. package/dist/Popup.js +2 -2
  49. package/dist/{ProgressBar-Dmq9veqU.js → ProgressBar-DQGO2we8.js} +1 -1
  50. package/dist/ProgressBar.js +2 -2
  51. package/dist/{Radio-W5ck_IJI.js → Radio-BetZNoUQ.js} +1 -1
  52. package/dist/Radio.js +2 -2
  53. package/dist/{RadioGroup-De5x2YCO.js → RadioGroup-DzW5z_SD.js} +2 -2
  54. package/dist/RadioGroup.js +3 -3
  55. package/dist/{Range-NCdfDkeD.js → Range-9ijUzrty.js} +1 -1
  56. package/dist/Range.js +2 -2
  57. package/dist/{ScrollTop-DwcNIKmN.js → ScrollTop-uDL4K_C6.js} +3 -3
  58. package/dist/ScrollTop.js +5 -5
  59. package/dist/{Select-Bpicra9q.js → Select-ClGNTYfp.js} +7 -7
  60. package/dist/Select.d.ts +2 -2
  61. package/dist/Select.js +9 -9
  62. package/dist/{Spinner-BBiVZxFH.js → Spinner-B7ikVfUZ.js} +1 -1
  63. package/dist/Spinner.js +2 -2
  64. package/dist/{Tab-Ce9nrDok.js → Tab-CSHR71IX.js} +1 -1
  65. package/dist/Tab.js +2 -2
  66. package/dist/{TabGroup-C-cd4Wcx.js → TabGroup-D7YbKXm8.js} +3 -3
  67. package/dist/TabGroup.js +4 -4
  68. package/dist/{TabPanel-BW1ydVBT.js → TabPanel-D_RHF3lv.js} +1 -1
  69. package/dist/TabPanel.js +2 -2
  70. package/dist/{Table-DiYqIzBu.js → Table-CdosaNFb.js} +3 -3
  71. package/dist/Table.js +7 -7
  72. package/dist/{Tag-Ct8Hhv7W.js → Tag-BQBgkkAs.js} +1 -1
  73. package/dist/Tag.js +2 -2
  74. package/dist/{VisuallyHidden-CpYXyuC7.js → VisuallyHidden-CEBTA6hv.js} +1 -1
  75. package/dist/VisuallyHidden.js +2 -2
  76. package/dist/custom-elements.json +6445 -0
  77. package/dist/index.d.ts +2 -2
  78. package/dist/index.js +30 -30
  79. package/dist/leu-accordion.js +2 -2
  80. package/dist/leu-button-group.js +5 -5
  81. package/dist/leu-button.js +4 -4
  82. package/dist/leu-chart-wrapper.js +3 -3
  83. package/dist/leu-checkbox-group.js +4 -4
  84. package/dist/leu-checkbox.js +3 -3
  85. package/dist/leu-chip-group.js +3 -3
  86. package/dist/leu-chip-link.js +2 -2
  87. package/dist/leu-chip-removable.js +3 -3
  88. package/dist/leu-chip-selectable.js +2 -2
  89. package/dist/leu-dialog.js +3 -3
  90. package/dist/leu-dropdown.js +8 -8
  91. package/dist/leu-file-input.js +6 -6
  92. package/dist/leu-icon.js +2 -2
  93. package/dist/leu-input.js +3 -3
  94. package/dist/leu-menu-item.d.ts +1 -1
  95. package/dist/leu-menu-item.js +3 -3
  96. package/dist/leu-menu.d.ts +1 -1
  97. package/dist/leu-menu.js +4 -4
  98. package/dist/leu-message.js +3 -3
  99. package/dist/leu-pagination.js +6 -6
  100. package/dist/leu-placeholder.js +2 -2
  101. package/dist/leu-popup.js +2 -2
  102. package/dist/leu-progress-bar.js +2 -2
  103. package/dist/leu-radio-group.js +3 -3
  104. package/dist/leu-radio.js +2 -2
  105. package/dist/leu-range.js +2 -2
  106. package/dist/leu-scroll-top.js +5 -5
  107. package/dist/leu-select.js +9 -9
  108. package/dist/leu-spinner.js +2 -2
  109. package/dist/leu-tab-group.js +4 -4
  110. package/dist/leu-tab-panel.js +2 -2
  111. package/dist/leu-tab.js +2 -2
  112. package/dist/leu-table.js +7 -7
  113. package/dist/leu-tag.js +2 -2
  114. package/dist/leu-visually-hidden.js +2 -2
  115. package/dist/web-types.json +1 -1
  116. package/package.json +9 -4
  117. package/.editorconfig +0 -29
  118. package/.github/workflows/ci.yml +0 -81
  119. package/.github/workflows/deploy-github-pages.yaml +0 -34
  120. package/.github/workflows/publish.yml +0 -30
  121. package/.github/workflows/release-please.yml +0 -19
  122. package/.husky/commit-msg +0 -1
  123. package/.husky/pre-commit +0 -1
  124. package/.nvmrc +0 -1
  125. package/.prettierignore +0 -2
  126. package/.release-please-manifest.json +0 -3
  127. package/.storybook/main.ts +0 -34
  128. package/.storybook/manager-head.html +0 -1
  129. package/.storybook/manager.ts +0 -6
  130. package/.storybook/preview.ts +0 -96
  131. package/.storybook/static/fonts/Inter-Black.woff2 +0 -0
  132. package/.storybook/static/fonts/Inter-Regular.woff2 +0 -0
  133. package/.storybook/static/fonts.css +0 -11
  134. package/.storybook/static/global.css +0 -5
  135. package/.storybook/static/logo.svg +0 -19
  136. package/.storybook/theme.ts +0 -8
  137. package/CHANGELOG.md +0 -594
  138. package/CODE_OF_CONDUCT.md +0 -128
  139. package/CONTRIBUTING.md +0 -42
  140. package/commitlint.config.cjs +0 -1
  141. package/custom-elements-manifest.config.js +0 -46
  142. package/eslint.config.mjs +0 -79
  143. package/postcss.config.cjs +0 -16
  144. package/release-please-config.json +0 -9
  145. package/scripts/generate-component/generate.js +0 -167
  146. package/scripts/generate-component/templates/[Name].ts +0 -31
  147. package/scripts/generate-component/templates/[name].css +0 -6
  148. package/scripts/generate-component/templates/[namespace]-[name].ts +0 -11
  149. package/scripts/generate-component/templates/stories/[name].stories.ts +0 -26
  150. package/scripts/generate-component/templates/test/[name].test.ts +0 -23
  151. package/scripts/postcss-leu-font-styles.cjs +0 -154
  152. package/src/components/accordion/Accordion.ts +0 -108
  153. package/src/components/accordion/accordion.css +0 -150
  154. package/src/components/accordion/leu-accordion.ts +0 -11
  155. package/src/components/accordion/stories/accordion.stories.ts +0 -62
  156. package/src/components/accordion/test/accordion.test.ts +0 -118
  157. package/src/components/button/Button.ts +0 -286
  158. package/src/components/button/button.css +0 -317
  159. package/src/components/button/leu-button.ts +0 -11
  160. package/src/components/button/stories/button.stories.ts +0 -366
  161. package/src/components/button/test/button.test.ts +0 -417
  162. package/src/components/button-group/ButtonGroup.ts +0 -97
  163. package/src/components/button-group/button-group.css +0 -5
  164. package/src/components/button-group/leu-button-group.ts +0 -11
  165. package/src/components/button-group/stories/button-group.stories.ts +0 -54
  166. package/src/components/button-group/test/button-group.test.ts +0 -105
  167. package/src/components/chart-wrapper/ChartWrapper.ts +0 -78
  168. package/src/components/chart-wrapper/chart-wrapper.css +0 -87
  169. package/src/components/chart-wrapper/leu-chart-wrapper.ts +0 -11
  170. package/src/components/chart-wrapper/stories/chart-wrapper.stories.ts +0 -58
  171. package/src/components/chart-wrapper/test/chart-wrapper.test.ts +0 -77
  172. package/src/components/checkbox/Checkbox.ts +0 -129
  173. package/src/components/checkbox/CheckboxGroup.ts +0 -57
  174. package/src/components/checkbox/checkbox-group.css +0 -29
  175. package/src/components/checkbox/checkbox.css +0 -81
  176. package/src/components/checkbox/leu-checkbox-group.ts +0 -11
  177. package/src/components/checkbox/leu-checkbox.ts +0 -11
  178. package/src/components/checkbox/stories/checkbox-group.stories.ts +0 -59
  179. package/src/components/checkbox/stories/checkbox.stories.ts +0 -72
  180. package/src/components/checkbox/test/checkbox-group.test.ts +0 -109
  181. package/src/components/checkbox/test/checkbox.test.ts +0 -247
  182. package/src/components/chip/Chip.ts +0 -19
  183. package/src/components/chip/ChipGroup.ts +0 -122
  184. package/src/components/chip/ChipLink.ts +0 -24
  185. package/src/components/chip/ChipRemovable.ts +0 -45
  186. package/src/components/chip/ChipSelectable.ts +0 -80
  187. package/src/components/chip/chip-group.css +0 -15
  188. package/src/components/chip/chip.css +0 -139
  189. package/src/components/chip/exports.ts +0 -4
  190. package/src/components/chip/leu-chip-group.ts +0 -11
  191. package/src/components/chip/leu-chip-link.ts +0 -11
  192. package/src/components/chip/leu-chip-removable.ts +0 -11
  193. package/src/components/chip/leu-chip-selectable.ts +0 -11
  194. package/src/components/chip/stories/chip-group.stories.ts +0 -159
  195. package/src/components/chip/stories/chip-link.stories.ts +0 -45
  196. package/src/components/chip/stories/chip-removable.stories.ts +0 -42
  197. package/src/components/chip/stories/chip-selectable.stories.ts +0 -54
  198. package/src/components/chip/test/chip-group.test.ts +0 -171
  199. package/src/components/chip/test/chip-link.test.ts +0 -54
  200. package/src/components/chip/test/chip-removable.test.ts +0 -105
  201. package/src/components/chip/test/chip-selectable.test.ts +0 -101
  202. package/src/components/chip/test/chip.test.ts +0 -22
  203. package/src/components/dialog/Dialog.ts +0 -86
  204. package/src/components/dialog/dialog.css +0 -157
  205. package/src/components/dialog/leu-dialog.ts +0 -11
  206. package/src/components/dialog/stories/dialog.stories.ts +0 -142
  207. package/src/components/dialog/test/dialog.test.ts +0 -85
  208. package/src/components/dropdown/Dropdown.ts +0 -152
  209. package/src/components/dropdown/dropdown.css +0 -16
  210. package/src/components/dropdown/leu-dropdown.ts +0 -11
  211. package/src/components/dropdown/stories/dropdown.stories.ts +0 -58
  212. package/src/components/dropdown/test/dropdown.test.ts +0 -59
  213. package/src/components/file-input/FileInput.ts +0 -322
  214. package/src/components/file-input/file-input.css +0 -118
  215. package/src/components/file-input/leu-file-input.ts +0 -11
  216. package/src/components/file-input/stories/file-input.stories.ts +0 -45
  217. package/src/components/file-input/test/file-input.test.ts +0 -38
  218. package/src/components/icon/Icon.ts +0 -47
  219. package/src/components/icon/icon.css +0 -10
  220. package/src/components/icon/leu-icon.ts +0 -11
  221. package/src/components/icon/paths.ts +0 -219
  222. package/src/components/icon/stories/icon.stories.ts +0 -79
  223. package/src/components/icon/test/icon.test.ts +0 -50
  224. package/src/components/input/Input.ts +0 -469
  225. package/src/components/input/input.css +0 -238
  226. package/src/components/input/leu-input.ts +0 -11
  227. package/src/components/input/stories/input.stories.ts +0 -204
  228. package/src/components/input/test/input.test.ts +0 -603
  229. package/src/components/menu/Menu.ts +0 -149
  230. package/src/components/menu/MenuItem.ts +0 -168
  231. package/src/components/menu/leu-menu-item.ts +0 -11
  232. package/src/components/menu/leu-menu.ts +0 -11
  233. package/src/components/menu/menu-item.css +0 -77
  234. package/src/components/menu/menu.css +0 -19
  235. package/src/components/menu/stories/menu-item.stories.ts +0 -81
  236. package/src/components/menu/stories/menu.stories.ts +0 -54
  237. package/src/components/menu/test/menu-item.test.ts +0 -210
  238. package/src/components/menu/test/menu.test.ts +0 -125
  239. package/src/components/message/Message.ts +0 -118
  240. package/src/components/message/leu-message.ts +0 -11
  241. package/src/components/message/message.css +0 -163
  242. package/src/components/message/stories/message.mdx +0 -76
  243. package/src/components/message/stories/message.stories.ts +0 -149
  244. package/src/components/message/test/message.test.ts +0 -96
  245. package/src/components/pagination/Pagination.ts +0 -192
  246. package/src/components/pagination/leu-pagination.ts +0 -11
  247. package/src/components/pagination/pagination.css +0 -54
  248. package/src/components/pagination/stories/pagination.stories.ts +0 -115
  249. package/src/components/pagination/test/pagination.test.ts +0 -210
  250. package/src/components/placeholder/Placeholder.ts +0 -33
  251. package/src/components/placeholder/leu-placeholder.ts +0 -11
  252. package/src/components/placeholder/placeholder.css +0 -59
  253. package/src/components/placeholder/stories/placeholder.stories.ts +0 -34
  254. package/src/components/placeholder/test/placeholder.test.ts +0 -31
  255. package/src/components/popup/Popup.ts +0 -264
  256. package/src/components/popup/leu-popup.ts +0 -11
  257. package/src/components/popup/popup.css +0 -24
  258. package/src/components/popup/stories/popup.stories.ts +0 -117
  259. package/src/components/popup/test/popup.test.ts +0 -90
  260. package/src/components/progress-bar/ProgressBar.ts +0 -52
  261. package/src/components/progress-bar/leu-progress-bar.ts +0 -11
  262. package/src/components/progress-bar/progress-bar.css +0 -97
  263. package/src/components/progress-bar/stories/progress-bar.stories.ts +0 -39
  264. package/src/components/progress-bar/test/progress-bar.test.ts +0 -61
  265. package/src/components/radio/Radio.ts +0 -59
  266. package/src/components/radio/RadioGroup.ts +0 -181
  267. package/src/components/radio/leu-radio-group.ts +0 -11
  268. package/src/components/radio/leu-radio.ts +0 -11
  269. package/src/components/radio/radio-group.css +0 -29
  270. package/src/components/radio/radio.css +0 -76
  271. package/src/components/radio/stories/radio-group.stories.ts +0 -54
  272. package/src/components/radio/stories/radio.stories.ts +0 -55
  273. package/src/components/radio/test/radio-group.test.ts +0 -83
  274. package/src/components/radio/test/radio.test.ts +0 -119
  275. package/src/components/range/Range.ts +0 -400
  276. package/src/components/range/leu-range.ts +0 -11
  277. package/src/components/range/range.css +0 -227
  278. package/src/components/range/stories/range.stories.ts +0 -185
  279. package/src/components/range/test/range.test.ts +0 -228
  280. package/src/components/scroll-top/ScrollTop.ts +0 -91
  281. package/src/components/scroll-top/leu-scroll-top.ts +0 -11
  282. package/src/components/scroll-top/scroll-top.css +0 -50
  283. package/src/components/scroll-top/stories/scroll-top.stories.ts +0 -217
  284. package/src/components/scroll-top/test/scroll-top.test.ts +0 -22
  285. package/src/components/select/Select.ts +0 -570
  286. package/src/components/select/leu-select.ts +0 -11
  287. package/src/components/select/select.css +0 -222
  288. package/src/components/select/stories/select.stories.ts +0 -173
  289. package/src/components/select/test/fixtures.ts +0 -162
  290. package/src/components/select/test/select.test.ts +0 -937
  291. package/src/components/spinner/Spinner.ts +0 -31
  292. package/src/components/spinner/leu-spinner.ts +0 -11
  293. package/src/components/spinner/spinner.css +0 -20
  294. package/src/components/spinner/stories/spinner.stories.ts +0 -29
  295. package/src/components/spinner/test/spinner.test.ts +0 -30
  296. package/src/components/tab/Tab.ts +0 -72
  297. package/src/components/tab/TabGroup.ts +0 -267
  298. package/src/components/tab/TabPanel.ts +0 -59
  299. package/src/components/tab/leu-tab-group.ts +0 -11
  300. package/src/components/tab/leu-tab-panel.ts +0 -11
  301. package/src/components/tab/leu-tab.ts +0 -11
  302. package/src/components/tab/stories/tab.stories.ts +0 -97
  303. package/src/components/tab/tab-group.css +0 -63
  304. package/src/components/tab/tab-panel.css +0 -10
  305. package/src/components/tab/tab.css +0 -54
  306. package/src/components/tab/test/tab-group.test.ts +0 -426
  307. package/src/components/tab/test/tab-panel.test.ts +0 -102
  308. package/src/components/tab/test/tab.test.ts +0 -139
  309. package/src/components/table/Table.ts +0 -253
  310. package/src/components/table/leu-table.ts +0 -11
  311. package/src/components/table/stories/table.stories.ts +0 -131
  312. package/src/components/table/table.css +0 -112
  313. package/src/components/table/test/table.test.ts +0 -37
  314. package/src/components/tag/Tag.ts +0 -28
  315. package/src/components/tag/leu-tag.ts +0 -11
  316. package/src/components/tag/stories/tag.stories.ts +0 -107
  317. package/src/components/tag/tag.css +0 -42
  318. package/src/components/tag/test/tag.test.ts +0 -28
  319. package/src/components/visually-hidden/VisuallyHidden.ts +0 -16
  320. package/src/components/visually-hidden/leu-visually-hidden.ts +0 -11
  321. package/src/components/visually-hidden/stories/visually-hidden.stories.ts +0 -22
  322. package/src/components/visually-hidden/test/visually-hidden.test.ts +0 -34
  323. package/src/components/visually-hidden/visually-hidden.css +0 -10
  324. package/src/docs/contributing.mdx +0 -154
  325. package/src/docs/installation.mdx +0 -35
  326. package/src/docs/theme.mdx +0 -400
  327. package/src/docs/usage.mdx +0 -73
  328. package/src/global.d.ts +0 -11
  329. package/src/index.ts +0 -29
  330. package/src/lib/LeuElement.ts +0 -43
  331. package/src/lib/a11y.ts +0 -26
  332. package/src/lib/hasSlotController.ts +0 -74
  333. package/src/lib/mixins/FormAssociatedMixin.ts +0 -115
  334. package/src/lib/styleMap.ts +0 -139
  335. package/src/lib/utils.ts +0 -45
  336. package/src/styles/common-styles.css +0 -14
  337. package/src/styles/custom-media.css +0 -6
  338. package/src/styles/font-definitions.json +0 -210
  339. package/src/styles/style.stories.ts +0 -64
  340. package/src/styles/theme.css +0 -90
  341. package/stat_zh.png +0 -0
  342. package/stylelint.config.mjs +0 -23
  343. package/tsconfig.build.json +0 -24
  344. package/tsconfig.json +0 -14
  345. package/tsdown.config.ts +0 -35
  346. 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
- }