@statistikzh/leu 0.28.1 → 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 (348) hide show
  1. package/dist/{Accordion-CwkI7sfx.js → Accordion-CaDTUDJG.js} +1 -1
  2. package/dist/Accordion.js +2 -2
  3. package/dist/{Button-D1aYnunQ.js → Button-BF3_6xgs.js} +3 -3
  4. package/dist/Button.js +4 -4
  5. package/dist/{ButtonGroup-CqThYjzX.js → ButtonGroup-grJiWGHI.js} +2 -2
  6. package/dist/ButtonGroup.js +5 -5
  7. package/dist/{ChartWrapper-BjVT4x-H.js → ChartWrapper-CeolXijF.js} +2 -2
  8. package/dist/ChartWrapper.js +3 -3
  9. package/dist/{Checkbox-HxYqp2w4.js → Checkbox-DGUZ1XtB.js} +2 -2
  10. package/dist/Checkbox.js +3 -3
  11. package/dist/{CheckboxGroup-DYws2rwt.js → CheckboxGroup-CGdyk_RP.js} +2 -2
  12. package/dist/CheckboxGroup.js +4 -4
  13. package/dist/{Chip-gKxD6IaZ.js → Chip-BpKH3_Nk.js} +1 -1
  14. package/dist/Chip.js +2 -2
  15. package/dist/{ChipGroup-ZvBzX_wd.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-BYpzTprV.js → Dialog-CC674l80.js} +2 -2
  21. package/dist/Dialog.js +3 -3
  22. package/dist/{Dropdown-C4CgE4E-.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-nsnSQCaU.js → FileInput-D4kyWFkL.js} +4 -4
  26. package/dist/FileInput.js +6 -6
  27. package/dist/{Icon-D8HTPEFH.js → Icon-DOcb_NlX.js} +1 -1
  28. package/dist/Icon.js +2 -2
  29. package/dist/{Input-OrILqlax.js → Input-6Xu1N2sA.js} +2 -2
  30. package/dist/Input.js +3 -3
  31. package/dist/{LeuElement-C_lcHzQI.js → LeuElement-C3HedxlQ.js} +1 -1
  32. package/dist/{Menu-CFLCnI34.js → Menu-CJtyuUvP.js} +2 -2
  33. package/dist/{Menu-Z2b7dsB5.d.ts → Menu-txbYINTW.d.ts} +1 -1
  34. package/dist/Menu.d.ts +1 -1
  35. package/dist/Menu.js +4 -4
  36. package/dist/{MenuItem-LY4TRIho.d.ts → MenuItem-9TTOrL0Z.d.ts} +1 -1
  37. package/dist/{MenuItem-ICjLCGim.js → MenuItem-ClSE3auh.js} +2 -2
  38. package/dist/MenuItem.d.ts +1 -1
  39. package/dist/MenuItem.js +3 -3
  40. package/dist/{Message-Dw5D_0i1.js → Message-C55ydBaU.js} +2 -2
  41. package/dist/Message.js +3 -3
  42. package/dist/{Pagination-D1tP5FrM.js → Pagination-BVwKLcd5.js} +4 -4
  43. package/dist/Pagination.js +6 -6
  44. package/dist/{Placeholder-CnGzCZ5-.js → Placeholder-DFNppiVf.js} +1 -1
  45. package/dist/Placeholder.js +2 -2
  46. package/dist/{Popup-BiN_tZDN.js → Popup-D91ZiFWh.js} +1 -1
  47. package/dist/Popup.js +2 -2
  48. package/dist/{ProgressBar-BfJo_KyU.js → ProgressBar-DQGO2we8.js} +1 -1
  49. package/dist/ProgressBar.js +2 -2
  50. package/dist/{Radio-CV7vuQUj.js → Radio-BetZNoUQ.js} +1 -1
  51. package/dist/Radio.js +2 -2
  52. package/dist/{RadioGroup-C3XWSScc.js → RadioGroup-DzW5z_SD.js} +2 -2
  53. package/dist/RadioGroup.js +3 -3
  54. package/dist/{Range-C8RVrIM9.js → Range-9ijUzrty.js} +1 -1
  55. package/dist/Range.js +2 -2
  56. package/dist/{ScrollTop-B_TJ_k4m.js → ScrollTop-uDL4K_C6.js} +3 -3
  57. package/dist/ScrollTop.js +5 -5
  58. package/dist/{Select-CbPTrL3G.js → Select-ClGNTYfp.js} +7 -7
  59. package/dist/Select.d.ts +2 -2
  60. package/dist/Select.js +9 -9
  61. package/dist/{Spinner-ChKJQJTN.js → Spinner-B7ikVfUZ.js} +1 -1
  62. package/dist/Spinner.js +2 -2
  63. package/dist/{Tab-BJbzY1xd.js → Tab-CSHR71IX.js} +1 -1
  64. package/dist/Tab.js +2 -2
  65. package/dist/{TabGroup-BIaCHrKR.js → TabGroup-D7YbKXm8.js} +3 -3
  66. package/dist/TabGroup.js +4 -4
  67. package/dist/{TabPanel-CTyw410b.js → TabPanel-D_RHF3lv.js} +1 -1
  68. package/dist/TabPanel.js +2 -2
  69. package/dist/{Table-D3QmePJd.js → Table-CdosaNFb.js} +3 -3
  70. package/dist/Table.js +7 -7
  71. package/dist/{Tag-nUnWtHYy.js → Tag-BQBgkkAs.js} +1 -1
  72. package/dist/Tag.js +2 -2
  73. package/dist/{VisuallyHidden-DF2q9pTa.js → VisuallyHidden-CEBTA6hv.js} +1 -1
  74. package/dist/VisuallyHidden.js +2 -2
  75. package/dist/custom-elements.json +6445 -0
  76. package/dist/index.d.ts +2 -2
  77. package/dist/index.js +30 -30
  78. package/dist/leu-accordion.js +2 -2
  79. package/dist/leu-button-group.js +5 -5
  80. package/dist/leu-button.js +4 -4
  81. package/dist/leu-chart-wrapper.js +3 -3
  82. package/dist/leu-checkbox-group.js +4 -4
  83. package/dist/leu-checkbox.js +3 -3
  84. package/dist/leu-chip-group.js +3 -3
  85. package/dist/leu-chip-link.js +2 -2
  86. package/dist/leu-chip-removable.js +3 -3
  87. package/dist/leu-chip-selectable.js +2 -2
  88. package/dist/leu-dialog.js +3 -3
  89. package/dist/leu-dropdown.js +8 -8
  90. package/dist/leu-file-input.js +6 -6
  91. package/dist/leu-icon.js +2 -2
  92. package/dist/leu-input.js +3 -3
  93. package/dist/leu-menu-item.d.ts +1 -1
  94. package/dist/leu-menu-item.js +3 -3
  95. package/dist/leu-menu.d.ts +1 -1
  96. package/dist/leu-menu.js +4 -4
  97. package/dist/leu-message.js +3 -3
  98. package/dist/leu-pagination.js +6 -6
  99. package/dist/leu-placeholder.js +2 -2
  100. package/dist/leu-popup.js +2 -2
  101. package/dist/leu-progress-bar.js +2 -2
  102. package/dist/leu-radio-group.js +3 -3
  103. package/dist/leu-radio.js +2 -2
  104. package/dist/leu-range.js +2 -2
  105. package/dist/leu-scroll-top.js +5 -5
  106. package/dist/leu-select.js +9 -9
  107. package/dist/leu-spinner.js +2 -2
  108. package/dist/leu-tab-group.js +4 -4
  109. package/dist/leu-tab-panel.js +2 -2
  110. package/dist/leu-tab.js +2 -2
  111. package/dist/leu-table.js +7 -7
  112. package/dist/leu-tag.js +2 -2
  113. package/dist/leu-visually-hidden.js +2 -2
  114. package/dist/vscode.html-custom-data.json +11 -11
  115. package/dist/vue/index.d.ts +20 -20
  116. package/dist/web-types.json +28 -28
  117. package/package.json +4 -1
  118. package/.editorconfig +0 -29
  119. package/.github/workflows/ci.yml +0 -81
  120. package/.github/workflows/deploy-github-pages.yaml +0 -34
  121. package/.github/workflows/publish.yml +0 -28
  122. package/.github/workflows/release-please.yml +0 -19
  123. package/.husky/commit-msg +0 -1
  124. package/.husky/pre-commit +0 -1
  125. package/.nvmrc +0 -1
  126. package/.prettierignore +0 -2
  127. package/.release-please-manifest.json +0 -3
  128. package/.storybook/main.ts +0 -34
  129. package/.storybook/manager-head.html +0 -1
  130. package/.storybook/manager.ts +0 -6
  131. package/.storybook/preview.ts +0 -96
  132. package/.storybook/static/fonts/Inter-Black.woff2 +0 -0
  133. package/.storybook/static/fonts/Inter-Regular.woff2 +0 -0
  134. package/.storybook/static/fonts.css +0 -11
  135. package/.storybook/static/global.css +0 -5
  136. package/.storybook/static/logo.svg +0 -19
  137. package/.storybook/theme.ts +0 -8
  138. package/AGENTS.md +0 -162
  139. package/CHANGELOG.md +0 -601
  140. package/CODE_OF_CONDUCT.md +0 -128
  141. package/CONTRIBUTING.md +0 -42
  142. package/commitlint.config.cjs +0 -1
  143. package/custom-elements-manifest.config.js +0 -46
  144. package/eslint.config.mjs +0 -79
  145. package/postcss.config.cjs +0 -16
  146. package/release-please-config.json +0 -9
  147. package/scripts/generate-component/generate.js +0 -167
  148. package/scripts/generate-component/templates/[Name].ts +0 -31
  149. package/scripts/generate-component/templates/[name].css +0 -6
  150. package/scripts/generate-component/templates/[namespace]-[name].ts +0 -11
  151. package/scripts/generate-component/templates/stories/[name].stories.ts +0 -26
  152. package/scripts/generate-component/templates/test/[name].test.ts +0 -23
  153. package/scripts/postcss-leu-font-styles.cjs +0 -154
  154. package/src/components/accordion/Accordion.ts +0 -108
  155. package/src/components/accordion/accordion.css +0 -150
  156. package/src/components/accordion/leu-accordion.ts +0 -11
  157. package/src/components/accordion/stories/accordion.stories.ts +0 -62
  158. package/src/components/accordion/test/accordion.test.ts +0 -118
  159. package/src/components/button/Button.ts +0 -286
  160. package/src/components/button/button.css +0 -317
  161. package/src/components/button/leu-button.ts +0 -11
  162. package/src/components/button/stories/button.stories.ts +0 -366
  163. package/src/components/button/test/button.test.ts +0 -417
  164. package/src/components/button-group/ButtonGroup.ts +0 -97
  165. package/src/components/button-group/button-group.css +0 -5
  166. package/src/components/button-group/leu-button-group.ts +0 -11
  167. package/src/components/button-group/stories/button-group.stories.ts +0 -54
  168. package/src/components/button-group/test/button-group.test.ts +0 -105
  169. package/src/components/chart-wrapper/ChartWrapper.ts +0 -78
  170. package/src/components/chart-wrapper/chart-wrapper.css +0 -87
  171. package/src/components/chart-wrapper/leu-chart-wrapper.ts +0 -11
  172. package/src/components/chart-wrapper/stories/chart-wrapper.stories.ts +0 -58
  173. package/src/components/chart-wrapper/test/chart-wrapper.test.ts +0 -77
  174. package/src/components/checkbox/Checkbox.ts +0 -129
  175. package/src/components/checkbox/CheckboxGroup.ts +0 -57
  176. package/src/components/checkbox/checkbox-group.css +0 -29
  177. package/src/components/checkbox/checkbox.css +0 -81
  178. package/src/components/checkbox/leu-checkbox-group.ts +0 -11
  179. package/src/components/checkbox/leu-checkbox.ts +0 -11
  180. package/src/components/checkbox/stories/checkbox-group.stories.ts +0 -59
  181. package/src/components/checkbox/stories/checkbox.stories.ts +0 -72
  182. package/src/components/checkbox/test/checkbox-group.test.ts +0 -109
  183. package/src/components/checkbox/test/checkbox.test.ts +0 -247
  184. package/src/components/chip/Chip.ts +0 -19
  185. package/src/components/chip/ChipGroup.ts +0 -122
  186. package/src/components/chip/ChipLink.ts +0 -24
  187. package/src/components/chip/ChipRemovable.ts +0 -45
  188. package/src/components/chip/ChipSelectable.ts +0 -80
  189. package/src/components/chip/chip-group.css +0 -15
  190. package/src/components/chip/chip.css +0 -139
  191. package/src/components/chip/exports.ts +0 -4
  192. package/src/components/chip/leu-chip-group.ts +0 -11
  193. package/src/components/chip/leu-chip-link.ts +0 -11
  194. package/src/components/chip/leu-chip-removable.ts +0 -11
  195. package/src/components/chip/leu-chip-selectable.ts +0 -11
  196. package/src/components/chip/stories/chip-group.stories.ts +0 -159
  197. package/src/components/chip/stories/chip-link.stories.ts +0 -45
  198. package/src/components/chip/stories/chip-removable.stories.ts +0 -42
  199. package/src/components/chip/stories/chip-selectable.stories.ts +0 -54
  200. package/src/components/chip/test/chip-group.test.ts +0 -171
  201. package/src/components/chip/test/chip-link.test.ts +0 -54
  202. package/src/components/chip/test/chip-removable.test.ts +0 -105
  203. package/src/components/chip/test/chip-selectable.test.ts +0 -101
  204. package/src/components/chip/test/chip.test.ts +0 -22
  205. package/src/components/dialog/Dialog.ts +0 -86
  206. package/src/components/dialog/dialog.css +0 -157
  207. package/src/components/dialog/leu-dialog.ts +0 -11
  208. package/src/components/dialog/stories/dialog.stories.ts +0 -142
  209. package/src/components/dialog/test/dialog.test.ts +0 -85
  210. package/src/components/dropdown/Dropdown.ts +0 -152
  211. package/src/components/dropdown/dropdown.css +0 -16
  212. package/src/components/dropdown/leu-dropdown.ts +0 -11
  213. package/src/components/dropdown/stories/dropdown.stories.ts +0 -58
  214. package/src/components/dropdown/test/dropdown.test.ts +0 -59
  215. package/src/components/file-input/FileInput.ts +0 -324
  216. package/src/components/file-input/file-input.css +0 -118
  217. package/src/components/file-input/leu-file-input.ts +0 -11
  218. package/src/components/file-input/stories/file-input.stories.ts +0 -45
  219. package/src/components/file-input/test/file-input.test.ts +0 -62
  220. package/src/components/icon/Icon.ts +0 -47
  221. package/src/components/icon/icon.css +0 -10
  222. package/src/components/icon/leu-icon.ts +0 -11
  223. package/src/components/icon/paths.ts +0 -219
  224. package/src/components/icon/stories/icon.stories.ts +0 -79
  225. package/src/components/icon/test/icon.test.ts +0 -50
  226. package/src/components/input/Input.ts +0 -469
  227. package/src/components/input/input.css +0 -238
  228. package/src/components/input/leu-input.ts +0 -11
  229. package/src/components/input/stories/input.stories.ts +0 -204
  230. package/src/components/input/test/input.test.ts +0 -603
  231. package/src/components/menu/Menu.ts +0 -149
  232. package/src/components/menu/MenuItem.ts +0 -168
  233. package/src/components/menu/leu-menu-item.ts +0 -11
  234. package/src/components/menu/leu-menu.ts +0 -11
  235. package/src/components/menu/menu-item.css +0 -77
  236. package/src/components/menu/menu.css +0 -19
  237. package/src/components/menu/stories/menu-item.stories.ts +0 -81
  238. package/src/components/menu/stories/menu.stories.ts +0 -54
  239. package/src/components/menu/test/menu-item.test.ts +0 -210
  240. package/src/components/menu/test/menu.test.ts +0 -125
  241. package/src/components/message/Message.ts +0 -118
  242. package/src/components/message/leu-message.ts +0 -11
  243. package/src/components/message/message.css +0 -163
  244. package/src/components/message/stories/message.mdx +0 -76
  245. package/src/components/message/stories/message.stories.ts +0 -149
  246. package/src/components/message/test/message.test.ts +0 -96
  247. package/src/components/pagination/Pagination.ts +0 -192
  248. package/src/components/pagination/leu-pagination.ts +0 -11
  249. package/src/components/pagination/pagination.css +0 -54
  250. package/src/components/pagination/stories/pagination.stories.ts +0 -115
  251. package/src/components/pagination/test/pagination.test.ts +0 -210
  252. package/src/components/placeholder/Placeholder.ts +0 -33
  253. package/src/components/placeholder/leu-placeholder.ts +0 -11
  254. package/src/components/placeholder/placeholder.css +0 -59
  255. package/src/components/placeholder/stories/placeholder.stories.ts +0 -34
  256. package/src/components/placeholder/test/placeholder.test.ts +0 -31
  257. package/src/components/popup/Popup.ts +0 -264
  258. package/src/components/popup/leu-popup.ts +0 -11
  259. package/src/components/popup/popup.css +0 -24
  260. package/src/components/popup/stories/popup.stories.ts +0 -117
  261. package/src/components/popup/test/popup.test.ts +0 -90
  262. package/src/components/progress-bar/ProgressBar.ts +0 -52
  263. package/src/components/progress-bar/leu-progress-bar.ts +0 -11
  264. package/src/components/progress-bar/progress-bar.css +0 -97
  265. package/src/components/progress-bar/stories/progress-bar.stories.ts +0 -39
  266. package/src/components/progress-bar/test/progress-bar.test.ts +0 -61
  267. package/src/components/radio/Radio.ts +0 -59
  268. package/src/components/radio/RadioGroup.ts +0 -181
  269. package/src/components/radio/leu-radio-group.ts +0 -11
  270. package/src/components/radio/leu-radio.ts +0 -11
  271. package/src/components/radio/radio-group.css +0 -29
  272. package/src/components/radio/radio.css +0 -76
  273. package/src/components/radio/stories/radio-group.stories.ts +0 -54
  274. package/src/components/radio/stories/radio.stories.ts +0 -55
  275. package/src/components/radio/test/radio-group.test.ts +0 -83
  276. package/src/components/radio/test/radio.test.ts +0 -119
  277. package/src/components/range/Range.ts +0 -400
  278. package/src/components/range/leu-range.ts +0 -11
  279. package/src/components/range/range.css +0 -227
  280. package/src/components/range/stories/range.stories.ts +0 -185
  281. package/src/components/range/test/range.test.ts +0 -228
  282. package/src/components/scroll-top/ScrollTop.ts +0 -91
  283. package/src/components/scroll-top/leu-scroll-top.ts +0 -11
  284. package/src/components/scroll-top/scroll-top.css +0 -50
  285. package/src/components/scroll-top/stories/scroll-top.stories.ts +0 -217
  286. package/src/components/scroll-top/test/scroll-top.test.ts +0 -22
  287. package/src/components/select/Select.ts +0 -570
  288. package/src/components/select/leu-select.ts +0 -11
  289. package/src/components/select/select.css +0 -222
  290. package/src/components/select/stories/select.stories.ts +0 -173
  291. package/src/components/select/test/fixtures.ts +0 -162
  292. package/src/components/select/test/select.test.ts +0 -937
  293. package/src/components/spinner/Spinner.ts +0 -31
  294. package/src/components/spinner/leu-spinner.ts +0 -11
  295. package/src/components/spinner/spinner.css +0 -20
  296. package/src/components/spinner/stories/spinner.stories.ts +0 -29
  297. package/src/components/spinner/test/spinner.test.ts +0 -30
  298. package/src/components/tab/Tab.ts +0 -72
  299. package/src/components/tab/TabGroup.ts +0 -267
  300. package/src/components/tab/TabPanel.ts +0 -59
  301. package/src/components/tab/leu-tab-group.ts +0 -11
  302. package/src/components/tab/leu-tab-panel.ts +0 -11
  303. package/src/components/tab/leu-tab.ts +0 -11
  304. package/src/components/tab/stories/tab.stories.ts +0 -97
  305. package/src/components/tab/tab-group.css +0 -63
  306. package/src/components/tab/tab-panel.css +0 -10
  307. package/src/components/tab/tab.css +0 -54
  308. package/src/components/tab/test/tab-group.test.ts +0 -426
  309. package/src/components/tab/test/tab-panel.test.ts +0 -102
  310. package/src/components/tab/test/tab.test.ts +0 -139
  311. package/src/components/table/Table.ts +0 -253
  312. package/src/components/table/leu-table.ts +0 -11
  313. package/src/components/table/stories/table.stories.ts +0 -131
  314. package/src/components/table/table.css +0 -112
  315. package/src/components/table/test/table.test.ts +0 -37
  316. package/src/components/tag/Tag.ts +0 -28
  317. package/src/components/tag/leu-tag.ts +0 -11
  318. package/src/components/tag/stories/tag.stories.ts +0 -107
  319. package/src/components/tag/tag.css +0 -42
  320. package/src/components/tag/test/tag.test.ts +0 -28
  321. package/src/components/visually-hidden/VisuallyHidden.ts +0 -16
  322. package/src/components/visually-hidden/leu-visually-hidden.ts +0 -11
  323. package/src/components/visually-hidden/stories/visually-hidden.stories.ts +0 -22
  324. package/src/components/visually-hidden/test/visually-hidden.test.ts +0 -34
  325. package/src/components/visually-hidden/visually-hidden.css +0 -10
  326. package/src/docs/contributing.mdx +0 -154
  327. package/src/docs/installation.mdx +0 -35
  328. package/src/docs/theme.mdx +0 -400
  329. package/src/docs/usage.mdx +0 -73
  330. package/src/global.d.ts +0 -11
  331. package/src/index.ts +0 -29
  332. package/src/lib/LeuElement.ts +0 -43
  333. package/src/lib/a11y.ts +0 -26
  334. package/src/lib/hasSlotController.ts +0 -74
  335. package/src/lib/mixins/FormAssociatedMixin.ts +0 -115
  336. package/src/lib/styleMap.ts +0 -139
  337. package/src/lib/utils.ts +0 -45
  338. package/src/styles/common-styles.css +0 -14
  339. package/src/styles/custom-media.css +0 -6
  340. package/src/styles/font-definitions.json +0 -210
  341. package/src/styles/style.stories.ts +0 -64
  342. package/src/styles/theme.css +0 -90
  343. package/stat_zh.png +0 -0
  344. package/stylelint.config.mjs +0 -23
  345. package/tsconfig.build.json +0 -24
  346. package/tsconfig.json +0 -14
  347. package/tsdown.config.ts +0 -35
  348. package/web-test-runner.config.mjs +0 -102
