@smwb/ui-react 2.1.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/assets/styles/less/components/appBar/appBar.entry.css +1 -1
  2. package/dist/assets/styles/less/components/assetGrid/assetGrid.entry.css +1 -0
  3. package/dist/assets/styles/less/components/chipGroup/chipGroup.entry.css +1 -0
  4. package/dist/assets/styles/less/components/lazyImage/lazyImage.entry.css +1 -0
  5. package/dist/assets/styles/less/components/overflowMenu/overflowMenu.entry.css +1 -0
  6. package/dist/assets/styles/less/components/saveAssetDialog/saveAssetDialog.entry.css +1 -0
  7. package/dist/assets/styles/less/components/sheet/sheet.entry.css +1 -1
  8. package/dist/assets/styles/less/components/thumbCard/thumbCard.entry.css +1 -0
  9. package/dist/assets/styles/less/components/valueSlider/valueSlider.entry.css +1 -0
  10. package/dist/components/dataDisplay/assetGrid/assetGrid.d.ts +30 -0
  11. package/dist/components/dataDisplay/assetGrid/assetGrid.js +68 -0
  12. package/dist/components/dataDisplay/assetGrid/assetGrid.js.map +1 -0
  13. package/dist/components/dataDisplay/assetGrid/index.d.ts +2 -0
  14. package/dist/components/dataDisplay/chat/useChatStickToBottom.js +8 -7
  15. package/dist/components/dataDisplay/chat/useChatStickToBottom.js.map +1 -1
  16. package/dist/components/dataDisplay/chipGroup/chipGroup.d.ts +27 -0
  17. package/dist/components/dataDisplay/chipGroup/chipGroup.js +42 -0
  18. package/dist/components/dataDisplay/chipGroup/chipGroup.js.map +1 -0
  19. package/dist/components/dataDisplay/chipGroup/index.d.ts +2 -0
  20. package/dist/components/dataDisplay/lazyImage/index.d.ts +2 -0
  21. package/dist/components/dataDisplay/lazyImage/lazyImage.d.ts +22 -0
  22. package/dist/components/dataDisplay/lazyImage/lazyImage.js +52 -0
  23. package/dist/components/dataDisplay/lazyImage/lazyImage.js.map +1 -0
  24. package/dist/components/dataDisplay/thumbCard/index.d.ts +2 -0
  25. package/dist/components/dataDisplay/thumbCard/thumbCard.d.ts +29 -0
  26. package/dist/components/dataDisplay/thumbCard/thumbCard.js +82 -0
  27. package/dist/components/dataDisplay/thumbCard/thumbCard.js.map +1 -0
  28. package/dist/components/feedBack/saveAssetDialog/index.d.ts +2 -0
  29. package/dist/components/feedBack/saveAssetDialog/saveAssetDialog.d.ts +30 -0
  30. package/dist/components/feedBack/saveAssetDialog/saveAssetDialog.js +60 -0
  31. package/dist/components/feedBack/saveAssetDialog/saveAssetDialog.js.map +1 -0
  32. package/dist/components/inputs/valueSlider/index.d.ts +2 -0
  33. package/dist/components/inputs/valueSlider/valueSlider.d.ts +23 -0
  34. package/dist/components/inputs/valueSlider/valueSlider.js +55 -0
  35. package/dist/components/inputs/valueSlider/valueSlider.js.map +1 -0
  36. package/dist/components/navigation/overflowMenu/index.d.ts +2 -0
  37. package/dist/components/navigation/overflowMenu/overflowMenu.d.ts +27 -0
  38. package/dist/components/navigation/overflowMenu/overflowMenu.js +54 -0
  39. package/dist/components/navigation/overflowMenu/overflowMenu.js.map +1 -0
  40. package/dist/headless/components/dataDisplay/assetGrid/assetGrid.js +67 -0
  41. package/dist/headless/components/dataDisplay/assetGrid/assetGrid.js.map +1 -0
  42. package/dist/headless/components/dataDisplay/chat/useChatStickToBottom.js +8 -7
  43. package/dist/headless/components/dataDisplay/chat/useChatStickToBottom.js.map +1 -1
  44. package/dist/headless/components/dataDisplay/chipGroup/chipGroup.js +41 -0
  45. package/dist/headless/components/dataDisplay/chipGroup/chipGroup.js.map +1 -0
  46. package/dist/headless/components/dataDisplay/lazyImage/lazyImage.js +51 -0
  47. package/dist/headless/components/dataDisplay/lazyImage/lazyImage.js.map +1 -0
  48. package/dist/headless/components/dataDisplay/thumbCard/thumbCard.js +81 -0
  49. package/dist/headless/components/dataDisplay/thumbCard/thumbCard.js.map +1 -0
  50. package/dist/headless/components/feedBack/saveAssetDialog/saveAssetDialog.js +59 -0
  51. package/dist/headless/components/feedBack/saveAssetDialog/saveAssetDialog.js.map +1 -0
  52. package/dist/headless/components/inputs/valueSlider/valueSlider.js +54 -0
  53. package/dist/headless/components/inputs/valueSlider/valueSlider.js.map +1 -0
  54. package/dist/headless/components/navigation/overflowMenu/overflowMenu.js +53 -0
  55. package/dist/headless/components/navigation/overflowMenu/overflowMenu.js.map +1 -0
  56. package/dist/headless/hooks/useEventCallback.js +8 -7
  57. package/dist/headless/hooks/useEventCallback.js.map +1 -1
  58. package/dist/headless/hooks/useTheme.js +16 -15
  59. package/dist/headless/hooks/useTheme.js.map +1 -1
  60. package/dist/headless/index.js +240 -226
  61. package/dist/headless/index.js.map +1 -1
  62. package/dist/hooks/useEventCallback.js +8 -7
  63. package/dist/hooks/useEventCallback.js.map +1 -1
  64. package/dist/hooks/useTheme.js +16 -15
  65. package/dist/hooks/useTheme.js.map +1 -1
  66. package/dist/index.cjs +2 -2
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.ts +14 -0
  69. package/dist/index.js +240 -226
  70. package/dist/index.js.map +1 -1
  71. package/package.json +6 -4
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/utils/observable.ts","../src/hooks/useObservable.ts","../src/hooks/useTheme.ts","../src/hooks/useControllableState.ts","../src/hooks/useId.ts","../src/hooks/useFocusTrap.ts","../src/hooks/useRovingTabIndex.ts","../src/hooks/useVirtualList.ts","../src/components/base/icon/icon.tsx","../src/components/base/ripple/ripple.tsx","../src/utils/setRef.ts","../src/hooks/useForkRef.ts","../src/components/base/animateHeight/animateHeight.tsx","../src/components/dataDisplay/accordion/accordion.tsx","../src/components/inputs/button/button.tsx","../src/hooks/useSafeLayoutEffect.ts","../src/components/dataDisplay/expansionPanel/expansionPanel.tsx","../src/components/dataDisplay/chat/chatIconButton.tsx","../src/components/inputs/floatingButton/floatingButton.tsx","../src/components/inputs/textField/utils.ts","../src/components/inputs/textField/textFieldAdornment.tsx","../src/components/inputs/textField/textFieldWrapper.tsx","../src/components/inputs/textField/textField.tsx","../src/components/dataDisplay/chat/types.ts","../src/components/dataDisplay/chat/utils.ts","../src/components/dataDisplay/chat/chatComposer.tsx","../src/components/dataDisplay/chat/chatHeader.tsx","../src/components/dataDisplay/typography/typography.tsx","../src/components/dataDisplay/chat/chatAttachmentImage.tsx","../src/components/dataDisplay/chat/chatAttachments.tsx","../src/components/dataDisplay/avatar/avatar.tsx","../src/components/dataDisplay/chat/chatMessageAvatar.tsx","../src/components/dataDisplay/chat/chatMessageStatus.tsx","../src/components/dataDisplay/chat/chatMessageBubble.tsx","../src/components/dataDisplay/chat/chatMessageIncoming.tsx","../src/components/dataDisplay/chat/chatMessageOutgoing.tsx","../src/components/dataDisplay/chat/chatMessageSystem.tsx","../src/components/dataDisplay/chat/chatMessageItem.tsx","../src/components/feedBack/skeleton/skeleton.tsx","../src/components/dataDisplay/chat/chatMessageSkeleton.tsx","../src/components/dataDisplay/chat/useChatInfiniteScroll.ts","../src/components/dataDisplay/chat/useChatStickToBottom.ts","../src/components/dataDisplay/chat/chatMessages.tsx","../src/components/dataDisplay/chat/chatShell.tsx","../src/components/dataDisplay/chat/useChatFileUpload.ts","../src/components/dataDisplay/chat/chat.tsx","../src/components/dataDisplay/chat/chatLayout.tsx","../src/components/dataDisplay/badge/badge.tsx","../src/components/dataDisplay/card/card.tsx","../src/components/dataDisplay/chip/chip.tsx","../src/components/feedBack/modal/modal.tsx","../src/components/dataDisplay/carousel/utils.ts","../src/hooks/useEventCallback.ts","../src/components/dataDisplay/carousel/carousel.tsx","../src/hooks/useModalState.ts","../src/components/dataDisplay/imagesList/imagesListContext.tsx","../src/components/dataDisplay/imagesList/imagesListItem/imagesListItem.tsx","../src/components/dataDisplay/imagesList/imagesList.tsx","../src/components/dataDisplay/imagesList/imagesListItem/imagesListItemModal.tsx","../src/components/dataDisplay/list/listItem.tsx","../src/components/dataDisplay/list/list.tsx","../src/components/dataDisplay/table/tablePagination/tablePagination.tsx","../src/components/dataDisplay/table/table.tsx","../src/components/dataDisplay/table/tableBody.tsx","../src/components/dataDisplay/table/tableCell.tsx","../src/components/dataDisplay/table/tableHead.tsx","../src/components/dataDisplay/table/tableHeadCell.tsx","../src/components/dataDisplay/table/tableRow.tsx","../src/components/dataDisplay/treeView/treeView.tsx","../src/components/clickAwayListener/clickAwayListener.tsx","../src/components/feedBack/message/message.tsx","../src/components/feedBack/progressIndicator/progressIndicator.tsx","../src/components/feedBack/snackbar/useSnackbarsPortal.ts","../src/components/feedBack/snackbar/snackbar.tsx","../src/utils/floating.ts","../src/components/feedBack/tooltip/tooltip.tsx","../src/components/inputs/buttonGroups/buttonGroup.tsx","../src/components/inputs/checkbox/checkbox.tsx","../src/components/inputs/datePicker/datePickerIconButton.tsx","../src/components/inputs/datePicker/datePickerActionLabel.tsx","../src/components/inputs/datePicker/dateFormat.ts","../src/components/inputs/datePicker/utils.ts","../src/components/inputs/datePicker/dataPickerHeader.tsx","../src/components/inputs/datePicker/datePickerDay.tsx","../src/components/inputs/datePicker/dataPickerDays.tsx","../src/components/navigation/menu/menuContext.ts","../src/components/navigation/menu/menuItem.tsx","../src/components/navigation/menu/menuItemIcon.tsx","../src/components/navigation/menu/menuItemText.tsx","../src/components/navigation/menu/menuDivider.tsx","../src/components/navigation/menu/menuList.tsx","../src/components/navigation/menu/menuFloating.tsx","../src/components/navigation/menu/menuSubmenu.tsx","../src/components/navigation/menu/menuComponent.tsx","../src/components/navigation/menu/menu.tsx","../src/components/inputs/datePicker/datePickerList.tsx","../src/components/inputs/datePicker/useDateInput.ts","../src/components/inputs/datePicker/dataPickerInput.tsx","../src/components/inputs/datePicker/datePicker.tsx","../src/components/inputs/dateTimePicker/dateTimeFormat.ts","../src/components/inputs/dateTimePicker/useDateTimeInput.ts","../src/components/inputs/dateTimePicker/dateTimePickerInput.tsx","../src/components/inputs/timePicker/timePickerList.tsx","../src/components/inputs/timePicker/timeFormat.ts","../src/components/inputs/timePicker/timeUtils.ts","../src/components/inputs/timePicker/timePickerColumns.tsx","../src/components/inputs/dateTimePicker/dateTimePicker.tsx","../src/components/inputs/timePicker/useTimeInput.ts","../src/components/inputs/timePicker/timePickerInput.tsx","../src/components/inputs/timePicker/timePicker.tsx","../src/components/inputs/radioButton/radioButton.tsx","../src/components/inputs/rating/rating.tsx","../src/components/inputs/selectField/dropdownMenu.tsx","../src/components/inputs/selectField/selectField.tsx","../src/components/inputs/slider/utils.ts","../src/components/inputs/slider/slider.tsx","../src/components/inputs/toggle/toggle.tsx","../src/components/layout/grid/grid.tsx","../src/components/layout/divider/divider.tsx","../src/utils/throttle.ts","../src/components/layout/screenDivider/screenDivider.tsx","../src/components/layout/sheet/sheet.tsx","../src/components/layout/stack/stack.tsx","../src/components/layout/page/page.tsx","../src/components/layout/pageHeader/pageHeader.tsx","../src/components/layout/appLayout/appLayout.tsx","../src/components/navigation/appBar/appBar.tsx","../src/components/navigation/breadcrumbs/breadcrumbs.tsx","../src/components/navigation/pagination/pagination.tsx","../src/components/navigation/stepper/stepper.tsx","../src/components/navigation/sidebar/sidebar.tsx","../src/components/navigation/bottomBar/bottomBar.tsx","../src/utils/debounce.ts","../src/components/navigation/tabs/tab/tab.tsx","../src/utils/animate.ts","../src/components/navigation/tabs/tabs.tsx"],"sourcesContent":["export type Listener<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\n\nexport class Observable<T> {\n private cbs: Listener<T>[] = [];\n private _value: T;\n\n constructor(value: T) {\n this._value = value;\n }\n\n public setValue(value: T) {\n if (this.value === value) {\n return;\n }\n this._value = value;\n for (const cb of this.cbs) {\n cb(value);\n }\n }\n\n public get value(): T {\n return this._value;\n }\n\n public subscribe(cb: Listener<T>): Unsubscriber {\n this.cbs.push(cb);\n return () => {\n this.cbs = this.cbs.filter((l) => l !== cb);\n };\n }\n}\n","import { useState, useEffect } from \"react\";\nimport { Observable } from \"../utils/observable\";\nexport function useObservable<T>(observable: Observable<T>): T {\n const [val, setVal] = useState<T>(observable.value);\n useEffect(() => {\n setVal(observable.value);\n return observable.subscribe(setVal);\n }, [observable]);\n return val;\n}\n","import { useEffect, useLayoutEffect, useRef } from \"react\";\nimport { Observable } from \"../utils/observable\";\nimport { useObservable } from \"./useObservable\";\n\nexport enum Theme {\n dark = \"dark\",\n light = \"light\",\n}\n\nconst themeStorageKey = \"smui-theme\";\n\nconst themeObservable = new Observable<Theme>(Theme.light);\n\nconst useTheme = () => {\n const theme = useObservable(themeObservable);\n // Начальная инициализация\n const firstUpdate = useRef(true);\n useLayoutEffect(() => {\n const savedTheme = localStorage.getItem(themeStorageKey) as Theme;\n if (firstUpdate.current) {\n firstUpdate.current = false;\n if (savedTheme) {\n themeObservable.setValue(savedTheme);\n document.documentElement.dataset.theme = savedTheme;\n } else {\n const defaultTheme: Theme = window.matchMedia(\"(prefers-color-scheme: light)\").matches\n ? Theme.light\n : Theme.dark;\n if (savedTheme !== theme) {\n themeObservable.setValue(defaultTheme);\n }\n localStorage.setItem(themeStorageKey, defaultTheme);\n document.documentElement.dataset.theme = defaultTheme;\n }\n }\n }, [theme]);\n\n const themeListener = function (event: StorageEvent) {\n if (event.storageArea === localStorage) {\n const savedTheme = localStorage.getItem(themeStorageKey) as Theme;\n document.documentElement.dataset.theme = savedTheme;\n themeObservable.setValue(savedTheme);\n }\n };\n\n useEffect(() => {\n window.addEventListener(\"storage\", themeListener);\n return () => window.removeEventListener(\"storage\", themeListener);\n }, []);\n\n return {\n theme,\n setTheme: (value: Theme) => {\n localStorage.setItem(themeStorageKey, value);\n themeObservable.setValue.bind(themeObservable)(value);\n document.documentElement.dataset.theme = value;\n },\n };\n};\n\nexport default useTheme;\n","import { useCallback, useRef, useState } from \"react\";\n\ntype Updater<T> = T | ((prev: T) => T);\n\nexport interface UseControllableStateParams<T> {\n /** Controlled value. When defined the hook is in controlled mode. */\n value?: T;\n /** Initial value for uncontrolled mode. */\n defaultValue: T;\n /** Called whenever the value should change (both modes). */\n onChange?: (next: T) => void;\n}\n\n/**\n * Controlled/uncontrolled state helper.\n *\n * - If `value` is provided the hook is controlled: it always returns `value`\n * and `setValue` only calls `onChange`.\n * - Otherwise it keeps internal state seeded from `defaultValue` and also\n * calls `onChange`.\n *\n * @returns `[value, setValue]`\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateParams<T>): [T, (next: Updater<T>) => void] {\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<T>(defaultValue);\n\n const current = isControlled ? (value as T) : internal;\n\n // keep latest value / onChange without resubscribing consumers\n const currentRef = useRef(current);\n currentRef.current = current;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: Updater<T>) => {\n const prev = currentRef.current;\n const resolved = typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n onChangeRef.current?.(resolved);\n },\n [isControlled]\n );\n\n return [current, setValue];\n}\n\nexport default useControllableState;\n","import { useId as useReactId } from \"react\";\n\n/**\n * Stable unique id for ARIA wiring (label htmlFor, aria-describedby,\n * aria-controls, …). Wraps React 18's `useId` and:\n * - returns the caller-supplied `idProp` verbatim when provided, so an\n * explicit `id` always wins;\n * - otherwise produces a deterministic, SSR-safe id, optionally prefixed.\n */\nexport function useId(idProp?: string, prefix = \"smwb\"): string {\n const generated = useReactId();\n return idProp ?? `${prefix}-${generated.replace(/[:]/g, \"\")}`;\n}\n\nexport default useId;\n","import { RefObject, useEffect, useRef } from \"react\";\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nexport interface UseFocusTrapOptions {\n /** Trap is active only while true. */\n active: boolean;\n /** Restore focus to the previously focused element on deactivate. */\n restoreFocus?: boolean;\n /** Focus the first focusable element on activate. */\n autoFocus?: boolean;\n}\n\n/**\n * Confines Tab/Shift+Tab focus within `containerRef` while `active`.\n * Restores focus to the previously focused element on teardown.\n */\nexport function useFocusTrap<T extends HTMLElement>(\n containerRef: RefObject<T>,\n { active, restoreFocus = true, autoFocus = true }: UseFocusTrapOptions\n): void {\n const prevFocused = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!active) {\n return;\n }\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n prevFocused.current = document.activeElement as HTMLElement | null;\n\n const focusables = () =>\n Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.offsetParent !== null || el === document.activeElement\n );\n\n if (autoFocus) {\n const first = focusables()[0];\n (first ?? container).focus({ preventScroll: true });\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\") {\n return;\n }\n const items = focusables();\n if (items.length === 0) {\n event.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const activeEl = document.activeElement;\n\n if (event.shiftKey && activeEl === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && activeEl === last) {\n event.preventDefault();\n first.focus();\n } else if (!container.contains(activeEl)) {\n event.preventDefault();\n first.focus();\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n if (restoreFocus && prevFocused.current) {\n prevFocused.current.focus({ preventScroll: true });\n }\n };\n }, [active, autoFocus, restoreFocus, containerRef]);\n}\n\nexport default useFocusTrap;\n","import { KeyboardEvent, useCallback } from \"react\";\n\nexport interface UseRovingTabIndexOptions {\n /** Number of focusable items. */\n count: number;\n /** Current active index. */\n activeIndex: number;\n /** Called with the next index when navigation keys are pressed. */\n onMove: (nextIndex: number) => void;\n /** Arrow-key axis. */\n orientation?: \"horizontal\" | \"vertical\" | \"both\";\n /** Wrap around the ends (default true). */\n loop?: boolean;\n /** Optional predicate to skip disabled items. */\n isDisabled?: (index: number) => boolean;\n}\n\n/**\n * Keyboard navigation for composite widgets (tabs, menus, trees, pagination).\n * Returns an `onKeyDown` handler implementing Arrow/Home/End with optional\n * looping and disabled-skipping. The consumer owns focus/activation.\n */\nexport function useRovingTabIndex({\n count,\n activeIndex,\n onMove,\n orientation = \"horizontal\",\n loop = true,\n isDisabled,\n}: UseRovingTabIndexOptions) {\n return useCallback(\n (event: KeyboardEvent) => {\n if (count === 0) {\n return;\n }\n const horiz = orientation === \"horizontal\" || orientation === \"both\";\n const vert = orientation === \"vertical\" || orientation === \"both\";\n const next = (horiz && event.key === \"ArrowRight\") || (vert && event.key === \"ArrowDown\");\n const prev = (horiz && event.key === \"ArrowLeft\") || (vert && event.key === \"ArrowUp\");\n\n let target: number | null = null;\n if (next) {\n target = activeIndex + 1;\n } else if (prev) {\n target = activeIndex - 1;\n } else if (event.key === \"Home\") {\n target = 0;\n } else if (event.key === \"End\") {\n target = count - 1;\n }\n if (target === null) {\n return;\n }\n\n const clamp = (i: number) => (loop ? (i + count) % count : Math.max(0, Math.min(count - 1, i)));\n target = clamp(target);\n\n if (isDisabled) {\n let guard = 0;\n const step = next || event.key === \"Home\" ? 1 : -1;\n while (isDisabled(target) && guard < count) {\n target = clamp(target + step);\n guard += 1;\n }\n if (isDisabled(target)) {\n return;\n }\n }\n\n event.preventDefault();\n onMove(target);\n },\n [count, activeIndex, onMove, orientation, loop, isDisabled]\n );\n}\n\nexport default useRovingTabIndex;\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseVirtualListParams {\n /** Total number of items. */\n itemCount: number;\n /** Fixed height (px) of a single item. */\n itemHeight: number;\n /** Visible viewport height (px). */\n viewportHeight: number;\n /** Extra rows rendered above/below the viewport. */\n overscan?: number;\n}\n\nexport interface UseVirtualListResult {\n /** First (inclusive) index to render. */\n startIndex: number;\n /** Last (exclusive) index to render. */\n endIndex: number;\n /** Total scrollable height (px) for the spacer. */\n totalHeight: number;\n /** Pixel offset of the first rendered item (translateY). */\n offsetY: number;\n /** Attach to the scroll container's `onScroll`. */\n onScroll: (event: { currentTarget: { scrollTop: number } }) => void;\n}\n\n/**\n * Minimal fixed-height windowing helper (no dependencies).\n *\n * Render only `[startIndex, endIndex)` inside a `position: relative`\n * container of `totalHeight`, translated by `offsetY`.\n */\nexport function useVirtualList({\n itemCount,\n itemHeight,\n viewportHeight,\n overscan = 4,\n}: UseVirtualListParams): UseVirtualListResult {\n const [scrollTop, setScrollTop] = useState(0);\n\n const onScroll = useCallback((event: { currentTarget: { scrollTop: number } }) => {\n setScrollTop(event.currentTarget.scrollTop);\n }, []);\n\n return useMemo(() => {\n const safeItemHeight = itemHeight > 0 ? itemHeight : 1;\n const visibleCount = Math.ceil(viewportHeight / safeItemHeight);\n const startIndex = Math.max(0, Math.floor(scrollTop / safeItemHeight) - overscan);\n const endIndex = Math.min(itemCount, startIndex + visibleCount + overscan * 2);\n\n return {\n startIndex,\n endIndex,\n totalHeight: itemCount * safeItemHeight,\n offsetY: startIndex * safeItemHeight,\n onScroll,\n };\n }, [itemCount, itemHeight, viewportHeight, overscan, scrollTop, onScroll]);\n}\n\nexport default useVirtualList;\n","import { forwardRef, HTMLAttributes } from \"react\";\nimport cn from \"clsx\";\n\nexport type IconColor = \"inherit\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\" | \"disabled\";\n\nexport interface IconProps extends HTMLAttributes<HTMLSpanElement> {\n /**\n * Icon name from https://fonts.google.com/icons\n * Пример: name={\"arrow_right_alt\"}\n */\n name: string;\n className?: string;\n weight?: number;\n fill?: 0 | 1;\n /** Pixel number or any CSS length (e.g. \"1.5rem\"). */\n size?: number | string;\n grade?: number;\n /**\n * Semantic color token; `inherit` (default) keeps the text color.\n * Any string is accepted for backward compatibility, but only known\n * {@link IconColor} tokens emit a color class.\n */\n color?: IconColor | (string & {});\n /**\n * Accessible name. When provided the icon is exposed as\n * `role=\"img\"`; otherwise it is `aria-hidden` (decorative).\n */\n title?: string;\n}\n\nexport const Icon = forwardRef<HTMLSpanElement, IconProps>(function Icon(\n { className, weight = 400, fill = 0, size = 20, grade = 100, name, color = \"inherit\", title, ...props },\n ref\n) {\n const decorative = title === undefined;\n const colorClass =\n color && [\"primary\", \"secondary\", \"error\", \"success\", \"warning\", \"info\", \"disabled\"].includes(color)\n ? `smwb-icon_color-${color}`\n : null;\n return (\n <span\n {...props}\n ref={ref}\n data-testid=\"icon\"\n role={decorative ? undefined : \"img\"}\n aria-hidden={decorative ? true : undefined}\n aria-label={title}\n title={title}\n style={{ ...props.style, fontVariationSettings: `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' 48` }}\n className={cn(\"smwb-icon__wrapper\", colorClass, className)}\n >\n <span className=\"material-symbols-outlined\" style={{ fontSize: typeof size === \"number\" ? `${size}px` : size }}>\n {name}\n </span>\n </span>\n );\n});\n\nexport default Icon;\n","import React, { forwardRef } from \"react\";\nimport cn from \"clsx\";\n\nexport interface RippleActionsRef {\n onRipple: (event: React.MouseEvent) => void;\n}\n\nexport interface RippleClasses {\n ripple?: string;\n child?: string;\n}\n\nexport interface RippleProps extends React.HTMLAttributes<HTMLSpanElement> {\n actionRef: React.Ref<RippleActionsRef>;\n classes?: RippleClasses;\n center?: boolean;\n /** Ripple lifetime in ms. */\n duration?: number;\n /** Ripple color (any CSS color). Defaults to inherited currentColor. */\n color?: string;\n}\n\n/**\n * ⚠️ Для правильной работы этого эффекта, установите у компонента родителя CSS: **position: relative;**\n */\n\nexport const Ripple = forwardRef<HTMLSpanElement, RippleProps>(function Ripple(\n { actionRef, className, classes, center, style, duration = 600, color, ...rest },\n ref\n) {\n const [ripples, setRipples] = React.useState<React.ReactNode[]>([]);\n const nextKey = React.useRef<number>(0);\n\n React.useImperativeHandle(\n actionRef,\n () => ({\n onRipple(event: React.MouseEvent) {\n const target = event.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n const diameter = Math.max(rect.width, rect.height);\n const radius = diameter / 2;\n\n let coordX;\n let coordY;\n\n if (center) {\n coordX = rect.width > rect.height ? 0 : rect.width / 2 - radius;\n coordY = rect.height > rect.width ? 0 : rect.height / 2 - radius;\n } else {\n coordX = event.clientX - rect.left - radius;\n coordY = event.clientY - rect.top - radius;\n }\n\n setRipples([\n ...ripples,\n <span\n key={nextKey.current}\n className={cn(\"smwb-ripple__child\", classes?.child)}\n style={{\n ...style,\n left: coordX,\n top: coordY,\n width: diameter,\n height: diameter,\n backgroundColor: color ?? style?.backgroundColor,\n }}\n {...rest}\n />,\n ]);\n\n nextKey.current += 1;\n\n setTimeout(() => {\n setRipples((prevRipples) => prevRipples.slice(1));\n }, duration);\n },\n }),\n [rest, center, ripples, classes?.child, style, duration, color]\n );\n\n return (\n <span ref={ref} className={cn(\"smwb-ripple\", className, classes?.ripple)} data-testid=\"ripple\" aria-hidden=\"true\">\n {ripples}\n </span>\n );\n});\n","import React from \"react\";\n\nexport function setRef<T>(\n ref: React.MutableRefObject<T | null> | ((instance: T | null) => void) | null | undefined,\n value: T | null\n): void {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n","import React from \"react\";\nimport { setRef } from \"../utils/setRef\";\n\nexport function useForkRef<Instance>(\n ...refs: Array<React.Ref<Instance> | undefined>\n): React.RefCallback<Instance> | null {\n /**\n * This will create a new function if the refs passed to this hook change and are all defined.\n * This means react will call the old forkRef with `null` and the new forkRef\n * with the ref. Cleanup naturally emerges from this behavior.\n */\n return React.useMemo(() => {\n if (refs.every((ref) => ref == null)) {\n return null;\n }\n\n return (instance) => {\n refs.forEach((ref) => {\n setRef(ref, instance);\n });\n };\n // TODO need qualification\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n","// https://github.com/Stanko/react-animate-height/blob/v3/src/index.tsx\n// MIT License\n//\n// Copyright (c) 2017 - today Stanko Tadić\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n//\n\nimport React, { CSSProperties, forwardRef, useEffect, useRef, useState } from \"react\";\nimport classNames from \"clsx\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\n// ------------------ Types\n\nexport type Height = \"auto\" | number | `${number}%`;\ntype Timeout = ReturnType<typeof setTimeout>;\ntype Overflow = \"auto\" | \"visible\" | \"hidden\" | undefined;\ntype AnimationStateClasses = {\n animating: string;\n animatingUp: string;\n animatingDown: string;\n animatingToHeightZero: string;\n animatingToHeightAuto: string;\n animatingToHeightSpecific: string;\n static: string;\n staticHeightZero: string;\n staticHeightAuto: string;\n staticHeightSpecific: string;\n};\n\n// ------------------ Helpers\n\nfunction isNumber(n: string) {\n const number = parseFloat(n);\n return !isNaN(number) && isFinite(number);\n}\n\nfunction isPercentage(height: Height) {\n // Percentage height\n return (\n typeof height === \"string\" && height[height.length - 1] === \"%\" && isNumber(height.substring(0, height.length - 1))\n );\n}\n\nfunction hideContent(element: HTMLDivElement | null, height: Height) {\n // Check for element?.style is added cause this would fail in tests (react-test-renderer)\n // Read more here: https://github.com/Stanko/react-animate-height/issues/17\n if (height === 0 && element?.style) {\n element.style.display = \"none\";\n }\n}\n\nfunction showContent(element: HTMLDivElement | null, height: Height) {\n // Check for element?.style is added cause this would fail in tests (react-test-renderer)\n // Read more here: https://github.com/Stanko/react-animate-height/issues/17\n if (height === 0 && element?.style) {\n element.style.display = \"\";\n }\n}\n\nconst ANIMATION_STATE_CLASSES: AnimationStateClasses = {\n animating: \"rah-animating\",\n animatingUp: \"rah-animating--up\",\n animatingDown: \"rah-animating--down\",\n animatingToHeightZero: \"rah-animating--to-height-zero\",\n animatingToHeightAuto: \"rah-animating--to-height-auto\",\n animatingToHeightSpecific: \"rah-animating--to-height-specific\",\n static: \"rah-static\",\n staticHeightZero: \"rah-static--height-zero\",\n staticHeightAuto: \"rah-static--height-auto\",\n staticHeightSpecific: \"rah-static--height-specific\",\n};\n\nfunction getStaticStateClasses(animationStateClasses: AnimationStateClasses, height: Height) {\n return classNames({\n [animationStateClasses.static]: true,\n [animationStateClasses.staticHeightZero]: height === 0,\n [animationStateClasses.staticHeightSpecific]: typeof height === \"number\" && height > 0,\n [animationStateClasses.staticHeightAuto]: height === \"auto\",\n });\n}\n\n// ------------------ Component\n\n// display and height are set by the component itself, therefore ignored\ntype OmitCSSProperties = \"display\" | \"height\";\n\ninterface AnimateHeightProps extends React.HTMLAttributes<HTMLDivElement> {\n animateOpacity?: boolean;\n animationStateClasses?: AnimationStateClasses;\n applyInlineTransitions?: boolean;\n contentClassName?: string;\n delay?: number;\n duration?: number;\n easing?: string;\n height: Height;\n onHeightAnimationEnd?: (newHeight: Height) => void;\n onHeightAnimationStart?: (newHeight: Height) => void;\n style?: Omit<CSSProperties, OmitCSSProperties>;\n}\n\nconst AnimateHeight = forwardRef<HTMLDivElement, AnimateHeightProps>(function AnimateHeight(\n {\n animateOpacity = false,\n animationStateClasses = {},\n applyInlineTransitions = true,\n children,\n className = \"\",\n contentClassName,\n delay: userDelay = 0,\n duration: userDuration = 300,\n easing = \"ease\",\n height,\n onHeightAnimationEnd,\n onHeightAnimationStart,\n style,\n ...props\n },\n ref\n) {\n // ------------------ Initialization\n const prevHeight = useRef<Height>(height);\n const contentElement = useRef<HTMLDivElement>(null);\n const rootElement = useRef<HTMLDivElement>(null);\n const forkedRootRef = useForkRef<HTMLDivElement>(ref, rootElement);\n\n const animationClassesTimeoutID = useRef<Timeout>();\n const timeoutID = useRef<Timeout>();\n\n const stateClasses = useRef<AnimationStateClasses>({\n ...ANIMATION_STATE_CLASSES,\n ...animationStateClasses,\n });\n\n const delay = userDelay;\n const duration = userDuration;\n\n let initHeight: Height = height;\n let initOverflow: Overflow = \"visible\";\n\n if (typeof initHeight === \"number\") {\n // Reset negative height to 0\n initHeight = typeof height !== \"number\" || height < 0 ? 0 : height;\n initOverflow = \"hidden\";\n } else if (isPercentage(initHeight)) {\n // If value is string \"0%\" make sure we convert it to number 0\n initHeight = height === \"0%\" ? 0 : height;\n initOverflow = \"hidden\";\n }\n\n const [currentHeight, setCurrentHeight] = useState<Height>(initHeight);\n const [overflow, setOverflow] = useState<Overflow>(initOverflow);\n const [useTransitions, setUseTransitions] = useState<boolean>(false);\n const [animationStateClassNames, setAnimationStateClassNames] = useState<string>(\n getStaticStateClasses(stateClasses.current, height)\n );\n\n // ------------------ Did mount\n useEffect(() => {\n // Hide content if height is 0 (to prevent tabbing into it)\n hideContent(contentElement.current, currentHeight);\n\n // This should be explicitly run only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ------------------ Height update\n useEffect(() => {\n if (height !== prevHeight.current && contentElement.current) {\n showContent(contentElement.current, prevHeight.current);\n\n // Cache content height\n contentElement.current.style.overflow = \"hidden\";\n const contentHeight = contentElement.current.offsetHeight;\n contentElement.current.style.overflow = \"\";\n\n // set total animation time\n const totalDuration = duration + delay;\n\n let newHeight: Height;\n let timeoutHeight: Height;\n let timeoutOverflow: Overflow = \"hidden\";\n let timeoutUseTransitions: boolean;\n\n const isCurrentHeightAuto = prevHeight.current === \"auto\";\n\n if (typeof height === \"number\") {\n // Reset negative height to 0\n newHeight = height < 0 ? 0 : height;\n timeoutHeight = newHeight;\n } else if (isPercentage(height)) {\n // If value is string \"0%\" make sure we convert it to number 0\n newHeight = height === \"0%\" ? 0 : height;\n timeoutHeight = newHeight;\n } else {\n // If not, animate to content height\n // and then reset to auto\n newHeight = contentHeight; // TODO solve contentHeight = 0\n timeoutHeight = \"auto\";\n timeoutOverflow = undefined;\n }\n\n if (isCurrentHeightAuto) {\n // This is the height to be animated to\n timeoutHeight = newHeight;\n\n // If previous height was 'auto'\n // set starting height explicitly to be able to use transition\n newHeight = contentHeight;\n }\n\n // Animation classes\n const newAnimationStateClassNames = classNames({\n [stateClasses.current.animating]: true,\n [stateClasses.current.animatingUp]: prevHeight.current === \"auto\" || height < prevHeight.current,\n [stateClasses.current.animatingDown]: height === \"auto\" || height > prevHeight.current,\n [stateClasses.current.animatingToHeightZero]: timeoutHeight === 0,\n [stateClasses.current.animatingToHeightAuto]: timeoutHeight === \"auto\",\n [stateClasses.current.animatingToHeightSpecific]: typeof timeoutHeight === \"number\" && timeoutHeight > 0,\n });\n\n // Animation classes to be put after animation is complete\n const timeoutAnimationStateClasses = getStaticStateClasses(stateClasses.current, timeoutHeight);\n\n // Set starting height and animating classes\n // When animating from 'auto' we first need to set fixed height\n // that change should be animated\n setCurrentHeight(newHeight);\n setOverflow(\"hidden\");\n setUseTransitions(!isCurrentHeightAuto);\n setAnimationStateClassNames(newAnimationStateClassNames);\n\n // Clear timeouts\n clearTimeout(timeoutID.current);\n clearTimeout(animationClassesTimeoutID.current);\n\n if (isCurrentHeightAuto) {\n // When animating from 'auto' we use a short timeout to start animation\n // after setting fixed height above\n timeoutUseTransitions = true;\n\n // Short timeout to allow rendering of the initial animation state first\n timeoutID.current = setTimeout(() => {\n setCurrentHeight(timeoutHeight);\n setOverflow(timeoutOverflow);\n setUseTransitions(timeoutUseTransitions);\n\n // ANIMATION STARTS, run a callback if it exists\n onHeightAnimationStart?.(timeoutHeight);\n }, 50);\n\n // Set static classes and remove transitions when animation ends\n animationClassesTimeoutID.current = setTimeout(() => {\n setUseTransitions(false);\n setAnimationStateClassNames(timeoutAnimationStateClasses);\n\n // ANIMATION ENDS\n // Hide content if height is 0 (to prevent tabbing into it)\n hideContent(contentElement.current, timeoutHeight);\n // Run a callback if it exists\n onHeightAnimationEnd?.(timeoutHeight);\n }, totalDuration);\n } else {\n // ANIMATION STARTS, run a callback if it exists\n onHeightAnimationStart?.(newHeight);\n\n // Set end height, classes and remove transitions when animation is complete\n timeoutID.current = setTimeout(() => {\n setCurrentHeight(timeoutHeight);\n setOverflow(timeoutOverflow);\n setUseTransitions(false);\n setAnimationStateClassNames(timeoutAnimationStateClasses);\n\n // ANIMATION ENDS\n // If height is auto, don't hide the content\n // (case when element is empty, therefore height is 0)\n if (height !== \"auto\") {\n // Hide content if height is 0 (to prevent tabbing into it)\n hideContent(contentElement.current, newHeight); // TODO solve newHeight = 0\n }\n // Run a callback if it exists\n onHeightAnimationEnd?.(newHeight);\n }, totalDuration);\n }\n }\n\n prevHeight.current = height;\n\n return () => {\n clearTimeout(timeoutID.current);\n clearTimeout(animationClassesTimeoutID.current);\n };\n\n // This should be explicitly run only on height change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [height]);\n\n // ------------------ Render\n\n const componentStyle: CSSProperties = {\n ...style,\n height: currentHeight,\n overflow: overflow || style?.overflow,\n };\n\n if (useTransitions && applyInlineTransitions) {\n componentStyle.transition = `height ${duration}ms ${easing} ${delay}ms`;\n\n // Include transition passed through styles\n if (style?.transition) {\n componentStyle.transition = `${style.transition}, ${componentStyle.transition}`;\n }\n\n // Add webkit vendor prefix still used by opera, blackberry...\n componentStyle.WebkitTransition = componentStyle.transition;\n }\n\n const contentStyle: CSSProperties = {};\n\n if (animateOpacity) {\n contentStyle.transition = `opacity ${duration}ms ${easing} ${delay}ms`;\n // Add webkit vendor prefix still used by opera, blackberry...\n contentStyle.WebkitTransition = contentStyle.transition;\n\n if (currentHeight === 0) {\n contentStyle.opacity = 0;\n }\n }\n\n // Check if user passed aria-hidden prop\n const hasAriaHiddenProp = typeof props[\"aria-hidden\"] !== \"undefined\";\n const ariaHidden = hasAriaHiddenProp ? props[\"aria-hidden\"] : height === 0;\n\n return (\n <div\n {...props}\n ref={forkedRootRef}\n aria-hidden={ariaHidden}\n className={`${animationStateClassNames} ${className}`}\n style={componentStyle}\n >\n <div className={contentClassName} style={contentStyle} ref={contentElement}>\n {children}\n </div>\n </div>\n );\n});\n\nexport default AnimateHeight;\n","import React, { forwardRef, ReactNode, useState } from \"react\";\nimport cn from \"clsx\";\nimport AnimateHeight from \"../../base/animateHeight/animateHeight\";\nimport Icon from \"../../base/icon/icon\";\nimport { useId } from \"../../../hooks/useId\";\n\nexport interface AccordionProps {\n className?: string;\n title?: string;\n isOpenByDefault?: boolean;\n /** Controlled open state. When set, the component is controlled. */\n open?: boolean;\n /** Disable toggling. */\n disabled?: boolean;\n /** Custom expand icon (replaces the default chevron). */\n icon?: ReactNode;\n id?: string;\n children?: React.ReactNode;\n startAdornment?: (isOpen: boolean) => React.ReactNode;\n noIcon?: boolean;\n onToggleClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n /** Fired with the next open state on toggle. */\n onChange?: (open: boolean) => void;\n}\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(function Accordion(\n {\n className,\n title,\n isOpenByDefault = false,\n open,\n disabled,\n icon,\n id: idProp,\n children,\n startAdornment,\n noIcon,\n onToggleClick,\n onChange,\n },\n ref\n) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(isOpenByDefault);\n const isOpen = isControlled ? !!open : internalOpen;\n const baseId = useId(idProp);\n const contentId = `${baseId}-content`;\n const headerId = `${baseId}-header`;\n\n const arrowIconClasses = cn(\"smwb-accordion__arrow-icon\", { \"smwb-accordion__arrow-icon_opened\": isOpen });\n\n const toggle = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (disabled) {\n return;\n }\n const next = !isOpen;\n if (!isControlled) {\n setInternalOpen(next);\n }\n onChange?.(next);\n onToggleClick?.(e);\n };\n\n return (\n <div ref={ref} className={cn(\"smwb-accordion\", { \"smwb-disabled\": disabled }, className)} data-testid=\"accordion\">\n <button\n id={headerId}\n className=\"smwb-accordion__header\"\n onClick={toggle}\n type=\"button\"\n disabled={disabled}\n aria-expanded={isOpen}\n aria-controls={children ? contentId : undefined}\n >\n {startAdornment?.(isOpen)}\n <span className=\"smwb-accordion__title\">{title}</span>\n {!noIcon && (icon ?? <Icon className={arrowIconClasses} name=\"expand_more\" size={24} />)}\n </button>\n\n {children && (\n <div id={contentId} role=\"region\" aria-labelledby={headerId}>\n <AnimateHeight\n height={isOpen ? \"auto\" : 0}\n animateOpacity={true}\n duration={300}\n className=\"smwb-accordion__content\"\n >\n {children}\n </AnimateHeight>\n </div>\n )}\n </div>\n );\n});\n\nexport default Accordion;\n","import React, { PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport { Icon, IconProps } from \"../../base/icon\";\n\nexport interface ButtonProps extends React.HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\n /**\n * Текст на кнопке.\n */\n label?: string;\n\n /**\n * Вариант стилизации кнопки.\n */\n variant?: \"contained\" | \"text\" | \"outlined\";\n\n /**\n * Размер кнопки.\n */\n size?: \"small\" | \"medium\" | \"large\";\n\n /**\n * Иконка, которая может быть ReactNode (например, <Icon/>) или строкой (url, base64, и т.д.).\n */\n icon?: React.ReactNode | string;\n\n /**\n * Пропсы для иконки (исключая 'name', если в IconProps оно обязательно).\n */\n iconProps?: Omit<IconProps, \"name\">;\n\n /**\n * @deprecated используйте `color`. Оставлено для обратной совместимости.\n */\n colorTheme?: \"primary\";\n\n /**\n * Семантический цвет кнопки. Резолвится через токены `--smui-*Color*`.\n */\n color?: \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\n /**\n * Ссылка. Если задана, компонент может рендериться как <a>.\n */\n href?: string;\n\n /**\n * Отключённое состояние.\n */\n disabled?: boolean;\n\n /**\n * Тип кнопки.\n */\n type?: \"button\" | \"submit\" | \"reset\";\n\n /**\n * Растягивать кнопку по всей ширине контейнера.\n */\n fullWidth?: boolean;\n\n /**\n * Позиция риппл-эффекта по центру.\n */\n rippleCenter?: boolean;\n\n /**\n * Отключить риппл-эффект.\n */\n disableRipple?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement | HTMLAnchorElement, PropsWithChildren<ButtonProps>>(\n function Button(props, ref) {\n const {\n label,\n variant = \"contained\",\n icon,\n iconProps = {},\n href,\n className,\n disabled,\n children,\n onMouseDown: onMouseDownProp,\n fullWidth,\n rippleCenter,\n disableRipple,\n\n size = \"medium\",\n colorTheme = \"primary\",\n color: colorProp,\n ...rest\n } = props;\n const color = colorProp ?? colorTheme;\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n const classes = cn(\n \"smwb-button\",\n `smwb-${variant}`,\n `smwb-${size}`,\n color === \"primary\" ? \"smwb-primary\" : `smwb-button_color-${color}`,\n className,\n {\n \"smwb-disabled\": disabled,\n \"smwb-full-width\": fullWidth,\n }\n );\n\n const rippleElement = !disableRipple && <Ripple actionRef={rippleRef} center={rippleCenter} />;\n const iconElement = typeof icon === \"string\" ? <Icon {...iconProps} name={icon} /> : icon;\n\n if (href) {\n return (\n <a\n data-testid=\"button-link\"\n ref={ref as React.LegacyRef<HTMLAnchorElement>}\n className={classes}\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {icon && iconElement}\n {label ? label : children}\n {rippleElement}\n </a>\n );\n }\n\n return (\n <button\n data-testid=\"button\"\n ref={ref as React.LegacyRef<HTMLButtonElement>}\n className={classes}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n disabled={!!disabled}\n {...rest}\n >\n {icon && iconElement}\n {label ? label : children}\n {rippleElement}\n </button>\n );\n }\n);\nexport default Button;\n","import React from \"react\";\n\nexport const useSafeLayoutEffect = typeof window === \"undefined\" ? React.useEffect : React.useLayoutEffect;\n","import React, { forwardRef, ReactNode, useEffect, useState } from \"react\";\nimport cn from \"clsx\";\nimport { createPortal } from \"react-dom\";\nimport Button from \"../../inputs/button/button\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\nexport type ExpansionMode = \"tile\" | \"row\" | \"fullscreen\";\n\nexport interface ExpansionPanelLabels {\n /** Tooltip/aria for the control that expands a tile to a full grid row. */\n expandRow?: string;\n /** Tooltip/aria for the control that collapses a full row back to a tile. */\n collapseRow?: string;\n /** Tooltip/aria for the control that opens the panel fullscreen. */\n expandFullscreen?: string;\n /** Tooltip/aria for the control that closes fullscreen. */\n closeFullscreen?: string;\n /** Text shown in the original slot while the panel is fullscreen. */\n placeholder?: string;\n /** Label of the button in the placeholder that closes fullscreen. */\n placeholderClose?: string;\n}\n\nexport interface ExpansionPanelRenderContext {\n mode: ExpansionMode;\n isFullscreen: boolean;\n isFullRow: boolean;\n}\n\nexport interface ExpansionPanelControlsContext extends ExpansionPanelRenderContext {\n setMode: (next: ExpansionMode | ((current: ExpansionMode) => ExpansionMode)) => void;\n toggleRow: () => void;\n openFullscreen: () => void;\n closeFullscreen: () => void;\n labels: Required<ExpansionPanelLabels>;\n}\n\ntype ExpansionPanelChildren = ReactNode | ((ctx: ExpansionPanelRenderContext) => ReactNode);\ntype ExpansionPanelControls = ReactNode | ((ctx: ExpansionPanelControlsContext) => ReactNode);\n\nexport interface ExpansionPanelProps {\n className?: string;\n /** Content of the panel header (left side of the control bar). */\n header?: ReactNode;\n /** Controlled layout mode. */\n mode?: ExpansionMode;\n /** Initial mode for the uncontrolled component. */\n defaultMode?: ExpansionMode;\n /** Fired with the next mode whenever it changes. */\n onModeChange?: (mode: ExpansionMode) => void;\n /** Render the panel as a plain card without row/fullscreen controls. */\n disableExpand?: boolean;\n /** Hide the built-in control bar (consumer drives `mode` itself). */\n noControls?: boolean;\n /** Replace the built-in row/fullscreen controls with a custom node or render prop. */\n renderControls?: ExpansionPanelControls;\n /** Close fullscreen when the backdrop is clicked. Default: true. */\n closeOnOutsideClick?: boolean;\n /** Close fullscreen when Escape is pressed. Default: true. */\n closeOnEsc?: boolean;\n /** Accessible labels / tooltips for the built-in controls. */\n labels?: ExpansionPanelLabels;\n children?: ExpansionPanelChildren;\n}\n\nconst DEFAULT_LABELS: Required<ExpansionPanelLabels> = {\n expandRow: \"Expand to full row\",\n collapseRow: \"Collapse to grid\",\n expandFullscreen: \"Expand to fullscreen\",\n closeFullscreen: \"Close fullscreen\",\n placeholder: \"Panel is open in fullscreen\",\n placeholderClose: \"Close\",\n};\n\nconst resolveChildren = (children: ExpansionPanelChildren, ctx: ExpansionPanelRenderContext): ReactNode =>\n typeof children === \"function\" ? children(ctx) : children;\n\nconst resolveControls = (controls: ExpansionPanelControls, ctx: ExpansionPanelControlsContext): ReactNode =>\n typeof controls === \"function\" ? controls(ctx) : controls;\n\nexport const ExpansionPanel = forwardRef<HTMLDivElement, ExpansionPanelProps>(function ExpansionPanel(\n {\n className,\n header,\n mode: modeProp,\n defaultMode = \"tile\",\n onModeChange,\n disableExpand = false,\n noControls = false,\n renderControls,\n closeOnOutsideClick = true,\n closeOnEsc = true,\n labels,\n children,\n },\n ref\n) {\n const [mode, setMode] = useControllableState<ExpansionMode>({\n value: modeProp,\n defaultValue: defaultMode,\n onChange: onModeChange,\n });\n\n const l = { ...DEFAULT_LABELS, ...labels };\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n // `disableExpand` renders a plain card regardless of the requested mode,\n // without mutating state — works in both controlled and uncontrolled use.\n const effectiveMode: ExpansionMode = disableExpand ? \"tile\" : mode;\n const isFullRow = effectiveMode === \"row\";\n const isFullscreen = effectiveMode === \"fullscreen\";\n\n const toggleRow = () => setMode((current) => (current === \"row\" ? \"tile\" : \"row\"));\n const openFullscreen = () => setMode(\"fullscreen\");\n const closeFullscreen = () => setMode(\"tile\");\n\n const controlsContext = (overlay: boolean): ExpansionPanelControlsContext => ({\n mode: effectiveMode,\n isFullscreen: overlay,\n isFullRow: overlay ? false : isFullRow,\n setMode,\n toggleRow,\n openFullscreen,\n closeFullscreen,\n labels: l,\n });\n\n const defaultControls = (overlay: boolean) => {\n if (overlay) {\n return (\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n aria-label={l.closeFullscreen}\n title={l.closeFullscreen}\n onClick={closeFullscreen}\n data-testid=\"expansion-panel-close\"\n icon={<Icon name=\"close\" size={18} />}\n />\n );\n }\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n aria-pressed={isFullRow}\n aria-label={isFullRow ? l.collapseRow : l.expandRow}\n title={isFullRow ? l.collapseRow : l.expandRow}\n onClick={toggleRow}\n data-testid=\"expansion-panel-row\"\n icon={<Icon name={isFullRow ? \"grid_view\" : \"table_rows\"} size={18} />}\n />\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n aria-label={l.expandFullscreen}\n title={l.expandFullscreen}\n onClick={openFullscreen}\n data-testid=\"expansion-panel-fullscreen\"\n icon={<Icon name=\"open_in_full\" size={18} />}\n />\n </>\n );\n };\n\n const renderControlBar = (overlay: boolean) => {\n if (disableExpand || noControls) {\n return null;\n }\n\n const content = renderControls\n ? resolveControls(renderControls, controlsContext(overlay))\n : defaultControls(overlay);\n\n if (!content) {\n return null;\n }\n\n return <div className=\"smwb-expansion-panel__controls\">{content}</div>;\n };\n\n useEffect(() => {\n if (!isFullscreen) {\n return;\n }\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, [isFullscreen]);\n\n useEffect(() => {\n if (!isFullscreen || !closeOnEsc) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setMode(\"tile\");\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [isFullscreen, closeOnEsc, setMode]);\n\n const card = (\n <div\n ref={ref}\n className={cn(\"smwb-expansion-panel\", { \"smwb-expansion-panel_row\": isFullRow }, className)}\n data-testid=\"expansion-panel\"\n >\n <div className=\"smwb-expansion-panel__head\">\n <div className=\"smwb-expansion-panel__header\">{header}</div>\n {renderControlBar(false)}\n </div>\n <div className=\"smwb-expansion-panel__body\">\n {resolveChildren(children, {\n mode: effectiveMode,\n isFullscreen: false,\n isFullRow,\n })}\n </div>\n </div>\n );\n\n if (!isFullscreen || !domRoot) {\n return card;\n }\n\n return (\n <>\n <div className=\"smwb-expansion-panel__placeholder\" data-testid=\"expansion-panel-placeholder\">\n <span>{l.placeholder}</span>\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n label={l.placeholderClose}\n onClick={() => setMode(\"tile\")}\n />\n </div>\n {createPortal(\n <div\n className=\"smwb-expansion-panel__overlay smwb-dark\"\n role=\"dialog\"\n aria-modal=\"true\"\n data-testid=\"expansion-panel-overlay\"\n onClick={\n closeOnOutsideClick\n ? (e) => {\n if (e.target === e.currentTarget) {\n setMode(\"tile\");\n }\n }\n : undefined\n }\n >\n <div className=\"smwb-expansion-panel__dialog\">\n <div className=\"smwb-expansion-panel__head\">\n <div className=\"smwb-expansion-panel__header\">{header}</div>\n {renderControlBar(true)}\n </div>\n <div className=\"smwb-expansion-panel__body smwb-expansion-panel__body_fullscreen\">\n {resolveChildren(children, {\n mode: effectiveMode,\n isFullscreen: true,\n isFullRow: false,\n })}\n </div>\n </div>\n </div>,\n domRoot\n )}\n </>\n );\n});\n\nexport default ExpansionPanel;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\n\nexport interface ChatIconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string;\n edge?: \"start\" | \"end\";\n color?: \"default\" | \"primary\";\n}\n\nexport function ChatIconButton({\n className,\n children,\n disabled,\n edge,\n color = \"default\",\n onMouseDown: onMouseDownProp,\n ...rest\n}: ChatIconButtonProps) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseDownProp?.(event);\n };\n\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n return (\n <button\n type=\"button\"\n className={cn(\n \"smwb-chat-icon-button\",\n edge === \"start\" && \"smwb-chat-icon-button_edge-start\",\n edge === \"end\" && \"smwb-chat-icon-button_edge-end\",\n color === \"primary\" && \"smwb-chat-icon-button_primary\",\n disabled && \"smwb-chat-icon-button_disabled\",\n className\n )}\n disabled={disabled}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {children}\n {!disabled ? <Ripple actionRef={rippleRef} center /> : null}\n </button>\n );\n}\n\nexport default ChatIconButton;\n","import React, { ButtonHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\n\nexport type FloatingButtonColor = \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface FloatingButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string;\n variant?: \"extended\" | \"default\";\n size?: \"small\" | \"medium\" | \"large\";\n /** Semantic color. Resolves through the shared `--smui-*Color*` tokens. */\n color?: FloatingButtonColor;\n}\n\nexport const FloatingButton = React.forwardRef<HTMLButtonElement, FloatingButtonProps>(function FloatingButton(\n {\n children,\n className,\n onMouseDown: onMouseDownProp,\n variant = \"default\",\n size = \"medium\",\n color = \"primary\",\n type = \"button\",\n ...rest\n },\n ref\n) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\"smwb-fab\", `smwb-${variant}`, `smwb-${size}`, `smwb-fab_color-${color}`, className)}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {children}\n <Ripple actionRef={rippleRef} />\n </button>\n );\n});\n\nexport default FloatingButton;\n","import { ElementType } from \"react\";\n\nexport function hasValue(value: unknown) {\n return value != null && !(Array.isArray(value) && value.length === 0);\n}\n\nexport function isFilled(\n obj?: {\n value?: unknown;\n defaultValue?: unknown;\n } | null\n) {\n return obj && ((hasValue(obj.value) && obj.value !== \"\") || (hasValue(obj.defaultValue) && obj.defaultValue !== \"\"));\n}\n\nexport function isHostComponent(element: ElementType) {\n return typeof element === \"string\";\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldProps } from \"./textField\";\n\nexport interface TextFieldAdornmentProps extends Pick<JSX.IntrinsicElements[\"span\"], \"children\" | \"className\"> {\n position?: \"start\" | \"end\";\n disablePointerEvents?: boolean;\n variant?: TextFieldProps[\"variant\"];\n inline?: boolean;\n}\n\nexport function TextFieldAdornment({\n position,\n variant,\n children,\n className,\n disablePointerEvents,\n inline,\n}: TextFieldAdornmentProps) {\n const classes = cn(\n \"smwb-text-field__adornment\",\n className,\n position === \"start\" && \"smwb-text-field__adornment--start\",\n position === \"end\" && \"smwb-text-field__adornment--end\",\n disablePointerEvents && \"smwb-text-field__adornment--disable-pointer\",\n !inline && variant === \"filled\" && \"smwb-text-field__adornment--filled\",\n typeof children === \"string\" && \"smwb-text-field__adornment--text\"\n );\n\n return <span className={classes}>{children}</span>;\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldAdornment } from \"./textFieldAdornment\";\n\nexport interface TextFieldWrapperProps extends React.HTMLAttributes<HTMLDivElement> {\n label?: string;\n helperText?: React.ReactNode;\n variant?: \"outlined\" | \"filled\";\n disabled?: boolean;\n className?: string;\n error?: boolean;\n fullWidth?: boolean;\n isFilledState?: boolean;\n isFocused?: boolean;\n children: React.ReactNode;\n htmlFor?: string;\n shrink?: boolean;\n onHolderMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n inline?: boolean;\n}\n\nexport function TextFieldWrapper({\n label,\n helperText = <>&nbsp;</>,\n variant,\n disabled,\n className,\n error,\n fullWidth,\n isFilledState,\n isFocused,\n htmlFor,\n shrink,\n children,\n onHolderMouseDown,\n startAdornment,\n endAdornment,\n inline,\n ...rest\n}: TextFieldWrapperProps) {\n const isFilledVariant = variant === \"filled\";\n const isNotchedActive = label && (isFilledState || isFocused || shrink);\n\n const classes = cn(className, \"smwb-text-field\", {\n \"smwb-text-field--filled\": !inline && isFilledVariant,\n \"smwb-text-field--inline\": inline,\n \"smwb-text-field--focused\": !inline && isFocused,\n \"smwb-text-field--error\": error,\n \"smwb-text-field--disabled\": disabled,\n \"smwb-text-field--full-width\": fullWidth,\n });\n const labelClasses = cn(\"smwb-text-field__label\", {\n \"smwb-text-field__label--shrink\": isNotchedActive,\n });\n const notchedClasses = cn(\"smwb-text-field__notched\", {\n \"smwb-text-field__notched--with-label\": label,\n \"smwb-text-field__notched--active\": isNotchedActive,\n });\n\n return (\n <div className={classes} {...rest} data-testid=\"text-field\">\n {!inline && label && (\n <label className={labelClasses} htmlFor={htmlFor || \"\"}>\n {label}\n </label>\n )}\n <div className=\"smwb-text-field__input-holder\" onMouseDown={onHolderMouseDown}>\n {startAdornment && (\n <TextFieldAdornment variant={variant} inline={Boolean(inline)} position=\"start\">\n {startAdornment}\n </TextFieldAdornment>\n )}\n {children}\n {endAdornment && <TextFieldAdornment position=\"end\">{endAdornment}</TextFieldAdornment>}\n {!inline && variant === \"outlined\" && (\n <fieldset className={notchedClasses}>\n <legend>{label ? <span>{label}</span> : <span className=\"smwb-notranslate\">&#8203;</span>}</legend>\n </fieldset>\n )}\n </div>\n {!inline && helperText && (\n <p className=\"smwb-text-field__helper-line\">\n <span className=\"smwb-text-field__helper-text\">{helperText}</span>\n </p>\n )}\n </div>\n );\n}\n","import React, { ChangeEventHandler } from \"react\";\nimport cn from \"clsx\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { isFilled } from \"./utils\";\nimport { TextFieldWrapper } from \"./textFieldWrapper\";\n\nexport interface TextFieldProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onBlur\" | \"size\"\n> {\n label?: string;\n helperText?: React.ReactNode;\n variant?: \"outlined\" | \"filled\";\n size?: \"small\" | \"medium\" | \"large\";\n required?: boolean;\n disabled?: boolean;\n value?: string | number;\n className?: string;\n placeholder?: string;\n defaultValue?: string;\n error?: boolean;\n name?: string;\n type?: string;\n readOnly?: boolean;\n fullWidth?: boolean;\n onBlur?: (event: React.FocusEvent<HTMLInputElement>, data: TextFieldProps) => void;\n onChange?: (event: React.ChangeEvent<HTMLInputElement>, data: TextFieldProps) => void;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n id?: string;\n inline?: boolean;\n autoComplete?: string;\n}\n\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(function TextField(props, ref) {\n const {\n label,\n helperText,\n variant = \"outlined\",\n size = \"medium\",\n required,\n className,\n disabled,\n value,\n defaultValue,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n error,\n name,\n type = \"text\",\n readOnly,\n placeholder,\n fullWidth,\n id,\n startAdornment,\n endAdornment,\n inline,\n autoComplete,\n inputMode,\n ...rest\n } = props;\n const [isFocused, setIsFocused] = React.useState<boolean>(false);\n const [isFilledState, setIsFilledState] = React.useState<boolean>(false);\n\n const { current: isControlled } = React.useRef<boolean>(value != null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const inputForkRef = useForkRef<HTMLInputElement>(ref, inputRef);\n\n const onFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (disabled) {\n event.stopPropagation();\n return;\n }\n\n onFocusProp?.(event);\n\n setIsFocused(true);\n };\n\n const onBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (!isControlled) {\n const element = event.target || inputRef.current;\n\n checkDirty({\n value: element.value,\n });\n }\n onBlurProp?.(event, props);\n setIsFocused(false);\n };\n\n const checkDirty = React.useCallback((obj: Parameters<typeof isFilled>[0]) => {\n const filled = Boolean(isFilled(obj));\n setIsFilledState((prev) => (prev === filled ? prev : filled));\n }, []);\n\n const onChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n if (!isControlled) {\n const element = event.target || inputRef.current;\n\n checkDirty({\n value: element.value,\n });\n }\n onChangeProp?.(event, props);\n };\n\n const onHolderMouseDown: React.MouseEventHandler<HTMLDivElement> = (event) => {\n if (inputRef.current && event.currentTarget === event.target) {\n event.preventDefault();\n inputRef.current.focus();\n }\n };\n\n React.useEffect(() => {\n if (disabled && isFocused) {\n setIsFocused(false);\n }\n }, [disabled, isFocused]);\n\n // Uncontrolled inputs can receive a value imperatively — e.g. react-hook-form's\n // `register` sets the DOM value on `reset(...)` without firing onChange. Re-derive\n // the filled state from the DOM on every render (the form re-renders on reset) so\n // the floating label still rises. `checkDirty` is a no-op when nothing changed.\n React.useEffect(() => {\n if (!isControlled) {\n checkDirty(inputRef.current);\n }\n });\n\n useSafeLayoutEffect(() => {\n if (isControlled) {\n checkDirty({ value });\n }\n }, [value, isControlled, checkDirty]);\n\n const inputClasses = cn(\n \"smwb-text-field__input\",\n (!label || inline) && \"smwb-text-field__input--show-placeholder\",\n startAdornment && \"smwb-text-field__input--adornment-start\",\n endAdornment && \"smwb-text-field__input--adornment-end\",\n inline && \"smwb-text-field__input--inline\"\n );\n\n return (\n <TextFieldWrapper\n label={label}\n helperText={helperText}\n variant={variant}\n disabled={disabled}\n className={cn(className, size !== \"medium\" && `smwb-text-field_size-${size}`)}\n error={error}\n fullWidth={fullWidth}\n isFilledState={isFilledState}\n isFocused={isFocused}\n htmlFor={id}\n shrink={Boolean(startAdornment)}\n onHolderMouseDown={onHolderMouseDown}\n startAdornment={startAdornment}\n endAdornment={endAdornment}\n inline={inline}\n {...rest}\n >\n <input\n type={type}\n defaultValue={defaultValue}\n name={name}\n readOnly={readOnly}\n required={required}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n placeholder={placeholder}\n disabled={disabled}\n value={value}\n className={inputClasses}\n ref={inputForkRef}\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n id={id}\n autoComplete={autoComplete}\n inputMode={inputMode}\n />\n </TextFieldWrapper>\n );\n});\n","import { ReactNode } from \"react\";\n\nexport type ChatMessageVariant = \"incoming\" | \"outgoing\" | \"system\" | \"custom\";\n\nexport type ChatLayoutMode = \"closed\" | \"floating\" | \"fullHeight\" | \"fullscreen\";\n\nexport type ChatAnchor = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n\nexport type ChatThemeMode = \"inherit\" | \"light\" | \"dark\";\n\nexport type ChatLayoutSide = \"left\" | \"right\";\n\nexport type ChatMessageDeliveryStatus = \"pending\" | \"sent\" | \"delivered\" | \"read\";\n\nexport type ChatMessageStatus = ChatMessageDeliveryStatus | (string & {});\n\nexport interface ChatMessageStatusIcons {\n pending?: string;\n sent?: string;\n delivered?: string;\n read?: string;\n}\n\nexport interface ChatMessageStatusRenderContext {\n message: ChatMessage;\n status: ChatMessageStatus;\n}\n\nexport interface ChatAttachment {\n id: string;\n name: string;\n url?: string;\n mimeType?: string;\n size?: number;\n}\n\nexport interface ChatAuthor {\n name?: string;\n avatarSrc?: string;\n avatarAlt?: string;\n}\n\nexport interface ChatMessage {\n id: string;\n variant: ChatMessageVariant;\n text?: ReactNode;\n author?: ChatAuthor;\n attachments?: ChatAttachment[];\n content?: ReactNode;\n timestamp?: string | Date;\n status?: ChatMessageStatus;\n}\n\nexport interface ChatMessageRenderContext {\n showAvatars: boolean;\n showAttachments: boolean;\n showStatus?: boolean;\n statusIcons?: ChatMessageStatusIcons & Record<string, string | undefined>;\n renderStatus?: (ctx: ChatMessageStatusRenderContext) => ReactNode;\n}\n\nexport const CHAT_MESSAGE_DELIVERY_STATUSES: ChatMessageDeliveryStatus[] = [\"pending\", \"sent\", \"delivered\", \"read\"];\n\nexport const CHAT_MESSAGE_STATUS_ICONS: Record<ChatMessageDeliveryStatus, string> = {\n pending: \"progress_activity\",\n sent: \"check\",\n delivered: \"done_all\",\n read: \"done_all\",\n};\n\nexport const CHAT_MESSAGE_STATUS_LABELS: Record<ChatMessageDeliveryStatus, string> = {\n pending: \"В обработке\",\n sent: \"Отправлено\",\n delivered: \"Доставлено\",\n read: \"Прочитано\",\n};\n\nexport const CHAT_EXPAND_LAYOUTS: ChatLayoutMode[] = [\"floating\", \"fullHeight\", \"fullscreen\"];\n\nexport const CHAT_OVERLAY_LAYOUTS: ChatLayoutMode[] = [\"fullHeight\", \"floating\"];\n\nexport const CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES = 10;\n","import {\n ChatAttachment,\n ChatLayoutMode,\n CHAT_EXPAND_LAYOUTS,\n CHAT_MESSAGE_DELIVERY_STATUSES,\n CHAT_MESSAGE_STATUS_ICONS,\n CHAT_MESSAGE_STATUS_LABELS,\n ChatMessageDeliveryStatus,\n ChatMessageStatus,\n ChatMessageStatusIcons,\n} from \"./types\";\n\nexport function isChatMessageDeliveryStatus(status: ChatMessageStatus): status is ChatMessageDeliveryStatus {\n return CHAT_MESSAGE_DELIVERY_STATUSES.includes(status as ChatMessageDeliveryStatus);\n}\n\nexport function resolveChatMessageStatusIcon(\n status: ChatMessageStatus,\n icons?: ChatMessageStatusIcons & Record<string, string | undefined>\n): string | undefined {\n const custom = icons?.[status];\n if (custom) {\n return custom;\n }\n\n if (isChatMessageDeliveryStatus(status)) {\n return CHAT_MESSAGE_STATUS_ICONS[status];\n }\n\n return undefined;\n}\n\nexport function resolveChatMessageStatusLabel(status: ChatMessageStatus): string {\n if (isChatMessageDeliveryStatus(status)) {\n return CHAT_MESSAGE_STATUS_LABELS[status];\n }\n\n return String(status);\n}\n\nexport function isImageAttachment(attachment: ChatAttachment): boolean {\n if (attachment.mimeType?.startsWith(\"image/\")) {\n return true;\n }\n\n return /\\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(attachment.name);\n}\n\nexport function formatChatTimestamp(value?: string | Date): string {\n if (!value) {\n return \"\";\n }\n\n const date = value instanceof Date ? value : new Date(value);\n\n if (Number.isNaN(date.getTime())) {\n return String(value);\n }\n\n return new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nexport function resolveAllowedLayouts(input?: ChatLayoutMode[]): ChatLayoutMode[] {\n if (input == null) {\n return [\"floating\"];\n }\n\n if (input.length === 0) {\n return [];\n }\n\n return CHAT_EXPAND_LAYOUTS.filter((mode) => input.includes(mode));\n}\n\nexport function pickInitialLayout(allowed: ChatLayoutMode[], preferred?: ChatLayoutMode): ChatLayoutMode {\n if (preferred && preferred !== \"closed\" && allowed.includes(preferred)) {\n return preferred;\n }\n\n return allowed[0] ?? \"floating\";\n}\n\nexport function getChatLayoutActions(\n allowedLayouts: ChatLayoutMode[],\n currentLayout?: ChatLayoutMode\n): Exclude<ChatLayoutMode, \"closed\">[] {\n return resolveAllowedLayouts(allowedLayouts).filter(\n (mode): mode is Exclude<ChatLayoutMode, \"closed\"> => mode !== \"closed\" && mode !== currentLayout\n );\n}\n\nexport function shouldShowChatCloseButton(options: {\n floatingTrigger?: boolean;\n embedded?: boolean;\n overlayContext?: boolean;\n effectiveLayout?: ChatLayoutMode;\n showCloseButton?: boolean;\n}): boolean {\n if (options.showCloseButton === false) {\n return false;\n }\n\n if (options.showCloseButton === true) {\n return true;\n }\n\n if (\n options.overlayContext &&\n options.floatingTrigger &&\n !options.embedded &&\n (options.effectiveLayout === \"floating\" || options.effectiveLayout === \"fullHeight\")\n ) {\n return true;\n }\n\n return Boolean(options.floatingTrigger && !options.embedded && options.effectiveLayout === \"floating\");\n}\n\nexport interface ChatComposerNewlineOptions {\n shiftEnterNewline?: boolean;\n ctrlEnterNewline?: boolean;\n}\n\nexport function shouldComposerNewlineOnEnter(\n event: { key: string; shiftKey: boolean; ctrlKey: boolean; metaKey: boolean },\n options: ChatComposerNewlineOptions = {}\n): boolean {\n if (event.key !== \"Enter\") {\n return false;\n }\n\n const { shiftEnterNewline = true, ctrlEnterNewline = true } = options;\n const isCtrl = event.ctrlKey || event.metaKey;\n\n if (shiftEnterNewline && event.shiftKey && !isCtrl) {\n return true;\n }\n\n if (ctrlEnterNewline && isCtrl && !event.shiftKey) {\n return true;\n }\n\n return false;\n}\n","import React, { useId, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { TextField } from \"../../inputs/textField\";\nimport { TextFieldWrapper } from \"../../inputs/textField/textFieldWrapper\";\nimport ChatIconButton from \"./chatIconButton\";\nimport { shouldComposerNewlineOnEnter } from \"./utils\";\n\nexport interface ChatComposerProps {\n className?: string;\n onSendMessage?: (text: string) => void | Promise<void>;\n placeholder?: string;\n disabled?: boolean;\n sendAriaLabel?: string;\n shiftEnterNewline?: boolean;\n ctrlEnterNewline?: boolean;\n fileUpload?: boolean;\n attachInputId?: string;\n onAttachClick?: () => void;\n attachAriaLabel?: string;\n}\n\nfunction stopPropagation(event: React.SyntheticEvent) {\n event.stopPropagation();\n}\n\nfunction insertNewlineAtCursor(element: HTMLTextAreaElement, value: string, setValue: (next: string) => void) {\n const start = element.selectionStart ?? value.length;\n const end = element.selectionEnd ?? value.length;\n const nextValue = `${value.slice(0, start)}\\n${value.slice(end)}`;\n\n setValue(nextValue);\n\n requestAnimationFrame(() => {\n element.selectionStart = start + 1;\n element.selectionEnd = start + 1;\n });\n}\n\nexport function ChatComposer({\n className,\n onSendMessage,\n placeholder = \"message\",\n disabled = false,\n sendAriaLabel = \"Send message\",\n shiftEnterNewline = true,\n ctrlEnterNewline = true,\n fileUpload = false,\n attachInputId,\n onAttachClick,\n attachAriaLabel = \"Attach file\",\n}: ChatComposerProps) {\n const [value, setValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const inputId = useId();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const multiline = shiftEnterNewline || ctrlEnterNewline;\n const canSend = Boolean(onSendMessage) && value.trim().length > 0 && !disabled;\n const showAttach = fileUpload && Boolean(attachInputId || onAttachClick);\n\n const handleSend = () => {\n if (!onSendMessage) {\n return;\n }\n\n const text = value.trim();\n\n if (!text || disabled) {\n return;\n }\n\n void onSendMessage(text);\n setValue(\"\");\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (shouldComposerNewlineOnEnter(event, { shiftEnterNewline, ctrlEnterNewline })) {\n if (event.currentTarget instanceof HTMLTextAreaElement) {\n event.preventDefault();\n insertNewlineAtCursor(event.currentTarget, value, setValue);\n }\n\n return;\n }\n\n if (event.key !== \"Enter\") {\n return;\n }\n\n event.preventDefault();\n handleSend();\n };\n\n const attachClassName = cn(\n \"smwb-chat-icon-button\",\n \"smwb-chat-icon-button_edge-start\",\n disabled && \"smwb-chat-icon-button_disabled\"\n );\n\n const attachButton = showAttach ? (\n attachInputId ? (\n <label\n htmlFor={disabled ? undefined : attachInputId}\n className={attachClassName}\n aria-label={attachAriaLabel}\n aria-disabled={disabled || undefined}\n data-testid=\"chat-composer-attach\"\n onMouseDown={stopPropagation}\n >\n <Icon name=\"attach_file\" size={24} />\n </label>\n ) : (\n <ChatIconButton\n edge=\"start\"\n aria-label={attachAriaLabel}\n data-testid=\"chat-composer-attach\"\n disabled={disabled}\n onClick={onAttachClick}\n onMouseDown={stopPropagation}\n >\n <Icon name=\"attach_file\" size={24} />\n </ChatIconButton>\n )\n ) : null;\n\n const sendButton = onSendMessage ? (\n <ChatIconButton\n edge=\"end\"\n color=\"primary\"\n aria-label={sendAriaLabel}\n data-testid=\"chat-composer-send\"\n disabled={!canSend}\n onClick={handleSend}\n onMouseDown={stopPropagation}\n >\n <Icon name=\"send\" size={24} />\n </ChatIconButton>\n ) : null;\n\n if (showAttach && !onSendMessage) {\n return (\n <div\n className={cn(\"smwb-chat-composer\", \"smwb-chat-composer_attach-only\", className)}\n data-testid=\"chat-composer\"\n >\n {attachButton}\n </div>\n );\n }\n\n if (!multiline) {\n return (\n <TextField\n className={cn(\"smwb-chat-composer\", className)}\n data-testid=\"chat-composer\"\n fullWidth\n value={value}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(event) => setValue(event.target.value)}\n startAdornment={attachButton}\n endAdornment={sendButton}\n onKeyDown={handleKeyDown}\n />\n );\n }\n\n const onHolderMouseDown: React.MouseEventHandler<HTMLDivElement> = (event) => {\n if (textareaRef.current && event.currentTarget === event.target) {\n event.preventDefault();\n textareaRef.current.focus();\n }\n };\n\n return (\n <TextFieldWrapper\n className={cn(\"smwb-chat-composer\", className)}\n data-testid=\"chat-composer\"\n fullWidth\n disabled={disabled}\n isFilledState={value.length > 0}\n isFocused={isFocused}\n htmlFor={inputId}\n shrink={Boolean(attachButton)}\n onHolderMouseDown={onHolderMouseDown}\n startAdornment={attachButton}\n endAdornment={sendButton}\n >\n <textarea\n id={inputId}\n ref={textareaRef}\n className={cn(\n \"smwb-text-field__input\",\n \"smwb-chat-composer__input\",\n \"smwb-text-field__input--show-placeholder\",\n attachButton && \"smwb-text-field__input--adornment-start\",\n sendButton && \"smwb-text-field__input--adornment-end\"\n )}\n value={value}\n disabled={disabled}\n placeholder={placeholder}\n rows={1}\n onChange={(event) => setValue(event.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onKeyDown={handleKeyDown}\n />\n </TextFieldWrapper>\n );\n}\n\nexport default ChatComposer;\n","import React, { ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport ChatIconButton from \"./chatIconButton\";\nimport { ChatLayoutMode } from \"./types\";\nimport { getChatLayoutActions } from \"./utils\";\n\nexport interface ChatHeaderProps {\n className?: string;\n title?: ReactNode;\n subtitle?: ReactNode;\n actions?: ReactNode;\n layout?: ChatLayoutMode;\n allowedLayouts?: ChatLayoutMode[];\n onLayoutChange?: (layout: ChatLayoutMode) => void;\n onClose?: () => void;\n}\n\nconst layoutIcons: Record<Exclude<ChatLayoutMode, \"closed\">, string> = {\n floating: \"picture_in_picture\",\n fullHeight: \"fit_screen\",\n fullscreen: \"open_in_full\",\n};\n\nconst layoutAriaLabels: Record<Exclude<ChatLayoutMode, \"closed\">, string> = {\n floating: \"Floating window\",\n fullHeight: \"Full height\",\n fullscreen: \"Fullscreen\",\n};\n\nexport function ChatHeader({\n className,\n title,\n subtitle,\n actions,\n layout,\n allowedLayouts = [\"floating\"],\n onLayoutChange,\n onClose,\n}: ChatHeaderProps) {\n const layoutActions = getChatLayoutActions(allowedLayouts, layout);\n const showLayoutActions = Boolean(onLayoutChange) && layoutActions.length > 0;\n\n return (\n <div className={cn(\"smwb-chat-header\", className)} data-testid=\"chat-header\">\n <div className=\"smwb-chat-header__main\">\n {title ? <div className=\"smwb-chat-header__title\">{title}</div> : null}\n {subtitle ? <div className=\"smwb-chat-header__subtitle\">{subtitle}</div> : null}\n </div>\n <div className=\"smwb-chat-header__actions\">\n {actions}\n {showLayoutActions\n ? layoutActions.map((mode) => (\n <ChatIconButton\n key={mode}\n aria-pressed={layout === mode}\n aria-label={layoutAriaLabels[mode]}\n data-testid={`chat-layout-${mode}`}\n onClick={() => onLayoutChange?.(mode)}\n >\n <Icon name={layoutIcons[mode]} size={18} />\n </ChatIconButton>\n ))\n : null}\n {onClose ? (\n <ChatIconButton aria-label=\"Close chat\" data-testid=\"chat-close\" onClick={onClose}>\n <Icon name=\"close\" size={18} />\n </ChatIconButton>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport default ChatHeader;\n","import React, { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport type TypographyVariant =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"subtitle1\"\n | \"subtitle2\"\n | \"body1\"\n | \"body2\"\n | \"caption\"\n | \"overline\"\n | \"button\";\n\nexport type TypographyColor =\n | \"inherit\"\n | \"primary\"\n | \"secondary\"\n | \"error\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"textPrimary\"\n | \"textSecondary\"\n | \"disabled\";\n\nconst defaultTag: Record<TypographyVariant, keyof JSX.IntrinsicElements> = {\n h1: \"h1\",\n h2: \"h2\",\n h3: \"h3\",\n h4: \"h4\",\n h5: \"h5\",\n h6: \"h6\",\n subtitle1: \"h6\",\n subtitle2: \"h6\",\n body1: \"p\",\n body2: \"p\",\n caption: \"span\",\n overline: \"span\",\n button: \"span\",\n};\n\nexport interface TypographyProps extends HTMLAttributes<HTMLElement> {\n variant?: TypographyVariant;\n color?: TypographyColor;\n align?: \"left\" | \"center\" | \"right\" | \"justify\";\n /** Add a bottom margin (block rhythm). */\n gutterBottom?: boolean;\n /** Truncate with an ellipsis on a single line. */\n noWrap?: boolean;\n /** Render as a different element/component. */\n component?: keyof JSX.IntrinsicElements;\n className?: string;\n}\n\nexport const Typography = React.forwardRef<HTMLElement, PropsWithChildren<TypographyProps>>(function Typography(\n { variant = \"body1\", color = \"inherit\", align, gutterBottom, noWrap, component, className, children, ...rest },\n ref\n) {\n const Tag = (component ?? defaultTag[variant]) as \"p\";\n return (\n <Tag\n ref={ref as React.Ref<HTMLParagraphElement>}\n className={cn(\n \"smwb-typography\",\n `smwb-typography_${variant}`,\n color !== \"inherit\" && `smwb-typography_color-${color}`,\n align && `smwb-typography_align-${align}`,\n {\n \"smwb-typography_gutter\": gutterBottom,\n \"smwb-typography_nowrap\": noWrap,\n },\n className\n )}\n {...rest}\n >\n {children}\n </Tag>\n );\n});\n\nexport default Typography;\n","import React, { useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CSSTransition } from \"react-transition-group\";\nimport cn from \"clsx\";\nimport { ChatAttachment } from \"./types\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\nexport interface ChatAttachmentImageProps {\n attachment: ChatAttachment;\n className?: string;\n}\n\nexport function ChatAttachmentImage({ attachment, className }: ChatAttachmentImageProps) {\n const [open, setOpen] = useState(false);\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n const nodeRef = useRef<HTMLDivElement>(null);\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n if (!attachment.url) {\n return null;\n }\n\n return (\n <>\n <button\n type=\"button\"\n className={cn(\"smwb-chat-attachment-image\", className)}\n onClick={() => setOpen(true)}\n data-testid=\"chat-attachment-image\"\n aria-label={attachment.name}\n >\n <img src={attachment.url} alt={attachment.name} className=\"smwb-chat-attachment-image__img\" />\n </button>\n {domRoot\n ? createPortal(\n <CSSTransition\n in={open}\n timeout={150}\n mountOnEnter\n unmountOnExit\n nodeRef={nodeRef}\n classNames={{\n enterActive: \"smwb-chat-attachment-image__overlay_enter-active\",\n enterDone: \"smwb-chat-attachment-image__overlay_enter-done\",\n }}\n >\n <div\n ref={nodeRef}\n className=\"smwb-chat-attachment-image__overlay smwb-dark\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={attachment.name}\n data-testid=\"chat-attachment-image-overlay\"\n onClick={() => setOpen(false)}\n >\n <img\n src={attachment.url}\n alt={attachment.name}\n className=\"smwb-chat-attachment-image__overlay-img\"\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n </CSSTransition>,\n domRoot\n )\n : null}\n </>\n );\n}\n\nexport default ChatAttachmentImage;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { ChatAttachment } from \"./types\";\nimport { isImageAttachment } from \"./utils\";\nimport ChatAttachmentImage from \"./chatAttachmentImage\";\n\nexport interface ChatAttachmentsProps {\n attachments?: ChatAttachment[];\n className?: string;\n enabled?: boolean;\n}\n\nexport function ChatAttachments({ attachments, className, enabled = true }: ChatAttachmentsProps) {\n if (!enabled || !attachments?.length) {\n return null;\n }\n\n return (\n <div className={cn(\"smwb-chat-attachments\", className)} data-testid=\"chat-attachments\">\n {attachments.map((attachment) =>\n isImageAttachment(attachment) ? (\n <ChatAttachmentImage key={attachment.id} attachment={attachment} />\n ) : (\n <a\n key={attachment.id}\n className=\"smwb-chat-attachments__file\"\n href={attachment.url}\n download={attachment.name}\n target=\"_blank\"\n rel=\"noreferrer\"\n data-testid=\"chat-attachment-file\"\n >\n {attachment.name}\n </a>\n )\n )}\n </div>\n );\n}\n\nexport default ChatAttachments;\n","import {\n Children,\n CSSProperties,\n forwardRef,\n HTMLAttributes,\n ImgHTMLAttributes,\n isValidElement,\n PropsWithChildren,\n ReactNode,\n useState,\n} from \"react\";\nimport cn from \"clsx\";\n\nexport type AvatarSize = \"small\" | \"medium\" | \"large\";\n\nexport interface AvatarProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** Image source. Falls back to children (initials / icon) on error or when absent. */\n src?: string;\n alt?: string;\n /** Preset size or an explicit pixel value. */\n size?: AvatarSize | number;\n variant?: \"circular\" | \"rounded\" | \"square\";\n /** Background color for the fallback (initials / icon). */\n color?: string;\n /** Extra attributes forwarded to the underlying <img> (srcSet, loading…). */\n imgProps?: ImgHTMLAttributes<HTMLImageElement>;\n}\n\nconst isPresetSize = (size: AvatarSize | number): size is AvatarSize => typeof size === \"string\";\n\nexport const Avatar = forwardRef<HTMLDivElement, PropsWithChildren<AvatarProps>>(function Avatar(\n { className, src, alt, size = \"medium\", variant = \"circular\", color, style, imgProps, children, ...props },\n ref\n) {\n const [imgFailed, setImgFailed] = useState(false);\n const showImage = Boolean(src) && !imgFailed;\n\n const avatarClassName = cn(\n \"smwb-avatar\",\n `smwb-avatar_${variant}`,\n isPresetSize(size) ? `smwb-avatar_${size}` : null,\n className\n );\n\n const inlineStyle: CSSProperties = {\n ...style,\n ...(isPresetSize(size) ? {} : { width: size, height: size, fontSize: size / 2.5 }),\n ...(color && !showImage ? { backgroundColor: color } : {}),\n };\n\n return (\n <div ref={ref} {...props} data-testid=\"avatar\" className={avatarClassName} style={inlineStyle}>\n {showImage ? (\n <img\n {...imgProps}\n className={cn(\"smwb-avatar__img\", imgProps?.className)}\n src={src}\n alt={alt}\n onError={(e) => {\n setImgFailed(true);\n imgProps?.onError?.(e);\n }}\n />\n ) : (\n <span className=\"smwb-avatar__fallback\" role=\"img\" aria-label={alt}>\n {children}\n </span>\n )}\n </div>\n );\n});\n\nexport interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** Maximum avatars to show before collapsing the rest into a \"+N\" surplus. */\n max?: number;\n /** Override the total count used for the surplus label (defaults to children count). */\n total?: number;\n /** Click handler for the \"+N\" surplus chip. */\n onSurplusClick?: () => void;\n}\n\nexport const AvatarGroup = forwardRef<HTMLDivElement, PropsWithChildren<AvatarGroupProps>>(function AvatarGroup(\n { className, max = 5, total, onSurplusClick, children, ...props },\n ref\n) {\n const items = Children.toArray(children).filter(isValidElement);\n const totalCount = total ?? items.length;\n const clampedMax = Math.max(max, 1);\n const visible: ReactNode[] = items.slice(0, clampedMax);\n const surplus = totalCount - visible.length;\n\n return (\n <div ref={ref} {...props} data-testid=\"avatar-group\" className={cn(\"smwb-avatar-group\", className)}>\n {surplus > 0 ? (\n <Avatar\n className=\"smwb-avatar-group__surplus\"\n onClick={onSurplusClick}\n style={onSurplusClick ? { cursor: \"pointer\" } : undefined}\n >\n {`+${surplus}`}\n </Avatar>\n ) : null}\n {visible}\n </div>\n );\n});\n\nexport default Avatar;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Avatar } from \"../avatar/avatar\";\nimport { ChatAuthor } from \"./types\";\n\nexport interface ChatMessageAvatarProps {\n author?: ChatAuthor;\n enabled?: boolean;\n className?: string;\n}\n\nexport function ChatMessageAvatar({ author, enabled = true, className }: ChatMessageAvatarProps) {\n if (!enabled) {\n return null;\n }\n\n return (\n <div className={cn(\"smwb-chat-message__avatar\", className)} data-testid=\"chat-message-avatar\">\n <Avatar src={author?.avatarSrc} alt={author?.avatarAlt ?? author?.name} size=\"small\">\n {author?.name?.slice(0, 1)}\n </Avatar>\n </div>\n );\n}\n\nexport default ChatMessageAvatar;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport {\n ChatMessage,\n ChatMessageStatus as ChatMessageStatusValue,\n ChatMessageStatusIcons,\n ChatMessageStatusRenderContext,\n} from \"./types\";\nimport { resolveChatMessageStatusIcon, resolveChatMessageStatusLabel } from \"./utils\";\n\nexport interface ChatMessageStatusProps {\n className?: string;\n message: ChatMessage;\n status: ChatMessageStatusValue;\n statusIcons?: ChatMessageStatusIcons & Record<string, string | undefined>;\n renderStatus?: (ctx: ChatMessageStatusRenderContext) => React.ReactNode;\n}\n\nexport function ChatMessageStatus({ className, message, status, statusIcons, renderStatus }: ChatMessageStatusProps) {\n if (renderStatus) {\n const custom = renderStatus({ message, status });\n if (custom != null) {\n return (\n <span\n className={cn(\"smwb-chat-message__status\", `smwb-chat-message__status_${status}`, className)}\n data-testid=\"chat-message-status\"\n >\n {custom}\n </span>\n );\n }\n }\n\n const iconName = resolveChatMessageStatusIcon(status, statusIcons);\n\n if (!iconName) {\n return null;\n }\n\n const label = resolveChatMessageStatusLabel(status);\n const filled = status === \"read\";\n\n return (\n <span\n className={cn(\"smwb-chat-message__status\", `smwb-chat-message__status_${status}`, className)}\n data-testid=\"chat-message-status\"\n aria-label={label}\n title={label}\n >\n <Icon name={iconName} size={14} fill={filled ? 1 : 0} />\n </span>\n );\n}\n\nexport default ChatMessageStatus;\n","import React, { ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Typography from \"../typography/typography\";\nimport ChatAttachments from \"./chatAttachments\";\nimport ChatMessageAvatar from \"./chatMessageAvatar\";\nimport ChatMessageStatus from \"./chatMessageStatus\";\nimport {\n ChatAuthor,\n ChatAttachment,\n ChatMessage,\n ChatMessageStatusIcons,\n ChatMessageStatusRenderContext,\n ChatMessageStatus as ChatMessageStatusValue,\n} from \"./types\";\nimport { formatChatTimestamp } from \"./utils\";\n\nexport interface ChatMessageBubbleProps {\n className?: string;\n align: \"start\" | \"end\";\n message: ChatMessage;\n author?: ChatAuthor;\n text?: ReactNode;\n attachments?: ChatAttachment[];\n timestamp?: string | Date;\n status?: ChatMessageStatusValue;\n showAvatars?: boolean;\n showAttachments?: boolean;\n showStatus?: boolean;\n statusIcons?: ChatMessageStatusIcons & Record<string, string | undefined>;\n renderStatus?: (ctx: ChatMessageStatusRenderContext) => ReactNode;\n bubbleClassName?: string;\n}\n\nexport function ChatMessageBubble({\n className,\n align,\n message,\n author,\n text,\n attachments,\n timestamp,\n status,\n showAvatars = false,\n showAttachments = false,\n showStatus = false,\n statusIcons,\n renderStatus,\n bubbleClassName,\n}: ChatMessageBubbleProps) {\n const time = formatChatTimestamp(timestamp);\n const deliveryStatus = status ?? message.status;\n const shouldShowStatus = showStatus && align === \"end\" && deliveryStatus;\n\n return (\n <div\n className={cn(\"smwb-chat-message\", `smwb-chat-message_${align}`, className)}\n data-testid={`chat-message-${align}`}\n >\n {align === \"start\" ? <ChatMessageAvatar author={author} enabled={showAvatars} /> : null}\n <div className=\"smwb-chat-message__content\">\n {author?.name ? (\n <Typography variant=\"caption\" className=\"smwb-chat-message__author\">\n {author.name}\n </Typography>\n ) : null}\n <div className={cn(\"smwb-chat-message__bubble\", bubbleClassName)}>\n {text ? <div className=\"smwb-chat-message__text\">{text}</div> : null}\n <ChatAttachments attachments={attachments} enabled={showAttachments} />\n </div>\n {time || shouldShowStatus ? (\n <div className=\"smwb-chat-message__meta\" data-testid=\"chat-message-meta\">\n {time ? (\n <Typography variant=\"caption\" className=\"smwb-chat-message__time\">\n {time}\n </Typography>\n ) : null}\n {shouldShowStatus ? (\n <ChatMessageStatus\n message={message}\n status={deliveryStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n {align === \"end\" ? <ChatMessageAvatar author={author} enabled={showAvatars} /> : null}\n </div>\n );\n}\n\nexport default ChatMessageBubble;\n","import React from \"react\";\nimport ChatMessageBubble from \"./chatMessageBubble\";\nimport { ChatMessage, ChatMessageRenderContext } from \"./types\";\n\nexport interface ChatMessageIncomingProps extends ChatMessageRenderContext {\n message: ChatMessage;\n className?: string;\n}\n\nexport function ChatMessageIncoming({ message, showAvatars, showAttachments, className }: ChatMessageIncomingProps) {\n return (\n <ChatMessageBubble\n className={className}\n align=\"start\"\n message={message}\n author={message.author}\n text={message.text}\n attachments={message.attachments}\n timestamp={message.timestamp}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n bubbleClassName=\"smwb-chat-message__bubble_incoming\"\n />\n );\n}\n\nexport default ChatMessageIncoming;\n","import React from \"react\";\nimport ChatMessageBubble from \"./chatMessageBubble\";\nimport { ChatMessage, ChatMessageRenderContext } from \"./types\";\n\nexport interface ChatMessageOutgoingProps extends ChatMessageRenderContext {\n message: ChatMessage;\n className?: string;\n}\n\nexport function ChatMessageOutgoing({\n message,\n showAvatars,\n showAttachments,\n showStatus,\n statusIcons,\n renderStatus,\n className,\n}: ChatMessageOutgoingProps) {\n return (\n <ChatMessageBubble\n className={className}\n align=\"end\"\n message={message}\n author={message.author}\n text={message.text}\n attachments={message.attachments}\n timestamp={message.timestamp}\n status={message.status}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n showStatus={showStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n bubbleClassName=\"smwb-chat-message__bubble_outgoing\"\n />\n );\n}\n\nexport default ChatMessageOutgoing;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport Typography from \"../typography/typography\";\nimport { ChatMessage } from \"./types\";\n\nexport interface ChatMessageSystemProps {\n message: ChatMessage;\n className?: string;\n}\n\nexport function ChatMessageSystem({ message, className }: ChatMessageSystemProps) {\n const content = message.content ?? message.text;\n\n if (!content) {\n return null;\n }\n\n return (\n <div className={cn(\"smwb-chat-message-system\", className)} data-testid=\"chat-message-system\">\n <Typography variant=\"caption\">{content}</Typography>\n </div>\n );\n}\n\nexport default ChatMessageSystem;\n","import React, { ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport ChatMessageIncoming from \"./chatMessageIncoming\";\nimport ChatMessageOutgoing from \"./chatMessageOutgoing\";\nimport ChatMessageSystem from \"./chatMessageSystem\";\nimport { ChatMessage, ChatMessageRenderContext } from \"./types\";\n\nexport interface ChatMessageItemProps extends ChatMessageRenderContext {\n message: ChatMessage;\n className?: string;\n renderMessage?: (message: ChatMessage, ctx: ChatMessageRenderContext) => ReactNode;\n}\n\nexport function ChatMessageItem({\n message,\n showAvatars,\n showAttachments,\n showStatus,\n statusIcons,\n renderStatus,\n className,\n renderMessage,\n}: ChatMessageItemProps) {\n const ctx = { showAvatars, showAttachments, showStatus, statusIcons, renderStatus };\n\n if (renderMessage) {\n return <div className={cn(\"smwb-chat-message-item\", className)}>{renderMessage(message, ctx)}</div>;\n }\n\n switch (message.variant) {\n case \"outgoing\":\n return (\n <ChatMessageOutgoing\n message={message}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n showStatus={showStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n className={className}\n />\n );\n case \"system\":\n return <ChatMessageSystem message={message} className={className} />;\n case \"custom\":\n return (\n <div\n className={cn(\"smwb-chat-message-item\", \"smwb-chat-message-item_custom\", className)}\n data-testid=\"chat-message-custom\"\n >\n {message.content ?? message.text}\n </div>\n );\n case \"incoming\":\n default:\n return (\n <ChatMessageIncoming\n message={message}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n className={className}\n />\n );\n }\n}\n\nexport default ChatMessageItem;\n","import { CSSProperties, forwardRef, HTMLAttributes } from \"react\";\nimport cn from \"clsx\";\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLElement> {\n className?: string;\n /** Shape of the placeholder. */\n variant?: \"text\" | \"circular\" | \"rounded\" | \"rectangular\";\n /** Width — number (px) or any CSS length. */\n width?: number | string;\n /** Height — number (px) or any CSS length. */\n height?: number | string;\n /** Shimmer animation; pass false to disable. */\n animation?: \"pulse\" | \"wave\" | false;\n /** Render N stacked placeholders. */\n count?: number;\n /** Stagger consecutive items by N ms (with `count`). */\n animationDelay?: number;\n /** Root element. */\n component?: \"span\" | \"div\";\n}\n\nconst toCssSize = (value?: number | string): string | undefined => (typeof value === \"number\" ? `${value}px` : value);\n\nexport const Skeleton = forwardRef<HTMLElement, SkeletonProps>(function Skeleton(\n {\n className,\n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n count = 1,\n animationDelay,\n component = \"span\",\n style,\n ...props\n },\n ref\n) {\n const skeletonClassName = cn(\n \"smwb-skeleton\",\n `smwb-skeleton_${variant}`,\n animation === false ? \"smwb-skeleton_no-animation\" : `smwb-skeleton_${animation}`,\n className\n );\n\n const Tag = component as \"span\";\n\n const renderOne = (i: number) => {\n const inlineStyle: CSSProperties = {\n ...style,\n width: toCssSize(width),\n height: toCssSize(height),\n ...(animationDelay ? { animationDelay: `${i * animationDelay}ms` } : {}),\n };\n return (\n <Tag\n key={i}\n ref={count === 1 ? ref : undefined}\n {...(count === 1 ? props : {})}\n data-testid=\"skeleton\"\n aria-hidden=\"true\"\n className={skeletonClassName}\n style={inlineStyle}\n />\n );\n };\n\n if (count === 1) {\n return renderOne(0);\n }\n\n return (\n <span ref={ref} {...props} className=\"smwb-skeleton__group\" aria-hidden=\"true\">\n {Array.from({ length: count }, (_, i) => renderOne(i))}\n </span>\n );\n});\n\nexport default Skeleton;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Skeleton } from \"../../feedBack/skeleton/skeleton\";\n\nexport interface ChatMessageSkeletonProps {\n className?: string;\n align?: \"start\" | \"end\";\n showAvatar?: boolean;\n lines?: number;\n}\n\nexport function ChatMessageSkeleton({\n className,\n align = \"start\",\n showAvatar = false,\n lines = 2,\n}: ChatMessageSkeletonProps) {\n const bubbleWidth = align === \"start\" ? \"72%\" : \"64%\";\n\n return (\n <div\n className={cn(\"smwb-chat-message\", `smwb-chat-message_${align}`, \"smwb-chat-message-skeleton\", className)}\n data-testid=\"chat-message-skeleton\"\n aria-hidden=\"true\"\n >\n {align === \"start\" && showAvatar ? <Skeleton variant=\"circular\" width={32} height={32} /> : null}\n <div className=\"smwb-chat-message__content\">\n <div className=\"smwb-chat-message-skeleton__bubble\">\n <Skeleton variant=\"rounded\" width={bubbleWidth} height={14} />\n {lines > 1 ? <Skeleton variant=\"rounded\" width=\"48%\" height={14} /> : null}\n </div>\n </div>\n {align === \"end\" && showAvatar ? <Skeleton variant=\"circular\" width={32} height={32} /> : null}\n </div>\n );\n}\n\nexport default ChatMessageSkeleton;\n","import { RefObject, useEffect, useRef } from \"react\";\n\nexport interface UseChatInfiniteScrollParams {\n containerRef: RefObject<HTMLElement | null>;\n onLoadMore?: () => void | Promise<void>;\n hasMore?: boolean;\n loading?: boolean;\n rootMargin?: string;\n}\n\nexport function useChatInfiniteScroll({\n containerRef,\n onLoadMore,\n hasMore = false,\n loading = false,\n rootMargin = \"80px\",\n}: UseChatInfiniteScrollParams) {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const loadingRef = useRef(loading);\n\n loadingRef.current = loading;\n\n useEffect(() => {\n const root = containerRef.current;\n const sentinel = sentinelRef.current;\n\n if (!root || !sentinel || !hasMore || !onLoadMore || typeof IntersectionObserver === \"undefined\") {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting) && !loadingRef.current) {\n void onLoadMore();\n }\n },\n { root, rootMargin, threshold: 0 }\n );\n\n observer.observe(sentinel);\n\n return () => observer.disconnect();\n }, [containerRef, hasMore, onLoadMore, rootMargin]);\n\n return { sentinelRef };\n}\n","import { RefObject, useEffect, useLayoutEffect, useRef } from \"react\";\n\nexport interface UseChatStickToBottomParams {\n containerRef: RefObject<HTMLElement | null>;\n messages: readonly { id: string }[];\n threshold?: number;\n}\n\nexport function isScrolledToBottom(element: HTMLElement, threshold = 24): boolean {\n return element.scrollHeight - element.scrollTop - element.clientHeight <= threshold;\n}\n\nexport function scrollChatToBottom(element: HTMLElement): void {\n element.scrollTop = element.scrollHeight;\n}\n\nexport function useChatStickToBottom({ containerRef, messages, threshold = 24 }: UseChatStickToBottomParams) {\n const isAtBottomRef = useRef(true);\n const previousScrollHeightRef = useRef(0);\n const previousFirstMessageIdRef = useRef<string | undefined>();\n const previousLastMessageIdRef = useRef<string | undefined>();\n\n useEffect(() => {\n const element = containerRef.current;\n\n if (!element) {\n return;\n }\n\n const handleScroll = () => {\n isAtBottomRef.current = isScrolledToBottom(element, threshold);\n };\n\n handleScroll();\n element.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => element.removeEventListener(\"scroll\", handleScroll);\n }, [containerRef, threshold]);\n\n useLayoutEffect(() => {\n const element = containerRef.current;\n\n if (!element) {\n return;\n }\n\n const previousScrollHeight = previousScrollHeightRef.current;\n const previousFirstMessageId = previousFirstMessageIdRef.current;\n const previousLastMessageId = previousLastMessageIdRef.current;\n const firstMessageId = messages[0]?.id;\n const lastMessageId = messages[messages.length - 1]?.id;\n\n if (previousFirstMessageId === undefined) {\n scrollChatToBottom(element);\n isAtBottomRef.current = true;\n } else {\n const prepended =\n firstMessageId !== undefined &&\n firstMessageId !== previousFirstMessageId &&\n lastMessageId === previousLastMessageId;\n const appended = lastMessageId !== undefined && lastMessageId !== previousLastMessageId;\n\n if (prepended && previousScrollHeight > 0) {\n element.scrollTop += element.scrollHeight - previousScrollHeight;\n } else if (appended && isAtBottomRef.current) {\n scrollChatToBottom(element);\n }\n }\n\n previousScrollHeightRef.current = element.scrollHeight;\n previousFirstMessageIdRef.current = firstMessageId;\n previousLastMessageIdRef.current = lastMessageId;\n }, [containerRef, messages]);\n}\n","import React, { useRef } from \"react\";\nimport cn from \"clsx\";\nimport ChatMessageItem, { ChatMessageItemProps } from \"./chatMessageItem\";\nimport ChatMessageSkeleton from \"./chatMessageSkeleton\";\nimport { useChatInfiniteScroll } from \"./useChatInfiniteScroll\";\nimport { useChatStickToBottom } from \"./useChatStickToBottom\";\nimport { ChatMessage, ChatMessageRenderContext } from \"./types\";\n\nexport interface ChatMessagesProps extends ChatMessageRenderContext {\n className?: string;\n messages: ChatMessage[];\n onLoadMore?: () => void | Promise<void>;\n hasMore?: boolean;\n loading?: boolean;\n loadingMore?: boolean;\n loadingSkeletonCount?: number;\n renderMessage?: ChatMessageItemProps[\"renderMessage\"];\n}\n\nexport function ChatMessages({\n className,\n messages,\n showAvatars,\n showAttachments,\n showStatus,\n statusIcons,\n renderStatus,\n onLoadMore,\n hasMore = false,\n loading = false,\n loadingMore = false,\n loadingSkeletonCount = 3,\n renderMessage,\n}: ChatMessagesProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const { sentinelRef } = useChatInfiniteScroll({\n containerRef,\n onLoadMore,\n hasMore,\n loading: loadingMore || loading,\n });\n\n useChatStickToBottom({\n containerRef,\n messages,\n });\n\n const showSkeletons = loading || loadingMore;\n const skeletonAligns = (index: number): \"start\" | \"end\" => (index % 2 === 0 ? \"start\" : \"end\");\n\n return (\n <div ref={containerRef} className={cn(\"smwb-chat-messages\", className)} data-testid=\"chat-messages\">\n <div ref={sentinelRef} className=\"smwb-chat-messages__sentinel\" data-testid=\"chat-messages-sentinel\" />\n {showSkeletons ? (\n <div\n className=\"smwb-chat-messages__skeletons\"\n data-testid=\"chat-messages-skeletons\"\n aria-busy=\"true\"\n aria-label=\"Loading messages\"\n >\n {Array.from({ length: loadingSkeletonCount }, (_, index) => (\n <ChatMessageSkeleton\n key={index}\n align={skeletonAligns(index)}\n showAvatar={showAvatars}\n lines={index % 2 === 0 ? 2 : 1}\n />\n ))}\n </div>\n ) : null}\n {!loading\n ? messages.map((message) => (\n <ChatMessageItem\n key={message.id}\n message={message}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n showStatus={showStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n renderMessage={renderMessage}\n />\n ))\n : null}\n </div>\n );\n}\n\nexport default ChatMessages;\n","import React, { PropsWithChildren, ReactNode, useEffect } from \"react\";\nimport cn from \"clsx\";\nimport { createPortal } from \"react-dom\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { ChatAnchor, ChatLayoutMode, ChatThemeMode } from \"./types\";\n\nexport interface ChatShellProps extends PropsWithChildren {\n className?: string;\n layout: ChatLayoutMode;\n anchor?: ChatAnchor;\n themeMode?: ChatThemeMode;\n embedded?: boolean;\n overlayContext?: boolean;\n header?: ReactNode;\n footer?: ReactNode;\n fileDropzoneRootProps?: React.HTMLAttributes<HTMLDivElement>;\n fileDropzoneActive?: boolean;\n}\n\nexport function ChatShell({\n className,\n layout,\n anchor = \"bottom-right\",\n themeMode = \"inherit\",\n embedded = false,\n overlayContext = false,\n header,\n footer,\n children,\n fileDropzoneRootProps,\n fileDropzoneActive = false,\n}: ChatShellProps) {\n const [domRoot, setDomRoot] = React.useState<HTMLElement>();\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n useEffect(() => {\n if (layout !== \"fullscreen\") {\n return;\n }\n\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = prev;\n };\n }, [layout]);\n\n if (layout === \"closed\") {\n return null;\n }\n\n const { className: dropzoneClassName, ...dropzoneRootProps } = fileDropzoneRootProps ?? {};\n\n const panel = (\n <div\n {...dropzoneRootProps}\n className={cn(\n \"smwb-chat-shell\",\n `smwb-chat-shell_${layout}`,\n !embedded && `smwb-chat-shell_${anchor}`,\n {\n \"smwb-dark\": themeMode === \"dark\",\n \"smwb-chat-shell_embedded\": embedded,\n \"smwb-chat-shell_overlay-context\": overlayContext,\n \"smwb-chat-dropzone_active\": fileDropzoneActive,\n },\n dropzoneClassName,\n className\n )}\n data-testid=\"chat-shell\"\n data-layout={layout}\n >\n {header ? <div className=\"smwb-chat-shell__header\">{header}</div> : null}\n <div className=\"smwb-chat-shell__body\">{children}</div>\n {footer ? <div className=\"smwb-chat-shell__footer\">{footer}</div> : null}\n </div>\n );\n\n if (layout === \"fullscreen\" && domRoot) {\n return createPortal(panel, domRoot);\n }\n\n return panel;\n}\n\nexport default ChatShell;\n","import { useDropzone, type Accept } from \"react-dropzone\";\nimport { CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES } from \"./types\";\n\nexport interface UseChatFileUploadOptions {\n enabled?: boolean;\n accept?: Accept;\n maxFiles?: number;\n onUploadFiles?: (files: File[]) => void | Promise<void>;\n disabled?: boolean;\n}\n\nexport function resolveChatFileUploadMaxFiles(maxFiles?: number): number {\n if (maxFiles == null) {\n return CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES;\n }\n\n return Math.max(1, maxFiles);\n}\n\nexport function useChatFileUpload({\n enabled = false,\n accept,\n maxFiles,\n onUploadFiles,\n disabled = false,\n}: UseChatFileUploadOptions) {\n const resolvedMaxFiles = resolveChatFileUploadMaxFiles(maxFiles);\n const active = enabled && Boolean(onUploadFiles) && !disabled;\n\n const { getRootProps, getInputProps, open, isDragActive, inputRef } = useDropzone({\n accept,\n maxFiles: resolvedMaxFiles,\n multiple: resolvedMaxFiles > 1,\n disabled: !active,\n noClick: true,\n noKeyboard: true,\n useFsAccessApi: false,\n onDropAccepted: (files) => {\n if (onUploadFiles) {\n void onUploadFiles(files);\n }\n },\n });\n\n const openFilePicker = () => {\n open?.();\n };\n\n return {\n enabled: active,\n maxFiles: resolvedMaxFiles,\n getRootProps,\n getInputProps,\n open: openFilePicker,\n inputRef,\n isDragActive,\n };\n}\n\nexport default useChatFileUpload;\n","import React, { PropsWithChildren, ReactNode, useId, useMemo } from \"react\";\nimport cn from \"clsx\";\nimport type { Accept } from \"react-dropzone\";\nimport { FloatingButton } from \"../../inputs/floatingButton/floatingButton\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport ChatComposer from \"./chatComposer\";\nimport ChatHeader from \"./chatHeader\";\nimport ChatMessages, { ChatMessagesProps } from \"./chatMessages\";\nimport ChatShell from \"./chatShell\";\nimport useChatFileUpload from \"./useChatFileUpload\";\nimport {\n ChatAnchor,\n ChatLayoutMode,\n ChatMessage,\n ChatMessageRenderContext,\n ChatThemeMode,\n CHAT_EXPAND_LAYOUTS,\n} from \"./types\";\nimport { pickInitialLayout, resolveAllowedLayouts, shouldShowChatCloseButton } from \"./utils\";\n\nexport interface ChatProps\n extends PropsWithChildren, Omit<ChatMessageRenderContext, \"showAvatars\" | \"showAttachments\"> {\n className?: string;\n messages: ChatMessage[];\n showAvatars?: boolean;\n showAttachments?: boolean;\n headerTitle?: ReactNode;\n headerSubtitle?: ReactNode;\n headerActions?: ReactNode;\n footer?: ReactNode;\n anchor?: ChatAnchor;\n themeMode?: ChatThemeMode;\n allowedLayouts?: ChatLayoutMode[];\n layout?: ChatLayoutMode;\n defaultLayout?: ChatLayoutMode;\n onLayoutChange?: (layout: ChatLayoutMode) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n floatingTrigger?: boolean;\n triggerIcon?: ReactNode;\n triggerLabel?: string;\n onLoadMore?: () => void | Promise<void>;\n hasMore?: boolean;\n onSendMessage?: (text: string) => void | Promise<void>;\n composerPlaceholder?: string;\n composerDisabled?: boolean;\n composerShiftEnterNewline?: boolean;\n composerCtrlEnterNewline?: boolean;\n fileUpload?: boolean;\n onUploadFiles?: (files: File[]) => void | Promise<void>;\n fileUploadAccept?: Accept;\n fileUploadMaxFiles?: number;\n attachAriaLabel?: string;\n loading?: boolean;\n loadingMore?: boolean;\n loadingSkeletonCount?: number;\n renderMessage?: ChatMessagesProps[\"renderMessage\"];\n embedded?: boolean;\n overlayContext?: boolean;\n showStatus?: boolean;\n statusIcons?: ChatMessageRenderContext[\"statusIcons\"];\n renderStatus?: ChatMessageRenderContext[\"renderStatus\"];\n showCloseButton?: boolean;\n}\n\nexport function Chat({\n className,\n messages,\n showAvatars = false,\n showAttachments = false,\n headerTitle,\n headerSubtitle,\n headerActions,\n footer,\n children,\n anchor = \"bottom-right\",\n themeMode = \"inherit\",\n allowedLayouts: allowedLayoutsProp,\n layout: layoutProp,\n defaultLayout,\n onLayoutChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n floatingTrigger = false,\n triggerIcon,\n triggerLabel,\n onLoadMore,\n hasMore,\n onSendMessage,\n composerPlaceholder = \"message\",\n composerDisabled,\n composerShiftEnterNewline = true,\n composerCtrlEnterNewline = true,\n fileUpload = false,\n onUploadFiles,\n fileUploadAccept,\n fileUploadMaxFiles,\n attachAriaLabel,\n loading,\n loadingMore,\n loadingSkeletonCount,\n renderMessage,\n embedded = false,\n overlayContext = false,\n showStatus = false,\n statusIcons,\n renderStatus,\n showCloseButton,\n}: ChatProps) {\n const allowedLayouts = useMemo(\n () => resolveAllowedLayouts(allowedLayoutsProp ?? CHAT_EXPAND_LAYOUTS),\n [allowedLayoutsProp]\n );\n\n const [open, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const [layout, setLayout] = useControllableState<ChatLayoutMode>({\n value: layoutProp,\n defaultValue: pickInitialLayout(allowedLayouts, defaultLayout),\n onChange: onLayoutChange,\n });\n\n const effectiveLayout: ChatLayoutMode = embedded\n ? \"fullHeight\"\n : floatingTrigger\n ? open\n ? layout\n : \"closed\"\n : layout;\n\n const handleOpen = () => {\n setOpen(true);\n if (layout === \"closed\") {\n setLayout(pickInitialLayout(allowedLayouts, defaultLayout));\n }\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const handleLayoutChange = (next: ChatLayoutMode) => {\n setOpen(true);\n setLayout(next);\n };\n\n const {\n enabled: fileUploadEnabled,\n getRootProps,\n getInputProps,\n isDragActive,\n } = useChatFileUpload({\n enabled: fileUpload,\n accept: fileUploadAccept,\n maxFiles: fileUploadMaxFiles,\n onUploadFiles,\n disabled: composerDisabled,\n });\n\n const attachInputId = useId();\n\n const showComposer = Boolean(onSendMessage) || fileUploadEnabled;\n\n const fileInput = fileUploadEnabled ? (\n <input {...getInputProps({ id: attachInputId })} data-testid=\"chat-file-input\" />\n ) : null;\n\n const resolvedFooter =\n footer ??\n children ??\n (showComposer ? (\n <>\n {fileInput}\n <ChatComposer\n onSendMessage={onSendMessage}\n placeholder={composerPlaceholder}\n disabled={composerDisabled}\n shiftEnterNewline={composerShiftEnterNewline}\n ctrlEnterNewline={composerCtrlEnterNewline}\n fileUpload={fileUploadEnabled}\n attachInputId={fileUploadEnabled ? attachInputId : undefined}\n attachAriaLabel={attachAriaLabel}\n />\n </>\n ) : undefined);\n\n const chatMessages = (\n <ChatMessages\n messages={messages}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n showStatus={showStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n onLoadMore={onLoadMore}\n hasMore={hasMore}\n loading={loading}\n loadingMore={loadingMore}\n loadingSkeletonCount={loadingSkeletonCount}\n renderMessage={renderMessage}\n />\n );\n\n const chatBody = chatMessages;\n\n const fileDropzoneRootProps = fileUploadEnabled ? getRootProps() : undefined;\n\n const closeButtonVisible = shouldShowChatCloseButton({\n floatingTrigger,\n embedded,\n overlayContext,\n effectiveLayout,\n showCloseButton,\n });\n\n return (\n <div\n className={cn(\n \"smwb-chat\",\n !embedded && `smwb-chat_${anchor}`,\n embedded && \"smwb-chat_embedded\",\n overlayContext && \"smwb-chat_overlay-context\",\n className\n )}\n data-testid=\"chat\"\n >\n {floatingTrigger && !embedded && !open ? (\n <FloatingButton\n className=\"smwb-chat__trigger\"\n aria-label={triggerLabel ?? \"Open chat\"}\n data-testid=\"chat-trigger\"\n onClick={handleOpen}\n >\n {triggerIcon ?? <Icon name=\"chat\" size={24} />}\n </FloatingButton>\n ) : null}\n <ChatShell\n layout={effectiveLayout}\n anchor={anchor}\n themeMode={themeMode}\n embedded={embedded}\n overlayContext={overlayContext}\n fileDropzoneRootProps={fileDropzoneRootProps}\n fileDropzoneActive={fileUploadEnabled && isDragActive}\n header={\n <ChatHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n layout={effectiveLayout === \"closed\" ? layout : effectiveLayout}\n allowedLayouts={allowedLayouts}\n onLayoutChange={handleLayoutChange}\n onClose={closeButtonVisible ? handleClose : undefined}\n />\n }\n footer={resolvedFooter}\n >\n {chatBody}\n </ChatShell>\n </div>\n );\n}\n\nexport default Chat;\n","import React, { CSSProperties, HTMLAttributes, PropsWithChildren, useEffect } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport ChatIconButton from \"./chatIconButton\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport Chat, { ChatProps } from \"./chat\";\nimport { ChatAnchor, ChatLayoutSide } from \"./types\";\n\nconst len = (value: number | string) => (typeof value === \"number\" ? `${value}px` : value);\n\nconst floatingAnchorForSide = (side: ChatLayoutSide): ChatAnchor => (side === \"left\" ? \"bottom-left\" : \"bottom-right\");\n\nexport type ChatLayoutChatProps = Omit<\n ChatProps,\n | \"className\"\n | \"embedded\"\n | \"floatingTrigger\"\n | \"anchor\"\n | \"allowedLayouts\"\n | \"layout\"\n | \"defaultLayout\"\n | \"open\"\n | \"defaultOpen\"\n | \"onOpenChange\"\n | \"onLayoutChange\"\n>;\n\nexport interface ChatLayoutProps extends PropsWithChildren, HTMLAttributes<HTMLDivElement> {\n className?: string;\n contentClassName?: string;\n chatClassName?: string;\n side?: ChatLayoutSide;\n chatWidth?: number | string;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n collapseAriaLabel?: string;\n expandAriaLabel?: string;\n floatingAnchor?: ChatAnchor;\n chat: ChatLayoutChatProps;\n}\n\nexport function ChatLayout({\n className,\n contentClassName,\n chatClassName,\n side = \"right\",\n chatWidth = 400,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseAriaLabel = \"Collapse chat panel\",\n expandAriaLabel = \"Expand chat panel\",\n floatingAnchor,\n chat,\n children,\n style,\n ...rest\n}: ChatLayoutProps) {\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n value: collapsedProp,\n defaultValue: defaultCollapsed,\n onChange: onCollapsedChange,\n });\n\n const [floatingOpen, setFloatingOpen] = useControllableState<boolean>({\n defaultValue: false,\n });\n\n useEffect(() => {\n if (!collapsed) {\n setFloatingOpen(false);\n }\n }, [collapsed, setFloatingOpen]);\n\n const anchor = floatingAnchor ?? floatingAnchorForSide(side);\n const dockIcon = side === \"left\" ? \"dock_to_left\" : \"dock_to_right\";\n const collapseIcon = side === \"left\" ? \"left_panel_close\" : \"right_panel_close\";\n\n const collapseButton = (\n <ChatIconButton\n aria-label={collapseAriaLabel}\n data-testid=\"chat-layout-collapse\"\n onClick={() => setCollapsed(true)}\n >\n <Icon name={collapseIcon} size={18} />\n </ChatIconButton>\n );\n\n const expandButton = (\n <ChatIconButton aria-label={expandAriaLabel} data-testid=\"chat-layout-expand\" onClick={() => setCollapsed(false)}>\n <Icon name={dockIcon} size={18} />\n </ChatIconButton>\n );\n\n const dockedHeaderActions = (\n <>\n {chat.headerActions}\n {collapseButton}\n </>\n );\n\n const floatingHeaderActions = (\n <>\n {chat.headerActions}\n {expandButton}\n </>\n );\n\n const cssVars = {\n \"--smwb-chat-layout-w\": len(chatWidth),\n } as CSSProperties;\n\n if (collapsed) {\n return (\n <div\n className={cn(\"smwb-chat-layout\", \"smwb-chat-layout_collapsed\", className)}\n style={{ ...cssVars, ...style }}\n data-testid=\"chat-layout\"\n data-collapsed=\"true\"\n {...rest}\n >\n <div className={cn(\"smwb-chat-layout__content\", contentClassName)} data-testid=\"chat-layout-content\">\n {children}\n </div>\n <Chat\n {...chat}\n className={chatClassName}\n floatingTrigger\n anchor={anchor}\n allowedLayouts={[\"floating\"]}\n layout=\"floating\"\n open={floatingOpen}\n onOpenChange={setFloatingOpen}\n headerActions={floatingHeaderActions}\n />\n </div>\n );\n }\n\n const panel = (\n <aside className=\"smwb-chat-layout__panel\" data-testid=\"chat-layout-panel\">\n <Chat {...chat} className={chatClassName} embedded allowedLayouts={[]} headerActions={dockedHeaderActions} />\n </aside>\n );\n\n return (\n <div\n className={cn(\"smwb-chat-layout\", `smwb-chat-layout_${side}`, className)}\n style={{ ...cssVars, ...style }}\n data-testid=\"chat-layout\"\n data-collapsed=\"false\"\n {...rest}\n >\n {side === \"left\" ? panel : null}\n <div className={cn(\"smwb-chat-layout__content\", contentClassName)} data-testid=\"chat-layout-content\">\n {children}\n </div>\n {side === \"right\" ? panel : null}\n </div>\n );\n}\n\nexport default ChatLayout;\n","import React, { forwardRef, HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n className?: string;\n badgeContent?: React.ReactNode;\n color?: \"primary\" | \"success\" | \"danger\";\n variant?: \"inside\" | \"outside\";\n vertical?: \"top\" | \"bottom\";\n horizontal?: \"right\" | \"left\";\n /** Cap numeric content, rendering `{max}+` when exceeded. */\n max?: number;\n /** Render the badge even when content is 0. */\n showZero?: boolean;\n /** Accessible label for the badge value. */\n badgeAriaLabel?: string;\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, PropsWithChildren<BadgeProps>>(function Badge(\n {\n className,\n color = \"primary\",\n badgeContent,\n variant = \"outside\",\n vertical = \"top\",\n horizontal = \"right\",\n max,\n showZero = false,\n badgeAriaLabel,\n children,\n ...rest\n },\n ref\n) {\n const isZero = badgeContent === 0 || badgeContent === \"0\";\n const hidden = (badgeContent === undefined || badgeContent === null || (isZero && !showZero)) === true;\n\n let display: React.ReactNode = badgeContent;\n if (typeof badgeContent === \"number\" && max !== undefined && badgeContent > max) {\n display = `${max}+`;\n }\n\n const badgeClassname = cn(\n \"smwb-badge\",\n `smwb-badge_${color}`,\n `smwb-badge_${variant}`,\n `smwb-badge_${variant}_${vertical}`,\n `smwb-badge_${variant}_${vertical}_${horizontal}`,\n className,\n { \"smwb-badge_no-content\": hidden }\n );\n\n return (\n <span className=\"smwb-badge__wrapper\" data-testid=\"badge\">\n {children}\n <span ref={ref} className={badgeClassname} aria-label={badgeAriaLabel} {...rest}>\n {hidden ? null : display}\n </span>\n </span>\n );\n});\n\nexport default Badge;\n","import React, { HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n variant?: \"filled\" | \"elevated\" | \"outlined\";\n disabled?: boolean;\n title?: string;\n /** Footer slot rendered after the content. */\n footer?: ReactNode;\n /** Makes the card interactive (role=button, keyboard, focus ring). */\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport const Card = React.forwardRef<HTMLDivElement, PropsWithChildren<CardProps>>(function Card(\n { className, variant = \"elevated\", children, disabled, title, footer, onClick, onKeyDown, ...rest },\n ref\n) {\n const interactive = !!onClick && !disabled;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (interactive && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n ref={ref}\n data-testid=\"card\"\n className={cn(\"smwb-card\", `smwb-card_${variant}`, className, {\n card_disabled: disabled,\n \"smwb-card_interactive\": interactive,\n })}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n onClick={interactive ? onClick : undefined}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {title && <div className=\"smwb-card__title\">{title}</div>}\n {children}\n {footer && <div className=\"smwb-card__footer\">{footer}</div>}\n </div>\n );\n});\n\nexport default Card;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type ChipColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface ChipProps extends React.HTMLAttributes<HTMLSpanElement | HTMLAnchorElement> {\n className?: string;\n variant?: \"filled\" | \"outlined\";\n size?: \"small\" | \"medium\";\n color?: ChipColor;\n onDelete?: (event: React.SyntheticEvent) => void;\n icon?: React.ReactNode;\n deleteIcon?: React.ReactNode;\n label: string;\n onClick?: () => void;\n onDeleteMouseDown?: React.MouseEventHandler;\n disabled?: boolean;\n asLink?: boolean;\n href?: string;\n /** Open the link in a new tab (asLink only). */\n target?: string;\n selected?: boolean;\n /** Accessible label for the delete control. */\n deleteAriaLabel?: string;\n}\n\nexport const Chip = React.forwardRef<HTMLSpanElement | HTMLAnchorElement, ChipProps>(function Chip(\n {\n label,\n className,\n deleteIcon,\n icon,\n onDelete,\n onMouseDown: onMouseDownProp,\n onDeleteMouseDown: onDeleteMouseDownProp,\n asLink,\n href,\n target = \"_blank\",\n selected,\n variant = \"filled\",\n size = \"medium\",\n color = \"default\",\n disabled = false,\n onClick,\n deleteAriaLabel = \"Remove\",\n ...rest\n },\n ref\n) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLSpanElement | HTMLAnchorElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLSpanElement | HTMLAnchorElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n const onDeleteMouseDown = (event: React.MouseEvent) => {\n onDeleteMouseDownProp?.(event);\n event.stopPropagation();\n };\n\n const classes = cn(\n \"smwb-chip\",\n `smwb-${variant}`,\n `smwb-chip_size-${size}`,\n color !== \"default\" && `smwb-chip_color-${color}`,\n className,\n { \"smwb-disabled\": disabled, \"smwb-selected\": selected }\n );\n\n const deleteBtn = !!onDelete && (\n <button\n type=\"button\"\n className=\"smwb-chip__delete-icon\"\n aria-label={deleteAriaLabel}\n disabled={disabled}\n onClick={onDelete}\n onMouseDown={onDeleteMouseDown}\n >\n {deleteIcon ? deleteIcon : <Icon name=\"cancel\" size={18} fill={1} />}\n </button>\n );\n\n const inner = (\n <>\n {icon && <span className=\"smwb-chip__icon\">{icon}</span>}\n <span className=\"smwb-chip__label\">{label}</span>\n {deleteBtn}\n <Ripple actionRef={rippleRef} />\n </>\n );\n\n if (asLink && href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n data-testid=\"chip-link\"\n className={classes}\n href={href}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n target={target}\n rel=\"noreferrer\"\n {...rest}\n >\n {inner}\n </a>\n );\n }\n\n const clickable = !!onClick && !disabled;\n\n return (\n <span\n ref={ref}\n data-testid=\"chip\"\n className={classes}\n role={clickable ? \"button\" : undefined}\n tabIndex={clickable ? 0 : undefined}\n aria-disabled={disabled || undefined}\n onClick={clickable ? onClick : undefined}\n onKeyDown={\n clickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {inner}\n </span>\n );\n});\n\nexport default Chip;\n","import React, { forwardRef, PropsWithChildren, useEffect, useRef, useState } from \"react\";\nimport { CSSTransition } from \"react-transition-group\";\nimport { createPortal } from \"react-dom\";\nimport cn from \"clsx\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport interface ModalProps {\n size?: \"small\" | \"medium\" | \"large\" | \"fullscreen\";\n closeOnOutsideClick?: boolean;\n onClose?: () => void;\n open: boolean;\n animation?: \"fade\" | \"scale\" | \"drop\";\n className?: string;\n backdrop?: \"blured\" | \"dark\" | \"transparent\" | \"darkBlured\";\n asForm?: boolean;\n disableAppearAnimation?: boolean;\n /** ARIA role of the dialog. */\n role?: \"dialog\" | \"alertdialog\";\n /** Close the modal when Escape is pressed. */\n closeOnEsc?: boolean;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n}\n\nconst ModalBase = forwardRef<HTMLDivElement, PropsWithChildren<ModalProps>>(function Modal(\n {\n children,\n onClose,\n open,\n className,\n animation = \"fade\",\n backdrop = \"dark\",\n size = \"large\",\n closeOnOutsideClick = true,\n asForm = false,\n disableAppearAnimation = false,\n role = \"dialog\",\n closeOnEsc = true,\n ...rest\n },\n ref\n) {\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n\n const nodeRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const forkedContentRef = useForkRef<HTMLDivElement>(ref, contentRef);\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n useEffect(() => {\n if (!open || !closeOnEsc || !onClose) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [open, closeOnEsc, onClose]);\n\n if (!domRoot) {\n return <></>;\n }\n\n const Component = (asForm ? \"form\" : \"div\") as \"div\";\n\n return createPortal(\n <CSSTransition\n timeout={{\n appear: 225,\n enter: 225,\n exit: 150,\n }}\n in={open}\n classNames={{\n appear: \"smwb-modal__overlay-appear\",\n appearActive: \"smwb-modal__overlay-appear-active\",\n appearDone: \"smwb-modal__overlay-appear-done\",\n enter: \"smwb-modal__overlay-enter\",\n enterActive: \"smwb-modal__overlay-enter-active\",\n enterDone: \"smwb-modal__overlay-enter-done\",\n exit: \"smwb-modal__overlay-exit\",\n exitActive: \"smwb-modal__overlay-exit-active\",\n }}\n appear={!disableAppearAnimation}\n mountOnEnter\n unmountOnExit\n nodeRef={nodeRef}\n >\n <div\n ref={nodeRef}\n className={cn(\"smwb-modal__overlay\", `smwb-${backdrop}`, `smwb-${size}`)}\n onClick={closeOnOutsideClick && onClose ? onClose : undefined}\n >\n <Component\n ref={forkedContentRef}\n className={cn(\"smwb-modal\", `smwb-${size}`, `smwb-${animation}`, className)}\n onClick={(e) => e.stopPropagation()}\n role={role}\n aria-modal=\"true\"\n {...rest}\n >\n {children}\n </Component>\n </div>\n </CSSTransition>,\n domRoot\n );\n});\n\nexport interface HeaderProps {\n className?: string;\n}\n\nexport function Header({ className, children }: PropsWithChildren<HeaderProps>) {\n return <div className={cn(\"smwb-modal__header\", className)}>{children}</div>;\n}\n\nexport interface ContentProps {\n className?: string;\n}\n\nexport function Content({ className, children }: PropsWithChildren<ContentProps>) {\n return <div className={cn(\"smwb-modal__content\", className)}>{children}</div>;\n}\n\nexport interface FooterProps {\n className?: string;\n}\n\nexport function Footer({ className, children }: PropsWithChildren<FooterProps>) {\n return <div className={cn(\"smwb-modal__footer\", className)}>{children}</div>;\n}\n\nexport const Modal = Object.assign(ModalBase, {\n Footer,\n Header,\n Content,\n});\n\nexport default Modal;\n","import React from \"react\";\n\nexport function getActiveSlideDotsLength(slidesCount: number, slidesToShow: number): number {\n const dots = Math.floor(slidesCount / slidesToShow);\n\n return slidesCount % slidesToShow === 0 ? dots - 1 : dots;\n}\n\nexport function getSlideIndexForMultipleParts(\n activeIndex: number,\n slidesToShow: number,\n slidesCount: number,\n isNextSlideDisabled: boolean\n): number {\n const dotsLength = getActiveSlideDotsLength(slidesCount, slidesToShow);\n\n if (activeIndex === slidesCount + slidesToShow) {\n return 0;\n }\n\n if (isNextSlideDisabled || (activeIndex < slidesToShow && activeIndex !== 0)) {\n return dotsLength;\n }\n\n if (activeIndex === 0) {\n return slidesCount % slidesToShow === 0 ? dotsLength : dotsLength - 1;\n }\n\n return slidesToShow > 0 ? Math.floor(activeIndex / slidesToShow) - 1 : 0;\n}\n\nexport function isReactEvent(event: React.SyntheticEvent | Event): event is React.SyntheticEvent {\n return !(event instanceof Event);\n}\n\nexport function isMouseEvent(\n event: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent\n): event is React.MouseEvent | MouseEvent {\n return (isReactEvent(event) && event.nativeEvent instanceof MouseEvent) || event instanceof MouseEvent;\n}\n\nexport function isTouchEvent(\n event: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent\n): event is React.TouchEvent | TouchEvent {\n return (\n window.TouchEvent &&\n ((isReactEvent(event) && event.nativeEvent instanceof TouchEvent) || event instanceof TouchEvent)\n );\n}\n\nexport function coordX(event: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent): number {\n if (isMouseEvent(event)) {\n return event.clientX;\n }\n\n if (isTouchEvent(event)) {\n return event.changedTouches[0].clientX;\n }\n\n return 0;\n}\n\nexport function coordY(event: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent): number {\n if (isMouseEvent(event)) {\n return event.clientY;\n }\n\n if (isTouchEvent(event)) {\n return event.changedTouches[0].clientY;\n }\n\n return 0;\n}\n\nexport function dragPrevent(event: React.SyntheticEvent) {\n const target = event.target as HTMLElement;\n\n if (target.tagName === \"A\" || target.tagName === \"IMG\") {\n event.preventDefault();\n }\n}\n\nexport function getSlideStyle(slidesToShow: number): React.CSSProperties {\n const width = `${getSlideWidth(slidesToShow)}%`;\n\n return { width };\n}\n\nexport function getSlideWidth(slidesToShow: number): number {\n return 100 / slidesToShow;\n}\n\nexport function getSlidesToShow(slidesToShow: number, slidesCount: number): number {\n if (slidesToShow <= 0 || slidesCount === 0) {\n return 1;\n }\n\n if (slidesToShow > slidesCount) {\n return slidesCount;\n }\n\n return slidesToShow;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/** Number -> \"<n>px\", string -> as-is, nullish -> undefined. */\nexport function toCssLength(value?: number | string): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\n/** Number/string -> string, nullish -> undefined (for unit-less CSS values like aspect-ratio). */\nexport function toCssNumber(value?: number | string): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n return String(value);\n}\n\nexport function getStartSlide(startSlide: number, slidesCount: number): number {\n if (startSlide <= 0 || slidesCount === 0) {\n return 0;\n }\n\n const maxIndex = slidesCount - 1;\n\n if (startSlide > maxIndex) {\n return maxIndex;\n }\n\n return startSlide;\n}\n","import React from \"react\";\n\n/**\n * https://github.com/facebook/react/issues/14099#issuecomment-440013892\n */\nexport function useEventCallback<Args extends unknown[], Return>(\n fn: (...args: Args) => Return\n): (...args: Args) => Return {\n const ref = React.useRef(fn);\n\n React.useLayoutEffect(() => {\n ref.current = fn;\n });\n\n return React.useCallback((...args: Args) => (0, ref.current)(...args), []);\n}\n","import React, { forwardRef, ReactNode, useEffect, useId, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { Icon } from \"../../base/icon\";\nimport { Modal } from \"../../feedBack/modal\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport {\n clamp,\n coordX,\n coordY,\n dragPrevent,\n getSlideIndexForMultipleParts,\n getSlidesToShow,\n getSlideStyle,\n getSlideWidth,\n getStartSlide,\n isMouseEvent,\n isTouchEvent,\n toCssLength,\n toCssNumber,\n} from \"./utils\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useEventCallback } from \"../../../hooks/useEventCallback\";\n\nexport interface CarouselProps extends React.PropsWithChildren {\n slidesToShow?: number;\n startSlide?: number;\n className?: string;\n showNavigation?: boolean;\n showArrows?: boolean;\n arrowsSize?: number;\n navigationClassName?: string;\n onSlideChange?: (slideIndex: number) => void;\n navigationDotRenderer?: (index: number, isActive: boolean, onClick: (index: number) => void) => ReactNode;\n /** Accessible label for the carousel region. */\n \"aria-label\"?: string;\n /** Advance slides automatically. */\n autoplay?: boolean;\n /** Autoplay interval in ms. */\n autoplayInterval?: number;\n /** Pause autoplay while the pointer is over the carousel. */\n pauseOnHover?: boolean;\n /** Height of each cell/photo. Number is treated as px. Overrides the default 205px. */\n cellHeight?: number | string;\n /** Aspect ratio of each cell/photo (e.g. 0.9 or \"16 / 9\"). Overrides the default 0.9. */\n aspectRatio?: number | string;\n /** Per-side spacing around each slide. Number is treated as px (default 4). */\n gap?: number | string;\n /** Max width of the carousel. Number is treated as px (default 412). */\n maxWidth?: number | string;\n /** Open the clicked slide in a fullscreen lightbox (arrows / swipe / Esc to navigate & close). */\n enableFullscreen?: boolean;\n}\n\ninterface ShiftState {\n animation: boolean | undefined;\n}\n\ntype Axis = \"x\" | \"y\" | null;\n\ninterface Motion {\n isPressed: boolean;\n startX: number;\n startY: number;\n lastX: number;\n lastT: number;\n axis: Axis;\n dragged: boolean;\n}\n\nconst MOTION_INITIAL_STATE: Motion = {\n isPressed: false,\n startX: 0,\n startY: 0,\n lastX: 0,\n lastT: 0,\n axis: null,\n dragged: false,\n};\n\n// Movement (px) below which a pointer interaction is treated as a tap, not a drag.\nconst TAP_THRESHOLD = 8;\n// Flick velocity (px/ms) above which we advance a slide even on a short drag.\nconst FLICK_VELOCITY = 0.4;\n\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(function Carousel(\n {\n slidesToShow: slidesToShowProp = 3,\n startSlide: startSlideProp = 0,\n children,\n className,\n showNavigation = true,\n showArrows: showArrowsProp,\n arrowsSize = 30,\n navigationClassName,\n onSlideChange,\n navigationDotRenderer,\n \"aria-label\": ariaLabel = \"Carousel\",\n autoplay = false,\n autoplayInterval = 4000,\n pauseOnHover = true,\n cellHeight,\n aspectRatio,\n gap,\n maxWidth,\n enableFullscreen = false,\n },\n ref\n) {\n const slidesCount = React.Children.count(children);\n const slidesToShow = getSlidesToShow(slidesToShowProp, slidesCount);\n const startSlide = getStartSlide(startSlideProp, slidesCount);\n const showArrows = showArrowsProp && slidesCount > 1;\n const maxShift = Math.max(0, slidesCount - slidesToShow);\n\n const [activeSlideIndex, setActiveSlideIndex] = useState<number>(startSlide);\n const [shiftState, setShiftState] = useState<ShiftState>({\n animation: undefined,\n });\n // Live pointer-follow offset (px) applied on top of the resting %-based indent.\n const [dragPx, setDragPx] = useState<number>(0);\n const [isDragging, setIsDragging] = useState<boolean>(false);\n const [fullscreenIndex, setFullscreenIndex] = useState<number | null>(null);\n // Live finger-follow offset (px) for the fullscreen track.\n const [fullscreenDragPx, setFullscreenDragPx] = useState<number>(0);\n const [isFullscreenDragging, setIsFullscreenDragging] = useState<boolean>(false);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const outerRef = useRef<HTMLDivElement>(null);\n const forkedOuterRef = useForkRef<HTMLDivElement>(ref, outerRef);\n const trackRef = useRef<HTMLDivElement>(null);\n const [isHovered, setIsHovered] = useState<boolean>(false);\n\n const motion = useRef<Motion>({ ...MOTION_INITIAL_STATE });\n\n useSafeLayoutEffect(() => {\n setShiftState((prevState) => ({\n ...prevState,\n animation: false,\n }));\n }, [slidesToShow]);\n\n useSafeLayoutEffect(() => {\n setActiveSlideIndex(startSlide);\n onSlideChange?.(startSlide);\n\n if (shiftState.animation !== undefined) {\n setShiftState((prevState) => ({\n ...prevState,\n animation: true,\n }));\n }\n }, [startSlide]);\n\n const setMotion = (value: Partial<Motion>) => {\n Object.assign<Motion, Partial<Motion>>(motion.current, value);\n };\n\n const now = () => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n\n const goToSlide = (index: number) => {\n const target = clamp(index, 0, maxShift);\n\n setActiveSlideIndex(target);\n setShiftState((prevState) => ({ ...prevState, animation: true }));\n onSlideChange?.(target);\n };\n\n const moveFullscreen = (direction: 1 | -1) => {\n setFullscreenIndex((prev) => (prev === null ? prev : (prev + direction + slidesCount) % slidesCount));\n };\n\n const fullscreenTouchX = useRef<number | null>(null);\n\n const detachListeners = (isMouse: boolean) => {\n if (!trackRef.current) {\n return;\n }\n\n trackRef.current.removeEventListener(isMouse ? \"mousemove\" : \"touchmove\", onMove);\n trackRef.current.removeEventListener(isMouse ? \"mouseup\" : \"touchend\", onEnd);\n\n if (isMouse) {\n trackRef.current.removeEventListener(\"mouseleave\", onEnd);\n }\n };\n\n const onStart = useEventCallback((event: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>) => {\n if (!trackRef.current) {\n return;\n }\n\n const isMouse = isMouseEvent(event);\n\n if (isMouse && event.button !== 0) {\n return;\n }\n\n event.stopPropagation();\n\n const clientX = coordX(event);\n const clientY = coordY(event);\n\n setMotion({\n isPressed: true,\n startX: clientX,\n startY: clientY,\n lastX: clientX,\n lastT: now(),\n axis: null,\n dragged: false,\n });\n\n trackRef.current.addEventListener(isMouse ? \"mousemove\" : \"touchmove\", onMove, { passive: false });\n trackRef.current.addEventListener(isMouse ? \"mouseup\" : \"touchend\", onEnd);\n\n if (isMouse) {\n trackRef.current.addEventListener(\"mouseleave\", onEnd);\n }\n });\n\n const onMove = useEventCallback((event: MouseEvent | TouchEvent) => {\n if (!rootRef.current || !motion.current.isPressed) {\n return;\n }\n\n if (isTouchEvent(event) && event.touches.length > 1) {\n return onEnd(event);\n }\n\n const clientX = coordX(event);\n const clientY = coordY(event);\n const shiftX = clientX - motion.current.startX;\n const shiftY = clientY - motion.current.startY;\n\n // Lock the gesture axis once the pointer has moved past the tap threshold.\n if (motion.current.axis === null) {\n if (Math.abs(shiftX) < TAP_THRESHOLD && Math.abs(shiftY) < TAP_THRESHOLD) {\n return;\n }\n\n const axis: Axis = Math.abs(shiftX) >= Math.abs(shiftY) ? \"x\" : \"y\";\n setMotion({ axis, dragged: true });\n\n // Vertical intent → release so the page can scroll.\n if (axis === \"y\") {\n return onEnd(event);\n }\n\n if (slidesCount > 1) {\n setIsDragging(true);\n }\n }\n\n if (motion.current.axis !== \"x\") {\n return;\n }\n\n // Horizontal drag: keep the gesture and follow the finger.\n event.preventDefault();\n event.stopPropagation();\n\n if (slidesCount > 1) {\n const atStart = activeSlideIndex <= 0;\n const atEnd = activeSlideIndex >= maxShift;\n // Add resistance when dragging beyond the first / last slide.\n const offset = (atStart && shiftX > 0) || (atEnd && shiftX < 0) ? shiftX * 0.35 : shiftX;\n setDragPx(offset);\n }\n\n motion.current.lastX = clientX;\n motion.current.lastT = now();\n });\n\n const onEnd = useEventCallback((event: MouseEvent | TouchEvent) => {\n if (!motion.current.isPressed) {\n return;\n }\n\n const isMouse = isMouseEvent(event);\n detachListeners(isMouse);\n\n const { axis, dragged, startX, lastX, lastT } = motion.current;\n setMotion({ isPressed: false });\n setIsDragging(false);\n\n if (axis === \"x\" && dragged && slidesCount > 1 && rootRef.current) {\n const clientX = coordX(event);\n const totalShift = clientX - startX;\n const widthPerSlide = rootRef.current.offsetWidth / slidesToShow;\n const velocity = lastT ? (clientX - lastX) / Math.max(1, now() - lastT) : 0;\n\n let movedSlides = widthPerSlide > 0 ? Math.round(-totalShift / widthPerSlide) : 0;\n\n if (movedSlides === 0 && Math.abs(velocity) > FLICK_VELOCITY) {\n movedSlides = velocity < 0 ? 1 : -1;\n }\n\n goToSlide(activeSlideIndex + movedSlides);\n }\n\n // Animate back to the resting position (snap / snap-back).\n setDragPx(0);\n });\n\n const onSlideClick = (index: number) => () => {\n // Suppress the click that fires at the end of a drag.\n if (motion.current.dragged) {\n return;\n }\n\n if (enableFullscreen) {\n setFullscreenIndex(index);\n }\n };\n\n const onNavigationItemClick = (index: number) => () => goToSlide(index);\n\n const getNextIndex = (direction: 1 | -1) => {\n const isSingleSlide = slidesToShow === 1;\n const totalGroups = isSingleSlide ? slidesCount : Math.ceil(slidesCount / slidesToShow);\n const activeIndex = activeSlideIndex + slidesToShow;\n const isNextSlideDisabled = slidesCount - slidesToShow <= activeSlideIndex;\n\n const currentIndex = getSlideIndexForMultipleParts(activeIndex, slidesToShow, slidesCount, isNextSlideDisabled);\n const nextIndex = (currentIndex + direction + totalGroups) % totalGroups;\n\n return isSingleSlide ? nextIndex : nextIndex * slidesToShow;\n };\n\n const getNavigation = () => {\n if (!showNavigation) {\n return <></>;\n }\n\n const isNextSlideDisabled = slidesCount - slidesToShow <= activeSlideIndex;\n const isSinglePartSlide = slidesToShow === 1;\n const count = isSinglePartSlide ? slidesCount : Math.ceil(slidesCount / slidesToShow);\n const indicators: React.ReactNode[] = [];\n\n for (let index = 0; index < count; index++) {\n let nextIndex = index;\n let currentIndex = activeSlideIndex;\n\n if (!isSinglePartSlide) {\n const isLast = index === count - 1;\n const activeIndex = activeSlideIndex + slidesToShow;\n\n nextIndex = isLast ? slidesCount - slidesToShow : index * slidesToShow;\n currentIndex = getSlideIndexForMultipleParts(activeIndex, slidesToShow, slidesCount, isNextSlideDisabled);\n }\n\n const isActive = currentIndex === index;\n const onClick = onNavigationItemClick(nextIndex);\n\n let indicator: ReactNode = (\n <div key={index} className={cn(\"smwb-carousel__navigation__dot\", isActive && \"current\")} onClick={onClick} />\n );\n\n if (navigationDotRenderer) {\n indicator = navigationDotRenderer(index, isActive, onClick);\n }\n\n indicators.push(indicator);\n }\n\n return <div className={cn(\"smwb-carousel__navigation\", navigationClassName)}>{indicators}</div>;\n };\n\n const getIndent = () => {\n const shiftSlides = activeSlideIndex > maxShift ? maxShift : activeSlideIndex;\n\n return getSlideWidth(slidesToShow) * shiftSlides;\n };\n\n const slideId = useId();\n const slideStyle = getSlideStyle(slidesToShow);\n\n const indent = getIndent();\n\n const layerStyle: React.CSSProperties = {\n transform: `translateX(calc(-${indent}% + ${dragPx}px))`,\n transition:\n isDragging || shiftState.animation === undefined\n ? \"none\"\n : shiftState.animation\n ? \"transform 500ms cubic-bezier(.1, 0, .25, 1)\"\n : \"none\",\n };\n\n const rootStyle: React.CSSProperties = {};\n const cellHeightValue = toCssLength(cellHeight);\n const aspectRatioValue = toCssNumber(aspectRatio);\n const gapValue = toCssLength(gap);\n const maxWidthValue = toCssLength(maxWidth);\n if (cellHeightValue) (rootStyle as Record<string, string>)[\"--smwb-carousel-cell-height\"] = cellHeightValue;\n if (aspectRatioValue) (rootStyle as Record<string, string>)[\"--smwb-carousel-aspect-ratio\"] = aspectRatioValue;\n if (gapValue) (rootStyle as Record<string, string>)[\"--smwb-carousel-gap\"] = gapValue;\n if (maxWidthValue) (rootStyle as Record<string, string>)[\"--smwb-carousel-max-width\"] = maxWidthValue;\n\n React.useEffect(() => {\n if (!Array.isArray(children)) {\n console.error(\"SMWB Material: The `children` prop was passed invalidly. It should contain an array of elements.\");\n }\n }, [children]);\n\n useEffect(() => {\n if (!autoplay || slidesCount <= 1 || (pauseOnHover && isHovered) || fullscreenIndex !== null) {\n return;\n }\n const timer = window.setInterval(() => {\n onNavigationItemClick(getNextIndex(1))();\n }, autoplayInterval);\n\n return () => window.clearInterval(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n autoplay,\n autoplayInterval,\n pauseOnHover,\n isHovered,\n slidesCount,\n activeSlideIndex,\n slidesToShow,\n fullscreenIndex,\n ]);\n\n useEffect(() => {\n if (fullscreenIndex === null || slidesCount <= 1) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"ArrowLeft\") {\n moveFullscreen(-1);\n } else if (event.key === \"ArrowRight\") {\n moveFullscreen(1);\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fullscreenIndex, slidesCount]);\n\n if (!Array.isArray(children)) {\n return <></>;\n }\n\n const childrenArray = children as ReactNode[];\n\n const onFullscreenTouchStart = (event: React.TouchEvent) => {\n fullscreenTouchX.current = event.touches[0]?.clientX ?? null;\n };\n\n const onFullscreenTouchMove = (event: React.TouchEvent) => {\n if (fullscreenTouchX.current === null || slidesCount <= 1) {\n return;\n }\n const delta = (event.touches[0]?.clientX ?? fullscreenTouchX.current) - fullscreenTouchX.current;\n setIsFullscreenDragging(true);\n setFullscreenDragPx(delta);\n };\n\n const onFullscreenTouchEnd = (event: React.TouchEvent) => {\n const startX = fullscreenTouchX.current;\n fullscreenTouchX.current = null;\n setIsFullscreenDragging(false);\n setFullscreenDragPx(0);\n\n if (startX === null || slidesCount <= 1) {\n return;\n }\n const delta = (event.changedTouches[0]?.clientX ?? startX) - startX;\n if (Math.abs(delta) > 40) {\n moveFullscreen(delta < 0 ? 1 : -1);\n }\n };\n\n const fullscreenTrackStyle: React.CSSProperties = {\n transform: `translateX(calc(-${(fullscreenIndex ?? 0) * 100}% + ${fullscreenDragPx}px))`,\n transition: isFullscreenDragging ? \"none\" : \"transform 350ms cubic-bezier(.22, .61, .36, 1)\",\n };\n\n return (\n <div\n className={cn(\"smwb-carousel\", className)}\n data-testid=\"carousel\"\n ref={forkedOuterRef}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={ariaLabel}\n style={rootStyle}\n onMouseEnter={pauseOnHover ? () => setIsHovered(true) : undefined}\n onMouseLeave={pauseOnHover ? () => setIsHovered(false) : undefined}\n >\n <div className={cn(\"smwb-carousel__inner\")} ref={rootRef}>\n {showArrows && (\n <Icon\n name=\"chevron_left\"\n size={arrowsSize}\n className={cn(\"smwb-carousel__arrow\", \"smwb-carousel__arrow_prev\")}\n style={{\n top: `calc(50% - ${arrowsSize / 2}px)`,\n left: -arrowsSize / 2,\n }}\n onClick={() => onNavigationItemClick(getNextIndex(-1))()}\n />\n )}\n <div\n ref={trackRef}\n className=\"smwb-carousel__track\"\n onMouseDown={onStart}\n onTouchStart={onStart}\n onDragStart={dragPrevent}\n onDragEnd={dragPrevent}\n >\n <div className=\"smwb-carousel__layer\" style={layerStyle}>\n {React.Children.map(children, (child, index) => (\n <div key={index} id={`${slideId}${index}`} className=\"smwb-carousel__slide\" style={slideStyle}>\n <div\n className={cn(\n \"smwb-carousel__slide-inner\",\n enableFullscreen && \"smwb-carousel__slide-inner_clickable\"\n )}\n onClick={enableFullscreen ? onSlideClick(index) : undefined}\n >\n {child}\n </div>\n </div>\n ))}\n </div>\n </div>\n {showArrows && (\n <Icon\n name=\"chevron_right\"\n size={arrowsSize}\n className={cn(\"smwb-carousel__arrow\", \"smwb-carousel__arrow_next\")}\n style={{\n top: `calc(50% - ${arrowsSize / 2}px)`,\n right: -arrowsSize / 2,\n }}\n onClick={() => onNavigationItemClick(getNextIndex(1))()}\n />\n )}\n </div>\n {getNavigation()}\n {enableFullscreen && (\n <Modal\n open={fullscreenIndex !== null}\n size=\"fullscreen\"\n backdrop=\"darkBlured\"\n className=\"smwb-carousel__fullscreen\"\n onClose={() => setFullscreenIndex(null)}\n aria-label=\"Image viewer\"\n >\n {fullscreenIndex !== null && (\n <div className=\"smwb-carousel__fullscreen-content\">\n {slidesCount > 1 && (\n <Icon\n name=\"chevron_left\"\n size={40}\n className={cn(\"smwb-carousel__fullscreen-arrow\", \"smwb-carousel__fullscreen-arrow_prev\")}\n onClick={() => moveFullscreen(-1)}\n />\n )}\n <div\n className=\"smwb-carousel__fullscreen-stage\"\n onTouchStart={onFullscreenTouchStart}\n onTouchMove={onFullscreenTouchMove}\n onTouchEnd={onFullscreenTouchEnd}\n >\n <div className=\"smwb-carousel__fullscreen-track\" style={fullscreenTrackStyle}>\n {childrenArray.map((child, index) => (\n <div\n key={index}\n className=\"smwb-carousel__fullscreen-slide\"\n aria-hidden={index !== fullscreenIndex}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n {slidesCount > 1 && (\n <Icon\n name=\"chevron_right\"\n size={40}\n className={cn(\"smwb-carousel__fullscreen-arrow\", \"smwb-carousel__fullscreen-arrow_next\")}\n onClick={() => moveFullscreen(1)}\n />\n )}\n <Icon\n name=\"close\"\n size={32}\n className=\"smwb-carousel__fullscreen-close\"\n onClick={() => setFullscreenIndex(null)}\n />\n </div>\n )}\n </Modal>\n )}\n </div>\n );\n});\n\nexport default Carousel;\n","import { useCallback, useState } from \"react\";\n\nexport const useModalState = () => {\n const [isOpen, setIsOpen] = useState(false);\n\n const onClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const onOpen = useCallback(() => {\n setIsOpen(true);\n }, []);\n\n return { onClose, onOpen, isOpen };\n};\n","import React from \"react\";\n\nexport const ImagesListContext = React.createContext<{\n rowsHeight?: number;\n variant?: \"woven\" | \"masonry\" | \"default\" | null;\n}>({\n rowsHeight: 0,\n});\n","import React, { CSSProperties, useContext, useEffect } from \"react\";\nimport cn from \"clsx\";\nimport { useModalState } from \"../../../../hooks/useModalState\";\nimport { ImagesListItemModal } from \"../index\";\nimport { ImagesListContext } from \"../imagesListContext\";\n\nexport interface ImagesListItemProps {\n className?: string;\n src: string;\n rowsHeight?: number;\n cols: number;\n rows: number;\n rounded?: boolean;\n itemBarPlacement?: \"top\" | \"bottom\" | \"under\";\n itemBarContent?: React.ReactNode;\n alt?: string;\n}\n\nconst ImagesListItem = ({\n className,\n src,\n rounded,\n itemBarContent,\n cols = 1,\n rows = 1,\n itemBarPlacement = \"bottom\",\n alt = \"image\",\n}: ImagesListItemProps) => {\n const { isOpen, onClose, onOpen } = useModalState();\n const { rowsHeight, variant } = useContext(ImagesListContext);\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"auto\";\n }\n }, [isOpen]);\n\n const style: CSSProperties = {\n height: rowsHeight ? `${rowsHeight * rows}px` : \"\",\n gridRowEnd: `span ${rows}`,\n gridColumnEnd: `span ${cols}`,\n };\n\n return (\n <>\n <li\n data-testid=\"images-list-item\"\n className={cn(\"smwb-gallery__list__item\", className, \"smwb-gallery-item\", `smwb-${variant}`)}\n onClick={onOpen}\n style={style}\n >\n <div className=\"smwb-gallery-item__inner\">\n <div className=\"smwb-gallery-item__img-wrapper\">\n <img src={src} alt={alt || \"image\"} className={cn(\"smwb-gallery-item__img\", { \"smwb-rounded\": rounded })} />\n </div>\n {itemBarContent && (\n <div\n className={cn(\"smwb-gallery-item__bar\", className, `smwb-${itemBarPlacement}`, {\n \"smwb-rounded\": rounded,\n })}\n >\n {itemBarContent}\n </div>\n )}\n </div>\n </li>\n <ImagesListItemModal src={src} onClose={onClose} isOpen={isOpen} />\n </>\n );\n};\n\nexport default ImagesListItem;\n","import React, { CSSProperties, forwardRef, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\nimport { ImagesListContext } from \"./imagesListContext\";\n\nexport interface ImagesListProps {\n className?: string;\n rowsHeight?: number;\n cols: number;\n variant?: \"woven\" | \"masonry\" | \"default\";\n gap?: number;\n /** Accessible label for the image list. */\n \"aria-label\"?: string;\n id?: string;\n}\n\nexport const ImagesList = forwardRef<HTMLDivElement, PropsWithChildren<ImagesListProps>>(function ImagesList(\n { className, children, gap = 4, cols = 3, rowsHeight = 0, variant = \"default\", \"aria-label\": ariaLabel, id },\n ref\n) {\n return (\n <ImagesListContext.Provider value={{ rowsHeight, variant }}>\n <div className={cn(\"smwb-gallery\", className)} data-testid=\"images-list\" ref={ref} id={id}>\n <ul\n aria-label={ariaLabel}\n className={cn(\"smwb-gallery__list\", `smwb-${variant}`)}\n style={{ \"--cols-count\": cols, \"--gap\": `${gap}px` } as CSSProperties}\n >\n {children}\n </ul>\n </div>\n </ImagesListContext.Provider>\n );\n});\n\nexport default ImagesList;\n","import { useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CSSTransition } from \"react-transition-group\";\n\nexport interface ImagesListItemModalProps {\n src: string;\n onClose: () => void;\n isOpen: boolean;\n}\n\nconst ImagesListItemModal = ({ src, onClose, isOpen }: ImagesListItemModalProps) => {\n const nodeRef = useRef<HTMLDivElement>(null);\n return createPortal(\n <CSSTransition\n timeout={100}\n in={isOpen}\n classNames={{\n enterActive: \"smwb-image-modal__overlay-enter-active\",\n enterDone: \"smwb-image-modal__overlay-enter-done\",\n }}\n mountOnEnter\n unmountOnExit\n nodeRef={nodeRef}\n >\n <div className=\"smwb-image-modal__overlay\" onClick={onClose} ref={nodeRef}>\n <div className=\"smwb-image-modal\" onClick={(e) => e.stopPropagation()}>\n <img src={src} alt=\"\" className=\"smwb-image-modal__img\" />\n </div>\n </div>\n </CSSTransition>,\n document.body\n );\n};\n\nexport default ImagesListItemModal;\n","import React, { forwardRef, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface ListItemProps {\n disabled?: boolean;\n className?: string;\n selected?: boolean;\n /** Compact row. */\n dense?: boolean;\n /** Render a bottom divider. */\n divider?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLLIElement>;\n}\n\nexport const ListItem = forwardRef<HTMLLIElement, PropsWithChildren<ListItemProps>>(function ListItem(\n { className, children, disabled, selected, dense, divider, startAdornment, endAdornment, onClick },\n ref\n) {\n const interactive = !!onClick && !disabled;\n\n return (\n <li\n ref={ref}\n role=\"listitem\"\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n onClick={disabled ? undefined : onClick}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLLIElement>);\n }\n }\n : undefined\n }\n className={cn(\"smwb-list__item\", className, {\n \"smwb-disabled\": disabled,\n \"smwb-selected\": selected,\n \"smwb-list__item_dense\": dense,\n \"smwb-list__item_divider\": divider,\n })}\n data-testid=\"list-item\"\n >\n <span className=\"smwb-list__item__start\">{startAdornment}</span>\n <span className=\"smwb-list__item__main\">{children}</span>\n <span className=\"smwb-list__item__end\">{endAdornment}</span>\n </li>\n );\n});\n\nexport default ListItem;\n","import { forwardRef, HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\n\nexport interface ListProps extends HTMLAttributes<HTMLUListElement> {\n className?: string;\n /** Compact vertical rhythm. */\n dense?: boolean;\n /** Section subheader rendered before the items. */\n subheader?: ReactNode;\n}\n\nexport const List = forwardRef<HTMLUListElement, PropsWithChildren<ListProps>>(function List(\n { className, dense, subheader, children, ...props },\n ref\n) {\n return (\n <ul\n ref={ref}\n data-testid=\"list\"\n role=\"list\"\n className={cn(\"smwb-list\", { \"smwb-list_dense\": dense }, className)}\n {...props}\n >\n {subheader ? <li className=\"smwb-list__subheader\">{subheader}</li> : null}\n {children}\n </ul>\n );\n});\n\nexport default List;\n","import cn from \"clsx\";\nimport React from \"react\";\nimport Icon from \"../../../base/icon/icon\";\n\nexport interface BaseTablePaginationProps {\n page: number;\n limit: number;\n onPrev?: () => void;\n onNext?: () => void;\n limitOptions?: number[];\n onLimitChange?: (limit: number) => void;\n}\n\n// Вариант с известным количеством записей\ninterface WithTotalCount extends BaseTablePaginationProps {\n totalCount: number;\n hasNextPage?: never;\n}\n\n// Вариант с бесконечной пагинацией\ninterface WithHasNextPage extends BaseTablePaginationProps {\n totalCount?: never;\n hasNextPage: boolean;\n}\n\nexport type TablePaginationProps = WithTotalCount | WithHasNextPage;\n\nconst TablePagination = ({\n limit,\n page,\n totalCount,\n onPrev,\n onNext,\n limitOptions,\n onLimitChange,\n hasNextPage,\n}: TablePaginationProps) => {\n // Если totalCount не передан, считаем что пагинация \"бесконечная\"\n const isInfiniteMode = typeof totalCount === \"undefined\";\n\n const isDisabledNext = isInfiniteMode ? !hasNextPage : page === Math.ceil(totalCount / limit);\n\n const handleLimitChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (!onLimitChange) return;\n onLimitChange(+e.target.value);\n };\n\n const handlePrev = () => {\n onPrev?.();\n };\n\n const handleNext = () => {\n onNext?.();\n };\n\n const renderCountText = () => {\n const from = page * limit - limit;\n const to = page * limit;\n\n return `${from}–${to}` + (isInfiniteMode ? \"\" : ` of ${totalCount}`);\n };\n\n return (\n <div className=\"smwb-table__pagination\">\n <div className=\"smwb-table__pagination__controls\">\n {limitOptions && limitOptions.length > 1 && (\n <div className=\"smwb-table__pagination__rows\">\n <span>Rows per page</span>\n <select id=\"rows\" className=\"smwb-table__pagination__select\" onChange={handleLimitChange} value={limit}>\n {limitOptions.map((opt) => (\n <option value={opt} className={cn(\"smwb-select-option\", { selected: opt === limit })} key={opt}>\n {opt}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"smwb-table__pagination__current-count\">{renderCountText()}</div>\n <div className=\"smwb-table__pagination__buttons\">\n <button className=\"smwb-table__pagination__control\" onClick={handlePrev} disabled={page === 1}>\n <Icon name=\"chevron_left\" size={24} weight={600} />\n </button>\n <span className=\"smwb-table__pagination__page\">{page}</span>\n <button className=\"smwb-table__pagination__control\" onClick={handleNext} disabled={isDisabledNext}>\n <Icon name=\"chevron_right\" size={24} weight={600} />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default TablePagination;\n","import { HTMLAttributes, PropsWithChildren, ReactNode, forwardRef } from \"react\";\nimport cn from \"clsx\";\nimport { TablePagination, TablePaginationProps } from \"./index\";\n\nexport interface TableProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n dense?: boolean;\n isLoading?: boolean;\n hovered?: boolean;\n /** Pins the table header while the body scrolls. */\n stickyHeader?: boolean;\n /** Optional accessible caption rendered for screen readers. */\n caption?: ReactNode;\n paginationSettings?: TablePaginationProps;\n}\n\nconst Table = forwardRef<HTMLDivElement, PropsWithChildren<TableProps>>(\n ({ className, dense, hovered, children, paginationSettings, isLoading, stickyHeader, caption, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"smwb-table__wrapper\", className, {\n [\"smwb-table__wrapper_loading\"]: isLoading,\n })}\n {...props}\n >\n <div className={cn(\"smwb-table__container\", { \"smwb-withPagination\": !!paginationSettings })}>\n <table\n className={cn(\"smwb-table\", {\n \"smwb-dense\": dense,\n [\"smwb-hovered\"]: hovered,\n \"smwb-table_sticky-header\": stickyHeader,\n })}\n >\n {caption != null && <caption className=\"smwb-table__caption\">{caption}</caption>}\n {children}\n </table>\n </div>\n {!!paginationSettings && <TablePagination {...paginationSettings} />}\n </div>\n );\n }\n);\n\nexport default Table;\n","import React, { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface TableBodyProps extends HTMLAttributes<HTMLTableSectionElement> {\n className?: string;\n}\n\nconst TableBody = ({ children, className, ...props }: PropsWithChildren<TableBodyProps>) => {\n return (\n <tbody {...props} className={cn(\"smwb-table__body\", className)}>\n {children}\n </tbody>\n );\n};\n\nexport default TableBody;\n","import React, { PropsWithChildren, TdHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\n\nexport interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n className?: string;\n cellAlign?: \"left\" | \"right\" | \"center\";\n}\n\nconst TableCell = ({ children, cellAlign = \"left\", className, ...props }: PropsWithChildren<TableCellProps>) => {\n return (\n <td {...props} className={cn(\"smwb-table__cell\", className)} align={cellAlign || \"left\"}>\n {children}\n </td>\n );\n};\n\nexport default TableCell;\n","import { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface TableHeadProps extends HTMLAttributes<HTMLTableSectionElement> {\n className?: string;\n}\n\nconst TableHead = ({ children, className, ...props }: PropsWithChildren<TableHeadProps>) => {\n return (\n <thead {...props} className={cn(\"smwb-table__head\", className)}>\n {children}\n </thead>\n );\n};\n\nexport default TableHead;\n","import React, { PropsWithChildren, ThHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type SortDirection = \"asc\" | \"desc\" | false;\n\nexport interface TableHeadCellProps extends ThHTMLAttributes<HTMLTableCellElement> {\n className?: string;\n cellAlign?: \"left\" | \"right\" | \"center\";\n /** @deprecated use `sortDirection=\"desc\"`. */\n isSortedByDesc?: boolean;\n /** @deprecated use `sortDirection=\"asc\"`. */\n isSortedByAsc?: boolean;\n /** Enables the interactive sort affordance with keyboard/aria support. */\n sortable?: boolean;\n /** Current sort direction for this column. */\n sortDirection?: SortDirection;\n /** Invoked when the user activates the sort control. */\n onSort?: () => void;\n}\n\nconst TableHeadCell = ({\n children,\n className,\n cellAlign = \"left\",\n isSortedByAsc,\n isSortedByDesc,\n sortable,\n sortDirection,\n onSort,\n ...props\n}: PropsWithChildren<TableHeadCellProps>) => {\n const direction: SortDirection =\n sortDirection !== undefined ? sortDirection : isSortedByAsc ? \"asc\" : isSortedByDesc ? \"desc\" : false;\n\n const ariaSort = sortable\n ? direction === \"asc\"\n ? \"ascending\"\n : direction === \"desc\"\n ? \"descending\"\n : \"none\"\n : undefined;\n\n const iconName = direction === \"asc\" ? \"expand_more\" : direction === \"desc\" ? \"expand_less\" : \"\";\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLSpanElement>) => {\n if (sortable && onSort && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n onSort();\n }\n };\n\n return (\n <th\n {...props}\n aria-sort={ariaSort}\n className={cn(\"smwb-table__cell\", \"smwb-head-cell\", className, {\n [`smwb-align_${cellAlign}`]: !!cellAlign,\n \"smwb-head-cell_sortable\": sortable,\n })}\n >\n <span\n className=\"smwb-head-cell__content\"\n onClick={sortable ? onSort : undefined}\n onKeyDown={sortable ? onKeyDown : undefined}\n role={sortable ? \"button\" : undefined}\n tabIndex={sortable ? 0 : undefined}\n >\n {children}\n <Icon name={iconName} size={18} weight={800} />\n </span>\n </th>\n );\n};\n\nexport default TableHeadCell;\n","import React, { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n className?: string;\n /** Marks the row as selected (adds aria-selected + styling). */\n selected?: boolean;\n /** Reflects expandable-row state (adds aria-expanded + styling). */\n expanded?: boolean;\n}\n\nconst TableRow = ({ children, className, selected, expanded, ...props }: PropsWithChildren<TableRowProps>) => {\n return (\n <tr\n data-testid=\"table-row\"\n className={cn(\"smwb-table__row\", className, {\n \"smwb-table__row_selected\": selected,\n \"smwb-table__row_expanded\": expanded,\n })}\n aria-selected={selected ?? undefined}\n aria-expanded={expanded ?? undefined}\n {...props}\n >\n {children}\n </tr>\n );\n};\nexport default TableRow;\n","import React, { forwardRef, KeyboardEvent, ReactNode, useMemo, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\n\nexport interface ITreeNodeItem {\n /** Stable identifier. Falls back to the positional path when omitted. */\n id?: string;\n label: string;\n children?: ITreeNodeItem[];\n /** Hint that the node is expandable even before its children are loaded. */\n hasChildren?: boolean;\n}\n\nexport interface TreeViewProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n nodeIcon?: {\n opened?: string;\n closed?: string;\n };\n listIcon?: string;\n data: ITreeNodeItem[];\n /** Controlled list of expanded node ids. */\n expanded?: string[];\n /** Initially expanded node ids (uncontrolled). */\n defaultExpanded?: string[];\n /** Called with the next expanded ids. */\n onExpandedChange?: (expanded: string[]) => void;\n /** Controlled list of selected node ids. */\n selected?: string[];\n /** Initially selected node ids (uncontrolled). */\n defaultSelected?: string[];\n /** Called with the next selected ids. */\n onSelectedChange?: (selected: string[]) => void;\n /** Enables label click selection. */\n selectable?: boolean;\n /** Renders a checkbox per node bound to selection. */\n checkboxes?: boolean;\n /** Custom node renderer. */\n renderLabel?: (item: ITreeNodeItem, nodeId: string) => ReactNode;\n /** Lazily resolves children the first time a node is expanded. */\n loadChildren?: (item: ITreeNodeItem, nodeId: string) => Promise<ITreeNodeItem[]>;\n}\n\nexport const TreeView = forwardRef<HTMLDivElement, TreeViewProps>(function TreeView(\n {\n className,\n listIcon = \"draft\",\n nodeIcon = { closed: \"folder\", opened: \"folder_open\" },\n data = [],\n expanded,\n defaultExpanded = [],\n onExpandedChange,\n selected,\n defaultSelected = [],\n onSelectedChange,\n selectable = false,\n checkboxes = false,\n renderLabel,\n loadChildren,\n ...props\n },\n ref\n) {\n const [loadedChildren, setLoadedChildren] = useState<Record<string, ITreeNodeItem[]>>({});\n const [loadingIds, setLoadingIds] = useState<string[]>([]);\n const [expandedIds, setExpandedIds] = useControllableState<string[]>({\n value: expanded,\n defaultValue: defaultExpanded,\n onChange: onExpandedChange,\n });\n const [selectedIds, setSelectedIds] = useControllableState<string[]>({\n value: selected,\n defaultValue: defaultSelected,\n onChange: onSelectedChange,\n });\n\n const toggleExpanded = (id: string) => {\n setExpandedIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\n };\n\n const setOpen = (id: string, open: boolean) => {\n setExpandedIds((prev) => {\n const has = prev.includes(id);\n if (open && !has) return [...prev, id];\n if (!open && has) return prev.filter((x) => x !== id);\n return prev;\n });\n };\n\n const toggleSelected = (id: string) => {\n setSelectedIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\n };\n\n const ensureLoaded = (item: ITreeNodeItem, nodeId: string) => {\n if (!loadChildren || loadedChildren[nodeId] || (item.children && item.children.length > 0)) {\n return;\n }\n setLoadingIds((prev) => (prev.includes(nodeId) ? prev : [...prev, nodeId]));\n void loadChildren(item, nodeId)\n .then((children) => {\n setLoadedChildren((prev) => ({ ...prev, [nodeId]: children }));\n })\n .finally(() => {\n setLoadingIds((prev) => prev.filter((x) => x !== nodeId));\n });\n };\n\n const renderNode = (item: ITreeNodeItem, path: string): ReactNode => {\n const nodeId = item.id ?? path;\n const resolvedChildren = item.children ?? loadedChildren[nodeId];\n const isLazy = !!loadChildren && (item.hasChildren || !!loadedChildren[nodeId]);\n const hasChildNodes = (!!resolvedChildren && resolvedChildren.length > 0) || isLazy;\n const isOpen = expandedIds.includes(nodeId);\n const isSelected = selectedIds.includes(nodeId);\n const isLoading = loadingIds.includes(nodeId);\n\n const onLabelClick = () => {\n if (hasChildNodes) {\n if (!isOpen) {\n ensureLoaded(item, nodeId);\n }\n toggleExpanded(nodeId);\n }\n if (selectable) {\n toggleSelected(nodeId);\n }\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onLabelClick();\n } else if (event.key === \"ArrowRight\" && hasChildNodes) {\n ensureLoaded(item, nodeId);\n setOpen(nodeId, true);\n } else if (event.key === \"ArrowLeft\" && hasChildNodes) {\n setOpen(nodeId, false);\n }\n };\n\n return (\n <div\n className={cn(\"smwb-tree__node\", { \"smwb-tree__node_selected\": isSelected })}\n role=\"treeitem\"\n aria-expanded={hasChildNodes ? isOpen : undefined}\n aria-selected={selectable || checkboxes ? isSelected : undefined}\n key={nodeId}\n >\n <span\n className=\"smwb-tree__node__content\"\n onClick={onLabelClick}\n onKeyDown={onKeyDown}\n tabIndex={0}\n role=\"button\"\n >\n {checkboxes && (\n <input\n type=\"checkbox\"\n className=\"smwb-tree__node__checkbox\"\n checked={isSelected}\n onClick={(e) => e.stopPropagation()}\n onChange={() => toggleSelected(nodeId)}\n aria-label={item.label}\n />\n )}\n <span className=\"smwb-tree__node__label\">\n {hasChildNodes && isOpen ? (\n <Icon name={nodeIcon?.opened as string} fill={1} size={20} />\n ) : hasChildNodes ? (\n <Icon name={nodeIcon?.closed as string} fill={1} size={20} />\n ) : (\n <Icon name={listIcon} size={20} />\n )}\n {renderLabel ? renderLabel(item, nodeId) : item.label}\n </span>\n </span>\n {hasChildNodes && isOpen && (\n <div role=\"group\">\n {isLoading && !resolvedChildren ? (\n <div className=\"smwb-tree__node__loading\" role=\"status\">\n Загрузка…\n </div>\n ) : (\n resolvedChildren?.map((c, idx) => renderNode(c, `${path}.${idx}`))\n )}\n </div>\n )}\n </div>\n );\n };\n\n const tree = useMemo(\n () => data.map((d, idx) => renderNode(d, `${idx}`)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n data,\n expandedIds,\n selectedIds,\n selectable,\n checkboxes,\n listIcon,\n nodeIcon,\n renderLabel,\n loadedChildren,\n loadingIds,\n ]\n );\n\n return (\n <div data-testid=\"tree-view\" {...props} ref={ref} role=\"tree\" className={cn(\"smwb-tree\", className)}>\n {tree.map((node, idx) => (\n <div className=\"smwb-tree__wrapper\" key={idx} role=\"presentation\">\n {node}\n </div>\n ))}\n </div>\n );\n});\n\nexport default TreeView;\n","import React, { useEffect, useRef } from \"react\";\nimport { useForkRef } from \"../../hooks/useForkRef\";\nimport { useEventCallback } from \"../../hooks/useEventCallback\";\n\ntype ClickAwayMouseEventHandler = \"onClick\" | \"onMouseDown\" | \"onMouseUp\" | \"onPointerDown\" | \"onPointerUp\";\ntype ClickAwayTouchEventHandler = \"onTouchStart\" | \"onTouchEnd\";\n\nfunction mapEventPropToEvent(eventProp: ClickAwayMouseEventHandler | ClickAwayTouchEventHandler) {\n return eventProp.substring(2).toLowerCase() as\n | \"click\"\n | \"mousedown\"\n | \"mouseup\"\n | \"touchstart\"\n | \"touchend\"\n | \"pointerdown\"\n | \"pointerup\";\n}\n\nfunction clickedRootScrollbar(event: MouseEvent, doc: Document) {\n return doc.documentElement.clientWidth < event.clientX || doc.documentElement.clientHeight < event.clientY;\n}\n\nexport interface ClickAwayListenerProps {\n children: React.ReactElement;\n disableReactTree?: boolean;\n mouseEvent?: ClickAwayMouseEventHandler | false;\n onClickAway: (event: MouseEvent | TouchEvent) => void;\n touchEvent?: ClickAwayTouchEventHandler | false;\n /** When false, the listener is inert without unmounting the child. */\n enabled?: boolean;\n}\n\nexport function ClickAwayListener({\n children,\n disableReactTree = false,\n mouseEvent = \"onMouseUp\",\n onClickAway,\n touchEvent = \"onTouchEnd\",\n enabled = true,\n}: ClickAwayListenerProps) {\n const movedRef = useRef(false);\n const nodeRef = useRef<Element>(null);\n const activatedRef = useRef(false);\n const syntheticEventRef = useRef(false);\n\n useEffect(() => {\n // https://github.com/facebook/react/issues/20074\n setTimeout(() => {\n activatedRef.current = true;\n }, 0);\n return () => {\n activatedRef.current = false;\n };\n }, []);\n\n const handleRef = useForkRef((children as React.ReactElement & { ref: React.Ref<Element> }).ref, nodeRef);\n\n const handleClickAway = useEventCallback((event: MouseEvent | TouchEvent) => {\n const insideReactTree = syntheticEventRef.current;\n syntheticEventRef.current = false;\n\n if (\n !enabled ||\n !activatedRef.current ||\n !nodeRef.current ||\n (\"clientX\" in event && clickedRootScrollbar(event, document))\n ) {\n return;\n }\n\n if (movedRef.current) {\n movedRef.current = false;\n return;\n }\n\n let insideDOM;\n\n if (event.composedPath) {\n insideDOM = event.composedPath().indexOf(nodeRef.current) > -1;\n } else {\n const target = event.target as HTMLElement;\n\n insideDOM = !document.documentElement.contains(target) || nodeRef.current.contains(target);\n }\n\n if (!insideDOM && (disableReactTree || !insideReactTree)) {\n onClickAway(event);\n }\n });\n\n const createHandleSynthetic = (handlerName: string) => (event: React.SyntheticEvent) => {\n syntheticEventRef.current = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access\n const childrenPropsHandler = children.props[handlerName];\n\n if (childrenPropsHandler) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n childrenPropsHandler(event);\n }\n };\n\n const childrenProps: { ref: React.Ref<Element> } & Pick<\n React.DOMAttributes<Element>,\n ClickAwayMouseEventHandler | ClickAwayTouchEventHandler\n > = { ref: handleRef };\n\n if (touchEvent !== false) {\n childrenProps[touchEvent] = createHandleSynthetic(touchEvent);\n }\n\n useEffect(() => {\n if (touchEvent !== false) {\n const mappedTouchEvent = mapEventPropToEvent(touchEvent);\n\n const handleTouchMove = () => {\n movedRef.current = true;\n };\n\n document.addEventListener(mappedTouchEvent, handleClickAway);\n document.addEventListener(\"touchmove\", handleTouchMove);\n\n return () => {\n document.removeEventListener(mappedTouchEvent, handleClickAway);\n document.removeEventListener(\"touchmove\", handleTouchMove);\n };\n }\n\n return undefined;\n }, [handleClickAway, touchEvent]);\n\n if (mouseEvent !== false) {\n childrenProps[mouseEvent] = createHandleSynthetic(mouseEvent);\n }\n\n useEffect(() => {\n if (mouseEvent !== false) {\n const mappedMouseEvent = mapEventPropToEvent(mouseEvent);\n\n document.addEventListener(mappedMouseEvent, handleClickAway);\n\n return () => {\n document.removeEventListener(mappedMouseEvent, handleClickAway);\n };\n }\n\n return undefined;\n }, [handleClickAway, mouseEvent]);\n\n return <>{React.cloneElement(children, childrenProps)}</>;\n}\n","import React, { forwardRef, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type MessageSeverity = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface MessageProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n variant?: \"outlined\" | \"filled\" | \"left-accent\";\n onClose?: () => void; // или с событием, если нужно\n /** @deprecated use `severity`. */\n type?: MessageSeverity;\n /** Semantic severity of the message. */\n severity?: MessageSeverity;\n /** Accessible label for the close button. */\n closeAriaLabel?: string;\n}\n\nexport const MessageContainer = forwardRef<HTMLDivElement, PropsWithChildren<MessageProps>>(\n ({ className, children, type, severity, variant = \"filled\", onClose, closeAriaLabel = \"Close\", ...props }, ref) => {\n const resolvedSeverity = severity ?? type;\n const messageClassnames = cn(\"smwb-message\", `smwb-message_${variant}`, className, {\n [`smwb-message_${resolvedSeverity}`]: Boolean(resolvedSeverity),\n });\n\n return (\n <div\n data-testid=\"message\"\n role=\"alert\"\n aria-live={resolvedSeverity === \"error\" ? \"assertive\" : \"polite\"}\n {...props}\n className={messageClassnames}\n ref={ref}\n >\n {children}\n {onClose && (\n <button className=\"smwb-message__close-btn\" onClick={onClose} aria-label={closeAriaLabel} type=\"button\">\n <Icon name=\"close\" weight={1000} />\n </button>\n )}\n </div>\n );\n }\n);\n\nconst Header = ({ children }: PropsWithChildren) => {\n return <div className=\"smwb-message__header\">{children}</div>;\n};\n\nconst Message = Object.assign(MessageContainer, { Header });\n\nexport default Message;\n","import React, { forwardRef, useRef, useEffect } from \"react\";\nimport cn from \"clsx\";\n\nexport type ProgressColor = \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface ProgressIndicatorProps {\n className?: string;\n variant: \"circular\" | \"linear\";\n type: \"determinate\" | \"indeterminate\";\n progressValue?: number;\n /** Semantic color. */\n color?: ProgressColor;\n /** Circular size preset. */\n size?: \"small\" | \"medium\" | \"large\";\n /** Accessible name for the progress bar. */\n \"aria-label\"?: string;\n id?: string;\n}\n\nexport const ProgressIndicator = forwardRef<HTMLDivElement, ProgressIndicatorProps>(function ProgressIndicator(\n { type, variant, className, progressValue = 0, color = \"primary\", size = \"medium\", id, ...rest },\n ref\n) {\n const ariaProps = {\n role: \"progressbar\" as const,\n \"aria-label\": rest[\"aria-label\"],\n id,\n ...(type === \"determinate\" ? { \"aria-valuenow\": progressValue, \"aria-valuemin\": 0, \"aria-valuemax\": 100 } : {}),\n };\n const colorClass = color !== \"primary\" ? `smwb-indicator_color-${color}` : null;\n\n if (variant === \"circular\") {\n return (\n <div\n ref={ref}\n className={cn(\"smwb-indicator_circular\", `smwb-${type}`, colorClass, `smwb-indicator_size-${size}`, className)}\n {...ariaProps}\n >\n {type === \"determinate\" ? (\n <CircularProgress progressValue={progressValue} />\n ) : (\n <>\n <div className=\"smwb-indicator_circular__thumb\" />\n <div></div>\n <div></div>\n <div></div>\n </>\n )}\n </div>\n );\n }\n\n return (\n <div ref={ref} className={cn(\"smwb-indicator_linear\", `smwb-${type}`, colorClass, className)} {...ariaProps}>\n <div\n className=\"smwb-indicator_linear__thumb\"\n style={type === \"determinate\" ? { width: `${progressValue}%` } : {}}\n ></div>\n </div>\n );\n});\n\nexport interface CircularProgressProps {\n progressValue?: number;\n}\n\nexport function CircularProgress({ progressValue = 0 }: CircularProgressProps) {\n const circleRef = useRef<SVGCircleElement>(null);\n\n useEffect(() => {\n if (!circleRef.current || !circleRef.current.r) return;\n\n const circleRadius = circleRef.current?.r.baseVal.value;\n if (circleRadius && circleRef.current) {\n const circleLength = 2 * Math.PI * circleRadius;\n circleRef.current.style.strokeDasharray = `${circleLength} ${circleLength}`;\n circleRef.current.style.strokeDashoffset = `${circleLength}`;\n\n const offset = circleLength - (progressValue / 100) * circleLength;\n circleRef.current.style.strokeDashoffset = `${offset}`;\n }\n }, [circleRef, progressValue]);\n\n return (\n <svg className=\"smwb-indicator_circular__svg\">\n <circle className=\"smwb-indicator_circular__circle\" cx=\"24\" cy=\"24\" r=\"22\" ref={circleRef} />\n </svg>\n );\n}\n\nexport default ProgressIndicator;\n","import { useState } from \"react\";\nimport { v4 } from \"uuid\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\nexport function useSnackbarsPortal() {\n const [domElement, setDomElement] = useState<HTMLElement | null>(null);\n\n useSafeLayoutEffect(() => {\n const element = document.createElement(\"div\");\n element.id = `snackbar-portal-${v4()}`;\n document.body.prepend(element);\n\n setDomElement(element);\n\n return () => {\n document.body.removeChild(element);\n };\n }, []);\n\n return { snackbarDomRoot: domElement };\n}\n","import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { v4 } from \"uuid\";\nimport { createPortal } from \"react-dom\";\nimport cn from \"clsx\";\nimport { CSSTransition, TransitionGroup } from \"react-transition-group\";\nimport { useSnackbarsPortal } from \"./useSnackbarsPortal\";\nimport { useEventCallback } from \"../../../hooks/useEventCallback\";\n\nexport const variants = [\"dark\", \"light\", \"danger\", \"success\", \"warning\", \"info\"] as const;\nexport const positions = [\"top\", \"bottom\", \"top-left\", \"top-right\", \"bottom-right\", \"bottom-left\"] as const;\n\nexport type Variants = (typeof variants)[number];\nexport type Position = (typeof positions)[number];\n\nexport interface SnackbarsProviderProps extends React.HTMLAttributes<HTMLElement> {\n variant?: Variants;\n position?: Position;\n autoCloseTime?: number;\n closeOnClick?: boolean;\n autoClose?: boolean;\n component?: React.ElementType;\n}\n\ninterface Snack extends SnackbarsProviderProps {\n id: string;\n message: React.ReactNode;\n}\n\ninterface SnackTransitionProps {\n snack: Snack;\n position: Position;\n variant: Variants;\n className?: string;\n component: React.ElementType;\n autoClose: boolean;\n autoCloseTime: number;\n snackRest: Omit<\n SnackbarsProviderProps,\n \"variant\" | \"position\" | \"autoCloseTime\" | \"autoClose\" | \"closeOnClick\" | \"onClick\" | \"component\" | \"children\"\n >;\n onSnackRemove: (id: string) => (event: React.MouseEvent<HTMLElement>) => void;\n onClose: (id: string) => () => void;\n}\n\nfunction SnackTransition({\n snack,\n position,\n variant,\n className,\n component,\n autoClose,\n autoCloseTime,\n snackRest,\n onSnackRemove,\n onClose,\n}: SnackTransitionProps) {\n const nodeRef = useRef<HTMLDivElement>(null);\n\n return (\n <CSSTransition\n appear\n timeout={125}\n classNames={{\n appear: \"smwb-snackbar-enter\",\n appearActive: \"smwb-snackbar-enter-active\",\n appearDone: \"smwb-snackbar-enter-done\",\n enter: \"smwb-snackbar-enter\",\n enterActive: \"smwb-snackbar-enter-active\",\n enterDone: \"smwb-snackbar-enter-done\",\n exitActive: \"smwb-snackbar-exit-active\",\n }}\n unmountOnExit\n in\n nodeRef={nodeRef}\n >\n <Snackbar\n ref={nodeRef}\n component={snack.component ?? component}\n message={snack.message}\n position={snack.position ?? position}\n variant={snack.variant ?? variant}\n onClick={onSnackRemove(snack.id)}\n className={cn(className, snack.className)}\n isAutoClose={snack.autoClose ?? autoClose}\n autoCloseTime={snack.autoCloseTime ?? autoCloseTime}\n onClose={onClose(snack.id)}\n {...snackRest}\n />\n </CSSTransition>\n );\n}\n\nexport interface AddSnackbarOptions extends SnackbarsProviderProps {\n key?: string;\n message: React.ReactNode;\n}\n\nexport type AddSnackbar = (options: AddSnackbarOptions) => string;\n\nexport interface SnackbarOptions {\n addSnackbar: AddSnackbar;\n clearAllSnackbars: () => void;\n clearFirstSnackbar: () => void;\n clearLastSnackbar: () => void;\n clearByIdSnackbar: (id: string) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarOptions>({\n addSnackbar: () => \"\",\n clearAllSnackbars: () => undefined,\n clearFirstSnackbar: () => undefined,\n clearLastSnackbar: () => undefined,\n clearByIdSnackbar: () => undefined,\n});\n\nexport function SnackbarProvider(props: SnackbarsProviderProps) {\n const {\n position = \"top-right\",\n variant = \"dark\",\n className,\n autoClose = true,\n autoCloseTime = 5000,\n closeOnClick = true,\n onClick,\n component = \"div\",\n children,\n ...rest\n } = props;\n\n const [snacks, setSnacks] = useState<Snack[]>([]);\n const { snackbarDomRoot } = useSnackbarsPortal();\n\n const addSnackbar: AddSnackbar = useCallback((options) => {\n const { key, ...rest } = options;\n\n const id = key ?? v4();\n const snack: Snack = { id, ...rest };\n\n setSnacks((prevState) => {\n const index = prevState.findIndex((item) => item.id === id);\n if (index === -1) {\n return [...prevState, snack];\n }\n const next = [...prevState];\n next[index] = snack;\n return next;\n });\n\n return id;\n }, []);\n\n const clearAllSnackbars = () => {\n setSnacks([]);\n };\n\n const clearFirstSnackbar = () => {\n setSnacks((prevState) => prevState.slice(1));\n };\n\n const clearLastSnackbar = () => {\n setSnacks((prevState) => prevState.slice(0, -1));\n };\n\n const clearByIdSnackbar = (id: string) => {\n setSnacks((prevState) => prevState.filter((value) => value.id !== id));\n };\n\n const onSnackRemove = (id: string) => (event: React.MouseEvent<HTMLElement>) => {\n onClick?.(event);\n\n if (closeOnClick) {\n clearByIdSnackbar(id);\n }\n };\n\n const onClose = (id: string) => () => {\n clearByIdSnackbar(id);\n };\n\n const currentPositions = snacks.reduce(\n (acc, snack) => {\n const currentPosition = snack.position ?? position;\n\n acc[currentPosition] = [...(acc[currentPosition] ?? []), snack];\n\n return acc;\n },\n {} as Record<Position, Snack[]>\n );\n\n const snackbars = (Object.keys(currentPositions) as unknown as typeof positions).map((key) => {\n const snacks = currentPositions[key];\n\n return (\n <TransitionGroup\n key={key}\n className={cn(\"smwb-snackbars\", `smwb-${key}`)}\n data-testid={`snackbars-${key}`}\n appear\n >\n {snacks.map((snack) => (\n <SnackTransition\n key={snack.id}\n snack={snack}\n position={position}\n variant={variant}\n className={className}\n component={component}\n autoClose={autoClose}\n autoCloseTime={autoCloseTime}\n snackRest={rest}\n onSnackRemove={onSnackRemove}\n onClose={onClose}\n />\n ))}\n </TransitionGroup>\n );\n });\n\n return (\n <SnackbarContext.Provider\n value={{ addSnackbar, clearAllSnackbars, clearFirstSnackbar, clearLastSnackbar, clearByIdSnackbar }}\n >\n {children}\n {snackbarDomRoot && createPortal(snackbars, snackbarDomRoot)}\n </SnackbarContext.Provider>\n );\n}\n\nexport interface SnackbarProps extends React.HTMLAttributes<HTMLElement> {\n message?: React.ReactNode;\n variant?: Variants;\n position?: Position;\n component?: React.ElementType;\n isAutoClose?: boolean;\n autoCloseTime?: number;\n onClose?: () => void;\n /** Optional action node rendered after the message (e.g. an Undo button). */\n action?: React.ReactNode;\n}\n\nexport const Snackbar = React.forwardRef(function SnackbarInner(\n {\n className,\n message,\n variant = \"dark\",\n position = \"top-right\",\n onClick,\n component = \"div\",\n isAutoClose,\n autoCloseTime,\n onClose,\n action,\n ...rest\n }: SnackbarProps,\n ref\n) {\n const timerClose = useRef<ReturnType<typeof setTimeout>>();\n\n const setCloseTimer = useEventCallback(() => {\n if (!onClose || !isAutoClose || !autoCloseTime) {\n return;\n }\n\n if (timerClose.current) {\n clearTimeout(timerClose.current);\n }\n\n timerClose.current = setTimeout(() => {\n onClose();\n }, autoCloseTime);\n });\n\n useEffect(() => {\n setCloseTimer();\n\n return () => {\n if (timerClose.current) {\n clearTimeout(timerClose.current);\n }\n };\n }, [setCloseTimer]);\n\n const Element = component;\n\n return (\n <Element\n ref={ref}\n className={cn(\"smwb-snackbar\", className, `smwb-${variant}`, `smwb-${position}`)}\n onClick={onClick}\n role=\"alert\"\n aria-live={variant === \"danger\" ? \"assertive\" : \"polite\"}\n aria-atomic=\"true\"\n {...rest}\n >\n <div className=\"smwb-snackbar__body\">{message}</div>\n {action != null ? <div className=\"smwb-snackbar__action\">{action}</div> : null}\n </Element>\n );\n});\n\nexport function useSnackbar() {\n return useContext(SnackbarContext);\n}\n\nexport default SnackbarProvider;\n","import { autoPlacement, flip, Middleware, offset, Placement as FloatingUiPlacement, shift } from \"@floating-ui/react\";\n\nexport type Placement = FloatingUiPlacement | \"auto\" | \"auto-start\" | \"auto-end\";\n\nexport const placements: Placement[] = [\n \"auto\",\n \"auto-start\",\n \"auto-end\",\n \"top\",\n \"top-start\",\n \"top-end\",\n \"bottom\",\n \"bottom-start\",\n \"bottom-end\",\n \"right\",\n \"right-start\",\n \"right-end\",\n \"left\",\n \"left-start\",\n \"left-end\",\n];\n\nexport interface ResolvedPlacement {\n placement?: FloatingUiPlacement;\n autoMiddleware?: Middleware;\n}\n\nexport function resolvePlacement(placement: Placement): ResolvedPlacement {\n if (placement === \"auto\" || placement === \"auto-start\" || placement === \"auto-end\") {\n const alignment = placement === \"auto-start\" ? \"start\" : placement === \"auto-end\" ? \"end\" : null;\n\n return { autoMiddleware: autoPlacement({ alignment }) };\n }\n\n return { placement };\n}\n\nconst FLOATING_OFFSET_PX = 4;\nconst FLOATING_SHIFT_PADDING_PX = 8;\n\nexport function buildFloatingMiddleware(resolved: ResolvedPlacement, custom?: Middleware[]): Middleware[] {\n if (custom?.length) {\n return [...custom, flip(), shift({ padding: FLOATING_SHIFT_PADDING_PX })];\n }\n if (resolved.autoMiddleware) {\n return [offset(FLOATING_OFFSET_PX), shift({ padding: FLOATING_SHIFT_PADDING_PX }), resolved.autoMiddleware];\n }\n return [offset(FLOATING_OFFSET_PX), flip(), shift({ padding: FLOATING_SHIFT_PADDING_PX })];\n}\n","import React, { forwardRef, PropsWithChildren, useCallback, useEffect, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { autoUpdate, offset as offsetMiddleware, useFloating } from \"@floating-ui/react\";\nimport { Placement, resolvePlacement } from \"../../../utils/floating\";\n\nexport type TooltipTrigger = \"hover\" | \"click\" | \"manual\";\n\nexport interface TooltipProps {\n className?: string;\n offset?: {\n offsetX?: number;\n offsetY?: number;\n };\n message: React.ReactNode;\n placement?: Placement;\n /** Controls tooltip visibility when trigger is manual. */\n open?: boolean;\n /** hover (default): show on pointer enter; click: toggle; manual: use open only. */\n trigger?: TooltipTrigger;\n openDelay?: number;\n closeDelay?: number;\n}\n\nexport const Tooltip = forwardRef<HTMLDivElement, PropsWithChildren<TooltipProps>>(function Tooltip(\n {\n className,\n children,\n placement = \"top\",\n offset = { offsetX: 0, offsetY: 0 },\n message,\n open: openProp,\n trigger = \"hover\",\n openDelay = 0,\n closeDelay = 0,\n },\n ref\n) {\n const resolved = resolvePlacement(placement);\n const [hoverOpen, setHoverOpen] = useState(false);\n const [clickOpen, setClickOpen] = useState(false);\n const openTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimers = useCallback(() => {\n if (openTimerRef.current !== null) {\n clearTimeout(openTimerRef.current);\n openTimerRef.current = null;\n }\n if (closeTimerRef.current !== null) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n useEffect(() => () => clearTimers(), [clearTimers]);\n\n const scheduleOpen = useCallback(() => {\n clearTimers();\n if (openDelay <= 0) {\n setHoverOpen(true);\n return;\n }\n openTimerRef.current = setTimeout(() => setHoverOpen(true), openDelay);\n }, [clearTimers, openDelay]);\n\n const scheduleClose = useCallback(() => {\n clearTimers();\n if (closeDelay <= 0) {\n setHoverOpen(false);\n return;\n }\n closeTimerRef.current = setTimeout(() => setHoverOpen(false), closeDelay);\n }, [clearTimers, closeDelay]);\n\n const { refs, floatingStyles } = useFloating({\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: [\n offsetMiddleware({ mainAxis: offset?.offsetY ?? 0, crossAxis: offset?.offsetX ?? 0 }),\n ...(resolved.autoMiddleware ? [resolved.autoMiddleware] : []),\n ],\n });\n\n const isVisible = trigger === \"manual\" ? openProp === true : trigger === \"click\" ? clickOpen : hoverOpen;\n\n const onPointerEnter = trigger === \"hover\" ? scheduleOpen : undefined;\n const onPointerLeave = trigger === \"hover\" ? scheduleClose : undefined;\n const onClick =\n trigger === \"click\"\n ? () => {\n setClickOpen((prev) => !prev);\n }\n : undefined;\n\n return (\n <div className=\"smwb-tooltip__wrapper\" role=\"tooltip\" ref={ref}>\n <div\n className=\"smwb-tooltip__ref\"\n ref={refs.setReference}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onClick={onClick}\n >\n {children}\n </div>\n {isVisible && (\n <div ref={refs.setFloating} className={cn(\"smwb-tooltip\", className)} style={floatingStyles}>\n {message}\n </div>\n )}\n </div>\n );\n});\n\nexport default Tooltip;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { ButtonProps } from \"../button\";\n\nexport interface ButtonGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n variant?: \"contained\" | \"text\" | \"outlined\";\n size?: \"small\" | \"medium\" | \"large\";\n fullWidth?: boolean;\n disabled?: boolean;\n /** @deprecated use `color`. */\n colorTheme?: \"primary\";\n /** Semantic color propagated to child buttons. */\n color?: \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n}\n\nexport const ButtonGroup = React.forwardRef(function ButtonGroup(\n props: ButtonGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const {\n className,\n children,\n variant = \"contained\",\n size = \"medium\",\n orientation = \"horizontal\",\n colorTheme = \"primary\",\n color,\n fullWidth = false,\n disabled = false,\n ...rest\n } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"smwb-button-group\",\n className,\n `smwb-${orientation}`,\n `smwb-${variant}`,\n fullWidth && \"smwb-full-width\",\n disabled\n )}\n role=\"group\"\n data-testid=\"button-group\"\n {...rest}\n >\n {React.Children.map(children, (child) => {\n const element = child as React.ReactElement<ButtonProps>;\n\n return React.cloneElement(element, {\n className: \"smwb-button-group__grouped\",\n fullWidth: orientation === \"vertical\" || (element.props.fullWidth ?? fullWidth),\n variant: element.props.variant ?? variant,\n size: element.props.size ?? size,\n disabled: element.props.disabled ?? disabled,\n colorTheme: element.props.colorTheme ?? colorTheme,\n color: element.props.color ?? color,\n });\n })}\n </div>\n );\n});\n\nexport default ButtonGroup;\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useId } from \"../../../hooks/useId\";\n\nexport type SelectionControlSize = \"small\" | \"medium\" | \"large\";\nexport type SelectionControlColor = \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n label?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n indeterminate?: boolean;\n className?: string;\n size?: SelectionControlSize;\n color?: SelectionControlColor;\n /** Unified handler: `(event, checked, data)`. */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>, checked: boolean, data: CheckboxProps) => void;\n helperText?: React.ReactNode;\n error?: boolean;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(props, ref) {\n const {\n label,\n disabled,\n readOnly,\n required,\n name,\n id: idProp,\n indeterminate,\n className,\n size = \"medium\",\n color = \"primary\",\n onChange,\n helperText,\n error,\n ...args\n } = props;\n const id = useId(idProp);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) {\n e.preventDefault();\n return;\n }\n onChange?.(e, e.target.checked, props);\n };\n\n return (\n <TextFieldWrapper helperText={helperText} disabled={disabled} error={error} className=\"smwb-text-field-checkbox\">\n <label\n htmlFor={id}\n className={cn(\n \"smwb-checkbox__wrapper\",\n `smwb-checkbox_size-${size}`,\n `smwb-checkbox_color-${color}`,\n className,\n {\n \"smwb-disabled\": disabled,\n \"smwb-readonly\": readOnly,\n \"smwb-indeterminate\": indeterminate,\n }\n )}\n >\n <input\n type=\"checkbox\"\n id={id}\n name={name}\n className=\"smwb-checkbox__input\"\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n ref={ref}\n {...args}\n onChange={handleChange}\n />\n <span className={cn(\"smwb-checkbox__btn\", { \"smwb-indeterminate\": indeterminate })}>\n {indeterminate ? (\n <Icon name=\"remove\" size={18} className=\"smwb-checkbox__icon\" weight={700} />\n ) : (\n <Icon name=\"check\" size={17} className=\"smwb-checkbox__icon\" weight={700} />\n )}\n </span>\n {label && <span className=\"smwb-checkbox__label\">{label}</span>}\n </label>\n </TextFieldWrapper>\n );\n});\n\nexport default Checkbox;\n","import React from \"react\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport cn from \"clsx\";\n\nexport type DataPickerIconButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n size?: \"medium\" | \"small\";\n edge?: \"start\" | \"end\";\n};\n\nexport function DatePickerIconButton({\n className,\n children,\n onMouseDown: onMouseDownProp,\n disabled,\n size = \"medium\",\n edge,\n ...rest\n}: DataPickerIconButtonProps) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n const classes = cn(\"smwb-date-picker__icon-button\", className, {\n \"smwb-date-picker__icon-button--small\": size === \"small\",\n \"smwb-date-picker__icon-button--edge-start\": edge === \"start\",\n \"smwb-date-picker__icon-button--edge-end\": edge === \"end\",\n \"smwb-date-picker__icon-button--disabled\": disabled,\n });\n\n return (\n <button\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n type=\"button\"\n className={classes}\n disabled={disabled}\n {...rest}\n >\n {children}\n {!disabled && <Ripple actionRef={rippleRef} center />}\n </button>\n );\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { DatePickerIconButton } from \"./datePickerIconButton\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface ActionLabelProp {\n label: string;\n onLeftIconClick?: React.MouseEventHandler;\n onRightIconClick?: React.MouseEventHandler;\n onLabelClick?: React.MouseEventHandler;\n disabled?: boolean;\n active?: boolean;\n hiddenSwitches?: boolean;\n dataToggleId?: string;\n}\n\nexport function DatePickerActionLabel({\n label,\n onLeftIconClick,\n onRightIconClick,\n onLabelClick,\n disabled,\n active,\n hiddenSwitches,\n dataToggleId,\n ...rest\n}: ActionLabelProp) {\n const switchClasses = cn(\"smwb-date-picker__switch\", {\n \"smwb-date-picker__switch--hidden\": hiddenSwitches,\n });\n\n return (\n <div className=\"smwb-date-picker__action\" {...rest}>\n <div className={switchClasses}>\n <DatePickerIconButton size=\"small\" onClick={disabled ? undefined : onLeftIconClick}>\n <Icon name=\"keyboard_arrow_left\" weight={500} size={24} />\n </DatePickerIconButton>\n </div>\n <div\n className={cn(\"smwb-date-picker__action-label\", {\n \"smwb-date-picker__action-label--disabled\": disabled,\n \"smwb-date-picker__action-label--active\": active,\n })}\n data-testid={dataToggleId}\n onClick={disabled ? undefined : onLabelClick}\n >\n <span className=\"smwb-date-picker__action-text\">{label}</span>\n <Icon name=\"arrow_drop_down\" weight={500} size={20} />\n </div>\n <div className={switchClasses}>\n <DatePickerIconButton size=\"small\" onClick={disabled ? undefined : onRightIconClick}>\n <Icon name=\"keyboard_arrow_right\" weight={500} size={24} />\n </DatePickerIconButton>\n </div>\n </div>\n );\n}\n","const DATE_TOKEN_REGEXP = /yyyy|MM|dd/g;\n\ntype DateToken = \"yyyy\" | \"MM\" | \"dd\";\n\nfunction extractTokens(pattern: string): DateToken[] {\n const tokens: DateToken[] = [];\n let match: RegExpExecArray | null;\n\n DATE_TOKEN_REGEXP.lastIndex = 0;\n while ((match = DATE_TOKEN_REGEXP.exec(pattern)) !== null) {\n tokens.push(match[0] as DateToken);\n }\n\n return tokens;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction patternToRegExp(pattern: string): RegExp {\n let regex = \"^\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n DATE_TOKEN_REGEXP.lastIndex = 0;\n while ((match = DATE_TOKEN_REGEXP.exec(pattern)) !== null) {\n regex += escapeRegExp(pattern.slice(lastIndex, match.index));\n regex += match[0] === \"yyyy\" ? \"(\\\\d{4})\" : \"(\\\\d{2})\";\n lastIndex = DATE_TOKEN_REGEXP.lastIndex;\n }\n\n regex += escapeRegExp(pattern.slice(lastIndex));\n regex += \"$\";\n\n return new RegExp(regex);\n}\n\nfunction isValidCalendarDate(year: number, month: number, day: number): boolean {\n if (month < 1 || month > 12 || day < 1) {\n return false;\n }\n\n const date = new Date(year, month - 1, day);\n\n return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;\n}\n\nexport function formatDateByPattern(date: Date, pattern: string): string {\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n\n return pattern.replace(DATE_TOKEN_REGEXP, (token) => {\n if (token === \"yyyy\") {\n return String(year).padStart(4, \"0\");\n }\n\n if (token === \"MM\") {\n return String(month).padStart(2, \"0\");\n }\n\n return String(day).padStart(2, \"0\");\n });\n}\n\nexport function parseDateByPattern(value: string, pattern: string): Date | undefined {\n const tokens = extractTokens(pattern);\n\n if (tokens.length !== 3 || !tokens.includes(\"yyyy\") || !tokens.includes(\"MM\") || !tokens.includes(\"dd\")) {\n return undefined;\n }\n\n const match = patternToRegExp(pattern).exec(value);\n\n if (!match) {\n return undefined;\n }\n\n let year: number | undefined;\n let month: number | undefined;\n let day: number | undefined;\n\n tokens.forEach((token, index) => {\n const part = Number(match[index + 1]);\n\n if (token === \"yyyy\") {\n year = part;\n return;\n }\n\n if (token === \"MM\") {\n month = part;\n return;\n }\n\n day = part;\n });\n\n if (year === undefined || month === undefined || day === undefined) {\n return undefined;\n }\n\n if (!isValidCalendarDate(year, month, day)) {\n return undefined;\n }\n\n return new Date(year, month - 1, day);\n}\n\nexport function isDatePatternMatch(value: string, pattern: string): boolean {\n return parseDateByPattern(value, pattern) !== undefined;\n}\n","import { formatDateByPattern, isDatePatternMatch, parseDateByPattern } from \"./dateFormat\";\n\n// Вернёт дату начала недели, по умолчанию воскресенье\nexport function startOfWeek(date: Date, weekStart = 0) {\n weekStart = weekStart % 7;\n\n const day = new Date(date);\n const weekDay = day.getDay();\n const diff = (weekDay < weekStart ? 7 : 0) + weekDay - weekStart;\n\n return new Date(day.setDate(day.getDate() - diff));\n}\n\n// Вернёт дату конца недели, по умолчанию суббота\nexport function endOfWeek(date: Date, weekStart = 0) {\n const day = new Date(startOfWeek(date, weekStart));\n\n return new Date(day.setDate(day.getDate() + 6));\n}\n\n// Вернёт даты всей недели\nexport function eachDayOfInterval(start: Date, end: Date) {\n const dates: Date[] = [];\n const startDate = new Date(start);\n const endDate = new Date(end);\n\n const endTime = endDate.getTime();\n const currentDate = startDate;\n currentDate.setHours(0, 0, 0, 0);\n\n while (currentDate.getTime() <= endTime) {\n dates.push(new Date(currentDate.getTime()));\n currentDate.setDate(currentDate.getDate() + 1);\n currentDate.setHours(0, 0, 0, 0);\n }\n\n return dates;\n}\n\n// Вернёт форматированную дату\nexport const getDayNames = (now: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6, locale?: string) => {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: \"narrow\" });\n\n return eachDayOfInterval(startOfWeek(now, weekStartsOn), endOfWeek(now, weekStartsOn)).map((day) =>\n formatter.format(day)\n );\n};\n\n// Вернёт дату первого дня месяца по текущей дате\nexport function startOfMonth(date: Date) {\n const _date = new Date(date);\n\n return new Date(_date.getFullYear(), _date.getMonth(), 1);\n}\n\n// Вернёт дату последнего дня месяца по текущей дате\nexport function endOfMonth(date: Date) {\n return setMaxTime(new Date(date.getFullYear(), date.getMonth() + 1, 0));\n}\n\n// Если date1 меньше чем date2\nexport function isBefore(date1: Date, date2: Date) {\n return new Date(date1) < new Date(date2);\n}\n\n// Если date1 больше чем date2\nexport function isAfter(date1: Date, date2: Date) {\n return isBefore(date2, date1);\n}\n\n// Добавит дни к текущий дате\nexport function addDays(date: Date, days: number) {\n const _date = new Date(date);\n\n _date.setDate(_date.getDate() + days);\n\n return _date;\n}\n\n// Получит даты дней недель как текущего месяца, так и за его пределом\nexport const getWeeks = (date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6) => {\n const start = startOfWeek(startOfMonth(date), weekStartsOn);\n const end = endOfWeek(endOfMonth(date), weekStartsOn);\n\n let count = 0;\n let current = start;\n const nestedWeeks: Date[][] = [];\n let lastDay = null;\n\n while (isBefore(current, end)) {\n const weekNumber = Math.floor(count / 7);\n nestedWeeks[weekNumber] = nestedWeeks[weekNumber] || [];\n const day = current.getDay();\n\n if (lastDay !== day) {\n lastDay = day;\n nestedWeeks[weekNumber].push(current);\n count += 1;\n }\n\n current = addDays(current, 1);\n }\n\n return nestedWeeks;\n};\n\n// Находится ли date1 в текущем месяце date2\nexport function isSameMonth(date1: Date, date2: Date) {\n return startOfMonth(date2) <= date1 && date1 <= endOfMonth(date2);\n}\n\n// Сбросит всё время\nexport function resetTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n// Установит максимальное время\nexport function setMaxTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n}\n\n// Определит, соответствуют ли даты текущему дню\nexport function isSameDay(date1: Date, date2: Date) {\n return resetTime(date1).getTime() === resetTime(date2).getTime();\n}\n\n// Добавит месяцы\nexport function addMonths(date: Date, months: number) {\n return setMonth(date, date.getMonth() + months);\n}\n\n// Добавит годы\nexport function addYears(date: Date, years: number) {\n return setYear(date, date.getFullYear() + years);\n}\n\n// Установит конец дня (по времени)\nexport function endOfDay(date: Date) {\n return setMaxTime(date);\n}\n\n// Установит начало дня (по времени)\nexport function startOfDay(date: Date) {\n return resetTime(date);\n}\n\n// Получит все месяцы\nexport function getMonths(locale?: string) {\n const months: {\n value: number;\n label: string;\n }[] = [];\n const formatter = new Intl.DateTimeFormat(locale, { month: \"long\" });\n\n for (let i = 0; i < 12; i++) {\n months.push({\n label: formatter.format(addMonths(new Date(\"1970-01-01\"), i)),\n value: i,\n });\n }\n\n return months;\n}\n\n// Установит месяц к текущей дате\nexport function setMonth(date: Date, month: number) {\n const _date = new Date(date);\n\n _date.setMonth(month);\n\n return _date;\n}\n\n// Получит диапазон годов от текущего года\nexport function getYears(currentYear: number, range: number) {\n const years: {\n value: number;\n label: string;\n }[] = [];\n\n for (let i = currentYear - range; i <= currentYear + range; i++) {\n years.push({ label: String(i).padStart(4, \"0\"), value: i });\n }\n\n return years;\n}\n\n// Установит год для текущей даты\nexport function setYear(date: Date, year: number) {\n const _date = new Date(date);\n\n _date.setFullYear(year);\n\n return _date;\n}\n\nexport function getMonthLabel(date: Date, locale?: string) {\n return new Intl.DateTimeFormat(locale, { month: \"short\" }).format(date);\n}\n\nexport function getYearLabel(date: Date, locale?: string) {\n return new Intl.DateTimeFormat(locale, { year: \"numeric\" }).format(date);\n}\n\nexport function getDisplayDate(date: unknown, format?: string) {\n if (!isValidDate(date)) {\n return \"\";\n }\n\n if (format) {\n return formatDateByPattern(date, format);\n }\n\n return new Intl.DateTimeFormat(undefined, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }).format(date);\n}\n\nexport function getCurrentFormatDate(format?: string): string {\n if (format) {\n return format;\n }\n\n const parts: { [key: string]: string } = {\n year: \"yyyy\",\n month: \"MM\",\n day: \"dd\",\n };\n const formatter = new Intl.DateTimeFormat(undefined, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" });\n const dateParts = formatter.formatToParts(new Date(\"1970-01-01\"));\n\n return dateParts.map((element) => parts[element.type] || element.value).join(\"\");\n}\n\nconst MASK_DATE_REGEXP = /\\d/gi;\nconst MASK_TOKEN_REGEXP = /[a-zA-Z]/g;\n\nexport function getMaskFormat(format?: string) {\n if (format) {\n return format.replace(MASK_TOKEN_REGEXP, \"_\");\n }\n\n const date = new Intl.DateTimeFormat(undefined, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }).format(\n new Date(\"1970-01-01\")\n );\n\n return date.replace(MASK_DATE_REGEXP, \"_\");\n}\n\nexport function maskedDateFormatter(mask: string) {\n return (value: string) => {\n let outputCharIndex = 0;\n\n return value\n .split(\"\")\n .map((char, inputCharIndex) => {\n MASK_DATE_REGEXP.lastIndex = 0;\n\n if (outputCharIndex > mask.length - 1) {\n return \"\";\n }\n\n const maskChar = mask[outputCharIndex];\n const nextMaskChar = mask[outputCharIndex + 1];\n\n const acceptedChar = MASK_DATE_REGEXP.test(char) ? char : \"\";\n const formattedChar = maskChar === \"_\" ? acceptedChar : maskChar + acceptedChar;\n\n outputCharIndex += formattedChar.length;\n\n const isLastCharacter = inputCharIndex === value.length - 1;\n\n if (isLastCharacter && nextMaskChar && nextMaskChar !== \"_\") {\n return formattedChar ? formattedChar + nextMaskChar : \"\";\n }\n\n return formattedChar;\n })\n .join(\"\");\n };\n}\n\nexport function isDateMatch(value: string, format: string) {\n return isDatePatternMatch(value, format);\n}\n\nexport function getDateByFormat(value: string, format: string) {\n const parsed = parseDateByPattern(value, format);\n\n if (!parsed) {\n return new Date(Number.NaN);\n }\n\n return parsed;\n}\n\nexport function isValidDate(value: unknown): value is Date {\n return Object.prototype.toString.call(value) === \"[object Date]\" && !isNaN(value as number);\n}\n","import React from \"react\";\nimport { OpenView } from \"./datePicker\";\nimport { DatePickerActionLabel } from \"./datePickerActionLabel\";\nimport { addMonths, addYears, getMonthLabel, getYearLabel } from \"./utils\";\n\nexport interface DataPickerHeaderProps {\n viewValue: Date;\n openView?: OpenView;\n onChange?: (value: Date) => void;\n onMonthLabelClick?: React.MouseEventHandler;\n onYearLabelClick?: React.MouseEventHandler;\n locale?: string;\n}\n\nexport function DataPickerHeader({\n viewValue,\n openView,\n onChange,\n onMonthLabelClick,\n onYearLabelClick,\n locale,\n}: DataPickerHeaderProps) {\n const onMonthIconClick = React.useCallback(\n (value: number) => () => {\n onChange?.(addMonths(viewValue, value));\n },\n [onChange, viewValue]\n );\n\n const onYearIconClick = React.useCallback(\n (value: number) => () => {\n onChange?.(addYears(viewValue, value));\n },\n [onChange, viewValue]\n );\n\n const hiddenSwitches = openView === OpenView.months || openView === OpenView.years;\n\n return (\n <div className=\"smwb-date-picker__header\">\n <DatePickerActionLabel\n label={getMonthLabel(viewValue, locale)}\n onLeftIconClick={onMonthIconClick(-1)}\n onRightIconClick={onMonthIconClick(1)}\n onLabelClick={onMonthLabelClick}\n disabled={openView === OpenView.years}\n active={openView === OpenView.months}\n hiddenSwitches={hiddenSwitches}\n dataToggleId=\"date-picker-months-toggle\"\n />\n <DatePickerActionLabel\n label={getYearLabel(viewValue, locale)}\n onLeftIconClick={onYearIconClick(-1)}\n onRightIconClick={onYearIconClick(1)}\n onLabelClick={onYearLabelClick}\n disabled={openView === OpenView.months}\n active={openView === OpenView.years}\n hiddenSwitches={hiddenSwitches}\n dataToggleId=\"date-picker-years-toggle\"\n />\n </div>\n );\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\n\ninterface DataPickerDayProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n active?: boolean;\n current?: boolean;\n hidden?: boolean;\n outside?: boolean;\n disabled?: boolean;\n inRange?: boolean;\n day: Date;\n onChange?: (event?: React.ChangeEvent<HTMLInputElement>, date?: Date) => void;\n}\n\nexport const DatePickerDay = React.memo(function DataPickerDay({\n className,\n children,\n onMouseDown: onMouseDownProp,\n onChange,\n active,\n current,\n hidden,\n outside,\n disabled,\n inRange,\n day,\n ...rest\n}: DataPickerDayProps) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseDownProp?.(event);\n },\n [onMouseDownProp]\n );\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n },\n [disabled]\n );\n\n const onClick = React.useCallback(() => {\n if (!disabled) {\n onChange?.(undefined, day);\n }\n }, [onChange, day, disabled]);\n\n if (hidden) {\n return <span className=\"smwb-date-picker__day-hidden\" />;\n }\n\n const classes = cn(\"smwb-date-picker__day\", className, {\n \"smwb-date-picker__day--active\": !disabled && active,\n \"smwb-date-picker__day--current\": current && !active,\n \"smwb-date-picker__day--outside\": !disabled && outside,\n \"smwb-date-picker__day--disabled\": disabled,\n \"smwb-date-picker__day--in-range\": !disabled && inRange,\n });\n\n return (\n <button\n className={classes}\n type=\"button\"\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n onClick={onClick}\n disabled={disabled}\n {...rest}\n >\n {children}\n {!disabled && <Ripple actionRef={rippleRef} center />}\n </button>\n );\n});\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport {\n getDayNames,\n getWeeks,\n isSameMonth,\n isSameDay,\n isBefore,\n endOfDay,\n isAfter,\n startOfDay,\n isValidDate,\n} from \"./utils\";\nimport { DatePickerDay } from \"./datePickerDay\";\nimport { DatePickerProps } from \"./datePicker\";\n\nexport interface DataPickerDaysProps extends Partial<\n Pick<\n DatePickerProps,\n | \"value\"\n | \"showDaysOutsideMonth\"\n | \"onChange\"\n | \"disablePast\"\n | \"disableFuture\"\n | \"weekStartsOn\"\n | \"minDate\"\n | \"maxDate\"\n | \"isDateDisabled\"\n | \"locale\"\n >\n> {\n viewValue: Date;\n /** Range selection mode. */\n range?: boolean;\n rangeStart?: Date;\n rangeEnd?: Date;\n}\n\nexport function DataPickerDays({\n viewValue,\n value,\n showDaysOutsideMonth,\n onChange,\n disablePast,\n disableFuture,\n weekStartsOn = 0,\n minDate,\n maxDate,\n isDateDisabled,\n locale,\n range,\n rangeStart,\n rangeEnd,\n}: DataPickerDaysProps) {\n const [now] = useState(new Date());\n\n const dayNames = useMemo(() => getDayNames(now, weekStartsOn, locale), [now, weekStartsOn, locale]);\n const weeks = useMemo(() => getWeeks(viewValue, weekStartsOn), [viewValue, weekStartsOn]);\n\n const isActive = useCallback(\n (day: Date) => {\n if (range) {\n return (\n (isValidDate(rangeStart) && isSameDay(day, rangeStart)) || (isValidDate(rangeEnd) && isSameDay(day, rangeEnd))\n );\n }\n\n if (!isValidDate(value)) {\n return false;\n }\n\n return isSameDay(day, value);\n },\n [value, range, rangeStart, rangeEnd]\n );\n\n const isInRange = useCallback(\n (day: Date) => {\n if (!range || !isValidDate(rangeStart) || !isValidDate(rangeEnd)) {\n return false;\n }\n return isAfter(startOfDay(day), startOfDay(rangeStart)) && isBefore(endOfDay(day), endOfDay(rangeEnd));\n },\n [range, rangeStart, rangeEnd]\n );\n\n const isDisabledDay = useCallback(\n (day: Date) => {\n let disabled = false;\n\n if (disablePast) {\n disabled = isBefore(endOfDay(day), now);\n }\n\n if (disableFuture) {\n disabled = disabled || isAfter(startOfDay(day), now);\n }\n\n if (minDate && isBefore(endOfDay(day), startOfDay(minDate))) {\n disabled = true;\n }\n\n if (maxDate && isAfter(startOfDay(day), endOfDay(maxDate))) {\n disabled = true;\n }\n\n if (isDateDisabled?.(day)) {\n disabled = true;\n }\n\n return disabled;\n },\n [disablePast, disableFuture, now, minDate, maxDate, isDateDisabled]\n );\n\n const weekDays = useMemo(() => {\n return dayNames.map((day, index) => (\n <span key={index} className=\"smwb-date-picker__week-day\">\n {day.toString()}\n </span>\n ));\n }, [dayNames]);\n\n return (\n <div className=\"smwb-date-picker__days\">\n <div className=\"smwb-date-picker__week-days\">{weekDays}</div>\n <div className=\"smwb-date-picker__month\">\n {weeks.map((week, index) => (\n <div key={index} className=\"smwb-date-picker__week\">\n {week.map((day) => {\n const isOutside = !isSameMonth(day, viewValue);\n\n return (\n <DatePickerDay\n key={day.toISOString()}\n day={day}\n current={isSameDay(day, now)}\n active={isActive(day)}\n inRange={isInRange(day)}\n hidden={!showDaysOutsideMonth && isOutside}\n outside={isOutside}\n onChange={onChange}\n disabled={isDisabledDay(day)}\n >\n {day.getDate()}\n </DatePickerDay>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface MenuContextValue {\n dense: boolean;\n variant: \"static\" | \"floating\";\n onClose: () => void;\n}\n\nexport const MenuContext = React.createContext<MenuContextValue>({\n dense: false,\n variant: \"floating\",\n onClose: () => null,\n});\n\nexport function useMenuContext() {\n return React.useContext(MenuContext);\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { MenuContext } from \"./menuContext\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\n\ninterface LinkProps extends React.HTMLAttributes<HTMLAnchorElement> {\n [key: string]: unknown;\n}\n\nexport interface MenuItemProps extends React.HTMLAttributes<HTMLLIElement> {\n disabled?: boolean;\n selected?: boolean;\n href?: string;\n linkElement?: React.ElementType;\n linkProps?: LinkProps;\n value?: unknown;\n optionRenderer?: (args: MenuItemProps) => React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLLIElement>;\n}\n\nexport const MenuItem = React.forwardRef<HTMLLIElement, MenuItemProps>(function MenuItemInRef(props, ref) {\n const {\n children,\n className,\n disabled,\n selected,\n onClick: onClickProp,\n onMouseDown: onMouseDownProp,\n href,\n linkElement,\n linkProps,\n value,\n optionRenderer,\n ...rest\n } = props;\n const { dense } = React.useContext(MenuContext);\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onClick = (event: React.MouseEvent<HTMLLIElement>) => {\n if (disabled) {\n if (href) {\n event.preventDefault();\n }\n\n return;\n }\n\n onClickProp?.(event);\n };\n\n const onMouseDown = (event: React.MouseEvent<HTMLLIElement>) => {\n if (!disabled) {\n onMouseDownProp?.(event);\n }\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLLIElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n let content: React.ReactElement;\n\n if (href) {\n const Tag: React.ElementType = linkElement ?? \"a\";\n\n content = (\n <Tag className=\"smwb-menu__item-inner\" href={href} {...linkProps}>\n {children}\n <span className=\"smwb-menu__item__helper-text\"></span>\n </Tag>\n );\n } else {\n content = <span className=\"smwb-menu__item-inner\">{children}</span>;\n }\n\n const classes = cn(\"smwb-menu__item\", className, {\n \"smwb-menu__item--dense\": dense,\n \"smwb-menu__item--disabled\": disabled,\n \"smwb-menu__item--selected\": selected,\n });\n\n return optionRenderer ? (\n optionRenderer(props)\n ) : (\n <li\n role=\"menuitem\"\n ref={ref}\n className={classes}\n tabIndex={disabled ? undefined : 0}\n onClick={onClick}\n data-value={value}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {content}\n <Ripple actionRef={rippleRef} />\n </li>\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { MenuContext } from \"./menuContext\";\n\nexport interface MenuItemIconProps extends React.HTMLAttributes<HTMLSpanElement> {\n edge?: \"start\" | \"end\";\n}\n\nexport const MenuItemIcon = React.forwardRef<HTMLSpanElement, MenuItemIconProps>(function MenuItemIcon(props, ref) {\n const { children, className, edge, ...rest } = props;\n const { dense } = React.useContext(MenuContext);\n const classes = cn(\"smwb-menu__icon\", className, {\n \"smwb-menu__icon--dense\": dense,\n \"smwb-menu__icon--start\": edge === \"start\",\n \"smwb-menu__icon--end\": edge === \"end\",\n });\n\n return (\n <span ref={ref} className={classes} {...rest}>\n {children}\n </span>\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { MenuContext } from \"./menuContext\";\n\nexport interface MenuItemTextProps extends React.HTMLAttributes<HTMLSpanElement> {\n inset?: boolean;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const MenuItemText = React.forwardRef<HTMLSpanElement, MenuItemTextProps>(function MenuItemText(props, ref) {\n const { children, className, inset = false, ...rest } = props;\n const { dense } = React.useContext(MenuContext);\n const classnames = cn(\"smwb-menu__text\", className, {\n \"smwb-menu__text--inset\": inset,\n \"smwb-menu__text--dense\": dense,\n });\n\n return (\n <span ref={ref} className={classnames} {...rest}>\n {children}\n </span>\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { useMenuContext } from \"./menuContext\";\n\nexport type MenuDividerProps = React.HTMLAttributes<HTMLLIElement>;\n\nexport const MenuDivider = React.forwardRef<HTMLLIElement, MenuDividerProps>(function MenuDivider(props, ref) {\n const { className, ...rest } = props;\n const { variant } = useMenuContext();\n\n return (\n <li\n ref={ref}\n className={cn(\"smwb-menu__divider\", className, variant === \"static\" && \"smwb-menu__divider--vertical\")}\n {...rest}\n />\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { useMenuContext } from \"./menuContext\";\n\nexport type MenuListProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const MenuList = React.forwardRef<HTMLDivElement, MenuListProps>(function MenuList(props, ref) {\n const { children, className, ...rest } = props;\n const { variant, onClose } = useMenuContext();\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLUListElement>) => {\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n );\n if (items.length === 0) {\n return;\n }\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n items[(currentIndex + 1 + items.length) % items.length]?.focus();\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n items[(currentIndex - 1 + items.length) % items.length]?.focus();\n } else if (event.key === \"Home\") {\n event.preventDefault();\n items[0]?.focus();\n } else if (event.key === \"End\") {\n event.preventDefault();\n items[items.length - 1]?.focus();\n } else if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n return (\n <div ref={ref} className={cn(\"smwb-menu\", className, `smwb-menu--${variant}`)} {...rest}>\n <ul\n className={cn(\"smwb-menu__list\", `smwb-menu__list--${variant}`)}\n role=\"menu\"\n aria-orientation=\"vertical\"\n onKeyDown={onKeyDown}\n >\n {children}\n </ul>\n </div>\n );\n});\n","import React from \"react\";\nimport { autoUpdate, Middleware, useFloating } from \"@floating-ui/react\";\nimport Transition, { TransitionStatus } from \"react-transition-group/Transition\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { buildFloatingMiddleware, Placement, resolvePlacement, type ResolvedPlacement } from \"../../../utils/floating\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { MenuList } from \"./menuList\";\n\nexport function buildMenuFloatingMiddleware(resolved: ResolvedPlacement, custom?: Middleware[]): Middleware[] {\n return buildFloatingMiddleware(resolved, custom);\n}\n\nconst defaultStyle = (duration: number): React.CSSProperties => ({\n transition: `opacity ${duration}ms ease-in-out`,\n opacity: 0,\n});\n\nconst transitionStyles = {\n entering: { opacity: 1 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n} as Record<TransitionStatus, React.CSSProperties>;\n\nexport interface MenuFloatingProps extends React.HTMLAttributes<HTMLDivElement> {\n anchorElement?: Element | null;\n isOpen?: boolean;\n onClose?: () => void;\n placement?: Placement;\n middleware?: Middleware[];\n}\n\nexport const MenuFloating = React.forwardRef<HTMLDivElement, MenuFloatingProps>(function MenuFloating(props, ref) {\n const { anchorElement, isOpen, onClose, placement = \"bottom-start\", middleware, style, ...rest } = props;\n const [menuElement, setMenuElement] = React.useState<HTMLElement | null>(null);\n const nodeRef = React.useRef<HTMLElement>(null);\n\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n open: Boolean(isOpen),\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n elements: { reference: anchorElement ?? null },\n middleware: buildMenuFloatingMiddleware(resolved, middleware),\n });\n\n const menuRef = useForkRef(ref, nodeRef, setMenuElement, refs.setFloating);\n\n const onAwayClick = (event: MouseEvent | TouchEvent) => {\n if (!isOpen || !onClose || !menuElement) {\n return;\n }\n\n const target = event.target as HTMLElement;\n\n if (menuElement.contains(target) || (anchorElement as HTMLElement | null)?.contains(target)) {\n return undefined;\n }\n\n onClose?.();\n };\n\n return (\n <Transition nodeRef={nodeRef} in={Boolean(isOpen)} timeout={150} unmountOnExit>\n {(state) => (\n <ClickAwayListener onClickAway={onAwayClick}>\n <MenuList\n ref={menuRef}\n style={{\n ...floatingStyles,\n ...style,\n ...defaultStyle(150),\n ...transitionStyles[state],\n }}\n {...rest}\n />\n </ClickAwayListener>\n )}\n </Transition>\n );\n});\n","import React from \"react\";\nimport { offset } from \"@floating-ui/react\";\nimport { MenuFloating, MenuFloatingProps } from \"./menuFloating\";\nimport { MenuItemProps } from \"./menuItem\";\nimport { MenuContext, useMenuContext } from \"./menuContext\";\n\nexport type MenuSubmenuProps = Pick<MenuFloatingProps, \"placement\" | \"onClose\"> &\n React.HTMLAttributes<HTMLDivElement> & {\n toggleElement?: React.ReactElement;\n /** Items and/or nested `MenuSubmenu` elements (multi-level supported). */\n children: React.ReactNode;\n /** Open the submenu on pointer hover in addition to click. */\n openOnHover?: boolean;\n };\n\nexport const MenuSubmenu = React.forwardRef<HTMLDivElement, MenuSubmenuProps>(function MenuSubmenu(props, ref) {\n const { children, toggleElement, placement = \"right-start\", onClose: onCloseProp, openOnHover, ...rest } = props;\n const [isOpen, setIsOpen] = React.useState(false);\n const [anchorElement, setAnchorElement] = React.useState<HTMLElement | null>(null);\n const contextValue = useMenuContext();\n\n const middleware: MenuFloatingProps[\"middleware\"] = [\n offset(({ placement }) => {\n switch (placement) {\n case \"right-start\":\n case \"left-start\":\n return { crossAxis: -8, mainAxis: 0 };\n case \"right-end\":\n case \"left-end\":\n return { crossAxis: 8, mainAxis: 0 };\n default:\n return { crossAxis: 0, mainAxis: 0 };\n }\n }),\n ];\n\n const onToggle = (event: React.MouseEvent) => {\n // Только для левой клавиши мышки.\n if (event.button !== 0) {\n return;\n }\n\n setIsOpen((prevState) => !prevState);\n };\n\n const onClose = () => {\n setIsOpen(false);\n onCloseProp?.();\n };\n\n const onToggleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"ArrowRight\" || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setIsOpen(true);\n } else if (event.key === \"ArrowLeft\" || event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n const toggle = React.cloneElement(\n toggleElement as React.ReactElement,\n {\n ref: setAnchorElement,\n onClick: onToggle,\n onKeyDown: onToggleKeyDown,\n onMouseEnter: openOnHover ? () => setIsOpen(true) : undefined,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": isOpen,\n selected: isOpen,\n } as MenuItemProps\n );\n\n return (\n <MenuContext.Provider value={{ ...contextValue, variant: \"floating\" }}>\n {toggle}\n <MenuFloating\n ref={ref}\n {...rest}\n placement={placement}\n isOpen={isOpen}\n onClose={onClose}\n anchorElement={anchorElement}\n middleware={middleware}\n >\n {React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) {\n return null;\n }\n // Nested submenus manage their own open/close lifecycle — don't\n // collapse the whole menu when interacting with their toggle.\n if (child.type === MenuSubmenu) {\n return child;\n }\n const typed = child as React.ReactElement<MenuItemProps>;\n return React.cloneElement(typed, {\n onClick: (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n typed.props.onClick?.(e);\n onClose();\n contextValue.onClose();\n },\n });\n })}\n </MenuFloating>\n </MenuContext.Provider>\n );\n});\n","import React from \"react\";\nimport { useMenuContext } from \"./menuContext\";\nimport { MenuList } from \"./menuList\";\nimport { MenuFloating, MenuFloatingProps } from \"./menuFloating\";\n\nexport const MenuComponent = React.forwardRef<HTMLDivElement, MenuFloatingProps>(function MenuComponent(props, ref) {\n const { variant } = useMenuContext();\n if (variant === \"static\") {\n // Static menus render MenuList directly; strip the floating-only props so\n // they don't leak onto the underlying <div> (e.g. isOpen → DOM attribute).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { anchorElement, isOpen, onClose, placement, middleware, ...domProps } = props;\n return <MenuList ref={ref} {...domProps} />;\n }\n return <MenuFloating ref={ref} {...props} />;\n});\n","import React from \"react\";\nimport { MenuContext } from \"./menuContext\";\nimport { MenuComponent } from \"./menuComponent\";\nimport { MenuFloatingProps } from \"./menuFloating\";\n\nexport type MenuProps = MenuFloatingProps &\n React.HTMLAttributes<HTMLElement> & {\n variant?: \"static\" | \"floating\";\n dense?: boolean;\n };\n\nexport const Menu = React.forwardRef<HTMLDivElement, MenuProps>(function Menu(props, ref) {\n const { dense = false, variant = \"floating\", onClose: onCloseProp, ...rest } = props;\n\n const onClose = () => {\n onCloseProp?.();\n };\n\n return (\n <MenuContext.Provider value={{ dense, variant, onClose }}>\n <MenuComponent ref={ref} onClose={onCloseProp} {...rest} />\n </MenuContext.Provider>\n );\n});\n","import React from \"react\";\nimport { MenuItem, MenuItemIcon, MenuItemText } from \"../../navigation/menu\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport Icon from \"../../base/icon/icon\";\n\ninterface Item {\n label: string;\n value: number;\n}\n\nexport interface DataPickerListProps {\n value: number;\n items: Item[];\n onChange: (value: number) => void;\n}\n\nexport function DatePickerList({ value: valueProp, items, onChange }: DataPickerListProps) {\n const overflowRef = React.useRef<HTMLDivElement>(null);\n const selectedItemRef = React.useRef<HTMLLIElement>(null);\n\n useSafeLayoutEffect(() => {\n if (overflowRef.current && selectedItemRef.current) {\n const middle = (overflowRef.current.offsetHeight - selectedItemRef.current.offsetHeight) / 2;\n\n // Прокрутит до элемента середины списка\n overflowRef.current.scrollTop = selectedItemRef.current.offsetTop - middle;\n }\n });\n\n const onItemClick = React.useCallback(\n (value: number) => () => {\n onChange?.(value);\n },\n [onChange]\n );\n\n const setRef = React.useCallback(\n (value: number) => (element: HTMLLIElement) => {\n if (valueProp === value) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Мутабельный объект\n selectedItemRef.current = element;\n }\n },\n [valueProp]\n );\n\n return (\n <div className=\"smwb-date-picker__overflow\" ref={overflowRef} data-testid=\"date-picker-list\">\n <ul className=\"smwb-date-picker__list\">\n {items.map(({ label, value }) => {\n const isSelected = valueProp === value;\n\n return (\n <MenuItem key={value} selected={isSelected} onClick={onItemClick(value)} ref={setRef(value)}>\n {isSelected && (\n <MenuItemIcon>\n <Icon name=\"check\" weight={500} size={24} />\n </MenuItemIcon>\n )}\n <MenuItemText className=\"smwb-date-picker__list-item\" inset={!isSelected}>\n {label}\n </MenuItemText>\n </MenuItem>\n );\n })}\n </ul>\n </div>\n );\n}\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useRifm } from \"rifm\";\nimport {\n getDateByFormat,\n isDateMatch,\n getDisplayDate,\n getMaskFormat,\n getCurrentFormatDate,\n maskedDateFormatter,\n} from \"./utils\";\nimport { DatePickerProps } from \"./datePicker\";\n\nexport type UseDateInputProps = Pick<DatePickerProps, \"value\" | \"onChange\" | \"onBlur\"> & {\n /** Date format pattern with tokens dd, MM, yyyy (e.g. \"dd/MM/yyyy\"). Defaults to the system locale. */\n format?: string;\n};\n\ninterface UseDateInputReturn {\n value: string;\n onChange: React.ChangeEventHandler;\n onBlur: React.ChangeEventHandler;\n placeholder: string;\n}\n\n// Формат даты для текущей локали, например ru — dd.MM.yyyy, en — MM/dd/yyyy\nconst defaultFormatDate = getCurrentFormatDate();\n\nexport function useDateInput({\n value: valueProp,\n onChange: onChangeProp,\n onBlur: onBlurProp,\n format,\n}: UseDateInputProps): UseDateInputReturn {\n const currentFormatDate = useMemo(() => (format ? getCurrentFormatDate(format) : defaultFormatDate), [format]);\n const [displayedValue, setDisplayedValue] = useState(getDisplayDate(valueProp, format));\n\n // Получаем маску даты для текущей локали\n const maskFormat = useMemo(() => getMaskFormat(format), [format]);\n // Форматирование для выходного значения в поле\n const formatter = useMemo(() => maskedDateFormatter(maskFormat), [maskFormat]);\n\n const prevValue = useRef<UseDateInputProps[\"value\"]>(undefined);\n\n React.useEffect(() => {\n const isValueChanged = valueProp !== prevValue.current;\n prevValue.current = valueProp;\n\n if (!isValueChanged) {\n return;\n }\n\n setDisplayedValue(getDisplayDate(valueProp, format));\n }, [valueProp, format]);\n\n const onChange = (value: string) => {\n setDisplayedValue(value);\n\n if (!onChangeProp) {\n return;\n }\n\n if (isDateMatch(value, currentFormatDate)) {\n onChangeProp(undefined, getDateByFormat(value, currentFormatDate));\n } else if (value === \"\") {\n onChangeProp(undefined);\n }\n };\n\n const onBlur = useCallback(() => {\n if (!onBlurProp) {\n return;\n }\n\n if (isDateMatch(prevValue.current?.toString() ?? \"\", currentFormatDate)) {\n onBlurProp(undefined, getDateByFormat(prevValue.current?.toString() ?? \"\", currentFormatDate));\n } else if (prevValue.current === \"\") {\n onBlurProp(undefined);\n }\n\n setDisplayedValue(getDisplayDate(valueProp, format));\n }, [onBlurProp, valueProp, format, currentFormatDate]);\n\n const rifmProps = useRifm({\n value: displayedValue,\n onChange,\n format: formatter,\n });\n\n const placeholder = currentFormatDate.toLowerCase();\n\n return {\n ...rifmProps,\n onBlur,\n placeholder,\n };\n}\n","import React from \"react\";\nimport { TextField } from \"../textField\";\nimport { DatePickerIconButton } from \"./datePickerIconButton\";\nimport { useDateInput } from \"./useDateInput\";\nimport { DatePickerProps } from \"./datePicker\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface DataPickerInputProps extends Omit<\n DatePickerProps,\n \"locale\" | \"showDaysOutsideMonth\" | \"disablePast\" | \"disableFuture\" | \"weekStartsOn\" | \"placement\"\n> {\n onToggle: () => void;\n}\n\nfunction stopPropagation(event: React.SyntheticEvent) {\n event.stopPropagation();\n}\n\nexport const DataPickerInput = React.forwardRef(function DataPickerInput(\n props: DataPickerInputProps,\n ref: React.Ref<HTMLInputElement>\n) {\n const { value, onChange, onBlur, onToggle, disabled, disableCalendar, calendarIcon, format, ...rest } = props;\n const maskedProps = useDateInput({ value, onChange, onBlur, format });\n\n return (\n <TextField\n ref={ref}\n {...maskedProps}\n type=\"tel\"\n endAdornment={\n !disableCalendar && (\n <DatePickerIconButton\n edge=\"end\"\n onClick={onToggle}\n onMouseDown={stopPropagation}\n disabled={Boolean(disabled)}\n data-testid=\"date-picker-icon-button\"\n >\n {calendarIcon || <Icon name=\"calendar_today\" fill={1} weight={500} size={24} />}\n </DatePickerIconButton>\n )\n }\n disabled={Boolean(disabled)}\n {...rest}\n />\n );\n});\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { autoUpdate, useFloating } from \"@floating-ui/react\";\nimport Transition, { TransitionStatus } from \"react-transition-group/Transition\";\nimport { buildFloatingMiddleware, Placement, resolvePlacement } from \"../../../utils/floating\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { TextField, TextFieldProps } from \"../textField\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { DataPickerHeader } from \"./dataPickerHeader\";\nimport { DataPickerDays } from \"./dataPickerDays\";\nimport { DatePickerList } from \"./datePickerList\";\nimport { getMonths, setMonth, getYears, setYear, isValidDate, getDisplayDate } from \"./utils\";\nimport { DataPickerInput } from \"./dataPickerInput\";\nimport { DatePickerIconButton } from \"./datePickerIconButton\";\nimport Icon from \"../../base/icon/icon\";\nimport { createPortal } from \"react-dom\";\n\nexport enum OpenView {\n days = \"days\",\n months = \"months\",\n years = \"years\",\n}\n\nconst defaultStyle = (duration: number) => ({\n transition: `opacity ${duration}ms ease-in-out`,\n opacity: 0,\n});\n\nconst transitionStyles = {\n entering: { opacity: 1 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n} as Record<TransitionStatus, { opacity: number }>;\n\nexport interface DatePickerProps extends Omit<TextFieldProps, \"onBlur\" | \"onChange\" | \"value\" | \"defaultValue\"> {\n showDaysOutsideMonth?: boolean;\n disablePast?: boolean;\n disableFuture?: boolean;\n /** Earliest selectable date (inclusive). */\n minDate?: Date;\n /** Latest selectable date (inclusive). */\n maxDate?: Date;\n /** Predicate to disable arbitrary days. */\n isDateDisabled?: (day: Date) => boolean;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** BCP-47 locale for calendar labels (day/month/year names). */\n locale?: string;\n /** Input format pattern with tokens dd, MM, yyyy, e.g. \"dd/MM/yyyy\". */\n format?: string;\n /** Enables date-range selection. */\n range?: boolean;\n /** Controlled range value `[start, end]`. */\n rangeValue?: [Date | undefined, Date | undefined];\n /** Called when the range changes. */\n onRangeChange?: (range: [Date | undefined, Date | undefined]) => void;\n placement?: Placement;\n disableCalendar?: boolean;\n label?: string;\n /** Accessible label for the calendar popup dialog. */\n calendarAriaLabel?: string;\n autoComplete?: string;\n value?: Date | string;\n calendarIcon?: React.ReactNode;\n onChange?: (event?: React.ChangeEvent<HTMLInputElement>, value?: Date, data?: DatePickerProps) => void;\n onBlur?: (event?: React.FocusEvent<HTMLInputElement>, value?: Date, data?: DatePickerProps) => void;\n}\n\nexport const DatePicker = React.forwardRef(function DatePicker(props: DatePickerProps, ref) {\n const {\n value: valueProp,\n onChange: onChangeProp,\n showDaysOutsideMonth,\n disablePast,\n disableFuture,\n weekStartsOn = 1,\n placement = \"bottom-start\",\n disabled,\n disableCalendar,\n calendarAriaLabel = \"Choose date\",\n minDate,\n maxDate,\n isDateDisabled,\n locale,\n format,\n range,\n rangeValue,\n onRangeChange,\n calendarIcon,\n onBlur: onBlurProp,\n ...rest\n } = props;\n const value = useMemo(() => (valueProp === undefined ? undefined : new Date(valueProp)), [valueProp]);\n const isRangeControlled = rangeValue !== undefined;\n const [rangeState, setRangeState] = useState<[Date | undefined, Date | undefined]>([undefined, undefined]);\n const currentRange = isRangeControlled && rangeValue ? rangeValue : rangeState;\n const [viewValue, setViewValue] = useState<Date>(() => (isValidDate(value) ? value : new Date()));\n const [openView, setOpenView] = useState<OpenView>(OpenView.days);\n const [isOpen, setIsOpen] = useState(false);\n\n const anchorRef = useRef<HTMLDivElement | null>(null);\n const calendarRef = useRef<HTMLDivElement | null>(null);\n\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: buildFloatingMiddleware(resolved),\n });\n\n const anchorForkRef = useForkRef(anchorRef, refs.setReference, ref);\n const calendarForkRef = useForkRef(calendarRef, refs.setFloating);\n\n useSafeLayoutEffect(() => {\n if (disabled) {\n return;\n }\n\n setViewValue(isValidDate(value) ? value : new Date());\n }, [value, disabled]);\n\n const onViewValueChange = useCallback((value: Date) => {\n setViewValue(value);\n }, []);\n\n const onMonthLabelClick = useCallback(() => {\n setOpenView(openView === OpenView.months ? OpenView.days : OpenView.months);\n }, [openView]);\n\n const onYearLabelClick = useCallback(() => {\n setOpenView(openView === OpenView.years ? OpenView.days : OpenView.years);\n }, [openView]);\n\n const onMonthChange = useCallback(\n (month: number) => {\n setViewValue(setMonth(viewValue, month));\n setOpenView(OpenView.days);\n },\n [viewValue]\n );\n\n const onYearChange = useCallback(\n (month: number) => {\n setViewValue(setYear(viewValue, month));\n setOpenView(OpenView.days);\n },\n [viewValue]\n );\n\n const onChange = useCallback(\n (event?: React.ChangeEvent<HTMLInputElement>, date?: Date) => {\n if (range) {\n if (!date) {\n return;\n }\n const [start, end] = currentRange;\n let next: [Date | undefined, Date | undefined];\n if (!start || (start && end)) {\n next = [date, undefined];\n } else {\n next = isValidDate(start) && date.getTime() < start.getTime() ? [date, start] : [start, date];\n }\n if (!isRangeControlled) {\n setRangeState(next);\n }\n onRangeChange?.(next);\n if (next[0] && next[1]) {\n setIsOpen(false);\n }\n return;\n }\n onChangeProp?.(event, date, props);\n setIsOpen(false);\n },\n [onChangeProp, props, range, currentRange, isRangeControlled, onRangeChange]\n );\n\n const onToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prevState) => !prevState);\n }\n }, [disabled]);\n\n const onClickAway = useCallback((event: Event | React.SyntheticEvent) => {\n const target = event.target as HTMLElement;\n\n if (calendarRef.current?.contains(target) || anchorRef.current?.contains(target)) {\n return;\n }\n\n setIsOpen(false);\n }, []);\n\n const months = useMemo(() => getMonths(locale), [locale]);\n const years = useMemo(() => getYears(new Date().getFullYear(), 100), []);\n\n let view: React.ReactNode = null;\n\n switch (openView) {\n case OpenView.days:\n view = (\n <DataPickerDays\n viewValue={viewValue}\n value={value}\n showDaysOutsideMonth={showDaysOutsideMonth}\n onChange={onChange}\n disablePast={disablePast}\n disableFuture={disableFuture}\n weekStartsOn={weekStartsOn}\n minDate={minDate}\n maxDate={maxDate}\n isDateDisabled={isDateDisabled}\n locale={locale}\n range={range}\n rangeStart={currentRange[0]}\n rangeEnd={currentRange[1]}\n />\n );\n break;\n case OpenView.months:\n view = <DatePickerList value={viewValue.getMonth()} items={months} onChange={onMonthChange} />;\n break;\n case OpenView.years:\n view = <DatePickerList value={viewValue.getFullYear()} items={years} onChange={onYearChange} />;\n break;\n }\n\n const rangeDisplay =\n range && (currentRange[0] || currentRange[1])\n ? `${getDisplayDate(currentRange[0], format)} – ${getDisplayDate(currentRange[1], format)}`\n : \"\";\n\n return (\n <>\n {range ? (\n <TextField\n ref={anchorForkRef}\n value={rangeDisplay}\n readOnly\n onChange={() => undefined}\n disabled={Boolean(disabled)}\n placeholder={format ? `${format} – ${format}` : undefined}\n endAdornment={\n !disableCalendar && (\n <DatePickerIconButton\n edge=\"end\"\n onClick={onToggle}\n disabled={Boolean(disabled)}\n data-testid=\"date-picker-icon-button\"\n >\n {calendarIcon || <Icon name=\"calendar_today\" fill={1} weight={500} size={24} />}\n </DatePickerIconButton>\n )\n }\n {...rest}\n />\n ) : (\n <DataPickerInput\n ref={anchorForkRef}\n value={value}\n onChange={onChangeProp}\n onBlur={onBlurProp}\n onToggle={onToggle}\n disabled={disabled}\n disableCalendar={disableCalendar}\n format={format}\n calendarIcon={calendarIcon}\n {...rest}\n />\n )}\n {createPortal(\n <Transition\n nodeRef={calendarRef}\n in={isOpen && !disabled && !disableCalendar}\n timeout={150}\n mountOnEnter\n unmountOnExit\n >\n {(state) => (\n <ClickAwayListener onClickAway={onClickAway}>\n <div\n ref={calendarForkRef}\n className=\"smwb-date-picker\"\n style={{\n ...floatingStyles,\n ...defaultStyle(150),\n ...transitionStyles[state],\n }}\n data-testid=\"date-picker\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={calendarAriaLabel}\n >\n <div className=\"smwb-date-picker__inner\">\n <DataPickerHeader\n viewValue={viewValue}\n locale={locale}\n openView={openView}\n onChange={onViewValueChange}\n onMonthLabelClick={onMonthLabelClick}\n onYearLabelClick={onYearLabelClick}\n />\n <div className=\"smwb-date-picker__body\">{view}</div>\n </div>\n </div>\n </ClickAwayListener>\n )}\n </Transition>,\n document.body\n )}\n </>\n );\n});\n\nexport default DatePicker;\n","const DATETIME_TOKEN_REGEXP = /yyyy|MM|dd|HH|mm|ss/g;\n\ntype DateTimeToken = \"yyyy\" | \"MM\" | \"dd\" | \"HH\" | \"mm\" | \"ss\";\n\nfunction extractTokens(pattern: string): DateTimeToken[] {\n const tokens: DateTimeToken[] = [];\n let match: RegExpExecArray | null;\n\n DATETIME_TOKEN_REGEXP.lastIndex = 0;\n while ((match = DATETIME_TOKEN_REGEXP.exec(pattern)) !== null) {\n tokens.push(match[0] as DateTimeToken);\n }\n\n return tokens;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction patternToRegExp(pattern: string): RegExp {\n let regex = \"^\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n DATETIME_TOKEN_REGEXP.lastIndex = 0;\n while ((match = DATETIME_TOKEN_REGEXP.exec(pattern)) !== null) {\n regex += escapeRegExp(pattern.slice(lastIndex, match.index));\n regex += match[0] === \"yyyy\" ? \"(\\\\d{4})\" : \"(\\\\d{2})\";\n lastIndex = DATETIME_TOKEN_REGEXP.lastIndex;\n }\n\n regex += escapeRegExp(pattern.slice(lastIndex));\n regex += \"$\";\n\n return new RegExp(regex);\n}\n\nfunction isValidCalendarDate(year: number, month: number, day: number): boolean {\n if (month < 1 || month > 12 || day < 1) {\n return false;\n }\n\n const date = new Date(year, month - 1, day);\n\n return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;\n}\n\nfunction isValidTime(hours: number, minutes: number, seconds: number): boolean {\n return hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59 && seconds >= 0 && seconds <= 59;\n}\n\nexport function formatDateTimeByPattern(date: Date, pattern: string): string {\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n\n return pattern.replace(DATETIME_TOKEN_REGEXP, (token) => {\n if (token === \"yyyy\") {\n return String(year).padStart(4, \"0\");\n }\n\n if (token === \"MM\") {\n return String(month).padStart(2, \"0\");\n }\n\n if (token === \"dd\") {\n return String(day).padStart(2, \"0\");\n }\n\n if (token === \"HH\") {\n return String(hours).padStart(2, \"0\");\n }\n\n if (token === \"mm\") {\n return String(minutes).padStart(2, \"0\");\n }\n\n return String(seconds).padStart(2, \"0\");\n });\n}\n\nexport function parseDateTimeByPattern(value: string, pattern: string): Date | undefined {\n const tokens = extractTokens(pattern);\n\n if (\n !tokens.includes(\"yyyy\") ||\n !tokens.includes(\"MM\") ||\n !tokens.includes(\"dd\") ||\n !tokens.includes(\"HH\") ||\n !tokens.includes(\"mm\")\n ) {\n return undefined;\n }\n\n const match = patternToRegExp(pattern).exec(value);\n\n if (!match) {\n return undefined;\n }\n\n let year: number | undefined;\n let month: number | undefined;\n let day: number | undefined;\n let hours: number | undefined;\n let minutes: number | undefined;\n let seconds = 0;\n\n tokens.forEach((token, index) => {\n const part = Number(match[index + 1]);\n\n if (token === \"yyyy\") {\n year = part;\n return;\n }\n\n if (token === \"MM\") {\n month = part;\n return;\n }\n\n if (token === \"dd\") {\n day = part;\n return;\n }\n\n if (token === \"HH\") {\n hours = part;\n return;\n }\n\n if (token === \"mm\") {\n minutes = part;\n return;\n }\n\n seconds = part;\n });\n\n if (year === undefined || month === undefined || day === undefined || hours === undefined || minutes === undefined) {\n return undefined;\n }\n\n if (!isValidCalendarDate(year, month, day) || !isValidTime(hours, minutes, seconds)) {\n return undefined;\n }\n\n return new Date(year, month - 1, day, hours, minutes, seconds);\n}\n\nexport function isDateTimePatternMatch(value: string, pattern: string): boolean {\n return parseDateTimeByPattern(value, pattern) !== undefined;\n}\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useRifm } from \"rifm\";\nimport { getCurrentFormatDate, maskedDateFormatter } from \"../datePicker/utils\";\nimport { formatDateTimeByPattern, isDateTimePatternMatch, parseDateTimeByPattern } from \"./dateTimeFormat\";\nimport { DateTimePickerProps } from \"./dateTimePicker\";\n\nexport type UseDateTimeInputProps = Pick<DateTimePickerProps, \"value\" | \"onChange\" | \"onBlur\"> & {\n format?: string;\n};\n\ninterface UseDateTimeInputReturn {\n value: string;\n onChange: React.ChangeEventHandler;\n onBlur: React.ChangeEventHandler;\n placeholder: string;\n}\n\nconst MASK_TOKEN_REGEXP = /[a-zA-Z]/g;\n\nfunction getDisplayDateTime(date: unknown, format?: string) {\n if (!date || Object.prototype.toString.call(date) !== \"[object Date]\" || isNaN(date as number)) {\n return \"\";\n }\n\n if (format) {\n return formatDateTimeByPattern(date as Date, format);\n }\n\n return new Intl.DateTimeFormat(undefined, {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n }).format(date as Date);\n}\n\nfunction getCurrentDateTimeFormat(format?: string): string {\n if (format) {\n return format;\n }\n\n return `${getCurrentFormatDate()} HH:mm`;\n}\n\nfunction getDateTimeMaskFormat(format?: string) {\n return getCurrentDateTimeFormat(format).replace(MASK_TOKEN_REGEXP, \"_\");\n}\n\nfunction getDateTimeByFormat(value: string, format: string) {\n const parsed = parseDateTimeByPattern(value, format);\n\n if (!parsed) {\n return new Date(Number.NaN);\n }\n\n return parsed;\n}\n\nexport function useDateTimeInput({\n value: valueProp,\n onChange: onChangeProp,\n onBlur: onBlurProp,\n format,\n}: UseDateTimeInputProps): UseDateTimeInputReturn {\n const currentFormat = useMemo(() => getCurrentDateTimeFormat(format), [format]);\n const [displayedValue, setDisplayedValue] = useState(getDisplayDateTime(valueProp, format));\n const maskFormat = useMemo(() => getDateTimeMaskFormat(format), [format]);\n const formatter = useMemo(() => maskedDateFormatter(maskFormat), [maskFormat]);\n const prevValue = useRef<UseDateTimeInputProps[\"value\"]>(undefined);\n\n React.useEffect(() => {\n const isValueChanged = valueProp !== prevValue.current;\n prevValue.current = valueProp;\n\n if (!isValueChanged) {\n return;\n }\n\n setDisplayedValue(getDisplayDateTime(valueProp, format));\n }, [valueProp, format]);\n\n const onChange = (value: string) => {\n setDisplayedValue(value);\n\n if (!onChangeProp) {\n return;\n }\n\n if (isDateTimePatternMatch(value, currentFormat)) {\n onChangeProp(undefined, getDateTimeByFormat(value, currentFormat));\n } else if (value === \"\") {\n onChangeProp(undefined);\n }\n };\n\n const onBlur = useCallback(() => {\n if (!onBlurProp) {\n return;\n }\n\n const prev = prevValue.current;\n\n if (prev instanceof Date && isDateTimePatternMatch(getDisplayDateTime(prev, format), currentFormat)) {\n onBlurProp(undefined, prev);\n } else if (typeof prev === \"string\" && isDateTimePatternMatch(prev, currentFormat)) {\n onBlurProp(undefined, getDateTimeByFormat(prev, currentFormat));\n } else if (prev === undefined || prev === \"\") {\n onBlurProp(undefined);\n }\n\n setDisplayedValue(getDisplayDateTime(valueProp, format));\n }, [onBlurProp, valueProp, format, currentFormat]);\n\n const rifmProps = useRifm({\n value: displayedValue,\n onChange,\n format: formatter,\n });\n\n return {\n ...rifmProps,\n onBlur,\n placeholder: getCurrentDateTimeFormat(format).toLowerCase(),\n };\n}\n\nexport { getDisplayDateTime, getCurrentDateTimeFormat };\n","import React from \"react\";\nimport { TextField } from \"../textField\";\nimport { DatePickerIconButton } from \"../datePicker/datePickerIconButton\";\nimport { useDateTimeInput } from \"./useDateTimeInput\";\nimport { DateTimePickerProps } from \"./dateTimePicker\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface DateTimePickerInputProps extends Omit<\n DateTimePickerProps,\n | \"locale\"\n | \"showDaysOutsideMonth\"\n | \"disablePast\"\n | \"disableFuture\"\n | \"weekStartsOn\"\n | \"placement\"\n | \"minDate\"\n | \"maxDate\"\n | \"isDateDisabled\"\n> {\n onToggle: () => void;\n}\n\nfunction stopPropagation(event: React.SyntheticEvent) {\n event.stopPropagation();\n}\n\nexport const DateTimePickerInput = React.forwardRef(function DateTimePickerInput(\n props: DateTimePickerInputProps,\n ref: React.Ref<HTMLInputElement>\n) {\n const { value, onChange, onBlur, onToggle, disabled, disableCalendar, calendarIcon, format, ...rest } = props;\n const maskedProps = useDateTimeInput({ value, onChange, onBlur, format });\n\n return (\n <TextField\n ref={ref}\n {...maskedProps}\n type=\"tel\"\n endAdornment={\n !disableCalendar && (\n <DatePickerIconButton\n edge=\"end\"\n onClick={onToggle}\n onMouseDown={stopPropagation}\n disabled={Boolean(disabled)}\n data-testid=\"date-time-picker-icon-button\"\n >\n {calendarIcon || <Icon name=\"event\" fill={1} weight={500} size={24} />}\n </DatePickerIconButton>\n )\n }\n disabled={Boolean(disabled)}\n {...rest}\n />\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\ninterface Item {\n label: string;\n value: number;\n}\n\nexport interface TimePickerListProps {\n value: number;\n items: Item[];\n onChange: (value: number) => void;\n}\n\nexport function TimePickerList({ value: valueProp, items, onChange }: TimePickerListProps) {\n const overflowRef = React.useRef<HTMLDivElement>(null);\n const selectedItemRef = React.useRef<HTMLLIElement>(null);\n\n useSafeLayoutEffect(() => {\n if (overflowRef.current && selectedItemRef.current) {\n const middle = (overflowRef.current.offsetHeight - selectedItemRef.current.offsetHeight) / 2;\n\n overflowRef.current.scrollTop = selectedItemRef.current.offsetTop - middle;\n }\n });\n\n const onItemClick = React.useCallback(\n (value: number) => () => {\n onChange?.(value);\n },\n [onChange]\n );\n\n const setRef = React.useCallback(\n (value: number) => (element: HTMLLIElement) => {\n if (valueProp === value) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Мутабельный объект\n selectedItemRef.current = element;\n }\n },\n [valueProp]\n );\n\n return (\n <div className=\"smwb-time-picker__overflow\" ref={overflowRef} data-testid=\"time-picker-list\">\n <ul className=\"smwb-time-picker__list\">\n {items.map(({ label, value }) => {\n const isSelected = valueProp === value;\n\n return (\n <li\n key={value}\n ref={setRef(value)}\n className={cn(\"smwb-time-picker__item\", {\n \"smwb-time-picker__item--selected\": isSelected,\n })}\n onClick={onItemClick(value)}\n >\n {label}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","const TIME_TOKEN_REGEXP = /HH|mm|ss/g;\n\ntype TimeToken = \"HH\" | \"mm\" | \"ss\";\n\nfunction extractTokens(pattern: string): TimeToken[] {\n const tokens: TimeToken[] = [];\n let match: RegExpExecArray | null;\n\n TIME_TOKEN_REGEXP.lastIndex = 0;\n while ((match = TIME_TOKEN_REGEXP.exec(pattern)) !== null) {\n tokens.push(match[0] as TimeToken);\n }\n\n return tokens;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction patternToRegExp(pattern: string): RegExp {\n let regex = \"^\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n TIME_TOKEN_REGEXP.lastIndex = 0;\n while ((match = TIME_TOKEN_REGEXP.exec(pattern)) !== null) {\n regex += escapeRegExp(pattern.slice(lastIndex, match.index));\n regex += \"(\\\\d{2})\";\n lastIndex = TIME_TOKEN_REGEXP.lastIndex;\n }\n\n regex += escapeRegExp(pattern.slice(lastIndex));\n regex += \"$\";\n\n return new RegExp(regex);\n}\n\nfunction isValidTime(hours: number, minutes: number, seconds: number): boolean {\n return hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59 && seconds >= 0 && seconds <= 59;\n}\n\nexport function patternHasSeconds(pattern: string): boolean {\n return extractTokens(pattern).includes(\"ss\");\n}\n\nexport function formatTimeByPattern(date: Date, pattern: string): string {\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n\n return pattern.replace(TIME_TOKEN_REGEXP, (token) => {\n if (token === \"HH\") {\n return String(hours).padStart(2, \"0\");\n }\n\n if (token === \"mm\") {\n return String(minutes).padStart(2, \"0\");\n }\n\n return String(seconds).padStart(2, \"0\");\n });\n}\n\nexport function parseTimeByPattern(value: string, pattern: string): Date | undefined {\n const tokens = extractTokens(pattern);\n\n if (!tokens.includes(\"HH\") || !tokens.includes(\"mm\")) {\n return undefined;\n }\n\n const match = patternToRegExp(pattern).exec(value);\n\n if (!match) {\n return undefined;\n }\n\n let hours: number | undefined;\n let minutes: number | undefined;\n let seconds = 0;\n\n tokens.forEach((token, index) => {\n const part = Number(match[index + 1]);\n\n if (token === \"HH\") {\n hours = part;\n return;\n }\n\n if (token === \"mm\") {\n minutes = part;\n return;\n }\n\n seconds = part;\n });\n\n if (hours === undefined || minutes === undefined) {\n return undefined;\n }\n\n if (!isValidTime(hours, minutes, seconds)) {\n return undefined;\n }\n\n const now = new Date();\n\n return new Date(now.getFullYear(), now.getMonth(), now.getDate(), hours, minutes, seconds);\n}\n\nexport function isTimePatternMatch(value: string, pattern: string): boolean {\n return parseTimeByPattern(value, pattern) !== undefined;\n}\n","import { formatTimeByPattern, isTimePatternMatch, parseTimeByPattern } from \"./timeFormat\";\n\nconst MASK_DIGIT_REGEXP = /\\d/gi;\nconst MASK_TOKEN_REGEXP = /[a-zA-Z]/g;\n\nexport const DEFAULT_TIME_FORMAT = \"HH:mm\";\n\nexport function getHoursList() {\n return Array.from({ length: 24 }, (_, value) => ({\n value,\n label: String(value).padStart(2, \"0\"),\n }));\n}\n\nexport function getMinutesList() {\n return Array.from({ length: 60 }, (_, value) => ({\n value,\n label: String(value).padStart(2, \"0\"),\n }));\n}\n\nexport function getSecondsList() {\n return Array.from({ length: 60 }, (_, value) => ({\n value,\n label: String(value).padStart(2, \"0\"),\n }));\n}\n\nexport function setTime(date: Date, hours: number, minutes: number, seconds: number) {\n const next = new Date(date);\n\n next.setHours(hours, minutes, seconds, 0);\n\n return next;\n}\n\nexport function getDisplayTime(date: unknown, format?: string) {\n if (!isValidTimeDate(date)) {\n return \"\";\n }\n\n return formatTimeByPattern(date, format ?? DEFAULT_TIME_FORMAT);\n}\n\nexport function getCurrentTimeFormat(format?: string): string {\n return format ?? DEFAULT_TIME_FORMAT;\n}\n\nexport function getTimeMaskFormat(format?: string) {\n return getCurrentTimeFormat(format).replace(MASK_TOKEN_REGEXP, \"_\");\n}\n\nexport function maskedTimeFormatter(mask: string) {\n return (value: string) => {\n let outputCharIndex = 0;\n\n return value\n .split(\"\")\n .map((char, inputCharIndex) => {\n MASK_DIGIT_REGEXP.lastIndex = 0;\n\n if (outputCharIndex > mask.length - 1) {\n return \"\";\n }\n\n const maskChar = mask[outputCharIndex];\n const nextMaskChar = mask[outputCharIndex + 1];\n\n const acceptedChar = MASK_DIGIT_REGEXP.test(char) ? char : \"\";\n const formattedChar = maskChar === \"_\" ? acceptedChar : maskChar + acceptedChar;\n\n outputCharIndex += formattedChar.length;\n\n const isLastCharacter = inputCharIndex === value.length - 1;\n\n if (isLastCharacter && nextMaskChar && nextMaskChar !== \"_\") {\n return formattedChar ? formattedChar + nextMaskChar : \"\";\n }\n\n return formattedChar;\n })\n .join(\"\");\n };\n}\n\nexport function isTimeMatch(value: string, format: string) {\n return isTimePatternMatch(value, format);\n}\n\nexport function getTimeByFormat(value: string, format: string) {\n const parsed = parseTimeByPattern(value, format);\n\n if (!parsed) {\n return new Date(Number.NaN);\n }\n\n return parsed;\n}\n\nexport function isValidTimeDate(value: unknown): value is Date {\n return Object.prototype.toString.call(value) === \"[object Date]\" && !isNaN(value as number);\n}\n\nexport function mergeTime(baseDate: Date, timeDate: Date) {\n return new Date(\n baseDate.getFullYear(),\n baseDate.getMonth(),\n baseDate.getDate(),\n timeDate.getHours(),\n timeDate.getMinutes(),\n timeDate.getSeconds(),\n 0\n );\n}\n\nexport function mergeDate(date: Date, timeSource: Date) {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n timeSource.getHours(),\n timeSource.getMinutes(),\n timeSource.getSeconds(),\n 0\n );\n}\n","import React from \"react\";\nimport { TimePickerList } from \"./timePickerList\";\nimport { patternHasSeconds } from \"./timeFormat\";\nimport {\n DEFAULT_TIME_FORMAT,\n getHoursList,\n getMinutesList,\n getSecondsList,\n isValidTimeDate,\n setTime,\n} from \"./timeUtils\";\n\nexport interface TimePickerColumnsProps {\n value?: Date;\n format?: string;\n onChange: (value: Date) => void;\n onComplete?: () => void;\n}\n\nexport function TimePickerColumns({ value, format, onChange, onComplete }: TimePickerColumnsProps) {\n const current = React.useMemo(() => (isValidTimeDate(value) ? value : new Date()), [value]);\n const timeFormat = format ?? DEFAULT_TIME_FORMAT;\n const showSeconds = patternHasSeconds(timeFormat);\n const hours = React.useMemo(() => getHoursList(), []);\n const minutes = React.useMemo(() => getMinutesList(), []);\n const seconds = React.useMemo(() => getSecondsList(), []);\n\n const onHourChange = React.useCallback(\n (hour: number) => {\n onChange(setTime(current, hour, current.getMinutes(), current.getSeconds()));\n },\n [current, onChange]\n );\n\n const onMinuteChange = React.useCallback(\n (minute: number) => {\n onChange(setTime(current, current.getHours(), minute, current.getSeconds()));\n\n if (!showSeconds) {\n onComplete?.();\n }\n },\n [current, onChange, onComplete, showSeconds]\n );\n\n const onSecondChange = React.useCallback(\n (second: number) => {\n onChange(setTime(current, current.getHours(), current.getMinutes(), second));\n onComplete?.();\n },\n [current, onChange, onComplete]\n );\n\n return (\n <div className=\"smwb-time-picker__columns\" data-testid=\"time-picker-columns\">\n <div className=\"smwb-time-picker__column\">\n <TimePickerList value={current.getHours()} items={hours} onChange={onHourChange} />\n </div>\n <div className=\"smwb-time-picker__column\">\n <TimePickerList value={current.getMinutes()} items={minutes} onChange={onMinuteChange} />\n </div>\n {showSeconds && (\n <div className=\"smwb-time-picker__column\">\n <TimePickerList value={current.getSeconds()} items={seconds} onChange={onSecondChange} />\n </div>\n )}\n </div>\n );\n}\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { autoUpdate, useFloating } from \"@floating-ui/react\";\nimport Transition, { TransitionStatus } from \"react-transition-group/Transition\";\nimport { buildFloatingMiddleware, Placement, resolvePlacement } from \"../../../utils/floating\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { TextFieldProps } from \"../textField\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { DataPickerHeader } from \"../datePicker/dataPickerHeader\";\nimport { DataPickerDays } from \"../datePicker/dataPickerDays\";\nimport { DatePickerList } from \"../datePicker/datePickerList\";\nimport { getMonths, setMonth, getYears, setYear, isValidDate } from \"../datePicker/utils\";\nimport { OpenView } from \"../datePicker/datePicker\";\nimport { DateTimePickerInput } from \"./dateTimePickerInput\";\nimport { TimePickerColumns } from \"../timePicker/timePickerColumns\";\nimport { DEFAULT_TIME_FORMAT, isValidTimeDate, mergeDate, mergeTime } from \"../timePicker/timeUtils\";\nimport { createPortal } from \"react-dom\";\n\nconst defaultStyle = (duration: number) => ({\n transition: `opacity ${duration}ms ease-in-out`,\n opacity: 0,\n});\n\nconst transitionStyles = {\n entering: { opacity: 1 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n} as Record<TransitionStatus, { opacity: number }>;\n\nexport interface DateTimePickerProps extends Omit<TextFieldProps, \"onBlur\" | \"onChange\" | \"value\" | \"defaultValue\"> {\n showDaysOutsideMonth?: boolean;\n disablePast?: boolean;\n disableFuture?: boolean;\n minDate?: Date;\n maxDate?: Date;\n isDateDisabled?: (day: Date) => boolean;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n locale?: string;\n /** Input format with tokens dd, MM, yyyy, HH, mm, ss, e.g. \"dd/MM/yyyy HH:mm\". */\n format?: string;\n /** Time portion format when using the clock columns. Defaults to \"HH:mm\". */\n timeFormat?: string;\n placement?: Placement;\n disableCalendar?: boolean;\n label?: string;\n calendarAriaLabel?: string;\n autoComplete?: string;\n value?: Date | string;\n calendarIcon?: React.ReactNode;\n onChange?: (event?: React.ChangeEvent<HTMLInputElement>, value?: Date, data?: DateTimePickerProps) => void;\n onBlur?: (event?: React.FocusEvent<HTMLInputElement>, value?: Date, data?: DateTimePickerProps) => void;\n}\n\nexport const DateTimePicker = React.forwardRef(function DateTimePicker(props: DateTimePickerProps, ref) {\n const {\n value: valueProp,\n onChange: onChangeProp,\n showDaysOutsideMonth,\n disablePast,\n disableFuture,\n weekStartsOn = 1,\n placement = \"bottom-start\",\n disabled,\n disableCalendar,\n calendarAriaLabel = \"Choose date and time\",\n minDate,\n maxDate,\n isDateDisabled,\n locale,\n format,\n timeFormat,\n calendarIcon,\n onBlur: onBlurProp,\n ...rest\n } = props;\n const value = useMemo(() => (valueProp === undefined ? undefined : new Date(valueProp)), [valueProp]);\n const [viewValue, setViewValue] = useState<Date>(() =>\n isValidDate(value) || isValidTimeDate(value) ? value : new Date()\n );\n const [openView, setOpenView] = useState<OpenView>(OpenView.days);\n const [isOpen, setIsOpen] = useState(false);\n\n const anchorRef = useRef<HTMLDivElement | null>(null);\n const popupRef = useRef<HTMLDivElement | null>(null);\n\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: buildFloatingMiddleware(resolved),\n });\n\n const anchorForkRef = useForkRef(anchorRef, refs.setReference, ref);\n const popupForkRef = useForkRef(popupRef, refs.setFloating);\n\n useSafeLayoutEffect(() => {\n if (disabled) {\n return;\n }\n\n setViewValue(isValidDate(value) || isValidTimeDate(value) ? value : new Date());\n }, [value, disabled]);\n\n const onViewValueChange = useCallback((next: Date) => {\n setViewValue(next);\n }, []);\n\n const onMonthLabelClick = useCallback(() => {\n setOpenView(openView === OpenView.months ? OpenView.days : OpenView.months);\n }, [openView]);\n\n const onYearLabelClick = useCallback(() => {\n setOpenView(openView === OpenView.years ? OpenView.days : OpenView.years);\n }, [openView]);\n\n const onMonthChange = useCallback(\n (month: number) => {\n setViewValue(setMonth(viewValue, month));\n setOpenView(OpenView.days);\n },\n [viewValue]\n );\n\n const onYearChange = useCallback(\n (year: number) => {\n setViewValue(setYear(viewValue, year));\n setOpenView(OpenView.days);\n },\n [viewValue]\n );\n\n const emitChange = useCallback(\n (next: Date) => {\n setViewValue(next);\n onChangeProp?.(undefined, next, props);\n },\n [onChangeProp, props]\n );\n\n const onDateChange = useCallback(\n (_event?: React.ChangeEvent<HTMLInputElement>, date?: Date) => {\n if (!date) {\n return;\n }\n\n const timeSource = isValidTimeDate(value) ? value : viewValue;\n emitChange(mergeDate(date, timeSource));\n },\n [emitChange, value, viewValue]\n );\n\n const onTimeChange = useCallback(\n (timeDate: Date) => {\n const dateSource = isValidDate(value) ? value : viewValue;\n emitChange(mergeTime(dateSource, timeDate));\n },\n [emitChange, value, viewValue]\n );\n\n const onToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prevState) => !prevState);\n }\n }, [disabled]);\n\n const onClickAway = useCallback((event: Event | React.SyntheticEvent) => {\n const target = event.target as HTMLElement;\n\n if (popupRef.current?.contains(target) || anchorRef.current?.contains(target)) {\n return;\n }\n\n setIsOpen(false);\n }, []);\n\n const resolvedTimeFormat = useMemo(() => {\n if (timeFormat) {\n return timeFormat;\n }\n\n if (format?.includes(\"HH:mm:ss\")) {\n return \"HH:mm:ss\";\n }\n\n return DEFAULT_TIME_FORMAT;\n }, [format, timeFormat]);\n\n const months = useMemo(() => getMonths(locale), [locale]);\n const years = useMemo(() => getYears(new Date().getFullYear(), 100), []);\n\n let view: React.ReactNode = null;\n\n switch (openView) {\n case OpenView.days:\n view = (\n <DataPickerDays\n viewValue={viewValue}\n value={value}\n showDaysOutsideMonth={showDaysOutsideMonth}\n onChange={onDateChange}\n disablePast={disablePast}\n disableFuture={disableFuture}\n weekStartsOn={weekStartsOn}\n minDate={minDate}\n maxDate={maxDate}\n isDateDisabled={isDateDisabled}\n locale={locale}\n />\n );\n break;\n case OpenView.months:\n view = <DatePickerList value={viewValue.getMonth()} items={months} onChange={onMonthChange} />;\n break;\n case OpenView.years:\n view = <DatePickerList value={viewValue.getFullYear()} items={years} onChange={onYearChange} />;\n break;\n }\n\n return (\n <>\n <DateTimePickerInput\n ref={anchorForkRef}\n value={value}\n onChange={onChangeProp}\n onBlur={onBlurProp}\n onToggle={onToggle}\n disabled={disabled}\n disableCalendar={disableCalendar}\n format={format}\n calendarIcon={calendarIcon}\n {...rest}\n />\n {createPortal(\n <Transition\n nodeRef={popupRef}\n in={isOpen && !disabled && !disableCalendar}\n timeout={150}\n mountOnEnter\n unmountOnExit\n >\n {(state) => (\n <ClickAwayListener onClickAway={onClickAway}>\n <div\n ref={popupForkRef}\n className=\"smwb-date-picker smwb-date-time-picker\"\n style={{\n ...floatingStyles,\n ...defaultStyle(150),\n ...transitionStyles[state],\n }}\n data-testid=\"date-time-picker\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={calendarAriaLabel}\n >\n <div className=\"smwb-date-picker__inner smwb-date-time-picker__inner\">\n <DataPickerHeader\n viewValue={viewValue}\n locale={locale}\n openView={openView}\n onChange={onViewValueChange}\n onMonthLabelClick={onMonthLabelClick}\n onYearLabelClick={onYearLabelClick}\n />\n <div className=\"smwb-date-time-picker__content\">\n <div className=\"smwb-date-picker__body smwb-date-time-picker__body\">{view}</div>\n <TimePickerColumns value={viewValue} format={resolvedTimeFormat} onChange={onTimeChange} />\n </div>\n </div>\n </div>\n </ClickAwayListener>\n )}\n </Transition>,\n document.body\n )}\n </>\n );\n});\n\nexport default DateTimePicker;\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useRifm } from \"rifm\";\nimport {\n getTimeByFormat,\n getDisplayTime,\n getTimeMaskFormat,\n getCurrentTimeFormat,\n maskedTimeFormatter,\n isTimeMatch,\n} from \"./timeUtils\";\nimport { TimePickerProps } from \"./timePicker\";\n\nexport type UseTimeInputProps = Pick<TimePickerProps, \"value\" | \"onChange\" | \"onBlur\"> & {\n format?: string;\n};\n\ninterface UseTimeInputReturn {\n value: string;\n onChange: React.ChangeEventHandler;\n onBlur: React.ChangeEventHandler;\n placeholder: string;\n}\n\nconst defaultFormatTime = getCurrentTimeFormat();\n\nexport function useTimeInput({\n value: valueProp,\n onChange: onChangeProp,\n onBlur: onBlurProp,\n format,\n}: UseTimeInputProps): UseTimeInputReturn {\n const currentFormatTime = useMemo(() => getCurrentTimeFormat(format), [format]);\n const [displayedValue, setDisplayedValue] = useState(getDisplayTime(valueProp, format));\n const maskFormat = useMemo(() => getTimeMaskFormat(format), [format]);\n const formatter = useMemo(() => maskedTimeFormatter(maskFormat), [maskFormat]);\n const prevValue = useRef<UseTimeInputProps[\"value\"]>(undefined);\n\n React.useEffect(() => {\n const isValueChanged = valueProp !== prevValue.current;\n prevValue.current = valueProp;\n\n if (!isValueChanged) {\n return;\n }\n\n setDisplayedValue(getDisplayTime(valueProp, format));\n }, [valueProp, format]);\n\n const onChange = (value: string) => {\n setDisplayedValue(value);\n\n if (!onChangeProp) {\n return;\n }\n\n if (isTimeMatch(value, currentFormatTime)) {\n onChangeProp(undefined, getTimeByFormat(value, currentFormatTime));\n } else if (value === \"\") {\n onChangeProp(undefined);\n }\n };\n\n const onBlur = useCallback(() => {\n if (!onBlurProp) {\n return;\n }\n\n const prev = prevValue.current;\n\n if (prev instanceof Date && isTimeMatch(getDisplayTime(prev, format), currentFormatTime)) {\n onBlurProp(undefined, prev);\n } else if (typeof prev === \"string\" && isTimeMatch(prev, currentFormatTime)) {\n onBlurProp(undefined, getTimeByFormat(prev, currentFormatTime));\n } else if (prev === undefined || prev === \"\") {\n onBlurProp(undefined);\n }\n\n setDisplayedValue(getDisplayTime(valueProp, format));\n }, [onBlurProp, valueProp, format, currentFormatTime]);\n\n const rifmProps = useRifm({\n value: displayedValue,\n onChange,\n format: formatter,\n });\n\n return {\n ...rifmProps,\n onBlur,\n placeholder: (format ?? defaultFormatTime).toLowerCase(),\n };\n}\n","import React from \"react\";\nimport { TextField } from \"../textField\";\nimport { DatePickerIconButton } from \"../datePicker/datePickerIconButton\";\nimport { useTimeInput } from \"./useTimeInput\";\nimport { TimePickerProps } from \"./timePicker\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface TimePickerInputProps extends Omit<\n TimePickerProps,\n \"placement\" | \"disablePast\" | \"disableFuture\" | \"weekStartsOn\" | \"locale\" | \"showDaysOutsideMonth\"\n> {\n onToggle: () => void;\n}\n\nfunction stopPropagation(event: React.SyntheticEvent) {\n event.stopPropagation();\n}\n\nexport const TimePickerInput = React.forwardRef(function TimePickerInput(\n props: TimePickerInputProps,\n ref: React.Ref<HTMLInputElement>\n) {\n const { value, onChange, onBlur, onToggle, disabled, disableClock, clockIcon, format, ...rest } = props;\n const maskedProps = useTimeInput({ value, onChange, onBlur, format });\n\n return (\n <TextField\n ref={ref}\n {...maskedProps}\n type=\"tel\"\n endAdornment={\n !disableClock && (\n <DatePickerIconButton\n edge=\"end\"\n onClick={onToggle}\n onMouseDown={stopPropagation}\n disabled={Boolean(disabled)}\n data-testid=\"time-picker-icon-button\"\n >\n {clockIcon || <Icon name=\"schedule\" fill={1} weight={500} size={24} />}\n </DatePickerIconButton>\n )\n }\n disabled={Boolean(disabled)}\n {...rest}\n />\n );\n});\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { autoUpdate, useFloating } from \"@floating-ui/react\";\nimport Transition, { TransitionStatus } from \"react-transition-group/Transition\";\nimport { buildFloatingMiddleware, Placement, resolvePlacement } from \"../../../utils/floating\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { TextFieldProps } from \"../textField\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { TimePickerInput } from \"./timePickerInput\";\nimport { TimePickerColumns } from \"./timePickerColumns\";\nimport { isValidTimeDate } from \"./timeUtils\";\nimport { createPortal } from \"react-dom\";\n\nconst defaultStyle = (duration: number) => ({\n transition: `opacity ${duration}ms ease-in-out`,\n opacity: 0,\n});\n\nconst transitionStyles = {\n entering: { opacity: 1 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n} as Record<TransitionStatus, { opacity: number }>;\n\nexport interface TimePickerProps extends Omit<TextFieldProps, \"onBlur\" | \"onChange\" | \"value\" | \"defaultValue\"> {\n /** Time format pattern with tokens HH, mm, ss, e.g. \"HH:mm\" or \"HH:mm:ss\". */\n format?: string;\n placement?: Placement;\n disableClock?: boolean;\n label?: string;\n clockAriaLabel?: string;\n autoComplete?: string;\n value?: Date | string;\n clockIcon?: React.ReactNode;\n onChange?: (event?: React.ChangeEvent<HTMLInputElement>, value?: Date, data?: TimePickerProps) => void;\n onBlur?: (event?: React.FocusEvent<HTMLInputElement>, value?: Date, data?: TimePickerProps) => void;\n}\n\nexport const TimePicker = React.forwardRef(function TimePicker(props: TimePickerProps, ref) {\n const {\n value: valueProp,\n onChange: onChangeProp,\n placement = \"bottom-start\",\n disabled,\n disableClock,\n clockAriaLabel = \"Choose time\",\n format,\n onBlur: onBlurProp,\n ...rest\n } = props;\n const value = useMemo(() => (valueProp === undefined ? undefined : new Date(valueProp)), [valueProp]);\n const [viewValue, setViewValue] = useState<Date>(() => (isValidTimeDate(value) ? value : new Date()));\n const [isOpen, setIsOpen] = useState(false);\n\n const anchorRef = useRef<HTMLDivElement | null>(null);\n const clockRef = useRef<HTMLDivElement | null>(null);\n\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: buildFloatingMiddleware(resolved),\n });\n\n const anchorForkRef = useForkRef(anchorRef, refs.setReference, ref);\n const clockForkRef = useForkRef(clockRef, refs.setFloating);\n\n useSafeLayoutEffect(() => {\n if (disabled) {\n return;\n }\n\n setViewValue(isValidTimeDate(value) ? value : new Date());\n }, [value, disabled]);\n\n const onToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prevState) => !prevState);\n }\n }, [disabled]);\n\n const onClickAway = useCallback((event: Event | React.SyntheticEvent) => {\n const target = event.target as HTMLElement;\n\n if (clockRef.current?.contains(target) || anchorRef.current?.contains(target)) {\n return;\n }\n\n setIsOpen(false);\n }, []);\n\n const onTimeChange = useCallback(\n (next: Date) => {\n setViewValue(next);\n onChangeProp?.(undefined, next, props);\n },\n [onChangeProp, props]\n );\n\n const onComplete = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n return (\n <>\n <TimePickerInput\n ref={anchorForkRef}\n value={value}\n onChange={onChangeProp}\n onBlur={onBlurProp}\n onToggle={onToggle}\n disabled={disabled}\n disableClock={disableClock}\n format={format}\n {...rest}\n />\n {createPortal(\n <Transition\n nodeRef={clockRef}\n in={isOpen && !disabled && !disableClock}\n timeout={150}\n mountOnEnter\n unmountOnExit\n >\n {(state) => (\n <ClickAwayListener onClickAway={onClickAway}>\n <div\n ref={clockForkRef}\n className=\"smwb-date-picker smwb-time-picker\"\n style={{\n ...floatingStyles,\n ...defaultStyle(150),\n ...transitionStyles[state],\n }}\n data-testid=\"time-picker\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={clockAriaLabel}\n >\n <div className=\"smwb-date-picker__inner\">\n <TimePickerColumns\n value={viewValue}\n format={format}\n onChange={onTimeChange}\n onComplete={onComplete}\n />\n </div>\n </div>\n </ClickAwayListener>\n )}\n </Transition>,\n document.body\n )}\n </>\n );\n});\n\nexport default TimePicker;\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useId } from \"../../../hooks/useId\";\nimport type { SelectionControlColor, SelectionControlSize } from \"../checkbox/checkbox\";\n\nexport interface RadioButtonProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n label?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n checked?: boolean;\n size?: SelectionControlSize;\n color?: SelectionControlColor;\n helperText?: React.ReactNode;\n error?: boolean;\n /** Unified handler: `(event, value, data)` where `value` is the radio's value (or checked state). */\n onChange?: (\n event: React.ChangeEvent<HTMLInputElement>,\n value: string | number | readonly string[] | boolean | undefined,\n data: RadioButtonProps\n ) => void;\n}\n\nexport const RadioButton = React.forwardRef<HTMLInputElement, RadioButtonProps>(function RadioButton(props, ref) {\n const {\n label,\n disabled,\n readOnly,\n required,\n name,\n id: idProp,\n size = \"medium\",\n color = \"primary\",\n helperText,\n error,\n onChange,\n className,\n ...args\n } = props;\n const id = useId(idProp);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) {\n e.preventDefault();\n return;\n }\n onChange?.(e, props.value !== undefined ? props.value : e.target.checked, props);\n };\n\n return (\n <TextFieldWrapper helperText={helperText} disabled={disabled} error={error} className=\"smwb-text-field-checkbox\">\n <label\n htmlFor={id}\n className={cn(\"smwb-radio\", `smwb-radio_size-${size}`, `smwb-radio_color-${color}`, {\n \"smwb-disabled\": disabled,\n \"smwb-readonly\": readOnly,\n })}\n >\n <span className=\"smwb-radio__wrapper\">\n <input\n id={id}\n name={name}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n className={cn(\"smwb-radio__input\", className)}\n type=\"radio\"\n data-testid=\"radio\"\n ref={ref}\n {...args}\n onChange={handleChange}\n />\n <span className={cn(\"smwb-radio__btn\", { \"smwb-disabled\": disabled })} />\n <span className={cn(\"smwb-radio__bg\", { \"smwb-disabled\": disabled })} />\n </span>\n {label && <span className=\"smwb-radio__label\">{label}</span>}\n </label>\n </TextFieldWrapper>\n );\n});\n\nexport default RadioButton;\n","import { forwardRef, KeyboardEvent, MouseEvent, ReactNode, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type RatingColor = \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface RatingProps {\n className?: string;\n /** Controlled value. */\n value?: number;\n /** Uncontrolled initial value. */\n defaultValue?: number;\n /** Number of icons. */\n max?: number;\n /** Smallest selectable increment: 1 (whole) or 0.5 (half). */\n precision?: 1 | 0.5;\n readOnly?: boolean;\n disabled?: boolean;\n size?: number;\n /** Filled icon (Material Symbols name). */\n icon?: ReactNode;\n /** Empty icon (Material Symbols name). */\n emptyIcon?: ReactNode;\n name?: string;\n /** Color of the filled icons. */\n color?: RatingColor;\n /** Renders the control in an error state. */\n error?: boolean;\n /** Supporting text shown below the control. */\n helperText?: ReactNode;\n id?: string;\n onChange?: (value: number) => void;\n}\n\nexport const Rating = forwardRef<HTMLSpanElement, RatingProps>(function Rating(\n {\n className,\n value,\n defaultValue = 0,\n max = 5,\n precision = 1,\n readOnly = false,\n disabled = false,\n size = 28,\n icon,\n emptyIcon,\n name,\n color = \"primary\",\n error,\n helperText,\n id,\n onChange,\n },\n ref\n) {\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState(defaultValue);\n const [hover, setHover] = useState<number | null>(null);\n\n const current = value !== undefined ? value : internal;\n const display = hover ?? current;\n\n const interactive = !readOnly && !disabled;\n\n const valueFromEvent = (event: MouseEvent<HTMLSpanElement>, starIndex: number): number => {\n if (precision === 1) {\n return starIndex + 1;\n }\n const { left, width } = event.currentTarget.getBoundingClientRect();\n const isLeftHalf = event.clientX - left < width / 2;\n return starIndex + (isLeftHalf ? 0.5 : 1);\n };\n\n const handleSelect = (event: MouseEvent<HTMLSpanElement>, starIndex: number) => {\n if (!interactive) {\n return;\n }\n const next = valueFromEvent(event, starIndex);\n if (!isControlled) {\n setInternal(next);\n }\n onChange?.(next);\n };\n\n const filledIcon = icon ?? <Icon name=\"star\" fill={1} size={size} />;\n const blankIcon = emptyIcon ?? <Icon name=\"star\" size={size} />;\n\n const commit = (next: number) => {\n const clamped = Math.max(0, Math.min(max, next));\n if (!isControlled) {\n setInternal(clamped);\n }\n onChange?.(clamped);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (!interactive) {\n return;\n }\n if (event.key === \"ArrowRight\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n commit(current + precision);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n commit(current - precision);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n commit(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n commit(max);\n }\n };\n\n return (\n <span\n ref={ref}\n id={id}\n className={cn(\n \"smwb-rating\",\n { \"smwb-rating_readonly\": readOnly, \"smwb-rating_disabled\": disabled, \"smwb-rating_error\": error },\n color !== \"primary\" && `smwb-rating_color-${color}`,\n className\n )}\n data-testid=\"rating\"\n role=\"img\"\n aria-label={`${current} of ${max}`}\n tabIndex={interactive ? 0 : undefined}\n onKeyDown={interactive ? handleKeyDown : undefined}\n >\n {Array.from({ length: max }, (_, index) => {\n const fillRatio = Math.max(0, Math.min(1, display - index));\n return (\n <span\n key={index}\n className=\"smwb-rating__item\"\n style={{ width: size, height: size, cursor: interactive ? \"pointer\" : \"default\" }}\n onClick={(event) => handleSelect(event, index)}\n onMouseMove={\n interactive && precision === 0.5\n ? (event) => setHover(valueFromEvent(event, index))\n : interactive\n ? () => setHover(index + 1)\n : undefined\n }\n onMouseLeave={interactive ? () => setHover(null) : undefined}\n >\n <span className=\"smwb-rating__icon smwb-rating__icon_empty\">{blankIcon}</span>\n <span className=\"smwb-rating__icon smwb-rating__icon_filled\" style={{ width: `${fillRatio * 100}%` }}>\n {filledIcon}\n </span>\n </span>\n );\n })}\n {name ? <input type=\"hidden\" name={name} value={current} readOnly /> : null}\n {helperText != null && helperText !== false ? (\n <span className={cn(\"smwb-rating__helper\", error && \"smwb-rating__helper_error\")}>{helperText}</span>\n ) : null}\n </span>\n );\n});\n\nexport default Rating;\n","import React, { useEffect } from \"react\";\nimport { useVirtualList } from \"../../../hooks/useVirtualList\";\nimport { Menu, MenuDivider, MenuItem, MenuItemProps } from \"../../navigation/menu\";\nimport { TextField } from \"../textField\";\nimport ProgressIndicator from \"../../feedBack/progressIndicator/progressIndicator\";\nimport { createPortal } from \"react-dom\";\nimport { MenuFloatingProps } from \"../../navigation/menu/menuFloating\";\n\nexport interface DropdownItem {\n key?: string | number;\n text: string;\n value: string | number | undefined | null;\n helperText?: string;\n /** Disables selection of this option. */\n disabled?: boolean;\n /** Optional group label; consecutive items sharing it get a group header. */\n group?: string;\n}\n\nexport interface DropdownItemProps<T extends HTMLElement = HTMLElement> {\n menuMaxHeight?: number;\n menuMiddleware?: MenuFloatingProps[\"middleware\"];\n menuNoItemsMessage?: React.ReactNode;\n search?: boolean;\n onSearchInputChange?: (event: React.ChangeEvent<HTMLInputElement>, value: string | number | undefined) => void;\n items: DropdownItem[];\n searchValue?: string | number;\n isOpen: boolean;\n onClose: () => void;\n anchorElementRef: React.RefObject<T>;\n value?: undefined | null | string | number | (undefined | null | string | number)[];\n onItemClick: (event: React.SyntheticEvent, item: DropdownItem) => void;\n isLoading?: boolean;\n optionRenderer?: (args: MenuItemProps) => React.ReactNode;\n container?: HTMLElement;\n /** Renders a trailing \"create\" affordance (used by `creatable` SelectField). */\n createOption?: { text: React.ReactNode; onCreate: (event: React.SyntheticEvent) => void };\n /** Windows the option list for large datasets (fixed row height). */\n virtualized?: boolean;\n /** Row height (px) used when `virtualized`. */\n itemHeight?: number;\n}\n\nexport function DropdownMenu<T extends HTMLElement>({\n menuMaxHeight,\n menuMiddleware,\n search,\n onSearchInputChange,\n items,\n searchValue,\n isOpen,\n onClose,\n anchorElementRef,\n value,\n onItemClick,\n isLoading,\n optionRenderer,\n menuNoItemsMessage,\n container = document.body,\n createOption,\n virtualized,\n itemHeight = 40,\n}: DropdownItemProps<T>) {\n const valueArray = Array.isArray(value) ? value : [value];\n const hasGroups = items.some((i) => !!i.group);\n let lastGroup: string | undefined;\n\n const useVirtual = !!virtualized && !hasGroups && !isLoading && items.length > 0;\n const viewportHeight = menuMaxHeight || 240;\n const { startIndex, endIndex, totalHeight, offsetY, onScroll } = useVirtualList({\n itemCount: useVirtual ? items.length : 0,\n itemHeight,\n viewportHeight,\n });\n\n const renderItem = (el: DropdownItem) => {\n const node: React.ReactNode[] = [];\n if (hasGroups && el.group !== lastGroup) {\n lastGroup = el.group;\n node.push(\n <li key={`group-${el.group ?? \"ungrouped\"}`} className=\"smwb-select-field__group-label\" role=\"presentation\">\n {el.group}\n </li>\n );\n }\n node.push(\n <MenuItem\n key={el.key || el.value}\n value={el.value}\n disabled={el.disabled}\n selected={!!valueArray.find((v) => v === el.value)}\n onClick={(e: React.SyntheticEvent) => {\n if (!el.disabled) {\n onItemClick(e, el);\n }\n }}\n optionRenderer={optionRenderer}\n >\n {el.text}\n {el.helperText ? <span className=\"smwb-select-field__option__helper-text\">{el.helperText}</span> : null}\n </MenuItem>\n );\n return node;\n };\n const [menuMinWidth, setMenuMinWidth] = React.useState<number>();\n\n useEffect(() => {\n if (isOpen && anchorElementRef.current) {\n setMenuMinWidth(anchorElementRef.current.clientWidth);\n }\n }, [anchorElementRef, isOpen]);\n\n React.useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (isOpen && event.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOpen, onClose]);\n\n return createPortal(\n <Menu\n isOpen={isOpen}\n onClose={onClose}\n anchorElement={anchorElementRef.current}\n middleware={menuMiddleware}\n style={{\n minWidth: menuMinWidth,\n maxHeight: menuMaxHeight || undefined,\n overflowY: menuMaxHeight ? \"auto\" : undefined,\n }}\n >\n {search && (\n <>\n <li className=\"smwb-select-field__menu-search\">\n <TextField\n className=\"smwb-select-field__menu-search-input\"\n type=\"text\"\n placeholder=\"Найти...\"\n value={searchValue}\n onChange={(e, data) => onSearchInputChange?.(e, data.value)}\n fullWidth\n />\n </li>\n <MenuDivider />\n </>\n )}\n {isLoading ? (\n <div className=\"smwb-select-field__menu-loading\">\n <ProgressIndicator type=\"indeterminate\" variant=\"circular\" className=\"smwb-select-field__menu__loader\" />\n </div>\n ) : useVirtual ? (\n <li role=\"presentation\" className=\"smwb-select-field__virtual-viewport\">\n <div\n className=\"smwb-select-field__virtual-scroller\"\n style={{ maxHeight: viewportHeight, overflowY: \"auto\" }}\n onScroll={onScroll}\n >\n <div style={{ height: totalHeight, position: \"relative\" }}>\n <ul\n role=\"presentation\"\n className=\"smwb-select-field__virtual-list\"\n style={{ transform: `translateY(${offsetY}px)`, listStyle: \"none\", margin: 0, padding: 0 }}\n >\n {items.slice(startIndex, endIndex).map((el) => renderItem(el))}\n </ul>\n </div>\n </div>\n </li>\n ) : items.length ? (\n items.map((el) => renderItem(el))\n ) : !createOption ? (\n <li className=\"smwb-select-field__empty-items\">{menuNoItemsMessage || \"Опций не найдено.\"}</li>\n ) : null}\n {createOption ? (\n <MenuItem\n key=\"__create__\"\n value=\"__create__\"\n onClick={(e: React.SyntheticEvent) => createOption.onCreate(e)}\n className=\"smwb-select-field__create-option\"\n >\n {createOption.text}\n </MenuItem>\n ) : null}\n </Menu>,\n container\n );\n}\n","import type { HTMLAttributes, SyntheticEvent } from \"react\";\nimport React, { useState, useRef, useEffect, useMemo, forwardRef } from \"react\";\nimport cn from \"clsx\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { DropdownMenu, DropdownItem, DropdownItemProps } from \"./dropdownMenu\";\nimport Chip from \"../../dataDisplay/chip/chip\";\nimport { TextFieldWrapper } from \"../textField\";\nimport Icon from \"../../base/icon/icon\";\nimport { MenuItemProps } from \"../../navigation/menu\";\n\nconst SelectArrowIcon = (props: HTMLAttributes<HTMLSpanElement>) => <Icon name=\"arrow_drop_down\" {...props} />;\n\nconst ClearIcon = (props: HTMLAttributes<HTMLSpanElement>) => <Icon name=\"close\" size={20} {...props} />;\n\nfunction stopEvent(event: React.SyntheticEvent) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nexport type OnSelectChange = (e: SyntheticEvent, data: SelectFieldProps) => void;\n\nexport interface SelectFieldProps {\n className?: string;\n value?: null | string | number | (string | number | undefined | null)[];\n defaultValue?: null | string | number | (string | number)[];\n onChange?: OnSelectChange;\n disabled?: boolean;\n readOnly?: boolean;\n name?: string;\n multiple?: boolean;\n menuMaxHeight?: number;\n menuMiddleware?: DropdownItemProps[\"menuMiddleware\"];\n menuNoItemsMessage?: React.ReactNode;\n menuContainer?: HTMLElement;\n search?: true | false | \"menu\";\n chips?: boolean;\n isFocused?: boolean;\n error?: boolean;\n items: DropdownItem[];\n label?: string;\n variant?: \"outlined\" | \"filled\";\n fullWidth?: boolean;\n helperText?: React.ReactNode;\n onSearch?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n isLoading?: boolean;\n resetSearch?: () => void;\n inline?: boolean;\n endAdornment?: React.ReactNode;\n hideSelectArrowIcon?: boolean;\n optionRenderer?: (args: MenuItemProps) => React.ReactNode;\n /** Shows a clear button to reset the selection. */\n clearable?: boolean;\n /** Allows creating a new option from the current search text. */\n creatable?: boolean;\n /** Invoked with the typed text when the user creates a new option. */\n onCreate?: (inputValue: string, event: React.SyntheticEvent) => void;\n /** Windows long option lists for performance (fixed row height). */\n virtualized?: boolean;\n /** Row height (px) used when `virtualized`. */\n itemHeight?: number;\n /** Accessible label for the combobox control. */\n \"aria-label\"?: string;\n id?: string;\n}\n\nexport const SelectField = forwardRef<HTMLSpanElement, SelectFieldProps>(function SelectField(props, ref) {\n const {\n className,\n value: valueProp,\n defaultValue,\n onChange,\n disabled,\n readOnly,\n name,\n multiple,\n menuMaxHeight,\n menuMiddleware,\n menuNoItemsMessage,\n menuContainer,\n search,\n chips,\n isFocused: isFocusedProp,\n error,\n items,\n label,\n variant = \"outlined\",\n fullWidth,\n helperText,\n onSearch,\n resetSearch,\n isLoading,\n inline,\n endAdornment,\n hideSelectArrowIcon,\n optionRenderer,\n clearable,\n creatable,\n onCreate,\n virtualized,\n itemHeight,\n \"aria-label\": ariaLabel,\n id,\n ...rest\n } = props;\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [valueState, setValueState] = useState<typeof valueProp>(defaultValue);\n const [selectedItems, setSelectedItems] = useState<typeof items>(() => {\n // Seed from the effective initial value so an uncontrolled `defaultValue`\n // shows its selection (and floats the label) before any interaction.\n const initialValue = valueProp != null ? valueProp : defaultValue;\n\n if (Array.isArray(initialValue)) {\n return items.filter((item) => initialValue.includes(item.value));\n }\n\n const item = initialValue == null ? undefined : items.find((i) => i.value === initialValue);\n\n return item ? [item] : [];\n });\n const [searchValue, setSearchValue] = useState(\"\");\n const { current: isControlled } = useRef(valueProp != null);\n const anchorElementRef = useRef<HTMLSpanElement>(null);\n const forkedAnchorRef = useForkRef<HTMLSpanElement>(ref, anchorElementRef);\n const searchWrapperRef = useRef<HTMLSpanElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const value = isControlled ? valueProp : valueState;\n\n const isFocused = useMemo(() => isFocusedProp || isOpen, [isFocusedProp, isOpen]);\n\n const onMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n // Только для левой клавиши мышки.\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n anchorElementRef.current?.focus();\n setIsOpen(!isOpen);\n };\n\n const onClose = () => {\n setIsOpen(false);\n anchorElementRef.current?.focus();\n };\n\n const onFocus = () => {\n if (search === true) {\n searchInputRef.current?.focus();\n }\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!readOnly) {\n const validKeys = [\" \", \"ArrowUp\", \"ArrowDown\", \"Enter\"];\n\n if (validKeys.includes(event.key)) {\n event.preventDefault();\n setIsOpen(!isOpen);\n }\n }\n };\n\n useEffect(() => {\n if (!isFocused || (search === \"menu\" && !isOpen)) {\n setSearchValue(\"\");\n resetSearch?.();\n }\n }, [isFocused, search, isOpen, resetSearch]);\n\n // Keep the displayed selection in sync with the effective value (controlled\n // `value` or uncontrolled `defaultValue`/internal state), so the label floats\n // whenever there is a value — including the initial default, without focus.\n useEffect(() => {\n if (Array.isArray(value)) {\n setSelectedItems(items.filter((item) => value.includes(item.value)));\n } else if (value == null || value === \"\") {\n setSelectedItems([]);\n } else {\n const item = items.find((item) => item.value === value);\n setSelectedItems(item ? [item] : []);\n }\n }, [value, items]);\n\n useSafeLayoutEffect(() => {\n if (searchWrapperRef.current) {\n searchWrapperRef.current.scrollLeft = searchWrapperRef.current.scrollWidth;\n }\n }, [value]);\n\n const updateValue = (event: React.SyntheticEvent, value: typeof valueProp) => {\n onChange?.(event, { ...props, value, name: name || undefined });\n setValueState(value);\n };\n\n const onItemClick = (event: React.SyntheticEvent, item: DropdownItem) => {\n let newValue: typeof valueProp;\n let newSelectedItem: typeof selectedItems;\n if (multiple) {\n const valueArray = Array.isArray(value) ? value : [value].filter(Boolean);\n newValue = valueArray.slice();\n newSelectedItem = selectedItems.slice();\n const itemIndex = valueArray.findIndex((el) => el === item.value);\n\n if (itemIndex === -1) {\n newValue.push(item.value);\n newSelectedItem.push(item);\n } else {\n newValue.splice(itemIndex, 1);\n newSelectedItem.splice(itemIndex, 1);\n }\n } else {\n newValue = value === item.value ? \"\" : item.value;\n newSelectedItem = [item];\n }\n\n if (searchValue) {\n setSearchValue(\"\");\n }\n\n if (!multiple) {\n setIsOpen(false);\n anchorElementRef.current?.focus();\n }\n setSelectedItems(newSelectedItem);\n updateValue(event, newValue);\n };\n\n const onSearchInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSearchValue(event.target.value);\n onSearch?.(event);\n if (!isOpen) {\n setIsOpen(true);\n }\n };\n\n const onDeleteChip = (currentValue: typeof valueProp) => (event: React.SyntheticEvent) => {\n if (Array.isArray(value)) {\n const newValue = value.filter((value) => currentValue !== value);\n updateValue(event, newValue);\n const newSelectedItems = selectedItems.filter((el) => el.value !== currentValue);\n setSelectedItems(newSelectedItems);\n }\n };\n\n const onResetSelected = (event: React.MouseEvent) => {\n updateValue(event, []);\n setSelectedItems([]);\n };\n\n let displayValues: string | React.ReactNode[];\n\n const classes = cn(\"smwb-select-field\", className, {\n \"smwb-select-field--filled\": variant === \"filled\" && label,\n \"smwb-select-field--disabled\": disabled,\n \"smwb-select-field--search\": search,\n \"smwb-select-field--inline\": inline,\n });\n\n if (chips) {\n displayValues = selectedItems.map(({ key, value, text }) => (\n <Chip key={key || value} label={text} onDelete={onDeleteChip(value)} onDeleteMouseDown={stopEvent} />\n ));\n } else {\n displayValues = selectedItems.map((el) => el.text).join(\", \");\n }\n\n return (\n <>\n <TextFieldWrapper\n label={label}\n helperText={helperText}\n variant={variant}\n disabled={disabled}\n className={className}\n error={error}\n fullWidth={fullWidth}\n isFilledState={!!selectedItems.length || !!searchValue}\n isFocused={isFocused}\n inline={inline}\n {...rest}\n >\n <span\n ref={forkedAnchorRef}\n id={id}\n className={classes}\n tabIndex={disabled ? undefined : 0}\n role=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-disabled={disabled || undefined}\n aria-label={ariaLabel}\n onMouseDown={disabled || readOnly ? undefined : onMouseDown}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n data-testid=\"select-field\"\n >\n <span className=\"smwb-select-field__search-wrapper\" ref={searchWrapperRef}>\n {displayValues && <span className=\"smwb-select-field__values\">{displayValues}</span>}\n {search && typeof search === \"boolean\" && !readOnly && (\n <span className=\"smwb-select-field__search\">\n <span className=\"smwb-select-field__search-text\">{searchValue}</span>\n <input\n className=\"smwb-select-field__search-input\"\n ref={searchInputRef}\n type=\"text\"\n value={searchValue}\n onChange={onSearchInputChange}\n onMouseDown={(event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation();\n setIsOpen(true);\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n data-testid=\"search-input\"\n />\n </span>\n )}\n </span>\n <span className=\"smwb-select-field__actions\">\n {((Array.isArray(value) && value.length > 0) || (clearable && selectedItems.length > 0)) && !disabled && (\n <ClearIcon\n onClick={onResetSelected}\n onMouseDown={stopEvent}\n className={cn(\"smwb-select-field__icon\", \"smwb-select-field__icon--close\")}\n aria-label=\"Clear selection\"\n role=\"button\"\n />\n )}\n {endAdornment}\n {!hideSelectArrowIcon && (\n <SelectArrowIcon\n className={cn(\"smwb-select-field__icon\", \"smwb-select-field__icon--arrow\", {\n \"smwb-select-field__icon--opened\": isOpen,\n \"smwb-select-field__icon--focused\": isFocused,\n \"smwb-select-field__icon--error\": error,\n })}\n />\n )}\n </span>\n </span>\n </TextFieldWrapper>\n <DropdownMenu\n anchorElementRef={anchorElementRef}\n menuMaxHeight={menuMaxHeight}\n menuMiddleware={menuMiddleware}\n search={search === \"menu\"}\n onSearchInputChange={onSearchInputChange}\n optionRenderer={optionRenderer}\n items={\n onSearch\n ? items\n : searchValue\n ? items.filter((el) => el.text.search(new RegExp(searchValue, \"i\")) !== -1)\n : items\n }\n searchValue={searchValue}\n isOpen={isOpen}\n onClose={onClose}\n onItemClick={onItemClick}\n value={value}\n isLoading={isLoading}\n menuNoItemsMessage={menuNoItemsMessage}\n container={menuContainer}\n virtualized={virtualized}\n itemHeight={itemHeight}\n createOption={\n creatable && searchValue && !items.some((i) => i.text.toLowerCase() === String(searchValue).toLowerCase())\n ? {\n text: `Создать \"${searchValue}\"`,\n onCreate: (event: React.SyntheticEvent) => {\n onCreate?.(String(searchValue), event);\n setSearchValue(\"\");\n setIsOpen(false);\n },\n }\n : undefined\n }\n />\n </>\n );\n});\n\nexport default SelectField;\n","import React from \"react\";\n\nexport function toPercent(value: number, min: number, max: number) {\n return ((value - min) / (max - min)) * 100;\n}\n\nexport function precision(number: number) {\n return (`${number}`.split(\".\")[1] || \"\").length;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(value, max));\n}\n\nexport function precisionRound(number: number, precision = 1) {\n const factor = Math.pow(10, precision);\n\n return Math.round(number * factor) / factor;\n}\n\nexport function decimatedClamp(val: number, min: number, max: number, step?: number) {\n if (step == null || step <= 0) {\n return clamp(val, min, max);\n }\n\n const prec = precision(step);\n // Round value to nearest min + k1 * step\n const decimatedOffset = precisionRound(Math.round((val - min) / step) * step, prec);\n // Round range length _down_ to nearest min + k2 * step\n const decimatedRange = precisionRound(Math.floor((max - min) / step) * step, prec);\n\n return min + clamp(decimatedOffset, 0, decimatedRange);\n}\n\nexport function rescale(value: number, from: [number, number], to: [number, number], options: { step?: number } = {}) {\n const scaled = ((value - from[0]) / (from[1] - from[0])) * (to[1] - to[0]) + to[0];\n\n return decimatedClamp(scaled, to[0], to[1], options.step);\n}\n\nexport function coordX(event: React.MouseEvent | React.TouchEvent): number {\n if (event instanceof MouseEvent) {\n return event.clientX;\n }\n if (event instanceof TouchEvent) {\n return event.changedTouches[0].clientX;\n }\n return 0;\n}\n\nexport function coordY(event: React.MouseEvent | React.TouchEvent): number {\n if (event instanceof MouseEvent) {\n return event.clientY;\n }\n if (event instanceof TouchEvent) {\n return event.changedTouches[0].clientY;\n }\n return 0;\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useEventCallback } from \"../../../hooks/useEventCallback\";\nimport { rescale, toPercent, coordX, coordY } from \"./utils\";\nimport { TextField, TextFieldWrapper } from \"../textField\";\n\nexport type SliderValue = number | [number, number];\n\nexport interface SliderMark {\n value: number;\n label?: React.ReactNode;\n}\n\nexport interface SliderProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"onChange\" | \"defaultValue\"> {\n value?: SliderValue;\n onChange?: (event: Event | React.SyntheticEvent, value: SliderValue, data: SliderProps) => void;\n min?: number;\n max?: number;\n step?: number;\n name?: string;\n defaultValue?: SliderValue;\n disabled?: boolean;\n variant?: \"continuous\" | \"discrete\";\n valueField?: boolean;\n withTicks?: boolean;\n label?: string;\n helperText?: React.ReactNode;\n error?: boolean;\n size?: \"small\" | \"medium\" | \"large\";\n color?: \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n /** Enables a two-thumb range slider (value becomes `[number, number]`). */\n range?: boolean;\n /** Slider direction. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Show ticks/marks. `true` derives marks from `step`; an array gives explicit positions/labels. */\n marks?: boolean | SliderMark[];\n /** Accessible label applied to the slider control. */\n \"aria-label\"?: string;\n /** Maps the numeric value to a human-readable string for assistive tech. */\n getAriaValueText?: (value: number) => string;\n}\n\nfunction resolveMarks(\n marks: boolean | SliderMark[] | undefined,\n min: number,\n max: number,\n step?: number\n): SliderMark[] {\n if (!marks) {\n return [];\n }\n if (Array.isArray(marks)) {\n return marks;\n }\n const s = step && step > 0 ? step : (max - min) / 10;\n const result: SliderMark[] = [];\n for (let v = min; v <= max + 1e-9; v += s) {\n result.push({ value: Math.round(v * 1e6) / 1e6 });\n }\n return result;\n}\n\nconst RangeSlider = React.forwardRef<HTMLSpanElement, SliderProps>(function RangeSlider(props, ref) {\n const {\n defaultValue,\n value: valueProp,\n onChange,\n min = 0,\n max = 100,\n name,\n disabled = false,\n className,\n step,\n label,\n helperText,\n error,\n size = \"medium\",\n color = \"primary\",\n orientation = \"horizontal\",\n marks,\n getAriaValueText,\n \"aria-label\": ariaLabel,\n // consumed by the dispatcher / not valid DOM attributes — keep them off the span\n /* eslint-disable @typescript-eslint/no-unused-vars */\n range,\n variant,\n valueField,\n withTicks,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...rest\n } = props;\n\n const isVertical = orientation === \"vertical\";\n const normalize = (v: SliderValue | undefined): [number, number] => {\n const arr = Array.isArray(v) ? v : [min, max];\n const lo = Math.min(arr[0] ?? min, arr[1] ?? max);\n const hi = Math.max(arr[0] ?? min, arr[1] ?? max);\n return [lo, hi];\n };\n\n const isControlled = valueProp !== undefined;\n const [valueState, setValueState] = React.useState<[number, number]>(() => normalize(defaultValue));\n const value = isControlled ? normalize(valueProp) : valueState;\n\n const containerRef = React.useRef<HTMLSpanElement>(null);\n const rootRef = useForkRef<HTMLSpanElement>(ref, containerRef);\n const activeThumb = React.useRef<0 | 1>(0);\n const isPressedRef = React.useRef<boolean>(false);\n\n const markList = resolveMarks(marks, min, max, step);\n\n const positionToValue = (event: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) {\n return min;\n }\n if (isVertical) {\n const y =\n (typeof (event as MouseEvent).clientY === \"number\"\n ? (event as MouseEvent).clientY\n : coordY(event as React.MouseEvent)) - rect.top;\n return rescale(rect.height - y, [0, rect.height], [min, max], { step });\n }\n const x =\n (typeof (event as MouseEvent).clientX === \"number\"\n ? (event as MouseEvent).clientX\n : coordX(event as React.MouseEvent)) - rect.left;\n return rescale(x, [0, rect.width], [min, max], { step });\n };\n\n const commit = (next: [number, number], event: Event | React.SyntheticEvent) => {\n const lo = Math.min(next[0], next[1]);\n const hi = Math.max(next[0], next[1]);\n const clamped: [number, number] = [Math.max(min, lo), Math.min(max, hi)];\n if (!isControlled) {\n setValueState(clamped);\n }\n onChange?.(event, clamped, props);\n };\n\n const moveThumb = (raw: number, event: Event | React.SyntheticEvent) => {\n const idx = activeThumb.current;\n const next: [number, number] = [value[0], value[1]];\n next[idx] = Math.max(min, Math.min(max, raw));\n commit(next, event);\n };\n\n const pickThumb = (raw: number) => {\n activeThumb.current = Math.abs(raw - value[0]) <= Math.abs(raw - value[1]) ? 0 : 1;\n };\n\n const onMouseMove = useEventCallback((event: MouseEvent | TouchEvent) => {\n if (!isPressedRef.current) {\n return;\n }\n event.preventDefault();\n moveThumb(positionToValue(event), event);\n });\n\n const onMouseEnd = useEventCallback(() => {\n isPressedRef.current = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseEnd);\n document.removeEventListener(\"touchmove\", onMouseMove);\n document.removeEventListener(\"touchend\", onMouseEnd);\n });\n\n const onMouseDown = (event: React.MouseEvent<HTMLSpanElement>) => {\n if (disabled || event.button !== 0) {\n return;\n }\n const raw = positionToValue(event);\n pickThumb(raw);\n isPressedRef.current = true;\n moveThumb(raw, event);\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseEnd);\n };\n\n const onTouchStartNative = (event: TouchEvent) => {\n if (disabled) {\n return;\n }\n const raw = positionToValue(event);\n pickThumb(raw);\n isPressedRef.current = true;\n moveThumb(raw, event);\n document.addEventListener(\"touchmove\", onMouseMove);\n document.addEventListener(\"touchend\", onMouseEnd);\n };\n\n useSafeLayoutEffect(() => {\n const el = containerRef.current;\n if (!el) {\n return;\n }\n el.addEventListener(\"touchstart\", onTouchStartNative);\n return () => el.removeEventListener(\"touchstart\", onTouchStartNative);\n });\n\n const onThumbKeyDown = (idx: 0 | 1) => (event: React.KeyboardEvent) => {\n if (disabled) {\n return;\n }\n const delta = step && step > 0 ? step : 1;\n let next: number | null = null;\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowDown\") {\n next = value[idx] - delta;\n } else if (event.key === \"ArrowRight\" || event.key === \"ArrowUp\") {\n next = value[idx] + delta;\n } else if (event.key === \"Home\") {\n next = min;\n } else if (event.key === \"End\") {\n next = max;\n }\n if (next !== null) {\n event.preventDefault();\n activeThumb.current = idx;\n moveThumb(next, event);\n }\n };\n\n const classNames = cn(\n \"smwb-slider\",\n \"smwb-slider--range\",\n className,\n {\n \"smwb-slider--disabled\": disabled,\n \"smwb-slider--vertical\": isVertical,\n },\n size !== \"medium\" && `smwb-slider_size-${size}`,\n color !== \"primary\" && `smwb-slider_color-${color}`\n );\n\n const p0 = toPercent(value[0], min, max);\n const p1 = toPercent(value[1], min, max);\n const startPct = `${Math.min(p0, p1)}%`;\n const spanPct = `${Math.abs(p1 - p0)}%`;\n const mainStart = isVertical ? { bottom: `${p0}%` } : { left: `${p0}%` };\n const mainEnd = isVertical ? { bottom: `${p1}%` } : { left: `${p1}%` };\n const trackStyle = isVertical ? { bottom: startPct, height: spanPct } : { left: startPct, width: spanPct };\n\n return (\n <TextFieldWrapper label={label} helperText={helperText} disabled={disabled} error={error} fullWidth shrink>\n <div className=\"smwb-slider__container\">\n <span ref={rootRef} onMouseDown={onMouseDown} className={classNames} {...rest}>\n {markList.length > 0 && (\n <span className=\"smwb-slider__marks\" aria-hidden=\"true\">\n {markList.map((m) => {\n const mp = `${toPercent(m.value, min, max)}%`;\n return (\n <span key={m.value} className=\"smwb-slider__mark\" style={isVertical ? { bottom: mp } : { left: mp }}>\n {m.label != null && <span className=\"smwb-slider__mark-label\">{m.label}</span>}\n </span>\n );\n })}\n </span>\n )}\n <span className=\"smwb-slider__rail\" />\n <span className=\"smwb-slider__track\" style={trackStyle} />\n {([0, 1] as const).map((idx) => (\n <span\n key={idx}\n className={cn(\"smwb-slider__thumb\", `smwb-slider__thumb--${idx === 0 ? \"start\" : \"end\"}`)}\n style={idx === 0 ? mainStart : mainEnd}\n >\n <input\n data-testid={`slider-input-${idx}`}\n className=\"smwb-slider__input\"\n type=\"range\"\n min={min}\n max={max}\n step={step}\n name={name ? `${name}[${idx}]` : undefined}\n value={value[idx]}\n disabled={disabled}\n onChange={() => undefined}\n onKeyDown={onThumbKeyDown(idx)}\n tabIndex={disabled ? -1 : 0}\n aria-label={ariaLabel ? `${ariaLabel} ${idx === 0 ? \"minimum\" : \"maximum\"}` : undefined}\n aria-orientation={orientation}\n aria-valuenow={value[idx]}\n aria-valuemin={idx === 0 ? min : value[0]}\n aria-valuemax={idx === 0 ? value[1] : max}\n aria-valuetext={getAriaValueText ? getAriaValueText(value[idx]) : undefined}\n aria-disabled={disabled || undefined}\n />\n </span>\n ))}\n </span>\n </div>\n </TextFieldWrapper>\n );\n});\n\nconst SingleSlider = React.forwardRef<HTMLSpanElement, SliderProps>(function SingleSlider(props, ref) {\n const {\n defaultValue,\n value: valueProp,\n onChange,\n min = 0,\n max = 100,\n name,\n disabled = false,\n className,\n step,\n variant = \"continuous\",\n valueField,\n withTicks,\n label,\n helperText,\n error,\n size = \"medium\",\n color = \"primary\",\n orientation = \"horizontal\",\n marks,\n // `range` is handled by the Slider dispatcher; destructured here to keep it off the DOM\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n range,\n getAriaValueText,\n \"aria-label\": ariaLabel,\n ...rest\n } = props;\n\n const singleDefault = typeof defaultValue === \"number\" ? defaultValue : undefined;\n const singleValueProp = typeof valueProp === \"number\" ? valueProp : undefined;\n const isVertical = orientation === \"vertical\";\n\n const [valueState, setValue] = React.useState<number>(singleDefault ?? min);\n const [isDragging, setIsDragging] = React.useState<boolean>(false);\n const [isActive, setIsActive] = React.useState<boolean>(false);\n const [isFocused, setIsFocused] = React.useState<boolean>(false);\n\n const containerRef = React.useRef<HTMLSpanElement>(null);\n const rootRef = useForkRef<HTMLSpanElement>(ref, containerRef);\n const isPressedRef = React.useRef<boolean>(false);\n\n const isControlled = singleValueProp !== undefined;\n const isDiscrete = variant === \"discrete\";\n const value = isControlled ? singleValueProp : valueState;\n\n const updateValue = (value: number, event: Event | React.SyntheticEvent) => {\n if (value < min || value > max) return;\n if (!isControlled) {\n setValue(value);\n }\n onChange?.(event, value, props);\n };\n\n const offsetToValue = (absolute: number, containerSize: number) => {\n return rescale(absolute, [0, containerSize], [min, max], { step });\n };\n\n const onMouseDown = (event: React.MouseEvent<HTMLSpanElement>) => {\n if (disabled) {\n return;\n }\n\n if (event.button !== 0) {\n return;\n }\n\n isPressedRef.current = true;\n\n const element = containerRef.current;\n const rect = element?.getBoundingClientRect();\n\n if (rect) {\n const absolutePosition = isVertical ? rect.height - (event.clientY - rect.top) : event.clientX - rect.left;\n const newValue = offsetToValue(absolutePosition, isVertical ? rect.height : rect.width);\n\n if (!isActive) {\n setIsActive(true);\n }\n\n updateValue(newValue, event);\n }\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseEnd);\n };\n\n const onTouchStart = (event: TouchEvent) => {\n if (disabled) {\n return;\n }\n\n isPressedRef.current = true;\n\n const element = containerRef.current;\n const rect = element?.getBoundingClientRect();\n\n if (rect) {\n const touch = event.changedTouches?.[0];\n const absolutePosition = isVertical ? rect.height - (touch.clientY - rect.top) : touch.clientX - rect.left;\n const newValue = offsetToValue(absolutePosition, isVertical ? rect.height : rect.width);\n\n if (!isActive) {\n setIsActive(true);\n }\n updateValue(newValue, event);\n }\n\n document.addEventListener(\"touchmove\", onMouseMove);\n document.addEventListener(\"touchend\", onMouseEnd);\n };\n\n const onMouseMove = useEventCallback((event: MouseEvent | TouchEvent) => {\n if (isPressedRef.current) {\n const element = containerRef.current;\n const rect = element?.getBoundingClientRect();\n\n if (rect) {\n // TODO need clarification обработка разных событий разных типов 1 функцией\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const clientX = coordX(event);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const clientY = coordY(event);\n const absolutePosition = isVertical ? rect.height - (clientY - rect.top) : clientX - rect.left;\n const newValue = offsetToValue(absolutePosition, isVertical ? rect.height : rect.width);\n\n if (!isActive) {\n setIsActive(true);\n }\n\n if (value === newValue) {\n return;\n }\n\n if (!isDragging) {\n setIsDragging(true);\n }\n\n updateValue(newValue, event);\n }\n }\n });\n\n const onMouseEnd = useEventCallback(() => {\n isPressedRef.current = false;\n\n if (isDragging) {\n setIsDragging(false);\n }\n\n if (isActive) {\n setIsActive(false);\n }\n\n removeListeners();\n });\n\n const removeListeners = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseEnd);\n document.removeEventListener(\"touchmove\", onMouseMove);\n document.removeEventListener(\"touchend\", onMouseEnd);\n };\n\n const handleArrowsControls = (e: React.KeyboardEvent) => {\n if (!isFocused || disabled) return;\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n updateValue(value - (step || 1), e);\n }\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n updateValue(value + (step || 1), e);\n }\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n document.removeEventListener(\"keydown\", handleArrowsControls as (e: unknown) => void);\n };\n\n useSafeLayoutEffect(() => {\n if (containerRef.current) {\n containerRef.current.addEventListener(\"touchstart\", onTouchStart);\n\n return () => {\n containerRef.current?.removeEventListener(\"touchstart\", onTouchStart);\n };\n }\n });\n\n useSafeLayoutEffect(() => {\n if (disabled && containerRef.current?.contains(document.activeElement)) {\n (document.activeElement as HTMLElement)?.blur();\n }\n }, [disabled]);\n\n const classNames = cn(\n \"smwb-slider\",\n className,\n {\n \"smwb-slider--disabled\": disabled,\n \"smwb-slider--dragging\": isDragging,\n \"smwb-slider--discrete\": isDiscrete,\n \"smwb-slider--vertical\": isVertical,\n },\n size !== \"medium\" && `smwb-slider_size-${size}`,\n color !== \"primary\" && `smwb-slider_color-${color}`\n );\n\n const pct = `${toPercent(value, min, max)}%`;\n const trackStyle = isVertical ? { height: pct } : { width: pct };\n const thumbStyle = isVertical ? { bottom: pct } : { left: pct };\n\n const getTicks = () => Array(Math.round(max / (step || 1)) + 1).fill(1) as number[];\n const markList = resolveMarks(marks, min, max, step);\n\n return (\n <TextFieldWrapper label={label} helperText={helperText} disabled={disabled} error={error} fullWidth shrink>\n <div className=\"smwb-slider__container\">\n <span\n onKeyDown={handleArrowsControls}\n ref={rootRef}\n onMouseDown={onMouseDown}\n className={classNames}\n tabIndex={disabled ? -1 : 0}\n onFocus={() => setIsFocused(true)}\n onBlur={handleBlur}\n {...rest}\n >\n {withTicks && (\n <span className=\"smwb-slider__ticks\" style={{ gap: `${step}` }}>\n {getTicks().map((t, idx) => (\n <span className=\"smwb-slider__tick\" key={idx} />\n ))}\n </span>\n )}\n {markList.length > 0 && (\n <span className=\"smwb-slider__marks\" aria-hidden=\"true\">\n {markList.map((m) => {\n const mp = `${toPercent(m.value, min, max)}%`;\n return (\n <span key={m.value} className=\"smwb-slider__mark\" style={isVertical ? { bottom: mp } : { left: mp }}>\n {m.label != null && <span className=\"smwb-slider__mark-label\">{m.label}</span>}\n </span>\n );\n })}\n </span>\n )}\n <span className=\"smwb-slider__rail\" />\n <span className=\"smwb-slider__track\" style={trackStyle} />\n <span\n className={cn(\"smwb-slider__thumb\", {\n \"smwb-slider__thumb--active\": isActive,\n \"smwb-slider__thumb--discrete\": isDiscrete,\n })}\n style={thumbStyle}\n >\n {isDiscrete && <span className=\"smwb-slider__thumb-tooltip\">{Math.round(value)}</span>}\n <input\n data-testid=\"slider-input\"\n className=\"smwb-slider__input\"\n type=\"range\"\n min={min}\n max={max}\n name={name}\n value={value}\n readOnly\n aria-label={ariaLabel}\n aria-orientation={orientation}\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={getAriaValueText ? getAriaValueText(value) : undefined}\n aria-disabled={disabled || undefined}\n />\n </span>\n </span>\n {valueField && isDiscrete && (\n <TextField\n type=\"number\"\n value={value}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => updateValue(+e.target.value, e)}\n variant=\"filled\"\n helperText={null}\n />\n )}\n </div>\n </TextFieldWrapper>\n );\n});\n\nexport const Slider = React.forwardRef<HTMLSpanElement, SliderProps>(function Slider(props, ref) {\n const isRangeMode = props.range === true || Array.isArray(props.value) || Array.isArray(props.defaultValue);\n\n return isRangeMode ? <RangeSlider ref={ref} {...props} /> : <SingleSlider ref={ref} {...props} />;\n});\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useId } from \"../../../hooks/useId\";\nimport type { SelectionControlColor, SelectionControlSize } from \"../checkbox/checkbox\";\n\nexport interface ToggleProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n checked?: boolean;\n className?: string;\n id?: string;\n label?: string;\n labelPlacement?: \"top\" | \"left\" | \"right\";\n size?: SelectionControlSize;\n color?: SelectionControlColor;\n /** Unified handler: `(event, checked, data)`. */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>, checked: boolean, data: ToggleProps) => void;\n helperText?: React.ReactNode;\n error?: boolean;\n}\n\nexport const Toggle = React.forwardRef<HTMLInputElement, ToggleProps>(function Toggle(props, ref) {\n const {\n disabled,\n readOnly,\n required,\n checked,\n className,\n id: idProp,\n label,\n labelPlacement,\n size = \"medium\",\n color = \"primary\",\n helperText,\n error,\n ...args\n } = props;\n const id = useId(idProp);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) {\n e.preventDefault();\n return;\n }\n props.onChange?.(e, e.target.checked, props);\n };\n\n return (\n <TextFieldWrapper helperText={helperText} disabled={disabled} error={error} className=\"smwb-text-field-checkbox\">\n <span className={cn(\"smwb-toggle__wrapper\", labelPlacement && `smwb-toggle__wrapper_label-${labelPlacement}`)}>\n {label ? (\n <label htmlFor={id} className=\"smwb-toggle__label\">\n {label}\n </label>\n ) : null}\n <label\n className={cn(\"smwb-toggle\", `smwb-toggle_size-${size}`, `smwb-toggle_color-${color}`, className, {\n \"smwb-disabled\": disabled,\n \"smwb-readonly\": readOnly,\n })}\n >\n <input\n type=\"checkbox\"\n id={id}\n className=\"smwb-toggle__checkbox\"\n aria-checked={checked}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n role={\"switch\"}\n checked={checked}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n ref={ref}\n {...args}\n onChange={handleChange}\n />\n <span className=\"smwb-toggle__track\"></span>\n <span className=\"smwb-toggle__thumb\"></span>\n </label>\n </span>\n </TextFieldWrapper>\n );\n});\n\nexport default Toggle;\n","import React from \"react\";\nimport cn from \"clsx\";\n\nexport const Grid = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(function Grid(\n { className, ...rest },\n ref\n) {\n return <div ref={ref} data-testid=\"grid\" className={cn(\"smwb-grid\", className)} {...rest} />;\n});\n\nexport type ColumnSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n/** Column width per breakpoint: 1–12 grid units, `\"auto\"` (fit content) or `true` (fill remaining). */\nexport type BreakpointType = ColumnSpan | \"auto\" | true;\n/** Column offset (empty leading columns) per breakpoint: 0–11. */\nexport type OffsetType = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\nexport type Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type ResponsiveBool = boolean | Partial<Record<Breakpoint, boolean>>;\n\nexport const wrapOptions = [\"wrap\", \"nowrap\", \"wrap-reverse\"] as const;\nexport const justifyContentOptions = [\n \"flex-start\",\n \"center\",\n \"flex-end\",\n \"space-between\",\n \"space-around\",\n \"space-evenly\",\n] as const;\nexport const alignItemsOptions = [\"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\"] as const;\nexport const directionOptions = [\"row\", \"row-reverse\", \"column\", \"column-reverse\"] as const;\n\nexport interface RowProps extends React.HTMLAttributes<HTMLDivElement> {\n wrap?: (typeof wrapOptions)[number];\n justifyContent?: (typeof justifyContentOptions)[number];\n alignItems?: (typeof alignItemsOptions)[number];\n direction?: (typeof directionOptions)[number];\n spacing?: number;\n}\n\nexport const Row = React.forwardRef<HTMLDivElement, RowProps>(function Row(\n { className, justifyContent, alignItems, direction, wrap, spacing, ...rest },\n ref\n) {\n const isJustifyContent =\n justifyContent && justifyContentOptions.includes(justifyContent) && justifyContent !== \"flex-start\";\n const isAlignItems = alignItems && alignItemsOptions.includes(alignItems) && alignItems !== \"flex-start\";\n const isDirection = direction && directionOptions.includes(direction) && direction !== \"row\";\n const isFlexWrap = wrap && wrapOptions.includes(wrap) && wrap !== \"wrap\";\n\n const classes = cn(\"smwb-grid__row\", className, {\n [`smwb-grid__row--spacing-${spacing}`]: spacing,\n [`smwb-grid__row--justifyContent-${justifyContent}`]: isJustifyContent,\n [`smwb-grid__row--alignItems-${alignItems}`]: isAlignItems,\n [`smwb-grid__row--direction-${direction}`]: isDirection,\n [`smwb-grid__row--${wrap}`]: isFlexWrap,\n });\n\n return <div ref={ref} data-testid=\"grid-row\" className={classes} {...rest} />;\n});\n\nexport type ColumnProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Ширина на точке остановы: 1–12 из 12, `\"auto\"` (по контенту) или `true` (заполнить). */\n xs?: BreakpointType;\n sm?: BreakpointType;\n md?: BreakpointType;\n lg?: BreakpointType;\n xl?: BreakpointType;\n /** Сдвиг (пустые ведущие колонки) на точке остановы, 0–11. */\n xsOffset?: OffsetType;\n smOffset?: OffsetType;\n mdOffset?: OffsetType;\n lgOffset?: OffsetType;\n xlOffset?: OffsetType;\n /** Скрыть колонку: булево (всегда) или по точкам остановы `{ xs:true, md:false }`. */\n hidden?: ResponsiveBool;\n};\n\nconst hiddenClasses = (hidden?: ResponsiveBool) => {\n if (hidden === undefined) {\n return {};\n }\n if (typeof hidden === \"boolean\") {\n return { \"smwb-grid__column--hidden\": hidden };\n }\n return (Object.keys(hidden) as Breakpoint[]).reduce<Record<string, boolean>>((acc, bp) => {\n acc[`smwb-grid__column--hidden-${bp}`] = hidden[bp] === true;\n acc[`smwb-grid__column--visible-${bp}`] = hidden[bp] === false;\n return acc;\n }, {});\n};\n\nexport const Column = React.forwardRef<HTMLDivElement, ColumnProps>(function Column(\n { className, xs, sm, md, lg, xl, xsOffset, smOffset, mdOffset, lgOffset, xlOffset, hidden, ...rest },\n ref\n) {\n const classes = cn(\"smwb-grid__column\", className, {\n [`smwb-grid__column--xs-${xs}`]: xs,\n [`smwb-grid__column--sm-${sm}`]: sm,\n [`smwb-grid__column--md-${md}`]: md,\n [`smwb-grid__column--lg-${lg}`]: lg,\n [`smwb-grid__column--xl-${xl}`]: xl,\n [`smwb-grid__column--xs-offset-${xsOffset}`]: xsOffset,\n [`smwb-grid__column--sm-offset-${smOffset}`]: smOffset,\n [`smwb-grid__column--md-offset-${mdOffset}`]: mdOffset,\n [`smwb-grid__column--lg-offset-${lgOffset}`]: lgOffset,\n [`smwb-grid__column--xl-offset-${xlOffset}`]: xlOffset,\n ...hiddenClasses(hidden),\n });\n\n return <div ref={ref} className={classes} data-testid=\"grid-col\" {...rest} />;\n});\n\nexport type ContainerMaxWidth = \"sm\" | \"md\" | \"lg\" | \"xl\" | false;\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Max-width breakpoint cap; `false` = fluid full width. */\n maxWidth?: ContainerMaxWidth;\n /** Remove horizontal gutters. */\n disableGutters?: boolean;\n}\n\nexport const Container = React.forwardRef<HTMLDivElement, ContainerProps>(function Container(\n { className, maxWidth = \"lg\", disableGutters = false, ...rest },\n ref\n) {\n const classes = cn(\n \"smwb-container\",\n {\n [`smwb-container--${maxWidth}`]: maxWidth !== false,\n \"smwb-container--gutterless\": disableGutters,\n },\n className\n );\n return <div ref={ref} data-testid=\"grid-container\" className={classes} {...rest} />;\n});\n","import { CSSProperties, forwardRef, HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport type DividerColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface DividerProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** Direction of the divider line. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Inset behaviour of the line relative to its container. */\n variant?: \"fullWidth\" | \"inset\" | \"middle\";\n /** Horizontal alignment of the optional text content. */\n textAlign?: \"left\" | \"center\" | \"right\";\n /** Line color (semantic token). */\n color?: DividerColor;\n /** Line thickness (number = px, or any CSS length). */\n thickness?: number | string;\n /** Stretch to fill a flex container along the cross axis. */\n flexItem?: boolean;\n}\n\nconst colorVar: Record<DividerColor, string | undefined> = {\n default: undefined,\n primary: \"var(--smui-primaryColor)\",\n secondary: \"var(--smui-secondaryColor)\",\n error: \"var(--smui-errorColor)\",\n success: \"var(--smui-successColor)\",\n warning: \"var(--smui-warningColor)\",\n info: \"var(--smui-infoColor)\",\n};\n\nexport const Divider = forwardRef<HTMLDivElement, PropsWithChildren<DividerProps>>(function Divider(\n {\n className,\n orientation = \"horizontal\",\n variant = \"fullWidth\",\n textAlign = \"center\",\n color = \"default\",\n thickness,\n flexItem,\n style,\n children,\n ...props\n },\n ref\n) {\n const hasText = children !== undefined && children !== null && children !== false;\n const c = colorVar[color];\n const t = typeof thickness === \"number\" ? `${thickness}px` : thickness;\n\n const dividerStyle: CSSProperties = {\n ...style,\n ...(c ? { borderColor: c } : {}),\n ...(t ? (orientation === \"vertical\" ? { borderLeftWidth: t } : { borderBottomWidth: t }) : {}),\n };\n\n const dividerClassName = cn(\n \"smwb-divider\",\n `smwb-divider_${orientation}`,\n `smwb-divider_${variant}`,\n {\n \"smwb-divider_with-text\": hasText && orientation === \"horizontal\",\n [`smwb-divider_align-${textAlign}`]: hasText && orientation === \"horizontal\",\n \"smwb-divider_flex-item\": flexItem,\n },\n className\n );\n\n return (\n <div\n {...props}\n ref={ref}\n data-testid=\"divider\"\n role=\"separator\"\n aria-orientation={orientation}\n className={dividerClassName}\n style={dividerStyle}\n >\n {hasText && orientation === \"horizontal\" ? <span className=\"smwb-divider__text\">{children}</span> : null}\n </div>\n );\n});\n\nexport default Divider;\n","export interface ThrottledFunction<A extends unknown[]> {\n (...args: A): void;\n cancel(): void;\n}\n\nexport function throttle<A extends unknown[]>(fn: (...args: A) => void, wait: number): ThrottledFunction<A> {\n let lastCall = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: A | undefined;\n\n const invoke = (time: number, args: A): void => {\n lastCall = time;\n fn(...args);\n };\n\n const throttled = (...args: A): void => {\n const now = Date.now();\n const remaining = wait - (now - lastCall);\n lastArgs = args;\n\n if (remaining <= 0 || remaining > wait) {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n invoke(now, args);\n } else if (timer === undefined) {\n timer = setTimeout(() => {\n timer = undefined;\n if (lastArgs !== undefined) {\n invoke(Date.now(), lastArgs);\n }\n }, remaining);\n }\n };\n\n throttled.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n lastCall = 0;\n lastArgs = undefined;\n };\n\n return throttled;\n}\n","import React, {\n Children,\n forwardRef,\n KeyboardEvent,\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport cn from \"clsx\";\nimport { throttle } from \"../../../utils/throttle\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport interface ScreenDividerProps {\n sizeFirst?: number;\n sizeSecond?: number;\n className?: string;\n orientation?: \"horizontal\" | \"vertical\";\n /** Called with the first pane size (percent) whenever it changes. */\n onSizeChange?: (sizeFirst: number) => void;\n /** Step (in percent) applied on arrow-key resize. */\n keyboardStep?: number;\n /** Accessible label for the resizer handle. */\n resizerAriaLabel?: string;\n}\n\nconst getInitialDivider = (sizeFirst?: number | null, sizeSecond?: number | null) => {\n if (!sizeFirst && sizeSecond) {\n return 100 - sizeSecond;\n }\n if (sizeFirst) {\n return sizeFirst;\n }\n return 50;\n};\n\nexport const ScreenDivider = forwardRef<HTMLDivElement, PropsWithChildren<ScreenDividerProps>>(function ScreenDivider(\n {\n className,\n orientation = \"horizontal\",\n sizeFirst,\n sizeSecond,\n children,\n onSizeChange,\n keyboardStep = 5,\n resizerAriaLabel = \"Resize panels\",\n },\n ref\n) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const forkedWrapperRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n const [divider, setDivider] = useState<number>(getInitialDivider(sizeFirst, sizeSecond));\n const [currentElement, setCurrentElement] = useState<HTMLDivElement | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n useEffect(() => {\n setDivider(getInitialDivider(sizeFirst, sizeSecond));\n }, [sizeFirst, sizeSecond]);\n\n const child = Children.toArray(children);\n if (child.length > 2) {\n throw new Error(\"Allowed not more than 2 children\");\n }\n\n const handleDragStart = () => {\n setCurrentElement(wrapperRef.current);\n setIsDragging(true);\n };\n\n const dragOverHandler = useMemo(\n () =>\n throttle((e: PointerEvent) => {\n if (!isDragging) return;\n const wrapper = wrapperRef.current;\n if (!wrapper || wrapper !== currentElement) return;\n // Viewport-relative rect — using offsetLeft/offsetTop here is wrong\n // because they are relative to the nearest positioned ancestor, not\n // the viewport that clientX/clientY live in (this is what made the\n // divider drift away from the cursor when the wrapper was nested).\n const rect = wrapper.getBoundingClientRect();\n const total = orientation === \"vertical\" ? rect.height : rect.width;\n const cursor = orientation === \"vertical\" ? e.clientY - rect.top : e.clientX - rect.left;\n // 5px margin on each side so neither pane fully collapses.\n const clamped = Math.max(5, Math.min(total - 5, cursor));\n setDivider((clamped / total) * 100);\n }, 1000 / 60),\n [isDragging, currentElement, orientation]\n );\n\n const handleDragEnd = useCallback(() => {\n setCurrentElement(null);\n setIsDragging(false);\n document.body.removeEventListener(\"pointerup\", handleDragEnd);\n document.body.removeEventListener(\"pointermove\", dragOverHandler);\n }, [dragOverHandler]);\n\n useEffect(() => {\n onSizeChange?.(divider);\n }, [divider, onSizeChange]);\n\n const onResizerKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n const decreaseKey = orientation === \"vertical\" ? \"ArrowUp\" : \"ArrowLeft\";\n const increaseKey = orientation === \"vertical\" ? \"ArrowDown\" : \"ArrowRight\";\n\n if (event.key === decreaseKey) {\n event.preventDefault();\n setDivider((prev) => Math.max(0, prev - keyboardStep));\n } else if (event.key === increaseKey) {\n event.preventDefault();\n setDivider((prev) => Math.min(100, prev + keyboardStep));\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setDivider(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setDivider(100);\n }\n };\n\n const secondChildStyle =\n orientation === \"vertical\" ? { height: `${100 - divider}%` } : { width: `${100 - divider}%` };\n\n const firstChildStyle = orientation === \"vertical\" ? { height: `${divider}%` } : { width: `${divider}%` };\n\n useEffect(() => {\n if (isDragging) {\n document.body.addEventListener(\"pointerup\", handleDragEnd);\n document.body.addEventListener(\"pointermove\", dragOverHandler);\n document.body.style.cursor = orientation === \"horizontal\" ? \"e-resize\" : \"n-resize\";\n } else {\n document.body.style.cursor = \"default\";\n }\n\n return () => {\n document.body.removeEventListener(\"pointerup\", handleDragEnd);\n document.body.removeEventListener(\"pointermove\", dragOverHandler);\n };\n }, [dragOverHandler, handleDragEnd, isDragging, orientation]);\n\n return (\n <div\n className={cn(\"smwb-screen-divider__wrapper\", `smwb-${orientation}`, className)}\n ref={forkedWrapperRef}\n data-testid=\"screen-divider\"\n >\n <div className={cn(\"smwb-screen-divider__first\", `smwb-${orientation}`)} style={firstChildStyle}>\n {child[0] || \"\"}\n </div>\n <span\n className=\"smwb-screen-divider__resizer\"\n onPointerDown={handleDragStart}\n draggable={false}\n role=\"separator\"\n aria-orientation={orientation === \"vertical\" ? \"horizontal\" : \"vertical\"}\n aria-valuenow={Math.round(divider)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={resizerAriaLabel}\n tabIndex={0}\n onKeyDown={onResizerKeyDown}\n />\n <div className={cn(\"smwb-screen-divider__second\", `smwb-${orientation}`)} style={secondChildStyle}>\n {child[1] || \"\"}\n </div>\n </div>\n );\n});\n\nexport default ScreenDivider;\n","import React, { CSSProperties, forwardRef, PropsWithChildren, useCallback, useEffect, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { CSSTransition } from \"react-transition-group\";\nimport { createPortal } from \"react-dom\";\nimport Button from \"../../inputs/button/button\";\nimport Icon from \"../../base/icon/icon\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport interface SheetProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n placement?: \"top\" | \"bottom\" | \"right\" | \"left\";\n isOpen: boolean;\n onClose?: () => void;\n variant?: \"default\" | \"modal\";\n withSizeToggle?: boolean;\n /** Hide built-in header actions; onClose still handles Esc and backdrop. */\n hideHeaderActions?: boolean;\n reverseHeaderActions?: boolean;\n size?: string;\n disableOutsideClick?: boolean;\n /** Close the sheet when Escape is pressed. */\n closeOnEsc?: boolean;\n /**\n * Allow the user to resize the sheet by dragging a grab handle with\n * touch or mouse (mobile bottom-sheet style). Off by default.\n */\n resizable?: boolean;\n /** Minimum size in px while resizing (default 80). */\n minSize?: number;\n /** Maximum size in px while resizing (default: viewport dimension). */\n maxSize?: number;\n /** Step in px for keyboard resizing (default 24). */\n resizeStep?: number;\n /** Accessible label for the resize handle. */\n resizeHandleAriaLabel?: string;\n /** Called with the new size in px while/after resizing. */\n onResize?: (size: number) => void;\n \"aria-label\"?: string;\n}\n\ntype Mode = \"small\" | \"expanded\" | null;\n\nexport const Sheet = forwardRef<HTMLDivElement, PropsWithChildren<SheetProps>>(function Sheet(\n {\n isOpen,\n onClose,\n variant = \"default\",\n children,\n placement = \"bottom\",\n disableOutsideClick,\n closeOnEsc = true,\n ...props\n },\n ref\n) {\n const [mode, setMode] = useState<Mode>(null);\n const nodeRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen || !closeOnEsc || !onClose) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [isOpen, closeOnEsc, onClose]);\n\n const handleSizeButton = () => {\n if (mode === \"expanded\") {\n setMode(\"small\");\n } else if (!mode) {\n setMode(\"expanded\");\n } else {\n setMode(null);\n }\n };\n\n const handleClose = () => {\n onClose?.();\n setMode(null);\n };\n\n return createPortal(\n <CSSTransition\n in={isOpen}\n timeout={70}\n mountOnEnter\n unmountOnExit\n classNames={{ enterDone: \"smwb-entered\" }}\n appear\n nodeRef={nodeRef}\n >\n {variant === \"default\" ? (\n <div className={cn(disableOutsideClick ? \"smwb-sheet__overlay\" : \"smwb-sheet__default\")} ref={nodeRef}>\n <SheetBlock\n ref={ref}\n onClose={onClose}\n handleSizeButton={handleSizeButton}\n handleClose={handleClose}\n isOpen={isOpen}\n mode={mode}\n placement={placement}\n variant={variant}\n {...props}\n >\n {children}\n </SheetBlock>\n </div>\n ) : (\n <div\n className={cn(\"smwb-sheet__overlay\", \"smwb-dark\", `smwb-${placement}`, `smwb-sheet_${variant}`)}\n ref={nodeRef}\n >\n <ClickAwayListener onClickAway={() => !disableOutsideClick && handleClose()}>\n <SheetBlock\n ref={ref}\n onClose={onClose}\n handleSizeButton={handleSizeButton}\n handleClose={handleClose}\n isOpen={isOpen}\n mode={mode}\n placement={placement}\n variant={variant}\n {...props}\n >\n {children}\n </SheetBlock>\n </ClickAwayListener>\n </div>\n )}\n </CSSTransition>,\n document.body\n );\n});\n\nexport default Sheet;\n\ninterface SheetBlockProps extends SheetProps {\n mode: Mode;\n handleSizeButton: () => void;\n handleClose: () => void;\n}\n\n/** Sheets anchored to a horizontal edge resize on the Y axis, vertical edges on X. */\nconst isVerticalAxis = (placement: SheetProps[\"placement\"]) => placement === \"bottom\" || placement === \"top\";\n\nconst SheetBlock = React.forwardRef(function SheetBlock(props: SheetBlockProps, ref: React.Ref<HTMLDivElement>) {\n const {\n isOpen,\n placement,\n className,\n mode,\n\n size = \"60%\",\n variant,\n onClose,\n withSizeToggle = true,\n hideHeaderActions = false,\n reverseHeaderActions = false,\n resizable = false,\n minSize = 80,\n maxSize,\n resizeStep = 24,\n resizeHandleAriaLabel = \"Resize sheet\",\n onResize,\n style,\n handleClose,\n handleSizeButton,\n children,\n ...rest\n } = props;\n const showActions = !hideHeaderActions && (!!onClose || withSizeToggle);\n const headerActionNodes: React.ReactNode[] = [];\n if (withSizeToggle) {\n headerActionNodes.push(\n <Button variant={\"outlined\"} size=\"small\" onClick={handleSizeButton} key=\"size\">\n <Icon name=\"open_in_full\" />\n </Button>\n );\n }\n if (onClose) {\n headerActionNodes.push(\n <Button variant={\"outlined\"} size=\"small\" onClick={handleClose} key=\"close\">\n <Icon name=\"close\" />\n </Button>\n );\n }\n if (reverseHeaderActions) {\n headerActionNodes.reverse();\n }\n const nodeRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const forkRef = useForkRef(ref, nodeRef, rootRef);\n\n // Drag-to-resize state. `dragSize` (px) wins over the CSS size when set\n // (inline style beats the .smwb-expanded/.smwb-small rules).\n const [dragSize, setDragSize] = useState<number | null>(null);\n const vertical = isVerticalAxis(placement);\n\n const clamp = useCallback(\n (px: number) => {\n const viewport = vertical ? window.innerHeight : window.innerWidth;\n const max = maxSize ?? viewport;\n return Math.max(minSize, Math.min(max, px));\n },\n [vertical, maxSize, minSize]\n );\n\n const currentSizePx = useCallback(() => {\n const rect = rootRef.current?.getBoundingClientRect();\n if (!rect) {\n return minSize;\n }\n return vertical ? rect.height : rect.width;\n }, [vertical, minSize]);\n\n const applySize = useCallback(\n (px: number) => {\n const next = clamp(px);\n setDragSize(next);\n onResize?.(next);\n },\n [clamp, onResize]\n );\n\n const dragRef = useRef<{ start: number; size: number } | null>(null);\n\n const onPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n event.preventDefault();\n dragRef.current = {\n start: vertical ? event.clientY : event.clientX,\n size: currentSizePx(),\n };\n try {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n } catch {\n /* pointer capture is best-effort (unsupported in some envs) */\n }\n },\n [vertical, currentSizePx]\n );\n\n const onPointerMove = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (!drag) {\n return;\n }\n const pos = vertical ? event.clientY : event.clientX;\n const delta = pos - drag.start;\n // Sign so dragging *away* from the anchored edge grows the sheet.\n const grow = placement === \"bottom\" || placement === \"right\" ? -delta : delta;\n applySize(drag.size + grow);\n },\n [vertical, placement, applySize]\n );\n\n const endDrag = useCallback((event: React.PointerEvent<HTMLDivElement>) => {\n dragRef.current = null;\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n }, []);\n\n const onHandleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const base = dragSize ?? currentSizePx();\n const max = maxSize ?? (vertical ? window.innerHeight : window.innerWidth);\n // Key that should make the sheet *bigger*, per anchored edge.\n const incKey =\n placement === \"bottom\"\n ? \"ArrowUp\"\n : placement === \"top\"\n ? \"ArrowDown\"\n : placement === \"left\"\n ? \"ArrowRight\"\n : \"ArrowLeft\";\n const decKey =\n placement === \"bottom\"\n ? \"ArrowDown\"\n : placement === \"top\"\n ? \"ArrowUp\"\n : placement === \"left\"\n ? \"ArrowLeft\"\n : \"ArrowRight\";\n if (event.key === incKey) {\n event.preventDefault();\n applySize(base + resizeStep);\n } else if (event.key === decKey) {\n event.preventDefault();\n applySize(base - resizeStep);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n applySize(minSize);\n } else if (event.key === \"End\") {\n event.preventDefault();\n applySize(max);\n }\n },\n [dragSize, currentSizePx, vertical, placement, applySize, resizeStep, minSize, maxSize]\n );\n\n React.useEffect(() => {\n if (!isOpen) {\n setDragSize(null);\n return;\n }\n\n rootRef.current?.focus();\n }, [isOpen]);\n\n // While a drag size is applied, suppress the sheet's 0.2s size\n // transition so the panel tracks the pointer in real time instead\n // of lagging 200ms behind every move.\n const sizeStyle: CSSProperties =\n resizable && dragSize !== null\n ? { ...(vertical ? { height: dragSize } : { width: dragSize }), transition: \"none\" }\n : {};\n\n return (\n <CSSTransition in={isOpen} timeout={120} appear classNames={{ enterDone: \"smwb-sheet_entered\" }} nodeRef={nodeRef}>\n <div\n ref={forkRef}\n data-testid=\"sheet\"\n tabIndex={-1}\n role=\"dialog\"\n aria-modal={variant === \"modal\" || undefined}\n {...rest}\n className={cn(\"smwb-sheet\", className, `smwb-sheet_${variant}`, `smwb-${placement}`, {\n \"smwb-expanded\": mode === \"expanded\",\n \"smwb-small\": mode === \"small\",\n \"smwb-sheet_resizable\": resizable,\n })}\n style={{ \"--sizeProp\": size, ...sizeStyle, ...style } as CSSProperties}\n >\n {resizable && (\n <div\n className=\"smwb-sheet__drag-handle\"\n data-testid=\"sheet-drag-handle\"\n role=\"separator\"\n tabIndex={0}\n aria-orientation={vertical ? \"horizontal\" : \"vertical\"}\n aria-label={resizeHandleAriaLabel}\n aria-valuemin={minSize}\n aria-valuemax={Math.round(maxSize ?? (vertical ? window.innerHeight : window.innerWidth))}\n aria-valuenow={Math.round(dragSize ?? currentSizePx())}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onHandleKeyDown}\n >\n <span className=\"smwb-sheet__drag-handle-bar\" />\n </div>\n )}\n {showActions && <div className=\"smwb-sheet__header\">{headerActionNodes}</div>}\n {isOpen && mode !== \"small\" && <div className=\"smwb-sheet__inner\">{children}</div>}\n </div>\n </CSSTransition>\n );\n});\n","import React, { Children, Fragment, HTMLAttributes, PropsWithChildren, ReactNode, isValidElement } from \"react\";\nimport cn from \"clsx\";\n\nexport type StackSpacing = number | \"none\" | \"xxs\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | \"xxxl\";\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n direction?: \"row\" | \"row-reverse\" | \"column\" | \"column-reverse\";\n /** Gap between items: scale keyword, or a number = N × spacing unit. */\n spacing?: StackSpacing;\n align?: \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\n justify?: \"start\" | \"center\" | \"end\" | \"space-between\" | \"space-around\" | \"space-evenly\";\n wrap?: boolean;\n /** Optional element rendered between each child. */\n divider?: ReactNode;\n className?: string;\n}\n\nconst flexAlign = (v?: string): string | undefined => (v === \"start\" || v === \"end\" ? `flex-${v}` : v);\n\nconst resolveGap = (s: StackSpacing): string =>\n typeof s === \"number\" ? `calc(var(--smui-spacing-unit, 4px) * ${s})` : s === \"none\" ? \"0\" : `var(--smui-space-${s})`;\n\nexport const Stack = React.forwardRef<HTMLDivElement, PropsWithChildren<StackProps>>(function Stack(\n { direction = \"column\", spacing = \"md\", align, justify, wrap, divider, className, style, children, ...rest },\n ref\n) {\n const items = Children.toArray(children).filter(isValidElement);\n return (\n <div\n ref={ref}\n data-testid=\"stack\"\n className={cn(\"smwb-stack\", className)}\n style={{\n display: \"flex\",\n flexDirection: direction,\n flexWrap: wrap ? \"wrap\" : undefined,\n alignItems: flexAlign(align),\n justifyContent: flexAlign(justify),\n gap: resolveGap(spacing),\n ...style,\n }}\n {...rest}\n >\n {divider\n ? items.map((child, i) => (\n <Fragment key={i}>\n {i > 0 ? <div className=\"smwb-stack__divider\">{divider}</div> : null}\n {child}\n </Fragment>\n ))\n : children}\n </div>\n );\n});\n\nexport default Stack;\n","import React, { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport type PageMaxWidth = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface PageProps extends HTMLAttributes<HTMLElement> {\n /** Content max-width cap; `full` = fluid. */\n maxWidth?: PageMaxWidth;\n /** Remove the page padding. */\n disableGutters?: boolean;\n /** Render as a different element (default `main`). */\n component?: keyof JSX.IntrinsicElements;\n className?: string;\n}\n\nexport const Page = React.forwardRef<HTMLElement, PropsWithChildren<PageProps>>(function Page(\n { maxWidth = \"lg\", disableGutters = false, component, className, children, ...rest },\n ref\n) {\n const Tag = (component ?? \"main\") as \"main\";\n return (\n <Tag\n ref={ref}\n data-testid=\"page\"\n className={cn(\"smwb-page\", `smwb-page_max-${maxWidth}`, { \"smwb-page_gutterless\": disableGutters }, className)}\n {...rest}\n >\n <div className=\"smwb-page__inner\">{children}</div>\n </Tag>\n );\n});\n\nexport default Page;\n","import React, { HTMLAttributes, ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Typography from \"../../dataDisplay/typography/typography\";\n\nexport interface PageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title: ReactNode;\n subtitle?: ReactNode;\n /** Slot above the title (e.g. <Breadcrumbs />). */\n breadcrumbs?: ReactNode;\n /** Slot on the trailing side (e.g. action buttons). */\n actions?: ReactNode;\n /** Render a divider below the header. */\n divider?: boolean;\n className?: string;\n}\n\nexport const PageHeader = React.forwardRef<HTMLElement, PageHeaderProps>(function PageHeader(\n { title, subtitle, breadcrumbs, actions, divider = false, className, ...rest },\n ref\n) {\n return (\n <header\n ref={ref}\n data-testid=\"page-header\"\n className={cn(\"smwb-page-header\", { \"smwb-page-header_divider\": divider }, className)}\n {...rest}\n >\n {breadcrumbs ? <div className=\"smwb-page-header__breadcrumbs\">{breadcrumbs}</div> : null}\n <div className=\"smwb-page-header__row\">\n <div className=\"smwb-page-header__titles\">\n {typeof title === \"string\" ? (\n <Typography variant=\"h4\" component=\"h1\" className=\"smwb-page-header__title\">\n {title}\n </Typography>\n ) : (\n <div className=\"smwb-page-header__title\">{title}</div>\n )}\n {subtitle ? (\n <Typography variant=\"body2\" color=\"textSecondary\" className=\"smwb-page-header__subtitle\">\n {subtitle}\n </Typography>\n ) : null}\n </div>\n {actions ? <div className=\"smwb-page-header__actions\">{actions}</div> : null}\n </div>\n </header>\n );\n});\n\nexport default PageHeader;\n","import React, { CSSProperties, HTMLAttributes, PropsWithChildren, ReactNode, useId } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\n\nexport interface AppLayoutProps extends HTMLAttributes<HTMLDivElement> {\n /** Top bar slot (e.g. <AppBar />). Spans full width. */\n header?: ReactNode;\n /** Side navigation slot (e.g. <Sidebar />). */\n sidebar?: ReactNode;\n /** Footer slot, below the content. */\n footer?: ReactNode;\n /** Sidebar width (px or any CSS length). */\n sidebarWidth?: number | string;\n /** Controlled collapsed state of the sidebar rail. */\n sidebarCollapsed?: boolean;\n /** Initial collapsed state (uncontrolled). */\n defaultSidebarCollapsed?: boolean;\n /** Called whenever the collapsed state changes. */\n onSidebarCollapsedChange?: (collapsed: boolean) => void;\n /** Renders a built-in toggle button to collapse/expand the sidebar. */\n collapsible?: boolean;\n /** Custom toggle node replacing the default icon button. */\n collapseToggle?: ReactNode;\n /** Accessible label for the default toggle button. */\n collapseToggleAriaLabel?: string;\n /** Sidebar collapsed width. */\n sidebarCollapsedWidth?: number | string;\n /** Keep the header pinned while content scrolls. */\n stickyHeader?: boolean;\n className?: string;\n}\n\nconst len = (v: number | string) => (typeof v === \"number\" ? `${v}px` : v);\n\nexport const AppLayout = React.forwardRef<HTMLDivElement, PropsWithChildren<AppLayoutProps>>(function AppLayout(\n {\n header,\n sidebar,\n footer,\n sidebarWidth = 260,\n sidebarCollapsed,\n defaultSidebarCollapsed = false,\n onSidebarCollapsedChange,\n collapsible = false,\n collapseToggle,\n collapseToggleAriaLabel = \"Toggle navigation\",\n sidebarCollapsedWidth = 72,\n stickyHeader = true,\n className,\n style,\n children,\n ...rest\n },\n ref\n) {\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n value: sidebarCollapsed,\n defaultValue: defaultSidebarCollapsed,\n onChange: onSidebarCollapsedChange,\n });\n\n const sidebarId = useId();\n\n const cssVars = {\n \"--smui-app-sidebar-w\": collapsed ? len(sidebarCollapsedWidth) : len(sidebarWidth),\n } as CSSProperties;\n\n return (\n <div\n ref={ref}\n data-testid=\"app-layout\"\n className={cn(\n \"smwb-app-layout\",\n { \"smwb-app-layout_sticky-header\": stickyHeader, \"smwb-app-layout_collapsed\": collapsed },\n className\n )}\n style={{ ...cssVars, ...style }}\n {...rest}\n >\n {header ? <div className=\"smwb-app-layout__header\">{header}</div> : null}\n <div className=\"smwb-app-layout__body\">\n {sidebar ? (\n <aside id={sidebarId} className=\"smwb-app-layout__sidebar\">\n {collapsible ? (\n <div className=\"smwb-app-layout__collapse\">\n {collapseToggle ?? (\n <button\n type=\"button\"\n className=\"smwb-app-layout__collapse-btn\"\n aria-label={collapseToggleAriaLabel}\n aria-expanded={!collapsed}\n aria-controls={sidebarId}\n onClick={() => setCollapsed(!collapsed)}\n >\n <Icon name={collapsed ? \"chevron_right\" : \"chevron_left\"} size={20} />\n </button>\n )}\n </div>\n ) : null}\n {sidebar}\n </aside>\n ) : null}\n <div className=\"smwb-app-layout__content\">\n {children}\n {footer ? <div className=\"smwb-app-layout__footer\">{footer}</div> : null}\n </div>\n </div>\n </div>\n );\n});\n\nexport default AppLayout;\n","import React, { forwardRef } from \"react\";\nimport cn from \"clsx\";\n\nexport type AppBarColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface AppBarProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n children?: React.ReactNode;\n className?: string;\n dense?: boolean;\n position?: \"relative\" | \"static\" | \"absolute\" | \"sticky\" | \"fixed\";\n placement?: \"top\" | \"bottom\";\n leftContent?: React.ReactNode;\n midContent?: React.ReactNode;\n rightContent?: React.ReactNode;\n title?: React.ReactNode | string;\n midContentAlign?: \"middle\" | \"left\" | \"right\";\n /** Semantic background color. */\n color?: AppBarColor;\n}\n\nexport const AppBar = forwardRef<HTMLElement, AppBarProps>(function AppBar(\n {\n className,\n children,\n dense,\n position = \"static\",\n placement = \"top\",\n leftContent,\n midContent,\n midContentAlign = \"middle\",\n rightContent,\n title,\n color = \"default\",\n ...rest\n },\n ref\n) {\n const MainTag = placement === \"top\" ? \"header\" : \"footer\";\n\n return (\n <MainTag\n ref={ref}\n className={cn(\n \"smwb-appbar\",\n className,\n `smwb-${position}`,\n `smwb-${placement}`,\n { \"smwb-dense\": dense },\n color !== \"default\" && `smwb-appbar_color-${color}`\n )}\n data-testid=\"app-bar\"\n {...rest}\n >\n {children ? (\n children\n ) : (\n <div className=\"smwb-appbar__inner\">\n <div className=\"smwb-appbar__left\">\n {title && <div className=\"smwb-appbar__left__title\">{title}</div>}\n {leftContent}\n </div>\n <div className={cn(\"smwb-appbar__mid\", `smwb-${midContentAlign}`)}>{midContent}</div>\n <div className=\"smwb-appbar__right\">{rightContent}</div>\n </div>\n )}\n </MainTag>\n );\n});\n\nexport default AppBar;\n","import {\n Children,\n forwardRef,\n Fragment,\n HTMLAttributes,\n isValidElement,\n PropsWithChildren,\n ReactNode,\n useState,\n} from \"react\";\nimport cn from \"clsx\";\n\nexport interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {\n className?: string;\n /** Node placed between every crumb. */\n separator?: ReactNode;\n /** Collapse the middle of the trail when there are more than `maxItems` crumbs. */\n maxItems?: number;\n /** How many leading crumbs to keep when collapsed. */\n itemsBeforeCollapse?: number;\n /** How many trailing crumbs to keep when collapsed. */\n itemsAfterCollapse?: number;\n /** Controlled expanded state. */\n expanded?: boolean;\n /** Fired when the user activates the expand control. */\n onExpand?: () => void;\n /** Accessible label for the expand button. */\n expandLabel?: string;\n}\n\nexport const Breadcrumbs = forwardRef<HTMLElement, PropsWithChildren<BreadcrumbsProps>>(function Breadcrumbs(\n {\n className,\n separator = \"/\",\n maxItems = 8,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n expanded: expandedProp,\n onExpand,\n expandLabel = \"Show path\",\n children,\n ...props\n },\n ref\n) {\n const isControlled = expandedProp !== undefined;\n const [internalExpanded, setInternalExpanded] = useState(false);\n const expanded = isControlled ? !!expandedProp : internalExpanded;\n const crumbs = Children.toArray(children).filter(isValidElement);\n\n const collapsed = !expanded && crumbs.length > maxItems && itemsBeforeCollapse + itemsAfterCollapse < crumbs.length;\n\n const handleExpand = () => {\n onExpand?.();\n if (!isControlled) {\n setInternalExpanded(true);\n }\n };\n\n const rendered: ReactNode[] = collapsed\n ? [\n ...crumbs.slice(0, itemsBeforeCollapse),\n <button\n key=\"smwb-breadcrumbs-expand\"\n type=\"button\"\n className=\"smwb-breadcrumbs__expand\"\n aria-label={expandLabel}\n onClick={handleExpand}\n >\n …\n </button>,\n ...crumbs.slice(crumbs.length - itemsAfterCollapse),\n ]\n : crumbs;\n\n return (\n <nav\n {...props}\n ref={ref}\n data-testid=\"breadcrumbs\"\n aria-label=\"breadcrumb\"\n className={cn(\"smwb-breadcrumbs\", className)}\n >\n <ol className=\"smwb-breadcrumbs__list\">\n {rendered.map((crumb, index) => (\n <Fragment key={index}>\n <li className=\"smwb-breadcrumbs__item\">{crumb}</li>\n {index < rendered.length - 1 ? (\n <li className=\"smwb-breadcrumbs__separator\" aria-hidden=\"true\">\n {separator}\n </li>\n ) : null}\n </Fragment>\n ))}\n </ol>\n </nav>\n );\n});\n\nexport default Breadcrumbs;\n","import { forwardRef, HTMLAttributes, KeyboardEvent, useRef } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport type PaginationColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n className?: string;\n /** Total number of pages. */\n count: number;\n /** Current page (1-based). */\n page: number;\n /** Pages shown on each side of the current page. */\n siblingCount?: number;\n /** Pages always shown at the start and end. */\n boundaryCount?: number;\n size?: \"small\" | \"medium\";\n /** Item style. */\n variant?: \"filled\" | \"outlined\";\n /** Item shape. */\n shape?: \"rounded\" | \"circular\";\n color?: PaginationColor;\n disabled?: boolean;\n showFirstButton?: boolean;\n showLastButton?: boolean;\n hidePrevButton?: boolean;\n hideNextButton?: boolean;\n onChange?: (page: number) => void;\n}\n\ntype PaginationItem = number | \"start-ellipsis\" | \"end-ellipsis\";\n\nconst range = (start: number, end: number): number[] =>\n Array.from({ length: Math.max(end - start + 1, 0) }, (_, i) => start + i);\n\nconst buildItems = (count: number, page: number, siblingCount: number, boundaryCount: number): PaginationItem[] => {\n const startPages = range(1, Math.min(boundaryCount, count));\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count);\n\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2\n );\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1\n );\n\n return [\n ...startPages,\n ...(siblingsStart > boundaryCount + 2\n ? ([\"start-ellipsis\"] as PaginationItem[])\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n ...(siblingsEnd < count - boundaryCount - 1\n ? ([\"end-ellipsis\"] as PaginationItem[])\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ];\n};\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n className,\n count,\n page,\n siblingCount = 1,\n boundaryCount = 1,\n size = \"medium\",\n variant = \"filled\",\n shape = \"circular\",\n color = \"default\",\n disabled = false,\n showFirstButton = false,\n showLastButton = false,\n hidePrevButton = false,\n hideNextButton = false,\n onChange,\n ...props\n },\n ref\n) {\n const navRef = useRef<HTMLElement>(null);\n const mergedRef = useForkRef<HTMLElement>(ref, navRef);\n\n const go = (target: number) => {\n if (disabled || target === page || target < 1 || target > count) {\n return;\n }\n onChange?.(target);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLUListElement>) => {\n if (![\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(e.key)) {\n return;\n }\n const buttons = Array.from(\n navRef.current?.querySelectorAll<HTMLButtonElement>(\"button.smwb-pagination__item:not(:disabled)\") ?? []\n );\n if (buttons.length === 0) {\n return;\n }\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n let next = current;\n if (e.key === \"ArrowRight\") next = Math.min(current + 1, buttons.length - 1);\n else if (e.key === \"ArrowLeft\") next = Math.max(current - 1, 0);\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = buttons.length - 1;\n e.preventDefault();\n buttons[next]?.focus();\n };\n\n const items = buildItems(count, page, siblingCount, boundaryCount);\n\n const navButton = (key: string, label: string, target: number, iconName: string, hidden?: boolean) =>\n hidden ? null : (\n <li key={key}>\n <button\n type=\"button\"\n className=\"smwb-pagination__item smwb-pagination__nav\"\n aria-label={label}\n disabled={disabled || target < 1 || target > count}\n onClick={() => go(target)}\n >\n <Icon name={iconName} size={size === \"small\" ? 16 : 18} />\n </button>\n </li>\n );\n\n return (\n <nav\n {...props}\n ref={mergedRef}\n data-testid=\"pagination\"\n aria-label=\"pagination\"\n className={cn(\n \"smwb-pagination\",\n `smwb-pagination_${size}`,\n `smwb-pagination_${variant}`,\n `smwb-pagination_shape-${shape}`,\n color !== \"default\" && `smwb-pagination_color-${color}`,\n { \"smwb-pagination_disabled\": disabled },\n className\n )}\n >\n <ul className=\"smwb-pagination__list\" onKeyDown={onKeyDown}>\n {navButton(\"first\", \"First page\", 1, \"first_page\", !showFirstButton)}\n {navButton(\"prev\", \"Previous page\", page - 1, \"chevron_left\", hidePrevButton)}\n {items.map((item, index) =>\n typeof item === \"number\" ? (\n <li key={item}>\n <button\n type=\"button\"\n className={cn(\"smwb-pagination__item\", { \"smwb-pagination__item_selected\": item === page })}\n aria-current={item === page ? \"page\" : undefined}\n disabled={disabled}\n onClick={() => go(item)}\n >\n {item}\n </button>\n </li>\n ) : (\n <li key={`${item}-${index}`} className=\"smwb-pagination__ellipsis\" aria-hidden=\"true\">\n …\n </li>\n )\n )}\n {navButton(\"next\", \"Next page\", page + 1, \"chevron_right\", hideNextButton)}\n {navButton(\"last\", \"Last page\", count, \"last_page\", !showLastButton)}\n </ul>\n </nav>\n );\n});\n\nexport default Pagination;\n","import { forwardRef, Fragment, HTMLAttributes, KeyboardEvent, ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface StepItem {\n label: ReactNode;\n description?: ReactNode;\n optional?: ReactNode;\n /** Marks the step as errored. */\n error?: boolean;\n /** Disables interaction with the step. */\n disabled?: boolean;\n /** Custom icon overriding the default number/check. */\n icon?: ReactNode;\n}\n\nexport interface StepperProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n steps: StepItem[];\n /** Index of the active (current) step. */\n activeStep: number;\n orientation?: \"horizontal\" | \"vertical\";\n /** Place the label under the icon (horizontal only). */\n alternativeLabel?: boolean;\n /** Makes steps clickable; receives the clicked step index. */\n onStepClick?: (index: number) => void;\n}\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(function Stepper(\n { className, steps, activeStep, orientation = \"horizontal\", alternativeLabel = false, onStepClick, ...props },\n ref\n) {\n return (\n <div\n {...props}\n ref={ref}\n data-testid=\"stepper\"\n className={cn(\n \"smwb-stepper\",\n `smwb-stepper_${orientation}`,\n { \"smwb-stepper_alt-label\": alternativeLabel && orientation === \"horizontal\" },\n className\n )}\n >\n {steps.map((step, index) => {\n const completed = index < activeStep;\n const active = index === activeStep;\n const isLast = index === steps.length - 1;\n const clickable = Boolean(onStepClick) && !step.disabled;\n\n const onStepKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (clickable && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n onStepClick?.(index);\n }\n };\n\n return (\n <Fragment key={index}>\n <div\n className={cn(\"smwb-stepper__step\", {\n \"smwb-stepper__step_active\": active,\n \"smwb-stepper__step_completed\": completed,\n \"smwb-stepper__step_error\": step.error,\n \"smwb-stepper__step_disabled\": step.disabled,\n \"smwb-stepper__step_clickable\": clickable,\n })}\n aria-current={active ? \"step\" : undefined}\n aria-disabled={step.disabled || undefined}\n role={clickable ? \"button\" : undefined}\n tabIndex={clickable ? 0 : undefined}\n onClick={clickable ? () => onStepClick?.(index) : undefined}\n onKeyDown={clickable ? onStepKeyDown : undefined}\n >\n <div className=\"smwb-stepper__icon\" aria-hidden=\"true\">\n {step.icon ?? (completed ? <Icon name=\"check\" size={16} /> : <span>{index + 1}</span>)}\n </div>\n <div className=\"smwb-stepper__text\">\n <span className=\"smwb-stepper__label\">{step.label}</span>\n {step.optional ? <span className=\"smwb-stepper__optional\">{step.optional}</span> : null}\n {step.description && orientation === \"vertical\" ? (\n <span className=\"smwb-stepper__description\">{step.description}</span>\n ) : null}\n </div>\n </div>\n {!isLast ? <div className=\"smwb-stepper__connector\" aria-hidden=\"true\" /> : null}\n </Fragment>\n );\n })}\n </div>\n );\n});\n\nexport default Stepper;\n","import React, { forwardRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {\n className?: string;\n variant?: \"compact\" | \"default\" | \"compactMini\";\n menuItems?: MenuItemProps[];\n /** Controlled index of the active menu item. */\n activeItem?: number | null;\n /** Default active index (uncontrolled). */\n defaultActiveItem?: number | null;\n /** Called with the index of the activated item. */\n onActiveItemChange?: (index: number) => void;\n /** Render a built-in toggle that collapses the rail to an icon-only mini rail. */\n collapsible?: boolean;\n /** Controlled collapsed state. */\n collapsed?: boolean;\n /** Initial collapsed state (uncontrolled). */\n defaultCollapsed?: boolean;\n /** Called whenever the collapsed state changes. */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Accessible label for the built-in collapse toggle. */\n collapseToggleAriaLabel?: string;\n}\n\nexport const Sidebar = forwardRef<HTMLElement, SidebarProps>(function Sidebar(\n {\n className,\n variant = \"default\",\n menuItems,\n activeItem: activeItemProp,\n defaultActiveItem = null,\n onActiveItemChange,\n collapsible = false,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseToggleAriaLabel = \"Toggle navigation\",\n ...rest\n },\n ref\n) {\n const isControlled = activeItemProp !== undefined;\n const [activeItemState, setActiveItemState] = useState<number | null>(defaultActiveItem);\n const activeItem = isControlled ? activeItemProp : activeItemState;\n\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n value: collapsedProp,\n defaultValue: defaultCollapsed,\n onChange: onCollapsedChange,\n });\n\n // When collapsed the rail always shows the icon-only mini variant,\n // otherwise it honours the requested variant.\n const effectiveVariant = collapsible && collapsed ? \"compactMini\" : variant;\n\n return (\n <aside\n ref={ref}\n className={cn(\"smwb-sidebar\", className, `smwb-${effectiveVariant}`, {\n \"smwb-sidebar_collapsible\": collapsible,\n \"smwb-sidebar_collapsed\": collapsible && collapsed,\n })}\n role=\"menubar\"\n {...rest}\n >\n {collapsible && (\n <div className=\"smwb-sidebar__collapse\">\n <button\n type=\"button\"\n className=\"smwb-sidebar__collapse-btn\"\n aria-label={collapseToggleAriaLabel}\n aria-expanded={!collapsed}\n onClick={() => setCollapsed(!collapsed)}\n >\n <Icon name={collapsed ? \"chevron_right\" : \"chevron_left\"} size={20} />\n </button>\n </div>\n )}\n <nav className=\"smwb-sidebar__nav\">\n {menuItems &&\n menuItems?.map((item, idx) => (\n <MenuItem\n key={idx}\n as={item.as}\n isActive={activeItem === idx}\n onClick={(e) => {\n if (!isControlled) {\n setActiveItemState(idx);\n }\n onActiveItemChange?.(idx);\n item.onClick?.(e);\n }}\n icon={item.icon}\n title={item.title}\n href={item.href}\n variant={effectiveVariant}\n />\n ))}\n </nav>\n </aside>\n );\n});\n\nexport default Sidebar;\n\nexport interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n icon?: React.ReactNode;\n title: string;\n isActive?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n as?: React.ElementType;\n href?: string;\n variant?: \"compact\" | \"default\" | \"compactMini\";\n}\n\nfunction MenuItem({\n isActive,\n icon,\n title,\n as = \"div\",\n href,\n onMouseDown: onMouseDownProp,\n variant,\n ...rest\n}: MenuItemProps) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n const rippleElement = <Ripple actionRef={rippleRef} />;\n\n const ElementType = as;\n\n return (\n <ElementType\n href={href}\n role=\"menuitem\"\n className={cn(\"sidebar__nav__item\", \"smwb-nav-item\", variant, { active: isActive })}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {icon && <span className=\"smwb-nav-item__icon\">{icon}</span>}\n {title && <span className=\"smwb-nav-item__title\">{title}</span>}\n {rippleElement}\n </ElementType>\n );\n}\n","import React, { forwardRef, useMemo, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport { Menu, MenuItem, MenuItemIcon, MenuItemText } from \"../menu\";\nimport type { MenuItemProps as SidebarMenuItemProps } from \"../sidebar/sidebar\";\n\nexport interface BottomBarProps extends React.HTMLAttributes<HTMLElement> {\n className?: string;\n menuItems?: SidebarMenuItemProps[];\n visibleCount?: number;\n activeItem?: number | null;\n defaultActiveItem?: number | null;\n onActiveItemChange?: (index: number) => void;\n overflowMenuAriaLabel?: string;\n}\n\nexport type BottomBarMenuItemProps = SidebarMenuItemProps;\n\nexport const BottomBar = forwardRef<HTMLElement, BottomBarProps>(function BottomBar(\n {\n className,\n menuItems = [],\n visibleCount = 4,\n activeItem: activeItemProp,\n defaultActiveItem = null,\n onActiveItemChange,\n overflowMenuAriaLabel = \"More navigation\",\n ...rest\n },\n ref\n) {\n const isControlled = activeItemProp !== undefined;\n const [activeItemState, setActiveItemState] = useState<number | null>(defaultActiveItem);\n const activeItem = isControlled ? activeItemProp : activeItemState;\n\n const [overflowOpen, setOverflowOpen] = useState(false);\n const [overflowAnchor, setOverflowAnchor] = useState<HTMLElement | null>(null);\n\n const safeVisibleCount = Math.max(0, visibleCount);\n const visibleItems = useMemo(() => menuItems.slice(0, safeVisibleCount), [menuItems, safeVisibleCount]);\n const overflowItems = useMemo(() => menuItems.slice(safeVisibleCount), [menuItems, safeVisibleCount]);\n const hasOverflow = overflowItems.length > 0;\n const overflowActive = hasOverflow && activeItem !== null && activeItem >= safeVisibleCount;\n\n const setActive = (index: number) => {\n if (!isControlled) {\n setActiveItemState(index);\n }\n onActiveItemChange?.(index);\n };\n\n const activateItem = (index: number, onClick?: React.MouseEventHandler<HTMLDivElement>) => {\n return (event: React.MouseEvent<HTMLDivElement>) => {\n setActive(index);\n onClick?.(event);\n };\n };\n\n const onOverflowToggle = () => {\n setOverflowOpen((prev) => !prev);\n };\n\n const onOverflowClose = () => {\n setOverflowOpen(false);\n };\n\n return (\n <nav ref={ref} className={cn(\"smwb-bottom-bar\", className)} role=\"navigation\" {...rest}>\n <div className=\"smwb-bottom-bar__nav\" role=\"menubar\">\n {visibleItems.map((item, idx) => (\n <BarItem\n key={idx}\n as={item.as}\n isActive={activeItem === idx}\n onClick={activateItem(idx, item.onClick)}\n icon={item.icon}\n title={item.title}\n href={item.href}\n />\n ))}\n {hasOverflow && (\n <BarItem\n ref={setOverflowAnchor}\n isActive={overflowActive}\n onClick={onOverflowToggle}\n icon={<Icon name=\"menu\" size={24} />}\n aria-label={overflowMenuAriaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={overflowOpen}\n />\n )}\n </div>\n {hasOverflow && (\n <Menu isOpen={overflowOpen} onClose={onOverflowClose} anchorElement={overflowAnchor} placement=\"top\" dense>\n {overflowItems.map((item, idx) => {\n const itemIndex = safeVisibleCount + idx;\n\n return (\n <MenuItem\n key={itemIndex}\n selected={activeItem === itemIndex}\n href={item.href}\n onClick={(event) => {\n setActive(itemIndex);\n item.onClick?.(event as unknown as React.MouseEvent<HTMLDivElement>);\n onOverflowClose();\n }}\n >\n {item.icon ? <MenuItemIcon>{item.icon}</MenuItemIcon> : null}\n <MenuItemText inset={!item.icon}>{item.title}</MenuItemText>\n </MenuItem>\n );\n })}\n </Menu>\n )}\n </nav>\n );\n});\n\nexport default BottomBar;\n\ninterface BarItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n icon?: React.ReactNode;\n title?: string;\n isActive?: boolean;\n as?: React.ElementType;\n href?: string;\n}\n\nconst BarItem = forwardRef<HTMLDivElement, BarItemProps>(function BarItem(\n { isActive, icon, title, as = \"div\", href, onMouseDown: onMouseDownProp, ...rest },\n ref\n) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseDownProp?.(event);\n };\n\n const onPointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n const ElementType = as;\n\n return (\n <ElementType\n ref={ref}\n href={href}\n role=\"menuitem\"\n className={cn(\"smwb-bottom-bar__item\", { \"smwb-bottom-bar__item_active\": isActive })}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {icon && <span className=\"smwb-bottom-bar__item-icon\">{icon}</span>}\n {title ? <span className=\"smwb-bottom-bar__item-title\">{title}</span> : null}\n <Ripple actionRef={rippleRef} />\n </ElementType>\n );\n});\n","export interface DebouncedFunction<A extends unknown[]> {\n (...args: A): void;\n cancel(): void;\n}\n\nexport function debounce<A extends unknown[]>(fn: (...args: A) => void, wait: number): DebouncedFunction<A> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = (...args: A): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => {\n timer = undefined;\n fn(...args);\n }, wait);\n };\n\n debounced.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n return debounced;\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../../base/ripple/ripple\";\n\nexport interface TabProps extends React.HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\n label?: string | React.ReactNode;\n isActive?: boolean;\n contentRef?: React.Ref<unknown>;\n icon?: React.ReactNode;\n stacked?: boolean;\n tag?: React.ElementType;\n disabled?: boolean;\n}\n\nexport const Tab = React.forwardRef<HTMLButtonElement | HTMLAnchorElement, TabProps>(function Tab(props, ref) {\n const {\n className,\n label,\n isActive = false,\n contentRef,\n icon,\n stacked = false,\n tag,\n disabled,\n onMouseDown: onMouseDownProp,\n ...rest\n } = props;\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n const Tag = tag ?? (tag || \"button\");\n const classes = cn(\"smwb-tab\", className, {\n \"smwb-tab--active\": isActive,\n \"smwb-tab--stacked\": stacked,\n \"smwb-tab--disabled\": disabled,\n });\n\n return (\n <Tag\n ref={ref}\n className={classes}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n role={\"tab\"}\n aria-selected={isActive}\n aria-disabled={disabled || undefined}\n tabIndex={isActive ? 0 : -1}\n disabled={Tag === \"button\" ? disabled : undefined}\n {...rest}\n >\n <span className=\"smwb-tab__content\" ref={contentRef as React.Ref<HTMLSpanElement>}>\n {icon && <span className=\"smwb-tab__icon\">{icon}</span>}\n {label && <span className=\"smwb-tab__text-label\">{label}</span>}\n </span>\n <Ripple actionRef={rippleRef} classes={{ child: \"tab__ripple-child\" }} />\n </Tag>\n );\n});\n","import { ExtractPropertyNamesByType } from \"./types/extractPropertyNamesByType\";\nimport { WritableKeys } from \"./types/writableKeys\";\n\nconst easeInOutSin = (time: number) => {\n return (1 + Math.sin(Math.PI * time - Math.PI / 2)) / 2;\n};\n\ninterface Options {\n ease?: (time: number) => number;\n\n duration?: number;\n}\n\nexport function animate(\n element: HTMLElement,\n property: NonNullable<ExtractPropertyNamesByType<Pick<HTMLElement, WritableKeys<HTMLElement>>, number>>,\n to: number,\n options: Options = {},\n cb: (arg: null | Error) => void = () => {\n // empty\n }\n) {\n const { ease = easeInOutSin, duration = 300 } = options;\n\n let start: DOMHighResTimeStamp | null = null;\n const from = element[property];\n let cancelled = false;\n\n const cancel = () => {\n cancelled = true;\n };\n\n const step = (timestamp: DOMHighResTimeStamp) => {\n if (cancelled) {\n cb(new Error(\"Animation cancelled\"));\n return;\n }\n\n if (start === null) {\n start = timestamp;\n }\n\n const time = Math.min(1, (timestamp - start) / duration);\n element[property] = ease(time) * (to - from) + from;\n\n if (time >= 1) {\n requestAnimationFrame(() => {\n cb(null);\n });\n return;\n }\n\n requestAnimationFrame(step);\n };\n\n if (from === to) {\n cb(new Error(\"Element already at target position\"));\n return cancel;\n }\n\n requestAnimationFrame(step);\n return cancel;\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { debounce } from \"../../../utils/debounce\";\nimport { Tab, TabProps } from \"./tab/tab\";\nimport { useEventCallback } from \"../../../hooks/useEventCallback\";\nimport { setRef } from \"../../../utils/setRef\";\nimport { animate } from \"../../../utils/animate\";\n\nexport interface TabsProps {\n value: number;\n onChange: (e: React.MouseEvent<HTMLButtonElement>, index: number) => void;\n indicatorContent?: boolean;\n scrollable?: boolean;\n className?: string;\n children?: React.ReactNode;\n /** Accessible label for the tab list. */\n \"aria-label\"?: string;\n}\n\ninterface IndicatorStyle {\n root: {\n left: number;\n width: number;\n };\n content?: {\n width: number;\n };\n}\n\nconst defaultIndicatorStyle = {\n root: {},\n content: {},\n} as IndicatorStyle;\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(function Tabs(props, ref) {\n const {\n className,\n children,\n onChange,\n value,\n indicatorContent = false,\n scrollable = false,\n \"aria-label\": ariaLabel,\n ...rest\n } = props;\n const [mounted, setMounted] = React.useState(false);\n const [indicatorStyle, setIndicatorStyle] = React.useState<IndicatorStyle>(defaultIndicatorStyle);\n\n const tabsRef = React.useRef<HTMLDivElement>(null);\n const tabListRef = React.useRef<HTMLDivElement>(null);\n const contentTabsRef = React.useRef<HTMLSpanElement[]>([]);\n\n // Видимость следующего таба в пикселях\n const viewNextTabInPixels = 40;\n\n const getTabsMeta = () => {\n const tabsNode = tabsRef.current;\n\n let tabsMeta;\n\n if (tabsNode) {\n const rect = tabsNode.getBoundingClientRect();\n\n tabsMeta = {\n clientWidth: tabsNode.clientWidth,\n scrollLeft: tabsNode.scrollLeft,\n scrollTop: tabsNode.scrollTop,\n scrollWidth: tabsNode.scrollWidth,\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n };\n }\n\n let tabMeta: DOMRect | null = null;\n let tabContentMeta: DOMRect | null = null;\n\n if (!tabListRef.current) {\n console.error(\"tabListRef.current is undefined\");\n }\n if (tabsNode && tabListRef.current) {\n const children = tabListRef.current.children;\n\n if (children.length > 0) {\n const tab = children[value];\n\n tabMeta = tab ? tab.getBoundingClientRect() : null;\n\n if (indicatorContent) {\n tabContentMeta = contentTabsRef.current[value] ? contentTabsRef.current[value].getBoundingClientRect() : null;\n }\n }\n }\n return { tabsMeta, tabMeta, tabContentMeta };\n };\n\n const updateIndicatorState = useEventCallback(() => {\n const { tabsMeta, tabMeta, tabContentMeta } = getTabsMeta();\n let startValue = 0;\n\n if (tabMeta && tabsMeta) {\n startValue = 1 * (tabMeta.left - tabsMeta.left + tabsMeta.scrollLeft);\n }\n\n const newIndicatorStyle: IndicatorStyle = {\n root: {\n left: startValue,\n width: tabMeta ? tabMeta.width : 0,\n },\n };\n\n if (indicatorContent && tabContentMeta) {\n newIndicatorStyle.content = {\n width: tabContentMeta.width,\n };\n }\n\n if (isNaN(indicatorStyle.root.left) || isNaN(indicatorStyle.root.width)) {\n setIndicatorStyle(newIndicatorStyle);\n } else {\n const dStart = Math.abs(indicatorStyle.root.left - newIndicatorStyle.root.left);\n const dSize = Math.abs(indicatorStyle.root.width - newIndicatorStyle.root.width);\n\n if (dStart >= 1 || dSize >= 1) {\n setIndicatorStyle(newIndicatorStyle);\n }\n }\n });\n\n const scroll = (scrollValue: number, { animation = true } = {}) => {\n if (!tabsRef.current) {\n return;\n }\n if (animation) {\n animate(tabsRef.current, \"scrollLeft\", scrollValue, {\n duration: 300,\n });\n } else {\n tabsRef.current.scrollLeft = scrollValue;\n }\n };\n\n const scrollSelectedIntoView = useEventCallback((animation: boolean) => {\n const { tabsMeta, tabMeta } = getTabsMeta();\n\n if (!tabMeta || !tabsMeta) {\n return;\n }\n\n if (tabMeta.left < tabsMeta.left) {\n // Левая сторона таба не видна.\n const nextScrollStart = tabsMeta.scrollLeft + (tabMeta.left - tabsMeta.left);\n scroll(nextScrollStart - viewNextTabInPixels, { animation });\n } else if (tabMeta.right > tabsMeta.right) {\n // Правая сторона таба не видна.\n const nextScrollStart = tabsMeta.scrollLeft + (tabMeta.right - tabsMeta.right);\n scroll(nextScrollStart + viewNextTabInPixels, { animation });\n }\n });\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n React.useEffect(() => {\n updateIndicatorState();\n });\n\n React.useEffect(() => {\n const onResize = debounce(() => {\n if (tabsRef.current) {\n updateIndicatorState();\n }\n }, 166);\n if (!tabsRef.current || !tabsRef.current.ownerDocument.defaultView) {\n console.error(`tabsRef.current.ownerDocument.defaultView is undefined`);\n return;\n }\n const window: Window & typeof globalThis = tabsRef.current.ownerDocument.defaultView;\n\n window.addEventListener(\"resize\", onResize);\n\n let resizeObserver: ResizeObserver;\n\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(onResize);\n\n Array.from(tabListRef.current?.children ?? []).forEach((child) => {\n resizeObserver.observe(child);\n });\n }\n\n return () => {\n onResize.cancel();\n\n window.removeEventListener(\"resize\", onResize);\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n };\n }, [updateIndicatorState]);\n\n React.useEffect(() => {\n // Не анимировать при первом рендере\n scrollSelectedIntoView(defaultIndicatorStyle !== indicatorStyle);\n }, [scrollSelectedIntoView, indicatorStyle]);\n\n const tabs = React.Children.map(\n children as React.ReactElement<TabProps>[],\n (child: React.ReactElement<TabProps>, index) =>\n React.cloneElement(child, {\n isActive: value === index,\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n onChange(event, index);\n },\n ...(indicatorContent && {\n contentRef: (ref: HTMLSpanElement) => {\n const { contentRef } = child.props;\n\n contentTabsRef.current.push(ref);\n\n if (contentRef) {\n setRef(contentRef as React.Ref<unknown>, ref);\n }\n },\n }),\n } as TabProps)\n );\n\n return (\n <div className={cn(\"smwb-tabs\", className)} role={\"tabpanel\"} ref={ref} {...rest}>\n <div\n className={cn(\"smwb-tabs__scroller\", {\n \"smwb-tabs__scroller--scrollable\": scrollable,\n })}\n ref={tabsRef}\n >\n <div className=\"smwb-tabs__scroll-area\" ref={tabListRef} role=\"tablist\" aria-label={ariaLabel}>\n {tabs}\n </div>\n {mounted && (\n <span className=\"smwb-tabs__indicator\" style={indicatorStyle.root}>\n <span className=\"smwb-tabs__indicator-content\" style={indicatorStyle.content} />\n </span>\n )}\n </div>\n </div>\n );\n});\n\nexport { Tab };\nexport type { TabProps };\n"],"names":["Observable","value","cb","l","useObservable","observable","val","setVal","useState","useEffect","Theme","themeStorageKey","themeObservable","useTheme","theme","firstUpdate","useRef","useLayoutEffect","savedTheme","defaultTheme","themeListener","event","useControllableState","defaultValue","onChange","isControlled","internal","setInternal","current","currentRef","onChangeRef","setValue","useCallback","next","prev","resolved","_a","useId","idProp","prefix","generated","useReactId","FOCUSABLE","useFocusTrap","containerRef","active","restoreFocus","autoFocus","prevFocused","container","focusables","el","first","onKeyDown","items","last","activeEl","useRovingTabIndex","count","activeIndex","onMove","orientation","loop","isDisabled","horiz","vert","target","clamp","i","guard","step","useVirtualList","itemCount","itemHeight","viewportHeight","overscan","scrollTop","setScrollTop","onScroll","useMemo","safeItemHeight","visibleCount","startIndex","endIndex","Icon","forwardRef","className","weight","fill","size","grade","name","color","title","props","ref","decorative","colorClass","jsx","cn","Ripple","actionRef","classes","center","style","duration","rest","ripples","setRipples","React","nextKey","rect","diameter","radius","coordX","coordY","prevRipples","setRef","useForkRef","refs","instance","isNumber","n","number","isPercentage","height","hideContent","element","showContent","ANIMATION_STATE_CLASSES","getStaticStateClasses","animationStateClasses","classNames","AnimateHeight","animateOpacity","applyInlineTransitions","children","contentClassName","userDelay","userDuration","easing","onHeightAnimationEnd","onHeightAnimationStart","prevHeight","contentElement","rootElement","forkedRootRef","animationClassesTimeoutID","timeoutID","stateClasses","delay","initHeight","initOverflow","currentHeight","setCurrentHeight","overflow","setOverflow","useTransitions","setUseTransitions","animationStateClassNames","setAnimationStateClassNames","contentHeight","totalDuration","newHeight","timeoutHeight","timeoutOverflow","timeoutUseTransitions","isCurrentHeightAuto","newAnimationStateClassNames","timeoutAnimationStateClasses","componentStyle","contentStyle","ariaHidden","Accordion","isOpenByDefault","open","disabled","icon","startAdornment","noIcon","onToggleClick","internalOpen","setInternalOpen","isOpen","baseId","contentId","headerId","arrowIconClasses","toggle","e","jsxs","Button","label","variant","iconProps","href","onMouseDownProp","fullWidth","rippleCenter","disableRipple","colorTheme","colorProp","rippleRef","onMouseDown","onPointerDown","rippleElement","iconElement","useSafeLayoutEffect","DEFAULT_LABELS","resolveChildren","ctx","resolveControls","controls","ExpansionPanel","header","modeProp","defaultMode","onModeChange","disableExpand","noControls","renderControls","closeOnOutsideClick","closeOnEsc","labels","mode","setMode","domRoot","setDomRoot","effectiveMode","isFullRow","isFullscreen","toggleRow","openFullscreen","closeFullscreen","controlsContext","overlay","defaultControls","Fragment","renderControlBar","content","card","createPortal","ChatIconButton","edge","FloatingButton","type","hasValue","isFilled","obj","TextFieldAdornment","position","disablePointerEvents","inline","TextFieldWrapper","helperText","error","isFilledState","isFocused","htmlFor","shrink","onHolderMouseDown","endAdornment","isFilledVariant","isNotchedActive","labelClasses","notchedClasses","TextField","required","onChangeProp","onFocusProp","onBlurProp","readOnly","placeholder","id","autoComplete","inputMode","setIsFocused","setIsFilledState","inputRef","inputForkRef","onFocus","onBlur","checkDirty","filled","inputClasses","CHAT_MESSAGE_DELIVERY_STATUSES","CHAT_MESSAGE_STATUS_ICONS","CHAT_MESSAGE_STATUS_LABELS","CHAT_EXPAND_LAYOUTS","CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES","isChatMessageDeliveryStatus","status","resolveChatMessageStatusIcon","icons","custom","resolveChatMessageStatusLabel","isImageAttachment","attachment","formatChatTimestamp","date","resolveAllowedLayouts","input","pickInitialLayout","allowed","preferred","getChatLayoutActions","allowedLayouts","currentLayout","shouldShowChatCloseButton","options","shouldComposerNewlineOnEnter","shiftEnterNewline","ctrlEnterNewline","isCtrl","stopPropagation","insertNewlineAtCursor","start","end","_b","nextValue","ChatComposer","onSendMessage","sendAriaLabel","fileUpload","attachInputId","onAttachClick","attachAriaLabel","inputId","textareaRef","multiline","canSend","showAttach","handleSend","text","handleKeyDown","attachClassName","attachButton","sendButton","layoutIcons","layoutAriaLabels","ChatHeader","subtitle","actions","layout","onLayoutChange","onClose","layoutActions","showLayoutActions","defaultTag","Typography","align","gutterBottom","noWrap","component","Tag","ChatAttachmentImage","setOpen","nodeRef","CSSTransition","ChatAttachments","attachments","enabled","isPresetSize","Avatar","src","alt","imgProps","imgFailed","setImgFailed","showImage","avatarClassName","inlineStyle","AvatarGroup","max","total","onSurplusClick","Children","isValidElement","totalCount","clampedMax","visible","surplus","ChatMessageAvatar","author","ChatMessageStatus","message","statusIcons","renderStatus","iconName","ChatMessageBubble","timestamp","showAvatars","showAttachments","showStatus","bubbleClassName","time","deliveryStatus","shouldShowStatus","ChatMessageIncoming","ChatMessageOutgoing","ChatMessageSystem","ChatMessageItem","renderMessage","toCssSize","Skeleton","width","animation","animationDelay","skeletonClassName","renderOne","_","ChatMessageSkeleton","showAvatar","lines","bubbleWidth","useChatInfiniteScroll","onLoadMore","hasMore","loading","rootMargin","sentinelRef","loadingRef","root","sentinel","observer","entries","entry","isScrolledToBottom","threshold","scrollChatToBottom","useChatStickToBottom","messages","isAtBottomRef","previousScrollHeightRef","previousFirstMessageIdRef","previousLastMessageIdRef","handleScroll","previousScrollHeight","previousFirstMessageId","previousLastMessageId","firstMessageId","lastMessageId","prepended","appended","ChatMessages","loadingMore","loadingSkeletonCount","showSkeletons","skeletonAligns","index","ChatShell","anchor","themeMode","embedded","overlayContext","footer","fileDropzoneRootProps","fileDropzoneActive","dropzoneClassName","dropzoneRootProps","panel","resolveChatFileUploadMaxFiles","maxFiles","useChatFileUpload","accept","onUploadFiles","resolvedMaxFiles","getRootProps","getInputProps","isDragActive","useDropzone","files","Chat","headerTitle","headerSubtitle","headerActions","allowedLayoutsProp","layoutProp","defaultLayout","openProp","defaultOpen","onOpenChange","floatingTrigger","triggerIcon","triggerLabel","composerPlaceholder","composerDisabled","composerShiftEnterNewline","composerCtrlEnterNewline","fileUploadAccept","fileUploadMaxFiles","showCloseButton","setLayout","effectiveLayout","handleOpen","handleClose","handleLayoutChange","fileUploadEnabled","showComposer","fileInput","resolvedFooter","chatBody","closeButtonVisible","len","floatingAnchorForSide","side","ChatLayout","chatClassName","chatWidth","collapsedProp","defaultCollapsed","onCollapsedChange","collapseAriaLabel","expandAriaLabel","floatingAnchor","chat","collapsed","setCollapsed","floatingOpen","setFloatingOpen","dockIcon","collapseIcon","collapseButton","expandButton","dockedHeaderActions","floatingHeaderActions","cssVars","Badge","badgeContent","vertical","horizontal","showZero","badgeAriaLabel","isZero","hidden","display","badgeClassname","Card","onClick","interactive","Chip","deleteIcon","onDelete","onDeleteMouseDownProp","asLink","selected","deleteAriaLabel","onDeleteMouseDown","deleteBtn","inner","clickable","ModalBase","backdrop","asForm","disableAppearAnimation","role","contentRef","forkedContentRef","Component","Header","Content","Footer","Modal","getActiveSlideDotsLength","slidesCount","slidesToShow","dots","getSlideIndexForMultipleParts","isNextSlideDisabled","dotsLength","isReactEvent","isMouseEvent","isTouchEvent","dragPrevent","getSlideStyle","getSlideWidth","getSlidesToShow","min","toCssLength","toCssNumber","getStartSlide","startSlide","maxIndex","useEventCallback","fn","args","MOTION_INITIAL_STATE","TAP_THRESHOLD","FLICK_VELOCITY","Carousel","slidesToShowProp","startSlideProp","showNavigation","showArrowsProp","arrowsSize","navigationClassName","onSlideChange","navigationDotRenderer","ariaLabel","autoplay","autoplayInterval","pauseOnHover","cellHeight","aspectRatio","gap","maxWidth","enableFullscreen","showArrows","maxShift","activeSlideIndex","setActiveSlideIndex","shiftState","setShiftState","dragPx","setDragPx","isDragging","setIsDragging","fullscreenIndex","setFullscreenIndex","fullscreenDragPx","setFullscreenDragPx","isFullscreenDragging","setIsFullscreenDragging","rootRef","outerRef","forkedOuterRef","trackRef","isHovered","setIsHovered","motion","prevState","setMotion","now","goToSlide","moveFullscreen","direction","fullscreenTouchX","detachListeners","isMouse","onEnd","onStart","clientX","clientY","shiftX","shiftY","axis","atStart","atEnd","offset","dragged","startX","lastX","lastT","totalShift","widthPerSlide","velocity","movedSlides","onSlideClick","onNavigationItemClick","getNextIndex","isSingleSlide","totalGroups","nextIndex","getNavigation","isSinglePartSlide","indicators","currentIndex","isLast","isActive","indicator","getIndent","shiftSlides","slideId","slideStyle","layerStyle","rootStyle","cellHeightValue","aspectRatioValue","gapValue","maxWidthValue","timer","childrenArray","onFullscreenTouchStart","onFullscreenTouchMove","delta","onFullscreenTouchEnd","fullscreenTrackStyle","child","useModalState","setIsOpen","onOpen","ImagesListContext","ImagesListItem","rounded","itemBarContent","cols","rows","itemBarPlacement","rowsHeight","useContext","ImagesListItemModal","ImagesList","ListItem","dense","divider","List","subheader","TablePagination","limit","page","onPrev","onNext","limitOptions","onLimitChange","hasNextPage","isInfiniteMode","isDisabledNext","handleLimitChange","handlePrev","handleNext","renderCountText","from","to","opt","Table","hovered","paginationSettings","isLoading","stickyHeader","caption","TableBody","TableCell","cellAlign","TableHead","TableHeadCell","isSortedByAsc","isSortedByDesc","sortable","sortDirection","onSort","ariaSort","TableRow","expanded","TreeView","listIcon","nodeIcon","data","defaultExpanded","onExpandedChange","defaultSelected","onSelectedChange","selectable","checkboxes","renderLabel","loadChildren","loadedChildren","setLoadedChildren","loadingIds","setLoadingIds","expandedIds","setExpandedIds","selectedIds","setSelectedIds","toggleExpanded","x","has","toggleSelected","ensureLoaded","item","nodeId","renderNode","path","resolvedChildren","isLazy","hasChildNodes","isSelected","onLabelClick","c","idx","tree","d","node","mapEventPropToEvent","eventProp","clickedRootScrollbar","doc","ClickAwayListener","disableReactTree","mouseEvent","onClickAway","touchEvent","movedRef","activatedRef","syntheticEventRef","handleRef","handleClickAway","insideReactTree","insideDOM","createHandleSynthetic","handlerName","childrenPropsHandler","childrenProps","mappedTouchEvent","handleTouchMove","mappedMouseEvent","MessageContainer","severity","closeAriaLabel","resolvedSeverity","messageClassnames","Message","ProgressIndicator","progressValue","ariaProps","CircularProgress","circleRef","circleRadius","circleLength","useSnackbarsPortal","domElement","setDomElement","v4","SnackTransition","snack","autoClose","autoCloseTime","snackRest","onSnackRemove","Snackbar","_c","_d","_e","SnackbarContext","createContext","SnackbarProvider","closeOnClick","snacks","setSnacks","snackbarDomRoot","addSnackbar","key","clearAllSnackbars","clearFirstSnackbar","clearLastSnackbar","clearByIdSnackbar","currentPositions","acc","currentPosition","snackbars","TransitionGroup","isAutoClose","action","timerClose","setCloseTimer","Element","useSnackbar","resolvePlacement","placement","alignment","autoPlacement","FLOATING_OFFSET_PX","FLOATING_SHIFT_PADDING_PX","buildFloatingMiddleware","flip","shift","Tooltip","trigger","openDelay","closeDelay","hoverOpen","setHoverOpen","clickOpen","setClickOpen","openTimerRef","closeTimerRef","clearTimers","scheduleOpen","scheduleClose","floatingStyles","useFloating","autoUpdate","offsetMiddleware","isVisible","onPointerEnter","onPointerLeave","ButtonGroup","_f","Checkbox","indeterminate","handleChange","DatePickerIconButton","DatePickerActionLabel","onLeftIconClick","onRightIconClick","hiddenSwitches","dataToggleId","switchClasses","DATE_TOKEN_REGEXP","extractTokens","pattern","tokens","match","escapeRegExp","patternToRegExp","regex","lastIndex","isValidCalendarDate","year","month","day","formatDateByPattern","token","parseDateByPattern","part","isDatePatternMatch","startOfWeek","weekStart","weekDay","diff","endOfWeek","eachDayOfInterval","dates","startDate","endTime","currentDate","getDayNames","weekStartsOn","locale","formatter","startOfMonth","_date","endOfMonth","setMaxTime","isBefore","date1","date2","isAfter","addDays","days","getWeeks","nestedWeeks","lastDay","weekNumber","isSameMonth","resetTime","isSameDay","addMonths","months","setMonth","addYears","years","setYear","endOfDay","startOfDay","getMonths","getYears","currentYear","range","getMonthLabel","getYearLabel","getDisplayDate","format","isValidDate","getCurrentFormatDate","parts","MASK_DATE_REGEXP","MASK_TOKEN_REGEXP","getMaskFormat","maskedDateFormatter","mask","outputCharIndex","char","inputCharIndex","maskChar","nextMaskChar","acceptedChar","formattedChar","isDateMatch","getDateByFormat","parsed","DataPickerHeader","viewValue","openView","onMonthLabelClick","onYearLabelClick","onMonthIconClick","onYearIconClick","OpenView","DatePickerDay","outside","inRange","DataPickerDays","showDaysOutsideMonth","disablePast","disableFuture","minDate","maxDate","isDateDisabled","rangeStart","rangeEnd","dayNames","weeks","isInRange","isDisabledDay","weekDays","week","isOutside","MenuContext","useMenuContext","MenuItem","onClickProp","linkElement","linkProps","optionRenderer","MenuItemIcon","MenuItemText","inset","classnames","MenuDivider","MenuList","buildMenuFloatingMiddleware","defaultStyle","transitionStyles","MenuFloating","anchorElement","middleware","menuElement","setMenuElement","menuRef","onAwayClick","Transition","state","MenuSubmenu","toggleElement","onCloseProp","openOnHover","setAnchorElement","contextValue","onToggle","onToggleKeyDown","typed","MenuComponent","domProps","Menu","DatePickerList","valueProp","overflowRef","selectedItemRef","middle","onItemClick","defaultFormatDate","useDateInput","currentFormatDate","displayedValue","setDisplayedValue","maskFormat","prevValue","isValueChanged","rifmProps","useRifm","DataPickerInput","disableCalendar","calendarIcon","maskedProps","DatePicker","calendarAriaLabel","rangeValue","onRangeChange","isRangeControlled","rangeState","setRangeState","currentRange","setViewValue","setOpenView","anchorRef","calendarRef","anchorForkRef","calendarForkRef","onViewValueChange","onMonthChange","onYearChange","view","rangeDisplay","DATETIME_TOKEN_REGEXP","isValidTime","hours","minutes","seconds","formatDateTimeByPattern","parseDateTimeByPattern","isDateTimePatternMatch","getDisplayDateTime","getCurrentDateTimeFormat","getDateTimeMaskFormat","getDateTimeByFormat","useDateTimeInput","currentFormat","DateTimePickerInput","TimePickerList","TIME_TOKEN_REGEXP","patternHasSeconds","formatTimeByPattern","parseTimeByPattern","isTimePatternMatch","MASK_DIGIT_REGEXP","DEFAULT_TIME_FORMAT","getHoursList","getMinutesList","getSecondsList","setTime","getDisplayTime","isValidTimeDate","getCurrentTimeFormat","getTimeMaskFormat","maskedTimeFormatter","isTimeMatch","getTimeByFormat","mergeTime","baseDate","timeDate","mergeDate","timeSource","TimePickerColumns","onComplete","timeFormat","showSeconds","onHourChange","hour","onMinuteChange","minute","onSecondChange","second","DateTimePicker","popupRef","popupForkRef","emitChange","onDateChange","_event","onTimeChange","dateSource","resolvedTimeFormat","defaultFormatTime","useTimeInput","currentFormatTime","TimePickerInput","disableClock","clockIcon","TimePicker","clockAriaLabel","clockRef","clockForkRef","RadioButton","Rating","precision","emptyIcon","hover","setHover","valueFromEvent","starIndex","left","isLeftHalf","handleSelect","filledIcon","blankIcon","commit","clamped","fillRatio","DropdownMenu","menuMaxHeight","menuMiddleware","search","onSearchInputChange","searchValue","anchorElementRef","menuNoItemsMessage","createOption","virtualized","valueArray","hasGroups","lastGroup","useVirtual","totalHeight","offsetY","renderItem","v","menuMinWidth","setMenuMinWidth","SelectArrowIcon","ClearIcon","stopEvent","SelectField","multiple","menuContainer","chips","isFocusedProp","onSearch","resetSearch","hideSelectArrowIcon","clearable","creatable","onCreate","valueState","setValueState","selectedItems","setSelectedItems","initialValue","setSearchValue","forkedAnchorRef","searchWrapperRef","searchInputRef","updateValue","newValue","newSelectedItem","itemIndex","onDeleteChip","currentValue","newSelectedItems","onResetSelected","displayValues","toPercent","precisionRound","factor","decimatedClamp","prec","decimatedOffset","decimatedRange","rescale","scaled","resolveMarks","marks","s","result","RangeSlider","getAriaValueText","valueField","withTicks","isVertical","normalize","arr","lo","hi","activeThumb","isPressedRef","markList","positionToValue","y","moveThumb","raw","pickThumb","onMouseMove","onMouseEnd","onTouchStartNative","onThumbKeyDown","p0","p1","startPct","spanPct","mainStart","mainEnd","trackStyle","m","mp","SingleSlider","singleDefault","singleValueProp","setIsActive","isDiscrete","offsetToValue","absolute","containerSize","absolutePosition","onTouchStart","touch","removeListeners","handleArrowsControls","handleBlur","pct","thumbStyle","getTicks","t","Slider","Toggle","checked","labelPlacement","Grid","wrapOptions","justifyContentOptions","alignItemsOptions","directionOptions","Row","justifyContent","alignItems","wrap","spacing","isJustifyContent","isAlignItems","isDirection","isFlexWrap","hiddenClasses","bp","Column","xs","sm","md","lg","xl","xsOffset","smOffset","mdOffset","lgOffset","xlOffset","Container","disableGutters","colorVar","Divider","textAlign","thickness","flexItem","hasText","dividerStyle","dividerClassName","throttle","wait","lastCall","lastArgs","invoke","throttled","remaining","getInitialDivider","sizeFirst","sizeSecond","ScreenDivider","onSizeChange","keyboardStep","resizerAriaLabel","wrapperRef","forkedWrapperRef","setDivider","currentElement","setCurrentElement","handleDragStart","dragOverHandler","wrapper","cursor","handleDragEnd","onResizerKeyDown","decreaseKey","increaseKey","secondChildStyle","firstChildStyle","Sheet","disableOutsideClick","handleSizeButton","SheetBlock","isVerticalAxis","withSizeToggle","hideHeaderActions","reverseHeaderActions","resizable","minSize","maxSize","resizeStep","resizeHandleAriaLabel","onResize","showActions","headerActionNodes","forkRef","dragSize","setDragSize","px","viewport","currentSizePx","applySize","dragRef","onPointerMove","drag","grow","endDrag","onHandleKeyDown","base","incKey","decKey","sizeStyle","flexAlign","resolveGap","Stack","justify","Page","PageHeader","breadcrumbs","AppLayout","sidebar","sidebarWidth","sidebarCollapsed","defaultSidebarCollapsed","onSidebarCollapsedChange","collapsible","collapseToggle","collapseToggleAriaLabel","sidebarCollapsedWidth","sidebarId","AppBar","leftContent","midContent","midContentAlign","rightContent","MainTag","Breadcrumbs","separator","maxItems","itemsBeforeCollapse","itemsAfterCollapse","expandedProp","onExpand","expandLabel","internalExpanded","setInternalExpanded","crumbs","handleExpand","rendered","crumb","buildItems","siblingCount","boundaryCount","startPages","endPages","siblingsStart","siblingsEnd","Pagination","shape","showFirstButton","showLastButton","hidePrevButton","hideNextButton","navRef","mergedRef","go","buttons","navButton","Stepper","steps","activeStep","alternativeLabel","onStepClick","completed","onStepKeyDown","Sidebar","menuItems","activeItemProp","defaultActiveItem","onActiveItemChange","activeItemState","setActiveItemState","activeItem","effectiveVariant","as","ElementType","BottomBar","overflowMenuAriaLabel","overflowOpen","setOverflowOpen","overflowAnchor","setOverflowAnchor","safeVisibleCount","visibleItems","overflowItems","hasOverflow","overflowActive","setActive","activateItem","onOverflowToggle","onOverflowClose","BarItem","debounce","debounced","Tab","stacked","tag","easeInOutSin","animate","property","ease","cancelled","cancel","defaultIndicatorStyle","Tabs","indicatorContent","scrollable","mounted","setMounted","indicatorStyle","setIndicatorStyle","tabsRef","tabListRef","contentTabsRef","viewNextTabInPixels","getTabsMeta","tabsNode","tabsMeta","tabMeta","tabContentMeta","tab","updateIndicatorState","startValue","newIndicatorStyle","dStart","dSize","scroll","scrollValue","scrollSelectedIntoView","nextScrollStart","window","resizeObserver","tabs"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/utils/observable.ts","../src/hooks/useObservable.ts","../src/hooks/useSafeLayoutEffect.ts","../src/hooks/useTheme.ts","../src/hooks/useControllableState.ts","../src/hooks/useId.ts","../src/hooks/useFocusTrap.ts","../src/hooks/useRovingTabIndex.ts","../src/hooks/useVirtualList.ts","../src/components/base/icon/icon.tsx","../src/components/base/ripple/ripple.tsx","../src/utils/setRef.ts","../src/hooks/useForkRef.ts","../src/components/base/animateHeight/animateHeight.tsx","../src/components/dataDisplay/accordion/accordion.tsx","../src/components/inputs/button/button.tsx","../src/components/dataDisplay/expansionPanel/expansionPanel.tsx","../src/components/dataDisplay/chat/chatIconButton.tsx","../src/components/inputs/floatingButton/floatingButton.tsx","../src/components/inputs/textField/utils.ts","../src/components/inputs/textField/textFieldAdornment.tsx","../src/components/inputs/textField/textFieldWrapper.tsx","../src/components/inputs/textField/textField.tsx","../src/components/dataDisplay/chat/types.ts","../src/components/dataDisplay/chat/utils.ts","../src/components/dataDisplay/chat/chatComposer.tsx","../src/components/dataDisplay/chat/chatHeader.tsx","../src/components/dataDisplay/typography/typography.tsx","../src/components/dataDisplay/chat/chatAttachmentImage.tsx","../src/components/dataDisplay/chat/chatAttachments.tsx","../src/components/dataDisplay/avatar/avatar.tsx","../src/components/dataDisplay/chat/chatMessageAvatar.tsx","../src/components/dataDisplay/chat/chatMessageStatus.tsx","../src/components/dataDisplay/chat/chatMessageBubble.tsx","../src/components/dataDisplay/chat/chatMessageIncoming.tsx","../src/components/dataDisplay/chat/chatMessageOutgoing.tsx","../src/components/dataDisplay/chat/chatMessageSystem.tsx","../src/components/dataDisplay/chat/chatMessageItem.tsx","../src/components/feedBack/skeleton/skeleton.tsx","../src/components/dataDisplay/chat/chatMessageSkeleton.tsx","../src/components/dataDisplay/chat/useChatInfiniteScroll.ts","../src/components/dataDisplay/chat/useChatStickToBottom.ts","../src/components/dataDisplay/chat/chatMessages.tsx","../src/components/dataDisplay/chat/chatShell.tsx","../src/components/dataDisplay/chat/useChatFileUpload.ts","../src/components/dataDisplay/chat/chat.tsx","../src/components/dataDisplay/chat/chatLayout.tsx","../src/components/dataDisplay/badge/badge.tsx","../src/components/dataDisplay/card/card.tsx","../src/components/dataDisplay/chip/chip.tsx","../src/components/dataDisplay/chipGroup/chipGroup.tsx","../src/components/dataDisplay/lazyImage/lazyImage.tsx","../src/components/dataDisplay/thumbCard/thumbCard.tsx","../src/components/dataDisplay/assetGrid/assetGrid.tsx","../src/components/feedBack/modal/modal.tsx","../src/components/dataDisplay/carousel/utils.ts","../src/hooks/useEventCallback.ts","../src/components/dataDisplay/carousel/carousel.tsx","../src/hooks/useModalState.ts","../src/components/dataDisplay/imagesList/imagesListContext.tsx","../src/components/dataDisplay/imagesList/imagesListItem/imagesListItem.tsx","../src/components/dataDisplay/imagesList/imagesList.tsx","../src/components/dataDisplay/imagesList/imagesListItem/imagesListItemModal.tsx","../src/components/dataDisplay/list/listItem.tsx","../src/components/dataDisplay/list/list.tsx","../src/components/dataDisplay/table/tablePagination/tablePagination.tsx","../src/components/dataDisplay/table/table.tsx","../src/components/dataDisplay/table/tableBody.tsx","../src/components/dataDisplay/table/tableCell.tsx","../src/components/dataDisplay/table/tableHead.tsx","../src/components/dataDisplay/table/tableHeadCell.tsx","../src/components/dataDisplay/table/tableRow.tsx","../src/components/dataDisplay/treeView/treeView.tsx","../src/components/clickAwayListener/clickAwayListener.tsx","../src/components/feedBack/message/message.tsx","../src/components/feedBack/saveAssetDialog/saveAssetDialog.tsx","../src/components/feedBack/progressIndicator/progressIndicator.tsx","../src/components/feedBack/snackbar/useSnackbarsPortal.ts","../src/components/feedBack/snackbar/snackbar.tsx","../src/utils/floating.ts","../src/components/feedBack/tooltip/tooltip.tsx","../src/components/inputs/buttonGroups/buttonGroup.tsx","../src/components/inputs/checkbox/checkbox.tsx","../src/components/inputs/datePicker/datePickerIconButton.tsx","../src/components/inputs/datePicker/datePickerActionLabel.tsx","../src/components/inputs/datePicker/dateFormat.ts","../src/components/inputs/datePicker/utils.ts","../src/components/inputs/datePicker/dataPickerHeader.tsx","../src/components/inputs/datePicker/datePickerDay.tsx","../src/components/inputs/datePicker/dataPickerDays.tsx","../src/components/navigation/menu/menuContext.ts","../src/components/navigation/menu/menuItem.tsx","../src/components/navigation/menu/menuItemIcon.tsx","../src/components/navigation/menu/menuItemText.tsx","../src/components/navigation/menu/menuDivider.tsx","../src/components/navigation/menu/menuList.tsx","../src/components/navigation/menu/menuFloating.tsx","../src/components/navigation/menu/menuSubmenu.tsx","../src/components/navigation/menu/menuComponent.tsx","../src/components/navigation/menu/menu.tsx","../src/components/inputs/datePicker/datePickerList.tsx","../src/components/inputs/datePicker/useDateInput.ts","../src/components/inputs/datePicker/dataPickerInput.tsx","../src/components/inputs/datePicker/datePicker.tsx","../src/components/inputs/dateTimePicker/dateTimeFormat.ts","../src/components/inputs/dateTimePicker/useDateTimeInput.ts","../src/components/inputs/dateTimePicker/dateTimePickerInput.tsx","../src/components/inputs/timePicker/timePickerList.tsx","../src/components/inputs/timePicker/timeFormat.ts","../src/components/inputs/timePicker/timeUtils.ts","../src/components/inputs/timePicker/timePickerColumns.tsx","../src/components/inputs/dateTimePicker/dateTimePicker.tsx","../src/components/inputs/timePicker/useTimeInput.ts","../src/components/inputs/timePicker/timePickerInput.tsx","../src/components/inputs/timePicker/timePicker.tsx","../src/components/inputs/radioButton/radioButton.tsx","../src/components/inputs/rating/rating.tsx","../src/components/inputs/selectField/dropdownMenu.tsx","../src/components/inputs/selectField/selectField.tsx","../src/components/inputs/slider/utils.ts","../src/components/inputs/slider/slider.tsx","../src/components/inputs/valueSlider/valueSlider.tsx","../src/components/inputs/toggle/toggle.tsx","../src/components/layout/grid/grid.tsx","../src/components/layout/divider/divider.tsx","../src/utils/throttle.ts","../src/components/layout/screenDivider/screenDivider.tsx","../src/components/layout/sheet/sheet.tsx","../src/components/layout/stack/stack.tsx","../src/components/layout/page/page.tsx","../src/components/layout/pageHeader/pageHeader.tsx","../src/components/layout/appLayout/appLayout.tsx","../src/components/navigation/appBar/appBar.tsx","../src/components/navigation/breadcrumbs/breadcrumbs.tsx","../src/components/navigation/pagination/pagination.tsx","../src/components/navigation/stepper/stepper.tsx","../src/components/navigation/overflowMenu/overflowMenu.tsx","../src/components/navigation/sidebar/sidebar.tsx","../src/components/navigation/bottomBar/bottomBar.tsx","../src/utils/debounce.ts","../src/components/navigation/tabs/tab/tab.tsx","../src/utils/animate.ts","../src/components/navigation/tabs/tabs.tsx"],"sourcesContent":["export type Listener<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\n\nexport class Observable<T> {\n private cbs: Listener<T>[] = [];\n private _value: T;\n\n constructor(value: T) {\n this._value = value;\n }\n\n public setValue(value: T) {\n if (this.value === value) {\n return;\n }\n this._value = value;\n for (const cb of this.cbs) {\n cb(value);\n }\n }\n\n public get value(): T {\n return this._value;\n }\n\n public subscribe(cb: Listener<T>): Unsubscriber {\n this.cbs.push(cb);\n return () => {\n this.cbs = this.cbs.filter((l) => l !== cb);\n };\n }\n}\n","import { useState, useEffect } from \"react\";\nimport { Observable } from \"../utils/observable\";\nexport function useObservable<T>(observable: Observable<T>): T {\n const [val, setVal] = useState<T>(observable.value);\n useEffect(() => {\n setVal(observable.value);\n return observable.subscribe(setVal);\n }, [observable]);\n return val;\n}\n","import React from \"react\";\n\nexport const useSafeLayoutEffect = typeof window === \"undefined\" ? React.useEffect : React.useLayoutEffect;\n","import { useEffect, useRef } from \"react\";\nimport { Observable } from \"../utils/observable\";\nimport { useObservable } from \"./useObservable\";\nimport { useSafeLayoutEffect } from \"./useSafeLayoutEffect\";\n\nexport enum Theme {\n dark = \"dark\",\n light = \"light\",\n}\n\nconst themeStorageKey = \"smui-theme\";\n\nconst themeObservable = new Observable<Theme>(Theme.light);\n\nconst useTheme = () => {\n const theme = useObservable(themeObservable);\n // Начальная инициализация\n const firstUpdate = useRef(true);\n useSafeLayoutEffect(() => {\n const savedTheme = localStorage.getItem(themeStorageKey) as Theme;\n if (firstUpdate.current) {\n firstUpdate.current = false;\n if (savedTheme) {\n themeObservable.setValue(savedTheme);\n document.documentElement.dataset.theme = savedTheme;\n } else {\n const defaultTheme: Theme = window.matchMedia(\"(prefers-color-scheme: light)\").matches\n ? Theme.light\n : Theme.dark;\n if (savedTheme !== theme) {\n themeObservable.setValue(defaultTheme);\n }\n localStorage.setItem(themeStorageKey, defaultTheme);\n document.documentElement.dataset.theme = defaultTheme;\n }\n }\n }, [theme]);\n\n const themeListener = function (event: StorageEvent) {\n if (event.storageArea === localStorage) {\n const savedTheme = localStorage.getItem(themeStorageKey) as Theme;\n document.documentElement.dataset.theme = savedTheme;\n themeObservable.setValue(savedTheme);\n }\n };\n\n useEffect(() => {\n window.addEventListener(\"storage\", themeListener);\n return () => window.removeEventListener(\"storage\", themeListener);\n }, []);\n\n return {\n theme,\n setTheme: (value: Theme) => {\n localStorage.setItem(themeStorageKey, value);\n themeObservable.setValue.bind(themeObservable)(value);\n document.documentElement.dataset.theme = value;\n },\n };\n};\n\nexport default useTheme;\n","import { useCallback, useRef, useState } from \"react\";\n\ntype Updater<T> = T | ((prev: T) => T);\n\nexport interface UseControllableStateParams<T> {\n /** Controlled value. When defined the hook is in controlled mode. */\n value?: T;\n /** Initial value for uncontrolled mode. */\n defaultValue: T;\n /** Called whenever the value should change (both modes). */\n onChange?: (next: T) => void;\n}\n\n/**\n * Controlled/uncontrolled state helper.\n *\n * - If `value` is provided the hook is controlled: it always returns `value`\n * and `setValue` only calls `onChange`.\n * - Otherwise it keeps internal state seeded from `defaultValue` and also\n * calls `onChange`.\n *\n * @returns `[value, setValue]`\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateParams<T>): [T, (next: Updater<T>) => void] {\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<T>(defaultValue);\n\n const current = isControlled ? (value as T) : internal;\n\n // keep latest value / onChange without resubscribing consumers\n const currentRef = useRef(current);\n currentRef.current = current;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: Updater<T>) => {\n const prev = currentRef.current;\n const resolved = typeof next === \"function\" ? (next as (p: T) => T)(prev) : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n onChangeRef.current?.(resolved);\n },\n [isControlled]\n );\n\n return [current, setValue];\n}\n\nexport default useControllableState;\n","import { useId as useReactId } from \"react\";\n\n/**\n * Stable unique id for ARIA wiring (label htmlFor, aria-describedby,\n * aria-controls, …). Wraps React 18's `useId` and:\n * - returns the caller-supplied `idProp` verbatim when provided, so an\n * explicit `id` always wins;\n * - otherwise produces a deterministic, SSR-safe id, optionally prefixed.\n */\nexport function useId(idProp?: string, prefix = \"smwb\"): string {\n const generated = useReactId();\n return idProp ?? `${prefix}-${generated.replace(/[:]/g, \"\")}`;\n}\n\nexport default useId;\n","import { RefObject, useEffect, useRef } from \"react\";\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nexport interface UseFocusTrapOptions {\n /** Trap is active only while true. */\n active: boolean;\n /** Restore focus to the previously focused element on deactivate. */\n restoreFocus?: boolean;\n /** Focus the first focusable element on activate. */\n autoFocus?: boolean;\n}\n\n/**\n * Confines Tab/Shift+Tab focus within `containerRef` while `active`.\n * Restores focus to the previously focused element on teardown.\n */\nexport function useFocusTrap<T extends HTMLElement>(\n containerRef: RefObject<T>,\n { active, restoreFocus = true, autoFocus = true }: UseFocusTrapOptions\n): void {\n const prevFocused = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!active) {\n return;\n }\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n prevFocused.current = document.activeElement as HTMLElement | null;\n\n const focusables = () =>\n Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.offsetParent !== null || el === document.activeElement\n );\n\n if (autoFocus) {\n const first = focusables()[0];\n (first ?? container).focus({ preventScroll: true });\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\") {\n return;\n }\n const items = focusables();\n if (items.length === 0) {\n event.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const activeEl = document.activeElement;\n\n if (event.shiftKey && activeEl === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && activeEl === last) {\n event.preventDefault();\n first.focus();\n } else if (!container.contains(activeEl)) {\n event.preventDefault();\n first.focus();\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n if (restoreFocus && prevFocused.current) {\n prevFocused.current.focus({ preventScroll: true });\n }\n };\n }, [active, autoFocus, restoreFocus, containerRef]);\n}\n\nexport default useFocusTrap;\n","import { KeyboardEvent, useCallback } from \"react\";\n\nexport interface UseRovingTabIndexOptions {\n /** Number of focusable items. */\n count: number;\n /** Current active index. */\n activeIndex: number;\n /** Called with the next index when navigation keys are pressed. */\n onMove: (nextIndex: number) => void;\n /** Arrow-key axis. */\n orientation?: \"horizontal\" | \"vertical\" | \"both\";\n /** Wrap around the ends (default true). */\n loop?: boolean;\n /** Optional predicate to skip disabled items. */\n isDisabled?: (index: number) => boolean;\n}\n\n/**\n * Keyboard navigation for composite widgets (tabs, menus, trees, pagination).\n * Returns an `onKeyDown` handler implementing Arrow/Home/End with optional\n * looping and disabled-skipping. The consumer owns focus/activation.\n */\nexport function useRovingTabIndex({\n count,\n activeIndex,\n onMove,\n orientation = \"horizontal\",\n loop = true,\n isDisabled,\n}: UseRovingTabIndexOptions) {\n return useCallback(\n (event: KeyboardEvent) => {\n if (count === 0) {\n return;\n }\n const horiz = orientation === \"horizontal\" || orientation === \"both\";\n const vert = orientation === \"vertical\" || orientation === \"both\";\n const next = (horiz && event.key === \"ArrowRight\") || (vert && event.key === \"ArrowDown\");\n const prev = (horiz && event.key === \"ArrowLeft\") || (vert && event.key === \"ArrowUp\");\n\n let target: number | null = null;\n if (next) {\n target = activeIndex + 1;\n } else if (prev) {\n target = activeIndex - 1;\n } else if (event.key === \"Home\") {\n target = 0;\n } else if (event.key === \"End\") {\n target = count - 1;\n }\n if (target === null) {\n return;\n }\n\n const clamp = (i: number) => (loop ? (i + count) % count : Math.max(0, Math.min(count - 1, i)));\n target = clamp(target);\n\n if (isDisabled) {\n let guard = 0;\n const step = next || event.key === \"Home\" ? 1 : -1;\n while (isDisabled(target) && guard < count) {\n target = clamp(target + step);\n guard += 1;\n }\n if (isDisabled(target)) {\n return;\n }\n }\n\n event.preventDefault();\n onMove(target);\n },\n [count, activeIndex, onMove, orientation, loop, isDisabled]\n );\n}\n\nexport default useRovingTabIndex;\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseVirtualListParams {\n /** Total number of items. */\n itemCount: number;\n /** Fixed height (px) of a single item. */\n itemHeight: number;\n /** Visible viewport height (px). */\n viewportHeight: number;\n /** Extra rows rendered above/below the viewport. */\n overscan?: number;\n}\n\nexport interface UseVirtualListResult {\n /** First (inclusive) index to render. */\n startIndex: number;\n /** Last (exclusive) index to render. */\n endIndex: number;\n /** Total scrollable height (px) for the spacer. */\n totalHeight: number;\n /** Pixel offset of the first rendered item (translateY). */\n offsetY: number;\n /** Attach to the scroll container's `onScroll`. */\n onScroll: (event: { currentTarget: { scrollTop: number } }) => void;\n}\n\n/**\n * Minimal fixed-height windowing helper (no dependencies).\n *\n * Render only `[startIndex, endIndex)` inside a `position: relative`\n * container of `totalHeight`, translated by `offsetY`.\n */\nexport function useVirtualList({\n itemCount,\n itemHeight,\n viewportHeight,\n overscan = 4,\n}: UseVirtualListParams): UseVirtualListResult {\n const [scrollTop, setScrollTop] = useState(0);\n\n const onScroll = useCallback((event: { currentTarget: { scrollTop: number } }) => {\n setScrollTop(event.currentTarget.scrollTop);\n }, []);\n\n return useMemo(() => {\n const safeItemHeight = itemHeight > 0 ? itemHeight : 1;\n const visibleCount = Math.ceil(viewportHeight / safeItemHeight);\n const startIndex = Math.max(0, Math.floor(scrollTop / safeItemHeight) - overscan);\n const endIndex = Math.min(itemCount, startIndex + visibleCount + overscan * 2);\n\n return {\n startIndex,\n endIndex,\n totalHeight: itemCount * safeItemHeight,\n offsetY: startIndex * safeItemHeight,\n onScroll,\n };\n }, [itemCount, itemHeight, viewportHeight, overscan, scrollTop, onScroll]);\n}\n\nexport default useVirtualList;\n","import { forwardRef, HTMLAttributes } from \"react\";\nimport cn from \"clsx\";\n\nexport type IconColor = \"inherit\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\" | \"disabled\";\n\nexport interface IconProps extends HTMLAttributes<HTMLSpanElement> {\n /**\n * Icon name from https://fonts.google.com/icons\n * Пример: name={\"arrow_right_alt\"}\n */\n name: string;\n className?: string;\n weight?: number;\n fill?: 0 | 1;\n /** Pixel number or any CSS length (e.g. \"1.5rem\"). */\n size?: number | string;\n grade?: number;\n /**\n * Semantic color token; `inherit` (default) keeps the text color.\n * Any string is accepted for backward compatibility, but only known\n * {@link IconColor} tokens emit a color class.\n */\n color?: IconColor | (string & {});\n /**\n * Accessible name. When provided the icon is exposed as\n * `role=\"img\"`; otherwise it is `aria-hidden` (decorative).\n */\n title?: string;\n}\n\nexport const Icon = forwardRef<HTMLSpanElement, IconProps>(function Icon(\n { className, weight = 400, fill = 0, size = 20, grade = 100, name, color = \"inherit\", title, ...props },\n ref\n) {\n const decorative = title === undefined;\n const colorClass =\n color && [\"primary\", \"secondary\", \"error\", \"success\", \"warning\", \"info\", \"disabled\"].includes(color)\n ? `smwb-icon_color-${color}`\n : null;\n return (\n <span\n {...props}\n ref={ref}\n data-testid=\"icon\"\n role={decorative ? undefined : \"img\"}\n aria-hidden={decorative ? true : undefined}\n aria-label={title}\n title={title}\n style={{ ...props.style, fontVariationSettings: `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' 48` }}\n className={cn(\"smwb-icon__wrapper\", colorClass, className)}\n >\n <span className=\"material-symbols-outlined\" style={{ fontSize: typeof size === \"number\" ? `${size}px` : size }}>\n {name}\n </span>\n </span>\n );\n});\n\nexport default Icon;\n","import React, { forwardRef } from \"react\";\nimport cn from \"clsx\";\n\nexport interface RippleActionsRef {\n onRipple: (event: React.MouseEvent) => void;\n}\n\nexport interface RippleClasses {\n ripple?: string;\n child?: string;\n}\n\nexport interface RippleProps extends React.HTMLAttributes<HTMLSpanElement> {\n actionRef: React.Ref<RippleActionsRef>;\n classes?: RippleClasses;\n center?: boolean;\n /** Ripple lifetime in ms. */\n duration?: number;\n /** Ripple color (any CSS color). Defaults to inherited currentColor. */\n color?: string;\n}\n\n/**\n * ⚠️ Для правильной работы этого эффекта, установите у компонента родителя CSS: **position: relative;**\n */\n\nexport const Ripple = forwardRef<HTMLSpanElement, RippleProps>(function Ripple(\n { actionRef, className, classes, center, style, duration = 600, color, ...rest },\n ref\n) {\n const [ripples, setRipples] = React.useState<React.ReactNode[]>([]);\n const nextKey = React.useRef<number>(0);\n\n React.useImperativeHandle(\n actionRef,\n () => ({\n onRipple(event: React.MouseEvent) {\n const target = event.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n const diameter = Math.max(rect.width, rect.height);\n const radius = diameter / 2;\n\n let coordX;\n let coordY;\n\n if (center) {\n coordX = rect.width > rect.height ? 0 : rect.width / 2 - radius;\n coordY = rect.height > rect.width ? 0 : rect.height / 2 - radius;\n } else {\n coordX = event.clientX - rect.left - radius;\n coordY = event.clientY - rect.top - radius;\n }\n\n setRipples([\n ...ripples,\n <span\n key={nextKey.current}\n className={cn(\"smwb-ripple__child\", classes?.child)}\n style={{\n ...style,\n left: coordX,\n top: coordY,\n width: diameter,\n height: diameter,\n backgroundColor: color ?? style?.backgroundColor,\n }}\n {...rest}\n />,\n ]);\n\n nextKey.current += 1;\n\n setTimeout(() => {\n setRipples((prevRipples) => prevRipples.slice(1));\n }, duration);\n },\n }),\n [rest, center, ripples, classes?.child, style, duration, color]\n );\n\n return (\n <span ref={ref} className={cn(\"smwb-ripple\", className, classes?.ripple)} data-testid=\"ripple\" aria-hidden=\"true\">\n {ripples}\n </span>\n );\n});\n","import React from \"react\";\n\nexport function setRef<T>(\n ref: React.MutableRefObject<T | null> | ((instance: T | null) => void) | null | undefined,\n value: T | null\n): void {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n","import React from \"react\";\nimport { setRef } from \"../utils/setRef\";\n\nexport function useForkRef<Instance>(\n ...refs: Array<React.Ref<Instance> | undefined>\n): React.RefCallback<Instance> | null {\n /**\n * This will create a new function if the refs passed to this hook change and are all defined.\n * This means react will call the old forkRef with `null` and the new forkRef\n * with the ref. Cleanup naturally emerges from this behavior.\n */\n return React.useMemo(() => {\n if (refs.every((ref) => ref == null)) {\n return null;\n }\n\n return (instance) => {\n refs.forEach((ref) => {\n setRef(ref, instance);\n });\n };\n // TODO need qualification\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n","// https://github.com/Stanko/react-animate-height/blob/v3/src/index.tsx\n// MIT License\n//\n// Copyright (c) 2017 - today Stanko Tadić\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n//\n\nimport React, { CSSProperties, forwardRef, useEffect, useRef, useState } from \"react\";\nimport classNames from \"clsx\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\n// ------------------ Types\n\nexport type Height = \"auto\" | number | `${number}%`;\ntype Timeout = ReturnType<typeof setTimeout>;\ntype Overflow = \"auto\" | \"visible\" | \"hidden\" | undefined;\ntype AnimationStateClasses = {\n animating: string;\n animatingUp: string;\n animatingDown: string;\n animatingToHeightZero: string;\n animatingToHeightAuto: string;\n animatingToHeightSpecific: string;\n static: string;\n staticHeightZero: string;\n staticHeightAuto: string;\n staticHeightSpecific: string;\n};\n\n// ------------------ Helpers\n\nfunction isNumber(n: string) {\n const number = parseFloat(n);\n return !isNaN(number) && isFinite(number);\n}\n\nfunction isPercentage(height: Height) {\n // Percentage height\n return (\n typeof height === \"string\" && height[height.length - 1] === \"%\" && isNumber(height.substring(0, height.length - 1))\n );\n}\n\nfunction hideContent(element: HTMLDivElement | null, height: Height) {\n // Check for element?.style is added cause this would fail in tests (react-test-renderer)\n // Read more here: https://github.com/Stanko/react-animate-height/issues/17\n if (height === 0 && element?.style) {\n element.style.display = \"none\";\n }\n}\n\nfunction showContent(element: HTMLDivElement | null, height: Height) {\n // Check for element?.style is added cause this would fail in tests (react-test-renderer)\n // Read more here: https://github.com/Stanko/react-animate-height/issues/17\n if (height === 0 && element?.style) {\n element.style.display = \"\";\n }\n}\n\nconst ANIMATION_STATE_CLASSES: AnimationStateClasses = {\n animating: \"rah-animating\",\n animatingUp: \"rah-animating--up\",\n animatingDown: \"rah-animating--down\",\n animatingToHeightZero: \"rah-animating--to-height-zero\",\n animatingToHeightAuto: \"rah-animating--to-height-auto\",\n animatingToHeightSpecific: \"rah-animating--to-height-specific\",\n static: \"rah-static\",\n staticHeightZero: \"rah-static--height-zero\",\n staticHeightAuto: \"rah-static--height-auto\",\n staticHeightSpecific: \"rah-static--height-specific\",\n};\n\nfunction getStaticStateClasses(animationStateClasses: AnimationStateClasses, height: Height) {\n return classNames({\n [animationStateClasses.static]: true,\n [animationStateClasses.staticHeightZero]: height === 0,\n [animationStateClasses.staticHeightSpecific]: typeof height === \"number\" && height > 0,\n [animationStateClasses.staticHeightAuto]: height === \"auto\",\n });\n}\n\n// ------------------ Component\n\n// display and height are set by the component itself, therefore ignored\ntype OmitCSSProperties = \"display\" | \"height\";\n\ninterface AnimateHeightProps extends React.HTMLAttributes<HTMLDivElement> {\n animateOpacity?: boolean;\n animationStateClasses?: AnimationStateClasses;\n applyInlineTransitions?: boolean;\n contentClassName?: string;\n delay?: number;\n duration?: number;\n easing?: string;\n height: Height;\n onHeightAnimationEnd?: (newHeight: Height) => void;\n onHeightAnimationStart?: (newHeight: Height) => void;\n style?: Omit<CSSProperties, OmitCSSProperties>;\n}\n\nconst AnimateHeight = forwardRef<HTMLDivElement, AnimateHeightProps>(function AnimateHeight(\n {\n animateOpacity = false,\n animationStateClasses = {},\n applyInlineTransitions = true,\n children,\n className = \"\",\n contentClassName,\n delay: userDelay = 0,\n duration: userDuration = 300,\n easing = \"ease\",\n height,\n onHeightAnimationEnd,\n onHeightAnimationStart,\n style,\n ...props\n },\n ref\n) {\n // ------------------ Initialization\n const prevHeight = useRef<Height>(height);\n const contentElement = useRef<HTMLDivElement>(null);\n const rootElement = useRef<HTMLDivElement>(null);\n const forkedRootRef = useForkRef<HTMLDivElement>(ref, rootElement);\n\n const animationClassesTimeoutID = useRef<Timeout>();\n const timeoutID = useRef<Timeout>();\n\n const stateClasses = useRef<AnimationStateClasses>({\n ...ANIMATION_STATE_CLASSES,\n ...animationStateClasses,\n });\n\n const delay = userDelay;\n const duration = userDuration;\n\n let initHeight: Height = height;\n let initOverflow: Overflow = \"visible\";\n\n if (typeof initHeight === \"number\") {\n // Reset negative height to 0\n initHeight = typeof height !== \"number\" || height < 0 ? 0 : height;\n initOverflow = \"hidden\";\n } else if (isPercentage(initHeight)) {\n // If value is string \"0%\" make sure we convert it to number 0\n initHeight = height === \"0%\" ? 0 : height;\n initOverflow = \"hidden\";\n }\n\n const [currentHeight, setCurrentHeight] = useState<Height>(initHeight);\n const [overflow, setOverflow] = useState<Overflow>(initOverflow);\n const [useTransitions, setUseTransitions] = useState<boolean>(false);\n const [animationStateClassNames, setAnimationStateClassNames] = useState<string>(\n getStaticStateClasses(stateClasses.current, height)\n );\n\n // ------------------ Did mount\n useEffect(() => {\n // Hide content if height is 0 (to prevent tabbing into it)\n hideContent(contentElement.current, currentHeight);\n\n // This should be explicitly run only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ------------------ Height update\n useEffect(() => {\n if (height !== prevHeight.current && contentElement.current) {\n showContent(contentElement.current, prevHeight.current);\n\n // Cache content height\n contentElement.current.style.overflow = \"hidden\";\n const contentHeight = contentElement.current.offsetHeight;\n contentElement.current.style.overflow = \"\";\n\n // set total animation time\n const totalDuration = duration + delay;\n\n let newHeight: Height;\n let timeoutHeight: Height;\n let timeoutOverflow: Overflow = \"hidden\";\n let timeoutUseTransitions: boolean;\n\n const isCurrentHeightAuto = prevHeight.current === \"auto\";\n\n if (typeof height === \"number\") {\n // Reset negative height to 0\n newHeight = height < 0 ? 0 : height;\n timeoutHeight = newHeight;\n } else if (isPercentage(height)) {\n // If value is string \"0%\" make sure we convert it to number 0\n newHeight = height === \"0%\" ? 0 : height;\n timeoutHeight = newHeight;\n } else {\n // If not, animate to content height\n // and then reset to auto\n newHeight = contentHeight; // TODO solve contentHeight = 0\n timeoutHeight = \"auto\";\n timeoutOverflow = undefined;\n }\n\n if (isCurrentHeightAuto) {\n // This is the height to be animated to\n timeoutHeight = newHeight;\n\n // If previous height was 'auto'\n // set starting height explicitly to be able to use transition\n newHeight = contentHeight;\n }\n\n // Animation classes\n const newAnimationStateClassNames = classNames({\n [stateClasses.current.animating]: true,\n [stateClasses.current.animatingUp]: prevHeight.current === \"auto\" || height < prevHeight.current,\n [stateClasses.current.animatingDown]: height === \"auto\" || height > prevHeight.current,\n [stateClasses.current.animatingToHeightZero]: timeoutHeight === 0,\n [stateClasses.current.animatingToHeightAuto]: timeoutHeight === \"auto\",\n [stateClasses.current.animatingToHeightSpecific]: typeof timeoutHeight === \"number\" && timeoutHeight > 0,\n });\n\n // Animation classes to be put after animation is complete\n const timeoutAnimationStateClasses = getStaticStateClasses(stateClasses.current, timeoutHeight);\n\n // Set starting height and animating classes\n // When animating from 'auto' we first need to set fixed height\n // that change should be animated\n setCurrentHeight(newHeight);\n setOverflow(\"hidden\");\n setUseTransitions(!isCurrentHeightAuto);\n setAnimationStateClassNames(newAnimationStateClassNames);\n\n // Clear timeouts\n clearTimeout(timeoutID.current);\n clearTimeout(animationClassesTimeoutID.current);\n\n if (isCurrentHeightAuto) {\n // When animating from 'auto' we use a short timeout to start animation\n // after setting fixed height above\n timeoutUseTransitions = true;\n\n // Short timeout to allow rendering of the initial animation state first\n timeoutID.current = setTimeout(() => {\n setCurrentHeight(timeoutHeight);\n setOverflow(timeoutOverflow);\n setUseTransitions(timeoutUseTransitions);\n\n // ANIMATION STARTS, run a callback if it exists\n onHeightAnimationStart?.(timeoutHeight);\n }, 50);\n\n // Set static classes and remove transitions when animation ends\n animationClassesTimeoutID.current = setTimeout(() => {\n setUseTransitions(false);\n setAnimationStateClassNames(timeoutAnimationStateClasses);\n\n // ANIMATION ENDS\n // Hide content if height is 0 (to prevent tabbing into it)\n hideContent(contentElement.current, timeoutHeight);\n // Run a callback if it exists\n onHeightAnimationEnd?.(timeoutHeight);\n }, totalDuration);\n } else {\n // ANIMATION STARTS, run a callback if it exists\n onHeightAnimationStart?.(newHeight);\n\n // Set end height, classes and remove transitions when animation is complete\n timeoutID.current = setTimeout(() => {\n setCurrentHeight(timeoutHeight);\n setOverflow(timeoutOverflow);\n setUseTransitions(false);\n setAnimationStateClassNames(timeoutAnimationStateClasses);\n\n // ANIMATION ENDS\n // If height is auto, don't hide the content\n // (case when element is empty, therefore height is 0)\n if (height !== \"auto\") {\n // Hide content if height is 0 (to prevent tabbing into it)\n hideContent(contentElement.current, newHeight); // TODO solve newHeight = 0\n }\n // Run a callback if it exists\n onHeightAnimationEnd?.(newHeight);\n }, totalDuration);\n }\n }\n\n prevHeight.current = height;\n\n return () => {\n clearTimeout(timeoutID.current);\n clearTimeout(animationClassesTimeoutID.current);\n };\n\n // This should be explicitly run only on height change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [height]);\n\n // ------------------ Render\n\n const componentStyle: CSSProperties = {\n ...style,\n height: currentHeight,\n overflow: overflow || style?.overflow,\n };\n\n if (useTransitions && applyInlineTransitions) {\n componentStyle.transition = `height ${duration}ms ${easing} ${delay}ms`;\n\n // Include transition passed through styles\n if (style?.transition) {\n componentStyle.transition = `${style.transition}, ${componentStyle.transition}`;\n }\n\n // Add webkit vendor prefix still used by opera, blackberry...\n componentStyle.WebkitTransition = componentStyle.transition;\n }\n\n const contentStyle: CSSProperties = {};\n\n if (animateOpacity) {\n contentStyle.transition = `opacity ${duration}ms ${easing} ${delay}ms`;\n // Add webkit vendor prefix still used by opera, blackberry...\n contentStyle.WebkitTransition = contentStyle.transition;\n\n if (currentHeight === 0) {\n contentStyle.opacity = 0;\n }\n }\n\n // Check if user passed aria-hidden prop\n const hasAriaHiddenProp = typeof props[\"aria-hidden\"] !== \"undefined\";\n const ariaHidden = hasAriaHiddenProp ? props[\"aria-hidden\"] : height === 0;\n\n return (\n <div\n {...props}\n ref={forkedRootRef}\n aria-hidden={ariaHidden}\n className={`${animationStateClassNames} ${className}`}\n style={componentStyle}\n >\n <div className={contentClassName} style={contentStyle} ref={contentElement}>\n {children}\n </div>\n </div>\n );\n});\n\nexport default AnimateHeight;\n","import React, { forwardRef, ReactNode, useState } from \"react\";\nimport cn from \"clsx\";\nimport AnimateHeight from \"../../base/animateHeight/animateHeight\";\nimport Icon from \"../../base/icon/icon\";\nimport { useId } from \"../../../hooks/useId\";\n\nexport interface AccordionProps {\n className?: string;\n title?: string;\n isOpenByDefault?: boolean;\n /** Controlled open state. When set, the component is controlled. */\n open?: boolean;\n /** Disable toggling. */\n disabled?: boolean;\n /** Custom expand icon (replaces the default chevron). */\n icon?: ReactNode;\n id?: string;\n children?: React.ReactNode;\n startAdornment?: (isOpen: boolean) => React.ReactNode;\n noIcon?: boolean;\n onToggleClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n /** Fired with the next open state on toggle. */\n onChange?: (open: boolean) => void;\n}\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(function Accordion(\n {\n className,\n title,\n isOpenByDefault = false,\n open,\n disabled,\n icon,\n id: idProp,\n children,\n startAdornment,\n noIcon,\n onToggleClick,\n onChange,\n },\n ref\n) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(isOpenByDefault);\n const isOpen = isControlled ? !!open : internalOpen;\n const baseId = useId(idProp);\n const contentId = `${baseId}-content`;\n const headerId = `${baseId}-header`;\n\n const arrowIconClasses = cn(\"smwb-accordion__arrow-icon\", { \"smwb-accordion__arrow-icon_opened\": isOpen });\n\n const toggle = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (disabled) {\n return;\n }\n const next = !isOpen;\n if (!isControlled) {\n setInternalOpen(next);\n }\n onChange?.(next);\n onToggleClick?.(e);\n };\n\n return (\n <div ref={ref} className={cn(\"smwb-accordion\", { \"smwb-disabled\": disabled }, className)} data-testid=\"accordion\">\n <button\n id={headerId}\n className=\"smwb-accordion__header\"\n onClick={toggle}\n type=\"button\"\n disabled={disabled}\n aria-expanded={isOpen}\n aria-controls={children ? contentId : undefined}\n >\n {startAdornment?.(isOpen)}\n <span className=\"smwb-accordion__title\">{title}</span>\n {!noIcon && (icon ?? <Icon className={arrowIconClasses} name=\"expand_more\" size={24} />)}\n </button>\n\n {children && (\n <div id={contentId} role=\"region\" aria-labelledby={headerId}>\n <AnimateHeight\n height={isOpen ? \"auto\" : 0}\n animateOpacity={true}\n duration={300}\n className=\"smwb-accordion__content\"\n >\n {children}\n </AnimateHeight>\n </div>\n )}\n </div>\n );\n});\n\nexport default Accordion;\n","import React, { PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport { Icon, IconProps } from \"../../base/icon\";\n\nexport interface ButtonProps extends React.HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\n /**\n * Текст на кнопке.\n */\n label?: string;\n\n /**\n * Вариант стилизации кнопки.\n */\n variant?: \"contained\" | \"text\" | \"outlined\";\n\n /**\n * Размер кнопки.\n */\n size?: \"small\" | \"medium\" | \"large\";\n\n /**\n * Иконка, которая может быть ReactNode (например, <Icon/>) или строкой (url, base64, и т.д.).\n */\n icon?: React.ReactNode | string;\n\n /**\n * Пропсы для иконки (исключая 'name', если в IconProps оно обязательно).\n */\n iconProps?: Omit<IconProps, \"name\">;\n\n /**\n * @deprecated используйте `color`. Оставлено для обратной совместимости.\n */\n colorTheme?: \"primary\";\n\n /**\n * Семантический цвет кнопки. Резолвится через токены `--smui-*Color*`.\n */\n color?: \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\n /**\n * Ссылка. Если задана, компонент может рендериться как <a>.\n */\n href?: string;\n\n /**\n * Отключённое состояние.\n */\n disabled?: boolean;\n\n /**\n * Тип кнопки.\n */\n type?: \"button\" | \"submit\" | \"reset\";\n\n /**\n * Растягивать кнопку по всей ширине контейнера.\n */\n fullWidth?: boolean;\n\n /**\n * Позиция риппл-эффекта по центру.\n */\n rippleCenter?: boolean;\n\n /**\n * Отключить риппл-эффект.\n */\n disableRipple?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement | HTMLAnchorElement, PropsWithChildren<ButtonProps>>(\n function Button(props, ref) {\n const {\n label,\n variant = \"contained\",\n icon,\n iconProps = {},\n href,\n className,\n disabled,\n children,\n onMouseDown: onMouseDownProp,\n fullWidth,\n rippleCenter,\n disableRipple,\n\n size = \"medium\",\n colorTheme = \"primary\",\n color: colorProp,\n ...rest\n } = props;\n const color = colorProp ?? colorTheme;\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n const classes = cn(\n \"smwb-button\",\n `smwb-${variant}`,\n `smwb-${size}`,\n color === \"primary\" ? \"smwb-primary\" : `smwb-button_color-${color}`,\n className,\n {\n \"smwb-disabled\": disabled,\n \"smwb-full-width\": fullWidth,\n }\n );\n\n const rippleElement = !disableRipple && <Ripple actionRef={rippleRef} center={rippleCenter} />;\n const iconElement = typeof icon === \"string\" ? <Icon {...iconProps} name={icon} /> : icon;\n\n if (href) {\n return (\n <a\n data-testid=\"button-link\"\n ref={ref as React.LegacyRef<HTMLAnchorElement>}\n className={classes}\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {icon && iconElement}\n {label ? label : children}\n {rippleElement}\n </a>\n );\n }\n\n return (\n <button\n data-testid=\"button\"\n ref={ref as React.LegacyRef<HTMLButtonElement>}\n className={classes}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n disabled={!!disabled}\n {...rest}\n >\n {icon && iconElement}\n {label ? label : children}\n {rippleElement}\n </button>\n );\n }\n);\nexport default Button;\n","import React, { forwardRef, ReactNode, useEffect, useState } from \"react\";\nimport cn from \"clsx\";\nimport { createPortal } from \"react-dom\";\nimport Button from \"../../inputs/button/button\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\nexport type ExpansionMode = \"tile\" | \"row\" | \"fullscreen\";\n\nexport interface ExpansionPanelLabels {\n /** Tooltip/aria for the control that expands a tile to a full grid row. */\n expandRow?: string;\n /** Tooltip/aria for the control that collapses a full row back to a tile. */\n collapseRow?: string;\n /** Tooltip/aria for the control that opens the panel fullscreen. */\n expandFullscreen?: string;\n /** Tooltip/aria for the control that closes fullscreen. */\n closeFullscreen?: string;\n /** Text shown in the original slot while the panel is fullscreen. */\n placeholder?: string;\n /** Label of the button in the placeholder that closes fullscreen. */\n placeholderClose?: string;\n}\n\nexport interface ExpansionPanelRenderContext {\n mode: ExpansionMode;\n isFullscreen: boolean;\n isFullRow: boolean;\n}\n\nexport interface ExpansionPanelControlsContext extends ExpansionPanelRenderContext {\n setMode: (next: ExpansionMode | ((current: ExpansionMode) => ExpansionMode)) => void;\n toggleRow: () => void;\n openFullscreen: () => void;\n closeFullscreen: () => void;\n labels: Required<ExpansionPanelLabels>;\n}\n\ntype ExpansionPanelChildren = ReactNode | ((ctx: ExpansionPanelRenderContext) => ReactNode);\ntype ExpansionPanelControls = ReactNode | ((ctx: ExpansionPanelControlsContext) => ReactNode);\n\nexport interface ExpansionPanelProps {\n className?: string;\n /** Content of the panel header (left side of the control bar). */\n header?: ReactNode;\n /** Controlled layout mode. */\n mode?: ExpansionMode;\n /** Initial mode for the uncontrolled component. */\n defaultMode?: ExpansionMode;\n /** Fired with the next mode whenever it changes. */\n onModeChange?: (mode: ExpansionMode) => void;\n /** Render the panel as a plain card without row/fullscreen controls. */\n disableExpand?: boolean;\n /** Hide the built-in control bar (consumer drives `mode` itself). */\n noControls?: boolean;\n /** Replace the built-in row/fullscreen controls with a custom node or render prop. */\n renderControls?: ExpansionPanelControls;\n /** Close fullscreen when the backdrop is clicked. Default: true. */\n closeOnOutsideClick?: boolean;\n /** Close fullscreen when Escape is pressed. Default: true. */\n closeOnEsc?: boolean;\n /** Accessible labels / tooltips for the built-in controls. */\n labels?: ExpansionPanelLabels;\n children?: ExpansionPanelChildren;\n}\n\nconst DEFAULT_LABELS: Required<ExpansionPanelLabels> = {\n expandRow: \"Expand to full row\",\n collapseRow: \"Collapse to grid\",\n expandFullscreen: \"Expand to fullscreen\",\n closeFullscreen: \"Close fullscreen\",\n placeholder: \"Panel is open in fullscreen\",\n placeholderClose: \"Close\",\n};\n\nconst resolveChildren = (children: ExpansionPanelChildren, ctx: ExpansionPanelRenderContext): ReactNode =>\n typeof children === \"function\" ? children(ctx) : children;\n\nconst resolveControls = (controls: ExpansionPanelControls, ctx: ExpansionPanelControlsContext): ReactNode =>\n typeof controls === \"function\" ? controls(ctx) : controls;\n\nexport const ExpansionPanel = forwardRef<HTMLDivElement, ExpansionPanelProps>(function ExpansionPanel(\n {\n className,\n header,\n mode: modeProp,\n defaultMode = \"tile\",\n onModeChange,\n disableExpand = false,\n noControls = false,\n renderControls,\n closeOnOutsideClick = true,\n closeOnEsc = true,\n labels,\n children,\n },\n ref\n) {\n const [mode, setMode] = useControllableState<ExpansionMode>({\n value: modeProp,\n defaultValue: defaultMode,\n onChange: onModeChange,\n });\n\n const l = { ...DEFAULT_LABELS, ...labels };\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n // `disableExpand` renders a plain card regardless of the requested mode,\n // without mutating state — works in both controlled and uncontrolled use.\n const effectiveMode: ExpansionMode = disableExpand ? \"tile\" : mode;\n const isFullRow = effectiveMode === \"row\";\n const isFullscreen = effectiveMode === \"fullscreen\";\n\n const toggleRow = () => setMode((current) => (current === \"row\" ? \"tile\" : \"row\"));\n const openFullscreen = () => setMode(\"fullscreen\");\n const closeFullscreen = () => setMode(\"tile\");\n\n const controlsContext = (overlay: boolean): ExpansionPanelControlsContext => ({\n mode: effectiveMode,\n isFullscreen: overlay,\n isFullRow: overlay ? false : isFullRow,\n setMode,\n toggleRow,\n openFullscreen,\n closeFullscreen,\n labels: l,\n });\n\n const defaultControls = (overlay: boolean) => {\n if (overlay) {\n return (\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n aria-label={l.closeFullscreen}\n title={l.closeFullscreen}\n onClick={closeFullscreen}\n data-testid=\"expansion-panel-close\"\n icon={<Icon name=\"close\" size={18} />}\n />\n );\n }\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n aria-pressed={isFullRow}\n aria-label={isFullRow ? l.collapseRow : l.expandRow}\n title={isFullRow ? l.collapseRow : l.expandRow}\n onClick={toggleRow}\n data-testid=\"expansion-panel-row\"\n icon={<Icon name={isFullRow ? \"grid_view\" : \"table_rows\"} size={18} />}\n />\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n aria-label={l.expandFullscreen}\n title={l.expandFullscreen}\n onClick={openFullscreen}\n data-testid=\"expansion-panel-fullscreen\"\n icon={<Icon name=\"open_in_full\" size={18} />}\n />\n </>\n );\n };\n\n const renderControlBar = (overlay: boolean) => {\n if (disableExpand || noControls) {\n return null;\n }\n\n const content = renderControls\n ? resolveControls(renderControls, controlsContext(overlay))\n : defaultControls(overlay);\n\n if (!content) {\n return null;\n }\n\n return <div className=\"smwb-expansion-panel__controls\">{content}</div>;\n };\n\n useEffect(() => {\n if (!isFullscreen) {\n return;\n }\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, [isFullscreen]);\n\n useEffect(() => {\n if (!isFullscreen || !closeOnEsc) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setMode(\"tile\");\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [isFullscreen, closeOnEsc, setMode]);\n\n const card = (\n <div\n ref={ref}\n className={cn(\"smwb-expansion-panel\", { \"smwb-expansion-panel_row\": isFullRow }, className)}\n data-testid=\"expansion-panel\"\n >\n <div className=\"smwb-expansion-panel__head\">\n <div className=\"smwb-expansion-panel__header\">{header}</div>\n {renderControlBar(false)}\n </div>\n <div className=\"smwb-expansion-panel__body\">\n {resolveChildren(children, {\n mode: effectiveMode,\n isFullscreen: false,\n isFullRow,\n })}\n </div>\n </div>\n );\n\n if (!isFullscreen || !domRoot) {\n return card;\n }\n\n return (\n <>\n <div className=\"smwb-expansion-panel__placeholder\" data-testid=\"expansion-panel-placeholder\">\n <span>{l.placeholder}</span>\n <Button\n type=\"button\"\n variant=\"outlined\"\n size=\"small\"\n label={l.placeholderClose}\n onClick={() => setMode(\"tile\")}\n />\n </div>\n {createPortal(\n <div\n className=\"smwb-expansion-panel__overlay smwb-dark\"\n role=\"dialog\"\n aria-modal=\"true\"\n data-testid=\"expansion-panel-overlay\"\n onClick={\n closeOnOutsideClick\n ? (e) => {\n if (e.target === e.currentTarget) {\n setMode(\"tile\");\n }\n }\n : undefined\n }\n >\n <div className=\"smwb-expansion-panel__dialog\">\n <div className=\"smwb-expansion-panel__head\">\n <div className=\"smwb-expansion-panel__header\">{header}</div>\n {renderControlBar(true)}\n </div>\n <div className=\"smwb-expansion-panel__body smwb-expansion-panel__body_fullscreen\">\n {resolveChildren(children, {\n mode: effectiveMode,\n isFullscreen: true,\n isFullRow: false,\n })}\n </div>\n </div>\n </div>,\n domRoot\n )}\n </>\n );\n});\n\nexport default ExpansionPanel;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\n\nexport interface ChatIconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string;\n edge?: \"start\" | \"end\";\n color?: \"default\" | \"primary\";\n}\n\nexport function ChatIconButton({\n className,\n children,\n disabled,\n edge,\n color = \"default\",\n onMouseDown: onMouseDownProp,\n ...rest\n}: ChatIconButtonProps) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseDownProp?.(event);\n };\n\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n return (\n <button\n type=\"button\"\n className={cn(\n \"smwb-chat-icon-button\",\n edge === \"start\" && \"smwb-chat-icon-button_edge-start\",\n edge === \"end\" && \"smwb-chat-icon-button_edge-end\",\n color === \"primary\" && \"smwb-chat-icon-button_primary\",\n disabled && \"smwb-chat-icon-button_disabled\",\n className\n )}\n disabled={disabled}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {children}\n {!disabled ? <Ripple actionRef={rippleRef} center /> : null}\n </button>\n );\n}\n\nexport default ChatIconButton;\n","import React, { ButtonHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\n\nexport type FloatingButtonColor = \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface FloatingButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string;\n variant?: \"extended\" | \"default\";\n size?: \"small\" | \"medium\" | \"large\";\n /** Semantic color. Resolves through the shared `--smui-*Color*` tokens. */\n color?: FloatingButtonColor;\n}\n\nexport const FloatingButton = React.forwardRef<HTMLButtonElement, FloatingButtonProps>(function FloatingButton(\n {\n children,\n className,\n onMouseDown: onMouseDownProp,\n variant = \"default\",\n size = \"medium\",\n color = \"primary\",\n type = \"button\",\n ...rest\n },\n ref\n) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\"smwb-fab\", `smwb-${variant}`, `smwb-${size}`, `smwb-fab_color-${color}`, className)}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {children}\n <Ripple actionRef={rippleRef} />\n </button>\n );\n});\n\nexport default FloatingButton;\n","import { ElementType } from \"react\";\n\nexport function hasValue(value: unknown) {\n return value != null && !(Array.isArray(value) && value.length === 0);\n}\n\nexport function isFilled(\n obj?: {\n value?: unknown;\n defaultValue?: unknown;\n } | null\n) {\n return obj && ((hasValue(obj.value) && obj.value !== \"\") || (hasValue(obj.defaultValue) && obj.defaultValue !== \"\"));\n}\n\nexport function isHostComponent(element: ElementType) {\n return typeof element === \"string\";\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldProps } from \"./textField\";\n\nexport interface TextFieldAdornmentProps extends Pick<JSX.IntrinsicElements[\"span\"], \"children\" | \"className\"> {\n position?: \"start\" | \"end\";\n disablePointerEvents?: boolean;\n variant?: TextFieldProps[\"variant\"];\n inline?: boolean;\n}\n\nexport function TextFieldAdornment({\n position,\n variant,\n children,\n className,\n disablePointerEvents,\n inline,\n}: TextFieldAdornmentProps) {\n const classes = cn(\n \"smwb-text-field__adornment\",\n className,\n position === \"start\" && \"smwb-text-field__adornment--start\",\n position === \"end\" && \"smwb-text-field__adornment--end\",\n disablePointerEvents && \"smwb-text-field__adornment--disable-pointer\",\n !inline && variant === \"filled\" && \"smwb-text-field__adornment--filled\",\n typeof children === \"string\" && \"smwb-text-field__adornment--text\"\n );\n\n return <span className={classes}>{children}</span>;\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldAdornment } from \"./textFieldAdornment\";\n\nexport interface TextFieldWrapperProps extends React.HTMLAttributes<HTMLDivElement> {\n label?: string;\n helperText?: React.ReactNode;\n variant?: \"outlined\" | \"filled\";\n disabled?: boolean;\n className?: string;\n error?: boolean;\n fullWidth?: boolean;\n isFilledState?: boolean;\n isFocused?: boolean;\n children: React.ReactNode;\n htmlFor?: string;\n shrink?: boolean;\n onHolderMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n inline?: boolean;\n}\n\nexport function TextFieldWrapper({\n label,\n helperText = <>&nbsp;</>,\n variant,\n disabled,\n className,\n error,\n fullWidth,\n isFilledState,\n isFocused,\n htmlFor,\n shrink,\n children,\n onHolderMouseDown,\n startAdornment,\n endAdornment,\n inline,\n ...rest\n}: TextFieldWrapperProps) {\n const isFilledVariant = variant === \"filled\";\n const isNotchedActive = label && (isFilledState || isFocused || shrink);\n\n const classes = cn(className, \"smwb-text-field\", {\n \"smwb-text-field--filled\": !inline && isFilledVariant,\n \"smwb-text-field--inline\": inline,\n \"smwb-text-field--focused\": !inline && isFocused,\n \"smwb-text-field--error\": error,\n \"smwb-text-field--disabled\": disabled,\n \"smwb-text-field--full-width\": fullWidth,\n });\n const labelClasses = cn(\"smwb-text-field__label\", {\n \"smwb-text-field__label--shrink\": isNotchedActive,\n });\n const notchedClasses = cn(\"smwb-text-field__notched\", {\n \"smwb-text-field__notched--with-label\": label,\n \"smwb-text-field__notched--active\": isNotchedActive,\n });\n\n return (\n <div className={classes} {...rest} data-testid=\"text-field\">\n {!inline && label && (\n <label className={labelClasses} htmlFor={htmlFor || \"\"}>\n {label}\n </label>\n )}\n <div className=\"smwb-text-field__input-holder\" onMouseDown={onHolderMouseDown}>\n {startAdornment && (\n <TextFieldAdornment variant={variant} inline={Boolean(inline)} position=\"start\">\n {startAdornment}\n </TextFieldAdornment>\n )}\n {children}\n {endAdornment && <TextFieldAdornment position=\"end\">{endAdornment}</TextFieldAdornment>}\n {!inline && variant === \"outlined\" && (\n <fieldset className={notchedClasses}>\n <legend>{label ? <span>{label}</span> : <span className=\"smwb-notranslate\">&#8203;</span>}</legend>\n </fieldset>\n )}\n </div>\n {!inline && helperText && (\n <p className=\"smwb-text-field__helper-line\">\n <span className=\"smwb-text-field__helper-text\">{helperText}</span>\n </p>\n )}\n </div>\n );\n}\n","import React, { ChangeEventHandler } from \"react\";\nimport cn from \"clsx\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { isFilled } from \"./utils\";\nimport { TextFieldWrapper } from \"./textFieldWrapper\";\n\nexport interface TextFieldProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onBlur\" | \"size\"\n> {\n label?: string;\n helperText?: React.ReactNode;\n variant?: \"outlined\" | \"filled\";\n size?: \"small\" | \"medium\" | \"large\";\n required?: boolean;\n disabled?: boolean;\n value?: string | number;\n className?: string;\n placeholder?: string;\n defaultValue?: string;\n error?: boolean;\n name?: string;\n type?: string;\n readOnly?: boolean;\n fullWidth?: boolean;\n onBlur?: (event: React.FocusEvent<HTMLInputElement>, data: TextFieldProps) => void;\n onChange?: (event: React.ChangeEvent<HTMLInputElement>, data: TextFieldProps) => void;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n id?: string;\n inline?: boolean;\n autoComplete?: string;\n}\n\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(function TextField(props, ref) {\n const {\n label,\n helperText,\n variant = \"outlined\",\n size = \"medium\",\n required,\n className,\n disabled,\n value,\n defaultValue,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n error,\n name,\n type = \"text\",\n readOnly,\n placeholder,\n fullWidth,\n id,\n startAdornment,\n endAdornment,\n inline,\n autoComplete,\n inputMode,\n ...rest\n } = props;\n const [isFocused, setIsFocused] = React.useState<boolean>(false);\n const [isFilledState, setIsFilledState] = React.useState<boolean>(false);\n\n const { current: isControlled } = React.useRef<boolean>(value != null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const inputForkRef = useForkRef<HTMLInputElement>(ref, inputRef);\n\n const onFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (disabled) {\n event.stopPropagation();\n return;\n }\n\n onFocusProp?.(event);\n\n setIsFocused(true);\n };\n\n const onBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (!isControlled) {\n const element = event.target || inputRef.current;\n\n checkDirty({\n value: element.value,\n });\n }\n onBlurProp?.(event, props);\n setIsFocused(false);\n };\n\n const checkDirty = React.useCallback((obj: Parameters<typeof isFilled>[0]) => {\n const filled = Boolean(isFilled(obj));\n setIsFilledState((prev) => (prev === filled ? prev : filled));\n }, []);\n\n const onChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n if (!isControlled) {\n const element = event.target || inputRef.current;\n\n checkDirty({\n value: element.value,\n });\n }\n onChangeProp?.(event, props);\n };\n\n const onHolderMouseDown: React.MouseEventHandler<HTMLDivElement> = (event) => {\n if (inputRef.current && event.currentTarget === event.target) {\n event.preventDefault();\n inputRef.current.focus();\n }\n };\n\n React.useEffect(() => {\n if (disabled && isFocused) {\n setIsFocused(false);\n }\n }, [disabled, isFocused]);\n\n // Uncontrolled inputs can receive a value imperatively — e.g. react-hook-form's\n // `register` sets the DOM value on `reset(...)` without firing onChange. Re-derive\n // the filled state from the DOM on every render (the form re-renders on reset) so\n // the floating label still rises. `checkDirty` is a no-op when nothing changed.\n React.useEffect(() => {\n if (!isControlled) {\n checkDirty(inputRef.current);\n }\n });\n\n useSafeLayoutEffect(() => {\n if (isControlled) {\n checkDirty({ value });\n }\n }, [value, isControlled, checkDirty]);\n\n const inputClasses = cn(\n \"smwb-text-field__input\",\n (!label || inline) && \"smwb-text-field__input--show-placeholder\",\n startAdornment && \"smwb-text-field__input--adornment-start\",\n endAdornment && \"smwb-text-field__input--adornment-end\",\n inline && \"smwb-text-field__input--inline\"\n );\n\n return (\n <TextFieldWrapper\n label={label}\n helperText={helperText}\n variant={variant}\n disabled={disabled}\n className={cn(className, size !== \"medium\" && `smwb-text-field_size-${size}`)}\n error={error}\n fullWidth={fullWidth}\n isFilledState={isFilledState}\n isFocused={isFocused}\n htmlFor={id}\n shrink={Boolean(startAdornment)}\n onHolderMouseDown={onHolderMouseDown}\n startAdornment={startAdornment}\n endAdornment={endAdornment}\n inline={inline}\n {...rest}\n >\n <input\n type={type}\n defaultValue={defaultValue}\n name={name}\n readOnly={readOnly}\n required={required}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n placeholder={placeholder}\n disabled={disabled}\n value={value}\n className={inputClasses}\n ref={inputForkRef}\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n id={id}\n autoComplete={autoComplete}\n inputMode={inputMode}\n />\n </TextFieldWrapper>\n );\n});\n","import { ReactNode } from \"react\";\n\nexport type ChatMessageVariant = \"incoming\" | \"outgoing\" | \"system\" | \"custom\";\n\nexport type ChatLayoutMode = \"closed\" | \"floating\" | \"fullHeight\" | \"fullscreen\";\n\nexport type ChatAnchor = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n\nexport type ChatThemeMode = \"inherit\" | \"light\" | \"dark\";\n\nexport type ChatLayoutSide = \"left\" | \"right\";\n\nexport type ChatMessageDeliveryStatus = \"pending\" | \"sent\" | \"delivered\" | \"read\";\n\nexport type ChatMessageStatus = ChatMessageDeliveryStatus | (string & {});\n\nexport interface ChatMessageStatusIcons {\n pending?: string;\n sent?: string;\n delivered?: string;\n read?: string;\n}\n\nexport interface ChatMessageStatusRenderContext {\n message: ChatMessage;\n status: ChatMessageStatus;\n}\n\nexport interface ChatAttachment {\n id: string;\n name: string;\n url?: string;\n mimeType?: string;\n size?: number;\n}\n\nexport interface ChatAuthor {\n name?: string;\n avatarSrc?: string;\n avatarAlt?: string;\n}\n\nexport interface ChatMessage {\n id: string;\n variant: ChatMessageVariant;\n text?: ReactNode;\n author?: ChatAuthor;\n attachments?: ChatAttachment[];\n content?: ReactNode;\n timestamp?: string | Date;\n status?: ChatMessageStatus;\n}\n\nexport interface ChatMessageRenderContext {\n showAvatars: boolean;\n showAttachments: boolean;\n showStatus?: boolean;\n statusIcons?: ChatMessageStatusIcons & Record<string, string | undefined>;\n renderStatus?: (ctx: ChatMessageStatusRenderContext) => ReactNode;\n}\n\nexport const CHAT_MESSAGE_DELIVERY_STATUSES: ChatMessageDeliveryStatus[] = [\"pending\", \"sent\", \"delivered\", \"read\"];\n\nexport const CHAT_MESSAGE_STATUS_ICONS: Record<ChatMessageDeliveryStatus, string> = {\n pending: \"progress_activity\",\n sent: \"check\",\n delivered: \"done_all\",\n read: \"done_all\",\n};\n\nexport const CHAT_MESSAGE_STATUS_LABELS: Record<ChatMessageDeliveryStatus, string> = {\n pending: \"В обработке\",\n sent: \"Отправлено\",\n delivered: \"Доставлено\",\n read: \"Прочитано\",\n};\n\nexport const CHAT_EXPAND_LAYOUTS: ChatLayoutMode[] = [\"floating\", \"fullHeight\", \"fullscreen\"];\n\nexport const CHAT_OVERLAY_LAYOUTS: ChatLayoutMode[] = [\"fullHeight\", \"floating\"];\n\nexport const CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES = 10;\n","import {\n ChatAttachment,\n ChatLayoutMode,\n CHAT_EXPAND_LAYOUTS,\n CHAT_MESSAGE_DELIVERY_STATUSES,\n CHAT_MESSAGE_STATUS_ICONS,\n CHAT_MESSAGE_STATUS_LABELS,\n ChatMessageDeliveryStatus,\n ChatMessageStatus,\n ChatMessageStatusIcons,\n} from \"./types\";\n\nexport function isChatMessageDeliveryStatus(status: ChatMessageStatus): status is ChatMessageDeliveryStatus {\n return CHAT_MESSAGE_DELIVERY_STATUSES.includes(status as ChatMessageDeliveryStatus);\n}\n\nexport function resolveChatMessageStatusIcon(\n status: ChatMessageStatus,\n icons?: ChatMessageStatusIcons & Record<string, string | undefined>\n): string | undefined {\n const custom = icons?.[status];\n if (custom) {\n return custom;\n }\n\n if (isChatMessageDeliveryStatus(status)) {\n return CHAT_MESSAGE_STATUS_ICONS[status];\n }\n\n return undefined;\n}\n\nexport function resolveChatMessageStatusLabel(status: ChatMessageStatus): string {\n if (isChatMessageDeliveryStatus(status)) {\n return CHAT_MESSAGE_STATUS_LABELS[status];\n }\n\n return String(status);\n}\n\nexport function isImageAttachment(attachment: ChatAttachment): boolean {\n if (attachment.mimeType?.startsWith(\"image/\")) {\n return true;\n }\n\n return /\\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(attachment.name);\n}\n\nexport function formatChatTimestamp(value?: string | Date): string {\n if (!value) {\n return \"\";\n }\n\n const date = value instanceof Date ? value : new Date(value);\n\n if (Number.isNaN(date.getTime())) {\n return String(value);\n }\n\n return new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nexport function resolveAllowedLayouts(input?: ChatLayoutMode[]): ChatLayoutMode[] {\n if (input == null) {\n return [\"floating\"];\n }\n\n if (input.length === 0) {\n return [];\n }\n\n return CHAT_EXPAND_LAYOUTS.filter((mode) => input.includes(mode));\n}\n\nexport function pickInitialLayout(allowed: ChatLayoutMode[], preferred?: ChatLayoutMode): ChatLayoutMode {\n if (preferred && preferred !== \"closed\" && allowed.includes(preferred)) {\n return preferred;\n }\n\n return allowed[0] ?? \"floating\";\n}\n\nexport function getChatLayoutActions(\n allowedLayouts: ChatLayoutMode[],\n currentLayout?: ChatLayoutMode\n): Exclude<ChatLayoutMode, \"closed\">[] {\n return resolveAllowedLayouts(allowedLayouts).filter(\n (mode): mode is Exclude<ChatLayoutMode, \"closed\"> => mode !== \"closed\" && mode !== currentLayout\n );\n}\n\nexport function shouldShowChatCloseButton(options: {\n floatingTrigger?: boolean;\n embedded?: boolean;\n overlayContext?: boolean;\n effectiveLayout?: ChatLayoutMode;\n showCloseButton?: boolean;\n}): boolean {\n if (options.showCloseButton === false) {\n return false;\n }\n\n if (options.showCloseButton === true) {\n return true;\n }\n\n if (\n options.overlayContext &&\n options.floatingTrigger &&\n !options.embedded &&\n (options.effectiveLayout === \"floating\" || options.effectiveLayout === \"fullHeight\")\n ) {\n return true;\n }\n\n return Boolean(options.floatingTrigger && !options.embedded && options.effectiveLayout === \"floating\");\n}\n\nexport interface ChatComposerNewlineOptions {\n shiftEnterNewline?: boolean;\n ctrlEnterNewline?: boolean;\n}\n\nexport function shouldComposerNewlineOnEnter(\n event: { key: string; shiftKey: boolean; ctrlKey: boolean; metaKey: boolean },\n options: ChatComposerNewlineOptions = {}\n): boolean {\n if (event.key !== \"Enter\") {\n return false;\n }\n\n const { shiftEnterNewline = true, ctrlEnterNewline = true } = options;\n const isCtrl = event.ctrlKey || event.metaKey;\n\n if (shiftEnterNewline && event.shiftKey && !isCtrl) {\n return true;\n }\n\n if (ctrlEnterNewline && isCtrl && !event.shiftKey) {\n return true;\n }\n\n return false;\n}\n","import React, { useId, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { TextField } from \"../../inputs/textField\";\nimport { TextFieldWrapper } from \"../../inputs/textField/textFieldWrapper\";\nimport ChatIconButton from \"./chatIconButton\";\nimport { shouldComposerNewlineOnEnter } from \"./utils\";\n\nexport interface ChatComposerProps {\n className?: string;\n onSendMessage?: (text: string) => void | Promise<void>;\n placeholder?: string;\n disabled?: boolean;\n sendAriaLabel?: string;\n shiftEnterNewline?: boolean;\n ctrlEnterNewline?: boolean;\n fileUpload?: boolean;\n attachInputId?: string;\n onAttachClick?: () => void;\n attachAriaLabel?: string;\n}\n\nfunction stopPropagation(event: React.SyntheticEvent) {\n event.stopPropagation();\n}\n\nfunction insertNewlineAtCursor(element: HTMLTextAreaElement, value: string, setValue: (next: string) => void) {\n const start = element.selectionStart ?? value.length;\n const end = element.selectionEnd ?? value.length;\n const nextValue = `${value.slice(0, start)}\\n${value.slice(end)}`;\n\n setValue(nextValue);\n\n requestAnimationFrame(() => {\n element.selectionStart = start + 1;\n element.selectionEnd = start + 1;\n });\n}\n\nexport function ChatComposer({\n className,\n onSendMessage,\n placeholder = \"message\",\n disabled = false,\n sendAriaLabel = \"Send message\",\n shiftEnterNewline = true,\n ctrlEnterNewline = true,\n fileUpload = false,\n attachInputId,\n onAttachClick,\n attachAriaLabel = \"Attach file\",\n}: ChatComposerProps) {\n const [value, setValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const inputId = useId();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const multiline = shiftEnterNewline || ctrlEnterNewline;\n const canSend = Boolean(onSendMessage) && value.trim().length > 0 && !disabled;\n const showAttach = fileUpload && Boolean(attachInputId || onAttachClick);\n\n const handleSend = () => {\n if (!onSendMessage) {\n return;\n }\n\n const text = value.trim();\n\n if (!text || disabled) {\n return;\n }\n\n void onSendMessage(text);\n setValue(\"\");\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (shouldComposerNewlineOnEnter(event, { shiftEnterNewline, ctrlEnterNewline })) {\n if (event.currentTarget instanceof HTMLTextAreaElement) {\n event.preventDefault();\n insertNewlineAtCursor(event.currentTarget, value, setValue);\n }\n\n return;\n }\n\n if (event.key !== \"Enter\") {\n return;\n }\n\n event.preventDefault();\n handleSend();\n };\n\n const attachClassName = cn(\n \"smwb-chat-icon-button\",\n \"smwb-chat-icon-button_edge-start\",\n disabled && \"smwb-chat-icon-button_disabled\"\n );\n\n const attachButton = showAttach ? (\n attachInputId ? (\n <label\n htmlFor={disabled ? undefined : attachInputId}\n className={attachClassName}\n aria-label={attachAriaLabel}\n aria-disabled={disabled || undefined}\n data-testid=\"chat-composer-attach\"\n onMouseDown={stopPropagation}\n >\n <Icon name=\"attach_file\" size={24} />\n </label>\n ) : (\n <ChatIconButton\n edge=\"start\"\n aria-label={attachAriaLabel}\n data-testid=\"chat-composer-attach\"\n disabled={disabled}\n onClick={onAttachClick}\n onMouseDown={stopPropagation}\n >\n <Icon name=\"attach_file\" size={24} />\n </ChatIconButton>\n )\n ) : null;\n\n const sendButton = onSendMessage ? (\n <ChatIconButton\n edge=\"end\"\n color=\"primary\"\n aria-label={sendAriaLabel}\n data-testid=\"chat-composer-send\"\n disabled={!canSend}\n onClick={handleSend}\n onMouseDown={stopPropagation}\n >\n <Icon name=\"send\" size={24} />\n </ChatIconButton>\n ) : null;\n\n if (showAttach && !onSendMessage) {\n return (\n <div\n className={cn(\"smwb-chat-composer\", \"smwb-chat-composer_attach-only\", className)}\n data-testid=\"chat-composer\"\n >\n {attachButton}\n </div>\n );\n }\n\n if (!multiline) {\n return (\n <TextField\n className={cn(\"smwb-chat-composer\", className)}\n data-testid=\"chat-composer\"\n fullWidth\n value={value}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(event) => setValue(event.target.value)}\n startAdornment={attachButton}\n endAdornment={sendButton}\n onKeyDown={handleKeyDown}\n />\n );\n }\n\n const onHolderMouseDown: React.MouseEventHandler<HTMLDivElement> = (event) => {\n if (textareaRef.current && event.currentTarget === event.target) {\n event.preventDefault();\n textareaRef.current.focus();\n }\n };\n\n return (\n <TextFieldWrapper\n className={cn(\"smwb-chat-composer\", className)}\n data-testid=\"chat-composer\"\n fullWidth\n disabled={disabled}\n isFilledState={value.length > 0}\n isFocused={isFocused}\n htmlFor={inputId}\n shrink={Boolean(attachButton)}\n onHolderMouseDown={onHolderMouseDown}\n startAdornment={attachButton}\n endAdornment={sendButton}\n >\n <textarea\n id={inputId}\n ref={textareaRef}\n className={cn(\n \"smwb-text-field__input\",\n \"smwb-chat-composer__input\",\n \"smwb-text-field__input--show-placeholder\",\n attachButton && \"smwb-text-field__input--adornment-start\",\n sendButton && \"smwb-text-field__input--adornment-end\"\n )}\n value={value}\n disabled={disabled}\n placeholder={placeholder}\n rows={1}\n onChange={(event) => setValue(event.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onKeyDown={handleKeyDown}\n />\n </TextFieldWrapper>\n );\n}\n\nexport default ChatComposer;\n","import React, { ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport ChatIconButton from \"./chatIconButton\";\nimport { ChatLayoutMode } from \"./types\";\nimport { getChatLayoutActions } from \"./utils\";\n\nexport interface ChatHeaderProps {\n className?: string;\n title?: ReactNode;\n subtitle?: ReactNode;\n actions?: ReactNode;\n layout?: ChatLayoutMode;\n allowedLayouts?: ChatLayoutMode[];\n onLayoutChange?: (layout: ChatLayoutMode) => void;\n onClose?: () => void;\n}\n\nconst layoutIcons: Record<Exclude<ChatLayoutMode, \"closed\">, string> = {\n floating: \"picture_in_picture\",\n fullHeight: \"fit_screen\",\n fullscreen: \"open_in_full\",\n};\n\nconst layoutAriaLabels: Record<Exclude<ChatLayoutMode, \"closed\">, string> = {\n floating: \"Floating window\",\n fullHeight: \"Full height\",\n fullscreen: \"Fullscreen\",\n};\n\nexport function ChatHeader({\n className,\n title,\n subtitle,\n actions,\n layout,\n allowedLayouts = [\"floating\"],\n onLayoutChange,\n onClose,\n}: ChatHeaderProps) {\n const layoutActions = getChatLayoutActions(allowedLayouts, layout);\n const showLayoutActions = Boolean(onLayoutChange) && layoutActions.length > 0;\n\n return (\n <div className={cn(\"smwb-chat-header\", className)} data-testid=\"chat-header\">\n <div className=\"smwb-chat-header__main\">\n {title ? <div className=\"smwb-chat-header__title\">{title}</div> : null}\n {subtitle ? <div className=\"smwb-chat-header__subtitle\">{subtitle}</div> : null}\n </div>\n <div className=\"smwb-chat-header__actions\">\n {actions}\n {showLayoutActions\n ? layoutActions.map((mode) => (\n <ChatIconButton\n key={mode}\n aria-pressed={layout === mode}\n aria-label={layoutAriaLabels[mode]}\n data-testid={`chat-layout-${mode}`}\n onClick={() => onLayoutChange?.(mode)}\n >\n <Icon name={layoutIcons[mode]} size={18} />\n </ChatIconButton>\n ))\n : null}\n {onClose ? (\n <ChatIconButton aria-label=\"Close chat\" data-testid=\"chat-close\" onClick={onClose}>\n <Icon name=\"close\" size={18} />\n </ChatIconButton>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport default ChatHeader;\n","import React, { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport type TypographyVariant =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"subtitle1\"\n | \"subtitle2\"\n | \"body1\"\n | \"body2\"\n | \"caption\"\n | \"overline\"\n | \"button\";\n\nexport type TypographyColor =\n | \"inherit\"\n | \"primary\"\n | \"secondary\"\n | \"error\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"textPrimary\"\n | \"textSecondary\"\n | \"disabled\";\n\nconst defaultTag: Record<TypographyVariant, keyof JSX.IntrinsicElements> = {\n h1: \"h1\",\n h2: \"h2\",\n h3: \"h3\",\n h4: \"h4\",\n h5: \"h5\",\n h6: \"h6\",\n subtitle1: \"h6\",\n subtitle2: \"h6\",\n body1: \"p\",\n body2: \"p\",\n caption: \"span\",\n overline: \"span\",\n button: \"span\",\n};\n\nexport interface TypographyProps extends HTMLAttributes<HTMLElement> {\n variant?: TypographyVariant;\n color?: TypographyColor;\n align?: \"left\" | \"center\" | \"right\" | \"justify\";\n /** Add a bottom margin (block rhythm). */\n gutterBottom?: boolean;\n /** Truncate with an ellipsis on a single line. */\n noWrap?: boolean;\n /** Render as a different element/component. */\n component?: keyof JSX.IntrinsicElements;\n className?: string;\n}\n\nexport const Typography = React.forwardRef<HTMLElement, PropsWithChildren<TypographyProps>>(function Typography(\n { variant = \"body1\", color = \"inherit\", align, gutterBottom, noWrap, component, className, children, ...rest },\n ref\n) {\n const Tag = (component ?? defaultTag[variant]) as \"p\";\n return (\n <Tag\n ref={ref as React.Ref<HTMLParagraphElement>}\n className={cn(\n \"smwb-typography\",\n `smwb-typography_${variant}`,\n color !== \"inherit\" && `smwb-typography_color-${color}`,\n align && `smwb-typography_align-${align}`,\n {\n \"smwb-typography_gutter\": gutterBottom,\n \"smwb-typography_nowrap\": noWrap,\n },\n className\n )}\n {...rest}\n >\n {children}\n </Tag>\n );\n});\n\nexport default Typography;\n","import React, { useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CSSTransition } from \"react-transition-group\";\nimport cn from \"clsx\";\nimport { ChatAttachment } from \"./types\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\nexport interface ChatAttachmentImageProps {\n attachment: ChatAttachment;\n className?: string;\n}\n\nexport function ChatAttachmentImage({ attachment, className }: ChatAttachmentImageProps) {\n const [open, setOpen] = useState(false);\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n const nodeRef = useRef<HTMLDivElement>(null);\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n if (!attachment.url) {\n return null;\n }\n\n return (\n <>\n <button\n type=\"button\"\n className={cn(\"smwb-chat-attachment-image\", className)}\n onClick={() => setOpen(true)}\n data-testid=\"chat-attachment-image\"\n aria-label={attachment.name}\n >\n <img src={attachment.url} alt={attachment.name} className=\"smwb-chat-attachment-image__img\" />\n </button>\n {domRoot\n ? createPortal(\n <CSSTransition\n in={open}\n timeout={150}\n mountOnEnter\n unmountOnExit\n nodeRef={nodeRef}\n classNames={{\n enterActive: \"smwb-chat-attachment-image__overlay_enter-active\",\n enterDone: \"smwb-chat-attachment-image__overlay_enter-done\",\n }}\n >\n <div\n ref={nodeRef}\n className=\"smwb-chat-attachment-image__overlay smwb-dark\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={attachment.name}\n data-testid=\"chat-attachment-image-overlay\"\n onClick={() => setOpen(false)}\n >\n <img\n src={attachment.url}\n alt={attachment.name}\n className=\"smwb-chat-attachment-image__overlay-img\"\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n </CSSTransition>,\n domRoot\n )\n : null}\n </>\n );\n}\n\nexport default ChatAttachmentImage;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { ChatAttachment } from \"./types\";\nimport { isImageAttachment } from \"./utils\";\nimport ChatAttachmentImage from \"./chatAttachmentImage\";\n\nexport interface ChatAttachmentsProps {\n attachments?: ChatAttachment[];\n className?: string;\n enabled?: boolean;\n}\n\nexport function ChatAttachments({ attachments, className, enabled = true }: ChatAttachmentsProps) {\n if (!enabled || !attachments?.length) {\n return null;\n }\n\n return (\n <div className={cn(\"smwb-chat-attachments\", className)} data-testid=\"chat-attachments\">\n {attachments.map((attachment) =>\n isImageAttachment(attachment) ? (\n <ChatAttachmentImage key={attachment.id} attachment={attachment} />\n ) : (\n <a\n key={attachment.id}\n className=\"smwb-chat-attachments__file\"\n href={attachment.url}\n download={attachment.name}\n target=\"_blank\"\n rel=\"noreferrer\"\n data-testid=\"chat-attachment-file\"\n >\n {attachment.name}\n </a>\n )\n )}\n </div>\n );\n}\n\nexport default ChatAttachments;\n","import {\n Children,\n CSSProperties,\n forwardRef,\n HTMLAttributes,\n ImgHTMLAttributes,\n isValidElement,\n PropsWithChildren,\n ReactNode,\n useState,\n} from \"react\";\nimport cn from \"clsx\";\n\nexport type AvatarSize = \"small\" | \"medium\" | \"large\";\n\nexport interface AvatarProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** Image source. Falls back to children (initials / icon) on error or when absent. */\n src?: string;\n alt?: string;\n /** Preset size or an explicit pixel value. */\n size?: AvatarSize | number;\n variant?: \"circular\" | \"rounded\" | \"square\";\n /** Background color for the fallback (initials / icon). */\n color?: string;\n /** Extra attributes forwarded to the underlying <img> (srcSet, loading…). */\n imgProps?: ImgHTMLAttributes<HTMLImageElement>;\n}\n\nconst isPresetSize = (size: AvatarSize | number): size is AvatarSize => typeof size === \"string\";\n\nexport const Avatar = forwardRef<HTMLDivElement, PropsWithChildren<AvatarProps>>(function Avatar(\n { className, src, alt, size = \"medium\", variant = \"circular\", color, style, imgProps, children, ...props },\n ref\n) {\n const [imgFailed, setImgFailed] = useState(false);\n const showImage = Boolean(src) && !imgFailed;\n\n const avatarClassName = cn(\n \"smwb-avatar\",\n `smwb-avatar_${variant}`,\n isPresetSize(size) ? `smwb-avatar_${size}` : null,\n className\n );\n\n const inlineStyle: CSSProperties = {\n ...style,\n ...(isPresetSize(size) ? {} : { width: size, height: size, fontSize: size / 2.5 }),\n ...(color && !showImage ? { backgroundColor: color } : {}),\n };\n\n return (\n <div ref={ref} {...props} data-testid=\"avatar\" className={avatarClassName} style={inlineStyle}>\n {showImage ? (\n <img\n {...imgProps}\n className={cn(\"smwb-avatar__img\", imgProps?.className)}\n src={src}\n alt={alt}\n onError={(e) => {\n setImgFailed(true);\n imgProps?.onError?.(e);\n }}\n />\n ) : (\n <span className=\"smwb-avatar__fallback\" role=\"img\" aria-label={alt}>\n {children}\n </span>\n )}\n </div>\n );\n});\n\nexport interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** Maximum avatars to show before collapsing the rest into a \"+N\" surplus. */\n max?: number;\n /** Override the total count used for the surplus label (defaults to children count). */\n total?: number;\n /** Click handler for the \"+N\" surplus chip. */\n onSurplusClick?: () => void;\n}\n\nexport const AvatarGroup = forwardRef<HTMLDivElement, PropsWithChildren<AvatarGroupProps>>(function AvatarGroup(\n { className, max = 5, total, onSurplusClick, children, ...props },\n ref\n) {\n const items = Children.toArray(children).filter(isValidElement);\n const totalCount = total ?? items.length;\n const clampedMax = Math.max(max, 1);\n const visible: ReactNode[] = items.slice(0, clampedMax);\n const surplus = totalCount - visible.length;\n\n return (\n <div ref={ref} {...props} data-testid=\"avatar-group\" className={cn(\"smwb-avatar-group\", className)}>\n {surplus > 0 ? (\n <Avatar\n className=\"smwb-avatar-group__surplus\"\n onClick={onSurplusClick}\n style={onSurplusClick ? { cursor: \"pointer\" } : undefined}\n >\n {`+${surplus}`}\n </Avatar>\n ) : null}\n {visible}\n </div>\n );\n});\n\nexport default Avatar;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Avatar } from \"../avatar/avatar\";\nimport { ChatAuthor } from \"./types\";\n\nexport interface ChatMessageAvatarProps {\n author?: ChatAuthor;\n enabled?: boolean;\n className?: string;\n}\n\nexport function ChatMessageAvatar({ author, enabled = true, className }: ChatMessageAvatarProps) {\n if (!enabled) {\n return null;\n }\n\n return (\n <div className={cn(\"smwb-chat-message__avatar\", className)} data-testid=\"chat-message-avatar\">\n <Avatar src={author?.avatarSrc} alt={author?.avatarAlt ?? author?.name} size=\"small\">\n {author?.name?.slice(0, 1)}\n </Avatar>\n </div>\n );\n}\n\nexport default ChatMessageAvatar;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport {\n ChatMessage,\n ChatMessageStatus as ChatMessageStatusValue,\n ChatMessageStatusIcons,\n ChatMessageStatusRenderContext,\n} from \"./types\";\nimport { resolveChatMessageStatusIcon, resolveChatMessageStatusLabel } from \"./utils\";\n\nexport interface ChatMessageStatusProps {\n className?: string;\n message: ChatMessage;\n status: ChatMessageStatusValue;\n statusIcons?: ChatMessageStatusIcons & Record<string, string | undefined>;\n renderStatus?: (ctx: ChatMessageStatusRenderContext) => React.ReactNode;\n}\n\nexport function ChatMessageStatus({ className, message, status, statusIcons, renderStatus }: ChatMessageStatusProps) {\n if (renderStatus) {\n const custom = renderStatus({ message, status });\n if (custom != null) {\n return (\n <span\n className={cn(\"smwb-chat-message__status\", `smwb-chat-message__status_${status}`, className)}\n data-testid=\"chat-message-status\"\n >\n {custom}\n </span>\n );\n }\n }\n\n const iconName = resolveChatMessageStatusIcon(status, statusIcons);\n\n if (!iconName) {\n return null;\n }\n\n const label = resolveChatMessageStatusLabel(status);\n const filled = status === \"read\";\n\n return (\n <span\n className={cn(\"smwb-chat-message__status\", `smwb-chat-message__status_${status}`, className)}\n data-testid=\"chat-message-status\"\n aria-label={label}\n title={label}\n >\n <Icon name={iconName} size={14} fill={filled ? 1 : 0} />\n </span>\n );\n}\n\nexport default ChatMessageStatus;\n","import React, { ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Typography from \"../typography/typography\";\nimport ChatAttachments from \"./chatAttachments\";\nimport ChatMessageAvatar from \"./chatMessageAvatar\";\nimport ChatMessageStatus from \"./chatMessageStatus\";\nimport {\n ChatAuthor,\n ChatAttachment,\n ChatMessage,\n ChatMessageStatusIcons,\n ChatMessageStatusRenderContext,\n ChatMessageStatus as ChatMessageStatusValue,\n} from \"./types\";\nimport { formatChatTimestamp } from \"./utils\";\n\nexport interface ChatMessageBubbleProps {\n className?: string;\n align: \"start\" | \"end\";\n message: ChatMessage;\n author?: ChatAuthor;\n text?: ReactNode;\n attachments?: ChatAttachment[];\n timestamp?: string | Date;\n status?: ChatMessageStatusValue;\n showAvatars?: boolean;\n showAttachments?: boolean;\n showStatus?: boolean;\n statusIcons?: ChatMessageStatusIcons & Record<string, string | undefined>;\n renderStatus?: (ctx: ChatMessageStatusRenderContext) => ReactNode;\n bubbleClassName?: string;\n}\n\nexport function ChatMessageBubble({\n className,\n align,\n message,\n author,\n text,\n attachments,\n timestamp,\n status,\n showAvatars = false,\n showAttachments = false,\n showStatus = false,\n statusIcons,\n renderStatus,\n bubbleClassName,\n}: ChatMessageBubbleProps) {\n const time = formatChatTimestamp(timestamp);\n const deliveryStatus = status ?? message.status;\n const shouldShowStatus = showStatus && align === \"end\" && deliveryStatus;\n\n return (\n <div\n className={cn(\"smwb-chat-message\", `smwb-chat-message_${align}`, className)}\n data-testid={`chat-message-${align}`}\n >\n {align === \"start\" ? <ChatMessageAvatar author={author} enabled={showAvatars} /> : null}\n <div className=\"smwb-chat-message__content\">\n {author?.name ? (\n <Typography variant=\"caption\" className=\"smwb-chat-message__author\">\n {author.name}\n </Typography>\n ) : null}\n <div className={cn(\"smwb-chat-message__bubble\", bubbleClassName)}>\n {text ? <div className=\"smwb-chat-message__text\">{text}</div> : null}\n <ChatAttachments attachments={attachments} enabled={showAttachments} />\n </div>\n {time || shouldShowStatus ? (\n <div className=\"smwb-chat-message__meta\" data-testid=\"chat-message-meta\">\n {time ? (\n <Typography variant=\"caption\" className=\"smwb-chat-message__time\">\n {time}\n </Typography>\n ) : null}\n {shouldShowStatus ? (\n <ChatMessageStatus\n message={message}\n status={deliveryStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n {align === \"end\" ? <ChatMessageAvatar author={author} enabled={showAvatars} /> : null}\n </div>\n );\n}\n\nexport default ChatMessageBubble;\n","import React from \"react\";\nimport ChatMessageBubble from \"./chatMessageBubble\";\nimport { ChatMessage, ChatMessageRenderContext } from \"./types\";\n\nexport interface ChatMessageIncomingProps extends ChatMessageRenderContext {\n message: ChatMessage;\n className?: string;\n}\n\nexport function ChatMessageIncoming({ message, showAvatars, showAttachments, className }: ChatMessageIncomingProps) {\n return (\n <ChatMessageBubble\n className={className}\n align=\"start\"\n message={message}\n author={message.author}\n text={message.text}\n attachments={message.attachments}\n timestamp={message.timestamp}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n bubbleClassName=\"smwb-chat-message__bubble_incoming\"\n />\n );\n}\n\nexport default ChatMessageIncoming;\n","import React from \"react\";\nimport ChatMessageBubble from \"./chatMessageBubble\";\nimport { ChatMessage, ChatMessageRenderContext } from \"./types\";\n\nexport interface ChatMessageOutgoingProps extends ChatMessageRenderContext {\n message: ChatMessage;\n className?: string;\n}\n\nexport function ChatMessageOutgoing({\n message,\n showAvatars,\n showAttachments,\n showStatus,\n statusIcons,\n renderStatus,\n className,\n}: ChatMessageOutgoingProps) {\n return (\n <ChatMessageBubble\n className={className}\n align=\"end\"\n message={message}\n author={message.author}\n text={message.text}\n attachments={message.attachments}\n timestamp={message.timestamp}\n status={message.status}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n showStatus={showStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n bubbleClassName=\"smwb-chat-message__bubble_outgoing\"\n />\n );\n}\n\nexport default ChatMessageOutgoing;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport Typography from \"../typography/typography\";\nimport { ChatMessage } from \"./types\";\n\nexport interface ChatMessageSystemProps {\n message: ChatMessage;\n className?: string;\n}\n\nexport function ChatMessageSystem({ message, className }: ChatMessageSystemProps) {\n const content = message.content ?? message.text;\n\n if (!content) {\n return null;\n }\n\n return (\n <div className={cn(\"smwb-chat-message-system\", className)} data-testid=\"chat-message-system\">\n <Typography variant=\"caption\">{content}</Typography>\n </div>\n );\n}\n\nexport default ChatMessageSystem;\n","import React, { ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport ChatMessageIncoming from \"./chatMessageIncoming\";\nimport ChatMessageOutgoing from \"./chatMessageOutgoing\";\nimport ChatMessageSystem from \"./chatMessageSystem\";\nimport { ChatMessage, ChatMessageRenderContext } from \"./types\";\n\nexport interface ChatMessageItemProps extends ChatMessageRenderContext {\n message: ChatMessage;\n className?: string;\n renderMessage?: (message: ChatMessage, ctx: ChatMessageRenderContext) => ReactNode;\n}\n\nexport function ChatMessageItem({\n message,\n showAvatars,\n showAttachments,\n showStatus,\n statusIcons,\n renderStatus,\n className,\n renderMessage,\n}: ChatMessageItemProps) {\n const ctx = { showAvatars, showAttachments, showStatus, statusIcons, renderStatus };\n\n if (renderMessage) {\n return <div className={cn(\"smwb-chat-message-item\", className)}>{renderMessage(message, ctx)}</div>;\n }\n\n switch (message.variant) {\n case \"outgoing\":\n return (\n <ChatMessageOutgoing\n message={message}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n showStatus={showStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n className={className}\n />\n );\n case \"system\":\n return <ChatMessageSystem message={message} className={className} />;\n case \"custom\":\n return (\n <div\n className={cn(\"smwb-chat-message-item\", \"smwb-chat-message-item_custom\", className)}\n data-testid=\"chat-message-custom\"\n >\n {message.content ?? message.text}\n </div>\n );\n case \"incoming\":\n default:\n return (\n <ChatMessageIncoming\n message={message}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n className={className}\n />\n );\n }\n}\n\nexport default ChatMessageItem;\n","import { CSSProperties, forwardRef, HTMLAttributes } from \"react\";\nimport cn from \"clsx\";\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLElement> {\n className?: string;\n /** Shape of the placeholder. */\n variant?: \"text\" | \"circular\" | \"rounded\" | \"rectangular\";\n /** Width — number (px) or any CSS length. */\n width?: number | string;\n /** Height — number (px) or any CSS length. */\n height?: number | string;\n /** Shimmer animation; pass false to disable. */\n animation?: \"pulse\" | \"wave\" | false;\n /** Render N stacked placeholders. */\n count?: number;\n /** Stagger consecutive items by N ms (with `count`). */\n animationDelay?: number;\n /** Root element. */\n component?: \"span\" | \"div\";\n}\n\nconst toCssSize = (value?: number | string): string | undefined => (typeof value === \"number\" ? `${value}px` : value);\n\nexport const Skeleton = forwardRef<HTMLElement, SkeletonProps>(function Skeleton(\n {\n className,\n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n count = 1,\n animationDelay,\n component = \"span\",\n style,\n ...props\n },\n ref\n) {\n const skeletonClassName = cn(\n \"smwb-skeleton\",\n `smwb-skeleton_${variant}`,\n animation === false ? \"smwb-skeleton_no-animation\" : `smwb-skeleton_${animation}`,\n className\n );\n\n const Tag = component as \"span\";\n\n const renderOne = (i: number) => {\n const inlineStyle: CSSProperties = {\n ...style,\n width: toCssSize(width),\n height: toCssSize(height),\n ...(animationDelay ? { animationDelay: `${i * animationDelay}ms` } : {}),\n };\n return (\n <Tag\n key={i}\n ref={count === 1 ? ref : undefined}\n {...(count === 1 ? props : {})}\n data-testid=\"skeleton\"\n aria-hidden=\"true\"\n className={skeletonClassName}\n style={inlineStyle}\n />\n );\n };\n\n if (count === 1) {\n return renderOne(0);\n }\n\n return (\n <span ref={ref} {...props} className=\"smwb-skeleton__group\" aria-hidden=\"true\">\n {Array.from({ length: count }, (_, i) => renderOne(i))}\n </span>\n );\n});\n\nexport default Skeleton;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Skeleton } from \"../../feedBack/skeleton/skeleton\";\n\nexport interface ChatMessageSkeletonProps {\n className?: string;\n align?: \"start\" | \"end\";\n showAvatar?: boolean;\n lines?: number;\n}\n\nexport function ChatMessageSkeleton({\n className,\n align = \"start\",\n showAvatar = false,\n lines = 2,\n}: ChatMessageSkeletonProps) {\n const bubbleWidth = align === \"start\" ? \"72%\" : \"64%\";\n\n return (\n <div\n className={cn(\"smwb-chat-message\", `smwb-chat-message_${align}`, \"smwb-chat-message-skeleton\", className)}\n data-testid=\"chat-message-skeleton\"\n aria-hidden=\"true\"\n >\n {align === \"start\" && showAvatar ? <Skeleton variant=\"circular\" width={32} height={32} /> : null}\n <div className=\"smwb-chat-message__content\">\n <div className=\"smwb-chat-message-skeleton__bubble\">\n <Skeleton variant=\"rounded\" width={bubbleWidth} height={14} />\n {lines > 1 ? <Skeleton variant=\"rounded\" width=\"48%\" height={14} /> : null}\n </div>\n </div>\n {align === \"end\" && showAvatar ? <Skeleton variant=\"circular\" width={32} height={32} /> : null}\n </div>\n );\n}\n\nexport default ChatMessageSkeleton;\n","import { RefObject, useEffect, useRef } from \"react\";\n\nexport interface UseChatInfiniteScrollParams {\n containerRef: RefObject<HTMLElement | null>;\n onLoadMore?: () => void | Promise<void>;\n hasMore?: boolean;\n loading?: boolean;\n rootMargin?: string;\n}\n\nexport function useChatInfiniteScroll({\n containerRef,\n onLoadMore,\n hasMore = false,\n loading = false,\n rootMargin = \"80px\",\n}: UseChatInfiniteScrollParams) {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const loadingRef = useRef(loading);\n\n loadingRef.current = loading;\n\n useEffect(() => {\n const root = containerRef.current;\n const sentinel = sentinelRef.current;\n\n if (!root || !sentinel || !hasMore || !onLoadMore || typeof IntersectionObserver === \"undefined\") {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting) && !loadingRef.current) {\n void onLoadMore();\n }\n },\n { root, rootMargin, threshold: 0 }\n );\n\n observer.observe(sentinel);\n\n return () => observer.disconnect();\n }, [containerRef, hasMore, onLoadMore, rootMargin]);\n\n return { sentinelRef };\n}\n","import { RefObject, useEffect, useRef } from \"react\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\nexport interface UseChatStickToBottomParams {\n containerRef: RefObject<HTMLElement | null>;\n messages: readonly { id: string }[];\n threshold?: number;\n}\n\nexport function isScrolledToBottom(element: HTMLElement, threshold = 24): boolean {\n return element.scrollHeight - element.scrollTop - element.clientHeight <= threshold;\n}\n\nexport function scrollChatToBottom(element: HTMLElement): void {\n element.scrollTop = element.scrollHeight;\n}\n\nexport function useChatStickToBottom({ containerRef, messages, threshold = 24 }: UseChatStickToBottomParams) {\n const isAtBottomRef = useRef(true);\n const previousScrollHeightRef = useRef(0);\n const previousFirstMessageIdRef = useRef<string | undefined>();\n const previousLastMessageIdRef = useRef<string | undefined>();\n\n useEffect(() => {\n const element = containerRef.current;\n\n if (!element) {\n return;\n }\n\n const handleScroll = () => {\n isAtBottomRef.current = isScrolledToBottom(element, threshold);\n };\n\n handleScroll();\n element.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => element.removeEventListener(\"scroll\", handleScroll);\n }, [containerRef, threshold]);\n\n useSafeLayoutEffect(() => {\n const element = containerRef.current;\n\n if (!element) {\n return;\n }\n\n const previousScrollHeight = previousScrollHeightRef.current;\n const previousFirstMessageId = previousFirstMessageIdRef.current;\n const previousLastMessageId = previousLastMessageIdRef.current;\n const firstMessageId = messages[0]?.id;\n const lastMessageId = messages[messages.length - 1]?.id;\n\n if (previousFirstMessageId === undefined) {\n scrollChatToBottom(element);\n isAtBottomRef.current = true;\n } else {\n const prepended =\n firstMessageId !== undefined &&\n firstMessageId !== previousFirstMessageId &&\n lastMessageId === previousLastMessageId;\n const appended = lastMessageId !== undefined && lastMessageId !== previousLastMessageId;\n\n if (prepended && previousScrollHeight > 0) {\n element.scrollTop += element.scrollHeight - previousScrollHeight;\n } else if (appended && isAtBottomRef.current) {\n scrollChatToBottom(element);\n }\n }\n\n previousScrollHeightRef.current = element.scrollHeight;\n previousFirstMessageIdRef.current = firstMessageId;\n previousLastMessageIdRef.current = lastMessageId;\n }, [containerRef, messages]);\n}\n","import React, { useRef } from \"react\";\nimport cn from \"clsx\";\nimport ChatMessageItem, { ChatMessageItemProps } from \"./chatMessageItem\";\nimport ChatMessageSkeleton from \"./chatMessageSkeleton\";\nimport { useChatInfiniteScroll } from \"./useChatInfiniteScroll\";\nimport { useChatStickToBottom } from \"./useChatStickToBottom\";\nimport { ChatMessage, ChatMessageRenderContext } from \"./types\";\n\nexport interface ChatMessagesProps extends ChatMessageRenderContext {\n className?: string;\n messages: ChatMessage[];\n onLoadMore?: () => void | Promise<void>;\n hasMore?: boolean;\n loading?: boolean;\n loadingMore?: boolean;\n loadingSkeletonCount?: number;\n renderMessage?: ChatMessageItemProps[\"renderMessage\"];\n}\n\nexport function ChatMessages({\n className,\n messages,\n showAvatars,\n showAttachments,\n showStatus,\n statusIcons,\n renderStatus,\n onLoadMore,\n hasMore = false,\n loading = false,\n loadingMore = false,\n loadingSkeletonCount = 3,\n renderMessage,\n}: ChatMessagesProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const { sentinelRef } = useChatInfiniteScroll({\n containerRef,\n onLoadMore,\n hasMore,\n loading: loadingMore || loading,\n });\n\n useChatStickToBottom({\n containerRef,\n messages,\n });\n\n const showSkeletons = loading || loadingMore;\n const skeletonAligns = (index: number): \"start\" | \"end\" => (index % 2 === 0 ? \"start\" : \"end\");\n\n return (\n <div ref={containerRef} className={cn(\"smwb-chat-messages\", className)} data-testid=\"chat-messages\">\n <div ref={sentinelRef} className=\"smwb-chat-messages__sentinel\" data-testid=\"chat-messages-sentinel\" />\n {showSkeletons ? (\n <div\n className=\"smwb-chat-messages__skeletons\"\n data-testid=\"chat-messages-skeletons\"\n aria-busy=\"true\"\n aria-label=\"Loading messages\"\n >\n {Array.from({ length: loadingSkeletonCount }, (_, index) => (\n <ChatMessageSkeleton\n key={index}\n align={skeletonAligns(index)}\n showAvatar={showAvatars}\n lines={index % 2 === 0 ? 2 : 1}\n />\n ))}\n </div>\n ) : null}\n {!loading\n ? messages.map((message) => (\n <ChatMessageItem\n key={message.id}\n message={message}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n showStatus={showStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n renderMessage={renderMessage}\n />\n ))\n : null}\n </div>\n );\n}\n\nexport default ChatMessages;\n","import React, { PropsWithChildren, ReactNode, useEffect } from \"react\";\nimport cn from \"clsx\";\nimport { createPortal } from \"react-dom\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { ChatAnchor, ChatLayoutMode, ChatThemeMode } from \"./types\";\n\nexport interface ChatShellProps extends PropsWithChildren {\n className?: string;\n layout: ChatLayoutMode;\n anchor?: ChatAnchor;\n themeMode?: ChatThemeMode;\n embedded?: boolean;\n overlayContext?: boolean;\n header?: ReactNode;\n footer?: ReactNode;\n fileDropzoneRootProps?: React.HTMLAttributes<HTMLDivElement>;\n fileDropzoneActive?: boolean;\n}\n\nexport function ChatShell({\n className,\n layout,\n anchor = \"bottom-right\",\n themeMode = \"inherit\",\n embedded = false,\n overlayContext = false,\n header,\n footer,\n children,\n fileDropzoneRootProps,\n fileDropzoneActive = false,\n}: ChatShellProps) {\n const [domRoot, setDomRoot] = React.useState<HTMLElement>();\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n useEffect(() => {\n if (layout !== \"fullscreen\") {\n return;\n }\n\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = prev;\n };\n }, [layout]);\n\n if (layout === \"closed\") {\n return null;\n }\n\n const { className: dropzoneClassName, ...dropzoneRootProps } = fileDropzoneRootProps ?? {};\n\n const panel = (\n <div\n {...dropzoneRootProps}\n className={cn(\n \"smwb-chat-shell\",\n `smwb-chat-shell_${layout}`,\n !embedded && `smwb-chat-shell_${anchor}`,\n {\n \"smwb-dark\": themeMode === \"dark\",\n \"smwb-chat-shell_embedded\": embedded,\n \"smwb-chat-shell_overlay-context\": overlayContext,\n \"smwb-chat-dropzone_active\": fileDropzoneActive,\n },\n dropzoneClassName,\n className\n )}\n data-testid=\"chat-shell\"\n data-layout={layout}\n >\n {header ? <div className=\"smwb-chat-shell__header\">{header}</div> : null}\n <div className=\"smwb-chat-shell__body\">{children}</div>\n {footer ? <div className=\"smwb-chat-shell__footer\">{footer}</div> : null}\n </div>\n );\n\n if (layout === \"fullscreen\" && domRoot) {\n return createPortal(panel, domRoot);\n }\n\n return panel;\n}\n\nexport default ChatShell;\n","import { useDropzone, type Accept } from \"react-dropzone\";\nimport { CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES } from \"./types\";\n\nexport interface UseChatFileUploadOptions {\n enabled?: boolean;\n accept?: Accept;\n maxFiles?: number;\n onUploadFiles?: (files: File[]) => void | Promise<void>;\n disabled?: boolean;\n}\n\nexport function resolveChatFileUploadMaxFiles(maxFiles?: number): number {\n if (maxFiles == null) {\n return CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES;\n }\n\n return Math.max(1, maxFiles);\n}\n\nexport function useChatFileUpload({\n enabled = false,\n accept,\n maxFiles,\n onUploadFiles,\n disabled = false,\n}: UseChatFileUploadOptions) {\n const resolvedMaxFiles = resolveChatFileUploadMaxFiles(maxFiles);\n const active = enabled && Boolean(onUploadFiles) && !disabled;\n\n const { getRootProps, getInputProps, open, isDragActive, inputRef } = useDropzone({\n accept,\n maxFiles: resolvedMaxFiles,\n multiple: resolvedMaxFiles > 1,\n disabled: !active,\n noClick: true,\n noKeyboard: true,\n useFsAccessApi: false,\n onDropAccepted: (files) => {\n if (onUploadFiles) {\n void onUploadFiles(files);\n }\n },\n });\n\n const openFilePicker = () => {\n open?.();\n };\n\n return {\n enabled: active,\n maxFiles: resolvedMaxFiles,\n getRootProps,\n getInputProps,\n open: openFilePicker,\n inputRef,\n isDragActive,\n };\n}\n\nexport default useChatFileUpload;\n","import React, { PropsWithChildren, ReactNode, useId, useMemo } from \"react\";\nimport cn from \"clsx\";\nimport type { Accept } from \"react-dropzone\";\nimport { FloatingButton } from \"../../inputs/floatingButton/floatingButton\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport ChatComposer from \"./chatComposer\";\nimport ChatHeader from \"./chatHeader\";\nimport ChatMessages, { ChatMessagesProps } from \"./chatMessages\";\nimport ChatShell from \"./chatShell\";\nimport useChatFileUpload from \"./useChatFileUpload\";\nimport {\n ChatAnchor,\n ChatLayoutMode,\n ChatMessage,\n ChatMessageRenderContext,\n ChatThemeMode,\n CHAT_EXPAND_LAYOUTS,\n} from \"./types\";\nimport { pickInitialLayout, resolveAllowedLayouts, shouldShowChatCloseButton } from \"./utils\";\n\nexport interface ChatProps\n extends PropsWithChildren, Omit<ChatMessageRenderContext, \"showAvatars\" | \"showAttachments\"> {\n className?: string;\n messages: ChatMessage[];\n showAvatars?: boolean;\n showAttachments?: boolean;\n headerTitle?: ReactNode;\n headerSubtitle?: ReactNode;\n headerActions?: ReactNode;\n footer?: ReactNode;\n anchor?: ChatAnchor;\n themeMode?: ChatThemeMode;\n allowedLayouts?: ChatLayoutMode[];\n layout?: ChatLayoutMode;\n defaultLayout?: ChatLayoutMode;\n onLayoutChange?: (layout: ChatLayoutMode) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n floatingTrigger?: boolean;\n triggerIcon?: ReactNode;\n triggerLabel?: string;\n onLoadMore?: () => void | Promise<void>;\n hasMore?: boolean;\n onSendMessage?: (text: string) => void | Promise<void>;\n composerPlaceholder?: string;\n composerDisabled?: boolean;\n composerShiftEnterNewline?: boolean;\n composerCtrlEnterNewline?: boolean;\n fileUpload?: boolean;\n onUploadFiles?: (files: File[]) => void | Promise<void>;\n fileUploadAccept?: Accept;\n fileUploadMaxFiles?: number;\n attachAriaLabel?: string;\n loading?: boolean;\n loadingMore?: boolean;\n loadingSkeletonCount?: number;\n renderMessage?: ChatMessagesProps[\"renderMessage\"];\n embedded?: boolean;\n overlayContext?: boolean;\n showStatus?: boolean;\n statusIcons?: ChatMessageRenderContext[\"statusIcons\"];\n renderStatus?: ChatMessageRenderContext[\"renderStatus\"];\n showCloseButton?: boolean;\n}\n\nexport function Chat({\n className,\n messages,\n showAvatars = false,\n showAttachments = false,\n headerTitle,\n headerSubtitle,\n headerActions,\n footer,\n children,\n anchor = \"bottom-right\",\n themeMode = \"inherit\",\n allowedLayouts: allowedLayoutsProp,\n layout: layoutProp,\n defaultLayout,\n onLayoutChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n floatingTrigger = false,\n triggerIcon,\n triggerLabel,\n onLoadMore,\n hasMore,\n onSendMessage,\n composerPlaceholder = \"message\",\n composerDisabled,\n composerShiftEnterNewline = true,\n composerCtrlEnterNewline = true,\n fileUpload = false,\n onUploadFiles,\n fileUploadAccept,\n fileUploadMaxFiles,\n attachAriaLabel,\n loading,\n loadingMore,\n loadingSkeletonCount,\n renderMessage,\n embedded = false,\n overlayContext = false,\n showStatus = false,\n statusIcons,\n renderStatus,\n showCloseButton,\n}: ChatProps) {\n const allowedLayouts = useMemo(\n () => resolveAllowedLayouts(allowedLayoutsProp ?? CHAT_EXPAND_LAYOUTS),\n [allowedLayoutsProp]\n );\n\n const [open, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const [layout, setLayout] = useControllableState<ChatLayoutMode>({\n value: layoutProp,\n defaultValue: pickInitialLayout(allowedLayouts, defaultLayout),\n onChange: onLayoutChange,\n });\n\n const effectiveLayout: ChatLayoutMode = embedded\n ? \"fullHeight\"\n : floatingTrigger\n ? open\n ? layout\n : \"closed\"\n : layout;\n\n const handleOpen = () => {\n setOpen(true);\n if (layout === \"closed\") {\n setLayout(pickInitialLayout(allowedLayouts, defaultLayout));\n }\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const handleLayoutChange = (next: ChatLayoutMode) => {\n setOpen(true);\n setLayout(next);\n };\n\n const {\n enabled: fileUploadEnabled,\n getRootProps,\n getInputProps,\n isDragActive,\n } = useChatFileUpload({\n enabled: fileUpload,\n accept: fileUploadAccept,\n maxFiles: fileUploadMaxFiles,\n onUploadFiles,\n disabled: composerDisabled,\n });\n\n const attachInputId = useId();\n\n const showComposer = Boolean(onSendMessage) || fileUploadEnabled;\n\n const fileInput = fileUploadEnabled ? (\n <input {...getInputProps({ id: attachInputId })} data-testid=\"chat-file-input\" />\n ) : null;\n\n const resolvedFooter =\n footer ??\n children ??\n (showComposer ? (\n <>\n {fileInput}\n <ChatComposer\n onSendMessage={onSendMessage}\n placeholder={composerPlaceholder}\n disabled={composerDisabled}\n shiftEnterNewline={composerShiftEnterNewline}\n ctrlEnterNewline={composerCtrlEnterNewline}\n fileUpload={fileUploadEnabled}\n attachInputId={fileUploadEnabled ? attachInputId : undefined}\n attachAriaLabel={attachAriaLabel}\n />\n </>\n ) : undefined);\n\n const chatMessages = (\n <ChatMessages\n messages={messages}\n showAvatars={showAvatars}\n showAttachments={showAttachments}\n showStatus={showStatus}\n statusIcons={statusIcons}\n renderStatus={renderStatus}\n onLoadMore={onLoadMore}\n hasMore={hasMore}\n loading={loading}\n loadingMore={loadingMore}\n loadingSkeletonCount={loadingSkeletonCount}\n renderMessage={renderMessage}\n />\n );\n\n const chatBody = chatMessages;\n\n const fileDropzoneRootProps = fileUploadEnabled ? getRootProps() : undefined;\n\n const closeButtonVisible = shouldShowChatCloseButton({\n floatingTrigger,\n embedded,\n overlayContext,\n effectiveLayout,\n showCloseButton,\n });\n\n return (\n <div\n className={cn(\n \"smwb-chat\",\n !embedded && `smwb-chat_${anchor}`,\n embedded && \"smwb-chat_embedded\",\n overlayContext && \"smwb-chat_overlay-context\",\n className\n )}\n data-testid=\"chat\"\n >\n {floatingTrigger && !embedded && !open ? (\n <FloatingButton\n className=\"smwb-chat__trigger\"\n aria-label={triggerLabel ?? \"Open chat\"}\n data-testid=\"chat-trigger\"\n onClick={handleOpen}\n >\n {triggerIcon ?? <Icon name=\"chat\" size={24} />}\n </FloatingButton>\n ) : null}\n <ChatShell\n layout={effectiveLayout}\n anchor={anchor}\n themeMode={themeMode}\n embedded={embedded}\n overlayContext={overlayContext}\n fileDropzoneRootProps={fileDropzoneRootProps}\n fileDropzoneActive={fileUploadEnabled && isDragActive}\n header={\n <ChatHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n layout={effectiveLayout === \"closed\" ? layout : effectiveLayout}\n allowedLayouts={allowedLayouts}\n onLayoutChange={handleLayoutChange}\n onClose={closeButtonVisible ? handleClose : undefined}\n />\n }\n footer={resolvedFooter}\n >\n {chatBody}\n </ChatShell>\n </div>\n );\n}\n\nexport default Chat;\n","import React, { CSSProperties, HTMLAttributes, PropsWithChildren, useEffect } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport ChatIconButton from \"./chatIconButton\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport Chat, { ChatProps } from \"./chat\";\nimport { ChatAnchor, ChatLayoutSide } from \"./types\";\n\nconst len = (value: number | string) => (typeof value === \"number\" ? `${value}px` : value);\n\nconst floatingAnchorForSide = (side: ChatLayoutSide): ChatAnchor => (side === \"left\" ? \"bottom-left\" : \"bottom-right\");\n\nexport type ChatLayoutChatProps = Omit<\n ChatProps,\n | \"className\"\n | \"embedded\"\n | \"floatingTrigger\"\n | \"anchor\"\n | \"allowedLayouts\"\n | \"layout\"\n | \"defaultLayout\"\n | \"open\"\n | \"defaultOpen\"\n | \"onOpenChange\"\n | \"onLayoutChange\"\n>;\n\nexport interface ChatLayoutProps extends PropsWithChildren, HTMLAttributes<HTMLDivElement> {\n className?: string;\n contentClassName?: string;\n chatClassName?: string;\n side?: ChatLayoutSide;\n chatWidth?: number | string;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n collapseAriaLabel?: string;\n expandAriaLabel?: string;\n floatingAnchor?: ChatAnchor;\n chat: ChatLayoutChatProps;\n}\n\nexport function ChatLayout({\n className,\n contentClassName,\n chatClassName,\n side = \"right\",\n chatWidth = 400,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseAriaLabel = \"Collapse chat panel\",\n expandAriaLabel = \"Expand chat panel\",\n floatingAnchor,\n chat,\n children,\n style,\n ...rest\n}: ChatLayoutProps) {\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n value: collapsedProp,\n defaultValue: defaultCollapsed,\n onChange: onCollapsedChange,\n });\n\n const [floatingOpen, setFloatingOpen] = useControllableState<boolean>({\n defaultValue: false,\n });\n\n useEffect(() => {\n if (!collapsed) {\n setFloatingOpen(false);\n }\n }, [collapsed, setFloatingOpen]);\n\n const anchor = floatingAnchor ?? floatingAnchorForSide(side);\n const dockIcon = side === \"left\" ? \"dock_to_left\" : \"dock_to_right\";\n const collapseIcon = side === \"left\" ? \"left_panel_close\" : \"right_panel_close\";\n\n const collapseButton = (\n <ChatIconButton\n aria-label={collapseAriaLabel}\n data-testid=\"chat-layout-collapse\"\n onClick={() => setCollapsed(true)}\n >\n <Icon name={collapseIcon} size={18} />\n </ChatIconButton>\n );\n\n const expandButton = (\n <ChatIconButton aria-label={expandAriaLabel} data-testid=\"chat-layout-expand\" onClick={() => setCollapsed(false)}>\n <Icon name={dockIcon} size={18} />\n </ChatIconButton>\n );\n\n const dockedHeaderActions = (\n <>\n {chat.headerActions}\n {collapseButton}\n </>\n );\n\n const floatingHeaderActions = (\n <>\n {chat.headerActions}\n {expandButton}\n </>\n );\n\n const cssVars = {\n \"--smwb-chat-layout-w\": len(chatWidth),\n } as CSSProperties;\n\n if (collapsed) {\n return (\n <div\n className={cn(\"smwb-chat-layout\", \"smwb-chat-layout_collapsed\", className)}\n style={{ ...cssVars, ...style }}\n data-testid=\"chat-layout\"\n data-collapsed=\"true\"\n {...rest}\n >\n <div className={cn(\"smwb-chat-layout__content\", contentClassName)} data-testid=\"chat-layout-content\">\n {children}\n </div>\n <Chat\n {...chat}\n className={chatClassName}\n floatingTrigger\n anchor={anchor}\n allowedLayouts={[\"floating\"]}\n layout=\"floating\"\n open={floatingOpen}\n onOpenChange={setFloatingOpen}\n headerActions={floatingHeaderActions}\n />\n </div>\n );\n }\n\n const panel = (\n <aside className=\"smwb-chat-layout__panel\" data-testid=\"chat-layout-panel\">\n <Chat {...chat} className={chatClassName} embedded allowedLayouts={[]} headerActions={dockedHeaderActions} />\n </aside>\n );\n\n return (\n <div\n className={cn(\"smwb-chat-layout\", `smwb-chat-layout_${side}`, className)}\n style={{ ...cssVars, ...style }}\n data-testid=\"chat-layout\"\n data-collapsed=\"false\"\n {...rest}\n >\n {side === \"left\" ? panel : null}\n <div className={cn(\"smwb-chat-layout__content\", contentClassName)} data-testid=\"chat-layout-content\">\n {children}\n </div>\n {side === \"right\" ? panel : null}\n </div>\n );\n}\n\nexport default ChatLayout;\n","import React, { forwardRef, HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n className?: string;\n badgeContent?: React.ReactNode;\n color?: \"primary\" | \"success\" | \"danger\";\n variant?: \"inside\" | \"outside\";\n vertical?: \"top\" | \"bottom\";\n horizontal?: \"right\" | \"left\";\n /** Cap numeric content, rendering `{max}+` when exceeded. */\n max?: number;\n /** Render the badge even when content is 0. */\n showZero?: boolean;\n /** Accessible label for the badge value. */\n badgeAriaLabel?: string;\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, PropsWithChildren<BadgeProps>>(function Badge(\n {\n className,\n color = \"primary\",\n badgeContent,\n variant = \"outside\",\n vertical = \"top\",\n horizontal = \"right\",\n max,\n showZero = false,\n badgeAriaLabel,\n children,\n ...rest\n },\n ref\n) {\n const isZero = badgeContent === 0 || badgeContent === \"0\";\n const hidden = (badgeContent === undefined || badgeContent === null || (isZero && !showZero)) === true;\n\n let display: React.ReactNode = badgeContent;\n if (typeof badgeContent === \"number\" && max !== undefined && badgeContent > max) {\n display = `${max}+`;\n }\n\n const badgeClassname = cn(\n \"smwb-badge\",\n `smwb-badge_${color}`,\n `smwb-badge_${variant}`,\n `smwb-badge_${variant}_${vertical}`,\n `smwb-badge_${variant}_${vertical}_${horizontal}`,\n className,\n { \"smwb-badge_no-content\": hidden }\n );\n\n return (\n <span className=\"smwb-badge__wrapper\" data-testid=\"badge\">\n {children}\n <span ref={ref} className={badgeClassname} aria-label={badgeAriaLabel} {...rest}>\n {hidden ? null : display}\n </span>\n </span>\n );\n});\n\nexport default Badge;\n","import React, { HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n variant?: \"filled\" | \"elevated\" | \"outlined\";\n disabled?: boolean;\n title?: string;\n /** Footer slot rendered after the content. */\n footer?: ReactNode;\n /** Makes the card interactive (role=button, keyboard, focus ring). */\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport const Card = React.forwardRef<HTMLDivElement, PropsWithChildren<CardProps>>(function Card(\n { className, variant = \"elevated\", children, disabled, title, footer, onClick, onKeyDown, ...rest },\n ref\n) {\n const interactive = !!onClick && !disabled;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (interactive && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n ref={ref}\n data-testid=\"card\"\n className={cn(\"smwb-card\", `smwb-card_${variant}`, className, {\n card_disabled: disabled,\n \"smwb-card_interactive\": interactive,\n })}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n onClick={interactive ? onClick : undefined}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {title && <div className=\"smwb-card__title\">{title}</div>}\n {children}\n {footer && <div className=\"smwb-card__footer\">{footer}</div>}\n </div>\n );\n});\n\nexport default Card;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type ChipColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface ChipProps extends React.HTMLAttributes<HTMLSpanElement | HTMLAnchorElement> {\n className?: string;\n variant?: \"filled\" | \"outlined\";\n size?: \"small\" | \"medium\";\n color?: ChipColor;\n onDelete?: (event: React.SyntheticEvent) => void;\n icon?: React.ReactNode;\n deleteIcon?: React.ReactNode;\n label: string;\n onClick?: () => void;\n onDeleteMouseDown?: React.MouseEventHandler;\n disabled?: boolean;\n asLink?: boolean;\n href?: string;\n /** Open the link in a new tab (asLink only). */\n target?: string;\n selected?: boolean;\n /** Accessible label for the delete control. */\n deleteAriaLabel?: string;\n}\n\nexport const Chip = React.forwardRef<HTMLSpanElement | HTMLAnchorElement, ChipProps>(function Chip(\n {\n label,\n className,\n deleteIcon,\n icon,\n onDelete,\n onMouseDown: onMouseDownProp,\n onDeleteMouseDown: onDeleteMouseDownProp,\n asLink,\n href,\n target = \"_blank\",\n selected,\n variant = \"filled\",\n size = \"medium\",\n color = \"default\",\n disabled = false,\n onClick,\n deleteAriaLabel = \"Remove\",\n ...rest\n },\n ref\n) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLSpanElement | HTMLAnchorElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLSpanElement | HTMLAnchorElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n const onDeleteMouseDown = (event: React.MouseEvent) => {\n onDeleteMouseDownProp?.(event);\n event.stopPropagation();\n };\n\n const classes = cn(\n \"smwb-chip\",\n `smwb-${variant}`,\n `smwb-chip_size-${size}`,\n color !== \"default\" && `smwb-chip_color-${color}`,\n className,\n { \"smwb-disabled\": disabled, \"smwb-selected\": selected }\n );\n\n const deleteBtn = !!onDelete && (\n <button\n type=\"button\"\n className=\"smwb-chip__delete-icon\"\n aria-label={deleteAriaLabel}\n disabled={disabled}\n onClick={onDelete}\n onMouseDown={onDeleteMouseDown}\n >\n {deleteIcon ? deleteIcon : <Icon name=\"cancel\" size={18} fill={1} />}\n </button>\n );\n\n const inner = (\n <>\n {icon && <span className=\"smwb-chip__icon\">{icon}</span>}\n <span className=\"smwb-chip__label\">{label}</span>\n {deleteBtn}\n <Ripple actionRef={rippleRef} />\n </>\n );\n\n if (asLink && href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n data-testid=\"chip-link\"\n className={classes}\n href={href}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n target={target}\n rel=\"noreferrer\"\n {...rest}\n >\n {inner}\n </a>\n );\n }\n\n const clickable = !!onClick && !disabled;\n\n return (\n <span\n ref={ref}\n data-testid=\"chip\"\n className={classes}\n role={clickable ? \"button\" : undefined}\n tabIndex={clickable ? 0 : undefined}\n aria-disabled={disabled || undefined}\n onClick={clickable ? onClick : undefined}\n onKeyDown={\n clickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {inner}\n </span>\n );\n});\n\nexport default Chip;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Chip, type ChipColor } from \"../chip\";\n\nexport interface ChipGroupOption {\n value: string;\n label: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface ChipGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n options: ChipGroupOption[];\n /** Selected value (single) or values (when `multiple`). */\n value?: string | string[];\n /** Allow more than one selected chip (value becomes a string[]). */\n multiple?: boolean;\n onChange?: (value: string | string[]) => void;\n size?: \"small\" | \"medium\";\n color?: ChipColor;\n disabled?: boolean;\n}\n\n/**\n * A multi/single-select toggle group built on `Chip` — the \"chip as a toggle\"\n * loop (selected → filled, else outlined; `role=group`) apps re-hand-roll for\n * filters / segmented controls. Pass an `options` array and a controlled\n * `value`; `onChange` returns the next value (string, or string[] when multiple).\n */\nexport function ChipGroup({\n options,\n value,\n multiple,\n onChange,\n size = \"medium\",\n color = \"primary\",\n disabled,\n className,\n ...rest\n}: ChipGroupProps): React.ReactElement {\n const selectedValues = (): string[] => {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n };\n const isSelected = (option: string): boolean => selectedValues().includes(option);\n\n const toggle = (option: string): void => {\n if (multiple) {\n const current = selectedValues();\n const next = current.includes(option) ? current.filter((v) => v !== option) : [...current, option];\n onChange?.(next);\n } else {\n onChange?.(option);\n }\n };\n\n return (\n <div {...rest} role=\"group\" className={cn(\"smwb-chip-group\", className)}>\n {options.map((option) => (\n <Chip\n key={option.value}\n label={option.label}\n icon={option.icon}\n size={size}\n color={color}\n selected={isSelected(option.value)}\n variant={isSelected(option.value) ? \"filled\" : \"outlined\"}\n disabled={!!(disabled || option.disabled)}\n onClick={() => toggle(option.value)}\n />\n ))}\n </div>\n );\n}\n\nexport default ChipGroup;\n","import React, { forwardRef, useEffect, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport interface LazyImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, \"onError\"> {\n /** Image URL. When absent (or after a load error) the `fallback` is shown. */\n src?: string | undefined;\n alt?: string | undefined;\n /** Rendered in place of the image when it is missing or fails to load. */\n fallback?: React.ReactNode;\n /** Defer loading until the image scrolls into view (IntersectionObserver). Default true. */\n lazy?: boolean;\n /** CSS `aspect-ratio` for the wrapper (e.g. `1`, `\"4 / 3\"`) to reserve space before load. */\n aspectRatio?: string | number;\n /** Fires on a load error (after the fallback is swapped in). */\n onError?: (event: React.SyntheticEvent<HTMLImageElement>) => void;\n}\n\n/**\n * An `<img>` with a built-in `onError` fallback and optional in-viewport lazy\n * loading — the `<img decoding=async onError=…>` + fallback dance hand-rolled in\n * every gallery, in one primitive. SSR-safe: renders the image markup on the\n * server; the IntersectionObserver only runs in an effect on the client.\n */\nexport const LazyImage = forwardRef<HTMLImageElement, LazyImageProps>(function LazyImage(\n { src, alt, fallback, lazy = true, aspectRatio, className, onError, ...rest },\n ref\n) {\n const [failed, setFailed] = useState(false);\n const [visible, setVisible] = useState(!lazy);\n const imgRef = useRef<HTMLImageElement | null>(null);\n const setRefs = useForkRef(ref, imgRef);\n\n useEffect(() => {\n if (!lazy || visible) return;\n const el = imgRef.current;\n if (!el) return;\n if (typeof IntersectionObserver === \"undefined\") {\n setVisible(true);\n return;\n }\n const io = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setVisible(true);\n io.disconnect();\n }\n });\n io.observe(el);\n return () => io.disconnect();\n }, [lazy, visible]);\n\n const showFallback = failed || !src;\n const handleError = (event: React.SyntheticEvent<HTMLImageElement>): void => {\n setFailed(true);\n onError?.(event);\n };\n\n return (\n <span\n className={cn(\"smwb-lazy-image\", className, { \"smwb-lazy-image--empty\": showFallback })}\n style={aspectRatio != null ? { aspectRatio: String(aspectRatio) } : undefined}\n >\n {showFallback && fallback ? <span className=\"smwb-lazy-image__fallback\">{fallback}</span> : null}\n {!showFallback ? (\n <img\n {...rest}\n ref={setRefs}\n className=\"smwb-lazy-image__img\"\n src={visible ? src : undefined}\n alt={alt ?? \"\"}\n loading={lazy ? \"lazy\" : undefined}\n decoding=\"async\"\n onError={handleError}\n />\n ) : null}\n </span>\n );\n});\n\nexport default LazyImage;\n","import React, { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport cn from \"clsx\";\nimport { LazyImage } from \"../lazyImage\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport interface ThumbCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n /** Thumbnail URL; falls back to `fallback` when missing / failed. */\n src?: string;\n caption?: React.ReactNode;\n selected?: boolean;\n /** Makes the card a selectable button (keyboard + `aria-pressed`). */\n onSelect?: () => void;\n /** Shown in place of the image when `src` is missing / fails. */\n fallback?: React.ReactNode;\n /** A larger preview shown in a floating popup after a hover delay. */\n hoverPreview?: React.ReactNode | string;\n /** Top-left overlay slot (e.g. a favourite star). */\n topStart?: React.ReactNode;\n /** Top-right overlay slot (e.g. a kebab menu). */\n topEnd?: React.ReactNode;\n lazy?: boolean;\n disabled?: boolean;\n /** Delay (ms) before the hover preview appears. Default 350. */\n hoverDelay?: number;\n}\n\n/**\n * A selectable gallery card: image with an `onError` fallback + optional lazy\n * load, keyboard/`aria-pressed` selection, corner action slots, and a delayed\n * floating hover-preview. The generic gallery-card behaviour every app rebuilds\n * on top of the primitives. SSR-safe — the hover preview is client-only.\n */\nexport const ThumbCard = forwardRef<HTMLDivElement, ThumbCardProps>(function ThumbCard(\n {\n src,\n caption,\n selected,\n onSelect,\n fallback,\n hoverPreview,\n topStart,\n topEnd,\n lazy = true,\n disabled,\n hoverDelay = 350,\n className,\n ...rest\n },\n ref\n) {\n const cardRef = useRef<HTMLDivElement | null>(null);\n const setRefs = useForkRef(ref, cardRef);\n const [preview, setPreview] = useState<{ top: number; left: number } | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimer = (): void => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n const onEnter = (): void => {\n if (hoverPreview == null || disabled) return;\n clearTimer();\n timer.current = setTimeout(() => {\n const rect = cardRef.current?.getBoundingClientRect();\n if (rect) setPreview({ top: rect.top, left: rect.right + 8 });\n }, hoverDelay);\n };\n const onLeave = (): void => {\n clearTimer();\n setPreview(null);\n };\n useEffect(() => clearTimer, []);\n\n const interactive = !!onSelect && !disabled;\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (interactive && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n onSelect?.();\n }\n };\n\n return (\n <div\n {...rest}\n ref={setRefs}\n className={cn(\"smwb-thumb-card\", className, {\n \"smwb-thumb-card--selected\": selected,\n \"smwb-thumb-card--disabled\": disabled,\n \"smwb-thumb-card--interactive\": interactive,\n })}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-pressed={onSelect ? (selected ?? false) : undefined}\n aria-disabled={disabled || undefined}\n onClick={interactive ? () => onSelect?.() : undefined}\n onKeyDown={onKeyDown}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <div className=\"smwb-thumb-card__media\">\n <LazyImage src={src} lazy={lazy} fallback={fallback} />\n {topStart ? <div className=\"smwb-thumb-card__slot smwb-thumb-card__slot--start\">{topStart}</div> : null}\n {topEnd ? <div className=\"smwb-thumb-card__slot smwb-thumb-card__slot--end\">{topEnd}</div> : null}\n </div>\n {caption ? <div className=\"smwb-thumb-card__caption\">{caption}</div> : null}\n {preview && typeof document !== \"undefined\"\n ? createPortal(\n <div\n className=\"smwb-thumb-card__preview\"\n style={{ position: \"fixed\", top: preview.top, left: preview.left }}\n >\n {typeof hoverPreview === \"string\" ? <img src={hoverPreview} alt=\"\" /> : hoverPreview}\n </div>,\n document.body\n )\n : null}\n </div>\n );\n});\n\nexport default ThumbCard;\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { useVirtualList } from \"../../../hooks/useVirtualList\";\n\nexport interface AssetGridProps<T> {\n items: T[];\n /** Render one cell. `index` is the absolute index into `items`. */\n renderItem: (item: T, index: number) => React.ReactNode;\n /** Minimum column width (px); drives the column count from the measured width. Default 160. */\n minColumn?: number;\n /** Fixed cell height (px). */\n rowHeight: number;\n /** Gap (px) between cells on both axes. Default 8. */\n gap?: number;\n /** Extra rows rendered above/below the viewport. Default 2. */\n overscan?: number;\n loading?: boolean;\n /** Skeleton tile count while loading. Default 12. */\n loadingCount?: number;\n emptyLabel?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * A virtualized, data-shape-agnostic asset grid: measures its own width to pick a\n * column count, windows rows via `useVirtualList`, and renders only the visible\n * cells through a `renderItem` slot — with loading skeletons + an empty state. The\n * windowing math every catalog app reimplements, upstreamed. SSR-safe: before it\n * can measure (server + first paint) it renders a plain auto-fill grid of all\n * items, then virtualizes after mount.\n */\nexport function AssetGrid<T>({\n items,\n renderItem,\n minColumn = 160,\n rowHeight,\n gap = 8,\n overscan = 2,\n loading,\n loadingCount = 12,\n emptyLabel,\n className,\n style,\n}: AssetGridProps<T>): React.ReactElement {\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const [width, setWidth] = useState(0);\n const [height, setHeight] = useState(0);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n const el = viewportRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n setWidth(el.clientWidth);\n setHeight(el.clientHeight);\n setReady(true);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const cols = useMemo(\n () => (width <= 0 ? 1 : Math.max(1, Math.floor((width + gap) / (minColumn + gap)))),\n [width, gap, minColumn]\n );\n const rowCount = Math.ceil(items.length / cols);\n const vl = useVirtualList({\n itemCount: rowCount,\n itemHeight: rowHeight + gap,\n viewportHeight: height || 1,\n overscan,\n });\n\n const plainStyle: React.CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: `repeat(auto-fill, minmax(${minColumn}px, 1fr))`,\n gap,\n gridAutoRows: rowHeight,\n };\n const rowStyle: React.CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,\n gap,\n height: rowHeight,\n marginBottom: gap,\n };\n\n let body: React.ReactNode;\n if (loading) {\n body = (\n <div className=\"smwb-asset-grid__plain\" style={plainStyle}>\n {Array.from({ length: loadingCount }).map((_, i) => (\n <div key={i} className=\"smwb-asset-grid__skeleton\" style={{ height: rowHeight }} />\n ))}\n </div>\n );\n } else if (items.length === 0) {\n body = <div className=\"smwb-asset-grid__empty\">{emptyLabel}</div>;\n } else if (!ready) {\n body = (\n <div className=\"smwb-asset-grid__plain\" style={plainStyle}>\n {items.map((item, index) => (\n <React.Fragment key={index}>{renderItem(item, index)}</React.Fragment>\n ))}\n </div>\n );\n } else {\n body = (\n <div className=\"smwb-asset-grid__sizer\" style={{ height: vl.totalHeight, position: \"relative\" }}>\n <div\n className=\"smwb-asset-grid__band\"\n style={{ position: \"absolute\", top: 0, left: 0, right: 0, transform: `translateY(${vl.offsetY}px)` }}\n >\n {Array.from({ length: Math.max(0, vl.endIndex - vl.startIndex) }).map((_, r) => {\n const row = vl.startIndex + r;\n return (\n <div key={row} className=\"smwb-asset-grid__row\" style={rowStyle}>\n {Array.from({ length: cols }).map((_, c) => {\n const index = row * cols + c;\n return index < items.length ? (\n <React.Fragment key={c}>{renderItem(items[index], index)}</React.Fragment>\n ) : null;\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n return (\n <div ref={viewportRef} className={cn(\"smwb-asset-grid\", className)} style={style} onScroll={vl.onScroll}>\n {body}\n </div>\n );\n}\n\nexport default AssetGrid;\n","import React, { forwardRef, PropsWithChildren, useEffect, useRef, useState } from \"react\";\nimport { CSSTransition } from \"react-transition-group\";\nimport { createPortal } from \"react-dom\";\nimport cn from \"clsx\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport interface ModalProps {\n size?: \"small\" | \"medium\" | \"large\" | \"fullscreen\";\n closeOnOutsideClick?: boolean;\n onClose?: () => void;\n open: boolean;\n animation?: \"fade\" | \"scale\" | \"drop\";\n className?: string;\n backdrop?: \"blured\" | \"dark\" | \"transparent\" | \"darkBlured\";\n asForm?: boolean;\n disableAppearAnimation?: boolean;\n /** ARIA role of the dialog. */\n role?: \"dialog\" | \"alertdialog\";\n /** Close the modal when Escape is pressed. */\n closeOnEsc?: boolean;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n}\n\nconst ModalBase = forwardRef<HTMLDivElement, PropsWithChildren<ModalProps>>(function Modal(\n {\n children,\n onClose,\n open,\n className,\n animation = \"fade\",\n backdrop = \"dark\",\n size = \"large\",\n closeOnOutsideClick = true,\n asForm = false,\n disableAppearAnimation = false,\n role = \"dialog\",\n closeOnEsc = true,\n ...rest\n },\n ref\n) {\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n\n const nodeRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const forkedContentRef = useForkRef<HTMLDivElement>(ref, contentRef);\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n useEffect(() => {\n if (!open || !closeOnEsc || !onClose) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [open, closeOnEsc, onClose]);\n\n if (!domRoot) {\n return <></>;\n }\n\n const Component = (asForm ? \"form\" : \"div\") as \"div\";\n\n return createPortal(\n <CSSTransition\n timeout={{\n appear: 225,\n enter: 225,\n exit: 150,\n }}\n in={open}\n classNames={{\n appear: \"smwb-modal__overlay-appear\",\n appearActive: \"smwb-modal__overlay-appear-active\",\n appearDone: \"smwb-modal__overlay-appear-done\",\n enter: \"smwb-modal__overlay-enter\",\n enterActive: \"smwb-modal__overlay-enter-active\",\n enterDone: \"smwb-modal__overlay-enter-done\",\n exit: \"smwb-modal__overlay-exit\",\n exitActive: \"smwb-modal__overlay-exit-active\",\n }}\n appear={!disableAppearAnimation}\n mountOnEnter\n unmountOnExit\n nodeRef={nodeRef}\n >\n <div\n ref={nodeRef}\n className={cn(\"smwb-modal__overlay\", `smwb-${backdrop}`, `smwb-${size}`)}\n onClick={closeOnOutsideClick && onClose ? onClose : undefined}\n >\n <Component\n ref={forkedContentRef}\n className={cn(\"smwb-modal\", `smwb-${size}`, `smwb-${animation}`, className)}\n onClick={(e) => e.stopPropagation()}\n role={role}\n aria-modal=\"true\"\n {...rest}\n >\n {children}\n </Component>\n </div>\n </CSSTransition>,\n domRoot\n );\n});\n\nexport interface HeaderProps {\n className?: string;\n}\n\nexport function Header({ className, children }: PropsWithChildren<HeaderProps>) {\n return <div className={cn(\"smwb-modal__header\", className)}>{children}</div>;\n}\n\nexport interface ContentProps {\n className?: string;\n}\n\nexport function Content({ className, children }: PropsWithChildren<ContentProps>) {\n return <div className={cn(\"smwb-modal__content\", className)}>{children}</div>;\n}\n\nexport interface FooterProps {\n className?: string;\n}\n\nexport function Footer({ className, children }: PropsWithChildren<FooterProps>) {\n return <div className={cn(\"smwb-modal__footer\", className)}>{children}</div>;\n}\n\nexport const Modal = Object.assign(ModalBase, {\n Footer,\n Header,\n Content,\n});\n\nexport default Modal;\n","import React from \"react\";\n\nexport function getActiveSlideDotsLength(slidesCount: number, slidesToShow: number): number {\n const dots = Math.floor(slidesCount / slidesToShow);\n\n return slidesCount % slidesToShow === 0 ? dots - 1 : dots;\n}\n\nexport function getSlideIndexForMultipleParts(\n activeIndex: number,\n slidesToShow: number,\n slidesCount: number,\n isNextSlideDisabled: boolean\n): number {\n const dotsLength = getActiveSlideDotsLength(slidesCount, slidesToShow);\n\n if (activeIndex === slidesCount + slidesToShow) {\n return 0;\n }\n\n if (isNextSlideDisabled || (activeIndex < slidesToShow && activeIndex !== 0)) {\n return dotsLength;\n }\n\n if (activeIndex === 0) {\n return slidesCount % slidesToShow === 0 ? dotsLength : dotsLength - 1;\n }\n\n return slidesToShow > 0 ? Math.floor(activeIndex / slidesToShow) - 1 : 0;\n}\n\nexport function isReactEvent(event: React.SyntheticEvent | Event): event is React.SyntheticEvent {\n return !(event instanceof Event);\n}\n\nexport function isMouseEvent(\n event: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent\n): event is React.MouseEvent | MouseEvent {\n return (isReactEvent(event) && event.nativeEvent instanceof MouseEvent) || event instanceof MouseEvent;\n}\n\nexport function isTouchEvent(\n event: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent\n): event is React.TouchEvent | TouchEvent {\n return (\n window.TouchEvent &&\n ((isReactEvent(event) && event.nativeEvent instanceof TouchEvent) || event instanceof TouchEvent)\n );\n}\n\nexport function coordX(event: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent): number {\n if (isMouseEvent(event)) {\n return event.clientX;\n }\n\n if (isTouchEvent(event)) {\n return event.changedTouches[0].clientX;\n }\n\n return 0;\n}\n\nexport function coordY(event: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent): number {\n if (isMouseEvent(event)) {\n return event.clientY;\n }\n\n if (isTouchEvent(event)) {\n return event.changedTouches[0].clientY;\n }\n\n return 0;\n}\n\nexport function dragPrevent(event: React.SyntheticEvent) {\n const target = event.target as HTMLElement;\n\n if (target.tagName === \"A\" || target.tagName === \"IMG\") {\n event.preventDefault();\n }\n}\n\nexport function getSlideStyle(slidesToShow: number): React.CSSProperties {\n const width = `${getSlideWidth(slidesToShow)}%`;\n\n return { width };\n}\n\nexport function getSlideWidth(slidesToShow: number): number {\n return 100 / slidesToShow;\n}\n\nexport function getSlidesToShow(slidesToShow: number, slidesCount: number): number {\n if (slidesToShow <= 0 || slidesCount === 0) {\n return 1;\n }\n\n if (slidesToShow > slidesCount) {\n return slidesCount;\n }\n\n return slidesToShow;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/** Number -> \"<n>px\", string -> as-is, nullish -> undefined. */\nexport function toCssLength(value?: number | string): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\n/** Number/string -> string, nullish -> undefined (for unit-less CSS values like aspect-ratio). */\nexport function toCssNumber(value?: number | string): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n return String(value);\n}\n\nexport function getStartSlide(startSlide: number, slidesCount: number): number {\n if (startSlide <= 0 || slidesCount === 0) {\n return 0;\n }\n\n const maxIndex = slidesCount - 1;\n\n if (startSlide > maxIndex) {\n return maxIndex;\n }\n\n return startSlide;\n}\n","import React from \"react\";\nimport { useSafeLayoutEffect } from \"./useSafeLayoutEffect\";\n\n/**\n * https://github.com/facebook/react/issues/14099#issuecomment-440013892\n */\nexport function useEventCallback<Args extends unknown[], Return>(\n fn: (...args: Args) => Return\n): (...args: Args) => Return {\n const ref = React.useRef(fn);\n\n // useSafeLayoutEffect falls back to useEffect on the server so this hook does\n // not emit React's \"useLayoutEffect does nothing on the server\" SSR warning.\n useSafeLayoutEffect(() => {\n ref.current = fn;\n });\n\n return React.useCallback((...args: Args) => (0, ref.current)(...args), []);\n}\n","import React, { forwardRef, ReactNode, useEffect, useId, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { Icon } from \"../../base/icon\";\nimport { Modal } from \"../../feedBack/modal\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport {\n clamp,\n coordX,\n coordY,\n dragPrevent,\n getSlideIndexForMultipleParts,\n getSlidesToShow,\n getSlideStyle,\n getSlideWidth,\n getStartSlide,\n isMouseEvent,\n isTouchEvent,\n toCssLength,\n toCssNumber,\n} from \"./utils\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useEventCallback } from \"../../../hooks/useEventCallback\";\n\nexport interface CarouselProps extends React.PropsWithChildren {\n slidesToShow?: number;\n startSlide?: number;\n className?: string;\n showNavigation?: boolean;\n showArrows?: boolean;\n arrowsSize?: number;\n navigationClassName?: string;\n onSlideChange?: (slideIndex: number) => void;\n navigationDotRenderer?: (index: number, isActive: boolean, onClick: (index: number) => void) => ReactNode;\n /** Accessible label for the carousel region. */\n \"aria-label\"?: string;\n /** Advance slides automatically. */\n autoplay?: boolean;\n /** Autoplay interval in ms. */\n autoplayInterval?: number;\n /** Pause autoplay while the pointer is over the carousel. */\n pauseOnHover?: boolean;\n /** Height of each cell/photo. Number is treated as px. Overrides the default 205px. */\n cellHeight?: number | string;\n /** Aspect ratio of each cell/photo (e.g. 0.9 or \"16 / 9\"). Overrides the default 0.9. */\n aspectRatio?: number | string;\n /** Per-side spacing around each slide. Number is treated as px (default 4). */\n gap?: number | string;\n /** Max width of the carousel. Number is treated as px (default 412). */\n maxWidth?: number | string;\n /** Open the clicked slide in a fullscreen lightbox (arrows / swipe / Esc to navigate & close). */\n enableFullscreen?: boolean;\n}\n\ninterface ShiftState {\n animation: boolean | undefined;\n}\n\ntype Axis = \"x\" | \"y\" | null;\n\ninterface Motion {\n isPressed: boolean;\n startX: number;\n startY: number;\n lastX: number;\n lastT: number;\n axis: Axis;\n dragged: boolean;\n}\n\nconst MOTION_INITIAL_STATE: Motion = {\n isPressed: false,\n startX: 0,\n startY: 0,\n lastX: 0,\n lastT: 0,\n axis: null,\n dragged: false,\n};\n\n// Movement (px) below which a pointer interaction is treated as a tap, not a drag.\nconst TAP_THRESHOLD = 8;\n// Flick velocity (px/ms) above which we advance a slide even on a short drag.\nconst FLICK_VELOCITY = 0.4;\n\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(function Carousel(\n {\n slidesToShow: slidesToShowProp = 3,\n startSlide: startSlideProp = 0,\n children,\n className,\n showNavigation = true,\n showArrows: showArrowsProp,\n arrowsSize = 30,\n navigationClassName,\n onSlideChange,\n navigationDotRenderer,\n \"aria-label\": ariaLabel = \"Carousel\",\n autoplay = false,\n autoplayInterval = 4000,\n pauseOnHover = true,\n cellHeight,\n aspectRatio,\n gap,\n maxWidth,\n enableFullscreen = false,\n },\n ref\n) {\n const slidesCount = React.Children.count(children);\n const slidesToShow = getSlidesToShow(slidesToShowProp, slidesCount);\n const startSlide = getStartSlide(startSlideProp, slidesCount);\n const showArrows = showArrowsProp && slidesCount > 1;\n const maxShift = Math.max(0, slidesCount - slidesToShow);\n\n const [activeSlideIndex, setActiveSlideIndex] = useState<number>(startSlide);\n const [shiftState, setShiftState] = useState<ShiftState>({\n animation: undefined,\n });\n // Live pointer-follow offset (px) applied on top of the resting %-based indent.\n const [dragPx, setDragPx] = useState<number>(0);\n const [isDragging, setIsDragging] = useState<boolean>(false);\n const [fullscreenIndex, setFullscreenIndex] = useState<number | null>(null);\n // Live finger-follow offset (px) for the fullscreen track.\n const [fullscreenDragPx, setFullscreenDragPx] = useState<number>(0);\n const [isFullscreenDragging, setIsFullscreenDragging] = useState<boolean>(false);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const outerRef = useRef<HTMLDivElement>(null);\n const forkedOuterRef = useForkRef<HTMLDivElement>(ref, outerRef);\n const trackRef = useRef<HTMLDivElement>(null);\n const [isHovered, setIsHovered] = useState<boolean>(false);\n\n const motion = useRef<Motion>({ ...MOTION_INITIAL_STATE });\n\n useSafeLayoutEffect(() => {\n setShiftState((prevState) => ({\n ...prevState,\n animation: false,\n }));\n }, [slidesToShow]);\n\n useSafeLayoutEffect(() => {\n setActiveSlideIndex(startSlide);\n onSlideChange?.(startSlide);\n\n if (shiftState.animation !== undefined) {\n setShiftState((prevState) => ({\n ...prevState,\n animation: true,\n }));\n }\n }, [startSlide]);\n\n const setMotion = (value: Partial<Motion>) => {\n Object.assign<Motion, Partial<Motion>>(motion.current, value);\n };\n\n const now = () => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n\n const goToSlide = (index: number) => {\n const target = clamp(index, 0, maxShift);\n\n setActiveSlideIndex(target);\n setShiftState((prevState) => ({ ...prevState, animation: true }));\n onSlideChange?.(target);\n };\n\n const moveFullscreen = (direction: 1 | -1) => {\n setFullscreenIndex((prev) => (prev === null ? prev : (prev + direction + slidesCount) % slidesCount));\n };\n\n const fullscreenTouchX = useRef<number | null>(null);\n\n const detachListeners = (isMouse: boolean) => {\n if (!trackRef.current) {\n return;\n }\n\n trackRef.current.removeEventListener(isMouse ? \"mousemove\" : \"touchmove\", onMove);\n trackRef.current.removeEventListener(isMouse ? \"mouseup\" : \"touchend\", onEnd);\n\n if (isMouse) {\n trackRef.current.removeEventListener(\"mouseleave\", onEnd);\n }\n };\n\n const onStart = useEventCallback((event: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>) => {\n if (!trackRef.current) {\n return;\n }\n\n const isMouse = isMouseEvent(event);\n\n if (isMouse && event.button !== 0) {\n return;\n }\n\n event.stopPropagation();\n\n const clientX = coordX(event);\n const clientY = coordY(event);\n\n setMotion({\n isPressed: true,\n startX: clientX,\n startY: clientY,\n lastX: clientX,\n lastT: now(),\n axis: null,\n dragged: false,\n });\n\n trackRef.current.addEventListener(isMouse ? \"mousemove\" : \"touchmove\", onMove, { passive: false });\n trackRef.current.addEventListener(isMouse ? \"mouseup\" : \"touchend\", onEnd);\n\n if (isMouse) {\n trackRef.current.addEventListener(\"mouseleave\", onEnd);\n }\n });\n\n const onMove = useEventCallback((event: MouseEvent | TouchEvent) => {\n if (!rootRef.current || !motion.current.isPressed) {\n return;\n }\n\n if (isTouchEvent(event) && event.touches.length > 1) {\n return onEnd(event);\n }\n\n const clientX = coordX(event);\n const clientY = coordY(event);\n const shiftX = clientX - motion.current.startX;\n const shiftY = clientY - motion.current.startY;\n\n // Lock the gesture axis once the pointer has moved past the tap threshold.\n if (motion.current.axis === null) {\n if (Math.abs(shiftX) < TAP_THRESHOLD && Math.abs(shiftY) < TAP_THRESHOLD) {\n return;\n }\n\n const axis: Axis = Math.abs(shiftX) >= Math.abs(shiftY) ? \"x\" : \"y\";\n setMotion({ axis, dragged: true });\n\n // Vertical intent → release so the page can scroll.\n if (axis === \"y\") {\n return onEnd(event);\n }\n\n if (slidesCount > 1) {\n setIsDragging(true);\n }\n }\n\n if (motion.current.axis !== \"x\") {\n return;\n }\n\n // Horizontal drag: keep the gesture and follow the finger.\n event.preventDefault();\n event.stopPropagation();\n\n if (slidesCount > 1) {\n const atStart = activeSlideIndex <= 0;\n const atEnd = activeSlideIndex >= maxShift;\n // Add resistance when dragging beyond the first / last slide.\n const offset = (atStart && shiftX > 0) || (atEnd && shiftX < 0) ? shiftX * 0.35 : shiftX;\n setDragPx(offset);\n }\n\n motion.current.lastX = clientX;\n motion.current.lastT = now();\n });\n\n const onEnd = useEventCallback((event: MouseEvent | TouchEvent) => {\n if (!motion.current.isPressed) {\n return;\n }\n\n const isMouse = isMouseEvent(event);\n detachListeners(isMouse);\n\n const { axis, dragged, startX, lastX, lastT } = motion.current;\n setMotion({ isPressed: false });\n setIsDragging(false);\n\n if (axis === \"x\" && dragged && slidesCount > 1 && rootRef.current) {\n const clientX = coordX(event);\n const totalShift = clientX - startX;\n const widthPerSlide = rootRef.current.offsetWidth / slidesToShow;\n const velocity = lastT ? (clientX - lastX) / Math.max(1, now() - lastT) : 0;\n\n let movedSlides = widthPerSlide > 0 ? Math.round(-totalShift / widthPerSlide) : 0;\n\n if (movedSlides === 0 && Math.abs(velocity) > FLICK_VELOCITY) {\n movedSlides = velocity < 0 ? 1 : -1;\n }\n\n goToSlide(activeSlideIndex + movedSlides);\n }\n\n // Animate back to the resting position (snap / snap-back).\n setDragPx(0);\n });\n\n const onSlideClick = (index: number) => () => {\n // Suppress the click that fires at the end of a drag.\n if (motion.current.dragged) {\n return;\n }\n\n if (enableFullscreen) {\n setFullscreenIndex(index);\n }\n };\n\n const onNavigationItemClick = (index: number) => () => goToSlide(index);\n\n const getNextIndex = (direction: 1 | -1) => {\n const isSingleSlide = slidesToShow === 1;\n const totalGroups = isSingleSlide ? slidesCount : Math.ceil(slidesCount / slidesToShow);\n const activeIndex = activeSlideIndex + slidesToShow;\n const isNextSlideDisabled = slidesCount - slidesToShow <= activeSlideIndex;\n\n const currentIndex = getSlideIndexForMultipleParts(activeIndex, slidesToShow, slidesCount, isNextSlideDisabled);\n const nextIndex = (currentIndex + direction + totalGroups) % totalGroups;\n\n return isSingleSlide ? nextIndex : nextIndex * slidesToShow;\n };\n\n const getNavigation = () => {\n if (!showNavigation) {\n return <></>;\n }\n\n const isNextSlideDisabled = slidesCount - slidesToShow <= activeSlideIndex;\n const isSinglePartSlide = slidesToShow === 1;\n const count = isSinglePartSlide ? slidesCount : Math.ceil(slidesCount / slidesToShow);\n const indicators: React.ReactNode[] = [];\n\n for (let index = 0; index < count; index++) {\n let nextIndex = index;\n let currentIndex = activeSlideIndex;\n\n if (!isSinglePartSlide) {\n const isLast = index === count - 1;\n const activeIndex = activeSlideIndex + slidesToShow;\n\n nextIndex = isLast ? slidesCount - slidesToShow : index * slidesToShow;\n currentIndex = getSlideIndexForMultipleParts(activeIndex, slidesToShow, slidesCount, isNextSlideDisabled);\n }\n\n const isActive = currentIndex === index;\n const onClick = onNavigationItemClick(nextIndex);\n\n let indicator: ReactNode = (\n <div key={index} className={cn(\"smwb-carousel__navigation__dot\", isActive && \"current\")} onClick={onClick} />\n );\n\n if (navigationDotRenderer) {\n indicator = navigationDotRenderer(index, isActive, onClick);\n }\n\n indicators.push(indicator);\n }\n\n return <div className={cn(\"smwb-carousel__navigation\", navigationClassName)}>{indicators}</div>;\n };\n\n const getIndent = () => {\n const shiftSlides = activeSlideIndex > maxShift ? maxShift : activeSlideIndex;\n\n return getSlideWidth(slidesToShow) * shiftSlides;\n };\n\n const slideId = useId();\n const slideStyle = getSlideStyle(slidesToShow);\n\n const indent = getIndent();\n\n const layerStyle: React.CSSProperties = {\n transform: `translateX(calc(-${indent}% + ${dragPx}px))`,\n transition:\n isDragging || shiftState.animation === undefined\n ? \"none\"\n : shiftState.animation\n ? \"transform 500ms cubic-bezier(.1, 0, .25, 1)\"\n : \"none\",\n };\n\n const rootStyle: React.CSSProperties = {};\n const cellHeightValue = toCssLength(cellHeight);\n const aspectRatioValue = toCssNumber(aspectRatio);\n const gapValue = toCssLength(gap);\n const maxWidthValue = toCssLength(maxWidth);\n if (cellHeightValue) (rootStyle as Record<string, string>)[\"--smwb-carousel-cell-height\"] = cellHeightValue;\n if (aspectRatioValue) (rootStyle as Record<string, string>)[\"--smwb-carousel-aspect-ratio\"] = aspectRatioValue;\n if (gapValue) (rootStyle as Record<string, string>)[\"--smwb-carousel-gap\"] = gapValue;\n if (maxWidthValue) (rootStyle as Record<string, string>)[\"--smwb-carousel-max-width\"] = maxWidthValue;\n\n React.useEffect(() => {\n if (!Array.isArray(children)) {\n console.error(\"SMWB Material: The `children` prop was passed invalidly. It should contain an array of elements.\");\n }\n }, [children]);\n\n useEffect(() => {\n if (!autoplay || slidesCount <= 1 || (pauseOnHover && isHovered) || fullscreenIndex !== null) {\n return;\n }\n const timer = window.setInterval(() => {\n onNavigationItemClick(getNextIndex(1))();\n }, autoplayInterval);\n\n return () => window.clearInterval(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n autoplay,\n autoplayInterval,\n pauseOnHover,\n isHovered,\n slidesCount,\n activeSlideIndex,\n slidesToShow,\n fullscreenIndex,\n ]);\n\n useEffect(() => {\n if (fullscreenIndex === null || slidesCount <= 1) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"ArrowLeft\") {\n moveFullscreen(-1);\n } else if (event.key === \"ArrowRight\") {\n moveFullscreen(1);\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fullscreenIndex, slidesCount]);\n\n if (!Array.isArray(children)) {\n return <></>;\n }\n\n const childrenArray = children as ReactNode[];\n\n const onFullscreenTouchStart = (event: React.TouchEvent) => {\n fullscreenTouchX.current = event.touches[0]?.clientX ?? null;\n };\n\n const onFullscreenTouchMove = (event: React.TouchEvent) => {\n if (fullscreenTouchX.current === null || slidesCount <= 1) {\n return;\n }\n const delta = (event.touches[0]?.clientX ?? fullscreenTouchX.current) - fullscreenTouchX.current;\n setIsFullscreenDragging(true);\n setFullscreenDragPx(delta);\n };\n\n const onFullscreenTouchEnd = (event: React.TouchEvent) => {\n const startX = fullscreenTouchX.current;\n fullscreenTouchX.current = null;\n setIsFullscreenDragging(false);\n setFullscreenDragPx(0);\n\n if (startX === null || slidesCount <= 1) {\n return;\n }\n const delta = (event.changedTouches[0]?.clientX ?? startX) - startX;\n if (Math.abs(delta) > 40) {\n moveFullscreen(delta < 0 ? 1 : -1);\n }\n };\n\n const fullscreenTrackStyle: React.CSSProperties = {\n transform: `translateX(calc(-${(fullscreenIndex ?? 0) * 100}% + ${fullscreenDragPx}px))`,\n transition: isFullscreenDragging ? \"none\" : \"transform 350ms cubic-bezier(.22, .61, .36, 1)\",\n };\n\n return (\n <div\n className={cn(\"smwb-carousel\", className)}\n data-testid=\"carousel\"\n ref={forkedOuterRef}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={ariaLabel}\n style={rootStyle}\n onMouseEnter={pauseOnHover ? () => setIsHovered(true) : undefined}\n onMouseLeave={pauseOnHover ? () => setIsHovered(false) : undefined}\n >\n <div className={cn(\"smwb-carousel__inner\")} ref={rootRef}>\n {showArrows && (\n <Icon\n name=\"chevron_left\"\n size={arrowsSize}\n className={cn(\"smwb-carousel__arrow\", \"smwb-carousel__arrow_prev\")}\n style={{\n top: `calc(50% - ${arrowsSize / 2}px)`,\n left: -arrowsSize / 2,\n }}\n onClick={() => onNavigationItemClick(getNextIndex(-1))()}\n />\n )}\n <div\n ref={trackRef}\n className=\"smwb-carousel__track\"\n onMouseDown={onStart}\n onTouchStart={onStart}\n onDragStart={dragPrevent}\n onDragEnd={dragPrevent}\n >\n <div className=\"smwb-carousel__layer\" style={layerStyle}>\n {React.Children.map(children, (child, index) => (\n <div key={index} id={`${slideId}${index}`} className=\"smwb-carousel__slide\" style={slideStyle}>\n <div\n className={cn(\n \"smwb-carousel__slide-inner\",\n enableFullscreen && \"smwb-carousel__slide-inner_clickable\"\n )}\n onClick={enableFullscreen ? onSlideClick(index) : undefined}\n >\n {child}\n </div>\n </div>\n ))}\n </div>\n </div>\n {showArrows && (\n <Icon\n name=\"chevron_right\"\n size={arrowsSize}\n className={cn(\"smwb-carousel__arrow\", \"smwb-carousel__arrow_next\")}\n style={{\n top: `calc(50% - ${arrowsSize / 2}px)`,\n right: -arrowsSize / 2,\n }}\n onClick={() => onNavigationItemClick(getNextIndex(1))()}\n />\n )}\n </div>\n {getNavigation()}\n {enableFullscreen && (\n <Modal\n open={fullscreenIndex !== null}\n size=\"fullscreen\"\n backdrop=\"darkBlured\"\n className=\"smwb-carousel__fullscreen\"\n onClose={() => setFullscreenIndex(null)}\n aria-label=\"Image viewer\"\n >\n {fullscreenIndex !== null && (\n <div className=\"smwb-carousel__fullscreen-content\">\n {slidesCount > 1 && (\n <Icon\n name=\"chevron_left\"\n size={40}\n className={cn(\"smwb-carousel__fullscreen-arrow\", \"smwb-carousel__fullscreen-arrow_prev\")}\n onClick={() => moveFullscreen(-1)}\n />\n )}\n <div\n className=\"smwb-carousel__fullscreen-stage\"\n onTouchStart={onFullscreenTouchStart}\n onTouchMove={onFullscreenTouchMove}\n onTouchEnd={onFullscreenTouchEnd}\n >\n <div className=\"smwb-carousel__fullscreen-track\" style={fullscreenTrackStyle}>\n {childrenArray.map((child, index) => (\n <div\n key={index}\n className=\"smwb-carousel__fullscreen-slide\"\n aria-hidden={index !== fullscreenIndex}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n {slidesCount > 1 && (\n <Icon\n name=\"chevron_right\"\n size={40}\n className={cn(\"smwb-carousel__fullscreen-arrow\", \"smwb-carousel__fullscreen-arrow_next\")}\n onClick={() => moveFullscreen(1)}\n />\n )}\n <Icon\n name=\"close\"\n size={32}\n className=\"smwb-carousel__fullscreen-close\"\n onClick={() => setFullscreenIndex(null)}\n />\n </div>\n )}\n </Modal>\n )}\n </div>\n );\n});\n\nexport default Carousel;\n","import { useCallback, useState } from \"react\";\n\nexport const useModalState = () => {\n const [isOpen, setIsOpen] = useState(false);\n\n const onClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const onOpen = useCallback(() => {\n setIsOpen(true);\n }, []);\n\n return { onClose, onOpen, isOpen };\n};\n","import React from \"react\";\n\nexport const ImagesListContext = React.createContext<{\n rowsHeight?: number;\n variant?: \"woven\" | \"masonry\" | \"default\" | null;\n}>({\n rowsHeight: 0,\n});\n","import React, { CSSProperties, useContext, useEffect } from \"react\";\nimport cn from \"clsx\";\nimport { useModalState } from \"../../../../hooks/useModalState\";\nimport { ImagesListItemModal } from \"../index\";\nimport { ImagesListContext } from \"../imagesListContext\";\n\nexport interface ImagesListItemProps {\n className?: string;\n src: string;\n rowsHeight?: number;\n cols: number;\n rows: number;\n rounded?: boolean;\n itemBarPlacement?: \"top\" | \"bottom\" | \"under\";\n itemBarContent?: React.ReactNode;\n alt?: string;\n}\n\nconst ImagesListItem = ({\n className,\n src,\n rounded,\n itemBarContent,\n cols = 1,\n rows = 1,\n itemBarPlacement = \"bottom\",\n alt = \"image\",\n}: ImagesListItemProps) => {\n const { isOpen, onClose, onOpen } = useModalState();\n const { rowsHeight, variant } = useContext(ImagesListContext);\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"auto\";\n }\n }, [isOpen]);\n\n const style: CSSProperties = {\n height: rowsHeight ? `${rowsHeight * rows}px` : \"\",\n gridRowEnd: `span ${rows}`,\n gridColumnEnd: `span ${cols}`,\n };\n\n return (\n <>\n <li\n data-testid=\"images-list-item\"\n className={cn(\"smwb-gallery__list__item\", className, \"smwb-gallery-item\", `smwb-${variant}`)}\n onClick={onOpen}\n style={style}\n >\n <div className=\"smwb-gallery-item__inner\">\n <div className=\"smwb-gallery-item__img-wrapper\">\n <img src={src} alt={alt || \"image\"} className={cn(\"smwb-gallery-item__img\", { \"smwb-rounded\": rounded })} />\n </div>\n {itemBarContent && (\n <div\n className={cn(\"smwb-gallery-item__bar\", className, `smwb-${itemBarPlacement}`, {\n \"smwb-rounded\": rounded,\n })}\n >\n {itemBarContent}\n </div>\n )}\n </div>\n </li>\n <ImagesListItemModal src={src} onClose={onClose} isOpen={isOpen} />\n </>\n );\n};\n\nexport default ImagesListItem;\n","import React, { CSSProperties, forwardRef, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\nimport { ImagesListContext } from \"./imagesListContext\";\n\nexport interface ImagesListProps {\n className?: string;\n rowsHeight?: number;\n cols: number;\n variant?: \"woven\" | \"masonry\" | \"default\";\n gap?: number;\n /** Accessible label for the image list. */\n \"aria-label\"?: string;\n id?: string;\n}\n\nexport const ImagesList = forwardRef<HTMLDivElement, PropsWithChildren<ImagesListProps>>(function ImagesList(\n { className, children, gap = 4, cols = 3, rowsHeight = 0, variant = \"default\", \"aria-label\": ariaLabel, id },\n ref\n) {\n return (\n <ImagesListContext.Provider value={{ rowsHeight, variant }}>\n <div className={cn(\"smwb-gallery\", className)} data-testid=\"images-list\" ref={ref} id={id}>\n <ul\n aria-label={ariaLabel}\n className={cn(\"smwb-gallery__list\", `smwb-${variant}`)}\n style={{ \"--cols-count\": cols, \"--gap\": `${gap}px` } as CSSProperties}\n >\n {children}\n </ul>\n </div>\n </ImagesListContext.Provider>\n );\n});\n\nexport default ImagesList;\n","import { useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CSSTransition } from \"react-transition-group\";\n\nexport interface ImagesListItemModalProps {\n src: string;\n onClose: () => void;\n isOpen: boolean;\n}\n\nconst ImagesListItemModal = ({ src, onClose, isOpen }: ImagesListItemModalProps) => {\n const nodeRef = useRef<HTMLDivElement>(null);\n return createPortal(\n <CSSTransition\n timeout={100}\n in={isOpen}\n classNames={{\n enterActive: \"smwb-image-modal__overlay-enter-active\",\n enterDone: \"smwb-image-modal__overlay-enter-done\",\n }}\n mountOnEnter\n unmountOnExit\n nodeRef={nodeRef}\n >\n <div className=\"smwb-image-modal__overlay\" onClick={onClose} ref={nodeRef}>\n <div className=\"smwb-image-modal\" onClick={(e) => e.stopPropagation()}>\n <img src={src} alt=\"\" className=\"smwb-image-modal__img\" />\n </div>\n </div>\n </CSSTransition>,\n document.body\n );\n};\n\nexport default ImagesListItemModal;\n","import React, { forwardRef, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface ListItemProps {\n disabled?: boolean;\n className?: string;\n selected?: boolean;\n /** Compact row. */\n dense?: boolean;\n /** Render a bottom divider. */\n divider?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLLIElement>;\n}\n\nexport const ListItem = forwardRef<HTMLLIElement, PropsWithChildren<ListItemProps>>(function ListItem(\n { className, children, disabled, selected, dense, divider, startAdornment, endAdornment, onClick },\n ref\n) {\n const interactive = !!onClick && !disabled;\n\n return (\n <li\n ref={ref}\n role=\"listitem\"\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n onClick={disabled ? undefined : onClick}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLLIElement>);\n }\n }\n : undefined\n }\n className={cn(\"smwb-list__item\", className, {\n \"smwb-disabled\": disabled,\n \"smwb-selected\": selected,\n \"smwb-list__item_dense\": dense,\n \"smwb-list__item_divider\": divider,\n })}\n data-testid=\"list-item\"\n >\n <span className=\"smwb-list__item__start\">{startAdornment}</span>\n <span className=\"smwb-list__item__main\">{children}</span>\n <span className=\"smwb-list__item__end\">{endAdornment}</span>\n </li>\n );\n});\n\nexport default ListItem;\n","import { forwardRef, HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\n\nexport interface ListProps extends HTMLAttributes<HTMLUListElement> {\n className?: string;\n /** Compact vertical rhythm. */\n dense?: boolean;\n /** Section subheader rendered before the items. */\n subheader?: ReactNode;\n}\n\nexport const List = forwardRef<HTMLUListElement, PropsWithChildren<ListProps>>(function List(\n { className, dense, subheader, children, ...props },\n ref\n) {\n return (\n <ul\n ref={ref}\n data-testid=\"list\"\n role=\"list\"\n className={cn(\"smwb-list\", { \"smwb-list_dense\": dense }, className)}\n {...props}\n >\n {subheader ? <li className=\"smwb-list__subheader\">{subheader}</li> : null}\n {children}\n </ul>\n );\n});\n\nexport default List;\n","import cn from \"clsx\";\nimport React from \"react\";\nimport Icon from \"../../../base/icon/icon\";\n\nexport interface BaseTablePaginationProps {\n page: number;\n limit: number;\n onPrev?: () => void;\n onNext?: () => void;\n limitOptions?: number[];\n onLimitChange?: (limit: number) => void;\n}\n\n// Вариант с известным количеством записей\ninterface WithTotalCount extends BaseTablePaginationProps {\n totalCount: number;\n hasNextPage?: never;\n}\n\n// Вариант с бесконечной пагинацией\ninterface WithHasNextPage extends BaseTablePaginationProps {\n totalCount?: never;\n hasNextPage: boolean;\n}\n\nexport type TablePaginationProps = WithTotalCount | WithHasNextPage;\n\nconst TablePagination = ({\n limit,\n page,\n totalCount,\n onPrev,\n onNext,\n limitOptions,\n onLimitChange,\n hasNextPage,\n}: TablePaginationProps) => {\n // Если totalCount не передан, считаем что пагинация \"бесконечная\"\n const isInfiniteMode = typeof totalCount === \"undefined\";\n\n const isDisabledNext = isInfiniteMode ? !hasNextPage : page === Math.ceil(totalCount / limit);\n\n const handleLimitChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (!onLimitChange) return;\n onLimitChange(+e.target.value);\n };\n\n const handlePrev = () => {\n onPrev?.();\n };\n\n const handleNext = () => {\n onNext?.();\n };\n\n const renderCountText = () => {\n const from = page * limit - limit;\n const to = page * limit;\n\n return `${from}–${to}` + (isInfiniteMode ? \"\" : ` of ${totalCount}`);\n };\n\n return (\n <div className=\"smwb-table__pagination\">\n <div className=\"smwb-table__pagination__controls\">\n {limitOptions && limitOptions.length > 1 && (\n <div className=\"smwb-table__pagination__rows\">\n <span>Rows per page</span>\n <select id=\"rows\" className=\"smwb-table__pagination__select\" onChange={handleLimitChange} value={limit}>\n {limitOptions.map((opt) => (\n <option value={opt} className={cn(\"smwb-select-option\", { selected: opt === limit })} key={opt}>\n {opt}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"smwb-table__pagination__current-count\">{renderCountText()}</div>\n <div className=\"smwb-table__pagination__buttons\">\n <button className=\"smwb-table__pagination__control\" onClick={handlePrev} disabled={page === 1}>\n <Icon name=\"chevron_left\" size={24} weight={600} />\n </button>\n <span className=\"smwb-table__pagination__page\">{page}</span>\n <button className=\"smwb-table__pagination__control\" onClick={handleNext} disabled={isDisabledNext}>\n <Icon name=\"chevron_right\" size={24} weight={600} />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default TablePagination;\n","import { HTMLAttributes, PropsWithChildren, ReactNode, forwardRef } from \"react\";\nimport cn from \"clsx\";\nimport { TablePagination, TablePaginationProps } from \"./index\";\n\nexport interface TableProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n dense?: boolean;\n isLoading?: boolean;\n hovered?: boolean;\n /** Pins the table header while the body scrolls. */\n stickyHeader?: boolean;\n /** Optional accessible caption rendered for screen readers. */\n caption?: ReactNode;\n paginationSettings?: TablePaginationProps;\n}\n\nconst Table = forwardRef<HTMLDivElement, PropsWithChildren<TableProps>>(\n ({ className, dense, hovered, children, paginationSettings, isLoading, stickyHeader, caption, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"smwb-table__wrapper\", className, {\n [\"smwb-table__wrapper_loading\"]: isLoading,\n })}\n {...props}\n >\n <div className={cn(\"smwb-table__container\", { \"smwb-withPagination\": !!paginationSettings })}>\n <table\n className={cn(\"smwb-table\", {\n \"smwb-dense\": dense,\n [\"smwb-hovered\"]: hovered,\n \"smwb-table_sticky-header\": stickyHeader,\n })}\n >\n {caption != null && <caption className=\"smwb-table__caption\">{caption}</caption>}\n {children}\n </table>\n </div>\n {!!paginationSettings && <TablePagination {...paginationSettings} />}\n </div>\n );\n }\n);\n\nexport default Table;\n","import React, { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface TableBodyProps extends HTMLAttributes<HTMLTableSectionElement> {\n className?: string;\n}\n\nconst TableBody = ({ children, className, ...props }: PropsWithChildren<TableBodyProps>) => {\n return (\n <tbody {...props} className={cn(\"smwb-table__body\", className)}>\n {children}\n </tbody>\n );\n};\n\nexport default TableBody;\n","import React, { PropsWithChildren, TdHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\n\nexport interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n className?: string;\n cellAlign?: \"left\" | \"right\" | \"center\";\n}\n\nconst TableCell = ({ children, cellAlign = \"left\", className, ...props }: PropsWithChildren<TableCellProps>) => {\n return (\n <td {...props} className={cn(\"smwb-table__cell\", className)} align={cellAlign || \"left\"}>\n {children}\n </td>\n );\n};\n\nexport default TableCell;\n","import { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface TableHeadProps extends HTMLAttributes<HTMLTableSectionElement> {\n className?: string;\n}\n\nconst TableHead = ({ children, className, ...props }: PropsWithChildren<TableHeadProps>) => {\n return (\n <thead {...props} className={cn(\"smwb-table__head\", className)}>\n {children}\n </thead>\n );\n};\n\nexport default TableHead;\n","import React, { PropsWithChildren, ThHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type SortDirection = \"asc\" | \"desc\" | false;\n\nexport interface TableHeadCellProps extends ThHTMLAttributes<HTMLTableCellElement> {\n className?: string;\n cellAlign?: \"left\" | \"right\" | \"center\";\n /** @deprecated use `sortDirection=\"desc\"`. */\n isSortedByDesc?: boolean;\n /** @deprecated use `sortDirection=\"asc\"`. */\n isSortedByAsc?: boolean;\n /** Enables the interactive sort affordance with keyboard/aria support. */\n sortable?: boolean;\n /** Current sort direction for this column. */\n sortDirection?: SortDirection;\n /** Invoked when the user activates the sort control. */\n onSort?: () => void;\n}\n\nconst TableHeadCell = ({\n children,\n className,\n cellAlign = \"left\",\n isSortedByAsc,\n isSortedByDesc,\n sortable,\n sortDirection,\n onSort,\n ...props\n}: PropsWithChildren<TableHeadCellProps>) => {\n const direction: SortDirection =\n sortDirection !== undefined ? sortDirection : isSortedByAsc ? \"asc\" : isSortedByDesc ? \"desc\" : false;\n\n const ariaSort = sortable\n ? direction === \"asc\"\n ? \"ascending\"\n : direction === \"desc\"\n ? \"descending\"\n : \"none\"\n : undefined;\n\n const iconName = direction === \"asc\" ? \"expand_more\" : direction === \"desc\" ? \"expand_less\" : \"\";\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLSpanElement>) => {\n if (sortable && onSort && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n onSort();\n }\n };\n\n return (\n <th\n {...props}\n aria-sort={ariaSort}\n className={cn(\"smwb-table__cell\", \"smwb-head-cell\", className, {\n [`smwb-align_${cellAlign}`]: !!cellAlign,\n \"smwb-head-cell_sortable\": sortable,\n })}\n >\n <span\n className=\"smwb-head-cell__content\"\n onClick={sortable ? onSort : undefined}\n onKeyDown={sortable ? onKeyDown : undefined}\n role={sortable ? \"button\" : undefined}\n tabIndex={sortable ? 0 : undefined}\n >\n {children}\n <Icon name={iconName} size={18} weight={800} />\n </span>\n </th>\n );\n};\n\nexport default TableHeadCell;\n","import React, { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n className?: string;\n /** Marks the row as selected (adds aria-selected + styling). */\n selected?: boolean;\n /** Reflects expandable-row state (adds aria-expanded + styling). */\n expanded?: boolean;\n}\n\nconst TableRow = ({ children, className, selected, expanded, ...props }: PropsWithChildren<TableRowProps>) => {\n return (\n <tr\n data-testid=\"table-row\"\n className={cn(\"smwb-table__row\", className, {\n \"smwb-table__row_selected\": selected,\n \"smwb-table__row_expanded\": expanded,\n })}\n aria-selected={selected ?? undefined}\n aria-expanded={expanded ?? undefined}\n {...props}\n >\n {children}\n </tr>\n );\n};\nexport default TableRow;\n","import React, { forwardRef, KeyboardEvent, ReactNode, useMemo, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\n\nexport interface ITreeNodeItem {\n /** Stable identifier. Falls back to the positional path when omitted. */\n id?: string;\n label: string;\n children?: ITreeNodeItem[];\n /** Hint that the node is expandable even before its children are loaded. */\n hasChildren?: boolean;\n}\n\nexport interface TreeViewProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n nodeIcon?: {\n opened?: string;\n closed?: string;\n };\n listIcon?: string;\n data: ITreeNodeItem[];\n /** Controlled list of expanded node ids. */\n expanded?: string[];\n /** Initially expanded node ids (uncontrolled). */\n defaultExpanded?: string[];\n /** Called with the next expanded ids. */\n onExpandedChange?: (expanded: string[]) => void;\n /** Controlled list of selected node ids. */\n selected?: string[];\n /** Initially selected node ids (uncontrolled). */\n defaultSelected?: string[];\n /** Called with the next selected ids. */\n onSelectedChange?: (selected: string[]) => void;\n /** Enables label click selection. */\n selectable?: boolean;\n /** Renders a checkbox per node bound to selection. */\n checkboxes?: boolean;\n /** Custom node renderer. */\n renderLabel?: (item: ITreeNodeItem, nodeId: string) => ReactNode;\n /** Lazily resolves children the first time a node is expanded. */\n loadChildren?: (item: ITreeNodeItem, nodeId: string) => Promise<ITreeNodeItem[]>;\n}\n\nexport const TreeView = forwardRef<HTMLDivElement, TreeViewProps>(function TreeView(\n {\n className,\n listIcon = \"draft\",\n nodeIcon = { closed: \"folder\", opened: \"folder_open\" },\n data = [],\n expanded,\n defaultExpanded = [],\n onExpandedChange,\n selected,\n defaultSelected = [],\n onSelectedChange,\n selectable = false,\n checkboxes = false,\n renderLabel,\n loadChildren,\n ...props\n },\n ref\n) {\n const [loadedChildren, setLoadedChildren] = useState<Record<string, ITreeNodeItem[]>>({});\n const [loadingIds, setLoadingIds] = useState<string[]>([]);\n const [expandedIds, setExpandedIds] = useControllableState<string[]>({\n value: expanded,\n defaultValue: defaultExpanded,\n onChange: onExpandedChange,\n });\n const [selectedIds, setSelectedIds] = useControllableState<string[]>({\n value: selected,\n defaultValue: defaultSelected,\n onChange: onSelectedChange,\n });\n\n const toggleExpanded = (id: string) => {\n setExpandedIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\n };\n\n const setOpen = (id: string, open: boolean) => {\n setExpandedIds((prev) => {\n const has = prev.includes(id);\n if (open && !has) return [...prev, id];\n if (!open && has) return prev.filter((x) => x !== id);\n return prev;\n });\n };\n\n const toggleSelected = (id: string) => {\n setSelectedIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\n };\n\n const ensureLoaded = (item: ITreeNodeItem, nodeId: string) => {\n if (!loadChildren || loadedChildren[nodeId] || (item.children && item.children.length > 0)) {\n return;\n }\n setLoadingIds((prev) => (prev.includes(nodeId) ? prev : [...prev, nodeId]));\n void loadChildren(item, nodeId)\n .then((children) => {\n setLoadedChildren((prev) => ({ ...prev, [nodeId]: children }));\n })\n .finally(() => {\n setLoadingIds((prev) => prev.filter((x) => x !== nodeId));\n });\n };\n\n const renderNode = (item: ITreeNodeItem, path: string): ReactNode => {\n const nodeId = item.id ?? path;\n const resolvedChildren = item.children ?? loadedChildren[nodeId];\n const isLazy = !!loadChildren && (item.hasChildren || !!loadedChildren[nodeId]);\n const hasChildNodes = (!!resolvedChildren && resolvedChildren.length > 0) || isLazy;\n const isOpen = expandedIds.includes(nodeId);\n const isSelected = selectedIds.includes(nodeId);\n const isLoading = loadingIds.includes(nodeId);\n\n const onLabelClick = () => {\n if (hasChildNodes) {\n if (!isOpen) {\n ensureLoaded(item, nodeId);\n }\n toggleExpanded(nodeId);\n }\n if (selectable) {\n toggleSelected(nodeId);\n }\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onLabelClick();\n } else if (event.key === \"ArrowRight\" && hasChildNodes) {\n ensureLoaded(item, nodeId);\n setOpen(nodeId, true);\n } else if (event.key === \"ArrowLeft\" && hasChildNodes) {\n setOpen(nodeId, false);\n }\n };\n\n return (\n <div\n className={cn(\"smwb-tree__node\", { \"smwb-tree__node_selected\": isSelected })}\n role=\"treeitem\"\n aria-expanded={hasChildNodes ? isOpen : undefined}\n aria-selected={selectable || checkboxes ? isSelected : undefined}\n key={nodeId}\n >\n <span\n className=\"smwb-tree__node__content\"\n onClick={onLabelClick}\n onKeyDown={onKeyDown}\n tabIndex={0}\n role=\"button\"\n >\n {checkboxes && (\n <input\n type=\"checkbox\"\n className=\"smwb-tree__node__checkbox\"\n checked={isSelected}\n onClick={(e) => e.stopPropagation()}\n onChange={() => toggleSelected(nodeId)}\n aria-label={item.label}\n />\n )}\n <span className=\"smwb-tree__node__label\">\n {hasChildNodes && isOpen ? (\n <Icon name={nodeIcon?.opened as string} fill={1} size={20} />\n ) : hasChildNodes ? (\n <Icon name={nodeIcon?.closed as string} fill={1} size={20} />\n ) : (\n <Icon name={listIcon} size={20} />\n )}\n {renderLabel ? renderLabel(item, nodeId) : item.label}\n </span>\n </span>\n {hasChildNodes && isOpen && (\n <div role=\"group\">\n {isLoading && !resolvedChildren ? (\n <div className=\"smwb-tree__node__loading\" role=\"status\">\n Загрузка…\n </div>\n ) : (\n resolvedChildren?.map((c, idx) => renderNode(c, `${path}.${idx}`))\n )}\n </div>\n )}\n </div>\n );\n };\n\n const tree = useMemo(\n () => data.map((d, idx) => renderNode(d, `${idx}`)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n data,\n expandedIds,\n selectedIds,\n selectable,\n checkboxes,\n listIcon,\n nodeIcon,\n renderLabel,\n loadedChildren,\n loadingIds,\n ]\n );\n\n return (\n <div data-testid=\"tree-view\" {...props} ref={ref} role=\"tree\" className={cn(\"smwb-tree\", className)}>\n {tree.map((node, idx) => (\n <div className=\"smwb-tree__wrapper\" key={idx} role=\"presentation\">\n {node}\n </div>\n ))}\n </div>\n );\n});\n\nexport default TreeView;\n","import React, { useEffect, useRef } from \"react\";\nimport { useForkRef } from \"../../hooks/useForkRef\";\nimport { useEventCallback } from \"../../hooks/useEventCallback\";\n\ntype ClickAwayMouseEventHandler = \"onClick\" | \"onMouseDown\" | \"onMouseUp\" | \"onPointerDown\" | \"onPointerUp\";\ntype ClickAwayTouchEventHandler = \"onTouchStart\" | \"onTouchEnd\";\n\nfunction mapEventPropToEvent(eventProp: ClickAwayMouseEventHandler | ClickAwayTouchEventHandler) {\n return eventProp.substring(2).toLowerCase() as\n | \"click\"\n | \"mousedown\"\n | \"mouseup\"\n | \"touchstart\"\n | \"touchend\"\n | \"pointerdown\"\n | \"pointerup\";\n}\n\nfunction clickedRootScrollbar(event: MouseEvent, doc: Document) {\n return doc.documentElement.clientWidth < event.clientX || doc.documentElement.clientHeight < event.clientY;\n}\n\nexport interface ClickAwayListenerProps {\n children: React.ReactElement;\n disableReactTree?: boolean;\n mouseEvent?: ClickAwayMouseEventHandler | false;\n onClickAway: (event: MouseEvent | TouchEvent) => void;\n touchEvent?: ClickAwayTouchEventHandler | false;\n /** When false, the listener is inert without unmounting the child. */\n enabled?: boolean;\n}\n\nexport function ClickAwayListener({\n children,\n disableReactTree = false,\n mouseEvent = \"onMouseUp\",\n onClickAway,\n touchEvent = \"onTouchEnd\",\n enabled = true,\n}: ClickAwayListenerProps) {\n const movedRef = useRef(false);\n const nodeRef = useRef<Element>(null);\n const activatedRef = useRef(false);\n const syntheticEventRef = useRef(false);\n\n useEffect(() => {\n // https://github.com/facebook/react/issues/20074\n setTimeout(() => {\n activatedRef.current = true;\n }, 0);\n return () => {\n activatedRef.current = false;\n };\n }, []);\n\n const handleRef = useForkRef((children as React.ReactElement & { ref: React.Ref<Element> }).ref, nodeRef);\n\n const handleClickAway = useEventCallback((event: MouseEvent | TouchEvent) => {\n const insideReactTree = syntheticEventRef.current;\n syntheticEventRef.current = false;\n\n if (\n !enabled ||\n !activatedRef.current ||\n !nodeRef.current ||\n (\"clientX\" in event && clickedRootScrollbar(event, document))\n ) {\n return;\n }\n\n if (movedRef.current) {\n movedRef.current = false;\n return;\n }\n\n let insideDOM;\n\n if (event.composedPath) {\n insideDOM = event.composedPath().indexOf(nodeRef.current) > -1;\n } else {\n const target = event.target as HTMLElement;\n\n insideDOM = !document.documentElement.contains(target) || nodeRef.current.contains(target);\n }\n\n if (!insideDOM && (disableReactTree || !insideReactTree)) {\n onClickAway(event);\n }\n });\n\n const createHandleSynthetic = (handlerName: string) => (event: React.SyntheticEvent) => {\n syntheticEventRef.current = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access\n const childrenPropsHandler = children.props[handlerName];\n\n if (childrenPropsHandler) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n childrenPropsHandler(event);\n }\n };\n\n const childrenProps: { ref: React.Ref<Element> } & Pick<\n React.DOMAttributes<Element>,\n ClickAwayMouseEventHandler | ClickAwayTouchEventHandler\n > = { ref: handleRef };\n\n if (touchEvent !== false) {\n childrenProps[touchEvent] = createHandleSynthetic(touchEvent);\n }\n\n useEffect(() => {\n if (touchEvent !== false) {\n const mappedTouchEvent = mapEventPropToEvent(touchEvent);\n\n const handleTouchMove = () => {\n movedRef.current = true;\n };\n\n document.addEventListener(mappedTouchEvent, handleClickAway);\n document.addEventListener(\"touchmove\", handleTouchMove);\n\n return () => {\n document.removeEventListener(mappedTouchEvent, handleClickAway);\n document.removeEventListener(\"touchmove\", handleTouchMove);\n };\n }\n\n return undefined;\n }, [handleClickAway, touchEvent]);\n\n if (mouseEvent !== false) {\n childrenProps[mouseEvent] = createHandleSynthetic(mouseEvent);\n }\n\n useEffect(() => {\n if (mouseEvent !== false) {\n const mappedMouseEvent = mapEventPropToEvent(mouseEvent);\n\n document.addEventListener(mappedMouseEvent, handleClickAway);\n\n return () => {\n document.removeEventListener(mappedMouseEvent, handleClickAway);\n };\n }\n\n return undefined;\n }, [handleClickAway, mouseEvent]);\n\n return <>{React.cloneElement(children, childrenProps)}</>;\n}\n","import React, { forwardRef, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type MessageSeverity = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface MessageProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n variant?: \"outlined\" | \"filled\" | \"left-accent\";\n onClose?: () => void; // или с событием, если нужно\n /** @deprecated use `severity`. */\n type?: MessageSeverity;\n /** Semantic severity of the message. */\n severity?: MessageSeverity;\n /** Accessible label for the close button. */\n closeAriaLabel?: string;\n}\n\nexport const MessageContainer = forwardRef<HTMLDivElement, PropsWithChildren<MessageProps>>(\n ({ className, children, type, severity, variant = \"filled\", onClose, closeAriaLabel = \"Close\", ...props }, ref) => {\n const resolvedSeverity = severity ?? type;\n const messageClassnames = cn(\"smwb-message\", `smwb-message_${variant}`, className, {\n [`smwb-message_${resolvedSeverity}`]: Boolean(resolvedSeverity),\n });\n\n return (\n <div\n data-testid=\"message\"\n role=\"alert\"\n aria-live={resolvedSeverity === \"error\" ? \"assertive\" : \"polite\"}\n {...props}\n className={messageClassnames}\n ref={ref}\n >\n {children}\n {onClose && (\n <button className=\"smwb-message__close-btn\" onClick={onClose} aria-label={closeAriaLabel} type=\"button\">\n <Icon name=\"close\" weight={1000} />\n </button>\n )}\n </div>\n );\n }\n);\n\nconst Header = ({ children }: PropsWithChildren) => {\n return <div className=\"smwb-message__header\">{children}</div>;\n};\n\nconst Message = Object.assign(MessageContainer, { Header });\n\nexport default Message;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Modal } from \"../modal\";\nimport { Button } from \"../../inputs/button\";\nimport { TextField } from \"../../inputs/textField\";\n\nexport interface SaveAssetDialogProps {\n open: boolean;\n title?: string;\n /** Label for the name field. Omit `onNameChange` AND `name` to hide the field. */\n nameLabel?: string;\n name?: string;\n onNameChange?: (name: string) => void;\n /** Preview image URL (e.g. a freshly captured thumbnail). */\n previewSrc?: string;\n /** Shows a Capture button when provided. */\n onCapture?: () => void;\n captureLabel?: string;\n /** Disables the actions + name field while a save/capture is in flight. */\n busy?: boolean;\n confirmLabel?: string;\n cancelLabel?: string;\n onConfirm: () => void;\n onClose: () => void;\n /** Extra content between the name field/preview and the actions. */\n children?: React.ReactNode;\n className?: string;\n}\n\n/**\n * A \"name it / preview a thumbnail / confirm-cancel\" dialog on `Modal` — the\n * save/capture flow apps hand-build for every asset. Pairs with srv-solid's\n * asset store: `onConfirm` uploads the captured `previewSrc`.\n */\nexport function SaveAssetDialog({\n open,\n title,\n nameLabel,\n name,\n onNameChange,\n previewSrc,\n onCapture,\n captureLabel,\n busy,\n confirmLabel,\n cancelLabel,\n onConfirm,\n onClose,\n children,\n className,\n}: SaveAssetDialogProps): React.ReactElement {\n const showNameField = onNameChange !== undefined || name !== undefined;\n\n return (\n <Modal open={open} onClose={onClose} size=\"small\">\n <Modal.Header>{title ?? \"Save\"}</Modal.Header>\n <Modal.Content>\n <div className={cn(\"smwb-save-asset-dialog__body\", className)}>\n {showNameField ? (\n <TextField\n label={nameLabel ?? \"Name\"}\n value={name ?? \"\"}\n disabled={!!busy}\n onChange={(event) => onNameChange?.(event.currentTarget.value)}\n />\n ) : null}\n {previewSrc ? (\n <div className=\"smwb-save-asset-dialog__preview\">\n <img src={previewSrc} alt=\"\" />\n </div>\n ) : null}\n {onCapture ? (\n <Button\n variant=\"outlined\"\n size=\"small\"\n disabled={!!busy}\n onClick={() => onCapture()}\n label={captureLabel ?? \"Capture preview\"}\n />\n ) : null}\n {children}\n </div>\n </Modal.Content>\n <Modal.Footer>\n <Button variant=\"text\" disabled={!!busy} onClick={() => onClose()} label={cancelLabel ?? \"Cancel\"} />\n <Button variant=\"contained\" disabled={!!busy} onClick={() => onConfirm()} label={confirmLabel ?? \"Save\"} />\n </Modal.Footer>\n </Modal>\n );\n}\n\nexport default SaveAssetDialog;\n","import React, { forwardRef, useRef, useEffect } from \"react\";\nimport cn from \"clsx\";\n\nexport type ProgressColor = \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface ProgressIndicatorProps {\n className?: string;\n variant: \"circular\" | \"linear\";\n type: \"determinate\" | \"indeterminate\";\n progressValue?: number;\n /** Semantic color. */\n color?: ProgressColor;\n /** Circular size preset. */\n size?: \"small\" | \"medium\" | \"large\";\n /** Accessible name for the progress bar. */\n \"aria-label\"?: string;\n id?: string;\n}\n\nexport const ProgressIndicator = forwardRef<HTMLDivElement, ProgressIndicatorProps>(function ProgressIndicator(\n { type, variant, className, progressValue = 0, color = \"primary\", size = \"medium\", id, ...rest },\n ref\n) {\n const ariaProps = {\n role: \"progressbar\" as const,\n \"aria-label\": rest[\"aria-label\"],\n id,\n ...(type === \"determinate\" ? { \"aria-valuenow\": progressValue, \"aria-valuemin\": 0, \"aria-valuemax\": 100 } : {}),\n };\n const colorClass = color !== \"primary\" ? `smwb-indicator_color-${color}` : null;\n\n if (variant === \"circular\") {\n return (\n <div\n ref={ref}\n className={cn(\"smwb-indicator_circular\", `smwb-${type}`, colorClass, `smwb-indicator_size-${size}`, className)}\n {...ariaProps}\n >\n {type === \"determinate\" ? (\n <CircularProgress progressValue={progressValue} />\n ) : (\n <>\n <div className=\"smwb-indicator_circular__thumb\" />\n <div></div>\n <div></div>\n <div></div>\n </>\n )}\n </div>\n );\n }\n\n return (\n <div ref={ref} className={cn(\"smwb-indicator_linear\", `smwb-${type}`, colorClass, className)} {...ariaProps}>\n <div\n className=\"smwb-indicator_linear__thumb\"\n style={type === \"determinate\" ? { width: `${progressValue}%` } : {}}\n ></div>\n </div>\n );\n});\n\nexport interface CircularProgressProps {\n progressValue?: number;\n}\n\nexport function CircularProgress({ progressValue = 0 }: CircularProgressProps) {\n const circleRef = useRef<SVGCircleElement>(null);\n\n useEffect(() => {\n if (!circleRef.current || !circleRef.current.r) return;\n\n const circleRadius = circleRef.current?.r.baseVal.value;\n if (circleRadius && circleRef.current) {\n const circleLength = 2 * Math.PI * circleRadius;\n circleRef.current.style.strokeDasharray = `${circleLength} ${circleLength}`;\n circleRef.current.style.strokeDashoffset = `${circleLength}`;\n\n const offset = circleLength - (progressValue / 100) * circleLength;\n circleRef.current.style.strokeDashoffset = `${offset}`;\n }\n }, [circleRef, progressValue]);\n\n return (\n <svg className=\"smwb-indicator_circular__svg\">\n <circle className=\"smwb-indicator_circular__circle\" cx=\"24\" cy=\"24\" r=\"22\" ref={circleRef} />\n </svg>\n );\n}\n\nexport default ProgressIndicator;\n","import { useState } from \"react\";\nimport { v4 } from \"uuid\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\nexport function useSnackbarsPortal() {\n const [domElement, setDomElement] = useState<HTMLElement | null>(null);\n\n useSafeLayoutEffect(() => {\n const element = document.createElement(\"div\");\n element.id = `snackbar-portal-${v4()}`;\n document.body.prepend(element);\n\n setDomElement(element);\n\n return () => {\n document.body.removeChild(element);\n };\n }, []);\n\n return { snackbarDomRoot: domElement };\n}\n","import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { v4 } from \"uuid\";\nimport { createPortal } from \"react-dom\";\nimport cn from \"clsx\";\nimport { CSSTransition, TransitionGroup } from \"react-transition-group\";\nimport { useSnackbarsPortal } from \"./useSnackbarsPortal\";\nimport { useEventCallback } from \"../../../hooks/useEventCallback\";\n\nexport const variants = [\"dark\", \"light\", \"danger\", \"success\", \"warning\", \"info\"] as const;\nexport const positions = [\"top\", \"bottom\", \"top-left\", \"top-right\", \"bottom-right\", \"bottom-left\"] as const;\n\nexport type Variants = (typeof variants)[number];\nexport type Position = (typeof positions)[number];\n\nexport interface SnackbarsProviderProps extends React.HTMLAttributes<HTMLElement> {\n variant?: Variants;\n position?: Position;\n autoCloseTime?: number;\n closeOnClick?: boolean;\n autoClose?: boolean;\n component?: React.ElementType;\n}\n\ninterface Snack extends SnackbarsProviderProps {\n id: string;\n message: React.ReactNode;\n}\n\ninterface SnackTransitionProps {\n snack: Snack;\n position: Position;\n variant: Variants;\n className?: string;\n component: React.ElementType;\n autoClose: boolean;\n autoCloseTime: number;\n snackRest: Omit<\n SnackbarsProviderProps,\n \"variant\" | \"position\" | \"autoCloseTime\" | \"autoClose\" | \"closeOnClick\" | \"onClick\" | \"component\" | \"children\"\n >;\n onSnackRemove: (id: string) => (event: React.MouseEvent<HTMLElement>) => void;\n onClose: (id: string) => () => void;\n}\n\nfunction SnackTransition({\n snack,\n position,\n variant,\n className,\n component,\n autoClose,\n autoCloseTime,\n snackRest,\n onSnackRemove,\n onClose,\n}: SnackTransitionProps) {\n const nodeRef = useRef<HTMLDivElement>(null);\n\n return (\n <CSSTransition\n appear\n timeout={125}\n classNames={{\n appear: \"smwb-snackbar-enter\",\n appearActive: \"smwb-snackbar-enter-active\",\n appearDone: \"smwb-snackbar-enter-done\",\n enter: \"smwb-snackbar-enter\",\n enterActive: \"smwb-snackbar-enter-active\",\n enterDone: \"smwb-snackbar-enter-done\",\n exitActive: \"smwb-snackbar-exit-active\",\n }}\n unmountOnExit\n in\n nodeRef={nodeRef}\n >\n <Snackbar\n ref={nodeRef}\n component={snack.component ?? component}\n message={snack.message}\n position={snack.position ?? position}\n variant={snack.variant ?? variant}\n onClick={onSnackRemove(snack.id)}\n className={cn(className, snack.className)}\n isAutoClose={snack.autoClose ?? autoClose}\n autoCloseTime={snack.autoCloseTime ?? autoCloseTime}\n onClose={onClose(snack.id)}\n {...snackRest}\n />\n </CSSTransition>\n );\n}\n\nexport interface AddSnackbarOptions extends SnackbarsProviderProps {\n key?: string;\n message: React.ReactNode;\n}\n\nexport type AddSnackbar = (options: AddSnackbarOptions) => string;\n\nexport interface SnackbarOptions {\n addSnackbar: AddSnackbar;\n clearAllSnackbars: () => void;\n clearFirstSnackbar: () => void;\n clearLastSnackbar: () => void;\n clearByIdSnackbar: (id: string) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarOptions>({\n addSnackbar: () => \"\",\n clearAllSnackbars: () => undefined,\n clearFirstSnackbar: () => undefined,\n clearLastSnackbar: () => undefined,\n clearByIdSnackbar: () => undefined,\n});\n\nexport function SnackbarProvider(props: SnackbarsProviderProps) {\n const {\n position = \"top-right\",\n variant = \"dark\",\n className,\n autoClose = true,\n autoCloseTime = 5000,\n closeOnClick = true,\n onClick,\n component = \"div\",\n children,\n ...rest\n } = props;\n\n const [snacks, setSnacks] = useState<Snack[]>([]);\n const { snackbarDomRoot } = useSnackbarsPortal();\n\n const addSnackbar: AddSnackbar = useCallback((options) => {\n const { key, ...rest } = options;\n\n const id = key ?? v4();\n const snack: Snack = { id, ...rest };\n\n setSnacks((prevState) => {\n const index = prevState.findIndex((item) => item.id === id);\n if (index === -1) {\n return [...prevState, snack];\n }\n const next = [...prevState];\n next[index] = snack;\n return next;\n });\n\n return id;\n }, []);\n\n const clearAllSnackbars = () => {\n setSnacks([]);\n };\n\n const clearFirstSnackbar = () => {\n setSnacks((prevState) => prevState.slice(1));\n };\n\n const clearLastSnackbar = () => {\n setSnacks((prevState) => prevState.slice(0, -1));\n };\n\n const clearByIdSnackbar = (id: string) => {\n setSnacks((prevState) => prevState.filter((value) => value.id !== id));\n };\n\n const onSnackRemove = (id: string) => (event: React.MouseEvent<HTMLElement>) => {\n onClick?.(event);\n\n if (closeOnClick) {\n clearByIdSnackbar(id);\n }\n };\n\n const onClose = (id: string) => () => {\n clearByIdSnackbar(id);\n };\n\n const currentPositions = snacks.reduce(\n (acc, snack) => {\n const currentPosition = snack.position ?? position;\n\n acc[currentPosition] = [...(acc[currentPosition] ?? []), snack];\n\n return acc;\n },\n {} as Record<Position, Snack[]>\n );\n\n const snackbars = (Object.keys(currentPositions) as unknown as typeof positions).map((key) => {\n const snacks = currentPositions[key];\n\n return (\n <TransitionGroup\n key={key}\n className={cn(\"smwb-snackbars\", `smwb-${key}`)}\n data-testid={`snackbars-${key}`}\n appear\n >\n {snacks.map((snack) => (\n <SnackTransition\n key={snack.id}\n snack={snack}\n position={position}\n variant={variant}\n className={className}\n component={component}\n autoClose={autoClose}\n autoCloseTime={autoCloseTime}\n snackRest={rest}\n onSnackRemove={onSnackRemove}\n onClose={onClose}\n />\n ))}\n </TransitionGroup>\n );\n });\n\n return (\n <SnackbarContext.Provider\n value={{ addSnackbar, clearAllSnackbars, clearFirstSnackbar, clearLastSnackbar, clearByIdSnackbar }}\n >\n {children}\n {snackbarDomRoot && createPortal(snackbars, snackbarDomRoot)}\n </SnackbarContext.Provider>\n );\n}\n\nexport interface SnackbarProps extends React.HTMLAttributes<HTMLElement> {\n message?: React.ReactNode;\n variant?: Variants;\n position?: Position;\n component?: React.ElementType;\n isAutoClose?: boolean;\n autoCloseTime?: number;\n onClose?: () => void;\n /** Optional action node rendered after the message (e.g. an Undo button). */\n action?: React.ReactNode;\n}\n\nexport const Snackbar = React.forwardRef(function SnackbarInner(\n {\n className,\n message,\n variant = \"dark\",\n position = \"top-right\",\n onClick,\n component = \"div\",\n isAutoClose,\n autoCloseTime,\n onClose,\n action,\n ...rest\n }: SnackbarProps,\n ref\n) {\n const timerClose = useRef<ReturnType<typeof setTimeout>>();\n\n const setCloseTimer = useEventCallback(() => {\n if (!onClose || !isAutoClose || !autoCloseTime) {\n return;\n }\n\n if (timerClose.current) {\n clearTimeout(timerClose.current);\n }\n\n timerClose.current = setTimeout(() => {\n onClose();\n }, autoCloseTime);\n });\n\n useEffect(() => {\n setCloseTimer();\n\n return () => {\n if (timerClose.current) {\n clearTimeout(timerClose.current);\n }\n };\n }, [setCloseTimer]);\n\n const Element = component;\n\n return (\n <Element\n ref={ref}\n className={cn(\"smwb-snackbar\", className, `smwb-${variant}`, `smwb-${position}`)}\n onClick={onClick}\n role=\"alert\"\n aria-live={variant === \"danger\" ? \"assertive\" : \"polite\"}\n aria-atomic=\"true\"\n {...rest}\n >\n <div className=\"smwb-snackbar__body\">{message}</div>\n {action != null ? <div className=\"smwb-snackbar__action\">{action}</div> : null}\n </Element>\n );\n});\n\nexport function useSnackbar() {\n return useContext(SnackbarContext);\n}\n\nexport default SnackbarProvider;\n","import { autoPlacement, flip, Middleware, offset, Placement as FloatingUiPlacement, shift } from \"@floating-ui/react\";\n\nexport type Placement = FloatingUiPlacement | \"auto\" | \"auto-start\" | \"auto-end\";\n\nexport const placements: Placement[] = [\n \"auto\",\n \"auto-start\",\n \"auto-end\",\n \"top\",\n \"top-start\",\n \"top-end\",\n \"bottom\",\n \"bottom-start\",\n \"bottom-end\",\n \"right\",\n \"right-start\",\n \"right-end\",\n \"left\",\n \"left-start\",\n \"left-end\",\n];\n\nexport interface ResolvedPlacement {\n placement?: FloatingUiPlacement;\n autoMiddleware?: Middleware;\n}\n\nexport function resolvePlacement(placement: Placement): ResolvedPlacement {\n if (placement === \"auto\" || placement === \"auto-start\" || placement === \"auto-end\") {\n const alignment = placement === \"auto-start\" ? \"start\" : placement === \"auto-end\" ? \"end\" : null;\n\n return { autoMiddleware: autoPlacement({ alignment }) };\n }\n\n return { placement };\n}\n\nconst FLOATING_OFFSET_PX = 4;\nconst FLOATING_SHIFT_PADDING_PX = 8;\n\nexport function buildFloatingMiddleware(resolved: ResolvedPlacement, custom?: Middleware[]): Middleware[] {\n if (custom?.length) {\n return [...custom, flip(), shift({ padding: FLOATING_SHIFT_PADDING_PX })];\n }\n if (resolved.autoMiddleware) {\n return [offset(FLOATING_OFFSET_PX), shift({ padding: FLOATING_SHIFT_PADDING_PX }), resolved.autoMiddleware];\n }\n return [offset(FLOATING_OFFSET_PX), flip(), shift({ padding: FLOATING_SHIFT_PADDING_PX })];\n}\n","import React, { forwardRef, PropsWithChildren, useCallback, useEffect, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { autoUpdate, offset as offsetMiddleware, useFloating } from \"@floating-ui/react\";\nimport { Placement, resolvePlacement } from \"../../../utils/floating\";\n\nexport type TooltipTrigger = \"hover\" | \"click\" | \"manual\";\n\nexport interface TooltipProps {\n className?: string;\n offset?: {\n offsetX?: number;\n offsetY?: number;\n };\n message: React.ReactNode;\n placement?: Placement;\n /** Controls tooltip visibility when trigger is manual. */\n open?: boolean;\n /** hover (default): show on pointer enter; click: toggle; manual: use open only. */\n trigger?: TooltipTrigger;\n openDelay?: number;\n closeDelay?: number;\n}\n\nexport const Tooltip = forwardRef<HTMLDivElement, PropsWithChildren<TooltipProps>>(function Tooltip(\n {\n className,\n children,\n placement = \"top\",\n offset = { offsetX: 0, offsetY: 0 },\n message,\n open: openProp,\n trigger = \"hover\",\n openDelay = 0,\n closeDelay = 0,\n },\n ref\n) {\n const resolved = resolvePlacement(placement);\n const [hoverOpen, setHoverOpen] = useState(false);\n const [clickOpen, setClickOpen] = useState(false);\n const openTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimers = useCallback(() => {\n if (openTimerRef.current !== null) {\n clearTimeout(openTimerRef.current);\n openTimerRef.current = null;\n }\n if (closeTimerRef.current !== null) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n useEffect(() => () => clearTimers(), [clearTimers]);\n\n const scheduleOpen = useCallback(() => {\n clearTimers();\n if (openDelay <= 0) {\n setHoverOpen(true);\n return;\n }\n openTimerRef.current = setTimeout(() => setHoverOpen(true), openDelay);\n }, [clearTimers, openDelay]);\n\n const scheduleClose = useCallback(() => {\n clearTimers();\n if (closeDelay <= 0) {\n setHoverOpen(false);\n return;\n }\n closeTimerRef.current = setTimeout(() => setHoverOpen(false), closeDelay);\n }, [clearTimers, closeDelay]);\n\n const { refs, floatingStyles } = useFloating({\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: [\n offsetMiddleware({ mainAxis: offset?.offsetY ?? 0, crossAxis: offset?.offsetX ?? 0 }),\n ...(resolved.autoMiddleware ? [resolved.autoMiddleware] : []),\n ],\n });\n\n const isVisible = trigger === \"manual\" ? openProp === true : trigger === \"click\" ? clickOpen : hoverOpen;\n\n const onPointerEnter = trigger === \"hover\" ? scheduleOpen : undefined;\n const onPointerLeave = trigger === \"hover\" ? scheduleClose : undefined;\n const onClick =\n trigger === \"click\"\n ? () => {\n setClickOpen((prev) => !prev);\n }\n : undefined;\n\n return (\n <div className=\"smwb-tooltip__wrapper\" role=\"tooltip\" ref={ref}>\n <div\n className=\"smwb-tooltip__ref\"\n ref={refs.setReference}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onClick={onClick}\n >\n {children}\n </div>\n {isVisible && (\n <div ref={refs.setFloating} className={cn(\"smwb-tooltip\", className)} style={floatingStyles}>\n {message}\n </div>\n )}\n </div>\n );\n});\n\nexport default Tooltip;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { ButtonProps } from \"../button\";\n\nexport interface ButtonGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n variant?: \"contained\" | \"text\" | \"outlined\";\n size?: \"small\" | \"medium\" | \"large\";\n fullWidth?: boolean;\n disabled?: boolean;\n /** @deprecated use `color`. */\n colorTheme?: \"primary\";\n /** Semantic color propagated to child buttons. */\n color?: \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n}\n\nexport const ButtonGroup = React.forwardRef(function ButtonGroup(\n props: ButtonGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const {\n className,\n children,\n variant = \"contained\",\n size = \"medium\",\n orientation = \"horizontal\",\n colorTheme = \"primary\",\n color,\n fullWidth = false,\n disabled = false,\n ...rest\n } = props;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"smwb-button-group\",\n className,\n `smwb-${orientation}`,\n `smwb-${variant}`,\n fullWidth && \"smwb-full-width\",\n disabled\n )}\n role=\"group\"\n data-testid=\"button-group\"\n {...rest}\n >\n {React.Children.map(children, (child) => {\n const element = child as React.ReactElement<ButtonProps>;\n\n return React.cloneElement(element, {\n className: \"smwb-button-group__grouped\",\n fullWidth: orientation === \"vertical\" || (element.props.fullWidth ?? fullWidth),\n variant: element.props.variant ?? variant,\n size: element.props.size ?? size,\n disabled: element.props.disabled ?? disabled,\n colorTheme: element.props.colorTheme ?? colorTheme,\n color: element.props.color ?? color,\n });\n })}\n </div>\n );\n});\n\nexport default ButtonGroup;\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useId } from \"../../../hooks/useId\";\n\nexport type SelectionControlSize = \"small\" | \"medium\" | \"large\";\nexport type SelectionControlColor = \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n label?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n indeterminate?: boolean;\n className?: string;\n size?: SelectionControlSize;\n color?: SelectionControlColor;\n /** Unified handler: `(event, checked, data)`. */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>, checked: boolean, data: CheckboxProps) => void;\n helperText?: React.ReactNode;\n error?: boolean;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(props, ref) {\n const {\n label,\n disabled,\n readOnly,\n required,\n name,\n id: idProp,\n indeterminate,\n className,\n size = \"medium\",\n color = \"primary\",\n onChange,\n helperText,\n error,\n ...args\n } = props;\n const id = useId(idProp);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) {\n e.preventDefault();\n return;\n }\n onChange?.(e, e.target.checked, props);\n };\n\n return (\n <TextFieldWrapper helperText={helperText} disabled={disabled} error={error} className=\"smwb-text-field-checkbox\">\n <label\n htmlFor={id}\n className={cn(\n \"smwb-checkbox__wrapper\",\n `smwb-checkbox_size-${size}`,\n `smwb-checkbox_color-${color}`,\n className,\n {\n \"smwb-disabled\": disabled,\n \"smwb-readonly\": readOnly,\n \"smwb-indeterminate\": indeterminate,\n }\n )}\n >\n <input\n type=\"checkbox\"\n id={id}\n name={name}\n className=\"smwb-checkbox__input\"\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n ref={ref}\n {...args}\n onChange={handleChange}\n />\n <span className={cn(\"smwb-checkbox__btn\", { \"smwb-indeterminate\": indeterminate })}>\n {indeterminate ? (\n <Icon name=\"remove\" size={18} className=\"smwb-checkbox__icon\" weight={700} />\n ) : (\n <Icon name=\"check\" size={17} className=\"smwb-checkbox__icon\" weight={700} />\n )}\n </span>\n {label && <span className=\"smwb-checkbox__label\">{label}</span>}\n </label>\n </TextFieldWrapper>\n );\n});\n\nexport default Checkbox;\n","import React from \"react\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport cn from \"clsx\";\n\nexport type DataPickerIconButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n size?: \"medium\" | \"small\";\n edge?: \"start\" | \"end\";\n};\n\nexport function DatePickerIconButton({\n className,\n children,\n onMouseDown: onMouseDownProp,\n disabled,\n size = \"medium\",\n edge,\n ...rest\n}: DataPickerIconButtonProps) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n const classes = cn(\"smwb-date-picker__icon-button\", className, {\n \"smwb-date-picker__icon-button--small\": size === \"small\",\n \"smwb-date-picker__icon-button--edge-start\": edge === \"start\",\n \"smwb-date-picker__icon-button--edge-end\": edge === \"end\",\n \"smwb-date-picker__icon-button--disabled\": disabled,\n });\n\n return (\n <button\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n type=\"button\"\n className={classes}\n disabled={disabled}\n {...rest}\n >\n {children}\n {!disabled && <Ripple actionRef={rippleRef} center />}\n </button>\n );\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { DatePickerIconButton } from \"./datePickerIconButton\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface ActionLabelProp {\n label: string;\n onLeftIconClick?: React.MouseEventHandler;\n onRightIconClick?: React.MouseEventHandler;\n onLabelClick?: React.MouseEventHandler;\n disabled?: boolean;\n active?: boolean;\n hiddenSwitches?: boolean;\n dataToggleId?: string;\n}\n\nexport function DatePickerActionLabel({\n label,\n onLeftIconClick,\n onRightIconClick,\n onLabelClick,\n disabled,\n active,\n hiddenSwitches,\n dataToggleId,\n ...rest\n}: ActionLabelProp) {\n const switchClasses = cn(\"smwb-date-picker__switch\", {\n \"smwb-date-picker__switch--hidden\": hiddenSwitches,\n });\n\n return (\n <div className=\"smwb-date-picker__action\" {...rest}>\n <div className={switchClasses}>\n <DatePickerIconButton size=\"small\" onClick={disabled ? undefined : onLeftIconClick}>\n <Icon name=\"keyboard_arrow_left\" weight={500} size={24} />\n </DatePickerIconButton>\n </div>\n <div\n className={cn(\"smwb-date-picker__action-label\", {\n \"smwb-date-picker__action-label--disabled\": disabled,\n \"smwb-date-picker__action-label--active\": active,\n })}\n data-testid={dataToggleId}\n onClick={disabled ? undefined : onLabelClick}\n >\n <span className=\"smwb-date-picker__action-text\">{label}</span>\n <Icon name=\"arrow_drop_down\" weight={500} size={20} />\n </div>\n <div className={switchClasses}>\n <DatePickerIconButton size=\"small\" onClick={disabled ? undefined : onRightIconClick}>\n <Icon name=\"keyboard_arrow_right\" weight={500} size={24} />\n </DatePickerIconButton>\n </div>\n </div>\n );\n}\n","const DATE_TOKEN_REGEXP = /yyyy|MM|dd/g;\n\ntype DateToken = \"yyyy\" | \"MM\" | \"dd\";\n\nfunction extractTokens(pattern: string): DateToken[] {\n const tokens: DateToken[] = [];\n let match: RegExpExecArray | null;\n\n DATE_TOKEN_REGEXP.lastIndex = 0;\n while ((match = DATE_TOKEN_REGEXP.exec(pattern)) !== null) {\n tokens.push(match[0] as DateToken);\n }\n\n return tokens;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction patternToRegExp(pattern: string): RegExp {\n let regex = \"^\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n DATE_TOKEN_REGEXP.lastIndex = 0;\n while ((match = DATE_TOKEN_REGEXP.exec(pattern)) !== null) {\n regex += escapeRegExp(pattern.slice(lastIndex, match.index));\n regex += match[0] === \"yyyy\" ? \"(\\\\d{4})\" : \"(\\\\d{2})\";\n lastIndex = DATE_TOKEN_REGEXP.lastIndex;\n }\n\n regex += escapeRegExp(pattern.slice(lastIndex));\n regex += \"$\";\n\n return new RegExp(regex);\n}\n\nfunction isValidCalendarDate(year: number, month: number, day: number): boolean {\n if (month < 1 || month > 12 || day < 1) {\n return false;\n }\n\n const date = new Date(year, month - 1, day);\n\n return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;\n}\n\nexport function formatDateByPattern(date: Date, pattern: string): string {\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n\n return pattern.replace(DATE_TOKEN_REGEXP, (token) => {\n if (token === \"yyyy\") {\n return String(year).padStart(4, \"0\");\n }\n\n if (token === \"MM\") {\n return String(month).padStart(2, \"0\");\n }\n\n return String(day).padStart(2, \"0\");\n });\n}\n\nexport function parseDateByPattern(value: string, pattern: string): Date | undefined {\n const tokens = extractTokens(pattern);\n\n if (tokens.length !== 3 || !tokens.includes(\"yyyy\") || !tokens.includes(\"MM\") || !tokens.includes(\"dd\")) {\n return undefined;\n }\n\n const match = patternToRegExp(pattern).exec(value);\n\n if (!match) {\n return undefined;\n }\n\n let year: number | undefined;\n let month: number | undefined;\n let day: number | undefined;\n\n tokens.forEach((token, index) => {\n const part = Number(match[index + 1]);\n\n if (token === \"yyyy\") {\n year = part;\n return;\n }\n\n if (token === \"MM\") {\n month = part;\n return;\n }\n\n day = part;\n });\n\n if (year === undefined || month === undefined || day === undefined) {\n return undefined;\n }\n\n if (!isValidCalendarDate(year, month, day)) {\n return undefined;\n }\n\n return new Date(year, month - 1, day);\n}\n\nexport function isDatePatternMatch(value: string, pattern: string): boolean {\n return parseDateByPattern(value, pattern) !== undefined;\n}\n","import { formatDateByPattern, isDatePatternMatch, parseDateByPattern } from \"./dateFormat\";\n\n// Вернёт дату начала недели, по умолчанию воскресенье\nexport function startOfWeek(date: Date, weekStart = 0) {\n weekStart = weekStart % 7;\n\n const day = new Date(date);\n const weekDay = day.getDay();\n const diff = (weekDay < weekStart ? 7 : 0) + weekDay - weekStart;\n\n return new Date(day.setDate(day.getDate() - diff));\n}\n\n// Вернёт дату конца недели, по умолчанию суббота\nexport function endOfWeek(date: Date, weekStart = 0) {\n const day = new Date(startOfWeek(date, weekStart));\n\n return new Date(day.setDate(day.getDate() + 6));\n}\n\n// Вернёт даты всей недели\nexport function eachDayOfInterval(start: Date, end: Date) {\n const dates: Date[] = [];\n const startDate = new Date(start);\n const endDate = new Date(end);\n\n const endTime = endDate.getTime();\n const currentDate = startDate;\n currentDate.setHours(0, 0, 0, 0);\n\n while (currentDate.getTime() <= endTime) {\n dates.push(new Date(currentDate.getTime()));\n currentDate.setDate(currentDate.getDate() + 1);\n currentDate.setHours(0, 0, 0, 0);\n }\n\n return dates;\n}\n\n// Вернёт форматированную дату\nexport const getDayNames = (now: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6, locale?: string) => {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: \"narrow\" });\n\n return eachDayOfInterval(startOfWeek(now, weekStartsOn), endOfWeek(now, weekStartsOn)).map((day) =>\n formatter.format(day)\n );\n};\n\n// Вернёт дату первого дня месяца по текущей дате\nexport function startOfMonth(date: Date) {\n const _date = new Date(date);\n\n return new Date(_date.getFullYear(), _date.getMonth(), 1);\n}\n\n// Вернёт дату последнего дня месяца по текущей дате\nexport function endOfMonth(date: Date) {\n return setMaxTime(new Date(date.getFullYear(), date.getMonth() + 1, 0));\n}\n\n// Если date1 меньше чем date2\nexport function isBefore(date1: Date, date2: Date) {\n return new Date(date1) < new Date(date2);\n}\n\n// Если date1 больше чем date2\nexport function isAfter(date1: Date, date2: Date) {\n return isBefore(date2, date1);\n}\n\n// Добавит дни к текущий дате\nexport function addDays(date: Date, days: number) {\n const _date = new Date(date);\n\n _date.setDate(_date.getDate() + days);\n\n return _date;\n}\n\n// Получит даты дней недель как текущего месяца, так и за его пределом\nexport const getWeeks = (date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6) => {\n const start = startOfWeek(startOfMonth(date), weekStartsOn);\n const end = endOfWeek(endOfMonth(date), weekStartsOn);\n\n let count = 0;\n let current = start;\n const nestedWeeks: Date[][] = [];\n let lastDay = null;\n\n while (isBefore(current, end)) {\n const weekNumber = Math.floor(count / 7);\n nestedWeeks[weekNumber] = nestedWeeks[weekNumber] || [];\n const day = current.getDay();\n\n if (lastDay !== day) {\n lastDay = day;\n nestedWeeks[weekNumber].push(current);\n count += 1;\n }\n\n current = addDays(current, 1);\n }\n\n return nestedWeeks;\n};\n\n// Находится ли date1 в текущем месяце date2\nexport function isSameMonth(date1: Date, date2: Date) {\n return startOfMonth(date2) <= date1 && date1 <= endOfMonth(date2);\n}\n\n// Сбросит всё время\nexport function resetTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n// Установит максимальное время\nexport function setMaxTime(date: Date) {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n}\n\n// Определит, соответствуют ли даты текущему дню\nexport function isSameDay(date1: Date, date2: Date) {\n return resetTime(date1).getTime() === resetTime(date2).getTime();\n}\n\n// Добавит месяцы\nexport function addMonths(date: Date, months: number) {\n return setMonth(date, date.getMonth() + months);\n}\n\n// Добавит годы\nexport function addYears(date: Date, years: number) {\n return setYear(date, date.getFullYear() + years);\n}\n\n// Установит конец дня (по времени)\nexport function endOfDay(date: Date) {\n return setMaxTime(date);\n}\n\n// Установит начало дня (по времени)\nexport function startOfDay(date: Date) {\n return resetTime(date);\n}\n\n// Получит все месяцы\nexport function getMonths(locale?: string) {\n const months: {\n value: number;\n label: string;\n }[] = [];\n const formatter = new Intl.DateTimeFormat(locale, { month: \"long\" });\n\n for (let i = 0; i < 12; i++) {\n months.push({\n label: formatter.format(addMonths(new Date(\"1970-01-01\"), i)),\n value: i,\n });\n }\n\n return months;\n}\n\n// Установит месяц к текущей дате\nexport function setMonth(date: Date, month: number) {\n const _date = new Date(date);\n\n _date.setMonth(month);\n\n return _date;\n}\n\n// Получит диапазон годов от текущего года\nexport function getYears(currentYear: number, range: number) {\n const years: {\n value: number;\n label: string;\n }[] = [];\n\n for (let i = currentYear - range; i <= currentYear + range; i++) {\n years.push({ label: String(i).padStart(4, \"0\"), value: i });\n }\n\n return years;\n}\n\n// Установит год для текущей даты\nexport function setYear(date: Date, year: number) {\n const _date = new Date(date);\n\n _date.setFullYear(year);\n\n return _date;\n}\n\nexport function getMonthLabel(date: Date, locale?: string) {\n return new Intl.DateTimeFormat(locale, { month: \"short\" }).format(date);\n}\n\nexport function getYearLabel(date: Date, locale?: string) {\n return new Intl.DateTimeFormat(locale, { year: \"numeric\" }).format(date);\n}\n\nexport function getDisplayDate(date: unknown, format?: string) {\n if (!isValidDate(date)) {\n return \"\";\n }\n\n if (format) {\n return formatDateByPattern(date, format);\n }\n\n return new Intl.DateTimeFormat(undefined, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }).format(date);\n}\n\nexport function getCurrentFormatDate(format?: string): string {\n if (format) {\n return format;\n }\n\n const parts: { [key: string]: string } = {\n year: \"yyyy\",\n month: \"MM\",\n day: \"dd\",\n };\n const formatter = new Intl.DateTimeFormat(undefined, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" });\n const dateParts = formatter.formatToParts(new Date(\"1970-01-01\"));\n\n return dateParts.map((element) => parts[element.type] || element.value).join(\"\");\n}\n\nconst MASK_DATE_REGEXP = /\\d/gi;\nconst MASK_TOKEN_REGEXP = /[a-zA-Z]/g;\n\nexport function getMaskFormat(format?: string) {\n if (format) {\n return format.replace(MASK_TOKEN_REGEXP, \"_\");\n }\n\n const date = new Intl.DateTimeFormat(undefined, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }).format(\n new Date(\"1970-01-01\")\n );\n\n return date.replace(MASK_DATE_REGEXP, \"_\");\n}\n\nexport function maskedDateFormatter(mask: string) {\n return (value: string) => {\n let outputCharIndex = 0;\n\n return value\n .split(\"\")\n .map((char, inputCharIndex) => {\n MASK_DATE_REGEXP.lastIndex = 0;\n\n if (outputCharIndex > mask.length - 1) {\n return \"\";\n }\n\n const maskChar = mask[outputCharIndex];\n const nextMaskChar = mask[outputCharIndex + 1];\n\n const acceptedChar = MASK_DATE_REGEXP.test(char) ? char : \"\";\n const formattedChar = maskChar === \"_\" ? acceptedChar : maskChar + acceptedChar;\n\n outputCharIndex += formattedChar.length;\n\n const isLastCharacter = inputCharIndex === value.length - 1;\n\n if (isLastCharacter && nextMaskChar && nextMaskChar !== \"_\") {\n return formattedChar ? formattedChar + nextMaskChar : \"\";\n }\n\n return formattedChar;\n })\n .join(\"\");\n };\n}\n\nexport function isDateMatch(value: string, format: string) {\n return isDatePatternMatch(value, format);\n}\n\nexport function getDateByFormat(value: string, format: string) {\n const parsed = parseDateByPattern(value, format);\n\n if (!parsed) {\n return new Date(Number.NaN);\n }\n\n return parsed;\n}\n\nexport function isValidDate(value: unknown): value is Date {\n return Object.prototype.toString.call(value) === \"[object Date]\" && !isNaN(value as number);\n}\n","import React from \"react\";\nimport { OpenView } from \"./datePicker\";\nimport { DatePickerActionLabel } from \"./datePickerActionLabel\";\nimport { addMonths, addYears, getMonthLabel, getYearLabel } from \"./utils\";\n\nexport interface DataPickerHeaderProps {\n viewValue: Date;\n openView?: OpenView;\n onChange?: (value: Date) => void;\n onMonthLabelClick?: React.MouseEventHandler;\n onYearLabelClick?: React.MouseEventHandler;\n locale?: string;\n}\n\nexport function DataPickerHeader({\n viewValue,\n openView,\n onChange,\n onMonthLabelClick,\n onYearLabelClick,\n locale,\n}: DataPickerHeaderProps) {\n const onMonthIconClick = React.useCallback(\n (value: number) => () => {\n onChange?.(addMonths(viewValue, value));\n },\n [onChange, viewValue]\n );\n\n const onYearIconClick = React.useCallback(\n (value: number) => () => {\n onChange?.(addYears(viewValue, value));\n },\n [onChange, viewValue]\n );\n\n const hiddenSwitches = openView === OpenView.months || openView === OpenView.years;\n\n return (\n <div className=\"smwb-date-picker__header\">\n <DatePickerActionLabel\n label={getMonthLabel(viewValue, locale)}\n onLeftIconClick={onMonthIconClick(-1)}\n onRightIconClick={onMonthIconClick(1)}\n onLabelClick={onMonthLabelClick}\n disabled={openView === OpenView.years}\n active={openView === OpenView.months}\n hiddenSwitches={hiddenSwitches}\n dataToggleId=\"date-picker-months-toggle\"\n />\n <DatePickerActionLabel\n label={getYearLabel(viewValue, locale)}\n onLeftIconClick={onYearIconClick(-1)}\n onRightIconClick={onYearIconClick(1)}\n onLabelClick={onYearLabelClick}\n disabled={openView === OpenView.months}\n active={openView === OpenView.years}\n hiddenSwitches={hiddenSwitches}\n dataToggleId=\"date-picker-years-toggle\"\n />\n </div>\n );\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\n\ninterface DataPickerDayProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n active?: boolean;\n current?: boolean;\n hidden?: boolean;\n outside?: boolean;\n disabled?: boolean;\n inRange?: boolean;\n day: Date;\n onChange?: (event?: React.ChangeEvent<HTMLInputElement>, date?: Date) => void;\n}\n\nexport const DatePickerDay = React.memo(function DataPickerDay({\n className,\n children,\n onMouseDown: onMouseDownProp,\n onChange,\n active,\n current,\n hidden,\n outside,\n disabled,\n inRange,\n day,\n ...rest\n}: DataPickerDayProps) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseDownProp?.(event);\n },\n [onMouseDownProp]\n );\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => {\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n },\n [disabled]\n );\n\n const onClick = React.useCallback(() => {\n if (!disabled) {\n onChange?.(undefined, day);\n }\n }, [onChange, day, disabled]);\n\n if (hidden) {\n return <span className=\"smwb-date-picker__day-hidden\" />;\n }\n\n const classes = cn(\"smwb-date-picker__day\", className, {\n \"smwb-date-picker__day--active\": !disabled && active,\n \"smwb-date-picker__day--current\": current && !active,\n \"smwb-date-picker__day--outside\": !disabled && outside,\n \"smwb-date-picker__day--disabled\": disabled,\n \"smwb-date-picker__day--in-range\": !disabled && inRange,\n });\n\n return (\n <button\n className={classes}\n type=\"button\"\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n onClick={onClick}\n disabled={disabled}\n {...rest}\n >\n {children}\n {!disabled && <Ripple actionRef={rippleRef} center />}\n </button>\n );\n});\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport {\n getDayNames,\n getWeeks,\n isSameMonth,\n isSameDay,\n isBefore,\n endOfDay,\n isAfter,\n startOfDay,\n isValidDate,\n} from \"./utils\";\nimport { DatePickerDay } from \"./datePickerDay\";\nimport { DatePickerProps } from \"./datePicker\";\n\nexport interface DataPickerDaysProps extends Partial<\n Pick<\n DatePickerProps,\n | \"value\"\n | \"showDaysOutsideMonth\"\n | \"onChange\"\n | \"disablePast\"\n | \"disableFuture\"\n | \"weekStartsOn\"\n | \"minDate\"\n | \"maxDate\"\n | \"isDateDisabled\"\n | \"locale\"\n >\n> {\n viewValue: Date;\n /** Range selection mode. */\n range?: boolean;\n rangeStart?: Date;\n rangeEnd?: Date;\n}\n\nexport function DataPickerDays({\n viewValue,\n value,\n showDaysOutsideMonth,\n onChange,\n disablePast,\n disableFuture,\n weekStartsOn = 0,\n minDate,\n maxDate,\n isDateDisabled,\n locale,\n range,\n rangeStart,\n rangeEnd,\n}: DataPickerDaysProps) {\n const [now] = useState(new Date());\n\n const dayNames = useMemo(() => getDayNames(now, weekStartsOn, locale), [now, weekStartsOn, locale]);\n const weeks = useMemo(() => getWeeks(viewValue, weekStartsOn), [viewValue, weekStartsOn]);\n\n const isActive = useCallback(\n (day: Date) => {\n if (range) {\n return (\n (isValidDate(rangeStart) && isSameDay(day, rangeStart)) || (isValidDate(rangeEnd) && isSameDay(day, rangeEnd))\n );\n }\n\n if (!isValidDate(value)) {\n return false;\n }\n\n return isSameDay(day, value);\n },\n [value, range, rangeStart, rangeEnd]\n );\n\n const isInRange = useCallback(\n (day: Date) => {\n if (!range || !isValidDate(rangeStart) || !isValidDate(rangeEnd)) {\n return false;\n }\n return isAfter(startOfDay(day), startOfDay(rangeStart)) && isBefore(endOfDay(day), endOfDay(rangeEnd));\n },\n [range, rangeStart, rangeEnd]\n );\n\n const isDisabledDay = useCallback(\n (day: Date) => {\n let disabled = false;\n\n if (disablePast) {\n disabled = isBefore(endOfDay(day), now);\n }\n\n if (disableFuture) {\n disabled = disabled || isAfter(startOfDay(day), now);\n }\n\n if (minDate && isBefore(endOfDay(day), startOfDay(minDate))) {\n disabled = true;\n }\n\n if (maxDate && isAfter(startOfDay(day), endOfDay(maxDate))) {\n disabled = true;\n }\n\n if (isDateDisabled?.(day)) {\n disabled = true;\n }\n\n return disabled;\n },\n [disablePast, disableFuture, now, minDate, maxDate, isDateDisabled]\n );\n\n const weekDays = useMemo(() => {\n return dayNames.map((day, index) => (\n <span key={index} className=\"smwb-date-picker__week-day\">\n {day.toString()}\n </span>\n ));\n }, [dayNames]);\n\n return (\n <div className=\"smwb-date-picker__days\">\n <div className=\"smwb-date-picker__week-days\">{weekDays}</div>\n <div className=\"smwb-date-picker__month\">\n {weeks.map((week, index) => (\n <div key={index} className=\"smwb-date-picker__week\">\n {week.map((day) => {\n const isOutside = !isSameMonth(day, viewValue);\n\n return (\n <DatePickerDay\n key={day.toISOString()}\n day={day}\n current={isSameDay(day, now)}\n active={isActive(day)}\n inRange={isInRange(day)}\n hidden={!showDaysOutsideMonth && isOutside}\n outside={isOutside}\n onChange={onChange}\n disabled={isDisabledDay(day)}\n >\n {day.getDate()}\n </DatePickerDay>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface MenuContextValue {\n dense: boolean;\n variant: \"static\" | \"floating\";\n onClose: () => void;\n}\n\nexport const MenuContext = React.createContext<MenuContextValue>({\n dense: false,\n variant: \"floating\",\n onClose: () => null,\n});\n\nexport function useMenuContext() {\n return React.useContext(MenuContext);\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { MenuContext } from \"./menuContext\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\n\ninterface LinkProps extends React.HTMLAttributes<HTMLAnchorElement> {\n [key: string]: unknown;\n}\n\nexport interface MenuItemProps extends React.HTMLAttributes<HTMLLIElement> {\n disabled?: boolean;\n selected?: boolean;\n href?: string;\n linkElement?: React.ElementType;\n linkProps?: LinkProps;\n value?: unknown;\n optionRenderer?: (args: MenuItemProps) => React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLLIElement>;\n}\n\nexport const MenuItem = React.forwardRef<HTMLLIElement, MenuItemProps>(function MenuItemInRef(props, ref) {\n const {\n children,\n className,\n disabled,\n selected,\n onClick: onClickProp,\n onMouseDown: onMouseDownProp,\n href,\n linkElement,\n linkProps,\n value,\n optionRenderer,\n ...rest\n } = props;\n const { dense } = React.useContext(MenuContext);\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onClick = (event: React.MouseEvent<HTMLLIElement>) => {\n if (disabled) {\n if (href) {\n event.preventDefault();\n }\n\n return;\n }\n\n onClickProp?.(event);\n };\n\n const onMouseDown = (event: React.MouseEvent<HTMLLIElement>) => {\n if (!disabled) {\n onMouseDownProp?.(event);\n }\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLLIElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n let content: React.ReactElement;\n\n if (href) {\n const Tag: React.ElementType = linkElement ?? \"a\";\n\n content = (\n <Tag className=\"smwb-menu__item-inner\" href={href} {...linkProps}>\n {children}\n <span className=\"smwb-menu__item__helper-text\"></span>\n </Tag>\n );\n } else {\n content = <span className=\"smwb-menu__item-inner\">{children}</span>;\n }\n\n const classes = cn(\"smwb-menu__item\", className, {\n \"smwb-menu__item--dense\": dense,\n \"smwb-menu__item--disabled\": disabled,\n \"smwb-menu__item--selected\": selected,\n });\n\n return optionRenderer ? (\n optionRenderer(props)\n ) : (\n <li\n role=\"menuitem\"\n ref={ref}\n className={classes}\n tabIndex={disabled ? undefined : 0}\n onClick={onClick}\n data-value={value}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {content}\n <Ripple actionRef={rippleRef} />\n </li>\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { MenuContext } from \"./menuContext\";\n\nexport interface MenuItemIconProps extends React.HTMLAttributes<HTMLSpanElement> {\n edge?: \"start\" | \"end\";\n}\n\nexport const MenuItemIcon = React.forwardRef<HTMLSpanElement, MenuItemIconProps>(function MenuItemIcon(props, ref) {\n const { children, className, edge, ...rest } = props;\n const { dense } = React.useContext(MenuContext);\n const classes = cn(\"smwb-menu__icon\", className, {\n \"smwb-menu__icon--dense\": dense,\n \"smwb-menu__icon--start\": edge === \"start\",\n \"smwb-menu__icon--end\": edge === \"end\",\n });\n\n return (\n <span ref={ref} className={classes} {...rest}>\n {children}\n </span>\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { MenuContext } from \"./menuContext\";\n\nexport interface MenuItemTextProps extends React.HTMLAttributes<HTMLSpanElement> {\n inset?: boolean;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const MenuItemText = React.forwardRef<HTMLSpanElement, MenuItemTextProps>(function MenuItemText(props, ref) {\n const { children, className, inset = false, ...rest } = props;\n const { dense } = React.useContext(MenuContext);\n const classnames = cn(\"smwb-menu__text\", className, {\n \"smwb-menu__text--inset\": inset,\n \"smwb-menu__text--dense\": dense,\n });\n\n return (\n <span ref={ref} className={classnames} {...rest}>\n {children}\n </span>\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { useMenuContext } from \"./menuContext\";\n\nexport type MenuDividerProps = React.HTMLAttributes<HTMLLIElement>;\n\nexport const MenuDivider = React.forwardRef<HTMLLIElement, MenuDividerProps>(function MenuDivider(props, ref) {\n const { className, ...rest } = props;\n const { variant } = useMenuContext();\n\n return (\n <li\n ref={ref}\n className={cn(\"smwb-menu__divider\", className, variant === \"static\" && \"smwb-menu__divider--vertical\")}\n {...rest}\n />\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { useMenuContext } from \"./menuContext\";\n\nexport type MenuListProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const MenuList = React.forwardRef<HTMLDivElement, MenuListProps>(function MenuList(props, ref) {\n const { children, className, ...rest } = props;\n const { variant, onClose } = useMenuContext();\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLUListElement>) => {\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n );\n if (items.length === 0) {\n return;\n }\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n items[(currentIndex + 1 + items.length) % items.length]?.focus();\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n items[(currentIndex - 1 + items.length) % items.length]?.focus();\n } else if (event.key === \"Home\") {\n event.preventDefault();\n items[0]?.focus();\n } else if (event.key === \"End\") {\n event.preventDefault();\n items[items.length - 1]?.focus();\n } else if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n return (\n <div ref={ref} className={cn(\"smwb-menu\", className, `smwb-menu--${variant}`)} {...rest}>\n <ul\n className={cn(\"smwb-menu__list\", `smwb-menu__list--${variant}`)}\n role=\"menu\"\n aria-orientation=\"vertical\"\n onKeyDown={onKeyDown}\n >\n {children}\n </ul>\n </div>\n );\n});\n","import React from \"react\";\nimport { autoUpdate, Middleware, useFloating } from \"@floating-ui/react\";\nimport Transition, { TransitionStatus } from \"react-transition-group/Transition\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { buildFloatingMiddleware, Placement, resolvePlacement, type ResolvedPlacement } from \"../../../utils/floating\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { MenuList } from \"./menuList\";\n\nexport function buildMenuFloatingMiddleware(resolved: ResolvedPlacement, custom?: Middleware[]): Middleware[] {\n return buildFloatingMiddleware(resolved, custom);\n}\n\nconst defaultStyle = (duration: number): React.CSSProperties => ({\n transition: `opacity ${duration}ms ease-in-out`,\n opacity: 0,\n});\n\nconst transitionStyles = {\n entering: { opacity: 1 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n} as Record<TransitionStatus, React.CSSProperties>;\n\nexport interface MenuFloatingProps extends React.HTMLAttributes<HTMLDivElement> {\n anchorElement?: Element | null;\n isOpen?: boolean;\n onClose?: () => void;\n placement?: Placement;\n middleware?: Middleware[];\n}\n\nexport const MenuFloating = React.forwardRef<HTMLDivElement, MenuFloatingProps>(function MenuFloating(props, ref) {\n const { anchorElement, isOpen, onClose, placement = \"bottom-start\", middleware, style, ...rest } = props;\n const [menuElement, setMenuElement] = React.useState<HTMLElement | null>(null);\n const nodeRef = React.useRef<HTMLElement>(null);\n\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n open: Boolean(isOpen),\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n elements: { reference: anchorElement ?? null },\n middleware: buildMenuFloatingMiddleware(resolved, middleware),\n });\n\n const menuRef = useForkRef(ref, nodeRef, setMenuElement, refs.setFloating);\n\n const onAwayClick = (event: MouseEvent | TouchEvent) => {\n if (!isOpen || !onClose || !menuElement) {\n return;\n }\n\n const target = event.target as HTMLElement;\n\n if (menuElement.contains(target) || (anchorElement as HTMLElement | null)?.contains(target)) {\n return undefined;\n }\n\n onClose?.();\n };\n\n return (\n <Transition nodeRef={nodeRef} in={Boolean(isOpen)} timeout={150} unmountOnExit>\n {(state) => (\n <ClickAwayListener onClickAway={onAwayClick}>\n <MenuList\n ref={menuRef}\n style={{\n ...floatingStyles,\n ...style,\n ...defaultStyle(150),\n ...transitionStyles[state],\n }}\n {...rest}\n />\n </ClickAwayListener>\n )}\n </Transition>\n );\n});\n","import React from \"react\";\nimport { offset } from \"@floating-ui/react\";\nimport { MenuFloating, MenuFloatingProps } from \"./menuFloating\";\nimport { MenuItemProps } from \"./menuItem\";\nimport { MenuContext, useMenuContext } from \"./menuContext\";\n\nexport type MenuSubmenuProps = Pick<MenuFloatingProps, \"placement\" | \"onClose\"> &\n React.HTMLAttributes<HTMLDivElement> & {\n toggleElement?: React.ReactElement;\n /** Items and/or nested `MenuSubmenu` elements (multi-level supported). */\n children: React.ReactNode;\n /** Open the submenu on pointer hover in addition to click. */\n openOnHover?: boolean;\n };\n\nexport const MenuSubmenu = React.forwardRef<HTMLDivElement, MenuSubmenuProps>(function MenuSubmenu(props, ref) {\n const { children, toggleElement, placement = \"right-start\", onClose: onCloseProp, openOnHover, ...rest } = props;\n const [isOpen, setIsOpen] = React.useState(false);\n const [anchorElement, setAnchorElement] = React.useState<HTMLElement | null>(null);\n const contextValue = useMenuContext();\n\n const middleware: MenuFloatingProps[\"middleware\"] = [\n offset(({ placement }) => {\n switch (placement) {\n case \"right-start\":\n case \"left-start\":\n return { crossAxis: -8, mainAxis: 0 };\n case \"right-end\":\n case \"left-end\":\n return { crossAxis: 8, mainAxis: 0 };\n default:\n return { crossAxis: 0, mainAxis: 0 };\n }\n }),\n ];\n\n const onToggle = (event: React.MouseEvent) => {\n // Только для левой клавиши мышки.\n if (event.button !== 0) {\n return;\n }\n\n setIsOpen((prevState) => !prevState);\n };\n\n const onClose = () => {\n setIsOpen(false);\n onCloseProp?.();\n };\n\n const onToggleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"ArrowRight\" || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setIsOpen(true);\n } else if (event.key === \"ArrowLeft\" || event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n const toggle = React.cloneElement(\n toggleElement as React.ReactElement,\n {\n ref: setAnchorElement,\n onClick: onToggle,\n onKeyDown: onToggleKeyDown,\n onMouseEnter: openOnHover ? () => setIsOpen(true) : undefined,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": isOpen,\n selected: isOpen,\n } as MenuItemProps\n );\n\n return (\n <MenuContext.Provider value={{ ...contextValue, variant: \"floating\" }}>\n {toggle}\n <MenuFloating\n ref={ref}\n {...rest}\n placement={placement}\n isOpen={isOpen}\n onClose={onClose}\n anchorElement={anchorElement}\n middleware={middleware}\n >\n {React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) {\n return null;\n }\n // Nested submenus manage their own open/close lifecycle — don't\n // collapse the whole menu when interacting with their toggle.\n if (child.type === MenuSubmenu) {\n return child;\n }\n const typed = child as React.ReactElement<MenuItemProps>;\n return React.cloneElement(typed, {\n onClick: (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n typed.props.onClick?.(e);\n onClose();\n contextValue.onClose();\n },\n });\n })}\n </MenuFloating>\n </MenuContext.Provider>\n );\n});\n","import React from \"react\";\nimport { useMenuContext } from \"./menuContext\";\nimport { MenuList } from \"./menuList\";\nimport { MenuFloating, MenuFloatingProps } from \"./menuFloating\";\n\nexport const MenuComponent = React.forwardRef<HTMLDivElement, MenuFloatingProps>(function MenuComponent(props, ref) {\n const { variant } = useMenuContext();\n if (variant === \"static\") {\n // Static menus render MenuList directly; strip the floating-only props so\n // they don't leak onto the underlying <div> (e.g. isOpen → DOM attribute).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { anchorElement, isOpen, onClose, placement, middleware, ...domProps } = props;\n return <MenuList ref={ref} {...domProps} />;\n }\n return <MenuFloating ref={ref} {...props} />;\n});\n","import React from \"react\";\nimport { MenuContext } from \"./menuContext\";\nimport { MenuComponent } from \"./menuComponent\";\nimport { MenuFloatingProps } from \"./menuFloating\";\n\nexport type MenuProps = MenuFloatingProps &\n React.HTMLAttributes<HTMLElement> & {\n variant?: \"static\" | \"floating\";\n dense?: boolean;\n };\n\nexport const Menu = React.forwardRef<HTMLDivElement, MenuProps>(function Menu(props, ref) {\n const { dense = false, variant = \"floating\", onClose: onCloseProp, ...rest } = props;\n\n const onClose = () => {\n onCloseProp?.();\n };\n\n return (\n <MenuContext.Provider value={{ dense, variant, onClose }}>\n <MenuComponent ref={ref} onClose={onCloseProp} {...rest} />\n </MenuContext.Provider>\n );\n});\n","import React from \"react\";\nimport { MenuItem, MenuItemIcon, MenuItemText } from \"../../navigation/menu\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport Icon from \"../../base/icon/icon\";\n\ninterface Item {\n label: string;\n value: number;\n}\n\nexport interface DataPickerListProps {\n value: number;\n items: Item[];\n onChange: (value: number) => void;\n}\n\nexport function DatePickerList({ value: valueProp, items, onChange }: DataPickerListProps) {\n const overflowRef = React.useRef<HTMLDivElement>(null);\n const selectedItemRef = React.useRef<HTMLLIElement>(null);\n\n useSafeLayoutEffect(() => {\n if (overflowRef.current && selectedItemRef.current) {\n const middle = (overflowRef.current.offsetHeight - selectedItemRef.current.offsetHeight) / 2;\n\n // Прокрутит до элемента середины списка\n overflowRef.current.scrollTop = selectedItemRef.current.offsetTop - middle;\n }\n });\n\n const onItemClick = React.useCallback(\n (value: number) => () => {\n onChange?.(value);\n },\n [onChange]\n );\n\n const setRef = React.useCallback(\n (value: number) => (element: HTMLLIElement) => {\n if (valueProp === value) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Мутабельный объект\n selectedItemRef.current = element;\n }\n },\n [valueProp]\n );\n\n return (\n <div className=\"smwb-date-picker__overflow\" ref={overflowRef} data-testid=\"date-picker-list\">\n <ul className=\"smwb-date-picker__list\">\n {items.map(({ label, value }) => {\n const isSelected = valueProp === value;\n\n return (\n <MenuItem key={value} selected={isSelected} onClick={onItemClick(value)} ref={setRef(value)}>\n {isSelected && (\n <MenuItemIcon>\n <Icon name=\"check\" weight={500} size={24} />\n </MenuItemIcon>\n )}\n <MenuItemText className=\"smwb-date-picker__list-item\" inset={!isSelected}>\n {label}\n </MenuItemText>\n </MenuItem>\n );\n })}\n </ul>\n </div>\n );\n}\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useRifm } from \"rifm\";\nimport {\n getDateByFormat,\n isDateMatch,\n getDisplayDate,\n getMaskFormat,\n getCurrentFormatDate,\n maskedDateFormatter,\n} from \"./utils\";\nimport { DatePickerProps } from \"./datePicker\";\n\nexport type UseDateInputProps = Pick<DatePickerProps, \"value\" | \"onChange\" | \"onBlur\"> & {\n /** Date format pattern with tokens dd, MM, yyyy (e.g. \"dd/MM/yyyy\"). Defaults to the system locale. */\n format?: string;\n};\n\ninterface UseDateInputReturn {\n value: string;\n onChange: React.ChangeEventHandler;\n onBlur: React.ChangeEventHandler;\n placeholder: string;\n}\n\n// Формат даты для текущей локали, например ru — dd.MM.yyyy, en — MM/dd/yyyy\nconst defaultFormatDate = getCurrentFormatDate();\n\nexport function useDateInput({\n value: valueProp,\n onChange: onChangeProp,\n onBlur: onBlurProp,\n format,\n}: UseDateInputProps): UseDateInputReturn {\n const currentFormatDate = useMemo(() => (format ? getCurrentFormatDate(format) : defaultFormatDate), [format]);\n const [displayedValue, setDisplayedValue] = useState(getDisplayDate(valueProp, format));\n\n // Получаем маску даты для текущей локали\n const maskFormat = useMemo(() => getMaskFormat(format), [format]);\n // Форматирование для выходного значения в поле\n const formatter = useMemo(() => maskedDateFormatter(maskFormat), [maskFormat]);\n\n const prevValue = useRef<UseDateInputProps[\"value\"]>(undefined);\n\n React.useEffect(() => {\n const isValueChanged = valueProp !== prevValue.current;\n prevValue.current = valueProp;\n\n if (!isValueChanged) {\n return;\n }\n\n setDisplayedValue(getDisplayDate(valueProp, format));\n }, [valueProp, format]);\n\n const onChange = (value: string) => {\n setDisplayedValue(value);\n\n if (!onChangeProp) {\n return;\n }\n\n if (isDateMatch(value, currentFormatDate)) {\n onChangeProp(undefined, getDateByFormat(value, currentFormatDate));\n } else if (value === \"\") {\n onChangeProp(undefined);\n }\n };\n\n const onBlur = useCallback(() => {\n if (!onBlurProp) {\n return;\n }\n\n if (isDateMatch(prevValue.current?.toString() ?? \"\", currentFormatDate)) {\n onBlurProp(undefined, getDateByFormat(prevValue.current?.toString() ?? \"\", currentFormatDate));\n } else if (prevValue.current === \"\") {\n onBlurProp(undefined);\n }\n\n setDisplayedValue(getDisplayDate(valueProp, format));\n }, [onBlurProp, valueProp, format, currentFormatDate]);\n\n const rifmProps = useRifm({\n value: displayedValue,\n onChange,\n format: formatter,\n });\n\n const placeholder = currentFormatDate.toLowerCase();\n\n return {\n ...rifmProps,\n onBlur,\n placeholder,\n };\n}\n","import React from \"react\";\nimport { TextField } from \"../textField\";\nimport { DatePickerIconButton } from \"./datePickerIconButton\";\nimport { useDateInput } from \"./useDateInput\";\nimport { DatePickerProps } from \"./datePicker\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface DataPickerInputProps extends Omit<\n DatePickerProps,\n \"locale\" | \"showDaysOutsideMonth\" | \"disablePast\" | \"disableFuture\" | \"weekStartsOn\" | \"placement\"\n> {\n onToggle: () => void;\n}\n\nfunction stopPropagation(event: React.SyntheticEvent) {\n event.stopPropagation();\n}\n\nexport const DataPickerInput = React.forwardRef(function DataPickerInput(\n props: DataPickerInputProps,\n ref: React.Ref<HTMLInputElement>\n) {\n const { value, onChange, onBlur, onToggle, disabled, disableCalendar, calendarIcon, format, ...rest } = props;\n const maskedProps = useDateInput({ value, onChange, onBlur, format });\n\n return (\n <TextField\n ref={ref}\n {...maskedProps}\n type=\"tel\"\n endAdornment={\n !disableCalendar && (\n <DatePickerIconButton\n edge=\"end\"\n onClick={onToggle}\n onMouseDown={stopPropagation}\n disabled={Boolean(disabled)}\n data-testid=\"date-picker-icon-button\"\n >\n {calendarIcon || <Icon name=\"calendar_today\" fill={1} weight={500} size={24} />}\n </DatePickerIconButton>\n )\n }\n disabled={Boolean(disabled)}\n {...rest}\n />\n );\n});\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { autoUpdate, useFloating } from \"@floating-ui/react\";\nimport Transition, { TransitionStatus } from \"react-transition-group/Transition\";\nimport { buildFloatingMiddleware, Placement, resolvePlacement } from \"../../../utils/floating\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { TextField, TextFieldProps } from \"../textField\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { DataPickerHeader } from \"./dataPickerHeader\";\nimport { DataPickerDays } from \"./dataPickerDays\";\nimport { DatePickerList } from \"./datePickerList\";\nimport { getMonths, setMonth, getYears, setYear, isValidDate, getDisplayDate } from \"./utils\";\nimport { DataPickerInput } from \"./dataPickerInput\";\nimport { DatePickerIconButton } from \"./datePickerIconButton\";\nimport Icon from \"../../base/icon/icon\";\nimport { createPortal } from \"react-dom\";\n\nexport enum OpenView {\n days = \"days\",\n months = \"months\",\n years = \"years\",\n}\n\nconst defaultStyle = (duration: number) => ({\n transition: `opacity ${duration}ms ease-in-out`,\n opacity: 0,\n});\n\nconst transitionStyles = {\n entering: { opacity: 1 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n} as Record<TransitionStatus, { opacity: number }>;\n\nexport interface DatePickerProps extends Omit<TextFieldProps, \"onBlur\" | \"onChange\" | \"value\" | \"defaultValue\"> {\n showDaysOutsideMonth?: boolean;\n disablePast?: boolean;\n disableFuture?: boolean;\n /** Earliest selectable date (inclusive). */\n minDate?: Date;\n /** Latest selectable date (inclusive). */\n maxDate?: Date;\n /** Predicate to disable arbitrary days. */\n isDateDisabled?: (day: Date) => boolean;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** BCP-47 locale for calendar labels (day/month/year names). */\n locale?: string;\n /** Input format pattern with tokens dd, MM, yyyy, e.g. \"dd/MM/yyyy\". */\n format?: string;\n /** Enables date-range selection. */\n range?: boolean;\n /** Controlled range value `[start, end]`. */\n rangeValue?: [Date | undefined, Date | undefined];\n /** Called when the range changes. */\n onRangeChange?: (range: [Date | undefined, Date | undefined]) => void;\n placement?: Placement;\n disableCalendar?: boolean;\n label?: string;\n /** Accessible label for the calendar popup dialog. */\n calendarAriaLabel?: string;\n autoComplete?: string;\n value?: Date | string;\n calendarIcon?: React.ReactNode;\n onChange?: (event?: React.ChangeEvent<HTMLInputElement>, value?: Date, data?: DatePickerProps) => void;\n onBlur?: (event?: React.FocusEvent<HTMLInputElement>, value?: Date, data?: DatePickerProps) => void;\n}\n\nexport const DatePicker = React.forwardRef(function DatePicker(props: DatePickerProps, ref) {\n const {\n value: valueProp,\n onChange: onChangeProp,\n showDaysOutsideMonth,\n disablePast,\n disableFuture,\n weekStartsOn = 1,\n placement = \"bottom-start\",\n disabled,\n disableCalendar,\n calendarAriaLabel = \"Choose date\",\n minDate,\n maxDate,\n isDateDisabled,\n locale,\n format,\n range,\n rangeValue,\n onRangeChange,\n calendarIcon,\n onBlur: onBlurProp,\n ...rest\n } = props;\n const value = useMemo(() => (valueProp === undefined ? undefined : new Date(valueProp)), [valueProp]);\n const isRangeControlled = rangeValue !== undefined;\n const [rangeState, setRangeState] = useState<[Date | undefined, Date | undefined]>([undefined, undefined]);\n const currentRange = isRangeControlled && rangeValue ? rangeValue : rangeState;\n const [viewValue, setViewValue] = useState<Date>(() => (isValidDate(value) ? value : new Date()));\n const [openView, setOpenView] = useState<OpenView>(OpenView.days);\n const [isOpen, setIsOpen] = useState(false);\n\n const anchorRef = useRef<HTMLDivElement | null>(null);\n const calendarRef = useRef<HTMLDivElement | null>(null);\n\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: buildFloatingMiddleware(resolved),\n });\n\n const anchorForkRef = useForkRef(anchorRef, refs.setReference, ref);\n const calendarForkRef = useForkRef(calendarRef, refs.setFloating);\n\n useSafeLayoutEffect(() => {\n if (disabled) {\n return;\n }\n\n setViewValue(isValidDate(value) ? value : new Date());\n }, [value, disabled]);\n\n const onViewValueChange = useCallback((value: Date) => {\n setViewValue(value);\n }, []);\n\n const onMonthLabelClick = useCallback(() => {\n setOpenView(openView === OpenView.months ? OpenView.days : OpenView.months);\n }, [openView]);\n\n const onYearLabelClick = useCallback(() => {\n setOpenView(openView === OpenView.years ? OpenView.days : OpenView.years);\n }, [openView]);\n\n const onMonthChange = useCallback(\n (month: number) => {\n setViewValue(setMonth(viewValue, month));\n setOpenView(OpenView.days);\n },\n [viewValue]\n );\n\n const onYearChange = useCallback(\n (month: number) => {\n setViewValue(setYear(viewValue, month));\n setOpenView(OpenView.days);\n },\n [viewValue]\n );\n\n const onChange = useCallback(\n (event?: React.ChangeEvent<HTMLInputElement>, date?: Date) => {\n if (range) {\n if (!date) {\n return;\n }\n const [start, end] = currentRange;\n let next: [Date | undefined, Date | undefined];\n if (!start || (start && end)) {\n next = [date, undefined];\n } else {\n next = isValidDate(start) && date.getTime() < start.getTime() ? [date, start] : [start, date];\n }\n if (!isRangeControlled) {\n setRangeState(next);\n }\n onRangeChange?.(next);\n if (next[0] && next[1]) {\n setIsOpen(false);\n }\n return;\n }\n onChangeProp?.(event, date, props);\n setIsOpen(false);\n },\n [onChangeProp, props, range, currentRange, isRangeControlled, onRangeChange]\n );\n\n const onToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prevState) => !prevState);\n }\n }, [disabled]);\n\n const onClickAway = useCallback((event: Event | React.SyntheticEvent) => {\n const target = event.target as HTMLElement;\n\n if (calendarRef.current?.contains(target) || anchorRef.current?.contains(target)) {\n return;\n }\n\n setIsOpen(false);\n }, []);\n\n const months = useMemo(() => getMonths(locale), [locale]);\n const years = useMemo(() => getYears(new Date().getFullYear(), 100), []);\n\n let view: React.ReactNode = null;\n\n switch (openView) {\n case OpenView.days:\n view = (\n <DataPickerDays\n viewValue={viewValue}\n value={value}\n showDaysOutsideMonth={showDaysOutsideMonth}\n onChange={onChange}\n disablePast={disablePast}\n disableFuture={disableFuture}\n weekStartsOn={weekStartsOn}\n minDate={minDate}\n maxDate={maxDate}\n isDateDisabled={isDateDisabled}\n locale={locale}\n range={range}\n rangeStart={currentRange[0]}\n rangeEnd={currentRange[1]}\n />\n );\n break;\n case OpenView.months:\n view = <DatePickerList value={viewValue.getMonth()} items={months} onChange={onMonthChange} />;\n break;\n case OpenView.years:\n view = <DatePickerList value={viewValue.getFullYear()} items={years} onChange={onYearChange} />;\n break;\n }\n\n const rangeDisplay =\n range && (currentRange[0] || currentRange[1])\n ? `${getDisplayDate(currentRange[0], format)} – ${getDisplayDate(currentRange[1], format)}`\n : \"\";\n\n return (\n <>\n {range ? (\n <TextField\n ref={anchorForkRef}\n value={rangeDisplay}\n readOnly\n onChange={() => undefined}\n disabled={Boolean(disabled)}\n placeholder={format ? `${format} – ${format}` : undefined}\n endAdornment={\n !disableCalendar && (\n <DatePickerIconButton\n edge=\"end\"\n onClick={onToggle}\n disabled={Boolean(disabled)}\n data-testid=\"date-picker-icon-button\"\n >\n {calendarIcon || <Icon name=\"calendar_today\" fill={1} weight={500} size={24} />}\n </DatePickerIconButton>\n )\n }\n {...rest}\n />\n ) : (\n <DataPickerInput\n ref={anchorForkRef}\n value={value}\n onChange={onChangeProp}\n onBlur={onBlurProp}\n onToggle={onToggle}\n disabled={disabled}\n disableCalendar={disableCalendar}\n format={format}\n calendarIcon={calendarIcon}\n {...rest}\n />\n )}\n {createPortal(\n <Transition\n nodeRef={calendarRef}\n in={isOpen && !disabled && !disableCalendar}\n timeout={150}\n mountOnEnter\n unmountOnExit\n >\n {(state) => (\n <ClickAwayListener onClickAway={onClickAway}>\n <div\n ref={calendarForkRef}\n className=\"smwb-date-picker\"\n style={{\n ...floatingStyles,\n ...defaultStyle(150),\n ...transitionStyles[state],\n }}\n data-testid=\"date-picker\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={calendarAriaLabel}\n >\n <div className=\"smwb-date-picker__inner\">\n <DataPickerHeader\n viewValue={viewValue}\n locale={locale}\n openView={openView}\n onChange={onViewValueChange}\n onMonthLabelClick={onMonthLabelClick}\n onYearLabelClick={onYearLabelClick}\n />\n <div className=\"smwb-date-picker__body\">{view}</div>\n </div>\n </div>\n </ClickAwayListener>\n )}\n </Transition>,\n document.body\n )}\n </>\n );\n});\n\nexport default DatePicker;\n","const DATETIME_TOKEN_REGEXP = /yyyy|MM|dd|HH|mm|ss/g;\n\ntype DateTimeToken = \"yyyy\" | \"MM\" | \"dd\" | \"HH\" | \"mm\" | \"ss\";\n\nfunction extractTokens(pattern: string): DateTimeToken[] {\n const tokens: DateTimeToken[] = [];\n let match: RegExpExecArray | null;\n\n DATETIME_TOKEN_REGEXP.lastIndex = 0;\n while ((match = DATETIME_TOKEN_REGEXP.exec(pattern)) !== null) {\n tokens.push(match[0] as DateTimeToken);\n }\n\n return tokens;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction patternToRegExp(pattern: string): RegExp {\n let regex = \"^\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n DATETIME_TOKEN_REGEXP.lastIndex = 0;\n while ((match = DATETIME_TOKEN_REGEXP.exec(pattern)) !== null) {\n regex += escapeRegExp(pattern.slice(lastIndex, match.index));\n regex += match[0] === \"yyyy\" ? \"(\\\\d{4})\" : \"(\\\\d{2})\";\n lastIndex = DATETIME_TOKEN_REGEXP.lastIndex;\n }\n\n regex += escapeRegExp(pattern.slice(lastIndex));\n regex += \"$\";\n\n return new RegExp(regex);\n}\n\nfunction isValidCalendarDate(year: number, month: number, day: number): boolean {\n if (month < 1 || month > 12 || day < 1) {\n return false;\n }\n\n const date = new Date(year, month - 1, day);\n\n return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;\n}\n\nfunction isValidTime(hours: number, minutes: number, seconds: number): boolean {\n return hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59 && seconds >= 0 && seconds <= 59;\n}\n\nexport function formatDateTimeByPattern(date: Date, pattern: string): string {\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n\n return pattern.replace(DATETIME_TOKEN_REGEXP, (token) => {\n if (token === \"yyyy\") {\n return String(year).padStart(4, \"0\");\n }\n\n if (token === \"MM\") {\n return String(month).padStart(2, \"0\");\n }\n\n if (token === \"dd\") {\n return String(day).padStart(2, \"0\");\n }\n\n if (token === \"HH\") {\n return String(hours).padStart(2, \"0\");\n }\n\n if (token === \"mm\") {\n return String(minutes).padStart(2, \"0\");\n }\n\n return String(seconds).padStart(2, \"0\");\n });\n}\n\nexport function parseDateTimeByPattern(value: string, pattern: string): Date | undefined {\n const tokens = extractTokens(pattern);\n\n if (\n !tokens.includes(\"yyyy\") ||\n !tokens.includes(\"MM\") ||\n !tokens.includes(\"dd\") ||\n !tokens.includes(\"HH\") ||\n !tokens.includes(\"mm\")\n ) {\n return undefined;\n }\n\n const match = patternToRegExp(pattern).exec(value);\n\n if (!match) {\n return undefined;\n }\n\n let year: number | undefined;\n let month: number | undefined;\n let day: number | undefined;\n let hours: number | undefined;\n let minutes: number | undefined;\n let seconds = 0;\n\n tokens.forEach((token, index) => {\n const part = Number(match[index + 1]);\n\n if (token === \"yyyy\") {\n year = part;\n return;\n }\n\n if (token === \"MM\") {\n month = part;\n return;\n }\n\n if (token === \"dd\") {\n day = part;\n return;\n }\n\n if (token === \"HH\") {\n hours = part;\n return;\n }\n\n if (token === \"mm\") {\n minutes = part;\n return;\n }\n\n seconds = part;\n });\n\n if (year === undefined || month === undefined || day === undefined || hours === undefined || minutes === undefined) {\n return undefined;\n }\n\n if (!isValidCalendarDate(year, month, day) || !isValidTime(hours, minutes, seconds)) {\n return undefined;\n }\n\n return new Date(year, month - 1, day, hours, minutes, seconds);\n}\n\nexport function isDateTimePatternMatch(value: string, pattern: string): boolean {\n return parseDateTimeByPattern(value, pattern) !== undefined;\n}\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useRifm } from \"rifm\";\nimport { getCurrentFormatDate, maskedDateFormatter } from \"../datePicker/utils\";\nimport { formatDateTimeByPattern, isDateTimePatternMatch, parseDateTimeByPattern } from \"./dateTimeFormat\";\nimport { DateTimePickerProps } from \"./dateTimePicker\";\n\nexport type UseDateTimeInputProps = Pick<DateTimePickerProps, \"value\" | \"onChange\" | \"onBlur\"> & {\n format?: string;\n};\n\ninterface UseDateTimeInputReturn {\n value: string;\n onChange: React.ChangeEventHandler;\n onBlur: React.ChangeEventHandler;\n placeholder: string;\n}\n\nconst MASK_TOKEN_REGEXP = /[a-zA-Z]/g;\n\nfunction getDisplayDateTime(date: unknown, format?: string) {\n if (!date || Object.prototype.toString.call(date) !== \"[object Date]\" || isNaN(date as number)) {\n return \"\";\n }\n\n if (format) {\n return formatDateTimeByPattern(date as Date, format);\n }\n\n return new Intl.DateTimeFormat(undefined, {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n }).format(date as Date);\n}\n\nfunction getCurrentDateTimeFormat(format?: string): string {\n if (format) {\n return format;\n }\n\n return `${getCurrentFormatDate()} HH:mm`;\n}\n\nfunction getDateTimeMaskFormat(format?: string) {\n return getCurrentDateTimeFormat(format).replace(MASK_TOKEN_REGEXP, \"_\");\n}\n\nfunction getDateTimeByFormat(value: string, format: string) {\n const parsed = parseDateTimeByPattern(value, format);\n\n if (!parsed) {\n return new Date(Number.NaN);\n }\n\n return parsed;\n}\n\nexport function useDateTimeInput({\n value: valueProp,\n onChange: onChangeProp,\n onBlur: onBlurProp,\n format,\n}: UseDateTimeInputProps): UseDateTimeInputReturn {\n const currentFormat = useMemo(() => getCurrentDateTimeFormat(format), [format]);\n const [displayedValue, setDisplayedValue] = useState(getDisplayDateTime(valueProp, format));\n const maskFormat = useMemo(() => getDateTimeMaskFormat(format), [format]);\n const formatter = useMemo(() => maskedDateFormatter(maskFormat), [maskFormat]);\n const prevValue = useRef<UseDateTimeInputProps[\"value\"]>(undefined);\n\n React.useEffect(() => {\n const isValueChanged = valueProp !== prevValue.current;\n prevValue.current = valueProp;\n\n if (!isValueChanged) {\n return;\n }\n\n setDisplayedValue(getDisplayDateTime(valueProp, format));\n }, [valueProp, format]);\n\n const onChange = (value: string) => {\n setDisplayedValue(value);\n\n if (!onChangeProp) {\n return;\n }\n\n if (isDateTimePatternMatch(value, currentFormat)) {\n onChangeProp(undefined, getDateTimeByFormat(value, currentFormat));\n } else if (value === \"\") {\n onChangeProp(undefined);\n }\n };\n\n const onBlur = useCallback(() => {\n if (!onBlurProp) {\n return;\n }\n\n const prev = prevValue.current;\n\n if (prev instanceof Date && isDateTimePatternMatch(getDisplayDateTime(prev, format), currentFormat)) {\n onBlurProp(undefined, prev);\n } else if (typeof prev === \"string\" && isDateTimePatternMatch(prev, currentFormat)) {\n onBlurProp(undefined, getDateTimeByFormat(prev, currentFormat));\n } else if (prev === undefined || prev === \"\") {\n onBlurProp(undefined);\n }\n\n setDisplayedValue(getDisplayDateTime(valueProp, format));\n }, [onBlurProp, valueProp, format, currentFormat]);\n\n const rifmProps = useRifm({\n value: displayedValue,\n onChange,\n format: formatter,\n });\n\n return {\n ...rifmProps,\n onBlur,\n placeholder: getCurrentDateTimeFormat(format).toLowerCase(),\n };\n}\n\nexport { getDisplayDateTime, getCurrentDateTimeFormat };\n","import React from \"react\";\nimport { TextField } from \"../textField\";\nimport { DatePickerIconButton } from \"../datePicker/datePickerIconButton\";\nimport { useDateTimeInput } from \"./useDateTimeInput\";\nimport { DateTimePickerProps } from \"./dateTimePicker\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface DateTimePickerInputProps extends Omit<\n DateTimePickerProps,\n | \"locale\"\n | \"showDaysOutsideMonth\"\n | \"disablePast\"\n | \"disableFuture\"\n | \"weekStartsOn\"\n | \"placement\"\n | \"minDate\"\n | \"maxDate\"\n | \"isDateDisabled\"\n> {\n onToggle: () => void;\n}\n\nfunction stopPropagation(event: React.SyntheticEvent) {\n event.stopPropagation();\n}\n\nexport const DateTimePickerInput = React.forwardRef(function DateTimePickerInput(\n props: DateTimePickerInputProps,\n ref: React.Ref<HTMLInputElement>\n) {\n const { value, onChange, onBlur, onToggle, disabled, disableCalendar, calendarIcon, format, ...rest } = props;\n const maskedProps = useDateTimeInput({ value, onChange, onBlur, format });\n\n return (\n <TextField\n ref={ref}\n {...maskedProps}\n type=\"tel\"\n endAdornment={\n !disableCalendar && (\n <DatePickerIconButton\n edge=\"end\"\n onClick={onToggle}\n onMouseDown={stopPropagation}\n disabled={Boolean(disabled)}\n data-testid=\"date-time-picker-icon-button\"\n >\n {calendarIcon || <Icon name=\"event\" fill={1} weight={500} size={24} />}\n </DatePickerIconButton>\n )\n }\n disabled={Boolean(disabled)}\n {...rest}\n />\n );\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\ninterface Item {\n label: string;\n value: number;\n}\n\nexport interface TimePickerListProps {\n value: number;\n items: Item[];\n onChange: (value: number) => void;\n}\n\nexport function TimePickerList({ value: valueProp, items, onChange }: TimePickerListProps) {\n const overflowRef = React.useRef<HTMLDivElement>(null);\n const selectedItemRef = React.useRef<HTMLLIElement>(null);\n\n useSafeLayoutEffect(() => {\n if (overflowRef.current && selectedItemRef.current) {\n const middle = (overflowRef.current.offsetHeight - selectedItemRef.current.offsetHeight) / 2;\n\n overflowRef.current.scrollTop = selectedItemRef.current.offsetTop - middle;\n }\n });\n\n const onItemClick = React.useCallback(\n (value: number) => () => {\n onChange?.(value);\n },\n [onChange]\n );\n\n const setRef = React.useCallback(\n (value: number) => (element: HTMLLIElement) => {\n if (valueProp === value) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Мутабельный объект\n selectedItemRef.current = element;\n }\n },\n [valueProp]\n );\n\n return (\n <div className=\"smwb-time-picker__overflow\" ref={overflowRef} data-testid=\"time-picker-list\">\n <ul className=\"smwb-time-picker__list\">\n {items.map(({ label, value }) => {\n const isSelected = valueProp === value;\n\n return (\n <li\n key={value}\n ref={setRef(value)}\n className={cn(\"smwb-time-picker__item\", {\n \"smwb-time-picker__item--selected\": isSelected,\n })}\n onClick={onItemClick(value)}\n >\n {label}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","const TIME_TOKEN_REGEXP = /HH|mm|ss/g;\n\ntype TimeToken = \"HH\" | \"mm\" | \"ss\";\n\nfunction extractTokens(pattern: string): TimeToken[] {\n const tokens: TimeToken[] = [];\n let match: RegExpExecArray | null;\n\n TIME_TOKEN_REGEXP.lastIndex = 0;\n while ((match = TIME_TOKEN_REGEXP.exec(pattern)) !== null) {\n tokens.push(match[0] as TimeToken);\n }\n\n return tokens;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction patternToRegExp(pattern: string): RegExp {\n let regex = \"^\";\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n TIME_TOKEN_REGEXP.lastIndex = 0;\n while ((match = TIME_TOKEN_REGEXP.exec(pattern)) !== null) {\n regex += escapeRegExp(pattern.slice(lastIndex, match.index));\n regex += \"(\\\\d{2})\";\n lastIndex = TIME_TOKEN_REGEXP.lastIndex;\n }\n\n regex += escapeRegExp(pattern.slice(lastIndex));\n regex += \"$\";\n\n return new RegExp(regex);\n}\n\nfunction isValidTime(hours: number, minutes: number, seconds: number): boolean {\n return hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59 && seconds >= 0 && seconds <= 59;\n}\n\nexport function patternHasSeconds(pattern: string): boolean {\n return extractTokens(pattern).includes(\"ss\");\n}\n\nexport function formatTimeByPattern(date: Date, pattern: string): string {\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n\n return pattern.replace(TIME_TOKEN_REGEXP, (token) => {\n if (token === \"HH\") {\n return String(hours).padStart(2, \"0\");\n }\n\n if (token === \"mm\") {\n return String(minutes).padStart(2, \"0\");\n }\n\n return String(seconds).padStart(2, \"0\");\n });\n}\n\nexport function parseTimeByPattern(value: string, pattern: string): Date | undefined {\n const tokens = extractTokens(pattern);\n\n if (!tokens.includes(\"HH\") || !tokens.includes(\"mm\")) {\n return undefined;\n }\n\n const match = patternToRegExp(pattern).exec(value);\n\n if (!match) {\n return undefined;\n }\n\n let hours: number | undefined;\n let minutes: number | undefined;\n let seconds = 0;\n\n tokens.forEach((token, index) => {\n const part = Number(match[index + 1]);\n\n if (token === \"HH\") {\n hours = part;\n return;\n }\n\n if (token === \"mm\") {\n minutes = part;\n return;\n }\n\n seconds = part;\n });\n\n if (hours === undefined || minutes === undefined) {\n return undefined;\n }\n\n if (!isValidTime(hours, minutes, seconds)) {\n return undefined;\n }\n\n const now = new Date();\n\n return new Date(now.getFullYear(), now.getMonth(), now.getDate(), hours, minutes, seconds);\n}\n\nexport function isTimePatternMatch(value: string, pattern: string): boolean {\n return parseTimeByPattern(value, pattern) !== undefined;\n}\n","import { formatTimeByPattern, isTimePatternMatch, parseTimeByPattern } from \"./timeFormat\";\n\nconst MASK_DIGIT_REGEXP = /\\d/gi;\nconst MASK_TOKEN_REGEXP = /[a-zA-Z]/g;\n\nexport const DEFAULT_TIME_FORMAT = \"HH:mm\";\n\nexport function getHoursList() {\n return Array.from({ length: 24 }, (_, value) => ({\n value,\n label: String(value).padStart(2, \"0\"),\n }));\n}\n\nexport function getMinutesList() {\n return Array.from({ length: 60 }, (_, value) => ({\n value,\n label: String(value).padStart(2, \"0\"),\n }));\n}\n\nexport function getSecondsList() {\n return Array.from({ length: 60 }, (_, value) => ({\n value,\n label: String(value).padStart(2, \"0\"),\n }));\n}\n\nexport function setTime(date: Date, hours: number, minutes: number, seconds: number) {\n const next = new Date(date);\n\n next.setHours(hours, minutes, seconds, 0);\n\n return next;\n}\n\nexport function getDisplayTime(date: unknown, format?: string) {\n if (!isValidTimeDate(date)) {\n return \"\";\n }\n\n return formatTimeByPattern(date, format ?? DEFAULT_TIME_FORMAT);\n}\n\nexport function getCurrentTimeFormat(format?: string): string {\n return format ?? DEFAULT_TIME_FORMAT;\n}\n\nexport function getTimeMaskFormat(format?: string) {\n return getCurrentTimeFormat(format).replace(MASK_TOKEN_REGEXP, \"_\");\n}\n\nexport function maskedTimeFormatter(mask: string) {\n return (value: string) => {\n let outputCharIndex = 0;\n\n return value\n .split(\"\")\n .map((char, inputCharIndex) => {\n MASK_DIGIT_REGEXP.lastIndex = 0;\n\n if (outputCharIndex > mask.length - 1) {\n return \"\";\n }\n\n const maskChar = mask[outputCharIndex];\n const nextMaskChar = mask[outputCharIndex + 1];\n\n const acceptedChar = MASK_DIGIT_REGEXP.test(char) ? char : \"\";\n const formattedChar = maskChar === \"_\" ? acceptedChar : maskChar + acceptedChar;\n\n outputCharIndex += formattedChar.length;\n\n const isLastCharacter = inputCharIndex === value.length - 1;\n\n if (isLastCharacter && nextMaskChar && nextMaskChar !== \"_\") {\n return formattedChar ? formattedChar + nextMaskChar : \"\";\n }\n\n return formattedChar;\n })\n .join(\"\");\n };\n}\n\nexport function isTimeMatch(value: string, format: string) {\n return isTimePatternMatch(value, format);\n}\n\nexport function getTimeByFormat(value: string, format: string) {\n const parsed = parseTimeByPattern(value, format);\n\n if (!parsed) {\n return new Date(Number.NaN);\n }\n\n return parsed;\n}\n\nexport function isValidTimeDate(value: unknown): value is Date {\n return Object.prototype.toString.call(value) === \"[object Date]\" && !isNaN(value as number);\n}\n\nexport function mergeTime(baseDate: Date, timeDate: Date) {\n return new Date(\n baseDate.getFullYear(),\n baseDate.getMonth(),\n baseDate.getDate(),\n timeDate.getHours(),\n timeDate.getMinutes(),\n timeDate.getSeconds(),\n 0\n );\n}\n\nexport function mergeDate(date: Date, timeSource: Date) {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n timeSource.getHours(),\n timeSource.getMinutes(),\n timeSource.getSeconds(),\n 0\n );\n}\n","import React from \"react\";\nimport { TimePickerList } from \"./timePickerList\";\nimport { patternHasSeconds } from \"./timeFormat\";\nimport {\n DEFAULT_TIME_FORMAT,\n getHoursList,\n getMinutesList,\n getSecondsList,\n isValidTimeDate,\n setTime,\n} from \"./timeUtils\";\n\nexport interface TimePickerColumnsProps {\n value?: Date;\n format?: string;\n onChange: (value: Date) => void;\n onComplete?: () => void;\n}\n\nexport function TimePickerColumns({ value, format, onChange, onComplete }: TimePickerColumnsProps) {\n const current = React.useMemo(() => (isValidTimeDate(value) ? value : new Date()), [value]);\n const timeFormat = format ?? DEFAULT_TIME_FORMAT;\n const showSeconds = patternHasSeconds(timeFormat);\n const hours = React.useMemo(() => getHoursList(), []);\n const minutes = React.useMemo(() => getMinutesList(), []);\n const seconds = React.useMemo(() => getSecondsList(), []);\n\n const onHourChange = React.useCallback(\n (hour: number) => {\n onChange(setTime(current, hour, current.getMinutes(), current.getSeconds()));\n },\n [current, onChange]\n );\n\n const onMinuteChange = React.useCallback(\n (minute: number) => {\n onChange(setTime(current, current.getHours(), minute, current.getSeconds()));\n\n if (!showSeconds) {\n onComplete?.();\n }\n },\n [current, onChange, onComplete, showSeconds]\n );\n\n const onSecondChange = React.useCallback(\n (second: number) => {\n onChange(setTime(current, current.getHours(), current.getMinutes(), second));\n onComplete?.();\n },\n [current, onChange, onComplete]\n );\n\n return (\n <div className=\"smwb-time-picker__columns\" data-testid=\"time-picker-columns\">\n <div className=\"smwb-time-picker__column\">\n <TimePickerList value={current.getHours()} items={hours} onChange={onHourChange} />\n </div>\n <div className=\"smwb-time-picker__column\">\n <TimePickerList value={current.getMinutes()} items={minutes} onChange={onMinuteChange} />\n </div>\n {showSeconds && (\n <div className=\"smwb-time-picker__column\">\n <TimePickerList value={current.getSeconds()} items={seconds} onChange={onSecondChange} />\n </div>\n )}\n </div>\n );\n}\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { autoUpdate, useFloating } from \"@floating-ui/react\";\nimport Transition, { TransitionStatus } from \"react-transition-group/Transition\";\nimport { buildFloatingMiddleware, Placement, resolvePlacement } from \"../../../utils/floating\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { TextFieldProps } from \"../textField\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { DataPickerHeader } from \"../datePicker/dataPickerHeader\";\nimport { DataPickerDays } from \"../datePicker/dataPickerDays\";\nimport { DatePickerList } from \"../datePicker/datePickerList\";\nimport { getMonths, setMonth, getYears, setYear, isValidDate } from \"../datePicker/utils\";\nimport { OpenView } from \"../datePicker/datePicker\";\nimport { DateTimePickerInput } from \"./dateTimePickerInput\";\nimport { TimePickerColumns } from \"../timePicker/timePickerColumns\";\nimport { DEFAULT_TIME_FORMAT, isValidTimeDate, mergeDate, mergeTime } from \"../timePicker/timeUtils\";\nimport { createPortal } from \"react-dom\";\n\nconst defaultStyle = (duration: number) => ({\n transition: `opacity ${duration}ms ease-in-out`,\n opacity: 0,\n});\n\nconst transitionStyles = {\n entering: { opacity: 1 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n} as Record<TransitionStatus, { opacity: number }>;\n\nexport interface DateTimePickerProps extends Omit<TextFieldProps, \"onBlur\" | \"onChange\" | \"value\" | \"defaultValue\"> {\n showDaysOutsideMonth?: boolean;\n disablePast?: boolean;\n disableFuture?: boolean;\n minDate?: Date;\n maxDate?: Date;\n isDateDisabled?: (day: Date) => boolean;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n locale?: string;\n /** Input format with tokens dd, MM, yyyy, HH, mm, ss, e.g. \"dd/MM/yyyy HH:mm\". */\n format?: string;\n /** Time portion format when using the clock columns. Defaults to \"HH:mm\". */\n timeFormat?: string;\n placement?: Placement;\n disableCalendar?: boolean;\n label?: string;\n calendarAriaLabel?: string;\n autoComplete?: string;\n value?: Date | string;\n calendarIcon?: React.ReactNode;\n onChange?: (event?: React.ChangeEvent<HTMLInputElement>, value?: Date, data?: DateTimePickerProps) => void;\n onBlur?: (event?: React.FocusEvent<HTMLInputElement>, value?: Date, data?: DateTimePickerProps) => void;\n}\n\nexport const DateTimePicker = React.forwardRef(function DateTimePicker(props: DateTimePickerProps, ref) {\n const {\n value: valueProp,\n onChange: onChangeProp,\n showDaysOutsideMonth,\n disablePast,\n disableFuture,\n weekStartsOn = 1,\n placement = \"bottom-start\",\n disabled,\n disableCalendar,\n calendarAriaLabel = \"Choose date and time\",\n minDate,\n maxDate,\n isDateDisabled,\n locale,\n format,\n timeFormat,\n calendarIcon,\n onBlur: onBlurProp,\n ...rest\n } = props;\n const value = useMemo(() => (valueProp === undefined ? undefined : new Date(valueProp)), [valueProp]);\n const [viewValue, setViewValue] = useState<Date>(() =>\n isValidDate(value) || isValidTimeDate(value) ? value : new Date()\n );\n const [openView, setOpenView] = useState<OpenView>(OpenView.days);\n const [isOpen, setIsOpen] = useState(false);\n\n const anchorRef = useRef<HTMLDivElement | null>(null);\n const popupRef = useRef<HTMLDivElement | null>(null);\n\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: buildFloatingMiddleware(resolved),\n });\n\n const anchorForkRef = useForkRef(anchorRef, refs.setReference, ref);\n const popupForkRef = useForkRef(popupRef, refs.setFloating);\n\n useSafeLayoutEffect(() => {\n if (disabled) {\n return;\n }\n\n setViewValue(isValidDate(value) || isValidTimeDate(value) ? value : new Date());\n }, [value, disabled]);\n\n const onViewValueChange = useCallback((next: Date) => {\n setViewValue(next);\n }, []);\n\n const onMonthLabelClick = useCallback(() => {\n setOpenView(openView === OpenView.months ? OpenView.days : OpenView.months);\n }, [openView]);\n\n const onYearLabelClick = useCallback(() => {\n setOpenView(openView === OpenView.years ? OpenView.days : OpenView.years);\n }, [openView]);\n\n const onMonthChange = useCallback(\n (month: number) => {\n setViewValue(setMonth(viewValue, month));\n setOpenView(OpenView.days);\n },\n [viewValue]\n );\n\n const onYearChange = useCallback(\n (year: number) => {\n setViewValue(setYear(viewValue, year));\n setOpenView(OpenView.days);\n },\n [viewValue]\n );\n\n const emitChange = useCallback(\n (next: Date) => {\n setViewValue(next);\n onChangeProp?.(undefined, next, props);\n },\n [onChangeProp, props]\n );\n\n const onDateChange = useCallback(\n (_event?: React.ChangeEvent<HTMLInputElement>, date?: Date) => {\n if (!date) {\n return;\n }\n\n const timeSource = isValidTimeDate(value) ? value : viewValue;\n emitChange(mergeDate(date, timeSource));\n },\n [emitChange, value, viewValue]\n );\n\n const onTimeChange = useCallback(\n (timeDate: Date) => {\n const dateSource = isValidDate(value) ? value : viewValue;\n emitChange(mergeTime(dateSource, timeDate));\n },\n [emitChange, value, viewValue]\n );\n\n const onToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prevState) => !prevState);\n }\n }, [disabled]);\n\n const onClickAway = useCallback((event: Event | React.SyntheticEvent) => {\n const target = event.target as HTMLElement;\n\n if (popupRef.current?.contains(target) || anchorRef.current?.contains(target)) {\n return;\n }\n\n setIsOpen(false);\n }, []);\n\n const resolvedTimeFormat = useMemo(() => {\n if (timeFormat) {\n return timeFormat;\n }\n\n if (format?.includes(\"HH:mm:ss\")) {\n return \"HH:mm:ss\";\n }\n\n return DEFAULT_TIME_FORMAT;\n }, [format, timeFormat]);\n\n const months = useMemo(() => getMonths(locale), [locale]);\n const years = useMemo(() => getYears(new Date().getFullYear(), 100), []);\n\n let view: React.ReactNode = null;\n\n switch (openView) {\n case OpenView.days:\n view = (\n <DataPickerDays\n viewValue={viewValue}\n value={value}\n showDaysOutsideMonth={showDaysOutsideMonth}\n onChange={onDateChange}\n disablePast={disablePast}\n disableFuture={disableFuture}\n weekStartsOn={weekStartsOn}\n minDate={minDate}\n maxDate={maxDate}\n isDateDisabled={isDateDisabled}\n locale={locale}\n />\n );\n break;\n case OpenView.months:\n view = <DatePickerList value={viewValue.getMonth()} items={months} onChange={onMonthChange} />;\n break;\n case OpenView.years:\n view = <DatePickerList value={viewValue.getFullYear()} items={years} onChange={onYearChange} />;\n break;\n }\n\n return (\n <>\n <DateTimePickerInput\n ref={anchorForkRef}\n value={value}\n onChange={onChangeProp}\n onBlur={onBlurProp}\n onToggle={onToggle}\n disabled={disabled}\n disableCalendar={disableCalendar}\n format={format}\n calendarIcon={calendarIcon}\n {...rest}\n />\n {createPortal(\n <Transition\n nodeRef={popupRef}\n in={isOpen && !disabled && !disableCalendar}\n timeout={150}\n mountOnEnter\n unmountOnExit\n >\n {(state) => (\n <ClickAwayListener onClickAway={onClickAway}>\n <div\n ref={popupForkRef}\n className=\"smwb-date-picker smwb-date-time-picker\"\n style={{\n ...floatingStyles,\n ...defaultStyle(150),\n ...transitionStyles[state],\n }}\n data-testid=\"date-time-picker\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={calendarAriaLabel}\n >\n <div className=\"smwb-date-picker__inner smwb-date-time-picker__inner\">\n <DataPickerHeader\n viewValue={viewValue}\n locale={locale}\n openView={openView}\n onChange={onViewValueChange}\n onMonthLabelClick={onMonthLabelClick}\n onYearLabelClick={onYearLabelClick}\n />\n <div className=\"smwb-date-time-picker__content\">\n <div className=\"smwb-date-picker__body smwb-date-time-picker__body\">{view}</div>\n <TimePickerColumns value={viewValue} format={resolvedTimeFormat} onChange={onTimeChange} />\n </div>\n </div>\n </div>\n </ClickAwayListener>\n )}\n </Transition>,\n document.body\n )}\n </>\n );\n});\n\nexport default DateTimePicker;\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useRifm } from \"rifm\";\nimport {\n getTimeByFormat,\n getDisplayTime,\n getTimeMaskFormat,\n getCurrentTimeFormat,\n maskedTimeFormatter,\n isTimeMatch,\n} from \"./timeUtils\";\nimport { TimePickerProps } from \"./timePicker\";\n\nexport type UseTimeInputProps = Pick<TimePickerProps, \"value\" | \"onChange\" | \"onBlur\"> & {\n format?: string;\n};\n\ninterface UseTimeInputReturn {\n value: string;\n onChange: React.ChangeEventHandler;\n onBlur: React.ChangeEventHandler;\n placeholder: string;\n}\n\nconst defaultFormatTime = getCurrentTimeFormat();\n\nexport function useTimeInput({\n value: valueProp,\n onChange: onChangeProp,\n onBlur: onBlurProp,\n format,\n}: UseTimeInputProps): UseTimeInputReturn {\n const currentFormatTime = useMemo(() => getCurrentTimeFormat(format), [format]);\n const [displayedValue, setDisplayedValue] = useState(getDisplayTime(valueProp, format));\n const maskFormat = useMemo(() => getTimeMaskFormat(format), [format]);\n const formatter = useMemo(() => maskedTimeFormatter(maskFormat), [maskFormat]);\n const prevValue = useRef<UseTimeInputProps[\"value\"]>(undefined);\n\n React.useEffect(() => {\n const isValueChanged = valueProp !== prevValue.current;\n prevValue.current = valueProp;\n\n if (!isValueChanged) {\n return;\n }\n\n setDisplayedValue(getDisplayTime(valueProp, format));\n }, [valueProp, format]);\n\n const onChange = (value: string) => {\n setDisplayedValue(value);\n\n if (!onChangeProp) {\n return;\n }\n\n if (isTimeMatch(value, currentFormatTime)) {\n onChangeProp(undefined, getTimeByFormat(value, currentFormatTime));\n } else if (value === \"\") {\n onChangeProp(undefined);\n }\n };\n\n const onBlur = useCallback(() => {\n if (!onBlurProp) {\n return;\n }\n\n const prev = prevValue.current;\n\n if (prev instanceof Date && isTimeMatch(getDisplayTime(prev, format), currentFormatTime)) {\n onBlurProp(undefined, prev);\n } else if (typeof prev === \"string\" && isTimeMatch(prev, currentFormatTime)) {\n onBlurProp(undefined, getTimeByFormat(prev, currentFormatTime));\n } else if (prev === undefined || prev === \"\") {\n onBlurProp(undefined);\n }\n\n setDisplayedValue(getDisplayTime(valueProp, format));\n }, [onBlurProp, valueProp, format, currentFormatTime]);\n\n const rifmProps = useRifm({\n value: displayedValue,\n onChange,\n format: formatter,\n });\n\n return {\n ...rifmProps,\n onBlur,\n placeholder: (format ?? defaultFormatTime).toLowerCase(),\n };\n}\n","import React from \"react\";\nimport { TextField } from \"../textField\";\nimport { DatePickerIconButton } from \"../datePicker/datePickerIconButton\";\nimport { useTimeInput } from \"./useTimeInput\";\nimport { TimePickerProps } from \"./timePicker\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface TimePickerInputProps extends Omit<\n TimePickerProps,\n \"placement\" | \"disablePast\" | \"disableFuture\" | \"weekStartsOn\" | \"locale\" | \"showDaysOutsideMonth\"\n> {\n onToggle: () => void;\n}\n\nfunction stopPropagation(event: React.SyntheticEvent) {\n event.stopPropagation();\n}\n\nexport const TimePickerInput = React.forwardRef(function TimePickerInput(\n props: TimePickerInputProps,\n ref: React.Ref<HTMLInputElement>\n) {\n const { value, onChange, onBlur, onToggle, disabled, disableClock, clockIcon, format, ...rest } = props;\n const maskedProps = useTimeInput({ value, onChange, onBlur, format });\n\n return (\n <TextField\n ref={ref}\n {...maskedProps}\n type=\"tel\"\n endAdornment={\n !disableClock && (\n <DatePickerIconButton\n edge=\"end\"\n onClick={onToggle}\n onMouseDown={stopPropagation}\n disabled={Boolean(disabled)}\n data-testid=\"time-picker-icon-button\"\n >\n {clockIcon || <Icon name=\"schedule\" fill={1} weight={500} size={24} />}\n </DatePickerIconButton>\n )\n }\n disabled={Boolean(disabled)}\n {...rest}\n />\n );\n});\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { autoUpdate, useFloating } from \"@floating-ui/react\";\nimport Transition, { TransitionStatus } from \"react-transition-group/Transition\";\nimport { buildFloatingMiddleware, Placement, resolvePlacement } from \"../../../utils/floating\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { TextFieldProps } from \"../textField\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { TimePickerInput } from \"./timePickerInput\";\nimport { TimePickerColumns } from \"./timePickerColumns\";\nimport { isValidTimeDate } from \"./timeUtils\";\nimport { createPortal } from \"react-dom\";\n\nconst defaultStyle = (duration: number) => ({\n transition: `opacity ${duration}ms ease-in-out`,\n opacity: 0,\n});\n\nconst transitionStyles = {\n entering: { opacity: 1 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n} as Record<TransitionStatus, { opacity: number }>;\n\nexport interface TimePickerProps extends Omit<TextFieldProps, \"onBlur\" | \"onChange\" | \"value\" | \"defaultValue\"> {\n /** Time format pattern with tokens HH, mm, ss, e.g. \"HH:mm\" or \"HH:mm:ss\". */\n format?: string;\n placement?: Placement;\n disableClock?: boolean;\n label?: string;\n clockAriaLabel?: string;\n autoComplete?: string;\n value?: Date | string;\n clockIcon?: React.ReactNode;\n onChange?: (event?: React.ChangeEvent<HTMLInputElement>, value?: Date, data?: TimePickerProps) => void;\n onBlur?: (event?: React.FocusEvent<HTMLInputElement>, value?: Date, data?: TimePickerProps) => void;\n}\n\nexport const TimePicker = React.forwardRef(function TimePicker(props: TimePickerProps, ref) {\n const {\n value: valueProp,\n onChange: onChangeProp,\n placement = \"bottom-start\",\n disabled,\n disableClock,\n clockAriaLabel = \"Choose time\",\n format,\n onBlur: onBlurProp,\n ...rest\n } = props;\n const value = useMemo(() => (valueProp === undefined ? undefined : new Date(valueProp)), [valueProp]);\n const [viewValue, setViewValue] = useState<Date>(() => (isValidTimeDate(value) ? value : new Date()));\n const [isOpen, setIsOpen] = useState(false);\n\n const anchorRef = useRef<HTMLDivElement | null>(null);\n const clockRef = useRef<HTMLDivElement | null>(null);\n\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: buildFloatingMiddleware(resolved),\n });\n\n const anchorForkRef = useForkRef(anchorRef, refs.setReference, ref);\n const clockForkRef = useForkRef(clockRef, refs.setFloating);\n\n useSafeLayoutEffect(() => {\n if (disabled) {\n return;\n }\n\n setViewValue(isValidTimeDate(value) ? value : new Date());\n }, [value, disabled]);\n\n const onToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prevState) => !prevState);\n }\n }, [disabled]);\n\n const onClickAway = useCallback((event: Event | React.SyntheticEvent) => {\n const target = event.target as HTMLElement;\n\n if (clockRef.current?.contains(target) || anchorRef.current?.contains(target)) {\n return;\n }\n\n setIsOpen(false);\n }, []);\n\n const onTimeChange = useCallback(\n (next: Date) => {\n setViewValue(next);\n onChangeProp?.(undefined, next, props);\n },\n [onChangeProp, props]\n );\n\n const onComplete = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n return (\n <>\n <TimePickerInput\n ref={anchorForkRef}\n value={value}\n onChange={onChangeProp}\n onBlur={onBlurProp}\n onToggle={onToggle}\n disabled={disabled}\n disableClock={disableClock}\n format={format}\n {...rest}\n />\n {createPortal(\n <Transition\n nodeRef={clockRef}\n in={isOpen && !disabled && !disableClock}\n timeout={150}\n mountOnEnter\n unmountOnExit\n >\n {(state) => (\n <ClickAwayListener onClickAway={onClickAway}>\n <div\n ref={clockForkRef}\n className=\"smwb-date-picker smwb-time-picker\"\n style={{\n ...floatingStyles,\n ...defaultStyle(150),\n ...transitionStyles[state],\n }}\n data-testid=\"time-picker\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={clockAriaLabel}\n >\n <div className=\"smwb-date-picker__inner\">\n <TimePickerColumns\n value={viewValue}\n format={format}\n onChange={onTimeChange}\n onComplete={onComplete}\n />\n </div>\n </div>\n </ClickAwayListener>\n )}\n </Transition>,\n document.body\n )}\n </>\n );\n});\n\nexport default TimePicker;\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useId } from \"../../../hooks/useId\";\nimport type { SelectionControlColor, SelectionControlSize } from \"../checkbox/checkbox\";\n\nexport interface RadioButtonProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n label?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n checked?: boolean;\n size?: SelectionControlSize;\n color?: SelectionControlColor;\n helperText?: React.ReactNode;\n error?: boolean;\n /** Unified handler: `(event, value, data)` where `value` is the radio's value (or checked state). */\n onChange?: (\n event: React.ChangeEvent<HTMLInputElement>,\n value: string | number | readonly string[] | boolean | undefined,\n data: RadioButtonProps\n ) => void;\n}\n\nexport const RadioButton = React.forwardRef<HTMLInputElement, RadioButtonProps>(function RadioButton(props, ref) {\n const {\n label,\n disabled,\n readOnly,\n required,\n name,\n id: idProp,\n size = \"medium\",\n color = \"primary\",\n helperText,\n error,\n onChange,\n className,\n ...args\n } = props;\n const id = useId(idProp);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) {\n e.preventDefault();\n return;\n }\n onChange?.(e, props.value !== undefined ? props.value : e.target.checked, props);\n };\n\n return (\n <TextFieldWrapper helperText={helperText} disabled={disabled} error={error} className=\"smwb-text-field-checkbox\">\n <label\n htmlFor={id}\n className={cn(\"smwb-radio\", `smwb-radio_size-${size}`, `smwb-radio_color-${color}`, {\n \"smwb-disabled\": disabled,\n \"smwb-readonly\": readOnly,\n })}\n >\n <span className=\"smwb-radio__wrapper\">\n <input\n id={id}\n name={name}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n className={cn(\"smwb-radio__input\", className)}\n type=\"radio\"\n data-testid=\"radio\"\n ref={ref}\n {...args}\n onChange={handleChange}\n />\n <span className={cn(\"smwb-radio__btn\", { \"smwb-disabled\": disabled })} />\n <span className={cn(\"smwb-radio__bg\", { \"smwb-disabled\": disabled })} />\n </span>\n {label && <span className=\"smwb-radio__label\">{label}</span>}\n </label>\n </TextFieldWrapper>\n );\n});\n\nexport default RadioButton;\n","import { forwardRef, KeyboardEvent, MouseEvent, ReactNode, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type RatingColor = \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface RatingProps {\n className?: string;\n /** Controlled value. */\n value?: number;\n /** Uncontrolled initial value. */\n defaultValue?: number;\n /** Number of icons. */\n max?: number;\n /** Smallest selectable increment: 1 (whole) or 0.5 (half). */\n precision?: 1 | 0.5;\n readOnly?: boolean;\n disabled?: boolean;\n size?: number;\n /** Filled icon (Material Symbols name). */\n icon?: ReactNode;\n /** Empty icon (Material Symbols name). */\n emptyIcon?: ReactNode;\n name?: string;\n /** Color of the filled icons. */\n color?: RatingColor;\n /** Renders the control in an error state. */\n error?: boolean;\n /** Supporting text shown below the control. */\n helperText?: ReactNode;\n id?: string;\n onChange?: (value: number) => void;\n}\n\nexport const Rating = forwardRef<HTMLSpanElement, RatingProps>(function Rating(\n {\n className,\n value,\n defaultValue = 0,\n max = 5,\n precision = 1,\n readOnly = false,\n disabled = false,\n size = 28,\n icon,\n emptyIcon,\n name,\n color = \"primary\",\n error,\n helperText,\n id,\n onChange,\n },\n ref\n) {\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState(defaultValue);\n const [hover, setHover] = useState<number | null>(null);\n\n const current = value !== undefined ? value : internal;\n const display = hover ?? current;\n\n const interactive = !readOnly && !disabled;\n\n const valueFromEvent = (event: MouseEvent<HTMLSpanElement>, starIndex: number): number => {\n if (precision === 1) {\n return starIndex + 1;\n }\n const { left, width } = event.currentTarget.getBoundingClientRect();\n const isLeftHalf = event.clientX - left < width / 2;\n return starIndex + (isLeftHalf ? 0.5 : 1);\n };\n\n const handleSelect = (event: MouseEvent<HTMLSpanElement>, starIndex: number) => {\n if (!interactive) {\n return;\n }\n const next = valueFromEvent(event, starIndex);\n if (!isControlled) {\n setInternal(next);\n }\n onChange?.(next);\n };\n\n const filledIcon = icon ?? <Icon name=\"star\" fill={1} size={size} />;\n const blankIcon = emptyIcon ?? <Icon name=\"star\" size={size} />;\n\n const commit = (next: number) => {\n const clamped = Math.max(0, Math.min(max, next));\n if (!isControlled) {\n setInternal(clamped);\n }\n onChange?.(clamped);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (!interactive) {\n return;\n }\n if (event.key === \"ArrowRight\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n commit(current + precision);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n commit(current - precision);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n commit(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n commit(max);\n }\n };\n\n return (\n <span\n ref={ref}\n id={id}\n className={cn(\n \"smwb-rating\",\n { \"smwb-rating_readonly\": readOnly, \"smwb-rating_disabled\": disabled, \"smwb-rating_error\": error },\n color !== \"primary\" && `smwb-rating_color-${color}`,\n className\n )}\n data-testid=\"rating\"\n role=\"img\"\n aria-label={`${current} of ${max}`}\n tabIndex={interactive ? 0 : undefined}\n onKeyDown={interactive ? handleKeyDown : undefined}\n >\n {Array.from({ length: max }, (_, index) => {\n const fillRatio = Math.max(0, Math.min(1, display - index));\n return (\n <span\n key={index}\n className=\"smwb-rating__item\"\n style={{ width: size, height: size, cursor: interactive ? \"pointer\" : \"default\" }}\n onClick={(event) => handleSelect(event, index)}\n onMouseMove={\n interactive && precision === 0.5\n ? (event) => setHover(valueFromEvent(event, index))\n : interactive\n ? () => setHover(index + 1)\n : undefined\n }\n onMouseLeave={interactive ? () => setHover(null) : undefined}\n >\n <span className=\"smwb-rating__icon smwb-rating__icon_empty\">{blankIcon}</span>\n <span className=\"smwb-rating__icon smwb-rating__icon_filled\" style={{ width: `${fillRatio * 100}%` }}>\n {filledIcon}\n </span>\n </span>\n );\n })}\n {name ? <input type=\"hidden\" name={name} value={current} readOnly /> : null}\n {helperText != null && helperText !== false ? (\n <span className={cn(\"smwb-rating__helper\", error && \"smwb-rating__helper_error\")}>{helperText}</span>\n ) : null}\n </span>\n );\n});\n\nexport default Rating;\n","import React, { useEffect } from \"react\";\nimport { useVirtualList } from \"../../../hooks/useVirtualList\";\nimport { Menu, MenuDivider, MenuItem, MenuItemProps } from \"../../navigation/menu\";\nimport { TextField } from \"../textField\";\nimport ProgressIndicator from \"../../feedBack/progressIndicator/progressIndicator\";\nimport { createPortal } from \"react-dom\";\nimport { MenuFloatingProps } from \"../../navigation/menu/menuFloating\";\n\nexport interface DropdownItem {\n key?: string | number;\n text: string;\n value: string | number | undefined | null;\n helperText?: string;\n /** Disables selection of this option. */\n disabled?: boolean;\n /** Optional group label; consecutive items sharing it get a group header. */\n group?: string;\n}\n\nexport interface DropdownItemProps<T extends HTMLElement = HTMLElement> {\n menuMaxHeight?: number;\n menuMiddleware?: MenuFloatingProps[\"middleware\"];\n menuNoItemsMessage?: React.ReactNode;\n search?: boolean;\n onSearchInputChange?: (event: React.ChangeEvent<HTMLInputElement>, value: string | number | undefined) => void;\n items: DropdownItem[];\n searchValue?: string | number;\n isOpen: boolean;\n onClose: () => void;\n anchorElementRef: React.RefObject<T>;\n value?: undefined | null | string | number | (undefined | null | string | number)[];\n onItemClick: (event: React.SyntheticEvent, item: DropdownItem) => void;\n isLoading?: boolean;\n optionRenderer?: (args: MenuItemProps) => React.ReactNode;\n container?: HTMLElement;\n /** Renders a trailing \"create\" affordance (used by `creatable` SelectField). */\n createOption?: { text: React.ReactNode; onCreate: (event: React.SyntheticEvent) => void };\n /** Windows the option list for large datasets (fixed row height). */\n virtualized?: boolean;\n /** Row height (px) used when `virtualized`. */\n itemHeight?: number;\n}\n\nexport function DropdownMenu<T extends HTMLElement>({\n menuMaxHeight,\n menuMiddleware,\n search,\n onSearchInputChange,\n items,\n searchValue,\n isOpen,\n onClose,\n anchorElementRef,\n value,\n onItemClick,\n isLoading,\n optionRenderer,\n menuNoItemsMessage,\n container = document.body,\n createOption,\n virtualized,\n itemHeight = 40,\n}: DropdownItemProps<T>) {\n const valueArray = Array.isArray(value) ? value : [value];\n const hasGroups = items.some((i) => !!i.group);\n let lastGroup: string | undefined;\n\n const useVirtual = !!virtualized && !hasGroups && !isLoading && items.length > 0;\n const viewportHeight = menuMaxHeight || 240;\n const { startIndex, endIndex, totalHeight, offsetY, onScroll } = useVirtualList({\n itemCount: useVirtual ? items.length : 0,\n itemHeight,\n viewportHeight,\n });\n\n const renderItem = (el: DropdownItem) => {\n const node: React.ReactNode[] = [];\n if (hasGroups && el.group !== lastGroup) {\n lastGroup = el.group;\n node.push(\n <li key={`group-${el.group ?? \"ungrouped\"}`} className=\"smwb-select-field__group-label\" role=\"presentation\">\n {el.group}\n </li>\n );\n }\n node.push(\n <MenuItem\n key={el.key || el.value}\n value={el.value}\n disabled={el.disabled}\n selected={!!valueArray.find((v) => v === el.value)}\n onClick={(e: React.SyntheticEvent) => {\n if (!el.disabled) {\n onItemClick(e, el);\n }\n }}\n optionRenderer={optionRenderer}\n >\n {el.text}\n {el.helperText ? <span className=\"smwb-select-field__option__helper-text\">{el.helperText}</span> : null}\n </MenuItem>\n );\n return node;\n };\n const [menuMinWidth, setMenuMinWidth] = React.useState<number>();\n\n useEffect(() => {\n if (isOpen && anchorElementRef.current) {\n setMenuMinWidth(anchorElementRef.current.clientWidth);\n }\n }, [anchorElementRef, isOpen]);\n\n React.useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (isOpen && event.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOpen, onClose]);\n\n return createPortal(\n <Menu\n isOpen={isOpen}\n onClose={onClose}\n anchorElement={anchorElementRef.current}\n middleware={menuMiddleware}\n style={{\n minWidth: menuMinWidth,\n maxHeight: menuMaxHeight || undefined,\n overflowY: menuMaxHeight ? \"auto\" : undefined,\n }}\n >\n {search && (\n <>\n <li className=\"smwb-select-field__menu-search\">\n <TextField\n className=\"smwb-select-field__menu-search-input\"\n type=\"text\"\n placeholder=\"Найти...\"\n value={searchValue}\n onChange={(e, data) => onSearchInputChange?.(e, data.value)}\n fullWidth\n />\n </li>\n <MenuDivider />\n </>\n )}\n {isLoading ? (\n <div className=\"smwb-select-field__menu-loading\">\n <ProgressIndicator type=\"indeterminate\" variant=\"circular\" className=\"smwb-select-field__menu__loader\" />\n </div>\n ) : useVirtual ? (\n <li role=\"presentation\" className=\"smwb-select-field__virtual-viewport\">\n <div\n className=\"smwb-select-field__virtual-scroller\"\n style={{ maxHeight: viewportHeight, overflowY: \"auto\" }}\n onScroll={onScroll}\n >\n <div style={{ height: totalHeight, position: \"relative\" }}>\n <ul\n role=\"presentation\"\n className=\"smwb-select-field__virtual-list\"\n style={{ transform: `translateY(${offsetY}px)`, listStyle: \"none\", margin: 0, padding: 0 }}\n >\n {items.slice(startIndex, endIndex).map((el) => renderItem(el))}\n </ul>\n </div>\n </div>\n </li>\n ) : items.length ? (\n items.map((el) => renderItem(el))\n ) : !createOption ? (\n <li className=\"smwb-select-field__empty-items\">{menuNoItemsMessage || \"Опций не найдено.\"}</li>\n ) : null}\n {createOption ? (\n <MenuItem\n key=\"__create__\"\n value=\"__create__\"\n onClick={(e: React.SyntheticEvent) => createOption.onCreate(e)}\n className=\"smwb-select-field__create-option\"\n >\n {createOption.text}\n </MenuItem>\n ) : null}\n </Menu>,\n container\n );\n}\n","import type { HTMLAttributes, SyntheticEvent } from \"react\";\nimport React, { useState, useRef, useEffect, useMemo, forwardRef } from \"react\";\nimport cn from \"clsx\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { DropdownMenu, DropdownItem, DropdownItemProps } from \"./dropdownMenu\";\nimport Chip from \"../../dataDisplay/chip/chip\";\nimport { TextFieldWrapper } from \"../textField\";\nimport Icon from \"../../base/icon/icon\";\nimport { MenuItemProps } from \"../../navigation/menu\";\n\nconst SelectArrowIcon = (props: HTMLAttributes<HTMLSpanElement>) => <Icon name=\"arrow_drop_down\" {...props} />;\n\nconst ClearIcon = (props: HTMLAttributes<HTMLSpanElement>) => <Icon name=\"close\" size={20} {...props} />;\n\nfunction stopEvent(event: React.SyntheticEvent) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nexport type OnSelectChange = (e: SyntheticEvent, data: SelectFieldProps) => void;\n\nexport interface SelectFieldProps {\n className?: string;\n value?: null | string | number | (string | number | undefined | null)[];\n defaultValue?: null | string | number | (string | number)[];\n onChange?: OnSelectChange;\n disabled?: boolean;\n readOnly?: boolean;\n name?: string;\n multiple?: boolean;\n menuMaxHeight?: number;\n menuMiddleware?: DropdownItemProps[\"menuMiddleware\"];\n menuNoItemsMessage?: React.ReactNode;\n menuContainer?: HTMLElement;\n search?: true | false | \"menu\";\n chips?: boolean;\n isFocused?: boolean;\n error?: boolean;\n items: DropdownItem[];\n label?: string;\n variant?: \"outlined\" | \"filled\";\n fullWidth?: boolean;\n helperText?: React.ReactNode;\n onSearch?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n isLoading?: boolean;\n resetSearch?: () => void;\n inline?: boolean;\n endAdornment?: React.ReactNode;\n hideSelectArrowIcon?: boolean;\n optionRenderer?: (args: MenuItemProps) => React.ReactNode;\n /** Shows a clear button to reset the selection. */\n clearable?: boolean;\n /** Allows creating a new option from the current search text. */\n creatable?: boolean;\n /** Invoked with the typed text when the user creates a new option. */\n onCreate?: (inputValue: string, event: React.SyntheticEvent) => void;\n /** Windows long option lists for performance (fixed row height). */\n virtualized?: boolean;\n /** Row height (px) used when `virtualized`. */\n itemHeight?: number;\n /** Accessible label for the combobox control. */\n \"aria-label\"?: string;\n id?: string;\n}\n\nexport const SelectField = forwardRef<HTMLSpanElement, SelectFieldProps>(function SelectField(props, ref) {\n const {\n className,\n value: valueProp,\n defaultValue,\n onChange,\n disabled,\n readOnly,\n name,\n multiple,\n menuMaxHeight,\n menuMiddleware,\n menuNoItemsMessage,\n menuContainer,\n search,\n chips,\n isFocused: isFocusedProp,\n error,\n items,\n label,\n variant = \"outlined\",\n fullWidth,\n helperText,\n onSearch,\n resetSearch,\n isLoading,\n inline,\n endAdornment,\n hideSelectArrowIcon,\n optionRenderer,\n clearable,\n creatable,\n onCreate,\n virtualized,\n itemHeight,\n \"aria-label\": ariaLabel,\n id,\n ...rest\n } = props;\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [valueState, setValueState] = useState<typeof valueProp>(defaultValue);\n const [selectedItems, setSelectedItems] = useState<typeof items>(() => {\n // Seed from the effective initial value so an uncontrolled `defaultValue`\n // shows its selection (and floats the label) before any interaction.\n const initialValue = valueProp != null ? valueProp : defaultValue;\n\n if (Array.isArray(initialValue)) {\n return items.filter((item) => initialValue.includes(item.value));\n }\n\n const item = initialValue == null ? undefined : items.find((i) => i.value === initialValue);\n\n return item ? [item] : [];\n });\n const [searchValue, setSearchValue] = useState(\"\");\n const { current: isControlled } = useRef(valueProp != null);\n const anchorElementRef = useRef<HTMLSpanElement>(null);\n const forkedAnchorRef = useForkRef<HTMLSpanElement>(ref, anchorElementRef);\n const searchWrapperRef = useRef<HTMLSpanElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const value = isControlled ? valueProp : valueState;\n\n const isFocused = useMemo(() => isFocusedProp || isOpen, [isFocusedProp, isOpen]);\n\n const onMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n // Только для левой клавиши мышки.\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n anchorElementRef.current?.focus();\n setIsOpen(!isOpen);\n };\n\n const onClose = () => {\n setIsOpen(false);\n anchorElementRef.current?.focus();\n };\n\n const onFocus = () => {\n if (search === true) {\n searchInputRef.current?.focus();\n }\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!readOnly) {\n const validKeys = [\" \", \"ArrowUp\", \"ArrowDown\", \"Enter\"];\n\n if (validKeys.includes(event.key)) {\n event.preventDefault();\n setIsOpen(!isOpen);\n }\n }\n };\n\n useEffect(() => {\n if (!isFocused || (search === \"menu\" && !isOpen)) {\n setSearchValue(\"\");\n resetSearch?.();\n }\n }, [isFocused, search, isOpen, resetSearch]);\n\n // Keep the displayed selection in sync with the effective value (controlled\n // `value` or uncontrolled `defaultValue`/internal state), so the label floats\n // whenever there is a value — including the initial default, without focus.\n useEffect(() => {\n if (Array.isArray(value)) {\n setSelectedItems(items.filter((item) => value.includes(item.value)));\n } else if (value == null || value === \"\") {\n setSelectedItems([]);\n } else {\n const item = items.find((item) => item.value === value);\n setSelectedItems(item ? [item] : []);\n }\n }, [value, items]);\n\n useSafeLayoutEffect(() => {\n if (searchWrapperRef.current) {\n searchWrapperRef.current.scrollLeft = searchWrapperRef.current.scrollWidth;\n }\n }, [value]);\n\n const updateValue = (event: React.SyntheticEvent, value: typeof valueProp) => {\n onChange?.(event, { ...props, value, name: name || undefined });\n setValueState(value);\n };\n\n const onItemClick = (event: React.SyntheticEvent, item: DropdownItem) => {\n let newValue: typeof valueProp;\n let newSelectedItem: typeof selectedItems;\n if (multiple) {\n const valueArray = Array.isArray(value) ? value : [value].filter(Boolean);\n newValue = valueArray.slice();\n newSelectedItem = selectedItems.slice();\n const itemIndex = valueArray.findIndex((el) => el === item.value);\n\n if (itemIndex === -1) {\n newValue.push(item.value);\n newSelectedItem.push(item);\n } else {\n newValue.splice(itemIndex, 1);\n newSelectedItem.splice(itemIndex, 1);\n }\n } else {\n newValue = value === item.value ? \"\" : item.value;\n newSelectedItem = [item];\n }\n\n if (searchValue) {\n setSearchValue(\"\");\n }\n\n if (!multiple) {\n setIsOpen(false);\n anchorElementRef.current?.focus();\n }\n setSelectedItems(newSelectedItem);\n updateValue(event, newValue);\n };\n\n const onSearchInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSearchValue(event.target.value);\n onSearch?.(event);\n if (!isOpen) {\n setIsOpen(true);\n }\n };\n\n const onDeleteChip = (currentValue: typeof valueProp) => (event: React.SyntheticEvent) => {\n if (Array.isArray(value)) {\n const newValue = value.filter((value) => currentValue !== value);\n updateValue(event, newValue);\n const newSelectedItems = selectedItems.filter((el) => el.value !== currentValue);\n setSelectedItems(newSelectedItems);\n }\n };\n\n const onResetSelected = (event: React.MouseEvent) => {\n updateValue(event, []);\n setSelectedItems([]);\n };\n\n let displayValues: string | React.ReactNode[];\n\n const classes = cn(\"smwb-select-field\", className, {\n \"smwb-select-field--filled\": variant === \"filled\" && label,\n \"smwb-select-field--disabled\": disabled,\n \"smwb-select-field--search\": search,\n \"smwb-select-field--inline\": inline,\n });\n\n if (chips) {\n displayValues = selectedItems.map(({ key, value, text }) => (\n <Chip key={key || value} label={text} onDelete={onDeleteChip(value)} onDeleteMouseDown={stopEvent} />\n ));\n } else {\n displayValues = selectedItems.map((el) => el.text).join(\", \");\n }\n\n return (\n <>\n <TextFieldWrapper\n label={label}\n helperText={helperText}\n variant={variant}\n disabled={disabled}\n className={className}\n error={error}\n fullWidth={fullWidth}\n isFilledState={!!selectedItems.length || !!searchValue}\n isFocused={isFocused}\n inline={inline}\n {...rest}\n >\n <span\n ref={forkedAnchorRef}\n id={id}\n className={classes}\n tabIndex={disabled ? undefined : 0}\n role=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-disabled={disabled || undefined}\n aria-label={ariaLabel}\n onMouseDown={disabled || readOnly ? undefined : onMouseDown}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n data-testid=\"select-field\"\n >\n <span className=\"smwb-select-field__search-wrapper\" ref={searchWrapperRef}>\n {displayValues && <span className=\"smwb-select-field__values\">{displayValues}</span>}\n {search && typeof search === \"boolean\" && !readOnly && (\n <span className=\"smwb-select-field__search\">\n <span className=\"smwb-select-field__search-text\">{searchValue}</span>\n <input\n className=\"smwb-select-field__search-input\"\n ref={searchInputRef}\n type=\"text\"\n value={searchValue}\n onChange={onSearchInputChange}\n onMouseDown={(event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation();\n setIsOpen(true);\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n data-testid=\"search-input\"\n />\n </span>\n )}\n </span>\n <span className=\"smwb-select-field__actions\">\n {((Array.isArray(value) && value.length > 0) || (clearable && selectedItems.length > 0)) && !disabled && (\n <ClearIcon\n onClick={onResetSelected}\n onMouseDown={stopEvent}\n className={cn(\"smwb-select-field__icon\", \"smwb-select-field__icon--close\")}\n aria-label=\"Clear selection\"\n role=\"button\"\n />\n )}\n {endAdornment}\n {!hideSelectArrowIcon && (\n <SelectArrowIcon\n className={cn(\"smwb-select-field__icon\", \"smwb-select-field__icon--arrow\", {\n \"smwb-select-field__icon--opened\": isOpen,\n \"smwb-select-field__icon--focused\": isFocused,\n \"smwb-select-field__icon--error\": error,\n })}\n />\n )}\n </span>\n </span>\n </TextFieldWrapper>\n <DropdownMenu\n anchorElementRef={anchorElementRef}\n menuMaxHeight={menuMaxHeight}\n menuMiddleware={menuMiddleware}\n search={search === \"menu\"}\n onSearchInputChange={onSearchInputChange}\n optionRenderer={optionRenderer}\n items={\n onSearch\n ? items\n : searchValue\n ? items.filter((el) => el.text.search(new RegExp(searchValue, \"i\")) !== -1)\n : items\n }\n searchValue={searchValue}\n isOpen={isOpen}\n onClose={onClose}\n onItemClick={onItemClick}\n value={value}\n isLoading={isLoading}\n menuNoItemsMessage={menuNoItemsMessage}\n container={menuContainer}\n virtualized={virtualized}\n itemHeight={itemHeight}\n createOption={\n creatable && searchValue && !items.some((i) => i.text.toLowerCase() === String(searchValue).toLowerCase())\n ? {\n text: `Создать \"${searchValue}\"`,\n onCreate: (event: React.SyntheticEvent) => {\n onCreate?.(String(searchValue), event);\n setSearchValue(\"\");\n setIsOpen(false);\n },\n }\n : undefined\n }\n />\n </>\n );\n});\n\nexport default SelectField;\n","import React from \"react\";\n\nexport function toPercent(value: number, min: number, max: number) {\n return ((value - min) / (max - min)) * 100;\n}\n\nexport function precision(number: number) {\n return (`${number}`.split(\".\")[1] || \"\").length;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(value, max));\n}\n\nexport function precisionRound(number: number, precision = 1) {\n const factor = Math.pow(10, precision);\n\n return Math.round(number * factor) / factor;\n}\n\nexport function decimatedClamp(val: number, min: number, max: number, step?: number) {\n if (step == null || step <= 0) {\n return clamp(val, min, max);\n }\n\n const prec = precision(step);\n // Round value to nearest min + k1 * step\n const decimatedOffset = precisionRound(Math.round((val - min) / step) * step, prec);\n // Round range length _down_ to nearest min + k2 * step\n const decimatedRange = precisionRound(Math.floor((max - min) / step) * step, prec);\n\n return min + clamp(decimatedOffset, 0, decimatedRange);\n}\n\nexport function rescale(value: number, from: [number, number], to: [number, number], options: { step?: number } = {}) {\n const scaled = ((value - from[0]) / (from[1] - from[0])) * (to[1] - to[0]) + to[0];\n\n return decimatedClamp(scaled, to[0], to[1], options.step);\n}\n\nexport function coordX(event: React.MouseEvent | React.TouchEvent): number {\n if (event instanceof MouseEvent) {\n return event.clientX;\n }\n if (event instanceof TouchEvent) {\n return event.changedTouches[0].clientX;\n }\n return 0;\n}\n\nexport function coordY(event: React.MouseEvent | React.TouchEvent): number {\n if (event instanceof MouseEvent) {\n return event.clientY;\n }\n if (event instanceof TouchEvent) {\n return event.changedTouches[0].clientY;\n }\n return 0;\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useEventCallback } from \"../../../hooks/useEventCallback\";\nimport { rescale, toPercent, coordX, coordY } from \"./utils\";\nimport { TextField, TextFieldWrapper } from \"../textField\";\n\nexport type SliderValue = number | [number, number];\n\nexport interface SliderMark {\n value: number;\n label?: React.ReactNode;\n}\n\nexport interface SliderProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"onChange\" | \"defaultValue\"> {\n value?: SliderValue;\n onChange?: (event: Event | React.SyntheticEvent, value: SliderValue, data: SliderProps) => void;\n min?: number;\n max?: number;\n step?: number;\n name?: string;\n defaultValue?: SliderValue;\n disabled?: boolean;\n variant?: \"continuous\" | \"discrete\";\n valueField?: boolean;\n withTicks?: boolean;\n label?: string;\n helperText?: React.ReactNode;\n error?: boolean;\n size?: \"small\" | \"medium\" | \"large\";\n color?: \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n /** Enables a two-thumb range slider (value becomes `[number, number]`). */\n range?: boolean;\n /** Slider direction. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Show ticks/marks. `true` derives marks from `step`; an array gives explicit positions/labels. */\n marks?: boolean | SliderMark[];\n /** Accessible label applied to the slider control. */\n \"aria-label\"?: string;\n /** Maps the numeric value to a human-readable string for assistive tech. */\n getAriaValueText?: (value: number) => string;\n}\n\nfunction resolveMarks(\n marks: boolean | SliderMark[] | undefined,\n min: number,\n max: number,\n step?: number\n): SliderMark[] {\n if (!marks) {\n return [];\n }\n if (Array.isArray(marks)) {\n return marks;\n }\n const s = step && step > 0 ? step : (max - min) / 10;\n const result: SliderMark[] = [];\n for (let v = min; v <= max + 1e-9; v += s) {\n result.push({ value: Math.round(v * 1e6) / 1e6 });\n }\n return result;\n}\n\nconst RangeSlider = React.forwardRef<HTMLSpanElement, SliderProps>(function RangeSlider(props, ref) {\n const {\n defaultValue,\n value: valueProp,\n onChange,\n min = 0,\n max = 100,\n name,\n disabled = false,\n className,\n step,\n label,\n helperText,\n error,\n size = \"medium\",\n color = \"primary\",\n orientation = \"horizontal\",\n marks,\n getAriaValueText,\n \"aria-label\": ariaLabel,\n // consumed by the dispatcher / not valid DOM attributes — keep them off the span\n /* eslint-disable @typescript-eslint/no-unused-vars */\n range,\n variant,\n valueField,\n withTicks,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...rest\n } = props;\n\n const isVertical = orientation === \"vertical\";\n const normalize = (v: SliderValue | undefined): [number, number] => {\n const arr = Array.isArray(v) ? v : [min, max];\n const lo = Math.min(arr[0] ?? min, arr[1] ?? max);\n const hi = Math.max(arr[0] ?? min, arr[1] ?? max);\n return [lo, hi];\n };\n\n const isControlled = valueProp !== undefined;\n const [valueState, setValueState] = React.useState<[number, number]>(() => normalize(defaultValue));\n const value = isControlled ? normalize(valueProp) : valueState;\n\n const containerRef = React.useRef<HTMLSpanElement>(null);\n const rootRef = useForkRef<HTMLSpanElement>(ref, containerRef);\n const activeThumb = React.useRef<0 | 1>(0);\n const isPressedRef = React.useRef<boolean>(false);\n\n const markList = resolveMarks(marks, min, max, step);\n\n const positionToValue = (event: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) {\n return min;\n }\n if (isVertical) {\n const y =\n (typeof (event as MouseEvent).clientY === \"number\"\n ? (event as MouseEvent).clientY\n : coordY(event as React.MouseEvent)) - rect.top;\n return rescale(rect.height - y, [0, rect.height], [min, max], { step });\n }\n const x =\n (typeof (event as MouseEvent).clientX === \"number\"\n ? (event as MouseEvent).clientX\n : coordX(event as React.MouseEvent)) - rect.left;\n return rescale(x, [0, rect.width], [min, max], { step });\n };\n\n const commit = (next: [number, number], event: Event | React.SyntheticEvent) => {\n const lo = Math.min(next[0], next[1]);\n const hi = Math.max(next[0], next[1]);\n const clamped: [number, number] = [Math.max(min, lo), Math.min(max, hi)];\n if (!isControlled) {\n setValueState(clamped);\n }\n onChange?.(event, clamped, props);\n };\n\n const moveThumb = (raw: number, event: Event | React.SyntheticEvent) => {\n const idx = activeThumb.current;\n const next: [number, number] = [value[0], value[1]];\n next[idx] = Math.max(min, Math.min(max, raw));\n commit(next, event);\n };\n\n const pickThumb = (raw: number) => {\n activeThumb.current = Math.abs(raw - value[0]) <= Math.abs(raw - value[1]) ? 0 : 1;\n };\n\n const onMouseMove = useEventCallback((event: MouseEvent | TouchEvent) => {\n if (!isPressedRef.current) {\n return;\n }\n event.preventDefault();\n moveThumb(positionToValue(event), event);\n });\n\n const onMouseEnd = useEventCallback(() => {\n isPressedRef.current = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseEnd);\n document.removeEventListener(\"touchmove\", onMouseMove);\n document.removeEventListener(\"touchend\", onMouseEnd);\n });\n\n const onMouseDown = (event: React.MouseEvent<HTMLSpanElement>) => {\n if (disabled || event.button !== 0) {\n return;\n }\n const raw = positionToValue(event);\n pickThumb(raw);\n isPressedRef.current = true;\n moveThumb(raw, event);\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseEnd);\n };\n\n const onTouchStartNative = (event: TouchEvent) => {\n if (disabled) {\n return;\n }\n const raw = positionToValue(event);\n pickThumb(raw);\n isPressedRef.current = true;\n moveThumb(raw, event);\n document.addEventListener(\"touchmove\", onMouseMove);\n document.addEventListener(\"touchend\", onMouseEnd);\n };\n\n useSafeLayoutEffect(() => {\n const el = containerRef.current;\n if (!el) {\n return;\n }\n el.addEventListener(\"touchstart\", onTouchStartNative);\n return () => el.removeEventListener(\"touchstart\", onTouchStartNative);\n });\n\n const onThumbKeyDown = (idx: 0 | 1) => (event: React.KeyboardEvent) => {\n if (disabled) {\n return;\n }\n const delta = step && step > 0 ? step : 1;\n let next: number | null = null;\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowDown\") {\n next = value[idx] - delta;\n } else if (event.key === \"ArrowRight\" || event.key === \"ArrowUp\") {\n next = value[idx] + delta;\n } else if (event.key === \"Home\") {\n next = min;\n } else if (event.key === \"End\") {\n next = max;\n }\n if (next !== null) {\n event.preventDefault();\n activeThumb.current = idx;\n moveThumb(next, event);\n }\n };\n\n const classNames = cn(\n \"smwb-slider\",\n \"smwb-slider--range\",\n className,\n {\n \"smwb-slider--disabled\": disabled,\n \"smwb-slider--vertical\": isVertical,\n },\n size !== \"medium\" && `smwb-slider_size-${size}`,\n color !== \"primary\" && `smwb-slider_color-${color}`\n );\n\n const p0 = toPercent(value[0], min, max);\n const p1 = toPercent(value[1], min, max);\n const startPct = `${Math.min(p0, p1)}%`;\n const spanPct = `${Math.abs(p1 - p0)}%`;\n const mainStart = isVertical ? { bottom: `${p0}%` } : { left: `${p0}%` };\n const mainEnd = isVertical ? { bottom: `${p1}%` } : { left: `${p1}%` };\n const trackStyle = isVertical ? { bottom: startPct, height: spanPct } : { left: startPct, width: spanPct };\n\n return (\n <TextFieldWrapper label={label} helperText={helperText} disabled={disabled} error={error} fullWidth shrink>\n <div className=\"smwb-slider__container\">\n <span ref={rootRef} onMouseDown={onMouseDown} className={classNames} {...rest}>\n {markList.length > 0 && (\n <span className=\"smwb-slider__marks\" aria-hidden=\"true\">\n {markList.map((m) => {\n const mp = `${toPercent(m.value, min, max)}%`;\n return (\n <span key={m.value} className=\"smwb-slider__mark\" style={isVertical ? { bottom: mp } : { left: mp }}>\n {m.label != null && <span className=\"smwb-slider__mark-label\">{m.label}</span>}\n </span>\n );\n })}\n </span>\n )}\n <span className=\"smwb-slider__rail\" />\n <span className=\"smwb-slider__track\" style={trackStyle} />\n {([0, 1] as const).map((idx) => (\n <span\n key={idx}\n className={cn(\"smwb-slider__thumb\", `smwb-slider__thumb--${idx === 0 ? \"start\" : \"end\"}`)}\n style={idx === 0 ? mainStart : mainEnd}\n >\n <input\n data-testid={`slider-input-${idx}`}\n className=\"smwb-slider__input\"\n type=\"range\"\n min={min}\n max={max}\n step={step}\n name={name ? `${name}[${idx}]` : undefined}\n value={value[idx]}\n disabled={disabled}\n onChange={() => undefined}\n onKeyDown={onThumbKeyDown(idx)}\n tabIndex={disabled ? -1 : 0}\n aria-label={ariaLabel ? `${ariaLabel} ${idx === 0 ? \"minimum\" : \"maximum\"}` : undefined}\n aria-orientation={orientation}\n aria-valuenow={value[idx]}\n aria-valuemin={idx === 0 ? min : value[0]}\n aria-valuemax={idx === 0 ? value[1] : max}\n aria-valuetext={getAriaValueText ? getAriaValueText(value[idx]) : undefined}\n aria-disabled={disabled || undefined}\n />\n </span>\n ))}\n </span>\n </div>\n </TextFieldWrapper>\n );\n});\n\nconst SingleSlider = React.forwardRef<HTMLSpanElement, SliderProps>(function SingleSlider(props, ref) {\n const {\n defaultValue,\n value: valueProp,\n onChange,\n min = 0,\n max = 100,\n name,\n disabled = false,\n className,\n step,\n variant = \"continuous\",\n valueField,\n withTicks,\n label,\n helperText,\n error,\n size = \"medium\",\n color = \"primary\",\n orientation = \"horizontal\",\n marks,\n // `range` is handled by the Slider dispatcher; destructured here to keep it off the DOM\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n range,\n getAriaValueText,\n \"aria-label\": ariaLabel,\n ...rest\n } = props;\n\n const singleDefault = typeof defaultValue === \"number\" ? defaultValue : undefined;\n const singleValueProp = typeof valueProp === \"number\" ? valueProp : undefined;\n const isVertical = orientation === \"vertical\";\n\n const [valueState, setValue] = React.useState<number>(singleDefault ?? min);\n const [isDragging, setIsDragging] = React.useState<boolean>(false);\n const [isActive, setIsActive] = React.useState<boolean>(false);\n const [isFocused, setIsFocused] = React.useState<boolean>(false);\n\n const containerRef = React.useRef<HTMLSpanElement>(null);\n const rootRef = useForkRef<HTMLSpanElement>(ref, containerRef);\n const isPressedRef = React.useRef<boolean>(false);\n\n const isControlled = singleValueProp !== undefined;\n const isDiscrete = variant === \"discrete\";\n const value = isControlled ? singleValueProp : valueState;\n\n const updateValue = (value: number, event: Event | React.SyntheticEvent) => {\n if (value < min || value > max) return;\n if (!isControlled) {\n setValue(value);\n }\n onChange?.(event, value, props);\n };\n\n const offsetToValue = (absolute: number, containerSize: number) => {\n return rescale(absolute, [0, containerSize], [min, max], { step });\n };\n\n const onMouseDown = (event: React.MouseEvent<HTMLSpanElement>) => {\n if (disabled) {\n return;\n }\n\n if (event.button !== 0) {\n return;\n }\n\n isPressedRef.current = true;\n\n const element = containerRef.current;\n const rect = element?.getBoundingClientRect();\n\n if (rect) {\n const absolutePosition = isVertical ? rect.height - (event.clientY - rect.top) : event.clientX - rect.left;\n const newValue = offsetToValue(absolutePosition, isVertical ? rect.height : rect.width);\n\n if (!isActive) {\n setIsActive(true);\n }\n\n updateValue(newValue, event);\n }\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseEnd);\n };\n\n const onTouchStart = (event: TouchEvent) => {\n if (disabled) {\n return;\n }\n\n isPressedRef.current = true;\n\n const element = containerRef.current;\n const rect = element?.getBoundingClientRect();\n\n if (rect) {\n const touch = event.changedTouches?.[0];\n const absolutePosition = isVertical ? rect.height - (touch.clientY - rect.top) : touch.clientX - rect.left;\n const newValue = offsetToValue(absolutePosition, isVertical ? rect.height : rect.width);\n\n if (!isActive) {\n setIsActive(true);\n }\n updateValue(newValue, event);\n }\n\n document.addEventListener(\"touchmove\", onMouseMove);\n document.addEventListener(\"touchend\", onMouseEnd);\n };\n\n const onMouseMove = useEventCallback((event: MouseEvent | TouchEvent) => {\n if (isPressedRef.current) {\n const element = containerRef.current;\n const rect = element?.getBoundingClientRect();\n\n if (rect) {\n // TODO need clarification обработка разных событий разных типов 1 функцией\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const clientX = coordX(event);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const clientY = coordY(event);\n const absolutePosition = isVertical ? rect.height - (clientY - rect.top) : clientX - rect.left;\n const newValue = offsetToValue(absolutePosition, isVertical ? rect.height : rect.width);\n\n if (!isActive) {\n setIsActive(true);\n }\n\n if (value === newValue) {\n return;\n }\n\n if (!isDragging) {\n setIsDragging(true);\n }\n\n updateValue(newValue, event);\n }\n }\n });\n\n const onMouseEnd = useEventCallback(() => {\n isPressedRef.current = false;\n\n if (isDragging) {\n setIsDragging(false);\n }\n\n if (isActive) {\n setIsActive(false);\n }\n\n removeListeners();\n });\n\n const removeListeners = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseEnd);\n document.removeEventListener(\"touchmove\", onMouseMove);\n document.removeEventListener(\"touchend\", onMouseEnd);\n };\n\n const handleArrowsControls = (e: React.KeyboardEvent) => {\n if (!isFocused || disabled) return;\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n updateValue(value - (step || 1), e);\n }\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n updateValue(value + (step || 1), e);\n }\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n document.removeEventListener(\"keydown\", handleArrowsControls as (e: unknown) => void);\n };\n\n useSafeLayoutEffect(() => {\n if (containerRef.current) {\n containerRef.current.addEventListener(\"touchstart\", onTouchStart);\n\n return () => {\n containerRef.current?.removeEventListener(\"touchstart\", onTouchStart);\n };\n }\n });\n\n useSafeLayoutEffect(() => {\n if (disabled && containerRef.current?.contains(document.activeElement)) {\n (document.activeElement as HTMLElement)?.blur();\n }\n }, [disabled]);\n\n const classNames = cn(\n \"smwb-slider\",\n className,\n {\n \"smwb-slider--disabled\": disabled,\n \"smwb-slider--dragging\": isDragging,\n \"smwb-slider--discrete\": isDiscrete,\n \"smwb-slider--vertical\": isVertical,\n },\n size !== \"medium\" && `smwb-slider_size-${size}`,\n color !== \"primary\" && `smwb-slider_color-${color}`\n );\n\n const pct = `${toPercent(value, min, max)}%`;\n const trackStyle = isVertical ? { height: pct } : { width: pct };\n const thumbStyle = isVertical ? { bottom: pct } : { left: pct };\n\n const getTicks = () => Array(Math.round(max / (step || 1)) + 1).fill(1) as number[];\n const markList = resolveMarks(marks, min, max, step);\n\n return (\n <TextFieldWrapper label={label} helperText={helperText} disabled={disabled} error={error} fullWidth shrink>\n <div className=\"smwb-slider__container\">\n <span\n onKeyDown={handleArrowsControls}\n ref={rootRef}\n onMouseDown={onMouseDown}\n className={classNames}\n tabIndex={disabled ? -1 : 0}\n onFocus={() => setIsFocused(true)}\n onBlur={handleBlur}\n {...rest}\n >\n {withTicks && (\n <span className=\"smwb-slider__ticks\" style={{ gap: `${step}` }}>\n {getTicks().map((t, idx) => (\n <span className=\"smwb-slider__tick\" key={idx} />\n ))}\n </span>\n )}\n {markList.length > 0 && (\n <span className=\"smwb-slider__marks\" aria-hidden=\"true\">\n {markList.map((m) => {\n const mp = `${toPercent(m.value, min, max)}%`;\n return (\n <span key={m.value} className=\"smwb-slider__mark\" style={isVertical ? { bottom: mp } : { left: mp }}>\n {m.label != null && <span className=\"smwb-slider__mark-label\">{m.label}</span>}\n </span>\n );\n })}\n </span>\n )}\n <span className=\"smwb-slider__rail\" />\n <span className=\"smwb-slider__track\" style={trackStyle} />\n <span\n className={cn(\"smwb-slider__thumb\", {\n \"smwb-slider__thumb--active\": isActive,\n \"smwb-slider__thumb--discrete\": isDiscrete,\n })}\n style={thumbStyle}\n >\n {isDiscrete && <span className=\"smwb-slider__thumb-tooltip\">{Math.round(value)}</span>}\n <input\n data-testid=\"slider-input\"\n className=\"smwb-slider__input\"\n type=\"range\"\n min={min}\n max={max}\n name={name}\n value={value}\n readOnly\n aria-label={ariaLabel}\n aria-orientation={orientation}\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={getAriaValueText ? getAriaValueText(value) : undefined}\n aria-disabled={disabled || undefined}\n />\n </span>\n </span>\n {valueField && isDiscrete && (\n <TextField\n type=\"number\"\n value={value}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => updateValue(+e.target.value, e)}\n variant=\"filled\"\n helperText={null}\n />\n )}\n </div>\n </TextFieldWrapper>\n );\n});\n\nexport const Slider = React.forwardRef<HTMLSpanElement, SliderProps>(function Slider(props, ref) {\n const isRangeMode = props.range === true || Array.isArray(props.value) || Array.isArray(props.defaultValue);\n\n return isRangeMode ? <RangeSlider ref={ref} {...props} /> : <SingleSlider ref={ref} {...props} />;\n});\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Slider, type SliderProps, type SliderValue } from \"../slider\";\n\nexport interface ValueSliderProps extends SliderProps {\n /**\n * Read-only value readout beside the label. `true` shows the raw value; pass a\n * formatter for units/precision (e.g. `(v) => `${v}%``). Reflects `value`.\n */\n readout?: boolean | ((value: SliderValue | undefined) => string);\n /** Content at the end of the header row — a reset button, a favourite star, etc. */\n endAdornment?: React.ReactNode;\n /** Renders a built-in reset control in the header; called on click. */\n onReset?: () => void;\n /** Accessible label for the reset control. */\n resetLabel?: string;\n}\n\nfunction formatReadout(readout: ValueSliderProps[\"readout\"], value: SliderValue | undefined): string {\n if (typeof readout === \"function\") return readout(value);\n if (Array.isArray(value)) return `${value[0]} – ${value[1]}`;\n return value == null ? \"\" : String(value);\n}\n\n/**\n * `Slider` plus the value-readout + adornment header row every app rebuilds: a\n * read-only formatted value next to the label, an optional reset \"eraser\", and an\n * `endAdornment` slot. A drop-in preset — all `Slider` props pass through; the\n * label is rendered in the header instead of inside Slider.\n */\nexport function ValueSlider({\n readout,\n endAdornment,\n onReset,\n resetLabel,\n label,\n className,\n ...sliderProps\n}: ValueSliderProps): React.ReactElement {\n const hasReadout = readout !== undefined && readout !== false;\n const showHeader = label != null || hasReadout || endAdornment != null || onReset != null;\n\n return (\n <div className={cn(\"smwb-value-slider\", className)}>\n {showHeader ? (\n <div className=\"smwb-value-slider__header\">\n {label != null ? <span className=\"smwb-value-slider__label\">{label}</span> : null}\n <span className=\"smwb-value-slider__spacer\" />\n {hasReadout ? (\n <span className=\"smwb-value-slider__readout\">{formatReadout(readout, sliderProps.value)}</span>\n ) : null}\n {endAdornment}\n {onReset != null ? (\n <button\n type=\"button\"\n className=\"smwb-value-slider__reset\"\n aria-label={resetLabel ?? \"Reset\"}\n disabled={!!sliderProps.disabled}\n onClick={() => onReset()}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M3 12a9 9 0 1 0 3-6.7M3 4v4h4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n ) : null}\n </div>\n ) : null}\n <Slider {...sliderProps} />\n </div>\n );\n}\n\nexport default ValueSlider;\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useId } from \"../../../hooks/useId\";\nimport type { SelectionControlColor, SelectionControlSize } from \"../checkbox/checkbox\";\n\nexport interface ToggleProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n checked?: boolean;\n className?: string;\n id?: string;\n label?: string;\n labelPlacement?: \"top\" | \"left\" | \"right\";\n size?: SelectionControlSize;\n color?: SelectionControlColor;\n /** Unified handler: `(event, checked, data)`. */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>, checked: boolean, data: ToggleProps) => void;\n helperText?: React.ReactNode;\n error?: boolean;\n}\n\nexport const Toggle = React.forwardRef<HTMLInputElement, ToggleProps>(function Toggle(props, ref) {\n const {\n disabled,\n readOnly,\n required,\n checked,\n className,\n id: idProp,\n label,\n labelPlacement,\n size = \"medium\",\n color = \"primary\",\n helperText,\n error,\n ...args\n } = props;\n const id = useId(idProp);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) {\n e.preventDefault();\n return;\n }\n props.onChange?.(e, e.target.checked, props);\n };\n\n return (\n <TextFieldWrapper helperText={helperText} disabled={disabled} error={error} className=\"smwb-text-field-checkbox\">\n <span className={cn(\"smwb-toggle__wrapper\", labelPlacement && `smwb-toggle__wrapper_label-${labelPlacement}`)}>\n {label ? (\n <label htmlFor={id} className=\"smwb-toggle__label\">\n {label}\n </label>\n ) : null}\n <label\n className={cn(\"smwb-toggle\", `smwb-toggle_size-${size}`, `smwb-toggle_color-${color}`, className, {\n \"smwb-disabled\": disabled,\n \"smwb-readonly\": readOnly,\n })}\n >\n <input\n type=\"checkbox\"\n id={id}\n className=\"smwb-toggle__checkbox\"\n aria-checked={checked}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n role={\"switch\"}\n checked={checked}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n ref={ref}\n {...args}\n onChange={handleChange}\n />\n <span className=\"smwb-toggle__track\"></span>\n <span className=\"smwb-toggle__thumb\"></span>\n </label>\n </span>\n </TextFieldWrapper>\n );\n});\n\nexport default Toggle;\n","import React from \"react\";\nimport cn from \"clsx\";\n\nexport const Grid = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(function Grid(\n { className, ...rest },\n ref\n) {\n return <div ref={ref} data-testid=\"grid\" className={cn(\"smwb-grid\", className)} {...rest} />;\n});\n\nexport type ColumnSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n/** Column width per breakpoint: 1–12 grid units, `\"auto\"` (fit content) or `true` (fill remaining). */\nexport type BreakpointType = ColumnSpan | \"auto\" | true;\n/** Column offset (empty leading columns) per breakpoint: 0–11. */\nexport type OffsetType = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\nexport type Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type ResponsiveBool = boolean | Partial<Record<Breakpoint, boolean>>;\n\nexport const wrapOptions = [\"wrap\", \"nowrap\", \"wrap-reverse\"] as const;\nexport const justifyContentOptions = [\n \"flex-start\",\n \"center\",\n \"flex-end\",\n \"space-between\",\n \"space-around\",\n \"space-evenly\",\n] as const;\nexport const alignItemsOptions = [\"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\"] as const;\nexport const directionOptions = [\"row\", \"row-reverse\", \"column\", \"column-reverse\"] as const;\n\nexport interface RowProps extends React.HTMLAttributes<HTMLDivElement> {\n wrap?: (typeof wrapOptions)[number];\n justifyContent?: (typeof justifyContentOptions)[number];\n alignItems?: (typeof alignItemsOptions)[number];\n direction?: (typeof directionOptions)[number];\n spacing?: number;\n}\n\nexport const Row = React.forwardRef<HTMLDivElement, RowProps>(function Row(\n { className, justifyContent, alignItems, direction, wrap, spacing, ...rest },\n ref\n) {\n const isJustifyContent =\n justifyContent && justifyContentOptions.includes(justifyContent) && justifyContent !== \"flex-start\";\n const isAlignItems = alignItems && alignItemsOptions.includes(alignItems) && alignItems !== \"flex-start\";\n const isDirection = direction && directionOptions.includes(direction) && direction !== \"row\";\n const isFlexWrap = wrap && wrapOptions.includes(wrap) && wrap !== \"wrap\";\n\n const classes = cn(\"smwb-grid__row\", className, {\n [`smwb-grid__row--spacing-${spacing}`]: spacing,\n [`smwb-grid__row--justifyContent-${justifyContent}`]: isJustifyContent,\n [`smwb-grid__row--alignItems-${alignItems}`]: isAlignItems,\n [`smwb-grid__row--direction-${direction}`]: isDirection,\n [`smwb-grid__row--${wrap}`]: isFlexWrap,\n });\n\n return <div ref={ref} data-testid=\"grid-row\" className={classes} {...rest} />;\n});\n\nexport type ColumnProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Ширина на точке остановы: 1–12 из 12, `\"auto\"` (по контенту) или `true` (заполнить). */\n xs?: BreakpointType;\n sm?: BreakpointType;\n md?: BreakpointType;\n lg?: BreakpointType;\n xl?: BreakpointType;\n /** Сдвиг (пустые ведущие колонки) на точке остановы, 0–11. */\n xsOffset?: OffsetType;\n smOffset?: OffsetType;\n mdOffset?: OffsetType;\n lgOffset?: OffsetType;\n xlOffset?: OffsetType;\n /** Скрыть колонку: булево (всегда) или по точкам остановы `{ xs:true, md:false }`. */\n hidden?: ResponsiveBool;\n};\n\nconst hiddenClasses = (hidden?: ResponsiveBool) => {\n if (hidden === undefined) {\n return {};\n }\n if (typeof hidden === \"boolean\") {\n return { \"smwb-grid__column--hidden\": hidden };\n }\n return (Object.keys(hidden) as Breakpoint[]).reduce<Record<string, boolean>>((acc, bp) => {\n acc[`smwb-grid__column--hidden-${bp}`] = hidden[bp] === true;\n acc[`smwb-grid__column--visible-${bp}`] = hidden[bp] === false;\n return acc;\n }, {});\n};\n\nexport const Column = React.forwardRef<HTMLDivElement, ColumnProps>(function Column(\n { className, xs, sm, md, lg, xl, xsOffset, smOffset, mdOffset, lgOffset, xlOffset, hidden, ...rest },\n ref\n) {\n const classes = cn(\"smwb-grid__column\", className, {\n [`smwb-grid__column--xs-${xs}`]: xs,\n [`smwb-grid__column--sm-${sm}`]: sm,\n [`smwb-grid__column--md-${md}`]: md,\n [`smwb-grid__column--lg-${lg}`]: lg,\n [`smwb-grid__column--xl-${xl}`]: xl,\n [`smwb-grid__column--xs-offset-${xsOffset}`]: xsOffset,\n [`smwb-grid__column--sm-offset-${smOffset}`]: smOffset,\n [`smwb-grid__column--md-offset-${mdOffset}`]: mdOffset,\n [`smwb-grid__column--lg-offset-${lgOffset}`]: lgOffset,\n [`smwb-grid__column--xl-offset-${xlOffset}`]: xlOffset,\n ...hiddenClasses(hidden),\n });\n\n return <div ref={ref} className={classes} data-testid=\"grid-col\" {...rest} />;\n});\n\nexport type ContainerMaxWidth = \"sm\" | \"md\" | \"lg\" | \"xl\" | false;\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Max-width breakpoint cap; `false` = fluid full width. */\n maxWidth?: ContainerMaxWidth;\n /** Remove horizontal gutters. */\n disableGutters?: boolean;\n}\n\nexport const Container = React.forwardRef<HTMLDivElement, ContainerProps>(function Container(\n { className, maxWidth = \"lg\", disableGutters = false, ...rest },\n ref\n) {\n const classes = cn(\n \"smwb-container\",\n {\n [`smwb-container--${maxWidth}`]: maxWidth !== false,\n \"smwb-container--gutterless\": disableGutters,\n },\n className\n );\n return <div ref={ref} data-testid=\"grid-container\" className={classes} {...rest} />;\n});\n","import { CSSProperties, forwardRef, HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport type DividerColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface DividerProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** Direction of the divider line. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Inset behaviour of the line relative to its container. */\n variant?: \"fullWidth\" | \"inset\" | \"middle\";\n /** Horizontal alignment of the optional text content. */\n textAlign?: \"left\" | \"center\" | \"right\";\n /** Line color (semantic token). */\n color?: DividerColor;\n /** Line thickness (number = px, or any CSS length). */\n thickness?: number | string;\n /** Stretch to fill a flex container along the cross axis. */\n flexItem?: boolean;\n}\n\nconst colorVar: Record<DividerColor, string | undefined> = {\n default: undefined,\n primary: \"var(--smui-primaryColor)\",\n secondary: \"var(--smui-secondaryColor)\",\n error: \"var(--smui-errorColor)\",\n success: \"var(--smui-successColor)\",\n warning: \"var(--smui-warningColor)\",\n info: \"var(--smui-infoColor)\",\n};\n\nexport const Divider = forwardRef<HTMLDivElement, PropsWithChildren<DividerProps>>(function Divider(\n {\n className,\n orientation = \"horizontal\",\n variant = \"fullWidth\",\n textAlign = \"center\",\n color = \"default\",\n thickness,\n flexItem,\n style,\n children,\n ...props\n },\n ref\n) {\n const hasText = children !== undefined && children !== null && children !== false;\n const c = colorVar[color];\n const t = typeof thickness === \"number\" ? `${thickness}px` : thickness;\n\n const dividerStyle: CSSProperties = {\n ...style,\n ...(c ? { borderColor: c } : {}),\n ...(t ? (orientation === \"vertical\" ? { borderLeftWidth: t } : { borderBottomWidth: t }) : {}),\n };\n\n const dividerClassName = cn(\n \"smwb-divider\",\n `smwb-divider_${orientation}`,\n `smwb-divider_${variant}`,\n {\n \"smwb-divider_with-text\": hasText && orientation === \"horizontal\",\n [`smwb-divider_align-${textAlign}`]: hasText && orientation === \"horizontal\",\n \"smwb-divider_flex-item\": flexItem,\n },\n className\n );\n\n return (\n <div\n {...props}\n ref={ref}\n data-testid=\"divider\"\n role=\"separator\"\n aria-orientation={orientation}\n className={dividerClassName}\n style={dividerStyle}\n >\n {hasText && orientation === \"horizontal\" ? <span className=\"smwb-divider__text\">{children}</span> : null}\n </div>\n );\n});\n\nexport default Divider;\n","export interface ThrottledFunction<A extends unknown[]> {\n (...args: A): void;\n cancel(): void;\n}\n\nexport function throttle<A extends unknown[]>(fn: (...args: A) => void, wait: number): ThrottledFunction<A> {\n let lastCall = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: A | undefined;\n\n const invoke = (time: number, args: A): void => {\n lastCall = time;\n fn(...args);\n };\n\n const throttled = (...args: A): void => {\n const now = Date.now();\n const remaining = wait - (now - lastCall);\n lastArgs = args;\n\n if (remaining <= 0 || remaining > wait) {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n invoke(now, args);\n } else if (timer === undefined) {\n timer = setTimeout(() => {\n timer = undefined;\n if (lastArgs !== undefined) {\n invoke(Date.now(), lastArgs);\n }\n }, remaining);\n }\n };\n\n throttled.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n lastCall = 0;\n lastArgs = undefined;\n };\n\n return throttled;\n}\n","import React, {\n Children,\n forwardRef,\n KeyboardEvent,\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport cn from \"clsx\";\nimport { throttle } from \"../../../utils/throttle\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport interface ScreenDividerProps {\n sizeFirst?: number;\n sizeSecond?: number;\n className?: string;\n orientation?: \"horizontal\" | \"vertical\";\n /** Called with the first pane size (percent) whenever it changes. */\n onSizeChange?: (sizeFirst: number) => void;\n /** Step (in percent) applied on arrow-key resize. */\n keyboardStep?: number;\n /** Accessible label for the resizer handle. */\n resizerAriaLabel?: string;\n}\n\nconst getInitialDivider = (sizeFirst?: number | null, sizeSecond?: number | null) => {\n if (!sizeFirst && sizeSecond) {\n return 100 - sizeSecond;\n }\n if (sizeFirst) {\n return sizeFirst;\n }\n return 50;\n};\n\nexport const ScreenDivider = forwardRef<HTMLDivElement, PropsWithChildren<ScreenDividerProps>>(function ScreenDivider(\n {\n className,\n orientation = \"horizontal\",\n sizeFirst,\n sizeSecond,\n children,\n onSizeChange,\n keyboardStep = 5,\n resizerAriaLabel = \"Resize panels\",\n },\n ref\n) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const forkedWrapperRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n const [divider, setDivider] = useState<number>(getInitialDivider(sizeFirst, sizeSecond));\n const [currentElement, setCurrentElement] = useState<HTMLDivElement | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n useEffect(() => {\n setDivider(getInitialDivider(sizeFirst, sizeSecond));\n }, [sizeFirst, sizeSecond]);\n\n const child = Children.toArray(children);\n if (child.length > 2) {\n throw new Error(\"Allowed not more than 2 children\");\n }\n\n const handleDragStart = () => {\n setCurrentElement(wrapperRef.current);\n setIsDragging(true);\n };\n\n const dragOverHandler = useMemo(\n () =>\n throttle((e: PointerEvent) => {\n if (!isDragging) return;\n const wrapper = wrapperRef.current;\n if (!wrapper || wrapper !== currentElement) return;\n // Viewport-relative rect — using offsetLeft/offsetTop here is wrong\n // because they are relative to the nearest positioned ancestor, not\n // the viewport that clientX/clientY live in (this is what made the\n // divider drift away from the cursor when the wrapper was nested).\n const rect = wrapper.getBoundingClientRect();\n const total = orientation === \"vertical\" ? rect.height : rect.width;\n const cursor = orientation === \"vertical\" ? e.clientY - rect.top : e.clientX - rect.left;\n // 5px margin on each side so neither pane fully collapses.\n const clamped = Math.max(5, Math.min(total - 5, cursor));\n setDivider((clamped / total) * 100);\n }, 1000 / 60),\n [isDragging, currentElement, orientation]\n );\n\n const handleDragEnd = useCallback(() => {\n setCurrentElement(null);\n setIsDragging(false);\n document.body.removeEventListener(\"pointerup\", handleDragEnd);\n document.body.removeEventListener(\"pointermove\", dragOverHandler);\n }, [dragOverHandler]);\n\n useEffect(() => {\n onSizeChange?.(divider);\n }, [divider, onSizeChange]);\n\n const onResizerKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n const decreaseKey = orientation === \"vertical\" ? \"ArrowUp\" : \"ArrowLeft\";\n const increaseKey = orientation === \"vertical\" ? \"ArrowDown\" : \"ArrowRight\";\n\n if (event.key === decreaseKey) {\n event.preventDefault();\n setDivider((prev) => Math.max(0, prev - keyboardStep));\n } else if (event.key === increaseKey) {\n event.preventDefault();\n setDivider((prev) => Math.min(100, prev + keyboardStep));\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setDivider(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setDivider(100);\n }\n };\n\n const secondChildStyle =\n orientation === \"vertical\" ? { height: `${100 - divider}%` } : { width: `${100 - divider}%` };\n\n const firstChildStyle = orientation === \"vertical\" ? { height: `${divider}%` } : { width: `${divider}%` };\n\n useEffect(() => {\n if (isDragging) {\n document.body.addEventListener(\"pointerup\", handleDragEnd);\n document.body.addEventListener(\"pointermove\", dragOverHandler);\n document.body.style.cursor = orientation === \"horizontal\" ? \"e-resize\" : \"n-resize\";\n } else {\n document.body.style.cursor = \"default\";\n }\n\n return () => {\n document.body.removeEventListener(\"pointerup\", handleDragEnd);\n document.body.removeEventListener(\"pointermove\", dragOverHandler);\n };\n }, [dragOverHandler, handleDragEnd, isDragging, orientation]);\n\n return (\n <div\n className={cn(\"smwb-screen-divider__wrapper\", `smwb-${orientation}`, className)}\n ref={forkedWrapperRef}\n data-testid=\"screen-divider\"\n >\n <div className={cn(\"smwb-screen-divider__first\", `smwb-${orientation}`)} style={firstChildStyle}>\n {child[0] || \"\"}\n </div>\n <span\n className=\"smwb-screen-divider__resizer\"\n onPointerDown={handleDragStart}\n draggable={false}\n role=\"separator\"\n aria-orientation={orientation === \"vertical\" ? \"horizontal\" : \"vertical\"}\n aria-valuenow={Math.round(divider)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={resizerAriaLabel}\n tabIndex={0}\n onKeyDown={onResizerKeyDown}\n />\n <div className={cn(\"smwb-screen-divider__second\", `smwb-${orientation}`)} style={secondChildStyle}>\n {child[1] || \"\"}\n </div>\n </div>\n );\n});\n\nexport default ScreenDivider;\n","import React, { CSSProperties, forwardRef, PropsWithChildren, useCallback, useEffect, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { CSSTransition } from \"react-transition-group\";\nimport { createPortal } from \"react-dom\";\nimport Button from \"../../inputs/button/button\";\nimport Icon from \"../../base/icon/icon\";\nimport { ClickAwayListener } from \"../../clickAwayListener\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport interface SheetProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n placement?: \"top\" | \"bottom\" | \"right\" | \"left\";\n isOpen: boolean;\n onClose?: () => void;\n variant?: \"default\" | \"modal\";\n withSizeToggle?: boolean;\n /** Hide built-in header actions; onClose still handles Esc and backdrop. */\n hideHeaderActions?: boolean;\n reverseHeaderActions?: boolean;\n size?: string;\n disableOutsideClick?: boolean;\n /** Close the sheet when Escape is pressed. */\n closeOnEsc?: boolean;\n /**\n * Allow the user to resize the sheet by dragging a grab handle with\n * touch or mouse (mobile bottom-sheet style). Off by default.\n */\n resizable?: boolean;\n /** Minimum size in px while resizing (default 80). */\n minSize?: number;\n /** Maximum size in px while resizing (default: viewport dimension). */\n maxSize?: number;\n /** Step in px for keyboard resizing (default 24). */\n resizeStep?: number;\n /** Accessible label for the resize handle. */\n resizeHandleAriaLabel?: string;\n /** Called with the new size in px while/after resizing. */\n onResize?: (size: number) => void;\n \"aria-label\"?: string;\n}\n\ntype Mode = \"small\" | \"expanded\" | null;\n\nexport const Sheet = forwardRef<HTMLDivElement, PropsWithChildren<SheetProps>>(function Sheet(\n {\n isOpen,\n onClose,\n variant = \"default\",\n children,\n placement = \"bottom\",\n disableOutsideClick,\n closeOnEsc = true,\n ...props\n },\n ref\n) {\n const [mode, setMode] = useState<Mode>(null);\n const nodeRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen || !closeOnEsc || !onClose) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [isOpen, closeOnEsc, onClose]);\n\n const handleSizeButton = () => {\n if (mode === \"expanded\") {\n setMode(\"small\");\n } else if (!mode) {\n setMode(\"expanded\");\n } else {\n setMode(null);\n }\n };\n\n const handleClose = () => {\n onClose?.();\n setMode(null);\n };\n\n return createPortal(\n <CSSTransition\n in={isOpen}\n timeout={70}\n mountOnEnter\n unmountOnExit\n classNames={{ enterDone: \"smwb-entered\" }}\n appear\n nodeRef={nodeRef}\n >\n {variant === \"default\" ? (\n <div className={cn(disableOutsideClick ? \"smwb-sheet__overlay\" : \"smwb-sheet__default\")} ref={nodeRef}>\n <SheetBlock\n ref={ref}\n onClose={onClose}\n handleSizeButton={handleSizeButton}\n handleClose={handleClose}\n isOpen={isOpen}\n mode={mode}\n placement={placement}\n variant={variant}\n {...props}\n >\n {children}\n </SheetBlock>\n </div>\n ) : (\n <div\n className={cn(\"smwb-sheet__overlay\", \"smwb-dark\", `smwb-${placement}`, `smwb-sheet_${variant}`)}\n ref={nodeRef}\n >\n <ClickAwayListener onClickAway={() => !disableOutsideClick && handleClose()}>\n <SheetBlock\n ref={ref}\n onClose={onClose}\n handleSizeButton={handleSizeButton}\n handleClose={handleClose}\n isOpen={isOpen}\n mode={mode}\n placement={placement}\n variant={variant}\n {...props}\n >\n {children}\n </SheetBlock>\n </ClickAwayListener>\n </div>\n )}\n </CSSTransition>,\n document.body\n );\n});\n\nexport default Sheet;\n\ninterface SheetBlockProps extends SheetProps {\n mode: Mode;\n handleSizeButton: () => void;\n handleClose: () => void;\n}\n\n/** Sheets anchored to a horizontal edge resize on the Y axis, vertical edges on X. */\nconst isVerticalAxis = (placement: SheetProps[\"placement\"]) => placement === \"bottom\" || placement === \"top\";\n\nconst SheetBlock = React.forwardRef(function SheetBlock(props: SheetBlockProps, ref: React.Ref<HTMLDivElement>) {\n const {\n isOpen,\n placement,\n className,\n mode,\n\n size = \"60%\",\n variant,\n onClose,\n withSizeToggle = true,\n hideHeaderActions = false,\n reverseHeaderActions = false,\n resizable = false,\n minSize = 80,\n maxSize,\n resizeStep = 24,\n resizeHandleAriaLabel = \"Resize sheet\",\n onResize,\n style,\n handleClose,\n handleSizeButton,\n children,\n ...rest\n } = props;\n const showActions = !hideHeaderActions && (!!onClose || withSizeToggle);\n const headerActionNodes: React.ReactNode[] = [];\n if (withSizeToggle) {\n headerActionNodes.push(\n <Button variant={\"outlined\"} size=\"small\" onClick={handleSizeButton} key=\"size\">\n <Icon name=\"open_in_full\" />\n </Button>\n );\n }\n if (onClose) {\n headerActionNodes.push(\n <Button variant={\"outlined\"} size=\"small\" onClick={handleClose} key=\"close\">\n <Icon name=\"close\" />\n </Button>\n );\n }\n if (reverseHeaderActions) {\n headerActionNodes.reverse();\n }\n const nodeRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const forkRef = useForkRef(ref, nodeRef, rootRef);\n\n // Drag-to-resize state. `dragSize` (px) wins over the CSS size when set\n // (inline style beats the .smwb-expanded/.smwb-small rules).\n const [dragSize, setDragSize] = useState<number | null>(null);\n const vertical = isVerticalAxis(placement);\n\n const clamp = useCallback(\n (px: number) => {\n const viewport = vertical ? window.innerHeight : window.innerWidth;\n const max = maxSize ?? viewport;\n return Math.max(minSize, Math.min(max, px));\n },\n [vertical, maxSize, minSize]\n );\n\n const currentSizePx = useCallback(() => {\n const rect = rootRef.current?.getBoundingClientRect();\n if (!rect) {\n return minSize;\n }\n return vertical ? rect.height : rect.width;\n }, [vertical, minSize]);\n\n const applySize = useCallback(\n (px: number) => {\n const next = clamp(px);\n setDragSize(next);\n onResize?.(next);\n },\n [clamp, onResize]\n );\n\n const dragRef = useRef<{ start: number; size: number } | null>(null);\n\n const onPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n event.preventDefault();\n dragRef.current = {\n start: vertical ? event.clientY : event.clientX,\n size: currentSizePx(),\n };\n try {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n } catch {\n /* pointer capture is best-effort (unsupported in some envs) */\n }\n },\n [vertical, currentSizePx]\n );\n\n const onPointerMove = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (!drag) {\n return;\n }\n const pos = vertical ? event.clientY : event.clientX;\n const delta = pos - drag.start;\n // Sign so dragging *away* from the anchored edge grows the sheet.\n const grow = placement === \"bottom\" || placement === \"right\" ? -delta : delta;\n applySize(drag.size + grow);\n },\n [vertical, placement, applySize]\n );\n\n const endDrag = useCallback((event: React.PointerEvent<HTMLDivElement>) => {\n dragRef.current = null;\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n }, []);\n\n const onHandleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const base = dragSize ?? currentSizePx();\n const max = maxSize ?? (vertical ? window.innerHeight : window.innerWidth);\n // Key that should make the sheet *bigger*, per anchored edge.\n const incKey =\n placement === \"bottom\"\n ? \"ArrowUp\"\n : placement === \"top\"\n ? \"ArrowDown\"\n : placement === \"left\"\n ? \"ArrowRight\"\n : \"ArrowLeft\";\n const decKey =\n placement === \"bottom\"\n ? \"ArrowDown\"\n : placement === \"top\"\n ? \"ArrowUp\"\n : placement === \"left\"\n ? \"ArrowLeft\"\n : \"ArrowRight\";\n if (event.key === incKey) {\n event.preventDefault();\n applySize(base + resizeStep);\n } else if (event.key === decKey) {\n event.preventDefault();\n applySize(base - resizeStep);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n applySize(minSize);\n } else if (event.key === \"End\") {\n event.preventDefault();\n applySize(max);\n }\n },\n [dragSize, currentSizePx, vertical, placement, applySize, resizeStep, minSize, maxSize]\n );\n\n React.useEffect(() => {\n if (!isOpen) {\n setDragSize(null);\n return;\n }\n\n rootRef.current?.focus();\n }, [isOpen]);\n\n // While a drag size is applied, suppress the sheet's 0.2s size\n // transition so the panel tracks the pointer in real time instead\n // of lagging 200ms behind every move.\n const sizeStyle: CSSProperties =\n resizable && dragSize !== null\n ? { ...(vertical ? { height: dragSize } : { width: dragSize }), transition: \"none\" }\n : {};\n\n return (\n <CSSTransition in={isOpen} timeout={120} appear classNames={{ enterDone: \"smwb-sheet_entered\" }} nodeRef={nodeRef}>\n <div\n ref={forkRef}\n data-testid=\"sheet\"\n tabIndex={-1}\n role=\"dialog\"\n aria-modal={variant === \"modal\" || undefined}\n {...rest}\n className={cn(\"smwb-sheet\", className, `smwb-sheet_${variant}`, `smwb-${placement}`, {\n \"smwb-expanded\": mode === \"expanded\",\n \"smwb-small\": mode === \"small\",\n \"smwb-sheet_resizable\": resizable,\n })}\n style={{ \"--sizeProp\": size, ...sizeStyle, ...style } as CSSProperties}\n >\n {resizable && (\n <div\n className=\"smwb-sheet__drag-handle\"\n data-testid=\"sheet-drag-handle\"\n role=\"separator\"\n tabIndex={0}\n aria-orientation={vertical ? \"horizontal\" : \"vertical\"}\n aria-label={resizeHandleAriaLabel}\n aria-valuemin={minSize}\n aria-valuemax={Math.round(maxSize ?? (vertical ? window.innerHeight : window.innerWidth))}\n aria-valuenow={Math.round(dragSize ?? currentSizePx())}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onHandleKeyDown}\n >\n <span className=\"smwb-sheet__drag-handle-bar\" />\n </div>\n )}\n {showActions && <div className=\"smwb-sheet__header\">{headerActionNodes}</div>}\n {isOpen && mode !== \"small\" && <div className=\"smwb-sheet__inner\">{children}</div>}\n </div>\n </CSSTransition>\n );\n});\n","import React, { Children, Fragment, HTMLAttributes, PropsWithChildren, ReactNode, isValidElement } from \"react\";\nimport cn from \"clsx\";\n\nexport type StackSpacing = number | \"none\" | \"xxs\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | \"xxxl\";\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n direction?: \"row\" | \"row-reverse\" | \"column\" | \"column-reverse\";\n /** Gap between items: scale keyword, or a number = N × spacing unit. */\n spacing?: StackSpacing;\n align?: \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\n justify?: \"start\" | \"center\" | \"end\" | \"space-between\" | \"space-around\" | \"space-evenly\";\n wrap?: boolean;\n /** Optional element rendered between each child. */\n divider?: ReactNode;\n className?: string;\n}\n\nconst flexAlign = (v?: string): string | undefined => (v === \"start\" || v === \"end\" ? `flex-${v}` : v);\n\nconst resolveGap = (s: StackSpacing): string =>\n typeof s === \"number\" ? `calc(var(--smui-spacing-unit, 4px) * ${s})` : s === \"none\" ? \"0\" : `var(--smui-space-${s})`;\n\nexport const Stack = React.forwardRef<HTMLDivElement, PropsWithChildren<StackProps>>(function Stack(\n { direction = \"column\", spacing = \"md\", align, justify, wrap, divider, className, style, children, ...rest },\n ref\n) {\n const items = Children.toArray(children).filter(isValidElement);\n return (\n <div\n ref={ref}\n data-testid=\"stack\"\n className={cn(\"smwb-stack\", className)}\n style={{\n display: \"flex\",\n flexDirection: direction,\n flexWrap: wrap ? \"wrap\" : undefined,\n alignItems: flexAlign(align),\n justifyContent: flexAlign(justify),\n gap: resolveGap(spacing),\n ...style,\n }}\n {...rest}\n >\n {divider\n ? items.map((child, i) => (\n <Fragment key={i}>\n {i > 0 ? <div className=\"smwb-stack__divider\">{divider}</div> : null}\n {child}\n </Fragment>\n ))\n : children}\n </div>\n );\n});\n\nexport default Stack;\n","import React, { HTMLAttributes, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport type PageMaxWidth = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface PageProps extends HTMLAttributes<HTMLElement> {\n /** Content max-width cap; `full` = fluid. */\n maxWidth?: PageMaxWidth;\n /** Remove the page padding. */\n disableGutters?: boolean;\n /** Render as a different element (default `main`). */\n component?: keyof JSX.IntrinsicElements;\n className?: string;\n}\n\nexport const Page = React.forwardRef<HTMLElement, PropsWithChildren<PageProps>>(function Page(\n { maxWidth = \"lg\", disableGutters = false, component, className, children, ...rest },\n ref\n) {\n const Tag = (component ?? \"main\") as \"main\";\n return (\n <Tag\n ref={ref}\n data-testid=\"page\"\n className={cn(\"smwb-page\", `smwb-page_max-${maxWidth}`, { \"smwb-page_gutterless\": disableGutters }, className)}\n {...rest}\n >\n <div className=\"smwb-page__inner\">{children}</div>\n </Tag>\n );\n});\n\nexport default Page;\n","import React, { HTMLAttributes, ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Typography from \"../../dataDisplay/typography/typography\";\n\nexport interface PageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title: ReactNode;\n subtitle?: ReactNode;\n /** Slot above the title (e.g. <Breadcrumbs />). */\n breadcrumbs?: ReactNode;\n /** Slot on the trailing side (e.g. action buttons). */\n actions?: ReactNode;\n /** Render a divider below the header. */\n divider?: boolean;\n className?: string;\n}\n\nexport const PageHeader = React.forwardRef<HTMLElement, PageHeaderProps>(function PageHeader(\n { title, subtitle, breadcrumbs, actions, divider = false, className, ...rest },\n ref\n) {\n return (\n <header\n ref={ref}\n data-testid=\"page-header\"\n className={cn(\"smwb-page-header\", { \"smwb-page-header_divider\": divider }, className)}\n {...rest}\n >\n {breadcrumbs ? <div className=\"smwb-page-header__breadcrumbs\">{breadcrumbs}</div> : null}\n <div className=\"smwb-page-header__row\">\n <div className=\"smwb-page-header__titles\">\n {typeof title === \"string\" ? (\n <Typography variant=\"h4\" component=\"h1\" className=\"smwb-page-header__title\">\n {title}\n </Typography>\n ) : (\n <div className=\"smwb-page-header__title\">{title}</div>\n )}\n {subtitle ? (\n <Typography variant=\"body2\" color=\"textSecondary\" className=\"smwb-page-header__subtitle\">\n {subtitle}\n </Typography>\n ) : null}\n </div>\n {actions ? <div className=\"smwb-page-header__actions\">{actions}</div> : null}\n </div>\n </header>\n );\n});\n\nexport default PageHeader;\n","import React, { CSSProperties, HTMLAttributes, PropsWithChildren, ReactNode, useId } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\n\nexport interface AppLayoutProps extends HTMLAttributes<HTMLDivElement> {\n /** Top bar slot (e.g. <AppBar />). Spans full width. */\n header?: ReactNode;\n /** Side navigation slot (e.g. <Sidebar />). */\n sidebar?: ReactNode;\n /** Footer slot, below the content. */\n footer?: ReactNode;\n /** Sidebar width (px or any CSS length). */\n sidebarWidth?: number | string;\n /** Controlled collapsed state of the sidebar rail. */\n sidebarCollapsed?: boolean;\n /** Initial collapsed state (uncontrolled). */\n defaultSidebarCollapsed?: boolean;\n /** Called whenever the collapsed state changes. */\n onSidebarCollapsedChange?: (collapsed: boolean) => void;\n /** Renders a built-in toggle button to collapse/expand the sidebar. */\n collapsible?: boolean;\n /** Custom toggle node replacing the default icon button. */\n collapseToggle?: ReactNode;\n /** Accessible label for the default toggle button. */\n collapseToggleAriaLabel?: string;\n /** Sidebar collapsed width. */\n sidebarCollapsedWidth?: number | string;\n /** Keep the header pinned while content scrolls. */\n stickyHeader?: boolean;\n className?: string;\n}\n\nconst len = (v: number | string) => (typeof v === \"number\" ? `${v}px` : v);\n\nexport const AppLayout = React.forwardRef<HTMLDivElement, PropsWithChildren<AppLayoutProps>>(function AppLayout(\n {\n header,\n sidebar,\n footer,\n sidebarWidth = 260,\n sidebarCollapsed,\n defaultSidebarCollapsed = false,\n onSidebarCollapsedChange,\n collapsible = false,\n collapseToggle,\n collapseToggleAriaLabel = \"Toggle navigation\",\n sidebarCollapsedWidth = 72,\n stickyHeader = true,\n className,\n style,\n children,\n ...rest\n },\n ref\n) {\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n value: sidebarCollapsed,\n defaultValue: defaultSidebarCollapsed,\n onChange: onSidebarCollapsedChange,\n });\n\n const sidebarId = useId();\n\n const cssVars = {\n \"--smui-app-sidebar-w\": collapsed ? len(sidebarCollapsedWidth) : len(sidebarWidth),\n } as CSSProperties;\n\n return (\n <div\n ref={ref}\n data-testid=\"app-layout\"\n className={cn(\n \"smwb-app-layout\",\n { \"smwb-app-layout_sticky-header\": stickyHeader, \"smwb-app-layout_collapsed\": collapsed },\n className\n )}\n style={{ ...cssVars, ...style }}\n {...rest}\n >\n {header ? <div className=\"smwb-app-layout__header\">{header}</div> : null}\n <div className=\"smwb-app-layout__body\">\n {sidebar ? (\n <aside id={sidebarId} className=\"smwb-app-layout__sidebar\">\n {collapsible ? (\n <div className=\"smwb-app-layout__collapse\">\n {collapseToggle ?? (\n <button\n type=\"button\"\n className=\"smwb-app-layout__collapse-btn\"\n aria-label={collapseToggleAriaLabel}\n aria-expanded={!collapsed}\n aria-controls={sidebarId}\n onClick={() => setCollapsed(!collapsed)}\n >\n <Icon name={collapsed ? \"chevron_right\" : \"chevron_left\"} size={20} />\n </button>\n )}\n </div>\n ) : null}\n {sidebar}\n </aside>\n ) : null}\n <div className=\"smwb-app-layout__content\">\n {children}\n {footer ? <div className=\"smwb-app-layout__footer\">{footer}</div> : null}\n </div>\n </div>\n </div>\n );\n});\n\nexport default AppLayout;\n","import React, { forwardRef } from \"react\";\nimport cn from \"clsx\";\n\nexport type AppBarColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface AppBarProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n children?: React.ReactNode;\n className?: string;\n dense?: boolean;\n position?: \"relative\" | \"static\" | \"absolute\" | \"sticky\" | \"fixed\";\n placement?: \"top\" | \"bottom\";\n leftContent?: React.ReactNode;\n midContent?: React.ReactNode;\n rightContent?: React.ReactNode;\n title?: React.ReactNode | string;\n midContentAlign?: \"middle\" | \"left\" | \"right\";\n /** Semantic background color. */\n color?: AppBarColor;\n}\n\nexport const AppBar = forwardRef<HTMLElement, AppBarProps>(function AppBar(\n {\n className,\n children,\n dense,\n position = \"static\",\n placement = \"top\",\n leftContent,\n midContent,\n midContentAlign = \"middle\",\n rightContent,\n title,\n color = \"default\",\n ...rest\n },\n ref\n) {\n const MainTag = placement === \"top\" ? \"header\" : \"footer\";\n\n return (\n <MainTag\n ref={ref}\n className={cn(\n \"smwb-appbar\",\n className,\n `smwb-${position}`,\n `smwb-${placement}`,\n { \"smwb-dense\": dense },\n color !== \"default\" && `smwb-appbar_color-${color}`\n )}\n data-testid=\"app-bar\"\n {...rest}\n >\n {children ? (\n children\n ) : (\n <div className=\"smwb-appbar__inner\">\n <div className=\"smwb-appbar__left\">\n {title && <div className=\"smwb-appbar__left__title\">{title}</div>}\n {leftContent}\n </div>\n <div className={cn(\"smwb-appbar__mid\", `smwb-${midContentAlign}`)}>{midContent}</div>\n <div className=\"smwb-appbar__right\">{rightContent}</div>\n </div>\n )}\n </MainTag>\n );\n});\n\nexport default AppBar;\n","import {\n Children,\n forwardRef,\n Fragment,\n HTMLAttributes,\n isValidElement,\n PropsWithChildren,\n ReactNode,\n useState,\n} from \"react\";\nimport cn from \"clsx\";\n\nexport interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {\n className?: string;\n /** Node placed between every crumb. */\n separator?: ReactNode;\n /** Collapse the middle of the trail when there are more than `maxItems` crumbs. */\n maxItems?: number;\n /** How many leading crumbs to keep when collapsed. */\n itemsBeforeCollapse?: number;\n /** How many trailing crumbs to keep when collapsed. */\n itemsAfterCollapse?: number;\n /** Controlled expanded state. */\n expanded?: boolean;\n /** Fired when the user activates the expand control. */\n onExpand?: () => void;\n /** Accessible label for the expand button. */\n expandLabel?: string;\n}\n\nexport const Breadcrumbs = forwardRef<HTMLElement, PropsWithChildren<BreadcrumbsProps>>(function Breadcrumbs(\n {\n className,\n separator = \"/\",\n maxItems = 8,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n expanded: expandedProp,\n onExpand,\n expandLabel = \"Show path\",\n children,\n ...props\n },\n ref\n) {\n const isControlled = expandedProp !== undefined;\n const [internalExpanded, setInternalExpanded] = useState(false);\n const expanded = isControlled ? !!expandedProp : internalExpanded;\n const crumbs = Children.toArray(children).filter(isValidElement);\n\n const collapsed = !expanded && crumbs.length > maxItems && itemsBeforeCollapse + itemsAfterCollapse < crumbs.length;\n\n const handleExpand = () => {\n onExpand?.();\n if (!isControlled) {\n setInternalExpanded(true);\n }\n };\n\n const rendered: ReactNode[] = collapsed\n ? [\n ...crumbs.slice(0, itemsBeforeCollapse),\n <button\n key=\"smwb-breadcrumbs-expand\"\n type=\"button\"\n className=\"smwb-breadcrumbs__expand\"\n aria-label={expandLabel}\n onClick={handleExpand}\n >\n …\n </button>,\n ...crumbs.slice(crumbs.length - itemsAfterCollapse),\n ]\n : crumbs;\n\n return (\n <nav\n {...props}\n ref={ref}\n data-testid=\"breadcrumbs\"\n aria-label=\"breadcrumb\"\n className={cn(\"smwb-breadcrumbs\", className)}\n >\n <ol className=\"smwb-breadcrumbs__list\">\n {rendered.map((crumb, index) => (\n <Fragment key={index}>\n <li className=\"smwb-breadcrumbs__item\">{crumb}</li>\n {index < rendered.length - 1 ? (\n <li className=\"smwb-breadcrumbs__separator\" aria-hidden=\"true\">\n {separator}\n </li>\n ) : null}\n </Fragment>\n ))}\n </ol>\n </nav>\n );\n});\n\nexport default Breadcrumbs;\n","import { forwardRef, HTMLAttributes, KeyboardEvent, useRef } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\n\nexport type PaginationColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n className?: string;\n /** Total number of pages. */\n count: number;\n /** Current page (1-based). */\n page: number;\n /** Pages shown on each side of the current page. */\n siblingCount?: number;\n /** Pages always shown at the start and end. */\n boundaryCount?: number;\n size?: \"small\" | \"medium\";\n /** Item style. */\n variant?: \"filled\" | \"outlined\";\n /** Item shape. */\n shape?: \"rounded\" | \"circular\";\n color?: PaginationColor;\n disabled?: boolean;\n showFirstButton?: boolean;\n showLastButton?: boolean;\n hidePrevButton?: boolean;\n hideNextButton?: boolean;\n onChange?: (page: number) => void;\n}\n\ntype PaginationItem = number | \"start-ellipsis\" | \"end-ellipsis\";\n\nconst range = (start: number, end: number): number[] =>\n Array.from({ length: Math.max(end - start + 1, 0) }, (_, i) => start + i);\n\nconst buildItems = (count: number, page: number, siblingCount: number, boundaryCount: number): PaginationItem[] => {\n const startPages = range(1, Math.min(boundaryCount, count));\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count);\n\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2\n );\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1\n );\n\n return [\n ...startPages,\n ...(siblingsStart > boundaryCount + 2\n ? ([\"start-ellipsis\"] as PaginationItem[])\n : boundaryCount + 1 < count - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n ...(siblingsEnd < count - boundaryCount - 1\n ? ([\"end-ellipsis\"] as PaginationItem[])\n : count - boundaryCount > boundaryCount\n ? [count - boundaryCount]\n : []),\n ...endPages,\n ];\n};\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n className,\n count,\n page,\n siblingCount = 1,\n boundaryCount = 1,\n size = \"medium\",\n variant = \"filled\",\n shape = \"circular\",\n color = \"default\",\n disabled = false,\n showFirstButton = false,\n showLastButton = false,\n hidePrevButton = false,\n hideNextButton = false,\n onChange,\n ...props\n },\n ref\n) {\n const navRef = useRef<HTMLElement>(null);\n const mergedRef = useForkRef<HTMLElement>(ref, navRef);\n\n const go = (target: number) => {\n if (disabled || target === page || target < 1 || target > count) {\n return;\n }\n onChange?.(target);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLUListElement>) => {\n if (![\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(e.key)) {\n return;\n }\n const buttons = Array.from(\n navRef.current?.querySelectorAll<HTMLButtonElement>(\"button.smwb-pagination__item:not(:disabled)\") ?? []\n );\n if (buttons.length === 0) {\n return;\n }\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n let next = current;\n if (e.key === \"ArrowRight\") next = Math.min(current + 1, buttons.length - 1);\n else if (e.key === \"ArrowLeft\") next = Math.max(current - 1, 0);\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = buttons.length - 1;\n e.preventDefault();\n buttons[next]?.focus();\n };\n\n const items = buildItems(count, page, siblingCount, boundaryCount);\n\n const navButton = (key: string, label: string, target: number, iconName: string, hidden?: boolean) =>\n hidden ? null : (\n <li key={key}>\n <button\n type=\"button\"\n className=\"smwb-pagination__item smwb-pagination__nav\"\n aria-label={label}\n disabled={disabled || target < 1 || target > count}\n onClick={() => go(target)}\n >\n <Icon name={iconName} size={size === \"small\" ? 16 : 18} />\n </button>\n </li>\n );\n\n return (\n <nav\n {...props}\n ref={mergedRef}\n data-testid=\"pagination\"\n aria-label=\"pagination\"\n className={cn(\n \"smwb-pagination\",\n `smwb-pagination_${size}`,\n `smwb-pagination_${variant}`,\n `smwb-pagination_shape-${shape}`,\n color !== \"default\" && `smwb-pagination_color-${color}`,\n { \"smwb-pagination_disabled\": disabled },\n className\n )}\n >\n <ul className=\"smwb-pagination__list\" onKeyDown={onKeyDown}>\n {navButton(\"first\", \"First page\", 1, \"first_page\", !showFirstButton)}\n {navButton(\"prev\", \"Previous page\", page - 1, \"chevron_left\", hidePrevButton)}\n {items.map((item, index) =>\n typeof item === \"number\" ? (\n <li key={item}>\n <button\n type=\"button\"\n className={cn(\"smwb-pagination__item\", { \"smwb-pagination__item_selected\": item === page })}\n aria-current={item === page ? \"page\" : undefined}\n disabled={disabled}\n onClick={() => go(item)}\n >\n {item}\n </button>\n </li>\n ) : (\n <li key={`${item}-${index}`} className=\"smwb-pagination__ellipsis\" aria-hidden=\"true\">\n …\n </li>\n )\n )}\n {navButton(\"next\", \"Next page\", page + 1, \"chevron_right\", hideNextButton)}\n {navButton(\"last\", \"Last page\", count, \"last_page\", !showLastButton)}\n </ul>\n </nav>\n );\n});\n\nexport default Pagination;\n","import { forwardRef, Fragment, HTMLAttributes, KeyboardEvent, ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface StepItem {\n label: ReactNode;\n description?: ReactNode;\n optional?: ReactNode;\n /** Marks the step as errored. */\n error?: boolean;\n /** Disables interaction with the step. */\n disabled?: boolean;\n /** Custom icon overriding the default number/check. */\n icon?: ReactNode;\n}\n\nexport interface StepperProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n steps: StepItem[];\n /** Index of the active (current) step. */\n activeStep: number;\n orientation?: \"horizontal\" | \"vertical\";\n /** Place the label under the icon (horizontal only). */\n alternativeLabel?: boolean;\n /** Makes steps clickable; receives the clicked step index. */\n onStepClick?: (index: number) => void;\n}\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(function Stepper(\n { className, steps, activeStep, orientation = \"horizontal\", alternativeLabel = false, onStepClick, ...props },\n ref\n) {\n return (\n <div\n {...props}\n ref={ref}\n data-testid=\"stepper\"\n className={cn(\n \"smwb-stepper\",\n `smwb-stepper_${orientation}`,\n { \"smwb-stepper_alt-label\": alternativeLabel && orientation === \"horizontal\" },\n className\n )}\n >\n {steps.map((step, index) => {\n const completed = index < activeStep;\n const active = index === activeStep;\n const isLast = index === steps.length - 1;\n const clickable = Boolean(onStepClick) && !step.disabled;\n\n const onStepKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (clickable && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n onStepClick?.(index);\n }\n };\n\n return (\n <Fragment key={index}>\n <div\n className={cn(\"smwb-stepper__step\", {\n \"smwb-stepper__step_active\": active,\n \"smwb-stepper__step_completed\": completed,\n \"smwb-stepper__step_error\": step.error,\n \"smwb-stepper__step_disabled\": step.disabled,\n \"smwb-stepper__step_clickable\": clickable,\n })}\n aria-current={active ? \"step\" : undefined}\n aria-disabled={step.disabled || undefined}\n role={clickable ? \"button\" : undefined}\n tabIndex={clickable ? 0 : undefined}\n onClick={clickable ? () => onStepClick?.(index) : undefined}\n onKeyDown={clickable ? onStepKeyDown : undefined}\n >\n <div className=\"smwb-stepper__icon\" aria-hidden=\"true\">\n {step.icon ?? (completed ? <Icon name=\"check\" size={16} /> : <span>{index + 1}</span>)}\n </div>\n <div className=\"smwb-stepper__text\">\n <span className=\"smwb-stepper__label\">{step.label}</span>\n {step.optional ? <span className=\"smwb-stepper__optional\">{step.optional}</span> : null}\n {step.description && orientation === \"vertical\" ? (\n <span className=\"smwb-stepper__description\">{step.description}</span>\n ) : null}\n </div>\n </div>\n {!isLast ? <div className=\"smwb-stepper__connector\" aria-hidden=\"true\" /> : null}\n </Fragment>\n );\n })}\n </div>\n );\n});\n\nexport default Stepper;\n","import React, { useRef, useState } from \"react\";\nimport type { Placement } from \"@floating-ui/react\";\nimport cn from \"clsx\";\nimport { Button } from \"../../inputs/button\";\nimport { Icon } from \"../../base/icon\";\nimport { Menu, MenuItem } from \"../menu\";\n\nexport interface OverflowMenuItem {\n id: string;\n label: string;\n icon?: React.ReactNode | string;\n danger?: boolean;\n disabled?: boolean;\n onSelect?: () => void;\n}\n\nexport interface OverflowMenuProps {\n items: OverflowMenuItem[];\n /** Trigger icon name (default `more_vert`). */\n icon?: string;\n placement?: Placement;\n \"aria-label\"?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * A one-shot kebab / overflow menu: a trigger icon button wired to a floating\n * `Menu` over an `items` array, with open/close state baked in. The card 3-dot\n * menu every app hand-builds (button + surface + open state) collapses to\n * passing an items list.\n */\nexport function OverflowMenu({\n items,\n icon = \"more_vert\",\n placement,\n \"aria-label\": ariaLabel,\n disabled,\n className,\n}: OverflowMenuProps): React.ReactElement {\n const anchorRef = useRef<HTMLButtonElement | HTMLAnchorElement | null>(null);\n const [open, setOpen] = useState(false);\n const close = (): void => setOpen(false);\n\n return (\n <span className={cn(\"smwb-overflow-menu\", className)}>\n <Button\n ref={anchorRef}\n variant=\"text\"\n size=\"small\"\n icon={icon}\n aria-label={ariaLabel ?? \"More actions\"}\n aria-haspopup=\"menu\"\n disabled={!!disabled}\n onClick={() => setOpen((value) => !value)}\n />\n <Menu isOpen={open} onClose={close} anchorElement={anchorRef.current} {...(placement ? { placement } : {})}>\n {items.map((item) => (\n <MenuItem\n key={item.id}\n className={cn({ \"smwb-overflow-menu__item--danger\": item.danger })}\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return;\n item.onSelect?.();\n close();\n }}\n >\n {item.icon ? typeof item.icon === \"string\" ? <Icon name={item.icon} /> : item.icon : null}\n {item.label}\n </MenuItem>\n ))}\n </Menu>\n </span>\n );\n}\n\nexport default OverflowMenu;\n","import React, { forwardRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {\n className?: string;\n variant?: \"compact\" | \"default\" | \"compactMini\";\n menuItems?: MenuItemProps[];\n /** Controlled index of the active menu item. */\n activeItem?: number | null;\n /** Default active index (uncontrolled). */\n defaultActiveItem?: number | null;\n /** Called with the index of the activated item. */\n onActiveItemChange?: (index: number) => void;\n /** Render a built-in toggle that collapses the rail to an icon-only mini rail. */\n collapsible?: boolean;\n /** Controlled collapsed state. */\n collapsed?: boolean;\n /** Initial collapsed state (uncontrolled). */\n defaultCollapsed?: boolean;\n /** Called whenever the collapsed state changes. */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Accessible label for the built-in collapse toggle. */\n collapseToggleAriaLabel?: string;\n}\n\nexport const Sidebar = forwardRef<HTMLElement, SidebarProps>(function Sidebar(\n {\n className,\n variant = \"default\",\n menuItems,\n activeItem: activeItemProp,\n defaultActiveItem = null,\n onActiveItemChange,\n collapsible = false,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseToggleAriaLabel = \"Toggle navigation\",\n ...rest\n },\n ref\n) {\n const isControlled = activeItemProp !== undefined;\n const [activeItemState, setActiveItemState] = useState<number | null>(defaultActiveItem);\n const activeItem = isControlled ? activeItemProp : activeItemState;\n\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n value: collapsedProp,\n defaultValue: defaultCollapsed,\n onChange: onCollapsedChange,\n });\n\n // When collapsed the rail always shows the icon-only mini variant,\n // otherwise it honours the requested variant.\n const effectiveVariant = collapsible && collapsed ? \"compactMini\" : variant;\n\n return (\n <aside\n ref={ref}\n className={cn(\"smwb-sidebar\", className, `smwb-${effectiveVariant}`, {\n \"smwb-sidebar_collapsible\": collapsible,\n \"smwb-sidebar_collapsed\": collapsible && collapsed,\n })}\n role=\"menubar\"\n {...rest}\n >\n {collapsible && (\n <div className=\"smwb-sidebar__collapse\">\n <button\n type=\"button\"\n className=\"smwb-sidebar__collapse-btn\"\n aria-label={collapseToggleAriaLabel}\n aria-expanded={!collapsed}\n onClick={() => setCollapsed(!collapsed)}\n >\n <Icon name={collapsed ? \"chevron_right\" : \"chevron_left\"} size={20} />\n </button>\n </div>\n )}\n <nav className=\"smwb-sidebar__nav\">\n {menuItems &&\n menuItems?.map((item, idx) => (\n <MenuItem\n key={idx}\n as={item.as}\n isActive={activeItem === idx}\n onClick={(e) => {\n if (!isControlled) {\n setActiveItemState(idx);\n }\n onActiveItemChange?.(idx);\n item.onClick?.(e);\n }}\n icon={item.icon}\n title={item.title}\n href={item.href}\n variant={effectiveVariant}\n />\n ))}\n </nav>\n </aside>\n );\n});\n\nexport default Sidebar;\n\nexport interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n icon?: React.ReactNode;\n title: string;\n isActive?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n as?: React.ElementType;\n href?: string;\n variant?: \"compact\" | \"default\" | \"compactMini\";\n}\n\nfunction MenuItem({\n isActive,\n icon,\n title,\n as = \"div\",\n href,\n onMouseDown: onMouseDownProp,\n variant,\n ...rest\n}: MenuItemProps) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n const rippleElement = <Ripple actionRef={rippleRef} />;\n\n const ElementType = as;\n\n return (\n <ElementType\n href={href}\n role=\"menuitem\"\n className={cn(\"sidebar__nav__item\", \"smwb-nav-item\", variant, { active: isActive })}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {icon && <span className=\"smwb-nav-item__icon\">{icon}</span>}\n {title && <span className=\"smwb-nav-item__title\">{title}</span>}\n {rippleElement}\n </ElementType>\n );\n}\n","import React, { forwardRef, useMemo, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport { Menu, MenuItem, MenuItemIcon, MenuItemText } from \"../menu\";\nimport type { MenuItemProps as SidebarMenuItemProps } from \"../sidebar/sidebar\";\n\nexport interface BottomBarProps extends React.HTMLAttributes<HTMLElement> {\n className?: string;\n menuItems?: SidebarMenuItemProps[];\n visibleCount?: number;\n activeItem?: number | null;\n defaultActiveItem?: number | null;\n onActiveItemChange?: (index: number) => void;\n overflowMenuAriaLabel?: string;\n}\n\nexport type BottomBarMenuItemProps = SidebarMenuItemProps;\n\nexport const BottomBar = forwardRef<HTMLElement, BottomBarProps>(function BottomBar(\n {\n className,\n menuItems = [],\n visibleCount = 4,\n activeItem: activeItemProp,\n defaultActiveItem = null,\n onActiveItemChange,\n overflowMenuAriaLabel = \"More navigation\",\n ...rest\n },\n ref\n) {\n const isControlled = activeItemProp !== undefined;\n const [activeItemState, setActiveItemState] = useState<number | null>(defaultActiveItem);\n const activeItem = isControlled ? activeItemProp : activeItemState;\n\n const [overflowOpen, setOverflowOpen] = useState(false);\n const [overflowAnchor, setOverflowAnchor] = useState<HTMLElement | null>(null);\n\n const safeVisibleCount = Math.max(0, visibleCount);\n const visibleItems = useMemo(() => menuItems.slice(0, safeVisibleCount), [menuItems, safeVisibleCount]);\n const overflowItems = useMemo(() => menuItems.slice(safeVisibleCount), [menuItems, safeVisibleCount]);\n const hasOverflow = overflowItems.length > 0;\n const overflowActive = hasOverflow && activeItem !== null && activeItem >= safeVisibleCount;\n\n const setActive = (index: number) => {\n if (!isControlled) {\n setActiveItemState(index);\n }\n onActiveItemChange?.(index);\n };\n\n const activateItem = (index: number, onClick?: React.MouseEventHandler<HTMLDivElement>) => {\n return (event: React.MouseEvent<HTMLDivElement>) => {\n setActive(index);\n onClick?.(event);\n };\n };\n\n const onOverflowToggle = () => {\n setOverflowOpen((prev) => !prev);\n };\n\n const onOverflowClose = () => {\n setOverflowOpen(false);\n };\n\n return (\n <nav ref={ref} className={cn(\"smwb-bottom-bar\", className)} role=\"navigation\" {...rest}>\n <div className=\"smwb-bottom-bar__nav\" role=\"menubar\">\n {visibleItems.map((item, idx) => (\n <BarItem\n key={idx}\n as={item.as}\n isActive={activeItem === idx}\n onClick={activateItem(idx, item.onClick)}\n icon={item.icon}\n title={item.title}\n href={item.href}\n />\n ))}\n {hasOverflow && (\n <BarItem\n ref={setOverflowAnchor}\n isActive={overflowActive}\n onClick={onOverflowToggle}\n icon={<Icon name=\"menu\" size={24} />}\n aria-label={overflowMenuAriaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={overflowOpen}\n />\n )}\n </div>\n {hasOverflow && (\n <Menu isOpen={overflowOpen} onClose={onOverflowClose} anchorElement={overflowAnchor} placement=\"top\" dense>\n {overflowItems.map((item, idx) => {\n const itemIndex = safeVisibleCount + idx;\n\n return (\n <MenuItem\n key={itemIndex}\n selected={activeItem === itemIndex}\n href={item.href}\n onClick={(event) => {\n setActive(itemIndex);\n item.onClick?.(event as unknown as React.MouseEvent<HTMLDivElement>);\n onOverflowClose();\n }}\n >\n {item.icon ? <MenuItemIcon>{item.icon}</MenuItemIcon> : null}\n <MenuItemText inset={!item.icon}>{item.title}</MenuItemText>\n </MenuItem>\n );\n })}\n </Menu>\n )}\n </nav>\n );\n});\n\nexport default BottomBar;\n\ninterface BarItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n icon?: React.ReactNode;\n title?: string;\n isActive?: boolean;\n as?: React.ElementType;\n href?: string;\n}\n\nconst BarItem = forwardRef<HTMLDivElement, BarItemProps>(function BarItem(\n { isActive, icon, title, as = \"div\", href, onMouseDown: onMouseDownProp, ...rest },\n ref\n) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseDownProp?.(event);\n };\n\n const onPointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n const ElementType = as;\n\n return (\n <ElementType\n ref={ref}\n href={href}\n role=\"menuitem\"\n className={cn(\"smwb-bottom-bar__item\", { \"smwb-bottom-bar__item_active\": isActive })}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n >\n {icon && <span className=\"smwb-bottom-bar__item-icon\">{icon}</span>}\n {title ? <span className=\"smwb-bottom-bar__item-title\">{title}</span> : null}\n <Ripple actionRef={rippleRef} />\n </ElementType>\n );\n});\n","export interface DebouncedFunction<A extends unknown[]> {\n (...args: A): void;\n cancel(): void;\n}\n\nexport function debounce<A extends unknown[]>(fn: (...args: A) => void, wait: number): DebouncedFunction<A> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = (...args: A): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => {\n timer = undefined;\n fn(...args);\n }, wait);\n };\n\n debounced.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n return debounced;\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../../base/ripple/ripple\";\n\nexport interface TabProps extends React.HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\n label?: string | React.ReactNode;\n isActive?: boolean;\n contentRef?: React.Ref<unknown>;\n icon?: React.ReactNode;\n stacked?: boolean;\n tag?: React.ElementType;\n disabled?: boolean;\n}\n\nexport const Tab = React.forwardRef<HTMLButtonElement | HTMLAnchorElement, TabProps>(function Tab(props, ref) {\n const {\n className,\n label,\n isActive = false,\n contentRef,\n icon,\n stacked = false,\n tag,\n disabled,\n onMouseDown: onMouseDownProp,\n ...rest\n } = props;\n const rippleRef = React.useRef<RippleActionsRef>(null);\n\n const onMouseDown = (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n onMouseDownProp?.(event);\n };\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n rippleRef.current?.onRipple(event);\n };\n\n const Tag = tag ?? (tag || \"button\");\n const classes = cn(\"smwb-tab\", className, {\n \"smwb-tab--active\": isActive,\n \"smwb-tab--stacked\": stacked,\n \"smwb-tab--disabled\": disabled,\n });\n\n return (\n <Tag\n ref={ref}\n className={classes}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n role={\"tab\"}\n aria-selected={isActive}\n aria-disabled={disabled || undefined}\n tabIndex={isActive ? 0 : -1}\n disabled={Tag === \"button\" ? disabled : undefined}\n {...rest}\n >\n <span className=\"smwb-tab__content\" ref={contentRef as React.Ref<HTMLSpanElement>}>\n {icon && <span className=\"smwb-tab__icon\">{icon}</span>}\n {label && <span className=\"smwb-tab__text-label\">{label}</span>}\n </span>\n <Ripple actionRef={rippleRef} classes={{ child: \"tab__ripple-child\" }} />\n </Tag>\n );\n});\n","import { ExtractPropertyNamesByType } from \"./types/extractPropertyNamesByType\";\nimport { WritableKeys } from \"./types/writableKeys\";\n\nconst easeInOutSin = (time: number) => {\n return (1 + Math.sin(Math.PI * time - Math.PI / 2)) / 2;\n};\n\ninterface Options {\n ease?: (time: number) => number;\n\n duration?: number;\n}\n\nexport function animate(\n element: HTMLElement,\n property: NonNullable<ExtractPropertyNamesByType<Pick<HTMLElement, WritableKeys<HTMLElement>>, number>>,\n to: number,\n options: Options = {},\n cb: (arg: null | Error) => void = () => {\n // empty\n }\n) {\n const { ease = easeInOutSin, duration = 300 } = options;\n\n let start: DOMHighResTimeStamp | null = null;\n const from = element[property];\n let cancelled = false;\n\n const cancel = () => {\n cancelled = true;\n };\n\n const step = (timestamp: DOMHighResTimeStamp) => {\n if (cancelled) {\n cb(new Error(\"Animation cancelled\"));\n return;\n }\n\n if (start === null) {\n start = timestamp;\n }\n\n const time = Math.min(1, (timestamp - start) / duration);\n element[property] = ease(time) * (to - from) + from;\n\n if (time >= 1) {\n requestAnimationFrame(() => {\n cb(null);\n });\n return;\n }\n\n requestAnimationFrame(step);\n };\n\n if (from === to) {\n cb(new Error(\"Element already at target position\"));\n return cancel;\n }\n\n requestAnimationFrame(step);\n return cancel;\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { debounce } from \"../../../utils/debounce\";\nimport { Tab, TabProps } from \"./tab/tab\";\nimport { useEventCallback } from \"../../../hooks/useEventCallback\";\nimport { setRef } from \"../../../utils/setRef\";\nimport { animate } from \"../../../utils/animate\";\n\nexport interface TabsProps {\n value: number;\n onChange: (e: React.MouseEvent<HTMLButtonElement>, index: number) => void;\n indicatorContent?: boolean;\n scrollable?: boolean;\n className?: string;\n children?: React.ReactNode;\n /** Accessible label for the tab list. */\n \"aria-label\"?: string;\n}\n\ninterface IndicatorStyle {\n root: {\n left: number;\n width: number;\n };\n content?: {\n width: number;\n };\n}\n\nconst defaultIndicatorStyle = {\n root: {},\n content: {},\n} as IndicatorStyle;\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(function Tabs(props, ref) {\n const {\n className,\n children,\n onChange,\n value,\n indicatorContent = false,\n scrollable = false,\n \"aria-label\": ariaLabel,\n ...rest\n } = props;\n const [mounted, setMounted] = React.useState(false);\n const [indicatorStyle, setIndicatorStyle] = React.useState<IndicatorStyle>(defaultIndicatorStyle);\n\n const tabsRef = React.useRef<HTMLDivElement>(null);\n const tabListRef = React.useRef<HTMLDivElement>(null);\n const contentTabsRef = React.useRef<HTMLSpanElement[]>([]);\n\n // Видимость следующего таба в пикселях\n const viewNextTabInPixels = 40;\n\n const getTabsMeta = () => {\n const tabsNode = tabsRef.current;\n\n let tabsMeta;\n\n if (tabsNode) {\n const rect = tabsNode.getBoundingClientRect();\n\n tabsMeta = {\n clientWidth: tabsNode.clientWidth,\n scrollLeft: tabsNode.scrollLeft,\n scrollTop: tabsNode.scrollTop,\n scrollWidth: tabsNode.scrollWidth,\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n };\n }\n\n let tabMeta: DOMRect | null = null;\n let tabContentMeta: DOMRect | null = null;\n\n if (!tabListRef.current) {\n console.error(\"tabListRef.current is undefined\");\n }\n if (tabsNode && tabListRef.current) {\n const children = tabListRef.current.children;\n\n if (children.length > 0) {\n const tab = children[value];\n\n tabMeta = tab ? tab.getBoundingClientRect() : null;\n\n if (indicatorContent) {\n tabContentMeta = contentTabsRef.current[value] ? contentTabsRef.current[value].getBoundingClientRect() : null;\n }\n }\n }\n return { tabsMeta, tabMeta, tabContentMeta };\n };\n\n const updateIndicatorState = useEventCallback(() => {\n const { tabsMeta, tabMeta, tabContentMeta } = getTabsMeta();\n let startValue = 0;\n\n if (tabMeta && tabsMeta) {\n startValue = 1 * (tabMeta.left - tabsMeta.left + tabsMeta.scrollLeft);\n }\n\n const newIndicatorStyle: IndicatorStyle = {\n root: {\n left: startValue,\n width: tabMeta ? tabMeta.width : 0,\n },\n };\n\n if (indicatorContent && tabContentMeta) {\n newIndicatorStyle.content = {\n width: tabContentMeta.width,\n };\n }\n\n if (isNaN(indicatorStyle.root.left) || isNaN(indicatorStyle.root.width)) {\n setIndicatorStyle(newIndicatorStyle);\n } else {\n const dStart = Math.abs(indicatorStyle.root.left - newIndicatorStyle.root.left);\n const dSize = Math.abs(indicatorStyle.root.width - newIndicatorStyle.root.width);\n\n if (dStart >= 1 || dSize >= 1) {\n setIndicatorStyle(newIndicatorStyle);\n }\n }\n });\n\n const scroll = (scrollValue: number, { animation = true } = {}) => {\n if (!tabsRef.current) {\n return;\n }\n if (animation) {\n animate(tabsRef.current, \"scrollLeft\", scrollValue, {\n duration: 300,\n });\n } else {\n tabsRef.current.scrollLeft = scrollValue;\n }\n };\n\n const scrollSelectedIntoView = useEventCallback((animation: boolean) => {\n const { tabsMeta, tabMeta } = getTabsMeta();\n\n if (!tabMeta || !tabsMeta) {\n return;\n }\n\n if (tabMeta.left < tabsMeta.left) {\n // Левая сторона таба не видна.\n const nextScrollStart = tabsMeta.scrollLeft + (tabMeta.left - tabsMeta.left);\n scroll(nextScrollStart - viewNextTabInPixels, { animation });\n } else if (tabMeta.right > tabsMeta.right) {\n // Правая сторона таба не видна.\n const nextScrollStart = tabsMeta.scrollLeft + (tabMeta.right - tabsMeta.right);\n scroll(nextScrollStart + viewNextTabInPixels, { animation });\n }\n });\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n React.useEffect(() => {\n updateIndicatorState();\n });\n\n React.useEffect(() => {\n const onResize = debounce(() => {\n if (tabsRef.current) {\n updateIndicatorState();\n }\n }, 166);\n if (!tabsRef.current || !tabsRef.current.ownerDocument.defaultView) {\n console.error(`tabsRef.current.ownerDocument.defaultView is undefined`);\n return;\n }\n const window: Window & typeof globalThis = tabsRef.current.ownerDocument.defaultView;\n\n window.addEventListener(\"resize\", onResize);\n\n let resizeObserver: ResizeObserver;\n\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(onResize);\n\n Array.from(tabListRef.current?.children ?? []).forEach((child) => {\n resizeObserver.observe(child);\n });\n }\n\n return () => {\n onResize.cancel();\n\n window.removeEventListener(\"resize\", onResize);\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n };\n }, [updateIndicatorState]);\n\n React.useEffect(() => {\n // Не анимировать при первом рендере\n scrollSelectedIntoView(defaultIndicatorStyle !== indicatorStyle);\n }, [scrollSelectedIntoView, indicatorStyle]);\n\n const tabs = React.Children.map(\n children as React.ReactElement<TabProps>[],\n (child: React.ReactElement<TabProps>, index) =>\n React.cloneElement(child, {\n isActive: value === index,\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n onChange(event, index);\n },\n ...(indicatorContent && {\n contentRef: (ref: HTMLSpanElement) => {\n const { contentRef } = child.props;\n\n contentTabsRef.current.push(ref);\n\n if (contentRef) {\n setRef(contentRef as React.Ref<unknown>, ref);\n }\n },\n }),\n } as TabProps)\n );\n\n return (\n <div className={cn(\"smwb-tabs\", className)} role={\"tabpanel\"} ref={ref} {...rest}>\n <div\n className={cn(\"smwb-tabs__scroller\", {\n \"smwb-tabs__scroller--scrollable\": scrollable,\n })}\n ref={tabsRef}\n >\n <div className=\"smwb-tabs__scroll-area\" ref={tabListRef} role=\"tablist\" aria-label={ariaLabel}>\n {tabs}\n </div>\n {mounted && (\n <span className=\"smwb-tabs__indicator\" style={indicatorStyle.root}>\n <span className=\"smwb-tabs__indicator-content\" style={indicatorStyle.content} />\n </span>\n )}\n </div>\n </div>\n );\n});\n\nexport { Tab };\nexport type { TabProps };\n"],"names":["Observable","value","cb","l","useObservable","observable","val","setVal","useState","useEffect","useSafeLayoutEffect","React","Theme","themeStorageKey","themeObservable","useTheme","theme","firstUpdate","useRef","savedTheme","defaultTheme","themeListener","event","useControllableState","defaultValue","onChange","isControlled","internal","setInternal","current","currentRef","onChangeRef","setValue","useCallback","next","prev","resolved","_a","useId","idProp","prefix","generated","useReactId","FOCUSABLE","useFocusTrap","containerRef","active","restoreFocus","autoFocus","prevFocused","container","focusables","el","first","onKeyDown","items","last","activeEl","useRovingTabIndex","count","activeIndex","onMove","orientation","loop","isDisabled","horiz","vert","target","clamp","i","guard","step","useVirtualList","itemCount","itemHeight","viewportHeight","overscan","scrollTop","setScrollTop","onScroll","useMemo","safeItemHeight","visibleCount","startIndex","endIndex","Icon","forwardRef","className","weight","fill","size","grade","name","color","title","props","ref","decorative","colorClass","jsx","cn","Ripple","actionRef","classes","center","style","duration","rest","ripples","setRipples","nextKey","rect","diameter","radius","coordX","coordY","prevRipples","setRef","useForkRef","refs","instance","isNumber","n","number","isPercentage","height","hideContent","element","showContent","ANIMATION_STATE_CLASSES","getStaticStateClasses","animationStateClasses","classNames","AnimateHeight","animateOpacity","applyInlineTransitions","children","contentClassName","userDelay","userDuration","easing","onHeightAnimationEnd","onHeightAnimationStart","prevHeight","contentElement","rootElement","forkedRootRef","animationClassesTimeoutID","timeoutID","stateClasses","delay","initHeight","initOverflow","currentHeight","setCurrentHeight","overflow","setOverflow","useTransitions","setUseTransitions","animationStateClassNames","setAnimationStateClassNames","contentHeight","totalDuration","newHeight","timeoutHeight","timeoutOverflow","timeoutUseTransitions","isCurrentHeightAuto","newAnimationStateClassNames","timeoutAnimationStateClasses","componentStyle","contentStyle","ariaHidden","Accordion","isOpenByDefault","open","disabled","icon","startAdornment","noIcon","onToggleClick","internalOpen","setInternalOpen","isOpen","baseId","contentId","headerId","arrowIconClasses","toggle","e","jsxs","Button","label","variant","iconProps","href","onMouseDownProp","fullWidth","rippleCenter","disableRipple","colorTheme","colorProp","rippleRef","onMouseDown","onPointerDown","rippleElement","iconElement","DEFAULT_LABELS","resolveChildren","ctx","resolveControls","controls","ExpansionPanel","header","modeProp","defaultMode","onModeChange","disableExpand","noControls","renderControls","closeOnOutsideClick","closeOnEsc","labels","mode","setMode","domRoot","setDomRoot","effectiveMode","isFullRow","isFullscreen","toggleRow","openFullscreen","closeFullscreen","controlsContext","overlay","defaultControls","Fragment","renderControlBar","content","card","createPortal","ChatIconButton","edge","FloatingButton","type","hasValue","isFilled","obj","TextFieldAdornment","position","disablePointerEvents","inline","TextFieldWrapper","helperText","error","isFilledState","isFocused","htmlFor","shrink","onHolderMouseDown","endAdornment","isFilledVariant","isNotchedActive","labelClasses","notchedClasses","TextField","required","onChangeProp","onFocusProp","onBlurProp","readOnly","placeholder","id","autoComplete","inputMode","setIsFocused","setIsFilledState","inputRef","inputForkRef","onFocus","onBlur","checkDirty","filled","inputClasses","CHAT_MESSAGE_DELIVERY_STATUSES","CHAT_MESSAGE_STATUS_ICONS","CHAT_MESSAGE_STATUS_LABELS","CHAT_EXPAND_LAYOUTS","CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES","isChatMessageDeliveryStatus","status","resolveChatMessageStatusIcon","icons","custom","resolveChatMessageStatusLabel","isImageAttachment","attachment","formatChatTimestamp","date","resolveAllowedLayouts","input","pickInitialLayout","allowed","preferred","getChatLayoutActions","allowedLayouts","currentLayout","shouldShowChatCloseButton","options","shouldComposerNewlineOnEnter","shiftEnterNewline","ctrlEnterNewline","isCtrl","stopPropagation","insertNewlineAtCursor","start","end","_b","nextValue","ChatComposer","onSendMessage","sendAriaLabel","fileUpload","attachInputId","onAttachClick","attachAriaLabel","inputId","textareaRef","multiline","canSend","showAttach","handleSend","text","handleKeyDown","attachClassName","attachButton","sendButton","layoutIcons","layoutAriaLabels","ChatHeader","subtitle","actions","layout","onLayoutChange","onClose","layoutActions","showLayoutActions","defaultTag","Typography","align","gutterBottom","noWrap","component","Tag","ChatAttachmentImage","setOpen","nodeRef","CSSTransition","ChatAttachments","attachments","enabled","isPresetSize","Avatar","src","alt","imgProps","imgFailed","setImgFailed","showImage","avatarClassName","inlineStyle","AvatarGroup","max","total","onSurplusClick","Children","isValidElement","totalCount","clampedMax","visible","surplus","ChatMessageAvatar","author","ChatMessageStatus","message","statusIcons","renderStatus","iconName","ChatMessageBubble","timestamp","showAvatars","showAttachments","showStatus","bubbleClassName","time","deliveryStatus","shouldShowStatus","ChatMessageIncoming","ChatMessageOutgoing","ChatMessageSystem","ChatMessageItem","renderMessage","toCssSize","Skeleton","width","animation","animationDelay","skeletonClassName","renderOne","_","ChatMessageSkeleton","showAvatar","lines","bubbleWidth","useChatInfiniteScroll","onLoadMore","hasMore","loading","rootMargin","sentinelRef","loadingRef","root","sentinel","observer","entries","entry","isScrolledToBottom","threshold","scrollChatToBottom","useChatStickToBottom","messages","isAtBottomRef","previousScrollHeightRef","previousFirstMessageIdRef","previousLastMessageIdRef","handleScroll","previousScrollHeight","previousFirstMessageId","previousLastMessageId","firstMessageId","lastMessageId","prepended","appended","ChatMessages","loadingMore","loadingSkeletonCount","showSkeletons","skeletonAligns","index","ChatShell","anchor","themeMode","embedded","overlayContext","footer","fileDropzoneRootProps","fileDropzoneActive","dropzoneClassName","dropzoneRootProps","panel","resolveChatFileUploadMaxFiles","maxFiles","useChatFileUpload","accept","onUploadFiles","resolvedMaxFiles","getRootProps","getInputProps","isDragActive","useDropzone","files","Chat","headerTitle","headerSubtitle","headerActions","allowedLayoutsProp","layoutProp","defaultLayout","openProp","defaultOpen","onOpenChange","floatingTrigger","triggerIcon","triggerLabel","composerPlaceholder","composerDisabled","composerShiftEnterNewline","composerCtrlEnterNewline","fileUploadAccept","fileUploadMaxFiles","showCloseButton","setLayout","effectiveLayout","handleOpen","handleClose","handleLayoutChange","fileUploadEnabled","showComposer","fileInput","resolvedFooter","chatBody","closeButtonVisible","len","floatingAnchorForSide","side","ChatLayout","chatClassName","chatWidth","collapsedProp","defaultCollapsed","onCollapsedChange","collapseAriaLabel","expandAriaLabel","floatingAnchor","chat","collapsed","setCollapsed","floatingOpen","setFloatingOpen","dockIcon","collapseIcon","collapseButton","expandButton","dockedHeaderActions","floatingHeaderActions","cssVars","Badge","badgeContent","vertical","horizontal","showZero","badgeAriaLabel","isZero","hidden","display","badgeClassname","Card","onClick","interactive","Chip","deleteIcon","onDelete","onDeleteMouseDownProp","asLink","selected","deleteAriaLabel","onDeleteMouseDown","deleteBtn","inner","clickable","ChipGroup","multiple","selectedValues","isSelected","option","v","LazyImage","fallback","lazy","aspectRatio","onError","failed","setFailed","setVisible","imgRef","setRefs","io","showFallback","handleError","ThumbCard","caption","onSelect","hoverPreview","topStart","topEnd","hoverDelay","cardRef","preview","setPreview","timer","clearTimer","onEnter","onLeave","AssetGrid","renderItem","minColumn","rowHeight","gap","loadingCount","emptyLabel","viewportRef","setWidth","setHeight","ready","setReady","ro","cols","rowCount","vl","plainStyle","rowStyle","body","r","row","c","item","ModalBase","backdrop","asForm","disableAppearAnimation","role","contentRef","forkedContentRef","Component","Header","Content","Footer","Modal","getActiveSlideDotsLength","slidesCount","slidesToShow","dots","getSlideIndexForMultipleParts","isNextSlideDisabled","dotsLength","isReactEvent","isMouseEvent","isTouchEvent","dragPrevent","getSlideStyle","getSlideWidth","getSlidesToShow","min","toCssLength","toCssNumber","getStartSlide","startSlide","maxIndex","useEventCallback","fn","args","MOTION_INITIAL_STATE","TAP_THRESHOLD","FLICK_VELOCITY","Carousel","slidesToShowProp","startSlideProp","showNavigation","showArrowsProp","arrowsSize","navigationClassName","onSlideChange","navigationDotRenderer","ariaLabel","autoplay","autoplayInterval","pauseOnHover","cellHeight","maxWidth","enableFullscreen","showArrows","maxShift","activeSlideIndex","setActiveSlideIndex","shiftState","setShiftState","dragPx","setDragPx","isDragging","setIsDragging","fullscreenIndex","setFullscreenIndex","fullscreenDragPx","setFullscreenDragPx","isFullscreenDragging","setIsFullscreenDragging","rootRef","outerRef","forkedOuterRef","trackRef","isHovered","setIsHovered","motion","prevState","setMotion","now","goToSlide","moveFullscreen","direction","fullscreenTouchX","detachListeners","isMouse","onEnd","onStart","clientX","clientY","shiftX","shiftY","axis","atStart","atEnd","offset","dragged","startX","lastX","lastT","totalShift","widthPerSlide","velocity","movedSlides","onSlideClick","onNavigationItemClick","getNextIndex","isSingleSlide","totalGroups","nextIndex","getNavigation","isSinglePartSlide","indicators","currentIndex","isLast","isActive","indicator","getIndent","shiftSlides","slideId","slideStyle","layerStyle","rootStyle","cellHeightValue","aspectRatioValue","gapValue","maxWidthValue","childrenArray","onFullscreenTouchStart","onFullscreenTouchMove","delta","onFullscreenTouchEnd","fullscreenTrackStyle","child","useModalState","setIsOpen","onOpen","ImagesListContext","ImagesListItem","rounded","itemBarContent","rows","itemBarPlacement","rowsHeight","useContext","ImagesListItemModal","ImagesList","ListItem","dense","divider","List","subheader","TablePagination","limit","page","onPrev","onNext","limitOptions","onLimitChange","hasNextPage","isInfiniteMode","isDisabledNext","handleLimitChange","handlePrev","handleNext","renderCountText","from","to","opt","Table","hovered","paginationSettings","isLoading","stickyHeader","TableBody","TableCell","cellAlign","TableHead","TableHeadCell","isSortedByAsc","isSortedByDesc","sortable","sortDirection","onSort","ariaSort","TableRow","expanded","TreeView","listIcon","nodeIcon","data","defaultExpanded","onExpandedChange","defaultSelected","onSelectedChange","selectable","checkboxes","renderLabel","loadChildren","loadedChildren","setLoadedChildren","loadingIds","setLoadingIds","expandedIds","setExpandedIds","selectedIds","setSelectedIds","toggleExpanded","x","has","toggleSelected","ensureLoaded","nodeId","renderNode","path","resolvedChildren","isLazy","hasChildNodes","onLabelClick","idx","tree","d","node","mapEventPropToEvent","eventProp","clickedRootScrollbar","doc","ClickAwayListener","disableReactTree","mouseEvent","onClickAway","touchEvent","movedRef","activatedRef","syntheticEventRef","handleRef","handleClickAway","insideReactTree","insideDOM","createHandleSynthetic","handlerName","childrenPropsHandler","childrenProps","mappedTouchEvent","handleTouchMove","mappedMouseEvent","MessageContainer","severity","closeAriaLabel","resolvedSeverity","messageClassnames","Message","SaveAssetDialog","nameLabel","onNameChange","previewSrc","onCapture","captureLabel","busy","confirmLabel","cancelLabel","onConfirm","showNameField","ProgressIndicator","progressValue","ariaProps","CircularProgress","circleRef","circleRadius","circleLength","useSnackbarsPortal","domElement","setDomElement","v4","SnackTransition","snack","autoClose","autoCloseTime","snackRest","onSnackRemove","Snackbar","_c","_d","_e","SnackbarContext","createContext","SnackbarProvider","closeOnClick","snacks","setSnacks","snackbarDomRoot","addSnackbar","key","clearAllSnackbars","clearFirstSnackbar","clearLastSnackbar","clearByIdSnackbar","currentPositions","acc","currentPosition","snackbars","TransitionGroup","isAutoClose","action","timerClose","setCloseTimer","Element","useSnackbar","resolvePlacement","placement","alignment","autoPlacement","FLOATING_OFFSET_PX","FLOATING_SHIFT_PADDING_PX","buildFloatingMiddleware","flip","shift","Tooltip","trigger","openDelay","closeDelay","hoverOpen","setHoverOpen","clickOpen","setClickOpen","openTimerRef","closeTimerRef","clearTimers","scheduleOpen","scheduleClose","floatingStyles","useFloating","autoUpdate","offsetMiddleware","isVisible","onPointerEnter","onPointerLeave","ButtonGroup","_f","Checkbox","indeterminate","handleChange","DatePickerIconButton","DatePickerActionLabel","onLeftIconClick","onRightIconClick","hiddenSwitches","dataToggleId","switchClasses","DATE_TOKEN_REGEXP","extractTokens","pattern","tokens","match","escapeRegExp","patternToRegExp","regex","lastIndex","isValidCalendarDate","year","month","day","formatDateByPattern","token","parseDateByPattern","part","isDatePatternMatch","startOfWeek","weekStart","weekDay","diff","endOfWeek","eachDayOfInterval","dates","startDate","endTime","currentDate","getDayNames","weekStartsOn","locale","formatter","startOfMonth","_date","endOfMonth","setMaxTime","isBefore","date1","date2","isAfter","addDays","days","getWeeks","nestedWeeks","lastDay","weekNumber","isSameMonth","resetTime","isSameDay","addMonths","months","setMonth","addYears","years","setYear","endOfDay","startOfDay","getMonths","getYears","currentYear","range","getMonthLabel","getYearLabel","getDisplayDate","format","isValidDate","getCurrentFormatDate","parts","MASK_DATE_REGEXP","MASK_TOKEN_REGEXP","getMaskFormat","maskedDateFormatter","mask","outputCharIndex","char","inputCharIndex","maskChar","nextMaskChar","acceptedChar","formattedChar","isDateMatch","getDateByFormat","parsed","DataPickerHeader","viewValue","openView","onMonthLabelClick","onYearLabelClick","onMonthIconClick","onYearIconClick","OpenView","DatePickerDay","outside","inRange","DataPickerDays","showDaysOutsideMonth","disablePast","disableFuture","minDate","maxDate","isDateDisabled","rangeStart","rangeEnd","dayNames","weeks","isInRange","isDisabledDay","weekDays","week","isOutside","MenuContext","useMenuContext","MenuItem","onClickProp","linkElement","linkProps","optionRenderer","MenuItemIcon","MenuItemText","inset","classnames","MenuDivider","MenuList","buildMenuFloatingMiddleware","defaultStyle","transitionStyles","MenuFloating","anchorElement","middleware","menuElement","setMenuElement","menuRef","onAwayClick","Transition","state","MenuSubmenu","toggleElement","onCloseProp","openOnHover","setAnchorElement","contextValue","onToggle","onToggleKeyDown","typed","MenuComponent","domProps","Menu","DatePickerList","valueProp","overflowRef","selectedItemRef","middle","onItemClick","defaultFormatDate","useDateInput","currentFormatDate","displayedValue","setDisplayedValue","maskFormat","prevValue","isValueChanged","rifmProps","useRifm","DataPickerInput","disableCalendar","calendarIcon","maskedProps","DatePicker","calendarAriaLabel","rangeValue","onRangeChange","isRangeControlled","rangeState","setRangeState","currentRange","setViewValue","setOpenView","anchorRef","calendarRef","anchorForkRef","calendarForkRef","onViewValueChange","onMonthChange","onYearChange","view","rangeDisplay","DATETIME_TOKEN_REGEXP","isValidTime","hours","minutes","seconds","formatDateTimeByPattern","parseDateTimeByPattern","isDateTimePatternMatch","getDisplayDateTime","getCurrentDateTimeFormat","getDateTimeMaskFormat","getDateTimeByFormat","useDateTimeInput","currentFormat","DateTimePickerInput","TimePickerList","TIME_TOKEN_REGEXP","patternHasSeconds","formatTimeByPattern","parseTimeByPattern","isTimePatternMatch","MASK_DIGIT_REGEXP","DEFAULT_TIME_FORMAT","getHoursList","getMinutesList","getSecondsList","setTime","getDisplayTime","isValidTimeDate","getCurrentTimeFormat","getTimeMaskFormat","maskedTimeFormatter","isTimeMatch","getTimeByFormat","mergeTime","baseDate","timeDate","mergeDate","timeSource","TimePickerColumns","onComplete","timeFormat","showSeconds","onHourChange","hour","onMinuteChange","minute","onSecondChange","second","DateTimePicker","popupRef","popupForkRef","emitChange","onDateChange","_event","onTimeChange","dateSource","resolvedTimeFormat","defaultFormatTime","useTimeInput","currentFormatTime","TimePickerInput","disableClock","clockIcon","TimePicker","clockAriaLabel","clockRef","clockForkRef","RadioButton","Rating","precision","emptyIcon","hover","setHover","valueFromEvent","starIndex","left","isLeftHalf","handleSelect","filledIcon","blankIcon","commit","clamped","fillRatio","DropdownMenu","menuMaxHeight","menuMiddleware","search","onSearchInputChange","searchValue","anchorElementRef","menuNoItemsMessage","createOption","virtualized","valueArray","hasGroups","lastGroup","useVirtual","totalHeight","offsetY","menuMinWidth","setMenuMinWidth","SelectArrowIcon","ClearIcon","stopEvent","SelectField","menuContainer","chips","isFocusedProp","onSearch","resetSearch","hideSelectArrowIcon","clearable","creatable","onCreate","valueState","setValueState","selectedItems","setSelectedItems","initialValue","setSearchValue","forkedAnchorRef","searchWrapperRef","searchInputRef","updateValue","newValue","newSelectedItem","itemIndex","onDeleteChip","currentValue","newSelectedItems","onResetSelected","displayValues","toPercent","precisionRound","factor","decimatedClamp","prec","decimatedOffset","decimatedRange","rescale","scaled","resolveMarks","marks","s","result","RangeSlider","getAriaValueText","valueField","withTicks","isVertical","normalize","arr","lo","hi","activeThumb","isPressedRef","markList","positionToValue","y","moveThumb","raw","pickThumb","onMouseMove","onMouseEnd","onTouchStartNative","onThumbKeyDown","p0","p1","startPct","spanPct","mainStart","mainEnd","trackStyle","m","mp","SingleSlider","singleDefault","singleValueProp","setIsActive","isDiscrete","offsetToValue","absolute","containerSize","absolutePosition","onTouchStart","touch","removeListeners","handleArrowsControls","handleBlur","pct","thumbStyle","getTicks","t","Slider","formatReadout","readout","ValueSlider","onReset","resetLabel","sliderProps","hasReadout","showHeader","Toggle","checked","labelPlacement","Grid","wrapOptions","justifyContentOptions","alignItemsOptions","directionOptions","Row","justifyContent","alignItems","wrap","spacing","isJustifyContent","isAlignItems","isDirection","isFlexWrap","hiddenClasses","bp","Column","xs","sm","md","lg","xl","xsOffset","smOffset","mdOffset","lgOffset","xlOffset","Container","disableGutters","colorVar","Divider","textAlign","thickness","flexItem","hasText","dividerStyle","dividerClassName","throttle","wait","lastCall","lastArgs","invoke","throttled","remaining","getInitialDivider","sizeFirst","sizeSecond","ScreenDivider","onSizeChange","keyboardStep","resizerAriaLabel","wrapperRef","forkedWrapperRef","setDivider","currentElement","setCurrentElement","handleDragStart","dragOverHandler","wrapper","cursor","handleDragEnd","onResizerKeyDown","decreaseKey","increaseKey","secondChildStyle","firstChildStyle","Sheet","disableOutsideClick","handleSizeButton","SheetBlock","isVerticalAxis","withSizeToggle","hideHeaderActions","reverseHeaderActions","resizable","minSize","maxSize","resizeStep","resizeHandleAriaLabel","onResize","showActions","headerActionNodes","forkRef","dragSize","setDragSize","px","viewport","currentSizePx","applySize","dragRef","onPointerMove","drag","grow","endDrag","onHandleKeyDown","base","incKey","decKey","sizeStyle","flexAlign","resolveGap","Stack","justify","Page","PageHeader","breadcrumbs","AppLayout","sidebar","sidebarWidth","sidebarCollapsed","defaultSidebarCollapsed","onSidebarCollapsedChange","collapsible","collapseToggle","collapseToggleAriaLabel","sidebarCollapsedWidth","sidebarId","AppBar","leftContent","midContent","midContentAlign","rightContent","MainTag","Breadcrumbs","separator","maxItems","itemsBeforeCollapse","itemsAfterCollapse","expandedProp","onExpand","expandLabel","internalExpanded","setInternalExpanded","crumbs","handleExpand","rendered","crumb","buildItems","siblingCount","boundaryCount","startPages","endPages","siblingsStart","siblingsEnd","Pagination","shape","showFirstButton","showLastButton","hidePrevButton","hideNextButton","navRef","mergedRef","go","buttons","navButton","Stepper","steps","activeStep","alternativeLabel","onStepClick","completed","onStepKeyDown","OverflowMenu","close","Sidebar","menuItems","activeItemProp","defaultActiveItem","onActiveItemChange","activeItemState","setActiveItemState","activeItem","effectiveVariant","as","ElementType","BottomBar","overflowMenuAriaLabel","overflowOpen","setOverflowOpen","overflowAnchor","setOverflowAnchor","safeVisibleCount","visibleItems","overflowItems","hasOverflow","overflowActive","setActive","activateItem","onOverflowToggle","onOverflowClose","BarItem","debounce","debounced","Tab","stacked","tag","easeInOutSin","animate","property","ease","cancelled","cancel","defaultIndicatorStyle","Tabs","indicatorContent","scrollable","mounted","setMounted","indicatorStyle","setIndicatorStyle","tabsRef","tabListRef","contentTabsRef","viewNextTabInPixels","getTabsMeta","tabsNode","tabsMeta","tabMeta","tabContentMeta","tab","updateIndicatorState","startValue","newIndicatorStyle","dStart","dSize","scroll","scrollValue","scrollSelectedIntoView","nextScrollStart","window","resizeObserver","tabs"],"mappings":"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"}