@helpwave/hightide 0.1.6 → 0.1.7

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 (502) hide show
  1. package/dist/coloring/{shading.d.cts → shading.d.mts} +1 -1
  2. package/dist/coloring/shading.js +14 -3329
  3. package/dist/coloring/shading.js.map +1 -1
  4. package/dist/coloring/shading.mjs +47 -0
  5. package/dist/coloring/shading.mjs.map +1 -0
  6. package/dist/coloring/types.js +26 -2
  7. package/dist/coloring/types.js.map +1 -1
  8. package/dist/coloring/types.mjs +6 -0
  9. package/dist/coloring/{types.cjs.map → types.mjs.map} +1 -1
  10. package/dist/components/branding/HelpwaveBadge.js +59 -25
  11. package/dist/components/branding/HelpwaveBadge.js.map +1 -1
  12. package/dist/components/branding/HelpwaveBadge.mjs +122 -0
  13. package/dist/components/branding/HelpwaveBadge.mjs.map +1 -0
  14. package/dist/components/date/{DatePicker.d.cts → DatePicker.d.mts} +5 -5
  15. package/dist/components/date/DatePicker.js +119 -83
  16. package/dist/components/date/DatePicker.js.map +1 -1
  17. package/dist/components/date/{DatePicker.cjs → DatePicker.mjs} +85 -120
  18. package/dist/components/date/DatePicker.mjs.map +1 -0
  19. package/dist/components/date/{DayPicker.d.cts → DayPicker.d.mts} +1 -1
  20. package/dist/components/date/DayPicker.js +55 -18
  21. package/dist/components/date/DayPicker.js.map +1 -1
  22. package/dist/components/date/{DayPicker.cjs → DayPicker.mjs} +19 -57
  23. package/dist/components/date/DayPicker.mjs.map +1 -0
  24. package/dist/components/date/{TimeDisplay.d.cts → TimeDisplay.d.mts} +2 -2
  25. package/dist/components/date/TimeDisplay.js +35 -9
  26. package/dist/components/date/TimeDisplay.js.map +1 -1
  27. package/dist/components/date/{TimeDisplay.cjs → TimeDisplay.mjs} +10 -37
  28. package/dist/components/date/TimeDisplay.mjs.map +1 -0
  29. package/dist/components/date/TimePicker.js +57 -22
  30. package/dist/components/date/TimePicker.js.map +1 -1
  31. package/dist/components/date/{TimePicker.cjs → TimePicker.mjs} +23 -59
  32. package/dist/components/date/TimePicker.mjs.map +1 -0
  33. package/dist/components/date/{YearMonthPicker.d.cts → YearMonthPicker.d.mts} +1 -1
  34. package/dist/components/date/YearMonthPicker.d.ts +1 -1
  35. package/dist/components/date/YearMonthPicker.js +73 -38
  36. package/dist/components/date/YearMonthPicker.js.map +1 -1
  37. package/dist/components/date/{YearMonthPicker.cjs → YearMonthPicker.mjs} +39 -75
  38. package/dist/components/date/YearMonthPicker.mjs.map +1 -0
  39. package/dist/components/dialogs/{ConfirmDialog.d.cts → ConfirmDialog.d.mts} +4 -4
  40. package/dist/components/dialogs/ConfirmDialog.js +98 -62
  41. package/dist/components/dialogs/ConfirmDialog.js.map +1 -1
  42. package/dist/components/dialogs/{ConfirmDialog.cjs → ConfirmDialog.mjs} +63 -100
  43. package/dist/components/dialogs/ConfirmDialog.mjs.map +1 -0
  44. package/dist/components/icons-and-geometry/Avatar.js +47 -10
  45. package/dist/components/icons-and-geometry/Avatar.js.map +1 -1
  46. package/dist/components/icons-and-geometry/Avatar.mjs +81 -0
  47. package/dist/components/icons-and-geometry/{Avatar.cjs.map → Avatar.mjs.map} +1 -1
  48. package/dist/components/icons-and-geometry/Circle.js +40 -6
  49. package/dist/components/icons-and-geometry/Circle.js.map +1 -1
  50. package/dist/components/icons-and-geometry/Circle.mjs +27 -0
  51. package/dist/components/icons-and-geometry/{Circle.cjs.map → Circle.mjs.map} +1 -1
  52. package/dist/components/icons-and-geometry/Helpwave.js +38 -14
  53. package/dist/components/icons-and-geometry/Helpwave.js.map +1 -1
  54. package/dist/components/icons-and-geometry/Helpwave.mjs +75 -0
  55. package/dist/components/icons-and-geometry/{Helpwave.cjs.map → Helpwave.mjs.map} +1 -1
  56. package/dist/components/icons-and-geometry/Ring.js +74 -37
  57. package/dist/components/icons-and-geometry/Ring.js.map +1 -1
  58. package/dist/components/icons-and-geometry/{Ring.cjs → Ring.mjs} +38 -76
  59. package/dist/components/icons-and-geometry/{Ring.cjs.map → Ring.mjs.map} +1 -1
  60. package/dist/components/icons-and-geometry/Tag.js +28 -4
  61. package/dist/components/icons-and-geometry/Tag.js.map +1 -1
  62. package/dist/components/icons-and-geometry/Tag.mjs +22 -0
  63. package/dist/components/icons-and-geometry/{Tag.cjs.map → Tag.mjs.map} +1 -1
  64. package/dist/components/layout-and-navigation/BreadCrumb.js +195 -191
  65. package/dist/components/layout-and-navigation/BreadCrumb.js.map +1 -1
  66. package/dist/components/layout-and-navigation/{BreadCrumb.cjs → BreadCrumb.mjs} +191 -198
  67. package/dist/components/layout-and-navigation/{BreadCrumb.cjs.map → BreadCrumb.mjs.map} +1 -1
  68. package/dist/components/layout-and-navigation/Carousel.js +68 -34
  69. package/dist/components/layout-and-navigation/Carousel.js.map +1 -1
  70. package/dist/components/layout-and-navigation/{Carousel.cjs → Carousel.mjs} +35 -70
  71. package/dist/components/layout-and-navigation/{Carousel.cjs.map → Carousel.mjs.map} +1 -1
  72. package/dist/components/layout-and-navigation/Chip.js +43 -8
  73. package/dist/components/layout-and-navigation/Chip.js.map +1 -1
  74. package/dist/components/layout-and-navigation/Chip.mjs +69 -0
  75. package/dist/components/layout-and-navigation/{Chip.cjs.map → Chip.mjs.map} +1 -1
  76. package/dist/components/layout-and-navigation/DividerInserter.js +39 -5
  77. package/dist/components/layout-and-navigation/DividerInserter.js.map +1 -1
  78. package/dist/components/layout-and-navigation/DividerInserter.mjs +25 -0
  79. package/dist/components/layout-and-navigation/{DividerInserter.cjs.map → DividerInserter.mjs.map} +1 -1
  80. package/dist/components/layout-and-navigation/Expandable.js +52 -17
  81. package/dist/components/layout-and-navigation/Expandable.js.map +1 -1
  82. package/dist/components/layout-and-navigation/Expandable.mjs +81 -0
  83. package/dist/components/layout-and-navigation/Expandable.mjs.map +1 -0
  84. package/dist/components/layout-and-navigation/{FAQSection.d.cts → FAQSection.d.mts} +1 -1
  85. package/dist/components/layout-and-navigation/FAQSection.js +75 -41
  86. package/dist/components/layout-and-navigation/FAQSection.js.map +1 -1
  87. package/dist/components/layout-and-navigation/{FAQSection.cjs → FAQSection.mjs} +42 -77
  88. package/dist/components/layout-and-navigation/FAQSection.mjs.map +1 -0
  89. package/dist/components/layout-and-navigation/{MarkdownInterpreter.d.cts → MarkdownInterpreter.d.mts} +1 -1
  90. package/dist/components/layout-and-navigation/MarkdownInterpreter.d.ts +1 -1
  91. package/dist/components/layout-and-navigation/MarkdownInterpreter.js +43 -18
  92. package/dist/components/layout-and-navigation/MarkdownInterpreter.js.map +1 -1
  93. package/dist/components/layout-and-navigation/{MarkdownInterpreter.cjs → MarkdownInterpreter.mjs} +19 -45
  94. package/dist/components/layout-and-navigation/{MarkdownInterpreter.cjs.map → MarkdownInterpreter.mjs.map} +1 -1
  95. package/dist/components/layout-and-navigation/{Overlay.d.cts → Overlay.d.mts} +3 -3
  96. package/dist/components/layout-and-navigation/Overlay.d.ts +1 -1
  97. package/dist/components/layout-and-navigation/Overlay.js +91 -54
  98. package/dist/components/layout-and-navigation/Overlay.js.map +1 -1
  99. package/dist/components/layout-and-navigation/{Overlay.cjs → Overlay.mjs} +55 -93
  100. package/dist/components/layout-and-navigation/Overlay.mjs.map +1 -0
  101. package/dist/components/layout-and-navigation/{Pagination.d.cts → Pagination.d.mts} +2 -2
  102. package/dist/components/layout-and-navigation/Pagination.js +53 -19
  103. package/dist/components/layout-and-navigation/Pagination.js.map +1 -1
  104. package/dist/components/layout-and-navigation/Pagination.mjs +82 -0
  105. package/dist/components/layout-and-navigation/Pagination.mjs.map +1 -0
  106. package/dist/components/layout-and-navigation/{SearchableList.d.cts → SearchableList.d.mts} +2 -2
  107. package/dist/components/layout-and-navigation/SearchableList.js +76 -42
  108. package/dist/components/layout-and-navigation/SearchableList.js.map +1 -1
  109. package/dist/components/layout-and-navigation/SearchableList.mjs +252 -0
  110. package/dist/components/layout-and-navigation/SearchableList.mjs.map +1 -0
  111. package/dist/components/layout-and-navigation/{StepperBar.d.cts → StepperBar.d.mts} +3 -3
  112. package/dist/components/layout-and-navigation/StepperBar.d.ts +1 -1
  113. package/dist/components/layout-and-navigation/StepperBar.js +69 -34
  114. package/dist/components/layout-and-navigation/StepperBar.js.map +1 -1
  115. package/dist/components/layout-and-navigation/{StepperBar.cjs → StepperBar.mjs} +35 -71
  116. package/dist/components/layout-and-navigation/StepperBar.mjs.map +1 -0
  117. package/dist/components/layout-and-navigation/{Table.d.cts → Table.d.mts} +4 -4
  118. package/dist/components/layout-and-navigation/Table.d.ts +3 -3
  119. package/dist/components/layout-and-navigation/Table.js +111 -68
  120. package/dist/components/layout-and-navigation/Table.js.map +1 -1
  121. package/dist/components/layout-and-navigation/{Table.cjs → Table.mjs} +69 -113
  122. package/dist/components/layout-and-navigation/Table.mjs.map +1 -0
  123. package/dist/components/layout-and-navigation/{TextImage.d.cts → TextImage.d.mts} +2 -2
  124. package/dist/components/layout-and-navigation/TextImage.js +54 -18
  125. package/dist/components/layout-and-navigation/TextImage.js.map +1 -1
  126. package/dist/components/layout-and-navigation/TextImage.mjs +101 -0
  127. package/dist/components/layout-and-navigation/TextImage.mjs.map +1 -0
  128. package/dist/components/layout-and-navigation/Tile.js +42 -8
  129. package/dist/components/layout-and-navigation/Tile.js.map +1 -1
  130. package/dist/components/layout-and-navigation/Tile.mjs +23 -0
  131. package/dist/components/layout-and-navigation/{Tile.cjs.map → Tile.mjs.map} +1 -1
  132. package/dist/components/layout-and-navigation/VerticalDivider.js +33 -9
  133. package/dist/components/layout-and-navigation/VerticalDivider.js.map +1 -1
  134. package/dist/components/layout-and-navigation/VerticalDivider.mjs +56 -0
  135. package/dist/components/layout-and-navigation/{VerticalDivider.cjs.map → VerticalDivider.mjs.map} +1 -1
  136. package/dist/components/loading-states/{ErrorComponent.d.cts → ErrorComponent.d.mts} +2 -2
  137. package/dist/components/loading-states/ErrorComponent.js +46 -12
  138. package/dist/components/loading-states/ErrorComponent.js.map +1 -1
  139. package/dist/components/loading-states/ErrorComponent.mjs +68 -0
  140. package/dist/components/loading-states/ErrorComponent.mjs.map +1 -0
  141. package/dist/components/loading-states/{LoadingAndErrorComponent.d.cts → LoadingAndErrorComponent.d.mts} +5 -5
  142. package/dist/components/loading-states/LoadingAndErrorComponent.d.ts +1 -1
  143. package/dist/components/loading-states/LoadingAndErrorComponent.js +68 -34
  144. package/dist/components/loading-states/LoadingAndErrorComponent.js.map +1 -1
  145. package/dist/components/loading-states/LoadingAndErrorComponent.mjs +194 -0
  146. package/dist/components/loading-states/LoadingAndErrorComponent.mjs.map +1 -0
  147. package/dist/components/loading-states/{LoadingAnimation.d.cts → LoadingAnimation.d.mts} +2 -2
  148. package/dist/components/loading-states/LoadingAnimation.js +59 -23
  149. package/dist/components/loading-states/LoadingAnimation.js.map +1 -1
  150. package/dist/components/loading-states/LoadingAnimation.mjs +139 -0
  151. package/dist/components/loading-states/LoadingAnimation.mjs.map +1 -0
  152. package/dist/components/loading-states/{LoadingButton.d.cts → LoadingButton.d.mts} +1 -1
  153. package/dist/components/loading-states/LoadingButton.js +62 -28
  154. package/dist/components/loading-states/LoadingButton.js.map +1 -1
  155. package/dist/components/loading-states/{LoadingButton.cjs → LoadingButton.mjs} +29 -64
  156. package/dist/components/loading-states/LoadingButton.mjs.map +1 -0
  157. package/dist/components/loading-states/ProgressIndicator.js +30 -6
  158. package/dist/components/loading-states/ProgressIndicator.js.map +1 -1
  159. package/dist/components/loading-states/ProgressIndicator.mjs +59 -0
  160. package/dist/components/loading-states/{ProgressIndicator.cjs.map → ProgressIndicator.mjs.map} +1 -1
  161. package/dist/components/modals/{ConfirmModal.d.cts → ConfirmModal.d.mts} +4 -4
  162. package/dist/components/modals/ConfirmModal.js +99 -63
  163. package/dist/components/modals/ConfirmModal.js.map +1 -1
  164. package/dist/components/modals/{ConfirmModal.cjs → ConfirmModal.mjs} +64 -101
  165. package/dist/components/modals/ConfirmModal.mjs.map +1 -0
  166. package/dist/components/modals/{DiscardChangesModal.d.cts → DiscardChangesModal.d.mts} +5 -5
  167. package/dist/components/modals/DiscardChangesModal.js +101 -65
  168. package/dist/components/modals/DiscardChangesModal.js.map +1 -1
  169. package/dist/components/modals/{DiscardChangesModal.cjs → DiscardChangesModal.mjs} +66 -103
  170. package/dist/components/modals/DiscardChangesModal.mjs.map +1 -0
  171. package/dist/components/modals/{InputModal.d.cts → InputModal.d.mts} +7 -7
  172. package/dist/components/modals/InputModal.js +124 -88
  173. package/dist/components/modals/InputModal.js.map +1 -1
  174. package/dist/components/modals/{InputModal.cjs → InputModal.mjs} +89 -126
  175. package/dist/components/modals/InputModal.mjs.map +1 -0
  176. package/dist/components/modals/{LanguageModal.d.cts → LanguageModal.d.mts} +3 -3
  177. package/dist/components/modals/LanguageModal.js +130 -95
  178. package/dist/components/modals/LanguageModal.js.map +1 -1
  179. package/dist/components/modals/{LanguageModal.cjs → LanguageModal.mjs} +95 -133
  180. package/dist/components/modals/LanguageModal.mjs.map +1 -0
  181. package/dist/components/modals/{ThemeModal.d.cts → ThemeModal.d.mts} +4 -4
  182. package/dist/components/modals/ThemeModal.js +134 -99
  183. package/dist/components/modals/ThemeModal.js.map +1 -1
  184. package/dist/components/modals/{ThemeModal.cjs → ThemeModal.mjs} +99 -137
  185. package/dist/components/modals/ThemeModal.mjs.map +1 -0
  186. package/dist/components/properties/{CheckboxProperty.d.cts → CheckboxProperty.d.mts} +3 -3
  187. package/dist/components/properties/CheckboxProperty.js +87 -53
  188. package/dist/components/properties/CheckboxProperty.js.map +1 -1
  189. package/dist/components/properties/{CheckboxProperty.cjs → CheckboxProperty.mjs} +54 -89
  190. package/dist/components/properties/CheckboxProperty.mjs.map +1 -0
  191. package/dist/components/properties/{DateProperty.d.cts → DateProperty.d.mts} +3 -3
  192. package/dist/components/properties/DateProperty.js +94 -60
  193. package/dist/components/properties/DateProperty.js.map +1 -1
  194. package/dist/components/properties/{DateProperty.cjs → DateProperty.mjs} +61 -96
  195. package/dist/components/properties/DateProperty.mjs.map +1 -0
  196. package/dist/components/properties/{MultiSelectProperty.d.cts → MultiSelectProperty.d.mts} +5 -5
  197. package/dist/components/properties/MultiSelectProperty.js +157 -123
  198. package/dist/components/properties/MultiSelectProperty.js.map +1 -1
  199. package/dist/components/properties/{MultiSelectProperty.cjs → MultiSelectProperty.mjs} +124 -159
  200. package/dist/components/properties/MultiSelectProperty.mjs.map +1 -0
  201. package/dist/components/properties/{NumberProperty.d.cts → NumberProperty.d.mts} +3 -3
  202. package/dist/components/properties/NumberProperty.js +95 -61
  203. package/dist/components/properties/NumberProperty.js.map +1 -1
  204. package/dist/components/properties/{NumberProperty.cjs → NumberProperty.mjs} +62 -97
  205. package/dist/components/properties/NumberProperty.mjs.map +1 -0
  206. package/dist/components/properties/{PropertyBase.d.cts → PropertyBase.d.mts} +2 -2
  207. package/dist/components/properties/PropertyBase.js +63 -29
  208. package/dist/components/properties/PropertyBase.js.map +1 -1
  209. package/dist/components/properties/PropertyBase.mjs +188 -0
  210. package/dist/components/properties/PropertyBase.mjs.map +1 -0
  211. package/dist/components/properties/{SelectProperty.d.cts → SelectProperty.d.mts} +5 -5
  212. package/dist/components/properties/SelectProperty.js +119 -86
  213. package/dist/components/properties/SelectProperty.js.map +1 -1
  214. package/dist/components/properties/{SelectProperty.cjs → SelectProperty.mjs} +86 -122
  215. package/dist/components/properties/SelectProperty.mjs.map +1 -0
  216. package/dist/components/properties/{TextProperty.d.cts → TextProperty.d.mts} +3 -3
  217. package/dist/components/properties/TextProperty.js +92 -58
  218. package/dist/components/properties/TextProperty.js.map +1 -1
  219. package/dist/components/properties/{TextProperty.cjs → TextProperty.mjs} +59 -94
  220. package/dist/components/properties/TextProperty.mjs.map +1 -0
  221. package/dist/components/user-action/Button.js +67 -28
  222. package/dist/components/user-action/Button.js.map +1 -1
  223. package/dist/components/user-action/{Button.cjs → Button.mjs} +29 -69
  224. package/dist/components/user-action/{Button.cjs.map → Button.mjs.map} +1 -1
  225. package/dist/components/user-action/{Checkbox.d.cts → Checkbox.d.mts} +1 -1
  226. package/dist/components/user-action/Checkbox.js +58 -23
  227. package/dist/components/user-action/Checkbox.js.map +1 -1
  228. package/dist/components/user-action/Checkbox.mjs +122 -0
  229. package/dist/components/user-action/Checkbox.mjs.map +1 -0
  230. package/dist/components/user-action/{DateAndTimePicker.d.cts → DateAndTimePicker.d.mts} +7 -7
  231. package/dist/components/user-action/DateAndTimePicker.js +142 -107
  232. package/dist/components/user-action/DateAndTimePicker.js.map +1 -1
  233. package/dist/components/user-action/{DateAndTimePicker.cjs → DateAndTimePicker.mjs} +109 -143
  234. package/dist/components/user-action/DateAndTimePicker.mjs.map +1 -0
  235. package/dist/components/user-action/{Input.d.cts → Input.d.mts} +1 -1
  236. package/dist/components/user-action/Input.js +62 -26
  237. package/dist/components/user-action/Input.js.map +1 -1
  238. package/dist/components/user-action/Input.mjs +186 -0
  239. package/dist/components/user-action/Input.mjs.map +1 -0
  240. package/dist/components/user-action/Label.js +39 -5
  241. package/dist/components/user-action/Label.js.map +1 -1
  242. package/dist/components/user-action/Label.mjs +21 -0
  243. package/dist/components/user-action/{Label.cjs.map → Label.mjs.map} +1 -1
  244. package/dist/components/user-action/Menu.js +54 -19
  245. package/dist/components/user-action/Menu.js.map +1 -1
  246. package/dist/components/user-action/Menu.mjs +127 -0
  247. package/dist/components/user-action/Menu.mjs.map +1 -0
  248. package/dist/components/user-action/{MultiSelect.d.cts → MultiSelect.d.mts} +3 -3
  249. package/dist/components/user-action/MultiSelect.js +118 -84
  250. package/dist/components/user-action/MultiSelect.js.map +1 -1
  251. package/dist/components/user-action/{MultiSelect.cjs → MultiSelect.mjs} +85 -120
  252. package/dist/components/user-action/MultiSelect.mjs.map +1 -0
  253. package/dist/components/user-action/ScrollPicker.js +50 -16
  254. package/dist/components/user-action/ScrollPicker.js.map +1 -1
  255. package/dist/components/user-action/{ScrollPicker.cjs → ScrollPicker.mjs} +17 -52
  256. package/dist/components/user-action/ScrollPicker.mjs.map +1 -0
  257. package/dist/components/user-action/{Select.d.cts → Select.d.mts} +2 -2
  258. package/dist/components/user-action/Select.d.ts +1 -1
  259. package/dist/components/user-action/Select.js +88 -53
  260. package/dist/components/user-action/Select.js.map +1 -1
  261. package/dist/components/user-action/{Select.cjs → Select.mjs} +53 -91
  262. package/dist/components/user-action/Select.mjs.map +1 -0
  263. package/dist/components/user-action/{Textarea.d.cts → Textarea.d.mts} +1 -1
  264. package/dist/components/user-action/Textarea.js +60 -25
  265. package/dist/components/user-action/Textarea.js.map +1 -1
  266. package/dist/components/user-action/Textarea.mjs +163 -0
  267. package/dist/components/user-action/Textarea.mjs.map +1 -0
  268. package/dist/components/user-action/ToggleableInput.js +61 -26
  269. package/dist/components/user-action/ToggleableInput.js.map +1 -1
  270. package/dist/components/user-action/ToggleableInput.mjs +156 -0
  271. package/dist/components/user-action/ToggleableInput.mjs.map +1 -0
  272. package/dist/components/user-action/Tooltip.js +41 -15
  273. package/dist/components/user-action/Tooltip.js.map +1 -1
  274. package/dist/components/user-action/{Tooltip.cjs → Tooltip.mjs} +16 -43
  275. package/dist/components/user-action/Tooltip.mjs.map +1 -0
  276. package/dist/css/globals.css +33 -24
  277. package/dist/css/uncompiled/globals.css +19 -7
  278. package/dist/hooks/useHoverState.js +31 -7
  279. package/dist/hooks/useHoverState.js.map +1 -1
  280. package/dist/hooks/useHoverState.mjs +47 -0
  281. package/dist/hooks/{useHoverState.cjs.map → useHoverState.mjs.map} +1 -1
  282. package/dist/hooks/useLocalStorage.js +31 -7
  283. package/dist/hooks/useLocalStorage.js.map +1 -1
  284. package/dist/hooks/useLocalStorage.mjs +58 -0
  285. package/dist/hooks/{useLocalStorage.cjs.map → useLocalStorage.mjs.map} +1 -1
  286. package/dist/hooks/useOutsideClick.js +28 -4
  287. package/dist/hooks/useOutsideClick.js.map +1 -1
  288. package/dist/hooks/useOutsideClick.mjs +23 -0
  289. package/dist/hooks/{useOutsideClick.cjs.map → useOutsideClick.mjs.map} +1 -1
  290. package/dist/hooks/useSaveDelay.js +30 -6
  291. package/dist/hooks/useSaveDelay.js.map +1 -1
  292. package/dist/hooks/useSaveDelay.mjs +43 -0
  293. package/dist/hooks/{useSaveDelay.cjs.map → useSaveDelay.mjs.map} +1 -1
  294. package/dist/{index.d.cts → index.d.mts} +78 -78
  295. package/dist/index.js +1038 -885
  296. package/dist/index.js.map +1 -1
  297. package/dist/{index.cjs → index.mjs} +886 -1038
  298. package/dist/index.mjs.map +1 -0
  299. package/dist/localization/{LanguageProvider.d.cts → LanguageProvider.d.mts} +1 -1
  300. package/dist/localization/LanguageProvider.js +43 -16
  301. package/dist/localization/LanguageProvider.js.map +1 -1
  302. package/dist/localization/{LanguageProvider.cjs → LanguageProvider.mjs} +17 -45
  303. package/dist/localization/LanguageProvider.mjs.map +1 -0
  304. package/dist/localization/{useTranslation.d.cts → useTranslation.d.mts} +1 -1
  305. package/dist/localization/useTranslation.js +33 -7
  306. package/dist/localization/useTranslation.js.map +1 -1
  307. package/dist/localization/useTranslation.mjs +42 -0
  308. package/dist/localization/useTranslation.mjs.map +1 -0
  309. package/dist/localization/util.js +26 -2
  310. package/dist/localization/util.js.map +1 -1
  311. package/dist/localization/util.mjs +16 -0
  312. package/dist/localization/{util.cjs.map → util.mjs.map} +1 -1
  313. package/dist/theming/{useTheme.d.cts → useTheme.d.mts} +2 -2
  314. package/dist/theming/useTheme.js +37 -10
  315. package/dist/theming/useTheme.js.map +1 -1
  316. package/dist/theming/useTheme.mjs +48 -0
  317. package/dist/theming/useTheme.mjs.map +1 -0
  318. package/dist/util/array.js +32 -2
  319. package/dist/util/array.js.map +1 -1
  320. package/dist/util/{array.cjs → array.mjs} +3 -34
  321. package/dist/util/{array.cjs.map → array.mjs.map} +1 -1
  322. package/dist/util/builder.js +26 -2
  323. package/dist/util/builder.js.map +1 -1
  324. package/dist/util/builder.mjs +9 -0
  325. package/dist/util/{builder.cjs.map → builder.mjs.map} +1 -1
  326. package/dist/util/date.js +39 -2
  327. package/dist/util/date.js.map +1 -1
  328. package/dist/util/{date.cjs → date.mjs} +3 -41
  329. package/dist/util/date.mjs.map +1 -0
  330. package/dist/util/easeFunctions.js +28 -2
  331. package/dist/util/easeFunctions.js.map +1 -1
  332. package/dist/util/easeFunctions.mjs +36 -0
  333. package/dist/util/easeFunctions.mjs.map +1 -0
  334. package/dist/util/emailValidation.js +26 -2
  335. package/dist/util/emailValidation.js.map +1 -1
  336. package/dist/util/emailValidation.mjs +8 -0
  337. package/dist/util/{emailValidation.cjs.map → emailValidation.mjs.map} +1 -1
  338. package/dist/util/loopingArray.js +26 -2
  339. package/dist/util/loopingArray.js.map +1 -1
  340. package/dist/util/{loopingArray.cjs → loopingArray.mjs} +3 -28
  341. package/dist/util/{loopingArray.cjs.map → loopingArray.mjs.map} +1 -1
  342. package/dist/util/math.js +26 -2
  343. package/dist/util/math.js.map +1 -1
  344. package/dist/util/math.mjs +8 -0
  345. package/dist/util/{math.cjs.map → math.mjs.map} +1 -1
  346. package/dist/util/news.d.mts +101 -0
  347. package/dist/util/news.d.ts +54 -54
  348. package/dist/util/news.js +39 -12
  349. package/dist/util/news.js.map +1 -1
  350. package/dist/util/news.mjs +49 -0
  351. package/dist/util/news.mjs.map +1 -0
  352. package/dist/util/noop.d.mts +3 -0
  353. package/dist/util/noop.d.ts +1 -1
  354. package/dist/util/noop.js +26 -2
  355. package/dist/util/noop.js.map +1 -1
  356. package/dist/util/noop.mjs +6 -0
  357. package/dist/util/noop.mjs.map +1 -0
  358. package/dist/util/simpleSearch.js +29 -2
  359. package/dist/util/simpleSearch.js.map +1 -1
  360. package/dist/util/simpleSearch.mjs +26 -0
  361. package/dist/util/{simpleSearch.cjs.map → simpleSearch.mjs.map} +1 -1
  362. package/dist/util/storage.js +27 -2
  363. package/dist/util/storage.js.map +1 -1
  364. package/dist/util/storage.mjs +38 -0
  365. package/dist/util/{storage.cjs.map → storage.mjs.map} +1 -1
  366. package/dist/util/types.js +17 -0
  367. package/dist/util/types.js.map +1 -1
  368. package/dist/util/types.mjs +1 -0
  369. package/dist/util/types.mjs.map +1 -0
  370. package/package.json +5 -7
  371. package/dist/coloring/shading.cjs +0 -3402
  372. package/dist/coloring/shading.cjs.map +0 -1
  373. package/dist/coloring/types.cjs +0 -31
  374. package/dist/components/branding/HelpwaveBadge.cjs +0 -157
  375. package/dist/components/branding/HelpwaveBadge.cjs.map +0 -1
  376. package/dist/components/date/DatePicker.cjs.map +0 -1
  377. package/dist/components/date/DayPicker.cjs.map +0 -1
  378. package/dist/components/date/TimeDisplay.cjs.map +0 -1
  379. package/dist/components/date/TimePicker.cjs.map +0 -1
  380. package/dist/components/date/YearMonthPicker.cjs.map +0 -1
  381. package/dist/components/dialogs/ConfirmDialog.cjs.map +0 -1
  382. package/dist/components/icons-and-geometry/Avatar.cjs +0 -119
  383. package/dist/components/icons-and-geometry/Circle.cjs +0 -62
  384. package/dist/components/icons-and-geometry/Helpwave.cjs +0 -100
  385. package/dist/components/icons-and-geometry/Tag.cjs +0 -47
  386. package/dist/components/layout-and-navigation/Chip.cjs +0 -105
  387. package/dist/components/layout-and-navigation/DividerInserter.cjs +0 -60
  388. package/dist/components/layout-and-navigation/Expandable.cjs +0 -117
  389. package/dist/components/layout-and-navigation/Expandable.cjs.map +0 -1
  390. package/dist/components/layout-and-navigation/FAQSection.cjs.map +0 -1
  391. package/dist/components/layout-and-navigation/Overlay.cjs.map +0 -1
  392. package/dist/components/layout-and-navigation/Pagination.cjs +0 -117
  393. package/dist/components/layout-and-navigation/Pagination.cjs.map +0 -1
  394. package/dist/components/layout-and-navigation/SearchableList.cjs +0 -287
  395. package/dist/components/layout-and-navigation/SearchableList.cjs.map +0 -1
  396. package/dist/components/layout-and-navigation/StepperBar.cjs.map +0 -1
  397. package/dist/components/layout-and-navigation/Table.cjs.map +0 -1
  398. package/dist/components/layout-and-navigation/TextImage.cjs +0 -138
  399. package/dist/components/layout-and-navigation/TextImage.cjs.map +0 -1
  400. package/dist/components/layout-and-navigation/Tile.cjs +0 -58
  401. package/dist/components/layout-and-navigation/VerticalDivider.cjs +0 -81
  402. package/dist/components/loading-states/ErrorComponent.cjs +0 -103
  403. package/dist/components/loading-states/ErrorComponent.cjs.map +0 -1
  404. package/dist/components/loading-states/LoadingAndErrorComponent.cjs +0 -229
  405. package/dist/components/loading-states/LoadingAndErrorComponent.cjs.map +0 -1
  406. package/dist/components/loading-states/LoadingAnimation.cjs +0 -176
  407. package/dist/components/loading-states/LoadingAnimation.cjs.map +0 -1
  408. package/dist/components/loading-states/LoadingButton.cjs.map +0 -1
  409. package/dist/components/loading-states/ProgressIndicator.cjs +0 -84
  410. package/dist/components/modals/ConfirmModal.cjs.map +0 -1
  411. package/dist/components/modals/DiscardChangesModal.cjs.map +0 -1
  412. package/dist/components/modals/InputModal.cjs.map +0 -1
  413. package/dist/components/modals/LanguageModal.cjs.map +0 -1
  414. package/dist/components/modals/ThemeModal.cjs.map +0 -1
  415. package/dist/components/properties/CheckboxProperty.cjs.map +0 -1
  416. package/dist/components/properties/DateProperty.cjs.map +0 -1
  417. package/dist/components/properties/MultiSelectProperty.cjs.map +0 -1
  418. package/dist/components/properties/NumberProperty.cjs.map +0 -1
  419. package/dist/components/properties/PropertyBase.cjs +0 -223
  420. package/dist/components/properties/PropertyBase.cjs.map +0 -1
  421. package/dist/components/properties/SelectProperty.cjs.map +0 -1
  422. package/dist/components/properties/TextProperty.cjs.map +0 -1
  423. package/dist/components/user-action/Checkbox.cjs +0 -158
  424. package/dist/components/user-action/Checkbox.cjs.map +0 -1
  425. package/dist/components/user-action/DateAndTimePicker.cjs.map +0 -1
  426. package/dist/components/user-action/Input.cjs +0 -223
  427. package/dist/components/user-action/Input.cjs.map +0 -1
  428. package/dist/components/user-action/Label.cjs +0 -56
  429. package/dist/components/user-action/Menu.cjs +0 -163
  430. package/dist/components/user-action/Menu.cjs.map +0 -1
  431. package/dist/components/user-action/MultiSelect.cjs.map +0 -1
  432. package/dist/components/user-action/ScrollPicker.cjs.map +0 -1
  433. package/dist/components/user-action/Select.cjs.map +0 -1
  434. package/dist/components/user-action/Textarea.cjs +0 -199
  435. package/dist/components/user-action/Textarea.cjs.map +0 -1
  436. package/dist/components/user-action/ToggleableInput.cjs +0 -192
  437. package/dist/components/user-action/ToggleableInput.cjs.map +0 -1
  438. package/dist/components/user-action/Tooltip.cjs.map +0 -1
  439. package/dist/hooks/useHoverState.cjs +0 -72
  440. package/dist/hooks/useLocalStorage.cjs +0 -83
  441. package/dist/hooks/useOutsideClick.cjs +0 -48
  442. package/dist/hooks/useSaveDelay.cjs +0 -68
  443. package/dist/index.cjs.map +0 -1
  444. package/dist/localization/LanguageProvider.cjs.map +0 -1
  445. package/dist/localization/useTranslation.cjs +0 -69
  446. package/dist/localization/useTranslation.cjs.map +0 -1
  447. package/dist/localization/util.cjs +0 -41
  448. package/dist/theming/useTheme.cjs +0 -76
  449. package/dist/theming/useTheme.cjs.map +0 -1
  450. package/dist/util/builder.cjs +0 -34
  451. package/dist/util/date.cjs.map +0 -1
  452. package/dist/util/easeFunctions.cjs +0 -63
  453. package/dist/util/easeFunctions.cjs.map +0 -1
  454. package/dist/util/emailValidation.cjs +0 -33
  455. package/dist/util/math.cjs +0 -33
  456. package/dist/util/news.cjs +0 -77
  457. package/dist/util/news.cjs.map +0 -1
  458. package/dist/util/news.d.cts +0 -101
  459. package/dist/util/noop.cjs +0 -31
  460. package/dist/util/noop.cjs.map +0 -1
  461. package/dist/util/noop.d.cts +0 -3
  462. package/dist/util/simpleSearch.cjs +0 -54
  463. package/dist/util/storage.cjs +0 -64
  464. package/dist/util/types.cjs +0 -19
  465. package/dist/util/types.cjs.map +0 -1
  466. /package/dist/coloring/{types.d.cts → types.d.mts} +0 -0
  467. /package/dist/components/branding/{HelpwaveBadge.d.cts → HelpwaveBadge.d.mts} +0 -0
  468. /package/dist/components/date/{TimePicker.d.cts → TimePicker.d.mts} +0 -0
  469. /package/dist/components/icons-and-geometry/{Avatar.d.cts → Avatar.d.mts} +0 -0
  470. /package/dist/components/icons-and-geometry/{Circle.d.cts → Circle.d.mts} +0 -0
  471. /package/dist/components/icons-and-geometry/{Helpwave.d.cts → Helpwave.d.mts} +0 -0
  472. /package/dist/components/icons-and-geometry/{Ring.d.cts → Ring.d.mts} +0 -0
  473. /package/dist/components/icons-and-geometry/{Tag.d.cts → Tag.d.mts} +0 -0
  474. /package/dist/components/layout-and-navigation/{BreadCrumb.d.cts → BreadCrumb.d.mts} +0 -0
  475. /package/dist/components/layout-and-navigation/{Carousel.d.cts → Carousel.d.mts} +0 -0
  476. /package/dist/components/layout-and-navigation/{Chip.d.cts → Chip.d.mts} +0 -0
  477. /package/dist/components/layout-and-navigation/{DividerInserter.d.cts → DividerInserter.d.mts} +0 -0
  478. /package/dist/components/layout-and-navigation/{Expandable.d.cts → Expandable.d.mts} +0 -0
  479. /package/dist/components/layout-and-navigation/{Tile.d.cts → Tile.d.mts} +0 -0
  480. /package/dist/components/layout-and-navigation/{VerticalDivider.d.cts → VerticalDivider.d.mts} +0 -0
  481. /package/dist/components/loading-states/{ProgressIndicator.d.cts → ProgressIndicator.d.mts} +0 -0
  482. /package/dist/components/user-action/{Button.d.cts → Button.d.mts} +0 -0
  483. /package/dist/components/user-action/{Label.d.cts → Label.d.mts} +0 -0
  484. /package/dist/components/user-action/{Menu.d.cts → Menu.d.mts} +0 -0
  485. /package/dist/components/user-action/{ScrollPicker.d.cts → ScrollPicker.d.mts} +0 -0
  486. /package/dist/components/user-action/{ToggleableInput.d.cts → ToggleableInput.d.mts} +0 -0
  487. /package/dist/components/user-action/{Tooltip.d.cts → Tooltip.d.mts} +0 -0
  488. /package/dist/hooks/{useHoverState.d.cts → useHoverState.d.mts} +0 -0
  489. /package/dist/hooks/{useLocalStorage.d.cts → useLocalStorage.d.mts} +0 -0
  490. /package/dist/hooks/{useOutsideClick.d.cts → useOutsideClick.d.mts} +0 -0
  491. /package/dist/hooks/{useSaveDelay.d.cts → useSaveDelay.d.mts} +0 -0
  492. /package/dist/localization/{util.d.cts → util.d.mts} +0 -0
  493. /package/dist/util/{array.d.cts → array.d.mts} +0 -0
  494. /package/dist/util/{builder.d.cts → builder.d.mts} +0 -0
  495. /package/dist/util/{date.d.cts → date.d.mts} +0 -0
  496. /package/dist/util/{easeFunctions.d.cts → easeFunctions.d.mts} +0 -0
  497. /package/dist/util/{emailValidation.d.cts → emailValidation.d.mts} +0 -0
  498. /package/dist/util/{loopingArray.d.cts → loopingArray.d.mts} +0 -0
  499. /package/dist/util/{math.d.cts → math.d.mts} +0 -0
  500. /package/dist/util/{simpleSearch.d.cts → simpleSearch.d.mts} +0 -0
  501. /package/dist/util/{storage.d.cts → storage.d.mts} +0 -0
  502. /package/dist/util/{types.d.cts → types.d.mts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layout-and-navigation/Overlay.tsx","../../../src/hooks/useHoverState.ts","../../../src/components/user-action/Tooltip.tsx","../../../src/components/user-action/Button.tsx","../../../src/localization/LanguageProvider.tsx","../../../src/hooks/useLocalStorage.ts","../../../src/localization/util.ts","../../../src/localization/useTranslation.ts"],"sourcesContent":["import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport ReactDOM from 'react-dom'\nimport clsx from 'clsx'\nimport { Tooltip } from '@/components/user-action/Tooltip'\nimport { X } from 'lucide-react'\nimport { IconButton } from '@/components/user-action/Button'\nimport type { PropsForTranslation } from '@/localization/useTranslation'\nimport { useTranslation } from '@/localization/useTranslation'\nimport type { Language } from '@/localization/util'\n\nexport type OverlayProps = PropsWithChildren<{\n /**\n * Whether the overlay should be currently displayed\n */\n isOpen: boolean,\n /**\n * Callback when the background is clicked\n */\n onBackgroundClick?: () => void,\n /**\n * Styling for the background\n *\n * To remove the darkening, set bg-transparent\n */\n backgroundClassName?: string,\n}>\n\n/**\n * A generic overlay window which is managed by its parent\n */\nexport const Overlay = ({\n children,\n isOpen,\n onBackgroundClick,\n backgroundClassName,\n }: PropsWithChildren<OverlayProps>) => {\n // The element to which the overlay will be attached to\n const [root, setRoot] = useState<HTMLElement>()\n\n useEffect(() => {\n setRoot(document.body)\n }, [])\n\n if (!root || !isOpen) return null\n\n\n return ReactDOM.createPortal(\n <div className={clsx('fixed inset-0 z-[9999]')}>\n <div\n className={clsx('fixed inset-0 h-screen w-screen bg-black/30', backgroundClassName)}\n onClick={onBackgroundClick}\n />\n {children}\n </div>,\n root\n )\n}\n\n\nlet overlayStack: HTMLDivElement[] = []\n\n\n// --- Modal ---\n\ntype ModalHeaderTranslation = {\n close: string,\n}\n\nconst defaultModalHeaderTranslation: Record<Language, ModalHeaderTranslation> = {\n en: {\n close: 'Close'\n },\n de: {\n close: 'Schließen'\n }\n}\n\nexport type OverlayHeaderProps = {\n /**\n * Callback when the close button is clicked. If omitted or undefined, the button is hidden\n */\n onClose?: () => void,\n /** The title of the Modal. If you want to only set the text use `titleText` instead */\n title?: ReactNode,\n /** The title text of the Modal. If you want to set a custom title use `title` instead */\n titleText?: string,\n /** The description of the Modal. If you want to only set the text use `descriptionText` instead */\n description?: ReactNode,\n /** The description text of the Modal. If you want to set a custom description use `description` instead */\n descriptionText?: string,\n}\n\n/**\n * A header that should be in an Overlay\n */\nexport const OverlayHeader = ({\n overwriteTranslation,\n onClose,\n title,\n titleText = '',\n description,\n descriptionText = ''\n }: PropsForTranslation<ModalHeaderTranslation, OverlayHeaderProps>) => {\n const translation = useTranslation(defaultModalHeaderTranslation, overwriteTranslation)\n const hasTitleRow = !!title || !!titleText || !!onClose\n const titleRow = (\n <div className=\"row justify-between items-start gap-x-8\">\n {title ?? (\n <h2\n className={clsx('textstyle-title-lg', {\n 'mb-1': description || descriptionText,\n })}\n >\n {titleText}\n </h2>\n )}\n {!!onClose && (\n <Tooltip tooltip={translation.close}>\n <IconButton color=\"neutral\" size=\"small\" onClick={onClose}>\n <X className=\"w-full h-full\"/>\n </IconButton>\n </Tooltip>\n )}\n </div>\n )\n\n return (\n <div className=\"col\">\n {hasTitleRow && (titleRow)}\n {description ?? (descriptionText && (<span className=\"textstyle-description\">{descriptionText}</span>))}\n </div>\n )\n}\n\nexport type ModalProps = {\n isOpen: boolean,\n onClose: () => void,\n className?: string,\n backgroundClassName?: string,\n headerProps?: Omit<OverlayHeaderProps, 'onClose'>,\n}\n\n/**\n * A Generic Modal Window\n */\nexport const Modal = ({\n children,\n isOpen,\n onClose,\n className,\n backgroundClassName,\n headerProps,\n }: PropsWithChildren<ModalProps>) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n\n const modal = ref.current\n\n if (!modal) {\n console.error('modal open, but no ref found')\n return\n }\n\n overlayStack.push(modal)\n\n const focusable = modal?.querySelectorAll(\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isTopmost = overlayStack[overlayStack.length - 1] === modal\n if (!isTopmost) return\n\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose()\n } else if (e.key === 'Tab') {\n if (focusable.length === 0) return\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n (last as HTMLElement).focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n (first as HTMLElement).focus()\n }\n }\n }\n\n modal.focus()\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n overlayStack = overlayStack.filter(m => m !== modal)\n }\n }, [isOpen, onClose])\n\n return (\n <Overlay\n isOpen={isOpen}\n onBackgroundClick={onClose}\n backgroundClassName={backgroundClassName}\n >\n <div\n ref={ref}\n tabIndex={-1}\n className={clsx(\n 'fixed left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 col p-4 bg-overlay-background text-overlay-text rounded-xl shadow-xl',\n className\n )}\n role=\"dialog\"\n aria-modal={true}\n >\n <OverlayHeader {...headerProps} onClose={onClose}/>\n {children}\n </div>\n </Overlay>\n )\n}\n\n// --- Dialog ---\n\nexport type DialogProps = Omit<OverlayProps, 'onBackgroundClick'> & {\n headerProps?: Omit<OverlayHeaderProps, 'onClose'>,\n className?: string,\n}\n\n/**\n * A Generic Dialog Window\n */\nexport const Dialog = ({\n children,\n isOpen,\n className,\n backgroundClassName,\n headerProps,\n }: PropsWithChildren<DialogProps>) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n\n const dialog = ref.current\n\n if (!dialog) {\n console.error('dialog open, but no ref found')\n return\n }\n\n overlayStack.push(dialog)\n\n const focusable = dialog?.querySelectorAll(\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isTopmost = overlayStack[overlayStack.length - 1] === dialog\n if (!isTopmost) return\n\n if (e.key === 'Escape') {\n e.stopPropagation()\n } else if (e.key === 'Tab') {\n if (focusable.length === 0) return\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n (last as HTMLElement).focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n (first as HTMLElement).focus()\n }\n }\n }\n\n dialog.focus()\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n overlayStack = overlayStack.filter(m => m !== dialog)\n }\n }, [isOpen])\n\n return (\n <Overlay\n isOpen={isOpen}\n backgroundClassName={backgroundClassName}\n >\n <div\n ref={ref}\n tabIndex={-1}\n className={clsx(\n 'fixed left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 col p-4 bg-overlay-background text-overlay-text rounded-xl shadow-xl',\n className\n )}\n role=\"dialog\"\n aria-modal={true}\n >\n {!!headerProps && (<OverlayHeader {...headerProps}/>)}\n {children}\n </div>\n </Overlay>\n )\n}","import type { Dispatch, SetStateAction } from 'react'\nimport { useEffect, useState } from 'react'\n\ntype UseHoverStateProps = {\n /**\n * The delay after which the menu is closed in milliseconds\n *\n * default: 200ms\n */\n closingDelay: number,\n /**\n * Whether the hover state management should be disabled\n *\n * default: false\n */\n isDisabled: boolean,\n}\n\ntype UseHoverStateReturnType = {\n /**\n * Whether the element is hovered\n */\n isHovered: boolean,\n /**\n * Function to change the current hover status\n */\n setIsHovered: Dispatch<SetStateAction<boolean>>,\n /**\n * Handlers to pass on to the component that should be hovered\n */\n handlers: {\n onMouseEnter: () => void,\n onMouseLeave: () => void,\n },\n}\n\nconst defaultUseHoverStateProps: UseHoverStateProps = {\n closingDelay: 200,\n isDisabled: false,\n}\n\n/**\n * @param props See UseHoverStateProps\n *\n * A react hook for managing the hover state of a component. The handlers provided should be\n * forwarded to the component which should be hovered over\n */\nexport const useHoverState = (props: Partial<UseHoverStateProps> | undefined = undefined): UseHoverStateReturnType => {\n const { closingDelay, isDisabled } = { ...defaultUseHoverStateProps, ...props }\n\n const [isHovered, setIsHovered] = useState(false)\n const [timer, setTimer] = useState<NodeJS.Timeout>()\n\n const onMouseEnter = () => {\n if (isDisabled) {\n return\n }\n clearTimeout(timer)\n setIsHovered(true)\n }\n\n const onMouseLeave = () => {\n if (isDisabled) {\n return\n }\n setTimer(setTimeout(() => {\n setIsHovered(false)\n }, closingDelay))\n }\n\n useEffect(() => {\n if (timer) {\n return () => {\n clearTimeout(timer)\n }\n }\n })\n\n useEffect(() => {\n if (timer) {\n clearTimeout(timer)\n }\n }, [isDisabled]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n isHovered, setIsHovered, handlers: { onMouseEnter, onMouseLeave }\n }\n}\n","import type { CSSProperties, PropsWithChildren, ReactNode } from 'react'\nimport { useHoverState } from '@/hooks/useHoverState'\nimport { clsx } from 'clsx'\n\ntype Position = 'top' | 'bottom' | 'left' | 'right'\n\nexport type TooltipProps = PropsWithChildren<{\n tooltip: string | ReactNode,\n /**\n * Number of milliseconds until the tooltip appears\n *\n * defaults to 1000ms\n */\n animationDelay?: number,\n /**\n * Class names of additional styling properties for the tooltip\n */\n tooltipClassName?: string,\n /**\n * Class names of additional styling properties for the container from which the tooltip will be created\n */\n containerClassName?: string,\n position?: Position,\n zIndex?: number,\n}>\n\n/**\n * A Component for showing a tooltip when hovering over Content\n * @param tooltip The tooltip to show can be a text or any ReactNode\n * @param children The Content for which the tooltip should be created\n * @param animationDelay The delay before the tooltip appears\n * @param tooltipClassName Additional ClassNames for the Container of the tooltip\n * @param containerClassName Additional ClassNames for the Container holding the content\n * @param position The direction of the tooltip relative to the Container\n * @param zIndex The z Index of the tooltip (you may require this when stacking modal)\n * @constructor\n */\nexport const Tooltip = ({\n tooltip,\n children,\n animationDelay = 650,\n tooltipClassName = '',\n containerClassName = '',\n position = 'bottom',\n zIndex = 10,\n }: TooltipProps) => {\n const { isHovered, handlers } = useHoverState()\n\n const positionClasses = {\n top: `bottom-full left-1/2 -translate-x-1/2 mb-[6px]`,\n bottom: `top-full left-1/2 -translate-x-1/2 mt-[6px]`,\n left: `right-full top-1/2 -translate-y-1/2 mr-[6px]`,\n right: `left-full top-1/2 -translate-y-1/2 ml-[6px]`\n }\n\n const triangleSize = 6\n const triangleClasses = {\n top: `top-full left-1/2 -translate-x-1/2 border-t-tooltip-background border-l-transparent border-r-transparent`,\n bottom: `bottom-full left-1/2 -translate-x-1/2 border-b-tooltip-background border-l-transparent border-r-transparent`,\n left: `left-full top-1/2 -translate-y-1/2 border-l-tooltip-background border-t-transparent border-b-transparent`,\n right: `right-full top-1/2 -translate-y-1/2 border-r-tooltip-background border-t-transparent border-b-transparent`\n }\n\n const triangleStyle: Record<Position, CSSProperties> = {\n top: { borderWidth: `${triangleSize}px ${triangleSize}px 0 ${triangleSize}px` },\n bottom: { borderWidth: `0 ${triangleSize}px ${triangleSize}px ${triangleSize}px` },\n left: { borderWidth: `${triangleSize}px 0 ${triangleSize}px ${triangleSize}px` },\n right: { borderWidth: `${triangleSize}px ${triangleSize}px ${triangleSize}px 0` }\n }\n\n return (\n <div\n className={clsx('relative inline-block', containerClassName)}\n {...handlers}\n >\n {children}\n {isHovered && (\n <div\n className={clsx(\n `opacity-0 absolute text-xs font-semibold text-tooltip-text px-2 py-1 rounded whitespace-nowrap\n animate-tooltip-fade-in shadow-lg bg-tooltip-background`,\n positionClasses[position], tooltipClassName\n )}\n style={{ zIndex, animationDelay: animationDelay + 'ms' }}\n >\n {tooltip}\n <div\n className={clsx(`absolute w-0 h-0`, triangleClasses[position])}\n style={{ ...triangleStyle[position], zIndex }}\n />\n </div>\n )}\n </div>\n )\n}\n","import type { ButtonHTMLAttributes, PropsWithChildren, ReactNode } from 'react'\nimport clsx from 'clsx'\n\n\nexport const ButtonColorUtil = {\n solid: ['primary', 'secondary', 'tertiary', 'positive', 'warning', 'negative', 'neutral'] as const,\n text: ['primary', 'negative', 'neutral'] as const,\n outline: ['primary'] as const,\n}\n\n\n/**\n * The allowed colors for the SolidButton and IconButton\n */\nexport type SolidButtonColor = typeof ButtonColorUtil.solid[number]\n/**\n * The allowed colors for the OutlineButton\n */\nexport type OutlineButtonColor = typeof ButtonColorUtil.outline[number]\n/**\n * The allowed colors for the TextButton\n */\nexport type TextButtonColor = typeof ButtonColorUtil.text[number]\n\n/**\n * The different sizes for a button\n */\ntype ButtonSizes = 'small' | 'medium' | 'large'\n\n/**\n * The shard properties between all button types\n */\nexport type ButtonProps = PropsWithChildren<{\n /**\n * @default 'medium'\n */\n size?: ButtonSizes,\n}> & ButtonHTMLAttributes<Element>\n\nconst paddingMapping: Record<ButtonSizes, string> = {\n small: 'btn-sm',\n medium: 'btn-md',\n large: 'btn-lg'\n}\n\nconst iconPaddingMapping: Record<ButtonSizes, string> = {\n small: 'icon-btn-sm',\n medium: 'icon-btn-md',\n large: 'icon-btn-lg'\n}\n\nexport const ButtonUtil = {\n paddingMapping,\n iconPaddingMapping\n}\n\ntype ButtonWithIconsProps = ButtonProps & {\n startIcon?: ReactNode,\n endIcon?: ReactNode,\n}\n\nexport type SolidButtonProps = ButtonWithIconsProps & {\n color?: SolidButtonColor,\n}\n\nexport type OutlineButtonProps = ButtonWithIconsProps & {\n color?: OutlineButtonColor,\n}\n\nexport type TextButtonProps = ButtonWithIconsProps & {\n color?: TextButtonColor,\n}\n\nexport type IconButtonProps = ButtonProps & {\n color?: SolidButtonColor,\n}\n\n/**\n * A button with a solid background and different sizes\n */\nconst SolidButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: SolidButtonProps) => {\n const colorClasses = {\n primary: 'bg-button-solid-primary-background text-button-solid-primary-text',\n secondary: 'bg-button-solid-secondary-background text-button-solid-secondary-text',\n tertiary: 'bg-button-solid-tertiary-background text-button-solid-tertiary-text',\n positive: 'bg-button-solid-positive-background text-button-solid-positive-text',\n warning: 'bg-button-solid-warning-background text-button-solid-warning-text',\n negative: 'bg-button-solid-negative-background text-button-solid-negative-text',\n neutral: 'bg-button-solid-neutral-background text-button-solid-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-solid-primary-icon',\n secondary: 'text-button-solid-secondary-icon',\n tertiary: 'text-button-solid-tertiary-icon',\n positive: 'text-button-solid-positive-icon',\n warning: 'text-button-solid-warning-icon',\n negative: 'text-button-solid-negative-icon',\n neutral: 'text-button-solid-neutral-icon',\n }[color]\n\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text bg-disabled-background cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-90')]: !disabled\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n/**\n * A button with an outline border and different sizes\n */\nconst OutlineButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: OutlineButtonProps) => {\n const colorClasses = {\n primary: 'bg-transparent border-2 border-button-outline-primary-text text-button-outline-primary-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-outline-primary-icon',\n }[color]\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text border-disabled-outline cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-80')]: !disabled,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n/**\n * A text that is a button that can have different sizes\n */\nconst TextButton = ({\n children,\n disabled = false,\n color = 'neutral',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: TextButtonProps) => {\n const colorClasses = {\n primary: 'bg-transparent text-button-text-primary-text',\n negative: 'bg-transparent text-button-text-negative-text',\n neutral: 'bg-transparent text-button-text-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-text-primary-icon',\n negative: 'text-button-text-negative-icon',\n neutral: 'text-button-text-neutral-icon',\n }[color]\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:bg-button-text-hover-background rounded-full')]: !disabled,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n\n/**\n * A button for icons with a solid background and different sizes\n */\nconst IconButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n onClick,\n className,\n ...restProps\n }: IconButtonProps) => {\n const colorClasses = {\n primary: 'bg-button-solid-primary-background text-button-solid-primary-text',\n secondary: 'bg-button-solid-secondary-background text-button-solid-secondary-text',\n tertiary: 'bg-button-solid-tertiary-background text-button-solid-tertiary-text',\n positive: 'bg-button-solid-positive-background text-button-solid-positive-text',\n warning: 'bg-button-solid-warning-background text-button-solid-warning-text',\n negative: 'bg-button-solid-negative-background text-button-solid-negative-text',\n neutral: 'bg-button-solid-neutral-background text-button-solid-neutral-text',\n }[color]\n\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text bg-disabled-background cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-90')]: !disabled\n },\n ButtonUtil.iconPaddingMapping[size],\n className\n )}\n {...restProps}\n >\n {children}\n </button>\n )\n}\n\nexport { SolidButton, OutlineButton, TextButton, IconButton }\n","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { useLocalStorage } from '@/hooks/useLocalStorage'\nimport type { Language } from './util'\nimport { LanguageUtil } from './util'\n\nexport type LanguageContextValue = {\n language: Language,\n setLanguage: Dispatch<SetStateAction<Language>>,\n}\n\nexport const LanguageContext = createContext<LanguageContextValue>({\n language: LanguageUtil.DEFAULT_LANGUAGE,\n setLanguage: (v) => v\n})\n\nexport const useLanguage = () => useContext(LanguageContext)\n\nexport const useLocale = (overWriteLanguage?: Language) => {\n const { language } = useLanguage()\n const mapping: Record<Language, string> = {\n en: 'en-US',\n de: 'de-DE'\n }\n return mapping[overWriteLanguage ?? language]\n}\n\ntype LanguageProviderProps = {\n initialLanguage?: Language,\n}\n\nexport const LanguageProvider = ({ initialLanguage, children }: PropsWithChildren<LanguageProviderProps>) => {\n const [language, setLanguage] = useState<Language>(initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n const [storedLanguage, setStoredLanguage] = useLocalStorage<Language>('language', initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n\n useEffect(() => {\n if (language !== initialLanguage && initialLanguage) {\n console.warn('LanguageProvider initial state changed: Prefer using languageProvider\\'s setLanguage instead')\n setLanguage(initialLanguage)\n }\n }, [initialLanguage]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n // TODO set locale of html tag here as well\n setStoredLanguage(language)\n }, [language, setStoredLanguage])\n\n useEffect(() => {\n if (storedLanguage !== null) {\n setLanguage(storedLanguage)\n return\n }\n\n const LanguageToTestAgainst = Object.values(LanguageUtil.languages)\n\n const matchingBrowserLanguage = window.navigator.languages\n .map(language => LanguageToTestAgainst.find((test) => language === test || language.split('-')[0] === test))\n .filter(entry => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0] as Language\n setLanguage(firstMatch)\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <LanguageContext.Provider value={{\n language,\n setLanguage\n }}>\n {children}\n </LanguageContext.Provider>\n )\n}","import type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { LocalStorageService } from '../util/storage'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\nexport const useLocalStorage = <T>(key: string, initValue: T): [T, SetValue<T>] => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return initValue\n }\n const storageService = new LocalStorageService()\n const value = storageService.get<T>(key)\n return value || initValue\n }, [initValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(value => {\n const newValue = value instanceof Function ? value(storedValue) : value\n const storageService = new LocalStorageService()\n storageService.set(key, value)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n useEffect(() => {\n setStoredValue(get())\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return [storedValue, setValue]\n}","/**\n * The supported languages\n */\nconst languages = ['en', 'de'] as const\n\n/**\n * The supported languages\n */\nexport type Language = typeof languages[number]\n\n/**\n * The supported languages' names in their respective language\n */\nconst languagesLocalNames: Record<Language, string> = {\n en: 'English',\n de: 'Deutsch',\n}\n\n/**\n * The default language\n */\nconst DEFAULT_LANGUAGE: Language = 'en'\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LanguageUtil = {\n languages,\n DEFAULT_LANGUAGE,\n languagesLocalNames,\n}","import { useLanguage } from './LanguageProvider'\nimport type { Language } from './util'\n\nexport type Translation<T> = Record<Language, T>\n\ntype OverwriteTranslationType<Translation extends Record<string, unknown>> = {\n language?: Language,\n translation?: Partial<Record<Language, Partial<Translation>>>,\n}\n\n/**\n * Adds the `language` prop to the component props.\n *\n * @param Translation the type of the translation object\n *\n * @param Props the type of the component props, defaults to `Record<string, never>`,\n * if you don't expect any other props other than `language` and get an\n * error when using your component (because it uses `forwardRef` etc.)\n * you can try out `Record<string, unknown>`, this might resolve your\n * problem as `SomeType & never` is still `never` but `SomeType & unknown`\n * is `SomeType` which means that adding back props (like `ref` etc.)\n * works properly\n */\nexport type PropsForTranslation<\n Translation extends Record<string, unknown>,\n Props = Record<string, never>\n> = Props & {\n overwriteTranslation?: OverwriteTranslationType<Translation>,\n};\n\nexport const useTranslation = <Translation extends Record<string, unknown>>(\n defaults: Record<Language, Translation>,\n translationOverwrite: OverwriteTranslationType<Translation> = {}\n): Translation => {\n const { language: languageProp, translation: overwrite } = translationOverwrite\n const { language: inferredLanguage } = useLanguage()\n const usedLanguage = languageProp ?? inferredLanguage\n let defaultValues: Translation = defaults[usedLanguage]\n if (overwrite && overwrite[usedLanguage]) {\n defaultValues = { ...defaultValues, ...overwrite[usedLanguage] }\n }\n return defaultValues\n}\n"],"mappings":"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","names":["useEffect","useState","clsx","clsx","jsx","jsxs","jsx","clsx","useEffect","useState","useEffect","useState","jsx","jsx","jsxs","useState","useEffect","clsx"]}
1
+ {"version":3,"sources":["../../../src/components/layout-and-navigation/Overlay.tsx","../../../src/hooks/useHoverState.ts","../../../src/components/user-action/Tooltip.tsx","../../../src/components/user-action/Button.tsx","../../../src/localization/LanguageProvider.tsx","../../../src/hooks/useLocalStorage.ts","../../../src/localization/util.ts","../../../src/localization/useTranslation.ts"],"sourcesContent":["import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport ReactDOM from 'react-dom'\nimport clsx from 'clsx'\nimport { Tooltip } from '../user-action/Tooltip'\nimport { X } from 'lucide-react'\nimport { IconButton } from '../user-action/Button'\nimport type { PropsForTranslation } from '../../localization/useTranslation'\nimport { useTranslation } from '../../localization/useTranslation'\nimport type { Language } from '../../localization/util'\n\nexport type OverlayProps = PropsWithChildren<{\n /**\n * Whether the overlay should be currently displayed\n */\n isOpen: boolean,\n /**\n * Callback when the background is clicked\n */\n onBackgroundClick?: () => void,\n /**\n * Styling for the background\n *\n * To remove the darkening, set bg-transparent\n */\n backgroundClassName?: string,\n}>\n\n/**\n * A generic overlay window which is managed by its parent\n */\nexport const Overlay = ({\n children,\n isOpen,\n onBackgroundClick,\n backgroundClassName,\n }: PropsWithChildren<OverlayProps>) => {\n // The element to which the overlay will be attached to\n const [root, setRoot] = useState<HTMLElement>()\n\n useEffect(() => {\n setRoot(document.body)\n }, [])\n\n if (!root || !isOpen) return null\n\n\n return ReactDOM.createPortal(\n <div className={clsx('fixed inset-0 z-[9999]')}>\n <div\n className={clsx('fixed inset-0 h-screen w-screen bg-black/30', backgroundClassName)}\n onClick={onBackgroundClick}\n />\n {children}\n </div>,\n root\n )\n}\n\n\nlet overlayStack: HTMLDivElement[] = []\n\n\n// --- Modal ---\n\ntype ModalHeaderTranslation = {\n close: string,\n}\n\nconst defaultModalHeaderTranslation: Record<Language, ModalHeaderTranslation> = {\n en: {\n close: 'Close'\n },\n de: {\n close: 'Schließen'\n }\n}\n\nexport type OverlayHeaderProps = {\n /**\n * Callback when the close button is clicked. If omitted or undefined, the button is hidden\n */\n onClose?: () => void,\n /** The title of the Modal. If you want to only set the text use `titleText` instead */\n title?: ReactNode,\n /** The title text of the Modal. If you want to set a custom title use `title` instead */\n titleText?: string,\n /** The description of the Modal. If you want to only set the text use `descriptionText` instead */\n description?: ReactNode,\n /** The description text of the Modal. If you want to set a custom description use `description` instead */\n descriptionText?: string,\n}\n\n/**\n * A header that should be in an Overlay\n */\nexport const OverlayHeader = ({\n overwriteTranslation,\n onClose,\n title,\n titleText = '',\n description,\n descriptionText = ''\n }: PropsForTranslation<ModalHeaderTranslation, OverlayHeaderProps>) => {\n const translation = useTranslation(defaultModalHeaderTranslation, overwriteTranslation)\n const hasTitleRow = !!title || !!titleText || !!onClose\n const titleRow = (\n <div className=\"row justify-between items-start gap-x-8\">\n {title ?? (\n <h2\n className={clsx('textstyle-title-lg', {\n 'mb-1': description || descriptionText,\n })}\n >\n {titleText}\n </h2>\n )}\n {!!onClose && (\n <Tooltip tooltip={translation.close}>\n <IconButton color=\"neutral\" size=\"small\" onClick={onClose}>\n <X className=\"w-full h-full\"/>\n </IconButton>\n </Tooltip>\n )}\n </div>\n )\n\n return (\n <div className=\"col\">\n {hasTitleRow && (titleRow)}\n {description ?? (descriptionText && (<span className=\"textstyle-description\">{descriptionText}</span>))}\n </div>\n )\n}\n\nexport type ModalProps = {\n isOpen: boolean,\n onClose: () => void,\n className?: string,\n backgroundClassName?: string,\n headerProps?: Omit<OverlayHeaderProps, 'onClose'>,\n}\n\n/**\n * A Generic Modal Window\n */\nexport const Modal = ({\n children,\n isOpen,\n onClose,\n className,\n backgroundClassName,\n headerProps,\n }: PropsWithChildren<ModalProps>) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n\n const modal = ref.current\n\n if (!modal) {\n console.error('modal open, but no ref found')\n return\n }\n\n overlayStack.push(modal)\n\n const focusable = modal?.querySelectorAll(\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isTopmost = overlayStack[overlayStack.length - 1] === modal\n if (!isTopmost) return\n\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose()\n } else if (e.key === 'Tab') {\n if (focusable.length === 0) return\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n (last as HTMLElement).focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n (first as HTMLElement).focus()\n }\n }\n }\n\n modal.focus()\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n overlayStack = overlayStack.filter(m => m !== modal)\n }\n }, [isOpen, onClose])\n\n return (\n <Overlay\n isOpen={isOpen}\n onBackgroundClick={onClose}\n backgroundClassName={backgroundClassName}\n >\n <div\n ref={ref}\n tabIndex={-1}\n className={clsx(\n 'fixed left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 col p-4 bg-overlay-background text-overlay-text rounded-xl shadow-xl',\n className\n )}\n role=\"dialog\"\n aria-modal={true}\n >\n <OverlayHeader {...headerProps} onClose={onClose}/>\n {children}\n </div>\n </Overlay>\n )\n}\n\n// --- Dialog ---\n\nexport type DialogProps = Omit<OverlayProps, 'onBackgroundClick'> & {\n headerProps?: Omit<OverlayHeaderProps, 'onClose'>,\n className?: string,\n}\n\n/**\n * A Generic Dialog Window\n */\nexport const Dialog = ({\n children,\n isOpen,\n className,\n backgroundClassName,\n headerProps,\n }: PropsWithChildren<DialogProps>) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n\n const dialog = ref.current\n\n if (!dialog) {\n console.error('dialog open, but no ref found')\n return\n }\n\n overlayStack.push(dialog)\n\n const focusable = dialog?.querySelectorAll(\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isTopmost = overlayStack[overlayStack.length - 1] === dialog\n if (!isTopmost) return\n\n if (e.key === 'Escape') {\n e.stopPropagation()\n } else if (e.key === 'Tab') {\n if (focusable.length === 0) return\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n (last as HTMLElement).focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n (first as HTMLElement).focus()\n }\n }\n }\n\n dialog.focus()\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n overlayStack = overlayStack.filter(m => m !== dialog)\n }\n }, [isOpen])\n\n return (\n <Overlay\n isOpen={isOpen}\n backgroundClassName={backgroundClassName}\n >\n <div\n ref={ref}\n tabIndex={-1}\n className={clsx(\n 'fixed left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 col p-4 bg-overlay-background text-overlay-text rounded-xl shadow-xl',\n className\n )}\n role=\"dialog\"\n aria-modal={true}\n >\n {!!headerProps && (<OverlayHeader {...headerProps}/>)}\n {children}\n </div>\n </Overlay>\n )\n}","import type { Dispatch, SetStateAction } from 'react'\nimport { useEffect, useState } from 'react'\n\ntype UseHoverStateProps = {\n /**\n * The delay after which the menu is closed in milliseconds\n *\n * default: 200ms\n */\n closingDelay: number,\n /**\n * Whether the hover state management should be disabled\n *\n * default: false\n */\n isDisabled: boolean,\n}\n\ntype UseHoverStateReturnType = {\n /**\n * Whether the element is hovered\n */\n isHovered: boolean,\n /**\n * Function to change the current hover status\n */\n setIsHovered: Dispatch<SetStateAction<boolean>>,\n /**\n * Handlers to pass on to the component that should be hovered\n */\n handlers: {\n onMouseEnter: () => void,\n onMouseLeave: () => void,\n },\n}\n\nconst defaultUseHoverStateProps: UseHoverStateProps = {\n closingDelay: 200,\n isDisabled: false,\n}\n\n/**\n * @param props See UseHoverStateProps\n *\n * A react hook for managing the hover state of a component. The handlers provided should be\n * forwarded to the component which should be hovered over\n */\nexport const useHoverState = (props: Partial<UseHoverStateProps> | undefined = undefined): UseHoverStateReturnType => {\n const { closingDelay, isDisabled } = { ...defaultUseHoverStateProps, ...props }\n\n const [isHovered, setIsHovered] = useState(false)\n const [timer, setTimer] = useState<NodeJS.Timeout>()\n\n const onMouseEnter = () => {\n if (isDisabled) {\n return\n }\n clearTimeout(timer)\n setIsHovered(true)\n }\n\n const onMouseLeave = () => {\n if (isDisabled) {\n return\n }\n setTimer(setTimeout(() => {\n setIsHovered(false)\n }, closingDelay))\n }\n\n useEffect(() => {\n if (timer) {\n return () => {\n clearTimeout(timer)\n }\n }\n })\n\n useEffect(() => {\n if (timer) {\n clearTimeout(timer)\n }\n }, [isDisabled]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n isHovered, setIsHovered, handlers: { onMouseEnter, onMouseLeave }\n }\n}\n","import type { CSSProperties, PropsWithChildren, ReactNode } from 'react'\nimport { useHoverState } from '../../hooks/useHoverState'\nimport { clsx } from 'clsx'\n\ntype Position = 'top' | 'bottom' | 'left' | 'right'\n\nexport type TooltipProps = PropsWithChildren<{\n tooltip: string | ReactNode,\n /**\n * Number of milliseconds until the tooltip appears\n *\n * defaults to 1000ms\n */\n animationDelay?: number,\n /**\n * Class names of additional styling properties for the tooltip\n */\n tooltipClassName?: string,\n /**\n * Class names of additional styling properties for the container from which the tooltip will be created\n */\n containerClassName?: string,\n position?: Position,\n zIndex?: number,\n}>\n\n/**\n * A Component for showing a tooltip when hovering over Content\n * @param tooltip The tooltip to show can be a text or any ReactNode\n * @param children The Content for which the tooltip should be created\n * @param animationDelay The delay before the tooltip appears\n * @param tooltipClassName Additional ClassNames for the Container of the tooltip\n * @param containerClassName Additional ClassNames for the Container holding the content\n * @param position The direction of the tooltip relative to the Container\n * @param zIndex The z Index of the tooltip (you may require this when stacking modal)\n * @constructor\n */\nexport const Tooltip = ({\n tooltip,\n children,\n animationDelay = 650,\n tooltipClassName = '',\n containerClassName = '',\n position = 'bottom',\n zIndex = 10,\n }: TooltipProps) => {\n const { isHovered, handlers } = useHoverState()\n\n const positionClasses = {\n top: `bottom-full left-1/2 -translate-x-1/2 mb-[6px]`,\n bottom: `top-full left-1/2 -translate-x-1/2 mt-[6px]`,\n left: `right-full top-1/2 -translate-y-1/2 mr-[6px]`,\n right: `left-full top-1/2 -translate-y-1/2 ml-[6px]`\n }\n\n const triangleSize = 6\n const triangleClasses = {\n top: `top-full left-1/2 -translate-x-1/2 border-t-tooltip-background border-l-transparent border-r-transparent`,\n bottom: `bottom-full left-1/2 -translate-x-1/2 border-b-tooltip-background border-l-transparent border-r-transparent`,\n left: `left-full top-1/2 -translate-y-1/2 border-l-tooltip-background border-t-transparent border-b-transparent`,\n right: `right-full top-1/2 -translate-y-1/2 border-r-tooltip-background border-t-transparent border-b-transparent`\n }\n\n const triangleStyle: Record<Position, CSSProperties> = {\n top: { borderWidth: `${triangleSize}px ${triangleSize}px 0 ${triangleSize}px` },\n bottom: { borderWidth: `0 ${triangleSize}px ${triangleSize}px ${triangleSize}px` },\n left: { borderWidth: `${triangleSize}px 0 ${triangleSize}px ${triangleSize}px` },\n right: { borderWidth: `${triangleSize}px ${triangleSize}px ${triangleSize}px 0` }\n }\n\n return (\n <div\n className={clsx('relative inline-block', containerClassName)}\n {...handlers}\n >\n {children}\n {isHovered && (\n <div\n className={clsx(\n `opacity-0 absolute text-xs font-semibold text-tooltip-text px-2 py-1 rounded whitespace-nowrap\n animate-tooltip-fade-in shadow-lg bg-tooltip-background`,\n positionClasses[position], tooltipClassName\n )}\n style={{ zIndex, animationDelay: animationDelay + 'ms' }}\n >\n {tooltip}\n <div\n className={clsx(`absolute w-0 h-0`, triangleClasses[position])}\n style={{ ...triangleStyle[position], zIndex }}\n />\n </div>\n )}\n </div>\n )\n}\n","import type { ButtonHTMLAttributes, PropsWithChildren, ReactNode } from 'react'\nimport clsx from 'clsx'\n\n\nexport const ButtonColorUtil = {\n solid: ['primary', 'secondary', 'tertiary', 'positive', 'warning', 'negative', 'neutral'] as const,\n text: ['primary', 'negative', 'neutral'] as const,\n outline: ['primary'] as const,\n}\n\n\n/**\n * The allowed colors for the SolidButton and IconButton\n */\nexport type SolidButtonColor = typeof ButtonColorUtil.solid[number]\n/**\n * The allowed colors for the OutlineButton\n */\nexport type OutlineButtonColor = typeof ButtonColorUtil.outline[number]\n/**\n * The allowed colors for the TextButton\n */\nexport type TextButtonColor = typeof ButtonColorUtil.text[number]\n\n/**\n * The different sizes for a button\n */\ntype ButtonSizes = 'small' | 'medium' | 'large'\n\n/**\n * The shard properties between all button types\n */\nexport type ButtonProps = PropsWithChildren<{\n /**\n * @default 'medium'\n */\n size?: ButtonSizes,\n}> & ButtonHTMLAttributes<Element>\n\nconst paddingMapping: Record<ButtonSizes, string> = {\n small: 'btn-sm',\n medium: 'btn-md',\n large: 'btn-lg'\n}\n\nconst iconPaddingMapping: Record<ButtonSizes, string> = {\n small: 'icon-btn-sm',\n medium: 'icon-btn-md',\n large: 'icon-btn-lg'\n}\n\nexport const ButtonUtil = {\n paddingMapping,\n iconPaddingMapping\n}\n\ntype ButtonWithIconsProps = ButtonProps & {\n startIcon?: ReactNode,\n endIcon?: ReactNode,\n}\n\nexport type SolidButtonProps = ButtonWithIconsProps & {\n color?: SolidButtonColor,\n}\n\nexport type OutlineButtonProps = ButtonWithIconsProps & {\n color?: OutlineButtonColor,\n}\n\nexport type TextButtonProps = ButtonWithIconsProps & {\n color?: TextButtonColor,\n}\n\nexport type IconButtonProps = ButtonProps & {\n color?: SolidButtonColor,\n}\n\n/**\n * A button with a solid background and different sizes\n */\nconst SolidButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: SolidButtonProps) => {\n const colorClasses = {\n primary: 'bg-button-solid-primary-background text-button-solid-primary-text',\n secondary: 'bg-button-solid-secondary-background text-button-solid-secondary-text',\n tertiary: 'bg-button-solid-tertiary-background text-button-solid-tertiary-text',\n positive: 'bg-button-solid-positive-background text-button-solid-positive-text',\n warning: 'bg-button-solid-warning-background text-button-solid-warning-text',\n negative: 'bg-button-solid-negative-background text-button-solid-negative-text',\n neutral: 'bg-button-solid-neutral-background text-button-solid-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-solid-primary-icon',\n secondary: 'text-button-solid-secondary-icon',\n tertiary: 'text-button-solid-tertiary-icon',\n positive: 'text-button-solid-positive-icon',\n warning: 'text-button-solid-warning-icon',\n negative: 'text-button-solid-negative-icon',\n neutral: 'text-button-solid-neutral-icon',\n }[color]\n\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text bg-disabled-background cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-90')]: !disabled\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n/**\n * A button with an outline border and different sizes\n */\nconst OutlineButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: OutlineButtonProps) => {\n const colorClasses = {\n primary: 'bg-transparent border-2 border-button-outline-primary-text text-button-outline-primary-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-outline-primary-icon',\n }[color]\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text border-disabled-outline cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-80')]: !disabled,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n/**\n * A text that is a button that can have different sizes\n */\nconst TextButton = ({\n children,\n disabled = false,\n color = 'neutral',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: TextButtonProps) => {\n const colorClasses = {\n primary: 'bg-transparent text-button-text-primary-text',\n negative: 'bg-transparent text-button-text-negative-text',\n neutral: 'bg-transparent text-button-text-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-text-primary-icon',\n negative: 'text-button-text-negative-icon',\n neutral: 'text-button-text-neutral-icon',\n }[color]\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:bg-button-text-hover-background rounded-full')]: !disabled,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n\n/**\n * A button for icons with a solid background and different sizes\n */\nconst IconButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n onClick,\n className,\n ...restProps\n }: IconButtonProps) => {\n const colorClasses = {\n primary: 'bg-button-solid-primary-background text-button-solid-primary-text',\n secondary: 'bg-button-solid-secondary-background text-button-solid-secondary-text',\n tertiary: 'bg-button-solid-tertiary-background text-button-solid-tertiary-text',\n positive: 'bg-button-solid-positive-background text-button-solid-positive-text',\n warning: 'bg-button-solid-warning-background text-button-solid-warning-text',\n negative: 'bg-button-solid-negative-background text-button-solid-negative-text',\n neutral: 'bg-button-solid-neutral-background text-button-solid-neutral-text',\n }[color]\n\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text bg-disabled-background cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-90')]: !disabled\n },\n ButtonUtil.iconPaddingMapping[size],\n className\n )}\n {...restProps}\n >\n {children}\n </button>\n )\n}\n\nexport { SolidButton, OutlineButton, TextButton, IconButton }\n","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\nimport type { Language } from './util'\nimport { LanguageUtil } from './util'\n\nexport type LanguageContextValue = {\n language: Language,\n setLanguage: Dispatch<SetStateAction<Language>>,\n}\n\nexport const LanguageContext = createContext<LanguageContextValue>({\n language: LanguageUtil.DEFAULT_LANGUAGE,\n setLanguage: (v) => v\n})\n\nexport const useLanguage = () => useContext(LanguageContext)\n\nexport const useLocale = (overWriteLanguage?: Language) => {\n const { language } = useLanguage()\n const mapping: Record<Language, string> = {\n en: 'en-US',\n de: 'de-DE'\n }\n return mapping[overWriteLanguage ?? language]\n}\n\ntype LanguageProviderProps = {\n initialLanguage?: Language,\n}\n\nexport const LanguageProvider = ({ initialLanguage, children }: PropsWithChildren<LanguageProviderProps>) => {\n const [language, setLanguage] = useState<Language>(initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n const [storedLanguage, setStoredLanguage] = useLocalStorage<Language>('language', initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n\n useEffect(() => {\n if (language !== initialLanguage && initialLanguage) {\n console.warn('LanguageProvider initial state changed: Prefer using languageProvider\\'s setLanguage instead')\n setLanguage(initialLanguage)\n }\n }, [initialLanguage]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n // TODO set locale of html tag here as well\n setStoredLanguage(language)\n }, [language, setStoredLanguage])\n\n useEffect(() => {\n if (storedLanguage !== null) {\n setLanguage(storedLanguage)\n return\n }\n\n const LanguageToTestAgainst = Object.values(LanguageUtil.languages)\n\n const matchingBrowserLanguage = window.navigator.languages\n .map(language => LanguageToTestAgainst.find((test) => language === test || language.split('-')[0] === test))\n .filter(entry => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0] as Language\n setLanguage(firstMatch)\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <LanguageContext.Provider value={{\n language,\n setLanguage\n }}>\n {children}\n </LanguageContext.Provider>\n )\n}","import type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { LocalStorageService } from '../util/storage'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\nexport const useLocalStorage = <T>(key: string, initValue: T): [T, SetValue<T>] => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return initValue\n }\n const storageService = new LocalStorageService()\n const value = storageService.get<T>(key)\n return value || initValue\n }, [initValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(value => {\n const newValue = value instanceof Function ? value(storedValue) : value\n const storageService = new LocalStorageService()\n storageService.set(key, value)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n useEffect(() => {\n setStoredValue(get())\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return [storedValue, setValue]\n}","/**\n * The supported languages\n */\nconst languages = ['en', 'de'] as const\n\n/**\n * The supported languages\n */\nexport type Language = typeof languages[number]\n\n/**\n * The supported languages' names in their respective language\n */\nconst languagesLocalNames: Record<Language, string> = {\n en: 'English',\n de: 'Deutsch',\n}\n\n/**\n * The default language\n */\nconst DEFAULT_LANGUAGE: Language = 'en'\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LanguageUtil = {\n languages,\n DEFAULT_LANGUAGE,\n languagesLocalNames,\n}","import { useLanguage } from './LanguageProvider'\nimport type { Language } from './util'\n\nexport type Translation<T> = Record<Language, T>\n\ntype OverwriteTranslationType<Translation extends Record<string, unknown>> = {\n language?: Language,\n translation?: Partial<Record<Language, Partial<Translation>>>,\n}\n\n/**\n * Adds the `language` prop to the component props.\n *\n * @param Translation the type of the translation object\n *\n * @param Props the type of the component props, defaults to `Record<string, never>`,\n * if you don't expect any other props other than `language` and get an\n * error when using your component (because it uses `forwardRef` etc.)\n * you can try out `Record<string, unknown>`, this might resolve your\n * problem as `SomeType & never` is still `never` but `SomeType & unknown`\n * is `SomeType` which means that adding back props (like `ref` etc.)\n * works properly\n */\nexport type PropsForTranslation<\n Translation extends Record<string, unknown>,\n Props = Record<string, never>\n> = Props & {\n overwriteTranslation?: OverwriteTranslationType<Translation>,\n};\n\nexport const useTranslation = <Translation extends Record<string, unknown>>(\n defaults: Record<Language, Translation>,\n translationOverwrite: OverwriteTranslationType<Translation> = {}\n): Translation => {\n const { language: languageProp, translation: overwrite } = translationOverwrite\n const { language: inferredLanguage } = useLanguage()\n const usedLanguage = languageProp ?? inferredLanguage\n let defaultValues: Translation = defaults[usedLanguage]\n if (overwrite && overwrite[usedLanguage]) {\n defaultValues = { ...defaultValues, ...overwrite[usedLanguage] }\n }\n return defaultValues\n}\n"],"mappings":"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","names":["import_react","import_clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_react","import_jsx_runtime","import_jsx_runtime","ReactDOM","clsx"]}
@@ -1,55 +1,18 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
1
  // src/components/layout-and-navigation/Overlay.tsx
31
- var Overlay_exports = {};
32
- __export(Overlay_exports, {
33
- Dialog: () => Dialog,
34
- Modal: () => Modal,
35
- Overlay: () => Overlay,
36
- OverlayHeader: () => OverlayHeader
37
- });
38
- module.exports = __toCommonJS(Overlay_exports);
39
- var import_react4 = require("react");
40
- var import_react_dom = __toESM(require("react-dom"), 1);
41
- var import_clsx3 = __toESM(require("clsx"), 1);
2
+ import { useEffect as useEffect4, useRef, useState as useState4 } from "react";
3
+ import ReactDOM from "react-dom";
4
+ import clsx3 from "clsx";
42
5
 
43
6
  // src/hooks/useHoverState.ts
44
- var import_react = require("react");
7
+ import { useEffect, useState } from "react";
45
8
  var defaultUseHoverStateProps = {
46
9
  closingDelay: 200,
47
10
  isDisabled: false
48
11
  };
49
12
  var useHoverState = (props = void 0) => {
50
13
  const { closingDelay, isDisabled } = { ...defaultUseHoverStateProps, ...props };
51
- const [isHovered, setIsHovered] = (0, import_react.useState)(false);
52
- const [timer, setTimer] = (0, import_react.useState)();
14
+ const [isHovered, setIsHovered] = useState(false);
15
+ const [timer, setTimer] = useState();
53
16
  const onMouseEnter = () => {
54
17
  if (isDisabled) {
55
18
  return;
@@ -65,14 +28,14 @@ var useHoverState = (props = void 0) => {
65
28
  setIsHovered(false);
66
29
  }, closingDelay));
67
30
  };
68
- (0, import_react.useEffect)(() => {
31
+ useEffect(() => {
69
32
  if (timer) {
70
33
  return () => {
71
34
  clearTimeout(timer);
72
35
  };
73
36
  }
74
37
  });
75
- (0, import_react.useEffect)(() => {
38
+ useEffect(() => {
76
39
  if (timer) {
77
40
  clearTimeout(timer);
78
41
  }
@@ -85,8 +48,8 @@ var useHoverState = (props = void 0) => {
85
48
  };
86
49
 
87
50
  // src/components/user-action/Tooltip.tsx
88
- var import_clsx = require("clsx");
89
- var import_jsx_runtime = require("react/jsx-runtime");
51
+ import { clsx } from "clsx";
52
+ import { jsx, jsxs } from "react/jsx-runtime";
90
53
  var Tooltip = ({
91
54
  tooltip,
92
55
  children,
@@ -116,17 +79,17 @@ var Tooltip = ({
116
79
  left: { borderWidth: `${triangleSize}px 0 ${triangleSize}px ${triangleSize}px` },
117
80
  right: { borderWidth: `${triangleSize}px ${triangleSize}px ${triangleSize}px 0` }
118
81
  };
119
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
82
+ return /* @__PURE__ */ jsxs(
120
83
  "div",
121
84
  {
122
- className: (0, import_clsx.clsx)("relative inline-block", containerClassName),
85
+ className: clsx("relative inline-block", containerClassName),
123
86
  ...handlers,
124
87
  children: [
125
88
  children,
126
- isHovered && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
89
+ isHovered && /* @__PURE__ */ jsxs(
127
90
  "div",
128
91
  {
129
- className: (0, import_clsx.clsx)(
92
+ className: clsx(
130
93
  `opacity-0 absolute text-xs font-semibold text-tooltip-text px-2 py-1 rounded whitespace-nowrap
131
94
  animate-tooltip-fade-in shadow-lg bg-tooltip-background`,
132
95
  positionClasses[position],
@@ -135,10 +98,10 @@ var Tooltip = ({
135
98
  style: { zIndex, animationDelay: animationDelay + "ms" },
136
99
  children: [
137
100
  tooltip,
138
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
101
+ /* @__PURE__ */ jsx(
139
102
  "div",
140
103
  {
141
- className: (0, import_clsx.clsx)(`absolute w-0 h-0`, triangleClasses[position]),
104
+ className: clsx(`absolute w-0 h-0`, triangleClasses[position]),
142
105
  style: { ...triangleStyle[position], zIndex }
143
106
  }
144
107
  )
@@ -151,11 +114,11 @@ var Tooltip = ({
151
114
  };
152
115
 
153
116
  // src/components/layout-and-navigation/Overlay.tsx
154
- var import_lucide_react = require("lucide-react");
117
+ import { X } from "lucide-react";
155
118
 
156
119
  // src/components/user-action/Button.tsx
157
- var import_clsx2 = __toESM(require("clsx"), 1);
158
- var import_jsx_runtime2 = require("react/jsx-runtime");
120
+ import clsx2 from "clsx";
121
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
159
122
  var paddingMapping = {
160
123
  small: "btn-sm",
161
124
  medium: "btn-md",
@@ -188,15 +151,15 @@ var IconButton = ({
188
151
  negative: "bg-button-solid-negative-background text-button-solid-negative-text",
189
152
  neutral: "bg-button-solid-neutral-background text-button-solid-neutral-text"
190
153
  }[color];
191
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
154
+ return /* @__PURE__ */ jsx2(
192
155
  "button",
193
156
  {
194
157
  onClick: disabled ? void 0 : onClick,
195
158
  disabled: disabled || onClick === void 0,
196
- className: (0, import_clsx2.default)(
159
+ className: clsx2(
197
160
  {
198
161
  "text-disabled-text bg-disabled-background cursor-not-allowed": disabled,
199
- [(0, import_clsx2.default)(colorClasses, "hover:brightness-90")]: !disabled
162
+ [clsx2(colorClasses, "hover:brightness-90")]: !disabled
200
163
  },
201
164
  ButtonUtil.iconPaddingMapping[size],
202
165
  className
@@ -208,10 +171,10 @@ var IconButton = ({
208
171
  };
209
172
 
210
173
  // src/localization/LanguageProvider.tsx
211
- var import_react3 = require("react");
174
+ import { createContext, useContext, useEffect as useEffect3, useState as useState3 } from "react";
212
175
 
213
176
  // src/hooks/useLocalStorage.ts
214
- var import_react2 = require("react");
177
+ import { useCallback, useEffect as useEffect2, useState as useState2 } from "react";
215
178
 
216
179
  // src/localization/util.ts
217
180
  var languages = ["en", "de"];
@@ -227,12 +190,12 @@ var LanguageUtil = {
227
190
  };
228
191
 
229
192
  // src/localization/LanguageProvider.tsx
230
- var import_jsx_runtime3 = require("react/jsx-runtime");
231
- var LanguageContext = (0, import_react3.createContext)({
193
+ import { jsx as jsx3 } from "react/jsx-runtime";
194
+ var LanguageContext = createContext({
232
195
  language: LanguageUtil.DEFAULT_LANGUAGE,
233
196
  setLanguage: (v) => v
234
197
  });
235
- var useLanguage = () => (0, import_react3.useContext)(LanguageContext);
198
+ var useLanguage = () => useContext(LanguageContext);
236
199
 
237
200
  // src/localization/useTranslation.ts
238
201
  var useTranslation = (defaults, translationOverwrite = {}) => {
@@ -247,24 +210,24 @@ var useTranslation = (defaults, translationOverwrite = {}) => {
247
210
  };
248
211
 
249
212
  // src/components/layout-and-navigation/Overlay.tsx
250
- var import_jsx_runtime4 = require("react/jsx-runtime");
213
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
251
214
  var Overlay = ({
252
215
  children,
253
216
  isOpen,
254
217
  onBackgroundClick,
255
218
  backgroundClassName
256
219
  }) => {
257
- const [root, setRoot] = (0, import_react4.useState)();
258
- (0, import_react4.useEffect)(() => {
220
+ const [root, setRoot] = useState4();
221
+ useEffect4(() => {
259
222
  setRoot(document.body);
260
223
  }, []);
261
224
  if (!root || !isOpen) return null;
262
- return import_react_dom.default.createPortal(
263
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: (0, import_clsx3.default)("fixed inset-0 z-[9999]"), children: [
264
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
225
+ return ReactDOM.createPortal(
226
+ /* @__PURE__ */ jsxs3("div", { className: clsx3("fixed inset-0 z-[9999]"), children: [
227
+ /* @__PURE__ */ jsx4(
265
228
  "div",
266
229
  {
267
- className: (0, import_clsx3.default)("fixed inset-0 h-screen w-screen bg-black/30", backgroundClassName),
230
+ className: clsx3("fixed inset-0 h-screen w-screen bg-black/30", backgroundClassName),
268
231
  onClick: onBackgroundClick
269
232
  }
270
233
  ),
@@ -292,21 +255,21 @@ var OverlayHeader = ({
292
255
  }) => {
293
256
  const translation = useTranslation(defaultModalHeaderTranslation, overwriteTranslation);
294
257
  const hasTitleRow = !!title || !!titleText || !!onClose;
295
- const titleRow = /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "row justify-between items-start gap-x-8", children: [
296
- title ?? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
258
+ const titleRow = /* @__PURE__ */ jsxs3("div", { className: "row justify-between items-start gap-x-8", children: [
259
+ title ?? /* @__PURE__ */ jsx4(
297
260
  "h2",
298
261
  {
299
- className: (0, import_clsx3.default)("textstyle-title-lg", {
262
+ className: clsx3("textstyle-title-lg", {
300
263
  "mb-1": description || descriptionText
301
264
  }),
302
265
  children: titleText
303
266
  }
304
267
  ),
305
- !!onClose && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Tooltip, { tooltip: translation.close, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(IconButton, { color: "neutral", size: "small", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react.X, { className: "w-full h-full" }) }) })
268
+ !!onClose && /* @__PURE__ */ jsx4(Tooltip, { tooltip: translation.close, children: /* @__PURE__ */ jsx4(IconButton, { color: "neutral", size: "small", onClick: onClose, children: /* @__PURE__ */ jsx4(X, { className: "w-full h-full" }) }) })
306
269
  ] });
307
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "col", children: [
270
+ return /* @__PURE__ */ jsxs3("div", { className: "col", children: [
308
271
  hasTitleRow && titleRow,
309
- description ?? (descriptionText && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "textstyle-description", children: descriptionText }))
272
+ description ?? (descriptionText && /* @__PURE__ */ jsx4("span", { className: "textstyle-description", children: descriptionText }))
310
273
  ] });
311
274
  };
312
275
  var Modal = ({
@@ -317,8 +280,8 @@ var Modal = ({
317
280
  backgroundClassName,
318
281
  headerProps
319
282
  }) => {
320
- const ref = (0, import_react4.useRef)(null);
321
- (0, import_react4.useEffect)(() => {
283
+ const ref = useRef(null);
284
+ useEffect4(() => {
322
285
  if (!isOpen) return;
323
286
  const modal = ref.current;
324
287
  if (!modal) {
@@ -355,25 +318,25 @@ var Modal = ({
355
318
  overlayStack = overlayStack.filter((m) => m !== modal);
356
319
  };
357
320
  }, [isOpen, onClose]);
358
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
321
+ return /* @__PURE__ */ jsx4(
359
322
  Overlay,
360
323
  {
361
324
  isOpen,
362
325
  onBackgroundClick: onClose,
363
326
  backgroundClassName,
364
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
327
+ children: /* @__PURE__ */ jsxs3(
365
328
  "div",
366
329
  {
367
330
  ref,
368
331
  tabIndex: -1,
369
- className: (0, import_clsx3.default)(
332
+ className: clsx3(
370
333
  "fixed left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 col p-4 bg-overlay-background text-overlay-text rounded-xl shadow-xl",
371
334
  className
372
335
  ),
373
336
  role: "dialog",
374
337
  "aria-modal": true,
375
338
  children: [
376
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(OverlayHeader, { ...headerProps, onClose }),
339
+ /* @__PURE__ */ jsx4(OverlayHeader, { ...headerProps, onClose }),
377
340
  children
378
341
  ]
379
342
  }
@@ -388,8 +351,8 @@ var Dialog = ({
388
351
  backgroundClassName,
389
352
  headerProps
390
353
  }) => {
391
- const ref = (0, import_react4.useRef)(null);
392
- (0, import_react4.useEffect)(() => {
354
+ const ref = useRef(null);
355
+ useEffect4(() => {
393
356
  if (!isOpen) return;
394
357
  const dialog = ref.current;
395
358
  if (!dialog) {
@@ -425,24 +388,24 @@ var Dialog = ({
425
388
  overlayStack = overlayStack.filter((m) => m !== dialog);
426
389
  };
427
390
  }, [isOpen]);
428
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
391
+ return /* @__PURE__ */ jsx4(
429
392
  Overlay,
430
393
  {
431
394
  isOpen,
432
395
  backgroundClassName,
433
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
396
+ children: /* @__PURE__ */ jsxs3(
434
397
  "div",
435
398
  {
436
399
  ref,
437
400
  tabIndex: -1,
438
- className: (0, import_clsx3.default)(
401
+ className: clsx3(
439
402
  "fixed left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 col p-4 bg-overlay-background text-overlay-text rounded-xl shadow-xl",
440
403
  className
441
404
  ),
442
405
  role: "dialog",
443
406
  "aria-modal": true,
444
407
  children: [
445
- !!headerProps && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(OverlayHeader, { ...headerProps }),
408
+ !!headerProps && /* @__PURE__ */ jsx4(OverlayHeader, { ...headerProps }),
446
409
  children
447
410
  ]
448
411
  }
@@ -450,11 +413,10 @@ var Dialog = ({
450
413
  }
451
414
  );
452
415
  };
453
- // Annotate the CommonJS export names for ESM import in node:
454
- 0 && (module.exports = {
416
+ export {
455
417
  Dialog,
456
418
  Modal,
457
419
  Overlay,
458
420
  OverlayHeader
459
- });
460
- //# sourceMappingURL=Overlay.cjs.map
421
+ };
422
+ //# sourceMappingURL=Overlay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/layout-and-navigation/Overlay.tsx","../../../src/hooks/useHoverState.ts","../../../src/components/user-action/Tooltip.tsx","../../../src/components/user-action/Button.tsx","../../../src/localization/LanguageProvider.tsx","../../../src/hooks/useLocalStorage.ts","../../../src/localization/util.ts","../../../src/localization/useTranslation.ts"],"sourcesContent":["import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport ReactDOM from 'react-dom'\nimport clsx from 'clsx'\nimport { Tooltip } from '../user-action/Tooltip'\nimport { X } from 'lucide-react'\nimport { IconButton } from '../user-action/Button'\nimport type { PropsForTranslation } from '../../localization/useTranslation'\nimport { useTranslation } from '../../localization/useTranslation'\nimport type { Language } from '../../localization/util'\n\nexport type OverlayProps = PropsWithChildren<{\n /**\n * Whether the overlay should be currently displayed\n */\n isOpen: boolean,\n /**\n * Callback when the background is clicked\n */\n onBackgroundClick?: () => void,\n /**\n * Styling for the background\n *\n * To remove the darkening, set bg-transparent\n */\n backgroundClassName?: string,\n}>\n\n/**\n * A generic overlay window which is managed by its parent\n */\nexport const Overlay = ({\n children,\n isOpen,\n onBackgroundClick,\n backgroundClassName,\n }: PropsWithChildren<OverlayProps>) => {\n // The element to which the overlay will be attached to\n const [root, setRoot] = useState<HTMLElement>()\n\n useEffect(() => {\n setRoot(document.body)\n }, [])\n\n if (!root || !isOpen) return null\n\n\n return ReactDOM.createPortal(\n <div className={clsx('fixed inset-0 z-[9999]')}>\n <div\n className={clsx('fixed inset-0 h-screen w-screen bg-black/30', backgroundClassName)}\n onClick={onBackgroundClick}\n />\n {children}\n </div>,\n root\n )\n}\n\n\nlet overlayStack: HTMLDivElement[] = []\n\n\n// --- Modal ---\n\ntype ModalHeaderTranslation = {\n close: string,\n}\n\nconst defaultModalHeaderTranslation: Record<Language, ModalHeaderTranslation> = {\n en: {\n close: 'Close'\n },\n de: {\n close: 'Schließen'\n }\n}\n\nexport type OverlayHeaderProps = {\n /**\n * Callback when the close button is clicked. If omitted or undefined, the button is hidden\n */\n onClose?: () => void,\n /** The title of the Modal. If you want to only set the text use `titleText` instead */\n title?: ReactNode,\n /** The title text of the Modal. If you want to set a custom title use `title` instead */\n titleText?: string,\n /** The description of the Modal. If you want to only set the text use `descriptionText` instead */\n description?: ReactNode,\n /** The description text of the Modal. If you want to set a custom description use `description` instead */\n descriptionText?: string,\n}\n\n/**\n * A header that should be in an Overlay\n */\nexport const OverlayHeader = ({\n overwriteTranslation,\n onClose,\n title,\n titleText = '',\n description,\n descriptionText = ''\n }: PropsForTranslation<ModalHeaderTranslation, OverlayHeaderProps>) => {\n const translation = useTranslation(defaultModalHeaderTranslation, overwriteTranslation)\n const hasTitleRow = !!title || !!titleText || !!onClose\n const titleRow = (\n <div className=\"row justify-between items-start gap-x-8\">\n {title ?? (\n <h2\n className={clsx('textstyle-title-lg', {\n 'mb-1': description || descriptionText,\n })}\n >\n {titleText}\n </h2>\n )}\n {!!onClose && (\n <Tooltip tooltip={translation.close}>\n <IconButton color=\"neutral\" size=\"small\" onClick={onClose}>\n <X className=\"w-full h-full\"/>\n </IconButton>\n </Tooltip>\n )}\n </div>\n )\n\n return (\n <div className=\"col\">\n {hasTitleRow && (titleRow)}\n {description ?? (descriptionText && (<span className=\"textstyle-description\">{descriptionText}</span>))}\n </div>\n )\n}\n\nexport type ModalProps = {\n isOpen: boolean,\n onClose: () => void,\n className?: string,\n backgroundClassName?: string,\n headerProps?: Omit<OverlayHeaderProps, 'onClose'>,\n}\n\n/**\n * A Generic Modal Window\n */\nexport const Modal = ({\n children,\n isOpen,\n onClose,\n className,\n backgroundClassName,\n headerProps,\n }: PropsWithChildren<ModalProps>) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n\n const modal = ref.current\n\n if (!modal) {\n console.error('modal open, but no ref found')\n return\n }\n\n overlayStack.push(modal)\n\n const focusable = modal?.querySelectorAll(\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isTopmost = overlayStack[overlayStack.length - 1] === modal\n if (!isTopmost) return\n\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose()\n } else if (e.key === 'Tab') {\n if (focusable.length === 0) return\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n (last as HTMLElement).focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n (first as HTMLElement).focus()\n }\n }\n }\n\n modal.focus()\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n overlayStack = overlayStack.filter(m => m !== modal)\n }\n }, [isOpen, onClose])\n\n return (\n <Overlay\n isOpen={isOpen}\n onBackgroundClick={onClose}\n backgroundClassName={backgroundClassName}\n >\n <div\n ref={ref}\n tabIndex={-1}\n className={clsx(\n 'fixed left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 col p-4 bg-overlay-background text-overlay-text rounded-xl shadow-xl',\n className\n )}\n role=\"dialog\"\n aria-modal={true}\n >\n <OverlayHeader {...headerProps} onClose={onClose}/>\n {children}\n </div>\n </Overlay>\n )\n}\n\n// --- Dialog ---\n\nexport type DialogProps = Omit<OverlayProps, 'onBackgroundClick'> & {\n headerProps?: Omit<OverlayHeaderProps, 'onClose'>,\n className?: string,\n}\n\n/**\n * A Generic Dialog Window\n */\nexport const Dialog = ({\n children,\n isOpen,\n className,\n backgroundClassName,\n headerProps,\n }: PropsWithChildren<DialogProps>) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n\n const dialog = ref.current\n\n if (!dialog) {\n console.error('dialog open, but no ref found')\n return\n }\n\n overlayStack.push(dialog)\n\n const focusable = dialog?.querySelectorAll(\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isTopmost = overlayStack[overlayStack.length - 1] === dialog\n if (!isTopmost) return\n\n if (e.key === 'Escape') {\n e.stopPropagation()\n } else if (e.key === 'Tab') {\n if (focusable.length === 0) return\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n (last as HTMLElement).focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n (first as HTMLElement).focus()\n }\n }\n }\n\n dialog.focus()\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n overlayStack = overlayStack.filter(m => m !== dialog)\n }\n }, [isOpen])\n\n return (\n <Overlay\n isOpen={isOpen}\n backgroundClassName={backgroundClassName}\n >\n <div\n ref={ref}\n tabIndex={-1}\n className={clsx(\n 'fixed left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 col p-4 bg-overlay-background text-overlay-text rounded-xl shadow-xl',\n className\n )}\n role=\"dialog\"\n aria-modal={true}\n >\n {!!headerProps && (<OverlayHeader {...headerProps}/>)}\n {children}\n </div>\n </Overlay>\n )\n}","import type { Dispatch, SetStateAction } from 'react'\nimport { useEffect, useState } from 'react'\n\ntype UseHoverStateProps = {\n /**\n * The delay after which the menu is closed in milliseconds\n *\n * default: 200ms\n */\n closingDelay: number,\n /**\n * Whether the hover state management should be disabled\n *\n * default: false\n */\n isDisabled: boolean,\n}\n\ntype UseHoverStateReturnType = {\n /**\n * Whether the element is hovered\n */\n isHovered: boolean,\n /**\n * Function to change the current hover status\n */\n setIsHovered: Dispatch<SetStateAction<boolean>>,\n /**\n * Handlers to pass on to the component that should be hovered\n */\n handlers: {\n onMouseEnter: () => void,\n onMouseLeave: () => void,\n },\n}\n\nconst defaultUseHoverStateProps: UseHoverStateProps = {\n closingDelay: 200,\n isDisabled: false,\n}\n\n/**\n * @param props See UseHoverStateProps\n *\n * A react hook for managing the hover state of a component. The handlers provided should be\n * forwarded to the component which should be hovered over\n */\nexport const useHoverState = (props: Partial<UseHoverStateProps> | undefined = undefined): UseHoverStateReturnType => {\n const { closingDelay, isDisabled } = { ...defaultUseHoverStateProps, ...props }\n\n const [isHovered, setIsHovered] = useState(false)\n const [timer, setTimer] = useState<NodeJS.Timeout>()\n\n const onMouseEnter = () => {\n if (isDisabled) {\n return\n }\n clearTimeout(timer)\n setIsHovered(true)\n }\n\n const onMouseLeave = () => {\n if (isDisabled) {\n return\n }\n setTimer(setTimeout(() => {\n setIsHovered(false)\n }, closingDelay))\n }\n\n useEffect(() => {\n if (timer) {\n return () => {\n clearTimeout(timer)\n }\n }\n })\n\n useEffect(() => {\n if (timer) {\n clearTimeout(timer)\n }\n }, [isDisabled]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n isHovered, setIsHovered, handlers: { onMouseEnter, onMouseLeave }\n }\n}\n","import type { CSSProperties, PropsWithChildren, ReactNode } from 'react'\nimport { useHoverState } from '../../hooks/useHoverState'\nimport { clsx } from 'clsx'\n\ntype Position = 'top' | 'bottom' | 'left' | 'right'\n\nexport type TooltipProps = PropsWithChildren<{\n tooltip: string | ReactNode,\n /**\n * Number of milliseconds until the tooltip appears\n *\n * defaults to 1000ms\n */\n animationDelay?: number,\n /**\n * Class names of additional styling properties for the tooltip\n */\n tooltipClassName?: string,\n /**\n * Class names of additional styling properties for the container from which the tooltip will be created\n */\n containerClassName?: string,\n position?: Position,\n zIndex?: number,\n}>\n\n/**\n * A Component for showing a tooltip when hovering over Content\n * @param tooltip The tooltip to show can be a text or any ReactNode\n * @param children The Content for which the tooltip should be created\n * @param animationDelay The delay before the tooltip appears\n * @param tooltipClassName Additional ClassNames for the Container of the tooltip\n * @param containerClassName Additional ClassNames for the Container holding the content\n * @param position The direction of the tooltip relative to the Container\n * @param zIndex The z Index of the tooltip (you may require this when stacking modal)\n * @constructor\n */\nexport const Tooltip = ({\n tooltip,\n children,\n animationDelay = 650,\n tooltipClassName = '',\n containerClassName = '',\n position = 'bottom',\n zIndex = 10,\n }: TooltipProps) => {\n const { isHovered, handlers } = useHoverState()\n\n const positionClasses = {\n top: `bottom-full left-1/2 -translate-x-1/2 mb-[6px]`,\n bottom: `top-full left-1/2 -translate-x-1/2 mt-[6px]`,\n left: `right-full top-1/2 -translate-y-1/2 mr-[6px]`,\n right: `left-full top-1/2 -translate-y-1/2 ml-[6px]`\n }\n\n const triangleSize = 6\n const triangleClasses = {\n top: `top-full left-1/2 -translate-x-1/2 border-t-tooltip-background border-l-transparent border-r-transparent`,\n bottom: `bottom-full left-1/2 -translate-x-1/2 border-b-tooltip-background border-l-transparent border-r-transparent`,\n left: `left-full top-1/2 -translate-y-1/2 border-l-tooltip-background border-t-transparent border-b-transparent`,\n right: `right-full top-1/2 -translate-y-1/2 border-r-tooltip-background border-t-transparent border-b-transparent`\n }\n\n const triangleStyle: Record<Position, CSSProperties> = {\n top: { borderWidth: `${triangleSize}px ${triangleSize}px 0 ${triangleSize}px` },\n bottom: { borderWidth: `0 ${triangleSize}px ${triangleSize}px ${triangleSize}px` },\n left: { borderWidth: `${triangleSize}px 0 ${triangleSize}px ${triangleSize}px` },\n right: { borderWidth: `${triangleSize}px ${triangleSize}px ${triangleSize}px 0` }\n }\n\n return (\n <div\n className={clsx('relative inline-block', containerClassName)}\n {...handlers}\n >\n {children}\n {isHovered && (\n <div\n className={clsx(\n `opacity-0 absolute text-xs font-semibold text-tooltip-text px-2 py-1 rounded whitespace-nowrap\n animate-tooltip-fade-in shadow-lg bg-tooltip-background`,\n positionClasses[position], tooltipClassName\n )}\n style={{ zIndex, animationDelay: animationDelay + 'ms' }}\n >\n {tooltip}\n <div\n className={clsx(`absolute w-0 h-0`, triangleClasses[position])}\n style={{ ...triangleStyle[position], zIndex }}\n />\n </div>\n )}\n </div>\n )\n}\n","import type { ButtonHTMLAttributes, PropsWithChildren, ReactNode } from 'react'\nimport clsx from 'clsx'\n\n\nexport const ButtonColorUtil = {\n solid: ['primary', 'secondary', 'tertiary', 'positive', 'warning', 'negative', 'neutral'] as const,\n text: ['primary', 'negative', 'neutral'] as const,\n outline: ['primary'] as const,\n}\n\n\n/**\n * The allowed colors for the SolidButton and IconButton\n */\nexport type SolidButtonColor = typeof ButtonColorUtil.solid[number]\n/**\n * The allowed colors for the OutlineButton\n */\nexport type OutlineButtonColor = typeof ButtonColorUtil.outline[number]\n/**\n * The allowed colors for the TextButton\n */\nexport type TextButtonColor = typeof ButtonColorUtil.text[number]\n\n/**\n * The different sizes for a button\n */\ntype ButtonSizes = 'small' | 'medium' | 'large'\n\n/**\n * The shard properties between all button types\n */\nexport type ButtonProps = PropsWithChildren<{\n /**\n * @default 'medium'\n */\n size?: ButtonSizes,\n}> & ButtonHTMLAttributes<Element>\n\nconst paddingMapping: Record<ButtonSizes, string> = {\n small: 'btn-sm',\n medium: 'btn-md',\n large: 'btn-lg'\n}\n\nconst iconPaddingMapping: Record<ButtonSizes, string> = {\n small: 'icon-btn-sm',\n medium: 'icon-btn-md',\n large: 'icon-btn-lg'\n}\n\nexport const ButtonUtil = {\n paddingMapping,\n iconPaddingMapping\n}\n\ntype ButtonWithIconsProps = ButtonProps & {\n startIcon?: ReactNode,\n endIcon?: ReactNode,\n}\n\nexport type SolidButtonProps = ButtonWithIconsProps & {\n color?: SolidButtonColor,\n}\n\nexport type OutlineButtonProps = ButtonWithIconsProps & {\n color?: OutlineButtonColor,\n}\n\nexport type TextButtonProps = ButtonWithIconsProps & {\n color?: TextButtonColor,\n}\n\nexport type IconButtonProps = ButtonProps & {\n color?: SolidButtonColor,\n}\n\n/**\n * A button with a solid background and different sizes\n */\nconst SolidButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: SolidButtonProps) => {\n const colorClasses = {\n primary: 'bg-button-solid-primary-background text-button-solid-primary-text',\n secondary: 'bg-button-solid-secondary-background text-button-solid-secondary-text',\n tertiary: 'bg-button-solid-tertiary-background text-button-solid-tertiary-text',\n positive: 'bg-button-solid-positive-background text-button-solid-positive-text',\n warning: 'bg-button-solid-warning-background text-button-solid-warning-text',\n negative: 'bg-button-solid-negative-background text-button-solid-negative-text',\n neutral: 'bg-button-solid-neutral-background text-button-solid-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-solid-primary-icon',\n secondary: 'text-button-solid-secondary-icon',\n tertiary: 'text-button-solid-tertiary-icon',\n positive: 'text-button-solid-positive-icon',\n warning: 'text-button-solid-warning-icon',\n negative: 'text-button-solid-negative-icon',\n neutral: 'text-button-solid-neutral-icon',\n }[color]\n\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text bg-disabled-background cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-90')]: !disabled\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n/**\n * A button with an outline border and different sizes\n */\nconst OutlineButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: OutlineButtonProps) => {\n const colorClasses = {\n primary: 'bg-transparent border-2 border-button-outline-primary-text text-button-outline-primary-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-outline-primary-icon',\n }[color]\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text border-disabled-outline cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-80')]: !disabled,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n/**\n * A text that is a button that can have different sizes\n */\nconst TextButton = ({\n children,\n disabled = false,\n color = 'neutral',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: TextButtonProps) => {\n const colorClasses = {\n primary: 'bg-transparent text-button-text-primary-text',\n negative: 'bg-transparent text-button-text-negative-text',\n neutral: 'bg-transparent text-button-text-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'text-button-text-primary-icon',\n negative: 'text-button-text-negative-icon',\n neutral: 'text-button-text-neutral-icon',\n }[color]\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:bg-button-text-hover-background rounded-full')]: !disabled,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx({\n [iconColorClasses]: !disabled,\n [`text-disabled-icon`]: disabled\n })}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n\n/**\n * A button for icons with a solid background and different sizes\n */\nconst IconButton = ({\n children,\n disabled = false,\n color = 'primary',\n size = 'medium',\n onClick,\n className,\n ...restProps\n }: IconButtonProps) => {\n const colorClasses = {\n primary: 'bg-button-solid-primary-background text-button-solid-primary-text',\n secondary: 'bg-button-solid-secondary-background text-button-solid-secondary-text',\n tertiary: 'bg-button-solid-tertiary-background text-button-solid-tertiary-text',\n positive: 'bg-button-solid-positive-background text-button-solid-positive-text',\n warning: 'bg-button-solid-warning-background text-button-solid-warning-text',\n negative: 'bg-button-solid-negative-background text-button-solid-negative-text',\n neutral: 'bg-button-solid-neutral-background text-button-solid-neutral-text',\n }[color]\n\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled || onClick === undefined}\n className={clsx(\n {\n 'text-disabled-text bg-disabled-background cursor-not-allowed': disabled,\n [clsx(colorClasses, 'hover:brightness-90')]: !disabled\n },\n ButtonUtil.iconPaddingMapping[size],\n className\n )}\n {...restProps}\n >\n {children}\n </button>\n )\n}\n\nexport { SolidButton, OutlineButton, TextButton, IconButton }\n","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\nimport type { Language } from './util'\nimport { LanguageUtil } from './util'\n\nexport type LanguageContextValue = {\n language: Language,\n setLanguage: Dispatch<SetStateAction<Language>>,\n}\n\nexport const LanguageContext = createContext<LanguageContextValue>({\n language: LanguageUtil.DEFAULT_LANGUAGE,\n setLanguage: (v) => v\n})\n\nexport const useLanguage = () => useContext(LanguageContext)\n\nexport const useLocale = (overWriteLanguage?: Language) => {\n const { language } = useLanguage()\n const mapping: Record<Language, string> = {\n en: 'en-US',\n de: 'de-DE'\n }\n return mapping[overWriteLanguage ?? language]\n}\n\ntype LanguageProviderProps = {\n initialLanguage?: Language,\n}\n\nexport const LanguageProvider = ({ initialLanguage, children }: PropsWithChildren<LanguageProviderProps>) => {\n const [language, setLanguage] = useState<Language>(initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n const [storedLanguage, setStoredLanguage] = useLocalStorage<Language>('language', initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n\n useEffect(() => {\n if (language !== initialLanguage && initialLanguage) {\n console.warn('LanguageProvider initial state changed: Prefer using languageProvider\\'s setLanguage instead')\n setLanguage(initialLanguage)\n }\n }, [initialLanguage]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n // TODO set locale of html tag here as well\n setStoredLanguage(language)\n }, [language, setStoredLanguage])\n\n useEffect(() => {\n if (storedLanguage !== null) {\n setLanguage(storedLanguage)\n return\n }\n\n const LanguageToTestAgainst = Object.values(LanguageUtil.languages)\n\n const matchingBrowserLanguage = window.navigator.languages\n .map(language => LanguageToTestAgainst.find((test) => language === test || language.split('-')[0] === test))\n .filter(entry => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0] as Language\n setLanguage(firstMatch)\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <LanguageContext.Provider value={{\n language,\n setLanguage\n }}>\n {children}\n </LanguageContext.Provider>\n )\n}","import type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { LocalStorageService } from '../util/storage'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\nexport const useLocalStorage = <T>(key: string, initValue: T): [T, SetValue<T>] => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return initValue\n }\n const storageService = new LocalStorageService()\n const value = storageService.get<T>(key)\n return value || initValue\n }, [initValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(value => {\n const newValue = value instanceof Function ? value(storedValue) : value\n const storageService = new LocalStorageService()\n storageService.set(key, value)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n useEffect(() => {\n setStoredValue(get())\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return [storedValue, setValue]\n}","/**\n * The supported languages\n */\nconst languages = ['en', 'de'] as const\n\n/**\n * The supported languages\n */\nexport type Language = typeof languages[number]\n\n/**\n * The supported languages' names in their respective language\n */\nconst languagesLocalNames: Record<Language, string> = {\n en: 'English',\n de: 'Deutsch',\n}\n\n/**\n * The default language\n */\nconst DEFAULT_LANGUAGE: Language = 'en'\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LanguageUtil = {\n languages,\n DEFAULT_LANGUAGE,\n languagesLocalNames,\n}","import { useLanguage } from './LanguageProvider'\nimport type { Language } from './util'\n\nexport type Translation<T> = Record<Language, T>\n\ntype OverwriteTranslationType<Translation extends Record<string, unknown>> = {\n language?: Language,\n translation?: Partial<Record<Language, Partial<Translation>>>,\n}\n\n/**\n * Adds the `language` prop to the component props.\n *\n * @param Translation the type of the translation object\n *\n * @param Props the type of the component props, defaults to `Record<string, never>`,\n * if you don't expect any other props other than `language` and get an\n * error when using your component (because it uses `forwardRef` etc.)\n * you can try out `Record<string, unknown>`, this might resolve your\n * problem as `SomeType & never` is still `never` but `SomeType & unknown`\n * is `SomeType` which means that adding back props (like `ref` etc.)\n * works properly\n */\nexport type PropsForTranslation<\n Translation extends Record<string, unknown>,\n Props = Record<string, never>\n> = Props & {\n overwriteTranslation?: OverwriteTranslationType<Translation>,\n};\n\nexport const useTranslation = <Translation extends Record<string, unknown>>(\n defaults: Record<Language, Translation>,\n translationOverwrite: OverwriteTranslationType<Translation> = {}\n): Translation => {\n const { language: languageProp, translation: overwrite } = translationOverwrite\n const { language: inferredLanguage } = useLanguage()\n const usedLanguage = languageProp ?? inferredLanguage\n let defaultValues: Translation = defaults[usedLanguage]\n if (overwrite && overwrite[usedLanguage]) {\n defaultValues = { ...defaultValues, ...overwrite[usedLanguage] }\n }\n return defaultValues\n}\n"],"mappings":"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","names":["useEffect","useState","clsx","clsx","jsx","jsxs","jsx","clsx","useEffect","useState","useEffect","useState","jsx","jsx","jsxs","useState","useEffect","clsx"]}