// src/components/layout-and-navigation/StepperBar.tsx
import { Check, ChevronLeft, ChevronRight } from "lucide-react";

// src/localization/LanguageProvider.tsx
import { createContext, useContext, useEffect as useEffect2, useState as useState2 } from "react";

// src/hooks/useLocalStorage.ts
import { useCallback, useEffect, useState } from "react";

// src/localization/util.ts
var languages = ["en", "de"];
var languagesLocalNames = {
  en: "English",
  de: "Deutsch"
};
var DEFAULT_LANGUAGE = "en";
var LanguageUtil = {
  languages,
  DEFAULT_LANGUAGE,
  languagesLocalNames
};

// src/localization/LanguageProvider.tsx
import { jsx } from "react/jsx-runtime";
var LanguageContext = createContext({
  language: LanguageUtil.DEFAULT_LANGUAGE,
  setLanguage: (v) => v
});
var useLanguage = () => useContext(LanguageContext);

// src/localization/useTranslation.ts
var TranslationPluralCount = {
  zero: 0,
  one: 1,
  two: 2,
  few: 3,
  many: 11,
  other: -1
};
var useTranslation = (translations, overwriteTranslation = {}) => {
  const { language: languageProp, translation: overwrite } = overwriteTranslation;
  const { language: inferredLanguage } = useLanguage();
  const usedLanguage = languageProp ?? inferredLanguage;
  const usedTranslations = [...translations];
  if (overwrite) {
    usedTranslations.push(overwrite);
  }
  return (key, options) => {
    const { count, replacements } = { ...{ count: 0, replacements: {} }, ...options };
    try {
      for (let i = translations.length - 1; i >= 0; i--) {
        const translation = translations[i];
        const localizedTranslation = translation[usedLanguage];
        if (!localizedTranslation) {
          continue;
        }
        const value = localizedTranslation[key];
        if (!value) {
          continue;
        }
        let forProcessing;
        if (typeof value !== "string") {
          if (count === TranslationPluralCount.zero && value?.zero) {
            forProcessing = value.zero;
          } else if (count === TranslationPluralCount.one && value?.one) {
            forProcessing = value.one;
          } else if (count === TranslationPluralCount.two && value?.two) {
            forProcessing = value.two;
          } else if (TranslationPluralCount.few <= count && count < TranslationPluralCount.many && value?.few) {
            forProcessing = value.few;
          } else if (count > TranslationPluralCount.many && value?.many) {
            forProcessing = value.many;
          } else {
            forProcessing = value.other;
          }
        } else {
          forProcessing = value;
        }
        forProcessing = forProcessing.replace(/\{\{(\w+)}}/g, (_, placeholder) => {
          return replacements[placeholder] ?? `{{key:${placeholder}}}`;
        });
        return forProcessing;
      }
    } catch (e) {
      console.error(e);
    }
    return `{{${usedLanguage}:${key}}}`;
  };
};

// src/util/array.ts
var defaultRangeOptions = {
  allowEmptyRange: false,
  stepSize: 1,
  exclusiveStart: false,
  exclusiveEnd: true
};
var range = (endOrRange, options) => {
  const { allowEmptyRange, stepSize, exclusiveStart, exclusiveEnd } = { ...defaultRangeOptions, ...options };
  let start = 0;
  let end;
  if (typeof endOrRange === "number") {
    end = endOrRange;
  } else {
    start = endOrRange[0];
    end = endOrRange[1];
  }
  if (!exclusiveEnd) {
    end -= 1;
  }
  if (exclusiveStart) {
    start += 1;
  }
  if (end - 1 < start) {
    if (!allowEmptyRange) {
      console.warn(`range: end (${end}) < start (${start}) should be allowed explicitly, set options.allowEmptyRange to true`);
    }
    return [];
  }
  return Array.from({ length: end - start }, (_, index) => index * stepSize + start);
};