@@ -1,400 +0,0 @@
1
- import { html, nothing, PropertyValues } from "lit"
2
- import { property, query } from "lit/decorators.js"
3
- import { ifDefined } from "lit/directives/if-defined.js"
4
-
5
- import styles from "./range.css?inline"
6
- import { LeuElement } from "../../lib/LeuElement.js"
7
- import { clamp, isNumber } from "../../lib/utils.js"
8
-
9
- type InternalRangeValue = [number, number] | [number]
10
-
11
- const defaultValueConverter = {
12
- fromAttribute(value: string) {
13
- return value.split(",").map((v) => Number(v.trim()))
14
- },
15
- toAttribute(value: number[]) {
16
- return value.join(",")
17
- },
18
- }
19
-
20
- const RANGE_LABELS = ["Von", "Bis"]
21
-
22
- /**
23
- * @tagname leu-range
24
- */
25
- export class LeuRange extends LeuElement {
26
- static styles = [LeuElement.styles, styles]
27
-
28
- static shadowRootOptions = {
29
- ...LeuElement.shadowRootOptions,
30
- delegatesFocus: true,
31
- }
32
-
33
- /**
34
- * The default value of the range slider.
35
- * String input is parsed as a comma-separated list of numbers.
36
- */
37
- @property({
38
- converter: defaultValueConverter,
39
- attribute: "value",
40
- reflect: true,
41
- })
42
- defaultValue = [50]
43
-
44
- /**
45
- * The minimum value of the range slider.
46
- */
47
- @property({ type: Number, reflect: true })
48
- min: number = 0
49
-
50
- /**
51
- * The maximum value of the range slider.
52
- */
53
- @property({ type: Number, reflect: true })
54
- max: number = 100
55
-
56
- /**
57
- * The step size of the range slider.
58
- */
59
- @property({ type: Number, reflect: true })
60
- step: number = 1
61
-
62
- @property({ type: String, reflect: true })
63
- name: string = ""
64
-
65
- /**
66
- * The label of the range slider.
67
- */
68
- @property({ type: String, reflect: true })
69
- label: string = ""
70
-
71
- /**
72
- * Whether to hide the label of the range slider.
73
- * If true, the label will still be available for screen readers
74
- * and is only visually hidden.
75
- */
76
- @property({ type: Boolean, reflect: true, attribute: "hide-label" })
77
- hideLabel: boolean = false
78
-
79
- /**
80
- * Whether the range slider is disabled.
81
- */
82
- @property({ type: Boolean, reflect: true })
83
- disabled: boolean = false
84
-
85
- /**
86
- * Whether to use a range with two handles.
87
- */
88
- @property({ type: Boolean, reflect: true })
89
- multiple: boolean = false
90
-
91
- /**
92
- * Wheter to show tick marks below the range slider.
93
- * One tick mark per step will be rendered.
94
- */
95
- @property({ type: Boolean, reflect: true, attribute: "show-ticks" })
96
- showTicks: boolean = false
97
-
98
- /**
99
- * Whether to show the min and max labels below the range slider.
100
- */
101
- @property({ type: Boolean, reflect: true, attribute: "show-range-labels" })
102
- showRangeLabels: boolean = false
103
-
104
- /**
105
- * A prefix to display before the value in the output element(s).
106
- * Is ignored if a custom valueFormatter is provided.
107
- */
108
- @property({ type: String, reflect: true })
109
- prefix: string = ""
110
-
111
- /**
112
- * A suffix to display after the value in the output element(s).
113
- * Is ignored if a custom valueFormatter is provided.
114
- */
115
- @property({ type: String, reflect: true })
116
- suffix: string = ""
117
-
118
- /**
119
- * A custom function to format the value displayed in the output element(s).
120
- * If provided, the prefix and suffix properties will be ignored.
121
- */
122
- @property({ attribute: false })
123
- valueFormatter?: (value: number) => string
124
-
125
- protected _value: InternalRangeValue = this.defaultValue.map((v) =>
126
- this.clampAndRoundValue(v),
127
- ) as InternalRangeValue
128
-
129
- /**
130
- * The value of the range slider.
131
- * String input is parsed as a comma-separated list of numbers.
132
- * In multiple mode, if only a single value is provided, the second handle will be set to the minimum value.
133
- * In single mode, only the first value will be used.
134
- */
135
- @property({ attribute: false })
136
- set value(value: string | number | Array<string | number>) {
137
- let nextValue: Array<number> = []
138
-
139
- if (typeof value === "string") {
140
- nextValue = value
141
- .split(",")
142
- .map((v) => Number(v.trim()))
143
- .filter(isNumber)
144
- } else if (isNumber(value)) {
145
- nextValue = [value]
146
- } else if (Array.isArray(value)) {
147
- nextValue = value.map((v: unknown) => Number(v)).filter(isNumber)
148
- }
149
-
150
- if (nextValue.length === 0) {
151
- return
152
- }
153
-
154
- // In multiple mode, we need to ensure that we always have two values.
155
- // `min` is a fallback for the second value.
156
- if (this.multiple && nextValue.length === 1) {
157
- nextValue.unshift(this.min)
158
- }
159
-
160
- this._value = nextValue
161
- .slice(0, this.multiple ? 2 : 1)
162
- .map((v) => this.clampAndRoundValue(v)) as InternalRangeValue
163
- }
164
-
165
- get value(): string {
166
- return this._value.join(",")
167
- }
168
-
169
- get valueAsArray(): InternalRangeValue {
170
- return this._value.slice() as InternalRangeValue
171
- }
172
-
173
- get valueLow(): number {
174
- return Math.min(...this._value)
175
- }
176
-
177
- get valueHigh(): number {
178
- return Math.max(...this._value)
179
- }
180
-
181
- @query("#container")
182
- protected container: HTMLDivElement
183
-
184
- @query("#input-base")
185
- protected inputBase: HTMLInputElement
186
-
187
- @query("#input-ghost")
188
- protected inputGhost: HTMLInputElement | null
189
-
190
- @query("output[for=input-base]")
191
- protected outputBase: HTMLOutputElement
192
-
193
- @query("output[for=input-ghost]")
194
- protected outputGhost: HTMLOutputElement | null
195
-
196
- updated() {
197
- this.updateStyles()
198
- }
199
-
200
- protected willUpdate(changedProperties: PropertyValues<this>): void {
201
- // Reflect defaultValue changes to the value property
202
- // to ensure backwards compatibility with previous versions
203
- if (changedProperties.has("defaultValue")) {
204
- this.value = this.defaultValue.map((v) =>
205
- this.clampAndRoundValue(v),
206
- ) as InternalRangeValue
207
- }
208
-
209
- if (
210
- changedProperties.has("min") ||
211
- changedProperties.has("max") ||
212
- changedProperties.has("step")
213
- ) {
214
- this._value = this._value.map((v) =>
215
- this.clampAndRoundValue(v),
216
- ) as InternalRangeValue
217
- }
218
-
219
- if (changedProperties.has("multiple") && this.multiple) {
220
- // When switching to multiple mode, ensure that we have two values
221
- if (this._value.length === 1) {
222
- this._value = [this.min, this._value[0]]
223
- }
224
- } else if (changedProperties.has("multiple") && !this.multiple) {
225
- // When switching to single mode, keep only the lower value
226
- this._value = [this.valueLow]
227
- }
228
- }
229
-
230
- protected updateStyles() {
231
- const normalizedRange = this.getNormalizedRange()
232
- this.container?.style.setProperty("--low", normalizedRange[0].toString())
233
- this.container?.style.setProperty("--high", normalizedRange[1].toString())
234
-
235
- const inputs = this.multiple
236
- ? [this.inputBase, this.inputGhost]
237
- : [this.inputBase]
238
-
239
- inputs.forEach((input) => {
240
- const output =
241
- input.id === "input-base" ? this.outputBase : this.outputGhost
242
- const normalizedValue = this.getNormalizedValue(input.valueAsNumber)
243
- output.style.setProperty("--value", normalizedValue.toString())
244
- output.value = this.formatValue(input.valueAsNumber)
245
- })
246
- }
247
-
248
- protected clampAndRoundValue(value: number) {
249
- const clampedValue = clamp(value, this.min, this.max)
250
- const roundedValue =
251
- Math.round((clampedValue - this.min) / this.step) * this.step + this.min
252
-
253
- return roundedValue
254
- }
255
-
256
- protected handleInput(e: Event & { target: HTMLInputElement }) {
257
- e.stopPropagation()
258
-
259
- if (this.multiple) {
260
- this.value = [this.inputBase.valueAsNumber, this.inputGhost.valueAsNumber]
261
- } else {
262
- this.value = [this.inputBase.valueAsNumber]
263
- }
264
-
265
- this.dispatchEvent(
266
- new CustomEvent("input", {
267
- composed: true,
268
- bubbles: true,
269
- detail: { value: this.value, valueAsArray: this.valueAsArray },
270
- }),
271
- )
272
- }
273
-
274
- protected getNormalizedValue(value: number) {
275
- return (value - this.min) / (this.max - this.min)
276
- }
277
-
278
- protected getNormalizedRange() {
279
- if (this.multiple) {
280
- return this.valueAsArray
281
- .map((value) => this.getNormalizedValue(value))
282
- .sort((a, b) => a - b)
283
- }
284
-
285
- return [0, this.getNormalizedValue(this.valueAsArray[0])]
286
- }
287
-
288
- /**
289
- * This event handler is only applied to the "base" input element and only when in "multiple" mode.
290
- * It handles pointer events on the *track* and the thumb.
291
- * This method determines if the interaction was closer to the base or the ghost input.
292
- */
293
- protected handlePointerDown(e: PointerEvent & { target: HTMLInputElement }) {
294
- const clickValue =
295
- this.min + ((this.max - this.min) * e.offsetX) / this.offsetWidth
296
- const middleValue = (this.valueAsArray[0] + this.valueAsArray[1]) / 2
297
-
298
- if (
299
- (e.target.valueAsNumber === this.valueLow) ===
300
- clickValue > middleValue
301
- ) {
302
- /**
303
- * As the pointerdown event is fired before the input event, we first overwrite the value
304
- * of the input element that was not clicked on. The active input element will update itself.
305
- */
306
- this.inputGhost.value = e.target.value
307
- }
308
- }
309
-
310
- protected formatValue(value: number) {
311
- if (this.valueFormatter) {
312
- return this.valueFormatter(value)
313
- }
314
-
315
- return `${this.prefix}${value}${this.suffix}`
316
- }
317
-
318
- protected renderTicks() {
319
- if (!this.showTicks) {
320
- return nothing
321
- }
322
-
323
- return html`<div class="ticks">
324
- ${Array.from(
325
- { length: (this.max - this.min) / this.step + 1 },
326
- (_, i) => this.min + i * this.step,
327
- ).map(
328
- (tick) =>
329
- html`<span
330
- class="tick"
331
- style="left: ${this.getNormalizedValue(tick) * 100}%"
332
- ></span>`,
333
- )}
334
- </div>`
335
- }
336
-
337
- render() {
338
- const inputs = this.multiple ? ["base", "ghost"] : ["base"]
339
-
340
- const { multiple, disabled, label, valueAsArray } = this
341
-
342
- return html`
343
- <div
344
- id="container"
345
- class="container"
346
- role=${ifDefined(multiple ? "group" : undefined)}
347
- aria-labelledby=${ifDefined(multiple ? "group-label" : undefined)}
348
- >
349
- ${multiple
350
- ? html`<span id="group-label" class="label">${label}</span>`
351
- : html`<label for="input-base" class="label">${label}</label>`}
352
- <div class="outputs">
353
- ${inputs.map(
354
- (type, index) =>
355
- html`<output
356
- class="output"
357
- for="input-${type}"
358
- value=${this.formatValue(valueAsArray[index])}
359
- ></output>`,
360
- )}
361
- </div>
362
- <div class="inputs">
363
- ${inputs.map(
364
- (type, index) => html`
365
- <input
366
- @input=${this.handleInput}
367
- @pointerdown=${multiple && !disabled && index === 0
368
- ? this.handlePointerDown
369
- : undefined}
370
- type="range"
371
- class="range range--${type}"
372
- id="input-${type}"
373
- name=${this.name}
374
- min=${this.min}
375
- max=${this.max}
376
- step=${this.step}
377
- aria-label=${ifDefined(
378
- multiple ? RANGE_LABELS[index] : undefined,
379
- )}
380
- ?disabled=${disabled}
381
- .value=${valueAsArray[index].toString()}
382
- />
383
- `,
384
- )}
385
- ${this.renderTicks()}
386
- </div>
387
- </div>
388
- ${this.showRangeLabels
389
- ? html`<div class="tick-labels">
390
- <span class="tick-label tick-label--min"
391
- >${this.formatValue(this.min)}</span
392
- >
393
- <span class="tick-label tick-label--max"
394
- >${this.formatValue(this.max)}</span
395
- >
396
- </div>`
397
- : nothing}
398
- `
399
- }
400
- }
@@ -1,11 +0,0 @@
1
- import { LeuRange } from "./Range.js"
2
-
3
- export { LeuRange }
4
-
5
- LeuRange.define("leu-range")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-range": LeuRange
10
- }
11
- }
@@ -1,227 +0,0 @@
1
- :host {
2
- --range-color: var(--leu-color-black-40);
3
- --range-color-disabled: var(--leu-color-black-20);
4
- --range-color-focus: var(--leu-color-func-cyan);
5
-
6
- --range-track-background-color: var(--leu-color-black-10);
7
- --range-track-height: 4px;
8
- --range-track-radius: var(--range-track-height);
9
-
10
- --range-track-value-color: var(--leu-color-func-cyan);
11
- --range-track-value-width: 0;
12
- --range-track-value-min: 0;
13
-
14
- --range-thumb-color: var(--leu-color-black-0);
15
- --range-thumb-border-color: var(--range-color);
16
- --range-thumb-hover-border-color: var(--leu-color-black-100);
17
- --range-thumb-diameter: 32px;
18
-
19
- --range-value-color: var(--leu-color-black-100);
20
- --range-value-color-disabled: var(--range-color-disabled);
21
-
22
- --range-font-regular: var(--leu-font-family-regular);
23
- --range-font-black: var(--leu-font-family-black);
24
-
25
- display: block;
26
-
27
- font-family: var(--range-font-regular);
28
- }
29
-
30
- :host([disabled]) {
31
- --range-track-background: var(--range-color-disabled);
32
- --range-track-value-color: var(--range-color-disabled);
33
- --range-thumb-border-color: var(--range-color-disabled);
34
- --range-thumb-hover-border-color: var(--range-color-disabled);
35
- --range-value-color: var(--range-value-color-disabled);
36
- }
37
-
38
- .container {
39
- position: relative;
40
- }
41
-
42
- .label {
43
- display: inline-block;
44
- margin-block-end: 0.5rem;
45
- color: var(--leu-color-black-100);
46
- font: var(--leu-t-regular-regular-font);
47
- }
48
-
49
- :host([hide-label]) .label {
50
- clip: rect(0 0 0 0);
51
- border: 0;
52
- height: 1px;
53
- margin: -1px !important;
54
- overflow: hidden;
55
- padding: 0 !important;
56
- position: absolute;
57
- width: 1px;
58
- }
59
-
60
- .outputs {
61
- position: relative;
62
- height: 1.5rem;
63
- margin-block-end: 0.25rem;
64
- }
65
-
66
- .output {
67
- position: absolute;
68
-
69
- text-align: center;
70
- font: var(--leu-t-tiny-black-font);
71
- color: var(--range-value-color);
72
-
73
- min-width: var(--range-thumb-diameter);
74
-
75
- --_stop: calc(100% - var(--range-thumb-diameter));
76
- --_start: 0%;
77
-
78
- left: calc(var(--value) * (var(--_stop) - var(--_start)) + var(--_start));
79
- transform: translateX(calc(-50% + var(--range-thumb-diameter) / 2));
80
- }
81
-
82
- .inputs {
83
- position: relative;
84
- z-index: 1;
85
- height: var(--range-thumb-diameter);
86
- }
87
-
88
- .range {
89
- appearance: none;
90
- width: 100%;
91
- height: var(--range-thumb-diameter);
92
- padding: 0;
93
- margin: 0;
94
- background: transparent;
95
-
96
- --_track-background: linear-gradient(
97
- to right,
98
- var(--range-track-background-color) calc(var(--low) * 100%),
99
- var(--range-track-value-color) 0,
100
- var(--range-track-value-color) calc(var(--high) * 100%),
101
- var(--range-track-background-color) 0
102
- );
103
- }
104
-
105
- .range--ghost {
106
- position: absolute;
107
- top: 0;
108
- left: 0;
109
- z-index: 1;
110
- pointer-events: none;
111
- }
112
-
113
- .range:focus {
114
- outline: none;
115
- }
116
-
117
- /* Thumb */
118
-
119
- .range::-moz-range-thumb {
120
- cursor: pointer;
121
- background: var(--range-thumb-color);
122
-
123
- border: 2px var(--range-thumb-border-color) solid;
124
- border-radius: 50%;
125
-
126
- height: var(--range-thumb-diameter);
127
- width: var(--range-thumb-diameter);
128
-
129
- pointer-events: all;
130
- }
131
-
132
- .range:disabled::-moz-range-thumb {
133
- cursor: not-allowed;
134
- }
135
-
136
- .range:focus-visible::-moz-range-thumb {
137
- outline: 2px solid var(--range-color-focus);
138
- outline-offset: 2px;
139
- }
140
-
141
- .range::-moz-range-thumb:hover,
142
- .range:focus-visible::-moz-range-thumb {
143
- border-color: var(--range-thumb-hover-border-color);
144
- }
145
-
146
- .range::-webkit-slider-thumb {
147
- appearance: none;
148
- cursor: pointer;
149
- background: var(--range-thumb-color);
150
-
151
- border: 2px var(--range-thumb-border-color) solid;
152
- border-radius: 50%;
153
-
154
- height: var(--range-thumb-diameter);
155
- width: var(--range-thumb-diameter);
156
- margin-top: calc(var(--range-thumb-diameter) / -2 + 2px);
157
-
158
- pointer-events: all;
159
- }
160
-
161
- .range:disabled::-webkit-slider-thumb {
162
- cursor: not-allowed;
163
- }
164
-
165
- .range:focus::-webkit-slider-thumb {
166
- outline: 2px solid var(--range-color-focus);
167
- outline-offset: 2px;
168
- }
169
-
170
- .range:focus::-webkit-slider-thumb,
171
- .range::-webkit-slider-thumb:hover {
172
- border-color: var(--range-thumb-hover-border-color);
173
- }
174
-
175
- /* Track */
176
-
177
- .range::-moz-range-track {
178
- background: var(--_track-background);
179
- border-radius: var(--range-track-radius);
180
- height: var(--range-track-height);
181
- }
182
-
183
- .range--ghost::-moz-range-track {
184
- background: transparent;
185
- }
186
-
187
- .range::-webkit-slider-runnable-track {
188
- background: var(--_track-background);
189
- border-radius: var(--range-track-radius);
190
- height: var(--range-track-height);
191
- }
192
-
193
- .range--ghost::-webkit-slider-runnable-track {
194
- background: transparent;
195
- }
196
-
197
- /* Ticks */
198
-
199
- .ticks {
200
- position: absolute;
201
- inset-block-start: calc(
202
- var(--range-thumb-diameter) / 2 + var(--range-track-height)
203
- );
204
- inset-inline: calc(var(--range-thumb-diameter) / 2);
205
- }
206
-
207
- .tick {
208
- z-index: -1;
209
- position: absolute;
210
- top: 50%;
211
- width: 2px;
212
- height: 0.5rem;
213
- background-color: var(--range-track-background-color);
214
- transform: translateY(-50%);
215
- }
216
-
217
- .tick-labels {
218
- display: flex;
219
- justify-content: space-between;
220
- color: var(--leu-color-black-60);
221
- font: var(--leu-t-tiny-regular-font);
222
- margin-top: 0.25rem;
223
- }
224
-
225
- .tick-label--max {
226
- text-align: right;
227
- }