@statistikzh/leu 0.28.1 → 0.28.2

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