// src/components/user-action/Button.tsx
import clsx from "clsx";
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
var ButtonColorUtil = {
  solid: ["primary", "secondary", "tertiary", "positive", "warning", "negative", "neutral"],
  text: ["primary", "negative", "neutral"],
  outline: ["primary"]
};
var IconButtonUtil = {
  icon: [...ButtonColorUtil.solid, "transparent"]
};
var paddingMapping = {
  small: "btn-sm",
  medium: "btn-md",
  large: "btn-lg"
};
var iconPaddingMapping = {
  tiny: "icon-btn-xs",
  small: "icon-btn-sm",
  medium: "icon-btn-md",
  large: "icon-btn-lg"
};
var ButtonUtil = {
  paddingMapping,
  iconPaddingMapping
};
var SolidButton = ({
  children,
  disabled = false,
  color = "primary",
  size = "medium",
  startIcon,
  endIcon,
  onClick,
  className,
  ...restProps
}) => {
  const colorClasses = {
    primary: "bg-button-solid-primary-background text-button-solid-primary-text",
    secondary: "bg-button-solid-secondary-background text-button-solid-secondary-text",
    tertiary: "bg-button-solid-tertiary-background text-button-solid-tertiary-text",
    positive: "bg-button-solid-positive-background text-button-solid-positive-text",
    warning: "bg-button-solid-warning-background text-button-solid-warning-text",
    negative: "bg-button-solid-negative-background text-button-solid-negative-text",
    neutral: "bg-button-solid-neutral-background text-button-solid-neutral-text"
  }[color];
  const iconColorClasses = {
    primary: "text-button-solid-primary-icon",
    secondary: "text-button-solid-secondary-icon",
    tertiary: "text-button-solid-tertiary-icon",
    positive: "text-button-solid-positive-icon",
    warning: "text-button-solid-warning-icon",
    negative: "text-button-solid-negative-icon",
    neutral: "text-button-solid-neutral-icon"
  }[color];
  return /* @__PURE__ */ jsxs(
    "button",
    {
      onClick: disabled ? void 0 : onClick,
      disabled: disabled || onClick === void 0,
      className: clsx(
        {
          "text-disabled-text bg-disabled-background cursor-not-allowed": disabled,
          [clsx(colorClasses, "hover:brightness-90")]: !disabled
        },
        ButtonUtil.paddingMapping[size],
        className
      ),
      ...restProps,
      children: [
        startIcon && /* @__PURE__ */ jsx2(
          "span",
          {
            className: clsx({
              [iconColorClasses]: !disabled,
              [`text-disabled-icon`]: disabled
            }),
            children: startIcon
          }
        ),
        children,
        endIcon && /* @__PURE__ */ jsx2(
          "span",
          {
            className: clsx({
              [iconColorClasses]: !disabled,
              [`text-disabled-icon`]: disabled
            }),
            children: endIcon
          }
        )
      ]
    }
  );
};

// src/components/layout-and-navigation/StepperBar.tsx
import clsx2 from "clsx";
import { useEffect as useEffect3, useState as useState3 } from "react";

// src/localization/defaults/form.ts
var formTranslation = {
  en: {
    all: "All",
    apply: "Apply",
    back: "Back",
    cancel: "Cancel",
    change: "Change",
    clear: "Clear",
    click: "Click",
    clickToCopy: "Click to Copy",
    close: "Close",
    confirm: "Confirm",
    copy: "Copy",
    copied: "Copied",
    decline: "Decline",
    delete: "Delete",
    discard: "Discard",
    discardChanges: "Discard Changes",
    done: "Done",
    edit: "Edit",
    enterText: "Enter text here",
    error: "Error",
    exit: "Exit",
    fieldRequiredError: "This field is required.",
    invalidEmailError: "Please enter a valid email address.",
    less: "Less",
    loading: "Loading",
    maxLengthError: "Maximum length exceeded.",
    minLengthError: "Minimum length not met.",
    more: "More",
    next: "Next",
    no: "No",
    none: "None",
    of: "of",
    optional: "Optional",
    pleaseWait: "Please wait...",
    previous: "Previous",
    remove: "Remove",
    required: "Required",
    reset: "Reset",
    save: "Save",
    saved: "Saved",
    search: "Search",
    select: "Select",
    selectOption: "Select an option",
    show: "Show",
    showMore: "Show more",
    showLess: "Show less",
    submit: "Submit",
    success: "Success",
    update: "Update",
    unsavedChanges: "Unsaved Changes",
    unsavedChangesSaveQuestion: "Do you want to save your changes?",
    yes: "Yes"
  },
  de: {
    all: "Alle",
    apply: "Anwenden",
    back: "Zur\xFCck",
    cancel: "Abbrechen",
    change: "\xC4ndern",
    clear: "L\xF6schen",
    click: "Klicken",
    clickToCopy: "Zum kopieren klicken",
    close: "Schlie\xDFen",
    confirm: "Best\xE4tigen",
    copy: "Kopieren",
    copied: "Kopiert",
    decline: "Ablehnen",
    delete: "L\xF6schen",
    discard: "Verwerfen",
    discardChanges: "\xC4nderungen Verwerfen",
    done: "Fertig",
    edit: "Bearbeiten",
    enterText: "Text hier eingeben",
    error: "Fehler",
    exit: "Beenden",
    fieldRequiredError: "Dieses Feld ist erforderlich.",
    invalidEmailError: "Bitte geben Sie eine g\xFCltige E-Mail-Adresse ein.",
    less: "Weniger",
    loading: "L\xE4dt",
    maxLengthError: "Maximale L\xE4nge \xFCberschritten.",
    minLengthError: "Mindestl\xE4nge nicht erreicht.",
    more: "Mehr",
    next: "Weiter",
    no: "Nein",
    none: "Nichts",
    of: "von",
    optional: "Optional",
    pleaseWait: "Bitte warten...",
    previous: "Vorherige",
    remove: "Entfernen",
    required: "Erforderlich",
    reset: "Zur\xFCcksetzen",
    save: "Speichern",
    saved: "Gespeichert",
    search: "Suche",
    select: "Select",
    selectOption: "Option ausw\xE4hlen",
    show: "Anzeigen",
    showMore: "Mehr anzeigen",
    showLess: "Weniger anzeigen",
    submit: "Abschicken",
    success: "Erfolg",
    update: "Update",
    unsavedChanges: "Ungespeicherte \xC4nderungen",
    unsavedChangesSaveQuestion: "M\xF6chtest du die \xC4nderungen speichern?",
    yes: "Ja"
  }
};

