@helpwave/hightide 0.1.43 → 0.1.45

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 (205) hide show
  1. package/dist/components/date/DatePicker.cjs +7 -7
  2. package/dist/components/date/DatePicker.cjs.map +1 -1
  3. package/dist/components/date/DatePicker.js +7 -7
  4. package/dist/components/date/DatePicker.js.map +1 -1
  5. package/dist/components/date/DayPicker.cjs +2 -2
  6. package/dist/components/date/DayPicker.cjs.map +1 -1
  7. package/dist/components/date/DayPicker.js +2 -2
  8. package/dist/components/date/DayPicker.js.map +1 -1
  9. package/dist/components/date/TimeDisplay.cjs +14 -14
  10. package/dist/components/date/TimeDisplay.cjs.map +1 -1
  11. package/dist/components/date/TimeDisplay.js +14 -14
  12. package/dist/components/date/TimeDisplay.js.map +1 -1
  13. package/dist/components/date/YearMonthPicker.cjs +2 -2
  14. package/dist/components/date/YearMonthPicker.cjs.map +1 -1
  15. package/dist/components/date/YearMonthPicker.js +2 -2
  16. package/dist/components/date/YearMonthPicker.js.map +1 -1
  17. package/dist/components/date/index.cjs +8 -8
  18. package/dist/components/date/index.cjs.map +1 -1
  19. package/dist/components/date/index.js +8 -8
  20. package/dist/components/date/index.js.map +1 -1
  21. package/dist/components/dialog/ConfirmDialog.cjs +15 -15
  22. package/dist/components/dialog/ConfirmDialog.cjs.map +1 -1
  23. package/dist/components/dialog/ConfirmDialog.js +15 -15
  24. package/dist/components/dialog/ConfirmDialog.js.map +1 -1
  25. package/dist/components/dialog/Dialog.cjs +14 -14
  26. package/dist/components/dialog/Dialog.cjs.map +1 -1
  27. package/dist/components/dialog/Dialog.js +14 -14
  28. package/dist/components/dialog/Dialog.js.map +1 -1
  29. package/dist/components/dialog/DiscardChangesDialog.cjs +16 -16
  30. package/dist/components/dialog/DiscardChangesDialog.cjs.map +1 -1
  31. package/dist/components/dialog/DiscardChangesDialog.js +16 -16
  32. package/dist/components/dialog/DiscardChangesDialog.js.map +1 -1
  33. package/dist/components/dialog/InputDialog.cjs +15 -15
  34. package/dist/components/dialog/InputDialog.cjs.map +1 -1
  35. package/dist/components/dialog/InputDialog.js +15 -15
  36. package/dist/components/dialog/InputDialog.js.map +1 -1
  37. package/dist/components/dialog/LanguageDialog.cjs +21 -21
  38. package/dist/components/dialog/LanguageDialog.cjs.map +1 -1
  39. package/dist/components/dialog/LanguageDialog.js +21 -21
  40. package/dist/components/dialog/LanguageDialog.js.map +1 -1
  41. package/dist/components/dialog/ThemeDialog.cjs +21 -21
  42. package/dist/components/dialog/ThemeDialog.cjs.map +1 -1
  43. package/dist/components/dialog/ThemeDialog.js +21 -21
  44. package/dist/components/dialog/ThemeDialog.js.map +1 -1
  45. package/dist/components/dialog/index.cjs +24 -24
  46. package/dist/components/dialog/index.cjs.map +1 -1
  47. package/dist/components/dialog/index.js +24 -24
  48. package/dist/components/dialog/index.js.map +1 -1
  49. package/dist/components/index.cjs +30 -30
  50. package/dist/components/index.cjs.map +1 -1
  51. package/dist/components/index.js +30 -30
  52. package/dist/components/index.js.map +1 -1
  53. package/dist/components/layout/Carousel.cjs +15 -15
  54. package/dist/components/layout/Carousel.cjs.map +1 -1
  55. package/dist/components/layout/Carousel.js +15 -15
  56. package/dist/components/layout/Carousel.js.map +1 -1
  57. package/dist/components/layout/TextImage.cjs +14 -14
  58. package/dist/components/layout/TextImage.cjs.map +1 -1
  59. package/dist/components/layout/TextImage.js +14 -14
  60. package/dist/components/layout/TextImage.js.map +1 -1
  61. package/dist/components/layout/index.cjs +21 -21
  62. package/dist/components/layout/index.cjs.map +1 -1
  63. package/dist/components/layout/index.js +21 -21
  64. package/dist/components/layout/index.js.map +1 -1
  65. package/dist/components/loading-states/ErrorComponent.cjs +14 -14
  66. package/dist/components/loading-states/ErrorComponent.cjs.map +1 -1
  67. package/dist/components/loading-states/ErrorComponent.js +14 -14
  68. package/dist/components/loading-states/ErrorComponent.js.map +1 -1
  69. package/dist/components/loading-states/LoadingAnimation.cjs +14 -14
  70. package/dist/components/loading-states/LoadingAnimation.cjs.map +1 -1
  71. package/dist/components/loading-states/LoadingAnimation.js +14 -14
  72. package/dist/components/loading-states/LoadingAnimation.js.map +1 -1
  73. package/dist/components/loading-states/index.cjs +15 -15
  74. package/dist/components/loading-states/index.cjs.map +1 -1
  75. package/dist/components/loading-states/index.js +15 -15
  76. package/dist/components/loading-states/index.js.map +1 -1
  77. package/dist/components/navigation/Pagination.cjs +14 -14
  78. package/dist/components/navigation/Pagination.cjs.map +1 -1
  79. package/dist/components/navigation/Pagination.js +14 -14
  80. package/dist/components/navigation/Pagination.js.map +1 -1
  81. package/dist/components/navigation/StepperBar.cjs +19 -19
  82. package/dist/components/navigation/StepperBar.cjs.map +1 -1
  83. package/dist/components/navigation/StepperBar.js +19 -19
  84. package/dist/components/navigation/StepperBar.js.map +1 -1
  85. package/dist/components/navigation/index.cjs +15 -15
  86. package/dist/components/navigation/index.cjs.map +1 -1
  87. package/dist/components/navigation/index.js +15 -15
  88. package/dist/components/navigation/index.js.map +1 -1
  89. package/dist/components/properties/CheckboxProperty.cjs +15 -15
  90. package/dist/components/properties/CheckboxProperty.cjs.map +1 -1
  91. package/dist/components/properties/CheckboxProperty.js +15 -15
  92. package/dist/components/properties/CheckboxProperty.js.map +1 -1
  93. package/dist/components/properties/DateProperty.cjs +13 -13
  94. package/dist/components/properties/DateProperty.cjs.map +1 -1
  95. package/dist/components/properties/DateProperty.js +13 -13
  96. package/dist/components/properties/DateProperty.js.map +1 -1
  97. package/dist/components/properties/MultiSelectProperty.cjs +20 -20
  98. package/dist/components/properties/MultiSelectProperty.cjs.map +1 -1
  99. package/dist/components/properties/MultiSelectProperty.js +20 -20
  100. package/dist/components/properties/MultiSelectProperty.js.map +1 -1
  101. package/dist/components/properties/NumberProperty.cjs +15 -15
  102. package/dist/components/properties/NumberProperty.cjs.map +1 -1
  103. package/dist/components/properties/NumberProperty.js +15 -15
  104. package/dist/components/properties/NumberProperty.js.map +1 -1
  105. package/dist/components/properties/PropertyBase.cjs +14 -14
  106. package/dist/components/properties/PropertyBase.cjs.map +1 -1
  107. package/dist/components/properties/PropertyBase.js +14 -14
  108. package/dist/components/properties/PropertyBase.js.map +1 -1
  109. package/dist/components/properties/SelectProperty.cjs +20 -20
  110. package/dist/components/properties/SelectProperty.cjs.map +1 -1
  111. package/dist/components/properties/SelectProperty.js +20 -20
  112. package/dist/components/properties/SelectProperty.js.map +1 -1
  113. package/dist/components/properties/TextProperty.cjs +15 -15
  114. package/dist/components/properties/TextProperty.cjs.map +1 -1
  115. package/dist/components/properties/TextProperty.js +15 -15
  116. package/dist/components/properties/TextProperty.js.map +1 -1
  117. package/dist/components/properties/index.cjs +18 -18
  118. package/dist/components/properties/index.cjs.map +1 -1
  119. package/dist/components/properties/index.js +18 -18
  120. package/dist/components/properties/index.js.map +1 -1
  121. package/dist/components/table/Table.cjs +14 -14
  122. package/dist/components/table/Table.cjs.map +1 -1
  123. package/dist/components/table/Table.js +14 -14
  124. package/dist/components/table/Table.js.map +1 -1
  125. package/dist/components/table/TableFilterButton.cjs +14 -14
  126. package/dist/components/table/TableFilterButton.cjs.map +1 -1
  127. package/dist/components/table/TableFilterButton.js +14 -14
  128. package/dist/components/table/TableFilterButton.js.map +1 -1
  129. package/dist/components/table/index.cjs +14 -14
  130. package/dist/components/table/index.cjs.map +1 -1
  131. package/dist/components/table/index.js +14 -14
  132. package/dist/components/table/index.js.map +1 -1
  133. package/dist/components/user-action/CopyToClipboardWrapper.cjs +14 -14
  134. package/dist/components/user-action/CopyToClipboardWrapper.cjs.map +1 -1
  135. package/dist/components/user-action/CopyToClipboardWrapper.js +14 -14
  136. package/dist/components/user-action/CopyToClipboardWrapper.js.map +1 -1
  137. package/dist/components/user-action/DateAndTimePicker.cjs +8 -8
  138. package/dist/components/user-action/DateAndTimePicker.cjs.map +1 -1
  139. package/dist/components/user-action/DateAndTimePicker.js +8 -8
  140. package/dist/components/user-action/DateAndTimePicker.js.map +1 -1
  141. package/dist/components/user-action/SearchBar.cjs +14 -14
  142. package/dist/components/user-action/SearchBar.cjs.map +1 -1
  143. package/dist/components/user-action/SearchBar.js +14 -14
  144. package/dist/components/user-action/SearchBar.js.map +1 -1
  145. package/dist/components/user-action/index.cjs +18 -18
  146. package/dist/components/user-action/index.cjs.map +1 -1
  147. package/dist/components/user-action/index.js +18 -18
  148. package/dist/components/user-action/index.js.map +1 -1
  149. package/dist/components/user-action/select/Select.cjs +19 -19
  150. package/dist/components/user-action/select/Select.cjs.map +1 -1
  151. package/dist/components/user-action/select/Select.js +19 -19
  152. package/dist/components/user-action/select/Select.js.map +1 -1
  153. package/dist/components/user-action/select/index.cjs +19 -19
  154. package/dist/components/user-action/select/index.cjs.map +1 -1
  155. package/dist/components/user-action/select/index.js +19 -19
  156. package/dist/components/user-action/select/index.js.map +1 -1
  157. package/dist/hooks/index.cjs +11 -11
  158. package/dist/hooks/index.cjs.map +1 -1
  159. package/dist/hooks/index.js +11 -11
  160. package/dist/hooks/index.js.map +1 -1
  161. package/dist/hooks/useValidators.cjs +14 -14
  162. package/dist/hooks/useValidators.cjs.map +1 -1
  163. package/dist/hooks/useValidators.js +14 -14
  164. package/dist/hooks/useValidators.js.map +1 -1
  165. package/dist/i18n/LocaleProvider.cjs +2 -2
  166. package/dist/i18n/LocaleProvider.cjs.map +1 -1
  167. package/dist/i18n/LocaleProvider.d.cts +5 -5
  168. package/dist/i18n/LocaleProvider.d.ts +5 -5
  169. package/dist/i18n/LocaleProvider.js +2 -2
  170. package/dist/i18n/LocaleProvider.js.map +1 -1
  171. package/dist/i18n/index.cjs +15 -15
  172. package/dist/i18n/index.cjs.map +1 -1
  173. package/dist/i18n/index.d.cts +2 -2
  174. package/dist/i18n/index.d.ts +2 -2
  175. package/dist/i18n/index.js +11 -11
  176. package/dist/i18n/index.js.map +1 -1
  177. package/dist/i18n/translations.cjs +6 -6
  178. package/dist/i18n/translations.cjs.map +1 -1
  179. package/dist/i18n/translations.d.cts +5 -5
  180. package/dist/i18n/translations.d.ts +5 -5
  181. package/dist/i18n/translations.js +4 -4
  182. package/dist/i18n/translations.js.map +1 -1
  183. package/dist/i18n/{useTranslation.cjs → useHightideTranslation.cjs} +22 -22
  184. package/dist/i18n/useHightideTranslation.cjs.map +1 -0
  185. package/dist/i18n/useHightideTranslation.d.cts +21 -0
  186. package/dist/i18n/useHightideTranslation.d.ts +21 -0
  187. package/dist/i18n/{useTranslation.js → useHightideTranslation.js} +16 -16
  188. package/dist/i18n/useHightideTranslation.js.map +1 -0
  189. package/dist/i18n/util.cjs +2 -2
  190. package/dist/i18n/util.cjs.map +1 -1
  191. package/dist/i18n/util.d.cts +2 -2
  192. package/dist/i18n/util.d.ts +2 -2
  193. package/dist/i18n/util.js +2 -2
  194. package/dist/i18n/util.js.map +1 -1
  195. package/dist/index.cjs +37 -37
  196. package/dist/index.cjs.map +1 -1
  197. package/dist/index.d.cts +2 -2
  198. package/dist/index.d.ts +2 -2
  199. package/dist/index.js +34 -34
  200. package/dist/index.js.map +1 -1
  201. package/package.json +3 -3
  202. package/dist/i18n/useTranslation.cjs.map +0 -1
  203. package/dist/i18n/useTranslation.d.cts +0 -22
  204. package/dist/i18n/useTranslation.d.ts +0 -22
  205. package/dist/i18n/useTranslation.js.map +0 -1
@@ -262,10 +262,16 @@ var IconButton = (0, import_react.forwardRef)(function IconButton2({
262
262
  );
263
263
  });
264
264
 
265
+ // src/i18n/LocaleProvider.tsx
266
+ var import_react3 = require("react");
267
+
268
+ // src/hooks/useLocalStorage.ts
269
+ var import_react2 = require("react");
270
+
265
271
  // src/i18n/translations.ts
266
272
  var import_internationalization = require("@helpwave/internationalization");
