@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,31 +0,0 @@
1
- import { html } from "lit"
2
-
3
- import { LeuElement } from "../../lib/LeuElement.js"
4
-
5
- import styles from "./spinner.css?inline"
6
-
7
- /**
8
- * @tagname leu-spinner
9
- * @cssprop --leu-spinner-size - The size of the spinner.
10
- */
11
- export class LeuSpinner extends LeuElement {
12
- static styles = [LeuElement.styles, styles]
13
-
14
- render() {
15
- return html`
16
- <svg
17
- class="spinner"
18
- fill="none"
19
- xmlns="http://www.w3.org/2000/svg"
20
- viewBox="0 0 56 56"
21
- role="presentation"
22
- >
23
- <path
24
- d="M13.8579 13.858c7.8105-7.8105 20.4737-7.8105 28.2842 0 7.8105 7.8104 7.8105 20.4737 0 28.2842-7.8105 7.8105-20.4737 7.8105-28.2842 0-4.3487-4.3486-6.2761-10.2016-5.7824-15.8838"
25
- stroke="currentColor"
26
- stroke-width="3"
27
- />
28
- </svg>
29
- `
30
- }
31
- }
@@ -1,11 +0,0 @@
1
- import { LeuSpinner } from "./Spinner.js"
2
-
3
- export { LeuSpinner }
4
-
5
- LeuSpinner.define("leu-spinner")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-spinner": LeuSpinner
10
- }
11
- }
@@ -1,20 +0,0 @@
1
- @keyframes leu-spinner-rotate {
2
- from {
3
- transform: rotate(0deg);
4
- }
5
-
6
- to {
7
- transform: rotate(360deg);
8
- }
9
- }
10
-
11
- :host {
12
- color: var(--leu-color-func-cyan);
13
- }
14
-
15
- .spinner {
16
- display: block;
17
- width: var(--leu-spinner-size, 3.5rem);
18
- height: var(--leu-spinner-size, 3.5rem);
19
- animation: leu-spinner-rotate 1s cubic-bezier(0.49, 0.12, 0.56, 0.91) infinite;
20
- }
@@ -1,29 +0,0 @@
1
- import { html } from "lit"
2
- import "../leu-spinner.js"
3
- import { styleMap } from "lit/directives/style-map.js"
4
-
5
- export default {
6
- title: "Components/Spinner",
7
- component: "leu-spinner",
8
- argTypes: {
9
- color: {
10
- control: {
11
- type: "color",
12
- presetColors: ["#009ee0", "#d93c1a", "#1a7f1f"],
13
- },
14
- },
15
- },
16
- }
17
-
18
- function Template({ size, color }) {
19
- const styles = styleMap({
20
- color,
21
- "--leu-spinner-size": size ? `${size}px` : null,
22
- })
23
- return html` <leu-spinner style=${styles}></leu-spinner> `
24
- }
25
-
26
- export const Regular = Template.bind({})
27
- Regular.args = {
28
- size: 56,
29
- }
@@ -1,30 +0,0 @@
1
- import { html } from "lit"
2
- import { fixture, expect } from "@open-wc/testing"
3
-
4
- import "../leu-spinner.js"
5
-
6
- async function defaultFixture() {
7
- return fixture(html`<leu-spinner></leu-spinner>`)
8
- }
9
-
10
- describe("LeuSpinner", () => {
11
- it("is a defined element", async () => {
12
- const el = await customElements.get("leu-spinner")
13
-
14
- await expect(el).not.to.be.undefined
15
- })
16
-
17
- it("passes the a11y audit", async () => {
18
- const el = await defaultFixture()
19
-
20
- await expect(el).shadowDom.to.be.accessible()
21
- })
22
-
23
- it("renders a svg element with a 56x56 viewbox", async () => {
24
- const el = await defaultFixture()
25
-
26
- const svg = el.shadowRoot.querySelector("svg")
27
-
28
- expect(svg).to.have.attribute("viewBox", "0 0 56 56")
29
- })
30
- })
@@ -1,72 +0,0 @@
1
- import { html, PropertyValues } from "lit"
2
- import { property } from "lit/decorators.js"
3
- import { LeuElement } from "../../lib/LeuElement.js"
4
-
5
- import styles from "./tab.css?inline"
6
-
7
- let nextId = 1
8
-
9
- /**
10
- * Tab Button.
11
- *
12
- * @prop {string} name - Name to link Button and Panel together
13
- * @prop {boolean} active - Is active
14
- *
15
- * @tagname leu-tab
16
- */
17
- export class LeuTab extends LeuElement {
18
- static styles = [LeuElement.styles, styles]
19
-
20
- protected readonly componentId = `leu-tab-${nextId++}`
21
-
22
- /**
23
- * Name of the tab. Apply the same name to the corresponding panel to link them together.
24
- * Has to be unique within the tab component.
25
- */
26
- @property({ type: String, reflect: true })
27
- name = ""
28
-
29
- @property({ type: Boolean, reflect: true })
30
- active = false
31
-
32
- connectedCallback() {
33
- super.connectedCallback()
34
- this.setAttribute("role", "tab")
35
- this.addEventListener("click", this.handleClick)
36
- // Set an id if not already provided. The id is used by the tab-group
37
- // to set the aria-controls / aria-labelledby attributes.
38
- this.id = this.id.length > 0 ? this.id : this.componentId
39
- }
40
-
41
- disconnectedCallback(): void {
42
- super.disconnectedCallback()
43
- this.removeEventListener("click", this.handleClick)
44
- }
45
-
46
- handleClick() {
47
- if (this.active) {
48
- return
49
- }
50
-
51
- this.active = true
52
-
53
- this.dispatchEvent(
54
- new CustomEvent("leu:tab-select", {
55
- detail: { name: this.name },
56
- bubbles: true,
57
- composed: true,
58
- }),
59
- )
60
- }
61
-
62
- updated(changedProperties: PropertyValues<this>) {
63
- if (changedProperties.has("active")) {
64
- this.ariaSelected = this.active ? "true" : "false"
65
- this.tabIndex = this.active ? 0 : -1
66
- }
67
- }
68
-
69
- render() {
70
- return html`<span class="label"><slot></slot></span>`
71
- }
72
- }
@@ -1,267 +0,0 @@
1
- import { html, PropertyValues } from "lit"
2
- import { property, state } from "lit/decorators.js"
3
- import { classMap } from "lit/directives/class-map.js"
4
- import { createRef, ref } from "lit/directives/ref.js"
5
-
6
- import { LeuElement } from "../../lib/LeuElement.js"
7
- import { LeuTab } from "./Tab.js"
8
- import { LeuTabPanel } from "./TabPanel.js"
9
-
10
- import styles from "./tab-group.css?inline"
11
-
12
- type ScrollableState = {
13
- left: boolean
14
- right: boolean
15
- }
16
-
17
- /**
18
- * Tab Group
19
- *
20
- * @slot tabs - Slot for the leu-tab elements
21
- * @slot panels - Slot for the leu-tab-panel elements
22
- * @todo: add disabled state to tabs and panels
23
- * @todo: add backdrop / shadow
24
- * @todo: add styling option for full-bleed layout (tabslist is full-bleed, panels use the full width of the container)
25
- *
26
- * @tagname leu-tab-group
27
- */
28
- export class LeuTabGroup extends LeuElement {
29
- static styles = [LeuElement.styles, styles]
30
-
31
- /**
32
- * Label for the tab list, used for accessibility.
33
- * Content will not be visible on the page, but should be provided for screen readers.
34
- */
35
- @property({ type: String })
36
- label = ""
37
-
38
- /**
39
- * Name of the active/selected tab and panel. Has to match the name property of a leu-tab and leu-tab-panel.
40
- */
41
- @property({ type: String, reflect: true })
42
- active = ""
43
-
44
- @state()
45
- protected isScrollable: ScrollableState = { left: false, right: false }
46
-
47
- @state()
48
- protected tabs: LeuTab[] = []
49
-
50
- @state()
51
- protected panels: LeuTabPanel[] = []
52
-
53
- protected initialShowEventDispatched = false
54
-
55
- protected tabMenuRef = createRef<HTMLDivElement>()
56
-
57
- protected resizeObserver = new ResizeObserver(() => {
58
- this.checkScrollable()
59
- })
60
-
61
- // Observe changes to the id attribute of tabs and panels
62
- // to update the aria attributes accordingly
63
- protected mutationObserver = new MutationObserver((records) => {
64
- for (const record of records) {
65
- if (!(record.target instanceof HTMLElement)) {
66
- continue
67
- }
68
-
69
- if (
70
- record.type === "attributes" &&
71
- record.attributeName === "id" &&
72
- record.target.matches("leu-tab, leu-tab-panel")
73
- ) {
74
- this.linkTabsAndPanels()
75
- continue
76
- }
77
- }
78
- })
79
-
80
- connectedCallback() {
81
- super.connectedCallback()
82
- }
83
-
84
- disconnectedCallback() {
85
- super.disconnectedCallback()
86
- this.resizeObserver.disconnect()
87
- this.mutationObserver.disconnect()
88
- }
89
-
90
- firstUpdated() {
91
- if (this.tabMenuRef.value) {
92
- this.resizeObserver.observe(this.tabMenuRef.value)
93
- }
94
-
95
- this.mutationObserver.observe(this, {
96
- subtree: true,
97
- attributes: true,
98
- attributeFilter: ["id"],
99
- })
100
- }
101
-
102
- updated(changedProperties: PropertyValues) {
103
- if (
104
- changedProperties.has("active") ||
105
- changedProperties.has("tabs") ||
106
- changedProperties.has("panels")
107
- ) {
108
- this.updatePanels()
109
- this.updateTabs()
110
- }
111
- }
112
-
113
- protected async handleTabsSlotChange() {
114
- const slot =
115
- this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name="tabs"]')
116
-
117
- this.tabs =
118
- slot
119
- ?.assignedElements({ flatten: true })
120
- .filter((el) => el instanceof LeuTab) ?? []
121
-
122
- // if the active tab is not in the new set of tabs, activate the first tab
123
- if (
124
- this.tabs.length > 0 &&
125
- !this.tabs.some((tab) => tab.name === this.active)
126
- ) {
127
- this.active = this.tabs[0].name
128
- }
129
- this.linkTabsAndPanels()
130
-
131
- await this.updateComplete
132
- this.checkScrollable()
133
- }
134
-
135
- protected handlePanelsSlotChange() {
136
- const slot = this.shadowRoot?.querySelector<HTMLSlotElement>(
137
- 'slot[name="panels"]',
138
- )
139
-
140
- this.panels =
141
- slot
142
- ?.assignedElements({ flatten: true })
143
- .filter((el) => el instanceof LeuTabPanel) ?? []
144
-
145
- this.linkTabsAndPanels()
146
- }
147
-
148
- /**
149
- * Link tabs and panels by setting the appropriate aria attributes.
150
- * Generates global ids for tabs and panels if they don't have one.
151
- */
152
- protected linkTabsAndPanels() {
153
- for (const tab of this.tabs) {
154
- const panel = this.panels.find((o) => o.name === tab.name)
155
-
156
- if (!panel) continue
157
-
158
- tab.setAttribute("aria-controls", panel.id)
159
- panel.setAttribute("aria-labelledby", tab.id)
160
- }
161
- }
162
-
163
- protected get activeTab() {
164
- return this.tabs.find((o) => o.active)
165
- }
166
-
167
- protected get activePanel() {
168
- return this.panels.find((o) => o.name === this.activeTab?.name)
169
- }
170
-
171
- protected updatePanels() {
172
- for (const panel of this.panels) {
173
- panel.active = panel.name === this.active
174
- }
175
- }
176
-
177
- protected updateTabs() {
178
- for (const tab of this.tabs) {
179
- tab.active = tab.name === this.active
180
- }
181
- }
182
-
183
- protected async keydownHandler(event: KeyboardEvent) {
184
- const activeTab = this.activeTab
185
- let nextTab: LeuTab | null = null
186
-
187
- if (
188
- !["ArrowRight", "ArrowLeft", "Home", "End"].includes(event.key) ||
189
- !activeTab
190
- ) {
191
- return
192
- }
193
-
194
- switch (event.key) {
195
- case "ArrowRight":
196
- case "ArrowLeft": {
197
- const direction = event.key === "ArrowRight" ? 1 : -1
198
- const currentIndex = this.tabs.indexOf(activeTab)
199
- const numOfTabs = this.tabs.length
200
- // cycle through the tabs
201
- const nextIndex = (currentIndex + direction + numOfTabs) % numOfTabs
202
- nextTab = this.tabs[nextIndex]
203
- break
204
- }
205
-
206
- case "Home":
207
- nextTab = this.tabs[0]
208
- break
209
- case "End":
210
- nextTab = this.tabs[this.tabs.length - 1]
211
- break
212
- default:
213
- return
214
- }
215
-
216
- this.active = nextTab.name
217
- await this.updateComplete
218
- nextTab.focus()
219
- nextTab.scrollIntoView({
220
- block: "nearest",
221
- inline: "nearest",
222
- })
223
- }
224
-
225
- protected checkScrollable() {
226
- const tabMenu = this.tabMenuRef.value
227
- if (!tabMenu) return
228
-
229
- this.isScrollable = {
230
- left: tabMenu.scrollLeft > 0,
231
- right: tabMenu.scrollLeft < tabMenu.scrollWidth - tabMenu.clientWidth,
232
- }
233
- }
234
-
235
- protected handleScrollEvent() {
236
- this.checkScrollable()
237
- }
238
-
239
- protected handleTabSelect(event: CustomEvent) {
240
- this.active = event.detail.name
241
- }
242
-
243
- render() {
244
- const containerClasses = {
245
- container: true,
246
- "container--scrollable-left": this.isScrollable.left,
247
- "container--scrollable-right": this.isScrollable.right,
248
- }
249
-
250
- return html`
251
- <div class=${classMap(containerClasses)}>
252
- <div
253
- class="tab-menu"
254
- role="tablist"
255
- @keydown=${this.keydownHandler}
256
- @leu:tab-select=${this.handleTabSelect}
257
- @scroll="${this.handleScrollEvent}"
258
- aria-label=${this.label}
259
- ${ref(this.tabMenuRef)}
260
- >
261
- <slot name="tabs" @slotchange=${this.handleTabsSlotChange}></slot>
262
- </div>
263
- </div>
264
- <slot name="panels" @slotchange=${this.handlePanelsSlotChange}></slot>
265
- `
266
- }
267
- }
@@ -1,59 +0,0 @@
1
- import { html, PropertyValues } from "lit"
2
- import { property } from "lit/decorators.js"
3
-
4
- import { LeuElement } from "../../lib/LeuElement.js"
5
-
6
- import styles from "./tab-panel.css?inline"
7
-
8
- let nextId = 1
9
-
10
- /**
11
- * Tab Panel
12
- *
13
- * @tagname leu-tab-panel
14
- * @fires leu:show-tab-panel - Fired when a tab panel is shown
15
- */
16
- export class LeuTabPanel extends LeuElement {
17
- static styles = [LeuElement.styles, styles]
18
-
19
- protected readonly componentId = `leu-tab-panel-${nextId++}`
20
-
21
- /**
22
- * Name of the tab. Apply the same name to the corresponding tab button to link them together.
23
- * Has to be unique within the tab component.
24
- */
25
- @property({ type: String, reflect: true })
26
- name = ""
27
-
28
- @property({ type: Boolean, reflect: true })
29
- active = false
30
-
31
- connectedCallback() {
32
- super.connectedCallback()
33
- this.setAttribute("role", "tabpanel")
34
- this.tabIndex = 0
35
- // Set an id if not already provided. The id is used by the tab-group
36
- // to set the aria-controls attribute on the corresponding tab button.
37
- this.id = this.id.length > 0 ? this.id : this.componentId
38
- }
39
-
40
- protected updated(changedProperties: PropertyValues): void {
41
- if (changedProperties.has("active")) {
42
- this.ariaHidden = this.active ? "false" : "true"
43
-
44
- if (this.active) {
45
- this.dispatchEvent(
46
- new CustomEvent("leu:show-tab-panel", {
47
- detail: { name: this.name },
48
- bubbles: true,
49
- composed: true,
50
- }),
51
- )
52
- }
53
- }
54
- }
55
-
56
- render() {
57
- return html`<slot></slot>`
58
- }
59
- }
@@ -1,11 +0,0 @@
1
- import { LeuTabGroup } from "./TabGroup.js"
2
-
3
- export { LeuTabGroup }
4
-
5
- LeuTabGroup.define("leu-tab-group")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-tab-group": LeuTabGroup
10
- }
11
- }
@@ -1,11 +0,0 @@
1
- import { LeuTabPanel } from "./TabPanel.js"
2
-
3
- export { LeuTabPanel }
4
-
5
- LeuTabPanel.define("leu-tab-panel")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-tab-panel": LeuTabPanel
10
- }
11
- }
@@ -1,11 +0,0 @@
1
- import { LeuTab } from "./Tab.js"
2
-
3
- export { LeuTab }
4
-
5
- LeuTab.define("leu-tab")
6
-
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "leu-tab": LeuTab
10
- }
11
- }
@@ -1,97 +0,0 @@
1
- import { Meta, StoryObj } from "@storybook/web-components-vite"
2
- import { action } from "storybook/actions"
3
- import { html } from "lit"
4
-
5
- import { LeuTabGroup } from "../leu-tab-group.js"
6
- import "../leu-tab-group.js"
7
- import "../leu-tab.js"
8
- import "../leu-tab-panel.js"
9
- import { ifDefined } from "lit/directives/if-defined.js"
10
-
11
- type StoryArgs = LeuTabGroup
12
- type Story = StoryObj<StoryArgs>
13
-
14
- export default {
15
- title: "Components/Tab",
16
- component: "leu-tab-group",
17
- parameters: {
18
- design: {
19
- type: "figma",
20
- url: "https://www.figma.com/design/d6Pv21UVUbnBs3AdcZijHmbN/KTZH-Design-System?node-id=21161-184423",
21
- },
22
- },
23
- args: {
24
- onLeuTabPanelShow: action("leu:show-tab-panel"),
25
- },
26
- } satisfies Meta<StoryArgs>
27
-
28
- interface Args {
29
- active?: string
30
- label?: string
31
- onLeuTabPanelShow?: (event: CustomEvent) => void
32
- }
33
-
34
- const Template: Story = {
35
- render: (args: Args = {}) => {
36
- return html`
37
- <leu-tab-group
38
- active=${ifDefined(args.active)}
39
- label=${ifDefined(args.label)}
40
- @leu:show-tab-panel=${args.onLeuTabPanelShow}
41
- >
42
- <leu-tab slot="tabs" name="online">Online</leu-tab>
43
- <leu-tab-panel slot="panels" name="online">
44
- <p>
45
- Online – Wenn Ihr Ausweis vor dem 01.01.2013 ausgestellt wurde,
46
- müssen Sie ein neues Passfoto machen. Ihr Reisebüro oder das
47
- Konsulat Ihres Reiseziels können Ihnen dabei helfen.
48
- </p>
49
- </leu-tab-panel>
50
- <leu-tab slot="tabs" name="vor-ort">Vor Ort</leu-tab>
51
-
52
- <leu-tab-panel slot="panels" name="vor-ort">
53
- <p>
54
- Vor Ort – Wenn Ihr Ausweis vor dem 01.01.2013 ausgestellt wurde,
55
- müssen Sie ein neues Passfoto machen. Ihr Reisebüro oder das
56
- Konsulat Ihres Reiseziels können Ihnen dabei helfen.
57
- </p>
58
- </leu-tab-panel>
59
-
60
- <leu-tab slot="tabs" name="per-post">Per Post</leu-tab>
61
- <leu-tab-panel slot="panels" name="per-post">
62
- <p>
63
- Per Post – Wenn Ihr Ausweis vor dem 01.01.2013 ausgestellt wurde,
64
- müssen Sie ein neues Passfoto machen. Ihr Reisebüro oder das
65
- Konsulat Ihres Reiseziels können Ihnen dabei helfen.
66
- </p>
67
- </leu-tab-panel>
68
-
69
- <leu-tab slot="tabs" name="telefonisch">Telefonisch</leu-tab>
70
- <leu-tab-panel slot="panels" name="telefonisch">
71
- <p>
72
- Telefonisch – Wenn Ihr Ausweis vor dem 01.01.2013 ausgestellt wurde,
73
- müssen Sie ein neues Passfoto machen. Ihr Reisebüro oder das
74
- Konsulat Ihres Reiseziels können Ihnen dabei helfen.
75
- </p>
76
- </leu-tab-panel>
77
-
78
- <leu-tab slot="tabs" name="service">Service</leu-tab>
79
- <leu-tab-panel slot="panels" name="service">
80
- <p>
81
- Service – Wenn Ihr Ausweis vor dem 01.01.2013 ausgestellt wurde,
82
- müssen Sie ein neues Passfoto machen. Ihr Reisebüro oder das
83
- Konsulat Ihres Reiseziels können Ihnen dabei helfen.
84
- </p>
85
- </leu-tab-panel>
86
- </leu-tab-group>
87
- `
88
- },
89
- }
90
-
91
- export const Regular = {
92
- ...Template,
93
- args: {
94
- active: "online",
95
- label: "Reiseinformationen",
96
- },
97
- }