// src/components/layout-and-navigation/StepperBar.tsx
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
var defaultState = {
  currentStep: 0,
  seenSteps: /* @__PURE__ */ new Set([0])
};
var StepperBar = ({
  overwriteTranslation,
  state,
  numberOfSteps,
  disabledSteps = /* @__PURE__ */ new Set(),
  onChange,
  onFinish,
  finishText,
  showDots = true,
  className = ""
}) => {
  const translation = useTranslation([formTranslation], overwriteTranslation);
  const dots = range(numberOfSteps + 1);
  const { currentStep, seenSteps } = state ?? defaultState;
  const update = (newStep) => {
    seenSteps.add(newStep);
    onChange({ currentStep: newStep, seenSteps });
  };
  return /* @__PURE__ */ jsxs2(
    "div",
    {
      className: clsx2("row justify-between", className),
      children: [
        /* @__PURE__ */ jsx3("div", { className: "row flex-[2] justify-start", children: /* @__PURE__ */ jsxs2(
          SolidButton,
          {
            disabled: currentStep === 0 || disabledSteps.has(currentStep),
            onClick: () => {
              update(currentStep - 1);
            },
            className: "row gap-x-1 items-center justify-center",
            children: [
              /* @__PURE__ */ jsx3(ChevronLeft, { size: 14 }),
              translation("back")
            ]
          }
        ) }),
        /* @__PURE__ */ jsx3("div", { className: "row flex-[5] gap-x-2 justify-center items-center", children: showDots && dots.map((value, index) => {
          const seen = seenSteps.has(index);
          return /* @__PURE__ */ jsx3(
            "div",
            {
              onClick: () => seen && update(index),
              className: clsx2(
                "rounded-full w-4 h-4",
                {
                  "bg-stepperbar-dot-active hover:brightness-75": index === currentStep && seen && !disabledSteps.has(currentStep),
                  "bg-stepperbar-dot-normal hover:bg-stepperbar-dot-active": index !== currentStep && seen && !disabledSteps.has(currentStep),
                  "bg-stepperbar-dot-disabled": !seen || disabledSteps.has(currentStep)
                },
                {
                  "cursor-pointer": seen,
                  "cursor-not-allowed": !seen || disabledSteps.has(currentStep)
                }
              )
            },
            index
          );
        }) }),
        currentStep !== numberOfSteps && /* @__PURE__ */ jsx3("div", { className: "row flex-[2] justify-end", children: /* @__PURE__ */ jsxs2(
          SolidButton,
          {
            onClick: () => update(currentStep + 1),
            className: "row gap-x-1 items-center justify-center",
            disabled: disabledSteps.has(currentStep),
            children: [
              translation("next"),
              /* @__PURE__ */ jsx3(ChevronRight, { size: 14 })
            ]
          }
        ) }),
        currentStep === numberOfSteps && /* @__PURE__ */ jsx3("div", { className: "row flex-[2] justify-end", children: /* @__PURE__ */ jsxs2(
          SolidButton,
          {
            disabled: disabledSteps.has(currentStep),
            onClick: onFinish,
            className: "row gap-x-1 items-center justify-center",
            children: [
              /* @__PURE__ */ jsx3(Check, { size: 14 }),
              finishText ?? translation("confirm")
            ]
          }
        ) })
      ]
    }
  );
};
var StepperBarUncontrolled = ({ state, onChange, ...props }) => {
  const [usedState, setUsedState] = useState3(state ?? defaultState);
  useEffect3(() => {
    setUsedState(state ?? defaultState);
  }, [state]);
  return /* @__PURE__ */ jsx3(
    StepperBar,
    {
      ...props,
      state: usedState,
      onChange: (newState) => {
        setUsedState(newState);
        onChange(newState);
      }
    }
  );
};
export {
  StepperBar,
  StepperBarUncontrolled
};
//# sourceMappingURL=StepperBar.mjs.map