267
- var supportedLocales = ["de-DE", "en-US"];
268
- var generatedTranslations = {
273
+ var hightideTranslationLocales = ["de-DE", "en-US"];
274
+ var hightideTranslation = {
269
275
  "de-DE": {
270
276
  "add": `Hinzuf\xFCgen`,
271
277
  "age": `Alter`,
@@ -740,12 +746,6 @@ var generatedTranslations = {
740
746
  }
741
747
  };
742
748
 
743
- // src/i18n/LocaleProvider.tsx
744
- var import_react3 = require("react");
745
-
746
- // src/hooks/useLocalStorage.ts
747
- var import_react2 = require("react");
748
-
749
749
  // src/i18n/util.ts
750
750
  var localsNames = {
751
751
  "en-US": "English (US)",
@@ -756,7 +756,7 @@ function localeToLanguage(locale) {
756
756
  return locale.split("-")[0];
757
757
  }
758
758
  var LocalizationUtil = {
759
- locals: supportedLocales,
759
+ locals: hightideTranslationLocales,
760
760
  localToLanguage: localeToLanguage,
761
761
  DEFAULT_LOCALE,
762
762
  languagesLocalNames: localsNames
@@ -776,15 +776,15 @@ var useLocale = () => {
776
776
  return context;
777
777
  };
778
778
 
779
- // src/i18n/useTranslation.ts
779
+ // src/i18n/useHightideTranslation.ts
780
780
  var import_internationalization2 = require("@helpwave/internationalization");
781
- function useTranslation(extensions, overwrites) {
781
+ function useHightideTranslation(extensions, overwrites) {
782
782
  const { locale: inferredLocale } = useLocale();
783
783
  const locale = overwrites?.locale ?? inferredLocale;
784
784
  const translationExtensions = ArrayUtil.resolveSingleOrArray(extensions);
785
785
  return (0, import_internationalization2.combineTranslation)([
786
786
  ...translationExtensions,
787
- generatedTranslations
787
+ hightideTranslation
788
788
  ], locale);
789
789
  }
790
790
 
@@ -801,7 +801,7 @@ var useCarouselContext = () => {
801
801
  function CarouselTabs({
802
802
  onChange
803
803
  }) {
804
- const translation = useTranslation();
804
+ const translation = useHightideTranslation();
805
805
  const { id, slideCount, currentIndex, isLooping } = useCarouselContext();
806
806
  const tabRefs = (0, import_react4.useRef)([]);
807
807
  const handleKeyDown = (event, index) => {
@@ -859,7 +859,7 @@ var CarouselSlide = (0, import_react4.forwardRef)(
859
859
  isSelected,
860
860
  ...props
861
861
  }, ref) {
862
- const translation = useTranslation();
862
+ const translation = useHightideTranslation();
863
863
  const { id, slideCount } = useCarouselContext();
864
864
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
865
865
  "div",
@@ -897,7 +897,7 @@ var Carousel = ({
897
897
  onSlideChanged,
898
898
  ...props
899
899
  }) => {
900
- const translation = useTranslation();
900
+ const translation = useHightideTranslation();
901
901
  const slideRefs = (0, import_react4.useRef)([]);
902
902
  const [currentIndex, setCurrentIndex] = (0, import_react4.useState)(0);
903
903
  const [hasFocus, setHasFocus] = (0, import_react4.useState)(false);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layout/Carousel.tsx","../../../src/utils/array.ts","../../../src/components/user-action/Button.tsx","../../../src/i18n/translations.ts","../../../src/i18n/LocaleProvider.tsx","../../../src/hooks/useLocalStorage.ts","../../../src/i18n/util.ts","../../../src/i18n/useTranslation.ts"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react'\nimport React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState\n} from 'react'\nimport clsx from 'clsx'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { createLoopingListWithIndex, range } from '@/src/utils/array'\nimport { IconButton } from '../user-action/Button'\nimport { useTranslation } from '@/src/i18n/useTranslation'\n\n//\n// CarouselContext\n//\ntype CarouselContextType = {\n id: string,\n currentIndex: number,\n slideCount: number,\n isLooping: boolean,\n}\n\nconst CarouselContext = createContext<CarouselContextType | null>(null)\n\nconst useCarouselContext = () => {\n const context = useContext(CarouselContext)\n if (!context) {\n console.error('useCarouselContext must be used within CarouselContext')\n }\n return context\n}\n\n//\n// CarouselTab\n//\ntype CarouselTabsProps = {\n onChange: (index: number) => void,\n}\n\nexport default function CarouselTabs({\n onChange,\n }: CarouselTabsProps) {\n const translation = useTranslation()\n const { id, slideCount, currentIndex, isLooping } = useCarouselContext()\n\n const tabRefs = useRef<(HTMLButtonElement | null)[]>([])\n\n const handleKeyDown = (event: React.KeyboardEvent, index: number) => {\n let newIndex = index\n if (event.key === 'ArrowRight') {\n newIndex = isLooping ? (index + 1) % slideCount : Math.max(index + 1, slideCount - 1)\n } else if (event.key === 'ArrowLeft') {\n newIndex = isLooping ? (index - 1 + slideCount) % slideCount : Math.max(index - 1, 0)\n } else {\n return\n }\n event.preventDefault()\n onChange(newIndex)\n tabRefs.current[newIndex]?.focus()\n }\n\n return (\n <div\n className=\"flex-row-1 items-center justify-center w-full my-2\"\n role=\"tablist\"\n aria-label={translation('slideNavigation')}\n id={`${id}-tablist`}\n >\n {range(slideCount).map((index) => {\n const isSelected = currentIndex === index\n return (\n <button\n id={`${id}-tab-${index}`}\n key={index}\n ref={(el) => (tabRefs.current[index] = el)}\n\n onClick={() => onChange(index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n\n className={clsx(\n 'w-8 min-w-8 h-3 min-h-3 first:rounded-l-md last:rounded-r-md',\n {\n 'bg-carousel-dot-disabled hover:bg-carousel-dot-active': currentIndex !== index,\n 'bg-carousel-dot-active hover:brightness-90': currentIndex === index,\n }\n )}\n\n role=\"tab\"\n tabIndex={isSelected ? 0 : -1}\n aria-label={translation('showSlide', { index: (index + 1) })}\n aria-selected={isSelected}\n aria-controls={`slide-${index}`}\n aria-disabled={isSelected}\n />\n )\n })}\n </div>\n )\n}\n\n//\n// CarouselSlide\n//\nexport interface CarouselSlideProps extends HTMLAttributes<HTMLDivElement> {\n isSelected: boolean,\n index: number,\n}\n\nexport const CarouselSlide = forwardRef<HTMLDivElement, CarouselSlideProps>(\n function CarouselSlide({\n index,\n isSelected,\n ...props\n }, ref) {\n const translation = useTranslation()\n const { id, slideCount } = useCarouselContext()\n\n return (\n <div\n {...props}\n ref={ref}\n id={`${id}-slide-${index}`}\n\n className={clsx('focus-style-none group/slide', props.className)}\n\n tabIndex={isSelected ? 0 : undefined}\n role=\"group\"\n aria-roledescription={translation('slide')}\n aria-label={translation('slideOf', {\n index: (index + 1),\n length: (slideCount),\n })}\n aria-hidden={isSelected ? undefined : true}\n />\n )\n }\n)\n\n//\n// Carousel\n//\ntype DragState = {\n dragStartX: number,\n dragOffsetX: number,\n}\n\ntype ItemType = {\n item: ReactNode,\n index: number,\n}\n\nexport type CarouselProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n children: ReactNode[],\n animationTime?: number,\n isLooping?: boolean,\n isAutoPlaying?: boolean,\n autoLoopingTimeOut?: number,\n autoLoopAnimationTime?: number,\n hintNext?: boolean,\n arrows?: boolean,\n dots?: boolean,\n /**\n * Percentage that is allowed to be scrolled further\n */\n overScrollThreshold?: number,\n blurColor?: string,\n heightClassName?: string,\n slideClassName?: string,\n slideContainerProps?: HTMLAttributes<HTMLDivElement>,\n onSlideChanged?: (index: number) => void,\n}\n\nexport const Carousel = ({\n children,\n animationTime = 200,\n isLooping = false,\n isAutoPlaying = false,\n autoLoopingTimeOut = 5000,\n autoLoopAnimationTime = 1000,\n hintNext = false,\n arrows = false,\n dots = true,\n blurColor = 'from-background',\n heightClassName = 'h-96',\n slideClassName = 'w-[70%] desktop:w-1/2',\n slideContainerProps,\n onSlideChanged,\n ...props\n }: CarouselProps) => {\n const translation = useTranslation()\n const slideRefs = useRef<HTMLDivElement[]>([])\n const [currentIndex, setCurrentIndex] = useState<number>(0)\n const [hasFocus, setHasFocus] = useState(false)\n const [dragState, setDragState] = useState<DragState>()\n const isPaused = hasFocus\n const carouselContainerRef = useRef<HTMLDivElement>(null)\n const [disableClick, setDisableClick] = useState(false)\n\n const timeOut = useRef<NodeJS.Timeout | undefined>(undefined)\n\n const length = useMemo(() => children.length, [children])\n const paddingItemCount = 3 // The number of items to append left and right of the list to allow for clean transition when looping\n\n const generatedId = 'carousel' + useId()\n const id = props.id ?? generatedId\n\n // Validation\n if (isAutoPlaying && !isLooping) {\n console.error('When isAutoLooping is true, isLooping should also be true')\n isLooping = true\n }\n autoLoopingTimeOut = Math.max(0, autoLoopingTimeOut) // time between transitions\n animationTime = Math.max(100, animationTime) // in ms, must be > 0\n autoLoopAnimationTime = Math.max(200, autoLoopAnimationTime)\n\n useEffect(() => {\n const carousel = carouselContainerRef.current\n\n if (carousel) {\n function onFocus() {\n setHasFocus(true)\n }\n\n function onBlur() {\n setHasFocus(false)\n }\n\n\n carousel?.addEventListener('focusin', onFocus)\n carousel?.addEventListener('focusout', onBlur)\n return () => {\n carousel?.removeEventListener('focusin', onFocus)\n carousel?.removeEventListener('focusin', onFocus)\n }\n }\n }, [])\n\n const getStyleOffset = (index: number) => {\n const baseOffset = -50 + (index - currentIndex) * 100\n return `${baseOffset}%`\n }\n\n const canGoLeft = () => {\n return isLooping || currentIndex !== 0\n }\n\n const canGoRight = useCallback(() => {\n return isLooping || currentIndex !== length - 1\n }, [currentIndex, isLooping, length])\n\n const left = () => {\n if (canGoLeft()) {\n setCurrentIndex(currentIndex - 1)\n }\n }\n\n const right = useCallback(() => {\n if (canGoRight()) {\n setCurrentIndex((currentIndex + length + 1) % length)\n }\n }, [canGoRight, currentIndex, length])\n\n useEffect(() => {\n if (!timeOut.current && !isPaused) {\n if (autoLoopingTimeOut > 0) {\n timeOut.current = setTimeout(() => {\n right()\n timeOut.current = undefined\n }, autoLoopingTimeOut)\n } else {\n right()\n }\n }\n if ((isPaused || !!dragState) && timeOut.current) {\n clearTimeout(timeOut.current)\n timeOut.current = undefined\n }\n }, [right, isPaused, autoLoopingTimeOut, dragState])\n\n\n let items: ItemType[] = children.map((item, index) => ({\n index,\n item\n }))\n let before: ItemType[] = []\n let after: ItemType[] = []\n if (isLooping) {\n before = createLoopingListWithIndex(children, length - 1, paddingItemCount, false).reverse().map(([index, item]) => ({\n index,\n item\n }))\n after = createLoopingListWithIndex(children, 0, paddingItemCount).map(([index, item]) => ({\n index,\n item\n }))\n\n items = [...before, ...items, ...after]\n }\n\n const handlePointerDown = (e: React.PointerEvent) => {\n setDragState({\n dragOffsetX: 0,\n dragStartX: e.clientX,\n })\n }\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (!dragState) return\n setDragState(prevState => ({ dragStartX: prevState.dragStartX, dragOffsetX: e.clientX - prevState.dragStartX }))\n }\n\n const handlePointerUp = () => {\n if (!dragState) return\n if (dragState.dragOffsetX > 50) {\n left()\n } else if (dragState.dragOffsetX < -50) {\n right()\n }\n setDragState(undefined)\n }\n\n useEffect(() => {\n setDisableClick(!dragState)\n }, [dragState])\n\n useEffect(() => {\n onSlideChanged?.(currentIndex)\n }, [currentIndex]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <CarouselContext.Provider value={{ id, currentIndex, slideCount: length, isLooping }}>\n <div\n ref={carouselContainerRef}\n {...props}\n className={clsx('flex-col-2 items-center w-full', props.className)}\n\n id={id}\n role=\"region\"\n aria-roledescription={translation('slide')}\n >\n <div\n {...slideContainerProps}\n className={clsx(`relative w-full overflow-hidden`, heightClassName, slideContainerProps?.className)}\n >\n {hintNext ? (\n <div\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n className={clsx(`flex-row-2 relative h-full`, heightClassName)}\n >\n <div className=\"flex-row-2 relative h-full w-full px-2 overflow-hidden\">\n {items.map(({\n item,\n index\n }, listIndex) => {\n const isInItems = before.length <= listIndex && listIndex < items.length - after.length\n\n return (\n <CarouselSlide\n ref={isInItems ? slideRefs[index] : undefined}\n key={listIndex}\n index={index}\n isSelected={isInItems && currentIndex === index}\n className={clsx(\n `absolute left-[50%] h-full overflow-hidden transition-transform ease-in-out`,\n slideClassName\n )}\n onClick={() => !disableClick && setCurrentIndex(index)}\n style={{\n translate: `calc(${getStyleOffset(listIndex - (isLooping ? paddingItemCount : 0))} + ${dragState ? dragState.dragOffsetX : 0}px)`,\n transitionDuration: dragState ? '0ms' : ((isAutoPlaying && !isPaused ? autoLoopAnimationTime : animationTime) + 'ms'),\n }}\n >\n {item}\n </CarouselSlide>\n )\n })}\n </div>\n <div\n className={clsx(`hidden desktop:block pointer-events-none absolute left-0 h-full w-[20%] bg-gradient-to-r to-transparent`, blurColor)}\n />\n <div\n className={clsx(`hidden desktop:block pointer-events-none absolute right-0 h-full w-[20%] bg-gradient-to-l to-transparent`, blurColor)}\n />\n </div>\n ) : (\n <div\n ref={slideRefs[currentIndex]}\n className={clsx('px-16 h-full')}\n\n tabIndex={0}\n role=\"group\"\n aria-roledescription={translation('slide')}\n aria-label={translation('slideOf', {\n index: (currentIndex + 1),\n length: items.length\n })}\n >\n {children[currentIndex]}\n </div>\n )}\n {arrows && (\n <>\n <IconButton\n color=\"neutral\"\n className={clsx('absolute z-10 left-2 top-1/2 -translate-y-1/2 shadow-md', { hidden: !canGoLeft() })}\n disabled={!canGoLeft()}\n onClick={() => left()}\n >\n <ChevronLeft size={24}/>\n </IconButton>\n <IconButton\n color=\"neutral\"\n className={clsx('absolute z-10 right-2 top-1/2 -translate-y-1/2 shadow-md', { hidden: !canGoRight() })}\n disabled={!canGoRight()}\n onClick={() => right()}\n >\n <ChevronRight size={24}/>\n </IconButton>\n </>\n )}\n </div>\n {dots && (<CarouselTabs onChange={setCurrentIndex}/>)}\n </div>\n </CarouselContext.Provider>\n )\n}\n","export const equalSizeGroups = <T>(array: T[], groupSize: number): T[][] => {\n if (groupSize <= 0) {\n console.warn(`group size should be greater than 0: groupSize = ${groupSize}`)\n return [[...array]]\n }\n\n const groups = []\n for (let i = 0; i < array.length; i += groupSize) {\n groups.push(array.slice(i, Math.min(i + groupSize, array.length)))\n }\n return groups\n}\n\nexport type RangeOptions = {\n /** Whether the range can be defined empty via end < start without a warning */\n allowEmptyRange: boolean,\n stepSize: number,\n exclusiveStart: boolean,\n exclusiveEnd: boolean,\n}\n\nconst defaultRangeOptions: RangeOptions = {\n allowEmptyRange: false,\n stepSize: 1,\n exclusiveStart: false,\n exclusiveEnd: true,\n}\n\n/**\n * @param endOrRange The end value or a range [start, end], end is exclusive\n * @param options the options for defining the range\n */\nexport const range = (endOrRange: number | [number, number], options?: Partial<RangeOptions>): number[] => {\n const { allowEmptyRange, stepSize, exclusiveStart, exclusiveEnd } = { ...defaultRangeOptions, ...options }\n let start = 0\n let end: number\n if (typeof endOrRange === 'number') {\n end = endOrRange\n } else {\n start = endOrRange[0]\n end = endOrRange[1]\n }\n if (!exclusiveEnd) {\n end -= 1\n }\n if (exclusiveStart) {\n start += 1\n }\n\n if (end - 1 < start) {\n if (!allowEmptyRange) {\n console.warn(`range: end (${end}) < start (${start}) should be allowed explicitly, set options.allowEmptyRange to true`)\n }\n return []\n }\n return Array.from({ length: end - start }, (_, index) => index * stepSize + start)\n}\n\n/** Finds the closest match\n * @param list The list of all possible matches\n * @param firstCloser Return whether item1 is closer than item2\n */\nexport const closestMatch = <T>(list: T[], firstCloser: (item1: T, item2: T) => boolean) => {\n return list.reduce((item1, item2) => {\n return firstCloser(item1, item2) ? item1 : item2\n })\n}\n\n/**\n * returns the item in middle of a list and its neighbours before and after\n * e.g. [1,2,3,4,5,6] for item = 1 would return [5,6,1,2,3]\n */\nexport const getNeighbours = <T>(list: T[], item: T, neighbourDistance: number = 2) => {\n const index = list.indexOf(item)\n const totalItems = neighbourDistance * 2 + 1\n if (list.length < totalItems) {\n console.warn('List is to short')\n return list\n }\n\n if (index === -1) {\n console.error('item not found in list')\n return list.splice(0, totalItems)\n }\n\n let start = index - neighbourDistance\n if (start < 0) {\n start += list.length\n }\n const end = (index + neighbourDistance + 1) % list.length\n\n const result: T[] = []\n let ignoreOnce = list.length === totalItems\n for (let i = start; i !== end || ignoreOnce; i = (i + 1) % list.length) {\n result.push(list[i]!)\n if (end === i && ignoreOnce) {\n ignoreOnce = false\n }\n }\n return result\n}\n\nexport const createLoopingListWithIndex = <T>(list: T[], startIndex: number = 0, length: number = 0, forwards: boolean = true) => {\n if (length < 0) {\n console.warn(`createLoopingList: length must be >= 0, given ${length}`)\n } else if (length === 0) {\n length = list.length\n }\n\n const returnList: [number, T][] = []\n\n if (forwards) {\n for (let i = startIndex; returnList.length < length; i = (i + 1) % list.length) {\n returnList.push([i, list[i]!])\n }\n } else {\n for (let i = startIndex; returnList.length < length; i = i === 0 ? i = list.length - 1 : i - 1) {\n returnList.push([i, list[i]!])\n }\n }\n\n return returnList\n}\n\nexport const createLoopingList = <T>(list: T[], startIndex: number = 0, length: number = 0, forwards: boolean = true) => {\n return createLoopingListWithIndex(list, startIndex, length, forwards).map(([_, item]) => item)\n}\n\n/**\n * @param list The list to be changed\n * @param move The shifting applied to the array (can be negative)\n */\nconst moveItems = <T>(list: T[], move: number = 0) => {\n const result = []\n let start = move\n if (start < 0) {\n start = list.length - move\n }\n start = start % list.length\n for (let i = 0; i < list.length; i++) {\n result[i] = list[(i + start) % list.length]\n }\n return result\n}\n\nfunction resolveSingleOrArray<T>(value: T | T[]): T[] {\n if (Array.isArray(value)) {\n return value\n } else if (value) {\n return [value]\n }\n return []\n}\n\nexport const ArrayUtil = {\n unique: <T>(list: T[]): T[] => {\n const seen = new Set<T>()\n return list.filter((item) => {\n if (seen.has(item)) {\n return false\n }\n seen.add(item)\n return true\n })\n },\n difference: <T>(list: T[], removeList: T[]): T[] => {\n const remove = new Set<T>(removeList)\n return list.filter((item) => !remove.has(item))\n },\n moveItems,\n resolveSingleOrArray\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { forwardRef } 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\nexport const IconButtonUtil = {\n icon: [...ButtonColorUtil.solid, 'transparent'] 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 * The allowed colors for the IconButton\n */\nexport type IconButtonColor = typeof IconButtonUtil.icon[number]\n\n\n/**\n * The different sizes for a button\n */\ntype ButtonSizes = 'small' | 'medium' | 'large' | 'none'\n\ntype IconButtonSize = 'tiny' | 'small' | 'medium' | 'large' | 'none'\n\n/**\n * The shard properties between all button types\n */\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * @default 'medium'\n */\n size?: ButtonSizes,\n}\n\nconst paddingMapping: Record<ButtonSizes, string> = {\n none: '',\n small: 'btn-sm',\n medium: 'btn-md',\n large: 'btn-lg'\n}\n\nconst iconPaddingMapping: Record<IconButtonSize, string> = {\n none: '',\n tiny: 'icon-btn-xs',\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 coloredHoverBackground?: boolean,\n}\n\n/**\n * The shard properties between all button types\n */\nexport type IconButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * @default 'medium'\n */\n size?: IconButtonSize,\n color?: IconButtonColor,\n}\n\n/**\n * A button with a solid background and different sizes\n */\nexport const SolidButton = forwardRef<HTMLButtonElement, SolidButtonProps>(function SolidButton({\n children,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }, ref) {\n const colorClasses = {\n primary: 'not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text',\n secondary: 'not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text',\n tertiary: 'not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text',\n positive: 'not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text',\n warning: 'not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text',\n negative: 'not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text',\n neutral: 'not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-solid-primary-icon',\n secondary: 'not-group-disabled:text-button-solid-secondary-icon',\n tertiary: 'not-group-disabled:text-button-solid-tertiary-icon',\n positive: 'not-group-disabled:text-button-solid-positive-icon',\n warning: 'not-group-disabled:text-button-solid-warning-icon',\n negative: 'not-group-disabled:text-button-solid-negative-icon',\n neutral: 'not-group-disabled:text-button-solid-neutral-icon',\n }[color]\n\n return (\n <button\n ref={ref}\n onClick={onClick}\n className={clsx(\n 'group font-semibold',\n colorClasses,\n 'not-disabled:hover:brightness-90',\n 'disabled:text-disabled disabled:bg-disabled-background',\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n})\n\n/**\n * A button with an outline border and different sizes\n */\nexport const OutlineButton = ({\n children,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: OutlineButtonProps) => {\n const colorClasses = {\n primary: 'not-disabled:border-button-outline-primary-text not-disabled:text-button-outline-primary-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-outline-primary-icon',\n }[color]\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'group font-semibold bg-transparent border-2 ',\n 'not-disabled:hover:brightness-80',\n colorClasses,\n 'disabled:text-disabled disabled:border-disabled-outline',\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\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 */\nexport const TextButton = ({\n children,\n color = 'neutral',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n coloredHoverBackground = true,\n className,\n ...restProps\n }: TextButtonProps) => {\n const colorClasses = {\n primary: 'not-disabled:bg-transparent not-disabled:text-button-text-primary-text not-disabled:focus-visible:outline-button-text-primary-text',\n negative: 'not-disabled:bg-transparent not-disabled:text-button-text-negative-text not-disabled:focus-visible:outline-button-text-negative-text',\n neutral: 'not-disabled:bg-transparent not-disabled:text-button-text-neutral-text not-disabled:focus-visible:outline-button-text-neutral-text',\n }[color]\n\n const backgroundColor = {\n primary: 'not-disabled:hover:bg-button-text-primary-text/20 not-disabled:focus-visible:bg-button-text-primary-text/20',\n negative: 'not-disabled:hover:bg-button-text-negative-text/20 not-disabled:focus-visible:bg-button-text-negative-text/20',\n neutral: 'not-disabled:hover:bg-button-text-neutral-text/20 not-disabled:focus-visible:bg-button-text-neutral-text/20',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-text-primary-icon',\n negative: 'not-group-disabled:text-button-text-negative-icon',\n neutral: 'not-group-disabled:text-button-text-neutral-icon',\n }[color]\n\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'group font-semibold',\n 'disabled:text-disabled',\n colorClasses,\n {\n [backgroundColor]: coloredHoverBackground,\n 'not-disabled:hover:bg-button-text-hover-background': !coloredHoverBackground,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\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 */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton({\n children,\n color = 'primary',\n size = 'medium',\n className,\n ...restProps\n }, ref)\n{\n const colorClasses = {\n primary: 'not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text',\n secondary: 'not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text',\n tertiary: 'not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text',\n positive: 'not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text',\n warning: 'not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text',\n negative: 'not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text',\n neutral: 'not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text',\n transparent: 'not-disabled:bg-transparent',\n }[color]\n\n return (\n <button\n ref={ref}\n className={clsx(\n colorClasses,\n 'not-disabled:hover:brightness-90',\n 'disabled:text-disabled',\n {\n 'disabled:bg-disabled-background': color !== 'transparent',\n 'disabled:opacity-70': color === 'transparent',\n 'not-disabled:hover:bg-button-text-hover-background': color === 'transparent',\n },\n ButtonUtil.iconPaddingMapping[size],\n className\n )}\n {...restProps}\n >\n {children}\n </button>\n )\n})","// AUTO-GENERATED. DO NOT EDIT.\nimport type { Translation } from '@helpwave/internationalization'\nimport { TranslationGen } from '@helpwave/internationalization'\n\n/* eslint-disable @stylistic/quote-props */\nexport const supportedLocales = ['de-DE', 'en-US'] as const\n\nexport type SupportedLocale = typeof supportedLocales[number]\n\nexport type GeneratedTranslationEntries = {\n 'add': string,\n 'age': string,\n 'all': string,\n 'apply': string,\n 'back': string,\n 'cancel': string,\n 'carousel': string,\n 'change': string,\n 'chooseLanguage': string,\n 'chooseSlide': string,\n 'chooseTheme': string,\n 'clear': string,\n 'click': string,\n 'clickToCopy': string,\n 'clickToSelect': string,\n 'close': string,\n 'confirm': string,\n 'copied': string,\n 'copy': string,\n 'create': string,\n 'decline': string,\n 'delete': string,\n 'discard': string,\n 'discardChanges': string,\n 'done': string,\n 'edit': string,\n 'endDate': string,\n 'enterText': string,\n 'entryDate': string,\n 'error': string,\n 'errorOccurred': string,\n 'exit': string,\n 'fieldRequiredError': string,\n 'filter': string,\n 'gender': (values: { gender: string }) => string,\n 'goodToSeeYou': string,\n 'identifier': string,\n 'invalidEmail': string,\n 'invalidEmailError': string,\n 'language': string,\n 'less': string,\n 'loading': string,\n 'locale': string,\n 'max': string,\n 'maxLengthError': string,\n 'min': string,\n 'minLengthError': string,\n 'more': string,\n 'name': string,\n 'next': string,\n 'no': string,\n 'none': string,\n 'notEmpty': string,\n 'nothingFound': string,\n 'of': string,\n 'optional': string,\n 'outOfRangeNumber': (values: { min: number, max: number }) => string,\n 'outOfRangeSelectionItems': (values: { min: number, max: number }) => string,\n 'outOfRangeString': (values: { min: number, max: number }) => string,\n 'pleaseWait': string,\n 'previous': string,\n 'remove': string,\n 'required': string,\n 'reset': string,\n 'save': string,\n 'saved': string,\n 'search': string,\n 'select': string,\n 'selectOption': string,\n 'show': string,\n 'showLess': string,\n 'showMore': string,\n 'showSlide': (values: { index: number }) => string,\n 'slide': string,\n 'slideNavigation': string,\n 'slideOf': (values: { index: number, length: number }) => string,\n 'startDate': string,\n 'street': string,\n 'submit': string,\n 'success': string,\n 'text': string,\n 'themeMode': (values: { theme: string }) => string,\n 'themes': (values: { count: number }) => string,\n 'time.ago': string,\n 'time.agoDays': (values: { days: number }) => string,\n 'time.april': string,\n 'time.august': string,\n 'time.century': (values: { count: number }) => string,\n 'time.day': (values: { count: number }) => string,\n 'time.decade': (values: { count: number }) => string,\n 'time.december': string,\n 'time.february': string,\n 'time.hour': (values: { count: number }) => string,\n 'time.in': string,\n 'time.inDays': (values: { days: number }) => string,\n 'time.january': string,\n 'time.july': string,\n 'time.june': string,\n 'time.march': string,\n 'time.may': string,\n 'time.microsecond': (values: { count: number }) => string,\n 'time.millisecond': (values: { count: number }) => string,\n 'time.minute': (values: { count: number }) => string,\n 'time.month': (values: { count: number }) => string,\n 'time.monthName': (values: { month: string }) => string,\n 'time.nanosecond': (values: { count: number }) => string,\n 'time.november': string,\n 'time.october': string,\n 'time.second': (values: { count: number }) => string,\n 'time.september': string,\n 'time.today': string,\n 'time.tomorrow': string,\n 'time.year': (values: { count: number }) => string,\n 'time.yesterday': string,\n 'tooFewSelectionItems': (values: { min: number }) => string,\n 'tooLong': (values: { max: number }) => string,\n 'tooManySelectionItems': (values: { max: number }) => string,\n 'tooShort': (values: { min: number }) => string,\n 'unsavedChanges': string,\n 'unsavedChangesSaveQuestion': string,\n 'update': string,\n 'value': string,\n 'welcome': string,\n 'yes': string,\n}\n\nexport const generatedTranslations: Translation<SupportedLocale, Partial<GeneratedTranslationEntries>> = {\n 'de-DE': {\n 'add': `Hinzufügen`,\n 'age': `Alter`,\n 'all': `Alle`,\n 'apply': `Anwenden`,\n 'back': `Zurück`,\n 'cancel': `Abbrechen`,\n 'carousel': `Karussell`,\n 'change': `Ändern`,\n 'chooseLanguage': `Wähle deine bevorzugte Sprache`,\n 'chooseSlide': `Wähle die angezeigte Slide aus`,\n 'chooseTheme': `Wähle dein bevorzugtes Farbschema.`,\n 'clear': `Löschen`,\n 'click': `Klicken`,\n 'clickToCopy': `Zum kopieren klicken`,\n 'clickToSelect': `Zum Auswählen drücken`,\n 'close': `Schließen`,\n 'confirm': `Bestätigen`,\n 'copied': `Kopiert`,\n 'copy': `Kopieren`,\n 'create': `Erstellen`,\n 'decline': `Ablehnen`,\n 'delete': `Löschen`,\n 'discard': `Verwerfen`,\n 'discardChanges': `Änderungen Verwerfen`,\n 'done': `Fertig`,\n 'edit': `Bearbeiten`,\n 'endDate': `Ende`,\n 'enterText': `Text hier eingeben`,\n 'entryDate': `Eintragsdatum`,\n 'error': `Fehler`,\n 'errorOccurred': `Ein Fehler ist aufgetreten`,\n 'exit': `Beenden`,\n 'fieldRequiredError': `Dieses Feld ist erforderlich.`,\n 'filter': `Filter`,\n 'gender': ({ gender }): string => {\n return TranslationGen.resolveSelect(gender, {\n 'male': `Männlich`,\n 'female': `Weiblich`,\n 'other': `Divers`,\n })\n },\n 'goodToSeeYou': `Schön dich zu sehen`,\n 'identifier': `Identifikator`,\n 'invalidEmail': `Die E-Mail ist ungültig.`,\n 'invalidEmailError': `Bitte geben Sie eine gültige E-Mail-Adresse ein.`,\n 'language': `Sprache`,\n 'less': `Weniger`,\n 'loading': `Lädt`,\n 'locale': `Locale`,\n 'max': `Max`,\n 'maxLengthError': `Maximale Länge überschritten.`,\n 'min': `Min`,\n 'minLengthError': `Mindestlänge nicht erreicht.`,\n 'more': `Mehr`,\n 'name': `Name`,\n 'next': `Weiter`,\n 'no': `Nein`,\n 'none': `Nichts`,\n 'notEmpty': `Das Feld darf nicht leer sein.`,\n 'nothingFound': `Nichts gefunden`,\n 'of': `von`,\n 'optional': `Optional`,\n 'outOfRangeNumber': ({ min, max }): string => {\n return `Der Wert muss zwischen ${min} und ${max} liegen.`\n },\n 'outOfRangeSelectionItems': ({ min, max }): string => {\n return `Es müssen zwischen ${min} und ${max} Elemente ausgewählt werden.`\n },\n 'outOfRangeString': ({ min, max }): string => {\n return `Der Wert muss zwischen ${min} und ${max} Zeichen lang sein.`\n },\n 'pleaseWait': `Bitte warten...`,\n 'previous': `Vorherige`,\n 'remove': `Entfernen`,\n 'required': `Erforderlich`,\n 'reset': `Zurücksetzen`,\n 'save': `Speichern`,\n 'saved': `Gespeichert`,\n 'search': `Suche`,\n 'select': `Select`,\n 'selectOption': `Option auswählen`,\n 'show': `Anzeigen`,\n 'showLess': `Weniger anzeigen`,\n 'showMore': `Mehr anzeigen`,\n 'showSlide': ({ index }): string => {\n return `Zeige Slide ${index}`\n },\n 'slide': `Slide`,\n 'slideNavigation': `Slide Navigation`,\n 'slideOf': ({ index, length }): string => {\n return `Slide ${index} von ${length} slides`\n },\n 'startDate': `Start`,\n 'street': `Straße`,\n 'submit': `Abschicken`,\n 'success': `Erfolg`,\n 'text': `Text`,\n 'themeMode': ({ theme }): string => {\n return TranslationGen.resolveSelect(theme, {\n 'dark': `Dunkel`,\n 'light': `Hell`,\n 'system': `System`,\n })\n },\n 'themes': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Farbschema`,\n 'other': `Farbschemas`,\n })\n },\n 'time.ago': `vor`,\n 'time.agoDays': ({ days }): string => {\n return `var ${days} Tagen`\n },\n 'time.april': `April`,\n 'time.august': `August`,\n 'time.century': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Jahrhundert`,\n 'other': `Jahrhunderte`,\n })\n },\n 'time.day': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Tag`,\n 'other': `Tage`,\n })\n },\n 'time.decade': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Jahrzehnt`,\n 'other': `Jahrzehnte`,\n })\n },\n 'time.december': `December`,\n 'time.february': `Febuar`,\n 'time.hour': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Stunde`,\n 'other': `Stunden`,\n })\n },\n 'time.in': `in`,\n 'time.inDays': ({ days }): string => {\n return `in ${days} Tagen`\n },\n 'time.january': `Januar`,\n 'time.july': `Juli`,\n 'time.june': `Juni`,\n 'time.march': `März`,\n 'time.may': `Mai`,\n 'time.microsecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Mikrosekunde`,\n 'other': `Mikrosekunden`,\n })\n },\n 'time.millisecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Millisekunde`,\n 'other': `Millisekunden`,\n })\n },\n 'time.minute': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Minute`,\n 'other': `Minuten`,\n })\n },\n 'time.month': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Monat`,\n 'other': `Monate`,\n })\n },\n 'time.monthName': ({ month }): string => {\n return TranslationGen.resolveSelect(month, {\n 'january': `Januar`,\n 'february': `Februar`,\n 'march': `März`,\n 'april': `April`,\n 'may': `Mai`,\n 'june': `Juni`,\n 'july': `Juli`,\n 'august': `August`,\n 'september': `September`,\n 'october': `Oktober`,\n 'november': `November`,\n 'december': `Dezember`,\n 'other': `Unbekannter Monat`,\n })\n },\n 'time.nanosecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Nanosekunde`,\n 'other': `Nanosekunden`,\n })\n },\n 'time.november': `November`,\n 'time.october': `October`,\n 'time.second': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Sekunde`,\n 'other': `Sekunden`,\n })\n },\n 'time.september': `September`,\n 'time.today': `Heute`,\n 'time.tomorrow': `Morgen`,\n 'time.year': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Jahr`,\n 'other': `Jahre`,\n })\n },\n 'time.yesterday': `Gestern`,\n 'tooFewSelectionItems': ({ min }): string => {\n return `Es müssen mindestens ${min} Elemente ausgewählt werden.`\n },\n 'tooLong': ({ max }): string => {\n return `Der Wert darf höchstens ${max} Zeichen enthalten.`\n },\n 'tooManySelectionItems': ({ max }): string => {\n return `Es müssen maximal ${max} Elemente ausgewählt werden.`\n },\n 'tooShort': ({ min }): string => {\n return `Der Wert muss mindestens ${min} Zeichen enthalten.`\n },\n 'unsavedChanges': `Ungespeicherte Änderungen`,\n 'unsavedChangesSaveQuestion': `Möchtest du die Änderungen speichern?`,\n 'update': `Update`,\n 'value': `Wert`,\n 'welcome': `Willkommen`,\n 'yes': `Ja`\n },\n 'en-US': {\n 'add': `Add`,\n 'age': `Age`,\n 'all': `All`,\n 'apply': `Apply`,\n 'back': `Back`,\n 'cancel': `Cancel`,\n 'carousel': `Carousel`,\n 'change': `Change`,\n 'chooseLanguage': `Choose your language`,\n 'chooseSlide': `Choose slide to display`,\n 'chooseTheme': `Choose your preferred color theme.`,\n 'clear': `Clear`,\n 'click': `Click`,\n 'clickToCopy': `Click to Copy`,\n 'clickToSelect': `Click to select`,\n 'close': `Close`,\n 'confirm': `Confirm`,\n 'copied': `Copied`,\n 'copy': `Copy`,\n 'create': `Create`,\n 'decline': `Decline`,\n 'delete': `Delete`,\n 'discard': `Discard`,\n 'discardChanges': `Discard Changes`,\n 'done': `Done`,\n 'edit': `Edit`,\n 'endDate': `End`,\n 'enterText': `Enter text here`,\n 'entryDate': `Entry Date`,\n 'error': `Error`,\n 'errorOccurred': `An error occurred`,\n 'exit': `Exit`,\n 'fieldRequiredError': `This field is required.`,\n 'filter': `Filter`,\n 'gender': ({ gender }): string => {\n return TranslationGen.resolveSelect(gender, {\n 'male': `Male`,\n 'female': `Female`,\n 'other': `Other`,\n })\n },\n 'goodToSeeYou': `Good to see you`,\n 'identifier': `Identifier`,\n 'invalidEmail': `The email is not valid.`,\n 'invalidEmailError': `Please enter a valid email address.`,\n 'language': `Language`,\n 'less': `Less`,\n 'loading': `Loading`,\n 'locale': `Locale`,\n 'max': `Max`,\n 'maxLengthError': `Maximum length exceeded.`,\n 'min': `Min`,\n 'minLengthError': `Minimum length not met.`,\n 'more': `More`,\n 'name': `Name`,\n 'next': `Next`,\n 'no': `No`,\n 'none': `None`,\n 'notEmpty': `The field cannot be empty.`,\n 'nothingFound': `Nothing found`,\n 'of': `of`,\n 'optional': `Optional`,\n 'outOfRangeNumber': ({ min, max }): string => {\n return `The value must be between ${min} and ${max}.`\n },\n 'outOfRangeSelectionItems': ({ min, max }): string => {\n return `Between ${min} and ${max} items must be selected.`\n },\n 'outOfRangeString': ({ min, max }): string => {\n return `The value needs to have between ${min} and ${max} characters.`\n },\n 'pleaseWait': `Please wait...`,\n 'previous': `Previous`,\n 'remove': `Remove`,\n 'required': `Required`,\n 'reset': `Reset`,\n 'save': `Save`,\n 'saved': `Saved`,\n 'search': `Search`,\n 'select': `Select`,\n 'selectOption': `Select an option`,\n 'show': `Show`,\n 'showLess': `Show less`,\n 'showMore': `Show more`,\n 'showSlide': ({ index }): string => {\n return `Show Slide ${index}`\n },\n 'slide': `Slide`,\n 'slideNavigation': `Slide navigation`,\n 'slideOf': ({ index, length }): string => {\n return `Slide ${index} of ${length} slides`\n },\n 'startDate': `Start`,\n 'street': `Street`,\n 'submit': `Submit`,\n 'success': `Success`,\n 'text': `Text`,\n 'themeMode': ({ theme }): string => {\n return TranslationGen.resolveSelect(theme, {\n 'dark': `Dark`,\n 'light': `Light`,\n 'system': `System`,\n })\n },\n 'themes': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Theme`,\n 'other': `Themes`,\n })\n },\n 'time.ago': `ago`,\n 'time.agoDays': ({ days }): string => {\n return `days ${days} ago`\n },\n 'time.april': `April`,\n 'time.august': `August`,\n 'time.century': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Century`,\n 'other': `Centuries`,\n })\n },\n 'time.day': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Day`,\n 'other': `Days`,\n })\n },\n 'time.decade': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Decade`,\n 'other': `Decades`,\n })\n },\n 'time.december': `December`,\n 'time.february': `Febuary`,\n 'time.hour': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Hour`,\n 'other': `Hours`,\n })\n },\n 'time.in': `in`,\n 'time.inDays': ({ days }): string => {\n return `in ${days} days`\n },\n 'time.january': `January`,\n 'time.july': `July`,\n 'time.june': `June`,\n 'time.march': `March`,\n 'time.may': `May`,\n 'time.microsecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Microsecond`,\n 'other': `Microseconds`,\n })\n },\n 'time.millisecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Millisecond`,\n 'other': `Milliseconds`,\n })\n },\n 'time.minute': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Minute`,\n 'other': `Minutes`,\n })\n },\n 'time.month': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Month`,\n 'other': `Months`,\n })\n },\n 'time.monthName': ({ month }): string => {\n return TranslationGen.resolveSelect(month, {\n 'january': `January`,\n 'february': `February`,\n 'march': `March`,\n 'april': `April`,\n 'may': `May`,\n 'june': `June`,\n 'july': `July`,\n 'august': `August`,\n 'september': `September`,\n 'october': `October`,\n 'november': `November`,\n 'december': `December`,\n 'other': `Unknown Month`,\n })\n },\n 'time.nanosecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Nanosecond`,\n 'other': `Nanoseconds`,\n })\n },\n 'time.november': `November`,\n 'time.october': `October`,\n 'time.second': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Second`,\n 'other': `Seconds`,\n })\n },\n 'time.september': `September`,\n 'time.today': `Today`,\n 'time.tomorrow': `Tomorrow`,\n 'time.year': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Year`,\n 'other': `Years`,\n })\n },\n 'time.yesterday': `Yesterday`,\n 'tooFewSelectionItems': ({ min }): string => {\n return `Select at least ${min} items.`\n },\n 'tooLong': ({ max }): string => {\n return `The value requires less than ${max} characters.`\n },\n 'tooManySelectionItems': ({ max }): string => {\n return `Select at most ${max} items.`\n },\n 'tooShort': ({ min }): string => {\n return `The value requires at least ${min} characters.`\n },\n 'unsavedChanges': `Unsaved Changes`,\n 'unsavedChangesSaveQuestion': `Do you want to save your changes?`,\n 'update': `Update`,\n 'value': `Value`,\n 'welcome': `Welcome`,\n 'yes': `Yes`\n }\n}\n\n","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\nimport { LocalizationUtil } from './util'\nimport type { SupportedLocale } from '@/src/i18n/translations'\n\nexport type LocaleContextValue = {\n locale: SupportedLocale,\n setLocale: Dispatch<SetStateAction<SupportedLocale>>,\n}\n\nexport const LocaleContext = createContext<LocaleContextValue>({\n locale: LocalizationUtil.DEFAULT_LOCALE,\n setLocale: (v) => v\n})\n\ntype LocaleWithSystem = SupportedLocale | 'system'\n\ntype LocaleProviderProps = {\n locale?: LocaleWithSystem,\n onChangedLocale?: (locale: SupportedLocale) => void,\n}\n\nexport const LocaleProvider = ({ children, locale, onChangedLocale }: PropsWithChildren<LocaleProviderProps>) => {\n const {\n value: storedLocale,\n setValue: setStoredLocale,\n deleteValue: deleteStoredLocale,\n } = useLocalStorage<LocaleWithSystem>('locale', 'system')\n const [localePreference, setLocalePreference] = useState<LocaleWithSystem>('system')\n\n const resolvedLocale = useMemo(() => {\n if (locale && locale !== 'system') {\n return locale\n }\n if (storedLocale && storedLocale !== 'system') {\n return storedLocale\n }\n if (localePreference !== 'system') {\n return localePreference\n }\n return LocalizationUtil.DEFAULT_LOCALE\n }, [locale, localePreference, storedLocale])\n\n useEffect(() => {\n if(!locale) return\n if (locale === 'system') {\n deleteStoredLocale()\n } else {\n setStoredLocale(locale)\n }\n }, [locale]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n onChangedLocale?.(resolvedLocale)\n }, [resolvedLocale]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const localesToTestAgainst = Object.values(LocalizationUtil.locals)\n\n const detectLanguage = () => {\n const matchingBrowserLanguage = window.navigator.languages\n .map(locale =>\n localesToTestAgainst.find(\n (test) => locale === test || locale.split('-')[0] === LocalizationUtil.localToLanguage(test)\n ))\n .filter((entry): entry is SupportedLocale => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0]\n setLocalePreference(firstMatch)\n }\n detectLanguage()\n\n window.addEventListener('languagechange', detectLanguage)\n return () => {\n window.removeEventListener('languagechange', detectLanguage)\n }\n }, [])\n\n return (\n <LocaleContext.Provider value={{\n locale: resolvedLocale,\n setLocale: (newLocale) => {\n if (locale !== 'system') {\n console.warn('LocaleProvider: Attempting to change the ' +\n \"locale while setting a fixed locale won't have any effect. \" +\n 'Change the locale provided to the LocaleProvider instead.')\n }\n setStoredLocale(newLocale)\n }\n }}>\n {children}\n </LocaleContext.Provider>\n )\n}\n\nexport const useLocale = () => {\n const context = useContext(LocaleContext)\n if (!context) {\n throw new Error('useLocale must be used within LocaleContext. Try adding a LocaleProvider around your app.')\n }\n return context\n}\n\nexport const useLanguage = () => {\n const context = useContext(LocaleContext)\n if (!context) {\n throw new Error('useLanguage must be used within LocaleContext. Try adding a LocaleProvider around your app.')\n }\n return { language: LocalizationUtil.localToLanguage(context.locale) }\n}\n","'use client'\n\nimport type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useState } from 'react'\nimport { LocalStorageService } from '@/src/utils/storage'\nimport { resolveSetState } from '@/src/utils/resolveSetState'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\n\ntype UseLocalStorageResult<T> = {\n value: T,\n setValue: SetValue<T>,\n deleteValue: () => void,\n}\n\n/**\n * @param key Key under which to save the data\n * @param backupValue Used if the storage is unavailable or no value is present\n *\n * The backup value will never be saved to the storage unless you explicitly\n */\nexport const useLocalStorage = <T>(key: string, backupValue: T): UseLocalStorageResult<T> => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return backupValue\n }\n const storageService = new LocalStorageService()\n try {\n const value = storageService.get<T>(key)\n return value || backupValue\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (_) {\n console.warn('useLocalStorage: Error while reading the stored value. Make sure your typing is correct.')\n storageService.delete(key)\n console.info(`useLocalStorage: deleted erroneous value for key: ${key}`)\n return backupValue\n }\n }, [backupValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(action => {\n const newValue = resolveSetState(action, storedValue)\n const storageService = new LocalStorageService()\n storageService.set(key, newValue)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n const deleteValue = () => {\n const storageService = new LocalStorageService()\n storageService.delete(key)\n setStoredValue(backupValue)\n }\n\n return { value: storedValue, setValue, deleteValue }\n}","import type { SupportedLocale } from '@/src/i18n/translations'\nimport { supportedLocales } from '@/src/i18n/translations'\n\n/**\n * The supported locales' names in their respective language\n */\nconst localsNames: Record<SupportedLocale, string> = {\n 'en-US': 'English (US)',\n 'de-DE': 'Deutsch',\n}\n\n/**\n * The default locale\n */\nconst DEFAULT_LOCALE: SupportedLocale = 'en-US'\n\nfunction localeToLanguage(locale: SupportedLocale) {\n return locale.split('-')[0]\n}\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LocalizationUtil = {\n locals: supportedLocales,\n localToLanguage: localeToLanguage,\n DEFAULT_LOCALE,\n languagesLocalNames: localsNames,\n}\n","import type { GeneratedTranslationEntries, SupportedLocale } from '@/src/i18n/translations'\nimport { generatedTranslations } from '@/src/i18n/translations'\nimport { useLocale } from '@/src/i18n/LocaleProvider'\nimport type { PartialTranslation, Translation, TranslationEntries } from '@helpwave/internationalization'\nimport { combineTranslation, ICUUtil } from '@helpwave/internationalization'\nimport { ArrayUtil } from '@/src/utils/array'\nimport type { SingleOrArray } from '@/src/utils/typing'\n\n/**\n * Use for translations where you know that all values are ICU strings.\n *\n * This most likely is the case for Translations provided by a backend,\n * for more dynamic and typesafe translation use useTranslation instead\n */\nexport function useICUTranslation<L extends string, T extends Record<string, string>>(\n translations: Translation<L, T>[] | Translation<L, T>,\n locale: L\n) {\n translations = Array.isArray(translations) ? translations : [translations]\n\n return function translate(\n key: string,\n values?: Record<string, object>\n ): string {\n try {\n for (let i = 0; i < translations.length; i++) {\n const localizedTranslation = translations[i][locale]\n if (!localizedTranslation) continue\n\n const msg = localizedTranslation[key]\n if (typeof msg === 'string') {\n return ICUUtil.interpret(msg, values)\n }\n }\n console.warn(`useTranslation: No translation for key \"${key}\" found.`)\n } catch (e) {\n console.error(`useTranslation: Error translating key \"${String(key)}\"`, e)\n }\n\n return `{{${String(locale)}:${String(key)}}}`\n }\n}\n\n// TODO allow translation overwrites\ntype UseTranslationOverwrites = {\n locale?: SupportedLocale,\n}\n\ntype TranslationExtension<\n L1 extends string,\n L2 extends string,\n T1 extends TranslationEntries,\n T2 extends TranslationEntries\n> = PartialTranslation<L1 | L2, T1 & T2>\n\ntype BaseTranslationExtension<L extends string, T extends TranslationEntries>\n = TranslationExtension<L, SupportedLocale, T, GeneratedTranslationEntries>\n/**\n * A wrapper for the useTranslation to load and specify the translations for the library\n */\nexport function useTranslation<L extends string, T extends TranslationEntries>(\n extensions?: SingleOrArray<BaseTranslationExtension<L,T>>,\n overwrites?: UseTranslationOverwrites\n) {\n const { locale: inferredLocale } = useLocale()\n const locale = overwrites?.locale ?? inferredLocale\n const translationExtensions = ArrayUtil.resolveSingleOrArray(extensions)\n\n return combineTranslation<L | SupportedLocale, T & GeneratedTranslationEntries>([\n ...translationExtensions,\n generatedTranslations as BaseTranslationExtension<L,T>\n ], locale)\n}\n"],"mappings":"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","names":["import_react","import_clsx","SolidButton","clsx","IconButton","clsx","import_react","import_react","import_jsx_runtime","import_internationalization","import_jsx_runtime","clsx","CarouselSlide"]}
1
+ {"version":3,"sources":["../../../src/components/layout/Carousel.tsx","../../../src/utils/array.ts","../../../src/components/user-action/Button.tsx","../../../src/i18n/LocaleProvider.tsx","../../../src/hooks/useLocalStorage.ts","../../../src/i18n/translations.ts","../../../src/i18n/util.ts","../../../src/i18n/useHightideTranslation.ts"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react'\nimport React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState\n} from 'react'\nimport clsx from 'clsx'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { createLoopingListWithIndex, range } from '@/src/utils/array'\nimport { IconButton } from '../user-action/Button'\nimport { useHightideTranslation } from '@/src/i18n/useHightideTranslation'\n\n//\n// CarouselContext\n//\ntype CarouselContextType = {\n id: string,\n currentIndex: number,\n slideCount: number,\n isLooping: boolean,\n}\n\nconst CarouselContext = createContext<CarouselContextType | null>(null)\n\nconst useCarouselContext = () => {\n const context = useContext(CarouselContext)\n if (!context) {\n console.error('useCarouselContext must be used within CarouselContext')\n }\n return context\n}\n\n//\n// CarouselTab\n//\ntype CarouselTabsProps = {\n onChange: (index: number) => void,\n}\n\nexport default function CarouselTabs({\n onChange,\n }: CarouselTabsProps) {\n const translation = useHightideTranslation()\n const { id, slideCount, currentIndex, isLooping } = useCarouselContext()\n\n const tabRefs = useRef<(HTMLButtonElement | null)[]>([])\n\n const handleKeyDown = (event: React.KeyboardEvent, index: number) => {\n let newIndex = index\n if (event.key === 'ArrowRight') {\n newIndex = isLooping ? (index + 1) % slideCount : Math.max(index + 1, slideCount - 1)\n } else if (event.key === 'ArrowLeft') {\n newIndex = isLooping ? (index - 1 + slideCount) % slideCount : Math.max(index - 1, 0)\n } else {\n return\n }\n event.preventDefault()\n onChange(newIndex)\n tabRefs.current[newIndex]?.focus()\n }\n\n return (\n <div\n className=\"flex-row-1 items-center justify-center w-full my-2\"\n role=\"tablist\"\n aria-label={translation('slideNavigation')}\n id={`${id}-tablist`}\n >\n {range(slideCount).map((index) => {\n const isSelected = currentIndex === index\n return (\n <button\n id={`${id}-tab-${index}`}\n key={index}\n ref={(el) => (tabRefs.current[index] = el)}\n\n onClick={() => onChange(index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n\n className={clsx(\n 'w-8 min-w-8 h-3 min-h-3 first:rounded-l-md last:rounded-r-md',\n {\n 'bg-carousel-dot-disabled hover:bg-carousel-dot-active': currentIndex !== index,\n 'bg-carousel-dot-active hover:brightness-90': currentIndex === index,\n }\n )}\n\n role=\"tab\"\n tabIndex={isSelected ? 0 : -1}\n aria-label={translation('showSlide', { index: (index + 1) })}\n aria-selected={isSelected}\n aria-controls={`slide-${index}`}\n aria-disabled={isSelected}\n />\n )\n })}\n </div>\n )\n}\n\n//\n// CarouselSlide\n//\nexport interface CarouselSlideProps extends HTMLAttributes<HTMLDivElement> {\n isSelected: boolean,\n index: number,\n}\n\nexport const CarouselSlide = forwardRef<HTMLDivElement, CarouselSlideProps>(\n function CarouselSlide({\n index,\n isSelected,\n ...props\n }, ref) {\n const translation = useHightideTranslation()\n const { id, slideCount } = useCarouselContext()\n\n return (\n <div\n {...props}\n ref={ref}\n id={`${id}-slide-${index}`}\n\n className={clsx('focus-style-none group/slide', props.className)}\n\n tabIndex={isSelected ? 0 : undefined}\n role=\"group\"\n aria-roledescription={translation('slide')}\n aria-label={translation('slideOf', {\n index: (index + 1),\n length: (slideCount),\n })}\n aria-hidden={isSelected ? undefined : true}\n />\n )\n }\n)\n\n//\n// Carousel\n//\ntype DragState = {\n dragStartX: number,\n dragOffsetX: number,\n}\n\ntype ItemType = {\n item: ReactNode,\n index: number,\n}\n\nexport type CarouselProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n children: ReactNode[],\n animationTime?: number,\n isLooping?: boolean,\n isAutoPlaying?: boolean,\n autoLoopingTimeOut?: number,\n autoLoopAnimationTime?: number,\n hintNext?: boolean,\n arrows?: boolean,\n dots?: boolean,\n /**\n * Percentage that is allowed to be scrolled further\n */\n overScrollThreshold?: number,\n blurColor?: string,\n heightClassName?: string,\n slideClassName?: string,\n slideContainerProps?: HTMLAttributes<HTMLDivElement>,\n onSlideChanged?: (index: number) => void,\n}\n\nexport const Carousel = ({\n children,\n animationTime = 200,\n isLooping = false,\n isAutoPlaying = false,\n autoLoopingTimeOut = 5000,\n autoLoopAnimationTime = 1000,\n hintNext = false,\n arrows = false,\n dots = true,\n blurColor = 'from-background',\n heightClassName = 'h-96',\n slideClassName = 'w-[70%] desktop:w-1/2',\n slideContainerProps,\n onSlideChanged,\n ...props\n }: CarouselProps) => {\n const translation = useHightideTranslation()\n const slideRefs = useRef<HTMLDivElement[]>([])\n const [currentIndex, setCurrentIndex] = useState<number>(0)\n const [hasFocus, setHasFocus] = useState(false)\n const [dragState, setDragState] = useState<DragState>()\n const isPaused = hasFocus\n const carouselContainerRef = useRef<HTMLDivElement>(null)\n const [disableClick, setDisableClick] = useState(false)\n\n const timeOut = useRef<NodeJS.Timeout | undefined>(undefined)\n\n const length = useMemo(() => children.length, [children])\n const paddingItemCount = 3 // The number of items to append left and right of the list to allow for clean transition when looping\n\n const generatedId = 'carousel' + useId()\n const id = props.id ?? generatedId\n\n // Validation\n if (isAutoPlaying && !isLooping) {\n console.error('When isAutoLooping is true, isLooping should also be true')\n isLooping = true\n }\n autoLoopingTimeOut = Math.max(0, autoLoopingTimeOut) // time between transitions\n animationTime = Math.max(100, animationTime) // in ms, must be > 0\n autoLoopAnimationTime = Math.max(200, autoLoopAnimationTime)\n\n useEffect(() => {\n const carousel = carouselContainerRef.current\n\n if (carousel) {\n function onFocus() {\n setHasFocus(true)\n }\n\n function onBlur() {\n setHasFocus(false)\n }\n\n\n carousel?.addEventListener('focusin', onFocus)\n carousel?.addEventListener('focusout', onBlur)\n return () => {\n carousel?.removeEventListener('focusin', onFocus)\n carousel?.removeEventListener('focusin', onFocus)\n }\n }\n }, [])\n\n const getStyleOffset = (index: number) => {\n const baseOffset = -50 + (index - currentIndex) * 100\n return `${baseOffset}%`\n }\n\n const canGoLeft = () => {\n return isLooping || currentIndex !== 0\n }\n\n const canGoRight = useCallback(() => {\n return isLooping || currentIndex !== length - 1\n }, [currentIndex, isLooping, length])\n\n const left = () => {\n if (canGoLeft()) {\n setCurrentIndex(currentIndex - 1)\n }\n }\n\n const right = useCallback(() => {\n if (canGoRight()) {\n setCurrentIndex((currentIndex + length + 1) % length)\n }\n }, [canGoRight, currentIndex, length])\n\n useEffect(() => {\n if (!timeOut.current && !isPaused) {\n if (autoLoopingTimeOut > 0) {\n timeOut.current = setTimeout(() => {\n right()\n timeOut.current = undefined\n }, autoLoopingTimeOut)\n } else {\n right()\n }\n }\n if ((isPaused || !!dragState) && timeOut.current) {\n clearTimeout(timeOut.current)\n timeOut.current = undefined\n }\n }, [right, isPaused, autoLoopingTimeOut, dragState])\n\n\n let items: ItemType[] = children.map((item, index) => ({\n index,\n item\n }))\n let before: ItemType[] = []\n let after: ItemType[] = []\n if (isLooping) {\n before = createLoopingListWithIndex(children, length - 1, paddingItemCount, false).reverse().map(([index, item]) => ({\n index,\n item\n }))\n after = createLoopingListWithIndex(children, 0, paddingItemCount).map(([index, item]) => ({\n index,\n item\n }))\n\n items = [...before, ...items, ...after]\n }\n\n const handlePointerDown = (e: React.PointerEvent) => {\n setDragState({\n dragOffsetX: 0,\n dragStartX: e.clientX,\n })\n }\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (!dragState) return\n setDragState(prevState => ({ dragStartX: prevState.dragStartX, dragOffsetX: e.clientX - prevState.dragStartX }))\n }\n\n const handlePointerUp = () => {\n if (!dragState) return\n if (dragState.dragOffsetX > 50) {\n left()\n } else if (dragState.dragOffsetX < -50) {\n right()\n }\n setDragState(undefined)\n }\n\n useEffect(() => {\n setDisableClick(!dragState)\n }, [dragState])\n\n useEffect(() => {\n onSlideChanged?.(currentIndex)\n }, [currentIndex]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <CarouselContext.Provider value={{ id, currentIndex, slideCount: length, isLooping }}>\n <div\n ref={carouselContainerRef}\n {...props}\n className={clsx('flex-col-2 items-center w-full', props.className)}\n\n id={id}\n role=\"region\"\n aria-roledescription={translation('slide')}\n >\n <div\n {...slideContainerProps}\n className={clsx(`relative w-full overflow-hidden`, heightClassName, slideContainerProps?.className)}\n >\n {hintNext ? (\n <div\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n className={clsx(`flex-row-2 relative h-full`, heightClassName)}\n >\n <div className=\"flex-row-2 relative h-full w-full px-2 overflow-hidden\">\n {items.map(({\n item,\n index\n }, listIndex) => {\n const isInItems = before.length <= listIndex && listIndex < items.length - after.length\n\n return (\n <CarouselSlide\n ref={isInItems ? slideRefs[index] : undefined}\n key={listIndex}\n index={index}\n isSelected={isInItems && currentIndex === index}\n className={clsx(\n `absolute left-[50%] h-full overflow-hidden transition-transform ease-in-out`,\n slideClassName\n )}\n onClick={() => !disableClick && setCurrentIndex(index)}\n style={{\n translate: `calc(${getStyleOffset(listIndex - (isLooping ? paddingItemCount : 0))} + ${dragState ? dragState.dragOffsetX : 0}px)`,\n transitionDuration: dragState ? '0ms' : ((isAutoPlaying && !isPaused ? autoLoopAnimationTime : animationTime) + 'ms'),\n }}\n >\n {item}\n </CarouselSlide>\n )\n })}\n </div>\n <div\n className={clsx(`hidden desktop:block pointer-events-none absolute left-0 h-full w-[20%] bg-gradient-to-r to-transparent`, blurColor)}\n />\n <div\n className={clsx(`hidden desktop:block pointer-events-none absolute right-0 h-full w-[20%] bg-gradient-to-l to-transparent`, blurColor)}\n />\n </div>\n ) : (\n <div\n ref={slideRefs[currentIndex]}\n className={clsx('px-16 h-full')}\n\n tabIndex={0}\n role=\"group\"\n aria-roledescription={translation('slide')}\n aria-label={translation('slideOf', {\n index: (currentIndex + 1),\n length: items.length\n })}\n >\n {children[currentIndex]}\n </div>\n )}\n {arrows && (\n <>\n <IconButton\n color=\"neutral\"\n className={clsx('absolute z-10 left-2 top-1/2 -translate-y-1/2 shadow-md', { hidden: !canGoLeft() })}\n disabled={!canGoLeft()}\n onClick={() => left()}\n >\n <ChevronLeft size={24}/>\n </IconButton>\n <IconButton\n color=\"neutral\"\n className={clsx('absolute z-10 right-2 top-1/2 -translate-y-1/2 shadow-md', { hidden: !canGoRight() })}\n disabled={!canGoRight()}\n onClick={() => right()}\n >\n <ChevronRight size={24}/>\n </IconButton>\n </>\n )}\n </div>\n {dots && (<CarouselTabs onChange={setCurrentIndex}/>)}\n </div>\n </CarouselContext.Provider>\n )\n}\n","export const equalSizeGroups = <T>(array: T[], groupSize: number): T[][] => {\n if (groupSize <= 0) {\n console.warn(`group size should be greater than 0: groupSize = ${groupSize}`)\n return [[...array]]\n }\n\n const groups = []\n for (let i = 0; i < array.length; i += groupSize) {\n groups.push(array.slice(i, Math.min(i + groupSize, array.length)))\n }\n return groups\n}\n\nexport type RangeOptions = {\n /** Whether the range can be defined empty via end < start without a warning */\n allowEmptyRange: boolean,\n stepSize: number,\n exclusiveStart: boolean,\n exclusiveEnd: boolean,\n}\n\nconst defaultRangeOptions: RangeOptions = {\n allowEmptyRange: false,\n stepSize: 1,\n exclusiveStart: false,\n exclusiveEnd: true,\n}\n\n/**\n * @param endOrRange The end value or a range [start, end], end is exclusive\n * @param options the options for defining the range\n */\nexport const range = (endOrRange: number | [number, number], options?: Partial<RangeOptions>): number[] => {\n const { allowEmptyRange, stepSize, exclusiveStart, exclusiveEnd } = { ...defaultRangeOptions, ...options }\n let start = 0\n let end: number\n if (typeof endOrRange === 'number') {\n end = endOrRange\n } else {\n start = endOrRange[0]\n end = endOrRange[1]\n }\n if (!exclusiveEnd) {\n end -= 1\n }\n if (exclusiveStart) {\n start += 1\n }\n\n if (end - 1 < start) {\n if (!allowEmptyRange) {\n console.warn(`range: end (${end}) < start (${start}) should be allowed explicitly, set options.allowEmptyRange to true`)\n }\n return []\n }\n return Array.from({ length: end - start }, (_, index) => index * stepSize + start)\n}\n\n/** Finds the closest match\n * @param list The list of all possible matches\n * @param firstCloser Return whether item1 is closer than item2\n */\nexport const closestMatch = <T>(list: T[], firstCloser: (item1: T, item2: T) => boolean) => {\n return list.reduce((item1, item2) => {\n return firstCloser(item1, item2) ? item1 : item2\n })\n}\n\n/**\n * returns the item in middle of a list and its neighbours before and after\n * e.g. [1,2,3,4,5,6] for item = 1 would return [5,6,1,2,3]\n */\nexport const getNeighbours = <T>(list: T[], item: T, neighbourDistance: number = 2) => {\n const index = list.indexOf(item)\n const totalItems = neighbourDistance * 2 + 1\n if (list.length < totalItems) {\n console.warn('List is to short')\n return list\n }\n\n if (index === -1) {\n console.error('item not found in list')\n return list.splice(0, totalItems)\n }\n\n let start = index - neighbourDistance\n if (start < 0) {\n start += list.length\n }\n const end = (index + neighbourDistance + 1) % list.length\n\n const result: T[] = []\n let ignoreOnce = list.length === totalItems\n for (let i = start; i !== end || ignoreOnce; i = (i + 1) % list.length) {\n result.push(list[i]!)\n if (end === i && ignoreOnce) {\n ignoreOnce = false\n }\n }\n return result\n}\n\nexport const createLoopingListWithIndex = <T>(list: T[], startIndex: number = 0, length: number = 0, forwards: boolean = true) => {\n if (length < 0) {\n console.warn(`createLoopingList: length must be >= 0, given ${length}`)\n } else if (length === 0) {\n length = list.length\n }\n\n const returnList: [number, T][] = []\n\n if (forwards) {\n for (let i = startIndex; returnList.length < length; i = (i + 1) % list.length) {\n returnList.push([i, list[i]!])\n }\n } else {\n for (let i = startIndex; returnList.length < length; i = i === 0 ? i = list.length - 1 : i - 1) {\n returnList.push([i, list[i]!])\n }\n }\n\n return returnList\n}\n\nexport const createLoopingList = <T>(list: T[], startIndex: number = 0, length: number = 0, forwards: boolean = true) => {\n return createLoopingListWithIndex(list, startIndex, length, forwards).map(([_, item]) => item)\n}\n\n/**\n * @param list The list to be changed\n * @param move The shifting applied to the array (can be negative)\n */\nconst moveItems = <T>(list: T[], move: number = 0) => {\n const result = []\n let start = move\n if (start < 0) {\n start = list.length - move\n }\n start = start % list.length\n for (let i = 0; i < list.length; i++) {\n result[i] = list[(i + start) % list.length]\n }\n return result\n}\n\nfunction resolveSingleOrArray<T>(value: T | T[]): T[] {\n if (Array.isArray(value)) {\n return value\n } else if (value) {\n return [value]\n }\n return []\n}\n\nexport const ArrayUtil = {\n unique: <T>(list: T[]): T[] => {\n const seen = new Set<T>()\n return list.filter((item) => {\n if (seen.has(item)) {\n return false\n }\n seen.add(item)\n return true\n })\n },\n difference: <T>(list: T[], removeList: T[]): T[] => {\n const remove = new Set<T>(removeList)\n return list.filter((item) => !remove.has(item))\n },\n moveItems,\n resolveSingleOrArray\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { forwardRef } 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\nexport const IconButtonUtil = {\n icon: [...ButtonColorUtil.solid, 'transparent'] 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 * The allowed colors for the IconButton\n */\nexport type IconButtonColor = typeof IconButtonUtil.icon[number]\n\n\n/**\n * The different sizes for a button\n */\ntype ButtonSizes = 'small' | 'medium' | 'large' | 'none'\n\ntype IconButtonSize = 'tiny' | 'small' | 'medium' | 'large' | 'none'\n\n/**\n * The shard properties between all button types\n */\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * @default 'medium'\n */\n size?: ButtonSizes,\n}\n\nconst paddingMapping: Record<ButtonSizes, string> = {\n none: '',\n small: 'btn-sm',\n medium: 'btn-md',\n large: 'btn-lg'\n}\n\nconst iconPaddingMapping: Record<IconButtonSize, string> = {\n none: '',\n tiny: 'icon-btn-xs',\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 coloredHoverBackground?: boolean,\n}\n\n/**\n * The shard properties between all button types\n */\nexport type IconButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * @default 'medium'\n */\n size?: IconButtonSize,\n color?: IconButtonColor,\n}\n\n/**\n * A button with a solid background and different sizes\n */\nexport const SolidButton = forwardRef<HTMLButtonElement, SolidButtonProps>(function SolidButton({\n children,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }, ref) {\n const colorClasses = {\n primary: 'not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text',\n secondary: 'not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text',\n tertiary: 'not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text',\n positive: 'not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text',\n warning: 'not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text',\n negative: 'not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text',\n neutral: 'not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-solid-primary-icon',\n secondary: 'not-group-disabled:text-button-solid-secondary-icon',\n tertiary: 'not-group-disabled:text-button-solid-tertiary-icon',\n positive: 'not-group-disabled:text-button-solid-positive-icon',\n warning: 'not-group-disabled:text-button-solid-warning-icon',\n negative: 'not-group-disabled:text-button-solid-negative-icon',\n neutral: 'not-group-disabled:text-button-solid-neutral-icon',\n }[color]\n\n return (\n <button\n ref={ref}\n onClick={onClick}\n className={clsx(\n 'group font-semibold',\n colorClasses,\n 'not-disabled:hover:brightness-90',\n 'disabled:text-disabled disabled:bg-disabled-background',\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n})\n\n/**\n * A button with an outline border and different sizes\n */\nexport const OutlineButton = ({\n children,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: OutlineButtonProps) => {\n const colorClasses = {\n primary: 'not-disabled:border-button-outline-primary-text not-disabled:text-button-outline-primary-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-outline-primary-icon',\n }[color]\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'group font-semibold bg-transparent border-2 ',\n 'not-disabled:hover:brightness-80',\n colorClasses,\n 'disabled:text-disabled disabled:border-disabled-outline',\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\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 */\nexport const TextButton = ({\n children,\n color = 'neutral',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n coloredHoverBackground = true,\n className,\n ...restProps\n }: TextButtonProps) => {\n const colorClasses = {\n primary: 'not-disabled:bg-transparent not-disabled:text-button-text-primary-text not-disabled:focus-visible:outline-button-text-primary-text',\n negative: 'not-disabled:bg-transparent not-disabled:text-button-text-negative-text not-disabled:focus-visible:outline-button-text-negative-text',\n neutral: 'not-disabled:bg-transparent not-disabled:text-button-text-neutral-text not-disabled:focus-visible:outline-button-text-neutral-text',\n }[color]\n\n const backgroundColor = {\n primary: 'not-disabled:hover:bg-button-text-primary-text/20 not-disabled:focus-visible:bg-button-text-primary-text/20',\n negative: 'not-disabled:hover:bg-button-text-negative-text/20 not-disabled:focus-visible:bg-button-text-negative-text/20',\n neutral: 'not-disabled:hover:bg-button-text-neutral-text/20 not-disabled:focus-visible:bg-button-text-neutral-text/20',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-text-primary-icon',\n negative: 'not-group-disabled:text-button-text-negative-icon',\n neutral: 'not-group-disabled:text-button-text-neutral-icon',\n }[color]\n\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'group font-semibold',\n 'disabled:text-disabled',\n colorClasses,\n {\n [backgroundColor]: coloredHoverBackground,\n 'not-disabled:hover:bg-button-text-hover-background': !coloredHoverBackground,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\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 */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton({\n children,\n color = 'primary',\n size = 'medium',\n className,\n ...restProps\n }, ref)\n{\n const colorClasses = {\n primary: 'not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text',\n secondary: 'not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text',\n tertiary: 'not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text',\n positive: 'not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text',\n warning: 'not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text',\n negative: 'not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text',\n neutral: 'not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text',\n transparent: 'not-disabled:bg-transparent',\n }[color]\n\n return (\n <button\n ref={ref}\n className={clsx(\n colorClasses,\n 'not-disabled:hover:brightness-90',\n 'disabled:text-disabled',\n {\n 'disabled:bg-disabled-background': color !== 'transparent',\n 'disabled:opacity-70': color === 'transparent',\n 'not-disabled:hover:bg-button-text-hover-background': color === 'transparent',\n },\n ButtonUtil.iconPaddingMapping[size],\n className\n )}\n {...restProps}\n >\n {children}\n </button>\n )\n})","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\nimport { LocalizationUtil } from './util'\nimport type { HightideTranslationLocales } from '@/src/i18n/translations'\n\nexport type LocaleContextValue = {\n locale: HightideTranslationLocales,\n setLocale: Dispatch<SetStateAction<HightideTranslationLocales>>,\n}\n\nexport const LocaleContext = createContext<LocaleContextValue>({\n locale: LocalizationUtil.DEFAULT_LOCALE,\n setLocale: (v) => v\n})\n\ntype LocaleWithSystem = HightideTranslationLocales | 'system'\n\ntype LocaleProviderProps = {\n locale?: LocaleWithSystem,\n onChangedLocale?: (locale: HightideTranslationLocales) => void,\n}\n\nexport const LocaleProvider = ({ children, locale, onChangedLocale }: PropsWithChildren<LocaleProviderProps>) => {\n const {\n value: storedLocale,\n setValue: setStoredLocale,\n deleteValue: deleteStoredLocale,\n } = useLocalStorage<LocaleWithSystem>('locale', 'system')\n const [localePreference, setLocalePreference] = useState<LocaleWithSystem>('system')\n\n const resolvedLocale = useMemo(() => {\n if (locale && locale !== 'system') {\n return locale\n }\n if (storedLocale && storedLocale !== 'system') {\n return storedLocale\n }\n if (localePreference !== 'system') {\n return localePreference\n }\n return LocalizationUtil.DEFAULT_LOCALE\n }, [locale, localePreference, storedLocale])\n\n useEffect(() => {\n if(!locale) return\n if (locale === 'system') {\n deleteStoredLocale()\n } else {\n setStoredLocale(locale)\n }\n }, [locale]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n onChangedLocale?.(resolvedLocale)\n }, [resolvedLocale]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const localesToTestAgainst = Object.values(LocalizationUtil.locals)\n\n const detectLanguage = () => {\n const matchingBrowserLanguage = window.navigator.languages\n .map(locale =>\n localesToTestAgainst.find(\n (test) => locale === test || locale.split('-')[0] === LocalizationUtil.localToLanguage(test)\n ))\n .filter((entry): entry is HightideTranslationLocales => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0]\n setLocalePreference(firstMatch)\n }\n detectLanguage()\n\n window.addEventListener('languagechange', detectLanguage)\n return () => {\n window.removeEventListener('languagechange', detectLanguage)\n }\n }, [])\n\n return (\n <LocaleContext.Provider value={{\n locale: resolvedLocale,\n setLocale: (newLocale) => {\n if (locale !== 'system') {\n console.warn('LocaleProvider: Attempting to change the ' +\n \"locale while setting a fixed locale won't have any effect. \" +\n 'Change the locale provided to the LocaleProvider instead.')\n }\n setStoredLocale(newLocale)\n }\n }}>\n {children}\n </LocaleContext.Provider>\n )\n}\n\nexport const useLocale = () => {\n const context = useContext(LocaleContext)\n if (!context) {\n throw new Error('useLocale must be used within LocaleContext. Try adding a LocaleProvider around your app.')\n }\n return context\n}\n\nexport const useLanguage = () => {\n const context = useContext(LocaleContext)\n if (!context) {\n throw new Error('useLanguage must be used within LocaleContext. Try adding a LocaleProvider around your app.')\n }\n return { language: LocalizationUtil.localToLanguage(context.locale) }\n}\n","'use client'\n\nimport type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useState } from 'react'\nimport { LocalStorageService } from '@/src/utils/storage'\nimport { resolveSetState } from '@/src/utils/resolveSetState'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\n\ntype UseLocalStorageResult<T> = {\n value: T,\n setValue: SetValue<T>,\n deleteValue: () => void,\n}\n\n/**\n * @param key Key under which to save the data\n * @param backupValue Used if the storage is unavailable or no value is present\n *\n * The backup value will never be saved to the storage unless you explicitly\n */\nexport const useLocalStorage = <T>(key: string, backupValue: T): UseLocalStorageResult<T> => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return backupValue\n }\n const storageService = new LocalStorageService()\n try {\n const value = storageService.get<T>(key)\n return value || backupValue\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (_) {\n console.warn('useLocalStorage: Error while reading the stored value. Make sure your typing is correct.')\n storageService.delete(key)\n console.info(`useLocalStorage: deleted erroneous value for key: ${key}`)\n return backupValue\n }\n }, [backupValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(action => {\n const newValue = resolveSetState(action, storedValue)\n const storageService = new LocalStorageService()\n storageService.set(key, newValue)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n const deleteValue = () => {\n const storageService = new LocalStorageService()\n storageService.delete(key)\n setStoredValue(backupValue)\n }\n\n return { value: storedValue, setValue, deleteValue }\n}","// AUTO-GENERATED. DO NOT EDIT.\n/* eslint-disable @stylistic/quote-props */\n/* eslint-disable no-useless-escape */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { Translation } from '@helpwave/internationalization'\nimport { TranslationGen } from '@helpwave/internationalization'\n\nexport const hightideTranslationLocales = ['de-DE', 'en-US'] as const\n\nexport type HightideTranslationLocales = typeof hightideTranslationLocales[number]\n\nexport type HightideTranslationEntries = {\n 'add': string,\n 'age': string,\n 'all': string,\n 'apply': string,\n 'back': string,\n 'cancel': string,\n 'carousel': string,\n 'change': string,\n 'chooseLanguage': string,\n 'chooseSlide': string,\n 'chooseTheme': string,\n 'clear': string,\n 'click': string,\n 'clickToCopy': string,\n 'clickToSelect': string,\n 'close': string,\n 'confirm': string,\n 'copied': string,\n 'copy': string,\n 'create': string,\n 'decline': string,\n 'delete': string,\n 'discard': string,\n 'discardChanges': string,\n 'done': string,\n 'edit': string,\n 'endDate': string,\n 'enterText': string,\n 'entryDate': string,\n 'error': string,\n 'errorOccurred': string,\n 'exit': string,\n 'fieldRequiredError': string,\n 'filter': string,\n 'gender': (values: { gender: string }) => string,\n 'goodToSeeYou': string,\n 'identifier': string,\n 'invalidEmail': string,\n 'invalidEmailError': string,\n 'language': string,\n 'less': string,\n 'loading': string,\n 'locale': string,\n 'max': string,\n 'maxLengthError': string,\n 'min': string,\n 'minLengthError': string,\n 'more': string,\n 'name': string,\n 'next': string,\n 'no': string,\n 'none': string,\n 'notEmpty': string,\n 'nothingFound': string,\n 'of': string,\n 'optional': string,\n 'outOfRangeNumber': (values: { min: number, max: number }) => string,\n 'outOfRangeSelectionItems': (values: { min: number, max: number }) => string,\n 'outOfRangeString': (values: { min: number, max: number }) => string,\n 'pleaseWait': string,\n 'previous': string,\n 'remove': string,\n 'required': string,\n 'reset': string,\n 'save': string,\n 'saved': string,\n 'search': string,\n 'select': string,\n 'selectOption': string,\n 'show': string,\n 'showLess': string,\n 'showMore': string,\n 'showSlide': (values: { index: number }) => string,\n 'slide': string,\n 'slideNavigation': string,\n 'slideOf': (values: { index: number, length: number }) => string,\n 'startDate': string,\n 'street': string,\n 'submit': string,\n 'success': string,\n 'text': string,\n 'themeMode': (values: { theme: string }) => string,\n 'themes': (values: { count: number }) => string,\n 'time.ago': string,\n 'time.agoDays': (values: { days: number }) => string,\n 'time.april': string,\n 'time.august': string,\n 'time.century': (values: { count: number }) => string,\n 'time.day': (values: { count: number }) => string,\n 'time.decade': (values: { count: number }) => string,\n 'time.december': string,\n 'time.february': string,\n 'time.hour': (values: { count: number }) => string,\n 'time.in': string,\n 'time.inDays': (values: { days: number }) => string,\n 'time.january': string,\n 'time.july': string,\n 'time.june': string,\n 'time.march': string,\n 'time.may': string,\n 'time.microsecond': (values: { count: number }) => string,\n 'time.millisecond': (values: { count: number }) => string,\n 'time.minute': (values: { count: number }) => string,\n 'time.month': (values: { count: number }) => string,\n 'time.monthName': (values: { month: string }) => string,\n 'time.nanosecond': (values: { count: number }) => string,\n 'time.november': string,\n 'time.october': string,\n 'time.second': (values: { count: number }) => string,\n 'time.september': string,\n 'time.today': string,\n 'time.tomorrow': string,\n 'time.year': (values: { count: number }) => string,\n 'time.yesterday': string,\n 'tooFewSelectionItems': (values: { min: number }) => string,\n 'tooLong': (values: { max: number }) => string,\n 'tooManySelectionItems': (values: { max: number }) => string,\n 'tooShort': (values: { min: number }) => string,\n 'unsavedChanges': string,\n 'unsavedChangesSaveQuestion': string,\n 'update': string,\n 'value': string,\n 'welcome': string,\n 'yes': string,\n}\n\nexport const hightideTranslation: Translation<HightideTranslationLocales, Partial<HightideTranslationEntries>> = {\n 'de-DE': {\n 'add': `Hinzufügen`,\n 'age': `Alter`,\n 'all': `Alle`,\n 'apply': `Anwenden`,\n 'back': `Zurück`,\n 'cancel': `Abbrechen`,\n 'carousel': `Karussell`,\n 'change': `Ändern`,\n 'chooseLanguage': `Wähle deine bevorzugte Sprache`,\n 'chooseSlide': `Wähle die angezeigte Slide aus`,\n 'chooseTheme': `Wähle dein bevorzugtes Farbschema.`,\n 'clear': `Löschen`,\n 'click': `Klicken`,\n 'clickToCopy': `Zum kopieren klicken`,\n 'clickToSelect': `Zum Auswählen drücken`,\n 'close': `Schließen`,\n 'confirm': `Bestätigen`,\n 'copied': `Kopiert`,\n 'copy': `Kopieren`,\n 'create': `Erstellen`,\n 'decline': `Ablehnen`,\n 'delete': `Löschen`,\n 'discard': `Verwerfen`,\n 'discardChanges': `Änderungen Verwerfen`,\n 'done': `Fertig`,\n 'edit': `Bearbeiten`,\n 'endDate': `Ende`,\n 'enterText': `Text hier eingeben`,\n 'entryDate': `Eintragsdatum`,\n 'error': `Fehler`,\n 'errorOccurred': `Ein Fehler ist aufgetreten`,\n 'exit': `Beenden`,\n 'fieldRequiredError': `Dieses Feld ist erforderlich.`,\n 'filter': `Filter`,\n 'gender': ({ gender }): string => {\n return TranslationGen.resolveSelect(gender, {\n 'male': `Männlich`,\n 'female': `Weiblich`,\n 'other': `Divers`,\n })\n },\n 'goodToSeeYou': `Schön dich zu sehen`,\n 'identifier': `Identifikator`,\n 'invalidEmail': `Die E-Mail ist ungültig.`,\n 'invalidEmailError': `Bitte geben Sie eine gültige E-Mail-Adresse ein.`,\n 'language': `Sprache`,\n 'less': `Weniger`,\n 'loading': `Lädt`,\n 'locale': `Locale`,\n 'max': `Max`,\n 'maxLengthError': `Maximale Länge überschritten.`,\n 'min': `Min`,\n 'minLengthError': `Mindestlänge nicht erreicht.`,\n 'more': `Mehr`,\n 'name': `Name`,\n 'next': `Weiter`,\n 'no': `Nein`,\n 'none': `Nichts`,\n 'notEmpty': `Das Feld darf nicht leer sein.`,\n 'nothingFound': `Nichts gefunden`,\n 'of': `von`,\n 'optional': `Optional`,\n 'outOfRangeNumber': ({ min, max }): string => {\n return `Der Wert muss zwischen ${min} und ${max} liegen.`\n },\n 'outOfRangeSelectionItems': ({ min, max }): string => {\n return `Es müssen zwischen ${min} und ${max} Elemente ausgewählt werden.`\n },\n 'outOfRangeString': ({ min, max }): string => {\n return `Der Wert muss zwischen ${min} und ${max} Zeichen lang sein.`\n },\n 'pleaseWait': `Bitte warten...`,\n 'previous': `Vorherige`,\n 'remove': `Entfernen`,\n 'required': `Erforderlich`,\n 'reset': `Zurücksetzen`,\n 'save': `Speichern`,\n 'saved': `Gespeichert`,\n 'search': `Suche`,\n 'select': `Select`,\n 'selectOption': `Option auswählen`,\n 'show': `Anzeigen`,\n 'showLess': `Weniger anzeigen`,\n 'showMore': `Mehr anzeigen`,\n 'showSlide': ({ index }): string => {\n return `Zeige Slide ${index}`\n },\n 'slide': `Slide`,\n 'slideNavigation': `Slide Navigation`,\n 'slideOf': ({ index, length }): string => {\n return `Slide ${index} von ${length} slides`\n },\n 'startDate': `Start`,\n 'street': `Straße`,\n 'submit': `Abschicken`,\n 'success': `Erfolg`,\n 'text': `Text`,\n 'themeMode': ({ theme }): string => {\n return TranslationGen.resolveSelect(theme, {\n 'dark': `Dunkel`,\n 'light': `Hell`,\n 'system': `System`,\n })\n },\n 'themes': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Farbschema`,\n 'other': `Farbschemas`,\n })\n },\n 'time.ago': `vor`,\n 'time.agoDays': ({ days }): string => {\n return `var ${days} Tagen`\n },\n 'time.april': `April`,\n 'time.august': `August`,\n 'time.century': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Jahrhundert`,\n 'other': `Jahrhunderte`,\n })\n },\n 'time.day': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Tag`,\n 'other': `Tage`,\n })\n },\n 'time.decade': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Jahrzehnt`,\n 'other': `Jahrzehnte`,\n })\n },\n 'time.december': `December`,\n 'time.february': `Febuar`,\n 'time.hour': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Stunde`,\n 'other': `Stunden`,\n })\n },\n 'time.in': `in`,\n 'time.inDays': ({ days }): string => {\n return `in ${days} Tagen`\n },\n 'time.january': `Januar`,\n 'time.july': `Juli`,\n 'time.june': `Juni`,\n 'time.march': `März`,\n 'time.may': `Mai`,\n 'time.microsecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Mikrosekunde`,\n 'other': `Mikrosekunden`,\n })\n },\n 'time.millisecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Millisekunde`,\n 'other': `Millisekunden`,\n })\n },\n 'time.minute': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Minute`,\n 'other': `Minuten`,\n })\n },\n 'time.month': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Monat`,\n 'other': `Monate`,\n })\n },\n 'time.monthName': ({ month }): string => {\n return TranslationGen.resolveSelect(month, {\n 'january': `Januar`,\n 'february': `Februar`,\n 'march': `März`,\n 'april': `April`,\n 'may': `Mai`,\n 'june': `Juni`,\n 'july': `Juli`,\n 'august': `August`,\n 'september': `September`,\n 'october': `Oktober`,\n 'november': `November`,\n 'december': `Dezember`,\n 'other': `Unbekannter Monat`,\n })\n },\n 'time.nanosecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Nanosekunde`,\n 'other': `Nanosekunden`,\n })\n },\n 'time.november': `November`,\n 'time.october': `October`,\n 'time.second': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Sekunde`,\n 'other': `Sekunden`,\n })\n },\n 'time.september': `September`,\n 'time.today': `Heute`,\n 'time.tomorrow': `Morgen`,\n 'time.year': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Jahr`,\n 'other': `Jahre`,\n })\n },\n 'time.yesterday': `Gestern`,\n 'tooFewSelectionItems': ({ min }): string => {\n return `Es müssen mindestens ${min} Elemente ausgewählt werden.`\n },\n 'tooLong': ({ max }): string => {\n return `Der Wert darf höchstens ${max} Zeichen enthalten.`\n },\n 'tooManySelectionItems': ({ max }): string => {\n return `Es müssen maximal ${max} Elemente ausgewählt werden.`\n },\n 'tooShort': ({ min }): string => {\n return `Der Wert muss mindestens ${min} Zeichen enthalten.`\n },\n 'unsavedChanges': `Ungespeicherte Änderungen`,\n 'unsavedChangesSaveQuestion': `Möchtest du die Änderungen speichern?`,\n 'update': `Update`,\n 'value': `Wert`,\n 'welcome': `Willkommen`,\n 'yes': `Ja`\n },\n 'en-US': {\n 'add': `Add`,\n 'age': `Age`,\n 'all': `All`,\n 'apply': `Apply`,\n 'back': `Back`,\n 'cancel': `Cancel`,\n 'carousel': `Carousel`,\n 'change': `Change`,\n 'chooseLanguage': `Choose your language`,\n 'chooseSlide': `Choose slide to display`,\n 'chooseTheme': `Choose your preferred color theme.`,\n 'clear': `Clear`,\n 'click': `Click`,\n 'clickToCopy': `Click to Copy`,\n 'clickToSelect': `Click to select`,\n 'close': `Close`,\n 'confirm': `Confirm`,\n 'copied': `Copied`,\n 'copy': `Copy`,\n 'create': `Create`,\n 'decline': `Decline`,\n 'delete': `Delete`,\n 'discard': `Discard`,\n 'discardChanges': `Discard Changes`,\n 'done': `Done`,\n 'edit': `Edit`,\n 'endDate': `End`,\n 'enterText': `Enter text here`,\n 'entryDate': `Entry Date`,\n 'error': `Error`,\n 'errorOccurred': `An error occurred`,\n 'exit': `Exit`,\n 'fieldRequiredError': `This field is required.`,\n 'filter': `Filter`,\n 'gender': ({ gender }): string => {\n return TranslationGen.resolveSelect(gender, {\n 'male': `Male`,\n 'female': `Female`,\n 'other': `Other`,\n })\n },\n 'goodToSeeYou': `Good to see you`,\n 'identifier': `Identifier`,\n 'invalidEmail': `The email is not valid.`,\n 'invalidEmailError': `Please enter a valid email address.`,\n 'language': `Language`,\n 'less': `Less`,\n 'loading': `Loading`,\n 'locale': `Locale`,\n 'max': `Max`,\n 'maxLengthError': `Maximum length exceeded.`,\n 'min': `Min`,\n 'minLengthError': `Minimum length not met.`,\n 'more': `More`,\n 'name': `Name`,\n 'next': `Next`,\n 'no': `No`,\n 'none': `None`,\n 'notEmpty': `The field cannot be empty.`,\n 'nothingFound': `Nothing found`,\n 'of': `of`,\n 'optional': `Optional`,\n 'outOfRangeNumber': ({ min, max }): string => {\n return `The value must be between ${min} and ${max}.`\n },\n 'outOfRangeSelectionItems': ({ min, max }): string => {\n return `Between ${min} and ${max} items must be selected.`\n },\n 'outOfRangeString': ({ min, max }): string => {\n return `The value needs to have between ${min} and ${max} characters.`\n },\n 'pleaseWait': `Please wait...`,\n 'previous': `Previous`,\n 'remove': `Remove`,\n 'required': `Required`,\n 'reset': `Reset`,\n 'save': `Save`,\n 'saved': `Saved`,\n 'search': `Search`,\n 'select': `Select`,\n 'selectOption': `Select an option`,\n 'show': `Show`,\n 'showLess': `Show less`,\n 'showMore': `Show more`,\n 'showSlide': ({ index }): string => {\n return `Show Slide ${index}`\n },\n 'slide': `Slide`,\n 'slideNavigation': `Slide navigation`,\n 'slideOf': ({ index, length }): string => {\n return `Slide ${index} of ${length} slides`\n },\n 'startDate': `Start`,\n 'street': `Street`,\n 'submit': `Submit`,\n 'success': `Success`,\n 'text': `Text`,\n 'themeMode': ({ theme }): string => {\n return TranslationGen.resolveSelect(theme, {\n 'dark': `Dark`,\n 'light': `Light`,\n 'system': `System`,\n })\n },\n 'themes': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Theme`,\n 'other': `Themes`,\n })\n },\n 'time.ago': `ago`,\n 'time.agoDays': ({ days }): string => {\n return `days ${days} ago`\n },\n 'time.april': `April`,\n 'time.august': `August`,\n 'time.century': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Century`,\n 'other': `Centuries`,\n })\n },\n 'time.day': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Day`,\n 'other': `Days`,\n })\n },\n 'time.decade': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Decade`,\n 'other': `Decades`,\n })\n },\n 'time.december': `December`,\n 'time.february': `Febuary`,\n 'time.hour': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Hour`,\n 'other': `Hours`,\n })\n },\n 'time.in': `in`,\n 'time.inDays': ({ days }): string => {\n return `in ${days} days`\n },\n 'time.january': `January`,\n 'time.july': `July`,\n 'time.june': `June`,\n 'time.march': `March`,\n 'time.may': `May`,\n 'time.microsecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Microsecond`,\n 'other': `Microseconds`,\n })\n },\n 'time.millisecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Millisecond`,\n 'other': `Milliseconds`,\n })\n },\n 'time.minute': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Minute`,\n 'other': `Minutes`,\n })\n },\n 'time.month': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Month`,\n 'other': `Months`,\n })\n },\n 'time.monthName': ({ month }): string => {\n return TranslationGen.resolveSelect(month, {\n 'january': `January`,\n 'february': `February`,\n 'march': `March`,\n 'april': `April`,\n 'may': `May`,\n 'june': `June`,\n 'july': `July`,\n 'august': `August`,\n 'september': `September`,\n 'october': `October`,\n 'november': `November`,\n 'december': `December`,\n 'other': `Unknown Month`,\n })\n },\n 'time.nanosecond': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Nanosecond`,\n 'other': `Nanoseconds`,\n })\n },\n 'time.november': `November`,\n 'time.october': `October`,\n 'time.second': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Second`,\n 'other': `Seconds`,\n })\n },\n 'time.september': `September`,\n 'time.today': `Today`,\n 'time.tomorrow': `Tomorrow`,\n 'time.year': ({ count }): string => {\n return TranslationGen.resolveSelect(count, {\n '=1': `Year`,\n 'other': `Years`,\n })\n },\n 'time.yesterday': `Yesterday`,\n 'tooFewSelectionItems': ({ min }): string => {\n return `Select at least ${min} items.`\n },\n 'tooLong': ({ max }): string => {\n return `The value requires less than ${max} characters.`\n },\n 'tooManySelectionItems': ({ max }): string => {\n return `Select at most ${max} items.`\n },\n 'tooShort': ({ min }): string => {\n return `The value requires at least ${min} characters.`\n },\n 'unsavedChanges': `Unsaved Changes`,\n 'unsavedChangesSaveQuestion': `Do you want to save your changes?`,\n 'update': `Update`,\n 'value': `Value`,\n 'welcome': `Welcome`,\n 'yes': `Yes`\n }\n}\n\n","import type { HightideTranslationLocales } from '@/src/i18n/translations'\nimport { hightideTranslationLocales } from '@/src/i18n/translations'\n\n/**\n * The supported locales' names in their respective language\n */\nconst localsNames: Record<HightideTranslationLocales, string> = {\n 'en-US': 'English (US)',\n 'de-DE': 'Deutsch',\n}\n\n/**\n * The default locale\n */\nconst DEFAULT_LOCALE: HightideTranslationLocales = 'en-US'\n\nfunction localeToLanguage(locale: HightideTranslationLocales) {\n return locale.split('-')[0]\n}\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LocalizationUtil = {\n locals: hightideTranslationLocales,\n localToLanguage: localeToLanguage,\n DEFAULT_LOCALE,\n languagesLocalNames: localsNames,\n}\n","import { useLocale } from '@/src/i18n/LocaleProvider'\nimport type {\n PartialTranslationExtension,\n Translation,\n TranslationEntries\n} from '@helpwave/internationalization'\nimport { combineTranslation, ICUUtil } from '@helpwave/internationalization'\nimport { ArrayUtil } from '@/src/utils/array'\nimport type { SingleOrArray } from '@/src/utils/typing'\nimport type { HightideTranslationEntries, HightideTranslationLocales } from '@/src/i18n/translations'\nimport { hightideTranslation } from '@/src/i18n/translations'\n\n/**\n * Use for translations where you know that all values are ICU strings.\n *\n * This most likely is the case for Translations provided by a backend,\n * for more dynamic and typesafe translation use useTranslation instead\n */\nexport function useICUTranslation<L extends string, T extends Record<string, string>>(\n translations: Translation<L, T>[] | Translation<L, T>,\n locale: L\n) {\n translations = Array.isArray(translations) ? translations : [translations]\n\n return function translate(\n key: string,\n values?: Record<string, object>\n ): string {\n try {\n for (let i = 0; i < translations.length; i++) {\n const localizedTranslation = translations[i][locale]\n if (!localizedTranslation) continue\n\n const msg = localizedTranslation[key]\n if (typeof msg === 'string') {\n return ICUUtil.interpret(msg, values)\n }\n }\n console.warn(`useTranslation: No translation for key \"${key}\" found.`)\n } catch (e) {\n console.error(`useTranslation: Error translating key \"${String(key)}\"`, e)\n }\n\n return `{{${String(locale)}:${String(key)}}}`\n }\n}\n\ntype UseHidetideTranslationOverwrites = {\n locale?: HightideTranslationLocales,\n}\n\ntype HidetideTranslationExtension<L extends string, T extends TranslationEntries>\n = PartialTranslationExtension<L, HightideTranslationLocales, T, HightideTranslationEntries>\n/**\n * A wrapper for the useHightideTranslation to load and specify the translations for the library\n */\nexport function useHightideTranslation<L extends string, T extends TranslationEntries>(\n extensions?: SingleOrArray<HidetideTranslationExtension<L,T>>,\n overwrites?: UseHidetideTranslationOverwrites\n) {\n const { locale: inferredLocale } = useLocale()\n const locale = overwrites?.locale ?? inferredLocale\n const translationExtensions = ArrayUtil.resolveSingleOrArray(extensions)\n\n return combineTranslation<L | HightideTranslationLocales, T & HightideTranslationEntries>([\n ...translationExtensions,\n hightideTranslation as HidetideTranslationExtension<L,T>\n ], locale)\n}\n"],"mappings":"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","names":["import_react","import_clsx","SolidButton","clsx","IconButton","clsx","import_react","import_react","import_jsx_runtime","import_internationalization","import_jsx_runtime","clsx","CarouselSlide"]}
@@ -237,10 +237,16 @@ var IconButton = forwardRef(function IconButton2({
237
237
  );
238
238
  });
239
239
 
240
+ // src/i18n/LocaleProvider.tsx
241
+ import { createContext, useContext, useEffect, useMemo, useState as useState2 } from "react";
242
+
243
+ // src/hooks/useLocalStorage.ts
244
+ import { useCallback, useState } from "react";
245
+
240
246
  // src/i18n/translations.ts
241
247
  import { TranslationGen } from "@helpwave/internationalization";
242
- var supportedLocales = ["de-DE", "en-US"];
243
- var generatedTranslations = {
248
+ var hightideTranslationLocales = ["de-DE", "en-US"];
249
+ var hightideTranslation = {
244
250
  "de-DE": {
245
251
  "add": `Hinzuf\xFCgen`,
246
252
  "age": `Alter`,
@@ -715,12 +721,6 @@ var generatedTranslations = {
715
721
  }
716
722
  };
717
723
 
718
- // src/i18n/LocaleProvider.tsx
719
- import { createContext, useContext, useEffect, useMemo, useState as useState2 } from "react";
720
-
721
- // src/hooks/useLocalStorage.ts
722
- import { useCallback, useState } from "react";
723
-
724
724
  // src/i18n/util.ts
725
725
  var localsNames = {
726
726
  "en-US": "English (US)",
@@ -731,7 +731,7 @@ function localeToLanguage(locale) {
731
731
  return locale.split("-")[0];
732
732
  }
733
733
  var LocalizationUtil = {
734
- locals: supportedLocales,
734
+ locals: hightideTranslationLocales,
735
735
  localToLanguage: localeToLanguage,
736
736
  DEFAULT_LOCALE,
737
737
  languagesLocalNames: localsNames
@@ -751,15 +751,15 @@ var useLocale = () => {
751
751
  return context;
752
752
  };
753
753
 
754
- // src/i18n/useTranslation.ts
754
+ // src/i18n/useHightideTranslation.ts
755
755
  import { combineTranslation, ICUUtil } from "@helpwave/internationalization";
756
- function useTranslation(extensions, overwrites) {
756
+ function useHightideTranslation(extensions, overwrites) {
757
757
  const { locale: inferredLocale } = useLocale();
758
758
  const locale = overwrites?.locale ?? inferredLocale;
759
759
  const translationExtensions = ArrayUtil.resolveSingleOrArray(extensions);
760
760
  return combineTranslation([
761
761
  ...translationExtensions,
762
- generatedTranslations
762
+ hightideTranslation
763
763
  ], locale);
764
764
  }
765
765
 
@@ -776,7 +776,7 @@ var useCarouselContext = () => {
776
776
  function CarouselTabs({
777
777
  onChange
778
778
  }) {
779
- const translation = useTranslation();
779
+ const translation = useHightideTranslation();
780
780
  const { id, slideCount, currentIndex, isLooping } = useCarouselContext();
781
781
  const tabRefs = useRef([]);
782
782
  const handleKeyDown = (event, index) => {
@@ -834,7 +834,7 @@ var CarouselSlide = forwardRef2(
834
834
  isSelected,
835
835
  ...props
836
836
  }, ref) {
837
- const translation = useTranslation();
837
+ const translation = useHightideTranslation();
838
838
  const { id, slideCount } = useCarouselContext();
839
839
  return /* @__PURE__ */ jsx3(
840
840
  "div",
@@ -872,7 +872,7 @@ var Carousel = ({
872
872
  onSlideChanged,
873
873
  ...props
874
874
  }) => {
875
- const translation = useTranslation();
875
+ const translation = useHightideTranslation();
876
876
  const slideRefs = useRef([]);
877
877
  const [currentIndex, setCurrentIndex] = useState3(0);
878
878
  const [hasFocus, setHasFocus] = useState3(false);