@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,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
- }