@statistikzh/leu 0.28.0 → 0.28.2

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