@statistikzh/leu 0.28.1 → 0.28.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/dist/{Accordion-CwkI7sfx.js → Accordion-EwJ1WHFd.js} +1 -1
  2. package/dist/Accordion.js +2 -2
  3. package/dist/{Button-DcuvEVkC.d.ts → Button-BywuwtT2.d.ts} +0 -1
  4. package/dist/{Button-D1aYnunQ.js → Button-q4GeKj_3.js} +3 -4
  5. package/dist/Button.d.ts +1 -1
  6. package/dist/Button.js +4 -4
  7. package/dist/{ButtonGroup-CqThYjzX.js → ButtonGroup-BeU3Prei.js} +2 -2
  8. package/dist/ButtonGroup.js +5 -5
  9. package/dist/{ChartWrapper-BjVT4x-H.js → ChartWrapper-Bdb0_n2z.js} +2 -2
  10. package/dist/ChartWrapper.js +3 -3
  11. package/dist/{Checkbox-HxYqp2w4.js → Checkbox-BC0gAuaH.js} +2 -2
  12. package/dist/Checkbox.js +3 -3
  13. package/dist/{CheckboxGroup-DYws2rwt.js → CheckboxGroup-CiOgcwmo.js} +2 -2
  14. package/dist/CheckboxGroup.js +4 -4
  15. package/dist/{Chip-gKxD6IaZ.js → Chip-CYlPzmTG.js} +1 -1
  16. package/dist/Chip.js +2 -2
  17. package/dist/{ChipGroup-ZvBzX_wd.js → ChipGroup-3IMW_Mp7.js} +1 -1
  18. package/dist/ChipGroup.js +3 -3
  19. package/dist/ChipLink.js +2 -2
  20. package/dist/ChipRemovable.js +3 -3
  21. package/dist/ChipSelectable.js +2 -2
  22. package/dist/{Dialog-BYpzTprV.js → Dialog-DCl5qSXY.js} +3 -4
  23. package/dist/Dialog.js +3 -3
  24. package/dist/{Dropdown-C4CgE4E-.js → Dropdown-COmpmOev.js} +5 -5
  25. package/dist/Dropdown.d.ts +1 -1
  26. package/dist/Dropdown.js +8 -8
  27. package/dist/{FileInput-nsnSQCaU.js → FileInput-DXjoqKB4.js} +4 -4
  28. package/dist/FileInput.d.ts +1 -1
  29. package/dist/FileInput.js +6 -6
  30. package/dist/{Icon-D8HTPEFH.js → Icon-Bmk7lLWY.js} +1 -1
  31. package/dist/Icon.js +2 -2
  32. package/dist/{Input-OrILqlax.js → Input-B9FwAPKO.js} +2 -2
  33. package/dist/Input.js +3 -3
  34. package/dist/{LeuElement-C_lcHzQI.js → LeuElement-CQJQi8TB.js} +1 -1
  35. package/dist/{Menu-CFLCnI34.js → Menu-bWCAn0rT.js} +2 -2
  36. package/dist/Menu.js +4 -4
  37. package/dist/{MenuItem-ICjLCGim.js → MenuItem-CzCFZi8o.js} +2 -2
  38. package/dist/MenuItem.js +3 -3
  39. package/dist/{Message-Dw5D_0i1.js → Message-DMaM9ukF.js} +2 -2
  40. package/dist/Message.js +3 -3
  41. package/dist/{Pagination-D1tP5FrM.js → Pagination-870u3UgQ.js} +4 -4
  42. package/dist/{Pagination-9eZ8WMvR.d.ts → Pagination-B-mTHZiw.d.ts} +1 -1
  43. package/dist/Pagination.d.ts +1 -1
  44. package/dist/Pagination.js +6 -6
  45. package/dist/{Placeholder-CnGzCZ5-.js → Placeholder-DvvzGB1p.js} +1 -1
  46. package/dist/Placeholder.js +2 -2
  47. package/dist/{Popup-BiN_tZDN.js → Popup-BpG_7twr.js} +1 -1
  48. package/dist/Popup.js +2 -2
  49. package/dist/{ProgressBar-BfJo_KyU.js → ProgressBar-BkskTLWK.js} +1 -1
  50. package/dist/ProgressBar.js +2 -2
  51. package/dist/{Radio-CV7vuQUj.js → Radio-BS7UUhR3.js} +1 -1
  52. package/dist/Radio.js +2 -2
  53. package/dist/{RadioGroup-C3XWSScc.js → RadioGroup-Cpo9kAjB.js} +2 -2
  54. package/dist/RadioGroup.js +3 -3
  55. package/dist/{Range-C8RVrIM9.js → Range-Dh0p5UWA.js} +1 -1
  56. package/dist/Range.js +2 -2
  57. package/dist/{ScrollTop-B_TJ_k4m.js → ScrollTop-CtPidICZ.js} +3 -3
  58. package/dist/ScrollTop.d.ts +1 -1
  59. package/dist/ScrollTop.js +5 -5
  60. package/dist/{Select-CbPTrL3G.js → Select-W1KqDOgx.js} +7 -7
  61. package/dist/Select.d.ts +1 -1
  62. package/dist/Select.js +9 -9
  63. package/dist/{Spinner-ChKJQJTN.js → Spinner-CmAYIFws.js} +1 -1
  64. package/dist/Spinner.js +2 -2
  65. package/dist/{Tab-BJbzY1xd.js → Tab-7Cww5fSx.js} +1 -1
  66. package/dist/Tab.js +2 -2
  67. package/dist/{TabGroup-BIaCHrKR.js → TabGroup-tURfCrlw.js} +3 -3
  68. package/dist/TabGroup.js +4 -4
  69. package/dist/{TabPanel-CTyw410b.js → TabPanel-DIZcmcMV.js} +1 -1
  70. package/dist/TabPanel.js +2 -2
  71. package/dist/{Table-D3QmePJd.js → Table-BVYjYXP9.js} +3 -3
  72. package/dist/Table.d.ts +1 -1
  73. package/dist/Table.js +7 -7
  74. package/dist/{Tag-nUnWtHYy.js → Tag-x0KmEDEa.js} +1 -1
  75. package/dist/Tag.js +2 -2
  76. package/dist/{VisuallyHidden-DF2q9pTa.js → VisuallyHidden-CXRfGsaZ.js} +1 -1
  77. package/dist/VisuallyHidden.js +2 -2
  78. package/dist/custom-elements.json +6445 -0
  79. package/dist/index.d.ts +2 -2
  80. package/dist/index.js +30 -30
  81. package/dist/leu-accordion.js +2 -2
  82. package/dist/leu-button-group.js +5 -5
  83. package/dist/leu-button.d.ts +1 -1
  84. package/dist/leu-button.js +4 -4
  85. package/dist/leu-chart-wrapper.js +3 -3
  86. package/dist/leu-checkbox-group.js +4 -4
  87. package/dist/leu-checkbox.js +3 -3
  88. package/dist/leu-chip-group.js +3 -3
  89. package/dist/leu-chip-link.js +2 -2
  90. package/dist/leu-chip-removable.js +3 -3
  91. package/dist/leu-chip-selectable.js +2 -2
  92. package/dist/leu-dialog.js +3 -3
  93. package/dist/leu-dropdown.js +8 -8
  94. package/dist/leu-file-input.js +6 -6
  95. package/dist/leu-icon.js +2 -2
  96. package/dist/leu-input.js +3 -3
  97. package/dist/leu-menu-item.js +3 -3
  98. package/dist/leu-menu.js +4 -4
  99. package/dist/leu-message.js +3 -3
  100. package/dist/leu-pagination.d.ts +1 -1
  101. package/dist/leu-pagination.js +6 -6
  102. package/dist/leu-placeholder.js +2 -2
  103. package/dist/leu-popup.js +2 -2
  104. package/dist/leu-progress-bar.js +2 -2
  105. package/dist/leu-radio-group.js +3 -3
  106. package/dist/leu-radio.js +2 -2
  107. package/dist/leu-range.js +2 -2
  108. package/dist/leu-scroll-top.js +5 -5
  109. package/dist/leu-select.js +9 -9
  110. package/dist/leu-spinner.js +2 -2
  111. package/dist/leu-tab-group.js +4 -4
  112. package/dist/leu-tab-panel.js +2 -2
  113. package/dist/leu-tab.js +2 -2
  114. package/dist/leu-table.js +7 -7
  115. package/dist/leu-tag.js +2 -2
  116. package/dist/leu-visually-hidden.js +2 -2
  117. package/dist/vscode.html-custom-data.json +11 -11
  118. package/dist/vue/index.d.ts +20 -20
  119. package/dist/web-types.json +28 -28
  120. package/package.json +4 -1
  121. package/.editorconfig +0 -29
  122. package/.github/workflows/ci.yml +0 -81
  123. package/.github/workflows/deploy-github-pages.yaml +0 -34
  124. package/.github/workflows/publish.yml +0 -28
  125. package/.github/workflows/release-please.yml +0 -19
  126. package/.husky/commit-msg +0 -1
  127. package/.husky/pre-commit +0 -1
  128. package/.nvmrc +0 -1
  129. package/.prettierignore +0 -2
  130. package/.release-please-manifest.json +0 -3
  131. package/.storybook/main.ts +0 -34
  132. package/.storybook/manager-head.html +0 -1
  133. package/.storybook/manager.ts +0 -6
  134. package/.storybook/preview.ts +0 -96
  135. package/.storybook/static/fonts/Inter-Black.woff2 +0 -0
  136. package/.storybook/static/fonts/Inter-Regular.woff2 +0 -0
  137. package/.storybook/static/fonts.css +0 -11
  138. package/.storybook/static/global.css +0 -5
  139. package/.storybook/static/logo.svg +0 -19
  140. package/.storybook/theme.ts +0 -8
  141. package/AGENTS.md +0 -162
  142. package/CHANGELOG.md +0 -601
  143. package/CODE_OF_CONDUCT.md +0 -128
  144. package/CONTRIBUTING.md +0 -42
  145. package/commitlint.config.cjs +0 -1
  146. package/custom-elements-manifest.config.js +0 -46
  147. package/eslint.config.mjs +0 -79
  148. package/postcss.config.cjs +0 -16
  149. package/release-please-config.json +0 -9
  150. package/scripts/generate-component/generate.js +0 -167
  151. package/scripts/generate-component/templates/[Name].ts +0 -31
  152. package/scripts/generate-component/templates/[name].css +0 -6
  153. package/scripts/generate-component/templates/[namespace]-[name].ts +0 -11
  154. package/scripts/generate-component/templates/stories/[name].stories.ts +0 -26
  155. package/scripts/generate-component/templates/test/[name].test.ts +0 -23
  156. package/scripts/postcss-leu-font-styles.cjs +0 -154
  157. package/src/components/accordion/Accordion.ts +0 -108
  158. package/src/components/accordion/accordion.css +0 -150
  159. package/src/components/accordion/leu-accordion.ts +0 -11
  160. package/src/components/accordion/stories/accordion.stories.ts +0 -62
  161. package/src/components/accordion/test/accordion.test.ts +0 -118
  162. package/src/components/button/Button.ts +0 -286
  163. package/src/components/button/button.css +0 -317
  164. package/src/components/button/leu-button.ts +0 -11
  165. package/src/components/button/stories/button.stories.ts +0 -366
  166. package/src/components/button/test/button.test.ts +0 -417
  167. package/src/components/button-group/ButtonGroup.ts +0 -97
  168. package/src/components/button-group/button-group.css +0 -5
  169. package/src/components/button-group/leu-button-group.ts +0 -11
  170. package/src/components/button-group/stories/button-group.stories.ts +0 -54
  171. package/src/components/button-group/test/button-group.test.ts +0 -105
  172. package/src/components/chart-wrapper/ChartWrapper.ts +0 -78
  173. package/src/components/chart-wrapper/chart-wrapper.css +0 -87
  174. package/src/components/chart-wrapper/leu-chart-wrapper.ts +0 -11
  175. package/src/components/chart-wrapper/stories/chart-wrapper.stories.ts +0 -58
  176. package/src/components/chart-wrapper/test/chart-wrapper.test.ts +0 -77
  177. package/src/components/checkbox/Checkbox.ts +0 -129
  178. package/src/components/checkbox/CheckboxGroup.ts +0 -57
  179. package/src/components/checkbox/checkbox-group.css +0 -29
  180. package/src/components/checkbox/checkbox.css +0 -81
  181. package/src/components/checkbox/leu-checkbox-group.ts +0 -11
  182. package/src/components/checkbox/leu-checkbox.ts +0 -11
  183. package/src/components/checkbox/stories/checkbox-group.stories.ts +0 -59
  184. package/src/components/checkbox/stories/checkbox.stories.ts +0 -72
  185. package/src/components/checkbox/test/checkbox-group.test.ts +0 -109
  186. package/src/components/checkbox/test/checkbox.test.ts +0 -247
  187. package/src/components/chip/Chip.ts +0 -19
  188. package/src/components/chip/ChipGroup.ts +0 -122
  189. package/src/components/chip/ChipLink.ts +0 -24
  190. package/src/components/chip/ChipRemovable.ts +0 -45
  191. package/src/components/chip/ChipSelectable.ts +0 -80
  192. package/src/components/chip/chip-group.css +0 -15
  193. package/src/components/chip/chip.css +0 -139
  194. package/src/components/chip/exports.ts +0 -4
  195. package/src/components/chip/leu-chip-group.ts +0 -11
  196. package/src/components/chip/leu-chip-link.ts +0 -11
  197. package/src/components/chip/leu-chip-removable.ts +0 -11
  198. package/src/components/chip/leu-chip-selectable.ts +0 -11
  199. package/src/components/chip/stories/chip-group.stories.ts +0 -159
  200. package/src/components/chip/stories/chip-link.stories.ts +0 -45
  201. package/src/components/chip/stories/chip-removable.stories.ts +0 -42
  202. package/src/components/chip/stories/chip-selectable.stories.ts +0 -54
  203. package/src/components/chip/test/chip-group.test.ts +0 -171
  204. package/src/components/chip/test/chip-link.test.ts +0 -54
  205. package/src/components/chip/test/chip-removable.test.ts +0 -105
  206. package/src/components/chip/test/chip-selectable.test.ts +0 -101
  207. package/src/components/chip/test/chip.test.ts +0 -22
  208. package/src/components/dialog/Dialog.ts +0 -86
  209. package/src/components/dialog/dialog.css +0 -157
  210. package/src/components/dialog/leu-dialog.ts +0 -11
  211. package/src/components/dialog/stories/dialog.stories.ts +0 -142
  212. package/src/components/dialog/test/dialog.test.ts +0 -85
  213. package/src/components/dropdown/Dropdown.ts +0 -152
  214. package/src/components/dropdown/dropdown.css +0 -16
  215. package/src/components/dropdown/leu-dropdown.ts +0 -11
  216. package/src/components/dropdown/stories/dropdown.stories.ts +0 -58
  217. package/src/components/dropdown/test/dropdown.test.ts +0 -59
  218. package/src/components/file-input/FileInput.ts +0 -324
  219. package/src/components/file-input/file-input.css +0 -118
  220. package/src/components/file-input/leu-file-input.ts +0 -11
  221. package/src/components/file-input/stories/file-input.stories.ts +0 -45
  222. package/src/components/file-input/test/file-input.test.ts +0 -62
  223. package/src/components/icon/Icon.ts +0 -47
  224. package/src/components/icon/icon.css +0 -10
  225. package/src/components/icon/leu-icon.ts +0 -11
  226. package/src/components/icon/paths.ts +0 -219
  227. package/src/components/icon/stories/icon.stories.ts +0 -79
  228. package/src/components/icon/test/icon.test.ts +0 -50
  229. package/src/components/input/Input.ts +0 -469
  230. package/src/components/input/input.css +0 -238
  231. package/src/components/input/leu-input.ts +0 -11
  232. package/src/components/input/stories/input.stories.ts +0 -204
  233. package/src/components/input/test/input.test.ts +0 -603
  234. package/src/components/menu/Menu.ts +0 -149
  235. package/src/components/menu/MenuItem.ts +0 -168
  236. package/src/components/menu/leu-menu-item.ts +0 -11
  237. package/src/components/menu/leu-menu.ts +0 -11
  238. package/src/components/menu/menu-item.css +0 -77
  239. package/src/components/menu/menu.css +0 -19
  240. package/src/components/menu/stories/menu-item.stories.ts +0 -81
  241. package/src/components/menu/stories/menu.stories.ts +0 -54
  242. package/src/components/menu/test/menu-item.test.ts +0 -210
  243. package/src/components/menu/test/menu.test.ts +0 -125
  244. package/src/components/message/Message.ts +0 -118
  245. package/src/components/message/leu-message.ts +0 -11
  246. package/src/components/message/message.css +0 -163
  247. package/src/components/message/stories/message.mdx +0 -76
  248. package/src/components/message/stories/message.stories.ts +0 -149
  249. package/src/components/message/test/message.test.ts +0 -96
  250. package/src/components/pagination/Pagination.ts +0 -192
  251. package/src/components/pagination/leu-pagination.ts +0 -11
  252. package/src/components/pagination/pagination.css +0 -54
  253. package/src/components/pagination/stories/pagination.stories.ts +0 -115
  254. package/src/components/pagination/test/pagination.test.ts +0 -210
  255. package/src/components/placeholder/Placeholder.ts +0 -33
  256. package/src/components/placeholder/leu-placeholder.ts +0 -11
  257. package/src/components/placeholder/placeholder.css +0 -59
  258. package/src/components/placeholder/stories/placeholder.stories.ts +0 -34
  259. package/src/components/placeholder/test/placeholder.test.ts +0 -31
  260. package/src/components/popup/Popup.ts +0 -264
  261. package/src/components/popup/leu-popup.ts +0 -11
  262. package/src/components/popup/popup.css +0 -24
  263. package/src/components/popup/stories/popup.stories.ts +0 -117
  264. package/src/components/popup/test/popup.test.ts +0 -90
  265. package/src/components/progress-bar/ProgressBar.ts +0 -52
  266. package/src/components/progress-bar/leu-progress-bar.ts +0 -11
  267. package/src/components/progress-bar/progress-bar.css +0 -97
  268. package/src/components/progress-bar/stories/progress-bar.stories.ts +0 -39
  269. package/src/components/progress-bar/test/progress-bar.test.ts +0 -61
  270. package/src/components/radio/Radio.ts +0 -59
  271. package/src/components/radio/RadioGroup.ts +0 -181
  272. package/src/components/radio/leu-radio-group.ts +0 -11
  273. package/src/components/radio/leu-radio.ts +0 -11
  274. package/src/components/radio/radio-group.css +0 -29
  275. package/src/components/radio/radio.css +0 -76
  276. package/src/components/radio/stories/radio-group.stories.ts +0 -54
  277. package/src/components/radio/stories/radio.stories.ts +0 -55
  278. package/src/components/radio/test/radio-group.test.ts +0 -83
  279. package/src/components/radio/test/radio.test.ts +0 -119
  280. package/src/components/range/Range.ts +0 -400
  281. package/src/components/range/leu-range.ts +0 -11
  282. package/src/components/range/range.css +0 -227
  283. package/src/components/range/stories/range.stories.ts +0 -185
  284. package/src/components/range/test/range.test.ts +0 -228
  285. package/src/components/scroll-top/ScrollTop.ts +0 -91
  286. package/src/components/scroll-top/leu-scroll-top.ts +0 -11
  287. package/src/components/scroll-top/scroll-top.css +0 -50
  288. package/src/components/scroll-top/stories/scroll-top.stories.ts +0 -217
  289. package/src/components/scroll-top/test/scroll-top.test.ts +0 -22
  290. package/src/components/select/Select.ts +0 -570
  291. package/src/components/select/leu-select.ts +0 -11
  292. package/src/components/select/select.css +0 -222
  293. package/src/components/select/stories/select.stories.ts +0 -173
  294. package/src/components/select/test/fixtures.ts +0 -162
  295. package/src/components/select/test/select.test.ts +0 -937
  296. package/src/components/spinner/Spinner.ts +0 -31
  297. package/src/components/spinner/leu-spinner.ts +0 -11
  298. package/src/components/spinner/spinner.css +0 -20
  299. package/src/components/spinner/stories/spinner.stories.ts +0 -29
  300. package/src/components/spinner/test/spinner.test.ts +0 -30
  301. package/src/components/tab/Tab.ts +0 -72
  302. package/src/components/tab/TabGroup.ts +0 -267
  303. package/src/components/tab/TabPanel.ts +0 -59
  304. package/src/components/tab/leu-tab-group.ts +0 -11
  305. package/src/components/tab/leu-tab-panel.ts +0 -11
  306. package/src/components/tab/leu-tab.ts +0 -11
  307. package/src/components/tab/stories/tab.stories.ts +0 -97
  308. package/src/components/tab/tab-group.css +0 -63
  309. package/src/components/tab/tab-panel.css +0 -10
  310. package/src/components/tab/tab.css +0 -54
  311. package/src/components/tab/test/tab-group.test.ts +0 -426
  312. package/src/components/tab/test/tab-panel.test.ts +0 -102
  313. package/src/components/tab/test/tab.test.ts +0 -139
  314. package/src/components/table/Table.ts +0 -253
  315. package/src/components/table/leu-table.ts +0 -11
  316. package/src/components/table/stories/table.stories.ts +0 -131
  317. package/src/components/table/table.css +0 -112
  318. package/src/components/table/test/table.test.ts +0 -37
  319. package/src/components/tag/Tag.ts +0 -28
  320. package/src/components/tag/leu-tag.ts +0 -11
  321. package/src/components/tag/stories/tag.stories.ts +0 -107
  322. package/src/components/tag/tag.css +0 -42
  323. package/src/components/tag/test/tag.test.ts +0 -28
  324. package/src/components/visually-hidden/VisuallyHidden.ts +0 -16
  325. package/src/components/visually-hidden/leu-visually-hidden.ts +0 -11
  326. package/src/components/visually-hidden/stories/visually-hidden.stories.ts +0 -22
  327. package/src/components/visually-hidden/test/visually-hidden.test.ts +0 -34
  328. package/src/components/visually-hidden/visually-hidden.css +0 -10
  329. package/src/docs/contributing.mdx +0 -154
  330. package/src/docs/installation.mdx +0 -35
  331. package/src/docs/theme.mdx +0 -400
  332. package/src/docs/usage.mdx +0 -73
  333. package/src/global.d.ts +0 -11
  334. package/src/index.ts +0 -29
  335. package/src/lib/LeuElement.ts +0 -43
  336. package/src/lib/a11y.ts +0 -26
  337. package/src/lib/hasSlotController.ts +0 -74
  338. package/src/lib/mixins/FormAssociatedMixin.ts +0 -115
  339. package/src/lib/styleMap.ts +0 -139
  340. package/src/lib/utils.ts +0 -45
  341. package/src/styles/common-styles.css +0 -14
  342. package/src/styles/custom-media.css +0 -6
  343. package/src/styles/font-definitions.json +0 -210
  344. package/src/styles/style.stories.ts +0 -64
  345. package/src/styles/theme.css +0 -90
  346. package/stat_zh.png +0 -0
  347. package/stylelint.config.mjs +0 -23
  348. package/tsconfig.build.json +0 -24
  349. package/tsconfig.json +0 -14
  350. package/tsdown.config.ts +0 -35
  351. package/web-test-runner.config.mjs +0 -102
@@ -1,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
- }