@ahrowe/ui 0.1.5 → 0.1.6
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.
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1831 -1164
- package/dist/index.mjs.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/package/common/iconPicker/iconPicker.d.ts +2 -21
- package/dist/types/package/common/iconPicker/iconPicker.types.d.ts +23 -0
- package/dist/types/package/common/iconPicker/index.d.ts +1 -2
- package/dist/types/package/common/inputDropdown/index.d.ts +1 -0
- package/dist/types/package/common/inputDropdown/inputDropdown.d.ts +2 -0
- package/dist/types/package/common/inputDropdown/inputDropdown.types.d.ts +21 -0
- package/dist/types/package/common/stepper/index.d.ts +1 -2
- package/dist/types/package/common/stepper/stepper.d.ts +2 -25
- package/dist/types/package/common/stepper/stepper.types.d.ts +21 -0
- package/dist/types/package/common/virtualList/index.d.ts +2 -0
- package/dist/types/package/common/virtualList/virtualList.d.ts +14 -0
- package/dist/types/package/common/virtualList/virtualList.types.d.ts +71 -0
- package/dist/types/package/common/wizard/index.d.ts +1 -2
- package/dist/types/package/common/wizard/wizard.d.ts +2 -27
- package/dist/types/package/common/wizard/wizard.types.d.ts +12 -0
- package/dist/types/package/index.d.ts +53 -37
- package/package.json +10 -2
- package/dist/types/package/common/icon/Icon.d.ts +0 -10
- package/dist/types/package/common/icon/index.d.ts +0 -2
- package/dist/types/package/common/icon/svg/can.d.ts +0 -2
- package/dist/types/package/common/inputDropdownModern/index.d.ts +0 -2
- package/dist/types/package/common/inputDropdownModern/inputDropdownModern.d.ts +0 -35
- package/dist/types/package/common/roleManager/index.d.ts +0 -2
- package/dist/types/package/common/roleManager/roleManager.container.d.ts +0 -2
- package/dist/types/package/common/roleManager/roleManager.d.ts +0 -22
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#valuesAfterCreation","#initialValues","#updateListeners","#isSubmitting","#notifyListeners","#debounceTimer","#errors","#value","#touched","#dirty","#label"],"sources":["../package/common/accordion/accordion.types.ts","../package/common/accordion/accordion.module.pcss","../package/common/accordion/accordion.primary.module.pcss","../package/common/accordion/accordion.plain.module.pcss","../package/common/accordion/accordion.tsx","../package/common/actionButtons/actionButtons.module.pcss","../package/common/button/button.module.pcss","../package/common/loading/spinnerLoading/spinnerLoading.module.pcss","../package/common/loading/spinnerLoading/spinnerLoading.tsx","../package/common/loading/spinnerLoading/index.ts","../package/common/button/button.types.ts","../package/common/ripple/ripple.module.pcss","../package/common/ripple/ripple.tsx","../package/common/button/button.tsx","../package/common/actionButtons/actionButtons.tsx","../package/common/interactableDiv/interactableDiv.module.pcss","../package/common/interactableDiv/interactableDiv.tsx","../package/common/interactableDiv/index.ts","../package/common/actionIcon/actionIcon.module.pcss","../package/common/actionIcon/actionIcon.tsx","../package/common/bodyEnd/bodyEnd.tsx","../package/common/card/card.module.pcss","../package/common/card/Card.tsx","../package/common/card/CardHeader.tsx","../package/common/card/CardMedia.tsx","../package/common/card/CardContent.tsx","../package/common/card/CardActions.tsx","../package/common/checkbox/checkbox.module.pcss","../package/common/checkbox/checkbox.tsx","../package/common/chip/chip.module.pcss","../package/common/chip/chip.tsx","../package/common/chip/chipContainer.tsx","../package/common/floatingMenu/floatingMenu.module.pcss","../package/common/floatingMenu/floatingMenu.types.ts","../package/common/floatingMenu/floatingMenu.tsx","../package/common/tooltip/tooltip.module.pcss","../package/common/tooltip/tooltip.tsx","../package/common/input/input.module.pcss","../package/common/input/input.types.ts","../package/common/input/input.tsx","../package/common/colorPicker/colorPicker.module.pcss","../package/common/colorPicker/colorPicker.tsx","../package/common/modal/modal.module.pcss","../package/common/modal/modal.tsx","../package/common/confirmModal/confirmModal.tsx","../package/common/datePicker/components/datePickerMonth/datePickerMonth.module.pcss","../package/services/localization.ts","../package/common/datePicker/dateFunctions.ts","../package/common/datePicker/components/datePickerMonth/datePickerMonth.tsx","../package/common/infiniteBlock/infiniteBlock.module.pcss","../package/common/infiniteBlock/infiniteBlock.tsx","../package/common/dropdown/dropdown.module.pcss","../package/common/dropdown/dropdown.tsx","../package/common/datePicker/datePicker.module.pcss","../package/common/datePicker/datePicker.tsx","../package/common/emptyState/emptyState.module.pcss","../package/common/emptyState/emptyState.tsx","../package/common/fab/components/fabBase/fabBase.module.pcss","../package/common/fab/components/fabBase/fabBase.tsx","../package/common/fab/fab.module.pcss","../package/common/fab/fab.tsx","../package/common/icon/svg/can.jsx","../package/common/icon/Icon.jsx","../package/common/icon/index.js","../package/common/idleManager/idleManager.tsx","../package/common/kanbanBoard/kanbanBoard.module.pcss","../package/common/kanbanBoard/KanbanItem.tsx","../package/common/kanbanBoard/KanbanColumn.tsx","../package/common/kanbanBoard/KanbanBoard.tsx","../package/common/loading/iconLoading/iconLoading.module.pcss","../package/common/loading/iconLoading/iconLoading.tsx","../package/common/loading/iconLoading/index.ts","../package/common/numberInput/numberInput.module.pcss","../package/common/numberInput/numberInput.tsx","../package/common/numberInput/index.ts","../package/common/optionPicker/optionPicker.module.pcss","../package/common/optionPicker/optionPicker.tsx","../package/hooks/useWindowSize.ts","../package/common/overscroll/overscroll.module.pcss","../package/common/overscroll/overscroll.tsx","../package/common/progressBar/progressBar.module.pcss","../package/common/progressBar/progressBar.tsx","../package/common/roomDrawer/roomDrawer.utils.ts","../package/common/roomDrawer/roomDrawer.module.pcss","../package/common/roomDrawer/roomDrawer.tsx","../package/common/scrollbarProvider/scrollbarProvider.module.pcss","../package/common/scrollbarProvider/scrollbarProvider.tsx","../package/common/scrollbarProvider/index.ts","../package/common/searchInput/searchInput.module.pcss","../package/common/searchInput/searchInput.tsx","../package/common/stepper/stepper.module.pcss","../package/common/stepper/stepper.jsx","../package/common/stepper/index.js","../package/services/tenorService.ts","../package/common/tenorPicker/components/gifPreview/gifPreview.module.pcss","../package/common/tenorPicker/components/gifPreview/gifPreview.tsx","../package/common/tenorPicker/components/gifView/gifView.module.pcss","../package/common/tenorPicker/components/gifView/gifView.tsx","../package/common/tenorPicker/tenorPicker.module.pcss","../package/common/tenorPicker/tenorPicker.tsx","../package/common/textarea/textarea.tsx","../package/common/themeProvider/defaultTheme.ts","../package/common/themeProvider/theme.module.pcss","../package/common/themeProvider/themeProvider.tsx","../package/common/themeProvider/useTheme.ts","../package/common/wizard/wizard.module.pcss","../package/common/wizard/wizard.jsx","../package/common/wizard/index.js","../package/common/toast/toastService.ts","../package/services/formValidation/formValidatorGroup.ts","../package/services/formValidation/FormValidatorGroupForm.tsx","../package/services/formValidation/FormValidatorGroupWithForm.tsx","../package/services/formValidation/formValidator.ts","../package/services/regexp.ts","../package/services/formValidation/validators.ts","../package/services/formValidation/validatableComponent.tsx","../package/services/formValidation/useFormValidator.ts","../package/services/formValidation/useFormValidatorGroup.ts"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport type { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';\n\nexport enum AccordionStyleType {\n Default = 'default',\n Primary = 'primary',\n Plain = 'plain',\n}\n\nexport type AccordionSlots = 'root' | 'header' | 'title' | 'icon' | 'body' | 'bodyInner';\n\nexport interface AccordionProps extends HtmlProps {\n title?: string;\n children?: ReactNode;\n expanded?: boolean | null;\n onHeaderClicked?: (id: string, isExpanded: boolean) => void;\n styleType?: AccordionStyleType;\n startOpen?: boolean;\n hideHeader?: boolean;\n className?: string;\n style?: CSSProperties;\n classNames?: SlotClassNames<AccordionSlots>;\n styles?: SlotStyles<AccordionSlots>;\n}\n","\n.accordion {\n transition: margin 0.2s;\n margin: -1px;\n color: var(--text-color);\n\n &-title {\n width: 100%;\n }\n\n &-active {\n margin: 10px 0;\n }\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n background: var(--background);\n border-radius: var(--default-border-radius);\n border: 1px solid var(--border-color);\n font-size: 16px;\n font-weight: 400;\n transition: all 0.2s;\n\n &-active {\n border: 1px solid var(--primary-color);\n background: var(--background-accent);\n border-radius: var(--default-border-radius) var(--default-border-radius) 0px 0px;\n }\n }\n\n &-body {\n overflow: hidden;\n transition: all 0.2s ease;\n position: relative;\n border-radius: 0px 0px var(--default-border-radius) var(--default-border-radius);\n border: 1px solid var(--border-color);\n border-top: none;\n border-bottom: none;\n\n &-inner {\n padding: 16px;\n }\n\n &-active {\n border: 1px solid var(--primary-color);\n border-top: none;\n }\n }\n\n &-icon {\n transition: transform 0.2s;\n transform: rotate(0deg);\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n color: var(--border-color);\n &-active {\n transform: rotate(180deg);\n }\n }\n}\n","\n.accordion {\n transition: margin 0.2s;\n margin: -1px;\n\n &-title {\n width: 100%;\n }\n\n &-active {\n margin: 10px 0;\n border: 2px solid var(--primary-color);\n border-radius: var(--default-border-radius);\n }\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n background: var(--background);\n border-radius: var(--default-border-radius);\n font-size: 16px;\n font-weight: 400;\n transition: all 0.2s;\n\n &-active {\n background: var(--background-accent);\n border-radius: var(--default-border-radius) var(--default-border-radius) 0px 0px;\n }\n }\n\n &-body {\n overflow: hidden;\n transition: all 0.2s ease;\n position: relative;\n border-radius: 0px 0px var(--default-border-radius) var(--default-border-radius);\n border-top: none;\n border-bottom: none;\n\n &-inner {\n padding: 16px;\n }\n\n &-active {\n border-top: none;\n }\n }\n\n &-icon {\n transition: transform 0.2s;\n transform: rotate(0deg);\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n color: var(--primary-color);\n &-active {\n transform: rotate(180deg);\n }\n }\n}\n","\n.accordion {\n transition: margin 0.2s;\n margin: -1px;\n\n &-title {\n width: 100%;\n }\n\n &-active {\n margin: 10px 0;\n }\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n border-radius: var(--default-border-radius);\n font-size: 16px;\n font-weight: 400;\n transition: all 0.2s;\n\n &-active {\n border-radius: var(--default-border-radius) var(--default-border-radius) 0px 0px;\n }\n }\n\n &-body {\n overflow: hidden;\n transition: all 0.2s ease;\n position: relative;\n border-radius: 0px 0px var(--default-border-radius) var(--default-border-radius);\n\n &-inner {\n padding: 0px;\n }\n }\n\n &-icon {\n transition: transform 0.2s;\n transform: rotate(0deg);\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n color: var(--primary-color);\n &-active {\n transform: rotate(180deg);\n }\n }\n}\n","import React, { useState, useEffect, useRef, type ReactElement } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown as arrowIcon } from '@fortawesome/free-solid-svg-icons';\n\nimport { AccordionStyleType, type AccordionProps } from './accordion.types';\n\nimport defaultStyles from './accordion.module.pcss';\nimport primaryStyles from './accordion.primary.module.pcss';\nimport plainStyles from './accordion.plain.module.pcss';\n\nconst STYLES_BY_TYPE: Record<AccordionStyleType, typeof defaultStyles> = {\n [AccordionStyleType.Default]: defaultStyles,\n [AccordionStyleType.Primary]: primaryStyles,\n [AccordionStyleType.Plain]: plainStyles,\n};\n\nfunction Accordion({\n id = '',\n title = '',\n children = null,\n expanded = null,\n onHeaderClicked = () => {},\n styleType = AccordionStyleType.Default,\n startOpen = false,\n hideHeader = false,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: AccordionProps): ReactElement {\n const s = STYLES_BY_TYPE[styleType];\n const bodyRef = useRef<HTMLDivElement>(null);\n\n const [isExpanded, setIsExpanded] = useState(expanded ?? startOpen);\n const [bodyHeight, setBodyHeight] = useState<number | null>(null);\n\n // Sync controlled expanded prop\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n if (expanded !== null) setIsExpanded(expanded);\n }, [expanded]);\n\n // Measure body height via ResizeObserver\n useEffect(() => {\n const el = bodyRef.current;\n if (!el) return;\n const observer = new ResizeObserver(() => setBodyHeight(el.offsetHeight));\n observer.observe(el);\n return () => observer.unobserve(el);\n }, []);\n\n function toggleExpanded() {\n const next = !isExpanded;\n onHeaderClicked(id, next);\n if (expanded === null) setIsExpanded(next);\n }\n\n const headerHeight = 24;\n const headerStyle = { height: `${isExpanded ? headerHeight + headerHeight / 3 : headerHeight}px` };\n const bodyStyle = { height: isExpanded ? (bodyHeight ?? 'auto') : '0px' };\n\n return (\n <div {...rest} id={id || undefined} className={cx(s.accordion, isExpanded && s.accordionActive, className, classNames?.root)} style={{ ...style, ...slotStyles?.root }}>\n {!hideHeader && (\n <div\n className={cx(s.accordionHeader, isExpanded && s.accordionHeaderActive, classNames?.header)}\n style={{ ...headerStyle, ...slotStyles?.header }}\n onClick={toggleExpanded}\n role=\"button\"\n tabIndex={0}\n onKeyDown={({ key }) => { if (key === 'Enter') toggleExpanded(); }}\n >\n <div className={cx(s.accordionTitle, classNames?.title)} style={slotStyles?.title}>{title}</div>\n <FontAwesomeIcon\n icon={arrowIcon}\n className={cx(s.accordionIcon, isExpanded && s.accordionIconActive, classNames?.icon)}\n style={slotStyles?.icon as React.CSSProperties & Record<`--fa-font-${string}`, string>}\n />\n </div>\n )}\n <div\n className={cx(s.accordionBody, isExpanded && s.accordionBodyActive, classNames?.body)}\n style={{ ...bodyStyle, ...slotStyles?.body }}\n >\n <div className={cx(s.accordionBodyInner, classNames?.bodyInner)} style={slotStyles?.bodyInner} ref={bodyRef}>\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nexport default Accordion;\n","\n.actionButtons {\n display: flex;\n gap: var(--spacing-m);\n\n @media (--mq-mobile) {\n flex-direction: column;\n }\n\n &-margin {\n margin-top: var(--spacing-l);\n }\n}\n",".button {\n appearance: none;\n -webkit-appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n background: transparent;\n color: var(--text-color);\n border: none;\n padding: 0;\n font-family: var(--default-font);\n border-radius: var(--default-border-radius);\n cursor: pointer;\n position: relative;\n overflow: hidden;\n\n &-notAllowed {\n cursor: not-allowed;\n filter: opacity(0.8);\n }\n\n &-loading-icon {\n width: 100% !important;\n height: 100% !important;\n }\n\n &-content {\n position: relative;\n white-space: break-spaces;\n\n div {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n &-loading {\n visibility: hidden;\n\n &-container {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n &-withIcon {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n }\n\n &-style {\n &-default {\n /* Default button is unstyled */\n }\n\n &-primary {\n background: var(--primary-color);\n color: var(--text-color);\n color: var(--text-on-primary);\n\n .button-loading-icon {\n stroke: var(--text-on-primary);\n }\n }\n\n &-delete {\n background: var(--error-color);\n color: var(--text-on-delete);\n\n .button-loading-icon {\n stroke: var(--text-on-delete);\n }\n }\n }\n\n &-background {\n display: block;\n padding: 8px 12px;\n }\n\n &-size {\n &-default {\n font-size: 16px;\n }\n\n &-small {\n /* Small button is same as default for now */\n font-size: 12px;\n\n &-background {\n display: block;\n padding: 0px;\n }\n }\n\n &-medium {\n /* Medium button is same as default for now */\n font-size: 16px;\n }\n\n &-large {\n /* Large button is same as default for now */\n font-size: 20px;\n }\n }\n}\n",".spinner-loading {\n width: 70px;\n height: 70px;\n\n circle {\n stroke-dasharray: 283;\n stroke-dashoffset: 281;\n stroke-linecap: round;\n animation:\n animate-spinner 2s cubic-bezier(0.89, 0.01, 0.12, 1) infinite,\n spin 3s linear infinite;\n transform-origin: center;\n }\n\n @keyframes animate-spinner {\n 0% {\n stroke-dashoffset: 281;\n }\n\n 50% {\n stroke-dashoffset: 0;\n }\n\n 100% {\n stroke-dashoffset: -281;\n }\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n }\n}\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport styles from './spinnerLoading.module.pcss';\n\ninterface Properties {\n className?: string | undefined;\n}\n\nfunction SpinnerLoading({ className }: Properties): ReactElement {\n return (\n <svg\n data-testid=\"spinner\"\n className={cx(styles.spinnerLoading, className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\"\n fill=\"none\"\n stroke=\"var(--primary-color)\"\n >\n <circle cx=\"50\" cy=\"50\" r=\"45\" strokeWidth=\"10\" />\n </svg>\n );\n}\n\nSpinnerLoading.defaultProps = {\n className: undefined,\n};\n\nexport default SpinnerLoading;\n","import SpinnerLoading from './spinnerLoading';\n\nexport default SpinnerLoading;\n","import type { CSSProperties } from 'react';\nimport type { IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport type { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';\n\nexport enum ButtonStyleType {\n Primary = 'primary',\n Default = 'default',\n Delete = 'delete',\n}\n\nexport enum ButtonSize {\n Default = 'default',\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n}\n\nexport enum ButtonType {\n Button = 'button',\n Reset = 'reset',\n Submit = 'submit',\n}\n\nexport type ButtonSlots = 'background' | 'content' | 'loadingContainer' | 'label';\n\nexport interface ButtonProps extends HtmlProps {\n className?: string;\n style?: CSSProperties;\n type?: ButtonType;\n styleType?: ButtonStyleType;\n size?: ButtonSize;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => Promise<void> | void;\n children?: React.ReactNode;\n icon?: IconDefinition;\n isLoading?: boolean;\n disabled?: boolean;\n title?: string;\n ref?: React.Ref<HTMLButtonElement>;\n classNames?: SlotClassNames<ButtonSlots>;\n styles?: SlotStyles<ButtonSlots>;\n}\n",".ripple {\n background: rgba(255, 255, 255, 0.2);\n border-radius: 1000px;\n width: 100%;\n aspect-ratio: 1;\n position: absolute;\n left: 0;\n top: 0;\n transform: translate(-50%, -50%) scale(0);\n animation: ripple var(--ripple-animation-length) linear forwards;\n\n &-container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n border-radius: inherit;\n user-select: none;\n pointer-events: none;\n }\n\n @keyframes ripple {\n to {\n transform: translate(-50%, -50%) scale(4);\n opacity: 0;\n }\n }\n}\n","import React, { useRef, useEffect, useImperativeHandle, forwardRef } from 'react';\n\nimport styles from './ripple.module.pcss';\nimport type { RippleProps, RippleHandle } from './ripple.types';\n\nexport type { RippleProps, RippleHandle };\n\nconst Ripple = forwardRef<RippleHandle, RippleProps>(function Ripple({\n disabled = false,\n children,\n className,\n style,\n overflowHidden = true,\n rippleAnimationLength = 0.6,\n rippleBackground = 'rgba(255, 255, 255, 0.2)',\n manualOnly = false,\n ...rest\n}, ref) {\n const containerRef = useRef<HTMLDivElement>(null);\n const addRippleRef = useRef<((event: MouseEvent) => void) | null>(null);\n\n function spawnRipple(x: number, y: number) {\n if (disabled) return;\n const ripple = document.createElement('div');\n ripple.style.left = `${x}px`;\n ripple.style.top = `${y}px`;\n ripple.style.background = rippleBackground;\n ripple.classList.add(styles.ripple);\n containerRef.current?.appendChild(ripple);\n setTimeout(() => {\n containerRef.current?.removeChild(ripple);\n }, rippleAnimationLength * 1000 + 50);\n }\n\n function addRipple(event: MouseEvent | React.MouseEvent) {\n if (!containerRef.current) return;\n const pos = containerRef.current.getBoundingClientRect();\n spawnRipple(event.clientX - pos.x, event.clientY - pos.y);\n }\n\n useImperativeHandle(ref, () => ({\n addRipple() {\n const el = containerRef.current;\n if (!el) return;\n spawnRipple(el.offsetWidth / 2, el.offsetHeight / 2);\n },\n }));\n\n useEffect(() => {\n addRippleRef.current = addRipple;\n });\n\n useEffect(() => {\n if (children !== undefined || manualOnly) return;\n const parent = containerRef.current?.parentElement;\n if (!parent) return;\n const handler = (e: MouseEvent) => addRippleRef.current?.(e);\n parent.addEventListener('click', handler);\n return () => parent.removeEventListener('click', handler);\n }, [children, manualOnly]);\n\n const containerStyle: React.CSSProperties & { '--ripple-animation-length'?: string } = {\n '--ripple-animation-length': `${rippleAnimationLength}s`,\n };\n\n if (children !== undefined) {\n return (\n <div\n {...rest}\n className={className}\n onClick={manualOnly ? undefined : (e) => addRipple(e)}\n style={{\n position: 'relative',\n overflow: overflowHidden ? 'hidden' : 'visible',\n ...style,\n }}\n >\n {children}\n <div\n className={styles.rippleContainer}\n ref={containerRef}\n style={containerStyle}\n />\n </div>\n );\n }\n\n return (\n <div\n className={styles.rippleContainer}\n ref={containerRef}\n style={{\n overflow: overflowHidden ? 'hidden' : 'visible',\n ...containerStyle,\n }}\n />\n );\n});\n\nexport default Ripple;\n","import cx from 'classnames';\nimport type { ReactElement } from 'react';\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport styles from './button.module.pcss';\nimport SpinnerLoading from 'components/common/loading/spinnerLoading';\nimport { ButtonStyleType, ButtonSize, ButtonType } from './button.types';\nimport type { ButtonProps } from './button.types';\nimport Ripple from '../ripple';\n\nconst CLASS_BY_STYLE: Record<ButtonStyleType, string> = {\n default: styles.buttonStyleDefault,\n primary: styles.buttonStylePrimary,\n delete: styles.buttonStyleDelete,\n};\n\nconst CLASS_BY_SIZE: Record<ButtonSize, string> = {\n default: styles.buttonSizeDefault,\n small: styles.buttonSizeSmall,\n medium: styles.buttonSizeMedium,\n large: styles.buttonSizeLarge,\n};\n\nfunction Button({\n className,\n style,\n type = ButtonType.Button,\n styleType = ButtonStyleType.Default,\n size = ButtonSize.Default,\n onClick = (): void => {},\n children,\n icon,\n isLoading = false,\n disabled = false,\n title = undefined,\n ref,\n classNames,\n styles: slotStyles,\n ...rest\n}: ButtonProps): ReactElement {\n return (\n <button\n {...rest}\n className={cx(\n styles.button,\n CLASS_BY_STYLE[styleType],\n CLASS_BY_SIZE[size],\n {\n [styles.buttonNotAllowed]: isLoading || disabled,\n },\n className\n )}\n style={style}\n type={type}\n onClick={onClick}\n disabled={disabled || isLoading}\n title={title}\n ref={ref}\n >\n <Ripple disabled={isLoading || disabled}>\n <div className={cx(styles.buttonBackground, classNames?.background)} style={slotStyles?.background}>\n <div className={cx(styles.buttonContent, classNames?.content)} style={slotStyles?.content}>\n {isLoading ? (\n <div className={cx(styles.buttonLoadingContainer, classNames?.loadingContainer)} style={slotStyles?.loadingContainer}>\n <SpinnerLoading className={styles.buttonLoadingIcon} />\n </div>\n ) : null}\n <div\n className={cx(classNames?.label, {\n [styles.buttonLoading]: isLoading,\n [styles.buttonWithIcon]: !!icon,\n })}\n style={slotStyles?.label}\n >\n {icon ? <FontAwesomeIcon icon={icon} /> : null}\n {children}\n </div>\n </div>\n </div>\n </Ripple>\n </button>\n );\n}\n\nButton.StyleType = ButtonStyleType;\nButton.Size = ButtonSize;\nButton.Type = ButtonType;\n\nexport default Button;\n","import cx from 'classnames';\n\nimport styles from './actionButtons.module.pcss';\nimport Button, { ButtonStyleType, ButtonType } from '../button';\nimport { ActionButtonsProps } from './actionButtons.types';\n\nexport default function ActionButtons({\n onSubmit = () => null,\n onClose = () => null,\n submitLabel = 'Save',\n cancelLabel = 'Cancel',\n submitButtonStyle = ButtonStyleType.Primary,\n isSubmitButtonLoading = false,\n isSubmitButtonDisabled = false,\n isCancelButtonLoading = false,\n isCancelButtonDisabled = false,\n hidePrimaryButton = false,\n hideSecondaryButton = false,\n noMargin = false,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: ActionButtonsProps) {\n return (\n <div\n {...rest}\n className={cx(styles.actionButtons, !noMargin && styles.actionButtonsMargin, className, classNames?.root)}\n style={{ ...style, ...slotStyles?.root }}\n >\n {!hidePrimaryButton && (\n <Button\n isLoading={isSubmitButtonLoading}\n disabled={isSubmitButtonDisabled}\n styleType={submitButtonStyle}\n type={ButtonType.Submit}\n onClick={onSubmit}\n className={classNames?.submitButton}\n style={slotStyles?.submitButton}\n >\n {submitLabel}\n </Button>\n )}\n {!hideSecondaryButton && (\n <Button\n isLoading={isCancelButtonLoading}\n disabled={isCancelButtonDisabled}\n onClick={onClose}\n styleType={ButtonStyleType.Default}\n className={classNames?.cancelButton}\n style={slotStyles?.cancelButton}\n >\n {cancelLabel}\n </Button>\n )}\n </div>\n );\n}",".interactableDiv {\n}\n","import cx from 'classnames';\nimport React, {\n ReactNode,\n useCallback,\n type KeyboardEvent,\n type KeyboardEventHandler,\n type MouseEvent,\n type MouseEventHandler,\n type ReactElement,\n} from 'react';\n\nimport styles from './interactableDiv.module.pcss';\nimport type { HtmlProps } from '../types/baseProps.types';\n\ninterface Properties extends HtmlProps {\n className?: string | undefined;\n children?: ReactNode | undefined;\n onClick?: MouseEventHandler<HTMLDivElement> | undefined;\n onKeyDown?: KeyboardEventHandler<HTMLDivElement> | undefined;\n style?: React.CSSProperties | undefined;\n tabIndex?: number | null;\n title?: string | undefined;\n}\n\nconst InteractableDiv = React.forwardRef<HTMLDivElement, Properties>(\n ({ className, children, onClick, onKeyDown, tabIndex = 0, title, ...props }, ref): ReactElement => {\n const onKeyDownHandler = useCallback(\n (e: KeyboardEvent<HTMLDivElement> | MouseEvent<HTMLDivElement>) => {\n if ((e as React.KeyboardEvent).key === 'Enter') {\n onClick?.(e as MouseEvent<HTMLDivElement>);\n }\n onKeyDown?.(e as KeyboardEvent<HTMLDivElement>);\n },\n [onClick, onKeyDown]\n );\n\n return (\n <div\n className={cx(styles.interactableDiv, className)}\n onClick={onClick}\n tabIndex={tabIndex == undefined ? 0 : tabIndex}\n role=\"button\"\n onKeyDown={onKeyDownHandler}\n ref={ref}\n title={title}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nInteractableDiv.displayName = 'InteractableDiv';\n\nexport default InteractableDiv;\n","import InteractableDiv from './interactableDiv';\n\nexport default InteractableDiv;\n",".actionIcon {\n cursor: pointer;\n padding: 4px;\n &:hover {\n filter: brightness(0.8);\n }\n}\n","import React from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { ReactElement } from 'react';\n\nimport InteractableDiv from '../interactableDiv';\nimport type { ActionIconProps } from './actionIcon.types';\nimport styles from './actionIcon.module.pcss';\n\nfunction ActionIcon({\n icon,\n className = '',\n style,\n title = '',\n onClick = () => {},\n classNames,\n styles: slotStyles,\n ...rest\n}: ActionIconProps): ReactElement {\n return (\n <InteractableDiv\n {...rest}\n className={cx(styles.actionIcon, className, classNames?.root)}\n style={{ ...style, ...slotStyles?.root }}\n title={title}\n onClick={onClick}\n >\n <FontAwesomeIcon\n icon={icon}\n className={classNames?.icon}\n style={slotStyles?.icon as React.CSSProperties & Record<`--fa-font-${string}`, string>}\n />\n </InteractableDiv>\n );\n}\n\nexport default ActionIcon;\n","import { createPortal } from 'react-dom';\nimport type { ReactElement } from 'react';\n\nimport type { BodyEndProps } from './bodyEnd.types';\n\n// Module-scoped ambient typing for the bundler-replaced NODE_ENV guard below.\n// Browsers don't define `process`, so the value is read defensively at runtime;\n// bundlers (Vite/webpack) still statically replace the `process.env.NODE_ENV`\n// token. Declared at module scope (not globally), it isn't emitted into the\n// .d.ts and can't clash with a consumer's @types/node.\ndeclare const process: { env: { NODE_ENV?: string } };\n\nfunction BodyEnd({ children = null }: BodyEndProps): ReactElement | null {\n const target = document.getElementById('bodyEnd');\n if (!target) {\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production') {\n console.error('[BodyEnd] No element with id=\"bodyEnd\" found. Add <div id=\"bodyEnd\"></div> to your app root.');\n }\n return null;\n }\n return createPortal(children, target);\n}\n\nexport default BodyEnd;\n",".card {\n border-radius: var(--default-border-radius);\n background: var(--background-accent-light);\n color: var(--text-color);\n overflow: hidden;\n\n &-padding {\n padding: 16px;\n }\n\n &-shadow {\n box-shadow: var(--card-shadow);\n }\n\n &-interactable {\n cursor: pointer;\n }\n\n &-hover {\n transition:\n transform 0.15s ease,\n box-shadow 0.15s ease,\n filter 0.3s ease;\n\n &:hover {\n transform: translateY(-2px);\n background: var(--background-accent);\n }\n }\n}\n\n.cardHeader {\n display: flex;\n gap: 16px;\n /* margin-bottom: 16px; */\n align-items: center;\n\n &-thumbnail {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 40px;\n height: 40px;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 40px;\n overflow: hidden;\n background-size: cover;\n background-position: center;\n flex-shrink: 0;\n }\n\n &-titles {\n display: flex;\n flex-flow: column;\n flex: 1;\n gap: 4px;\n overflow: hidden;\n\n &-main {\n font-size: 18px;\n font-weight: 600;\n }\n\n &-sub {\n font-weight: 300;\n }\n }\n}\n\n.cardMedia {\n width: calc(100% + 32px);\n margin: 0 -16px 0 -16px;\n}\n\n.cardActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n","import cx from 'classnames';\n\nimport { type CardProps } from './card.types';\nimport styles from './card.module.pcss';\nimport InteractableDiv from '../interactableDiv';\nimport Ripple from '../ripple';\n\nfunction Card({\n className = undefined,\n children = null,\n onClick = undefined,\n tabIndex = null,\n hoverEffect = undefined,\n style = undefined,\n ...rest\n}: CardProps) {\n const isInteractable = !!onClick;\n\n return (\n <InteractableDiv\n {...rest}\n className={cx(\n styles.card,\n styles.cardPadding,\n styles.cardShadow,\n isInteractable && styles.cardInteractable,\n ((isInteractable && hoverEffect !== false) || hoverEffect) && styles.cardHover,\n className\n )}\n onClick={onClick}\n tabIndex={tabIndex ?? (isInteractable ? 0 : null)}\n style={style}\n >\n <Ripple disabled={!isInteractable} overflowHidden={false}>\n {children}\n </Ripple>\n </InteractableDiv>\n );\n}\n\nexport default Card;\n","import React from 'react';\nimport cx from 'classnames';\n\nimport type { CardHeaderProps } from './card.types';\nimport styles from './card.module.pcss';\n\nfunction CardHeader({\n className = '',\n title = '',\n subTitle = '',\n thumbnail = '',\n}: CardHeaderProps) {\n const thumbnailUrl =\n typeof thumbnail === 'string' && thumbnail.startsWith('http') ? thumbnail : undefined;\n\n return (\n <div className={cx(styles.cardHeader, className)}>\n {thumbnail && (\n <div\n className={styles.cardHeaderThumbnail}\n style={thumbnailUrl ? { backgroundImage: `url(${thumbnailUrl})` } : {}}\n >\n {!thumbnailUrl && thumbnail}\n </div>\n )}\n <div className={styles.cardHeaderTitles}>\n <div className={styles.cardHeaderTitlesMain}>{title}</div>\n <div className={styles.cardHeaderTitlesSub}>{subTitle}</div>\n </div>\n </div>\n );\n}\n\nexport default CardHeader;\n","import React from 'react';\n\nimport type { CardMediaProps } from './card.types';\nimport styles from './card.module.pcss';\n\nfunction CardMedia({ src = '', alt = '' }: CardMediaProps) {\n return <img className={styles.cardMedia} src={src} alt={alt} />;\n}\n\nexport default CardMedia;\n","import React from 'react';\n\nimport type { CardContentProps } from './card.types';\n\nfunction CardContent({ children = null }: CardContentProps) {\n return <>{children}</>;\n}\n\nexport default CardContent;\n","import React from 'react';\nimport cx from 'classnames';\nimport Button from '../button';\nimport { ButtonStyleType } from '../button/button.types';\n\nimport type { CardActionsProps } from './card.types';\nimport styles from './card.module.pcss';\n\nfunction CardActions({ className = '', actions = [], children = null }: CardActionsProps) {\n return (\n <div className={cx(styles.cardActions, className)}>\n {actions.map(({ id, onClick, label, styleType = ButtonStyleType.Default }) => (\n <div key={id ?? label}>\n <Button onClick={onClick} styleType={styleType}>\n {label}\n </Button>\n </div>\n ))}\n {children}\n </div>\n );\n}\n\nexport default CardActions;\n","\n.checkbox {\n user-select: none;\n display: flex;\n align-items: center;\n column-gap: 10px;\n margin: -1px;\n border: 1px solid transparent;\n width: fit-content;\n\n &-icon {\n color: #a3a9b9;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background-color: var(--light-background-color);\n width: fit-content;\n height: fit-content;\n /* width: 16px;\n height: 16px; */\n }\n\n &-loading {\n background: transparent;\n\n &-spinner {\n width: 100%;\n height: 100%;\n }\n }\n\n &-pointer {\n cursor: pointer;\n }\n\n &:focus-visible {\n outline: none;\n border: 1px solid var(--primary-color);\n border-radius: 6px;\n }\n\n &-disabled {\n filter: brightness(0.8);\n cursor: not-allowed;\n }\n\n &-checkmark {\n border: 1.8px solid var(--text-color);\n border-radius: var(--default-border-radius);\n position: relative;\n\n svg {\n stroke: var(--text-on-primary);\n stroke-dasharray: 5;\n stroke-dashoffset: 5;\n transition:\n transform 0.1s,\n stroke-dashoffset 0.4s;\n transition-delay: 0s, 0.2s;\n background: var(--primary-color);\n transform: scale(0);\n box-sizing: content-box;\n padding: 2px;\n border-radius: var(--default-border-radius);\n }\n\n &-checked {\n svg {\n stroke-dashoffset: 0;\n transform: scale(1) translate(-3px, -3px);\n }\n }\n }\n}\n","import { useRef, useEffect, useState, type ReactElement } from 'react';\nimport cx from 'classnames';\nimport Ripple from 'components/common/ripple';\nimport SpinnerLoading from '../loading/spinnerLoading';\n\nimport type { CheckboxProps } from './checkbox.types';\nimport styles from './checkbox.module.pcss';\n\nfunction Checkbox({\n label = '',\n selected = false,\n onToggle = () => {},\n className = '',\n style,\n disabled = false,\n lineHeight = '',\n title = '',\n tabIndex = 0,\n cursorDefault = false,\n width = '17px',\n height = '17px',\n formValidator = null,\n children = null,\n background = null,\n isLoading = false,\n classNames,\n styles: slotStyles,\n ...rest\n}: CheckboxProps): ReactElement {\n const rippleRef = useRef<{ addRipple: () => void }>(null);\n const [, forceUpdate] = useState(0);\n\n useEffect(() => {\n if (!formValidator) return;\n const listener = () => forceUpdate((n) => n + 1);\n formValidator.registerOnUpdateListener(listener);\n return () => formValidator.removeOnUpdateListener(listener);\n }, [formValidator]);\n\n function handleToggle(event?: React.MouseEvent | React.KeyboardEvent) {\n if (disabled || isLoading) return;\n rippleRef.current?.addRipple();\n if (formValidator) {\n formValidator.set(!formValidator.value);\n }\n onToggle(!selected, event);\n }\n\n const currSelected = (formValidator ? formValidator.value : selected) as boolean;\n\n return (\n <div\n {...rest}\n className={cx(\n styles.checkbox,\n {\n [styles.checkboxDisabled]: disabled,\n [styles.checkboxPointer]: !cursorDefault,\n },\n className\n )}\n style={style}\n onClick={handleToggle}\n onKeyPress={(e) => { if (e.key === 'Enter') handleToggle(e); }}\n role=\"checkbox\"\n aria-checked={currSelected}\n tabIndex={tabIndex}\n >\n <div\n title={title}\n className={cx(styles.checkboxIcon, isLoading ? styles.checkboxLoading : null, classNames?.icon)}\n style={slotStyles?.icon}\n >\n {isLoading ? (\n <div style={{ width, height }}>\n <SpinnerLoading className={styles.checkboxLoadingSpinner} />\n </div>\n ) : (\n <div\n style={{ width, height, ...slotStyles?.checkmark }}\n className={cx(\n styles.checkboxCheckmark,\n currSelected && styles.checkboxCheckmarkChecked,\n classNames?.checkmark\n )}\n >\n <Ripple\n ref={rippleRef}\n manualOnly\n overflowHidden={false}\n rippleAnimationLength={0.3}\n rippleBackground=\"radial-gradient(transparent, var(--primary-color))\"\n />\n <svg\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"-0.5 -1.5 4 2.6\"\n width={`calc(${width} + 1px)`}\n height={`calc(${height} + 1px)`}\n {...(background ? { style: { background } } : {})}\n >\n <path d=\"M 0 0 l 1 1 l 2 -2\" strokeWidth=\"0.4\" fill=\"none\" />\n </svg>\n </div>\n )}\n </div>\n <div className={classNames?.label} style={{ lineHeight: lineHeight || '100%', ...slotStyles?.label }}>{children || label}</div>\n </div>\n );\n}\n\nexport default Checkbox;\n",".chip {\n background: rgba(0, 0, 0, 0.08);\n border-radius: 99999px;\n width: fit-content;\n position: relative;\n box-sizing: border-box;\n max-width: 100%;\n\n &-clickable {\n cursor: pointer;\n }\n\n &-inner {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 4px 8px;\n\n & > * {\n white-space: nowrap;\n }\n }\n\n &-text {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n &-thumbnail {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 18px;\n height: 18px;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 18px;\n overflow: hidden;\n background-size: cover;\n }\n\n &-container {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n\n &-inline {\n flex-wrap: nowrap;\n overflow: auto;\n }\n }\n}\n","import React, { useMemo } from 'react';\nimport { faXmarkCircle } from '@fortawesome/free-solid-svg-icons';\nimport cx from 'classnames';\n\nimport Ripple from '../ripple';\nimport ActionIcon from '../actionIcon';\nimport { ChipProps } from './chip.types';\n\nimport styles from './chip.module.pcss';\n\nfunction Chip({\n className = '',\n thumbnail = '',\n text = '',\n showRemoveIcon = false,\n onClick,\n onRemove,\n ...rest\n}: ChipProps) {\n const thumbnailUrl = useMemo(() => {\n if (typeof thumbnail === 'string' && thumbnail.startsWith('http')) return thumbnail;\n return undefined;\n }, [thumbnail]);\n\n return (\n <div {...rest} className={cx(styles.chip, onClick && styles.chipClickable, className)} onClick={onClick}>\n <Ripple disabled={!onClick} style={{ borderRadius: 'inherit' }}>\n <div className={styles.chipInner}>\n {thumbnail && (\n <div\n className={styles.chipThumbnail}\n style={thumbnailUrl ? { backgroundImage: `url(${thumbnailUrl})` } : {}}\n >\n {!thumbnailUrl && thumbnail}\n </div>\n )}\n <div className={styles.chipText}>{text}</div>\n {showRemoveIcon && <ActionIcon icon={faXmarkCircle} onClick={(e) => { e.stopPropagation(); onRemove?.(); }} />}\n </div>\n </Ripple>\n </div>\n );\n}\n\nexport default Chip;\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport { ChipContainerProps } from './chip.types';\nimport styles from './chip.module.pcss';\n\nfunction ChipContainer({\n className = undefined,\n children = null,\n inline = false,\n ...rest\n}: ChipContainerProps): ReactElement {\n return (\n <div {...rest} className={cx(styles.chipContainer, inline && styles.chipContainerInline, className)}>\n {children}\n </div>\n );\n}\n\nexport default ChipContainer;\n",".floatingMenu {\n position: relative;\n\n &-content {\n cursor: pointer;\n }\n\n &-container {\n box-shadow:\n 0 2px 4px -1px #0003,\n 0 4px 5px #00000024,\n 0 1px 10px #0000001f;\n position: absolute;\n margin-top: 10px;\n background: var(--background-modal);\n padding: 8px;\n border-radius: calc(var(--default-border-radius) + 4px);\n\n &-align {\n &-left {\n left: 0px;\n }\n\n &-right {\n right: 0px;\n }\n\n &-center {\n left: 50%;\n transform: translateX(-50%);\n }\n }\n\n &-flag {\n box-shadow:\n 0 2px 4px -1px #0003,\n 0 4px 5px #00000024,\n 0 1px 10px #0000001f;\n background: var(--background-modal);\n height: 10px;\n width: 10px;\n position: absolute;\n margin-top: 5px;\n transform: rotate(45deg);\n\n &-align-right {\n right: 8px;\n }\n\n &-align-left {\n left: 8px;\n }\n\n &-align-center {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n }\n }\n }\n\n &-anim {\n transform: scale(0.7);\n opacity: 0.7;\n animation: showMenu 0.1s forwards;\n position: fixed;\n z-index: 2;\n }\n\n @keyframes showMenu {\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport type { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';\n\nexport enum Align {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n}\n\nexport type FloatingMenuSlots = 'root' | 'trigger' | 'menu' | 'menuContainer';\n\nexport interface FloatingMenuProps extends HtmlProps {\n align?: Align;\n children?: ReactNode;\n content?: ReactNode;\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n dontCloseOnChildClick?: boolean;\n className?: string;\n style?: CSSProperties;\n classNames?: SlotClassNames<FloatingMenuSlots>;\n styles?: SlotStyles<FloatingMenuSlots>;\n}","import { useRef, useEffect, useState } from 'react';\nimport cx from 'classnames';\n\nimport styles from './floatingMenu.module.pcss';\nimport { Align, FloatingMenuProps } from './floatingMenu.types';\n\nfunction capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction FloatingMenu({\n align = Align.Left,\n children = null,\n content = null,\n isOpen = false,\n onOpenChange = () => {},\n dontCloseOnChildClick = false,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: FloatingMenuProps) {\n const menuContainerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const onOpenChangeRef = useRef(onOpenChange);\n const [triggerWidth, setTriggerWidth] = useState(10);\n const [pickerPos, setPickerPos] = useState<{ top: number; left: number } | null>(null);\n\n // Keep the callback ref current without adding it to the effect deps\n useEffect(() => { onOpenChangeRef.current = onOpenChange; });\n\n function handleTriggerClick() {\n if (!isOpen) {\n const rect = triggerRef.current?.getBoundingClientRect();\n setTriggerWidth(rect?.width ?? 10);\n setPickerPos(rect ? { top: rect.bottom, left: rect.left } : null);\n onOpenChange(true);\n }\n }\n\n useEffect(() => {\n if (!isOpen) return;\n\n function updatePos() {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) setPickerPos({ top: rect.bottom, left: rect.left });\n }\n\n window.addEventListener('scroll', updatePos, true);\n window.addEventListener('resize', updatePos);\n return () => {\n window.removeEventListener('scroll', updatePos, true);\n window.removeEventListener('resize', updatePos);\n };\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n function onMouseUp(event: MouseEvent) {\n const menuElem = menuContainerRef.current;\n const triggerElem = triggerRef.current;\n if (!menuElem || !triggerElem) return;\n\n const menuClicked = menuElem === event.target || menuElem.contains(event.target as Node);\n const triggerClicked = dontCloseOnChildClick &&\n (triggerElem === event.target || triggerElem.contains(event.target as Node));\n\n if (!menuClicked && !triggerClicked) {\n setTimeout(() => onOpenChangeRef.current(false), 1);\n }\n }\n\n window.addEventListener('mouseup', onMouseUp);\n return () => window.removeEventListener('mouseup', onMouseUp);\n }, [isOpen, dontCloseOnChildClick]);\n\n return (\n <div {...rest} className={cx(styles.floatingMenu, className, classNames?.root)} style={{ ...style, ...slotStyles?.root }}>\n <div\n className={cx(styles.floatingMenuContent, classNames?.trigger)}\n style={slotStyles?.trigger}\n ref={triggerRef}\n onClick={handleTriggerClick}\n >\n {children}\n </div>\n {isOpen && (\n <div\n className={cx(styles.floatingMenuAnim, classNames?.menu)}\n style={{\n width: `${triggerWidth}px`,\n ...(pickerPos && { top: pickerPos.top, left: pickerPos.left }),\n ...slotStyles?.menu,\n }}\n >\n <div className={cx(\n styles.floatingMenuContainerFlag,\n styles[`floatingMenuContainerFlagAlign${capitalize(align)}`],\n )} />\n <div\n ref={menuContainerRef}\n className={cx(\n styles.floatingMenuContainer,\n styles[`floatingMenuContainerAlign${capitalize(align)}`],\n classNames?.menuContainer,\n )}\n style={slotStyles?.menuContainer}\n >\n {content}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default FloatingMenu;\n","\n.tooltipBubble {\n position: absolute;\n bottom: calc(100% + 6px);\n left: 0;\n z-index: 10;\n border-radius: 3px;\n width: max-content;\n max-width: 200px;\n font-size: 12px;\n background-color: #454953;\n padding: 6px 9px;\n color: white;\n pointer-events: none;\n\n &:after {\n content: '';\n position: absolute;\n top: 100%;\n left: 12px;\n border-width: 5px;\n border-style: solid;\n border-color: #454953 transparent transparent transparent;\n }\n}\n\n.tooltipDetails {\n position: relative;\n display: inline-flex;\n align-items: center;\n\n &-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n font-size: 11px;\n font-weight: 700;\n background-color: #454953;\n color: white;\n cursor: default;\n user-select: none;\n }\n}\n\n.tooltipError {\n position: absolute;\n top: -33px;\n right: 0;\n width: max-content;\n border-radius: 3px;\n background-color: var(--error-lighter);\n color: var(--red);\n font-size: 10px;\n padding: 6px 9px;\n z-index: 1;\n\n &:after {\n content: '';\n position: absolute;\n top: 100%;\n left: 90%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: var(--error-border-color) transparent transparent transparent;\n }\n}\n","import React, { useState } from 'react';\nimport cx from 'classnames';\nimport styles from './tooltip.module.pcss';\nimport type { TooltipProps } from './tooltip.types';\n\nexport default function Tooltip({\n variant,\n message = '',\n isVisible = true,\n tooltipPosition,\n onClick,\n}: TooltipProps) {\n const [detailsHovered, setDetailsHovered] = useState(false);\n\n if (variant === 'info') {\n if (!isVisible) return null;\n return (\n <div className={cx(styles.tooltipBubble, tooltipPosition)} onClick={onClick}>\n {message}\n </div>\n );\n }\n\n if (variant === 'details') {\n return (\n <div className={styles.tooltipDetails}>\n <span\n className={styles.tooltipDetailsIcon}\n onMouseEnter={() => setDetailsHovered(true)}\n onMouseLeave={() => setDetailsHovered(false)}\n >\n ?\n </span>\n {detailsHovered && (\n <div className={cx(styles.tooltipBubble, tooltipPosition)}>{message}</div>\n )}\n </div>\n );\n }\n\n if (variant === 'error') {\n if (!isVisible) return null;\n return (\n <div className={cx(styles.tooltipError, tooltipPosition)} onClick={onClick}>\n {message}\n </div>\n );\n }\n\n return null;\n}\n","\n.required-mark {\n padding: 0px 0px 0px 4px;\n color: var(--error-font-color);\n}\n\n.isRequired {\n color: var(--message-error-color);\n}\n\n.input {\n position: relative;\n width: 100%;\n\n &-placeholder {\n position: absolute;\n top: 50%;\n left: 7px;\n transform: translateY(-50%);\n transition: all 0.2s;\n opacity: 0;\n user-select: none;\n pointer-events: none;\n\n &-shown {\n animation: 0.2s fadeIn 0.3s forwards;\n }\n\n &-multiline {\n top: 14px;\n transform: translateY(0);\n }\n }\n\n &-matLabel {\n position: absolute;\n transition: all 0.3s;\n left: 7px;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n font-size: 16px;\n pointer-events: none;\n user-select: none;\n\n &-floating {\n inset: -9px 0 0 14px;\n font-size: 13px;\n transform: translateY(0);\n }\n\n &-multiline {\n top: 14px;\n transform: translateY(0);\n }\n }\n\n &-fieldset {\n position: absolute;\n width: 100%;\n margin: 0;\n padding: 0;\n min-width: 0;\n box-sizing: border-box;\n border-radius: var(--default-border-radius);\n inset: -11px 0 0 0;\n padding-left: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: var(--border-color);\n pointer-events: none;\n user-select: none;\n\n &-legend {\n display: block;\n max-width: 0;\n transition: max-width 0.2s;\n white-space: nowrap;\n padding: 0;\n\n &-active {\n max-width: 300px;\n }\n\n span {\n font-size: 13px;\n padding: 5px;\n opacity: 0;\n }\n\n span:empty {\n padding: 0.000001px;\n }\n }\n }\n\n &-container {\n display: flex;\n align-items: center;\n border-radius: var(--default-border-radius);\n background-color: var(--input-background);\n transition: border-color;\n cursor: text;\n height: 100%;\n\n &-multiline {\n overflow: hidden;\n padding-top: 10px;\n align-items: flex-start;\n }\n\n &-border {\n outline: 1px solid var(--border-color);\n transition: border-color;\n background-color: var(--input-background);\n outline: none;\n\n &-focused {\n outline-color: var(--primary-color);\n border-color: var(--primary-color);\n }\n\n &-searchFocused {\n outline-color: var(--search-input-color);\n outline-width: 2px;\n border-color: var(--search-input-color);\n }\n\n &-invalid {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n\n &-invalid:hover {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n\n &-error {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n }\n }\n\n &-label {\n display: flex;\n color: var(--text-color);\n height: 100%;\n\n &-column {\n flex-direction: column;\n }\n\n &-text {\n white-space: nowrap;\n margin-right: 5px;\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n color: color(var(--border-color) lightness(40%));\n background-color: transparent;\n font-size: 12px;\n position: absolute;\n top: -15px;\n white-space: nowrap;\n }\n }\n\n &-upper-right-label {\n position: absolute;\n transform: translateY(calc(-100% - 1.5px));\n right: 8px;\n min-height: 12px;\n font-size: 12px;\n color: color(var(--border-color) lightness(40%));\n }\n\n &-field {\n appearance: none;\n -webkit-appearance: none;\n font-family: inherit;\n font-size: inherit;\n box-sizing: border-box;\n resize: none;\n width: 100%;\n border: none;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n line-height: 20px;\n color: var(--text-color);\n background: transparent;\n\n &:focus {\n outline: none;\n }\n\n &::placeholder {\n color: var(--text-light);\n }\n\n &-withIcon {\n padding-right: 37px !important;\n\n &-left {\n padding-right: 9px !important;\n padding-left: 37px !important;\n }\n }\n\n &-field {\n resize: none;\n width: 100%;\n border: none;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n background-color: var(--light-background-color);\n line-height: 20px;\n height: 100%;\n\n &::placeholder {\n color: var(--disabled-font-color);\n }\n\n &-default {\n padding: 8px 7.5px 6px;\n }\n\n &[disabled] {\n background-color: var(--disabled-input-color);\n color: var(--disabled-font-color);\n }\n }\n\n &-suffix {\n padding-right: 9px;\n }\n\n &-date {\n padding: 6px 9px;\n color-scheme: dark;\n\n svg {\n color: white;\n }\n }\n\n &-default {\n padding: 8px 7.5px 6px;\n }\n\n &[disabled] {\n background-color: var(--disabled-input-color);\n color: var(--disabled-font-color);\n }\n\n &-uppercase {\n text-transform: uppercase;\n }\n\n &-multiline {\n overflow-y: auto;\n resize: vertical;\n padding-top: 4px;\n min-height: 30px;\n\n &-autoResize {\n resize: none;\n overflow: hidden;\n }\n }\n\n &-icon {\n appearance: none;\n -webkit-appearance: none;\n box-sizing: border-box;\n cursor: pointer;\n background-color: transparent;\n border: none;\n position: absolute;\n outline: none;\n right: 10px;\n top: 8px;\n color: var(--input-icon-color);\n width: 19px !important;\n height: 19px !important;\n user-select: none;\n top: 50%;\n transform: translateY(-50%);\n\n &-left {\n left: 10px;\n }\n\n &-notClickable {\n pointer-events: none;\n }\n }\n }\n\n &-error {\n height: 1em;\n padding-top: 3px;\n color: var(--error-font-color);\n font-size: 11px;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 0.5;\n }\n }\n}\n","import React from 'react';\nimport FormValidator from 'services/formValidation/formValidator';\nimport type { SlotClassNames, SlotStyles } from '../types/slots.types';\n\nexport enum InputType {\n Edit = 'edit',\n Phone = 'phone',\n Email = 'email',\n Iban = 'iban',\n Date = 'date',\n HasNoIcon = 'hasNoIcon',\n Search = 'searchInput',\n Password = 'password',\n}\n\nexport type InputSlots = 'label' | 'container' | 'input' | 'suffix' | 'upperRightLabel' | 'fieldset';\n\nexport interface InputProps {\n onMouseEnter?: ((event: React.MouseEvent) => void) | null;\n onMouseLeave?: ((event: React.MouseEvent) => void) | null;\n onFocus?: ((event: React.FocusEvent) => void) | null;\n onBlur?: ((event: React.FocusEvent) => void) | null;\n onChange?: ((value: string, event?: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement, Element>) => void) | null;\n errorMessage?: string;\n isValid?: boolean;\n isRequired?: boolean;\n label?: string;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n value?: string | number;\n icon?: React.ReactElement | null;\n isUppercase?: boolean;\n isRow?: boolean;\n tabIndex?: number;\n type?: InputType;\n onIconClick?: (() => void) | null;\n parse?: ((value: string) => string) | null;\n suffix?: string | React.ReactNode;\n upperRightLabel?: string | React.ReactNode;\n labelInBorder?: boolean;\n showCancel?: boolean;\n onClearClicked?: (() => void) | null;\n min?: string | number | null;\n max?: string | number | null;\n placeholder?: string;\n useMatLabelStyle?: boolean;\n autoComplete?: string | null;\n onClick?: (() => void) | null;\n readOnly?: boolean;\n customInput?: React.ReactElement | null;\n autoFocus?: boolean;\n alwaysShowCancel?: boolean;\n formValidator?: FormValidator | null;\n multiline?: boolean;\n rows?: number;\n autoResize?: boolean;\n classNames?: SlotClassNames<InputSlots>;\n styles?: SlotStyles<InputSlots>;\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faPhone,\n faPen,\n faEnvelope,\n faSearch,\n faXmark,\n faEye as passwordHiddenIcon,\n faEyeSlash as passwordShownIcon,\n} from '@fortawesome/free-solid-svg-icons';\nimport Tooltip from 'components/common/tooltip';\nimport styles from './input.module.pcss';\nimport type { InputProps } from './input.types';\nimport { InputType } from './input.types';\n\nfunction Input({\n name = '',\n label = '',\n errorMessage = '',\n isValid = true,\n className = '',\n style,\n value = '',\n icon = null,\n onChange = () => {},\n onFocus: onFocusProp = null,\n onBlur: onBlurProp = null,\n onMouseEnter: onMouseEnterProp = null,\n onMouseLeave: onMouseLeaveProp = null,\n isUppercase = false,\n isRequired = false,\n tabIndex = 0,\n type = undefined,\n isRow = false,\n onIconClick = null,\n parse = null,\n formValidator = null,\n autoFocus = false,\n suffix = null,\n upperRightLabel = null,\n labelInBorder = false,\n showCancel = false,\n onClearClicked,\n min = null,\n max = null,\n placeholder = '',\n useMatLabelStyle = true,\n autoComplete = null,\n onClick = () => null,\n readOnly = false,\n customInput,\n alwaysShowCancel = false,\n multiline = false,\n rows,\n autoResize = false,\n classNames,\n styles: slotStyles,\n}: InputProps) {\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isPasswordShown, setIsPasswordShown] = useState(false);\n const [, forceUpdate] = useState(0);\n\n const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n const fvRef = useRef(formValidator);\n\n const resizeTextarea = useCallback(() => {\n const el = inputRef.current;\n if (!el || !autoResize) return;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }, [autoResize]);\n\n useEffect(() => {\n setTimeout(() => {\n setIsFocused(false);\n setIsHovered(false);\n }, 1);\n resizeTextarea();\n }, []);\n\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n setTimeout(() => { inputRef.current?.focus(); }, 1);\n }\n }, [autoFocus]);\n\n useEffect(() => {\n fvRef.current = formValidator;\n const fv = fvRef.current;\n if (!fv) return;\n fv.label = label ?? '';\n fv.validate();\n const listener = () => forceUpdate(n => n + 1);\n fv.registerOnUpdateListener(listener);\n return () => { fv.removeOnUpdateListener(listener); };\n }, [formValidator, label]);\n\n const hasError = (): boolean => {\n return formValidator\n ? (formValidator.touched && formValidator.hasError())\n : (!isValid || !!errorMessage);\n };\n\n const computedIsRequired = (): boolean => {\n return !!(isRequired || (formValidator && formValidator.validators.find(\n (v) => (v as { validatorId?: string }).validatorId === 'required'\n )));\n };\n\n const onMouseEnterHandler = (event: React.MouseEvent) => {\n setIsHovered(true);\n if (onMouseEnterProp) onMouseEnterProp(event);\n };\n\n const onMouseLeaveHandler = (event: React.MouseEvent) => {\n setIsHovered(false);\n if (onMouseLeaveProp) onMouseLeaveProp(event);\n };\n\n const onFocusHandler = (event: React.FocusEvent) => {\n setIsFocused(true);\n if (onFocusProp) onFocusProp(event);\n };\n\n const onBlurHandler = (event: React.FocusEvent) => {\n if (fvRef.current) fvRef.current.touched = true;\n setIsFocused(false);\n if (onBlurProp) onBlurProp(event);\n };\n\n const onChangeHandler = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | string): void => {\n let parsedEvent: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | undefined;\n let val: string;\n\n if (typeof event !== 'string') {\n parsedEvent = event;\n val = event.target.value;\n } else {\n val = event;\n }\n\n if (parse) val = parse(val);\n if (formValidator) formValidator.set(val);\n if (onChange) onChange(val, parsedEvent);\n resizeTextarea();\n };\n\n const getInputType = (): string | undefined => {\n if (type === 'email') return undefined;\n if (type === 'password' && isPasswordShown) return 'text';\n return type;\n };\n\n const hasIcon =\n type &&\n type !== InputType.Date &&\n type !== InputType.Iban &&\n type !== InputType.HasNoIcon;\n\n const hasIconLeft =\n hasIcon && !useMatLabelStyle &&\n (type === InputType.Email || type === InputType.Phone || type === InputType.Search);\n\n const iconProps = {\n className: cx(styles.inputFieldIcon, {\n [styles.inputFieldIconNotClickable]: !onIconClick,\n [styles.inputFieldIconLeft]: hasIconLeft,\n }),\n onClick: onIconClick ?? undefined,\n };\n\n const passwordIconProps = {\n className: cx(styles.inputFieldIcon, styles.inputFieldIconPassword),\n onClick: () => setIsPasswordShown(!isPasswordShown),\n };\n\n const hasErr = hasError();\n\n let editedLabel = label;\n if (editedLabel && computedIsRequired()) editedLabel = `${editedLabel} *`;\n\n const currVal = formValidator ? formValidator.value : value;\n const shouldFloatLabel = useMatLabelStyle && (isFocused || currVal || type === InputType.Date);\n\n return (\n <div className={cx(styles.input, className)} style={style}>\n <label\n htmlFor={name}\n className={cx(styles.inputLabel, classNames?.label, {\n [styles.inputLabelColumn]: !isRow,\n [styles.inputLabelInBorder]: labelInBorder,\n })}\n style={slotStyles?.label}\n >\n {editedLabel && !useMatLabelStyle ? (\n <span className={styles.inputLabelText}>\n {`${editedLabel} `}\n {computedIsRequired() ? <span className={cx(styles.isRequired)}> *</span> : null}\n </span>\n ) : null}\n {upperRightLabel && (\n <div className={cx(styles.inputUpperRightLabel, classNames?.upperRightLabel)} style={slotStyles?.upperRightLabel}>\n {upperRightLabel}\n </div>\n )}\n <div\n className={cx(styles.inputContainer, { [styles.inputContainerMultiline]: multiline }, classNames?.container)}\n style={slotStyles?.container}\n onMouseEnter={onMouseEnterHandler}\n onMouseLeave={onMouseLeaveHandler}\n >\n {icon}\n {React.cloneElement(customInput || (multiline ? <textarea /> : <input />), {\n className: cx(\n styles.inputField,\n {\n [styles.inputFieldUppercase]: isUppercase,\n [styles.inputFieldDate]: type === InputType.Date,\n [styles.inputFieldDefault]: type !== InputType.Date,\n [styles.inputFieldWithIcon]: hasIcon,\n [styles.inputFieldWithIconLeft]: hasIconLeft,\n [styles.inputFieldMultiline]: multiline,\n [styles.inputFieldMultilineAutoResize]: multiline && autoResize,\n },\n classNames?.input\n ),\n name,\n id: name,\n value: formValidator ? formValidator.value : value,\n tabIndex,\n ref: customInput ? undefined : inputRef,\n onChange: onChangeHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler,\n placeholder: !useMatLabelStyle ? placeholder : '',\n autoComplete,\n onClick,\n readOnly,\n ...(!multiline && { type: getInputType(), min, max }),\n ...(multiline && rows !== undefined && { rows }),\n })}\n {suffix && <div className={cx(styles.inputFieldSuffix, classNames?.suffix)} style={slotStyles?.suffix}>{suffix}</div>}\n </div>\n <fieldset\n className={cx(styles.inputFieldset, classNames?.fieldset, {\n [styles.inputContainerBorderFocused]: isFocused,\n [styles.inputContainerBorderSearchFocused]:\n type === InputType.Search && (isFocused || value),\n [styles.inputContainerBorderInvalid]: hasErr,\n [styles.inputContainerBorderError]: hasErr,\n })}\n style={slotStyles?.fieldset}\n >\n <legend\n className={cx(styles.inputFieldsetLegend, {\n [styles.inputFieldsetLegendActive]: shouldFloatLabel,\n })}\n >\n <span>{editedLabel}</span>\n </legend>\n </fieldset>\n {useMatLabelStyle && label && (\n <div\n className={cx(styles.inputMatLabel, {\n [styles.inputMatLabelFloating]: shouldFloatLabel,\n [styles.inputMatLabelMultiline]: multiline && !shouldFloatLabel,\n })}\n >\n {editedLabel}\n </div>\n )}\n {useMatLabelStyle && placeholder && (\n <div\n className={cx(\n styles.inputPlaceholder,\n isFocused && !currVal && styles.inputPlaceholderShown,\n multiline && styles.inputPlaceholderMultiline,\n )}\n >\n {placeholder}\n </div>\n )}\n <Tooltip\n variant=\"error\"\n message={formValidator ? formValidator.getCurrentErrorMessage() : (errorMessage || '')}\n isVisible={hasErr && (isFocused || isHovered)}\n />\n </label>\n\n {type === InputType.Phone && <FontAwesomeIcon icon={faPhone} {...iconProps} />}\n {type === InputType.Email && <FontAwesomeIcon icon={faEnvelope} {...iconProps} />}\n {type === InputType.Edit && <FontAwesomeIcon icon={faPen} {...iconProps} />}\n {type === InputType.Search && <FontAwesomeIcon icon={faSearch} {...iconProps} />}\n {type === InputType.Password && (\n <FontAwesomeIcon\n icon={isPasswordShown ? passwordShownIcon : passwordHiddenIcon}\n {...passwordIconProps}\n />\n )}\n\n {((showCancel && value && (isFocused || isHovered)) || alwaysShowCancel) && (\n <FontAwesomeIcon\n icon={faXmark}\n className={styles.inputFieldIcon}\n onClick={onClearClicked ?? undefined}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n />\n )}\n </div>\n );\n}\n\nexport default Input;\n",".colorPicker {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.swatch {\n width: 32px;\n height: 32px;\n border-radius: var(--default-border-radius);\n position: relative;\n cursor: pointer;\n flex-shrink: 0;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15);\n /* checkerboard so transparency is visible */\n background-image:\n linear-gradient(45deg, #bbb 25%, transparent 25%),\n linear-gradient(-45deg, #bbb 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #bbb 75%),\n linear-gradient(-45deg, transparent 75%, #bbb 75%);\n background-size: 8px 8px;\n background-position: 0 0, 0 4px, 4px -4px, -4px 0;\n background-color: white;\n\n &:hover {\n & .swatchHex {\n opacity: 1;\n }\n }\n}\n\n.swatchFill {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n}\n\n.swatchHex {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 8px;\n font-family: monospace;\n background: rgba(0, 0, 0, 0.55);\n color: white;\n border-radius: inherit;\n opacity: 0;\n transition: opacity 0.15s;\n user-select: none;\n pointer-events: none;\n z-index: 1;\n}\n\n.panel {\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: 224px;\n}\n\n.gradientArea {\n width: 200px;\n height: 160px;\n position: relative;\n cursor: crosshair;\n border-radius: 4px;\n overflow: hidden;\n background: linear-gradient(to right, white, hsl(calc(var(--hue) * 1deg), 100%, 50%));\n}\n\n.gradientOverlay {\n position: absolute;\n inset: 0;\n background: linear-gradient(to bottom, transparent, black);\n}\n\n.cursor {\n position: absolute;\n width: 12px;\n height: 12px;\n border-radius: 50%;\n border: 2px solid white;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.5);\n transform: translate(-50%, -50%);\n pointer-events: none;\n z-index: 1;\n}\n\n.hueSlider {\n -webkit-appearance: none;\n appearance: none;\n width: 100%;\n height: 10px;\n border-radius: var(--default-border-radius);\n outline: none;\n cursor: pointer;\n background: linear-gradient(\n to right,\n hsl(0, 100%, 50%),\n hsl(60, 100%, 50%),\n hsl(120, 100%, 50%),\n hsl(180, 100%, 50%),\n hsl(240, 100%, 50%),\n hsl(300, 100%, 50%),\n hsl(360, 100%, 50%)\n );\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 6px;\n height: 20px;\n border-radius: var(--default-border-radius);\n background: var(--primary-color);\n box-shadow: var(--card-shadow);\n cursor: pointer;\n }\n\n &::-moz-range-thumb {\n width: 6px;\n height: 20px;\n border-radius: var(--default-border-radius);\n background: var(--primary-color);\n box-shadow: var(--card-shadow);\n cursor: pointer;\n }\n}\n\n.alphaSlider {\n -webkit-appearance: none;\n appearance: none;\n width: 100%;\n height: 10px;\n border-radius: var(--default-border-radius);\n outline: none;\n cursor: pointer;\n /* checkerboard base so transparency is visible under the gradient */\n background-image:\n linear-gradient(to right, transparent, var(--alpha-color)),\n linear-gradient(45deg, #bbb 25%, transparent 25%),\n linear-gradient(-45deg, #bbb 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #bbb 75%),\n linear-gradient(-45deg, transparent 75%, #bbb 75%);\n background-size: 100% 100%, 8px 8px, 8px 8px, 8px 8px, 8px 8px;\n background-position: 0 0, 0 0, 0 4px, 4px -4px, -4px 0;\n background-color: white;\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 6px;\n height: 20px;\n border-radius: var(--default-border-radius);\n background: var(--primary-color);\n box-shadow: var(--card-shadow);\n cursor: pointer;\n }\n\n &::-moz-range-thumb {\n width: 6px;\n height: 20px;\n border-radius: var(--default-border-radius);\n background: var(--primary-color);\n box-shadow: var(--card-shadow);\n cursor: pointer;\n }\n}\n\n.hexInput {\n width: 100%;\n padding: 5px 8px;\n border-radius: var(--default-border-radius);\n border: 1px solid var(--border-color);\n background: var(--input-background);\n color: var(--text-color);\n font-size: 13px;\n font-family: monospace;\n box-sizing: border-box;\n outline: none;\n\n &:focus {\n border-color: var(--primary-color);\n }\n}\n","import { useState, useRef, useEffect, type ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport InteractableDiv from 'components/common/interactableDiv';\nimport FloatingMenu from 'components/common/floatingMenu';\nimport Input from 'components/common/input';\nimport { Align } from 'components/common/floatingMenu/floatingMenu.types';\nimport type { ColorPickerProps } from './colorPicker.types';\n\nimport styles from './colorPicker.module.pcss';\n\n// ── Color utilities ──────────────────────────────────────────────────────────\n\nfunction isValidHex(s: string): boolean {\n return /^#[0-9a-fA-F]{6}$/.test(s) || /^#[0-9a-fA-F]{8}$/.test(s);\n}\n\n/** Split any valid hex into its 6-digit base and 0-100 alpha. */\nfunction parseHex(hex: string): { hex6: string; alpha: number } {\n if (/^#[0-9a-fA-F]{8}$/.test(hex)) {\n return {\n hex6: hex.slice(0, 7),\n alpha: Math.round((parseInt(hex.slice(7, 9), 16) / 255) * 100),\n };\n }\n return { hex6: hex.slice(0, 7), alpha: 100 };\n}\n\n/** Combine a 6-digit hex + 0-100 alpha into the right output format.\n * Full opacity (alpha === 100) is omitted — 6-digit hex implies opaque. */\nfunction buildValue(hex6: string, alpha: number, showAlpha: boolean): string {\n if (!showAlpha || alpha >= 100) return hex6;\n const a = Math.round((alpha / 100) * 255).toString(16).padStart(2, '0');\n return `${hex6}${a}`;\n}\n\nfunction hexToRgba(hex6: string, alpha: number): string {\n const r = parseInt(hex6.slice(1, 3), 16);\n const g = parseInt(hex6.slice(3, 5), 16);\n const b = parseInt(hex6.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha / 100})`;\n}\n\nfunction hexToHsv(hex6: string): { h: number; s: number; v: number } {\n const r = parseInt(hex6.slice(1, 3), 16) / 255;\n const g = parseInt(hex6.slice(3, 5), 16) / 255;\n const b = parseInt(hex6.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n if (delta !== 0) {\n if (max === r) h = ((g - b) / delta) % 6;\n else if (max === g) h = (b - r) / delta + 2;\n else h = (r - g) / delta + 4;\n h = Math.round(h * 60);\n if (h < 0) h += 360;\n }\n\n const s = max === 0 ? 0 : Math.round((delta / max) * 100);\n const v = Math.round(max * 100);\n\n return { h, s, v };\n}\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const sv = s / 100;\n const vv = v / 100;\n const c = vv * sv;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = vv - c;\n\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; b = 0; }\n else if (h < 120) { r = x; g = c; b = 0; }\n else if (h < 180) { r = 0; g = c; b = x; }\n else if (h < 240) { r = 0; g = x; b = c; }\n else if (h < 300) { r = x; g = 0; b = c; }\n else { r = c; g = 0; b = x; }\n\n const toHex = (n: number) => Math.round((n + m) * 255).toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n// ── HexInput ─────────────────────────────────────────────────────────────────\n\ninterface HexInputProps {\n hex: string;\n onChange: (hex: string) => void;\n useInputComponent?: boolean;\n}\n\nfunction HexInput({ hex, onChange, useInputComponent = false }: HexInputProps): ReactElement {\n const [draft, setDraft] = useState(hex);\n\n useEffect(() => {\n setDraft(hex);\n }, [hex]);\n\n function handleChange(raw: string) {\n setDraft(raw);\n const normalized = raw.startsWith('#') ? raw : `#${raw}`;\n if (isValidHex(normalized)) onChange(normalized);\n }\n\n function handleBlur() {\n const normalized = draft.startsWith('#') ? draft : `#${draft}`;\n if (!isValidHex(normalized)) setDraft(hex);\n }\n\n if (useInputComponent) {\n return (\n <Input\n value={draft}\n onChange={(value: string) => handleChange(value)}\n onBlur={handleBlur}\n />\n );\n }\n\n return (\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={handleBlur}\n className={styles.hexInput}\n spellCheck={false}\n />\n );\n}\n\n// ── Picker panel ─────────────────────────────────────────────────────────────\n\ninterface PickerPanelProps {\n hue: number;\n sat: number;\n val: number;\n alpha: number;\n onHueChange: (h: number) => void;\n onSVChange: (s: number, v: number) => void;\n onAlphaChange: (a: number) => void;\n showInput?: boolean;\n showAlpha?: boolean;\n}\n\nfunction PickerPanel({\n hue, sat, val, alpha,\n onHueChange, onSVChange, onAlphaChange,\n showInput = true, showAlpha = false,\n}: PickerPanelProps): ReactElement {\n const gradientRef = useRef<HTMLDivElement>(null);\n\n function getSVFromEvent(e: MouseEvent): { s: number; v: number } {\n const rect = gradientRef.current!.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const y = Math.max(0, Math.min(1, (e.clientY - rect.top) / rect.height));\n return { s: x * 100, v: (1 - y) * 100 };\n }\n\n function onGradientMouseDown(e: React.MouseEvent) {\n const { s, v } = getSVFromEvent(e.nativeEvent);\n onSVChange(s, v);\n\n const onMove = (ev: MouseEvent) => {\n const { s, v } = getSVFromEvent(ev);\n onSVChange(s, v);\n };\n const onUp = () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n }\n\n function onHexChange(normalized: string) {\n const { hex6, alpha: parsedAlpha } = parseHex(normalized);\n const { h, s, v } = hexToHsv(hex6);\n onHueChange(h);\n onSVChange(s, v);\n if (showAlpha) onAlphaChange(parsedAlpha);\n }\n\n const hex6 = hsvToHex(hue, sat, val);\n const hexInputValue = showAlpha ? buildValue(hex6, alpha, true) : hex6;\n\n return (\n <div className={styles.panel}>\n <div\n ref={gradientRef}\n className={styles.gradientArea}\n style={{ '--hue': hue } as React.CSSProperties}\n onMouseDown={onGradientMouseDown}\n >\n <div className={styles.gradientOverlay} />\n <div\n className={styles.cursor}\n style={{ left: `${sat}%`, top: `${100 - val}%` }}\n />\n </div>\n\n <input\n type=\"range\"\n min={0}\n max={359}\n value={hue}\n onChange={(e) => onHueChange(Number(e.target.value))}\n className={styles.hueSlider}\n />\n\n {showAlpha && (\n <input\n type=\"range\"\n min={0}\n max={100}\n value={alpha}\n onChange={(e) => onAlphaChange(Number(e.target.value))}\n className={styles.alphaSlider}\n style={{ '--alpha-color': hex6 } as React.CSSProperties}\n />\n )}\n\n {showInput && <HexInput hex={hexInputValue} onChange={onHexChange} />}\n </div>\n );\n}\n\n// ── ColorPicker ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_COLOR = '#3b82f6';\n\nfunction ColorPicker({\n className,\n value = DEFAULT_COLOR,\n onChange,\n showInput = false,\n showAlpha = false,\n inline = false,\n ...rest\n}: ColorPickerProps): ReactElement {\n const [isOpen, setIsOpen] = useState(false);\n\n const initSafe = isValidHex(value) ? value : DEFAULT_COLOR;\n const { hex6: initHex6, alpha: initAlpha } = parseHex(initSafe);\n const initHsv = hexToHsv(initHex6);\n\n // Single state object so hue survives when saturation/value hit 0\n // (hexToHsv of any grey returns h=0, which would corrupt hue if derived from props).\n const [hsva, setHsva] = useState({ h: initHsv.h, s: initHsv.s, v: initHsv.v, a: initAlpha });\n\n // Ref mirrors state so drag callbacks never read stale closure values.\n const cur = useRef(hsva);\n\n // Sync from external prop changes: \"derive state during render\" pattern\n // avoids setState-in-effect. We compare the incoming hex against what our\n // current state produces — if they match, the change came from us and we skip.\n const [prevValue, setPrevValue] = useState(value);\n if (value !== prevValue) {\n setPrevValue(value);\n const safe = isValidHex(value) ? value : DEFAULT_COLOR;\n const { hex6: incomingHex6, alpha: incomingA } = parseHex(safe);\n const currentHex6 = hsvToHex(hsva.h, hsva.s, hsva.v);\n if (incomingHex6 !== currentHex6 || incomingA !== hsva.a) {\n const hsv = hexToHsv(incomingHex6);\n const next = { h: hsv.h, s: hsv.s, v: hsv.v, a: incomingA };\n setHsva(next);\n }\n }\n\n const { h: hue, s: sat, v: val, a: alpha } = hsva;\n\n function emit(h: number, s: number, v: number, a: number) {\n onChange?.(buildValue(hsvToHex(h, s, v), a, showAlpha));\n }\n\n function handleHueChange(h: number) {\n cur.current.h = h;\n setHsva(prev => ({ ...prev, h }));\n emit(h, cur.current.s, cur.current.v, cur.current.a);\n }\n\n function handleSVChange(s: number, v: number) {\n cur.current.s = s;\n cur.current.v = v;\n setHsva(prev => ({ ...prev, s, v }));\n emit(cur.current.h, s, v, cur.current.a);\n }\n\n function handleAlphaChange(a: number) {\n cur.current.a = a;\n setHsva(prev => ({ ...prev, a }));\n emit(cur.current.h, cur.current.s, cur.current.v, a);\n }\n\n const hex6 = hsvToHex(hue, sat, val);\n const swatchBackground = showAlpha ? hexToRgba(hex6, alpha) : hex6;\n const displayValue = buildValue(hex6, alpha, showAlpha);\n\n const pickerPanelProps: PickerPanelProps = {\n hue, sat, val, alpha,\n onHueChange: handleHueChange,\n onSVChange: handleSVChange,\n onAlphaChange: handleAlphaChange,\n showAlpha,\n };\n\n if (inline) {\n return (\n <div {...rest} className={cx(styles.colorPicker, className)}>\n <PickerPanel {...pickerPanelProps} showInput={showInput} />\n </div>\n );\n }\n\n return (\n <div {...rest} className={cx(styles.colorPicker, className)}>\n <FloatingMenu\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n dontCloseOnChildClick\n align={Align.Left}\n content={<PickerPanel {...pickerPanelProps} />}\n >\n <InteractableDiv className={styles.swatch}>\n <div className={styles.swatchFill} style={{ background: swatchBackground }} />\n <span className={styles.swatchHex}>{displayValue}</span>\n </InteractableDiv>\n </FloatingMenu>\n\n {showInput && (\n <HexInput\n hex={displayValue}\n onChange={(v) => onChange?.(v)}\n useInputComponent\n />\n )}\n </div>\n );\n}\n\nexport default ColorPicker;\n","\n.modal {\n padding: 16px;\n border-radius: var(--default-border-radius);\n background: var(--background-modal);\n color: var(--text-color);\n font-family: var(--default-font);\n box-sizing: border-box;\n position: relative;\n transform-origin: bottom center;\n animation:\n slideIn 0.2s,\n fadeIn 0.3s forwards;\n max-width: 95%;\n max-height: 95%;\n overflow: auto;\n\n @media not (--breakpoint-desktop) {\n max-width: 100%;\n max-height: 100%;\n }\n\n &-container {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n top: 0;\n left: 0;\n\n @media (--breakpoint-tablet) {\n z-index: 1;\n }\n }\n\n &-header {\n display: flex;\n gap: 8px;\n justify-content: space-between;\n margin-bottom: 16px;\n\n div {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n svg {\n cursor: pointer;\n }\n }\n\n &-wrapper {\n position: fixed;\n width: 100%;\n height: 100%;\n background: #00000052;\n top: 0;\n left: 0;\n transition: all 0.3s ease-in-out;\n opacity: 0;\n\n &-shown {\n opacity: 1;\n }\n }\n}\n\n@keyframes slideIn {\n from {\n transform: scale(0);\n }\n to {\n transform: scale(0.99);\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n","import React from 'react';\nimport cx from 'classnames';\nimport BodyEnd from 'components/common/bodyEnd';\n\nimport styles from './modal.module.pcss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faXmark as closeIcon } from '@fortawesome/free-solid-svg-icons';\nimport { ModalProps } from './modal.types';\nimport { useEffect, useState } from 'react';\n\nfunction Modal({\n children = null,\n title = '',\n isOpen = false,\n onClose = () => null,\n className = '',\n style,\n hideHeader = false,\n classNames,\n styles: slotStyles,\n}: ModalProps) {\n const [isRendered, setIsRendered] = useState(isOpen);\n const [animateIn, setAnimateIn] = useState(isOpen);\n\n useEffect(() => {\n if (isOpen) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsRendered(isOpen);\n setTimeout(() => setAnimateIn(true), 1);\n } else {\n setAnimateIn(false);\n setTimeout(() => setIsRendered(isOpen), 300);\n }\n }, [isOpen]);\n\n if (!isRendered) return null;\n\n return (\n <BodyEnd>\n <div className={cx(styles.modalContainer, classNames?.container)} style={slotStyles?.container}>\n <div\n className={cx(styles.modalWrapper, animateIn && styles.modalWrapperShown, classNames?.backdrop)}\n style={slotStyles?.backdrop}\n onClick={onClose}\n />\n {animateIn && (\n <div\n className={cx(styles.modal, animateIn && styles.modalShown, className, classNames?.modal)}\n style={{ ...style, ...slotStyles?.modal }}\n onClick={(e) => e.stopPropagation()}\n >\n {!hideHeader && (\n <div className={cx(styles.modalHeader, classNames?.header)} style={slotStyles?.header}>\n <div className={classNames?.title} style={slotStyles?.title}>{title}</div>\n <FontAwesomeIcon onClick={onClose} icon={closeIcon} className={classNames?.closeButton} style={slotStyles?.closeButton as React.CSSProperties & Record<`--fa-font-${string}`, string>} />\n </div>\n )}\n {children}\n </div>\n )}\n </div>\n </BodyEnd>\n );\n}\n\nexport default Modal;\n","import { useState, type ReactElement } from 'react';\n\nimport Modal from '../modal';\nimport { ActionButtons } from '../actionButtons';\nimport type { ConfirmModalProps } from './confirmModal.types';\n\nfunction ConfirmModal({\n children = null,\n className = '',\n onClose = () => {},\n onConfirm = () => {},\n title = '',\n content = null,\n isOpen: propIsOpen = undefined,\n}: ConfirmModalProps): ReactElement {\n const [internalOpen, setInternalOpen] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n function handleClose(didSubmit = false) {\n setInternalOpen(false);\n onClose(didSubmit);\n }\n\n async function handleConfirm() {\n setIsSubmitting(true);\n try {\n await onConfirm();\n handleClose(true);\n } finally {\n setIsSubmitting(false);\n }\n }\n\n const isOpen = propIsOpen === undefined ? internalOpen : propIsOpen;\n\n return (\n <div className={className}>\n <span onClick={() => setInternalOpen(true)}>{children}</span>\n <Modal title={title} isOpen={isOpen} onClose={() => handleClose()}>\n {content}\n <ActionButtons\n onClose={() => handleClose()}\n onSubmit={handleConfirm}\n submitLabel=\"Confirm\"\n isSubmitButtonLoading={isSubmitting}\n />\n </Modal>\n </div>\n );\n}\n\nexport default ConfirmModal;\n","\n.datePickerMonth {\n &-item {\n aspect-ratio: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 1px 0;\n }\n\n &-content {\n display: grid;\n text-align: center;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n gap: 0px;\n }\n\n &-day {\n cursor: pointer;\n\n &:hover {\n /* background-color: var(--primary-color);\n border-radius: 800px; */\n }\n\n &-today {\n background-color: var(--background-accent-light);\n border-radius: var(--default-border-radius);\n }\n\n &-selected {\n background-color: var(--primary-color);\n border-radius: 0;\n\n &-start {\n border-top-left-radius: var(--default-border-radius);\n border-bottom-left-radius: var(--default-border-radius);\n }\n\n &-end {\n border-top-right-radius: var(--default-border-radius);\n border-bottom-right-radius: var(--default-border-radius);\n }\n }\n\n &-disabled {\n filter: brightness(0.5);\n cursor: not-allowed;\n }\n }\n\n &-placeholder {\n user-select: none;\n pointer-events: none;\n }\n}\n","// import { Settings } from 'luxon';\n// import Polyglot from 'node-polyglot';\n\nconst supportedLocales: string[] = ['de_AT', 'de_CH', 'de_DE', 'en_US', 'en_GB', 'de', 'en'];\n\nconst defaultLocale = 'en_US';\n\nconst getCurrentLocale = (): string => {\n const locale = navigator.languages[0]?.replace('-', '_') || defaultLocale;\n\n if (!supportedLocales.includes(locale)) return defaultLocale;\n\n if (locale === 'en_GB' || locale === 'en') return 'en_US'; // Change GB to US. Alternatively, add GB File\n if (locale === 'de') return 'de_DE';\n\n return locale;\n};\n\nexport const mapLocale = (locale: string): string => {\n switch (locale) {\n case 'en_US':\n case 'en_GB':\n return 'en';\n case 'de_DE':\n case 'de_CH':\n case 'de_AT':\n return 'de';\n default:\n return 'de';\n }\n};\n\n// const getPolyglot = async (locale: string): Promise<Polyglot> => {\n// let phrases: object = {};\n// let extendPhrases: object = {};\n// const { default: impPhrasesLocale } = await import(`../locales/${locale || defaultLocale}.json`);\n// if ((locale || '').startsWith('de')) {\n// const { default: impPhrases } = await import('locales/de_DE.json');\n// phrases = impPhrases;\n// extendPhrases = impPhrasesLocale;\n// } else {\n// phrases = impPhrasesLocale;\n// }\n// const shortLocale: string = mapLocale(locale);\n// Settings.defaultLocale = shortLocale;\n\n// const polyglot: Polyglot = new Polyglot({\n// phrases: JSON.parse(JSON.stringify(phrases)),\n// locale: shortLocale,\n// });\n\n// polyglot.extend(JSON.parse(JSON.stringify(extendPhrases)));\n// return polyglot;\n// };\n\nlet currentLocale: string = getCurrentLocale();\n// let polyglot: Polyglot = await getPolyglot(currentLocale);\n\n// export default polyglot;\n\nexport async function setLocale(locale: string): Promise<void> {\n currentLocale = locale;\n // polyglot = await getPolyglot(locale);\n}\n\nexport function getLocale(delimiter = '_'): string {\n return currentLocale.replace('_', delimiter);\n}\n","import { getLocale } from 'services/localization';\n\nexport function getDaysInMonth(month: number, year: number): number {\n return new Date(year, month, 0).getDate();\n}\n\nexport function getDateFromDayMonthAndYear(day: number, month: number, year: number): Date {\n return new Date(Date.UTC(year, month - 1, day));\n}\n\nexport function getMonthName(locale: string, year: number, month: number, day: number, short = false): string {\n const currDate = new Date(Date.UTC(year, month - 1, day));\n return currDate.toLocaleDateString(locale, { month: short ? 'short' : 'long' });\n}\n\nexport function getMonthNames(locale = getLocale('-')): string[] {\n return Array.from(Array(12).keys()).map((index) => getMonthName(locale, 2023, index + 1, 1));\n}\n\nexport function getWeekDays(locale: string, short = true): string[] {\n const currDate = new Date(Date.UTC(2023, 3, 10)); // Random Monday - 10.4.2023\n const weekDays: string[] = [];\n for (let i = 0; i < 7; i++) {\n weekDays.push(currDate.toLocaleDateString(locale, { weekday: short ? 'short' : 'long' }));\n currDate.setDate(currDate.getDate() + 1);\n }\n return weekDays;\n}\n\nexport function getStartWeekDayOfMonth(month: number, year: number): number {\n const start = new Date(Date.UTC(year, month - 1, 1)).getDay();\n return start || 7;\n}\n\nexport function getDayMonthAndYearOfDate(date: Date): { day: number; month: number; year: number } {\n return {\n day: date.getDate(),\n month: date.getMonth() + 1,\n year: date.getFullYear(),\n };\n}\n\nexport function getDateString(date: Date): string {\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n\n return `${day < 10 ? `0${day}` : day}.${month < 10 ? `0${month}` : month}.${year}`;\n}\n\nexport interface DateMaskSelection {\n start: number;\n end: number;\n}\n\nexport interface DateMaskState {\n value: string;\n selection: DateMaskSelection | null;\n}\n\n/**\n * Auto-corrects a partially typed `dd.mm.yyyy` mask value so a single out-of-range\n * digit doesn't force the user to backtrack:\n * - a day \"tens\" digit > 3 (e.g. typing `4`) becomes `04` and the caret jumps to the month\n * - a day of `3x` where x > 1 (e.g. `35`) becomes `0x`\n * - a month \"tens\" digit > 1 (e.g. `2`) becomes `02` and the caret jumps to the year\n * - a month `1x` where x > 2 (e.g. `13`) is clamped to `12`\n *\n * `previousValue` supplies the digits to retain for the part of the field that isn't\n * being rewritten. The returned `selection` is the adjusted caret position, or the\n * passed-in `selection` when no correction applies.\n */\nexport function correctDateMaskValue(\n nextValue: string,\n previousValue: string,\n selection: DateMaskSelection | null,\n): DateMaskState {\n let value = nextValue;\n let nextSelection = selection;\n\n if (value[0] !== '_') {\n if (value[0] > '3') {\n value = `0${value[0]}${previousValue.substring(2)}`;\n nextSelection = { start: 3, end: 3 };\n } else if (value[0] === '3') {\n if (value[1] !== '_' && value[1] > '1') {\n value = `0${value[1]}${previousValue.substring(2)}`;\n nextSelection = { start: 3, end: 3 };\n }\n }\n }\n if (value[3] !== '_' && value[3] > '1') {\n value = `${value.substring(0, 3)}0${value[3]}${previousValue.substring(5)}`;\n nextSelection = { start: 6, end: 6 };\n }\n if (value[3] === '1' && value[4] !== '_' && value[4] > '2') {\n value = `${value.substring(0, 3)}${value[3]}2${previousValue.substring(5)}`;\n }\n\n return { value, selection: nextSelection };\n}\n","import cx from 'classnames';\n\nimport styles from './datePickerMonth.module.pcss';\nimport { getLocale } from 'services/localization';\nimport InteractableDiv from 'components/common/interactableDiv';\nimport {\n getDateFromDayMonthAndYear,\n getDayMonthAndYearOfDate,\n getDaysInMonth,\n getStartWeekDayOfMonth,\n getWeekDays,\n} from '../../dateFunctions';\n\ninterface DatePickerMonthProps {\n className?: string;\n month?: number;\n year?: number;\n onSelect?: (date: Date) => void;\n selectionStart?: Date;\n selectionEnd?: Date;\n minDate?: Date | null;\n maxDate?: Date | null;\n}\n\nfunction checkSelected(\n day: number,\n month: number,\n year: number,\n selectionStart: Date | undefined,\n selectionEnd: Date | undefined,\n) {\n const { day: startDay, month: startMonth, year: startYear } = selectionStart\n ? getDayMonthAndYearOfDate(selectionStart)\n : { day: undefined, month: undefined, year: undefined };\n const { day: endDay, month: endMonth, year: endYear } = selectionEnd\n ? getDayMonthAndYearOfDate(selectionEnd)\n : { day: undefined, month: undefined, year: undefined };\n\n const toCheckNoTime = getDateFromDayMonthAndYear(day, month, year);\n\n const isStartDate = day === startDay && month === startMonth && year === startYear;\n const isEndDate = day === endDay && month === endMonth && year === endYear;\n\n let isInRange = false;\n if (startDay !== undefined && startMonth !== undefined && startYear !== undefined &&\n endDay !== undefined && endMonth !== undefined && endYear !== undefined) {\n const selectionStartNoTime = getDateFromDayMonthAndYear(startDay, startMonth, startYear);\n const selectionEndNoTime = getDateFromDayMonthAndYear(endDay, endMonth, endYear);\n isInRange =\n toCheckNoTime.getTime() >= selectionStartNoTime.getTime() &&\n toCheckNoTime.getTime() <= selectionEndNoTime.getTime();\n }\n\n return { isStartDate, isInRange, isEndDate };\n}\n\nfunction checkDisabled(\n day: number,\n month: number,\n year: number,\n minDate: Date | null | undefined,\n maxDate: Date | null | undefined,\n): boolean {\n const toCheckNoTime = getDateFromDayMonthAndYear(day, month, year);\n\n if (minDate) {\n const { day: minDay, month: minMonth, year: minYear } = getDayMonthAndYearOfDate(minDate);\n if (toCheckNoTime < getDateFromDayMonthAndYear(minDay, minMonth, minYear)) return true;\n }\n\n if (maxDate) {\n const { day: maxDay, month: maxMonth, year: maxYear } = getDayMonthAndYearOfDate(maxDate);\n if (toCheckNoTime > getDateFromDayMonthAndYear(maxDay, maxMonth, maxYear)) return true;\n }\n\n return false;\n}\n\nfunction checkIsToday(day: number, month: number, year: number): boolean {\n const { day: currDay, month: currMonth, year: currYear } = getDayMonthAndYearOfDate(new Date());\n return day === currDay && month === currMonth && year === currYear;\n}\n\nexport default function DatePickerMonth({\n className = '',\n month = new Date().getMonth() + 1,\n year = new Date().getFullYear(),\n onSelect = () => null,\n selectionStart,\n selectionEnd,\n minDate = null,\n maxDate = null,\n}: DatePickerMonthProps) {\n const locale = getLocale('-');\n const daysInMonth = getDaysInMonth(month, year);\n const startWeekDayOfMonth = getStartWeekDayOfMonth(month, year);\n\n return (\n <div className={cx(styles.datePickerMonth, className)}>\n <div className={cx(styles.datePickerMonthContent)}>\n {getWeekDays(locale).map((weekDay, index) => <div key={index}>{weekDay}</div>)}\n {Array.from(Array(startWeekDayOfMonth - 1).keys()).map((index) => (\n <div\n key={index}\n className={cx(styles.datePickerMonthItem, styles.datePickerMonthPlaceholder)}\n />\n ))}\n {Array.from(Array(daysInMonth).keys()).map((index) => {\n const day = index + 1;\n const selectedRes = checkSelected(day, month, year, selectionStart, selectionEnd);\n const isDisabled = checkDisabled(day, month, year, minDate, maxDate);\n const isToday = checkIsToday(day, month, year);\n\n return (\n <InteractableDiv\n key={day}\n onClick={() => isDisabled ? null : onSelect(getDateFromDayMonthAndYear(day, month, year))}\n className={cx(styles.datePickerMonthDay, styles.datePickerMonthItem, {\n [styles.datePickerMonthDaySelected]: selectedRes.isInRange,\n [styles.datePickerMonthDaySelectedStart]: selectedRes.isStartDate,\n [styles.datePickerMonthDaySelectedEnd]: selectedRes.isEndDate,\n [styles.datePickerMonthDayDisabled]: isDisabled,\n [styles.datePickerMonthDayToday]: isToday,\n })}\n >\n {day}\n </InteractableDiv>\n );\n })}\n {Array.from(Array(42 - (startWeekDayOfMonth + daysInMonth - 1)).keys()).map((index) => (\n <div\n key={index}\n className={cx(styles.datePickerMonthItem, styles.datePickerMonthPlaceholder)}\n >\n \n </div>\n ))}\n </div>\n </div>\n );\n}\n",".infiniteBlock {\n max-height: none;\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport cx from 'classnames';\n\nimport styles from './infiniteBlock.module.pcss';\nimport SpinnerLoading from '../loading/spinnerLoading';\nimport type { InfiniteBlockProps } from './infiniteBlock.types';\n\n// Walk down a React element tree until we reach a string leaf or an array of children.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction childStartsWithKey(child: React.ReactElement<any>, key: string): boolean {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let node: React.ReactElement<any> = child;\n\n while (\n node.props.children !== null &&\n typeof node.props.children === 'object' &&\n !Array.isArray(node.props.children)\n ) {\n node = node.props.children as typeof node;\n }\n\n const content: unknown = node.props.children;\n\n if (Array.isArray(content)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const arr = content as any[];\n // If the first element has no children of its own, scan for a raw string\n if (!arr[0]?.props?.children) {\n for (const item of arr) {\n if (typeof item === 'string' && item.trim().length > 0) {\n return item.toLowerCase().startsWith(key);\n }\n }\n }\n return String(arr[0].props.children).toLowerCase().startsWith(key);\n }\n\n return String(content).toLowerCase().startsWith(key);\n}\n\nfunction clampIndex(index: number, change: number, length: number): number {\n const next = index + change;\n if (next === length) return 0;\n if (next < -1) return length - 1;\n return next;\n}\n\nfunction InfiniteBlock({\n children,\n onScroll,\n className = '',\n isDataLoading = false,\n setHighlightedIndex = () => null,\n}: InfiniteBlockProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Use a ref (not state) for the scroll-guard so reads are always synchronous,\n // avoiding the React-batching race where two scroll events fire before the\n // first setState call has been committed.\n const isScrollLoadingRef = useRef(false);\n const [showScrollSpinner, setShowScrollSpinner] = useState(false);\n\n // Keyboard nav state lives in refs — it doesn't affect rendering.\n const indexRef = useRef(-1);\n const lastKeyRef = useRef<string | null>(null);\n\n const handleScroll = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const { scrollTop, offsetHeight, scrollHeight } = el;\n\n // Browsers calculate scrollTop with a small floating-point error under zoom,\n // so we allow up to 5px of slack before deciding we are at the bottom.\n if (Math.abs(scrollTop + offsetHeight - scrollHeight) > 5) return;\n if (isScrollLoadingRef.current) return;\n\n isScrollLoadingRef.current = true;\n setShowScrollSpinner(true);\n onScroll().then(() => {\n isScrollLoadingRef.current = false;\n setShowScrollSpinner(false);\n });\n }, [onScroll]);\n\n const respondToUserInput = useCallback(\n (event: KeyboardEvent) => {\n const el = containerRef.current;\n if (!el) return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const childArray = React.Children.toArray(children) as React.ReactElement<any>[];\n const { scrollHeight, childElementCount } = el;\n const lineHeight = scrollHeight / childElementCount;\n let index = indexRef.current;\n\n switch (event.key) {\n case 'ArrowDown':\n index = clampIndex(index, 1, childArray.length);\n break;\n case 'ArrowUp':\n index = clampIndex(index, -1, childArray.length);\n break;\n default:\n for (let i = 0; i < childArray.length; i++) {\n if (childStartsWithKey(childArray[i], event.key)) {\n if (index >= i && lastKeyRef.current === event.key) {\n continue;\n }\n index = i;\n break;\n }\n }\n }\n\n indexRef.current = index;\n lastKeyRef.current = event.key;\n\n if (index >= 0) {\n el.scrollTop = index * lineHeight;\n setHighlightedIndex(index);\n }\n },\n [children, setHighlightedIndex]\n );\n\n useEffect(() => {\n document.addEventListener('keydown', respondToUserInput);\n return () => document.removeEventListener('keydown', respondToUserInput);\n }, [respondToUserInput]);\n\n return (\n <div\n className={cx(styles.infiniteBlock, className)}\n onScroll={handleScroll}\n ref={containerRef}\n >\n {isDataLoading ? <SpinnerLoading /> : children}\n {showScrollSpinner && <SpinnerLoading />}\n </div>\n );\n}\n\nexport default InfiniteBlock;\n","\n.required-mark {\n padding: 0px 0px 0px 4px;\n color: var(--error-font-color);\n}\n\n.dropdown {\n position: relative;\n\n &-label {\n display: flex;\n\n &-column {\n flex-direction: column;\n }\n\n &-text {\n white-space: nowrap;\n margin-right: 5px;\n margin-bottom: 5px;\n display: flex;\n align-items: center;\n color: var(--text-color);\n font-size: 12px;\n position: absolute;\n top: -15px;\n }\n }\n\n &-input {\n position: relative;\n cursor: pointer;\n background-color: var(--input-background);\n border-radius: var(--default-border-radius);\n\n &-plain {\n background: transparent;\n }\n\n &:focus-within {\n outline: none;\n }\n\n &-button {\n padding: 7.5px 20% 7.5px 7.5px !important;\n background-color: transparent;\n border: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n text-align: left;\n width: 100%;\n line-height: 20px;\n color: var(--text-color);\n\n &-disabled {\n background-color: var(--disabled-input-color);\n color: var(--disabled-font-color);\n }\n\n &:focus {\n outline: none;\n }\n\n &-icon {\n float: right;\n background-color: transparent;\n border: none;\n position: absolute;\n outline: none;\n right: var(--spacing-s);\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-color);\n cursor: pointer;\n\n &-arrow {\n transition: transform 0.25s;\n pointer-events: none;\n\n &-open {\n transform: rotate(180deg);\n }\n }\n }\n }\n\n &-list {\n width: calc(100% - 1px);\n border: 1px solid var(--border-color);\n position: absolute;\n background-color: var(--background);\n border-radius: var(--default-border-radius);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transform: scaleY(1);\n transition: transform 0.25s;\n transform-origin: right top;\n z-index: 1;\n overflow-y: auto;\n max-height: 160px;\n list-style-type: none;\n left: -1px;\n\n &-on-top {\n bottom: 56px;\n }\n\n &-wider {\n width: max-content !important;\n }\n\n &-item {\n border: none;\n cursor: pointer;\n background-color: var(--background);\n padding: 6px;\n text-align: left;\n border-radius: 0;\n transition: all 0.3s;\n\n &-active {\n background-color: var(--background-accent);\n }\n\n &-selected {\n font-weight: 500;\n }\n\n &:focus {\n outline: none;\n }\n\n &:hover {\n background-color: var(--background-accent);\n }\n }\n\n &-hidden {\n transform: scaleY(0);\n }\n }\n }\n\n &-fieldset {\n position: absolute;\n width: 100%;\n margin: 0;\n box-sizing: border-box;\n border-radius: var(--default-border-radius);\n inset: -10px 0 0 0;\n padding-left: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: var(--border-color);\n pointer-events: none;\n user-select: none;\n\n &-legend {\n display: block;\n max-width: 0;\n transition: max-width 0.2s;\n white-space: nowrap;\n padding: 0;\n\n &-active {\n max-width: 300px;\n }\n\n span {\n font-size: 13px;\n padding: 5px;\n opacity: 0;\n }\n }\n }\n\n &-placeholder {\n position: absolute;\n top: 8px;\n left: 7px;\n transition: all 0.2s;\n opacity: 0;\n\n &-shown {\n animation: 0.2s fadeIn 0.3s forwards;\n }\n }\n\n &-matLabel {\n position: absolute;\n transition: all 0.3s;\n inset: 9px 0 0 7px;\n font-size: 16px;\n pointer-events: none;\n user-select: none;\n\n &-floating {\n inset: -9px 0 0 14px;\n font-size: 13px;\n }\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 0.5;\n }\n }\n\n &-border {\n outline: 1px solid var(--border-color);\n transition: border-color;\n background-color: var(--input-background);\n outline: none;\n\n &-focused {\n outline-color: var(--primary-color);\n border-color: var(--primary-color);\n }\n\n &-searchFocused {\n outline-color: var(--search-input-color);\n outline-width: 2px;\n border-color: var(--search-input-color);\n }\n\n &-plain {\n border-color: transparent;\n outline-color: transparent;\n }\n\n &-invalid {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n\n &-invalid:hover {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n\n &-error {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n }\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport cx from 'classnames';\nimport InfiniteBlock from 'components/common/infiniteBlock';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown as dropdownIcon } from '@fortawesome/free-solid-svg-icons';\nimport Downshift, { StateChangeOptions, DownshiftState } from 'downshift';\nimport Tooltip from 'components/common/tooltip';\n\nimport styles from './dropdown.module.pcss';\nimport type { DropdownProps, DropdownItem } from './dropdown.types';\n\nfunction Dropdown({\n errorMessage = '',\n className = '',\n label = '',\n value = '',\n isValid = true,\n tabIndex = 0,\n isRequired = false,\n customProps = {},\n isRow = false,\n disabled = false,\n onScroll = () => Promise.resolve(),\n isListOnTop = false,\n onClick,\n onChange,\n onFocus: onFocusProp = null,\n onBlur: onBlurProp = null,\n onMouseEnter: onMouseEnterProp = null,\n onMouseLeave: onMouseLeaveProp = null,\n dropdownLabel: dropdownLabelProp,\n isDropdownListWider = false,\n inputClassName = '',\n dropDownIconClassName = '',\n dropDownClassName = '',\n formValidator = null,\n labelClassName = '',\n dropDownInputClassName = '',\n items = [],\n useMatLabelStyle = true,\n placeholder = '',\n plainStyle = false,\n scrollToSelected = false,\n reactRef,\n}: DropdownProps) {\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [, forceUpdate] = useState(0);\n const fvRef = useRef(formValidator);\n\n useEffect(() => {\n fvRef.current = formValidator;\n if (!fvRef.current) return;\n fvRef.current.label = label ?? '';\n fvRef.current.validate();\n const listener = () => forceUpdate(n => n + 1);\n fvRef.current.registerOnUpdateListener(listener);\n return () => fvRef.current?.removeOnUpdateListener(listener);\n }, [formValidator, label]);\n\n const onMouseEnterHandler = (event: React.MouseEvent) => {\n setIsHovered(true);\n onMouseEnterProp?.(event);\n };\n\n const onMouseLeaveHandler = (event: React.MouseEvent) => {\n setIsHovered(false);\n onMouseLeaveProp?.(event);\n };\n\n const onFocusHandler = (event: React.FocusEvent) => {\n setIsFocused(true);\n onFocusProp?.(event);\n };\n\n const onBlurHandler = (event: React.FocusEvent) => {\n if (fvRef.current) fvRef.current.touched = true;\n setIsFocused(false);\n onBlurProp?.(event);\n };\n\n const hasError = (): boolean => {\n return formValidator\n ? (formValidator.touched && formValidator.hasError())\n : (!isValid || !!errorMessage);\n };\n\n const computedIsRequired = (): boolean => {\n return !!(isRequired || formValidator?.validators.find(\n (v) => (v as { validatorId?: string }).validatorId === 'required'\n ));\n };\n\n const onChangeHandler = (val: string | number): void => {\n if (formValidator) {\n formValidator.set(val);\n onChange?.(formValidator.value, customProps);\n } else {\n onChange?.(val, customProps);\n }\n };\n\n let dropdownLabel = dropdownLabelProp;\n const currentValue = formValidator ? formValidator.value as string | number : value;\n const hasErr = hasError();\n\n items.forEach((item: DropdownItem) => {\n if (item.key === currentValue) {\n dropdownLabel = item.label as string;\n }\n });\n\n return (\n <div\n className={cx(className, styles.dropdownLabel, styles.dropdown, {\n [styles.dropdownLabelColumn]: !isRow,\n })}\n onMouseEnter={onMouseEnterHandler}\n onMouseLeave={onMouseLeaveHandler}\n >\n <Downshift\n onChange={(selection: DropdownItem | null) => onChangeHandler((selection || { key: '' }).key)}\n itemToString={(item: DropdownItem | null) => (item ? String(item.key) : '')}\n selectedItem={items.find((el) => el.key === currentValue) ?? null}\n stateReducer={(state: DownshiftState<DropdownItem>, changes: StateChangeOptions<DropdownItem>) => {\n if (scrollToSelected && Object.prototype.hasOwnProperty.call(changes, 'isOpen')) {\n return {\n ...changes,\n highlightedIndex: changes.isOpen ? items.indexOf(state.selectedItem as DropdownItem) : null,\n };\n }\n return changes;\n }}\n >\n {({\n getItemProps,\n getToggleButtonProps,\n isOpen,\n selectedItem,\n highlightedIndex,\n setHighlightedIndex,\n }) => (\n <div>\n <div\n onFocus={onFocusHandler}\n onBlur={onBlurHandler}\n className={cx(\n styles.dropdownInput,\n {\n [styles.dropdownInputPlain]: plainStyle,\n [styles.dropdownInputButtonDisabled]: disabled,\n },\n dropDownInputClassName\n )}\n >\n <button\n tabIndex={tabIndex}\n type=\"button\"\n style={isDropdownListWider ? { padding: '6px', border: 'none' } : {}}\n className={cx(styles.dropdownInputButton, inputClassName)}\n {...getToggleButtonProps()}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n getToggleButtonProps().onClick?.(e);\n onClick?.(e);\n }}\n ref={reactRef}\n >\n {dropdownLabel || currentValue || <div> </div>}\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n className={cx(styles.dropdownInputButtonIcon, dropDownIconClassName)}\n {...getToggleButtonProps()}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n getToggleButtonProps().onClick?.(e);\n onClick?.(e);\n }}\n >\n {!disabled && (\n <FontAwesomeIcon\n icon={dropdownIcon}\n className={cx(styles.dropdownInputButtonIconArrow, {\n [styles.dropdownInputButtonIconArrowOpen]: isOpen,\n })}\n />\n )}\n </button>\n {!disabled && isOpen ? (\n <InfiniteBlock\n onScroll={onScroll}\n className={cx(styles.dropdownInputList, {\n [styles.dropdownInputListOnTop]: isListOnTop,\n [styles.dropdownInputListWider]: isDropdownListWider,\n })}\n setHighlightedIndex={setHighlightedIndex}\n >\n {items.map((item: DropdownItem, index: number) => (\n <div\n key={item.key}\n {...getItemProps({ index, item, disabled: !!item.disabled })}\n className={cx(styles.dropdownInputListItem, dropDownClassName, {\n [styles.dropdownInputListItemActive]: highlightedIndex === index,\n [styles.dropdownInputListItemSelected]: selectedItem === item,\n })}\n >\n {item.label}\n </div>\n ))}\n </InfiniteBlock>\n ) : null}\n <fieldset\n className={cx(styles.dropdownFieldset, {\n [styles.dropdownBorderPlain]: plainStyle,\n [styles.dropdownBorderFocused]: isFocused,\n [styles.dropdownBorderInvalid]: hasErr,\n [styles.dropdownBorderError]: hasErr,\n })}\n >\n <legend\n className={cx(styles.dropdownFieldsetLegend, {\n [styles.dropdownFieldsetLegendActive]:\n useMatLabelStyle && (isFocused || currentValue),\n })}\n >\n <span>{label}</span>\n </legend>\n </fieldset>\n {useMatLabelStyle && label && (\n <div\n className={cx(styles.dropdownMatLabel, {\n [styles.dropdownMatLabelFloating]: isFocused || currentValue,\n })}\n >\n {label}\n </div>\n )}\n {useMatLabelStyle && placeholder && (\n <div\n className={cx(\n styles.dropdownPlaceholder,\n isFocused && !dropdownLabel && styles.dropdownPlaceholderShown\n )}\n >\n {placeholder}\n </div>\n )}\n </div>\n </div>\n )}\n </Downshift>\n {label && !useMatLabelStyle && (\n <div className={cx(styles.dropdownLabelText, labelClassName)}>\n {label}\n {computedIsRequired() ? <div className={styles.requiredMark}>*</div> : null}\n </div>\n )}\n <Tooltip\n variant=\"error\"\n message={formValidator ? formValidator.getCurrentErrorMessage() : (errorMessage || '')}\n isVisible={hasErr && (isFocused || isHovered)}\n />\n </div>\n );\n}\n\nexport default Dropdown;\n",".datePicker {\n position: relative;\n width: 100%;\n flex: 1;\n min-width: 105px;\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 8px 0;\n\n &-monthAndYear {\n display: flex;\n\n &-container {\n display: flex;\n gap: 16px;\n position: relative;\n }\n }\n\n &-month {\n width: 120px;\n }\n\n &-year {\n width: 75px;\n }\n }\n\n &-month {\n min-width: 185px;\n }\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport cx from 'classnames';\nimport InputModern from '../input';\nimport DatePickerMonth from './components/datePickerMonth';\nimport { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons';\nimport { getLocale } from 'services/localization';\nimport ActionIcon from '../actionIcon';\nimport Modal from '../modal';\nimport FloatingMenu from '../floatingMenu';\nimport Dropdown from '../dropdown';\nimport { Align } from '../floatingMenu/floatingMenu.types';\nimport InputMask, { InputState, BeforeMaskedStateChangeStates } from '@mona-health/react-input-mask';\nimport { getDateFromDayMonthAndYear, getMonthName, getMonthNames, getDateString, correctDateMaskValue } from './dateFunctions';\nimport Button from '../button';\nimport Tooltip from '../tooltip';\nimport type FormValidator from 'services/formValidation/formValidator';\n\nimport styles from './datePicker.module.pcss';\n\ninterface DatePickerProps {\n className?: string;\n selected?: Date;\n onSelect?: (date: Date | null) => void;\n formValidator?: FormValidator | null;\n noInput?: boolean;\n noHeader?: boolean;\n isModal?: boolean;\n isInline?: boolean;\n onChange?: (date: Date | null) => void;\n minDate?: Date | null;\n maxDate?: Date | null;\n children?: React.ReactNode;\n showClearButton?: boolean;\n label?: string;\n isValid?: boolean;\n errorMessage?: string;\n isRequired?: boolean;\n startDate?: Date;\n endDate?: Date;\n}\n\nexport default function DatePicker({\n className = '',\n selected,\n onSelect = () => null,\n formValidator = null,\n noInput = false,\n noHeader = false,\n isModal = false,\n isInline = false,\n onChange = () => null,\n minDate = null,\n maxDate = null,\n children = null,\n showClearButton = false,\n label = '',\n isValid = true,\n errorMessage = '',\n isRequired = false,\n startDate,\n endDate,\n}: DatePickerProps) {\n const getCurrValue = (): Date | undefined =>\n formValidator ? (formValidator.value as Date) : selected;\n\n const initialDate = getCurrValue() ?? new Date();\n\n const [currentMonth, setCurrentMonth] = useState(initialDate.getMonth() + 1);\n const [currentYear, setCurrentYear] = useState(initialDate.getFullYear());\n const [isPickerOpen, setIsPickerOpen] = useState(false);\n const [currentDateString, setCurrentDateString] = useState(() =>\n getCurrValue() ? getDateString(initialDate) : ''\n );\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [, forceUpdate] = useState(0);\n const [prevSelected, setPrevSelected] = useState(selected);\n\n const fvRef = useRef(formValidator);\n\n // Sync navigation view when `selected` prop changes externally\n if (prevSelected !== selected) {\n setPrevSelected(selected);\n const d = selected ?? new Date();\n setCurrentMonth(d.getMonth() + 1);\n setCurrentYear(d.getFullYear());\n setCurrentDateString(selected ? getDateString(selected) : '');\n }\n\n // Subscribe to formValidator updates (external system → setState in callback)\n useEffect(() => {\n fvRef.current = formValidator;\n if (!formValidator) return;\n const listener = () => {\n const val = formValidator.value as Date | undefined;\n if (val) {\n setCurrentMonth(val.getMonth() + 1);\n setCurrentYear(val.getFullYear());\n setCurrentDateString(getDateString(val));\n } else {\n setCurrentDateString('');\n }\n forceUpdate((n: number) => n + 1);\n };\n formValidator.registerOnUpdateListener(listener);\n return () => formValidator.removeOnUpdateListener(listener);\n }, [formValidator]);\n\n const hasError = (): boolean => {\n return formValidator\n ? (formValidator.touched && formValidator.hasError())\n : (!isValid || !!errorMessage);\n };\n\n const computedIsRequired = (): boolean => {\n return !!(isRequired || formValidator?.validators.find(\n (v) => (v as { validatorId?: string }).validatorId === 'required'\n ));\n };\n\n const handleChange = (date: Date | null) => {\n setCurrentDateString(date ? getDateString(date) : '');\n if (formValidator) formValidator.set(date);\n onChange(date);\n };\n\n const handleSelect = (date: Date | null) => {\n handleChange(date);\n onSelect(date);\n setIsPickerOpen(false);\n };\n\n const changeMonth = (delta: number) => {\n setCurrentMonth((prev) => {\n let next = prev + delta;\n if (next < 1) { next = 12; setCurrentYear((y) => y - 1); }\n else if (next > 12) { next = 1; setCurrentYear((y) => y + 1); }\n return next;\n });\n };\n\n const tryParseDateString = (dateString: string): Date | null => {\n if (dateString.match(/\\d{2}\\.\\d{2}\\.\\d{4}/gi)) {\n const [day, month, year] = dateString.split('.');\n const parsedDate = getDateFromDayMonthAndYear(Number(day), Number(month), Number(year));\n if (parsedDate && parsedDate.toString() !== 'Invalid Date') {\n const isSmallerThanMaxDate = !maxDate || parsedDate <= maxDate;\n const isBiggerThanMinDate = !minDate || parsedDate >= minDate;\n if (isSmallerThanMaxDate && isBiggerThanMinDate) return parsedDate;\n }\n }\n return null;\n };\n\n const beforeMaskedStateChange = ({ previousState, nextState }: BeforeMaskedStateChangeStates): InputState => {\n // previousState is only supplied on user-driven change events; on mount/focus/blur\n // there is nothing to auto-correct, so the next state passes through unchanged.\n if (!previousState || nextState.value === previousState.value) return nextState;\n\n const corrected = correctDateMaskValue(nextState.value, previousState.value, nextState.selection ?? null);\n\n const parsedDate = tryParseDateString(corrected.value);\n if (parsedDate) handleChange(parsedDate);\n\n return corrected;\n };\n\n const getYearDropdownOptions = () => {\n let length = 400;\n let zeroOffset = new Date().getFullYear() - 200;\n if (minDate) zeroOffset = minDate.getFullYear();\n if (maxDate) length = maxDate.getFullYear() - zeroOffset + 1;\n return Array.from(Array(length).keys()).map((i) => ({ key: i + zeroOffset, label: i + zeroOffset }));\n };\n\n const currValue = getCurrValue();\n const hasErr = hasError();\n\n const header = noHeader ? null : (\n <div className={styles.datePickerHeader}>\n <ActionIcon icon={faChevronLeft} onClick={() => changeMonth(-1)} />\n <div className={styles.datePickerHeaderMonthAndYearContainer}>\n <div className={styles.datePickerHeaderMonthAndYear}>\n <Dropdown\n plainStyle\n scrollToSelected\n onChange={(v) => setCurrentMonth(v as number)}\n className={styles.datePickerHeaderMonth}\n value={getMonthName(getLocale('-'), currentYear, currentMonth, 1)}\n items={getMonthNames().map((month, index) => ({ key: index + 1, label: month }))}\n />\n <Dropdown\n plainStyle\n scrollToSelected\n useMatLabelStyle={false}\n className={styles.datePickerHeaderYear}\n onChange={(v) => setCurrentYear(v as number)}\n value={currentYear}\n items={getYearDropdownOptions()}\n />\n </div>\n </div>\n <ActionIcon icon={faChevronRight} onClick={() => changeMonth(1)} />\n </div>\n );\n\n const pickerContent = (\n <>\n {header}\n <DatePickerMonth\n className={styles.datePickerMonth}\n month={currentMonth}\n year={currentYear}\n onSelect={handleSelect}\n selectionStart={startDate ?? currValue}\n selectionEnd={endDate ?? currValue}\n minDate={minDate}\n maxDate={maxDate}\n />\n {showClearButton && <Button onClick={() => handleSelect(null)}>Clear</Button>}\n {children}\n </>\n );\n\n const input = noInput ? null : (\n <InputModern\n readOnly={isModal}\n label={`${label}${computedIsRequired() ? ' *' : ''}`}\n value={currentDateString}\n onChange={(v) => setCurrentDateString(v as string)}\n onClick={() => setIsPickerOpen(true)}\n customInput={\n <InputMask mask=\"99.99.9999\" maskPlaceholder=\"_\" beforeMaskedStateChange={beforeMaskedStateChange} />\n }\n onBlur={() => {\n if (fvRef.current) fvRef.current.touched = true;\n setIsFocused(false);\n handleChange(tryParseDateString(currentDateString));\n }}\n onFocus={() => setIsFocused(true)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n isValid={!hasErr}\n />\n );\n\n const picker = (() => {\n if (isInline) return pickerContent;\n if (isModal) {\n return (\n <Modal hideHeader isOpen={isPickerOpen} onClose={() => setIsPickerOpen(false)}>\n {pickerContent}\n </Modal>\n );\n }\n return (\n <FloatingMenu\n isOpen={isPickerOpen}\n onOpenChange={(open: boolean) => setIsPickerOpen(open)}\n content={pickerContent}\n align={Align.Left}\n dontCloseOnChildClick\n >\n {input}\n </FloatingMenu>\n );\n })();\n\n return (\n <div className={cx(styles.datePicker, className)}>\n {(isModal || isInline) && input}\n {picker}\n <Tooltip\n variant=\"error\"\n message={formValidator ? formValidator.getCurrentErrorMessage() : (errorMessage || '')}\n isVisible={hasErr && (isFocused || isHovered)}\n />\n </div>\n );\n}\n",".emptyState {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-flow: column;\n gap: var(--spacing-m);\n}\n","import cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { ReactElement } from 'react';\nimport type { EmptyStateProps } from './emptyState.types';\nimport styles from './emptyState.module.pcss';\n\nexport default function EmptyState({ className, icon, children, ...rest }: EmptyStateProps): ReactElement {\n return (\n <div {...rest} className={cx(styles.emptyState, className)}>\n {icon && <FontAwesomeIcon icon={icon} />}\n <div>{children ?? 'No entries available'}</div>\n </div>\n );\n}\n",".fab {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n display: flex;\n align-items: stretch;\n padding: 0;\n\n --icon-size: 18px;\n\n /* Make the Ripple wrapper fill the full circular button */\n & > div {\n width: 100%;\n border-radius: 50%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &-content {\n font-size: var(--icon-size);\n width: var(--icon-size);\n height: var(--icon-size);\n\n svg {\n width: var(--icon-size);\n height: var(--icon-size);\n }\n\n &-container {\n display: flex;\n justify-content: center;\n align-items: center;\n }\n }\n\n &-size {\n &-mini {\n width: 40px;\n height: 40px;\n background: var(--background-accent-light);\n }\n }\n}\n","import cx from 'classnames';\n\nimport Button from 'components/common/button';\nimport { ButtonStyleType } from 'components/common/button/button.types';\nimport type { FabBaseProps, FabBaseSize } from './fabBase.types';\n\nimport styles from './fabBase.module.pcss';\n\nconst sizeClass: Record<FabBaseSize, string | null> = {\n default: null,\n mini: styles.fabSizeMini,\n};\n\nfunction FabBase({\n children = null,\n size = 'default',\n className = '',\n styleType = ButtonStyleType.Primary,\n onClick = () => {},\n}: FabBaseProps) {\n return (\n <Button\n styleType={styleType}\n className={cx(styles.fab, sizeClass[size], className)}\n onClick={onClick}\n >\n <div className={styles.fabContentContainer}>\n <div className={styles.fabContent}>{children}</div>\n </div>\n </Button>\n );\n}\n\nexport default FabBase;\n","\n.fab {\n animation: appear 0.3s forwards;\n opacity: 0;\n transform: scale(0);\n box-shadow:\n 0px 3px 5px -1px rgb(0 0 0 / 20%),\n 0px 6px 10px 0px rgb(0 0 0 / 14%),\n 0px 1px 18px 0px rgb(0 0 0 / 12%);\n border-radius: 50%;\n\n &-container {\n position: fixed;\n bottom: 16px;\n right: 16px;\n\n @media (--breakpoint-tablet) {\n z-index: 2;\n }\n }\n\n &-menu {\n position: absolute;\n top: 0;\n transform: translateY(calc(-100% - 16px));\n width: 100%;\n display: flex;\n flex-flow: column-reverse;\n gap: 16px;\n align-items: center;\n pointer-events: none;\n user-select: none;\n\n &-backdrop {\n width: 0%;\n height: 0%;\n position: fixed;\n top: 0;\n left: 0;\n background: black;\n opacity: 0;\n transition: opacity 0.4s;\n\n &-open {\n width: 100%;\n height: 100%;\n opacity: 0.5;\n }\n }\n\n &-entry {\n position: relative;\n cursor: pointer;\n opacity: 0;\n transform: scale(0);\n transition: all 0.2s;\n pointer-events: all;\n\n &:nth-child(2) {\n transition-delay: 0.05s;\n }\n\n &:nth-child(3) {\n transition-delay: 0.1s;\n }\n\n &:nth-child(4) {\n transition-delay: 0.15s;\n }\n\n &:nth-child(5) {\n transition-delay: 0.2s;\n }\n\n &:nth-child(6) {\n transition-delay: 0.25s;\n }\n\n &:nth-child(7) {\n transition-delay: 0.3s;\n }\n\n &-shown {\n opacity: 1;\n transform: scale(1);\n }\n\n &-label {\n background: var(--background-accent-light);\n border-radius: var(--default-border-radius);\n padding: 4px 8px;\n\n &-container {\n position: absolute;\n width: max-content;\n transform: translateX(-100%);\n height: 100%;\n margin-left: -8px;\n align-items: center;\n display: flex;\n }\n }\n }\n }\n\n &-icon {\n transition: all 0.4s;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n width: 100%;\n height: 100%;\n\n &-menuOpen {\n transform: rotate(225deg);\n }\n\n &-content {\n position: absolute;\n width: 18px;\n height: 18px;\n opacity: 0;\n transition: opacity 0.3s;\n\n &-shown {\n opacity: 1;\n }\n }\n }\n\n @keyframes appear {\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n}\n","import { useState } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPlus as addIcon } from '@fortawesome/free-solid-svg-icons';\n\nimport FabBase from './components/fabBase';\nimport type { FabProps } from './fab.types';\n\nimport styles from './fab.module.pcss';\n\nfunction Fab({\n children = null,\n size = 'default',\n menuEntries = [],\n onMenuEntryClicked = () => {},\n onClick = () => {},\n closeMenuOnEntryClicked = true,\n ...rest\n}: FabProps) {\n const [menuOpen, setMenuOpen] = useState(false);\n\n function handleFabClick() {\n if (menuEntries.length > 0) setMenuOpen((prev) => !prev);\n onClick();\n }\n\n function handleEntryClick(e: React.MouseEvent, id: string) {\n e.stopPropagation();\n if (closeMenuOnEntryClicked) setMenuOpen(false);\n onMenuEntryClicked(id);\n }\n\n return (\n <div {...rest} className={styles.fabContainer}>\n <div\n className={cx(styles.fabMenuBackdrop, menuOpen && styles.fabMenuBackdropOpen)}\n onClick={(e) => { e.stopPropagation(); setMenuOpen(false); }}\n />\n <div onClick={(e) => e.stopPropagation()}>\n <FabBase className={styles.fab} size={size} onClick={handleFabClick}>\n <div className={cx(styles.fabIcon, menuOpen && styles.fabIconMenuOpen)}>\n <div className={cx(styles.fabIconContent, !menuOpen && styles.fabIconContentShown)}>\n {children}\n </div>\n <div className={cx(styles.fabIconContent, menuOpen && styles.fabIconContentShown)}>\n <FontAwesomeIcon icon={addIcon} />\n </div>\n </div>\n </FabBase>\n </div>\n <div className={styles.fabMenu}>\n {menuEntries.map(({ id, label, icon }) => (\n <div\n key={id}\n className={cx(styles.fabMenuEntry, menuOpen && styles.fabMenuEntryShown)}\n onClick={(e) => handleEntryClick(e, id)}\n >\n {label && (\n <div className={styles.fabMenuEntryLabelContainer}>\n <div className={styles.fabMenuEntryLabel}>{label}</div>\n </div>\n )}\n <FabBase size=\"mini\">\n <FontAwesomeIcon icon={icon} />\n </FabBase>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport default Fab;\n","import React from 'react';\n\nconst Can = (props) => {\n //const { width, height } = props;\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-1.02083 -3.15 21.04 17.65\" {...props}>\n <path\n d=\"M 0 0 L 0 11 Q 9 16 19 11 l 0 -11 M 3 12 l 0 -7 Q 9 7 16 5 l 0 7 M 6 -2 q -8.5 1 -5 3 q 8 3 17 0 q 3.5 -2 -5 -3 q -3.5 -0.3 -7 0 z\"\n strokeWidth=\"1\"\n fill=\"none\"\n />\n </svg>\n );\n};\n\nexport default Can;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Can from './svg/can';\n\nconst Icon = ({ type, ...rest }) => {\n switch (type) {\n case 'can':\n return <Can {...rest} />;\n default:\n return null;\n }\n};\n\nIcon.propTypes = {\n type: PropTypes.string.isRequired,\n};\n\nexport default Icon;\n","import Icon from './Icon';\n\nexport default Icon;\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { IdleManagerProps } from './idleManager.types';\n\nconst ACTIVITY_EVENTS = ['click', 'mousemove', 'keydown', 'scroll', 'touchstart'] as const;\n\nfunction IdleManager({\n children = null,\n idleAfterSeconds = 600,\n renderCondition = true,\n}: IdleManagerProps) {\n const [isIdleContentShown, setIsIdleContentShown] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const resetIdleTimeout = useCallback(() => {\n if (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n setIsIdleContentShown(false);\n timeoutRef.current = setTimeout(() => {\n setIsIdleContentShown(true);\n }, idleAfterSeconds * 1000);\n }, [idleAfterSeconds]);\n\n // Re-run whenever idleAfterSeconds changes (or on first mount)\n useEffect(() => {\n resetIdleTimeout();\n }, [resetIdleTimeout]);\n\n // Register / unregister activity listeners\n useEffect(() => {\n for (const event of ACTIVITY_EVENTS) {\n document.addEventListener(event, resetIdleTimeout);\n }\n return () => {\n for (const event of ACTIVITY_EVENTS) {\n document.removeEventListener(event, resetIdleTimeout);\n }\n // Clear any pending timeout on unmount so it never fires after we're gone\n if (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n };\n }, [resetIdleTimeout]);\n\n return <>{renderCondition && isIdleContentShown && children}</>;\n}\n\nexport default IdleManager;\n",".board {\n display: flex;\n gap: var(--spacing-s);\n overflow-x: auto;\n align-items: flex-start;\n width: 100%;\n}\n\n.column {\n background: var(--background-accent-light);\n border-radius: var(--default-border-radius);\n box-shadow: var(--card-shadow);\n flex: 1 1 0;\n display: flex;\n flex-direction: column;\n border: 2px solid transparent;\n transition: border-color 0.15s ease, background 0.15s ease;\n\n &-empty {\n flex: 0 1 0;\n min-width: 140px;\n }\n\n &-over {\n border-color: var(--primary-lighter);\n background: var(--background-accent);\n }\n\n &-header {\n padding: var(--spacing-m) var(--spacing-l);\n background: var(--background-accent);\n border-radius: var(--default-border-radius) var(--default-border-radius) 0 0;\n font-size: var(--header-small-font-size);\n font-weight: var(--header-font-weight);\n color: var(--text-color);\n border-bottom: 1px solid var(--border-color);\n }\n\n &-items {\n padding: var(--spacing-m);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-m);\n min-height: 80px;\n flex: 1;\n }\n}\n\n.item {\n cursor: grab;\n touch-action: none;\n\n &:active {\n cursor: grabbing;\n }\n\n &-dragging {\n opacity: 0.4;\n }\n}\n\n.dragOverlay {\n border-radius: var(--default-border-radius);\n cursor: grabbing;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25), var(--card-shadow);\n}\n","import type { ReactNode } from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport cx from 'classnames';\n\nimport styles from './kanbanBoard.module.pcss';\n\ninterface KanbanItemProps {\n id: string;\n children: ReactNode;\n}\n\nfunction KanbanItem({ id, children }: KanbanItemProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n });\n\n return (\n <div\n ref={setNodeRef}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={cx(styles.item, isDragging && styles.itemDragging)}\n {...attributes}\n {...listeners}\n >\n {children}\n </div>\n );\n}\n\nexport default KanbanItem;\n","import type { ReactNode } from 'react';\nimport { useDroppable } from '@dnd-kit/core';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport cx from 'classnames';\n\nimport type { KanbanColumnProps } from './kanbanBoard.types';\nimport styles from './kanbanBoard.module.pcss';\nimport KanbanItem from './KanbanItem';\n\ninterface KanbanColumnInternalProps<T> extends KanbanColumnProps {\n itemIds: string[];\n items: Record<string, T>;\n renderItem: (item: T, id: string) => ReactNode;\n}\n\nfunction KanbanColumn<T>({\n id,\n title,\n itemIds,\n items,\n renderItem,\n className,\n classNames,\n styles: slotStyles,\n}: KanbanColumnInternalProps<T>) {\n const droppableId = `column-${id}`;\n const { setNodeRef, isOver } = useDroppable({ id: droppableId });\n\n return (\n <div className={cx(styles.column, isOver && styles.columnOver, itemIds.length === 0 && styles.columnEmpty, className)}>\n <div className={cx(styles.columnHeader, classNames?.header)} style={slotStyles?.header}>{title}</div>\n <SortableContext items={itemIds} strategy={verticalListSortingStrategy}>\n <div ref={setNodeRef} className={cx(styles.columnItems, classNames?.items)} style={slotStyles?.items}>\n {itemIds.map((itemId) => (\n <KanbanItem key={itemId} id={itemId}>\n {items[itemId] !== undefined ? renderItem(items[itemId], itemId) : null}\n </KanbanItem>\n ))}\n </div>\n </SortableContext>\n </div>\n );\n}\n\nexport default KanbanColumn;\n","import { useState } from 'react';\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n useSensor,\n useSensors,\n closestCorners,\n type DragStartEvent,\n type DragOverEvent,\n type DragEndEvent,\n} from '@dnd-kit/core';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport cx from 'classnames';\n\nimport type { KanbanBoardProps, KanbanColumnDef } from './kanbanBoard.types';\nimport styles from './kanbanBoard.module.pcss';\nimport KanbanColumn from './KanbanColumn';\n\nfunction KanbanBoard<T = unknown>({\n columns,\n items,\n renderItem,\n onChange,\n className,\n style,\n classNames,\n styles: slotStyles,\n}: KanbanBoardProps<T>) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const [shadowColumns, setShadowColumns] = useState<KanbanColumnDef[] | null>(null);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: { distance: 8 },\n })\n );\n\n const displayColumns = shadowColumns ?? columns;\n\n function findColumnForItem(cols: KanbanColumnDef[], itemId: string): number {\n return cols.findIndex((col) => col.itemIds.includes(itemId));\n }\n\n function handleDragStart({ active }: DragStartEvent) {\n setActiveId(String(active.id));\n setShadowColumns(columns.map((col) => ({ ...col, itemIds: [...col.itemIds] })));\n }\n\n function handleDragOver({ active, over }: DragOverEvent) {\n if (!over) return;\n\n const activeItemId = String(active.id);\n const overId = String(over.id);\n\n setShadowColumns((prev) => {\n const base = prev ?? columns.map((col) => ({ ...col, itemIds: [...col.itemIds] }));\n const next = base.map((col) => ({ ...col, itemIds: [...col.itemIds] }));\n\n const sourceColIndex = findColumnForItem(next, activeItemId);\n if (sourceColIndex === -1) return prev;\n\n // Determine destination column\n let destColIndex: number;\n if (overId.startsWith('column-')) {\n const colId = overId.slice('column-'.length);\n destColIndex = next.findIndex((col) => col.id === colId);\n } else {\n destColIndex = findColumnForItem(next, overId);\n }\n\n if (destColIndex === -1) return prev;\n\n if (sourceColIndex === destColIndex) {\n // Reorder within the same column\n const col = next[sourceColIndex];\n const oldIndex = col.itemIds.indexOf(activeItemId);\n const newIndex = col.itemIds.indexOf(overId);\n if (oldIndex !== -1 && newIndex !== -1 && oldIndex !== newIndex) {\n next[sourceColIndex] = {\n ...col,\n itemIds: arrayMove(col.itemIds, oldIndex, newIndex),\n };\n }\n } else {\n // Move across columns\n next[sourceColIndex].itemIds = next[sourceColIndex].itemIds.filter(\n (id) => id !== activeItemId\n );\n const overIndex = next[destColIndex].itemIds.indexOf(overId);\n const insertAt = overIndex === -1 ? next[destColIndex].itemIds.length : overIndex;\n next[destColIndex].itemIds.splice(insertAt, 0, activeItemId);\n }\n\n return next;\n });\n }\n\n function handleDragEnd({ active, over }: DragEndEvent) {\n setActiveId(null);\n\n if (!over || !shadowColumns) {\n setShadowColumns(null);\n return;\n }\n\n // Commit shadow columns to parent\n onChange(shadowColumns);\n setShadowColumns(null);\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCorners}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n <div className={cx(styles.board, className)} style={style}>\n {displayColumns.map((col) => (\n <KanbanColumn\n key={col.id}\n id={col.id}\n title={col.title}\n itemIds={col.itemIds}\n items={items}\n renderItem={renderItem}\n />\n ))}\n </div>\n <DragOverlay>\n {activeId && items[activeId] !== undefined ? (\n <div className={cx(styles.dragOverlay, classNames?.dragOverlay)} style={slotStyles?.dragOverlay}>{renderItem(items[activeId], activeId)}</div>\n ) : null}\n </DragOverlay>\n </DndContext>\n );\n}\n\nexport default KanbanBoard;\n",".iconLoading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n position: absolute;\n left: 0;\n top: 0;\n user-select: none;\n pointer-events: none;\n\n --draw-duration: 0.8s;\n --delay: 0.4s;\n\n svg {\n stroke-dasharray: 14;\n stroke-dashoffset: 14;\n width: 200px;\n aspect-ratio: 1;\n animation: calc(var(--draw-duration) * 3) spin-to-oblivion var(--delay) infinite;\n transform: rotate(0deg);\n stroke: var(--primary-color);\n stroke-linecap: round;\n }\n\n &-first {\n animation: calc(var(--draw-duration) * 3) draw-line var(--delay) infinite;\n }\n\n &-second {\n animation: calc(var(--draw-duration) * 3) draw-line-two var(--delay) infinite;\n }\n\n @keyframes draw-line {\n 33% {\n stroke-dashoffset: 0;\n }\n 95% {\n stroke-dashoffset: 0;\n }\n 96% {\n stroke-dashoffset: 14;\n }\n }\n\n @keyframes draw-line-two {\n 33% {\n stroke-dashoffset: 14;\n }\n 66% {\n stroke-dashoffset: 0;\n }\n 95% {\n stroke-dashoffset: 0;\n }\n 96% {\n stroke-dashoffset: 14;\n }\n }\n\n @keyframes spin-to-oblivion {\n 50% {\n transform: rotate(180deg);\n }\n 75% {\n transform: rotate(180deg) scale(0);\n }\n 100% {\n transform: rotate(180deg) scale(0);\n }\n }\n}\n","import React from 'react';\nimport cx from 'classnames';\n\nimport styles from './iconLoading.module.pcss';\n\nfunction IconLoading({ className = '' }) {\n return (\n <div className={cx(styles.iconLoading, className)}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-8 -1 16 14\">\n <path\n className={styles.iconLoadingFirst}\n d=\"M 0 0 C 3 5 6 5 6 12\"\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n <path\n className={styles.iconLoadingFirst}\n d=\"M 0 0 C -3 5 -6 5 -6 12\"\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n <path className={styles.iconLoadingFirst} d=\"M 0 0 L 0 10\" strokeWidth=\"1.7\" fill=\"none\" />\n <path\n className={styles.iconLoadingSecond}\n d=\"M 0.1 10 C -3 10 -4 10 -6 12\"\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n <path\n className={styles.iconLoadingSecond}\n d=\"M -0.1 10 C 3 10 4 10 6 12\"\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n </svg>\n </div>\n );\n}\n\nexport default IconLoading;\n","import IconLoading from './iconLoading.js';\n\nexport default IconLoading;\n",".numberInput{\n\n}\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\nimport { NumericFormat, NumericFormatProps } from 'react-number-format';\nimport type FormValidator from 'services/formValidation/formValidator';\n\nimport styles from './numberInput.module.pcss';\nimport Input from '../input';\n\ninterface Properties\n extends Omit<NumericFormatProps, 'onValueChange' | 'value' | 'customInput' | 'onChange'> {\n value?: number | string;\n onChange?: (value: number | undefined) => void;\n formValidator?: FormValidator | null;\n label?: string;\n error?: string;\n className?: string;\n allowNegative?: boolean;\n decimalSeparator?: string;\n thousandSeparator?: string | boolean;\n prefix?: string;\n suffix?: string;\n decimalScale?: number;\n placeholder?: string;\n sign?: '+' | '-';\n}\n\nfunction NumberInput({\n value,\n onChange,\n formValidator,\n label,\n error,\n className,\n allowNegative = false,\n decimalSeparator,\n thousandSeparator,\n prefix,\n suffix,\n decimalScale,\n placeholder,\n sign,\n ...rest\n}: Properties): ReactElement {\n const rawValue = formValidator != null ? formValidator.value as number | string : value;\n // When a sign is forced, display the absolute value — the prefix character carries the sign visually.\n const displayValue = sign != null && rawValue != null ? Math.abs(Number(rawValue)) : rawValue;\n const controlledValue = displayValue != null ? String(displayValue) : '';\n\n function handleValueChange(floatValue: number | undefined) {\n let out = floatValue;\n if (out !== undefined) {\n if (sign === '-') out = -Math.abs(out);\n if (sign === '+') out = Math.abs(out);\n }\n if (formValidator != null) formValidator.set(out ?? null);\n onChange?.(out);\n }\n\n const resolvedPrefix = sign === '-' ? '-' : sign === '+' ? '+' : prefix;\n\n return (\n <Input\n label={label}\n className={cx(styles.numberInput, className)}\n value={controlledValue}\n onChange={() => {}}\n formValidator={null}\n isValid={formValidator ? (formValidator.touched ? !formValidator.hasError() : true) : !error}\n errorMessage={formValidator ? (formValidator.getCurrentErrorMessage() ?? '') : (error ?? '')}\n placeholder={placeholder}\n customInput={\n <NumericFormat\n onValueChange={(vals) => handleValueChange(vals.floatValue)}\n allowNegative={sign != null ? false : allowNegative}\n decimalSeparator={decimalSeparator}\n thousandSeparator={thousandSeparator}\n decimalScale={decimalScale}\n fixedDecimalScale\n prefix={resolvedPrefix}\n suffix={suffix}\n {...rest}\n />\n }\n />\n );\n}\n\nexport default NumberInput;\n","import NumberInput from './numberInput';\n\nexport default NumberInput;\n",".optionPicker{\n display: flex;\n width: 100%;\n gap: var(--spacing-m);\n border-radius: var(--default-border-radius);\n border: 1px solid var(--border-color);\n justify-content: space-around;\n position: relative;\n overflow: hidden;\n\n &-chip {\n position: absolute;\n height: 100%;\n top: 0;\n left: 0;\n background: var(--primary-color);\n border-radius: var(--default-border-radius);\n transition: left 0.25s ease-in-out, width 0.25s ease-in-out;\n }\n\n &-option {\n position: relative;\n width: 100%;\n height: 100%;\n display: block;\n text-align: center;\n cursor: pointer;\n padding: var(--spacing-m);\n overflow: hidden;\n text-overflow: ellipsis;\n border-radius: var(--default-border-radius);\n transition: color 0.25s;\n\n &:focus {\n outline: var(--primary-color) solid 2px;\n outline-offset: -2px;\n }\n\n &-active {\n color: var(--text-on-primary);\n }\n }\n}\n","import type { ReactElement } from 'react';\nimport { OptionPickerProps } from './optionPicker.types';\nimport cx from 'classnames';\n\nimport styles from './optionPicker.module.pcss';\nimport InteractableDiv from '../interactableDiv';\n\n\nfunction OptionPicker({\n className = undefined,\n options,\n onChange,\n value,\n ...rest\n}: OptionPickerProps): ReactElement {\n const optionPickerLeft = options.findIndex((option) => option.key === value) * 100 / options.length;\n\n return (\n <div {...rest} className={cx(styles.optionPicker, className)}>\n <div className={styles.optionPickerChip} style={{ left: `${optionPickerLeft}%`, width: `${100 / options.length}%` }} />\n {options.map((option) => (\n <InteractableDiv\n onClick={(e) => onChange(option.key, e)}\n key={option.key}\n className={cx(\n styles.optionPickerOption,\n option.key === value && styles.optionPickerOptionActive\n )}\n tabIndex={option.key === value ? -1 : 0}\n >\n {option.label}\n </InteractableDiv>\n ))}\n </div>\n );\n}\n\nexport default OptionPicker;\n","import { useState, useEffect } from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport interface WindowSize {\n width: number;\n height: number;\n isMobileSize: boolean;\n}\n\nexport default function useWindowSize(): WindowSize {\n const [size, setSize] = useState<WindowSize>(() => ({\n width: window.innerWidth,\n height: window.innerHeight,\n isMobileSize: window.innerWidth < MOBILE_BREAKPOINT,\n }));\n\n useEffect(() => {\n function onResize() {\n setSize({\n width: window.innerWidth,\n height: window.innerHeight,\n isMobileSize: window.innerWidth < MOBILE_BREAKPOINT,\n });\n }\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n return size;\n}\n",".overscroll {\n height: 100vh;\n overflow: auto;\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none; /* Firefox */\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &-header {\n position: absolute;\n bottom: 0;\n width: 100%;\n\n &-centered {\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &-container {\n position: relative;\n }\n }\n}\n","import { useRef, useEffect, useCallback } from 'react';\nimport cx from 'classnames';\nimport type { UIEvent } from 'react';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport styles from './overscroll.module.pcss';\nimport type { OverscrollProps } from './overscroll.types';\n\nexport default function Overscroll({\n children = null,\n overscrollContent = null,\n overscrollContentDesktop = null,\n centerHeader = true,\n min = 10,\n max = 80,\n start = 30,\n unit = '%',\n mobileOnly = true,\n onScrollChange = () => {},\n scrollDisabled = false,\n}: OverscrollProps) {\n const { isMobileSize, height } = useWindowSize();\n\n const overscrollRef = useRef<HTMLDivElement>(null);\n const overscrollHeaderRef = useRef<HTMLDivElement>(null);\n const overscrollHeaderContainerRef = useRef<HTMLDivElement>(null);\n const isScrollingRef = useRef(false);\n const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const onScrollChangeRef = useRef(onScrollChange);\n onScrollChangeRef.current = onScrollChange;\n\n const updateHeaderHeight = useCallback(\n (scrollTop: number) => {\n let h: number;\n if (unit === '%') {\n if (!overscrollHeaderContainerRef.current) return;\n const containerH = overscrollHeaderContainerRef.current.clientHeight;\n h = Math.max((containerH * min) / 100, containerH - scrollTop);\n } else {\n h = Math.max(min, max - scrollTop);\n }\n if (overscrollHeaderRef.current) {\n overscrollHeaderRef.current.style.height = `${h}px`;\n }\n },\n [min, max, unit],\n );\n\n const scrollToInitialPosition = useCallback(() => {\n let toScroll: number;\n if (unit === '%') {\n if (!overscrollHeaderContainerRef.current) return;\n const hundredPerc = (overscrollHeaderContainerRef.current.clientHeight / max) * 100;\n toScroll =\n overscrollHeaderContainerRef.current.clientHeight - hundredPerc * (start / 100);\n } else {\n toScroll = max - start;\n }\n if (overscrollRef.current) {\n overscrollRef.current.scrollTop = toScroll;\n updateHeaderHeight(toScroll);\n }\n }, [max, start, unit, updateHeaderHeight]);\n\n // Initial scroll position on mount (and if scroll-related props change)\n useEffect(() => {\n const id = setTimeout(scrollToInitialPosition, 100);\n return () => clearTimeout(id);\n }, [scrollToInitialPosition]);\n\n // Toggle overflow when scrollDisabled changes\n useEffect(() => {\n if (overscrollRef.current) {\n overscrollRef.current.style.overflow = scrollDisabled ? 'hidden' : 'auto';\n }\n }, [scrollDisabled]);\n\n // Scroll to initial position when entering mobile view\n const prevIsMobileRef = useRef(isMobileSize);\n useEffect(() => {\n if (isMobileSize && !prevIsMobileRef.current) scrollToInitialPosition();\n prevIsMobileRef.current = isMobileSize;\n }, [isMobileSize, scrollToInitialPosition]);\n\n // Scroll to initial position when mobileOnly is turned off (full overscroll DOM just mounted)\n const prevMobileOnlyRef = useRef(mobileOnly);\n useEffect(() => {\n if (!mobileOnly && prevMobileOnlyRef.current) scrollToInitialPosition();\n prevMobileOnlyRef.current = mobileOnly;\n }, [mobileOnly, scrollToInitialPosition]);\n\n // Update header height on window resize while in mobile view\n const prevHeightRef = useRef(height);\n useEffect(() => {\n if (isMobileSize && height !== prevHeightRef.current && overscrollRef.current) {\n updateHeaderHeight(overscrollRef.current.scrollTop);\n }\n prevHeightRef.current = height;\n }, [height, isMobileSize, updateHeaderHeight]);\n\n function handleScroll(e: UIEvent<HTMLDivElement>) {\n updateHeaderHeight(e.currentTarget.scrollTop);\n if (!isScrollingRef.current) {\n isScrollingRef.current = true;\n onScrollChangeRef.current(true);\n }\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n scrollTimeoutRef.current = setTimeout(() => {\n scrollTimeoutRef.current = null;\n isScrollingRef.current = false;\n onScrollChangeRef.current(false);\n }, 500);\n }\n\n if (mobileOnly && !isMobileSize) {\n if (overscrollContentDesktop) return <div>{overscrollContentDesktop}{children}</div>;\n return <>{children}</>;\n }\n\n const contentMinHeight = unit === '%' ? `${100 - min}%` : `calc(100% - ${min}px)`;\n\n return (\n <div className={styles.overscroll} ref={overscrollRef} onScroll={handleScroll}>\n <div\n className={styles.overscrollHeaderContainer}\n style={{ height: `${max}${unit}` }}\n ref={overscrollHeaderContainerRef}\n >\n <div\n className={cx(styles.overscrollHeader, centerHeader && styles.overscrollHeaderCentered)}\n ref={overscrollHeaderRef}\n >\n {overscrollContent}\n </div>\n </div>\n <div style={{ minHeight: contentMinHeight }}>{children}</div>\n </div>\n );\n}\n",".progressBar{\n min-width: 100px;\n min-height: 10px;\n background-color: #e0e0e0;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n display: flex;\n align-items: center;\n\n &-fill {\n height: stretch;\n background-color: var(--primary-color);\n width: 0;\n display: flex;\n align-items: center;\n overflow: hidden;\n transition: width .3s ease;\n\n &-end {\n border-radius: 0 var(--default-border-radius) var(--default-border-radius) 0;\n }\n }\n\n &-label {\n color: white;\n font-size: 12px;\n padding: 0 5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &-custom {\n mix-blend-mode: difference;\n }\n }\n}\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\nimport { Progress, ProgressBarProps } from './progressBar.types';\n\nimport styles from './progressBar.module.pcss';\n\nexport function getContrastColor(hexColor: string): string {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n \n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n return luminance > 0.5 ? '#000000' : '#ffffff';\n}\n\nfunction ProgressBar({\n className = undefined,\n total = 100,\n progress = 0,\n style = undefined,\n ...rest\n}: ProgressBarProps): ReactElement {\n\n function renderProgressBars() {\n const progressArray: Progress[] = [];\n\n if (Array.isArray(progress)) progressArray.push(...progress);\n else if (typeof progress === 'object') progressArray.push(progress);\n else progressArray.push({ amount: progress });\n\n return progressArray.map((prog, index) => {\n const widthPercentage = !total ? 0 : (prog.amount / total) * 100;\n\n return (\n <div\n key={index}\n className={cx(\n styles.progressBarFill,\n index === progressArray.length - 1 && styles.progressBarFillEnd,\n prog.class,\n )}\n style={{\n width: `${widthPercentage}%`,\n background: prog.color || undefined,\n ...(style || {}),\n }}\n title={prog.label ? `${prog.label}: ${prog.amount}` : undefined}\n >\n {prog.label && <div className={styles.progressBarLabel} style={prog.color ? { color: getContrastColor(prog.color) } : {}}>{prog.label}</div>}\n </div>\n );\n });\n }\n\n return (\n <div {...rest} className={cx(styles.progressBar, className)} style={style}>\n {renderProgressBars()}\n </div>\n );\n}\n\nexport default ProgressBar;\n","import type { Point, RoomData, DoorData } from './roomDrawer.types';\n\nexport const CANVAS_W = 400;\nexport const CANVAS_H = 300;\nexport const GRID = 5;\nexport const DOOR_WIDTH = 12;\nexport const CLOSE_THRESHOLD = 8; // px in SVG units to close a polygon\nexport const WALL_TOLERANCE = 8; // max distance to snap to a wall for door placement\n\n// ─── Coordinate helpers ────────────────────────────────────────────────────\n\nexport function snap(v: number): number {\n return Math.round(v / GRID) * GRID;\n}\n\nexport function snapPt(p: Point): Point {\n return { x: snap(p.x), y: snap(p.y) };\n}\n\nexport function clientToSVG(clientX: number, clientY: number, svg: SVGSVGElement): Point {\n const pt = svg.createSVGPoint();\n pt.x = clientX;\n pt.y = clientY;\n const m = svg.getScreenCTM();\n if (!m) return { x: 0, y: 0 };\n const raw = pt.matrixTransform(m.inverse());\n return snapPt({ x: raw.x, y: raw.y });\n}\n\n// ─── Geometry ──────────────────────────────────────────────────────────────\n\nexport function dist(a: Point, b: Point): number {\n return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);\n}\n\nexport function pointToSegment(p: Point, a: Point, b: Point): { dist: number; t: number } {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n if (len2 === 0) return { dist: dist(p, a), t: 0 };\n const t = Math.max(0, Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2));\n const px = a.x + t * dx;\n const py = a.y + t * dy;\n return { dist: Math.sqrt((p.x - px) ** 2 + (p.y - py) ** 2), t };\n}\n\nexport function nearestWall(pt: Point, rooms: RoomData[]): { roomId: string; wallIndex: number; t: number } | null {\n let best: { roomId: string; wallIndex: number; t: number; dist: number } | null = null;\n for (const room of rooms) {\n const pts = room.points;\n for (let i = 0; i < pts.length; i++) {\n const a = pts[i];\n const b = pts[(i + 1) % pts.length];\n const { dist: d, t } = pointToSegment(pt, a, b);\n if (d <= WALL_TOLERANCE && (!best || d < best.dist)) {\n best = { roomId: room.id, wallIndex: i, t, dist: d };\n }\n }\n }\n return best;\n}\n\nexport function pointInPolygon(pt: Point, poly: Point[]): boolean {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const xi = poly[i].x, yi = poly[i].y;\n const xj = poly[j].x, yj = poly[j].y;\n if ((yi > pt.y) !== (yj > pt.y) && pt.x < ((xj - xi) * (pt.y - yi)) / (yj - yi) + xi) {\n inside = !inside;\n }\n }\n return inside;\n}\n\nexport function centroid(pts: Point[]): Point {\n return {\n x: pts.reduce((s, p) => s + p.x, 0) / pts.length,\n y: pts.reduce((s, p) => s + p.y, 0) / pts.length,\n };\n}\n\nexport function rectToPoints(x: number, y: number, w: number, h: number): Point[] {\n return [\n { x, y },\n { x: x + w, y },\n { x: x + w, y: y + h },\n { x, y: y + h },\n ];\n}\n\n// Returns the two endpoints of the door opening and a perpendicular unit vector (for the swing arc).\nexport function doorEndpoints(\n a: Point,\n b: Point,\n t: number,\n width: number,\n): { p1: Point; p2: Point; perp: Point } | null {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 0.001) return null;\n const nx = dx / len;\n const ny = dy / len;\n const cx = a.x + dx * t;\n const cy = a.y + dy * t;\n const hw = Math.min(width / 2, len / 2 - 0.001);\n return {\n p1: { x: cx - nx * hw, y: cy - ny * hw },\n p2: { x: cx + nx * hw, y: cy + ny * hw },\n perp: { x: -ny, y: nx },\n };\n}\n\n// ─── SVG export ────────────────────────────────────────────────────────────\n\nfunction escapeSVG(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction ptsToClosedPath(pts: Point[]): string {\n return pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(' ') + ' Z';\n}\n\n// Returns one path string per wall segment between door gaps.\n// 0 doors → [closed path] | N doors → N open paths\nexport function buildWallSegments(pts: Point[], wallDoors: DoorData[]): string[] {\n if (pts.length < 2) return [];\n\n if (wallDoors.length === 0) {\n return [pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(' ') + ' Z'];\n }\n\n const n = pts.length;\n const segments: string[][] = [];\n let current: string[] = [`M ${pts[0].x.toFixed(2)},${pts[0].y.toFixed(2)}`];\n\n for (let i = 0; i < n; i++) {\n const a = pts[i];\n const b = pts[(i + 1) % n];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n const segs = wallDoors.filter((d) => d.wallIndex === i).sort((x, y) => x.t - y.t);\n\n if (segs.length === 0) {\n current.push(`L ${b.x.toFixed(2)},${b.y.toFixed(2)}`);\n } else {\n for (const door of segs) {\n const hw = door.width / 2;\n const t1 = Math.max(0, door.t - hw / len);\n const t2 = Math.min(1, door.t + hw / len);\n const gs = { x: a.x + dx * t1, y: a.y + dy * t1 };\n const ge = { x: a.x + dx * t2, y: a.y + dy * t2 };\n current.push(`L ${gs.x.toFixed(2)},${gs.y.toFixed(2)}`);\n segments.push(current);\n current = [`M ${ge.x.toFixed(2)},${ge.y.toFixed(2)}`];\n }\n current.push(`L ${b.x.toFixed(2)},${b.y.toFixed(2)}`);\n }\n }\n\n // Wrap-around: the last segment ends at pts[0] where segments[0] started —\n // merge them so each segment is one continuous open path.\n segments[0] = [...current, ...segments[0].slice(1)];\n\n return segments.map((s) => s.join(' '));\n}\n\nfunction buildDoorArcPath(a: Point, b: Point, door: DoorData): string {\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return '';\n const { p1, p2, perp } = ep;\n const swingEnd = { x: p1.x + perp.x * door.width, y: p1.y + perp.y * door.width };\n return [\n `M ${p1.x.toFixed(2)},${p1.y.toFixed(2)} L ${p2.x.toFixed(2)},${p2.y.toFixed(2)}`,\n `M ${p1.x.toFixed(2)},${p1.y.toFixed(2)} A ${door.width},${door.width} 0 0,1 ${swingEnd.x.toFixed(2)},${swingEnd.y.toFixed(2)}`,\n ].join(' ');\n}\n\nexport function generateSVG(rooms: RoomData[], doors: DoorData[]): string {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const r of rooms) {\n for (const p of r.points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n }\n if (!isFinite(minX)) { minX = 0; minY = 0; maxX = CANVAS_W; maxY = CANVAS_H; }\n\n const pad = 5;\n const vb = [\n (minX - pad).toFixed(2),\n (minY - pad).toFixed(2),\n (maxX - minX + pad * 2).toFixed(2),\n (maxY - minY + pad * 2).toFixed(2),\n ].join(' ');\n\n const roomEls = rooms.map((room) => {\n const roomDoors = doors.filter((d) => d.roomId === room.id);\n const wallSegs = buildWallSegments(room.points, roomDoors);\n const bgPath = ptsToClosedPath(room.points);\n const c = centroid(room.points);\n\n const wallPaths = wallSegs.map((d) => ` <path d=\"${d}\" />`).join('\\n');\n\n const doorPaths = roomDoors\n .map((door) => {\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const d = buildDoorArcPath(a, b, door);\n return d ? ` <path d=\"${d}\" fill=\"none\" />` : '';\n })\n .filter(Boolean)\n .join('\\n');\n\n const labelEl = room.name\n ? ` <text fontSize=\"5\" x=\"${c.x.toFixed(1)}\" y=\"${c.y.toFixed(1)}\">${escapeSVG(room.name)}</text>`\n : '';\n\n return [` <g id=\"${room.id}\">`, wallPaths, ` <path id=\"background\" d=\"${bgPath}\" />`, doorPaths, labelEl, ` </g>`]\n .filter(Boolean)\n .join('\\n');\n });\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"${vb}\">`,\n ` <g id=\"layer1\">`,\n ...roomEls,\n ` </g>`,\n ` <use id=\"use\" href=\"\" />`,\n `</svg>`,\n ].join('\\n');\n}\n\n// ─── SVG import ────────────────────────────────────────────────────────────\n\nfunction parseClosedPath(d: string): Point[] {\n const points: Point[] = [];\n for (const m of d.matchAll(/[ML]\\s*([-\\d.]+)[,\\s]+([-\\d.]+)/gi)) {\n points.push({ x: parseFloat(m[1]), y: parseFloat(m[2]) });\n }\n return points;\n}\n\nexport function parseSVGRooms(svgString: string): RoomData[] {\n const doc = new DOMParser().parseFromString(svgString, 'image/svg+xml');\n const rooms: RoomData[] = [];\n doc.querySelectorAll('[id^=\"room\"]').forEach((group) => {\n const bg = group.querySelector('[id=\"background\"]');\n if (!bg) return;\n const d = bg.getAttribute('d');\n if (!d) return;\n const points = parseClosedPath(d);\n if (points.length < 3) return;\n const name = group.querySelector('text')?.textContent?.trim() ?? '';\n rooms.push({ id: group.id, name, points });\n });\n return rooms;\n}\n\nexport function downloadSVG(rooms: RoomData[], doors: DoorData[]): void {\n const svg = generateSVG(rooms, doors);\n const blob = new Blob([svg], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'room-plan.svg';\n a.click();\n URL.revokeObjectURL(url);\n}\n",".roomDrawer {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n overflow: hidden;\n background: var(--background);\n user-select: none;\n\n &-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 8px;\n background: var(--background-accent);\n border-bottom: 1px solid var(--border-color);\n\n &-sep {\n flex: 1;\n }\n\n &-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.12s, color 0.12s;\n\n &:hover:not(:disabled) {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n\n &:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n }\n\n &-active {\n background: var(--primary-accent);\n color: var(--primary-color);\n border-color: var(--primary-lighter);\n }\n }\n\n &-zoomLabel {\n padding: 0 4px;\n min-width: 40px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 11px;\n text-align: center;\n\n &:hover {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n }\n }\n\n &-canvas {\n display: block;\n width: 100%;\n cursor: crosshair;\n user-select: none;\n\n &-select {\n cursor: default;\n }\n }\n\n &-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n\n &-label {\n font-size: 12px;\n color: var(--text-dark);\n white-space: nowrap;\n }\n\n &-input {\n flex: 1;\n max-width: 220px;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: var(--background);\n color: var(--text-color);\n font-size: 13px;\n\n &:focus {\n outline: none;\n border-color: var(--primary-color);\n }\n }\n\n &-spacer {\n flex: 1;\n }\n\n &-delete {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n transition: background 0.12s, color 0.12s, border-color 0.12s;\n\n &:hover {\n background: #e53935;\n color: #fff;\n border-color: #e53935;\n }\n }\n }\n\n &-hint {\n padding: 4px 8px;\n font-size: 11px;\n color: var(--text-dark);\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n }\n\n &-info {\n &-doorsBtn {\n display: flex;\n align-items: center;\n gap: 5px;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n white-space: nowrap;\n transition: background 0.12s, color 0.12s;\n\n &:hover {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n }\n }\n\n &-doorPanel {\n display: flex;\n flex-direction: column;\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n\n &-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-bottom: 1px solid var(--border-color);\n }\n\n &-icon {\n color: var(--text-dark);\n font-size: 12px;\n }\n\n &-title {\n flex: 1;\n font-size: 12px;\n color: var(--text-dark);\n }\n\n &-done {\n display: flex;\n align-items: center;\n gap: 5px;\n height: 26px;\n padding: 0 10px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n transition: background 0.12s, color 0.12s;\n\n &:hover {\n background: var(--primary-accent);\n color: var(--primary-color);\n border-color: var(--primary-lighter);\n }\n }\n\n &-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 6px 8px;\n max-height: 130px;\n overflow-y: auto;\n }\n\n &-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n &-label {\n font-size: 12px;\n color: var(--text-color);\n min-width: 48px;\n }\n\n &-widthLabel {\n font-size: 11px;\n color: var(--text-dark);\n }\n\n &-empty {\n font-size: 11px;\n color: var(--text-dark);\n font-style: italic;\n padding: 2px 0;\n }\n }\n\n &-canvas {\n &-door {\n cursor: crosshair;\n }\n }\n}\n\n/* ── SVG element classes ── */\n\n.doorGap {\n stroke: var(--background);\n stroke-width: 4;\n stroke-linecap: butt;\n pointer-events: none;\n}\n\n.doorMarker {\n fill: var(--primary-color);\n stroke: var(--background);\n stroke-width: 0.8;\n pointer-events: all;\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n}\n\n.gridLine {\n stroke: var(--text-color);\n stroke-width: 0.3;\n opacity: 0.12;\n}\n\n.roomFill {\n fill: var(--primary-accent);\n fill-opacity: 0.08;\n stroke: none;\n\n &-selected {\n fill-opacity: 0.22;\n }\n}\n\n.roomStroke {\n fill: none;\n stroke: var(--primary-color);\n stroke-width: 1.5;\n stroke-linejoin: round;\n\n &-selected {\n stroke: var(--primary-lighter);\n stroke-width: 2;\n }\n}\n\n.roomText {\n fill: var(--text-color);\n stroke: none;\n font-size: 7px;\n pointer-events: none;\n user-select: none;\n}\n\n.doorPanel {\n stroke: var(--primary-color);\n stroke-width: 1.5;\n stroke-linecap: round;\n\n &-selected {\n stroke: var(--primary-lighter);\n stroke-width: 2;\n }\n}\n\n.doorSwing {\n fill: none;\n stroke: var(--primary-color);\n stroke-width: 0.8;\n stroke-dasharray: 3 2;\n pointer-events: none;\n\n &-selected {\n stroke: var(--primary-lighter);\n }\n}\n\n.preview {\n fill: var(--primary-accent);\n stroke: var(--primary-color);\n stroke-width: 1;\n stroke-dasharray: 4 2;\n pointer-events: none;\n}\n\n.polyCloseTarget {\n fill: var(--primary-color);\n opacity: 0.5;\n pointer-events: none;\n}\n\n.polyVertex {\n fill: var(--primary-color);\n stroke: none;\n pointer-events: none;\n}\n\n.vertexHandle {\n fill: var(--background);\n stroke: var(--primary-color);\n stroke-width: 1.5;\n cursor: grab;\n pointer-events: all;\n\n &:hover {\n fill: var(--primary-accent);\n stroke: var(--primary-lighter);\n }\n}\n","import { useState, useRef, useEffect, useLayoutEffect } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faHandPointer,\n faSquare,\n faDrawPolygon,\n faTrash,\n faDownload,\n faUpload,\n faMagnifyingGlassPlus,\n faMagnifyingGlassMinus,\n faDoorOpen,\n faCheck,\n} from '@fortawesome/free-solid-svg-icons';\nimport type { MouseEvent, ReactElement } from 'react';\nimport type { Tool, Point, RoomData, DoorData, RoomDrawerProps } from './roomDrawer.types';\nimport {\n CANVAS_W,\n CANVAS_H,\n GRID,\n DOOR_WIDTH,\n CLOSE_THRESHOLD,\n clientToSVG,\n dist,\n pointToSegment,\n nearestWall,\n pointInPolygon,\n centroid,\n rectToPoints,\n doorEndpoints,\n buildWallSegments,\n downloadSVG,\n parseSVGRooms,\n snapPt,\n} from './roomDrawer.utils';\nimport styles from './roomDrawer.module.pcss';\n\nconst VERTEX_HIT = 6;\nconst WALL_HIT = 5;\nconst ZOOM_STEP = 1.25;\nconst ZOOM_MIN = 0.25;\nconst ZOOM_MAX = 12;\n\ntype DragState =\n | { type: 'room'; roomId: string; start: Point; origPoints: Point[] }\n | { type: 'vertex'; roomId: string; index: number; start: Point; origPt: Point };\n\nlet _seq = 0;\nfunction nextId(prefix: string): string {\n _seq += 1;\n return `${prefix}${_seq}`;\n}\n\nconst TOOL_HINTS: Record<Tool, string> = {\n select:\n 'Drag inside to move · Drag corner to reshape · Click wall to add corner · Dbl-click corner to remove · Delete to erase',\n rect: 'Drag to draw a rectangular room',\n polygon:\n 'Click to place corners · Click first point or Enter to close · Esc to cancel',\n};\n\nexport default function RoomDrawer({ className }: RoomDrawerProps): ReactElement {\n const [rooms, setRooms] = useState<RoomData[]>([]);\n const [doors, setDoors] = useState<DoorData[]>([]);\n const [tool, setTool] = useState<Tool>('rect');\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [editingDoorsForRoomId, setEditingDoorsForRoomId] = useState<string | null>(null);\n\n const [rectStart, setRectStart] = useState<Point | null>(null);\n const [rectCursor, setRectCursor] = useState<Point | null>(null);\n\n const [polyPoints, setPolyPoints] = useState<Point[]>([]);\n const [polyCursor, setPolyCursor] = useState<Point | null>(null);\n\n const [zoom, setZoom] = useState(1);\n const [pan, setPan] = useState<Point>({ x: 0, y: 0 });\n\n const dragRef = useRef<DragState | null>(null);\n const doorDragRef = useRef<string | null>(null); // door id being dragged\n const panDragRef = useRef<{ startClient: Point; origPan: Point; scaleX: number; scaleY: number } | null>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const uploadRef = useRef<HTMLInputElement>(null);\n\n const stateRef = useRef({ rooms, doors, tool, selectedId, editingDoorsForRoomId, polyPoints, zoom, pan });\n useLayoutEffect(() => {\n stateRef.current = { rooms, doors, tool, selectedId, editingDoorsForRoomId, polyPoints, zoom, pan };\n });\n\n function commitPolygon(pts: Point[]) {\n if (pts.length < 3) return;\n setRooms((prev) => [\n ...prev,\n { id: nextId('room'), name: `Room ${prev.length + 1}`, points: pts },\n ]);\n setPolyPoints([]);\n setPolyCursor(null);\n }\n\n // Wheel zoom (passive: false so we can preventDefault)\n useEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const { zoom: z, pan: p } = stateRef.current;\n const pt = clientToSVG(e.clientX, e.clientY, svgRef.current!);\n if (!pt) return;\n const factor = e.deltaY < 0 ? ZOOM_STEP : 1 / ZOOM_STEP;\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z * factor));\n setPan({\n x: pt.x - (pt.x - p.x) * (z / newZoom),\n y: pt.y - (pt.y - p.y) * (z / newZoom),\n });\n setZoom(newZoom);\n }\n svg.addEventListener('wheel', onWheel, { passive: false });\n return () => svg.removeEventListener('wheel', onWheel);\n }, []);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n const { tool: t, selectedId: sel, editingDoorsForRoomId: editDoors, polyPoints: pp, zoom: z, pan: p } = stateRef.current;\n\n if (e.key === 'Escape') {\n if (editDoors) { setEditingDoorsForRoomId(null); return; }\n if (t === 'polygon') { setPolyPoints([]); setPolyCursor(null); }\n setSelectedId(null);\n return;\n }\n if (e.key === 'Enter' && t === 'polygon' && pp.length >= 3) {\n commitPolygon(pp);\n return;\n }\n if ((e.key === '+' || e.key === '=') && !(e.target instanceof HTMLInputElement)) {\n const nz = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z * ZOOM_STEP));\n const cx = p.x + CANVAS_W / z / 2; const cy = p.y + CANVAS_H / z / 2;\n setZoom(nz); setPan({ x: cx - CANVAS_W / nz / 2, y: cy - CANVAS_H / nz / 2 });\n return;\n }\n if (e.key === '-' && !(e.target instanceof HTMLInputElement)) {\n const nz = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z / ZOOM_STEP));\n const cx = p.x + CANVAS_W / z / 2; const cy = p.y + CANVAS_H / z / 2;\n setZoom(nz); setPan({ x: cx - CANVAS_W / nz / 2, y: cy - CANVAS_H / nz / 2 });\n return;\n }\n if (e.key === '0' && !(e.target instanceof HTMLInputElement)) {\n setZoom(1); setPan({ x: 0, y: 0 });\n return;\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && sel && !editDoors && !(e.target instanceof HTMLInputElement)) {\n setRooms((prev) => prev.filter((r) => r.id !== sel));\n setDoors((prev) => prev.filter((d) => d.roomId !== sel));\n setSelectedId(null);\n }\n }\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n // ─── Zoom helpers ─────────────────────────────────────────────────────────\n\n function zoomBy(factor: number, currentZoom = zoom, currentPan = pan) {\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, currentZoom * factor));\n const cx = currentPan.x + CANVAS_W / currentZoom / 2;\n const cy = currentPan.y + CANVAS_H / currentZoom / 2;\n setPan({\n x: cx - CANVAS_W / newZoom / 2,\n y: cy - CANVAS_H / newZoom / 2,\n });\n setZoom(newZoom);\n }\n\n // ─── Drawing helpers ──────────────────────────────────────────────────────\n\n function svgPt(e: MouseEvent): Point | null {\n if (!svgRef.current) return null;\n return clientToSVG(e.clientX, e.clientY, svgRef.current);\n }\n\n // ─── Vertex / wall editing helpers ───────────────────────────────────────\n\n function nearestVertex(pt: Point, room: RoomData): { index: number; d: number } | null {\n let best: { index: number; d: number } | null = null;\n for (let i = 0; i < room.points.length; i++) {\n const d = dist(pt, room.points[i]);\n if (d <= VERTEX_HIT && (!best || d < best.d)) best = { index: i, d };\n }\n return best;\n }\n\n function nearestWallSegment(\n pt: Point,\n room: RoomData,\n ): { index: number; t: number; d: number } | null {\n let best: { index: number; t: number; d: number } | null = null;\n for (let i = 0; i < room.points.length; i++) {\n const a = room.points[i];\n const b = room.points[(i + 1) % room.points.length];\n const { dist: d, t } = pointToSegment(pt, a, b);\n if (d <= WALL_HIT && (!best || d < best.d)) best = { index: i, t, d };\n }\n return best;\n }\n\n function insertVertex(roomId: string, wallIndex: number, t: number, newPt: Point): number {\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== roomId) return r;\n const pts = [...r.points];\n pts.splice(wallIndex + 1, 0, newPt);\n return { ...r, points: pts };\n }),\n );\n setDoors((prev) =>\n prev.map((d) => {\n if (d.roomId !== roomId) return d;\n if (d.wallIndex === wallIndex) {\n if (d.t <= t) return { ...d, t: t > 0 ? d.t / t : 0 };\n return { ...d, wallIndex: wallIndex + 1, t: (d.t - t) / (1 - t) };\n }\n if (d.wallIndex > wallIndex) return { ...d, wallIndex: d.wallIndex + 1 };\n return d;\n }),\n );\n return wallIndex + 1;\n }\n\n function removeVertex(roomId: string, index: number) {\n const room = rooms.find((r) => r.id === roomId);\n if (!room || room.points.length <= 3) return;\n const n = room.points.length;\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== roomId) return r;\n return { ...r, points: r.points.filter((_, i) => i !== index) };\n }),\n );\n setDoors((prev) =>\n prev.map((d) => {\n if (d.roomId !== roomId) return d;\n const prevWall = (index - 1 + n) % n;\n if (d.wallIndex === prevWall || d.wallIndex === index) return { ...d, wallIndex: -1 };\n if (d.wallIndex > index) return { ...d, wallIndex: d.wallIndex - 1 };\n return d;\n }).filter((d) => d.wallIndex !== -1),\n );\n }\n\n // ─── Mouse events ─────────────────────────────────────────────────────────\n\n function handleMouseDown(e: MouseEvent<SVGSVGElement>) {\n // Middle mouse → pan\n if (e.button === 1) {\n e.preventDefault();\n const svg = svgRef.current;\n if (svg) {\n const rect = svg.getBoundingClientRect();\n panDragRef.current = {\n startClient: { x: e.clientX, y: e.clientY },\n origPan: { ...pan },\n scaleX: (CANVAS_W / zoom) / rect.width,\n scaleY: (CANVAS_H / zoom) / rect.height,\n };\n }\n return;\n }\n\n if (e.button !== 0) return;\n e.preventDefault();\n const pt = svgPt(e);\n if (!pt) return;\n\n // Door editing mode: click a wall to add a door\n if (editingDoorsForRoomId) {\n const editingRoom = rooms.find((r) => r.id === editingDoorsForRoomId);\n if (editingRoom) {\n const wall = nearestWall(pt, [editingRoom]);\n if (wall) {\n setDoors((prev) => [\n ...prev,\n { id: nextId('door'), roomId: wall.roomId, wallIndex: wall.wallIndex, t: wall.t, width: DOOR_WIDTH },\n ]);\n }\n }\n return;\n }\n\n if (tool === 'rect') {\n setRectStart(pt); setRectCursor(pt); return;\n }\n\n if (tool === 'polygon') {\n if (polyPoints.length >= 3 && dist(pt, polyPoints[0]) <= CLOSE_THRESHOLD) {\n commitPolygon(polyPoints);\n } else {\n setPolyPoints((prev) => [...prev, pt]);\n }\n return;\n }\n\n if (tool === 'select') {\n const selRoom = rooms.find((r) => r.id === selectedId) ?? null;\n\n if (selRoom) {\n const vh = nearestVertex(pt, selRoom);\n if (vh) {\n dragRef.current = { type: 'vertex', roomId: selRoom.id, index: vh.index, start: pt, origPt: selRoom.points[vh.index] };\n return;\n }\n }\n\n if (selRoom) {\n const wh = nearestWallSegment(pt, selRoom);\n if (wh) {\n const a = selRoom.points[wh.index];\n const b = selRoom.points[(wh.index + 1) % selRoom.points.length];\n const newPt = snapPt({ x: a.x + (b.x - a.x) * wh.t, y: a.y + (b.y - a.y) * wh.t });\n const insertedIndex = insertVertex(selRoom.id, wh.index, wh.t, newPt);\n dragRef.current = { type: 'vertex', roomId: selRoom.id, index: insertedIndex, start: pt, origPt: newPt };\n return;\n }\n }\n\n const clickedRoom = rooms.find((r) => pointInPolygon(pt, r.points));\n if (clickedRoom) {\n setSelectedId(clickedRoom.id);\n dragRef.current = { type: 'room', roomId: clickedRoom.id, start: pt, origPoints: [...clickedRoom.points] };\n return;\n }\n\n setSelectedId(null);\n }\n }\n\n function handleDoubleClick(e: MouseEvent<SVGSVGElement>) {\n if (tool !== 'select' || editingDoorsForRoomId) return;\n const pt = svgPt(e);\n if (!pt) return;\n const selRoom = rooms.find((r) => r.id === selectedId);\n if (!selRoom) return;\n const vh = nearestVertex(pt, selRoom);\n if (vh) { e.preventDefault(); removeVertex(selRoom.id, vh.index); }\n }\n\n function handleMouseMove(e: MouseEvent<SVGSVGElement>) {\n if (panDragRef.current) {\n const { startClient, origPan, scaleX, scaleY } = panDragRef.current;\n setPan({\n x: origPan.x - (e.clientX - startClient.x) * scaleX,\n y: origPan.y - (e.clientY - startClient.y) * scaleY,\n });\n return;\n }\n\n const pt = svgPt(e);\n if (!pt) return;\n\n if (doorDragRef.current && editingDoorsForRoomId) {\n const editRoom = rooms.find((r) => r.id === editingDoorsForRoomId);\n if (editRoom) {\n const wall = nearestWall(pt, [editRoom]);\n if (wall) {\n setDoors((prev) => prev.map((d) =>\n d.id === doorDragRef.current ? { ...d, wallIndex: wall.wallIndex, t: wall.t } : d\n ));\n }\n }\n return;\n }\n\n if (tool === 'rect' && rectStart) { setRectCursor(pt); return; }\n if (tool === 'polygon') { setPolyCursor(pt); return; }\n\n if (tool === 'select' && !editingDoorsForRoomId && dragRef.current) {\n const drag = dragRef.current;\n if (drag.type === 'vertex') {\n const dx = pt.x - drag.start.x;\n const dy = pt.y - drag.start.y;\n const moved = snapPt({ x: drag.origPt.x + dx, y: drag.origPt.y + dy });\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== drag.roomId) return r;\n const pts = [...r.points];\n pts[drag.index] = moved;\n return { ...r, points: pts };\n }),\n );\n } else {\n const dx = pt.x - drag.start.x;\n const dy = pt.y - drag.start.y;\n setRooms((prev) =>\n prev.map((r) =>\n r.id === drag.roomId\n ? { ...r, points: drag.origPoints.map((p) => ({ x: p.x + dx, y: p.y + dy })) }\n : r,\n ),\n );\n }\n }\n }\n\n function handleMouseUp(e: MouseEvent<SVGSVGElement>) {\n if (panDragRef.current) { panDragRef.current = null; return; }\n\n const pt = svgPt(e);\n if (!pt) return;\n\n if (tool === 'rect' && rectStart) {\n const x = Math.min(rectStart.x, pt.x);\n const y = Math.min(rectStart.y, pt.y);\n const w = Math.abs(pt.x - rectStart.x);\n const h = Math.abs(pt.y - rectStart.y);\n if (w >= GRID * 2 && h >= GRID * 2) {\n setRooms((prev) => [\n ...prev,\n { id: nextId('room'), name: `Room ${prev.length + 1}`, points: rectToPoints(x, y, w, h) },\n ]);\n }\n setRectStart(null); setRectCursor(null);\n }\n\n doorDragRef.current = null;\n dragRef.current = null;\n }\n\n // ─── Info bar handlers ────────────────────────────────────────────────────\n\n function handleRenameChange(value: string) {\n if (selectedId) setRooms((prev) => prev.map((r) => (r.id === selectedId ? { ...r, name: value } : r)));\n }\n\n function handleDoorWidthChange(doorId: string, value: string) {\n const w = parseFloat(value);\n if (isNaN(w) || w <= 0) return;\n setDoors((prev) => prev.map((d) => (d.id === doorId ? { ...d, width: w } : d)));\n }\n\n function handleDeleteRoom() {\n if (!selectedId) return;\n setRooms((prev) => prev.filter((r) => r.id !== selectedId));\n setDoors((prev) => prev.filter((d) => d.roomId !== selectedId));\n setEditingDoorsForRoomId(null);\n setSelectedId(null);\n }\n\n function handleDeleteDoor(doorId: string) {\n setDoors((prev) => prev.filter((d) => d.id !== doorId));\n }\n\n function switchTool(t: Tool) {\n setTool(t);\n setEditingDoorsForRoomId(null);\n setPolyPoints([]); setPolyCursor(null);\n setRectStart(null); setRectCursor(null);\n }\n\n function handleUploadChange(e: React.ChangeEvent<HTMLInputElement>) {\n const file = e.target.files?.[0];\n if (!file) return;\n e.target.value = '';\n const reader = new FileReader();\n reader.onload = (ev) => {\n const text = ev.target?.result;\n if (typeof text !== 'string') return;\n const loaded = parseSVGRooms(text);\n if (loaded.length === 0) return;\n const remapped = loaded.map((r) => ({ ...r, id: nextId('room') }));\n setRooms(remapped);\n setDoors([]);\n setSelectedId(null);\n setEditingDoorsForRoomId(null);\n setZoom(1);\n setPan({ x: 0, y: 0 });\n };\n reader.readAsText(file);\n }\n\n // ─── Derived values ───────────────────────────────────────────────────────\n\n const previewRect =\n tool === 'rect' && rectStart && rectCursor\n ? {\n x: Math.min(rectStart.x, rectCursor.x),\n y: Math.min(rectStart.y, rectCursor.y),\n w: Math.abs(rectCursor.x - rectStart.x),\n h: Math.abs(rectCursor.y - rectStart.y),\n }\n : null;\n\n const selectedRoom = selectedId ? (rooms.find((r) => r.id === selectedId) ?? null) : null;\n const editingRoom = editingDoorsForRoomId ? (rooms.find((r) => r.id === editingDoorsForRoomId) ?? null) : null;\n const editingRoomDoors = editingDoorsForRoomId ? doors.filter((d) => d.roomId === editingDoorsForRoomId) : [];\n\n const TOOLS = [\n { t: 'select' as Tool, icon: faHandPointer, label: 'Select & edit' },\n { t: 'rect' as Tool, icon: faSquare, label: 'Rectangle room' },\n { t: 'polygon' as Tool, icon: faDrawPolygon, label: 'Polygon room' },\n ] as const;\n\n const vw = CANVAS_W / zoom;\n const vh = CANVAS_H / zoom;\n\n const canvasCursor = editingDoorsForRoomId ? styles.roomDrawerCanvasDoor : tool === 'select' ? styles.roomDrawerCanvasSelect : undefined;\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n return (\n <div className={cx(styles.roomDrawer, className)}>\n {/* ── Toolbar ── */}\n <div className={styles.roomDrawerToolbar}>\n {TOOLS.map(({ t, icon, label }) => (\n <button\n key={t}\n title={label}\n className={cx(styles.roomDrawerToolbarBtn, t === tool && !editingDoorsForRoomId && styles.roomDrawerToolbarBtnActive)}\n onClick={() => switchTool(t)}\n >\n <FontAwesomeIcon icon={icon} />\n </button>\n ))}\n <div className={styles.roomDrawerToolbarSep} />\n <button title=\"Zoom in (+)\" className={styles.roomDrawerToolbarBtn} onClick={() => zoomBy(ZOOM_STEP)} disabled={zoom >= ZOOM_MAX}>\n <FontAwesomeIcon icon={faMagnifyingGlassPlus} />\n </button>\n <button\n title={`Reset zoom (0) — ${Math.round(zoom * 100)}%`}\n className={styles.roomDrawerToolbarZoomLabel}\n onClick={() => { setZoom(1); setPan({ x: 0, y: 0 }); }}\n >\n {Math.round(zoom * 100)}%\n </button>\n <button title=\"Zoom out (−)\" className={styles.roomDrawerToolbarBtn} onClick={() => zoomBy(1 / ZOOM_STEP)} disabled={zoom <= ZOOM_MIN}>\n <FontAwesomeIcon icon={faMagnifyingGlassMinus} />\n </button>\n <div className={styles.roomDrawerToolbarSep} />\n <button\n title=\"Upload SVG\"\n className={styles.roomDrawerToolbarBtn}\n onClick={() => uploadRef.current?.click()}\n >\n <FontAwesomeIcon icon={faUpload} />\n </button>\n <button\n title=\"Download SVG\"\n className={styles.roomDrawerToolbarBtn}\n onClick={() => downloadSVG(rooms, doors)}\n disabled={rooms.length === 0}\n >\n <FontAwesomeIcon icon={faDownload} />\n </button>\n <input ref={uploadRef} type=\"file\" accept=\".svg,image/svg+xml\" style={{ display: 'none' }} onChange={handleUploadChange} />\n </div>\n\n {/* ── SVG Canvas ── */}\n <svg\n ref={svgRef}\n className={cx(styles.roomDrawerCanvas, canvasCursor)}\n viewBox={`${pan.x} ${pan.y} ${vw} ${vh}`}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onDoubleClick={handleDoubleClick}\n >\n <defs>\n <pattern id=\"rd-grid\" width={GRID} height={GRID} patternUnits=\"userSpaceOnUse\">\n <path d={`M ${GRID} 0 L 0 0 0 ${GRID}`} fill=\"none\" className={styles.gridLine} />\n </pattern>\n </defs>\n <rect x={pan.x} y={pan.y} width={vw} height={vh} fill=\"url(#rd-grid)\" />\n\n {/* ── Rooms ── */}\n {rooms.map((room) => {\n const pts = room.points;\n const fillD = pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x},${p.y}`).join(' ') + ' Z';\n const wallSegs = buildWallSegments(pts, doors.filter((d) => d.roomId === room.id));\n const c = centroid(pts);\n const isSelected = selectedId === room.id;\n const isEditing = editingDoorsForRoomId === room.id;\n return (\n <g key={room.id}>\n <path d={fillD} className={cx(styles.roomFill, (isSelected || isEditing) && styles.roomFillSelected)} />\n {wallSegs.map((seg, si) => (\n <path key={si} d={seg} className={cx(styles.roomStroke, (isSelected || isEditing) && styles.roomStrokeSelected)} />\n ))}\n {room.name && (\n <text x={c.x} y={c.y} className={styles.roomText} textAnchor=\"middle\" dominantBaseline=\"middle\">\n {room.name}\n </text>\n )}\n </g>\n );\n })}\n\n {/* ── Door gap overlays — rendered after all rooms so they cut through adjacent walls ── */}\n {doors.map((door) => {\n const room = rooms.find((r) => r.id === door.roomId);\n if (!room) return null;\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return null;\n return (\n <line\n key={door.id}\n x1={ep.p1.x} y1={ep.p1.y}\n x2={ep.p2.x} y2={ep.p2.y}\n className={styles.doorGap}\n />\n );\n })}\n\n {/* ── Door markers (visible in door editing mode) ── */}\n {editingDoorsForRoomId && editingRoomDoors.map((door) => {\n const room = rooms.find((r) => r.id === door.roomId);\n if (!room) return null;\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return null;\n const mid = { x: (ep.p1.x + ep.p2.x) / 2, y: (ep.p1.y + ep.p2.y) / 2 };\n return (\n <circle\n key={door.id}\n cx={mid.x} cy={mid.y} r={2.5}\n className={styles.doorMarker}\n onMouseDown={(e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n doorDragRef.current = door.id;\n }}\n />\n );\n })}\n\n {/* ── Vertex handles ── */}\n {tool === 'select' && !editingDoorsForRoomId && selectedRoom &&\n selectedRoom.points.map((p, i) => (\n <circle key={i} cx={p.x} cy={p.y} r={3.5} className={styles.vertexHandle} />\n ))}\n\n {/* ── Rect preview ── */}\n {previewRect && (\n <rect x={previewRect.x} y={previewRect.y} width={previewRect.w} height={previewRect.h} className={styles.preview} />\n )}\n\n {/* ── Polygon preview ── */}\n {tool === 'polygon' && polyPoints.length > 0 && (\n <>\n <polyline\n points={[...polyPoints, polyCursor ?? polyPoints[polyPoints.length - 1]].map((p) => `${p.x},${p.y}`).join(' ')}\n className={styles.preview}\n />\n {polyPoints.length >= 3 && (\n <circle cx={polyPoints[0].x} cy={polyPoints[0].y} r={CLOSE_THRESHOLD / 2} className={styles.polyCloseTarget} />\n )}\n {polyPoints.map((p, i) => (\n <circle key={i} cx={p.x} cy={p.y} r={2} className={styles.polyVertex} />\n ))}\n </>\n )}\n </svg>\n\n {/* ── Room info bar ── */}\n {selectedRoom && !editingDoorsForRoomId && (\n <div className={styles.roomDrawerInfo}>\n <span className={styles.roomDrawerInfoLabel}>Name</span>\n <input\n className={styles.roomDrawerInfoInput}\n value={selectedRoom.name}\n onChange={(e) => handleRenameChange(e.target.value)}\n placeholder=\"Room name\"\n />\n <button\n className={styles.roomDrawerInfoDoorsBtn}\n onClick={() => setEditingDoorsForRoomId(selectedRoom.id)}\n title=\"Edit doors\"\n >\n <FontAwesomeIcon icon={faDoorOpen} />\n <span>{doors.filter((d) => d.roomId === selectedRoom.id).length}</span>\n </button>\n <button className={styles.roomDrawerInfoDelete} onClick={handleDeleteRoom} title=\"Delete room\">\n <FontAwesomeIcon icon={faTrash} />\n </button>\n </div>\n )}\n\n {/* ── Door editing panel ── */}\n {editingDoorsForRoomId && editingRoom && (\n <div className={styles.roomDrawerDoorPanel}>\n <div className={styles.roomDrawerDoorPanelHeader}>\n <FontAwesomeIcon icon={faDoorOpen} className={styles.roomDrawerDoorPanelIcon} />\n <span className={styles.roomDrawerDoorPanelTitle}>\n {editingRoom.name ? `Doors · ${editingRoom.name}` : 'Doors'}\n </span>\n <button\n className={styles.roomDrawerDoorPanelDone}\n onClick={() => setEditingDoorsForRoomId(null)}\n title=\"Done (Esc)\"\n >\n <FontAwesomeIcon icon={faCheck} />\n Done\n </button>\n </div>\n <div className={styles.roomDrawerDoorPanelList}>\n {editingRoomDoors.length === 0 && (\n <span className={styles.roomDrawerDoorPanelEmpty}>Click on a wall to add a door</span>\n )}\n {editingRoomDoors.map((door, i) => (\n <div key={door.id} className={styles.roomDrawerDoorPanelItem}>\n <span className={styles.roomDrawerDoorPanelLabel}>Door {i + 1}</span>\n <span className={styles.roomDrawerDoorPanelWidthLabel}>Width</span>\n <input\n className={styles.roomDrawerInfoInput}\n type=\"number\"\n min={1}\n value={door.width}\n onChange={(e) => handleDoorWidthChange(door.id, e.target.value)}\n />\n <button\n className={styles.roomDrawerInfoDelete}\n onClick={() => handleDeleteDoor(door.id)}\n title=\"Delete door\"\n >\n <FontAwesomeIcon icon={faTrash} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n <div className={styles.roomDrawerHint}>\n {editingDoorsForRoomId\n ? 'Click a wall to add a door · Adjust width or delete from the list · Done or Esc to finish'\n : `${TOOL_HINTS[tool]} · Scroll to zoom · Middle-drag to pan · 0 to reset`}\n </div>\n </div>\n );\n}\n",".scrollbarProvider{\n display: contents;\n /* Firefox */\n * {\n scrollbar-width: thin;\n scrollbar-color: var(--background-accent-light) var(--background);\n }\n\n /* Chrome, Edge, and Safari */\n *::-webkit-scrollbar {\n width: 12px;\n }\n\n *::-webkit-scrollbar-track {\n background: transparent;\n }\n\n *::-webkit-scrollbar-thumb {\n background-color: var(--background-accent-light);\n border-radius: 10px;\n border: 3px solid var(--background);\n }\n}\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport styles from './scrollbarProvider.module.pcss';\n\ninterface Properties {\n className?: string | undefined;\n children?: React.ReactNode | undefined;\n};\n\nfunction ScrollbarProvider({\n className = undefined,\n children = undefined,\n}: Properties): ReactElement {\n return (\n <div className={cx(styles.scrollbarProvider, className)}>\n {children}\n </div>\n );\n}\n\nexport default ScrollbarProvider;\n","import ScrollbarProvider from './scrollbarProvider';\n\nexport default ScrollbarProvider;\n",".resultCount {\n margin: 6px 0 0;\n font-size: 12px;\n color: var(--text-dark);\n}\n","import { useEffect, useRef, type ReactElement } from 'react';\nimport Input from 'components/common/input';\nimport { InputType } from 'components/common/input/input.types';\nimport styles from './searchInput.module.pcss';\nimport type { SearchInputProps } from './searchInput.types';\n\n\nexport default function SearchInput({\n value,\n onChange,\n onDebounce,\n placeholder,\n label,\n debounceMs = 500,\n totalAmount,\n showAmount = true,\n className,\n width,\n ...rest\n}: SearchInputProps): ReactElement {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n }, []);\n\n function handleChange(val: unknown) {\n const str = val != null ? String(val) : '';\n const trimmed = str.trim() === '' ? '' : str;\n onChange(trimmed);\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => { onDebounce?.(trimmed); }, debounceMs);\n }\n\n const showCount = showAmount && typeof totalAmount === 'number' && !Number.isNaN(totalAmount);\n\n return (\n <div {...rest} className={className} style={width != null ? { width } : undefined}>\n <Input\n type={InputType.Search}\n label={label}\n placeholder={placeholder}\n value={value}\n onChange={handleChange}\n />\n {showCount && (\n <p className={styles.resultCount}>\n {totalAmount} {totalAmount === 1 ? 'result' : 'results'}\n </p>\n )}\n </div>\n );\n}\n",".stepper {\n display: flex;\n align-items: center;\n margin-bottom: 30px;\n user-select: none;\n\n &-clickable {\n cursor: pointer;\n }\n\n &-vertical {\n flex-flow: column;\n }\n\n &-connector {\n width: 50px;\n height: 1px;\n background-position: 0% 50%;\n transition: all 0.6s;\n background-size: 200% 200%;\n background-image: repeating-linear-gradient(\n 90deg,\n var(--primary-lighter) 0%,\n var(--primary-lighter) 50%,\n var(--primary-color) 50%,\n var(--primary-color) 100%\n );\n\n &-vertical {\n width: 3px;\n height: 100px;\n background-position: 0% 100%;\n background-image: repeating-linear-gradient(\n 0deg,\n var(--primary-lighter) 0%,\n var(--primary-lighter) 50%,\n var(--primary-color) 50%,\n var(--primary-color) 100%\n );\n }\n\n &-filled {\n background-position: -100% 0%;\n height: 3px;\n }\n }\n\n &-entry {\n width: 40px;\n height: 40px;\n box-sizing: border-box;\n border: 1px solid var(--primary-lighter);\n color: var(--primary-lighter);\n position: relative;\n border-radius: var(--default-border-radius);\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: inset 0px 0px 0px var(--primary-color);\n transform: none;\n transition: all 0.4s;\n\n &-active {\n border: 2px solid var(--primary-color);\n color: var(--primary-color);\n transform: scale3d(1.1, 1.1, 1);\n }\n\n &-done {\n box-shadow: inset 0px 0px 0px 30px var(--primary-color);\n transform: none;\n }\n\n &-number {\n stroke-dasharray: 5;\n stroke-dashoffset: 5;\n\n &-done {\n animation: 0.4s 0.2s forwards showCheckmark;\n }\n }\n\n @keyframes showCheckmark {\n from {\n stroke-dashoffset: 5;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n\n &-label {\n position: absolute;\n top: 45px;\n left: 0px;\n width: 140px;\n transform: translate(-50px);\n text-align: center;\n\n &-vertical {\n top: 0px;\n left: 100px;\n text-align: left;\n }\n }\n }\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport cx from 'classnames';\n\nimport styles from './stepper.module.pcss';\n\nclass Stepper extends Component {\n static alignments = {\n VERTICAL: 'vertical',\n HORIZONTAL: 'horizontal',\n };\n\n static propTypes = {\n steps: PropTypes.arrayOf(PropTypes.shape({})),\n currentStep: PropTypes.number,\n alignment: PropTypes.oneOf([Stepper.alignments.HORIZONTAL, Stepper.alignments.VERTICAL]),\n onStepClicked: PropTypes.func,\n };\n\n static defaultProps = {\n steps: [],\n currentStep: 0,\n alignment: Stepper.alignments.HORIZONTAL,\n onStepClicked: null,\n };\n\n constructor(props) {\n super(props);\n }\n\n state = {};\n\n renderCheckmark = () => {\n return (\n <svg\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"-0.2 -1.2 3.4 2\"\n height=\"20px\"\n width=\"20px\"\n >\n <path d=\"M 0 0 l 1 1 l 2 -2\" stroke=\"white\" strokeWidth=\"0.4\" fill=\"none\"></path>\n </svg>\n );\n };\n\n renderStep = (step, index) => {\n const { steps, currentStep, alignment, onStepClicked } = this.props;\n return (\n <>\n <div\n className={cx(styles.stepperEntry, {\n [styles.stepperEntryActive]: index <= currentStep,\n [styles.stepperEntryDone]: index < currentStep,\n [styles.stepperClickable]: index < currentStep && onStepClicked,\n })}\n onClick={() => (onStepClicked ? onStepClicked(index) : null)}\n >\n <div\n className={cx(styles.stepperEntryNumber, {\n [styles.stepperEntryNumberDone]: index < currentStep,\n })}\n >\n {index >= currentStep ? index + 1 : this.renderCheckmark()}\n </div>\n <div\n className={cx(styles.stepperEntryLabel, {\n [styles.stepperEntryLabelVertical]: alignment === Stepper.alignments.VERTICAL,\n })}\n >\n {step.label}\n </div>\n </div>\n {steps.length - 1 > index && (\n <div\n className={cx(styles.stepperConnector, {\n [styles.stepperConnectorFilled]: index < currentStep,\n [styles.stepperConnectorVertical]: alignment === Stepper.alignments.VERTICAL,\n })}\n />\n )}\n </>\n );\n };\n\n render() {\n const { steps, alignment } = this.props;\n return (\n <div\n className={cx(styles.stepper, {\n [styles.stepperVertical]: alignment === Stepper.alignments.VERTICAL,\n })}\n >\n {steps.map(this.renderStep)}\n </div>\n );\n }\n}\n\nexport default Stepper;\n","import Stepper from './stepper.jsx';\n\nexport default Stepper;\n","const BASE_URL = 'https://tenor.googleapis.com/v2';\n\nexport interface TenorMediaFormat {\n url: string;\n dims: [number, number];\n size: number;\n}\n\nexport interface TenorResult {\n id: string;\n title: string;\n media_formats: {\n gif: TenorMediaFormat;\n tinygif: TenorMediaFormat;\n mediumgif: TenorMediaFormat;\n mp4: TenorMediaFormat;\n tinymp4: TenorMediaFormat;\n };\n tags: string[];\n url: string;\n}\n\ninterface SearchOptions {\n limit?: number;\n contentfilter?: 'off' | 'low' | 'medium' | 'high';\n pos?: string;\n}\n\nexport default class TenorService {\n private key: string;\n\n constructor(key: string) {\n this.key = key;\n }\n\n async search(\n query: string,\n options: SearchOptions = {},\n ): Promise<{ results: TenorResult[]; next: string }> {\n const params = new URLSearchParams({ q: query, key: this.key });\n if (options.limit != null) params.set('limit', String(options.limit));\n if (options.contentfilter != null) params.set('contentfilter', options.contentfilter);\n if (options.pos != null) params.set('pos', options.pos);\n\n const res = await fetch(`${BASE_URL}/search?${params}`);\n return res.json();\n }\n\n async searchSuggestions(query: string): Promise<{ results: string[] }> {\n const params = new URLSearchParams({ q: query, key: this.key });\n const res = await fetch(`${BASE_URL}/search_suggestions?${params}`);\n return res.json();\n }\n\n registerShare(query: string, id: string): void {\n const params = new URLSearchParams({ id, q: query, key: this.key });\n fetch(`${BASE_URL}/registershare?${params}`).catch(() => null);\n }\n}\n","\n.gifPreview {\n width: min(420px, 90vw);\n aspect-ratio: 1;\n display: flex;\n flex-wrap: wrap;\n overflow: hidden;\n --gif-preview-gap-size: 5px;\n gap: var(--gif-preview-gap-size);\n position: relative;\n justify-content: center;\n overflow: auto;\n\n &-image {\n background-position: center;\n background-size: cover;\n width: 100%;\n height: 100%;\n\n &-container {\n width: min(140px, 33.3%);\n aspect-ratio: 1;\n background: linear-gradient(\n 45deg,\n var(--primary-color) 10%,\n var(--primary-lighter),\n var(--primary-accent),\n var(--primary-color) 85%\n );\n background-size: 500% 500%;\n animation: gradientBottomLeftToTopRight 1s infinite linear;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n width: min(\n calc(140px - var(--gif-preview-gap-size)),\n calc(33.3% - var(--gif-preview-gap-size))\n );\n }\n }\n}\n","import cx from 'classnames';\nimport type { ReactElement, UIEvent } from 'react';\nimport InteractableDiv from 'components/common/interactableDiv';\nimport type { GifPreviewProps } from './gifPreview.types';\nimport styles from './gifPreview.module.pcss';\n\nexport default function GifPreview({\n className,\n previewItems = [],\n onSelect,\n onLoadAdditional,\n}: GifPreviewProps): ReactElement {\n function handleScroll(event: UIEvent<HTMLDivElement>) {\n const el = event.currentTarget;\n const loadAdditionalHeight = el.scrollHeight - el.clientHeight * 1.5;\n if (el.scrollTop >= loadAdditionalHeight) {\n onLoadAdditional?.();\n }\n }\n\n return (\n <>\n {previewItems.length > 0 && (\n <div className={cx(styles.gifPreview, className)} onScroll={handleScroll}>\n {previewItems.map((preview, index) => (\n <InteractableDiv\n key={`${preview.id}_${index}`}\n className={styles.gifPreviewImageContainer}\n onClick={() => onSelect?.(preview)}\n >\n <div\n className={styles.gifPreviewImage}\n style={{ backgroundImage: `url(${preview.media_formats.tinygif.url})` }}\n />\n </InteractableDiv>\n ))}\n </div>\n )}\n </>\n );\n}\n","\n.gifView {\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n\n img {\n max-width: 100%;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n }\n\n &-loading {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n background: linear-gradient(\n 45deg,\n var(--primary-color) 10%,\n var(--primary-lighter),\n var(--primary-accent),\n var(--primary-color) 85%\n );\n background-size: 500% 500%;\n animation: gradientBottomLeftToTopRight 1s infinite linear;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n }\n}\n","import { useEffect, useState } from 'react';\nimport cx from 'classnames';\nimport type { ReactElement } from 'react';\nimport type { GifViewProps } from './gifView.types';\nimport styles from './gifView.module.pcss';\n\nexport default function GifView({ className, src = '' }: GifViewProps): ReactElement {\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n setIsLoading(true);\n }, [src]);\n\n return (\n <div className={cx(styles.gifView, className)}>\n <img className={styles.tenorPickerSelected} src={src} onLoad={() => setIsLoading(false)} />\n {isLoading && <div className={styles.gifViewLoading} />}\n </div>\n );\n}\n",".tenorPicker {\n &-selected {\n margin-top: 8px;\n }\n\n &-modal {\n &-content {\n display: flex;\n flex-flow: column;\n gap: var(--spacing-m);\n }\n }\n\n &-suggestions {\n &-container {\n max-width: 420px;\n }\n\n &-item {\n cursor: pointer;\n }\n }\n}\n","import { useMemo, useState } from 'react';\nimport cx from 'classnames';\nimport type { ReactElement, ReactNode } from 'react';\nimport TenorService from 'services/tenor.service';\nimport type { TenorResult } from 'services/tenor.service';\nimport SearchInput from '../searchInput';\nimport GifPreview from './components/gifPreview';\nimport FloatingMenu from '../floatingMenu';\nimport Button, { ButtonStyleType } from '../button';\nimport Modal from '../modal';\nimport Chip, { ChipContainer } from '../chip';\nimport GifView from './components/gifView';\nimport type { TenorPickerProps } from './tenorPicker.types';\nimport styles from './tenorPicker.module.pcss';\nimport actionButtonStyles from 'components/common/actionButtons/actionButtons.module.pcss';\nimport { Align } from '../floatingMenu/floatingMenu.types';\n\nexport default function TenorPicker({\n className,\n token = '',\n isModal = false,\n onSelect = () => undefined,\n selected = null,\n}: TenorPickerProps): ReactElement {\n const tenorService = useMemo(() => new TenorService(token), [token]);\n\n const [searchText, setSearchText] = useState('');\n const [currentPreviews, setCurrentPreviews] = useState<TenorResult[]>([]);\n const [currentSuggestions, setCurrentSuggestions] = useState<string[]>([]);\n const [lastNext, setLastNext] = useState<string | null>(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n async function searchFor(query: string) {\n setSearchText(query);\n if (!query.trim()) {\n setCurrentPreviews([]);\n setCurrentSuggestions([]);\n setLastNext(null);\n return;\n }\n const [{ results: searchResults = [], next = null }, { results: suggestionResults = [] }] =\n await Promise.all([\n tenorService.search(query, { limit: 18, contentfilter: 'medium' }),\n tenorService.searchSuggestions(query),\n ]);\n setCurrentPreviews(searchResults);\n setLastNext(next);\n setCurrentSuggestions(suggestionResults);\n }\n\n async function handleLoadAdditional() {\n const { results: searchResults = [], next = null } = await tenorService.search(searchText, {\n limit: 36,\n pos: lastNext ?? undefined,\n contentfilter: 'medium',\n });\n setLastNext(next);\n setCurrentPreviews((prev) => [...prev, ...searchResults]);\n }\n\n async function handlePreviewSelect(preview: TenorResult | null) {\n await onSelect(preview);\n setIsMenuOpen(false);\n if (preview) tenorService.registerShare(searchText, preview.id);\n }\n\n function renderSuggestions(): ReactNode {\n return (\n <ChipContainer inline className={styles.tenorPickerSuggestionsContainer}>\n {currentSuggestions.map((suggestion) => (\n <Chip\n className={styles.tenorPickerSuggestionsItem}\n key={suggestion}\n text={suggestion}\n onClick={() => searchFor(suggestion)}\n />\n ))}\n </ChipContainer>\n );\n }\n\n function renderPreviewPicker(): ReactNode {\n return (\n <GifPreview\n previewItems={currentPreviews}\n onSelect={handlePreviewSelect}\n onLoadAdditional={handleLoadAdditional}\n />\n );\n }\n\n function renderSearchInput(): ReactNode {\n return (\n <SearchInput\n label=\"Pick gif\"\n value={searchText}\n onDebounce={searchFor}\n onChange={setSearchText}\n />\n );\n }\n\n if (isModal) {\n return (\n <div className={cx(styles.tenorPicker, className)}>\n <div className={actionButtonStyles.actionButtons}>\n <Button onClick={() => setIsMenuOpen(true)}>Pick gif</Button>\n {selected && (\n <Button styleType={ButtonStyleType.Delete} onClick={() => handlePreviewSelect(null)}>\n Remove gif\n </Button>\n )}\n </div>\n {selected && <GifView className={styles.tenorPickerSelected} src={selected} />}\n <Modal isOpen={isMenuOpen} onClose={() => setIsMenuOpen(false)}>\n <div className={styles.tenorPickerModalContent}>\n {renderSearchInput()}\n {renderSuggestions()}\n {renderPreviewPicker()}\n </div>\n </Modal>\n </div>\n );\n }\n\n return (\n <div className={cx(styles.tenorPicker, className)}>\n <FloatingMenu\n align={Align.Left}\n isOpen={currentPreviews.length > 0 && isMenuOpen}\n onOpenChange={setIsMenuOpen}\n content={\n <>\n {renderSuggestions()}\n {renderPreviewPicker()}\n </>\n }\n >\n {renderSearchInput()}\n </FloatingMenu>\n {selected && (\n <Button styleType={ButtonStyleType.Delete} onClick={() => handlePreviewSelect(null)}>\n Remove gif\n </Button>\n )}\n {selected && <GifView className={styles.tenorPickerSelected} src={selected} />}\n </div>\n );\n}\n","import React from 'react';\nimport Input from 'components/common/input';\nimport type { TextareaProps } from './textarea.types';\n\nexport default function Textarea(props: TextareaProps) {\n return <Input {...props} multiline />;\n}\n","import type { Theme } from './theme.types';\n\n/**\n * Built-in default theme used by ThemeProvider when no `themes` prop is\n * supplied. Provides a complete set of CSS variables so the component\n * library renders correctly out of the box.\n */\nexport const defaultTheme: Theme = {\n id: 'default',\n variables: {\n '--grey': '#8A8A8A',\n '--lightgrey': '#e0e0e0',\n '--lightergrey': '#B1B1B1',\n '--white': '#FFFFFF',\n '--red': '#D6002A',\n '--lighter-red': '#ffeae9',\n '--green': '#287626',\n '--lighter-green': '#C4FFC9',\n '--blue': '#5873d5',\n '--lighter-blue': '#C6DBFF',\n '--black': 'black',\n '--orange': '#ff7f50',\n '--lighter-orange': '#ffe5d9',\n\n '--primary-color': '#8184d6',\n '--primary-accent': '#90CAF9',\n '--primary-lighter': '#9a9ce4',\n '--accent-color': 'var(--grey)',\n '--accent-color-light': 'var(--lightgrey)',\n\n '--text-color': 'var(--white)',\n '--text-dark': 'var(--lightergrey)',\n '--text-light': 'var(--lightergrey)',\n '--text-on-primary': 'var(--white)',\n '--text-on-delete': 'var(--white)',\n '--border-color': '#656574',\n\n '--background': '#393945',\n '--background-accent': '#33333c',\n '--background-accent-dark': 'var(--grey)',\n '--background-accent-light': '#484856',\n '--background-modal': '#484856',\n\n '--success-color': 'var(--green)',\n '--success-lighter': 'var(--lighter-green)',\n '--error-color': 'var(--red)',\n '--error-lighter': 'var(--lighter-red)',\n '--info-color': 'var(--blue)',\n '--info-lighter': 'var(--lighter-blue)',\n '--warn-color': 'var(--orange)',\n '--warn-lighter': 'var(--lighter-orange)',\n\n '--default-font-size': '14px',\n '--text-small-font-size': '12px',\n '--header-font-size': '24px',\n '--header-medium-font-size': '18px',\n '--header-small-font-size': '16px',\n\n '--default-font-weight': '400',\n '--header-font-weight': '600',\n\n '--input-background': 'transparent',\n '--input-icon-color': 'var(--text-color)',\n '--error-border-color': 'var(--red)',\n\n '--default-border-radius': '8px',\n '--padding-sides': '15px',\n '--margin-top': '10px',\n\n '--default-font': \"'Inter', sans-serif\",\n '--themed-font': \"'Inter', sans-serif\",\n\n '--card-shadow':\n '0 3px 1px -2px rgb(0 0 0 / 20%), 0 2px 2px 0 rgb(0 0 0 / 14%), 0 1px 5px 0 rgb(0 0 0 / 12%)',\n\n '--spacing-s': '4px',\n '--spacing-m': '8px',\n '--spacing-l': '16px',\n },\n};\n",".colorFade * {\n transition: background 0.3s ease-in-out;\n}\n","import React, { Component } from 'react';\n\nimport type { Theme } from './theme.types';\nimport { defaultTheme } from './defaultTheme';\nimport styles from './theme.module.pcss';\n\ninterface Props {\n children: React.ReactNode;\n themes?: Theme[];\n currentThemeId?: string;\n}\n\ninterface State {\n resolvedVariables: Record<string, string>;\n colorFadeActive: boolean;\n currentThemeColor: string | null;\n}\n\nclass ThemeProvider extends Component<Props, State> {\n state: State = {\n resolvedVariables: {},\n colorFadeActive: false,\n currentThemeColor: null,\n };\n\n private colorFadeTimeout: ReturnType<typeof setTimeout> | null = null;\n private wrapperRef = React.createRef<HTMLDivElement>();\n private themeColorMeta: HTMLMetaElement | null = null;\n private createdThemeColorMeta = false;\n\n componentDidMount() {\n this.applyTheme(this.props.currentThemeId);\n this.syncThemeColorMeta(this.state.currentThemeColor ?? '');\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n if (prevState.currentThemeColor !== this.state.currentThemeColor) {\n this.syncThemeColorMeta(this.state.currentThemeColor ?? '');\n }\n if (\n prevProps.currentThemeId !== this.props.currentThemeId ||\n prevProps.themes !== this.props.themes\n ) {\n this.applyTheme(this.props.currentThemeId);\n }\n }\n\n componentWillUnmount() {\n if (this.colorFadeTimeout) clearTimeout(this.colorFadeTimeout);\n // Only remove the meta tag if we created it; leave a host-app tag intact.\n if (this.createdThemeColorMeta) this.themeColorMeta?.remove();\n }\n\n /**\n * Replaces the former react-helmet usage: keep a single\n * <meta name=\"theme-color\"> in sync with the active theme's primary colour.\n * Reuses a tag the host app already declares; otherwise creates its own\n * (and removes it again on unmount).\n */\n private syncThemeColorMeta(color: string) {\n if (typeof document === 'undefined') return;\n\n if (!this.themeColorMeta) {\n const existing = document.head.querySelector<HTMLMetaElement>(\n 'meta[name=\"theme-color\"]',\n );\n if (existing) {\n this.themeColorMeta = existing;\n } else {\n const meta = document.createElement('meta');\n meta.setAttribute('name', 'theme-color');\n document.head.appendChild(meta);\n this.themeColorMeta = meta;\n this.createdThemeColorMeta = true;\n }\n }\n\n this.themeColorMeta.setAttribute('content', color);\n }\n\n /**\n * Resolves the full variable set for a given theme ID by walking up the\n * baseThemeId chain. Returns variables ordered from deepest ancestor to\n * the requested theme so callers can merge in order (later entries win).\n */\n private resolveChain(id: string): Record<string, string>[] {\n const themes = this.props.themes ?? [defaultTheme];\n const theme = themes.find((t) => t.id === id);\n if (!theme) return [];\n\n const parentVars = theme.baseThemeId ? this.resolveChain(theme.baseThemeId) : [];\n\n return [...parentVars, theme.variables as Record<string, string>];\n }\n\n private applyTheme = (currentThemeId: string | undefined) => {\n const themes = this.props.themes ?? [defaultTheme];\n\n // The root theme is the first theme without a baseThemeId.\n // It is always applied as the variable foundation.\n const rootTheme = themes.find((t) => !t.baseThemeId) ?? themes[0];\n const rootVars: Record<string, string> = rootTheme\n ? (rootTheme.variables as Record<string, string>)\n : {};\n\n // Resolve the selected theme's full inheritance chain.\n const selectedTheme = themes.find((t) => t.id === currentThemeId);\n const chainVars = selectedTheme ? this.resolveChain(selectedTheme.id) : [];\n\n // Merge: root foundation → ancestor chain → selected theme (each step overrides)\n const resolvedVariables = Object.assign({}, rootVars, ...chainVars);\n\n this.setState({ resolvedVariables, colorFadeActive: true });\n\n if (this.colorFadeTimeout) clearTimeout(this.colorFadeTimeout);\n this.colorFadeTimeout = setTimeout(() => {\n this.setState({ colorFadeActive: false });\n this.colorFadeTimeout = null;\n }, 500);\n\n // Read --primary-color after the new style is painted for the theme-color meta tag.\n setTimeout(() => {\n if (this.wrapperRef.current) {\n this.setState({\n currentThemeColor: getComputedStyle(this.wrapperRef.current)\n .getPropertyValue('--primary-color')\n .trim(),\n });\n }\n }, 1);\n };\n\n render() {\n const { children } = this.props;\n const { resolvedVariables, colorFadeActive } = this.state;\n\n return (\n <div\n ref={this.wrapperRef}\n id=\"themeProvider\"\n className={colorFadeActive ? styles.colorFade : undefined}\n style={resolvedVariables as React.CSSProperties}\n >\n {children}\n </div>\n );\n }\n}\n\nexport default ThemeProvider;\n","import { useState } from \"react\";\n\nexport function useTheme(defaultThemeId: string = 'default') {\n const [currentThemeId, setThemeId] = useState<string>(localStorage.getItem('theme') || defaultThemeId);\n\n const setCurrentThemeId = (themeId: string) => {\n setThemeId(themeId);\n localStorage.setItem('theme', themeId);\n };\n\n return { currentThemeId, setCurrentThemeId };\n}",".wizard {\n height: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n transition: all 0.2s;\n padding: 1px;\n\n &-content {\n position: absolute;\n height: fit-content;\n\n &-outOfFrame {\n * {\n user-select: none;\n pointer-events: none;\n visibility: hidden;\n display: none;\n }\n }\n\n &-container {\n display: flex;\n transition: all 0.6s;\n position: relative;\n }\n }\n}\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport cx from 'classnames';\n\nimport styles from './wizard.module.pcss';\n\nclass Wizard extends Component {\n static propTypes = {\n currentStep: PropTypes.number,\n stepCount: PropTypes.number,\n renderStep: PropTypes.func,\n className: PropTypes.string,\n };\n\n static defaultProps = {\n currentStep: 0,\n stepCount: 0,\n renderStep: () => null,\n className: '',\n };\n\n constructor(props) {\n super(props);\n }\n\n state = {\n height: undefined,\n showOtherContent: false,\n minRenderStep: 0,\n maxRenderStep: 0,\n };\n\n componentDidUpdate(prevProps) {\n const { currentStep } = this.props;\n const { currentStep: prevStep } = prevProps;\n\n if (currentStep !== prevStep) {\n if (this.hideContentTimeout) clearTimeout(this.hideContentTimeout);\n this.setState({ showOtherContent: true });\n this.hideContentTimeout = setTimeout(() => {\n this.setState({ showOtherContent: false });\n this.hideContentTimeout = null;\n }, 400);\n\n // TODO: Fix later\n // const { minRenderStep, maxRenderStep } = this.state;\n // const newMinRenderStep = Math.min(currentStep, prevStep, minRenderStep);\n // const newMaxRenderStep = Math.max(currentStep, prevStep, maxRenderStep);\n // // console.log(\">>\", { minRenderStep, maxRenderStep, currentStep, prevStep, newMinRenderStep, newMaxRenderStep});\n // this.setState({ minRenderStep: newMinRenderStep, maxRenderStep: newMaxRenderStep });\n // this.minRenderStep = newMinRenderStep;\n // this.maxRenderStep = newMaxRenderStep;\n // if (this.minMaxRenderStepTimeout) clearTimeout(this.minMaxRenderStepTimeout);\n // this.minMaxRenderStepTimeout = setTimeout(() => {\n // this.setState({ minRenderStep: currentStep, maxRenderStep: currentStep });\n // this.minRenderStep = currentStep;\n // this.maxRenderStep = currentStep;\n // this.minMaxRenderStepTimeout = null;\n // }, 400);\n }\n }\n\n updateCurrentRef = (ref, index) => {\n const { currentStep } = this.props;\n const { height } = this.state;\n if (ref && currentStep === index && height !== ref.clientHeight) {\n this.setState({ height: ref.clientHeight });\n }\n };\n\n render() {\n const { renderStep, currentStep, stepCount, className } = this.props;\n const { height, showOtherContent } = this.state;\n const wizardStyle = height !== undefined ? { height: `${height}px` } : {};\n return (\n <div className={cx(cx(styles.wizard, className))} style={wizardStyle}>\n <div\n className={styles.wizardContentContainer}\n style={{ width: `${stepCount * 100}%`, marginLeft: `-${currentStep * 100}%` }}\n >\n {Array.from(new Array(stepCount), () => null).map((curr, index) => {\n // const { minRenderStep, maxRenderStep } = this.state;\n // console.log(\">>RENDER\", index);\n // if (index > this.maxRenderStep || index < this.minRenderStep) return null;\n return (\n <div\n key={`wizardContent${index}`}\n ref={(ref) => this.updateCurrentRef(ref, index)}\n className={styles.wizardContent}\n style={{\n width: `${100 / stepCount}%`,\n marginLeft: `${(100 / stepCount) * index}%`,\n }}\n >\n <div\n className={cx({\n [styles.wizardContentOutOfFrame]: currentStep !== index && !showOtherContent,\n })}\n >\n {renderStep(index)}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n}\n\nexport default Wizard;\n","import Wizard from './wizard.jsx';\n\nexport default Wizard;\n","import type { ReactNode } from 'react';\nimport type { ToastOptions } from './toast.types';\n\ntype ShowToastFn = (content: ReactNode, options?: ToastOptions) => void;\n\nlet _handler: ShowToastFn | null = null;\n\nexport function _registerToastHandler(fn: ShowToastFn): void {\n _handler = fn;\n}\n\nexport function _unregisterToastHandler(): void {\n _handler = null;\n}\n\nexport function showToast(content: ReactNode, options?: ToastOptions): void {\n if (!_handler) {\n console.error('[Toast] No ToastProvider found. Wrap your app with <ToastProvider>.');\n return;\n }\n _handler(content, options);\n}\n","// import polyglot from 'services/localization';\n\nimport type FormValidator from './formValidator';\nimport type { ValidationError, ErrorParser, UpdateListener } from './types';\n\n/** @internal */\nfunction defaultErrorParser(err: unknown): ValidationError[] {\n const e = err as { errors?: Record<string, string>[] };\n if (e?.errors && Array.isArray(e.errors)) {\n return e.errors.flatMap((errorObj) =>\n Object.entries(errorObj).map(([id, message]) => ({ id, message }))\n );\n }\n return [];\n}\n\nexport type FormGroup = Record<string, FormValidator<any>>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type FormValues = Record<string, unknown>;\n\nexport type InferGroupValues<TGroup extends FormGroup> = {\n [K in keyof TGroup]: TGroup[K] extends FormValidator<infer V> ? V : never;\n};\n\n/**\n * The submitted result type: TInitial with all group-field keys replaced by\n * their typed validator values.\n */\nexport type MergedValues<TInitial, TGroup extends FormGroup> =\n Omit<TInitial, keyof TGroup & string> & InferGroupValues<TGroup>;\n\nexport interface FormValidatorGroupOptions<\n TGroup extends FormGroup = FormGroup,\n TInitial = InferGroupValues<TGroup>\n> {\n initialValues?: TInitial;\n onSubmit?: (\n values: MergedValues<TInitial, TGroup>,\n group: FormValidatorGroup<TGroup, TInitial>\n ) => Promise<void> | void;\n onValidate?: (group: FormValidatorGroup<TGroup, TInitial>) => ValidationError | null | void;\n errorParser?: ErrorParser;\n onSubmitError?: (errors: ValidationError[]) => void;\n}\n\ninterface ComponentLike {\n forceUpdate: () => void;\n}\n\nexport default class FormValidatorGroup<\n TGroup extends FormGroup = FormGroup,\n TInitial = InferGroupValues<TGroup>\n> {\n #initialValues: TInitial;\n #isSubmitting: boolean = false;\n #debounceTimer: ReturnType<typeof setTimeout> | undefined;\n #valuesAfterCreation: FormValues;\n #updateListeners: UpdateListener[] = [];\n\n group: TGroup;\n component: ComponentLike | null;\n onSubmitCallback: (values: MergedValues<TInitial, TGroup>, group: FormValidatorGroup<TGroup, TInitial>) => Promise<void> | void;\n onValidateCallback: (group: FormValidatorGroup<TGroup, TInitial>) => ValidationError | null | void;\n errorParser: ErrorParser;\n onSubmitError: (errors: ValidationError[]) => void;\n submitCount: number;\n onDebounce: (values: MergedValues<TInitial, TGroup>) => void;\n onReset: (group: FormValidatorGroup<TGroup, TInitial>, valuesAfterCreation: FormValues, initialValues: TInitial) => void;\n\n /**\n * @param formValidatorGroup - Map of field name → FormValidator\n * @param component - Class component instance for forceUpdate (pass null when using hooks)\n * @param options - initialValues, onSubmit, onValidate, errorParser\n */\n constructor(\n formValidatorGroup: TGroup,\n component: ComponentLike | null = null,\n {\n initialValues,\n onSubmit = () => undefined,\n onValidate = () => undefined,\n errorParser = defaultErrorParser,\n onSubmitError = () => undefined,\n }: FormValidatorGroupOptions<TGroup, TInitial> = {}\n ) {\n this.group = formValidatorGroup;\n this.#initialValues = (initialValues ?? {}) as TInitial;\n this.#valuesAfterCreation = {};\n this.submitCount = 0;\n this.onDebounce = () => {};\n this.onReset = () => {};\n\n Object.keys(this.group).forEach((validatorKey) => {\n const currentValidator = this.group[validatorKey];\n const iv = this.#initialValues as FormValues;\n if (iv[validatorKey] !== undefined) {\n currentValidator.set(iv[validatorKey]);\n }\n this.#valuesAfterCreation[validatorKey] = currentValidator.value;\n this.group[validatorKey].registerOnUpdateListener(() => {\n this.#notifyListeners();\n this.submitCount = 0;\n if (this.#debounceTimer) clearTimeout(this.#debounceTimer);\n this.#debounceTimer = setTimeout(() => this.onDebounce(this.getValues()), 500);\n });\n });\n\n this.component = component;\n this.onSubmitCallback = onSubmit as typeof this.onSubmitCallback;\n this.onValidateCallback = onValidate as typeof this.onValidateCallback;\n this.errorParser = errorParser;\n this.onSubmitError = onSubmitError;\n this.setSubmitting(false);\n }\n\n get isSubmitting(): boolean { return this.#isSubmitting; }\n\n get wasTouched(): boolean {\n return Object.keys(this.group).some((key) => this.group[key].touched);\n }\n\n get isDirty(): boolean {\n return Object.keys(this.group).some((key) => this.group[key].dirty);\n }\n\n get hasErrors(): boolean {\n return Object.keys(this.group).some((key) => this.group[key].errors.length > 0);\n }\n\n get initialValues(): TInitial {\n return { ...this.#initialValues } as TInitial;\n }\n\n getFormError = (): ValidationError | null => {\n const groupKeys = Object.keys(this.group);\n for (let i = 0; i < groupKeys.length; i += 1) {\n const key = groupKeys[i];\n if (this.group[key].errors.length > 0) return this.group[key].errors[0];\n }\n return null;\n };\n\n set = (validatorName: keyof TGroup & string, value: unknown): this => {\n this.group[validatorName].set(value);\n return this;\n };\n\n reset = (toOverride: FormValues = {}): void => {\n this.submitCount = 0;\n const toOverrideKeys = Object.keys(toOverride);\n Object.keys(this.group).forEach((validatorKey) => {\n this.group[validatorKey].set(\n toOverrideKeys.includes(validatorKey)\n ? toOverride[validatorKey]\n : this.#valuesAfterCreation[validatorKey],\n false\n );\n });\n this.resetDirtyAndTouched();\n if (this.onReset) this.onReset(this, this.#valuesAfterCreation, this.#initialValues);\n };\n\n resetDirtyAndTouched = (): void => {\n Object.keys(this.group).forEach((key) => {\n this.group[key].dirty = false;\n this.group[key].touched = false;\n });\n };\n\n /**\n * Parses an API error and pushes field-level errors into the matching validators.\n * When field errors are found and isInternal is set, surfaces the first field message.\n * When the error shape isn't recognised (no field errors), always surfaces a generic message.\n */\n parseError = (err: unknown, isInternal: boolean = false): void => {\n const fieldErrors = this.errorParser(err);\n if (fieldErrors.length > 0) {\n fieldErrors.forEach(({ id, message }) => {\n if (this.group[id]) this.group[id].addError({ id, message });\n });\n if (isInternal) {\n this.onSubmitError(fieldErrors);\n }\n } else {\n this.onSubmitError([{ id: 'generic', message: 'An error occurred' }]);\n }\n };\n\n #notifyListeners = (): void => {\n if (this.component) this.component.forceUpdate();\n this.#updateListeners.forEach((cb) => cb());\n };\n\n registerOnUpdateListener = (callback: UpdateListener): void => {\n this.#updateListeners.push(callback);\n };\n\n removeOnUpdateListener = (callback: UpdateListener): void => {\n this.#updateListeners.splice(this.#updateListeners.indexOf(callback), 1);\n };\n\n setSubmitting = (isSubmitting: boolean): void => {\n if (this.#isSubmitting !== isSubmitting) {\n this.#isSubmitting = isSubmitting;\n this.#notifyListeners();\n }\n };\n\n submit = async (event?: Event | React.SyntheticEvent | null): Promise<void> => {\n if (event) {\n if ((event as Event).preventDefault) (event as Event).preventDefault();\n if ((event as Event).stopPropagation) (event as Event).stopPropagation();\n }\n this.setSubmitting(true);\n\n let customError: ValidationError | null | void = null;\n if (this.submitCount === 0) {\n customError = await Promise.resolve(this.validate());\n } else if (this.onValidateCallback) {\n customError = await Promise.resolve(this.onValidateCallback(this));\n }\n const currentError = this.getFormError() || customError;\n\n if (currentError) {\n this.setSubmitting(false);\n if (this.submitCount > -1) {\n this.onSubmitError([currentError]);\n }\n this.submitCount += 1;\n this.#notifyListeners();\n return;\n }\n\n try {\n await this.onSubmitCallback(this.getValues(), this);\n this.resetDirtyAndTouched();\n } catch (err) {\n this.parseError(err, true);\n }\n this.setSubmitting(false);\n this.#notifyListeners();\n this.submitCount += 1;\n };\n\n getValues = (): MergedValues<TInitial, TGroup> => {\n const retObj: FormValues = {};\n Object.keys(this.group).forEach((key) => {\n retObj[key] = this.group[key].value;\n });\n return { ...this.#initialValues, ...retObj } as MergedValues<TInitial, TGroup>;\n };\n\n validate = (): ValidationError | null | void => {\n Object.keys(this.group).forEach((validator) => {\n this.group[validator].validate();\n this.group[validator].touched = true;\n });\n if (this.onValidateCallback) return this.onValidateCallback(this);\n };\n\n setValidator = <K extends keyof TGroup & string>(validatorName: K, validator: TGroup[K]): this => {\n this.group[validatorName] = validator;\n return this;\n };\n}\n\n// Needed for the submit method's event type\nimport type React from 'react';\n","import React from 'react';\nimport type FormValidatorGroup from './formValidatorGroup';\n\n/**\n * Creates the Form component for a FormValidatorGroup instance.\n * Kept in a separate .tsx file so formValidatorGroup.ts stays framework-agnostic.\n */\nexport function createFormComponent(group: Pick<FormValidatorGroup, 'submit'>): React.FC<React.FormHTMLAttributes<HTMLFormElement>> {\n return function Form({ children, ...rest }) {\n return (\n <form onSubmit={group.submit} noValidate {...rest}>\n {children}\n </form>\n );\n };\n}\n","import { showToast } from 'components/common/toast';\nimport FormValidatorGroup from './formValidatorGroup';\nimport { createFormComponent } from './FormValidatorGroupForm';\nimport type { FormGroup, FormValidatorGroupOptions, InferGroupValues } from './formValidatorGroup';\nimport type { ValidationError } from './types';\nimport type React from 'react';\n\n/** Default onSubmitError: surface the first error as an error toast. Callers can override via options.onSubmitError. */\nconst defaultOnSubmitError = (errors: ValidationError[]): void => {\n showToast(errors[0].message, { type: 'error' });\n};\n\n/**\n * FormValidatorGroup with `this.Form` automatically attached.\n * Kept in a .tsx file so formValidatorGroup.ts stays framework-agnostic.\n *\n * This is the class you should use everywhere — it is a drop-in replacement\n * for FormValidatorGroup with one extra property: `this.Form`.\n *\n * Also injects the default toast-based onSubmitError so both hook and class-component\n * consumers surface errors out of the box; pass options.onSubmitError to override.\n */\nexport default class FormValidatorGroupWithForm<\n TGroup extends FormGroup = FormGroup,\n TInitial = InferGroupValues<TGroup>\n> extends FormValidatorGroup<TGroup, TInitial> {\n Form: React.FC<React.FormHTMLAttributes<HTMLFormElement>>;\n\n constructor(\n groupDef: TGroup,\n component: { forceUpdate: () => void } | null = null,\n options?: FormValidatorGroupOptions<TGroup, TInitial>\n ) {\n super(groupDef, component, { ...options, onSubmitError: options?.onSubmitError ?? defaultOnSubmitError });\n this.Form = createFormComponent(this);\n }\n}\n","import type { ValidatorFunction, ValidationError, UpdateListener } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default class FormValidator<T = any> {\n #value: T;\n #touched: boolean;\n #dirty: boolean;\n #errors: ValidationError[];\n #label: string;\n\n validators: ValidatorFunction[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onUpdateCallbacks: Array<(validator: FormValidator<any>) => void>;\n\n /**\n * Create a FormValidator to use standalone or inside a FormValidatorGroup.\n * @param initialValue - Default value of the field\n * @param validators - Array of validator functions\n */\n constructor(initialValue: T, validators?: ValidatorFunction[]) {\n this.#value = initialValue;\n this.validators = validators ?? [];\n this.#touched = false;\n this.#dirty = false;\n this.#errors = [];\n this.#label = '';\n this.onUpdateCallbacks = [];\n this.validate();\n }\n\n /** Whether the user has entered and left the field. */\n get touched(): boolean { return this.#touched; }\n set touched(value: boolean) { this.#touched = value; this.onUpdate(); }\n\n get label(): string { return this.#label; }\n set label(value: string) { this.#label = value; }\n\n /** Whether the user has changed the value since initialisation. */\n get dirty(): boolean { return this.#dirty; }\n set dirty(value: boolean) { this.#dirty = value; this.onUpdate(); }\n\n get value(): T { return this.#value; }\n /** Sets value without validation (use `set()` for validated updates). */\n set value(val: T) { this.#value = val; this.onUpdate(); }\n\n get errors(): ValidationError[] { return this.#errors; }\n\n addError = (error: ValidationError): void => {\n this.#errors.push(error);\n this.onUpdate();\n };\n\n removeErrors = (errorIds: string[]): void => {\n this.#errors = this.#errors.filter((error) => !errorIds.includes(error.id));\n this.onUpdate();\n };\n\n clearErrors = (): void => {\n this.#errors = [];\n this.onUpdate();\n };\n\n hasError = (error?: string): boolean => {\n if (!error && this.errors.length > 0) return true;\n return !!(this.errors.find((err) => err.id === error));\n };\n\n getCurrentErrorMessage = (): string | null => {\n if (this.errors.length === 0) return null;\n return this.errors[0].message;\n };\n\n validate = (): void => {\n this.clearErrors();\n this.validators.forEach((validator) => {\n const res = validator(this.value, this.label);\n if (res) this.addError(res);\n });\n };\n\n onUpdate = (): void => {\n this.onUpdateCallbacks.forEach((cb) => cb(this));\n };\n\n registerOnUpdateListener = (callback: UpdateListener): void => {\n this.onUpdateCallbacks.push(callback);\n };\n\n removeOnUpdateListener = (callback: UpdateListener): void => {\n this.onUpdateCallbacks.splice(this.onUpdateCallbacks.indexOf(callback), 1);\n };\n\n /**\n * Sets the field value with optional dirty tracking and re-validates.\n * @param newValue - New field value\n * @param wasUser - Whether the change was user-initiated (marks field dirty). Defaults to true.\n */\n set = (newValue: T, wasUser: boolean = true): this => {\n this.value = newValue;\n if (wasUser && !this.dirty) this.dirty = true;\n this.validate();\n return this;\n };\n}\n\nFormValidator.prototype.toString = function getValidatorValue() {\n return `${this.value}`;\n};\n","export function isNumber(string: string): boolean {\n return /^[0-9]+$/.test(string);\n}\n\nexport function isDate(string: string): boolean {\n return /^[0-9]{2}.[0-9]{2}.[0-9]{4}$/.test(string);\n}\n\nexport function isISODate(string: string): boolean {\n return /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$/.test(string);\n}\n\nexport function isEmail(string: string): boolean {\n return /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-ZöäüÜÖÄß\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(string);\n}\n\nexport function isBic(string: string): boolean {\n return /^[A-Z]{6}[A-Z\\d]{2}([A-Z\\d]{3})?$/.test(string);\n}\n\nexport function isURL(string: string): boolean {\n return /[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,63}(\\/[-a-zA-Z0-9@:%_+.~#?&//=]*)?$/.test(string);\n}\n\nexport function hasEightPasswordChars(string: string): boolean {\n return /^[\\w!@#$%^&*?±§~`'\"/\\\\[\\]{}\\-,.();:><+=|öäüÖÄÜß €μ]{8,}$/.test(string);\n}\n\nexport function hasOnePasswordLetter(string: string): boolean {\n return /^(?=.*[a-zöäüA-ZÖÄÜß])/.test(string);\n}\n\nexport function hasOnePasswordDigit(string: string): boolean {\n return /^(?=.*\\d)/.test(string);\n}\n\nexport function isPassword(string: string): boolean {\n return hasEightPasswordChars(string) && hasOnePasswordLetter(string) && hasOnePasswordDigit(string);\n}\n","import { isEmail, isDate, isISODate, isURL, isBic } from 'services/regexp';\nimport type { ValidatorFunction, ValidationError } from './types';\n\nconst polyglot = {\n t: (key: string, options?: Record<string, unknown>): string => {\n const translations: Record<string, string> = {\n 'formValidators.minLength': `Must be at least ${options?.min} characters long`,\n 'formValidators.maxLength': `Must be at most ${options?.max} characters long`,\n 'formValidators.email': 'Must be a valid email address',\n 'formValidators.required': `${options?.label || 'Value'} is required`,\n 'formValidators.value': 'Value',\n 'formValidators.mustBeNumber': 'Must be a number',\n 'formValidators.oneOf': `Must be one of the following values: ${options?.allowedValues}`,\n 'formValidators.typeOf': `Must have type of ${options?.allowedTypes}`,\n 'formValidators.multiEmail': 'Must be a comma or semicolon separated list of valid email addresses',\n 'formValidators.date': 'Must be a valid date',\n 'garages.errors.website': 'Must be a valid URL',\n 'garages.errors.bic': 'Must be a valid BIC',\n 'formValidators.minLetters': `Must contain at least ${options?.smart_count} letters`,\n 'formValidators.minDigits': `Must contain at least ${options?.smart_count} digits`,\n };\n return translations[key] || key;\n },\n};\n\nexport default class Validators {\n static minLength = (min: number, errorMsg?: string): ValidatorFunction => (value) => {\n if (!value || (value as string).length < min) return { id: 'minLength', message: errorMsg || polyglot.t('formValidators.minLength', { min }) };\n return null;\n };\n\n static maxLength = (max: number, errorMsg?: string): ValidatorFunction => (value) => {\n if (value && (value as string).length > max) return { id: 'maxLength', message: errorMsg || polyglot.t('formValidators.maxLength', { max }) };\n return null;\n };\n\n static email = (errorMsg?: string): ValidatorFunction => (value) => {\n if (value && !isEmail(value as string)) return { id: 'email', message: errorMsg || polyglot.t('formValidators.email') };\n return null;\n };\n\n static required = (errorMsg?: string): ValidatorFunction & { validatorId: string } => {\n function required(value: unknown, label?: string): ValidationError | null {\n if (!value && value !== 0) return { id: 'required', message: errorMsg || polyglot.t('formValidators.required', { label: label || polyglot.t('formValidators.value') }) };\n return null;\n }\n required.validatorId = 'required';\n return required;\n };\n\n static mustBeNumber = (errorMsg?: string): ValidatorFunction => (value) => {\n if (value && Number.isNaN(+(value as string))) return { id: 'mustBeNumber', message: errorMsg || polyglot.t('formValidators.mustBeNumber') };\n return null;\n };\n\n static oneOf = (allowedValues: unknown[], errorMsg?: string): ValidatorFunction => (value) => {\n if (value && !allowedValues.includes(value)) return { id: 'oneOf', message: errorMsg || polyglot.t('formValidators.oneOf', { allowedValues }) };\n return null;\n };\n\n static typeOf = (allowedTypes: string | string[], errorMsg?: string): ValidatorFunction => (value) => {\n if (Array.isArray(allowedTypes)) {\n for (let i = 0; i < allowedTypes.length; i += 1) {\n if (typeof value === allowedTypes[i]) return null;\n }\n } else if (typeof value === allowedTypes) {\n return null;\n }\n return { id: 'typeOf', message: errorMsg || `Must have type of ${allowedTypes}` };\n };\n\n static multiEmail = (errorMessage?: string): ValidatorFunction => (value) => {\n if (value) {\n const emailParts = (value as string).replace(/ /g, '').replace(/,/g, ';').split(';');\n for (let i = 0; i < emailParts.length; i += 1) {\n if (!isEmail(emailParts[i])) {\n return { id: 'multiEmail', message: errorMessage || polyglot.t('formValidators.multiEmail') };\n }\n }\n }\n return null;\n };\n\n static date = (errorMessage?: string): ValidatorFunction => (value) => {\n if (value && (!isDate(value as string) && !isISODate(value as string))) return { id: 'date', message: errorMessage || polyglot.t('formValidators.date') };\n return null;\n };\n\n static dateObject = (errorMessage?: string): ValidatorFunction => (value) => {\n if (value && !(value as { isValid: boolean }).isValid) return { id: 'date', message: errorMessage || polyglot.t('formValidators.date') };\n return null;\n };\n\n static website = (errorMsg?: string): ValidatorFunction => (value) => {\n if (value && !isURL(value as string)) return { id: 'website', message: errorMsg || polyglot.t('garages.errors.website') };\n return null;\n };\n\n static bic = (errorMsg?: string): ValidatorFunction => (value) => {\n if (value && !isBic(value as string)) return { id: 'bic', message: errorMsg || polyglot.t('garages.errors.bic') };\n return null;\n };\n\n static minLetters = (min: number, errorMsg?: string): ValidatorFunction => (value) => {\n if (value && (value as string).replace(/[^a-zöäüA-ZÖÄÜß]/g, '').length < min) return { id: 'minLetters', message: errorMsg || polyglot.t('formValidators.minLetters', { smart_count: min }) };\n return null;\n };\n\n static minDigits = (min: number, errorMsg?: string): ValidatorFunction => (value) => {\n if (value && (value as string).replace(/[\\D]/g, '').length < min) return { id: 'minDigits', message: errorMsg || polyglot.t('formValidators.minDigits', { smart_count: min }) };\n return null;\n };\n\n static password = (errorMsg?: string): ValidatorFunction => (value) => {\n const result = Validators.minLength(8)(value)\n || Validators.minLetters(1)(value)\n || Validators.minDigits(1)(value);\n if (result) return errorMsg ? { id: 'password', message: errorMsg } : result;\n return null;\n };\n}\n","/* eslint-disable react/no-unused-state */\nimport React, { PureComponent } from 'react';\nimport FormValidator from 'services/formValidation/formValidator';\nimport Tooltip from 'components/common/tooltip';\n\nexport interface ValidatableComponentProps {\n formValidator?: FormValidator | null;\n onMouseEnter?: ((event: React.MouseEvent) => void) | null;\n onMouseLeave?: ((event: React.MouseEvent) => void) | null;\n onFocus?: ((event: React.FocusEvent) => void) | null;\n onBlur?: ((event: React.FocusEvent) => void) | null;\n onChange?: ((value: unknown) => void) | null;\n errorMessage?: string;\n isValid?: boolean;\n isRequired?: boolean;\n label?: string;\n}\n\nexport interface ValidatableComponentState {\n isFocused: boolean;\n isHovered: boolean;\n}\n\n/**\n * Base class that extends PureComponent with FormValidator integration.\n * Manages hover/focus state and renders error tooltips.\n */\nexport default class ValidatableComponent<\n P extends ValidatableComponentProps = ValidatableComponentProps,\n S extends ValidatableComponentState = ValidatableComponentState,\n> extends PureComponent<P, S> {\n static defaultProps: Partial<ValidatableComponentProps> = {\n formValidator: null,\n onMouseEnter: null,\n onMouseLeave: null,\n onFocus: null,\n onBlur: null,\n onChange: null,\n errorMessage: '',\n isValid: false,\n isRequired: false,\n label: '',\n };\n\n constructor(props: P) {\n super(props);\n const { formValidator } = props;\n\n if (formValidator) {\n formValidator.label = props.label ?? '';\n formValidator.validate();\n formValidator.registerOnUpdateListener(() => { this.forceUpdate(); });\n }\n\n this.state = { isFocused: false, isHovered: false } as S;\n\n this.onMouseEnter = this.onMouseEnter.bind(this);\n this.onMouseLeave = this.onMouseLeave.bind(this);\n this.onFocus = this.onFocus.bind(this);\n this.onBlur = this.onBlur.bind(this);\n this.hasError = this.hasError.bind(this);\n this.renderTooltip = this.renderTooltip.bind(this);\n this.onChange = this.onChange.bind(this);\n }\n\n componentDidMount(): void {\n setTimeout(() => this.setState({ isFocused: false, isHovered: false } as S), 1);\n }\n\n componentDidUpdate(prevProps: P): void {\n const { formValidator } = this.props;\n if (prevProps.formValidator && formValidator && prevProps.formValidator !== formValidator) {\n formValidator.registerOnUpdateListener(() => { this.forceUpdate(); });\n }\n }\n\n onMouseEnter(event: React.MouseEvent): void {\n const { onMouseEnter } = this.props;\n this.setState({ isHovered: true } as unknown as S);\n if (onMouseEnter) onMouseEnter(event);\n }\n\n onMouseLeave(event: React.MouseEvent): void {\n const { onMouseLeave } = this.props;\n this.setState({ isHovered: false } as unknown as S);\n if (onMouseLeave) onMouseLeave(event);\n }\n\n onFocus(event: React.FocusEvent): void {\n const { onFocus } = this.props;\n this.setState({ isFocused: true } as unknown as S);\n if (onFocus) onFocus(event);\n }\n\n onBlur(event: React.FocusEvent): void {\n const { formValidator, onBlur } = this.props;\n if (formValidator) formValidator.touched = true;\n this.setState({ isFocused: false } as unknown as S);\n if (onBlur) onBlur(event);\n }\n\n hasError(): boolean {\n const { errorMessage, isValid, formValidator } = this.props;\n return formValidator\n ? (formValidator.touched && formValidator.hasError())\n : (!isValid || !!errorMessage);\n }\n\n isRequired(): boolean {\n const { isRequired, formValidator } = this.props;\n return !!(isRequired\n || (formValidator && formValidator.validators.find((v) => (v as { validatorId?: string }).validatorId === 'required')));\n }\n\n renderTooltip(): React.ReactNode {\n const { errorMessage, formValidator } = this.props;\n const { isHovered, isFocused } = this.state;\n return (\n <Tooltip\n variant=\"error\"\n message={formValidator ? formValidator.getCurrentErrorMessage() : (errorMessage || '')}\n isVisible={this.hasError() && (isFocused || isHovered)}\n />\n );\n }\n\n onChange(newVal: unknown): void {\n const { onChange, formValidator } = this.props;\n if (formValidator) {\n let extractedVal = newVal;\n if (newVal && (newVal as React.ChangeEvent<HTMLInputElement>).target) {\n extractedVal = (newVal as React.ChangeEvent<HTMLInputElement>).target.value;\n }\n formValidator.set(extractedVal);\n }\n if (onChange) onChange(newVal);\n }\n}\n","import { useEffect, useReducer } from 'react';\nimport type FormValidator from './formValidator';\n\n/**\n * Subscribes a function component to a FormValidator instance.\n * Triggers a re-render whenever value, errors, touched, or dirty changes.\n *\n * @param formValidator - The FormValidator instance to subscribe to (or null)\n * @returns The same formValidator for convenience\n */\nexport function useFormValidator<T extends FormValidator | null>(formValidator: T): T {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!formValidator) return;\n formValidator.registerOnUpdateListener(rerender);\n return () => formValidator.removeOnUpdateListener(rerender);\n }, [formValidator]);\n\n return formValidator;\n}\n","import { useEffect, useReducer, useRef } from 'react';\nimport FormValidatorGroup from './FormValidatorGroupWithForm';\nimport type { FormGroup, FormValidatorGroupOptions, InferGroupValues } from './formValidatorGroup';\n\n/**\n * Creates and subscribes a function component to a FormValidatorGroup.\n * Triggers a re-render whenever any field, submit state, or validation state changes.\n *\n * The group is created once on mount from the provided field map.\n * onSubmit / onValidate are kept fresh via refs — they always reflect the latest\n * closure without needing to be listed in effect dependencies.\n *\n * onSubmitError defaults to showing the message as an error toast (provided by FormValidatorGroupWithForm);\n * pass options.onSubmitError to override.\n *\n * @param groupDef - Map of field name → FormValidator instance\n * @param options - initialValues, onSubmit, onValidate, errorParser, onSubmitError\n *\n * @example\n * const form = useFormValidatorGroup(\n * { name: new FormValidator('', [Validators.required('Required')]) },\n * {\n * initialValues: { name: 'Jane' },\n * onSubmit: async (values) => save(values),\n * },\n * );\n */\nexport function useFormValidatorGroup<\nTGroup extends FormGroup = FormGroup,\nTInitial = InferGroupValues<TGroup>\n>(\n groupDef: TGroup,\n { initialValues, onSubmit, onValidate, errorParser, onSubmitError }: FormValidatorGroupOptions<TGroup, TInitial> = {}\n): FormValidatorGroup<TGroup, TInitial> {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n const groupRef = useRef<FormValidatorGroup<TGroup, TInitial> | null>(null);\n if (!groupRef.current) {\n groupRef.current = new FormValidatorGroup(groupDef, null, {\n initialValues,\n errorParser,\n onSubmitError,\n });\n }\n const group = groupRef.current;\n\n const onSubmitRef = useRef(onSubmit);\n const onValidateRef = useRef(onValidate);\n onSubmitRef.current = onSubmit;\n onValidateRef.current = onValidate;\n\n useEffect(() => {\n if (onSubmit !== undefined) {\n group.onSubmitCallback = (...args) => onSubmitRef.current?.(...args);\n }\n if (onValidate !== undefined) {\n group.onValidateCallback = (...args) => onValidateRef.current?.(...args);\n }\n group.registerOnUpdateListener(rerender);\n return () => group.removeOnUpdateListener(rerender);\n }, []);\n\n return group;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["#valuesAfterCreation","#initialValues","#updateListeners","#isSubmitting","#notifyListeners","#debounceTimer","#errors","#value","#touched","#dirty","#label"],"sources":["../package/common/accordion/accordion.types.ts","../package/common/accordion/accordion.module.pcss","../package/common/accordion/accordion.primary.module.pcss","../package/common/accordion/accordion.plain.module.pcss","../package/common/accordion/accordion.tsx","../package/common/actionButtons/actionButtons.module.pcss","../package/common/button/button.module.pcss","../package/common/loading/spinnerLoading/spinnerLoading.module.pcss","../package/common/loading/spinnerLoading/spinnerLoading.tsx","../package/common/loading/spinnerLoading/index.ts","../package/common/button/button.types.ts","../package/common/ripple/ripple.module.pcss","../package/common/ripple/ripple.tsx","../package/common/button/button.tsx","../package/common/actionButtons/actionButtons.tsx","../package/common/interactableDiv/interactableDiv.module.pcss","../package/common/interactableDiv/interactableDiv.tsx","../package/common/interactableDiv/index.ts","../package/common/actionIcon/actionIcon.module.pcss","../package/common/actionIcon/actionIcon.tsx","../package/common/bodyEnd/bodyEnd.tsx","../package/common/card/card.module.pcss","../package/common/card/Card.tsx","../package/common/card/CardHeader.tsx","../package/common/card/CardMedia.tsx","../package/common/card/CardContent.tsx","../package/common/card/CardActions.tsx","../package/common/checkbox/checkbox.module.pcss","../package/common/checkbox/checkbox.tsx","../package/common/chip/chip.module.pcss","../package/common/chip/chip.tsx","../package/common/chip/chipContainer.tsx","../package/common/floatingMenu/floatingMenu.module.pcss","../package/common/floatingMenu/floatingMenu.types.ts","../package/common/floatingMenu/floatingMenu.tsx","../package/common/tooltip/tooltip.module.pcss","../package/common/tooltip/tooltip.tsx","../package/common/input/input.module.pcss","../package/common/input/input.types.ts","../package/common/input/input.tsx","../package/common/colorPicker/colorPicker.module.pcss","../package/common/colorPicker/colorPicker.tsx","../package/common/modal/modal.module.pcss","../package/common/modal/modal.tsx","../package/common/confirmModal/confirmModal.tsx","../package/common/datePicker/components/datePickerMonth/datePickerMonth.module.pcss","../package/services/localization.ts","../package/common/datePicker/dateFunctions.ts","../package/common/datePicker/components/datePickerMonth/datePickerMonth.tsx","../package/common/infiniteBlock/infiniteBlock.module.pcss","../package/common/infiniteBlock/infiniteBlock.tsx","../package/common/dropdown/dropdown.module.pcss","../package/common/dropdown/dropdown.tsx","../package/common/datePicker/datePicker.module.pcss","../package/common/datePicker/datePicker.tsx","../package/common/emptyState/emptyState.module.pcss","../package/common/emptyState/emptyState.tsx","../package/common/fab/components/fabBase/fabBase.module.pcss","../package/common/fab/components/fabBase/fabBase.tsx","../package/common/fab/fab.module.pcss","../package/common/fab/fab.tsx","../package/common/iconPicker/iconPicker.module.pcss","../package/common/iconPicker/iconPicker.tsx","../package/common/idleManager/idleManager.tsx","../package/common/inputDropdown/inputDropdown.module.pcss","../package/common/inputDropdown/inputDropdown.tsx","../package/common/kanbanBoard/kanbanBoard.module.pcss","../package/common/kanbanBoard/KanbanItem.tsx","../package/common/kanbanBoard/KanbanColumn.tsx","../package/common/kanbanBoard/KanbanBoard.tsx","../package/common/loading/iconLoading/iconLoading.module.pcss","../package/common/loading/iconLoading/iconLoading.tsx","../package/common/loading/iconLoading/index.ts","../package/common/numberInput/numberInput.module.pcss","../package/common/numberInput/numberInput.tsx","../package/common/numberInput/index.ts","../package/common/optionPicker/optionPicker.module.pcss","../package/common/optionPicker/optionPicker.tsx","../package/hooks/useWindowSize.ts","../package/common/overscroll/overscroll.module.pcss","../package/common/overscroll/overscroll.tsx","../package/common/progressBar/progressBar.module.pcss","../package/common/progressBar/progressBar.tsx","../package/common/roomDrawer/roomDrawer.utils.ts","../package/common/roomDrawer/roomDrawer.module.pcss","../package/common/roomDrawer/roomDrawer.tsx","../package/common/roomViewer/roomViewer.module.pcss","../package/common/roomViewer/roomViewer.tsx","../package/common/scrollbarProvider/scrollbarProvider.module.pcss","../package/common/scrollbarProvider/scrollbarProvider.tsx","../package/common/scrollbarProvider/index.ts","../package/common/searchInput/searchInput.module.pcss","../package/common/searchInput/searchInput.tsx","../package/common/stepper/stepper.module.pcss","../package/common/stepper/stepper.tsx","../package/services/tenorService.ts","../package/common/tenorPicker/components/gifPreview/gifPreview.module.pcss","../package/common/tenorPicker/components/gifPreview/gifPreview.tsx","../package/common/tenorPicker/components/gifView/gifView.module.pcss","../package/common/tenorPicker/components/gifView/gifView.tsx","../package/common/tenorPicker/tenorPicker.module.pcss","../package/common/tenorPicker/tenorPicker.tsx","../package/common/textarea/textarea.tsx","../package/common/themeProvider/defaultTheme.ts","../package/common/themeProvider/theme.module.pcss","../package/common/themeProvider/themeProvider.tsx","../package/common/themeProvider/useTheme.ts","../package/common/toast/toast.module.pcss","../package/common/toast/toast.tsx","../package/common/toast/toastService.ts","../package/common/toast/toastProvider.tsx","../package/common/virtualList/virtualList.module.pcss","../package/common/virtualList/virtualList.tsx","../package/common/wizard/wizard.module.pcss","../package/common/wizard/wizard.tsx","../package/services/formValidation/formValidatorGroup.ts","../package/services/formValidation/FormValidatorGroupForm.tsx","../package/services/formValidation/FormValidatorGroupWithForm.tsx","../package/services/formValidation/formValidator.ts","../package/services/regexp.ts","../package/services/formValidation/validators.ts","../package/services/formValidation/validatableComponent.tsx","../package/services/formValidation/useFormValidator.ts","../package/services/formValidation/useFormValidatorGroup.ts"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport type { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';\n\nexport enum AccordionStyleType {\n Default = 'default',\n Primary = 'primary',\n Plain = 'plain',\n}\n\nexport type AccordionSlots = 'root' | 'header' | 'title' | 'icon' | 'body' | 'bodyInner';\n\nexport interface AccordionProps extends HtmlProps {\n title?: string;\n children?: ReactNode;\n expanded?: boolean | null;\n onHeaderClicked?: (id: string, isExpanded: boolean) => void;\n styleType?: AccordionStyleType;\n startOpen?: boolean;\n hideHeader?: boolean;\n className?: string;\n style?: CSSProperties;\n classNames?: SlotClassNames<AccordionSlots>;\n styles?: SlotStyles<AccordionSlots>;\n}\n","\n.accordion {\n transition: margin 0.2s;\n margin: -1px;\n color: var(--text-color);\n\n &-title {\n width: 100%;\n }\n\n &-active {\n margin: 10px 0;\n }\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n background: var(--background);\n border-radius: var(--default-border-radius);\n border: 1px solid var(--border-color);\n font-size: 16px;\n font-weight: 400;\n transition: all 0.2s;\n\n &-active {\n border: 1px solid var(--primary-color);\n background: var(--background-accent);\n border-radius: var(--default-border-radius) var(--default-border-radius) 0px 0px;\n }\n }\n\n &-body {\n overflow: hidden;\n transition: all 0.2s ease;\n position: relative;\n border-radius: 0px 0px var(--default-border-radius) var(--default-border-radius);\n border: 1px solid var(--border-color);\n border-top: none;\n border-bottom: none;\n\n &-inner {\n padding: 16px;\n }\n\n &-active {\n border: 1px solid var(--primary-color);\n border-top: none;\n }\n }\n\n &-icon {\n transition: transform 0.2s;\n transform: rotate(0deg);\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n color: var(--border-color);\n &-active {\n transform: rotate(180deg);\n }\n }\n}\n","\n.accordion {\n transition: margin 0.2s;\n margin: -1px;\n\n &-title {\n width: 100%;\n }\n\n &-active {\n margin: 10px 0;\n border: 2px solid var(--primary-color);\n border-radius: var(--default-border-radius);\n }\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n background: var(--background);\n border-radius: var(--default-border-radius);\n font-size: 16px;\n font-weight: 400;\n transition: all 0.2s;\n\n &-active {\n background: var(--background-accent);\n border-radius: var(--default-border-radius) var(--default-border-radius) 0px 0px;\n }\n }\n\n &-body {\n overflow: hidden;\n transition: all 0.2s ease;\n position: relative;\n border-radius: 0px 0px var(--default-border-radius) var(--default-border-radius);\n border-top: none;\n border-bottom: none;\n\n &-inner {\n padding: 16px;\n }\n\n &-active {\n border-top: none;\n }\n }\n\n &-icon {\n transition: transform 0.2s;\n transform: rotate(0deg);\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n color: var(--primary-color);\n &-active {\n transform: rotate(180deg);\n }\n }\n}\n","\n.accordion {\n transition: margin 0.2s;\n margin: -1px;\n\n &-title {\n width: 100%;\n }\n\n &-active {\n margin: 10px 0;\n }\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n border-radius: var(--default-border-radius);\n font-size: 16px;\n font-weight: 400;\n transition: all 0.2s;\n\n &-active {\n border-radius: var(--default-border-radius) var(--default-border-radius) 0px 0px;\n }\n }\n\n &-body {\n overflow: hidden;\n transition: all 0.2s ease;\n position: relative;\n border-radius: 0px 0px var(--default-border-radius) var(--default-border-radius);\n\n &-inner {\n padding: 0px;\n }\n }\n\n &-icon {\n transition: transform 0.2s;\n transform: rotate(0deg);\n flex-shrink: 0;\n width: 16px;\n height: 16px;\n color: var(--primary-color);\n &-active {\n transform: rotate(180deg);\n }\n }\n}\n","import React, { useState, useEffect, useRef, type ReactElement } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown as arrowIcon } from '@fortawesome/free-solid-svg-icons';\n\nimport { AccordionStyleType, type AccordionProps } from './accordion.types';\n\nimport defaultStyles from './accordion.module.pcss';\nimport primaryStyles from './accordion.primary.module.pcss';\nimport plainStyles from './accordion.plain.module.pcss';\n\nconst STYLES_BY_TYPE: Record<AccordionStyleType, typeof defaultStyles> = {\n [AccordionStyleType.Default]: defaultStyles,\n [AccordionStyleType.Primary]: primaryStyles,\n [AccordionStyleType.Plain]: plainStyles,\n};\n\nfunction Accordion({\n id = '',\n title = '',\n children = null,\n expanded = null,\n onHeaderClicked = () => {},\n styleType = AccordionStyleType.Default,\n startOpen = false,\n hideHeader = false,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: AccordionProps): ReactElement {\n const s = STYLES_BY_TYPE[styleType];\n const bodyRef = useRef<HTMLDivElement>(null);\n\n const [isExpanded, setIsExpanded] = useState(expanded ?? startOpen);\n const [bodyHeight, setBodyHeight] = useState<number | null>(null);\n\n // Sync controlled expanded prop\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n if (expanded !== null) setIsExpanded(expanded);\n }, [expanded]);\n\n // Measure body height via ResizeObserver\n useEffect(() => {\n const el = bodyRef.current;\n if (!el) return;\n const observer = new ResizeObserver(() => setBodyHeight(el.offsetHeight));\n observer.observe(el);\n return () => observer.unobserve(el);\n }, []);\n\n function toggleExpanded() {\n const next = !isExpanded;\n onHeaderClicked(id, next);\n if (expanded === null) setIsExpanded(next);\n }\n\n const headerHeight = 24;\n const headerStyle = { height: `${isExpanded ? headerHeight + headerHeight / 3 : headerHeight}px` };\n const bodyStyle = { height: isExpanded ? (bodyHeight ?? 'auto') : '0px' };\n\n return (\n <div {...rest} id={id || undefined} className={cx(s.accordion, isExpanded && s.accordionActive, className, classNames?.root)} style={{ ...style, ...slotStyles?.root }}>\n {!hideHeader && (\n <div\n className={cx(s.accordionHeader, isExpanded && s.accordionHeaderActive, classNames?.header)}\n style={{ ...headerStyle, ...slotStyles?.header }}\n onClick={toggleExpanded}\n role=\"button\"\n tabIndex={0}\n onKeyDown={({ key }) => { if (key === 'Enter') toggleExpanded(); }}\n >\n <div className={cx(s.accordionTitle, classNames?.title)} style={slotStyles?.title}>{title}</div>\n <FontAwesomeIcon\n icon={arrowIcon}\n className={cx(s.accordionIcon, isExpanded && s.accordionIconActive, classNames?.icon)}\n style={slotStyles?.icon as React.CSSProperties & Record<`--fa-font-${string}`, string>}\n />\n </div>\n )}\n <div\n className={cx(s.accordionBody, isExpanded && s.accordionBodyActive, classNames?.body)}\n style={{ ...bodyStyle, ...slotStyles?.body }}\n >\n <div className={cx(s.accordionBodyInner, classNames?.bodyInner)} style={slotStyles?.bodyInner} ref={bodyRef}>\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nexport default Accordion;\n","\n.actionButtons {\n display: flex;\n gap: var(--spacing-m);\n\n @media (--mq-mobile) {\n flex-direction: column;\n }\n\n &-margin {\n margin-top: var(--spacing-l);\n }\n}\n",".button {\n appearance: none;\n -webkit-appearance: none;\n box-sizing: border-box;\n font-size: 16px;\n background: transparent;\n color: var(--text-color);\n border: none;\n padding: 0;\n font-family: var(--default-font);\n border-radius: var(--default-border-radius);\n cursor: pointer;\n position: relative;\n overflow: hidden;\n\n &-notAllowed {\n cursor: not-allowed;\n filter: opacity(0.8);\n }\n\n &-loading-icon {\n width: 100% !important;\n height: 100% !important;\n }\n\n &-content {\n position: relative;\n white-space: break-spaces;\n\n div {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n &-loading {\n visibility: hidden;\n\n &-container {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n &-withIcon {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n }\n\n &-style {\n &-default {\n /* Default button is unstyled */\n }\n\n &-primary {\n background: var(--primary-color);\n color: var(--text-color);\n color: var(--text-on-primary);\n\n .button-loading-icon {\n stroke: var(--text-on-primary);\n }\n }\n\n &-delete {\n background: var(--error-color);\n color: var(--text-on-delete);\n\n .button-loading-icon {\n stroke: var(--text-on-delete);\n }\n }\n }\n\n &-background {\n display: block;\n padding: 8px 12px;\n }\n\n &-size {\n &-default {\n font-size: 16px;\n }\n\n &-small {\n /* Small button is same as default for now */\n font-size: 12px;\n\n &-background {\n display: block;\n padding: 0px;\n }\n }\n\n &-medium {\n /* Medium button is same as default for now */\n font-size: 16px;\n }\n\n &-large {\n /* Large button is same as default for now */\n font-size: 20px;\n }\n }\n}\n",".spinner-loading {\n width: 70px;\n height: 70px;\n\n circle {\n stroke-dasharray: 283;\n stroke-dashoffset: 281;\n stroke-linecap: round;\n animation:\n animate-spinner 2s cubic-bezier(0.89, 0.01, 0.12, 1) infinite,\n spin 3s linear infinite;\n transform-origin: center;\n }\n\n @keyframes animate-spinner {\n 0% {\n stroke-dashoffset: 281;\n }\n\n 50% {\n stroke-dashoffset: 0;\n }\n\n 100% {\n stroke-dashoffset: -281;\n }\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n }\n}\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport styles from './spinnerLoading.module.pcss';\n\ninterface Properties {\n className?: string | undefined;\n}\n\nfunction SpinnerLoading({ className }: Properties): ReactElement {\n return (\n <svg\n data-testid=\"spinner\"\n className={cx(styles.spinnerLoading, className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\"\n fill=\"none\"\n stroke=\"var(--primary-color)\"\n >\n <circle cx=\"50\" cy=\"50\" r=\"45\" strokeWidth=\"10\" />\n </svg>\n );\n}\n\nSpinnerLoading.defaultProps = {\n className: undefined,\n};\n\nexport default SpinnerLoading;\n","import SpinnerLoading from './spinnerLoading';\n\nexport default SpinnerLoading;\n","import type { CSSProperties } from 'react';\nimport type { IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport type { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';\n\nexport enum ButtonStyleType {\n Primary = 'primary',\n Default = 'default',\n Delete = 'delete',\n}\n\nexport enum ButtonSize {\n Default = 'default',\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n}\n\nexport enum ButtonType {\n Button = 'button',\n Reset = 'reset',\n Submit = 'submit',\n}\n\nexport type ButtonSlots = 'background' | 'content' | 'loadingContainer' | 'label';\n\nexport interface ButtonProps extends HtmlProps {\n className?: string;\n style?: CSSProperties;\n type?: ButtonType;\n styleType?: ButtonStyleType;\n size?: ButtonSize;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => Promise<void> | void;\n children?: React.ReactNode;\n icon?: IconDefinition;\n isLoading?: boolean;\n disabled?: boolean;\n title?: string;\n ref?: React.Ref<HTMLButtonElement>;\n classNames?: SlotClassNames<ButtonSlots>;\n styles?: SlotStyles<ButtonSlots>;\n}\n",".ripple {\n background: rgba(255, 255, 255, 0.2);\n border-radius: 1000px;\n width: 100%;\n aspect-ratio: 1;\n position: absolute;\n left: 0;\n top: 0;\n transform: translate(-50%, -50%) scale(0);\n animation: ripple var(--ripple-animation-length) linear forwards;\n\n &-container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n border-radius: inherit;\n user-select: none;\n pointer-events: none;\n }\n\n @keyframes ripple {\n to {\n transform: translate(-50%, -50%) scale(4);\n opacity: 0;\n }\n }\n}\n","import React, { useRef, useEffect, useImperativeHandle, forwardRef } from 'react';\n\nimport styles from './ripple.module.pcss';\nimport type { RippleProps, RippleHandle } from './ripple.types';\n\nexport type { RippleProps, RippleHandle };\n\nconst Ripple = forwardRef<RippleHandle, RippleProps>(function Ripple({\n disabled = false,\n children,\n className,\n style,\n overflowHidden = true,\n rippleAnimationLength = 0.6,\n rippleBackground = 'rgba(255, 255, 255, 0.2)',\n manualOnly = false,\n ...rest\n}, ref) {\n const containerRef = useRef<HTMLDivElement>(null);\n const addRippleRef = useRef<((event: MouseEvent) => void) | null>(null);\n\n function spawnRipple(x: number, y: number) {\n if (disabled) return;\n const ripple = document.createElement('div');\n ripple.style.left = `${x}px`;\n ripple.style.top = `${y}px`;\n ripple.style.background = rippleBackground;\n ripple.classList.add(styles.ripple);\n containerRef.current?.appendChild(ripple);\n setTimeout(() => {\n containerRef.current?.removeChild(ripple);\n }, rippleAnimationLength * 1000 + 50);\n }\n\n function addRipple(event: MouseEvent | React.MouseEvent) {\n if (!containerRef.current) return;\n const pos = containerRef.current.getBoundingClientRect();\n spawnRipple(event.clientX - pos.x, event.clientY - pos.y);\n }\n\n useImperativeHandle(ref, () => ({\n addRipple() {\n const el = containerRef.current;\n if (!el) return;\n spawnRipple(el.offsetWidth / 2, el.offsetHeight / 2);\n },\n }));\n\n useEffect(() => {\n addRippleRef.current = addRipple;\n });\n\n useEffect(() => {\n if (children !== undefined || manualOnly) return;\n const parent = containerRef.current?.parentElement;\n if (!parent) return;\n const handler = (e: MouseEvent) => addRippleRef.current?.(e);\n parent.addEventListener('click', handler);\n return () => parent.removeEventListener('click', handler);\n }, [children, manualOnly]);\n\n const containerStyle: React.CSSProperties & { '--ripple-animation-length'?: string } = {\n '--ripple-animation-length': `${rippleAnimationLength}s`,\n };\n\n if (children !== undefined) {\n return (\n <div\n {...rest}\n className={className}\n onClick={manualOnly ? undefined : (e) => addRipple(e)}\n style={{\n position: 'relative',\n overflow: overflowHidden ? 'hidden' : 'visible',\n ...style,\n }}\n >\n {children}\n <div\n className={styles.rippleContainer}\n ref={containerRef}\n style={containerStyle}\n />\n </div>\n );\n }\n\n return (\n <div\n className={styles.rippleContainer}\n ref={containerRef}\n style={{\n overflow: overflowHidden ? 'hidden' : 'visible',\n ...containerStyle,\n }}\n />\n );\n});\n\nexport default Ripple;\n","import cx from 'classnames';\nimport type { ReactElement } from 'react';\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport styles from './button.module.pcss';\nimport SpinnerLoading from 'components/common/loading/spinnerLoading';\nimport { ButtonStyleType, ButtonSize, ButtonType } from './button.types';\nimport type { ButtonProps } from './button.types';\nimport Ripple from '../ripple';\n\nconst CLASS_BY_STYLE: Record<ButtonStyleType, string> = {\n default: styles.buttonStyleDefault,\n primary: styles.buttonStylePrimary,\n delete: styles.buttonStyleDelete,\n};\n\nconst CLASS_BY_SIZE: Record<ButtonSize, string> = {\n default: styles.buttonSizeDefault,\n small: styles.buttonSizeSmall,\n medium: styles.buttonSizeMedium,\n large: styles.buttonSizeLarge,\n};\n\nfunction Button({\n className,\n style,\n type = ButtonType.Button,\n styleType = ButtonStyleType.Default,\n size = ButtonSize.Default,\n onClick = (): void => {},\n children,\n icon,\n isLoading = false,\n disabled = false,\n title = undefined,\n ref,\n classNames,\n styles: slotStyles,\n ...rest\n}: ButtonProps): ReactElement {\n return (\n <button\n {...rest}\n className={cx(\n styles.button,\n CLASS_BY_STYLE[styleType],\n CLASS_BY_SIZE[size],\n {\n [styles.buttonNotAllowed]: isLoading || disabled,\n },\n className\n )}\n style={style}\n type={type}\n onClick={onClick}\n disabled={disabled || isLoading}\n title={title}\n ref={ref}\n >\n <Ripple disabled={isLoading || disabled}>\n <div className={cx(styles.buttonBackground, classNames?.background)} style={slotStyles?.background}>\n <div className={cx(styles.buttonContent, classNames?.content)} style={slotStyles?.content}>\n {isLoading ? (\n <div className={cx(styles.buttonLoadingContainer, classNames?.loadingContainer)} style={slotStyles?.loadingContainer}>\n <SpinnerLoading className={styles.buttonLoadingIcon} />\n </div>\n ) : null}\n <div\n className={cx(classNames?.label, {\n [styles.buttonLoading]: isLoading,\n [styles.buttonWithIcon]: !!icon,\n })}\n style={slotStyles?.label}\n >\n {icon ? <FontAwesomeIcon icon={icon} /> : null}\n {children}\n </div>\n </div>\n </div>\n </Ripple>\n </button>\n );\n}\n\nButton.StyleType = ButtonStyleType;\nButton.Size = ButtonSize;\nButton.Type = ButtonType;\n\nexport default Button;\n","import cx from 'classnames';\n\nimport styles from './actionButtons.module.pcss';\nimport Button, { ButtonStyleType, ButtonType } from '../button';\nimport { ActionButtonsProps } from './actionButtons.types';\n\nexport default function ActionButtons({\n onSubmit = () => null,\n onClose = () => null,\n submitLabel = 'Save',\n cancelLabel = 'Cancel',\n submitButtonStyle = ButtonStyleType.Primary,\n isSubmitButtonLoading = false,\n isSubmitButtonDisabled = false,\n isCancelButtonLoading = false,\n isCancelButtonDisabled = false,\n hidePrimaryButton = false,\n hideSecondaryButton = false,\n noMargin = false,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: ActionButtonsProps) {\n return (\n <div\n {...rest}\n className={cx(styles.actionButtons, !noMargin && styles.actionButtonsMargin, className, classNames?.root)}\n style={{ ...style, ...slotStyles?.root }}\n >\n {!hidePrimaryButton && (\n <Button\n isLoading={isSubmitButtonLoading}\n disabled={isSubmitButtonDisabled}\n styleType={submitButtonStyle}\n type={ButtonType.Submit}\n onClick={onSubmit}\n className={classNames?.submitButton}\n style={slotStyles?.submitButton}\n >\n {submitLabel}\n </Button>\n )}\n {!hideSecondaryButton && (\n <Button\n isLoading={isCancelButtonLoading}\n disabled={isCancelButtonDisabled}\n onClick={onClose}\n styleType={ButtonStyleType.Default}\n className={classNames?.cancelButton}\n style={slotStyles?.cancelButton}\n >\n {cancelLabel}\n </Button>\n )}\n </div>\n );\n}",".interactableDiv {\n}\n","import cx from 'classnames';\nimport React, {\n ReactNode,\n useCallback,\n type KeyboardEvent,\n type KeyboardEventHandler,\n type MouseEvent,\n type MouseEventHandler,\n type ReactElement,\n} from 'react';\n\nimport styles from './interactableDiv.module.pcss';\nimport type { HtmlProps } from '../types/baseProps.types';\n\ninterface Properties extends HtmlProps {\n className?: string | undefined;\n children?: ReactNode | undefined;\n onClick?: MouseEventHandler<HTMLDivElement> | undefined;\n onKeyDown?: KeyboardEventHandler<HTMLDivElement> | undefined;\n style?: React.CSSProperties | undefined;\n tabIndex?: number | null;\n title?: string | undefined;\n}\n\nconst InteractableDiv = React.forwardRef<HTMLDivElement, Properties>(\n ({ className, children, onClick, onKeyDown, tabIndex = 0, title, ...props }, ref): ReactElement => {\n const onKeyDownHandler = useCallback(\n (e: KeyboardEvent<HTMLDivElement> | MouseEvent<HTMLDivElement>) => {\n if ((e as React.KeyboardEvent).key === 'Enter') {\n onClick?.(e as MouseEvent<HTMLDivElement>);\n }\n onKeyDown?.(e as KeyboardEvent<HTMLDivElement>);\n },\n [onClick, onKeyDown]\n );\n\n return (\n <div\n className={cx(styles.interactableDiv, className)}\n onClick={onClick}\n tabIndex={tabIndex == undefined ? 0 : tabIndex}\n role=\"button\"\n onKeyDown={onKeyDownHandler}\n ref={ref}\n title={title}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nInteractableDiv.displayName = 'InteractableDiv';\n\nexport default InteractableDiv;\n","import InteractableDiv from './interactableDiv';\n\nexport default InteractableDiv;\n",".actionIcon {\n cursor: pointer;\n padding: 4px;\n &:hover {\n filter: brightness(0.8);\n }\n}\n","import React from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { ReactElement } from 'react';\n\nimport InteractableDiv from '../interactableDiv';\nimport type { ActionIconProps } from './actionIcon.types';\nimport styles from './actionIcon.module.pcss';\n\nfunction ActionIcon({\n icon,\n className = '',\n style,\n title = '',\n onClick = () => {},\n classNames,\n styles: slotStyles,\n ...rest\n}: ActionIconProps): ReactElement {\n return (\n <InteractableDiv\n {...rest}\n className={cx(styles.actionIcon, className, classNames?.root)}\n style={{ ...style, ...slotStyles?.root }}\n title={title}\n onClick={onClick}\n >\n <FontAwesomeIcon\n icon={icon}\n className={classNames?.icon}\n style={slotStyles?.icon as React.CSSProperties & Record<`--fa-font-${string}`, string>}\n />\n </InteractableDiv>\n );\n}\n\nexport default ActionIcon;\n","import { createPortal } from 'react-dom';\nimport type { ReactElement } from 'react';\n\nimport type { BodyEndProps } from './bodyEnd.types';\n\n// Module-scoped ambient typing for the bundler-replaced NODE_ENV guard below.\n// Browsers don't define `process`, so the value is read defensively at runtime;\n// bundlers (Vite/webpack) still statically replace the `process.env.NODE_ENV`\n// token. Declared at module scope (not globally), it isn't emitted into the\n// .d.ts and can't clash with a consumer's @types/node.\ndeclare const process: { env: { NODE_ENV?: string } };\n\nfunction BodyEnd({ children = null }: BodyEndProps): ReactElement | null {\n const target = document.getElementById('bodyEnd');\n if (!target) {\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production') {\n console.error('[BodyEnd] No element with id=\"bodyEnd\" found. Add <div id=\"bodyEnd\"></div> to your app root.');\n }\n return null;\n }\n return createPortal(children, target);\n}\n\nexport default BodyEnd;\n",".card {\n border-radius: var(--default-border-radius);\n background: var(--background-accent-light);\n color: var(--text-color);\n overflow: hidden;\n\n &-padding {\n padding: 16px;\n }\n\n &-shadow {\n box-shadow: var(--card-shadow);\n }\n\n &-interactable {\n cursor: pointer;\n }\n\n &-hover {\n transition:\n transform 0.15s ease,\n box-shadow 0.15s ease,\n filter 0.3s ease;\n\n &:hover {\n transform: translateY(-2px);\n background: var(--background-accent);\n }\n }\n}\n\n.cardHeader {\n display: flex;\n gap: 16px;\n /* margin-bottom: 16px; */\n align-items: center;\n\n &-thumbnail {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 40px;\n height: 40px;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 40px;\n overflow: hidden;\n background-size: cover;\n background-position: center;\n flex-shrink: 0;\n }\n\n &-titles {\n display: flex;\n flex-flow: column;\n flex: 1;\n gap: 4px;\n overflow: hidden;\n\n &-main {\n font-size: 18px;\n font-weight: 600;\n }\n\n &-sub {\n font-weight: 300;\n }\n }\n}\n\n.cardMedia {\n width: calc(100% + 32px);\n margin: 0 -16px 0 -16px;\n}\n\n.cardActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n","import cx from 'classnames';\n\nimport { type CardProps } from './card.types';\nimport styles from './card.module.pcss';\nimport InteractableDiv from '../interactableDiv';\nimport Ripple from '../ripple';\n\nfunction Card({\n className = undefined,\n children = null,\n onClick = undefined,\n tabIndex = null,\n hoverEffect = undefined,\n style = undefined,\n ...rest\n}: CardProps) {\n const isInteractable = !!onClick;\n\n return (\n <InteractableDiv\n {...rest}\n className={cx(\n styles.card,\n styles.cardPadding,\n styles.cardShadow,\n isInteractable && styles.cardInteractable,\n ((isInteractable && hoverEffect !== false) || hoverEffect) && styles.cardHover,\n className\n )}\n onClick={onClick}\n tabIndex={tabIndex ?? (isInteractable ? 0 : null)}\n style={style}\n >\n <Ripple disabled={!isInteractable} overflowHidden={false}>\n {children}\n </Ripple>\n </InteractableDiv>\n );\n}\n\nexport default Card;\n","import React from 'react';\nimport cx from 'classnames';\n\nimport type { CardHeaderProps } from './card.types';\nimport styles from './card.module.pcss';\n\nfunction CardHeader({\n className = '',\n title = '',\n subTitle = '',\n thumbnail = '',\n}: CardHeaderProps) {\n const thumbnailUrl =\n typeof thumbnail === 'string' && thumbnail.startsWith('http') ? thumbnail : undefined;\n\n return (\n <div className={cx(styles.cardHeader, className)}>\n {thumbnail && (\n <div\n className={styles.cardHeaderThumbnail}\n style={thumbnailUrl ? { backgroundImage: `url(${thumbnailUrl})` } : {}}\n >\n {!thumbnailUrl && thumbnail}\n </div>\n )}\n <div className={styles.cardHeaderTitles}>\n <div className={styles.cardHeaderTitlesMain}>{title}</div>\n <div className={styles.cardHeaderTitlesSub}>{subTitle}</div>\n </div>\n </div>\n );\n}\n\nexport default CardHeader;\n","import React from 'react';\n\nimport type { CardMediaProps } from './card.types';\nimport styles from './card.module.pcss';\n\nfunction CardMedia({ src = '', alt = '' }: CardMediaProps) {\n return <img className={styles.cardMedia} src={src} alt={alt} />;\n}\n\nexport default CardMedia;\n","import React from 'react';\n\nimport type { CardContentProps } from './card.types';\n\nfunction CardContent({ children = null }: CardContentProps) {\n return <>{children}</>;\n}\n\nexport default CardContent;\n","import React from 'react';\nimport cx from 'classnames';\nimport Button from '../button';\nimport { ButtonStyleType } from '../button/button.types';\n\nimport type { CardActionsProps } from './card.types';\nimport styles from './card.module.pcss';\n\nfunction CardActions({ className = '', actions = [], children = null }: CardActionsProps) {\n return (\n <div className={cx(styles.cardActions, className)}>\n {actions.map(({ id, onClick, label, styleType = ButtonStyleType.Default }) => (\n <div key={id ?? label}>\n <Button onClick={onClick} styleType={styleType}>\n {label}\n </Button>\n </div>\n ))}\n {children}\n </div>\n );\n}\n\nexport default CardActions;\n","\n.checkbox {\n user-select: none;\n display: flex;\n align-items: center;\n column-gap: 10px;\n margin: -1px;\n border: 1px solid transparent;\n width: fit-content;\n\n &-icon {\n color: #a3a9b9;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background-color: var(--light-background-color);\n width: fit-content;\n height: fit-content;\n /* width: 16px;\n height: 16px; */\n }\n\n &-loading {\n background: transparent;\n\n &-spinner {\n width: 100%;\n height: 100%;\n }\n }\n\n &-pointer {\n cursor: pointer;\n }\n\n &:focus-visible {\n outline: none;\n border: 1px solid var(--primary-color);\n border-radius: 6px;\n }\n\n &-disabled {\n filter: brightness(0.8);\n cursor: not-allowed;\n }\n\n &-checkmark {\n border: 1.8px solid var(--text-color);\n border-radius: var(--default-border-radius);\n position: relative;\n\n svg {\n stroke: var(--text-on-primary);\n stroke-dasharray: 5;\n stroke-dashoffset: 5;\n transition:\n transform 0.1s,\n stroke-dashoffset 0.4s;\n transition-delay: 0s, 0.2s;\n background: var(--primary-color);\n transform: scale(0);\n box-sizing: content-box;\n padding: 2px;\n border-radius: var(--default-border-radius);\n }\n\n &-checked {\n svg {\n stroke-dashoffset: 0;\n transform: scale(1) translate(-3px, -3px);\n }\n }\n }\n}\n","import { useRef, useEffect, useState, type ReactElement } from 'react';\nimport cx from 'classnames';\nimport Ripple from 'components/common/ripple';\nimport SpinnerLoading from '../loading/spinnerLoading';\n\nimport type { CheckboxProps } from './checkbox.types';\nimport styles from './checkbox.module.pcss';\n\nfunction Checkbox({\n label = '',\n selected = false,\n onToggle = () => {},\n className = '',\n style,\n disabled = false,\n lineHeight = '',\n title = '',\n tabIndex = 0,\n cursorDefault = false,\n width = '17px',\n height = '17px',\n formValidator = null,\n children = null,\n background = null,\n isLoading = false,\n classNames,\n styles: slotStyles,\n ...rest\n}: CheckboxProps): ReactElement {\n const rippleRef = useRef<{ addRipple: () => void }>(null);\n const [, forceUpdate] = useState(0);\n\n useEffect(() => {\n if (!formValidator) return;\n const listener = () => forceUpdate((n) => n + 1);\n formValidator.registerOnUpdateListener(listener);\n return () => formValidator.removeOnUpdateListener(listener);\n }, [formValidator]);\n\n function handleToggle(event?: React.MouseEvent | React.KeyboardEvent) {\n if (disabled || isLoading) return;\n rippleRef.current?.addRipple();\n if (formValidator) {\n formValidator.set(!formValidator.value);\n }\n onToggle(!selected, event);\n }\n\n const currSelected = (formValidator ? formValidator.value : selected) as boolean;\n\n return (\n <div\n {...rest}\n className={cx(\n styles.checkbox,\n {\n [styles.checkboxDisabled]: disabled,\n [styles.checkboxPointer]: !cursorDefault,\n },\n className\n )}\n style={style}\n onClick={handleToggle}\n onKeyPress={(e) => { if (e.key === 'Enter') handleToggle(e); }}\n role=\"checkbox\"\n aria-checked={currSelected}\n tabIndex={tabIndex}\n >\n <div\n title={title}\n className={cx(styles.checkboxIcon, isLoading ? styles.checkboxLoading : null, classNames?.icon)}\n style={slotStyles?.icon}\n >\n {isLoading ? (\n <div style={{ width, height }}>\n <SpinnerLoading className={styles.checkboxLoadingSpinner} />\n </div>\n ) : (\n <div\n style={{ width, height, ...slotStyles?.checkmark }}\n className={cx(\n styles.checkboxCheckmark,\n currSelected && styles.checkboxCheckmarkChecked,\n classNames?.checkmark\n )}\n >\n <Ripple\n ref={rippleRef}\n manualOnly\n overflowHidden={false}\n rippleAnimationLength={0.3}\n rippleBackground=\"radial-gradient(transparent, var(--primary-color))\"\n />\n <svg\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"-0.5 -1.5 4 2.6\"\n width={`calc(${width} + 1px)`}\n height={`calc(${height} + 1px)`}\n {...(background ? { style: { background } } : {})}\n >\n <path d=\"M 0 0 l 1 1 l 2 -2\" strokeWidth=\"0.4\" fill=\"none\" />\n </svg>\n </div>\n )}\n </div>\n <div className={classNames?.label} style={{ lineHeight: lineHeight || '100%', ...slotStyles?.label }}>{children || label}</div>\n </div>\n );\n}\n\nexport default Checkbox;\n",".chip {\n background: rgba(0, 0, 0, 0.08);\n border-radius: 99999px;\n width: fit-content;\n position: relative;\n box-sizing: border-box;\n max-width: 100%;\n\n &-clickable {\n cursor: pointer;\n }\n\n &-inner {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 4px 8px;\n\n & > * {\n white-space: nowrap;\n }\n }\n\n &-text {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n &-thumbnail {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 18px;\n height: 18px;\n background: rgba(0, 0, 0, 0.08);\n border-radius: 18px;\n overflow: hidden;\n background-size: cover;\n }\n\n &-container {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n\n &-inline {\n flex-wrap: nowrap;\n overflow: auto;\n }\n }\n}\n","import React, { useMemo } from 'react';\nimport { faXmarkCircle } from '@fortawesome/free-solid-svg-icons';\nimport cx from 'classnames';\n\nimport Ripple from '../ripple';\nimport ActionIcon from '../actionIcon';\nimport { ChipProps } from './chip.types';\n\nimport styles from './chip.module.pcss';\n\nfunction Chip({\n className = '',\n thumbnail = '',\n text = '',\n showRemoveIcon = false,\n onClick,\n onRemove,\n ...rest\n}: ChipProps) {\n const thumbnailUrl = useMemo(() => {\n if (typeof thumbnail === 'string' && thumbnail.startsWith('http')) return thumbnail;\n return undefined;\n }, [thumbnail]);\n\n return (\n <div {...rest} className={cx(styles.chip, onClick && styles.chipClickable, className)} onClick={onClick}>\n <Ripple disabled={!onClick} style={{ borderRadius: 'inherit' }}>\n <div className={styles.chipInner}>\n {thumbnail && (\n <div\n className={styles.chipThumbnail}\n style={thumbnailUrl ? { backgroundImage: `url(${thumbnailUrl})` } : {}}\n >\n {!thumbnailUrl && thumbnail}\n </div>\n )}\n <div className={styles.chipText}>{text}</div>\n {showRemoveIcon && <ActionIcon icon={faXmarkCircle} onClick={(e) => { e.stopPropagation(); onRemove?.(); }} />}\n </div>\n </Ripple>\n </div>\n );\n}\n\nexport default Chip;\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport { ChipContainerProps } from './chip.types';\nimport styles from './chip.module.pcss';\n\nfunction ChipContainer({\n className = undefined,\n children = null,\n inline = false,\n ...rest\n}: ChipContainerProps): ReactElement {\n return (\n <div {...rest} className={cx(styles.chipContainer, inline && styles.chipContainerInline, className)}>\n {children}\n </div>\n );\n}\n\nexport default ChipContainer;\n",".floatingMenu {\n position: relative;\n\n &-content {\n cursor: pointer;\n }\n\n &-container {\n box-shadow:\n 0 2px 4px -1px #0003,\n 0 4px 5px #00000024,\n 0 1px 10px #0000001f;\n position: absolute;\n margin-top: 10px;\n background: var(--background-modal);\n padding: 8px;\n border-radius: calc(var(--default-border-radius) + 4px);\n\n &-align {\n &-left {\n left: 0px;\n }\n\n &-right {\n right: 0px;\n }\n\n &-center {\n left: 50%;\n transform: translateX(-50%);\n }\n }\n\n &-flag {\n box-shadow:\n 0 2px 4px -1px #0003,\n 0 4px 5px #00000024,\n 0 1px 10px #0000001f;\n background: var(--background-modal);\n height: 10px;\n width: 10px;\n position: absolute;\n margin-top: 5px;\n transform: rotate(45deg);\n\n &-align-right {\n right: 8px;\n }\n\n &-align-left {\n left: 8px;\n }\n\n &-align-center {\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n }\n }\n }\n\n &-anim {\n transform: scale(0.7);\n opacity: 0.7;\n animation: showMenu 0.1s forwards;\n position: fixed;\n z-index: 2;\n }\n\n @keyframes showMenu {\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport type { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';\n\nexport enum Align {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n}\n\nexport type FloatingMenuSlots = 'root' | 'trigger' | 'menu' | 'menuContainer';\n\nexport interface FloatingMenuProps extends HtmlProps {\n align?: Align;\n children?: ReactNode;\n content?: ReactNode;\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n dontCloseOnChildClick?: boolean;\n className?: string;\n style?: CSSProperties;\n classNames?: SlotClassNames<FloatingMenuSlots>;\n styles?: SlotStyles<FloatingMenuSlots>;\n}","import { useRef, useEffect, useState } from 'react';\nimport cx from 'classnames';\n\nimport styles from './floatingMenu.module.pcss';\nimport { Align, FloatingMenuProps } from './floatingMenu.types';\n\nfunction capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction FloatingMenu({\n align = Align.Left,\n children = null,\n content = null,\n isOpen = false,\n onOpenChange = () => {},\n dontCloseOnChildClick = false,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: FloatingMenuProps) {\n const menuContainerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const onOpenChangeRef = useRef(onOpenChange);\n const [triggerWidth, setTriggerWidth] = useState(10);\n const [pickerPos, setPickerPos] = useState<{ top: number; left: number } | null>(null);\n\n // Keep the callback ref current without adding it to the effect deps\n useEffect(() => { onOpenChangeRef.current = onOpenChange; });\n\n function handleTriggerClick() {\n if (!isOpen) {\n const rect = triggerRef.current?.getBoundingClientRect();\n setTriggerWidth(rect?.width ?? 10);\n setPickerPos(rect ? { top: rect.bottom, left: rect.left } : null);\n onOpenChange(true);\n }\n }\n\n useEffect(() => {\n if (!isOpen) return;\n\n function updatePos() {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect) setPickerPos({ top: rect.bottom, left: rect.left });\n }\n\n window.addEventListener('scroll', updatePos, true);\n window.addEventListener('resize', updatePos);\n return () => {\n window.removeEventListener('scroll', updatePos, true);\n window.removeEventListener('resize', updatePos);\n };\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n function onMouseUp(event: MouseEvent) {\n const menuElem = menuContainerRef.current;\n const triggerElem = triggerRef.current;\n if (!menuElem || !triggerElem) return;\n\n const menuClicked = menuElem === event.target || menuElem.contains(event.target as Node);\n const triggerClicked = dontCloseOnChildClick &&\n (triggerElem === event.target || triggerElem.contains(event.target as Node));\n\n if (!menuClicked && !triggerClicked) {\n setTimeout(() => onOpenChangeRef.current(false), 1);\n }\n }\n\n window.addEventListener('mouseup', onMouseUp);\n return () => window.removeEventListener('mouseup', onMouseUp);\n }, [isOpen, dontCloseOnChildClick]);\n\n return (\n <div {...rest} className={cx(styles.floatingMenu, className, classNames?.root)} style={{ ...style, ...slotStyles?.root }}>\n <div\n className={cx(styles.floatingMenuContent, classNames?.trigger)}\n style={slotStyles?.trigger}\n ref={triggerRef}\n onClick={handleTriggerClick}\n >\n {children}\n </div>\n {isOpen && (\n <div\n className={cx(styles.floatingMenuAnim, classNames?.menu)}\n style={{\n width: `${triggerWidth}px`,\n ...(pickerPos && { top: pickerPos.top, left: pickerPos.left }),\n ...slotStyles?.menu,\n }}\n >\n <div className={cx(\n styles.floatingMenuContainerFlag,\n styles[`floatingMenuContainerFlagAlign${capitalize(align)}`],\n )} />\n <div\n ref={menuContainerRef}\n className={cx(\n styles.floatingMenuContainer,\n styles[`floatingMenuContainerAlign${capitalize(align)}`],\n classNames?.menuContainer,\n )}\n style={slotStyles?.menuContainer}\n >\n {content}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default FloatingMenu;\n","\n.tooltipBubble {\n position: absolute;\n bottom: calc(100% + 6px);\n left: 0;\n z-index: 10;\n border-radius: 3px;\n width: max-content;\n max-width: 200px;\n font-size: 12px;\n background-color: #454953;\n padding: 6px 9px;\n color: white;\n pointer-events: none;\n\n &:after {\n content: '';\n position: absolute;\n top: 100%;\n left: 12px;\n border-width: 5px;\n border-style: solid;\n border-color: #454953 transparent transparent transparent;\n }\n}\n\n.tooltipDetails {\n position: relative;\n display: inline-flex;\n align-items: center;\n\n &-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n font-size: 11px;\n font-weight: 700;\n background-color: #454953;\n color: white;\n cursor: default;\n user-select: none;\n }\n}\n\n.tooltipError {\n position: absolute;\n top: -33px;\n right: 0;\n width: max-content;\n border-radius: 3px;\n background-color: var(--error-lighter);\n color: var(--red);\n font-size: 10px;\n padding: 6px 9px;\n z-index: 1;\n\n &:after {\n content: '';\n position: absolute;\n top: 100%;\n left: 90%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: var(--error-border-color) transparent transparent transparent;\n }\n}\n","import React, { useState } from 'react';\nimport cx from 'classnames';\nimport styles from './tooltip.module.pcss';\nimport type { TooltipProps } from './tooltip.types';\n\nexport default function Tooltip({\n variant,\n message = '',\n isVisible = true,\n tooltipPosition,\n onClick,\n}: TooltipProps) {\n const [detailsHovered, setDetailsHovered] = useState(false);\n\n if (variant === 'info') {\n if (!isVisible) return null;\n return (\n <div className={cx(styles.tooltipBubble, tooltipPosition)} onClick={onClick}>\n {message}\n </div>\n );\n }\n\n if (variant === 'details') {\n return (\n <div className={styles.tooltipDetails}>\n <span\n className={styles.tooltipDetailsIcon}\n onMouseEnter={() => setDetailsHovered(true)}\n onMouseLeave={() => setDetailsHovered(false)}\n >\n ?\n </span>\n {detailsHovered && (\n <div className={cx(styles.tooltipBubble, tooltipPosition)}>{message}</div>\n )}\n </div>\n );\n }\n\n if (variant === 'error') {\n if (!isVisible) return null;\n return (\n <div className={cx(styles.tooltipError, tooltipPosition)} onClick={onClick}>\n {message}\n </div>\n );\n }\n\n return null;\n}\n","\n.required-mark {\n padding: 0px 0px 0px 4px;\n color: var(--error-font-color);\n}\n\n.isRequired {\n color: var(--message-error-color);\n}\n\n.input {\n position: relative;\n width: 100%;\n\n &-placeholder {\n position: absolute;\n top: 50%;\n left: 7px;\n transform: translateY(-50%);\n transition: all 0.2s;\n opacity: 0;\n user-select: none;\n pointer-events: none;\n\n &-shown {\n animation: 0.2s fadeIn 0.3s forwards;\n }\n\n &-multiline {\n top: 14px;\n transform: translateY(0);\n }\n }\n\n &-matLabel {\n position: absolute;\n transition: all 0.3s;\n left: 7px;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n font-size: 16px;\n pointer-events: none;\n user-select: none;\n\n &-floating {\n inset: -9px 0 0 14px;\n font-size: 13px;\n transform: translateY(0);\n }\n\n &-multiline {\n top: 14px;\n transform: translateY(0);\n }\n }\n\n &-fieldset {\n position: absolute;\n width: 100%;\n margin: 0;\n padding: 0;\n min-width: 0;\n box-sizing: border-box;\n border-radius: var(--default-border-radius);\n inset: -11px 0 0 0;\n padding-left: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: var(--border-color);\n pointer-events: none;\n user-select: none;\n\n &-legend {\n display: block;\n max-width: 0;\n transition: max-width 0.2s;\n white-space: nowrap;\n padding: 0;\n\n &-active {\n max-width: 300px;\n }\n\n span {\n font-size: 13px;\n padding: 5px;\n opacity: 0;\n }\n\n span:empty {\n padding: 0.000001px;\n }\n }\n }\n\n &-container {\n display: flex;\n align-items: center;\n border-radius: var(--default-border-radius);\n background-color: var(--input-background);\n transition: border-color;\n cursor: text;\n height: 100%;\n\n &-multiline {\n overflow: hidden;\n padding-top: 10px;\n align-items: flex-start;\n }\n\n &-border {\n outline: 1px solid var(--border-color);\n transition: border-color;\n background-color: var(--input-background);\n outline: none;\n\n &-focused {\n outline-color: var(--primary-color);\n border-color: var(--primary-color);\n }\n\n &-searchFocused {\n outline-color: var(--search-input-color);\n outline-width: 2px;\n border-color: var(--search-input-color);\n }\n\n &-invalid {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n\n &-invalid:hover {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n\n &-error {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n }\n }\n\n &-label {\n display: flex;\n color: var(--text-color);\n height: 100%;\n\n &-column {\n flex-direction: column;\n }\n\n &-text {\n white-space: nowrap;\n margin-right: 5px;\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n color: color(var(--border-color) lightness(40%));\n background-color: transparent;\n font-size: 12px;\n position: absolute;\n top: -15px;\n white-space: nowrap;\n }\n }\n\n &-upper-right-label {\n position: absolute;\n transform: translateY(calc(-100% - 1.5px));\n right: 8px;\n min-height: 12px;\n font-size: 12px;\n color: color(var(--border-color) lightness(40%));\n }\n\n &-field {\n appearance: none;\n -webkit-appearance: none;\n font-family: inherit;\n font-size: inherit;\n box-sizing: border-box;\n resize: none;\n width: 100%;\n border: none;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n line-height: 20px;\n color: var(--text-color);\n background: transparent;\n\n &:focus {\n outline: none;\n }\n\n &::placeholder {\n color: var(--text-light);\n }\n\n &-withIcon {\n padding-right: 37px !important;\n\n &-left {\n padding-right: 9px !important;\n padding-left: 37px !important;\n }\n }\n\n &-field {\n resize: none;\n width: 100%;\n border: none;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n background-color: var(--light-background-color);\n line-height: 20px;\n height: 100%;\n\n &::placeholder {\n color: var(--disabled-font-color);\n }\n\n &-default {\n padding: 8px 7.5px 6px;\n }\n\n &[disabled] {\n background-color: var(--disabled-input-color);\n color: var(--disabled-font-color);\n }\n }\n\n &-suffix {\n padding-right: 9px;\n }\n\n &-date {\n padding: 6px 9px;\n color-scheme: dark;\n\n svg {\n color: white;\n }\n }\n\n &-default {\n padding: 8px 7.5px 6px;\n }\n\n &[disabled] {\n background-color: var(--disabled-input-color);\n color: var(--disabled-font-color);\n }\n\n &-uppercase {\n text-transform: uppercase;\n }\n\n &-multiline {\n overflow-y: auto;\n resize: vertical;\n padding-top: 4px;\n min-height: 30px;\n\n &-autoResize {\n resize: none;\n overflow: hidden;\n }\n }\n\n &-icon {\n appearance: none;\n -webkit-appearance: none;\n box-sizing: border-box;\n cursor: pointer;\n background-color: transparent;\n border: none;\n position: absolute;\n outline: none;\n right: 10px;\n top: 8px;\n color: var(--input-icon-color);\n width: 19px !important;\n height: 19px !important;\n user-select: none;\n top: 50%;\n transform: translateY(-50%);\n\n &-left {\n left: 10px;\n }\n\n &-notClickable {\n pointer-events: none;\n }\n }\n }\n\n &-error {\n height: 1em;\n padding-top: 3px;\n color: var(--error-font-color);\n font-size: 11px;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 0.5;\n }\n }\n}\n","import React from 'react';\nimport FormValidator from 'services/formValidation/formValidator';\nimport type { SlotClassNames, SlotStyles } from '../types/slots.types';\n\nexport enum InputType {\n Edit = 'edit',\n Phone = 'phone',\n Email = 'email',\n Iban = 'iban',\n Date = 'date',\n HasNoIcon = 'hasNoIcon',\n Search = 'searchInput',\n Password = 'password',\n}\n\nexport type InputSlots = 'label' | 'container' | 'input' | 'suffix' | 'upperRightLabel' | 'fieldset';\n\nexport interface InputProps {\n onMouseEnter?: ((event: React.MouseEvent) => void) | null;\n onMouseLeave?: ((event: React.MouseEvent) => void) | null;\n onFocus?: ((event: React.FocusEvent) => void) | null;\n onBlur?: ((event: React.FocusEvent) => void) | null;\n onChange?: ((value: string, event?: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement, Element>) => void) | null;\n errorMessage?: string;\n isValid?: boolean;\n isRequired?: boolean;\n label?: string;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n value?: string | number;\n icon?: React.ReactElement | null;\n isUppercase?: boolean;\n isRow?: boolean;\n tabIndex?: number;\n type?: InputType;\n onIconClick?: (() => void) | null;\n parse?: ((value: string) => string) | null;\n suffix?: string | React.ReactNode;\n upperRightLabel?: string | React.ReactNode;\n labelInBorder?: boolean;\n showCancel?: boolean;\n onClearClicked?: (() => void) | null;\n min?: string | number | null;\n max?: string | number | null;\n placeholder?: string;\n useMatLabelStyle?: boolean;\n autoComplete?: string | null;\n onClick?: (() => void) | null;\n readOnly?: boolean;\n customInput?: React.ReactElement | null;\n autoFocus?: boolean;\n alwaysShowCancel?: boolean;\n formValidator?: FormValidator | null;\n multiline?: boolean;\n rows?: number;\n autoResize?: boolean;\n classNames?: SlotClassNames<InputSlots>;\n styles?: SlotStyles<InputSlots>;\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faPhone,\n faPen,\n faEnvelope,\n faSearch,\n faXmark,\n faEye as passwordHiddenIcon,\n faEyeSlash as passwordShownIcon,\n} from '@fortawesome/free-solid-svg-icons';\nimport Tooltip from 'components/common/tooltip';\nimport styles from './input.module.pcss';\nimport type { InputProps } from './input.types';\nimport { InputType } from './input.types';\n\nfunction Input({\n name = '',\n label = '',\n errorMessage = '',\n isValid = true,\n className = '',\n style,\n value = '',\n icon = null,\n onChange = () => {},\n onFocus: onFocusProp = null,\n onBlur: onBlurProp = null,\n onMouseEnter: onMouseEnterProp = null,\n onMouseLeave: onMouseLeaveProp = null,\n isUppercase = false,\n isRequired = false,\n tabIndex = 0,\n type = undefined,\n isRow = false,\n onIconClick = null,\n parse = null,\n formValidator = null,\n autoFocus = false,\n suffix = null,\n upperRightLabel = null,\n labelInBorder = false,\n showCancel = false,\n onClearClicked,\n min = null,\n max = null,\n placeholder = '',\n useMatLabelStyle = true,\n autoComplete = null,\n onClick = () => null,\n readOnly = false,\n customInput,\n alwaysShowCancel = false,\n multiline = false,\n rows,\n autoResize = false,\n classNames,\n styles: slotStyles,\n}: InputProps) {\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isPasswordShown, setIsPasswordShown] = useState(false);\n const [, forceUpdate] = useState(0);\n\n const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n const fvRef = useRef(formValidator);\n\n const resizeTextarea = useCallback(() => {\n const el = inputRef.current;\n if (!el || !autoResize) return;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }, [autoResize]);\n\n useEffect(() => {\n setTimeout(() => {\n setIsFocused(false);\n setIsHovered(false);\n }, 1);\n resizeTextarea();\n }, []);\n\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n setTimeout(() => { inputRef.current?.focus(); }, 1);\n }\n }, [autoFocus]);\n\n useEffect(() => {\n fvRef.current = formValidator;\n const fv = fvRef.current;\n if (!fv) return;\n fv.label = label ?? '';\n fv.validate();\n const listener = () => forceUpdate(n => n + 1);\n fv.registerOnUpdateListener(listener);\n return () => { fv.removeOnUpdateListener(listener); };\n }, [formValidator, label]);\n\n const hasError = (): boolean => {\n return formValidator\n ? (formValidator.touched && formValidator.hasError())\n : (!isValid || !!errorMessage);\n };\n\n const computedIsRequired = (): boolean => {\n return !!(isRequired || (formValidator && formValidator.validators.find(\n (v) => (v as { validatorId?: string }).validatorId === 'required'\n )));\n };\n\n const onMouseEnterHandler = (event: React.MouseEvent) => {\n setIsHovered(true);\n if (onMouseEnterProp) onMouseEnterProp(event);\n };\n\n const onMouseLeaveHandler = (event: React.MouseEvent) => {\n setIsHovered(false);\n if (onMouseLeaveProp) onMouseLeaveProp(event);\n };\n\n const onFocusHandler = (event: React.FocusEvent) => {\n setIsFocused(true);\n if (onFocusProp) onFocusProp(event);\n };\n\n const onBlurHandler = (event: React.FocusEvent) => {\n if (fvRef.current) fvRef.current.touched = true;\n setIsFocused(false);\n if (onBlurProp) onBlurProp(event);\n };\n\n const onChangeHandler = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | string): void => {\n let parsedEvent: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | undefined;\n let val: string;\n\n if (typeof event !== 'string') {\n parsedEvent = event;\n val = event.target.value;\n } else {\n val = event;\n }\n\n if (parse) val = parse(val);\n if (formValidator) formValidator.set(val);\n if (onChange) onChange(val, parsedEvent);\n resizeTextarea();\n };\n\n const getInputType = (): string | undefined => {\n if (type === 'email') return undefined;\n if (type === 'password' && isPasswordShown) return 'text';\n return type;\n };\n\n const hasIcon =\n type &&\n type !== InputType.Date &&\n type !== InputType.Iban &&\n type !== InputType.HasNoIcon;\n\n const hasIconLeft =\n hasIcon && !useMatLabelStyle &&\n (type === InputType.Email || type === InputType.Phone || type === InputType.Search);\n\n const iconProps = {\n className: cx(styles.inputFieldIcon, {\n [styles.inputFieldIconNotClickable]: !onIconClick,\n [styles.inputFieldIconLeft]: hasIconLeft,\n }),\n onClick: onIconClick ?? undefined,\n };\n\n const passwordIconProps = {\n className: cx(styles.inputFieldIcon, styles.inputFieldIconPassword),\n onClick: () => setIsPasswordShown(!isPasswordShown),\n };\n\n const hasErr = hasError();\n\n let editedLabel = label;\n if (editedLabel && computedIsRequired()) editedLabel = `${editedLabel} *`;\n\n const currVal = formValidator ? formValidator.value : value;\n const shouldFloatLabel = useMatLabelStyle && (isFocused || currVal || type === InputType.Date);\n\n return (\n <div className={cx(styles.input, className)} style={style}>\n <label\n htmlFor={name}\n className={cx(styles.inputLabel, classNames?.label, {\n [styles.inputLabelColumn]: !isRow,\n [styles.inputLabelInBorder]: labelInBorder,\n })}\n style={slotStyles?.label}\n >\n {editedLabel && !useMatLabelStyle ? (\n <span className={styles.inputLabelText}>\n {`${editedLabel} `}\n {computedIsRequired() ? <span className={cx(styles.isRequired)}> *</span> : null}\n </span>\n ) : null}\n {upperRightLabel && (\n <div className={cx(styles.inputUpperRightLabel, classNames?.upperRightLabel)} style={slotStyles?.upperRightLabel}>\n {upperRightLabel}\n </div>\n )}\n <div\n className={cx(styles.inputContainer, { [styles.inputContainerMultiline]: multiline }, classNames?.container)}\n style={slotStyles?.container}\n onMouseEnter={onMouseEnterHandler}\n onMouseLeave={onMouseLeaveHandler}\n >\n {icon}\n {React.cloneElement(customInput || (multiline ? <textarea /> : <input />), {\n className: cx(\n styles.inputField,\n {\n [styles.inputFieldUppercase]: isUppercase,\n [styles.inputFieldDate]: type === InputType.Date,\n [styles.inputFieldDefault]: type !== InputType.Date,\n [styles.inputFieldWithIcon]: hasIcon,\n [styles.inputFieldWithIconLeft]: hasIconLeft,\n [styles.inputFieldMultiline]: multiline,\n [styles.inputFieldMultilineAutoResize]: multiline && autoResize,\n },\n classNames?.input\n ),\n name,\n id: name,\n value: formValidator ? formValidator.value : value,\n tabIndex,\n ref: customInput ? undefined : inputRef,\n onChange: onChangeHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler,\n placeholder: !useMatLabelStyle ? placeholder : '',\n autoComplete,\n onClick,\n readOnly,\n ...(!multiline && { type: getInputType(), min, max }),\n ...(multiline && rows !== undefined && { rows }),\n })}\n {suffix && <div className={cx(styles.inputFieldSuffix, classNames?.suffix)} style={slotStyles?.suffix}>{suffix}</div>}\n </div>\n <fieldset\n className={cx(styles.inputFieldset, classNames?.fieldset, {\n [styles.inputContainerBorderFocused]: isFocused,\n [styles.inputContainerBorderSearchFocused]:\n type === InputType.Search && (isFocused || value),\n [styles.inputContainerBorderInvalid]: hasErr,\n [styles.inputContainerBorderError]: hasErr,\n })}\n style={slotStyles?.fieldset}\n >\n <legend\n className={cx(styles.inputFieldsetLegend, {\n [styles.inputFieldsetLegendActive]: shouldFloatLabel,\n })}\n >\n <span>{editedLabel}</span>\n </legend>\n </fieldset>\n {useMatLabelStyle && label && (\n <div\n className={cx(styles.inputMatLabel, {\n [styles.inputMatLabelFloating]: shouldFloatLabel,\n [styles.inputMatLabelMultiline]: multiline && !shouldFloatLabel,\n })}\n >\n {editedLabel}\n </div>\n )}\n {useMatLabelStyle && placeholder && (\n <div\n className={cx(\n styles.inputPlaceholder,\n isFocused && !currVal && styles.inputPlaceholderShown,\n multiline && styles.inputPlaceholderMultiline,\n )}\n >\n {placeholder}\n </div>\n )}\n <Tooltip\n variant=\"error\"\n message={formValidator ? formValidator.getCurrentErrorMessage() : (errorMessage || '')}\n isVisible={hasErr && (isFocused || isHovered)}\n />\n </label>\n\n {type === InputType.Phone && <FontAwesomeIcon icon={faPhone} {...iconProps} />}\n {type === InputType.Email && <FontAwesomeIcon icon={faEnvelope} {...iconProps} />}\n {type === InputType.Edit && <FontAwesomeIcon icon={faPen} {...iconProps} />}\n {type === InputType.Search && <FontAwesomeIcon icon={faSearch} {...iconProps} />}\n {type === InputType.Password && (\n <FontAwesomeIcon\n icon={isPasswordShown ? passwordShownIcon : passwordHiddenIcon}\n {...passwordIconProps}\n />\n )}\n\n {((showCancel && value && (isFocused || isHovered)) || alwaysShowCancel) && (\n <FontAwesomeIcon\n icon={faXmark}\n className={styles.inputFieldIcon}\n onClick={onClearClicked ?? undefined}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n />\n )}\n </div>\n );\n}\n\nexport default Input;\n",".colorPicker {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.swatch {\n width: 32px;\n height: 32px;\n border-radius: var(--default-border-radius);\n position: relative;\n cursor: pointer;\n flex-shrink: 0;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15);\n /* checkerboard so transparency is visible */\n background-image:\n linear-gradient(45deg, #bbb 25%, transparent 25%),\n linear-gradient(-45deg, #bbb 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #bbb 75%),\n linear-gradient(-45deg, transparent 75%, #bbb 75%);\n background-size: 8px 8px;\n background-position: 0 0, 0 4px, 4px -4px, -4px 0;\n background-color: white;\n\n &:hover {\n & .swatchHex {\n opacity: 1;\n }\n }\n}\n\n.swatchFill {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n}\n\n.swatchHex {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 8px;\n font-family: monospace;\n background: rgba(0, 0, 0, 0.55);\n color: white;\n border-radius: inherit;\n opacity: 0;\n transition: opacity 0.15s;\n user-select: none;\n pointer-events: none;\n z-index: 1;\n}\n\n.panel {\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: 224px;\n}\n\n.gradientArea {\n width: 200px;\n height: 160px;\n position: relative;\n cursor: crosshair;\n border-radius: 4px;\n overflow: hidden;\n background: linear-gradient(to right, white, hsl(calc(var(--hue) * 1deg), 100%, 50%));\n}\n\n.gradientOverlay {\n position: absolute;\n inset: 0;\n background: linear-gradient(to bottom, transparent, black);\n}\n\n.cursor {\n position: absolute;\n width: 12px;\n height: 12px;\n border-radius: 50%;\n border: 2px solid white;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.5);\n transform: translate(-50%, -50%);\n pointer-events: none;\n z-index: 1;\n}\n\n.hueSlider {\n -webkit-appearance: none;\n appearance: none;\n width: 100%;\n height: 10px;\n border-radius: var(--default-border-radius);\n outline: none;\n cursor: pointer;\n background: linear-gradient(\n to right,\n hsl(0, 100%, 50%),\n hsl(60, 100%, 50%),\n hsl(120, 100%, 50%),\n hsl(180, 100%, 50%),\n hsl(240, 100%, 50%),\n hsl(300, 100%, 50%),\n hsl(360, 100%, 50%)\n );\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 6px;\n height: 20px;\n border-radius: var(--default-border-radius);\n background: var(--primary-color);\n box-shadow: var(--card-shadow);\n cursor: pointer;\n }\n\n &::-moz-range-thumb {\n width: 6px;\n height: 20px;\n border-radius: var(--default-border-radius);\n background: var(--primary-color);\n box-shadow: var(--card-shadow);\n cursor: pointer;\n }\n}\n\n.alphaSlider {\n -webkit-appearance: none;\n appearance: none;\n width: 100%;\n height: 10px;\n border-radius: var(--default-border-radius);\n outline: none;\n cursor: pointer;\n /* checkerboard base so transparency is visible under the gradient */\n background-image:\n linear-gradient(to right, transparent, var(--alpha-color)),\n linear-gradient(45deg, #bbb 25%, transparent 25%),\n linear-gradient(-45deg, #bbb 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #bbb 75%),\n linear-gradient(-45deg, transparent 75%, #bbb 75%);\n background-size: 100% 100%, 8px 8px, 8px 8px, 8px 8px, 8px 8px;\n background-position: 0 0, 0 0, 0 4px, 4px -4px, -4px 0;\n background-color: white;\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 6px;\n height: 20px;\n border-radius: var(--default-border-radius);\n background: var(--primary-color);\n box-shadow: var(--card-shadow);\n cursor: pointer;\n }\n\n &::-moz-range-thumb {\n width: 6px;\n height: 20px;\n border-radius: var(--default-border-radius);\n background: var(--primary-color);\n box-shadow: var(--card-shadow);\n cursor: pointer;\n }\n}\n\n.hexInput {\n width: 100%;\n padding: 5px 8px;\n border-radius: var(--default-border-radius);\n border: 1px solid var(--border-color);\n background: var(--input-background);\n color: var(--text-color);\n font-size: 13px;\n font-family: monospace;\n box-sizing: border-box;\n outline: none;\n\n &:focus {\n border-color: var(--primary-color);\n }\n}\n","import { useState, useRef, useEffect, type ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport InteractableDiv from 'components/common/interactableDiv';\nimport FloatingMenu from 'components/common/floatingMenu';\nimport Input from 'components/common/input';\nimport { Align } from 'components/common/floatingMenu/floatingMenu.types';\nimport type { ColorPickerProps } from './colorPicker.types';\n\nimport styles from './colorPicker.module.pcss';\n\n// ── Color utilities ──────────────────────────────────────────────────────────\n\nfunction isValidHex(s: string): boolean {\n return /^#[0-9a-fA-F]{6}$/.test(s) || /^#[0-9a-fA-F]{8}$/.test(s);\n}\n\n/** Split any valid hex into its 6-digit base and 0-100 alpha. */\nfunction parseHex(hex: string): { hex6: string; alpha: number } {\n if (/^#[0-9a-fA-F]{8}$/.test(hex)) {\n return {\n hex6: hex.slice(0, 7),\n alpha: Math.round((parseInt(hex.slice(7, 9), 16) / 255) * 100),\n };\n }\n return { hex6: hex.slice(0, 7), alpha: 100 };\n}\n\n/** Combine a 6-digit hex + 0-100 alpha into the right output format.\n * Full opacity (alpha === 100) is omitted — 6-digit hex implies opaque. */\nfunction buildValue(hex6: string, alpha: number, showAlpha: boolean): string {\n if (!showAlpha || alpha >= 100) return hex6;\n const a = Math.round((alpha / 100) * 255).toString(16).padStart(2, '0');\n return `${hex6}${a}`;\n}\n\nfunction hexToRgba(hex6: string, alpha: number): string {\n const r = parseInt(hex6.slice(1, 3), 16);\n const g = parseInt(hex6.slice(3, 5), 16);\n const b = parseInt(hex6.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha / 100})`;\n}\n\nfunction hexToHsv(hex6: string): { h: number; s: number; v: number } {\n const r = parseInt(hex6.slice(1, 3), 16) / 255;\n const g = parseInt(hex6.slice(3, 5), 16) / 255;\n const b = parseInt(hex6.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n if (delta !== 0) {\n if (max === r) h = ((g - b) / delta) % 6;\n else if (max === g) h = (b - r) / delta + 2;\n else h = (r - g) / delta + 4;\n h = Math.round(h * 60);\n if (h < 0) h += 360;\n }\n\n const s = max === 0 ? 0 : Math.round((delta / max) * 100);\n const v = Math.round(max * 100);\n\n return { h, s, v };\n}\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const sv = s / 100;\n const vv = v / 100;\n const c = vv * sv;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = vv - c;\n\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; b = 0; }\n else if (h < 120) { r = x; g = c; b = 0; }\n else if (h < 180) { r = 0; g = c; b = x; }\n else if (h < 240) { r = 0; g = x; b = c; }\n else if (h < 300) { r = x; g = 0; b = c; }\n else { r = c; g = 0; b = x; }\n\n const toHex = (n: number) => Math.round((n + m) * 255).toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n// ── HexInput ─────────────────────────────────────────────────────────────────\n\ninterface HexInputProps {\n hex: string;\n onChange: (hex: string) => void;\n useInputComponent?: boolean;\n}\n\nfunction HexInput({ hex, onChange, useInputComponent = false }: HexInputProps): ReactElement {\n const [draft, setDraft] = useState(hex);\n\n useEffect(() => {\n setDraft(hex);\n }, [hex]);\n\n function handleChange(raw: string) {\n setDraft(raw);\n const normalized = raw.startsWith('#') ? raw : `#${raw}`;\n if (isValidHex(normalized)) onChange(normalized);\n }\n\n function handleBlur() {\n const normalized = draft.startsWith('#') ? draft : `#${draft}`;\n if (!isValidHex(normalized)) setDraft(hex);\n }\n\n if (useInputComponent) {\n return (\n <Input\n value={draft}\n onChange={(value: string) => handleChange(value)}\n onBlur={handleBlur}\n />\n );\n }\n\n return (\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={handleBlur}\n className={styles.hexInput}\n spellCheck={false}\n />\n );\n}\n\n// ── Picker panel ─────────────────────────────────────────────────────────────\n\ninterface PickerPanelProps {\n hue: number;\n sat: number;\n val: number;\n alpha: number;\n onHueChange: (h: number) => void;\n onSVChange: (s: number, v: number) => void;\n onAlphaChange: (a: number) => void;\n showInput?: boolean;\n showAlpha?: boolean;\n}\n\nfunction PickerPanel({\n hue, sat, val, alpha,\n onHueChange, onSVChange, onAlphaChange,\n showInput = true, showAlpha = false,\n}: PickerPanelProps): ReactElement {\n const gradientRef = useRef<HTMLDivElement>(null);\n\n function getSVFromEvent(e: MouseEvent): { s: number; v: number } {\n const rect = gradientRef.current!.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const y = Math.max(0, Math.min(1, (e.clientY - rect.top) / rect.height));\n return { s: x * 100, v: (1 - y) * 100 };\n }\n\n function onGradientMouseDown(e: React.MouseEvent) {\n const { s, v } = getSVFromEvent(e.nativeEvent);\n onSVChange(s, v);\n\n const onMove = (ev: MouseEvent) => {\n const { s, v } = getSVFromEvent(ev);\n onSVChange(s, v);\n };\n const onUp = () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n }\n\n function onHexChange(normalized: string) {\n const { hex6, alpha: parsedAlpha } = parseHex(normalized);\n const { h, s, v } = hexToHsv(hex6);\n onHueChange(h);\n onSVChange(s, v);\n if (showAlpha) onAlphaChange(parsedAlpha);\n }\n\n const hex6 = hsvToHex(hue, sat, val);\n const hexInputValue = showAlpha ? buildValue(hex6, alpha, true) : hex6;\n\n return (\n <div className={styles.panel}>\n <div\n ref={gradientRef}\n className={styles.gradientArea}\n style={{ '--hue': hue } as React.CSSProperties}\n onMouseDown={onGradientMouseDown}\n >\n <div className={styles.gradientOverlay} />\n <div\n className={styles.cursor}\n style={{ left: `${sat}%`, top: `${100 - val}%` }}\n />\n </div>\n\n <input\n type=\"range\"\n min={0}\n max={359}\n value={hue}\n onChange={(e) => onHueChange(Number(e.target.value))}\n className={styles.hueSlider}\n />\n\n {showAlpha && (\n <input\n type=\"range\"\n min={0}\n max={100}\n value={alpha}\n onChange={(e) => onAlphaChange(Number(e.target.value))}\n className={styles.alphaSlider}\n style={{ '--alpha-color': hex6 } as React.CSSProperties}\n />\n )}\n\n {showInput && <HexInput hex={hexInputValue} onChange={onHexChange} />}\n </div>\n );\n}\n\n// ── ColorPicker ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_COLOR = '#3b82f6';\n\nfunction ColorPicker({\n className,\n value = DEFAULT_COLOR,\n onChange,\n showInput = false,\n showAlpha = false,\n inline = false,\n ...rest\n}: ColorPickerProps): ReactElement {\n const [isOpen, setIsOpen] = useState(false);\n\n const initSafe = isValidHex(value) ? value : DEFAULT_COLOR;\n const { hex6: initHex6, alpha: initAlpha } = parseHex(initSafe);\n const initHsv = hexToHsv(initHex6);\n\n // Single state object so hue survives when saturation/value hit 0\n // (hexToHsv of any grey returns h=0, which would corrupt hue if derived from props).\n const [hsva, setHsva] = useState({ h: initHsv.h, s: initHsv.s, v: initHsv.v, a: initAlpha });\n\n // Ref mirrors state so drag callbacks never read stale closure values.\n const cur = useRef(hsva);\n\n // Sync from external prop changes: \"derive state during render\" pattern\n // avoids setState-in-effect. We compare the incoming hex against what our\n // current state produces — if they match, the change came from us and we skip.\n const [prevValue, setPrevValue] = useState(value);\n if (value !== prevValue) {\n setPrevValue(value);\n const safe = isValidHex(value) ? value : DEFAULT_COLOR;\n const { hex6: incomingHex6, alpha: incomingA } = parseHex(safe);\n const currentHex6 = hsvToHex(hsva.h, hsva.s, hsva.v);\n if (incomingHex6 !== currentHex6 || incomingA !== hsva.a) {\n const hsv = hexToHsv(incomingHex6);\n const next = { h: hsv.h, s: hsv.s, v: hsv.v, a: incomingA };\n setHsva(next);\n }\n }\n\n const { h: hue, s: sat, v: val, a: alpha } = hsva;\n\n function emit(h: number, s: number, v: number, a: number) {\n onChange?.(buildValue(hsvToHex(h, s, v), a, showAlpha));\n }\n\n function handleHueChange(h: number) {\n cur.current.h = h;\n setHsva(prev => ({ ...prev, h }));\n emit(h, cur.current.s, cur.current.v, cur.current.a);\n }\n\n function handleSVChange(s: number, v: number) {\n cur.current.s = s;\n cur.current.v = v;\n setHsva(prev => ({ ...prev, s, v }));\n emit(cur.current.h, s, v, cur.current.a);\n }\n\n function handleAlphaChange(a: number) {\n cur.current.a = a;\n setHsva(prev => ({ ...prev, a }));\n emit(cur.current.h, cur.current.s, cur.current.v, a);\n }\n\n const hex6 = hsvToHex(hue, sat, val);\n const swatchBackground = showAlpha ? hexToRgba(hex6, alpha) : hex6;\n const displayValue = buildValue(hex6, alpha, showAlpha);\n\n const pickerPanelProps: PickerPanelProps = {\n hue, sat, val, alpha,\n onHueChange: handleHueChange,\n onSVChange: handleSVChange,\n onAlphaChange: handleAlphaChange,\n showAlpha,\n };\n\n if (inline) {\n return (\n <div {...rest} className={cx(styles.colorPicker, className)}>\n <PickerPanel {...pickerPanelProps} showInput={showInput} />\n </div>\n );\n }\n\n return (\n <div {...rest} className={cx(styles.colorPicker, className)}>\n <FloatingMenu\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n dontCloseOnChildClick\n align={Align.Left}\n content={<PickerPanel {...pickerPanelProps} />}\n >\n <InteractableDiv className={styles.swatch}>\n <div className={styles.swatchFill} style={{ background: swatchBackground }} />\n <span className={styles.swatchHex}>{displayValue}</span>\n </InteractableDiv>\n </FloatingMenu>\n\n {showInput && (\n <HexInput\n hex={displayValue}\n onChange={(v) => onChange?.(v)}\n useInputComponent\n />\n )}\n </div>\n );\n}\n\nexport default ColorPicker;\n","\n.modal {\n padding: 16px;\n border-radius: var(--default-border-radius);\n background: var(--background-modal);\n color: var(--text-color);\n font-family: var(--default-font);\n box-sizing: border-box;\n position: relative;\n transform-origin: bottom center;\n animation:\n slideIn 0.2s,\n fadeIn 0.3s forwards;\n max-width: 95%;\n max-height: 95%;\n overflow: auto;\n\n @media not (--breakpoint-desktop) {\n max-width: 100%;\n max-height: 100%;\n }\n\n &-container {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n top: 0;\n left: 0;\n\n @media (--breakpoint-tablet) {\n z-index: 1;\n }\n }\n\n &-header {\n display: flex;\n gap: 8px;\n justify-content: space-between;\n margin-bottom: 16px;\n\n div {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n svg {\n cursor: pointer;\n }\n }\n\n &-wrapper {\n position: fixed;\n width: 100%;\n height: 100%;\n background: #00000052;\n top: 0;\n left: 0;\n transition: all 0.3s ease-in-out;\n opacity: 0;\n\n &-shown {\n opacity: 1;\n }\n }\n}\n\n@keyframes slideIn {\n from {\n transform: scale(0);\n }\n to {\n transform: scale(0.99);\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n","import React from 'react';\nimport cx from 'classnames';\nimport BodyEnd from 'components/common/bodyEnd';\n\nimport styles from './modal.module.pcss';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faXmark as closeIcon } from '@fortawesome/free-solid-svg-icons';\nimport { ModalProps } from './modal.types';\nimport { useEffect, useState } from 'react';\n\nfunction Modal({\n children = null,\n title = '',\n isOpen = false,\n onClose = () => null,\n className = '',\n style,\n hideHeader = false,\n classNames,\n styles: slotStyles,\n}: ModalProps) {\n const [isRendered, setIsRendered] = useState(isOpen);\n const [animateIn, setAnimateIn] = useState(isOpen);\n\n useEffect(() => {\n if (isOpen) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsRendered(isOpen);\n setTimeout(() => setAnimateIn(true), 1);\n } else {\n setAnimateIn(false);\n setTimeout(() => setIsRendered(isOpen), 300);\n }\n }, [isOpen]);\n\n if (!isRendered) return null;\n\n return (\n <BodyEnd>\n <div className={cx(styles.modalContainer, classNames?.container)} style={slotStyles?.container}>\n <div\n className={cx(styles.modalWrapper, animateIn && styles.modalWrapperShown, classNames?.backdrop)}\n style={slotStyles?.backdrop}\n onClick={onClose}\n />\n {animateIn && (\n <div\n className={cx(styles.modal, animateIn && styles.modalShown, className, classNames?.modal)}\n style={{ ...style, ...slotStyles?.modal }}\n onClick={(e) => e.stopPropagation()}\n >\n {!hideHeader && (\n <div className={cx(styles.modalHeader, classNames?.header)} style={slotStyles?.header}>\n <div className={classNames?.title} style={slotStyles?.title}>{title}</div>\n <FontAwesomeIcon onClick={onClose} icon={closeIcon} className={classNames?.closeButton} style={slotStyles?.closeButton as React.CSSProperties & Record<`--fa-font-${string}`, string>} />\n </div>\n )}\n {children}\n </div>\n )}\n </div>\n </BodyEnd>\n );\n}\n\nexport default Modal;\n","import { useState, type ReactElement } from 'react';\n\nimport Modal from '../modal';\nimport { ActionButtons } from '../actionButtons';\nimport type { ConfirmModalProps } from './confirmModal.types';\n\nfunction ConfirmModal({\n children = null,\n className = '',\n onClose = () => {},\n onConfirm = () => {},\n title = '',\n content = null,\n isOpen: propIsOpen = undefined,\n}: ConfirmModalProps): ReactElement {\n const [internalOpen, setInternalOpen] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n function handleClose(didSubmit = false) {\n setInternalOpen(false);\n onClose(didSubmit);\n }\n\n async function handleConfirm() {\n setIsSubmitting(true);\n try {\n await onConfirm();\n handleClose(true);\n } finally {\n setIsSubmitting(false);\n }\n }\n\n const isOpen = propIsOpen === undefined ? internalOpen : propIsOpen;\n\n return (\n <div className={className}>\n <span onClick={() => setInternalOpen(true)}>{children}</span>\n <Modal title={title} isOpen={isOpen} onClose={() => handleClose()}>\n {content}\n <ActionButtons\n onClose={() => handleClose()}\n onSubmit={handleConfirm}\n submitLabel=\"Confirm\"\n isSubmitButtonLoading={isSubmitting}\n />\n </Modal>\n </div>\n );\n}\n\nexport default ConfirmModal;\n","\n.datePickerMonth {\n &-item {\n aspect-ratio: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 1px 0;\n }\n\n &-content {\n display: grid;\n text-align: center;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n gap: 0px;\n }\n\n &-day {\n cursor: pointer;\n\n &:hover {\n /* background-color: var(--primary-color);\n border-radius: 800px; */\n }\n\n &-today {\n background-color: var(--background-accent-light);\n border-radius: var(--default-border-radius);\n }\n\n &-selected {\n background-color: var(--primary-color);\n border-radius: 0;\n\n &-start {\n border-top-left-radius: var(--default-border-radius);\n border-bottom-left-radius: var(--default-border-radius);\n }\n\n &-end {\n border-top-right-radius: var(--default-border-radius);\n border-bottom-right-radius: var(--default-border-radius);\n }\n }\n\n &-disabled {\n filter: brightness(0.5);\n cursor: not-allowed;\n }\n }\n\n &-placeholder {\n user-select: none;\n pointer-events: none;\n }\n}\n","// import { Settings } from 'luxon';\n// import Polyglot from 'node-polyglot';\n\nconst supportedLocales: string[] = ['de_AT', 'de_CH', 'de_DE', 'en_US', 'en_GB', 'de', 'en'];\n\nconst defaultLocale = 'en_US';\n\nconst getCurrentLocale = (): string => {\n const locale = navigator.languages[0]?.replace('-', '_') || defaultLocale;\n\n if (!supportedLocales.includes(locale)) return defaultLocale;\n\n if (locale === 'en_GB' || locale === 'en') return 'en_US'; // Change GB to US. Alternatively, add GB File\n if (locale === 'de') return 'de_DE';\n\n return locale;\n};\n\nexport const mapLocale = (locale: string): string => {\n switch (locale) {\n case 'en_US':\n case 'en_GB':\n return 'en';\n case 'de_DE':\n case 'de_CH':\n case 'de_AT':\n return 'de';\n default:\n return 'de';\n }\n};\n\n// const getPolyglot = async (locale: string): Promise<Polyglot> => {\n// let phrases: object = {};\n// let extendPhrases: object = {};\n// const { default: impPhrasesLocale } = await import(`../locales/${locale || defaultLocale}.json`);\n// if ((locale || '').startsWith('de')) {\n// const { default: impPhrases } = await import('locales/de_DE.json');\n// phrases = impPhrases;\n// extendPhrases = impPhrasesLocale;\n// } else {\n// phrases = impPhrasesLocale;\n// }\n// const shortLocale: string = mapLocale(locale);\n// Settings.defaultLocale = shortLocale;\n\n// const polyglot: Polyglot = new Polyglot({\n// phrases: JSON.parse(JSON.stringify(phrases)),\n// locale: shortLocale,\n// });\n\n// polyglot.extend(JSON.parse(JSON.stringify(extendPhrases)));\n// return polyglot;\n// };\n\nlet currentLocale: string = getCurrentLocale();\n// let polyglot: Polyglot = await getPolyglot(currentLocale);\n\n// export default polyglot;\n\nexport async function setLocale(locale: string): Promise<void> {\n currentLocale = locale;\n // polyglot = await getPolyglot(locale);\n}\n\nexport function getLocale(delimiter = '_'): string {\n return currentLocale.replace('_', delimiter);\n}\n","import { getLocale } from 'services/localization';\n\nexport function getDaysInMonth(month: number, year: number): number {\n return new Date(year, month, 0).getDate();\n}\n\nexport function getDateFromDayMonthAndYear(day: number, month: number, year: number): Date {\n return new Date(Date.UTC(year, month - 1, day));\n}\n\nexport function getMonthName(locale: string, year: number, month: number, day: number, short = false): string {\n const currDate = new Date(Date.UTC(year, month - 1, day));\n return currDate.toLocaleDateString(locale, { month: short ? 'short' : 'long' });\n}\n\nexport function getMonthNames(locale = getLocale('-')): string[] {\n return Array.from(Array(12).keys()).map((index) => getMonthName(locale, 2023, index + 1, 1));\n}\n\nexport function getWeekDays(locale: string, short = true): string[] {\n const currDate = new Date(Date.UTC(2023, 3, 10)); // Random Monday - 10.4.2023\n const weekDays: string[] = [];\n for (let i = 0; i < 7; i++) {\n weekDays.push(currDate.toLocaleDateString(locale, { weekday: short ? 'short' : 'long' }));\n currDate.setDate(currDate.getDate() + 1);\n }\n return weekDays;\n}\n\nexport function getStartWeekDayOfMonth(month: number, year: number): number {\n const start = new Date(Date.UTC(year, month - 1, 1)).getDay();\n return start || 7;\n}\n\nexport function getDayMonthAndYearOfDate(date: Date): { day: number; month: number; year: number } {\n return {\n day: date.getDate(),\n month: date.getMonth() + 1,\n year: date.getFullYear(),\n };\n}\n\nexport function getDateString(date: Date): string {\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n\n return `${day < 10 ? `0${day}` : day}.${month < 10 ? `0${month}` : month}.${year}`;\n}\n\nexport interface DateMaskSelection {\n start: number;\n end: number;\n}\n\nexport interface DateMaskState {\n value: string;\n selection: DateMaskSelection | null;\n}\n\n/**\n * Auto-corrects a partially typed `dd.mm.yyyy` mask value so a single out-of-range\n * digit doesn't force the user to backtrack:\n * - a day \"tens\" digit > 3 (e.g. typing `4`) becomes `04` and the caret jumps to the month\n * - a day of `3x` where x > 1 (e.g. `35`) becomes `0x`\n * - a month \"tens\" digit > 1 (e.g. `2`) becomes `02` and the caret jumps to the year\n * - a month `1x` where x > 2 (e.g. `13`) is clamped to `12`\n *\n * `previousValue` supplies the digits to retain for the part of the field that isn't\n * being rewritten. The returned `selection` is the adjusted caret position, or the\n * passed-in `selection` when no correction applies.\n */\nexport function correctDateMaskValue(\n nextValue: string,\n previousValue: string,\n selection: DateMaskSelection | null,\n): DateMaskState {\n let value = nextValue;\n let nextSelection = selection;\n\n if (value[0] !== '_') {\n if (value[0] > '3') {\n value = `0${value[0]}${previousValue.substring(2)}`;\n nextSelection = { start: 3, end: 3 };\n } else if (value[0] === '3') {\n if (value[1] !== '_' && value[1] > '1') {\n value = `0${value[1]}${previousValue.substring(2)}`;\n nextSelection = { start: 3, end: 3 };\n }\n }\n }\n if (value[3] !== '_' && value[3] > '1') {\n value = `${value.substring(0, 3)}0${value[3]}${previousValue.substring(5)}`;\n nextSelection = { start: 6, end: 6 };\n }\n if (value[3] === '1' && value[4] !== '_' && value[4] > '2') {\n value = `${value.substring(0, 3)}${value[3]}2${previousValue.substring(5)}`;\n }\n\n return { value, selection: nextSelection };\n}\n","import cx from 'classnames';\n\nimport styles from './datePickerMonth.module.pcss';\nimport { getLocale } from 'services/localization';\nimport InteractableDiv from 'components/common/interactableDiv';\nimport {\n getDateFromDayMonthAndYear,\n getDayMonthAndYearOfDate,\n getDaysInMonth,\n getStartWeekDayOfMonth,\n getWeekDays,\n} from '../../dateFunctions';\n\ninterface DatePickerMonthProps {\n className?: string;\n month?: number;\n year?: number;\n onSelect?: (date: Date) => void;\n selectionStart?: Date;\n selectionEnd?: Date;\n minDate?: Date | null;\n maxDate?: Date | null;\n}\n\nfunction checkSelected(\n day: number,\n month: number,\n year: number,\n selectionStart: Date | undefined,\n selectionEnd: Date | undefined,\n) {\n const { day: startDay, month: startMonth, year: startYear } = selectionStart\n ? getDayMonthAndYearOfDate(selectionStart)\n : { day: undefined, month: undefined, year: undefined };\n const { day: endDay, month: endMonth, year: endYear } = selectionEnd\n ? getDayMonthAndYearOfDate(selectionEnd)\n : { day: undefined, month: undefined, year: undefined };\n\n const toCheckNoTime = getDateFromDayMonthAndYear(day, month, year);\n\n const isStartDate = day === startDay && month === startMonth && year === startYear;\n const isEndDate = day === endDay && month === endMonth && year === endYear;\n\n let isInRange = false;\n if (startDay !== undefined && startMonth !== undefined && startYear !== undefined &&\n endDay !== undefined && endMonth !== undefined && endYear !== undefined) {\n const selectionStartNoTime = getDateFromDayMonthAndYear(startDay, startMonth, startYear);\n const selectionEndNoTime = getDateFromDayMonthAndYear(endDay, endMonth, endYear);\n isInRange =\n toCheckNoTime.getTime() >= selectionStartNoTime.getTime() &&\n toCheckNoTime.getTime() <= selectionEndNoTime.getTime();\n }\n\n return { isStartDate, isInRange, isEndDate };\n}\n\nfunction checkDisabled(\n day: number,\n month: number,\n year: number,\n minDate: Date | null | undefined,\n maxDate: Date | null | undefined,\n): boolean {\n const toCheckNoTime = getDateFromDayMonthAndYear(day, month, year);\n\n if (minDate) {\n const { day: minDay, month: minMonth, year: minYear } = getDayMonthAndYearOfDate(minDate);\n if (toCheckNoTime < getDateFromDayMonthAndYear(minDay, minMonth, minYear)) return true;\n }\n\n if (maxDate) {\n const { day: maxDay, month: maxMonth, year: maxYear } = getDayMonthAndYearOfDate(maxDate);\n if (toCheckNoTime > getDateFromDayMonthAndYear(maxDay, maxMonth, maxYear)) return true;\n }\n\n return false;\n}\n\nfunction checkIsToday(day: number, month: number, year: number): boolean {\n const { day: currDay, month: currMonth, year: currYear } = getDayMonthAndYearOfDate(new Date());\n return day === currDay && month === currMonth && year === currYear;\n}\n\nexport default function DatePickerMonth({\n className = '',\n month = new Date().getMonth() + 1,\n year = new Date().getFullYear(),\n onSelect = () => null,\n selectionStart,\n selectionEnd,\n minDate = null,\n maxDate = null,\n}: DatePickerMonthProps) {\n const locale = getLocale('-');\n const daysInMonth = getDaysInMonth(month, year);\n const startWeekDayOfMonth = getStartWeekDayOfMonth(month, year);\n\n return (\n <div className={cx(styles.datePickerMonth, className)}>\n <div className={cx(styles.datePickerMonthContent)}>\n {getWeekDays(locale).map((weekDay, index) => <div key={index}>{weekDay}</div>)}\n {Array.from(Array(startWeekDayOfMonth - 1).keys()).map((index) => (\n <div\n key={index}\n className={cx(styles.datePickerMonthItem, styles.datePickerMonthPlaceholder)}\n />\n ))}\n {Array.from(Array(daysInMonth).keys()).map((index) => {\n const day = index + 1;\n const selectedRes = checkSelected(day, month, year, selectionStart, selectionEnd);\n const isDisabled = checkDisabled(day, month, year, minDate, maxDate);\n const isToday = checkIsToday(day, month, year);\n\n return (\n <InteractableDiv\n key={day}\n onClick={() => isDisabled ? null : onSelect(getDateFromDayMonthAndYear(day, month, year))}\n className={cx(styles.datePickerMonthDay, styles.datePickerMonthItem, {\n [styles.datePickerMonthDaySelected]: selectedRes.isInRange,\n [styles.datePickerMonthDaySelectedStart]: selectedRes.isStartDate,\n [styles.datePickerMonthDaySelectedEnd]: selectedRes.isEndDate,\n [styles.datePickerMonthDayDisabled]: isDisabled,\n [styles.datePickerMonthDayToday]: isToday,\n })}\n >\n {day}\n </InteractableDiv>\n );\n })}\n {Array.from(Array(42 - (startWeekDayOfMonth + daysInMonth - 1)).keys()).map((index) => (\n <div\n key={index}\n className={cx(styles.datePickerMonthItem, styles.datePickerMonthPlaceholder)}\n >\n \n </div>\n ))}\n </div>\n </div>\n );\n}\n",".infiniteBlock {\n max-height: none;\n}\n\n.spinner-wrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 4px 0;\n}\n\n.spinner {\n width: 32px;\n height: 32px;\n}\n","import React, { useState, useRef, useCallback } from 'react';\nimport cx from 'classnames';\n\nimport styles from './infiniteBlock.module.pcss';\nimport SpinnerLoading from '../loading/spinnerLoading';\nimport type { InfiniteBlockProps } from './infiniteBlock.types';\n\n// Walk down a React element tree until we reach a string leaf or an array of children.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction childStartsWithKey(child: React.ReactElement<any>, key: string): boolean {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let node: React.ReactElement<any> = child;\n\n while (\n node.props.children !== null &&\n typeof node.props.children === 'object' &&\n !Array.isArray(node.props.children)\n ) {\n node = node.props.children as typeof node;\n }\n\n const content: unknown = node.props.children;\n\n if (Array.isArray(content)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const arr = content as any[];\n // If the first element has no children of its own, scan for a raw string\n if (!arr[0]?.props?.children) {\n for (const item of arr) {\n if (typeof item === 'string' && item.trim().length > 0) {\n return item.toLowerCase().startsWith(key);\n }\n }\n }\n return String(arr[0].props.children).toLowerCase().startsWith(key);\n }\n\n return String(content).toLowerCase().startsWith(key);\n}\n\nfunction clampIndex(index: number, change: number, length: number): number {\n const next = index + change;\n if (next === length) return 0;\n if (next < -1) return length - 1;\n return next;\n}\n\nfunction InfiniteBlock({\n children,\n onScroll,\n className = '',\n isDataLoading = false,\n setHighlightedIndex = () => null,\n}: InfiniteBlockProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Use a ref (not state) for the scroll-guard so reads are always synchronous,\n // avoiding the React-batching race where two scroll events fire before the\n // first setState call has been committed.\n const isScrollLoadingRef = useRef(false);\n const [showScrollSpinner, setShowScrollSpinner] = useState(false);\n\n // Keyboard nav state lives in refs — it doesn't affect rendering.\n const indexRef = useRef(-1);\n const lastKeyRef = useRef<string | null>(null);\n\n const handleScroll = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const { scrollTop, offsetHeight, scrollHeight } = el;\n\n // Browsers calculate scrollTop with a small floating-point error under zoom,\n // so we allow up to 5px of slack before deciding we are at the bottom.\n if (Math.abs(scrollTop + offsetHeight - scrollHeight) > 5) return;\n if (isScrollLoadingRef.current) return;\n\n isScrollLoadingRef.current = true;\n setShowScrollSpinner(true);\n onScroll().then(() => {\n isScrollLoadingRef.current = false;\n setShowScrollSpinner(false);\n });\n }, [onScroll]);\n\n const respondToUserInput = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const el = containerRef.current;\n if (!el) return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const childArray = React.Children.toArray(children) as React.ReactElement<any>[];\n let index = indexRef.current;\n\n switch (event.key) {\n case 'ArrowDown':\n index = clampIndex(index, 1, childArray.length);\n break;\n case 'ArrowUp':\n index = clampIndex(index, -1, childArray.length);\n break;\n default:\n for (let i = 0; i < childArray.length; i++) {\n if (childStartsWithKey(childArray[i], event.key)) {\n if (index >= i && lastKeyRef.current === event.key) {\n continue;\n }\n index = i;\n break;\n }\n }\n }\n\n indexRef.current = index;\n lastKeyRef.current = event.key;\n\n if (index >= 0) {\n const child = el.children[index] as HTMLElement | undefined;\n if (child) {\n const childTop = child.offsetTop;\n const childBottom = childTop + child.offsetHeight;\n if (childTop < el.scrollTop) {\n el.scrollTop = childTop;\n } else if (childBottom > el.scrollTop + el.clientHeight) {\n el.scrollTop = childBottom - el.clientHeight;\n }\n }\n setHighlightedIndex(index);\n }\n },\n [children, setHighlightedIndex]\n );\n\n return (\n <div\n className={cx(styles.infiniteBlock, className)}\n onScroll={handleScroll}\n onKeyDown={respondToUserInput}\n tabIndex={0}\n ref={containerRef}\n >\n {isDataLoading ? (\n <div className={styles.spinnerWrapper}>\n <SpinnerLoading className={styles.spinner} />\n </div>\n ) : children}\n {showScrollSpinner && (\n <div className={styles.spinnerWrapper}>\n <SpinnerLoading className={styles.spinner} />\n </div>\n )}\n </div>\n );\n}\n\nexport default InfiniteBlock;\n","\n.required-mark {\n padding: 0px 0px 0px 4px;\n color: var(--error-font-color);\n}\n\n.dropdown {\n position: relative;\n\n &-label {\n display: flex;\n\n &-column {\n flex-direction: column;\n }\n\n &-text {\n white-space: nowrap;\n margin-right: 5px;\n margin-bottom: 5px;\n display: flex;\n align-items: center;\n color: var(--text-color);\n font-size: 12px;\n position: absolute;\n top: -15px;\n }\n }\n\n &-input {\n position: relative;\n cursor: pointer;\n background-color: var(--input-background);\n border-radius: var(--default-border-radius);\n\n &-plain {\n background: transparent;\n }\n\n &:focus-within {\n outline: none;\n }\n\n &-button {\n padding: 7.5px 20% 7.5px 7.5px !important;\n background-color: transparent;\n border: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n text-align: left;\n width: 100%;\n line-height: 20px;\n color: var(--text-color);\n\n &-disabled {\n background-color: var(--disabled-input-color);\n color: var(--disabled-font-color);\n }\n\n &:focus {\n outline: none;\n }\n\n &-icon {\n float: right;\n background-color: transparent;\n border: none;\n position: absolute;\n outline: none;\n right: var(--spacing-s);\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-color);\n cursor: pointer;\n\n &-arrow {\n transition: transform 0.25s;\n pointer-events: none;\n\n &-open {\n transform: rotate(180deg);\n }\n }\n }\n }\n\n &-list {\n width: calc(100% - 1px);\n border: 1px solid var(--border-color);\n position: absolute;\n background-color: var(--background);\n border-radius: var(--default-border-radius);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transform: scaleY(1);\n transition: transform 0.25s;\n transform-origin: right top;\n z-index: 1;\n overflow-y: auto;\n max-height: 160px;\n list-style-type: none;\n left: -1px;\n\n &-on-top {\n bottom: 56px;\n }\n\n &-wider {\n width: max-content !important;\n }\n\n &-item {\n border: none;\n cursor: pointer;\n background-color: var(--background);\n padding: 6px;\n text-align: left;\n border-radius: 0;\n transition: all 0.3s;\n\n &-active {\n background-color: var(--background-accent);\n }\n\n &-selected {\n font-weight: 500;\n }\n\n &:focus {\n outline: none;\n }\n\n &:hover {\n background-color: var(--background-accent);\n }\n }\n\n &-hidden {\n transform: scaleY(0);\n }\n }\n }\n\n &-fieldset {\n position: absolute;\n width: 100%;\n margin: 0;\n box-sizing: border-box;\n border-radius: var(--default-border-radius);\n inset: -10px 0 0 0;\n padding-left: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: var(--border-color);\n pointer-events: none;\n user-select: none;\n\n &-legend {\n display: block;\n max-width: 0;\n transition: max-width 0.2s;\n white-space: nowrap;\n padding: 0;\n\n &-active {\n max-width: 300px;\n }\n\n span {\n font-size: 13px;\n padding: 5px;\n opacity: 0;\n }\n }\n }\n\n &-placeholder {\n position: absolute;\n top: 8px;\n left: 7px;\n transition: all 0.2s;\n opacity: 0;\n\n &-shown {\n animation: 0.2s fadeIn 0.3s forwards;\n }\n }\n\n &-matLabel {\n position: absolute;\n transition: all 0.3s;\n inset: 9px 0 0 7px;\n font-size: 16px;\n pointer-events: none;\n user-select: none;\n\n &-floating {\n inset: -9px 0 0 14px;\n font-size: 13px;\n }\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 0.5;\n }\n }\n\n &-border {\n outline: 1px solid var(--border-color);\n transition: border-color;\n background-color: var(--input-background);\n outline: none;\n\n &-focused {\n outline-color: var(--primary-color);\n border-color: var(--primary-color);\n }\n\n &-searchFocused {\n outline-color: var(--search-input-color);\n outline-width: 2px;\n border-color: var(--search-input-color);\n }\n\n &-plain {\n border-color: transparent;\n outline-color: transparent;\n }\n\n &-invalid {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n\n &-invalid:hover {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n\n &-error {\n outline-color: var(--error-border-color);\n border-color: var(--error-border-color);\n }\n }\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport cx from 'classnames';\nimport InfiniteBlock from 'components/common/infiniteBlock';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChevronDown as dropdownIcon } from '@fortawesome/free-solid-svg-icons';\nimport Downshift, { StateChangeOptions, DownshiftState } from 'downshift';\nimport Tooltip from 'components/common/tooltip';\n\nimport styles from './dropdown.module.pcss';\nimport type { DropdownProps, DropdownItem } from './dropdown.types';\n\nfunction Dropdown({\n errorMessage = '',\n className = '',\n label = '',\n value = '',\n isValid = true,\n tabIndex = 0,\n isRequired = false,\n customProps = {},\n isRow = false,\n disabled = false,\n onScroll = () => Promise.resolve(),\n isListOnTop = false,\n onClick,\n onChange,\n onFocus: onFocusProp = null,\n onBlur: onBlurProp = null,\n onMouseEnter: onMouseEnterProp = null,\n onMouseLeave: onMouseLeaveProp = null,\n dropdownLabel: dropdownLabelProp,\n isDropdownListWider = false,\n inputClassName = '',\n dropDownIconClassName = '',\n dropDownClassName = '',\n formValidator = null,\n labelClassName = '',\n dropDownInputClassName = '',\n items = [],\n useMatLabelStyle = true,\n placeholder = '',\n plainStyle = false,\n scrollToSelected = false,\n reactRef,\n}: DropdownProps) {\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [, forceUpdate] = useState(0);\n const fvRef = useRef(formValidator);\n\n useEffect(() => {\n fvRef.current = formValidator;\n if (!fvRef.current) return;\n fvRef.current.label = label ?? '';\n fvRef.current.validate();\n const listener = () => forceUpdate(n => n + 1);\n fvRef.current.registerOnUpdateListener(listener);\n return () => fvRef.current?.removeOnUpdateListener(listener);\n }, [formValidator, label]);\n\n const onMouseEnterHandler = (event: React.MouseEvent) => {\n setIsHovered(true);\n onMouseEnterProp?.(event);\n };\n\n const onMouseLeaveHandler = (event: React.MouseEvent) => {\n setIsHovered(false);\n onMouseLeaveProp?.(event);\n };\n\n const onFocusHandler = (event: React.FocusEvent) => {\n setIsFocused(true);\n onFocusProp?.(event);\n };\n\n const onBlurHandler = (event: React.FocusEvent) => {\n if (fvRef.current) fvRef.current.touched = true;\n setIsFocused(false);\n onBlurProp?.(event);\n };\n\n const hasError = (): boolean => {\n return formValidator\n ? (formValidator.touched && formValidator.hasError())\n : (!isValid || !!errorMessage);\n };\n\n const computedIsRequired = (): boolean => {\n return !!(isRequired || formValidator?.validators.find(\n (v) => (v as { validatorId?: string }).validatorId === 'required'\n ));\n };\n\n const onChangeHandler = (val: string | number): void => {\n if (formValidator) {\n formValidator.set(val);\n onChange?.(formValidator.value, customProps);\n } else {\n onChange?.(val, customProps);\n }\n };\n\n let dropdownLabel = dropdownLabelProp;\n const currentValue = formValidator ? formValidator.value as string | number : value;\n const hasErr = hasError();\n\n items.forEach((item: DropdownItem) => {\n if (item.key === currentValue) {\n dropdownLabel = item.label as string;\n }\n });\n\n return (\n <div\n className={cx(className, styles.dropdownLabel, styles.dropdown, {\n [styles.dropdownLabelColumn]: !isRow,\n })}\n onMouseEnter={onMouseEnterHandler}\n onMouseLeave={onMouseLeaveHandler}\n >\n <Downshift\n onChange={(selection: DropdownItem | null) => onChangeHandler((selection || { key: '' }).key)}\n itemToString={(item: DropdownItem | null) => (item ? String(item.key) : '')}\n selectedItem={items.find((el) => el.key === currentValue) ?? null}\n stateReducer={(state: DownshiftState<DropdownItem>, changes: StateChangeOptions<DropdownItem>) => {\n if (scrollToSelected && Object.prototype.hasOwnProperty.call(changes, 'isOpen')) {\n return {\n ...changes,\n highlightedIndex: changes.isOpen ? items.indexOf(state.selectedItem as DropdownItem) : null,\n };\n }\n return changes;\n }}\n >\n {({\n getItemProps,\n getToggleButtonProps,\n isOpen,\n selectedItem,\n highlightedIndex,\n setHighlightedIndex,\n }) => (\n <div>\n <div\n onFocus={onFocusHandler}\n onBlur={onBlurHandler}\n className={cx(\n styles.dropdownInput,\n {\n [styles.dropdownInputPlain]: plainStyle,\n [styles.dropdownInputButtonDisabled]: disabled,\n },\n dropDownInputClassName\n )}\n >\n <button\n tabIndex={tabIndex}\n type=\"button\"\n style={isDropdownListWider ? { padding: '6px', border: 'none' } : {}}\n className={cx(styles.dropdownInputButton, inputClassName)}\n {...getToggleButtonProps()}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n getToggleButtonProps().onClick?.(e);\n onClick?.(e);\n }}\n ref={reactRef}\n >\n {dropdownLabel || currentValue || <div> </div>}\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n className={cx(styles.dropdownInputButtonIcon, dropDownIconClassName)}\n {...getToggleButtonProps()}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n getToggleButtonProps().onClick?.(e);\n onClick?.(e);\n }}\n >\n {!disabled && (\n <FontAwesomeIcon\n icon={dropdownIcon}\n className={cx(styles.dropdownInputButtonIconArrow, {\n [styles.dropdownInputButtonIconArrowOpen]: isOpen,\n })}\n />\n )}\n </button>\n {!disabled && isOpen ? (\n <InfiniteBlock\n onScroll={onScroll}\n className={cx(styles.dropdownInputList, {\n [styles.dropdownInputListOnTop]: isListOnTop,\n [styles.dropdownInputListWider]: isDropdownListWider,\n })}\n setHighlightedIndex={setHighlightedIndex}\n >\n {items.map((item: DropdownItem, index: number) => (\n <div\n key={item.key}\n {...getItemProps({ index, item, disabled: !!item.disabled })}\n className={cx(styles.dropdownInputListItem, dropDownClassName, {\n [styles.dropdownInputListItemActive]: highlightedIndex === index,\n [styles.dropdownInputListItemSelected]: selectedItem === item,\n })}\n >\n {item.label}\n </div>\n ))}\n </InfiniteBlock>\n ) : null}\n <fieldset\n className={cx(styles.dropdownFieldset, {\n [styles.dropdownBorderPlain]: plainStyle,\n [styles.dropdownBorderFocused]: isFocused,\n [styles.dropdownBorderInvalid]: hasErr,\n [styles.dropdownBorderError]: hasErr,\n })}\n >\n <legend\n className={cx(styles.dropdownFieldsetLegend, {\n [styles.dropdownFieldsetLegendActive]:\n useMatLabelStyle && (isFocused || currentValue),\n })}\n >\n <span>{label}</span>\n </legend>\n </fieldset>\n {useMatLabelStyle && label && (\n <div\n className={cx(styles.dropdownMatLabel, {\n [styles.dropdownMatLabelFloating]: isFocused || currentValue,\n })}\n >\n {label}\n </div>\n )}\n {useMatLabelStyle && placeholder && (\n <div\n className={cx(\n styles.dropdownPlaceholder,\n isFocused && !dropdownLabel && styles.dropdownPlaceholderShown\n )}\n >\n {placeholder}\n </div>\n )}\n </div>\n </div>\n )}\n </Downshift>\n {label && !useMatLabelStyle && (\n <div className={cx(styles.dropdownLabelText, labelClassName)}>\n {label}\n {computedIsRequired() ? <div className={styles.requiredMark}>*</div> : null}\n </div>\n )}\n <Tooltip\n variant=\"error\"\n message={formValidator ? formValidator.getCurrentErrorMessage() : (errorMessage || '')}\n isVisible={hasErr && (isFocused || isHovered)}\n />\n </div>\n );\n}\n\nexport default Dropdown;\n",".datePicker {\n position: relative;\n width: 100%;\n flex: 1;\n min-width: 105px;\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin: 8px 0;\n\n &-monthAndYear {\n display: flex;\n\n &-container {\n display: flex;\n gap: 16px;\n position: relative;\n }\n }\n\n &-month {\n width: 120px;\n }\n\n &-year {\n width: 75px;\n }\n }\n\n &-month {\n min-width: 185px;\n }\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport cx from 'classnames';\nimport Input from '../input';\nimport DatePickerMonth from './components/datePickerMonth';\nimport { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons';\nimport { getLocale } from 'services/localization';\nimport ActionIcon from '../actionIcon';\nimport Modal from '../modal';\nimport FloatingMenu from '../floatingMenu';\nimport Dropdown from '../dropdown';\nimport { Align } from '../floatingMenu/floatingMenu.types';\nimport InputMask, { InputState, BeforeMaskedStateChangeStates } from '@mona-health/react-input-mask';\nimport { getDateFromDayMonthAndYear, getMonthName, getMonthNames, getDateString, correctDateMaskValue } from './dateFunctions';\nimport Button from '../button';\nimport Tooltip from '../tooltip';\nimport type FormValidator from 'services/formValidation/formValidator';\n\nimport styles from './datePicker.module.pcss';\n\ninterface DatePickerProps {\n className?: string;\n selected?: Date;\n onSelect?: (date: Date | null) => void;\n formValidator?: FormValidator | null;\n noInput?: boolean;\n noHeader?: boolean;\n isModal?: boolean;\n isInline?: boolean;\n onChange?: (date: Date | null) => void;\n minDate?: Date | null;\n maxDate?: Date | null;\n children?: React.ReactNode;\n showClearButton?: boolean;\n label?: string;\n isValid?: boolean;\n errorMessage?: string;\n isRequired?: boolean;\n startDate?: Date;\n endDate?: Date;\n}\n\nexport default function DatePicker({\n className = '',\n selected,\n onSelect = () => null,\n formValidator = null,\n noInput = false,\n noHeader = false,\n isModal = false,\n isInline = false,\n onChange = () => null,\n minDate = null,\n maxDate = null,\n children = null,\n showClearButton = false,\n label = '',\n isValid = true,\n errorMessage = '',\n isRequired = false,\n startDate,\n endDate,\n}: DatePickerProps) {\n const getCurrValue = (): Date | undefined =>\n formValidator ? (formValidator.value as Date) : selected;\n\n const initialDate = getCurrValue() ?? new Date();\n\n const [currentMonth, setCurrentMonth] = useState(initialDate.getMonth() + 1);\n const [currentYear, setCurrentYear] = useState(initialDate.getFullYear());\n const [isPickerOpen, setIsPickerOpen] = useState(false);\n const [currentDateString, setCurrentDateString] = useState(() =>\n getCurrValue() ? getDateString(initialDate) : ''\n );\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [, forceUpdate] = useState(0);\n const [prevSelected, setPrevSelected] = useState(selected);\n\n const fvRef = useRef(formValidator);\n\n // Sync navigation view when `selected` prop changes externally\n if (prevSelected !== selected) {\n setPrevSelected(selected);\n const d = selected ?? new Date();\n setCurrentMonth(d.getMonth() + 1);\n setCurrentYear(d.getFullYear());\n setCurrentDateString(selected ? getDateString(selected) : '');\n }\n\n // Subscribe to formValidator updates (external system → setState in callback)\n useEffect(() => {\n fvRef.current = formValidator;\n if (!formValidator) return;\n const listener = () => {\n const val = formValidator.value as Date | undefined;\n if (val) {\n setCurrentMonth(val.getMonth() + 1);\n setCurrentYear(val.getFullYear());\n setCurrentDateString(getDateString(val));\n } else {\n setCurrentDateString('');\n }\n forceUpdate((n: number) => n + 1);\n };\n formValidator.registerOnUpdateListener(listener);\n return () => formValidator.removeOnUpdateListener(listener);\n }, [formValidator]);\n\n const hasError = (): boolean => {\n return formValidator\n ? (formValidator.touched && formValidator.hasError())\n : (!isValid || !!errorMessage);\n };\n\n const computedIsRequired = (): boolean => {\n return !!(isRequired || formValidator?.validators.find(\n (v) => (v as { validatorId?: string }).validatorId === 'required'\n ));\n };\n\n const handleChange = (date: Date | null) => {\n setCurrentDateString(date ? getDateString(date) : '');\n if (formValidator) formValidator.set(date);\n onChange(date);\n };\n\n const handleSelect = (date: Date | null) => {\n handleChange(date);\n onSelect(date);\n setIsPickerOpen(false);\n };\n\n const changeMonth = (delta: number) => {\n setCurrentMonth((prev) => {\n let next = prev + delta;\n if (next < 1) { next = 12; setCurrentYear((y) => y - 1); }\n else if (next > 12) { next = 1; setCurrentYear((y) => y + 1); }\n return next;\n });\n };\n\n const tryParseDateString = (dateString: string): Date | null => {\n if (dateString.match(/\\d{2}\\.\\d{2}\\.\\d{4}/gi)) {\n const [day, month, year] = dateString.split('.');\n const parsedDate = getDateFromDayMonthAndYear(Number(day), Number(month), Number(year));\n if (parsedDate && parsedDate.toString() !== 'Invalid Date') {\n const isSmallerThanMaxDate = !maxDate || parsedDate <= maxDate;\n const isBiggerThanMinDate = !minDate || parsedDate >= minDate;\n if (isSmallerThanMaxDate && isBiggerThanMinDate) return parsedDate;\n }\n }\n return null;\n };\n\n const beforeMaskedStateChange = ({ previousState, nextState }: BeforeMaskedStateChangeStates): InputState => {\n // previousState is only supplied on user-driven change events; on mount/focus/blur\n // there is nothing to auto-correct, so the next state passes through unchanged.\n if (!previousState || nextState.value === previousState.value) return nextState;\n\n const corrected = correctDateMaskValue(nextState.value, previousState.value, nextState.selection ?? null);\n\n const parsedDate = tryParseDateString(corrected.value);\n if (parsedDate) handleChange(parsedDate);\n\n return corrected;\n };\n\n const getYearDropdownOptions = () => {\n let length = 400;\n let zeroOffset = new Date().getFullYear() - 200;\n if (minDate) zeroOffset = minDate.getFullYear();\n if (maxDate) length = maxDate.getFullYear() - zeroOffset + 1;\n return Array.from(Array(length).keys()).map((i) => ({ key: i + zeroOffset, label: i + zeroOffset }));\n };\n\n const currValue = getCurrValue();\n const hasErr = hasError();\n\n const header = noHeader ? null : (\n <div className={styles.datePickerHeader}>\n <ActionIcon icon={faChevronLeft} onClick={() => changeMonth(-1)} />\n <div className={styles.datePickerHeaderMonthAndYearContainer}>\n <div className={styles.datePickerHeaderMonthAndYear}>\n <Dropdown\n plainStyle\n scrollToSelected\n onChange={(v) => setCurrentMonth(v as number)}\n className={styles.datePickerHeaderMonth}\n value={getMonthName(getLocale('-'), currentYear, currentMonth, 1)}\n items={getMonthNames().map((month, index) => ({ key: index + 1, label: month }))}\n />\n <Dropdown\n plainStyle\n scrollToSelected\n useMatLabelStyle={false}\n className={styles.datePickerHeaderYear}\n onChange={(v) => setCurrentYear(v as number)}\n value={currentYear}\n items={getYearDropdownOptions()}\n />\n </div>\n </div>\n <ActionIcon icon={faChevronRight} onClick={() => changeMonth(1)} />\n </div>\n );\n\n const pickerContent = (\n <>\n {header}\n <DatePickerMonth\n className={styles.datePickerMonth}\n month={currentMonth}\n year={currentYear}\n onSelect={handleSelect}\n selectionStart={startDate ?? currValue}\n selectionEnd={endDate ?? currValue}\n minDate={minDate}\n maxDate={maxDate}\n />\n {showClearButton && <Button onClick={() => handleSelect(null)}>Clear</Button>}\n {children}\n </>\n );\n\n const input = noInput ? null : (\n <Input\n readOnly={isModal}\n label={`${label}${computedIsRequired() ? ' *' : ''}`}\n value={currentDateString}\n onChange={(v) => setCurrentDateString(v as string)}\n onClick={() => setIsPickerOpen(true)}\n customInput={\n <InputMask mask=\"99.99.9999\" maskPlaceholder=\"_\" beforeMaskedStateChange={beforeMaskedStateChange} />\n }\n onBlur={() => {\n if (fvRef.current) fvRef.current.touched = true;\n setIsFocused(false);\n handleChange(tryParseDateString(currentDateString));\n }}\n onFocus={() => setIsFocused(true)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n isValid={!hasErr}\n />\n );\n\n const picker = (() => {\n if (isInline) return pickerContent;\n if (isModal) {\n return (\n <Modal hideHeader isOpen={isPickerOpen} onClose={() => setIsPickerOpen(false)}>\n {pickerContent}\n </Modal>\n );\n }\n return (\n <FloatingMenu\n isOpen={isPickerOpen}\n onOpenChange={(open: boolean) => setIsPickerOpen(open)}\n content={pickerContent}\n align={Align.Left}\n dontCloseOnChildClick\n >\n {input}\n </FloatingMenu>\n );\n })();\n\n return (\n <div className={cx(styles.datePicker, className)}>\n {(isModal || isInline) && input}\n {picker}\n <Tooltip\n variant=\"error\"\n message={formValidator ? formValidator.getCurrentErrorMessage() : (errorMessage || '')}\n isVisible={hasErr && (isFocused || isHovered)}\n />\n </div>\n );\n}\n",".emptyState {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-flow: column;\n gap: var(--spacing-m);\n}\n","import cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { ReactElement } from 'react';\nimport type { EmptyStateProps } from './emptyState.types';\nimport styles from './emptyState.module.pcss';\n\nexport default function EmptyState({ className, icon, children, ...rest }: EmptyStateProps): ReactElement {\n return (\n <div {...rest} className={cx(styles.emptyState, className)}>\n {icon && <FontAwesomeIcon icon={icon} />}\n <div>{children ?? 'No entries available'}</div>\n </div>\n );\n}\n",".fab {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n display: flex;\n align-items: stretch;\n padding: 0;\n\n --icon-size: 18px;\n\n /* Make the Ripple wrapper fill the full circular button */\n & > div {\n width: 100%;\n border-radius: 50%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &-content {\n font-size: var(--icon-size);\n width: var(--icon-size);\n height: var(--icon-size);\n\n svg {\n width: var(--icon-size);\n height: var(--icon-size);\n }\n\n &-container {\n display: flex;\n justify-content: center;\n align-items: center;\n }\n }\n\n &-size {\n &-mini {\n width: 40px;\n height: 40px;\n background: var(--background-accent-light);\n }\n }\n}\n","import cx from 'classnames';\n\nimport Button from 'components/common/button';\nimport { ButtonStyleType } from 'components/common/button/button.types';\nimport type { FabBaseProps, FabBaseSize } from './fabBase.types';\n\nimport styles from './fabBase.module.pcss';\n\nconst sizeClass: Record<FabBaseSize, string | null> = {\n default: null,\n mini: styles.fabSizeMini,\n};\n\nfunction FabBase({\n children = null,\n size = 'default',\n className = '',\n styleType = ButtonStyleType.Primary,\n onClick = () => {},\n}: FabBaseProps) {\n return (\n <Button\n styleType={styleType}\n className={cx(styles.fab, sizeClass[size], className)}\n onClick={onClick}\n >\n <div className={styles.fabContentContainer}>\n <div className={styles.fabContent}>{children}</div>\n </div>\n </Button>\n );\n}\n\nexport default FabBase;\n","\n.fab {\n animation: appear 0.3s forwards;\n opacity: 0;\n transform: scale(0);\n box-shadow:\n 0px 3px 5px -1px rgb(0 0 0 / 20%),\n 0px 6px 10px 0px rgb(0 0 0 / 14%),\n 0px 1px 18px 0px rgb(0 0 0 / 12%);\n border-radius: 50%;\n\n &-container {\n position: fixed;\n bottom: 16px;\n right: 16px;\n\n @media (--breakpoint-tablet) {\n z-index: 2;\n }\n }\n\n &-menu {\n position: absolute;\n top: 0;\n transform: translateY(calc(-100% - 16px));\n width: 100%;\n display: flex;\n flex-flow: column-reverse;\n gap: 16px;\n align-items: center;\n pointer-events: none;\n user-select: none;\n\n &-backdrop {\n width: 0%;\n height: 0%;\n position: fixed;\n top: 0;\n left: 0;\n background: black;\n opacity: 0;\n transition: opacity 0.4s;\n\n &-open {\n width: 100%;\n height: 100%;\n opacity: 0.5;\n }\n }\n\n &-entry {\n position: relative;\n cursor: pointer;\n opacity: 0;\n transform: scale(0);\n transition: all 0.2s;\n pointer-events: all;\n\n &:nth-child(2) {\n transition-delay: 0.05s;\n }\n\n &:nth-child(3) {\n transition-delay: 0.1s;\n }\n\n &:nth-child(4) {\n transition-delay: 0.15s;\n }\n\n &:nth-child(5) {\n transition-delay: 0.2s;\n }\n\n &:nth-child(6) {\n transition-delay: 0.25s;\n }\n\n &:nth-child(7) {\n transition-delay: 0.3s;\n }\n\n &-shown {\n opacity: 1;\n transform: scale(1);\n }\n\n &-label {\n background: var(--background-accent-light);\n border-radius: var(--default-border-radius);\n padding: 4px 8px;\n\n &-container {\n position: absolute;\n width: max-content;\n transform: translateX(-100%);\n height: 100%;\n margin-left: -8px;\n align-items: center;\n display: flex;\n }\n }\n }\n }\n\n &-icon {\n transition: all 0.4s;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n width: 100%;\n height: 100%;\n\n &-menuOpen {\n transform: rotate(225deg);\n }\n\n &-content {\n position: absolute;\n width: 18px;\n height: 18px;\n opacity: 0;\n transition: opacity 0.3s;\n\n &-shown {\n opacity: 1;\n }\n }\n }\n\n @keyframes appear {\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n}\n","import { useState } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPlus as addIcon } from '@fortawesome/free-solid-svg-icons';\n\nimport FabBase from './components/fabBase';\nimport type { FabProps } from './fab.types';\n\nimport styles from './fab.module.pcss';\n\nfunction Fab({\n children = null,\n size = 'default',\n menuEntries = [],\n onMenuEntryClicked = () => {},\n onClick = () => {},\n closeMenuOnEntryClicked = true,\n ...rest\n}: FabProps) {\n const [menuOpen, setMenuOpen] = useState(false);\n\n function handleFabClick() {\n if (menuEntries.length > 0) setMenuOpen((prev) => !prev);\n onClick();\n }\n\n function handleEntryClick(e: React.MouseEvent, id: string) {\n e.stopPropagation();\n if (closeMenuOnEntryClicked) setMenuOpen(false);\n onMenuEntryClicked(id);\n }\n\n return (\n <div {...rest} className={styles.fabContainer}>\n <div\n className={cx(styles.fabMenuBackdrop, menuOpen && styles.fabMenuBackdropOpen)}\n onClick={(e) => { e.stopPropagation(); setMenuOpen(false); }}\n />\n <div onClick={(e) => e.stopPropagation()}>\n <FabBase className={styles.fab} size={size} onClick={handleFabClick}>\n <div className={cx(styles.fabIcon, menuOpen && styles.fabIconMenuOpen)}>\n <div className={cx(styles.fabIconContent, !menuOpen && styles.fabIconContentShown)}>\n {children}\n </div>\n <div className={cx(styles.fabIconContent, menuOpen && styles.fabIconContentShown)}>\n <FontAwesomeIcon icon={addIcon} />\n </div>\n </div>\n </FabBase>\n </div>\n <div className={styles.fabMenu}>\n {menuEntries.map(({ id, label, icon }) => (\n <div\n key={id}\n className={cx(styles.fabMenuEntry, menuOpen && styles.fabMenuEntryShown)}\n onClick={(e) => handleEntryClick(e, id)}\n >\n {label && (\n <div className={styles.fabMenuEntryLabelContainer}>\n <div className={styles.fabMenuEntryLabel}>{label}</div>\n </div>\n )}\n <FabBase size=\"mini\">\n <FontAwesomeIcon icon={icon} />\n </FabBase>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport default Fab;\n",".iconPicker {\n border-width: 1px;\n border-radius: var(--default-border-radius);\n border-color: transparent;\n border-style: solid;\n\n &-label {\n font-size: var(--text-small-font-size);\n margin-bottom: 8px;\n }\n\n &-item {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 8px;\n width: 24px;\n height: 24px;\n background: var(--background-accent);\n border-radius: 200px;\n cursor: pointer;\n stroke: var(--text-color);\n position: relative;\n\n &:focus-visible {\n outline: 1px solid var(--primary-color);\n }\n\n &-container {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-around;\n gap: 8px 14px;\n }\n\n &-selected {\n background: var(--primary-color);\n }\n }\n\n &-error {\n border-color: red;\n }\n}\n","import React from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport styles from './iconPicker.module.pcss';\nimport Ripple from '../ripple';\nimport type { IconPickerItem, IconPickerProps } from './iconPicker.types';\n\nfunction hasError(props: IconPickerProps): boolean {\n const { formValidator } = props;\n return formValidator ? (formValidator.touched && formValidator.hasError()) : false;\n}\n\nfunction isRequired(props: IconPickerProps): boolean {\n const { isRequired: reqProp, formValidator } = props;\n return !!(reqProp || formValidator?.validators.find(\n (v) => (v as { validatorId?: string }).validatorId === 'required'\n ));\n}\n\nexport default function IconPicker({\n data = [],\n selectedId = null,\n label = '',\n onChange,\n formValidator = null,\n isRequired: _isRequired,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: IconPickerProps) {\n const currentValue = formValidator ? (formValidator.value as string) ?? null : selectedId;\n const showError = hasError({ formValidator, isRequired: _isRequired });\n const required = isRequired({ formValidator, isRequired: _isRequired });\n\n function handleSelect(id: string) {\n if (formValidator) formValidator.set(id);\n onChange?.(id);\n }\n\n return (\n <div\n {...rest}\n className={cx(styles.iconPicker, { [styles.iconPickerError]: showError }, classNames?.root, className)}\n style={{ ...slotStyles?.root, ...style }}\n >\n {label && (\n <div className={cx(styles.iconPickerLabel, classNames?.label)} style={slotStyles?.label}>\n {label}\n {required && ' *'}\n </div>\n )}\n <div\n className={cx(styles.iconPickerItemContainer, classNames?.itemContainer)}\n style={slotStyles?.itemContainer}\n >\n {data.map(({ id, label: itemLabel, icon, customIcon }: IconPickerItem) => (\n <div\n key={id}\n className={cx(\n styles.iconPickerItem,\n { [styles.iconPickerItemSelected]: currentValue === id },\n classNames?.item\n )}\n style={slotStyles?.item}\n title={itemLabel}\n tabIndex={0}\n role=\"button\"\n onClick={() => handleSelect(id)}\n onKeyDown={({ key }) => { if (key === 'Enter') handleSelect(id); }}\n >\n {icon && <FontAwesomeIcon icon={icon} />}\n {customIcon ?? null}\n <Ripple />\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { IdleManagerProps } from './idleManager.types';\n\nconst ACTIVITY_EVENTS = ['click', 'mousemove', 'keydown', 'scroll', 'touchstart'] as const;\n\nfunction IdleManager({\n children = null,\n idleAfterSeconds = 600,\n renderCondition = true,\n}: IdleManagerProps) {\n const [isIdleContentShown, setIsIdleContentShown] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const resetIdleTimeout = useCallback(() => {\n if (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n setIsIdleContentShown(false);\n timeoutRef.current = setTimeout(() => {\n setIsIdleContentShown(true);\n }, idleAfterSeconds * 1000);\n }, [idleAfterSeconds]);\n\n // Re-run whenever idleAfterSeconds changes (or on first mount)\n useEffect(() => {\n resetIdleTimeout();\n }, [resetIdleTimeout]);\n\n // Register / unregister activity listeners\n useEffect(() => {\n for (const event of ACTIVITY_EVENTS) {\n document.addEventListener(event, resetIdleTimeout);\n }\n return () => {\n for (const event of ACTIVITY_EVENTS) {\n document.removeEventListener(event, resetIdleTimeout);\n }\n // Clear any pending timeout on unmount so it never fires after we're gone\n if (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n };\n }, [resetIdleTimeout]);\n\n return <>{renderCondition && isIdleContentShown && children}</>;\n}\n\nexport default IdleManager;\n",".inputDropdown {\n position: relative;\n}\n\n.dropdown {\n position: fixed;\n width: fit-content;\n max-width: 240px;\n border-radius: var(--default-border-radius);\n background: var(--background-modal);\n box-shadow: var(--card-shadow);\n box-sizing: border-box;\n overflow: auto;\n transition: all 0.1s;\n transform-origin: top left;\n opacity: 0;\n transform: scale(0.95);\n max-height: 200px;\n z-index: 2;\n\n &-shown {\n transform: scale(1);\n opacity: 1;\n }\n\n &-item {\n padding: 8px;\n z-index: 0;\n outline: none;\n cursor: pointer;\n\n &:hover,\n &:focus {\n background: var(--background-accent);\n }\n\n &-highlighted {\n background: var(--background-accent);\n }\n }\n\n &-category {\n padding: 16px 8px 4px 8px;\n }\n}\n","import React, { useCallback, useRef, useState } from 'react';\nimport cx from 'classnames';\nimport styles from './inputDropdown.module.pcss';\nimport Input from '../input';\nimport type { InputDropdownItem, InputDropdownProps } from './inputDropdown.types';\n\nfunction getKeyFromProps(value: string | undefined, formValidator: InputDropdownProps['formValidator']): string {\n return formValidator ? (formValidator.value as string) ?? '' : (value ?? '');\n}\n\nfunction labelForKey(key: string, items: InputDropdownItem[]): string {\n const match = items.find((item) => item.value === key);\n return match ? (match.label ?? match.value) : key;\n}\n\nexport default function InputDropdown({\n label = '',\n value = '',\n formValidator = null,\n items = [],\n className,\n style,\n classNames,\n styles: slotStyles,\n onSelect = () => null,\n onChange,\n placeholder = '',\n ...rest\n}: InputDropdownProps) {\n const currentKey = getKeyFromProps(value, formValidator);\n\n const [inputText, setInputText] = useState(() => labelForKey(currentKey, items));\n const [prevKey, setPrevKey] = useState(currentKey);\n const [isMenuShown, setIsMenuShown] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState<number | null>(null);\n const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Sync display text when the controlled key changes externally (e.g. parent reset).\n if (currentKey !== prevKey) {\n setPrevKey(currentKey);\n const match = items.find((item) => item.value === currentKey);\n if (match) setInputText(match.label ?? match.value);\n }\n\n const currItems = items.filter((item) =>\n (item.label ?? item.value).toLowerCase().includes(inputText.toLowerCase())\n );\n\n const handleFocus = () => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n setIsMenuShown(true);\n };\n\n const handleBlur = () => {\n hideTimeoutRef.current = setTimeout(() => {\n setIsMenuShown(false);\n hideTimeoutRef.current = null;\n }, 100);\n };\n\n const handleSelect = useCallback((item: InputDropdownItem) => {\n setInputText(item.label ?? item.value);\n if (formValidator) formValidator.set(item.value);\n if (onChange) onChange(item.value);\n onSelect(item.value);\n }, [formValidator, onChange, onSelect]);\n\n const onKeyDown = useCallback((event: React.KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightedIndex((idx) => (!idx ? null : idx - 1));\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightedIndex((idx) =>\n idx === null ? 0 : Math.min(idx + 1, currItems.length - 1)\n );\n } else if (event.key === 'Enter' && highlightedIndex !== null && currItems[highlightedIndex]) {\n handleSelect(currItems[highlightedIndex]);\n }\n }, [currItems, highlightedIndex, handleSelect]);\n\n return (\n <div\n {...rest}\n className={cx(styles.inputDropdown, classNames?.root, className)}\n style={{ ...slotStyles?.root, ...style }}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n >\n <Input\n label={label}\n value={inputText}\n onChange={(v) => {\n setInputText(v as string);\n setHighlightedIndex(null);\n }}\n placeholder={placeholder}\n />\n <div\n className={cx(styles.dropdown, { [styles.dropdownShown]: isMenuShown }, classNames?.dropdown)}\n style={slotStyles?.dropdown}\n >\n {isMenuShown &&\n currItems.map((item, key) => (\n <div\n key={`${key}_${item.label}_${item.value}`}\n className={cx(\n styles.dropdownItem,\n highlightedIndex === key && styles.dropdownItemHighlighted,\n classNames?.item\n )}\n style={slotStyles?.item}\n onClick={() => handleSelect(item)}\n >\n {item.label ?? item.value}\n </div>\n ))}\n </div>\n </div>\n );\n}\n",".board {\n display: flex;\n gap: var(--spacing-s);\n overflow-x: auto;\n align-items: flex-start;\n width: 100%;\n}\n\n.column {\n background: var(--background-accent-light);\n border-radius: var(--default-border-radius);\n box-shadow: var(--card-shadow);\n flex: 1 1 0;\n display: flex;\n flex-direction: column;\n border: 2px solid transparent;\n transition: border-color 0.15s ease, background 0.15s ease;\n\n &-empty {\n flex: 0 1 0;\n min-width: 140px;\n }\n\n &-over {\n border-color: var(--primary-lighter);\n background: var(--background-accent);\n }\n\n &-header {\n padding: var(--spacing-m) var(--spacing-l);\n background: var(--background-accent);\n border-radius: var(--default-border-radius) var(--default-border-radius) 0 0;\n font-size: var(--header-small-font-size);\n font-weight: var(--header-font-weight);\n color: var(--text-color);\n border-bottom: 1px solid var(--border-color);\n }\n\n &-items {\n padding: var(--spacing-m);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-m);\n min-height: 80px;\n flex: 1;\n }\n}\n\n.item {\n cursor: grab;\n touch-action: none;\n\n &:active {\n cursor: grabbing;\n }\n\n &-dragging {\n opacity: 0.4;\n }\n}\n\n.dragOverlay {\n border-radius: var(--default-border-radius);\n cursor: grabbing;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25), var(--card-shadow);\n}\n","import type { ReactNode } from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport cx from 'classnames';\n\nimport styles from './kanbanBoard.module.pcss';\n\ninterface KanbanItemProps {\n id: string;\n children: ReactNode;\n}\n\nfunction KanbanItem({ id, children }: KanbanItemProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n });\n\n return (\n <div\n ref={setNodeRef}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={cx(styles.item, isDragging && styles.itemDragging)}\n {...attributes}\n {...listeners}\n >\n {children}\n </div>\n );\n}\n\nexport default KanbanItem;\n","import type { ReactNode } from 'react';\nimport { useDroppable } from '@dnd-kit/core';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport cx from 'classnames';\n\nimport type { KanbanColumnProps } from './kanbanBoard.types';\nimport styles from './kanbanBoard.module.pcss';\nimport KanbanItem from './KanbanItem';\n\ninterface KanbanColumnInternalProps<T> extends KanbanColumnProps {\n itemIds: string[];\n items: Record<string, T>;\n renderItem: (item: T, id: string) => ReactNode;\n}\n\nfunction KanbanColumn<T>({\n id,\n title,\n itemIds,\n items,\n renderItem,\n className,\n classNames,\n styles: slotStyles,\n}: KanbanColumnInternalProps<T>) {\n const droppableId = `column-${id}`;\n const { setNodeRef, isOver } = useDroppable({ id: droppableId });\n\n return (\n <div className={cx(styles.column, isOver && styles.columnOver, itemIds.length === 0 && styles.columnEmpty, className)}>\n <div className={cx(styles.columnHeader, classNames?.header)} style={slotStyles?.header}>{title}</div>\n <SortableContext items={itemIds} strategy={verticalListSortingStrategy}>\n <div ref={setNodeRef} className={cx(styles.columnItems, classNames?.items)} style={slotStyles?.items}>\n {itemIds.map((itemId) => (\n <KanbanItem key={itemId} id={itemId}>\n {items[itemId] !== undefined ? renderItem(items[itemId], itemId) : null}\n </KanbanItem>\n ))}\n </div>\n </SortableContext>\n </div>\n );\n}\n\nexport default KanbanColumn;\n","import { useState } from 'react';\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n useSensor,\n useSensors,\n closestCorners,\n type DragStartEvent,\n type DragOverEvent,\n type DragEndEvent,\n} from '@dnd-kit/core';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport cx from 'classnames';\n\nimport type { KanbanBoardProps, KanbanColumnDef } from './kanbanBoard.types';\nimport styles from './kanbanBoard.module.pcss';\nimport KanbanColumn from './KanbanColumn';\n\nfunction KanbanBoard<T = unknown>({\n columns,\n items,\n renderItem,\n onChange,\n className,\n style,\n classNames,\n styles: slotStyles,\n}: KanbanBoardProps<T>) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const [shadowColumns, setShadowColumns] = useState<KanbanColumnDef[] | null>(null);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: { distance: 8 },\n })\n );\n\n const displayColumns = shadowColumns ?? columns;\n\n function findColumnForItem(cols: KanbanColumnDef[], itemId: string): number {\n return cols.findIndex((col) => col.itemIds.includes(itemId));\n }\n\n function handleDragStart({ active }: DragStartEvent) {\n setActiveId(String(active.id));\n setShadowColumns(columns.map((col) => ({ ...col, itemIds: [...col.itemIds] })));\n }\n\n function handleDragOver({ active, over }: DragOverEvent) {\n if (!over) return;\n\n const activeItemId = String(active.id);\n const overId = String(over.id);\n\n setShadowColumns((prev) => {\n const base = prev ?? columns.map((col) => ({ ...col, itemIds: [...col.itemIds] }));\n const next = base.map((col) => ({ ...col, itemIds: [...col.itemIds] }));\n\n const sourceColIndex = findColumnForItem(next, activeItemId);\n if (sourceColIndex === -1) return prev;\n\n // Determine destination column\n let destColIndex: number;\n if (overId.startsWith('column-')) {\n const colId = overId.slice('column-'.length);\n destColIndex = next.findIndex((col) => col.id === colId);\n } else {\n destColIndex = findColumnForItem(next, overId);\n }\n\n if (destColIndex === -1) return prev;\n\n if (sourceColIndex === destColIndex) {\n // Reorder within the same column\n const col = next[sourceColIndex];\n const oldIndex = col.itemIds.indexOf(activeItemId);\n const newIndex = col.itemIds.indexOf(overId);\n if (oldIndex !== -1 && newIndex !== -1 && oldIndex !== newIndex) {\n next[sourceColIndex] = {\n ...col,\n itemIds: arrayMove(col.itemIds, oldIndex, newIndex),\n };\n }\n } else {\n // Move across columns\n next[sourceColIndex].itemIds = next[sourceColIndex].itemIds.filter(\n (id) => id !== activeItemId\n );\n const overIndex = next[destColIndex].itemIds.indexOf(overId);\n const insertAt = overIndex === -1 ? next[destColIndex].itemIds.length : overIndex;\n next[destColIndex].itemIds.splice(insertAt, 0, activeItemId);\n }\n\n return next;\n });\n }\n\n function handleDragEnd({ active, over }: DragEndEvent) {\n setActiveId(null);\n\n if (!over || !shadowColumns) {\n setShadowColumns(null);\n return;\n }\n\n // Commit shadow columns to parent\n onChange(shadowColumns);\n setShadowColumns(null);\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCorners}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n <div className={cx(styles.board, className)} style={style}>\n {displayColumns.map((col) => (\n <KanbanColumn\n key={col.id}\n id={col.id}\n title={col.title}\n itemIds={col.itemIds}\n items={items}\n renderItem={renderItem}\n />\n ))}\n </div>\n <DragOverlay>\n {activeId && items[activeId] !== undefined ? (\n <div className={cx(styles.dragOverlay, classNames?.dragOverlay)} style={slotStyles?.dragOverlay}>{renderItem(items[activeId], activeId)}</div>\n ) : null}\n </DragOverlay>\n </DndContext>\n );\n}\n\nexport default KanbanBoard;\n",".iconLoading {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n position: absolute;\n left: 0;\n top: 0;\n user-select: none;\n pointer-events: none;\n\n --draw-duration: 0.8s;\n --delay: 0.4s;\n\n svg {\n stroke-dasharray: 14;\n stroke-dashoffset: 14;\n width: 200px;\n aspect-ratio: 1;\n animation: calc(var(--draw-duration) * 3) spin-to-oblivion var(--delay) infinite;\n transform: rotate(0deg);\n stroke: var(--primary-color);\n stroke-linecap: round;\n }\n\n &-first {\n animation: calc(var(--draw-duration) * 3) draw-line var(--delay) infinite;\n }\n\n &-second {\n animation: calc(var(--draw-duration) * 3) draw-line-two var(--delay) infinite;\n }\n\n @keyframes draw-line {\n 33% {\n stroke-dashoffset: 0;\n }\n 95% {\n stroke-dashoffset: 0;\n }\n 96% {\n stroke-dashoffset: 14;\n }\n }\n\n @keyframes draw-line-two {\n 33% {\n stroke-dashoffset: 14;\n }\n 66% {\n stroke-dashoffset: 0;\n }\n 95% {\n stroke-dashoffset: 0;\n }\n 96% {\n stroke-dashoffset: 14;\n }\n }\n\n @keyframes spin-to-oblivion {\n 50% {\n transform: rotate(180deg);\n }\n 75% {\n transform: rotate(180deg) scale(0);\n }\n 100% {\n transform: rotate(180deg) scale(0);\n }\n }\n}\n","import React from 'react';\nimport cx from 'classnames';\n\nimport styles from './iconLoading.module.pcss';\n\nfunction IconLoading({ className = '' }) {\n return (\n <div className={cx(styles.iconLoading, className)}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-8 -1 16 14\">\n <path\n className={styles.iconLoadingFirst}\n d=\"M 0 0 C 3 5 6 5 6 12\"\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n <path\n className={styles.iconLoadingFirst}\n d=\"M 0 0 C -3 5 -6 5 -6 12\"\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n <path className={styles.iconLoadingFirst} d=\"M 0 0 L 0 10\" strokeWidth=\"1.7\" fill=\"none\" />\n <path\n className={styles.iconLoadingSecond}\n d=\"M 0.1 10 C -3 10 -4 10 -6 12\"\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n <path\n className={styles.iconLoadingSecond}\n d=\"M -0.1 10 C 3 10 4 10 6 12\"\n strokeWidth=\"1.7\"\n fill=\"none\"\n />\n </svg>\n </div>\n );\n}\n\nexport default IconLoading;\n","import IconLoading from './iconLoading.js';\n\nexport default IconLoading;\n",".numberInput{\n\n}\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\nimport { NumericFormat, NumericFormatProps } from 'react-number-format';\nimport type FormValidator from 'services/formValidation/formValidator';\n\nimport styles from './numberInput.module.pcss';\nimport Input from '../input';\n\ninterface Properties\n extends Omit<NumericFormatProps, 'onValueChange' | 'value' | 'customInput' | 'onChange'> {\n value?: number | string;\n onChange?: (value: number | undefined) => void;\n formValidator?: FormValidator | null;\n label?: string;\n error?: string;\n className?: string;\n allowNegative?: boolean;\n decimalSeparator?: string;\n thousandSeparator?: string | boolean;\n prefix?: string;\n suffix?: string;\n decimalScale?: number;\n placeholder?: string;\n sign?: '+' | '-';\n}\n\nfunction NumberInput({\n value,\n onChange,\n formValidator,\n label,\n error,\n className,\n allowNegative = false,\n decimalSeparator,\n thousandSeparator,\n prefix,\n suffix,\n decimalScale,\n placeholder,\n sign,\n ...rest\n}: Properties): ReactElement {\n const rawValue = formValidator != null ? formValidator.value as number | string : value;\n // When a sign is forced, display the absolute value — the prefix character carries the sign visually.\n const displayValue = sign != null && rawValue != null ? Math.abs(Number(rawValue)) : rawValue;\n const controlledValue = displayValue != null ? String(displayValue) : '';\n\n function handleValueChange(floatValue: number | undefined) {\n let out = floatValue;\n if (out !== undefined) {\n if (sign === '-') out = -Math.abs(out);\n if (sign === '+') out = Math.abs(out);\n }\n if (formValidator != null) formValidator.set(out ?? null);\n onChange?.(out);\n }\n\n const resolvedPrefix = sign === '-' ? '-' : sign === '+' ? '+' : prefix;\n\n return (\n <Input\n label={label}\n className={cx(styles.numberInput, className)}\n value={controlledValue}\n onChange={() => {}}\n formValidator={null}\n isValid={formValidator ? (formValidator.touched ? !formValidator.hasError() : true) : !error}\n errorMessage={formValidator ? (formValidator.getCurrentErrorMessage() ?? '') : (error ?? '')}\n placeholder={placeholder}\n customInput={\n <NumericFormat\n onValueChange={(vals) => handleValueChange(vals.floatValue)}\n allowNegative={sign != null ? false : allowNegative}\n decimalSeparator={decimalSeparator}\n thousandSeparator={thousandSeparator}\n decimalScale={decimalScale}\n fixedDecimalScale\n prefix={resolvedPrefix}\n suffix={suffix}\n {...rest}\n />\n }\n />\n );\n}\n\nexport default NumberInput;\n","import NumberInput from './numberInput';\n\nexport default NumberInput;\n",".optionPicker{\n display: flex;\n width: 100%;\n gap: var(--spacing-m);\n border-radius: var(--default-border-radius);\n border: 1px solid var(--border-color);\n justify-content: space-around;\n position: relative;\n overflow: hidden;\n\n &-chip {\n position: absolute;\n height: 100%;\n top: 0;\n left: 0;\n background: var(--primary-color);\n border-radius: var(--default-border-radius);\n transition: left 0.25s ease-in-out, width 0.25s ease-in-out;\n }\n\n &-option {\n position: relative;\n width: 100%;\n height: 100%;\n display: block;\n text-align: center;\n cursor: pointer;\n padding: var(--spacing-m);\n overflow: hidden;\n text-overflow: ellipsis;\n border-radius: var(--default-border-radius);\n transition: color 0.25s;\n\n &:focus {\n outline: var(--primary-color) solid 2px;\n outline-offset: -2px;\n }\n\n &-active {\n color: var(--text-on-primary);\n }\n }\n}\n","import type { ReactElement } from 'react';\nimport { OptionPickerProps } from './optionPicker.types';\nimport cx from 'classnames';\n\nimport styles from './optionPicker.module.pcss';\nimport InteractableDiv from '../interactableDiv';\n\n\nfunction OptionPicker({\n className = undefined,\n options,\n onChange,\n value,\n ...rest\n}: OptionPickerProps): ReactElement {\n const optionPickerLeft = options.findIndex((option) => option.key === value) * 100 / options.length;\n\n return (\n <div {...rest} className={cx(styles.optionPicker, className)}>\n <div className={styles.optionPickerChip} style={{ left: `${optionPickerLeft}%`, width: `${100 / options.length}%` }} />\n {options.map((option) => (\n <InteractableDiv\n onClick={(e) => onChange(option.key, e)}\n key={option.key}\n className={cx(\n styles.optionPickerOption,\n option.key === value && styles.optionPickerOptionActive\n )}\n tabIndex={option.key === value ? -1 : 0}\n >\n {option.label}\n </InteractableDiv>\n ))}\n </div>\n );\n}\n\nexport default OptionPicker;\n","import { useState, useEffect } from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport interface WindowSize {\n width: number;\n height: number;\n isMobileSize: boolean;\n}\n\nexport default function useWindowSize(): WindowSize {\n const [size, setSize] = useState<WindowSize>(() => ({\n width: window.innerWidth,\n height: window.innerHeight,\n isMobileSize: window.innerWidth < MOBILE_BREAKPOINT,\n }));\n\n useEffect(() => {\n function onResize() {\n setSize({\n width: window.innerWidth,\n height: window.innerHeight,\n isMobileSize: window.innerWidth < MOBILE_BREAKPOINT,\n });\n }\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n return size;\n}\n",".overscroll {\n height: 100vh;\n overflow: auto;\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none; /* Firefox */\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &-header {\n position: absolute;\n bottom: 0;\n width: 100%;\n\n &-centered {\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n &-container {\n position: relative;\n }\n }\n}\n","import { useRef, useEffect, useCallback } from 'react';\nimport cx from 'classnames';\nimport type { UIEvent } from 'react';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport styles from './overscroll.module.pcss';\nimport type { OverscrollProps } from './overscroll.types';\n\nexport default function Overscroll({\n children = null,\n overscrollContent = null,\n overscrollContentDesktop = null,\n centerHeader = true,\n min = 10,\n max = 80,\n start = 30,\n unit = '%',\n mobileOnly = true,\n onScrollChange = () => {},\n scrollDisabled = false,\n}: OverscrollProps) {\n const { isMobileSize, height } = useWindowSize();\n\n const overscrollRef = useRef<HTMLDivElement>(null);\n const overscrollHeaderRef = useRef<HTMLDivElement>(null);\n const overscrollHeaderContainerRef = useRef<HTMLDivElement>(null);\n const isScrollingRef = useRef(false);\n const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const onScrollChangeRef = useRef(onScrollChange);\n onScrollChangeRef.current = onScrollChange;\n\n const updateHeaderHeight = useCallback(\n (scrollTop: number) => {\n let h: number;\n if (unit === '%') {\n if (!overscrollHeaderContainerRef.current) return;\n const containerH = overscrollHeaderContainerRef.current.clientHeight;\n h = Math.max((containerH * min) / 100, containerH - scrollTop);\n } else {\n h = Math.max(min, max - scrollTop);\n }\n if (overscrollHeaderRef.current) {\n overscrollHeaderRef.current.style.height = `${h}px`;\n }\n },\n [min, max, unit],\n );\n\n const scrollToInitialPosition = useCallback(() => {\n let toScroll: number;\n if (unit === '%') {\n if (!overscrollHeaderContainerRef.current) return;\n const hundredPerc = (overscrollHeaderContainerRef.current.clientHeight / max) * 100;\n toScroll =\n overscrollHeaderContainerRef.current.clientHeight - hundredPerc * (start / 100);\n } else {\n toScroll = max - start;\n }\n if (overscrollRef.current) {\n overscrollRef.current.scrollTop = toScroll;\n updateHeaderHeight(toScroll);\n }\n }, [max, start, unit, updateHeaderHeight]);\n\n // Initial scroll position on mount (and if scroll-related props change)\n useEffect(() => {\n const id = setTimeout(scrollToInitialPosition, 100);\n return () => clearTimeout(id);\n }, [scrollToInitialPosition]);\n\n // Toggle overflow when scrollDisabled changes\n useEffect(() => {\n if (overscrollRef.current) {\n overscrollRef.current.style.overflow = scrollDisabled ? 'hidden' : 'auto';\n }\n }, [scrollDisabled]);\n\n // Scroll to initial position when entering mobile view\n const prevIsMobileRef = useRef(isMobileSize);\n useEffect(() => {\n if (isMobileSize && !prevIsMobileRef.current) scrollToInitialPosition();\n prevIsMobileRef.current = isMobileSize;\n }, [isMobileSize, scrollToInitialPosition]);\n\n // Scroll to initial position when mobileOnly is turned off (full overscroll DOM just mounted)\n const prevMobileOnlyRef = useRef(mobileOnly);\n useEffect(() => {\n if (!mobileOnly && prevMobileOnlyRef.current) scrollToInitialPosition();\n prevMobileOnlyRef.current = mobileOnly;\n }, [mobileOnly, scrollToInitialPosition]);\n\n // Update header height on window resize while in mobile view\n const prevHeightRef = useRef(height);\n useEffect(() => {\n if (isMobileSize && height !== prevHeightRef.current && overscrollRef.current) {\n updateHeaderHeight(overscrollRef.current.scrollTop);\n }\n prevHeightRef.current = height;\n }, [height, isMobileSize, updateHeaderHeight]);\n\n function handleScroll(e: UIEvent<HTMLDivElement>) {\n updateHeaderHeight(e.currentTarget.scrollTop);\n if (!isScrollingRef.current) {\n isScrollingRef.current = true;\n onScrollChangeRef.current(true);\n }\n if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n scrollTimeoutRef.current = setTimeout(() => {\n scrollTimeoutRef.current = null;\n isScrollingRef.current = false;\n onScrollChangeRef.current(false);\n }, 500);\n }\n\n if (mobileOnly && !isMobileSize) {\n if (overscrollContentDesktop) return <div>{overscrollContentDesktop}{children}</div>;\n return <>{children}</>;\n }\n\n const contentMinHeight = unit === '%' ? `${100 - min}%` : `calc(100% - ${min}px)`;\n\n return (\n <div className={styles.overscroll} ref={overscrollRef} onScroll={handleScroll}>\n <div\n className={styles.overscrollHeaderContainer}\n style={{ height: `${max}${unit}` }}\n ref={overscrollHeaderContainerRef}\n >\n <div\n className={cx(styles.overscrollHeader, centerHeader && styles.overscrollHeaderCentered)}\n ref={overscrollHeaderRef}\n >\n {overscrollContent}\n </div>\n </div>\n <div style={{ minHeight: contentMinHeight }}>{children}</div>\n </div>\n );\n}\n",".progressBar{\n min-width: 100px;\n min-height: 10px;\n background-color: #e0e0e0;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n display: flex;\n align-items: center;\n\n &-fill {\n height: stretch;\n background-color: var(--primary-color);\n width: 0;\n display: flex;\n align-items: center;\n overflow: hidden;\n transition: width .3s ease;\n\n &-end {\n border-radius: 0 var(--default-border-radius) var(--default-border-radius) 0;\n }\n }\n\n &-label {\n color: white;\n font-size: 12px;\n padding: 0 5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &-custom {\n mix-blend-mode: difference;\n }\n }\n}\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\nimport { Progress, ProgressBarProps } from './progressBar.types';\n\nimport styles from './progressBar.module.pcss';\n\nexport function getContrastColor(hexColor: string): string {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n \n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n return luminance > 0.5 ? '#000000' : '#ffffff';\n}\n\nfunction ProgressBar({\n className = undefined,\n total = 100,\n progress = 0,\n style = undefined,\n ...rest\n}: ProgressBarProps): ReactElement {\n\n function renderProgressBars() {\n const progressArray: Progress[] = [];\n\n if (Array.isArray(progress)) progressArray.push(...progress);\n else if (typeof progress === 'object') progressArray.push(progress);\n else progressArray.push({ amount: progress });\n\n return progressArray.map((prog, index) => {\n const widthPercentage = !total ? 0 : (prog.amount / total) * 100;\n\n return (\n <div\n key={index}\n className={cx(\n styles.progressBarFill,\n index === progressArray.length - 1 && styles.progressBarFillEnd,\n prog.class,\n )}\n style={{\n width: `${widthPercentage}%`,\n background: prog.color || undefined,\n ...(style || {}),\n }}\n title={prog.label ? `${prog.label}: ${prog.amount}` : undefined}\n >\n {prog.label && <div className={styles.progressBarLabel} style={prog.color ? { color: getContrastColor(prog.color) } : {}}>{prog.label}</div>}\n </div>\n );\n });\n }\n\n return (\n <div {...rest} className={cx(styles.progressBar, className)} style={style}>\n {renderProgressBars()}\n </div>\n );\n}\n\nexport default ProgressBar;\n","import type { Point, RoomData, DoorData } from './roomDrawer.types';\n\nexport const CANVAS_W = 400;\nexport const CANVAS_H = 300;\nexport const GRID = 5;\nexport const DOOR_WIDTH = 12;\nexport const CLOSE_THRESHOLD = 8; // px in SVG units to close a polygon\nexport const WALL_TOLERANCE = 8; // max distance to snap to a wall for door placement\n\n// ─── Coordinate helpers ────────────────────────────────────────────────────\n\nexport function snap(v: number): number {\n return Math.round(v / GRID) * GRID;\n}\n\nexport function snapPt(p: Point): Point {\n return { x: snap(p.x), y: snap(p.y) };\n}\n\nexport function clientToSVG(clientX: number, clientY: number, svg: SVGSVGElement): Point {\n const pt = svg.createSVGPoint();\n pt.x = clientX;\n pt.y = clientY;\n const m = svg.getScreenCTM();\n if (!m) return { x: 0, y: 0 };\n const raw = pt.matrixTransform(m.inverse());\n return snapPt({ x: raw.x, y: raw.y });\n}\n\n// ─── Geometry ──────────────────────────────────────────────────────────────\n\nexport function dist(a: Point, b: Point): number {\n return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);\n}\n\nexport function pointToSegment(p: Point, a: Point, b: Point): { dist: number; t: number } {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n if (len2 === 0) return { dist: dist(p, a), t: 0 };\n const t = Math.max(0, Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2));\n const px = a.x + t * dx;\n const py = a.y + t * dy;\n return { dist: Math.sqrt((p.x - px) ** 2 + (p.y - py) ** 2), t };\n}\n\nexport function nearestWall(pt: Point, rooms: RoomData[]): { roomId: string; wallIndex: number; t: number } | null {\n let best: { roomId: string; wallIndex: number; t: number; dist: number } | null = null;\n for (const room of rooms) {\n const pts = room.points;\n for (let i = 0; i < pts.length; i++) {\n const a = pts[i];\n const b = pts[(i + 1) % pts.length];\n const { dist: d, t } = pointToSegment(pt, a, b);\n if (d <= WALL_TOLERANCE && (!best || d < best.dist)) {\n best = { roomId: room.id, wallIndex: i, t, dist: d };\n }\n }\n }\n return best;\n}\n\nexport function pointInPolygon(pt: Point, poly: Point[]): boolean {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const xi = poly[i].x, yi = poly[i].y;\n const xj = poly[j].x, yj = poly[j].y;\n if ((yi > pt.y) !== (yj > pt.y) && pt.x < ((xj - xi) * (pt.y - yi)) / (yj - yi) + xi) {\n inside = !inside;\n }\n }\n return inside;\n}\n\nexport function centroid(pts: Point[]): Point {\n return {\n x: pts.reduce((s, p) => s + p.x, 0) / pts.length,\n y: pts.reduce((s, p) => s + p.y, 0) / pts.length,\n };\n}\n\nexport function rectToPoints(x: number, y: number, w: number, h: number): Point[] {\n return [\n { x, y },\n { x: x + w, y },\n { x: x + w, y: y + h },\n { x, y: y + h },\n ];\n}\n\n// Returns the two endpoints of the door opening and a perpendicular unit vector (for the swing arc).\nexport function doorEndpoints(\n a: Point,\n b: Point,\n t: number,\n width: number,\n): { p1: Point; p2: Point; perp: Point } | null {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 0.001) return null;\n const nx = dx / len;\n const ny = dy / len;\n const cx = a.x + dx * t;\n const cy = a.y + dy * t;\n const hw = Math.min(width / 2, len / 2 - 0.001);\n return {\n p1: { x: cx - nx * hw, y: cy - ny * hw },\n p2: { x: cx + nx * hw, y: cy + ny * hw },\n perp: { x: -ny, y: nx },\n };\n}\n\n// ─── SVG export ────────────────────────────────────────────────────────────\n\nfunction escapeSVG(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction ptsToClosedPath(pts: Point[]): string {\n return pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(' ') + ' Z';\n}\n\n// Returns one path string per wall segment between door gaps.\n// 0 doors → [closed path] | N doors → N open paths\nexport function buildWallSegments(pts: Point[], wallDoors: DoorData[]): string[] {\n if (pts.length < 2) return [];\n\n if (wallDoors.length === 0) {\n return [pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(' ') + ' Z'];\n }\n\n const n = pts.length;\n const segments: string[][] = [];\n let current: string[] = [`M ${pts[0].x.toFixed(2)},${pts[0].y.toFixed(2)}`];\n\n for (let i = 0; i < n; i++) {\n const a = pts[i];\n const b = pts[(i + 1) % n];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n const segs = wallDoors.filter((d) => d.wallIndex === i).sort((x, y) => x.t - y.t);\n\n if (segs.length === 0) {\n current.push(`L ${b.x.toFixed(2)},${b.y.toFixed(2)}`);\n } else {\n for (const door of segs) {\n const hw = door.width / 2;\n const t1 = Math.max(0, door.t - hw / len);\n const t2 = Math.min(1, door.t + hw / len);\n const gs = { x: a.x + dx * t1, y: a.y + dy * t1 };\n const ge = { x: a.x + dx * t2, y: a.y + dy * t2 };\n current.push(`L ${gs.x.toFixed(2)},${gs.y.toFixed(2)}`);\n segments.push(current);\n current = [`M ${ge.x.toFixed(2)},${ge.y.toFixed(2)}`];\n }\n current.push(`L ${b.x.toFixed(2)},${b.y.toFixed(2)}`);\n }\n }\n\n // Wrap-around: the last segment ends at pts[0] where segments[0] started —\n // merge them so each segment is one continuous open path.\n segments[0] = [...current, ...segments[0].slice(1)];\n\n return segments.map((s) => s.join(' '));\n}\n\nfunction buildDoorArcPath(a: Point, b: Point, door: DoorData): string {\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return '';\n const { p1, p2, perp } = ep;\n const swingEnd = { x: p1.x + perp.x * door.width, y: p1.y + perp.y * door.width };\n return [\n `M ${p1.x.toFixed(2)},${p1.y.toFixed(2)} L ${p2.x.toFixed(2)},${p2.y.toFixed(2)}`,\n `M ${p1.x.toFixed(2)},${p1.y.toFixed(2)} A ${door.width},${door.width} 0 0,1 ${swingEnd.x.toFixed(2)},${swingEnd.y.toFixed(2)}`,\n ].join(' ');\n}\n\nexport function generateSVG(rooms: RoomData[], doors: DoorData[]): string {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const r of rooms) {\n for (const p of r.points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n }\n if (!isFinite(minX)) { minX = 0; minY = 0; maxX = CANVAS_W; maxY = CANVAS_H; }\n\n const pad = 5;\n const vb = [\n (minX - pad).toFixed(2),\n (minY - pad).toFixed(2),\n (maxX - minX + pad * 2).toFixed(2),\n (maxY - minY + pad * 2).toFixed(2),\n ].join(' ');\n\n const roomEls = rooms.map((room) => {\n const roomDoors = doors.filter((d) => d.roomId === room.id);\n const wallSegs = buildWallSegments(room.points, roomDoors);\n const bgPath = ptsToClosedPath(room.points);\n const c = centroid(room.points);\n\n const wallPaths = wallSegs.map((d) => ` <path d=\"${d}\" />`).join('\\n');\n\n const doorPaths = roomDoors\n .map((door) => {\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const d = buildDoorArcPath(a, b, door);\n return d ? ` <path d=\"${d}\" fill=\"none\" />` : '';\n })\n .filter(Boolean)\n .join('\\n');\n\n const labelEl = room.name\n ? ` <text fontSize=\"5\" x=\"${c.x.toFixed(1)}\" y=\"${c.y.toFixed(1)}\">${escapeSVG(room.name)}</text>`\n : '';\n\n return [` <g id=\"${room.id}\">`, wallPaths, ` <path id=\"background\" d=\"${bgPath}\" />`, doorPaths, labelEl, ` </g>`]\n .filter(Boolean)\n .join('\\n');\n });\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"${vb}\">`,\n ` <g id=\"layer1\">`,\n ...roomEls,\n ` </g>`,\n ` <use id=\"use\" href=\"\" />`,\n `</svg>`,\n ].join('\\n');\n}\n\n// ─── SVG import ────────────────────────────────────────────────────────────\n\nfunction parseClosedPath(d: string): Point[] {\n const points: Point[] = [];\n for (const m of d.matchAll(/[ML]\\s*([-\\d.]+)[,\\s]+([-\\d.]+)/gi)) {\n points.push({ x: parseFloat(m[1]), y: parseFloat(m[2]) });\n }\n return points;\n}\n\nexport function parseSVGRooms(svgString: string): RoomData[] {\n const doc = new DOMParser().parseFromString(svgString, 'image/svg+xml');\n const rooms: RoomData[] = [];\n doc.querySelectorAll('[id^=\"room\"]').forEach((group) => {\n const bg = group.querySelector('[id=\"background\"]');\n if (!bg) return;\n const d = bg.getAttribute('d');\n if (!d) return;\n const points = parseClosedPath(d);\n if (points.length < 3) return;\n const name = group.querySelector('text')?.textContent?.trim() ?? '';\n rooms.push({ id: group.id, name, points });\n });\n return rooms;\n}\n\nexport function downloadSVG(rooms: RoomData[], doors: DoorData[]): void {\n const svg = generateSVG(rooms, doors);\n const blob = new Blob([svg], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'room-plan.svg';\n a.click();\n URL.revokeObjectURL(url);\n}\n",".roomDrawer {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n overflow: hidden;\n background: var(--background);\n user-select: none;\n\n &-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 8px;\n background: var(--background-accent);\n border-bottom: 1px solid var(--border-color);\n\n &-sep {\n flex: 1;\n }\n\n &-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.12s, color 0.12s;\n\n &:hover:not(:disabled) {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n\n &:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n }\n\n &-active {\n background: var(--primary-accent);\n color: var(--primary-color);\n border-color: var(--primary-lighter);\n }\n }\n\n &-zoomLabel {\n padding: 0 4px;\n min-width: 40px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 11px;\n text-align: center;\n\n &:hover {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n }\n }\n\n &-canvas {\n display: block;\n width: 100%;\n cursor: crosshair;\n user-select: none;\n\n &-select {\n cursor: default;\n }\n }\n\n &-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n\n &-label {\n font-size: 12px;\n color: var(--text-dark);\n white-space: nowrap;\n }\n\n &-input {\n flex: 1;\n max-width: 220px;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: var(--background);\n color: var(--text-color);\n font-size: 13px;\n\n &:focus {\n outline: none;\n border-color: var(--primary-color);\n }\n }\n\n &-spacer {\n flex: 1;\n }\n\n &-delete {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n transition: background 0.12s, color 0.12s, border-color 0.12s;\n\n &:hover {\n background: #e53935;\n color: #fff;\n border-color: #e53935;\n }\n }\n }\n\n &-hint {\n padding: 4px 8px;\n font-size: 11px;\n color: var(--text-dark);\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n }\n\n &-info {\n &-doorsBtn {\n display: flex;\n align-items: center;\n gap: 5px;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n white-space: nowrap;\n transition: background 0.12s, color 0.12s;\n\n &:hover {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n }\n }\n\n &-doorPanel {\n display: flex;\n flex-direction: column;\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n\n &-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-bottom: 1px solid var(--border-color);\n }\n\n &-icon {\n color: var(--text-dark);\n font-size: 12px;\n }\n\n &-title {\n flex: 1;\n font-size: 12px;\n color: var(--text-dark);\n }\n\n &-done {\n display: flex;\n align-items: center;\n gap: 5px;\n height: 26px;\n padding: 0 10px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n transition: background 0.12s, color 0.12s;\n\n &:hover {\n background: var(--primary-accent);\n color: var(--primary-color);\n border-color: var(--primary-lighter);\n }\n }\n\n &-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 6px 8px;\n max-height: 130px;\n overflow-y: auto;\n }\n\n &-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n &-label {\n font-size: 12px;\n color: var(--text-color);\n min-width: 48px;\n }\n\n &-widthLabel {\n font-size: 11px;\n color: var(--text-dark);\n }\n\n &-empty {\n font-size: 11px;\n color: var(--text-dark);\n font-style: italic;\n padding: 2px 0;\n }\n }\n\n &-canvas {\n &-door {\n cursor: crosshair;\n }\n }\n}\n\n/* ── SVG element classes ── */\n\n.doorGap {\n stroke: var(--background);\n stroke-width: 4;\n stroke-linecap: butt;\n pointer-events: none;\n}\n\n.doorMarker {\n fill: var(--primary-color);\n stroke: var(--background);\n stroke-width: 0.8;\n pointer-events: all;\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n}\n\n.gridLine {\n stroke: var(--text-color);\n stroke-width: 0.3;\n opacity: 0.12;\n}\n\n.roomFill {\n fill: var(--primary-accent);\n fill-opacity: 0.08;\n stroke: none;\n\n &-selected {\n fill-opacity: 0.22;\n }\n}\n\n.roomStroke {\n fill: none;\n stroke: var(--primary-color);\n stroke-width: 1.5;\n stroke-linejoin: round;\n\n &-selected {\n stroke: var(--primary-lighter);\n stroke-width: 2;\n }\n}\n\n.roomText {\n fill: var(--text-color);\n stroke: none;\n font-size: 7px;\n pointer-events: none;\n user-select: none;\n}\n\n.doorPanel {\n stroke: var(--primary-color);\n stroke-width: 1.5;\n stroke-linecap: round;\n\n &-selected {\n stroke: var(--primary-lighter);\n stroke-width: 2;\n }\n}\n\n.doorSwing {\n fill: none;\n stroke: var(--primary-color);\n stroke-width: 0.8;\n stroke-dasharray: 3 2;\n pointer-events: none;\n\n &-selected {\n stroke: var(--primary-lighter);\n }\n}\n\n.preview {\n fill: var(--primary-accent);\n stroke: var(--primary-color);\n stroke-width: 1;\n stroke-dasharray: 4 2;\n pointer-events: none;\n}\n\n.polyCloseTarget {\n fill: var(--primary-color);\n opacity: 0.5;\n pointer-events: none;\n}\n\n.polyVertex {\n fill: var(--primary-color);\n stroke: none;\n pointer-events: none;\n}\n\n.vertexHandle {\n fill: var(--background);\n stroke: var(--primary-color);\n stroke-width: 1.5;\n cursor: grab;\n pointer-events: all;\n\n &:hover {\n fill: var(--primary-accent);\n stroke: var(--primary-lighter);\n }\n}\n","import { useState, useRef, useEffect, useLayoutEffect } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faHandPointer,\n faSquare,\n faDrawPolygon,\n faTrash,\n faDownload,\n faUpload,\n faMagnifyingGlassPlus,\n faMagnifyingGlassMinus,\n faDoorOpen,\n faCheck,\n} from '@fortawesome/free-solid-svg-icons';\nimport type { MouseEvent, ReactElement } from 'react';\nimport type { Tool, Point, RoomData, DoorData, RoomDrawerProps } from './roomDrawer.types';\nimport {\n CANVAS_W,\n CANVAS_H,\n GRID,\n DOOR_WIDTH,\n CLOSE_THRESHOLD,\n clientToSVG,\n dist,\n pointToSegment,\n nearestWall,\n pointInPolygon,\n centroid,\n rectToPoints,\n doorEndpoints,\n buildWallSegments,\n downloadSVG,\n parseSVGRooms,\n snapPt,\n} from './roomDrawer.utils';\nimport styles from './roomDrawer.module.pcss';\n\nconst VERTEX_HIT = 6;\nconst WALL_HIT = 5;\nconst ZOOM_STEP = 1.25;\nconst ZOOM_MIN = 0.25;\nconst ZOOM_MAX = 12;\n\ntype DragState =\n | { type: 'room'; roomId: string; start: Point; origPoints: Point[] }\n | { type: 'vertex'; roomId: string; index: number; start: Point; origPt: Point };\n\nlet _seq = 0;\nfunction nextId(prefix: string): string {\n _seq += 1;\n return `${prefix}${_seq}`;\n}\n\nconst TOOL_HINTS: Record<Tool, string> = {\n select:\n 'Drag inside to move · Drag corner to reshape · Click wall to add corner · Dbl-click corner to remove · Delete to erase',\n rect: 'Drag to draw a rectangular room',\n polygon:\n 'Click to place corners · Click first point or Enter to close · Esc to cancel',\n};\n\nexport default function RoomDrawer({ className }: RoomDrawerProps): ReactElement {\n const [rooms, setRooms] = useState<RoomData[]>([]);\n const [doors, setDoors] = useState<DoorData[]>([]);\n const [tool, setTool] = useState<Tool>('rect');\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [editingDoorsForRoomId, setEditingDoorsForRoomId] = useState<string | null>(null);\n\n const [rectStart, setRectStart] = useState<Point | null>(null);\n const [rectCursor, setRectCursor] = useState<Point | null>(null);\n\n const [polyPoints, setPolyPoints] = useState<Point[]>([]);\n const [polyCursor, setPolyCursor] = useState<Point | null>(null);\n\n const [zoom, setZoom] = useState(1);\n const [pan, setPan] = useState<Point>({ x: 0, y: 0 });\n\n const dragRef = useRef<DragState | null>(null);\n const doorDragRef = useRef<string | null>(null); // door id being dragged\n const panDragRef = useRef<{ startClient: Point; origPan: Point; scaleX: number; scaleY: number } | null>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const uploadRef = useRef<HTMLInputElement>(null);\n\n const stateRef = useRef({ rooms, doors, tool, selectedId, editingDoorsForRoomId, polyPoints, zoom, pan });\n useLayoutEffect(() => {\n stateRef.current = { rooms, doors, tool, selectedId, editingDoorsForRoomId, polyPoints, zoom, pan };\n });\n\n function commitPolygon(pts: Point[]) {\n if (pts.length < 3) return;\n setRooms((prev) => [\n ...prev,\n { id: nextId('room'), name: `Room ${prev.length + 1}`, points: pts },\n ]);\n setPolyPoints([]);\n setPolyCursor(null);\n }\n\n // Wheel zoom (passive: false so we can preventDefault)\n useEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const { zoom: z, pan: p } = stateRef.current;\n const pt = clientToSVG(e.clientX, e.clientY, svgRef.current!);\n if (!pt) return;\n const factor = e.deltaY < 0 ? ZOOM_STEP : 1 / ZOOM_STEP;\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z * factor));\n setPan({\n x: pt.x - (pt.x - p.x) * (z / newZoom),\n y: pt.y - (pt.y - p.y) * (z / newZoom),\n });\n setZoom(newZoom);\n }\n svg.addEventListener('wheel', onWheel, { passive: false });\n return () => svg.removeEventListener('wheel', onWheel);\n }, []);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n const { tool: t, selectedId: sel, editingDoorsForRoomId: editDoors, polyPoints: pp, zoom: z, pan: p } = stateRef.current;\n\n if (e.key === 'Escape') {\n if (editDoors) { setEditingDoorsForRoomId(null); return; }\n if (t === 'polygon') { setPolyPoints([]); setPolyCursor(null); }\n setSelectedId(null);\n return;\n }\n if (e.key === 'Enter' && t === 'polygon' && pp.length >= 3) {\n commitPolygon(pp);\n return;\n }\n if ((e.key === '+' || e.key === '=') && !(e.target instanceof HTMLInputElement)) {\n const nz = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z * ZOOM_STEP));\n const cx = p.x + CANVAS_W / z / 2; const cy = p.y + CANVAS_H / z / 2;\n setZoom(nz); setPan({ x: cx - CANVAS_W / nz / 2, y: cy - CANVAS_H / nz / 2 });\n return;\n }\n if (e.key === '-' && !(e.target instanceof HTMLInputElement)) {\n const nz = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z / ZOOM_STEP));\n const cx = p.x + CANVAS_W / z / 2; const cy = p.y + CANVAS_H / z / 2;\n setZoom(nz); setPan({ x: cx - CANVAS_W / nz / 2, y: cy - CANVAS_H / nz / 2 });\n return;\n }\n if (e.key === '0' && !(e.target instanceof HTMLInputElement)) {\n setZoom(1); setPan({ x: 0, y: 0 });\n return;\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && sel && !editDoors && !(e.target instanceof HTMLInputElement)) {\n setRooms((prev) => prev.filter((r) => r.id !== sel));\n setDoors((prev) => prev.filter((d) => d.roomId !== sel));\n setSelectedId(null);\n }\n }\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n // ─── Zoom helpers ─────────────────────────────────────────────────────────\n\n function zoomBy(factor: number, currentZoom = zoom, currentPan = pan) {\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, currentZoom * factor));\n const cx = currentPan.x + CANVAS_W / currentZoom / 2;\n const cy = currentPan.y + CANVAS_H / currentZoom / 2;\n setPan({\n x: cx - CANVAS_W / newZoom / 2,\n y: cy - CANVAS_H / newZoom / 2,\n });\n setZoom(newZoom);\n }\n\n // ─── Drawing helpers ──────────────────────────────────────────────────────\n\n function svgPt(e: MouseEvent): Point | null {\n if (!svgRef.current) return null;\n return clientToSVG(e.clientX, e.clientY, svgRef.current);\n }\n\n // ─── Vertex / wall editing helpers ───────────────────────────────────────\n\n function nearestVertex(pt: Point, room: RoomData): { index: number; d: number } | null {\n let best: { index: number; d: number } | null = null;\n for (let i = 0; i < room.points.length; i++) {\n const d = dist(pt, room.points[i]);\n if (d <= VERTEX_HIT && (!best || d < best.d)) best = { index: i, d };\n }\n return best;\n }\n\n function nearestWallSegment(\n pt: Point,\n room: RoomData,\n ): { index: number; t: number; d: number } | null {\n let best: { index: number; t: number; d: number } | null = null;\n for (let i = 0; i < room.points.length; i++) {\n const a = room.points[i];\n const b = room.points[(i + 1) % room.points.length];\n const { dist: d, t } = pointToSegment(pt, a, b);\n if (d <= WALL_HIT && (!best || d < best.d)) best = { index: i, t, d };\n }\n return best;\n }\n\n function insertVertex(roomId: string, wallIndex: number, t: number, newPt: Point): number {\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== roomId) return r;\n const pts = [...r.points];\n pts.splice(wallIndex + 1, 0, newPt);\n return { ...r, points: pts };\n }),\n );\n setDoors((prev) =>\n prev.map((d) => {\n if (d.roomId !== roomId) return d;\n if (d.wallIndex === wallIndex) {\n if (d.t <= t) return { ...d, t: t > 0 ? d.t / t : 0 };\n return { ...d, wallIndex: wallIndex + 1, t: (d.t - t) / (1 - t) };\n }\n if (d.wallIndex > wallIndex) return { ...d, wallIndex: d.wallIndex + 1 };\n return d;\n }),\n );\n return wallIndex + 1;\n }\n\n function removeVertex(roomId: string, index: number) {\n const room = rooms.find((r) => r.id === roomId);\n if (!room || room.points.length <= 3) return;\n const n = room.points.length;\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== roomId) return r;\n return { ...r, points: r.points.filter((_, i) => i !== index) };\n }),\n );\n setDoors((prev) =>\n prev.map((d) => {\n if (d.roomId !== roomId) return d;\n const prevWall = (index - 1 + n) % n;\n if (d.wallIndex === prevWall || d.wallIndex === index) return { ...d, wallIndex: -1 };\n if (d.wallIndex > index) return { ...d, wallIndex: d.wallIndex - 1 };\n return d;\n }).filter((d) => d.wallIndex !== -1),\n );\n }\n\n // ─── Mouse events ─────────────────────────────────────────────────────────\n\n function handleMouseDown(e: MouseEvent<SVGSVGElement>) {\n // Middle mouse → pan\n if (e.button === 1) {\n e.preventDefault();\n const svg = svgRef.current;\n if (svg) {\n const rect = svg.getBoundingClientRect();\n panDragRef.current = {\n startClient: { x: e.clientX, y: e.clientY },\n origPan: { ...pan },\n scaleX: (CANVAS_W / zoom) / rect.width,\n scaleY: (CANVAS_H / zoom) / rect.height,\n };\n }\n return;\n }\n\n if (e.button !== 0) return;\n e.preventDefault();\n const pt = svgPt(e);\n if (!pt) return;\n\n // Door editing mode: click a wall to add a door\n if (editingDoorsForRoomId) {\n const editingRoom = rooms.find((r) => r.id === editingDoorsForRoomId);\n if (editingRoom) {\n const wall = nearestWall(pt, [editingRoom]);\n if (wall) {\n setDoors((prev) => [\n ...prev,\n { id: nextId('door'), roomId: wall.roomId, wallIndex: wall.wallIndex, t: wall.t, width: DOOR_WIDTH },\n ]);\n }\n }\n return;\n }\n\n if (tool === 'rect') {\n setRectStart(pt); setRectCursor(pt); return;\n }\n\n if (tool === 'polygon') {\n if (polyPoints.length >= 3 && dist(pt, polyPoints[0]) <= CLOSE_THRESHOLD) {\n commitPolygon(polyPoints);\n } else {\n setPolyPoints((prev) => [...prev, pt]);\n }\n return;\n }\n\n if (tool === 'select') {\n const selRoom = rooms.find((r) => r.id === selectedId) ?? null;\n\n if (selRoom) {\n const vh = nearestVertex(pt, selRoom);\n if (vh) {\n dragRef.current = { type: 'vertex', roomId: selRoom.id, index: vh.index, start: pt, origPt: selRoom.points[vh.index] };\n return;\n }\n }\n\n if (selRoom) {\n const wh = nearestWallSegment(pt, selRoom);\n if (wh) {\n const a = selRoom.points[wh.index];\n const b = selRoom.points[(wh.index + 1) % selRoom.points.length];\n const newPt = snapPt({ x: a.x + (b.x - a.x) * wh.t, y: a.y + (b.y - a.y) * wh.t });\n const insertedIndex = insertVertex(selRoom.id, wh.index, wh.t, newPt);\n dragRef.current = { type: 'vertex', roomId: selRoom.id, index: insertedIndex, start: pt, origPt: newPt };\n return;\n }\n }\n\n const clickedRoom = rooms.find((r) => pointInPolygon(pt, r.points));\n if (clickedRoom) {\n setSelectedId(clickedRoom.id);\n dragRef.current = { type: 'room', roomId: clickedRoom.id, start: pt, origPoints: [...clickedRoom.points] };\n return;\n }\n\n setSelectedId(null);\n }\n }\n\n function handleDoubleClick(e: MouseEvent<SVGSVGElement>) {\n if (tool !== 'select' || editingDoorsForRoomId) return;\n const pt = svgPt(e);\n if (!pt) return;\n const selRoom = rooms.find((r) => r.id === selectedId);\n if (!selRoom) return;\n const vh = nearestVertex(pt, selRoom);\n if (vh) { e.preventDefault(); removeVertex(selRoom.id, vh.index); }\n }\n\n function handleMouseMove(e: MouseEvent<SVGSVGElement>) {\n if (panDragRef.current) {\n const { startClient, origPan, scaleX, scaleY } = panDragRef.current;\n setPan({\n x: origPan.x - (e.clientX - startClient.x) * scaleX,\n y: origPan.y - (e.clientY - startClient.y) * scaleY,\n });\n return;\n }\n\n const pt = svgPt(e);\n if (!pt) return;\n\n if (doorDragRef.current && editingDoorsForRoomId) {\n const editRoom = rooms.find((r) => r.id === editingDoorsForRoomId);\n if (editRoom) {\n const wall = nearestWall(pt, [editRoom]);\n if (wall) {\n setDoors((prev) => prev.map((d) =>\n d.id === doorDragRef.current ? { ...d, wallIndex: wall.wallIndex, t: wall.t } : d\n ));\n }\n }\n return;\n }\n\n if (tool === 'rect' && rectStart) { setRectCursor(pt); return; }\n if (tool === 'polygon') { setPolyCursor(pt); return; }\n\n if (tool === 'select' && !editingDoorsForRoomId && dragRef.current) {\n const drag = dragRef.current;\n if (drag.type === 'vertex') {\n const dx = pt.x - drag.start.x;\n const dy = pt.y - drag.start.y;\n const moved = snapPt({ x: drag.origPt.x + dx, y: drag.origPt.y + dy });\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== drag.roomId) return r;\n const pts = [...r.points];\n pts[drag.index] = moved;\n return { ...r, points: pts };\n }),\n );\n } else {\n const dx = pt.x - drag.start.x;\n const dy = pt.y - drag.start.y;\n setRooms((prev) =>\n prev.map((r) =>\n r.id === drag.roomId\n ? { ...r, points: drag.origPoints.map((p) => ({ x: p.x + dx, y: p.y + dy })) }\n : r,\n ),\n );\n }\n }\n }\n\n function handleMouseUp(e: MouseEvent<SVGSVGElement>) {\n if (panDragRef.current) { panDragRef.current = null; return; }\n\n const pt = svgPt(e);\n if (!pt) return;\n\n if (tool === 'rect' && rectStart) {\n const x = Math.min(rectStart.x, pt.x);\n const y = Math.min(rectStart.y, pt.y);\n const w = Math.abs(pt.x - rectStart.x);\n const h = Math.abs(pt.y - rectStart.y);\n if (w >= GRID * 2 && h >= GRID * 2) {\n setRooms((prev) => [\n ...prev,\n { id: nextId('room'), name: `Room ${prev.length + 1}`, points: rectToPoints(x, y, w, h) },\n ]);\n }\n setRectStart(null); setRectCursor(null);\n }\n\n doorDragRef.current = null;\n dragRef.current = null;\n }\n\n // ─── Info bar handlers ────────────────────────────────────────────────────\n\n function handleRenameChange(value: string) {\n if (selectedId) setRooms((prev) => prev.map((r) => (r.id === selectedId ? { ...r, name: value } : r)));\n }\n\n function handleDoorWidthChange(doorId: string, value: string) {\n const w = parseFloat(value);\n if (isNaN(w) || w <= 0) return;\n setDoors((prev) => prev.map((d) => (d.id === doorId ? { ...d, width: w } : d)));\n }\n\n function handleDeleteRoom() {\n if (!selectedId) return;\n setRooms((prev) => prev.filter((r) => r.id !== selectedId));\n setDoors((prev) => prev.filter((d) => d.roomId !== selectedId));\n setEditingDoorsForRoomId(null);\n setSelectedId(null);\n }\n\n function handleDeleteDoor(doorId: string) {\n setDoors((prev) => prev.filter((d) => d.id !== doorId));\n }\n\n function switchTool(t: Tool) {\n setTool(t);\n setEditingDoorsForRoomId(null);\n setPolyPoints([]); setPolyCursor(null);\n setRectStart(null); setRectCursor(null);\n }\n\n function handleUploadChange(e: React.ChangeEvent<HTMLInputElement>) {\n const file = e.target.files?.[0];\n if (!file) return;\n e.target.value = '';\n const reader = new FileReader();\n reader.onload = (ev) => {\n const text = ev.target?.result;\n if (typeof text !== 'string') return;\n const loaded = parseSVGRooms(text);\n if (loaded.length === 0) return;\n const remapped = loaded.map((r) => ({ ...r, id: nextId('room') }));\n setRooms(remapped);\n setDoors([]);\n setSelectedId(null);\n setEditingDoorsForRoomId(null);\n setZoom(1);\n setPan({ x: 0, y: 0 });\n };\n reader.readAsText(file);\n }\n\n // ─── Derived values ───────────────────────────────────────────────────────\n\n const previewRect =\n tool === 'rect' && rectStart && rectCursor\n ? {\n x: Math.min(rectStart.x, rectCursor.x),\n y: Math.min(rectStart.y, rectCursor.y),\n w: Math.abs(rectCursor.x - rectStart.x),\n h: Math.abs(rectCursor.y - rectStart.y),\n }\n : null;\n\n const selectedRoom = selectedId ? (rooms.find((r) => r.id === selectedId) ?? null) : null;\n const editingRoom = editingDoorsForRoomId ? (rooms.find((r) => r.id === editingDoorsForRoomId) ?? null) : null;\n const editingRoomDoors = editingDoorsForRoomId ? doors.filter((d) => d.roomId === editingDoorsForRoomId) : [];\n\n const TOOLS = [\n { t: 'select' as Tool, icon: faHandPointer, label: 'Select & edit' },\n { t: 'rect' as Tool, icon: faSquare, label: 'Rectangle room' },\n { t: 'polygon' as Tool, icon: faDrawPolygon, label: 'Polygon room' },\n ] as const;\n\n const vw = CANVAS_W / zoom;\n const vh = CANVAS_H / zoom;\n\n const canvasCursor = editingDoorsForRoomId ? styles.roomDrawerCanvasDoor : tool === 'select' ? styles.roomDrawerCanvasSelect : undefined;\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n return (\n <div className={cx(styles.roomDrawer, className)}>\n {/* ── Toolbar ── */}\n <div className={styles.roomDrawerToolbar}>\n {TOOLS.map(({ t, icon, label }) => (\n <button\n key={t}\n title={label}\n className={cx(styles.roomDrawerToolbarBtn, t === tool && !editingDoorsForRoomId && styles.roomDrawerToolbarBtnActive)}\n onClick={() => switchTool(t)}\n >\n <FontAwesomeIcon icon={icon} />\n </button>\n ))}\n <div className={styles.roomDrawerToolbarSep} />\n <button title=\"Zoom in (+)\" className={styles.roomDrawerToolbarBtn} onClick={() => zoomBy(ZOOM_STEP)} disabled={zoom >= ZOOM_MAX}>\n <FontAwesomeIcon icon={faMagnifyingGlassPlus} />\n </button>\n <button\n title={`Reset zoom (0) — ${Math.round(zoom * 100)}%`}\n className={styles.roomDrawerToolbarZoomLabel}\n onClick={() => { setZoom(1); setPan({ x: 0, y: 0 }); }}\n >\n {Math.round(zoom * 100)}%\n </button>\n <button title=\"Zoom out (−)\" className={styles.roomDrawerToolbarBtn} onClick={() => zoomBy(1 / ZOOM_STEP)} disabled={zoom <= ZOOM_MIN}>\n <FontAwesomeIcon icon={faMagnifyingGlassMinus} />\n </button>\n <div className={styles.roomDrawerToolbarSep} />\n <button\n title=\"Upload SVG\"\n className={styles.roomDrawerToolbarBtn}\n onClick={() => uploadRef.current?.click()}\n >\n <FontAwesomeIcon icon={faUpload} />\n </button>\n <button\n title=\"Download SVG\"\n className={styles.roomDrawerToolbarBtn}\n onClick={() => downloadSVG(rooms, doors)}\n disabled={rooms.length === 0}\n >\n <FontAwesomeIcon icon={faDownload} />\n </button>\n <input ref={uploadRef} type=\"file\" accept=\".svg,image/svg+xml\" style={{ display: 'none' }} onChange={handleUploadChange} />\n </div>\n\n {/* ── SVG Canvas ── */}\n <svg\n ref={svgRef}\n className={cx(styles.roomDrawerCanvas, canvasCursor)}\n viewBox={`${pan.x} ${pan.y} ${vw} ${vh}`}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onDoubleClick={handleDoubleClick}\n >\n <defs>\n <pattern id=\"rd-grid\" width={GRID} height={GRID} patternUnits=\"userSpaceOnUse\">\n <path d={`M ${GRID} 0 L 0 0 0 ${GRID}`} fill=\"none\" className={styles.gridLine} />\n </pattern>\n </defs>\n <rect x={pan.x} y={pan.y} width={vw} height={vh} fill=\"url(#rd-grid)\" />\n\n {/* ── Rooms ── */}\n {rooms.map((room) => {\n const pts = room.points;\n const fillD = pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x},${p.y}`).join(' ') + ' Z';\n const wallSegs = buildWallSegments(pts, doors.filter((d) => d.roomId === room.id));\n const c = centroid(pts);\n const isSelected = selectedId === room.id;\n const isEditing = editingDoorsForRoomId === room.id;\n return (\n <g key={room.id}>\n <path d={fillD} className={cx(styles.roomFill, (isSelected || isEditing) && styles.roomFillSelected)} />\n {wallSegs.map((seg, si) => (\n <path key={si} d={seg} className={cx(styles.roomStroke, (isSelected || isEditing) && styles.roomStrokeSelected)} />\n ))}\n {room.name && (\n <text x={c.x} y={c.y} className={styles.roomText} textAnchor=\"middle\" dominantBaseline=\"middle\">\n {room.name}\n </text>\n )}\n </g>\n );\n })}\n\n {/* ── Door gap overlays — rendered after all rooms so they cut through adjacent walls ── */}\n {doors.map((door) => {\n const room = rooms.find((r) => r.id === door.roomId);\n if (!room) return null;\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return null;\n return (\n <line\n key={door.id}\n x1={ep.p1.x} y1={ep.p1.y}\n x2={ep.p2.x} y2={ep.p2.y}\n className={styles.doorGap}\n />\n );\n })}\n\n {/* ── Door markers (visible in door editing mode) ── */}\n {editingDoorsForRoomId && editingRoomDoors.map((door) => {\n const room = rooms.find((r) => r.id === door.roomId);\n if (!room) return null;\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return null;\n const mid = { x: (ep.p1.x + ep.p2.x) / 2, y: (ep.p1.y + ep.p2.y) / 2 };\n return (\n <circle\n key={door.id}\n cx={mid.x} cy={mid.y} r={2.5}\n className={styles.doorMarker}\n onMouseDown={(e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n doorDragRef.current = door.id;\n }}\n />\n );\n })}\n\n {/* ── Vertex handles ── */}\n {tool === 'select' && !editingDoorsForRoomId && selectedRoom &&\n selectedRoom.points.map((p, i) => (\n <circle key={i} cx={p.x} cy={p.y} r={3.5} className={styles.vertexHandle} />\n ))}\n\n {/* ── Rect preview ── */}\n {previewRect && (\n <rect x={previewRect.x} y={previewRect.y} width={previewRect.w} height={previewRect.h} className={styles.preview} />\n )}\n\n {/* ── Polygon preview ── */}\n {tool === 'polygon' && polyPoints.length > 0 && (\n <>\n <polyline\n points={[...polyPoints, polyCursor ?? polyPoints[polyPoints.length - 1]].map((p) => `${p.x},${p.y}`).join(' ')}\n className={styles.preview}\n />\n {polyPoints.length >= 3 && (\n <circle cx={polyPoints[0].x} cy={polyPoints[0].y} r={CLOSE_THRESHOLD / 2} className={styles.polyCloseTarget} />\n )}\n {polyPoints.map((p, i) => (\n <circle key={i} cx={p.x} cy={p.y} r={2} className={styles.polyVertex} />\n ))}\n </>\n )}\n </svg>\n\n {/* ── Room info bar ── */}\n {selectedRoom && !editingDoorsForRoomId && (\n <div className={styles.roomDrawerInfo}>\n <span className={styles.roomDrawerInfoLabel}>Name</span>\n <input\n className={styles.roomDrawerInfoInput}\n value={selectedRoom.name}\n onChange={(e) => handleRenameChange(e.target.value)}\n placeholder=\"Room name\"\n />\n <button\n className={styles.roomDrawerInfoDoorsBtn}\n onClick={() => setEditingDoorsForRoomId(selectedRoom.id)}\n title=\"Edit doors\"\n >\n <FontAwesomeIcon icon={faDoorOpen} />\n <span>{doors.filter((d) => d.roomId === selectedRoom.id).length}</span>\n </button>\n <button className={styles.roomDrawerInfoDelete} onClick={handleDeleteRoom} title=\"Delete room\">\n <FontAwesomeIcon icon={faTrash} />\n </button>\n </div>\n )}\n\n {/* ── Door editing panel ── */}\n {editingDoorsForRoomId && editingRoom && (\n <div className={styles.roomDrawerDoorPanel}>\n <div className={styles.roomDrawerDoorPanelHeader}>\n <FontAwesomeIcon icon={faDoorOpen} className={styles.roomDrawerDoorPanelIcon} />\n <span className={styles.roomDrawerDoorPanelTitle}>\n {editingRoom.name ? `Doors · ${editingRoom.name}` : 'Doors'}\n </span>\n <button\n className={styles.roomDrawerDoorPanelDone}\n onClick={() => setEditingDoorsForRoomId(null)}\n title=\"Done (Esc)\"\n >\n <FontAwesomeIcon icon={faCheck} />\n Done\n </button>\n </div>\n <div className={styles.roomDrawerDoorPanelList}>\n {editingRoomDoors.length === 0 && (\n <span className={styles.roomDrawerDoorPanelEmpty}>Click on a wall to add a door</span>\n )}\n {editingRoomDoors.map((door, i) => (\n <div key={door.id} className={styles.roomDrawerDoorPanelItem}>\n <span className={styles.roomDrawerDoorPanelLabel}>Door {i + 1}</span>\n <span className={styles.roomDrawerDoorPanelWidthLabel}>Width</span>\n <input\n className={styles.roomDrawerInfoInput}\n type=\"number\"\n min={1}\n value={door.width}\n onChange={(e) => handleDoorWidthChange(door.id, e.target.value)}\n />\n <button\n className={styles.roomDrawerInfoDelete}\n onClick={() => handleDeleteDoor(door.id)}\n title=\"Delete door\"\n >\n <FontAwesomeIcon icon={faTrash} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n <div className={styles.roomDrawerHint}>\n {editingDoorsForRoomId\n ? 'Click a wall to add a door · Adjust width or delete from the list · Done or Esc to finish'\n : `${TOOL_HINTS[tool]} · Scroll to zoom · Middle-drag to pan · 0 to reset`}\n </div>\n </div>\n );\n}\n",".roomViewer{\n &-container{\n &Loading {\n opacity: 0.4;\n pointer-events: none;\n }\n\n svg{\n stroke-width: 1px;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-opacity: 1;\n path {\n stroke: var(--primary-color);\n fill: transparent;\n }\n path[id=\"background\"] {\n stroke: none;\n fill: transparent;\n cursor: pointer;\n }\n *[id^=\"room\"] {\n cursor: pointer;\n }\n\n text{\n fill: var(--text-color);\n stroke: none;\n font-size: 5px;\n }\n }\n }\n\n &-active{\n stroke: #18f810 !important;\n fill: #20f81013 !important;\n path {\n stroke: #18f810 !important;\n fill: none !important;\n }\n path[id=\"background\"] {\n stroke: none !important;\n fill: #20f81013 !important;\n }\n }\n\n &-selected {\n stroke: #18f810 !important;\n path {\n stroke: #18f810 !important;\n fill: none !important;\n }\n path[id=\"background\"] {\n stroke: none !important;\n fill: #20f81013 !important;\n }\n\n text{\n stroke: none;\n fill: var(--text-color);\n }\n }\n\n &-tint {\n fill: #20f81013 !important;\n\n path{\n fill: #20f81013 !important;\n }\n\n text{\n stroke: none;\n fill: none;\n }\n }\n\n &-actions{\n display: flex;\n width: 100%;\n justify-content: center;\n gap: 8px;\n font-size: 16px;\n\n svg{\n cursor: pointer;\n }\n }\n\n &-header{\n margin-bottom: 4px;\n }\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faChevronLeft as leftIcon,\n faChevronRight as rightIcon,\n faLayerGroup as layerIcon,\n} from '@fortawesome/free-solid-svg-icons';\n\nimport styles from './roomViewer.module.pcss';\nimport type { RoomViewerProps } from './roomViewer.types';\n\nfunction RoomViewer({ data = [] }: RoomViewerProps) {\n const roomViewerRef = useRef<HTMLDivElement>(null);\n\n const [, setSelectedRoomId] = useState<string | null>(null);\n const [selectedDataId, setSelectedDataId] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const abortController = new AbortController();\n\n setSelectedRoomId(null);\n\n const container = roomViewerRef.current;\n\n if (selectedDataId > data.length - 1 || !container) {\n setIsLoading(false);\n return () => abortController.abort();\n }\n\n // useEffect fires after the DOM has been committed, so the SVG rendered\n // from data[selectedDataId].data is already in the container here.\n const rooms = container.querySelectorAll<Element>('[id^=\"room\"]');\n rooms.forEach((element) => {\n element.addEventListener(\n 'click',\n () => onRoomClicked(element.id, container),\n { signal: abortController.signal }\n );\n });\n setIsLoading(false);\n\n return () => abortController.abort();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, selectedDataId]);\n\n function onRoomClicked(roomId: string, container: Element) {\n const pureRoomId = roomId.substring(4);\n\n setSelectedRoomId((prevSelectedRoomId) => {\n if (pureRoomId === prevSelectedRoomId) return prevSelectedRoomId;\n\n const [use] = container.querySelectorAll<Element>('[id=\"use\"]');\n use?.setAttribute('href', `#${roomId}`);\n\n const [room] = container.querySelectorAll<Element>(`[id=\"${roomId}\"]`);\n\n if (prevSelectedRoomId) {\n const [prevRoom] = container.querySelectorAll<Element>(`[id=\"room${prevSelectedRoomId}\"]`);\n if (prevRoom) {\n prevRoom.classList.remove(styles.roomViewerSelected, styles.roomViewerTint);\n const [prevBackground] = prevRoom.querySelectorAll<Element>('[id=\"background\"]');\n if (prevBackground) prevBackground.classList.remove(styles.roomViewerTint);\n }\n }\n\n if (room) {\n room.classList.add(styles.roomViewerSelected);\n const [background] = room.querySelectorAll<Element>('[id=\"background\"]');\n (background ?? room).classList.add(styles.roomViewerTint);\n }\n\n return pureRoomId;\n });\n }\n\n function addToCurrentFloor(change: number) {\n setSelectedDataId((prev) => {\n const next = prev + change;\n if (next < 0 || next > data.length - 1) return prev;\n return next;\n });\n }\n\n const svgData = data[selectedDataId]?.data ?? null;\n\n return (\n <div className={styles.roomViewer} ref={roomViewerRef}>\n <h3 className={styles.roomViewerHeader}>{data[selectedDataId]?.label ?? ''}</h3>\n <div\n key={selectedDataId}\n className={cx(styles.roomViewerContainer, isLoading && styles.roomViewerContainerLoading)}\n >\n {svgData}\n </div>\n {data.length > 1 && (\n <div className={styles.roomViewerActions}>\n <FontAwesomeIcon icon={leftIcon} onClick={() => addToCurrentFloor(-1)} />\n <FontAwesomeIcon icon={layerIcon} />\n <FontAwesomeIcon icon={rightIcon} onClick={() => addToCurrentFloor(1)} />\n </div>\n )}\n </div>\n );\n}\n\nexport default RoomViewer;\n",".scrollbarProvider{\n display: contents;\n /* Firefox */\n * {\n scrollbar-width: thin;\n scrollbar-color: var(--background-accent-light) var(--background);\n }\n\n /* Chrome, Edge, and Safari */\n *::-webkit-scrollbar {\n width: 12px;\n }\n\n *::-webkit-scrollbar-track {\n background: transparent;\n }\n\n *::-webkit-scrollbar-thumb {\n background-color: var(--background-accent-light);\n border-radius: 10px;\n border: 3px solid var(--background);\n }\n}\n","import type { ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport styles from './scrollbarProvider.module.pcss';\n\ninterface Properties {\n className?: string | undefined;\n children?: React.ReactNode | undefined;\n};\n\nfunction ScrollbarProvider({\n className = undefined,\n children = undefined,\n}: Properties): ReactElement {\n return (\n <div className={cx(styles.scrollbarProvider, className)}>\n {children}\n </div>\n );\n}\n\nexport default ScrollbarProvider;\n","import ScrollbarProvider from './scrollbarProvider';\n\nexport default ScrollbarProvider;\n",".resultCount {\n margin: 6px 0 0;\n font-size: 12px;\n color: var(--text-dark);\n}\n","import { useEffect, useRef, type ReactElement } from 'react';\nimport Input from 'components/common/input';\nimport { InputType } from 'components/common/input/input.types';\nimport styles from './searchInput.module.pcss';\nimport type { SearchInputProps } from './searchInput.types';\n\n\nexport default function SearchInput({\n value,\n onChange,\n onDebounce,\n placeholder,\n label,\n debounceMs = 500,\n totalAmount,\n showAmount = true,\n className,\n width,\n ...rest\n}: SearchInputProps): ReactElement {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n }, []);\n\n function handleChange(val: unknown) {\n const str = val != null ? String(val) : '';\n const trimmed = str.trim() === '' ? '' : str;\n onChange(trimmed);\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => { onDebounce?.(trimmed); }, debounceMs);\n }\n\n const showCount = showAmount && typeof totalAmount === 'number' && !Number.isNaN(totalAmount);\n\n return (\n <div {...rest} className={className} style={width != null ? { width } : undefined}>\n <Input\n type={InputType.Search}\n label={label}\n placeholder={placeholder}\n value={value}\n onChange={handleChange}\n />\n {showCount && (\n <p className={styles.resultCount}>\n {totalAmount} {totalAmount === 1 ? 'result' : 'results'}\n </p>\n )}\n </div>\n );\n}\n",".stepper {\n display: flex;\n align-items: center;\n margin-bottom: 30px;\n user-select: none;\n\n &-clickable {\n cursor: pointer;\n }\n\n &-vertical {\n flex-flow: column;\n }\n\n &-connector {\n width: 50px;\n height: 1px;\n background-position: 0% 50%;\n transition: all 0.6s;\n background-size: 200% 200%;\n background-image: repeating-linear-gradient(\n 90deg,\n var(--primary-lighter) 0%,\n var(--primary-lighter) 50%,\n var(--primary-color) 50%,\n var(--primary-color) 100%\n );\n\n &-vertical {\n width: 3px;\n height: 100px;\n background-position: 0% 100%;\n background-image: repeating-linear-gradient(\n 0deg,\n var(--primary-lighter) 0%,\n var(--primary-lighter) 50%,\n var(--primary-color) 50%,\n var(--primary-color) 100%\n );\n }\n\n &-filled {\n background-position: -100% 0%;\n height: 3px;\n }\n }\n\n &-entry {\n width: 40px;\n height: 40px;\n box-sizing: border-box;\n border: 1px solid var(--primary-lighter);\n color: var(--primary-lighter);\n position: relative;\n border-radius: var(--default-border-radius);\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: inset 0px 0px 0px var(--primary-color);\n transform: none;\n transition: all 0.4s;\n\n &-active {\n border: 2px solid var(--primary-color);\n color: var(--primary-color);\n transform: scale3d(1.1, 1.1, 1);\n }\n\n &-done {\n box-shadow: inset 0px 0px 0px 30px var(--primary-color);\n transform: none;\n }\n\n &-number {\n stroke-dasharray: 5;\n stroke-dashoffset: 5;\n\n &-done {\n animation: 0.4s 0.2s forwards showCheckmark;\n }\n }\n\n @keyframes showCheckmark {\n from {\n stroke-dashoffset: 5;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n\n &-label {\n position: absolute;\n top: 45px;\n left: 0px;\n width: 140px;\n transform: translate(-50px);\n text-align: center;\n\n &-vertical {\n top: 0px;\n left: 100px;\n text-align: left;\n }\n }\n }\n}\n","import React from 'react';\nimport cx from 'classnames';\nimport styles from './stepper.module.pcss';\nimport InteractableDiv from '../interactableDiv';\nimport type { StepperProps, StepperStep } from './stepper.types';\n\nfunction Checkmark() {\n return (\n <svg\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"-0.2 -1.2 3.4 2\"\n height=\"20px\"\n width=\"20px\"\n >\n <path d=\"M 0 0 l 1 1 l 2 -2\" stroke=\"white\" strokeWidth=\"0.4\" fill=\"none\" />\n </svg>\n );\n}\n\nexport default function Stepper({\n steps = [],\n currentStep = 0,\n alignment = 'horizontal',\n onStepClicked = null,\n nonLinear = false,\n hideLabels = false,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: StepperProps) {\n const isVertical = alignment === 'vertical';\n\n return (\n <div\n {...rest}\n className={cx(styles.stepper, { [styles.stepperVertical]: isVertical }, classNames?.root, className)}\n style={{ ...slotStyles?.root, ...style }}\n >\n {steps.map((step: StepperStep, index: number) => {\n const isDone = index < currentStep;\n const isActive = index <= currentStep;\n // nonLinear: every step except the current one is clickable\n // linear: only completed steps are clickable\n const isClickable = !!onStepClicked && (nonLinear ? index !== currentStep : isDone);\n\n const entryClassName = cx(\n styles.stepperEntry,\n { [styles.stepperEntryActive]: isActive },\n { [styles.stepperEntryDone]: isDone },\n { [styles.stepperClickable]: isClickable },\n classNames?.entry\n );\n\n const entryContent = (\n <>\n <div\n className={cx(\n styles.stepperEntryNumber,\n { [styles.stepperEntryNumberDone]: isDone },\n classNames?.entryNumber\n )}\n style={slotStyles?.entryNumber}\n >\n {isDone ? <Checkmark /> : index + 1}\n </div>\n {!hideLabels && (\n <div\n className={cx(\n styles.stepperEntryLabel,\n { [styles.stepperEntryLabelVertical]: isVertical },\n classNames?.entryLabel\n )}\n style={slotStyles?.entryLabel}\n >\n {step.label}\n </div>\n )}\n </>\n );\n\n return (\n <React.Fragment key={index}>\n {isClickable ? (\n <InteractableDiv\n className={entryClassName}\n style={slotStyles?.entry}\n onClick={() => onStepClicked(index)}\n aria-current={index === currentStep ? 'step' : undefined}\n >\n {entryContent}\n </InteractableDiv>\n ) : (\n <div\n className={entryClassName}\n style={slotStyles?.entry}\n aria-current={index === currentStep ? 'step' : undefined}\n >\n {entryContent}\n </div>\n )}\n\n {index < steps.length - 1 && (\n <div\n className={cx(\n styles.stepperConnector,\n { [styles.stepperConnectorFilled]: isDone },\n { [styles.stepperConnectorVertical]: isVertical },\n classNames?.connector\n )}\n style={slotStyles?.connector}\n />\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n","const BASE_URL = 'https://tenor.googleapis.com/v2';\n\nexport interface TenorMediaFormat {\n url: string;\n dims: [number, number];\n size: number;\n}\n\nexport interface TenorResult {\n id: string;\n title: string;\n media_formats: {\n gif: TenorMediaFormat;\n tinygif: TenorMediaFormat;\n mediumgif: TenorMediaFormat;\n mp4: TenorMediaFormat;\n tinymp4: TenorMediaFormat;\n };\n tags: string[];\n url: string;\n}\n\ninterface SearchOptions {\n limit?: number;\n contentfilter?: 'off' | 'low' | 'medium' | 'high';\n pos?: string;\n}\n\nexport default class TenorService {\n private key: string;\n\n constructor(key: string) {\n this.key = key;\n }\n\n async search(\n query: string,\n options: SearchOptions = {},\n ): Promise<{ results: TenorResult[]; next: string }> {\n const params = new URLSearchParams({ q: query, key: this.key });\n if (options.limit != null) params.set('limit', String(options.limit));\n if (options.contentfilter != null) params.set('contentfilter', options.contentfilter);\n if (options.pos != null) params.set('pos', options.pos);\n\n const res = await fetch(`${BASE_URL}/search?${params}`);\n return res.json();\n }\n\n async searchSuggestions(query: string): Promise<{ results: string[] }> {\n const params = new URLSearchParams({ q: query, key: this.key });\n const res = await fetch(`${BASE_URL}/search_suggestions?${params}`);\n return res.json();\n }\n\n registerShare(query: string, id: string): void {\n const params = new URLSearchParams({ id, q: query, key: this.key });\n fetch(`${BASE_URL}/registershare?${params}`).catch(() => null);\n }\n}\n","\n.gifPreview {\n width: min(420px, 90vw);\n aspect-ratio: 1;\n display: flex;\n flex-wrap: wrap;\n overflow: hidden;\n --gif-preview-gap-size: 5px;\n gap: var(--gif-preview-gap-size);\n position: relative;\n justify-content: center;\n overflow: auto;\n\n &-image {\n background-position: center;\n background-size: cover;\n width: 100%;\n height: 100%;\n\n &-container {\n width: min(140px, 33.3%);\n aspect-ratio: 1;\n background: linear-gradient(\n 45deg,\n var(--primary-color) 10%,\n var(--primary-lighter),\n var(--primary-accent),\n var(--primary-color) 85%\n );\n background-size: 500% 500%;\n animation: gradientBottomLeftToTopRight 1s infinite linear;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n width: min(\n calc(140px - var(--gif-preview-gap-size)),\n calc(33.3% - var(--gif-preview-gap-size))\n );\n }\n }\n}\n","import cx from 'classnames';\nimport type { ReactElement, UIEvent } from 'react';\nimport InteractableDiv from 'components/common/interactableDiv';\nimport type { GifPreviewProps } from './gifPreview.types';\nimport styles from './gifPreview.module.pcss';\n\nexport default function GifPreview({\n className,\n previewItems = [],\n onSelect,\n onLoadAdditional,\n}: GifPreviewProps): ReactElement {\n function handleScroll(event: UIEvent<HTMLDivElement>) {\n const el = event.currentTarget;\n const loadAdditionalHeight = el.scrollHeight - el.clientHeight * 1.5;\n if (el.scrollTop >= loadAdditionalHeight) {\n onLoadAdditional?.();\n }\n }\n\n return (\n <>\n {previewItems.length > 0 && (\n <div className={cx(styles.gifPreview, className)} onScroll={handleScroll}>\n {previewItems.map((preview, index) => (\n <InteractableDiv\n key={`${preview.id}_${index}`}\n className={styles.gifPreviewImageContainer}\n onClick={() => onSelect?.(preview)}\n >\n <div\n className={styles.gifPreviewImage}\n style={{ backgroundImage: `url(${preview.media_formats.tinygif.url})` }}\n />\n </InteractableDiv>\n ))}\n </div>\n )}\n </>\n );\n}\n","\n.gifView {\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n\n img {\n max-width: 100%;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n }\n\n &-loading {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n background: linear-gradient(\n 45deg,\n var(--primary-color) 10%,\n var(--primary-lighter),\n var(--primary-accent),\n var(--primary-color) 85%\n );\n background-size: 500% 500%;\n animation: gradientBottomLeftToTopRight 1s infinite linear;\n border-radius: var(--default-border-radius);\n overflow: hidden;\n }\n}\n","import { useEffect, useState } from 'react';\nimport cx from 'classnames';\nimport type { ReactElement } from 'react';\nimport type { GifViewProps } from './gifView.types';\nimport styles from './gifView.module.pcss';\n\nexport default function GifView({ className, src = '' }: GifViewProps): ReactElement {\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n setIsLoading(true);\n }, [src]);\n\n return (\n <div className={cx(styles.gifView, className)}>\n <img className={styles.tenorPickerSelected} src={src} onLoad={() => setIsLoading(false)} />\n {isLoading && <div className={styles.gifViewLoading} />}\n </div>\n );\n}\n",".tenorPicker {\n &-selected {\n margin-top: 8px;\n }\n\n &-modal {\n &-content {\n display: flex;\n flex-flow: column;\n gap: var(--spacing-m);\n }\n }\n\n &-suggestions {\n &-container {\n max-width: 420px;\n }\n\n &-item {\n cursor: pointer;\n }\n }\n}\n","import { useMemo, useState } from 'react';\nimport cx from 'classnames';\nimport type { ReactElement, ReactNode } from 'react';\nimport TenorService from 'services/tenor.service';\nimport type { TenorResult } from 'services/tenor.service';\nimport SearchInput from '../searchInput';\nimport GifPreview from './components/gifPreview';\nimport FloatingMenu from '../floatingMenu';\nimport Button, { ButtonStyleType } from '../button';\nimport Modal from '../modal';\nimport Chip, { ChipContainer } from '../chip';\nimport GifView from './components/gifView';\nimport type { TenorPickerProps } from './tenorPicker.types';\nimport styles from './tenorPicker.module.pcss';\nimport actionButtonStyles from 'components/common/actionButtons/actionButtons.module.pcss';\nimport { Align } from '../floatingMenu/floatingMenu.types';\n\nexport default function TenorPicker({\n className,\n token = '',\n isModal = false,\n onSelect = () => undefined,\n selected = null,\n}: TenorPickerProps): ReactElement {\n const tenorService = useMemo(() => new TenorService(token), [token]);\n\n const [searchText, setSearchText] = useState('');\n const [currentPreviews, setCurrentPreviews] = useState<TenorResult[]>([]);\n const [currentSuggestions, setCurrentSuggestions] = useState<string[]>([]);\n const [lastNext, setLastNext] = useState<string | null>(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n async function searchFor(query: string) {\n setSearchText(query);\n if (!query.trim()) {\n setCurrentPreviews([]);\n setCurrentSuggestions([]);\n setLastNext(null);\n return;\n }\n const [{ results: searchResults = [], next = null }, { results: suggestionResults = [] }] =\n await Promise.all([\n tenorService.search(query, { limit: 18, contentfilter: 'medium' }),\n tenorService.searchSuggestions(query),\n ]);\n setCurrentPreviews(searchResults);\n setLastNext(next);\n setCurrentSuggestions(suggestionResults);\n }\n\n async function handleLoadAdditional() {\n const { results: searchResults = [], next = null } = await tenorService.search(searchText, {\n limit: 36,\n pos: lastNext ?? undefined,\n contentfilter: 'medium',\n });\n setLastNext(next);\n setCurrentPreviews((prev) => [...prev, ...searchResults]);\n }\n\n async function handlePreviewSelect(preview: TenorResult | null) {\n await onSelect(preview);\n setIsMenuOpen(false);\n if (preview) tenorService.registerShare(searchText, preview.id);\n }\n\n function renderSuggestions(): ReactNode {\n return (\n <ChipContainer inline className={styles.tenorPickerSuggestionsContainer}>\n {currentSuggestions.map((suggestion) => (\n <Chip\n className={styles.tenorPickerSuggestionsItem}\n key={suggestion}\n text={suggestion}\n onClick={() => searchFor(suggestion)}\n />\n ))}\n </ChipContainer>\n );\n }\n\n function renderPreviewPicker(): ReactNode {\n return (\n <GifPreview\n previewItems={currentPreviews}\n onSelect={handlePreviewSelect}\n onLoadAdditional={handleLoadAdditional}\n />\n );\n }\n\n function renderSearchInput(): ReactNode {\n return (\n <SearchInput\n label=\"Pick gif\"\n value={searchText}\n onDebounce={searchFor}\n onChange={setSearchText}\n />\n );\n }\n\n if (isModal) {\n return (\n <div className={cx(styles.tenorPicker, className)}>\n <div className={actionButtonStyles.actionButtons}>\n <Button onClick={() => setIsMenuOpen(true)}>Pick gif</Button>\n {selected && (\n <Button styleType={ButtonStyleType.Delete} onClick={() => handlePreviewSelect(null)}>\n Remove gif\n </Button>\n )}\n </div>\n {selected && <GifView className={styles.tenorPickerSelected} src={selected} />}\n <Modal isOpen={isMenuOpen} onClose={() => setIsMenuOpen(false)}>\n <div className={styles.tenorPickerModalContent}>\n {renderSearchInput()}\n {renderSuggestions()}\n {renderPreviewPicker()}\n </div>\n </Modal>\n </div>\n );\n }\n\n return (\n <div className={cx(styles.tenorPicker, className)}>\n <FloatingMenu\n align={Align.Left}\n isOpen={currentPreviews.length > 0 && isMenuOpen}\n onOpenChange={setIsMenuOpen}\n content={\n <>\n {renderSuggestions()}\n {renderPreviewPicker()}\n </>\n }\n >\n {renderSearchInput()}\n </FloatingMenu>\n {selected && (\n <Button styleType={ButtonStyleType.Delete} onClick={() => handlePreviewSelect(null)}>\n Remove gif\n </Button>\n )}\n {selected && <GifView className={styles.tenorPickerSelected} src={selected} />}\n </div>\n );\n}\n","import React from 'react';\nimport Input from 'components/common/input';\nimport type { TextareaProps } from './textarea.types';\n\nexport default function Textarea(props: TextareaProps) {\n return <Input {...props} multiline />;\n}\n","import type { Theme } from './theme.types';\n\n/**\n * Built-in default theme used by ThemeProvider when no `themes` prop is\n * supplied. Provides a complete set of CSS variables so the component\n * library renders correctly out of the box.\n */\nexport const defaultTheme: Theme = {\n id: 'default',\n variables: {\n '--grey': '#8A8A8A',\n '--lightgrey': '#e0e0e0',\n '--lightergrey': '#B1B1B1',\n '--white': '#FFFFFF',\n '--red': '#D6002A',\n '--lighter-red': '#ffeae9',\n '--green': '#287626',\n '--lighter-green': '#C4FFC9',\n '--blue': '#5873d5',\n '--lighter-blue': '#C6DBFF',\n '--black': 'black',\n '--orange': '#ff7f50',\n '--lighter-orange': '#ffe5d9',\n\n '--primary-color': '#8184d6',\n '--primary-accent': '#90CAF9',\n '--primary-lighter': '#9a9ce4',\n '--accent-color': 'var(--grey)',\n '--accent-color-light': 'var(--lightgrey)',\n\n '--text-color': 'var(--white)',\n '--text-dark': 'var(--lightergrey)',\n '--text-light': 'var(--lightergrey)',\n '--text-on-primary': 'var(--white)',\n '--text-on-delete': 'var(--white)',\n '--border-color': '#656574',\n\n '--background': '#393945',\n '--background-accent': '#33333c',\n '--background-accent-dark': 'var(--grey)',\n '--background-accent-light': '#484856',\n '--background-modal': '#484856',\n\n '--success-color': 'var(--green)',\n '--success-lighter': 'var(--lighter-green)',\n '--error-color': 'var(--red)',\n '--error-lighter': 'var(--lighter-red)',\n '--info-color': 'var(--blue)',\n '--info-lighter': 'var(--lighter-blue)',\n '--warn-color': 'var(--orange)',\n '--warn-lighter': 'var(--lighter-orange)',\n\n '--default-font-size': '14px',\n '--text-small-font-size': '12px',\n '--header-font-size': '24px',\n '--header-medium-font-size': '18px',\n '--header-small-font-size': '16px',\n\n '--default-font-weight': '400',\n '--header-font-weight': '600',\n\n '--input-background': 'transparent',\n '--input-icon-color': 'var(--text-color)',\n '--error-border-color': 'var(--red)',\n\n '--default-border-radius': '8px',\n '--padding-sides': '15px',\n '--margin-top': '10px',\n\n '--default-font': \"'Inter', sans-serif\",\n '--themed-font': \"'Inter', sans-serif\",\n\n '--card-shadow':\n '0 3px 1px -2px rgb(0 0 0 / 20%), 0 2px 2px 0 rgb(0 0 0 / 14%), 0 1px 5px 0 rgb(0 0 0 / 12%)',\n\n '--spacing-s': '4px',\n '--spacing-m': '8px',\n '--spacing-l': '16px',\n },\n};\n",".colorFade * {\n transition: background 0.3s ease-in-out;\n}\n","import React, { Component } from 'react';\n\nimport type { Theme } from './theme.types';\nimport { defaultTheme } from './defaultTheme';\nimport styles from './theme.module.pcss';\n\ninterface Props {\n children: React.ReactNode;\n themes?: Theme[];\n currentThemeId?: string;\n}\n\ninterface State {\n resolvedVariables: Record<string, string>;\n colorFadeActive: boolean;\n currentThemeColor: string | null;\n}\n\nclass ThemeProvider extends Component<Props, State> {\n state: State = {\n resolvedVariables: {},\n colorFadeActive: false,\n currentThemeColor: null,\n };\n\n private colorFadeTimeout: ReturnType<typeof setTimeout> | null = null;\n private wrapperRef = React.createRef<HTMLDivElement>();\n private themeColorMeta: HTMLMetaElement | null = null;\n private createdThemeColorMeta = false;\n\n componentDidMount() {\n this.applyTheme(this.props.currentThemeId);\n this.syncThemeColorMeta(this.state.currentThemeColor ?? '');\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n if (prevState.currentThemeColor !== this.state.currentThemeColor) {\n this.syncThemeColorMeta(this.state.currentThemeColor ?? '');\n }\n if (\n prevProps.currentThemeId !== this.props.currentThemeId ||\n prevProps.themes !== this.props.themes\n ) {\n this.applyTheme(this.props.currentThemeId);\n }\n }\n\n componentWillUnmount() {\n if (this.colorFadeTimeout) clearTimeout(this.colorFadeTimeout);\n // Only remove the meta tag if we created it; leave a host-app tag intact.\n if (this.createdThemeColorMeta) this.themeColorMeta?.remove();\n }\n\n /**\n * Replaces the former react-helmet usage: keep a single\n * <meta name=\"theme-color\"> in sync with the active theme's primary colour.\n * Reuses a tag the host app already declares; otherwise creates its own\n * (and removes it again on unmount).\n */\n private syncThemeColorMeta(color: string) {\n if (typeof document === 'undefined') return;\n\n if (!this.themeColorMeta) {\n const existing = document.head.querySelector<HTMLMetaElement>(\n 'meta[name=\"theme-color\"]',\n );\n if (existing) {\n this.themeColorMeta = existing;\n } else {\n const meta = document.createElement('meta');\n meta.setAttribute('name', 'theme-color');\n document.head.appendChild(meta);\n this.themeColorMeta = meta;\n this.createdThemeColorMeta = true;\n }\n }\n\n this.themeColorMeta.setAttribute('content', color);\n }\n\n /**\n * Resolves the full variable set for a given theme ID by walking up the\n * baseThemeId chain. Returns variables ordered from deepest ancestor to\n * the requested theme so callers can merge in order (later entries win).\n */\n private resolveChain(id: string): Record<string, string>[] {\n const themes = this.props.themes ?? [defaultTheme];\n const theme = themes.find((t) => t.id === id);\n if (!theme) return [];\n\n const parentVars = theme.baseThemeId ? this.resolveChain(theme.baseThemeId) : [];\n\n return [...parentVars, theme.variables as Record<string, string>];\n }\n\n private applyTheme = (currentThemeId: string | undefined) => {\n const themes = this.props.themes ?? [defaultTheme];\n\n // The root theme is the first theme without a baseThemeId.\n // It is always applied as the variable foundation.\n const rootTheme = themes.find((t) => !t.baseThemeId) ?? themes[0];\n const rootVars: Record<string, string> = rootTheme\n ? (rootTheme.variables as Record<string, string>)\n : {};\n\n // Resolve the selected theme's full inheritance chain.\n const selectedTheme = themes.find((t) => t.id === currentThemeId);\n const chainVars = selectedTheme ? this.resolveChain(selectedTheme.id) : [];\n\n // Merge: root foundation → ancestor chain → selected theme (each step overrides)\n const resolvedVariables = Object.assign({}, rootVars, ...chainVars);\n\n this.setState({ resolvedVariables, colorFadeActive: true });\n\n if (this.colorFadeTimeout) clearTimeout(this.colorFadeTimeout);\n this.colorFadeTimeout = setTimeout(() => {\n this.setState({ colorFadeActive: false });\n this.colorFadeTimeout = null;\n }, 500);\n\n // Read --primary-color after the new style is painted for the theme-color meta tag.\n setTimeout(() => {\n if (this.wrapperRef.current) {\n this.setState({\n currentThemeColor: getComputedStyle(this.wrapperRef.current)\n .getPropertyValue('--primary-color')\n .trim(),\n });\n }\n }, 1);\n };\n\n render() {\n const { children } = this.props;\n const { resolvedVariables, colorFadeActive } = this.state;\n\n return (\n <div\n ref={this.wrapperRef}\n id=\"themeProvider\"\n className={colorFadeActive ? styles.colorFade : undefined}\n style={resolvedVariables as React.CSSProperties}\n >\n {children}\n </div>\n );\n }\n}\n\nexport default ThemeProvider;\n","import { useState } from \"react\";\n\nexport function useTheme(defaultThemeId: string = 'default') {\n const [currentThemeId, setThemeId] = useState<string>(localStorage.getItem('theme') || defaultThemeId);\n\n const setCurrentThemeId = (themeId: string) => {\n setThemeId(themeId);\n localStorage.setItem('theme', themeId);\n };\n\n return { currentThemeId, setCurrentThemeId };\n}",".container {\n position: fixed;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n gap: 8px;\n pointer-events: none;\n padding: 16px;\n box-sizing: border-box;\n\n &-top-left {\n top: 0;\n left: 0;\n align-items: flex-start;\n }\n\n &-top-center {\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n align-items: center;\n }\n\n &-top-right {\n top: 0;\n right: 0;\n align-items: flex-end;\n }\n\n &-bottom-left {\n bottom: 0;\n left: 0;\n align-items: flex-start;\n flex-direction: column-reverse;\n }\n\n &-bottom-center {\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n align-items: center;\n flex-direction: column-reverse;\n }\n\n &-bottom-right {\n bottom: 0;\n right: 0;\n align-items: flex-end;\n flex-direction: column-reverse;\n }\n}\n\n.toast {\n pointer-events: all;\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n border-radius: var(--default-border-radius);\n background: var(--background-modal);\n color: var(--text-color);\n font-family: var(--default-font);\n box-shadow: var(--card-shadow);\n min-width: 240px;\n max-width: 380px;\n box-sizing: border-box;\n position: relative;\n overflow: hidden;\n animation: toastSlideDown 0.25s ease forwards;\n\n &-bottom {\n animation: toastSlideUp 0.25s ease forwards;\n }\n\n &-dismissing {\n animation: toastFadeOut 0.2s ease forwards;\n }\n\n &-info {\n border-left: 3px solid var(--info-color, #3b82f6);\n\n .toastIcon {\n color: var(--info-color, #3b82f6);\n }\n }\n\n &-error {\n border-left: 3px solid var(--error-color, #ef4444);\n\n .toastIcon {\n color: var(--error-color, #ef4444);\n }\n }\n\n &-warn {\n border-left: 3px solid var(--warn-color);\n\n .toastIcon {\n color: var(--warn-color);\n }\n }\n\n &-default {\n border-left: 3px solid var(--primary-color);\n\n .toastIcon {\n color: var(--primary-color);\n }\n }\n}\n\n.toastIcon {\n flex-shrink: 0;\n margin-top: 1px;\n font-size: 15px;\n}\n\n.toastContent {\n flex: 1;\n font-size: 14px;\n line-height: 1.4;\n}\n\n.toastCloseButton {\n flex-shrink: 0;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n color: var(--text-dark);\n font-size: 13px;\n opacity: 0.6;\n transition: opacity 0.15s;\n margin-top: 1px;\n\n &:hover {\n opacity: 1;\n }\n}\n\n.toastProgressBar {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 3px;\n width: 100%;\n background: currentColor;\n opacity: 0.35;\n transform-origin: left;\n animation: toastShrink var(--toast-duration) linear forwards;\n}\n\n@keyframes toastSlideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes toastSlideUp {\n from {\n opacity: 0;\n transform: translateY(12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes toastFadeOut {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.92);\n }\n}\n\n@keyframes toastShrink {\n from {\n transform: scaleX(1);\n }\n to {\n transform: scaleX(0);\n }\n}\n","import React, { useEffect } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faCircleInfo,\n faCircleXmark,\n faTriangleExclamation,\n faBell,\n faXmark,\n} from '@fortawesome/free-solid-svg-icons';\n\nimport styles from './toast.module.pcss';\nimport type { ToastItem } from './toast.types';\nimport ActionIcon from '../actionIcon';\n\ninterface ToastProps {\n item: ToastItem;\n isBottom: boolean;\n onDismiss: (id: string) => void;\n}\n\nconst typeIcons = {\n info: faCircleInfo,\n error: faCircleXmark,\n warn: faTriangleExclamation,\n default: faBell,\n};\n\nfunction Toast({ item, isBottom, onDismiss }: ToastProps) {\n const { id, content, options, dismissing } = item;\n const { duration, showRemainingTime, showCloseButton, type, classNames, styles: slotStyles } = options;\n\n useEffect(() => {\n if (duration === 0) return;\n const timer = setTimeout(() => onDismiss(id), duration);\n return () => clearTimeout(timer);\n }, [id, duration, onDismiss]);\n\n return (\n <div\n className={cx(\n styles.toast,\n isBottom ? styles.toastBottom : null,\n styles[`toast-${type}`],\n dismissing && styles.toastDismissing,\n classNames?.root,\n )}\n style={slotStyles?.root}\n >\n <FontAwesomeIcon\n icon={typeIcons[type]}\n className={cx(styles.toastIcon, classNames?.icon)}\n style={slotStyles?.icon as React.CSSProperties & Record<`--fa-font-${string}`, string>}\n />\n\n <div className={cx(styles.toastContent, classNames?.content)} style={slotStyles?.content}>\n {content}\n </div>\n\n {showCloseButton && (\n <ActionIcon\n icon={faXmark}\n onClick={() => onDismiss(id)}\n className={cx(styles.toastCloseButton, classNames?.closeButton)}\n style={slotStyles?.closeButton}\n aria-label=\"Close\"\n />\n )}\n\n {showRemainingTime && duration > 0 && (\n <div\n className={cx(styles.toastProgressBar, classNames?.progressBar)}\n style={{ '--toast-duration': `${duration}ms`, ...slotStyles?.progressBar } as React.CSSProperties}\n />\n )}\n </div>\n );\n}\n\nexport default Toast;\n","import type { ReactNode } from 'react';\nimport type { ToastOptions } from './toast.types';\n\ntype ShowToastFn = (content: ReactNode, options?: ToastOptions) => void;\n\nlet _handler: ShowToastFn | null = null;\n\nexport function _registerToastHandler(fn: ShowToastFn): void {\n _handler = fn;\n}\n\nexport function _unregisterToastHandler(): void {\n _handler = null;\n}\n\nexport function showToast(content: ReactNode, options?: ToastOptions): void {\n if (!_handler) {\n console.error('[Toast] No ToastProvider found. Wrap your app with <ToastProvider>.');\n return;\n }\n _handler(content, options);\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport cx from 'classnames';\nimport BodyEnd from 'components/common/bodyEnd';\n\nimport styles from './toast.module.pcss';\nimport Toast from './toast';\nimport { _registerToastHandler, _unregisterToastHandler } from './toastService';\nimport type { ToastContextConfig, ToastItem, ToastOptions, ResolvedToastOptions, ToastPosition } from './toast.types';\nimport type { ReactNode } from 'react';\n\nconst DEFAULTS: Required<ToastContextConfig> = {\n position: 'top-right',\n duration: 4000,\n showRemainingTime: true,\n showCloseButton: true,\n allowStacking: true,\n};\n\nconst DISMISS_ANIMATION_MS = 220;\n\nfunction positionToClass(position: ToastPosition): string {\n return styles[`container-${position}`];\n}\n\ninterface ToastProviderProps extends ToastContextConfig {\n children: ReactNode;\n}\n\nfunction ToastProvider({\n children,\n position = DEFAULTS.position,\n duration = DEFAULTS.duration,\n showRemainingTime = DEFAULTS.showRemainingTime,\n showCloseButton = DEFAULTS.showCloseButton,\n allowStacking = DEFAULTS.allowStacking,\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const counterRef = useRef(0);\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, dismissing: true } : t)),\n );\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, DISMISS_ANIMATION_MS);\n }, []);\n\n const addToast = useCallback(\n (content: ReactNode, options?: ToastOptions) => {\n const resolved: ResolvedToastOptions = {\n position: options?.position ?? position,\n duration: options?.duration ?? duration,\n showRemainingTime: options?.showRemainingTime ?? showRemainingTime,\n showCloseButton: options?.showCloseButton ?? showCloseButton,\n type: options?.type ?? 'default',\n classNames: options?.classNames,\n styles: options?.styles,\n };\n\n counterRef.current += 1;\n const id = `toast-${counterRef.current}`;\n const newToast: ToastItem = { id, content, options: resolved, dismissing: false };\n\n setToasts((prev) => {\n if (!allowStacking && prev.length > 0) {\n // Mark all existing as dismissing, then replace\n setTimeout(() => {\n setToasts([newToast]);\n }, DISMISS_ANIMATION_MS);\n return prev.map((t) => ({ ...t, dismissing: true }));\n }\n return [...prev, newToast];\n });\n },\n [position, duration, showRemainingTime, showCloseButton, allowStacking],\n );\n\n useEffect(() => {\n _registerToastHandler(addToast);\n return () => _unregisterToastHandler();\n }, [addToast]);\n\n // Group toasts by position so per-toast position overrides work correctly\n const byPosition = toasts.reduce<Record<string, ToastItem[]>>((acc, t) => {\n const pos = t.options.position;\n if (!acc[pos]) acc[pos] = [];\n acc[pos].push(t);\n return acc;\n }, {});\n\n return (\n <>\n {children}\n <BodyEnd>\n {Object.entries(byPosition).map(([pos, items]) => (\n <div\n key={pos}\n className={cx(styles.container, positionToClass(pos as typeof position))}\n >\n {items.map((item) => (\n <Toast\n key={item.id}\n item={item}\n isBottom={pos.startsWith('bottom')}\n onDismiss={dismiss}\n />\n ))}\n </div>\n ))}\n </BodyEnd>\n </>\n );\n}\n\nexport default ToastProvider;\nexport type { ToastProviderProps };\n",".virtualList {\n overflow-y: auto;\n box-sizing: border-box;\n color: var(--text-color);\n font-family: var(--default-font);\n\n &-header {\n display: grid;\n position: sticky;\n top: 0;\n z-index: 1;\n background: var(--background-accent);\n border-bottom: 1px solid var(--border-color);\n box-sizing: border-box;\n\n &-cell {\n padding: 8px 12px;\n font-weight: 600;\n font-size: 13px;\n color: var(--text-dark);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n box-sizing: border-box;\n }\n\n &-toggle {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 8px;\n color: var(--text-dark);\n display: flex;\n align-items: center;\n border-radius: var(--default-border-radius);\n transition: background 0.15s;\n\n &:hover {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n }\n }\n\n &-toggle {\n &-wrapper {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n padding: 0 4px;\n }\n\n &-popover {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n background: var(--background-accent);\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n box-shadow: var(--card-shadow);\n z-index: 10;\n min-width: 160px;\n padding: 4px 0;\n }\n\n &-item {\n padding: 4px 12px;\n white-space: nowrap;\n transition: background 0.1s;\n font-size: 14px;\n\n &:hover {\n background: var(--background-accent-light);\n }\n }\n }\n\n &-select-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n box-sizing: border-box;\n }\n\n &-body {\n position: relative;\n box-sizing: border-box;\n }\n\n &-row {\n border-bottom: 1px solid var(--border-color);\n box-sizing: border-box;\n cursor: pointer;\n transition: background 0.1s;\n\n &-no-divider {\n border-bottom: none;\n }\n\n &:hover {\n background: var(--background-accent-light);\n }\n\n &-selected {\n background: var(--primary-lighter);\n\n &:hover {\n background: var(--primary-lighter);\n }\n }\n }\n\n &-cell {\n padding: 8px 12px;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 14px;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n &-loading {\n &-full {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n }\n\n &-indicator {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 8px 0;\n }\n }\n\n &-spinner {\n width: 32px;\n height: 32px;\n }\n}\n","import React, { useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faGear } from '@fortawesome/free-solid-svg-icons';\n\nimport styles from './virtualList.module.pcss';\nimport SpinnerLoading from '../loading/spinnerLoading';\nimport Checkbox from '../checkbox';\nimport type { VirtualListProps, ColumnWidthSpec } from './virtualList.types';\n\n// ─── Pure utilities (exported for unit testing) ───────────────────────────────\n\nexport function buildOffsets(\n itemCount: number,\n heightsMap: Map<number, number>,\n estimatedRowHeight: number,\n rowGap = 0,\n): { offsets: number[]; totalHeight: number } {\n const offsets = new Array<number>(itemCount + 1);\n offsets[0] = 0;\n for (let i = 0; i < itemCount; i++) {\n const gap = i < itemCount - 1 ? rowGap : 0;\n offsets[i + 1] = offsets[i] + (heightsMap.get(i) ?? estimatedRowHeight) + gap;\n }\n return { offsets, totalHeight: offsets[itemCount] };\n}\n\nexport function getVisibleRange(\n offsets: number[],\n scrollTop: number,\n containerHeight: number,\n overscan: number,\n itemCount: number,\n): { startIndex: number; endIndex: number } {\n if (itemCount === 0) return { startIndex: 0, endIndex: -1 };\n\n let lo = 0;\n let hi = itemCount - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (offsets[mid + 1] <= scrollTop) lo = mid + 1;\n else hi = mid;\n }\n\n let end = lo;\n while (end < itemCount && offsets[end] < scrollTop + containerHeight) end++;\n\n return {\n startIndex: Math.max(0, lo - overscan),\n endIndex: Math.min(itemCount - 1, end + overscan - 1),\n };\n}\n\nexport function buildColumnTemplate(columns: { width: ColumnWidthSpec }[]): string {\n if (columns.length === 0) return '1fr';\n return columns\n .map((col) => {\n switch (col.width.type) {\n case 'fixed': return `${col.width.px}px`;\n case 'flex': return `${col.width.weight ?? 1}fr`;\n case 'fit': return 'fit-content(100%)';\n }\n })\n .join(' ');\n}\n\n// ─── Row sub-component ────────────────────────────────────────────────────────\n\ninterface VirtualRowProps {\n index: number;\n top: number;\n columnTemplate: string | undefined;\n isSelected: boolean;\n showDivider: boolean;\n onClick: () => void;\n onHeightChange: (index: number, height: number) => void;\n rowClassName?: string;\n rowStyle?: React.CSSProperties;\n children: React.ReactNode;\n}\n\nfunction VirtualRow({\n index,\n top,\n columnTemplate,\n isSelected,\n showDivider,\n onClick,\n onHeightChange,\n rowClassName,\n rowStyle,\n children,\n}: VirtualRowProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const observer = new ResizeObserver(() => onHeightChange(index, el.offsetHeight));\n observer.observe(el);\n return () => observer.unobserve(el);\n }, [index, onHeightChange]);\n\n return (\n <div\n ref={ref}\n className={cx(styles.virtualListRow, isSelected && styles.virtualListRowSelected, !showDivider && styles.virtualListRowNoDivider, rowClassName)}\n style={{\n position: 'absolute',\n top,\n left: 0,\n right: 0,\n ...(columnTemplate ? { display: 'grid', gridTemplateColumns: columnTemplate } : {}),\n ...rowStyle,\n }}\n onClick={onClick}\n aria-selected={isSelected}\n role=\"row\"\n >\n {children}\n </div>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nfunction VirtualList<T,>({\n items,\n renderRow,\n columns,\n height = '100%',\n estimatedRowHeight = 40,\n overscan = 3,\n rowGap = 0,\n selectedKey,\n getItemKey,\n onRowClick,\n visibleColumnKeys,\n onVisibleColumnsChange,\n showColumnToggle,\n onLoadMore,\n loadMoreThreshold = 100,\n isLoading = false,\n multiSelect = false,\n selectedKeys,\n onSelectionChange,\n showDivider = true,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: VirtualListProps<T>) {\n const [scrollTop, setScrollTop] = useState(0);\n const [containerHeight, setContainerHeight] = useState(0);\n const [heightsMap, setHeightsMap] = useState<Map<number, number>>(new Map());\n const [toggleOpen, setToggleOpen] = useState(false);\n const [showLoadMoreSpinner, setShowLoadMoreSpinner] = useState(false);\n const isLoadingMoreRef = useRef(false);\n\n const isSelectionControlled = selectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<Set<string | number>>(new Set());\n const effectiveSelectedKeys = isSelectionControlled ? selectedKeys! : internalSelectedKeys;\n\n const isControlled = visibleColumnKeys !== undefined;\n const [internalVisibleKeys, setInternalVisibleKeys] = useState<Set<string>>(() =>\n new Set((columns ?? []).filter((c) => !c.defaultHidden).map((c) => c.key)),\n );\n\n const effectiveVisible: Set<string> = isControlled\n ? new Set(visibleColumnKeys)\n : internalVisibleKeys;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const toggleRef = useRef<HTMLDivElement>(null);\n const prevHeightsRef = useRef<Map<number, number>>(new Map());\n const prevOffsetsRef = useRef<number[]>([]);\n\n useEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n const observer = new ResizeObserver(() => setContainerHeight(el.clientHeight));\n observer.observe(el);\n return () => observer.unobserve(el);\n }, []);\n\n useEffect(() => {\n if (!toggleOpen) return;\n function onMouseDown(e: MouseEvent) {\n if (toggleRef.current && !toggleRef.current.contains(e.target as Node)) {\n setToggleOpen(false);\n }\n }\n document.addEventListener('mousedown', onMouseDown);\n return () => document.removeEventListener('mousedown', onMouseDown);\n }, [toggleOpen]);\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n const el = e.currentTarget;\n setScrollTop(el.scrollTop);\n\n if (onLoadMore && !isLoadingMoreRef.current) {\n if (el.scrollTop + el.clientHeight >= el.scrollHeight - loadMoreThreshold) {\n isLoadingMoreRef.current = true;\n setShowLoadMoreSpinner(true);\n onLoadMore().finally(() => {\n isLoadingMoreRef.current = false;\n setShowLoadMoreSpinner(false);\n });\n }\n }\n }, [onLoadMore, loadMoreThreshold]);\n\n const handleHeightChange = useCallback((index: number, h: number) => {\n setHeightsMap((prev) => {\n if (prev.get(index) === h) return prev;\n const next = new Map(prev);\n next.set(index, h);\n return next;\n });\n }, []);\n\n const { offsets, totalHeight } = useMemo(\n () => buildOffsets(items.length, heightsMap, estimatedRowHeight, rowGap),\n [items.length, heightsMap, estimatedRowHeight, rowGap],\n );\n\n useLayoutEffect(() => {\n const el = rootRef.current;\n const prevOffsets = prevOffsetsRef.current;\n prevOffsetsRef.current = offsets;\n\n if (!el || el.scrollTop === 0 || prevOffsets.length === 0) {\n prevHeightsRef.current = heightsMap;\n return;\n }\n\n let correction = 0;\n for (const [idx, newH] of heightsMap) {\n const oldH = prevHeightsRef.current.get(idx) ?? estimatedRowHeight;\n if (newH !== oldH && prevOffsets[idx + 1] !== undefined && prevOffsets[idx + 1] <= el.scrollTop) {\n correction += newH - oldH;\n }\n }\n\n prevHeightsRef.current = heightsMap;\n\n if (correction !== 0) {\n el.scrollTop += correction;\n }\n }, [offsets, heightsMap, estimatedRowHeight]);\n\n const { startIndex, endIndex } = useMemo(\n () => getVisibleRange(offsets, scrollTop, containerHeight, overscan, items.length),\n [offsets, scrollTop, containerHeight, overscan, items.length],\n );\n\n const hasColumns = !!columns?.length;\n const visibleColumns = hasColumns\n ? columns!.filter((c) => effectiveVisible.has(c.key))\n : [];\n const selectPrefix = multiSelect && hasColumns ? '40px ' : '';\n const columnTemplate = hasColumns ? `${selectPrefix}${buildColumnTemplate(visibleColumns)}` : undefined;\n const shouldShowToggle = showColumnToggle !== false && hasColumns;\n\n function handleToggleColumn(key: string) {\n const next = new Set(effectiveVisible);\n if (next.has(key)) {\n if (next.size <= 1) return;\n next.delete(key);\n } else {\n next.add(key);\n }\n const nextArray = [...next];\n if (!isControlled) setInternalVisibleKeys(next);\n onVisibleColumnsChange?.(nextArray);\n }\n\n function getKey(item: T, index: number): string | number {\n return getItemKey ? getItemKey(item, index) : index;\n }\n\n function applySelection(next: Set<string | number>) {\n if (!isSelectionControlled) setInternalSelectedKeys(next);\n onSelectionChange?.(next);\n }\n\n function handleRowSelect(key: string | number) {\n const next = new Set(effectiveSelectedKeys);\n if (next.has(key)) next.delete(key); else next.add(key);\n applySelection(next);\n }\n\n function handleSelectAll() {\n const allKeys = items.map((item, i) => getKey(item, i));\n const allSelected = allKeys.every((k) => effectiveSelectedKeys.has(k));\n applySelection(allSelected ? new Set() : new Set(allKeys));\n }\n\n const allSelected = items.length > 0 && items.every((item, i) => effectiveSelectedKeys.has(getKey(item, i)));\n const someSelected = !allSelected && items.some((item, i) => effectiveSelectedKeys.has(getKey(item, i)));\n\n const visibleRows: React.ReactNode[] = [];\n for (let i = startIndex; i <= endIndex; i++) {\n const item = items[i];\n const key = getKey(item, i);\n const isSelected = (selectedKey != null && key === selectedKey) || effectiveSelectedKeys.has(key);\n\n visibleRows.push(\n <VirtualRow\n key={key}\n index={i}\n top={offsets[i]}\n columnTemplate={columnTemplate}\n isSelected={isSelected}\n showDivider={showDivider}\n onClick={() => onRowClick?.(item, i)}\n onHeightChange={handleHeightChange}\n rowClassName={classNames?.row}\n rowStyle={slotStyles?.row}\n >\n {hasColumns\n ? <>\n {multiSelect && (\n <div\n className={cx(styles.virtualListSelectCell, classNames?.selectCell)}\n style={slotStyles?.selectCell}\n role=\"gridcell\"\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n selected={effectiveSelectedKeys.has(key)}\n onToggle={() => handleRowSelect(key)}\n aria-label=\"Select row\"\n />\n </div>\n )}\n {visibleColumns.map((col) => (\n <div\n key={col.key}\n className={cx(styles.virtualListCell, classNames?.cell)}\n style={slotStyles?.cell}\n role=\"gridcell\"\n >\n {col.renderCell(item, i)}\n </div>\n ))}\n </>\n : renderRow?.(item, i)}\n </VirtualRow>,\n );\n }\n\n return (\n <div\n {...rest}\n ref={rootRef}\n className={cx(styles.virtualList, className, classNames?.root)}\n style={{ height, ...style, ...slotStyles?.root }}\n onScroll={handleScroll}\n role={hasColumns ? 'grid' : 'list'}\n >\n {hasColumns && (\n <div\n className={cx(styles.virtualListHeader, classNames?.header)}\n style={{ gridTemplateColumns: columnTemplate, ...(shouldShowToggle ? { paddingRight: 32 } : {}), ...slotStyles?.header }}\n role=\"row\"\n >\n {multiSelect && (\n <div\n className={cx(styles.virtualListSelectCell, classNames?.selectCell)}\n style={slotStyles?.selectCell}\n role=\"columnheader\"\n >\n <Checkbox\n selected={allSelected || someSelected}\n onToggle={handleSelectAll}\n aria-label=\"Select all rows\"\n />\n </div>\n )}\n {visibleColumns.map((col) => (\n <div\n key={col.key}\n className={cx(styles.virtualListHeaderCell, classNames?.headerCell)}\n style={slotStyles?.headerCell}\n role=\"columnheader\"\n >\n {col.label}\n </div>\n ))}\n {shouldShowToggle && (\n <div ref={toggleRef} className={styles.virtualListToggleWrapper}>\n <button\n type=\"button\"\n className={cx(styles.virtualListHeaderToggle, classNames?.headerToggle)}\n style={slotStyles?.headerToggle}\n onClick={() => setToggleOpen((v) => !v)}\n aria-label=\"Toggle column visibility\"\n >\n <FontAwesomeIcon\n icon={faGear}\n style={slotStyles?.headerToggle as React.CSSProperties & Record<`--fa-font-${string}`, string>}\n />\n </button>\n {toggleOpen && (\n <div\n className={cx(styles.virtualListTogglePopover, classNames?.togglePopover)}\n style={slotStyles?.togglePopover}\n >\n {columns!.map((col) => (\n <Checkbox\n key={col.key}\n className={cx(styles.virtualListToggleItem, classNames?.toggleItem)}\n style={slotStyles?.toggleItem}\n selected={effectiveVisible.has(col.key)}\n onToggle={() => handleToggleColumn(col.key)}\n cursorDefault={false}\n >\n {col.label}\n </Checkbox>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n {isLoading ? (\n <div className={styles.virtualListLoadingFull}>\n <SpinnerLoading className={styles.virtualListSpinner} />\n </div>\n ) : (\n <div\n className={cx(styles.virtualListBody, classNames?.body)}\n style={{ height: totalHeight, ...slotStyles?.body }}\n >\n {visibleRows}\n </div>\n )}\n {showLoadMoreSpinner && (\n <div\n className={cx(styles.virtualListLoadingIndicator, classNames?.loadingIndicator)}\n style={slotStyles?.loadingIndicator}\n >\n <SpinnerLoading className={styles.virtualListSpinner} />\n </div>\n )}\n </div>\n );\n}\n\nexport default VirtualList;\n",".wizard {\n height: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n transition: all 0.2s;\n padding: 1px;\n\n &-content {\n position: absolute;\n height: fit-content;\n\n &-outOfFrame {\n * {\n user-select: none;\n pointer-events: none;\n visibility: hidden;\n display: none;\n }\n }\n\n &-container {\n display: flex;\n transition: all 0.6s;\n position: relative;\n }\n }\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport cx from 'classnames';\nimport styles from './wizard.module.pcss';\nimport type { WizardProps } from './wizard.types';\n\nexport default function Wizard({\n currentStep = 0,\n stepCount = 0,\n renderStep = () => null,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: WizardProps) {\n const [height, setHeight] = useState<number | undefined>(undefined);\n const [showOtherContent, setShowOtherContent] = useState(false);\n const [prevStep, setPrevStep] = useState(currentStep);\n const stepRefs = useRef<(HTMLDivElement | null)[]>([]);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n\n // When currentStep changes, briefly show off-screen steps so they animate out.\n if (currentStep !== prevStep) {\n setPrevStep(currentStep);\n setShowOtherContent(true);\n }\n\n useEffect(() => {\n if (!showOtherContent) return;\n const id = setTimeout(() => setShowOtherContent(false), 400);\n return () => clearTimeout(id);\n }, [showOtherContent]);\n\n // Track the height of the active step via ResizeObserver.\n useEffect(() => {\n resizeObserverRef.current?.disconnect();\n const el = stepRefs.current[currentStep];\n if (!el) return;\n setHeight(el.clientHeight);\n resizeObserverRef.current = new ResizeObserver(() => {\n setHeight(el.clientHeight);\n });\n resizeObserverRef.current.observe(el);\n return () => resizeObserverRef.current?.disconnect();\n }, [currentStep, stepCount]);\n\n const rootStyle: React.CSSProperties = {\n ...(height !== undefined ? { height: `${height}px` } : {}),\n ...slotStyles?.root,\n ...style,\n };\n\n return (\n <div\n {...rest}\n className={cx(styles.wizard, classNames?.root, className)}\n style={rootStyle}\n >\n <div\n className={cx(styles.wizardContentContainer, classNames?.container)}\n style={{\n width: `${stepCount * 100}%`,\n marginLeft: `-${currentStep * 100}%`,\n ...slotStyles?.container,\n }}\n >\n {Array.from({ length: stepCount }, (_, index) => (\n <div\n key={`wizardStep${index}`}\n ref={(ref) => { stepRefs.current[index] = ref; }}\n className={cx(styles.wizardContent, classNames?.step)}\n style={{\n width: `${100 / stepCount}%`,\n marginLeft: `${(100 / stepCount) * index}%`,\n ...slotStyles?.step,\n }}\n >\n <div\n className={cx(\n { [styles.wizardContentOutOfFrame]: currentStep !== index && !showOtherContent },\n classNames?.stepContent\n )}\n style={slotStyles?.stepContent}\n inert={currentStep !== index ? true : undefined}\n >\n {renderStep(index)}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","// import polyglot from 'services/localization';\n\nimport type FormValidator from './formValidator';\nimport type { ValidationError, ErrorParser, UpdateListener } from './types';\n\n/** @internal */\nfunction defaultErrorParser(err: unknown): ValidationError[] {\n const e = err as { errors?: Record<string, string>[] };\n if (e?.errors && Array.isArray(e.errors)) {\n return e.errors.flatMap((errorObj) =>\n Object.entries(errorObj).map(([id, message]) => ({ id, message }))\n );\n }\n return [];\n}\n\nexport type FormGroup = Record<string, FormValidator<any>>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type FormValues = Record<string, unknown>;\n\nexport type InferGroupValues<TGroup extends FormGroup> = {\n [K in keyof TGroup]: TGroup[K] extends FormValidator<infer V> ? V : never;\n};\n\n/**\n * The submitted result type: TInitial with all group-field keys replaced by\n * their typed validator values.\n */\nexport type MergedValues<TInitial, TGroup extends FormGroup> =\n Omit<TInitial, keyof TGroup & string> & InferGroupValues<TGroup>;\n\nexport interface FormValidatorGroupOptions<\n TGroup extends FormGroup = FormGroup,\n TInitial = InferGroupValues<TGroup>\n> {\n initialValues?: TInitial;\n onSubmit?: (\n values: MergedValues<TInitial, TGroup>,\n group: FormValidatorGroup<TGroup, TInitial>\n ) => Promise<void> | void;\n onValidate?: (group: FormValidatorGroup<TGroup, TInitial>) => ValidationError | null | void;\n errorParser?: ErrorParser;\n onSubmitError?: (errors: ValidationError[]) => void;\n}\n\ninterface ComponentLike {\n forceUpdate: () => void;\n}\n\nexport default class FormValidatorGroup<\n TGroup extends FormGroup = FormGroup,\n TInitial = InferGroupValues<TGroup>\n> {\n #initialValues: TInitial;\n #isSubmitting: boolean = false;\n #debounceTimer: ReturnType<typeof setTimeout> | undefined;\n #valuesAfterCreation: FormValues;\n #updateListeners: UpdateListener[] = [];\n\n group: TGroup;\n component: ComponentLike | null;\n onSubmitCallback: (values: MergedValues<TInitial, TGroup>, group: FormValidatorGroup<TGroup, TInitial>) => Promise<void> | void;\n onValidateCallback: (group: FormValidatorGroup<TGroup, TInitial>) => ValidationError | null | void;\n errorParser: ErrorParser;\n onSubmitError: (errors: ValidationError[]) => void;\n submitCount: number;\n onDebounce: (values: MergedValues<TInitial, TGroup>) => void;\n onReset: (group: FormValidatorGroup<TGroup, TInitial>, valuesAfterCreation: FormValues, initialValues: TInitial) => void;\n\n /**\n * @param formValidatorGroup - Map of field name → FormValidator\n * @param component - Class component instance for forceUpdate (pass null when using hooks)\n * @param options - initialValues, onSubmit, onValidate, errorParser\n */\n constructor(\n formValidatorGroup: TGroup,\n component: ComponentLike | null = null,\n {\n initialValues,\n onSubmit = () => undefined,\n onValidate = () => undefined,\n errorParser = defaultErrorParser,\n onSubmitError = () => undefined,\n }: FormValidatorGroupOptions<TGroup, TInitial> = {}\n ) {\n this.group = formValidatorGroup;\n this.#initialValues = (initialValues ?? {}) as TInitial;\n this.#valuesAfterCreation = {};\n this.submitCount = 0;\n this.onDebounce = () => {};\n this.onReset = () => {};\n\n Object.keys(this.group).forEach((validatorKey) => {\n const currentValidator = this.group[validatorKey];\n const iv = this.#initialValues as FormValues;\n if (iv[validatorKey] !== undefined) {\n currentValidator.set(iv[validatorKey]);\n }\n this.#valuesAfterCreation[validatorKey] = currentValidator.value;\n this.group[validatorKey].registerOnUpdateListener(() => {\n this.#notifyListeners();\n this.submitCount = 0;\n if (this.#debounceTimer) clearTimeout(this.#debounceTimer);\n this.#debounceTimer = setTimeout(() => this.onDebounce(this.getValues()), 500);\n });\n });\n\n this.component = component;\n this.onSubmitCallback = onSubmit as typeof this.onSubmitCallback;\n this.onValidateCallback = onValidate as typeof this.onValidateCallback;\n this.errorParser = errorParser;\n this.onSubmitError = onSubmitError;\n this.setSubmitting(false);\n }\n\n get isSubmitting(): boolean { return this.#isSubmitting; }\n\n get wasTouched(): boolean {\n return Object.keys(this.group).some((key) => this.group[key].touched);\n }\n\n get isDirty(): boolean {\n return Object.keys(this.group).some((key) => this.group[key].dirty);\n }\n\n get hasErrors(): boolean {\n return Object.keys(this.group).some((key) => this.group[key].errors.length > 0);\n }\n\n get initialValues(): TInitial {\n return { ...this.#initialValues } as TInitial;\n }\n\n getFormError = (): ValidationError | null => {\n const groupKeys = Object.keys(this.group);\n for (let i = 0; i < groupKeys.length; i += 1) {\n const key = groupKeys[i];\n if (this.group[key].errors.length > 0) return this.group[key].errors[0];\n }\n return null;\n };\n\n set = (validatorName: keyof TGroup & string, value: unknown): this => {\n this.group[validatorName].set(value);\n return this;\n };\n\n reset = (toOverride: FormValues = {}): void => {\n this.submitCount = 0;\n const toOverrideKeys = Object.keys(toOverride);\n Object.keys(this.group).forEach((validatorKey) => {\n this.group[validatorKey].set(\n toOverrideKeys.includes(validatorKey)\n ? toOverride[validatorKey]\n : this.#valuesAfterCreation[validatorKey],\n false\n );\n });\n this.resetDirtyAndTouched();\n if (this.onReset) this.onReset(this, this.#valuesAfterCreation, this.#initialValues);\n };\n\n resetDirtyAndTouched = (): void => {\n Object.keys(this.group).forEach((key) => {\n this.group[key].dirty = false;\n this.group[key].touched = false;\n });\n };\n\n /**\n * Parses an API error and pushes field-level errors into the matching validators.\n * When field errors are found and isInternal is set, surfaces the first field message.\n * When the error shape isn't recognised (no field errors), always surfaces a generic message.\n */\n parseError = (err: unknown, isInternal: boolean = false): void => {\n const fieldErrors = this.errorParser(err);\n if (fieldErrors.length > 0) {\n fieldErrors.forEach(({ id, message }) => {\n if (this.group[id]) this.group[id].addError({ id, message });\n });\n if (isInternal) {\n this.onSubmitError(fieldErrors);\n }\n } else {\n this.onSubmitError([{ id: 'generic', message: 'An error occurred' }]);\n }\n };\n\n #notifyListeners = (): void => {\n if (this.component) this.component.forceUpdate();\n this.#updateListeners.forEach((cb) => cb());\n };\n\n registerOnUpdateListener = (callback: UpdateListener): void => {\n this.#updateListeners.push(callback);\n };\n\n removeOnUpdateListener = (callback: UpdateListener): void => {\n this.#updateListeners.splice(this.#updateListeners.indexOf(callback), 1);\n };\n\n setSubmitting = (isSubmitting: boolean): void => {\n if (this.#isSubmitting !== isSubmitting) {\n this.#isSubmitting = isSubmitting;\n this.#notifyListeners();\n }\n };\n\n submit = async (event?: Event | React.SyntheticEvent | null): Promise<void> => {\n if (event) {\n if ((event as Event).preventDefault) (event as Event).preventDefault();\n if ((event as Event).stopPropagation) (event as Event).stopPropagation();\n }\n this.setSubmitting(true);\n\n let customError: ValidationError | null | void = null;\n if (this.submitCount === 0) {\n customError = await Promise.resolve(this.validate());\n } else if (this.onValidateCallback) {\n customError = await Promise.resolve(this.onValidateCallback(this));\n }\n const currentError = this.getFormError() || customError;\n\n if (currentError) {\n this.setSubmitting(false);\n if (this.submitCount > -1) {\n this.onSubmitError([currentError]);\n }\n this.submitCount += 1;\n this.#notifyListeners();\n return;\n }\n\n try {\n await this.onSubmitCallback(this.getValues(), this);\n this.resetDirtyAndTouched();\n } catch (err) {\n this.parseError(err, true);\n }\n this.setSubmitting(false);\n this.#notifyListeners();\n this.submitCount += 1;\n };\n\n getValues = (): MergedValues<TInitial, TGroup> => {\n const retObj: FormValues = {};\n Object.keys(this.group).forEach((key) => {\n retObj[key] = this.group[key].value;\n });\n return { ...this.#initialValues, ...retObj } as MergedValues<TInitial, TGroup>;\n };\n\n validate = (): ValidationError | null | void => {\n Object.keys(this.group).forEach((validator) => {\n this.group[validator].validate();\n this.group[validator].touched = true;\n });\n if (this.onValidateCallback) return this.onValidateCallback(this);\n };\n\n setValidator = <K extends keyof TGroup & string>(validatorName: K, validator: TGroup[K]): this => {\n this.group[validatorName] = validator;\n return this;\n };\n}\n\n// Needed for the submit method's event type\nimport type React from 'react';\n","import React from 'react';\nimport type FormValidatorGroup from './formValidatorGroup';\n\n/**\n * Creates the Form component for a FormValidatorGroup instance.\n * Kept in a separate .tsx file so formValidatorGroup.ts stays framework-agnostic.\n */\nexport function createFormComponent(group: Pick<FormValidatorGroup, 'submit'>): React.FC<React.FormHTMLAttributes<HTMLFormElement>> {\n return function Form({ children, ...rest }) {\n return (\n <form onSubmit={group.submit} noValidate {...rest}>\n {children}\n </form>\n );\n };\n}\n","import { showToast } from 'components/common/toast';\nimport FormValidatorGroup from './formValidatorGroup';\nimport { createFormComponent } from './FormValidatorGroupForm';\nimport type { FormGroup, FormValidatorGroupOptions, InferGroupValues } from './formValidatorGroup';\nimport type { ValidationError } from './types';\nimport type React from 'react';\n\n/** Default onSubmitError: surface the first error as an error toast. Callers can override via options.onSubmitError. */\nconst defaultOnSubmitError = (errors: ValidationError[]): void => {\n showToast(errors[0].message, { type: 'error' });\n};\n\n/**\n * FormValidatorGroup with `this.Form` automatically attached.\n * Kept in a .tsx file so formValidatorGroup.ts stays framework-agnostic.\n *\n * This is the class you should use everywhere — it is a drop-in replacement\n * for FormValidatorGroup with one extra property: `this.Form`.\n *\n * Also injects the default toast-based onSubmitError so both hook and class-component\n * consumers surface errors out of the box; pass options.onSubmitError to override.\n */\nexport default class FormValidatorGroupWithForm<\n TGroup extends FormGroup = FormGroup,\n TInitial = InferGroupValues<TGroup>\n> extends FormValidatorGroup<TGroup, TInitial> {\n Form: React.FC<React.FormHTMLAttributes<HTMLFormElement>>;\n\n constructor(\n groupDef: TGroup,\n component: { forceUpdate: () => void } | null = null,\n options?: FormValidatorGroupOptions<TGroup, TInitial>\n ) {\n super(groupDef, component, { ...options, onSubmitError: options?.onSubmitError ?? defaultOnSubmitError });\n this.Form = createFormComponent(this);\n }\n}\n","import type { ValidatorFunction, ValidationError, UpdateListener } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default class FormValidator<T = any> {\n #value: T;\n #touched: boolean;\n #dirty: boolean;\n #errors: ValidationError[];\n #label: string;\n\n validators: ValidatorFunction[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onUpdateCallbacks: Array<(validator: FormValidator<any>) => void>;\n\n /**\n * Create a FormValidator to use standalone or inside a FormValidatorGroup.\n * @param initialValue - Default value of the field\n * @param validators - Array of validator functions\n */\n constructor(initialValue: T, validators?: ValidatorFunction[]) {\n this.#value = initialValue;\n this.validators = validators ?? [];\n this.#touched = false;\n this.#dirty = false;\n this.#errors = [];\n this.#label = '';\n this.onUpdateCallbacks = [];\n this.validate();\n }\n\n /** Whether the user has entered and left the field. */\n get touched(): boolean { return this.#touched; }\n set touched(value: boolean) { this.#touched = value; this.onUpdate(); }\n\n get label(): string { return this.#label; }\n set label(value: string) { this.#label = value; }\n\n /** Whether the user has changed the value since initialisation. */\n get dirty(): boolean { return this.#dirty; }\n set dirty(value: boolean) { this.#dirty = value; this.onUpdate(); }\n\n get value(): T { return this.#value; }\n /** Sets value without validation (use `set()` for validated updates). */\n set value(val: T) { this.#value = val; this.onUpdate(); }\n\n get errors(): ValidationError[] { return this.#errors; }\n\n addError = (error: ValidationError): void => {\n this.#errors.push(error);\n this.onUpdate();\n };\n\n removeErrors = (errorIds: string[]): void => {\n this.#errors = this.#errors.filter((error) => !errorIds.includes(error.id));\n this.onUpdate();\n };\n\n clearErrors = (): void => {\n this.#errors = [];\n this.onUpdate();\n };\n\n hasError = (error?: string): boolean => {\n if (!error && this.errors.length > 0) return true;\n return !!(this.errors.find((err) => err.id === error));\n };\n\n getCurrentErrorMessage = (): string | null => {\n if (this.errors.length === 0) return null;\n return this.errors[0].message;\n };\n\n validate = (): void => {\n this.clearErrors();\n this.validators.forEach((validator) => {\n const res = validator(this.value, this.label);\n if (res) this.addError(res);\n });\n };\n\n onUpdate = (): void => {\n this.onUpdateCallbacks.forEach((cb) => cb(this));\n };\n\n registerOnUpdateListener = (callback: UpdateListener): void => {\n this.onUpdateCallbacks.push(callback);\n };\n\n removeOnUpdateListener = (callback: UpdateListener): void => {\n this.onUpdateCallbacks.splice(this.onUpdateCallbacks.indexOf(callback), 1);\n };\n\n /**\n * Sets the field value with optional dirty tracking and re-validates.\n * @param newValue - New field value\n * @param wasUser - Whether the change was user-initiated (marks field dirty). Defaults to true.\n */\n set = (newValue: T, wasUser: boolean = true): this => {\n this.value = newValue;\n if (wasUser && !this.dirty) this.dirty = true;\n this.validate();\n return this;\n };\n}\n\nFormValidator.prototype.toString = function getValidatorValue() {\n return `${this.value}`;\n};\n","export function isNumber(string: string): boolean {\n return /^[0-9]+$/.test(string);\n}\n\nexport function isDate(string: string): boolean {\n return /^[0-9]{2}.[0-9]{2}.[0-9]{4}$/.test(string);\n}\n\nexport function isISODate(string: string): boolean {\n return /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$/.test(string);\n}\n\nexport function isEmail(string: string): boolean {\n return /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-ZöäüÜÖÄß\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(string);\n}\n\nexport function isBic(string: string): boolean {\n return /^[A-Z]{6}[A-Z\\d]{2}([A-Z\\d]{3})?$/.test(string);\n}\n\nexport function isURL(string: string): boolean {\n return /[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,63}(\\/[-a-zA-Z0-9@:%_+.~#?&//=]*)?$/.test(string);\n}\n\nexport function hasEightPasswordChars(string: string): boolean {\n return /^[\\w!@#$%^&*?±§~`'\"/\\\\[\\]{}\\-,.();:><+=|öäüÖÄÜß €μ]{8,}$/.test(string);\n}\n\nexport function hasOnePasswordLetter(string: string): boolean {\n return /^(?=.*[a-zöäüA-ZÖÄÜß])/.test(string);\n}\n\nexport function hasOnePasswordDigit(string: string): boolean {\n return /^(?=.*\\d)/.test(string);\n}\n\nexport function isPassword(string: string): boolean {\n return hasEightPasswordChars(string) && hasOnePasswordLetter(string) && hasOnePasswordDigit(string);\n}\n","import { isEmail, isDate, isISODate, isURL, isBic } from 'services/regexp';\nimport type { ValidatorFunction, ValidationError } from './types';\n\nconst polyglot = {\n t: (key: string, options?: Record<string, unknown>): string => {\n const translations: Record<string, string> = {\n 'formValidators.minLength': `Must be at least ${options?.min} characters long`,\n 'formValidators.maxLength': `Must be at most ${options?.max} characters long`,\n 'formValidators.email': 'Must be a valid email address',\n 'formValidators.required': `${options?.label || 'Value'} is required`,\n 'formValidators.value': 'Value',\n 'formValidators.mustBeNumber': 'Must be a number',\n 'formValidators.oneOf': `Must be one of the following values: ${options?.allowedValues}`,\n 'formValidators.typeOf': `Must have type of ${options?.allowedTypes}`,\n 'formValidators.multiEmail': 'Must be a comma or semicolon separated list of valid email addresses',\n 'formValidators.date': 'Must be a valid date',\n 'garages.errors.website': 'Must be a valid URL',\n 'garages.errors.bic': 'Must be a valid BIC',\n 'formValidators.minLetters': `Must contain at least ${options?.smart_count} letters`,\n 'formValidators.minDigits': `Must contain at least ${options?.smart_count} digits`,\n };\n return translations[key] || key;\n },\n};\n\nexport default class Validators {\n static minLength = (min: number, errorMsg?: string): ValidatorFunction => (value) => {\n if (!value || (value as string).length < min) return { id: 'minLength', message: errorMsg || polyglot.t('formValidators.minLength', { min }) };\n return null;\n };\n\n static maxLength = (max: number, errorMsg?: string): ValidatorFunction => (value) => {\n if (value && (value as string).length > max) return { id: 'maxLength', message: errorMsg || polyglot.t('formValidators.maxLength', { max }) };\n return null;\n };\n\n static email = (errorMsg?: string): ValidatorFunction => (value) => {\n if (value && !isEmail(value as string)) return { id: 'email', message: errorMsg || polyglot.t('formValidators.email') };\n return null;\n };\n\n static required = (errorMsg?: string): ValidatorFunction & { validatorId: string } => {\n function required(value: unknown, label?: string): ValidationError | null {\n if (!value && value !== 0) return { id: 'required', message: errorMsg || polyglot.t('formValidators.required', { label: label || polyglot.t('formValidators.value') }) };\n return null;\n }\n required.validatorId = 'required';\n return required;\n };\n\n static mustBeNumber = (errorMsg?: string): ValidatorFunction => (value) => {\n if (value && Number.isNaN(+(value as string))) return { id: 'mustBeNumber', message: errorMsg || polyglot.t('formValidators.mustBeNumber') };\n return null;\n };\n\n static oneOf = (allowedValues: unknown[], errorMsg?: string): ValidatorFunction => (value) => {\n if (value && !allowedValues.includes(value)) return { id: 'oneOf', message: errorMsg || polyglot.t('formValidators.oneOf', { allowedValues }) };\n return null;\n };\n\n static typeOf = (allowedTypes: string | string[], errorMsg?: string): ValidatorFunction => (value) => {\n if (Array.isArray(allowedTypes)) {\n for (let i = 0; i < allowedTypes.length; i += 1) {\n if (typeof value === allowedTypes[i]) return null;\n }\n } else if (typeof value === allowedTypes) {\n return null;\n }\n return { id: 'typeOf', message: errorMsg || `Must have type of ${allowedTypes}` };\n };\n\n static multiEmail = (errorMessage?: string): ValidatorFunction => (value) => {\n if (value) {\n const emailParts = (value as string).replace(/ /g, '').replace(/,/g, ';').split(';');\n for (let i = 0; i < emailParts.length; i += 1) {\n if (!isEmail(emailParts[i])) {\n return { id: 'multiEmail', message: errorMessage || polyglot.t('formValidators.multiEmail') };\n }\n }\n }\n return null;\n };\n\n static date = (errorMessage?: string): ValidatorFunction => (value) => {\n if (value && (!isDate(value as string) && !isISODate(value as string))) return { id: 'date', message: errorMessage || polyglot.t('formValidators.date') };\n return null;\n };\n\n static dateObject = (errorMessage?: string): ValidatorFunction => (value) => {\n if (value && !(value as { isValid: boolean }).isValid) return { id: 'date', message: errorMessage || polyglot.t('formValidators.date') };\n return null;\n };\n\n static website = (errorMsg?: string): ValidatorFunction => (value) => {\n if (value && !isURL(value as string)) return { id: 'website', message: errorMsg || polyglot.t('garages.errors.website') };\n return null;\n };\n\n static bic = (errorMsg?: string): ValidatorFunction => (value) => {\n if (value && !isBic(value as string)) return { id: 'bic', message: errorMsg || polyglot.t('garages.errors.bic') };\n return null;\n };\n\n static minLetters = (min: number, errorMsg?: string): ValidatorFunction => (value) => {\n if (value && (value as string).replace(/[^a-zöäüA-ZÖÄÜß]/g, '').length < min) return { id: 'minLetters', message: errorMsg || polyglot.t('formValidators.minLetters', { smart_count: min }) };\n return null;\n };\n\n static minDigits = (min: number, errorMsg?: string): ValidatorFunction => (value) => {\n if (value && (value as string).replace(/[\\D]/g, '').length < min) return { id: 'minDigits', message: errorMsg || polyglot.t('formValidators.minDigits', { smart_count: min }) };\n return null;\n };\n\n static password = (errorMsg?: string): ValidatorFunction => (value) => {\n const result = Validators.minLength(8)(value)\n || Validators.minLetters(1)(value)\n || Validators.minDigits(1)(value);\n if (result) return errorMsg ? { id: 'password', message: errorMsg } : result;\n return null;\n };\n}\n","/* eslint-disable react/no-unused-state */\nimport React, { PureComponent } from 'react';\nimport FormValidator from 'services/formValidation/formValidator';\nimport Tooltip from 'components/common/tooltip';\n\nexport interface ValidatableComponentProps {\n formValidator?: FormValidator | null;\n onMouseEnter?: ((event: React.MouseEvent) => void) | null;\n onMouseLeave?: ((event: React.MouseEvent) => void) | null;\n onFocus?: ((event: React.FocusEvent) => void) | null;\n onBlur?: ((event: React.FocusEvent) => void) | null;\n onChange?: ((value: unknown) => void) | null;\n errorMessage?: string;\n isValid?: boolean;\n isRequired?: boolean;\n label?: string;\n}\n\nexport interface ValidatableComponentState {\n isFocused: boolean;\n isHovered: boolean;\n}\n\n/**\n * Base class that extends PureComponent with FormValidator integration.\n * Manages hover/focus state and renders error tooltips.\n */\nexport default class ValidatableComponent<\n P extends ValidatableComponentProps = ValidatableComponentProps,\n S extends ValidatableComponentState = ValidatableComponentState,\n> extends PureComponent<P, S> {\n static defaultProps: Partial<ValidatableComponentProps> = {\n formValidator: null,\n onMouseEnter: null,\n onMouseLeave: null,\n onFocus: null,\n onBlur: null,\n onChange: null,\n errorMessage: '',\n isValid: false,\n isRequired: false,\n label: '',\n };\n\n constructor(props: P) {\n super(props);\n const { formValidator } = props;\n\n if (formValidator) {\n formValidator.label = props.label ?? '';\n formValidator.validate();\n formValidator.registerOnUpdateListener(() => { this.forceUpdate(); });\n }\n\n this.state = { isFocused: false, isHovered: false } as S;\n\n this.onMouseEnter = this.onMouseEnter.bind(this);\n this.onMouseLeave = this.onMouseLeave.bind(this);\n this.onFocus = this.onFocus.bind(this);\n this.onBlur = this.onBlur.bind(this);\n this.hasError = this.hasError.bind(this);\n this.renderTooltip = this.renderTooltip.bind(this);\n this.onChange = this.onChange.bind(this);\n }\n\n componentDidMount(): void {\n setTimeout(() => this.setState({ isFocused: false, isHovered: false } as S), 1);\n }\n\n componentDidUpdate(prevProps: P): void {\n const { formValidator } = this.props;\n if (prevProps.formValidator && formValidator && prevProps.formValidator !== formValidator) {\n formValidator.registerOnUpdateListener(() => { this.forceUpdate(); });\n }\n }\n\n onMouseEnter(event: React.MouseEvent): void {\n const { onMouseEnter } = this.props;\n this.setState({ isHovered: true } as unknown as S);\n if (onMouseEnter) onMouseEnter(event);\n }\n\n onMouseLeave(event: React.MouseEvent): void {\n const { onMouseLeave } = this.props;\n this.setState({ isHovered: false } as unknown as S);\n if (onMouseLeave) onMouseLeave(event);\n }\n\n onFocus(event: React.FocusEvent): void {\n const { onFocus } = this.props;\n this.setState({ isFocused: true } as unknown as S);\n if (onFocus) onFocus(event);\n }\n\n onBlur(event: React.FocusEvent): void {\n const { formValidator, onBlur } = this.props;\n if (formValidator) formValidator.touched = true;\n this.setState({ isFocused: false } as unknown as S);\n if (onBlur) onBlur(event);\n }\n\n hasError(): boolean {\n const { errorMessage, isValid, formValidator } = this.props;\n return formValidator\n ? (formValidator.touched && formValidator.hasError())\n : (!isValid || !!errorMessage);\n }\n\n isRequired(): boolean {\n const { isRequired, formValidator } = this.props;\n return !!(isRequired\n || (formValidator && formValidator.validators.find((v) => (v as { validatorId?: string }).validatorId === 'required')));\n }\n\n renderTooltip(): React.ReactNode {\n const { errorMessage, formValidator } = this.props;\n const { isHovered, isFocused } = this.state;\n return (\n <Tooltip\n variant=\"error\"\n message={formValidator ? formValidator.getCurrentErrorMessage() : (errorMessage || '')}\n isVisible={this.hasError() && (isFocused || isHovered)}\n />\n );\n }\n\n onChange(newVal: unknown): void {\n const { onChange, formValidator } = this.props;\n if (formValidator) {\n let extractedVal = newVal;\n if (newVal && (newVal as React.ChangeEvent<HTMLInputElement>).target) {\n extractedVal = (newVal as React.ChangeEvent<HTMLInputElement>).target.value;\n }\n formValidator.set(extractedVal);\n }\n if (onChange) onChange(newVal);\n }\n}\n","import { useEffect, useReducer } from 'react';\nimport type FormValidator from './formValidator';\n\n/**\n * Subscribes a function component to a FormValidator instance.\n * Triggers a re-render whenever value, errors, touched, or dirty changes.\n *\n * @param formValidator - The FormValidator instance to subscribe to (or null)\n * @returns The same formValidator for convenience\n */\nexport function useFormValidator<T extends FormValidator | null>(formValidator: T): T {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!formValidator) return;\n formValidator.registerOnUpdateListener(rerender);\n return () => formValidator.removeOnUpdateListener(rerender);\n }, [formValidator]);\n\n return formValidator;\n}\n","import { useEffect, useReducer, useRef } from 'react';\nimport FormValidatorGroup from './FormValidatorGroupWithForm';\nimport type { FormGroup, FormValidatorGroupOptions, InferGroupValues } from './formValidatorGroup';\n\n/**\n * Creates and subscribes a function component to a FormValidatorGroup.\n * Triggers a re-render whenever any field, submit state, or validation state changes.\n *\n * The group is created once on mount from the provided field map.\n * onSubmit / onValidate are kept fresh via refs — they always reflect the latest\n * closure without needing to be listed in effect dependencies.\n *\n * onSubmitError defaults to showing the message as an error toast (provided by FormValidatorGroupWithForm);\n * pass options.onSubmitError to override.\n *\n * @param groupDef - Map of field name → FormValidator instance\n * @param options - initialValues, onSubmit, onValidate, errorParser, onSubmitError\n *\n * @example\n * const form = useFormValidatorGroup(\n * { name: new FormValidator('', [Validators.required('Required')]) },\n * {\n * initialValues: { name: 'Jane' },\n * onSubmit: async (values) => save(values),\n * },\n * );\n */\nexport function useFormValidatorGroup<\nTGroup extends FormGroup = FormGroup,\nTInitial = InferGroupValues<TGroup>\n>(\n groupDef: TGroup,\n { initialValues, onSubmit, onValidate, errorParser, onSubmitError }: FormValidatorGroupOptions<TGroup, TInitial> = {}\n): FormValidatorGroup<TGroup, TInitial> {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n const groupRef = useRef<FormValidatorGroup<TGroup, TInitial> | null>(null);\n if (!groupRef.current) {\n groupRef.current = new FormValidatorGroup(groupDef, null, {\n initialValues,\n errorParser,\n onSubmitError,\n });\n }\n const group = groupRef.current;\n\n const onSubmitRef = useRef(onSubmit);\n const onValidateRef = useRef(onValidate);\n onSubmitRef.current = onSubmit;\n onValidateRef.current = onValidate;\n\n useEffect(() => {\n if (onSubmit !== undefined) {\n group.onSubmitCallback = (...args) => onSubmitRef.current?.(...args);\n }\n if (onValidate !== undefined) {\n group.onValidateCallback = (...args) => onValidateRef.current?.(...args);\n }\n group.registerOnUpdateListener(rerender);\n return () => group.removeOnUpdateListener(rerender);\n }, []);\n\n return group;\n}\n"],"mappings":"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"}
|