@smwb/ui-react 2.6.3 → 2.8.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.
- package/AI_LESS_OVERRIDES.md +4 -2
- package/AI_THEMING.md +17 -1
- package/README.md +111 -35
- package/dist/assets/styles/less/components/accordion/accordion.entry.css +1 -1
- package/dist/assets/styles/less/components/avatar/avatar.entry.css +1 -1
- package/dist/assets/styles/less/components/card/card.entry.css +1 -1
- package/dist/assets/styles/less/components/chart/chart.entry.css +1 -0
- package/dist/assets/styles/less/components/checkbox/checkbox.entry.css +1 -1
- package/dist/assets/styles/less/components/chip/chip.entry.css +1 -1
- package/dist/assets/styles/less/components/descriptionList/descriptionList.entry.css +1 -0
- package/dist/assets/styles/less/components/emptyState/emptyState.entry.css +1 -0
- package/dist/assets/styles/less/components/kanban/kanban.entry.css +1 -0
- package/dist/assets/styles/less/components/menu/menu.entry.css +1 -1
- package/dist/assets/styles/less/components/meter/meter.entry.css +1 -0
- package/dist/assets/styles/less/components/personChip/personChip.entry.css +1 -0
- package/dist/assets/styles/less/components/progressIndicator/progressIndicator.entry.css +1 -1
- package/dist/assets/styles/less/components/radioButton/radioButton.entry.css +1 -1
- package/dist/assets/styles/less/components/rating/rating.entry.css +1 -1
- package/dist/assets/styles/less/components/sectionHeader/sectionHeader.entry.css +1 -0
- package/dist/assets/styles/less/components/selectField/selectField.entry.css +1 -1
- package/dist/assets/styles/less/components/stat/stat.entry.css +1 -0
- package/dist/assets/styles/less/components/stepper/stepper.entry.css +1 -1
- package/dist/assets/styles/less/components/table/table.entry.css +1 -1
- package/dist/assets/styles/less/components/tabs/tab/tab.entry.css +1 -1
- package/dist/assets/styles/less/components/tabs/tabs.entry.css +1 -1
- package/dist/assets/styles/less/components/textField/textField.entry.css +1 -1
- package/dist/assets/styles/less/components/thumbCard/thumbCard.entry.css +1 -1
- package/dist/assets/styles/less/components/timeline/timeline.entry.css +1 -0
- package/dist/assets/styles/less/components/toggle/toggle.entry.css +1 -1
- package/dist/assets/styles/less/components/tooltip/tooltip.entry.css +1 -1
- package/dist/assets/styles/less/components/typography/typography.entry.css +1 -1
- package/dist/assets/styles/less/connects/rt/table.entry.css +1 -0
- package/dist/assets/styles/less/tokens.entry.css +1 -0
- package/dist/chart.d.ts +2 -0
- package/dist/chart.js +8 -0
- package/dist/chart.js.map +1 -0
- package/dist/components/base/icon/icon.d.ts +6 -2
- package/dist/components/base/icon/icon.js +51 -38
- package/dist/components/base/icon/icon.js.map +1 -1
- package/dist/components/base/ripple/ripple.d.ts +3 -0
- package/dist/components/base/ripple/ripple.js +42 -26
- package/dist/components/base/ripple/ripple.js.map +1 -1
- package/dist/components/dataDisplay/accordion/accordion.d.ts +18 -1
- package/dist/components/dataDisplay/accordion/accordion.js +77 -54
- package/dist/components/dataDisplay/accordion/accordion.js.map +1 -1
- package/dist/components/dataDisplay/assetGrid/assetGrid.js +15 -14
- package/dist/components/dataDisplay/assetGrid/assetGrid.js.map +1 -1
- package/dist/components/dataDisplay/avatar/avatar.d.ts +8 -0
- package/dist/components/dataDisplay/avatar/avatar.js +66 -38
- package/dist/components/dataDisplay/avatar/avatar.js.map +1 -1
- package/dist/components/dataDisplay/badge/badge.js +41 -31
- package/dist/components/dataDisplay/badge/badge.js.map +1 -1
- package/dist/components/dataDisplay/card/card.d.ts +30 -2
- package/dist/components/dataDisplay/card/card.js +51 -23
- package/dist/components/dataDisplay/card/card.js.map +1 -1
- package/dist/components/dataDisplay/carousel/carousel.js +80 -79
- package/dist/components/dataDisplay/carousel/carousel.js.map +1 -1
- package/dist/components/dataDisplay/chart/chart.d.ts +67 -0
- package/dist/components/dataDisplay/chart/chart.js +146 -0
- package/dist/components/dataDisplay/chart/chart.js.map +1 -0
- package/dist/components/dataDisplay/chart/chartTheme.d.ts +35 -0
- package/dist/components/dataDisplay/chart/chartTheme.js +74 -0
- package/dist/components/dataDisplay/chart/chartTheme.js.map +1 -0
- package/dist/components/dataDisplay/chart/index.d.ts +4 -0
- package/dist/components/dataDisplay/chat/chat.js +5 -4
- package/dist/components/dataDisplay/chat/chat.js.map +1 -1
- package/dist/components/dataDisplay/chat/chatIconButton.d.ts +1 -1
- package/dist/components/dataDisplay/chat/chatIconButton.js +30 -26
- package/dist/components/dataDisplay/chat/chatIconButton.js.map +1 -1
- package/dist/components/dataDisplay/chat/chatLayout.d.ts +3 -1
- package/dist/components/dataDisplay/chat/chatLayout.js +56 -55
- package/dist/components/dataDisplay/chat/chatLayout.js.map +1 -1
- package/dist/components/dataDisplay/chat/chatOverlayLayout.d.ts +3 -1
- package/dist/components/dataDisplay/chip/chip.d.ts +31 -0
- package/dist/components/dataDisplay/chip/chip.js +112 -84
- package/dist/components/dataDisplay/chip/chip.js.map +1 -1
- package/dist/components/dataDisplay/chipGroup/chipGroup.js +37 -32
- package/dist/components/dataDisplay/chipGroup/chipGroup.js.map +1 -1
- package/dist/components/dataDisplay/descriptionList/descriptionList.d.ts +45 -0
- package/dist/components/dataDisplay/descriptionList/descriptionList.js +43 -0
- package/dist/components/dataDisplay/descriptionList/descriptionList.js.map +1 -0
- package/dist/components/dataDisplay/descriptionList/index.d.ts +2 -0
- package/dist/components/dataDisplay/expansionPanel/expansionPanel.js +145 -99
- package/dist/components/dataDisplay/expansionPanel/expansionPanel.js.map +1 -1
- package/dist/components/dataDisplay/imagesList/imagesList.js +11 -10
- package/dist/components/dataDisplay/imagesList/imagesList.js.map +1 -1
- package/dist/components/dataDisplay/imagesList/imagesListItem/imagesListItem.js +31 -24
- package/dist/components/dataDisplay/imagesList/imagesListItem/imagesListItem.js.map +1 -1
- package/dist/components/dataDisplay/imagesList/imagesListItem/imagesListItemModal.d.ts +1 -1
- package/dist/components/dataDisplay/imagesList/imagesListItem/imagesListItemModal.js +16 -13
- package/dist/components/dataDisplay/imagesList/imagesListItem/imagesListItemModal.js.map +1 -1
- package/dist/components/dataDisplay/kanban/index.d.ts +2 -0
- package/dist/components/dataDisplay/kanban/kanban.d.ts +53 -0
- package/dist/components/dataDisplay/kanban/kanban.js +74 -0
- package/dist/components/dataDisplay/kanban/kanban.js.map +1 -0
- package/dist/components/dataDisplay/lazyImage/lazyImage.js +33 -31
- package/dist/components/dataDisplay/lazyImage/lazyImage.js.map +1 -1
- package/dist/components/dataDisplay/list/list.d.ts +2 -0
- package/dist/components/dataDisplay/list/list.js +17 -15
- package/dist/components/dataDisplay/list/list.js.map +1 -1
- package/dist/components/dataDisplay/meter/index.d.ts +2 -0
- package/dist/components/dataDisplay/meter/meter.d.ts +35 -0
- package/dist/components/dataDisplay/meter/meter.js +63 -0
- package/dist/components/dataDisplay/meter/meter.js.map +1 -0
- package/dist/components/dataDisplay/personChip/index.d.ts +2 -0
- package/dist/components/dataDisplay/personChip/personChip.d.ts +33 -0
- package/dist/components/dataDisplay/personChip/personChip.js +73 -0
- package/dist/components/dataDisplay/personChip/personChip.js.map +1 -0
- package/dist/components/dataDisplay/stat/index.d.ts +2 -0
- package/dist/components/dataDisplay/stat/stat.d.ts +38 -0
- package/dist/components/dataDisplay/stat/stat.js +60 -0
- package/dist/components/dataDisplay/stat/stat.js.map +1 -0
- package/dist/components/dataDisplay/table/table.d.ts +22 -0
- package/dist/components/dataDisplay/table/table.js +42 -32
- package/dist/components/dataDisplay/table/table.js.map +1 -1
- package/dist/components/dataDisplay/table/tableBody.js +10 -4
- package/dist/components/dataDisplay/table/tableBody.js.map +1 -1
- package/dist/components/dataDisplay/table/tableCell.d.ts +11 -1
- package/dist/components/dataDisplay/table/tableCell.js +20 -4
- package/dist/components/dataDisplay/table/tableCell.js.map +1 -1
- package/dist/components/dataDisplay/table/tableColumns.d.ts +83 -0
- package/dist/components/dataDisplay/table/tableColumns.js +112 -0
- package/dist/components/dataDisplay/table/tableColumns.js.map +1 -0
- package/dist/components/dataDisplay/table/tableHead.js +9 -3
- package/dist/components/dataDisplay/table/tableHead.js.map +1 -1
- package/dist/components/dataDisplay/table/tableHeadCell.d.ts +34 -3
- package/dist/components/dataDisplay/table/tableHeadCell.js +61 -36
- package/dist/components/dataDisplay/table/tableHeadCell.js.map +1 -1
- package/dist/components/dataDisplay/table/tablePagination/tablePagination.js +10 -9
- package/dist/components/dataDisplay/table/tablePagination/tablePagination.js.map +1 -1
- package/dist/components/dataDisplay/table/tableRow.d.ts +3 -1
- package/dist/components/dataDisplay/table/tableRow.js +28 -16
- package/dist/components/dataDisplay/table/tableRow.js.map +1 -1
- package/dist/components/dataDisplay/thumbCard/thumbCard.d.ts +44 -3
- package/dist/components/dataDisplay/thumbCard/thumbCard.js +81 -60
- package/dist/components/dataDisplay/thumbCard/thumbCard.js.map +1 -1
- package/dist/components/dataDisplay/timeline/index.d.ts +2 -0
- package/dist/components/dataDisplay/timeline/timeline.d.ts +43 -0
- package/dist/components/dataDisplay/timeline/timeline.js +44 -0
- package/dist/components/dataDisplay/timeline/timeline.js.map +1 -0
- package/dist/components/dataDisplay/treeView/treeView.d.ts +2 -0
- package/dist/components/dataDisplay/treeView/treeView.js +26 -24
- package/dist/components/dataDisplay/treeView/treeView.js.map +1 -1
- package/dist/components/dataDisplay/typography/typography.d.ts +4 -0
- package/dist/components/dataDisplay/typography/typography.js +41 -23
- package/dist/components/dataDisplay/typography/typography.js.map +1 -1
- package/dist/components/feedBack/confirmDialog/confirmDialog.js +14 -13
- package/dist/components/feedBack/confirmDialog/confirmDialog.js.map +1 -1
- package/dist/components/feedBack/emptyState/emptyState.d.ts +28 -0
- package/dist/components/feedBack/emptyState/emptyState.js +37 -0
- package/dist/components/feedBack/emptyState/emptyState.js.map +1 -0
- package/dist/components/feedBack/emptyState/index.d.ts +2 -0
- package/dist/components/feedBack/message/message.d.ts +2 -0
- package/dist/components/feedBack/message/message.js +33 -21
- package/dist/components/feedBack/message/message.js.map +1 -1
- package/dist/components/feedBack/modal/modal.js +44 -43
- package/dist/components/feedBack/modal/modal.js.map +1 -1
- package/dist/components/feedBack/progressIndicator/progressIndicator.d.ts +14 -1
- package/dist/components/feedBack/progressIndicator/progressIndicator.js +72 -40
- package/dist/components/feedBack/progressIndicator/progressIndicator.js.map +1 -1
- package/dist/components/feedBack/saveAssetDialog/saveAssetDialog.js +32 -31
- package/dist/components/feedBack/saveAssetDialog/saveAssetDialog.js.map +1 -1
- package/dist/components/feedBack/skeleton/skeleton.d.ts +10 -2
- package/dist/components/feedBack/skeleton/skeleton.js +40 -36
- package/dist/components/feedBack/skeleton/skeleton.js.map +1 -1
- package/dist/components/feedBack/snackbar/snackbar.js +110 -108
- package/dist/components/feedBack/snackbar/snackbar.js.map +1 -1
- package/dist/components/feedBack/tooltip/tooltip.d.ts +9 -1
- package/dist/components/feedBack/tooltip/tooltip.js +77 -49
- package/dist/components/feedBack/tooltip/tooltip.js.map +1 -1
- package/dist/components/inputs/button/button.d.ts +2 -0
- package/dist/components/inputs/button/button.js +67 -62
- package/dist/components/inputs/button/button.js.map +1 -1
- package/dist/components/inputs/buttonGroups/buttonGroup.d.ts +2 -0
- package/dist/components/inputs/buttonGroups/buttonGroup.js +42 -37
- package/dist/components/inputs/buttonGroups/buttonGroup.js.map +1 -1
- package/dist/components/inputs/checkbox/checkbox.d.ts +10 -0
- package/dist/components/inputs/checkbox/checkbox.js +86 -60
- package/dist/components/inputs/checkbox/checkbox.js.map +1 -1
- package/dist/components/inputs/datePicker/datePicker.js +179 -170
- package/dist/components/inputs/datePicker/datePicker.js.map +1 -1
- package/dist/components/inputs/datePicker/datePickerDay.d.ts +1 -1
- package/dist/components/inputs/datePicker/datePickerDay.js +52 -44
- package/dist/components/inputs/datePicker/datePickerDay.js.map +1 -1
- package/dist/components/inputs/datePicker/datePickerIconButton.d.ts +1 -1
- package/dist/components/inputs/datePicker/datePickerIconButton.js +32 -28
- package/dist/components/inputs/datePicker/datePickerIconButton.js.map +1 -1
- package/dist/components/inputs/dateTimePicker/dateTimePicker.js +165 -157
- package/dist/components/inputs/dateTimePicker/dateTimePicker.js.map +1 -1
- package/dist/components/inputs/fileDrop/fileDrop.js +13 -12
- package/dist/components/inputs/fileDrop/fileDrop.js.map +1 -1
- package/dist/components/inputs/fileInput/fileInput.js +4 -3
- package/dist/components/inputs/fileInput/fileInput.js.map +1 -1
- package/dist/components/inputs/floatingButton/floatingButton.js +34 -31
- package/dist/components/inputs/floatingButton/floatingButton.js.map +1 -1
- package/dist/components/inputs/radioButton/radioButton.d.ts +9 -0
- package/dist/components/inputs/radioButton/radioButton.js +79 -59
- package/dist/components/inputs/radioButton/radioButton.js.map +1 -1
- package/dist/components/inputs/rating/rating.d.ts +8 -0
- package/dist/components/inputs/rating/rating.js +87 -71
- package/dist/components/inputs/rating/rating.js.map +1 -1
- package/dist/components/inputs/selectField/dropdownMenu.d.ts +20 -1
- package/dist/components/inputs/selectField/dropdownMenu.js +265 -109
- package/dist/components/inputs/selectField/dropdownMenu.js.map +1 -1
- package/dist/components/inputs/selectField/optionNavigation.d.ts +17 -0
- package/dist/components/inputs/selectField/optionNavigation.js +38 -0
- package/dist/components/inputs/selectField/optionNavigation.js.map +1 -0
- package/dist/components/inputs/selectField/selectField.d.ts +33 -1
- package/dist/components/inputs/selectField/selectField.js +365 -214
- package/dist/components/inputs/selectField/selectField.js.map +1 -1
- package/dist/components/inputs/slider/slider.d.ts +22 -1
- package/dist/components/inputs/slider/slider.js +332 -262
- package/dist/components/inputs/slider/slider.js.map +1 -1
- package/dist/components/inputs/textField/textField.d.ts +7 -0
- package/dist/components/inputs/textField/textField.js +118 -99
- package/dist/components/inputs/textField/textField.js.map +1 -1
- package/dist/components/inputs/textField/textFieldWrapper.d.ts +15 -1
- package/dist/components/inputs/textField/textFieldWrapper.js +45 -34
- package/dist/components/inputs/textField/textFieldWrapper.js.map +1 -1
- package/dist/components/inputs/textField/utils.d.ts +1 -1
- package/dist/components/inputs/timePicker/timePicker.js +94 -85
- package/dist/components/inputs/timePicker/timePicker.js.map +1 -1
- package/dist/components/inputs/toggle/toggle.d.ts +4 -0
- package/dist/components/inputs/toggle/toggle.js +81 -61
- package/dist/components/inputs/toggle/toggle.js.map +1 -1
- package/dist/components/inputs/valueSlider/valueSlider.d.ts +12 -0
- package/dist/components/inputs/valueSlider/valueSlider.js +24 -22
- package/dist/components/inputs/valueSlider/valueSlider.js.map +1 -1
- package/dist/components/layout/appLayout/appLayout.d.ts +2 -0
- package/dist/components/layout/appLayout/appLayout.js +35 -33
- package/dist/components/layout/appLayout/appLayout.js.map +1 -1
- package/dist/components/layout/divider/divider.d.ts +2 -0
- package/dist/components/layout/divider/divider.js +24 -22
- package/dist/components/layout/divider/divider.js.map +1 -1
- package/dist/components/layout/floatingWindow/floatingWindow.d.ts +2 -0
- package/dist/components/layout/floatingWindow/floatingWindow.js +147 -140
- package/dist/components/layout/floatingWindow/floatingWindow.js.map +1 -1
- package/dist/components/layout/grid/grid.d.ts +12 -1
- package/dist/components/layout/grid/grid.js +50 -34
- package/dist/components/layout/grid/grid.js.map +1 -1
- package/dist/components/layout/page/page.d.ts +2 -0
- package/dist/components/layout/page/page.js +18 -9
- package/dist/components/layout/page/page.js.map +1 -1
- package/dist/components/layout/pageHeader/pageHeader.d.ts +2 -0
- package/dist/components/layout/pageHeader/pageHeader.js +22 -12
- package/dist/components/layout/pageHeader/pageHeader.js.map +1 -1
- package/dist/components/layout/screenDivider/screenDivider.js +19 -18
- package/dist/components/layout/screenDivider/screenDivider.js.map +1 -1
- package/dist/components/layout/sectionHeader/index.d.ts +2 -0
- package/dist/components/layout/sectionHeader/sectionHeader.d.ts +33 -0
- package/dist/components/layout/sectionHeader/sectionHeader.js +77 -0
- package/dist/components/layout/sectionHeader/sectionHeader.js.map +1 -0
- package/dist/components/layout/sheet/sheet.d.ts +2 -0
- package/dist/components/layout/sheet/sheet.js +82 -80
- package/dist/components/layout/sheet/sheet.js.map +1 -1
- package/dist/components/layout/stack/stack.d.ts +2 -0
- package/dist/components/layout/stack/stack.js +33 -20
- package/dist/components/layout/stack/stack.js.map +1 -1
- package/dist/components/navigation/appBar/appBar.d.ts +2 -0
- package/dist/components/navigation/appBar/appBar.js +20 -18
- package/dist/components/navigation/appBar/appBar.js.map +1 -1
- package/dist/components/navigation/bottomBar/bottomBar.js +83 -78
- package/dist/components/navigation/bottomBar/bottomBar.js.map +1 -1
- package/dist/components/navigation/breadcrumbs/breadcrumbs.d.ts +2 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.js +31 -28
- package/dist/components/navigation/breadcrumbs/breadcrumbs.js.map +1 -1
- package/dist/components/navigation/menu/menu.d.ts +12 -0
- package/dist/components/navigation/menu/menu.js +6 -5
- package/dist/components/navigation/menu/menu.js.map +1 -1
- package/dist/components/navigation/menu/menuContext.d.ts +2 -0
- package/dist/components/navigation/menu/menuContext.js.map +1 -1
- package/dist/components/navigation/menu/menuFloating.js +42 -30
- package/dist/components/navigation/menu/menuFloating.js.map +1 -1
- package/dist/components/navigation/menu/menuItem.d.ts +4 -0
- package/dist/components/navigation/menu/menuItem.js +60 -48
- package/dist/components/navigation/menu/menuItem.js.map +1 -1
- package/dist/components/navigation/menu/menuList.d.ts +5 -1
- package/dist/components/navigation/menu/menuList.js +30 -19
- package/dist/components/navigation/menu/menuList.js.map +1 -1
- package/dist/components/navigation/menu/menuSubmenu.js +53 -40
- package/dist/components/navigation/menu/menuSubmenu.js.map +1 -1
- package/dist/components/navigation/overflowMenu/overflowMenu.js +16 -15
- package/dist/components/navigation/overflowMenu/overflowMenu.js.map +1 -1
- package/dist/components/navigation/pagination/pagination.d.ts +2 -0
- package/dist/components/navigation/pagination/pagination.js +53 -50
- package/dist/components/navigation/pagination/pagination.js.map +1 -1
- package/dist/components/navigation/sidebar/sidebar.js +46 -44
- package/dist/components/navigation/sidebar/sidebar.js.map +1 -1
- package/dist/components/navigation/stepper/stepper.d.ts +12 -2
- package/dist/components/navigation/stepper/stepper.js +43 -31
- package/dist/components/navigation/stepper/stepper.js.map +1 -1
- package/dist/components/navigation/tabs/tab/tab.d.ts +2 -0
- package/dist/components/navigation/tabs/tab/tab.js +44 -41
- package/dist/components/navigation/tabs/tab/tab.js.map +1 -1
- package/dist/components/navigation/tabs/tabs.d.ts +18 -0
- package/dist/components/navigation/tabs/tabs.js +139 -87
- package/dist/components/navigation/tabs/tabs.js.map +1 -1
- package/dist/connects/rt/table/draggableHeader.d.ts +1 -1
- package/dist/connects/rt/table/draggableHeader.js.map +1 -0
- package/dist/connects/rt/table/headerCellRenderer.d.ts +9 -0
- package/dist/connects/rt/table/headerCellRenderer.js +51 -0
- package/dist/connects/rt/table/headerCellRenderer.js.map +1 -0
- package/dist/connects/rt/table/table.d.ts +17 -1
- package/dist/connects/rt/table/table.js +194 -0
- package/dist/connects/rt/table/table.js.map +1 -0
- package/dist/connects/rt/table/utils.js.map +1 -0
- package/dist/headless/components/base/icon/icon.js +49 -37
- package/dist/headless/components/base/icon/icon.js.map +1 -1
- package/dist/headless/components/base/ripple/ripple.js +42 -27
- package/dist/headless/components/base/ripple/ripple.js.map +1 -1
- package/dist/headless/components/dataDisplay/accordion/accordion.js +76 -54
- package/dist/headless/components/dataDisplay/accordion/accordion.js.map +1 -1
- package/dist/headless/components/dataDisplay/avatar/avatar.js +62 -35
- package/dist/headless/components/dataDisplay/avatar/avatar.js.map +1 -1
- package/dist/headless/components/dataDisplay/badge/badge.js +37 -28
- package/dist/headless/components/dataDisplay/badge/badge.js.map +1 -1
- package/dist/headless/components/dataDisplay/card/card.js +50 -23
- package/dist/headless/components/dataDisplay/card/card.js.map +1 -1
- package/dist/headless/components/dataDisplay/carousel/carousel.js +55 -55
- package/dist/headless/components/dataDisplay/carousel/carousel.js.map +1 -1
- package/dist/headless/components/dataDisplay/chat/chatIconButton.js +30 -26
- package/dist/headless/components/dataDisplay/chat/chatIconButton.js.map +1 -1
- package/dist/headless/components/dataDisplay/chat/chatLayout.js +56 -55
- package/dist/headless/components/dataDisplay/chat/chatLayout.js.map +1 -1
- package/dist/headless/components/dataDisplay/chip/chip.js +108 -81
- package/dist/headless/components/dataDisplay/chip/chip.js.map +1 -1
- package/dist/headless/components/dataDisplay/chipGroup/chipGroup.js +35 -31
- package/dist/headless/components/dataDisplay/chipGroup/chipGroup.js.map +1 -1
- package/dist/headless/components/dataDisplay/descriptionList/descriptionList.js +41 -0
- package/dist/headless/components/dataDisplay/descriptionList/descriptionList.js.map +1 -0
- package/dist/headless/components/dataDisplay/expansionPanel/expansionPanel.js +143 -98
- package/dist/headless/components/dataDisplay/expansionPanel/expansionPanel.js.map +1 -1
- package/dist/headless/components/dataDisplay/imagesList/imagesListItem/imagesListItem.js +29 -23
- package/dist/headless/components/dataDisplay/imagesList/imagesListItem/imagesListItem.js.map +1 -1
- package/dist/headless/components/dataDisplay/imagesList/imagesListItem/imagesListItemModal.js +16 -13
- package/dist/headless/components/dataDisplay/imagesList/imagesListItem/imagesListItemModal.js.map +1 -1
- package/dist/headless/components/dataDisplay/kanban/kanban.js +72 -0
- package/dist/headless/components/dataDisplay/kanban/kanban.js.map +1 -0
- package/dist/headless/components/dataDisplay/lazyImage/lazyImage.js +30 -29
- package/dist/headless/components/dataDisplay/lazyImage/lazyImage.js.map +1 -1
- package/dist/headless/components/dataDisplay/list/list.js +15 -14
- package/dist/headless/components/dataDisplay/list/list.js.map +1 -1
- package/dist/headless/components/dataDisplay/meter/meter.js +61 -0
- package/dist/headless/components/dataDisplay/meter/meter.js.map +1 -0
- package/dist/headless/components/dataDisplay/personChip/personChip.js +71 -0
- package/dist/headless/components/dataDisplay/personChip/personChip.js.map +1 -0
- package/dist/headless/components/dataDisplay/stat/stat.js +58 -0
- package/dist/headless/components/dataDisplay/stat/stat.js.map +1 -0
- package/dist/headless/components/dataDisplay/table/table.js +40 -31
- package/dist/headless/components/dataDisplay/table/table.js.map +1 -1
- package/dist/headless/components/dataDisplay/table/tableBody.js +10 -4
- package/dist/headless/components/dataDisplay/table/tableBody.js.map +1 -1
- package/dist/headless/components/dataDisplay/table/tableCell.js +20 -4
- package/dist/headless/components/dataDisplay/table/tableCell.js.map +1 -1
- package/dist/headless/components/dataDisplay/table/tableColumns.js +112 -0
- package/dist/headless/components/dataDisplay/table/tableColumns.js.map +1 -0
- package/dist/headless/components/dataDisplay/table/tableHead.js +9 -3
- package/dist/headless/components/dataDisplay/table/tableHead.js.map +1 -1
- package/dist/headless/components/dataDisplay/table/tableHeadCell.js +61 -36
- package/dist/headless/components/dataDisplay/table/tableHeadCell.js.map +1 -1
- package/dist/headless/components/dataDisplay/table/tableRow.js +28 -16
- package/dist/headless/components/dataDisplay/table/tableRow.js.map +1 -1
- package/dist/headless/components/dataDisplay/thumbCard/thumbCard.js +78 -58
- package/dist/headless/components/dataDisplay/thumbCard/thumbCard.js.map +1 -1
- package/dist/headless/components/dataDisplay/timeline/timeline.js +42 -0
- package/dist/headless/components/dataDisplay/timeline/timeline.js.map +1 -0
- package/dist/headless/components/dataDisplay/treeView/treeView.js +24 -23
- package/dist/headless/components/dataDisplay/treeView/treeView.js.map +1 -1
- package/dist/headless/components/dataDisplay/typography/typography.js +39 -22
- package/dist/headless/components/dataDisplay/typography/typography.js.map +1 -1
- package/dist/headless/components/feedBack/emptyState/emptyState.js +35 -0
- package/dist/headless/components/feedBack/emptyState/emptyState.js.map +1 -0
- package/dist/headless/components/feedBack/message/message.js +31 -20
- package/dist/headless/components/feedBack/message/message.js.map +1 -1
- package/dist/headless/components/feedBack/modal/modal.js +44 -44
- package/dist/headless/components/feedBack/modal/modal.js.map +1 -1
- package/dist/headless/components/feedBack/progressIndicator/progressIndicator.js +70 -39
- package/dist/headless/components/feedBack/progressIndicator/progressIndicator.js.map +1 -1
- package/dist/headless/components/feedBack/saveAssetDialog/saveAssetDialog.js +30 -30
- package/dist/headless/components/feedBack/saveAssetDialog/saveAssetDialog.js.map +1 -1
- package/dist/headless/components/feedBack/skeleton/skeleton.js +38 -35
- package/dist/headless/components/feedBack/skeleton/skeleton.js.map +1 -1
- package/dist/headless/components/feedBack/snackbar/snackbar.js +108 -107
- package/dist/headless/components/feedBack/snackbar/snackbar.js.map +1 -1
- package/dist/headless/components/feedBack/tooltip/tooltip.js +75 -48
- package/dist/headless/components/feedBack/tooltip/tooltip.js.map +1 -1
- package/dist/headless/components/inputs/button/button.js +62 -58
- package/dist/headless/components/inputs/button/button.js.map +1 -1
- package/dist/headless/components/inputs/buttonGroups/buttonGroup.js +40 -36
- package/dist/headless/components/inputs/buttonGroups/buttonGroup.js.map +1 -1
- package/dist/headless/components/inputs/checkbox/checkbox.js +85 -60
- package/dist/headless/components/inputs/checkbox/checkbox.js.map +1 -1
- package/dist/headless/components/inputs/datePicker/datePicker.js +177 -169
- package/dist/headless/components/inputs/datePicker/datePicker.js.map +1 -1
- package/dist/headless/components/inputs/datePicker/datePickerDay.js +52 -44
- package/dist/headless/components/inputs/datePicker/datePickerDay.js.map +1 -1
- package/dist/headless/components/inputs/datePicker/datePickerIconButton.js +32 -28
- package/dist/headless/components/inputs/datePicker/datePickerIconButton.js.map +1 -1
- package/dist/headless/components/inputs/dateTimePicker/dateTimePicker.js +165 -157
- package/dist/headless/components/inputs/dateTimePicker/dateTimePicker.js.map +1 -1
- package/dist/headless/components/inputs/floatingButton/floatingButton.js +32 -30
- package/dist/headless/components/inputs/floatingButton/floatingButton.js.map +1 -1
- package/dist/headless/components/inputs/radioButton/radioButton.js +77 -58
- package/dist/headless/components/inputs/radioButton/radioButton.js.map +1 -1
- package/dist/headless/components/inputs/rating/rating.js +85 -70
- package/dist/headless/components/inputs/rating/rating.js.map +1 -1
- package/dist/headless/components/inputs/selectField/dropdownMenu.js +265 -109
- package/dist/headless/components/inputs/selectField/dropdownMenu.js.map +1 -1
- package/dist/headless/components/inputs/selectField/optionNavigation.js +38 -0
- package/dist/headless/components/inputs/selectField/optionNavigation.js.map +1 -0
- package/dist/headless/components/inputs/selectField/selectField.js +360 -210
- package/dist/headless/components/inputs/selectField/selectField.js.map +1 -1
- package/dist/headless/components/inputs/slider/slider.js +330 -261
- package/dist/headless/components/inputs/slider/slider.js.map +1 -1
- package/dist/headless/components/inputs/textField/textField.js +118 -100
- package/dist/headless/components/inputs/textField/textField.js.map +1 -1
- package/dist/headless/components/inputs/textField/textFieldWrapper.js +45 -34
- package/dist/headless/components/inputs/textField/textFieldWrapper.js.map +1 -1
- package/dist/headless/components/inputs/timePicker/timePicker.js +92 -84
- package/dist/headless/components/inputs/timePicker/timePicker.js.map +1 -1
- package/dist/headless/components/inputs/toggle/toggle.js +79 -60
- package/dist/headless/components/inputs/toggle/toggle.js.map +1 -1
- package/dist/headless/components/inputs/valueSlider/valueSlider.js +25 -24
- package/dist/headless/components/inputs/valueSlider/valueSlider.js.map +1 -1
- package/dist/headless/components/layout/appLayout/appLayout.js +27 -26
- package/dist/headless/components/layout/appLayout/appLayout.js.map +1 -1
- package/dist/headless/components/layout/divider/divider.js +18 -17
- package/dist/headless/components/layout/divider/divider.js.map +1 -1
- package/dist/headless/components/layout/floatingWindow/floatingWindow.js +145 -139
- package/dist/headless/components/layout/floatingWindow/floatingWindow.js.map +1 -1
- package/dist/headless/components/layout/grid/grid.js +48 -33
- package/dist/headless/components/layout/grid/grid.js.map +1 -1
- package/dist/headless/components/layout/page/page.js +15 -7
- package/dist/headless/components/layout/page/page.js.map +1 -1
- package/dist/headless/components/layout/pageHeader/pageHeader.js +20 -11
- package/dist/headless/components/layout/pageHeader/pageHeader.js.map +1 -1
- package/dist/headless/components/layout/sectionHeader/sectionHeader.js +75 -0
- package/dist/headless/components/layout/sectionHeader/sectionHeader.js.map +1 -0
- package/dist/headless/components/layout/sheet/sheet.js +80 -79
- package/dist/headless/components/layout/sheet/sheet.js.map +1 -1
- package/dist/headless/components/layout/stack/stack.js +29 -17
- package/dist/headless/components/layout/stack/stack.js.map +1 -1
- package/dist/headless/components/navigation/appBar/appBar.js +15 -14
- package/dist/headless/components/navigation/appBar/appBar.js.map +1 -1
- package/dist/headless/components/navigation/bottomBar/bottomBar.js +81 -77
- package/dist/headless/components/navigation/bottomBar/bottomBar.js.map +1 -1
- package/dist/headless/components/navigation/breadcrumbs/breadcrumbs.js +32 -30
- package/dist/headless/components/navigation/breadcrumbs/breadcrumbs.js.map +1 -1
- package/dist/headless/components/navigation/menu/menu.js.map +1 -1
- package/dist/headless/components/navigation/menu/menuContext.js.map +1 -1
- package/dist/headless/components/navigation/menu/menuFloating.js +42 -30
- package/dist/headless/components/navigation/menu/menuFloating.js.map +1 -1
- package/dist/headless/components/navigation/menu/menuItem.js +60 -48
- package/dist/headless/components/navigation/menu/menuItem.js.map +1 -1
- package/dist/headless/components/navigation/menu/menuList.js +30 -19
- package/dist/headless/components/navigation/menu/menuList.js.map +1 -1
- package/dist/headless/components/navigation/menu/menuSubmenu.js +53 -40
- package/dist/headless/components/navigation/menu/menuSubmenu.js.map +1 -1
- package/dist/headless/components/navigation/pagination/pagination.js +51 -49
- package/dist/headless/components/navigation/pagination/pagination.js.map +1 -1
- package/dist/headless/components/navigation/sidebar/sidebar.js +29 -28
- package/dist/headless/components/navigation/sidebar/sidebar.js.map +1 -1
- package/dist/headless/components/navigation/stepper/stepper.js +41 -30
- package/dist/headless/components/navigation/stepper/stepper.js.map +1 -1
- package/dist/headless/components/navigation/tabs/tab/tab.js +41 -39
- package/dist/headless/components/navigation/tabs/tab/tab.js.map +1 -1
- package/dist/headless/components/navigation/tabs/tabs.js +137 -86
- package/dist/headless/components/navigation/tabs/tabs.js.map +1 -1
- package/dist/headless/hooks/useDismissOnEscape.js +16 -0
- package/dist/headless/hooks/useDismissOnEscape.js.map +1 -0
- package/dist/headless/hooks/useFocusTrap.js +1 -0
- package/dist/headless/hooks/useFocusTrap.js.map +1 -1
- package/dist/headless/hooks/useHelperText.js +13 -0
- package/dist/headless/hooks/useHelperText.js.map +1 -0
- package/dist/headless/hooks/useSafeLayoutEffect.js +4 -2
- package/dist/headless/hooks/useSafeLayoutEffect.js.map +1 -1
- package/dist/headless/icons/catalog.js +78 -1
- package/dist/headless/icons/catalog.js.map +1 -1
- package/dist/headless/icons/index.js +596 -574
- package/dist/headless/icons/index.js.map +1 -1
- package/dist/headless/icons/svg/accountTree.js +9 -0
- package/dist/headless/icons/svg/accountTree.js.map +1 -0
- package/dist/headless/icons/svg/callSplit.js +9 -0
- package/dist/headless/icons/svg/callSplit.js.map +1 -0
- package/dist/headless/icons/svg/deviceHub.js +8 -0
- package/dist/headless/icons/svg/deviceHub.js.map +1 -0
- package/dist/headless/icons/svg/editNote.js +9 -0
- package/dist/headless/icons/svg/editNote.js.map +1 -0
- package/dist/headless/icons/svg/filterList.js +9 -0
- package/dist/headless/icons/svg/filterList.js.map +1 -0
- package/dist/headless/icons/svg/forkRight.js +8 -0
- package/dist/headless/icons/svg/forkRight.js.map +1 -0
- package/dist/headless/icons/svg/groups.js +9 -0
- package/dist/headless/icons/svg/groups.js.map +1 -0
- package/dist/headless/icons/svg/hub.js +8 -0
- package/dist/headless/icons/svg/hub.js.map +1 -0
- package/dist/headless/icons/svg/index.js +598 -576
- package/dist/headless/icons/svg/index.js.map +1 -1
- package/dist/headless/icons/svg/lan.js +9 -0
- package/dist/headless/icons/svg/lan.js.map +1 -0
- package/dist/headless/icons/svg/personOff.js +9 -0
- package/dist/headless/icons/svg/personOff.js.map +1 -0
- package/dist/headless/icons/svg/schema.js +9 -0
- package/dist/headless/icons/svg/schema.js.map +1 -0
- package/dist/headless/index.js +209 -183
- package/dist/headless/index.js.map +1 -1
- package/dist/headless/utils/controlProps.js +14 -0
- package/dist/headless/utils/controlProps.js.map +1 -0
- package/dist/headless/utils/overlayLayer.js +14 -7
- package/dist/headless/utils/overlayLayer.js.map +1 -1
- package/dist/headless/utils/ownClick.js +40 -0
- package/dist/headless/utils/ownClick.js.map +1 -0
- package/dist/headless/utils/readOnlyToggle.js +14 -0
- package/dist/headless/utils/readOnlyToggle.js.map +1 -0
- package/dist/hooks/useDismissOnEscape.d.ts +11 -0
- package/dist/hooks/useDismissOnEscape.js +16 -0
- package/dist/hooks/useDismissOnEscape.js.map +1 -0
- package/dist/hooks/useFocusTrap.d.ts +2 -0
- package/dist/hooks/useFocusTrap.js +1 -0
- package/dist/hooks/useFocusTrap.js.map +1 -1
- package/dist/hooks/useHelperText.d.ts +21 -0
- package/dist/hooks/useHelperText.js +13 -0
- package/dist/hooks/useHelperText.js.map +1 -0
- package/dist/hooks/useSafeLayoutEffect.d.ts +7 -1
- package/dist/hooks/useSafeLayoutEffect.js +4 -2
- package/dist/hooks/useSafeLayoutEffect.js.map +1 -1
- package/dist/icons/catalog.d.ts +1 -1
- package/dist/icons/catalog.js +78 -1
- package/dist/icons/catalog.js.map +1 -1
- package/dist/icons/index.js +596 -574
- package/dist/icons/index.js.map +1 -1
- package/dist/icons/svg/accountTree.d.ts +4 -0
- package/dist/icons/svg/accountTree.js +9 -0
- package/dist/icons/svg/accountTree.js.map +1 -0
- package/dist/icons/svg/callSplit.d.ts +4 -0
- package/dist/icons/svg/callSplit.js +9 -0
- package/dist/icons/svg/callSplit.js.map +1 -0
- package/dist/icons/svg/deviceHub.d.ts +4 -0
- package/dist/icons/svg/deviceHub.js +8 -0
- package/dist/icons/svg/deviceHub.js.map +1 -0
- package/dist/icons/svg/editNote.d.ts +4 -0
- package/dist/icons/svg/editNote.js +9 -0
- package/dist/icons/svg/editNote.js.map +1 -0
- package/dist/icons/svg/filterList.d.ts +4 -0
- package/dist/icons/svg/filterList.js +9 -0
- package/dist/icons/svg/filterList.js.map +1 -0
- package/dist/icons/svg/forkRight.d.ts +4 -0
- package/dist/icons/svg/forkRight.js +8 -0
- package/dist/icons/svg/forkRight.js.map +1 -0
- package/dist/icons/svg/groups.d.ts +4 -0
- package/dist/icons/svg/groups.js +9 -0
- package/dist/icons/svg/groups.js.map +1 -0
- package/dist/icons/svg/hub.d.ts +4 -0
- package/dist/icons/svg/hub.js +8 -0
- package/dist/icons/svg/hub.js.map +1 -0
- package/dist/icons/svg/index.d.ts +11 -0
- package/dist/icons/svg/index.js +598 -576
- package/dist/icons/svg/index.js.map +1 -1
- package/dist/icons/svg/lan.d.ts +4 -0
- package/dist/icons/svg/lan.js +9 -0
- package/dist/icons/svg/lan.js.map +1 -0
- package/dist/icons/svg/personOff.d.ts +4 -0
- package/dist/icons/svg/personOff.js +9 -0
- package/dist/icons/svg/personOff.js.map +1 -0
- package/dist/icons/svg/schema.d.ts +4 -0
- package/dist/icons/svg/schema.js +9 -0
- package/dist/icons/svg/schema.js.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.cjs.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +16 -0
- package/dist/index.js +209 -183
- package/dist/index.js.map +1 -1
- package/dist/utils/controlProps.d.ts +16 -0
- package/dist/utils/controlProps.js +14 -0
- package/dist/utils/controlProps.js.map +1 -0
- package/dist/utils/overlayLayer.d.ts +15 -3
- package/dist/utils/overlayLayer.js +14 -7
- package/dist/utils/overlayLayer.js.map +1 -1
- package/dist/utils/ownClick.d.ts +16 -0
- package/dist/utils/ownClick.js +40 -0
- package/dist/utils/ownClick.js.map +1 -0
- package/dist/utils/readOnlyToggle.d.ts +15 -0
- package/dist/utils/readOnlyToggle.js +14 -0
- package/dist/utils/readOnlyToggle.js.map +1 -0
- package/package.json +18 -7
- package/dist/react-table/components/base/icon/icon.js +0 -60
- package/dist/react-table/components/base/icon/icon.js.map +0 -1
- package/dist/react-table/components/base/icon/iconProvider.js +0 -15
- package/dist/react-table/components/base/icon/iconProvider.js.map +0 -1
- package/dist/react-table/components/dataDisplay/table/table.js +0 -37
- package/dist/react-table/components/dataDisplay/table/table.js.map +0 -1
- package/dist/react-table/components/dataDisplay/table/tableBody.js +0 -7
- package/dist/react-table/components/dataDisplay/table/tableBody.js.map +0 -1
- package/dist/react-table/components/dataDisplay/table/tableCell.js +0 -7
- package/dist/react-table/components/dataDisplay/table/tableCell.js.map +0 -1
- package/dist/react-table/components/dataDisplay/table/tableHead.js +0 -7
- package/dist/react-table/components/dataDisplay/table/tableHead.js.map +0 -1
- package/dist/react-table/components/dataDisplay/table/tableHeadCell.js +0 -48
- package/dist/react-table/components/dataDisplay/table/tableHeadCell.js.map +0 -1
- package/dist/react-table/components/dataDisplay/table/tablePagination/tablePagination.js +0 -40
- package/dist/react-table/components/dataDisplay/table/tablePagination/tablePagination.js.map +0 -1
- package/dist/react-table/components/dataDisplay/table/tableRow.js +0 -20
- package/dist/react-table/components/dataDisplay/table/tableRow.js.map +0 -1
- package/dist/react-table/components/feedBack/message/message.js +0 -31
- package/dist/react-table/components/feedBack/message/message.js.map +0 -1
- package/dist/react-table/components/feedBack/progressIndicator/progressIndicator.js +0 -51
- package/dist/react-table/components/feedBack/progressIndicator/progressIndicator.js.map +0 -1
- package/dist/react-table/components/inputs/textField/textField.js +0 -125
- package/dist/react-table/components/inputs/textField/textField.js.map +0 -1
- package/dist/react-table/components/inputs/textField/textFieldAdornment.js +0 -25
- package/dist/react-table/components/inputs/textField/textFieldAdornment.js.map +0 -1
- package/dist/react-table/components/inputs/textField/textFieldWrapper.js +0 -50
- package/dist/react-table/components/inputs/textField/textFieldWrapper.js.map +0 -1
- package/dist/react-table/components/inputs/textField/utils.js +0 -11
- package/dist/react-table/components/inputs/textField/utils.js.map +0 -1
- package/dist/react-table/connects/rt/table/draggableHeader.js.map +0 -1
- package/dist/react-table/connects/rt/table/headerCellRenderer.js +0 -14
- package/dist/react-table/connects/rt/table/headerCellRenderer.js.map +0 -1
- package/dist/react-table/connects/rt/table/table.js +0 -180
- package/dist/react-table/connects/rt/table/table.js.map +0 -1
- package/dist/react-table/connects/rt/table/utils.js.map +0 -1
- package/dist/react-table/hooks/useForkRef.js +0 -13
- package/dist/react-table/hooks/useForkRef.js.map +0 -1
- package/dist/react-table/hooks/useSafeLayoutEffect.js +0 -6
- package/dist/react-table/hooks/useSafeLayoutEffect.js.map +0 -1
- package/dist/react-table/icons/config.js +0 -9
- package/dist/react-table/icons/config.js.map +0 -1
- package/dist/react-table/icons/registry.js +0 -12
- package/dist/react-table/icons/registry.js.map +0 -1
- package/dist/react-table/icons/store.js +0 -10
- package/dist/react-table/icons/store.js.map +0 -1
- package/dist/react-table/utils/setRef.js +0 -7
- package/dist/react-table/utils/setRef.js.map +0 -1
- package/dist/storybook/storyPlay.d.ts +0 -28
- /package/dist/{react-table/connects → connects}/rt/table/draggableHeader.js +0 -0
- /package/dist/{react-table/connects → connects}/rt/table/utils.js +0 -0
- /package/dist/{react-table/react-table.js → react-table.js} +0 -0
- /package/dist/{react-table/react-table.js.map → react-table.js.map} +0 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/utils/floating.ts","../src/hooks/useHoverPopover.ts","../src/hooks/useDropzone.ts","../src/components/base/icon/iconProvider.tsx","../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/utils/overlayLayer.ts","../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/confirmDialog/confirmDialog.tsx","../src/components/feedBack/snackbar/useSnackbarsPortal.ts","../src/components/feedBack/snackbar/snackbar.tsx","../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/fileDrop/utils.ts","../src/components/inputs/fileDrop/preview.tsx","../src/components/inputs/fileDrop/countPreview.tsx","../src/components/inputs/fileDrop/previewWrapper.tsx","../src/components/inputs/fileDrop/fileDrop.tsx","../src/components/inputs/fileInput/fileInput.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/floatingWindow/floatingWindow.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 { 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 { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties, PointerEvent as ReactPointerEvent } from \"react\";\nimport { autoUpdate, flip, offset, shift, useFloating } from \"@floating-ui/react\";\nimport type { Middleware, VirtualElement } from \"@floating-ui/react\";\nimport { resolvePlacement } from \"../utils/floating\";\nimport type { Placement } from \"../utils/floating\";\n\nexport interface UseHoverPopoverParams {\n /** Placement of the popover relative to its anchor. Default `\"bottom-start\"`. */\n placement?: Placement;\n /** Offset (px) applied on both axes between the anchor and the popover. Default `4`. */\n offsetPx?: number;\n /** Delay (ms) before opening after pointer enter. Default `0`. */\n openDelay?: number;\n /** Delay (ms) before closing after pointer leave. Default `0`. */\n closeDelay?: number;\n /** Extra floating-ui middleware appended after the smwb defaults. */\n middleware?: Middleware[];\n}\n\n/** A pointer position in viewport (client) coordinates. */\nexport interface HoverPopoverPoint {\n x: number;\n y: number;\n}\n\nexport interface HoverPopoverReferenceProps {\n onPointerEnter: (event: ReactPointerEvent) => void;\n onPointerMove: (event: ReactPointerEvent) => void;\n onPointerLeave: (event: ReactPointerEvent) => void;\n}\n\nexport interface HoverPopoverFloatingProps {\n ref: (node: HTMLElement | null) => void;\n style: CSSProperties;\n onPointerEnter: () => void;\n onPointerLeave: () => void;\n}\n\nexport interface UseHoverPopoverResult {\n /** Whether the popover is currently open. */\n open: boolean;\n /**\n * Pointer handlers for the trigger element(s). Spread on a single anchor, or\n * on EVERY row of a list/table to share one popover across many triggers. By\n * default the popover is anchored to the cursor position frozen when it opens.\n * Pass your own handlers to compose them (e.g. to mark which row is active).\n */\n getReferenceProps: (userHandlers?: Partial<HoverPopoverReferenceProps>) => HoverPopoverReferenceProps;\n /** Props for the single floating element; keeps it open while it is hovered. */\n getFloatingProps: (userProps?: { style?: CSSProperties }) => HoverPopoverFloatingProps;\n /** Anchor the popover to a real element instead of the cursor (`null` clears it). */\n setAnchorEl: (element: Element | null) => void;\n /** Anchor the popover to an explicit point, e.g. an external cursor source. */\n setVirtualAnchor: (point: HoverPopoverPoint) => void;\n /** Open immediately, ignoring `openDelay`. */\n openNow: () => void;\n /** Open after `openDelay`. */\n scheduleOpen: () => void;\n /** Close after `closeDelay`. */\n scheduleClose: () => void;\n /** Close immediately. */\n close: () => void;\n}\n\nconst DEFAULT_PLACEMENT: Placement = \"bottom-start\";\nconst DEFAULT_OFFSET_PX = 4;\nconst SHIFT_PADDING_PX = 8;\n\nconst rectFromPoint = ({ x, y }: HoverPopoverPoint) => ({\n x,\n y,\n top: y,\n left: x,\n right: x,\n bottom: y,\n width: 0,\n height: 0,\n});\n\n/**\n * Headless hover-popover positioning.\n *\n * Wraps floating-ui with the smwb placement / offset / flip / shift conventions\n * but imposes NO DOM structure: spread `getReferenceProps()` on any trigger\n * (including a `<tr>`, which the wrapper-based `<Tooltip>` cannot do) and\n * `getFloatingProps()` on a single floating element you render yourself.\n *\n * The default anchor is the cursor point frozen when the popover opens (a\n * floating-ui virtual element), so ONE instance can serve a whole table/list —\n * call `getReferenceProps()` on every row and render one shared popover instead\n * of mounting one floating engine per row. Use `setAnchorEl` to anchor to a\n * real element instead.\n */\nexport function useHoverPopover(params: UseHoverPopoverParams = {}): UseHoverPopoverResult {\n const {\n placement = DEFAULT_PLACEMENT,\n offsetPx = DEFAULT_OFFSET_PX,\n openDelay = 0,\n closeDelay = 0,\n middleware,\n } = params;\n\n const [open, setOpen] = useState(false);\n\n const cursorRef = useRef<HoverPopoverPoint>({ x: 0, y: 0 });\n const anchorRef = useRef<HoverPopoverPoint>({ x: 0, y: 0 });\n const anchorElRef = useRef<Element | null>(null);\n const openTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const resolved = resolvePlacement(placement);\n\n const floatingMiddleware = useMemo<Middleware[]>(\n () => [\n offset({ mainAxis: offsetPx, crossAxis: offsetPx }),\n ...(resolved.autoMiddleware ? [resolved.autoMiddleware] : [flip()]),\n shift({ padding: SHIFT_PADDING_PX }),\n ...(middleware ?? []),\n ],\n [offsetPx, resolved.autoMiddleware, middleware]\n );\n\n const { refs, floatingStyles, update } = useFloating({\n open,\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: floatingMiddleware,\n });\n\n const virtualReference = useMemo<VirtualElement>(\n () => ({ getBoundingClientRect: () => rectFromPoint(anchorRef.current) }),\n []\n );\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 // Apply the active anchor (element or frozen cursor) whenever the popover\n // opens; autoUpdate keeps it positioned while the floating element is mounted.\n useEffect(() => {\n if (!open) return;\n refs.setPositionReference(anchorElRef.current ?? virtualReference);\n void update();\n }, [open, refs, update, virtualReference]);\n\n const freezeAnchor = useCallback(() => {\n if (anchorElRef.current === null) anchorRef.current = cursorRef.current;\n }, []);\n\n const openNow = useCallback(() => {\n clearTimers();\n freezeAnchor();\n setOpen(true);\n }, [clearTimers, freezeAnchor]);\n\n const scheduleOpen = useCallback(() => {\n clearTimers();\n if (openDelay <= 0) {\n freezeAnchor();\n setOpen(true);\n return;\n }\n openTimerRef.current = setTimeout(() => {\n freezeAnchor();\n setOpen(true);\n }, openDelay);\n }, [clearTimers, freezeAnchor, openDelay]);\n\n const scheduleClose = useCallback(() => {\n clearTimers();\n if (closeDelay <= 0) {\n setOpen(false);\n return;\n }\n closeTimerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimers, closeDelay]);\n\n const close = useCallback(() => {\n clearTimers();\n setOpen(false);\n }, [clearTimers]);\n\n const setVirtualAnchor = useCallback((point: HoverPopoverPoint) => {\n anchorElRef.current = null;\n anchorRef.current = point;\n }, []);\n\n const setAnchorEl = useCallback((element: Element | null) => {\n anchorElRef.current = element;\n }, []);\n\n const handleEnter = useCallback(\n (event: ReactPointerEvent) => {\n cursorRef.current = { x: event.clientX, y: event.clientY };\n scheduleOpen();\n },\n [scheduleOpen]\n );\n\n const handleMove = useCallback((event: ReactPointerEvent) => {\n cursorRef.current = { x: event.clientX, y: event.clientY };\n }, []);\n\n const getReferenceProps = useCallback<UseHoverPopoverResult[\"getReferenceProps\"]>(\n (userHandlers) => ({\n onPointerEnter: (event) => {\n userHandlers?.onPointerEnter?.(event);\n handleEnter(event);\n },\n onPointerMove: (event) => {\n userHandlers?.onPointerMove?.(event);\n handleMove(event);\n },\n onPointerLeave: (event) => {\n userHandlers?.onPointerLeave?.(event);\n scheduleClose();\n },\n }),\n [handleEnter, handleMove, scheduleClose]\n );\n\n const cancelClose = useCallback(() => {\n clearTimers();\n setOpen(true);\n }, [clearTimers]);\n\n const getFloatingProps = useCallback<UseHoverPopoverResult[\"getFloatingProps\"]>(\n (userProps) => ({\n ref: refs.setFloating,\n style: { ...floatingStyles, ...userProps?.style },\n onPointerEnter: cancelClose,\n onPointerLeave: scheduleClose,\n }),\n [refs, floatingStyles, cancelClose, scheduleClose]\n );\n\n return {\n open,\n getReferenceProps,\n getFloatingProps,\n setAnchorEl,\n setVirtualAnchor,\n openNow,\n scheduleOpen,\n scheduleClose,\n close,\n };\n}\n","import React from \"react\";\n\n/** Record of mime → extensions (react-dropzone's `Accept` shape), or a raw accept string. */\nexport type DropzoneAccept = Record<string, string[]> | string;\n\nexport interface DropzoneOptions {\n /** Record of mime → extensions, or a raw accept string. */\n accept?: DropzoneAccept | undefined;\n multiple?: boolean | undefined;\n maxFiles?: number | undefined;\n disabled?: boolean | undefined;\n onDrop?: ((files: File[], event: React.SyntheticEvent | Event) => void) | undefined;\n onDropAccepted?: ((files: File[], event: React.SyntheticEvent | Event) => void) | undefined;\n}\n\nexport interface DropzoneRootProps {\n onClick: () => void;\n onDragOver: (event: React.DragEvent<HTMLElement>) => void;\n onDragLeave: () => void;\n onDrop: (event: React.DragEvent<HTMLElement>) => void;\n}\n\nexport interface DropzoneInputProps {\n type: \"file\";\n multiple: boolean | undefined;\n accept: string | undefined;\n disabled: boolean | undefined;\n style: React.CSSProperties;\n ref: React.RefObject<HTMLInputElement>;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\nexport interface DropzoneState {\n getRootProps: () => DropzoneRootProps;\n getInputProps: () => DropzoneInputProps;\n inputRef: React.RefObject<HTMLInputElement>;\n isDragActive: boolean;\n open: () => void;\n}\n\nfunction acceptToString(accept: DropzoneOptions[\"accept\"]): string | undefined {\n if (!accept) return undefined;\n if (typeof accept === \"string\") return accept;\n return Object.entries(accept)\n .flatMap(([mime, exts]) => [mime, ...exts])\n .join(\",\");\n}\n\n/**\n * Dependency-free file dropzone — the React twin of ui-solid's `createDropzone`.\n * Provides root/input prop getters, drag-active state and a programmatic `open()`.\n *\n * Replaces the `react-dropzone` import this package used to carry: that package was\n * only ever a devDependency while the build externalises every bare import, so the\n * published bundle asked consumers for a module they were never told to install.\n */\nexport function useDropzone(options: DropzoneOptions = {}): DropzoneState {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [isDragActive, setIsDragActive] = React.useState(false);\n\n // Latest options without re-creating the prop getters on every render.\n const optionsRef = React.useRef(options);\n optionsRef.current = options;\n\n const open = React.useCallback((): void => {\n if (!optionsRef.current.disabled) inputRef.current?.click();\n }, []);\n\n const handleFiles = React.useCallback((list: FileList | null, event: React.SyntheticEvent | Event): void => {\n if (!list) return;\n const { maxFiles, onDrop, onDropAccepted } = optionsRef.current;\n let files = Array.from(list);\n if (maxFiles && maxFiles > 0) files = files.slice(0, maxFiles);\n onDrop?.(files, event);\n onDropAccepted?.(files, event);\n }, []);\n\n const getRootProps = React.useCallback(\n (): DropzoneRootProps => ({\n onClick: () => open(),\n onDragOver: (event) => {\n event.preventDefault();\n if (!optionsRef.current.disabled) setIsDragActive(true);\n },\n onDragLeave: () => setIsDragActive(false),\n onDrop: (event) => {\n event.preventDefault();\n setIsDragActive(false);\n if (!optionsRef.current.disabled) handleFiles(event.dataTransfer?.files ?? null, event);\n },\n }),\n [handleFiles, open]\n );\n\n const getInputProps = React.useCallback(\n (): DropzoneInputProps => ({\n type: \"file\",\n multiple: optionsRef.current.multiple,\n accept: acceptToString(optionsRef.current.accept),\n disabled: optionsRef.current.disabled,\n style: { display: \"none\" },\n ref: inputRef,\n onChange: (event) => handleFiles(event.currentTarget.files, event),\n }),\n [handleFiles]\n );\n\n return { getRootProps, getInputProps, inputRef, isDragActive, open };\n}\n\nexport default useDropzone;\n","import { createContext, useContext, useMemo, useSyncExternalStore, type ReactNode } from \"react\";\nimport { registerIcons, type IconInput } from \"../../../icons/registry\";\nimport { getIconConfig } from \"../../../icons/config\";\nimport { subscribeIcons } from \"../../../icons/store\";\nimport type { IconSource } from \"../../../icons/types\";\n\nexport interface IconContextValue {\n /** Icon artwork for this subtree. Falls back to {@link configureIcons}. */\n source?: IconSource;\n}\n\nexport const IconContext = createContext<IconContextValue | null>(null);\n\nexport interface IconProviderProps extends IconContextValue {\n /**\n * Icons to make available to `<Icon name=\"...\">` inside this subtree.\n *\n * ```tsx\n * import { add, close, search } from \"@smwb/ui-react/icons\";\n *\n * <IconProvider source=\"smwb\" icons={[add, close, search]}>\n * <App />\n * </IconProvider>\n * ```\n *\n * Registration is process-wide (the registry is a module singleton), so the\n * prop is a convenience for apps that would otherwise call `registerIcons`\n * at startup — not a scoping mechanism.\n */\n icons?: IconInput;\n children?: ReactNode;\n}\n\n/**\n * Sets the icon source — and optionally registers icons — for a subtree.\n * `<Icon source>` still wins over the provider, and the provider wins over the\n * app-wide {@link configureIcons} default.\n */\nexport function IconProvider({ source, icons, children }: IconProviderProps) {\n // Icons have to be in the registry before the subtree's first paint, so this\n // cannot wait for an effect. registerIcons is idempotent, which keeps it safe\n // under StrictMode's double render.\n useMemo(() => {\n if (icons) registerIcons(icons);\n }, [icons]);\n\n const value = useMemo<IconContextValue>(() => ({ source }), [source]);\n return <IconContext.Provider value={value}>{children}</IconContext.Provider>;\n}\n\nconst getConfiguredSource = (): IconSource => getIconConfig().source;\n\n/**\n * Resolves the icon source the way `<Icon>` does: explicit prop, then the\n * nearest {@link IconProvider}, then the app-wide config (`\"auto\"` by default).\n */\nexport function useIconSource(override?: IconSource): IconSource {\n const context = useContext(IconContext);\n const configured = useSyncExternalStore(subscribeIcons, getConfiguredSource, getConfiguredSource);\n return override ?? context?.source ?? configured;\n}\n\nexport default IconProvider;\n","import { forwardRef, HTMLAttributes, useSyncExternalStore } from \"react\";\nimport cn from \"clsx\";\nimport { getIcon } from \"../../../icons/registry\";\nimport { getIconConfig } from \"../../../icons/config\";\nimport { subscribeIcons } from \"../../../icons/store\";\nimport type { IconDefinition, IconSource } from \"../../../icons/types\";\nimport { useIconSource } from \"./iconProvider\";\n\nexport type IconColor = \"inherit\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\" | \"disabled\";\n\nconst COLOR_TOKENS = [\"primary\", \"secondary\", \"error\", \"success\", \"warning\", \"info\", \"disabled\"];\n\nconst warned = new Set<string>();\n\nfunction warnMissing(name: string): void {\n if (!getIconConfig().warnOnMissing || warned.has(name)) return;\n warned.add(name);\n // eslint-disable-next-line no-console -- a missing icon is silent otherwise\n console.warn(\n `[smwb] Icon \"${name}\" is not registered. Register it (import { ${name} } from \"@smwb/ui-react/icons\") ` +\n `or use source=\"auto\" to fall back to Material Symbols.`\n );\n}\n\nexport interface IconProps extends HTMLAttributes<HTMLSpanElement> {\n /**\n * Icon name — the Google Material Symbols name, e.g. `\"arrow_right_alt\"`.\n * Lookup is forgiving: `arrowRightAlt` and `arrow-right-alt` resolve too, as\n * do an icon's aliases.\n *\n * An {@link IconDefinition} may be passed instead, which skips the registry\n * entirely and is the most bundle-friendly form:\n *\n * ```tsx\n * import { arrowRightAlt } from \"@smwb/ui-react/icons\";\n * <Icon name={arrowRightAlt} />\n * ```\n */\n name: string | IconDefinition;\n className?: string;\n /**\n * Material Symbols weight axis (100-700). For the smwb SVG set it maps to the\n * stroke width: 400 → 2px, 700 → 3px, 100 → 1px.\n */\n weight?: number;\n /** Material Symbols FILL axis. Not used by the smwb SVG set (it is a contour set). */\n fill?: 0 | 1;\n /** Pixel number or any CSS length (e.g. \"1.5rem\"). */\n size?: number | string;\n /** Material Symbols GRAD axis. Not used by the smwb SVG set. */\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 /** Overrides the icon source for this icon only. See {@link IconSource}. */\n source?: IconSource;\n}\n\nexport const Icon = forwardRef<HTMLSpanElement, IconProps>(function Icon(\n { className, weight = 400, fill = 0, size = 20, grade = 100, name, color = \"inherit\", title, source, ...props },\n ref\n) {\n const resolvedSource = useIconSource(source);\n const lookup = typeof name === \"string\" ? name : null;\n // Subscribing keeps late registrations (lazy chunks, Storybook HMR) from\n // leaving a mounted icon blank. getIcon returns the same object for the same\n // registration, so the snapshot is stable.\n const getSnapshot = () => (lookup === null ? null : (getIcon(lookup) ?? null));\n const registered = useSyncExternalStore(subscribeIcons, getSnapshot, getSnapshot);\n const definition = typeof name === \"object\" ? name : registered;\n const glyph = typeof name === \"string\" ? name : name.name;\n\n const mode =\n resolvedSource === \"google\" ? \"google\" : definition ? \"smwb\" : resolvedSource === \"smwb\" ? \"missing\" : \"google\";\n if (mode === \"missing\") warnMissing(glyph);\n\n const decorative = title === undefined;\n const colorClass = color && COLOR_TOKENS.includes(color) ? `smwb-icon_color-${color}` : null;\n const cssSize = typeof size === \"number\" ? `${size}px` : size;\n const strokeWidth = Math.round(Math.min(3, Math.max(1, weight / 200)) * 100) / 100;\n\n return (\n <span\n {...props}\n ref={ref}\n data-testid=\"icon\"\n data-icon-source={mode}\n role={decorative ? undefined : \"img\"}\n aria-hidden={decorative ? true : undefined}\n aria-label={title}\n title={title}\n style={{\n ...props.style,\n ...(mode === \"google\"\n ? { fontVariationSettings: `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' 48` }\n : null),\n }}\n className={cn(\"smwb-icon__wrapper\", colorClass, className)}\n >\n {mode === \"google\" ? (\n <span className=\"material-symbols-outlined\" style={{ fontSize: cssSize }}>\n {glyph}\n </span>\n ) : (\n <svg\n className=\"smwb-icon__svg\"\n viewBox={definition?.viewBox ?? \"0 0 24 24\"}\n style={{ width: cssSize, height: cssSize }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n dangerouslySetInnerHTML={{ __html: definition?.body ?? \"\" }}\n />\n )}\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 = <> </>,\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\">​</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 React from \"react\";\nimport { type DropzoneAccept, type DropzoneInputProps, useDropzone } from \"../../../hooks/useDropzone\";\nimport { CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES } from \"./types\";\n\n/** Kept as a named alias so `ChatProps.fileUploadAccept` reads the same as before. */\nexport type Accept = DropzoneAccept;\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 interface ChatFileUploadRootProps {\n onDragOver: (event: React.DragEvent<HTMLElement>) => void;\n onDragLeave: () => void;\n onDrop: (event: React.DragEvent<HTMLElement>) => void;\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 {\n getRootProps: getDropzoneRootProps,\n getInputProps: getDropzoneInputProps,\n open,\n isDragActive,\n inputRef,\n } = useDropzone({\n accept,\n maxFiles: resolvedMaxFiles,\n multiple: resolvedMaxFiles > 1,\n disabled: !active,\n onDropAccepted: (files) => {\n if (onUploadFiles) {\n void onUploadFiles(files);\n }\n },\n });\n\n // Drag/drop root props WITHOUT a click handler — the `noClick` behaviour this hook used to\n // configure on react-dropzone. Clicking the chat surface must never open the file picker;\n // the attach button calls `open()` explicitly. Mirrors ui-solid's createChatFileUpload.\n const getRootProps = (): ChatFileUploadRootProps => {\n const { onClick: _onClick, ...rest } = getDropzoneRootProps();\n void _onClick;\n return rest;\n };\n\n const getInputProps = (extra?: { id?: string }): DropzoneInputProps & { id?: string } => ({\n ...getDropzoneInputProps(),\n ...(extra ?? {}),\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 \"./useChatFileUpload\";\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","/** Attribute marking the root of a portaled overlay layer (modal, sheet wrapper, dropdown, …). */\nexport const OVERLAY_LAYER_ATTR = \"data-smwb-overlay-layer\";\n\n/** All open overlay layers in document order (last = topmost). */\nconst overlayLayers = (): Element[] =>\n typeof document === \"undefined\" ? [] : Array.from(document.querySelectorAll(`[${OVERLAY_LAYER_ATTR}]`));\n\n/**\n * True when `event` happened inside an overlay layer that does NOT contain\n * `node` — i.e. `node` sits underneath that layer, so the interaction is not\n * a \"click away\" from `node`.\n */\nexport const isEventInForeignOverlay = (event: Event, node: Element): boolean => {\n if (typeof event.composedPath !== \"function\") return false;\n return event\n .composedPath()\n .some((el) => el instanceof Element && el.hasAttribute(OVERLAY_LAYER_ATTR) && !el.contains(node));\n};\n\n/**\n * True when `el` belongs to the topmost open overlay layer (or no layers are\n * open). Used to make Escape close only the top layer instead of every layer.\n */\nexport const isTopOverlayLayer = (el: Element | null | undefined): boolean => {\n if (!el) return true;\n const all = overlayLayers();\n const top = all[all.length - 1];\n return !top || top === el || top.contains(el) || el.contains(top);\n};\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\";\nimport { isTopOverlayLayer } from \"../../../utils/overlayLayer\";\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 // Only the topmost overlay layer reacts to Escape.\n if (event.key === \"Escape\" && isTopOverlayLayer(nodeRef.current)) {\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 data-smwb-overlay-layer=\"\"\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 /**\n * A sortable column always shows a marker: the current direction once sorted,\n * and `unfold_more` before that — otherwise nothing tells the reader the column\n * can be sorted at all. A cell that is not sortable shows nothing; it used to\n * render an `<Icon name=\"\">`, which reserved a gap and warned about a missing\n * icon under `source: \"smwb\"`.\n */\n const iconName = direction === \"asc\" ? \"expand_more\" : direction === \"desc\" ? \"expand_less\" : \"unfold_more\";\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 \"smwb-head-cell_sorted\": !!sortable && direction !== false,\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 {sortable && <Icon className=\"smwb-head-cell__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, useRef, 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 plus, for user toggles, the node that just changed. */\n onSelectedChange?: (selected: string[], changed?: { id: string; selected: boolean }) => 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 lastToggledRef = useRef<{ id: string; selected: boolean }>();\n const [selectedIds, setSelectedIds] = useControllableState<string[]>({\n value: selected,\n defaultValue: defaultSelected,\n onChange: (next) => {\n // useControllableState calls onChange synchronously from the setter,\n // so lastToggledRef still refers to the toggle that caused this change.\n const changed = lastToggledRef.current;\n lastToggledRef.current = undefined;\n onSelectedChange?.(next, changed);\n },\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 lastToggledRef.current = { id, selected: !selectedIds.includes(id) };\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\";\nimport { isEventInForeignOverlay } from \"../../utils/overlayLayer\";\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 // Interactions inside a portaled overlay layer above the child (modal,\n // dropdown, picker…) are not \"away\" from the child.\n if (isEventInForeignOverlay(event, nodeRef.current)) {\n return;\n }\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=\"medium\">\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 fullWidth\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 React, { useId } from \"react\";\nimport cn from \"clsx\";\nimport { Modal } from \"../modal\";\nimport { Button } from \"../../inputs/button\";\nimport { Typography } from \"../../dataDisplay/typography\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n /** The subject of the action, shown emphasised on its own line (e.g. the asset name). */\n subject?: string;\n /** A secondary explanatory line (e.g. \"can't be undone\"). */\n message?: string;\n confirmLabel: string;\n cancelLabel?: string;\n /** Style the confirm button as destructive (red). */\n danger?: boolean;\n /** Disable the actions + gate Esc/outside-click while a confirm is in flight. */\n busy?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n className?: string;\n}\n\n/**\n * An alert/confirm dialog built on {@link Modal}: a title, an optional emphasised subject + secondary\n * message, and Cancel / Confirm actions. `role=\"alertdialog\"` with the subject + message wired to\n * `aria-describedby` so a screen reader announces the consequence, not just the title. While `busy`,\n * Escape + outside-click are gated and the buttons disabled. Pure presentation — the caller owns the\n * open state and the confirm/cancel handlers (and supplies localised labels).\n */\nexport function ConfirmDialog(props: ConfirmDialogProps): React.ReactElement {\n const { open, title, subject, message, confirmLabel, cancelLabel, danger, busy, onConfirm, onCancel, className } =\n props;\n\n const subjectId = useId();\n const messageId = useId();\n // Only describe when there IS something to describe — an empty aria-describedby would point a\n // screen reader at nothing.\n const describedBy = [subject ? subjectId : \"\", message ? messageId : \"\"].filter(Boolean).join(\" \");\n\n return (\n <Modal\n open={open}\n onClose={onCancel}\n size=\"medium\"\n role=\"alertdialog\"\n backdrop=\"dark\"\n closeOnEsc={!busy}\n closeOnOutsideClick={!busy}\n aria-label={title}\n {...(describedBy ? { \"aria-describedby\": describedBy } : {})}\n >\n <Modal.Header>{title}</Modal.Header>\n <Modal.Content>\n <div className={cn(\"smwb-confirm-dialog__body\", className)}>\n {subject ? (\n <Typography id={subjectId} variant=\"body2\" color=\"textPrimary\" component=\"span\">\n {subject}\n </Typography>\n ) : null}\n {message ? (\n <Typography id={messageId} variant=\"caption\" color=\"textSecondary\" component=\"span\">\n {message}\n </Typography>\n ) : null}\n </div>\n </Modal.Content>\n <Modal.Footer>\n <Button variant=\"text\" size=\"small\" disabled={!!busy} onClick={onCancel} label={cancelLabel ?? \"Cancel\"} />\n <Button\n variant=\"contained\"\n size=\"small\"\n color={danger ? \"error\" : \"primary\"}\n disabled={!!busy}\n onClick={onConfirm}\n label={confirmLabel}\n />\n </Modal.Footer>\n </Modal>\n );\n}\n\nexport default ConfirmDialog;\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 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 data-smwb-overlay-layer=\"\"\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 data-smwb-overlay-layer=\"\"\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 data-smwb-overlay-layer=\"\"\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","export function isImageFile(file: File): boolean {\n return /^image\\/(png|jpeg)$/.test(file.type);\n}\n","import { FloatingButton } from \"../floatingButton\";\nimport { Icon } from \"../../base/icon\";\nimport { ImagesList, ImagesListItem } from \"../../dataDisplay/imagesList\";\nimport { isImageFile } from \"./utils\";\nimport React from \"react\";\nimport cn from \"clsx\";\n\nexport interface PreviewProps {\n previewCols?: number;\n galleryItemSize?: number;\n previewClassName?: string;\n files: File[];\n handleRemoveAll: () => void;\n}\n\nexport function Preview(props: PreviewProps) {\n const { files, handleRemoveAll, previewCols, galleryItemSize, previewClassName } = props;\n\n const previewClasses = cn(\"smwb-file-drop__preview\", previewClassName);\n\n return (\n <div className={previewClasses}>\n <FloatingButton onClick={handleRemoveAll} className=\"smwb-file-drop__preview-button\">\n <Icon name=\"delete\" size={28} />\n </FloatingButton>\n <ImagesList className=\"smwb-file-drop__preview-gallery\" cols={previewCols as number} rowsHeight={galleryItemSize}>\n {files.map((file: File) => {\n const src = isImageFile(file) ? URL.createObjectURL(file) : null;\n\n return src ? (\n <ImagesListItem\n className=\"smwb-file-drop__preview-gallery-image\"\n key={file.name}\n src={src}\n rows={1}\n cols={1}\n itemBarContent={file.name}\n />\n ) : (\n <div\n key={file.name}\n className=\"smwb-file-drop__preview-gallery-file\"\n style={{\n width: `${(galleryItemSize as number) - 4}px`,\n }}\n >\n {file.name}\n </div>\n );\n })}\n </ImagesList>\n </div>\n );\n}\n","import { FloatingButton } from \"../floatingButton\";\nimport { Icon } from \"../../base/icon\";\nimport React from \"react\";\nimport cn from \"clsx\";\n\nexport interface CountPreviewProps {\n previewClassName?: string;\n text?: string;\n filesLength: number;\n handleRemoveAll: () => void;\n}\n\nexport function CountPreview({ handleRemoveAll, filesLength, previewClassName, text }: CountPreviewProps) {\n const previewClasses = cn(\"smwb-file-drop__preview\", previewClassName);\n\n return (\n <div className={previewClasses}>\n <FloatingButton onClick={handleRemoveAll} className=\"smwb-file-drop__preview-button\">\n <Icon name=\"delete\" size={28} />\n </FloatingButton>\n <div className=\"smwb-file-drop__preview-count\">{`${text ? text : \"uploaded files:\"} ${filesLength}`}</div>\n </div>\n );\n}\n","import { Preview } from \"./preview\";\nimport { CountPreview } from \"./countPreview\";\nimport React from \"react\";\n\nexport interface PreviewWrapperProps {\n preview?: boolean;\n files: File[];\n handleRemoveAll: () => void;\n previewCols?: number;\n galleryItemSize?: number;\n previewClassName?: string;\n}\n\nexport function PreviewWrapper(props: PreviewWrapperProps) {\n const { previewCols, preview, galleryItemSize, handleRemoveAll, files, previewClassName } = props;\n\n return (\n <>\n {preview ? (\n <Preview\n files={files}\n handleRemoveAll={handleRemoveAll}\n previewCols={previewCols}\n galleryItemSize={galleryItemSize}\n previewClassName={previewClassName}\n />\n ) : (\n <CountPreview\n filesLength={files.length}\n handleRemoveAll={handleRemoveAll}\n previewClassName={previewClassName}\n />\n )}\n </>\n );\n}\n","import React, { forwardRef } from \"react\";\nimport { type DropzoneOptions, useDropzone } from \"../../../hooks/useDropzone\";\nimport { PreviewWrapper } from \"./previewWrapper\";\nimport cn from \"clsx\";\n\nexport interface FileUploadProps extends DropzoneOptions {\n preview?: boolean;\n previewCols?: number;\n galleryItemSize?: number;\n onDrop: (files: File[]) => void;\n label?: string;\n className?: string;\n previewClassName?: string;\n disabled?: boolean;\n /** Validation message rendered below the drop zone. */\n error?: string;\n}\n\nexport const FileDrop = forwardRef<HTMLDivElement, FileUploadProps>(function FileDrop(props, ref) {\n const {\n preview,\n previewCols = 3,\n galleryItemSize = 100,\n onDrop: onDropProp,\n label = \"\",\n className,\n previewClassName,\n disabled,\n error,\n ...dropzoneOptions\n } = props;\n\n const [files, setFiles] = React.useState<File[]>([]);\n\n const onDrop = (acceptedFiles: File[]) => {\n setFiles((prev) => [...prev, ...acceptedFiles]);\n onDropProp(acceptedFiles);\n };\n\n const { getRootProps, getInputProps } = useDropzone({\n onDrop,\n disabled,\n ...dropzoneOptions,\n });\n\n const handleRemoveAll = () => {\n setFiles([]);\n };\n\n const wrapperClasses = cn(\"smwb-file-drop\", { \"smwb-disabled\": disabled, \"smwb-error\": !!error }, className);\n\n return (\n <div ref={ref} className={wrapperClasses} data-testid=\"file-drop\">\n {files.length > 0 ? (\n <PreviewWrapper\n preview={preview}\n files={files}\n handleRemoveAll={handleRemoveAll}\n previewCols={previewCols}\n galleryItemSize={galleryItemSize}\n previewClassName={previewClassName}\n />\n ) : (\n <div\n className=\"smwb-file-drop__input\"\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-label={label || \"Upload files\"}\n {...getRootProps()}\n >\n <div className=\"smwb-file-drop__input-text\">{label}</div>\n <input {...getInputProps()} />\n </div>\n )}\n {error ? (\n <span className=\"smwb-file-drop__error\" role=\"alert\">\n {error}\n </span>\n ) : null}\n </div>\n );\n});\n\nexport default FileDrop;\n","import React, { forwardRef } from \"react\";\nimport { type DropzoneOptions, useDropzone } from \"../../../hooks/useDropzone\";\nimport cn from \"clsx\";\n\nexport interface FileInputProps extends DropzoneOptions {\n label?: string;\n className?: string;\n buttonClassName?: string;\n disabled?: boolean;\n /** Validation message shown below the control. */\n error?: string;\n /** Fired with the accepted files when the user picks them. */\n onFilesSelected?: (files: File[]) => void;\n /** @deprecated optional click passthrough on the trigger button. */\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport const FileInput = forwardRef<HTMLDivElement, FileInputProps>(function FileInput(props, ref) {\n const { label, onClick, onFilesSelected, className, buttonClassName, disabled, error, ...dropzoneOptions } = props;\n\n const { getRootProps, getInputProps } = useDropzone({\n ...dropzoneOptions,\n disabled,\n onDropAccepted: (accepted, event) => {\n onFilesSelected?.(accepted);\n dropzoneOptions.onDropAccepted?.(accepted, event);\n },\n });\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n };\n\n return (\n <div\n ref={ref}\n className={cn(\"smwb-file-input\", { \"smwb-disabled\": disabled }, className)}\n data-testid=\"file-input\"\n {...getRootProps()}\n >\n <button type=\"button\" className={cn(buttonClassName)} disabled={disabled} onClick={handleClick}>\n {label}\n </button>\n <input {...getInputProps()} />\n {error ? (\n <span className=\"smwb-file-input__error\" role=\"alert\">\n {error}\n </span>\n ) : null}\n </div>\n );\n});\n\nexport default FileInput;\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 data-smwb-overlay-layer=\"\"\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\";\nimport { isTopOverlayLayer } from \"../../../utils/overlayLayer\";\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 // Only the topmost overlay layer reacts to Escape.\n if (event.key === \"Escape\" && isTopOverlayLayer(nodeRef.current)) {\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\n className={cn(disableOutsideClick ? \"smwb-sheet__overlay\" : \"smwb-sheet__default\")}\n ref={nodeRef}\n data-smwb-overlay-layer=\"\"\n >\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 data-smwb-overlay-layer=\"\"\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, {\n type CSSProperties,\n type PropsWithChildren,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CSSTransition } from \"react-transition-group\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\n\nexport interface FloatingWindowPosition {\n x: number;\n y: number;\n}\n\nexport interface FloatingWindowSize {\n width: number;\n height: number;\n}\n\n/** The eight edge/corner resize directions. */\nexport type FloatingWindowResizeDir = \"n\" | \"s\" | \"e\" | \"w\" | \"ne\" | \"nw\" | \"se\" | \"sw\";\n\nexport interface FloatingWindowProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onResize\" | \"title\" | \"children\"\n> {\n /** Controlled open state of the window. */\n open: boolean;\n /** Title bar content. When given, the window is labelled by it. */\n title?: ReactNode;\n /** Extra header controls, rendered before the built-in collapse/close buttons. */\n headerActions?: ReactNode;\n\n /** Controlled top-left position in viewport px. */\n position?: FloatingWindowPosition;\n /** Initial position when uncontrolled. */\n defaultPosition?: FloatingWindowPosition;\n /** Called on every move frame and on viewport re-clamp, with the clamped position. */\n onPositionChange?: (position: FloatingWindowPosition) => void;\n /** Called once when a move gesture ends — the point at which to persist. */\n onMoveEnd?: (position: FloatingWindowPosition) => void;\n\n /** Controlled size in px. */\n size?: FloatingWindowSize;\n /** Initial size when uncontrolled. */\n defaultSize?: FloatingWindowSize;\n /** Called on every resize frame and on viewport re-clamp, with the clamped size. */\n onResize?: (size: FloatingWindowSize) => void;\n /** Called once when a resize gesture ends — the point at which to persist. */\n onResizeEnd?: (size: FloatingWindowSize) => void;\n\n /** Minimum width in px (default 200). */\n minWidth?: number;\n /** Minimum height in px (default 120). */\n minHeight?: number;\n /** Maximum width in px (default: viewport width). */\n maxWidth?: number;\n /** Maximum height in px (default: viewport height). */\n maxHeight?: number;\n /** Px of the window that must stay inside the viewport (default 56). */\n keepVisible?: number;\n /** Step in px for keyboard moving (default 24). */\n moveStep?: number;\n /** Step in px for keyboard resizing (default 24). */\n resizeStep?: number;\n\n /** Inline stacking order. The host owns z-order across several windows. */\n zIndex?: number;\n /** Called on pointerdown anywhere in the window, so the host can raise it. */\n onActivate?: () => void;\n\n /** Shade the window down to its title bar. */\n collapsed?: boolean;\n /** Initial collapsed state when uncontrolled. */\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Render the built-in collapse toggle (default true). */\n collapsible?: boolean;\n\n /** Allow drag-to-move by the title bar (default true). */\n movable?: boolean;\n /** Allow drag-to-resize from the edges and corners (default true). */\n resizable?: boolean;\n /** Close on Escape while focus is inside the window (default false). */\n closeOnEsc?: boolean;\n onClose?: () => void;\n\n /** Accessible label for the move handle. */\n moveHandleAriaLabel?: string;\n /** Accessible label for the resize handle. */\n resizeHandleAriaLabel?: string;\n /** Accessible label for the close button. */\n closeAriaLabel?: string;\n /** Accessible label for the collapse toggle while expanded. */\n collapseAriaLabel?: string;\n /** Accessible label for the collapse toggle while collapsed. */\n expandAriaLabel?: string;\n\n \"aria-label\"?: string;\n}\n\ninterface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface Viewport {\n width: number;\n height: number;\n}\n\n/** Sign vector per resize direction: how the pointer delta maps onto x/y/width/height. */\nconst RESIZE_DIRS: Record<FloatingWindowResizeDir, { dx: 0 | 1; dy: 0 | 1; dw: -1 | 0 | 1; dh: -1 | 0 | 1 }> = {\n n: { dx: 0, dy: 1, dw: 0, dh: -1 },\n s: { dx: 0, dy: 0, dw: 0, dh: 1 },\n e: { dx: 0, dy: 0, dw: 1, dh: 0 },\n w: { dx: 1, dy: 0, dw: -1, dh: 0 },\n ne: { dx: 0, dy: 1, dw: 1, dh: -1 },\n nw: { dx: 1, dy: 1, dw: -1, dh: -1 },\n se: { dx: 0, dy: 0, dw: 1, dh: 1 },\n sw: { dx: 1, dy: 0, dw: -1, dh: 1 },\n};\n\nconst RESIZE_ORDER: FloatingWindowResizeDir[] = [\"n\", \"s\", \"e\", \"w\", \"ne\", \"nw\", \"se\", \"sw\"];\n\nconst viewportOf = (): Viewport =>\n typeof window === \"undefined\" ? { width: 0, height: 0 } : { width: window.innerWidth, height: window.innerHeight };\n\nconst DEFAULT_POSITION: FloatingWindowPosition = { x: 24, y: 24 };\nconst DEFAULT_SIZE: FloatingWindowSize = { width: 360, height: 420 };\n\n/**\n * Free-floating, non-modal window: draggable by its title bar, resizable from every\n * edge and corner, clamped so a grabbable strip always stays on screen.\n *\n * Unlike Sheet/Modal it is deliberately NOT an overlay layer: no backdrop, no focus\n * trap, no `data-smwb-overlay-layer`. Several windows are meant to be open and usable\n * at once alongside the page behind them, so it must not trap focus, swallow clicks,\n * or steal Escape from a Modal stacked above it. Stacking order is the host's job —\n * pass `zIndex` and raise the window from `onActivate`.\n */\nexport const FloatingWindow = forwardRef<HTMLDivElement, PropsWithChildren<FloatingWindowProps>>(\n function FloatingWindow(props, ref) {\n const {\n open,\n title,\n headerActions,\n position: positionProp,\n defaultPosition = DEFAULT_POSITION,\n onPositionChange,\n onMoveEnd,\n size: sizeProp,\n defaultSize = DEFAULT_SIZE,\n onResize,\n onResizeEnd,\n minWidth = 200,\n minHeight = 120,\n maxWidth,\n maxHeight,\n keepVisible = 56,\n moveStep = 24,\n resizeStep = 24,\n zIndex,\n onActivate,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n collapsible = true,\n movable = true,\n resizable = true,\n closeOnEsc = false,\n onClose,\n moveHandleAriaLabel = \"Move window\",\n resizeHandleAriaLabel = \"Resize window\",\n closeAriaLabel = \"Close window\",\n collapseAriaLabel = \"Collapse window\",\n expandAriaLabel = \"Expand window\",\n className,\n style,\n children,\n ...rest\n } = props;\n\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n const rootRef = useRef<HTMLDivElement>(null);\n const forkedRootRef = useForkRef<HTMLDivElement>(ref, rootRef);\n const titleId = useId();\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n const [position, setPosition] = useControllableState<FloatingWindowPosition>({\n value: positionProp,\n defaultValue: defaultPosition,\n onChange: onPositionChange,\n });\n const [size, setSize] = useControllableState<FloatingWindowSize>({\n value: sizeProp,\n defaultValue: defaultSize,\n onChange: onResize,\n });\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n value: collapsedProp,\n defaultValue: defaultCollapsed,\n onChange: onCollapsedChange,\n });\n\n /**\n * Size first, then position against the clamped size. `y` is never negative, so the\n * title bar can never be dragged above the top edge and become ungrabbable — the gap\n * that makes an off-screen Sheet unrecoverable.\n */\n const clampRect = useCallback(\n (rectIn: Rect, vp: Viewport): Rect => {\n const maxW = maxWidth ?? vp.width;\n const maxH = maxHeight ?? vp.height;\n const width = Math.max(minWidth, Math.min(maxW, rectIn.width));\n const height = Math.max(minHeight, Math.min(maxH, rectIn.height));\n const keep = Math.min(keepVisible, width);\n const x = Math.max(keep - width, Math.min(vp.width - keep, rectIn.x));\n const y = Math.max(0, Math.min(Math.max(0, vp.height - keep), rectIn.y));\n return { x, y, width, height };\n },\n [keepVisible, maxHeight, maxWidth, minHeight, minWidth]\n );\n\n /**\n * Where a window is placed before anyone touches it: fully inside the viewport when\n * it fits at all. `clampRect` alone only keeps `keepVisible` px reachable, which is\n * right for a window the user parked at an edge but wrong on opening — a 760px\n * default on a 375px phone opened a quarter of a screen off to the right.\n */\n const fitRect = useCallback(\n (rectIn: Rect, vp: Viewport): Rect => {\n const clamped = clampRect(rectIn, vp);\n return {\n ...clamped,\n x: Math.max(0, Math.min(clamped.x, vp.width - clamped.width)),\n y: Math.max(0, Math.min(clamped.y, vp.height - clamped.height)),\n };\n },\n [clampRect]\n );\n\n // Set by the first move/resize: from then on the user's placement wins and only the\n // reachability clamp applies, so a window can still be parked half off-screen.\n const [placed, setPlaced] = useState(false);\n useEffect(() => {\n // A closed window forgets that it was moved: opening it again should land on\n // screen like the first time, whatever the viewport is now.\n if (!open) setPlaced(false);\n }, [open]);\n\n /** The geometry actually rendered. Clamping the CONTROLLED value (not just drag\n * frames) means a rect restored from a larger monitor lands on screen immediately. */\n const current = { x: position.x, y: position.y, width: size.width, height: size.height };\n const rect = placed ? clampRect(current, viewportOf()) : fitRect(current, viewportOf());\n\n // The gesture handlers are attached once (pointer capture), so they must not close over a\n // stale rect. A ref mirroring the rendered rect keeps them reading the current geometry.\n const rectRef = useRef(rect);\n rectRef.current = rect;\n\n const commitRect = useCallback(\n (next: Rect, gesture = true): void => {\n if (gesture) setPlaced(true);\n const clamped = clampRect(next, viewportOf());\n if (clamped.x !== position.x || clamped.y !== position.y) setPosition({ x: clamped.x, y: clamped.y });\n if (clamped.width !== size.width || clamped.height !== size.height) {\n setSize({ width: clamped.width, height: clamped.height });\n }\n },\n [clampRect, position.x, position.y, setPosition, setSize, size.height, size.width]\n );\n\n const commitRectRef = useRef(commitRect);\n commitRectRef.current = commitRect;\n\n // Re-clamp when the viewport shrinks, so a window parked near an edge on a large\n // screen stays reachable on a small one. Sheet has no such listener, which is why a\n // dragged sheet survives a viewport shrink oversized.\n useEffect(() => {\n if (!open) return undefined;\n const onViewportResize = (): void => commitRectRef.current(rectRef.current, false);\n window.addEventListener(\"resize\", onViewportResize);\n return () => window.removeEventListener(\"resize\", onViewportResize);\n }, [open]);\n\n // Escape only while focus is inside this window. FloatingWindow is not an overlay\n // layer, so `isTopOverlayLayer` (document order, not z-index) would be the wrong\n // arbiter with several windows open.\n useEffect(() => {\n if (!open || !closeOnEsc || !onClose) return undefined;\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== \"Escape\") return;\n const root = rootRef.current;\n if (!root || !root.contains(document.activeElement)) return;\n onClose();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [closeOnEsc, onClose, open]);\n\n const activate = useCallback((): void => {\n onActivate?.();\n // Only when focus is elsewhere — an unconditional focus() would steal the caret\n // from an input inside the window on every raise.\n const root = rootRef.current;\n if (root && !root.contains(document.activeElement)) root.focus({ preventScroll: true });\n }, [onActivate]);\n\n // Pointer capture keeps `pointermove` flowing to the handle even outside it, so there\n // are no document-level listeners to leak (Sheet's pattern, not screenDivider's).\n const move = useRef<{ px: number; py: number; x: number; y: number } | null>(null);\n\n const onMoveHandlePointerDown = (event: React.PointerEvent<HTMLDivElement>): void => {\n if (!movable) return;\n // Header buttons stay clickable.\n if ((event.target as Element | null)?.closest(\"button,[data-no-drag]\")) return;\n event.preventDefault();\n const current = rectRef.current;\n move.current = { px: event.clientX, py: event.clientY, x: current.x, y: current.y };\n try {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n } catch {\n /* best-effort */\n }\n };\n\n const onMoveHandlePointerMove = (event: React.PointerEvent<HTMLDivElement>): void => {\n const start = move.current;\n if (!start) return;\n commitRect({\n ...rectRef.current,\n x: start.x + event.clientX - start.px,\n y: start.y + event.clientY - start.py,\n });\n };\n\n const endMove = (event: React.PointerEvent<HTMLDivElement>): void => {\n if (move.current) {\n move.current = null;\n const current = rectRef.current;\n onMoveEnd?.({ x: current.x, y: current.y });\n }\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n };\n\n const resize = useRef<{ dir: FloatingWindowResizeDir; px: number; py: number; rect: Rect } | null>(null);\n\n const onResizePointerDown = (dir: FloatingWindowResizeDir, event: React.PointerEvent<HTMLDivElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n resize.current = { dir, px: event.clientX, py: event.clientY, rect: rectRef.current };\n // Grabbing a resize grip is an interaction with the window, so raise it too — the\n // root handler does not see it because this handler stops propagation.\n activate();\n try {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n } catch {\n /* best-effort */\n }\n };\n\n const onResizePointerMove = (event: React.PointerEvent<HTMLDivElement>): void => {\n const gesture = resize.current;\n if (!gesture) return;\n const sign = RESIZE_DIRS[gesture.dir];\n const dx = event.clientX - gesture.px;\n const dy = event.clientY - gesture.py;\n const start = gesture.rect;\n // A west/north drag moves the origin AND changes the size, so width is recomputed from\n // the moved edge rather than from the delta alone — otherwise dragging past minWidth\n // would keep sliding the window instead of stopping at the minimum.\n //\n // The size must be clamped to BOTH bounds here, before the origin is derived from it.\n // Clamping only the minimum and leaving the maximum to commitRect's own clamp would\n // compute the origin from a width that then gets shrunk, so the edge the user is NOT\n // dragging would drift away under the cursor.\n const vp = viewportOf();\n const maxW = maxWidth ?? vp.width;\n const maxH = maxHeight ?? vp.height;\n const width = Math.min(maxW, Math.max(minWidth, start.width + sign.dw * dx));\n const height = Math.min(maxH, Math.max(minHeight, start.height + sign.dh * dy));\n commitRect({\n x: sign.dx ? start.x + start.width - width : start.x,\n y: sign.dy ? start.y + start.height - height : start.y,\n width,\n height,\n });\n };\n\n const endResize = (event: React.PointerEvent<HTMLDivElement>): void => {\n if (resize.current) {\n resize.current = null;\n const current = rectRef.current;\n onResizeEnd?.({ width: current.width, height: current.height });\n }\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n };\n\n /** A keypress is a COMPLETE gesture, so it reports move/resize end as well as the\n * per-frame change — otherwise a consumer that persists only on `*End` (the documented\n * way to avoid thrashing storage during a drag) would silently never save\n * keyboard-driven geometry. */\n const endKeyboardGesture = (resized: boolean, next: Rect): void => {\n const current = clampRect(next, viewportOf());\n if (resized) onResizeEnd?.({ width: current.width, height: current.height });\n else onMoveEnd?.({ x: current.x, y: current.y });\n };\n\n /** Arrows move; Shift+Arrows resize. */\n const onMoveHandleKeyDown = (event: React.KeyboardEvent<HTMLSpanElement>): void => {\n const current = rectRef.current;\n const step = event.shiftKey ? resizeStep : moveStep;\n const delta: Record<string, [number, number]> = {\n ArrowLeft: [-step, 0],\n ArrowRight: [step, 0],\n ArrowUp: [0, -step],\n ArrowDown: [0, step],\n };\n const d = delta[event.key];\n if (!d) return;\n event.preventDefault();\n const next = event.shiftKey\n ? { ...current, width: current.width + d[0], height: current.height + d[1] }\n : { ...current, x: current.x + d[0], y: current.y + d[1] };\n commitRect(next);\n endKeyboardGesture(event.shiftKey, next);\n };\n\n const onResizeHandleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n const current = rectRef.current;\n const vp = viewportOf();\n let next: Rect;\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n const dir = event.key === \"ArrowRight\" ? 1 : -1;\n next = { ...current, width: current.width + dir * resizeStep };\n } else if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const dir = event.key === \"ArrowDown\" ? 1 : -1;\n next = { ...current, height: current.height + dir * resizeStep };\n } else if (event.key === \"Home\") {\n event.preventDefault();\n next = { ...current, width: minWidth, height: minHeight };\n } else if (event.key === \"End\") {\n event.preventDefault();\n next = { ...current, width: maxWidth ?? vp.width, height: maxHeight ?? vp.height };\n } else {\n return;\n }\n commitRect(next);\n endKeyboardGesture(true, next);\n };\n\n const toggleCollapsed = (): void => setCollapsed((prev) => !prev);\n\n if (!domRoot) {\n return <></>;\n }\n\n const windowStyle: CSSProperties = {\n left: `${rect.x}px`,\n top: `${rect.y}px`,\n width: `${rect.width}px`,\n ...(collapsed ? {} : { height: `${rect.height}px` }),\n ...(zIndex === undefined ? {} : { zIndex }),\n ...(style ?? {}),\n };\n\n return createPortal(\n <CSSTransition\n in={open}\n timeout={120}\n mountOnEnter\n unmountOnExit\n appear\n classNames={{ enterDone: \"smwb-floating-window_entered\" }}\n nodeRef={rootRef}\n >\n <div\n {...rest}\n ref={forkedRootRef}\n data-testid=\"floating-window\"\n role=\"dialog\"\n tabIndex={-1}\n aria-labelledby={title ? titleId : undefined}\n className={cn(\"smwb-floating-window\", className, { \"smwb-collapsed\": collapsed })}\n style={windowStyle}\n onPointerDown={activate}\n >\n <div\n className=\"smwb-floating-window__header\"\n data-testid=\"floating-window-header\"\n onPointerDown={onMoveHandlePointerDown}\n onPointerMove={onMoveHandlePointerMove}\n onPointerUp={endMove}\n onPointerCancel={endMove}\n >\n {/* The move affordance is the grip, not the header: the header also hosts the\n collapse/close buttons and any consumer `headerActions`, and nesting those\n inside a role=\"button\" is an a11y violation. Pointer drag still works\n anywhere on the header; only the keyboard affordance lives here. */}\n <span\n className=\"smwb-floating-window__grip\"\n data-testid=\"floating-window-move\"\n role=\"button\"\n tabIndex={0}\n aria-label={moveHandleAriaLabel}\n onKeyDown={onMoveHandleKeyDown}\n >\n <Icon name=\"drag_indicator\" />\n </span>\n {title ? (\n <span className=\"smwb-floating-window__title\" id={titleId}>\n {title}\n </span>\n ) : null}\n <div className=\"smwb-floating-window__actions\" data-no-drag>\n {headerActions}\n {collapsible ? (\n <button\n type=\"button\"\n className=\"smwb-floating-window__action\"\n data-testid=\"floating-window-collapse\"\n aria-label={collapsed ? expandAriaLabel : collapseAriaLabel}\n aria-expanded={!collapsed}\n onClick={toggleCollapsed}\n >\n <Icon name={collapsed ? \"open_in_full\" : \"close_fullscreen\"} />\n </button>\n ) : null}\n {onClose ? (\n <button\n type=\"button\"\n className=\"smwb-floating-window__action\"\n data-testid=\"floating-window-close\"\n aria-label={closeAriaLabel}\n onClick={onClose}\n >\n <Icon name=\"close\" />\n </button>\n ) : null}\n </div>\n </div>\n\n {!collapsed ? (\n <div className=\"smwb-floating-window__body\" data-testid=\"floating-window-body\">\n {children}\n </div>\n ) : null}\n\n {resizable && !collapsed\n ? RESIZE_ORDER.map((dir) => (\n <div\n key={dir}\n className={cn(\"smwb-floating-window__resize\", `smwb-floating-window__resize_${dir}`)}\n data-testid={`floating-window-resize-${dir}`}\n // Only the south-east grip is reachable by keyboard: eight tab stops per\n // window would make Tab unusable once a few windows are open.\n {...(dir === \"se\"\n ? {\n role: \"separator\" as const,\n tabIndex: 0,\n \"aria-label\": resizeHandleAriaLabel,\n \"aria-valuemin\": minWidth,\n \"aria-valuemax\": Math.round(maxWidth ?? viewportOf().width),\n \"aria-valuenow\": Math.round(rect.width),\n onKeyDown: onResizeHandleKeyDown,\n }\n : { \"aria-hidden\": true, tabIndex: -1 })}\n onPointerDown={(event) => onResizePointerDown(dir, event)}\n onPointerMove={onResizePointerMove}\n onPointerUp={endResize}\n onPointerCancel={endResize}\n />\n ))\n : null}\n </div>\n </CSSTransition>,\n domRoot\n );\n }\n);\n\nexport default FloatingWindow;\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","resolvePlacement","placement","alignment","autoPlacement","FLOATING_OFFSET_PX","FLOATING_SHIFT_PADDING_PX","buildFloatingMiddleware","custom","flip","shift","offset","DEFAULT_PLACEMENT","DEFAULT_OFFSET_PX","SHIFT_PADDING_PX","rectFromPoint","x","y","useHoverPopover","params","offsetPx","openDelay","closeDelay","middleware","open","setOpen","cursorRef","anchorRef","anchorElRef","openTimerRef","closeTimerRef","floatingMiddleware","refs","floatingStyles","update","useFloating","autoUpdate","virtualReference","clearTimers","freezeAnchor","openNow","scheduleOpen","scheduleClose","close","setVirtualAnchor","point","setAnchorEl","element","handleEnter","handleMove","getReferenceProps","userHandlers","cancelClose","getFloatingProps","userProps","acceptToString","accept","mime","exts","useDropzone","options","inputRef","isDragActive","setIsDragActive","optionsRef","handleFiles","list","maxFiles","onDrop","onDropAccepted","files","getRootProps","_b","getInputProps","IconContext","createContext","IconProvider","source","icons","children","jsx","getConfiguredSource","getIconConfig","useIconSource","override","context","useContext","configured","useSyncExternalStore","subscribeIcons","COLOR_TOKENS","warned","warnMissing","name","Icon","forwardRef","className","weight","fill","size","grade","color","title","props","ref","resolvedSource","lookup","getSnapshot","getIcon","registered","definition","glyph","mode","decorative","colorClass","cssSize","strokeWidth","cn","Ripple","actionRef","classes","center","style","duration","rest","ripples","setRipples","nextKey","rect","diameter","radius","coordX","coordY","prevRipples","setRef","useForkRef","instance","isNumber","n","number","isPercentage","height","hideContent","showContent","ANIMATION_STATE_CLASSES","getStaticStateClasses","animationStateClasses","classNames","AnimateHeight","animateOpacity","applyInlineTransitions","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","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","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","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","resolveChatMessageStatusLabel","isImageAttachment","attachment","formatChatTimestamp","date","resolveAllowedLayouts","input","pickInitialLayout","allowed","preferred","getChatLayoutActions","allowedLayouts","currentLayout","shouldShowChatCloseButton","shouldComposerNewlineOnEnter","shiftEnterNewline","ctrlEnterNewline","isCtrl","stopPropagation","insertNewlineAtCursor","start","end","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","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","useChatFileUpload","onUploadFiles","resolvedMaxFiles","getDropzoneRootProps","getDropzoneInputProps","_onClick","extra","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","OVERLAY_LAYER_ATTR","overlayLayers","isEventInForeignOverlay","node","isTopOverlayLayer","all","top","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","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","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","lastToggledRef","selectedIds","setSelectedIds","changed","toggleExpanded","has","toggleSelected","ensureLoaded","nodeId","renderNode","path","resolvedChildren","isLazy","hasChildNodes","onLabelClick","idx","tree","d","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","ConfirmDialog","subject","danger","onCancel","subjectId","messageId","describedBy","useSnackbarsPortal","domElement","setDomElement","v4","SnackTransition","snack","autoClose","autoCloseTime","snackRest","onSnackRemove","Snackbar","_c","_d","_e","SnackbarContext","SnackbarProvider","closeOnClick","snacks","setSnacks","snackbarDomRoot","addSnackbar","key","clearAllSnackbars","clearFirstSnackbar","clearLastSnackbar","clearByIdSnackbar","currentPositions","acc","currentPosition","snackbars","TransitionGroup","isAutoClose","action","timerClose","setCloseTimer","Element","useSnackbar","Tooltip","trigger","hoverOpen","setHoverOpen","clickOpen","setClickOpen","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","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","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","isImageFile","file","Preview","handleRemoveAll","previewCols","galleryItemSize","previewClassName","previewClasses","CountPreview","filesLength","PreviewWrapper","FileDrop","onDropProp","dropzoneOptions","setFiles","acceptedFiles","wrapperClasses","FileInput","onFilesSelected","buttonClassName","accepted","handleClick","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","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","RESIZE_DIRS","RESIZE_ORDER","viewportOf","DEFAULT_POSITION","DEFAULT_SIZE","FloatingWindow","positionProp","defaultPosition","onPositionChange","onMoveEnd","sizeProp","defaultSize","onResizeEnd","minWidth","minHeight","maxHeight","keepVisible","moveStep","zIndex","onActivate","collapsible","movable","moveHandleAriaLabel","titleId","setPosition","setSize","clampRect","rectIn","vp","maxW","maxH","keep","fitRect","placed","setPlaced","rectRef","commitRect","gesture","commitRectRef","onViewportResize","activate","move","onMoveHandlePointerDown","onMoveHandlePointerMove","endMove","resize","onResizePointerDown","dir","onResizePointerMove","sign","dx","dy","endResize","endKeyboardGesture","resized","onMoveHandleKeyDown","onResizeHandleKeyDown","toggleCollapsed","windowStyle","flexAlign","resolveGap","Stack","justify","Page","PageHeader","breadcrumbs","AppLayout","sidebar","sidebarWidth","sidebarCollapsed","defaultSidebarCollapsed","onSidebarCollapsedChange","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","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/utils/floating.ts","../src/hooks/useHoverPopover.ts","../src/hooks/useDropzone.ts","../src/components/base/icon/iconProvider.tsx","../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/utils/overlayLayer.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/hooks/useHelperText.ts","../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/personChip/personChip.tsx","../src/components/dataDisplay/badge/badge.tsx","../src/utils/ownClick.ts","../src/utils/controlProps.ts","../src/components/dataDisplay/card/card.tsx","../src/components/dataDisplay/stat/stat.tsx","../src/components/dataDisplay/chip/chip.tsx","../src/components/dataDisplay/chipGroup/chipGroup.tsx","../src/components/dataDisplay/meter/meter.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/kanban/kanban.tsx","../src/components/dataDisplay/list/listItem.tsx","../src/components/dataDisplay/list/list.tsx","../src/components/dataDisplay/descriptionList/descriptionList.tsx","../src/components/dataDisplay/table/tablePagination/tablePagination.tsx","../src/components/dataDisplay/table/tableColumns.tsx","../src/components/dataDisplay/table/table.tsx","../src/components/dataDisplay/table/tableRow.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/treeView/treeView.tsx","../src/components/dataDisplay/timeline/timeline.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/confirmDialog/confirmDialog.tsx","../src/components/feedBack/emptyState/emptyState.tsx","../src/components/feedBack/snackbar/useSnackbarsPortal.ts","../src/components/feedBack/snackbar/snackbar.tsx","../src/hooks/useDismissOnEscape.ts","../src/components/feedBack/tooltip/tooltip.tsx","../src/components/inputs/buttonGroups/buttonGroup.tsx","../src/utils/readOnlyToggle.ts","../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/fileDrop/utils.ts","../src/components/inputs/fileDrop/preview.tsx","../src/components/inputs/fileDrop/countPreview.tsx","../src/components/inputs/fileDrop/previewWrapper.tsx","../src/components/inputs/fileDrop/fileDrop.tsx","../src/components/inputs/fileInput/fileInput.tsx","../src/components/inputs/radioButton/radioButton.tsx","../src/components/inputs/rating/rating.tsx","../src/components/inputs/selectField/dropdownMenu.tsx","../src/components/inputs/selectField/optionNavigation.ts","../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/floatingWindow/floatingWindow.tsx","../src/components/layout/stack/stack.tsx","../src/components/layout/page/page.tsx","../src/components/layout/pageHeader/pageHeader.tsx","../src/components/layout/sectionHeader/sectionHeader.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\n/**\n * `useLayoutEffect` in the browser, `useEffect` where there is no `window` (a\n * server render), so React does not warn that a layout effect does nothing on\n * the server. Decided per call rather than once at import: the environment of\n * the render is what counts, and a render never switches between the two.\n */\nexport function useSafeLayoutEffect(effect: React.EffectCallback, deps?: React.DependencyList): void {\n (typeof window === \"undefined\" ? React.useEffect : React.useLayoutEffect)(effect, deps);\n}\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\n/** Elements in the Tab order (hidden ones match too). */\nexport const 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 { 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 { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties, PointerEvent as ReactPointerEvent } from \"react\";\nimport { autoUpdate, flip, offset, shift, useFloating } from \"@floating-ui/react\";\nimport type { Middleware, VirtualElement } from \"@floating-ui/react\";\nimport { resolvePlacement } from \"../utils/floating\";\nimport type { Placement } from \"../utils/floating\";\n\nexport interface UseHoverPopoverParams {\n /** Placement of the popover relative to its anchor. Default `\"bottom-start\"`. */\n placement?: Placement;\n /** Offset (px) applied on both axes between the anchor and the popover. Default `4`. */\n offsetPx?: number;\n /** Delay (ms) before opening after pointer enter. Default `0`. */\n openDelay?: number;\n /** Delay (ms) before closing after pointer leave. Default `0`. */\n closeDelay?: number;\n /** Extra floating-ui middleware appended after the smwb defaults. */\n middleware?: Middleware[];\n}\n\n/** A pointer position in viewport (client) coordinates. */\nexport interface HoverPopoverPoint {\n x: number;\n y: number;\n}\n\nexport interface HoverPopoverReferenceProps {\n onPointerEnter: (event: ReactPointerEvent) => void;\n onPointerMove: (event: ReactPointerEvent) => void;\n onPointerLeave: (event: ReactPointerEvent) => void;\n}\n\nexport interface HoverPopoverFloatingProps {\n ref: (node: HTMLElement | null) => void;\n style: CSSProperties;\n onPointerEnter: () => void;\n onPointerLeave: () => void;\n}\n\nexport interface UseHoverPopoverResult {\n /** Whether the popover is currently open. */\n open: boolean;\n /**\n * Pointer handlers for the trigger element(s). Spread on a single anchor, or\n * on EVERY row of a list/table to share one popover across many triggers. By\n * default the popover is anchored to the cursor position frozen when it opens.\n * Pass your own handlers to compose them (e.g. to mark which row is active).\n */\n getReferenceProps: (userHandlers?: Partial<HoverPopoverReferenceProps>) => HoverPopoverReferenceProps;\n /** Props for the single floating element; keeps it open while it is hovered. */\n getFloatingProps: (userProps?: { style?: CSSProperties }) => HoverPopoverFloatingProps;\n /** Anchor the popover to a real element instead of the cursor (`null` clears it). */\n setAnchorEl: (element: Element | null) => void;\n /** Anchor the popover to an explicit point, e.g. an external cursor source. */\n setVirtualAnchor: (point: HoverPopoverPoint) => void;\n /** Open immediately, ignoring `openDelay`. */\n openNow: () => void;\n /** Open after `openDelay`. */\n scheduleOpen: () => void;\n /** Close after `closeDelay`. */\n scheduleClose: () => void;\n /** Close immediately. */\n close: () => void;\n}\n\nconst DEFAULT_PLACEMENT: Placement = \"bottom-start\";\nconst DEFAULT_OFFSET_PX = 4;\nconst SHIFT_PADDING_PX = 8;\n\nconst rectFromPoint = ({ x, y }: HoverPopoverPoint) => ({\n x,\n y,\n top: y,\n left: x,\n right: x,\n bottom: y,\n width: 0,\n height: 0,\n});\n\n/**\n * Headless hover-popover positioning.\n *\n * Wraps floating-ui with the smwb placement / offset / flip / shift conventions\n * but imposes NO DOM structure: spread `getReferenceProps()` on any trigger\n * (including a `<tr>`, which the wrapper-based `<Tooltip>` cannot do) and\n * `getFloatingProps()` on a single floating element you render yourself.\n *\n * The default anchor is the cursor point frozen when the popover opens (a\n * floating-ui virtual element), so ONE instance can serve a whole table/list —\n * call `getReferenceProps()` on every row and render one shared popover instead\n * of mounting one floating engine per row. Use `setAnchorEl` to anchor to a\n * real element instead.\n */\nexport function useHoverPopover(params: UseHoverPopoverParams = {}): UseHoverPopoverResult {\n const {\n placement = DEFAULT_PLACEMENT,\n offsetPx = DEFAULT_OFFSET_PX,\n openDelay = 0,\n closeDelay = 0,\n middleware,\n } = params;\n\n const [open, setOpen] = useState(false);\n\n const cursorRef = useRef<HoverPopoverPoint>({ x: 0, y: 0 });\n const anchorRef = useRef<HoverPopoverPoint>({ x: 0, y: 0 });\n const anchorElRef = useRef<Element | null>(null);\n const openTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const resolved = resolvePlacement(placement);\n\n const floatingMiddleware = useMemo<Middleware[]>(\n () => [\n offset({ mainAxis: offsetPx, crossAxis: offsetPx }),\n ...(resolved.autoMiddleware ? [resolved.autoMiddleware] : [flip()]),\n shift({ padding: SHIFT_PADDING_PX }),\n ...(middleware ?? []),\n ],\n [offsetPx, resolved.autoMiddleware, middleware]\n );\n\n const { refs, floatingStyles, update } = useFloating({\n open,\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: floatingMiddleware,\n });\n\n const virtualReference = useMemo<VirtualElement>(\n () => ({ getBoundingClientRect: () => rectFromPoint(anchorRef.current) }),\n []\n );\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 // Apply the active anchor (element or frozen cursor) whenever the popover\n // opens; autoUpdate keeps it positioned while the floating element is mounted.\n useEffect(() => {\n if (!open) return;\n refs.setPositionReference(anchorElRef.current ?? virtualReference);\n void update();\n }, [open, refs, update, virtualReference]);\n\n const freezeAnchor = useCallback(() => {\n if (anchorElRef.current === null) anchorRef.current = cursorRef.current;\n }, []);\n\n const openNow = useCallback(() => {\n clearTimers();\n freezeAnchor();\n setOpen(true);\n }, [clearTimers, freezeAnchor]);\n\n const scheduleOpen = useCallback(() => {\n clearTimers();\n if (openDelay <= 0) {\n freezeAnchor();\n setOpen(true);\n return;\n }\n openTimerRef.current = setTimeout(() => {\n freezeAnchor();\n setOpen(true);\n }, openDelay);\n }, [clearTimers, freezeAnchor, openDelay]);\n\n const scheduleClose = useCallback(() => {\n clearTimers();\n if (closeDelay <= 0) {\n setOpen(false);\n return;\n }\n closeTimerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimers, closeDelay]);\n\n const close = useCallback(() => {\n clearTimers();\n setOpen(false);\n }, [clearTimers]);\n\n const setVirtualAnchor = useCallback((point: HoverPopoverPoint) => {\n anchorElRef.current = null;\n anchorRef.current = point;\n }, []);\n\n const setAnchorEl = useCallback((element: Element | null) => {\n anchorElRef.current = element;\n }, []);\n\n const handleEnter = useCallback(\n (event: ReactPointerEvent) => {\n cursorRef.current = { x: event.clientX, y: event.clientY };\n scheduleOpen();\n },\n [scheduleOpen]\n );\n\n const handleMove = useCallback((event: ReactPointerEvent) => {\n cursorRef.current = { x: event.clientX, y: event.clientY };\n }, []);\n\n const getReferenceProps = useCallback<UseHoverPopoverResult[\"getReferenceProps\"]>(\n (userHandlers) => ({\n onPointerEnter: (event) => {\n userHandlers?.onPointerEnter?.(event);\n handleEnter(event);\n },\n onPointerMove: (event) => {\n userHandlers?.onPointerMove?.(event);\n handleMove(event);\n },\n onPointerLeave: (event) => {\n userHandlers?.onPointerLeave?.(event);\n scheduleClose();\n },\n }),\n [handleEnter, handleMove, scheduleClose]\n );\n\n const cancelClose = useCallback(() => {\n clearTimers();\n setOpen(true);\n }, [clearTimers]);\n\n const getFloatingProps = useCallback<UseHoverPopoverResult[\"getFloatingProps\"]>(\n (userProps) => ({\n ref: refs.setFloating,\n style: { ...floatingStyles, ...userProps?.style },\n onPointerEnter: cancelClose,\n onPointerLeave: scheduleClose,\n }),\n [refs, floatingStyles, cancelClose, scheduleClose]\n );\n\n return {\n open,\n getReferenceProps,\n getFloatingProps,\n setAnchorEl,\n setVirtualAnchor,\n openNow,\n scheduleOpen,\n scheduleClose,\n close,\n };\n}\n","import React from \"react\";\n\n/** Record of mime → extensions (react-dropzone's `Accept` shape), or a raw accept string. */\nexport type DropzoneAccept = Record<string, string[]> | string;\n\nexport interface DropzoneOptions {\n /** Record of mime → extensions, or a raw accept string. */\n accept?: DropzoneAccept | undefined;\n multiple?: boolean | undefined;\n maxFiles?: number | undefined;\n disabled?: boolean | undefined;\n onDrop?: ((files: File[], event: React.SyntheticEvent | Event) => void) | undefined;\n onDropAccepted?: ((files: File[], event: React.SyntheticEvent | Event) => void) | undefined;\n}\n\nexport interface DropzoneRootProps {\n onClick: () => void;\n onDragOver: (event: React.DragEvent<HTMLElement>) => void;\n onDragLeave: () => void;\n onDrop: (event: React.DragEvent<HTMLElement>) => void;\n}\n\nexport interface DropzoneInputProps {\n type: \"file\";\n multiple: boolean | undefined;\n accept: string | undefined;\n disabled: boolean | undefined;\n style: React.CSSProperties;\n ref: React.RefObject<HTMLInputElement>;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\nexport interface DropzoneState {\n getRootProps: () => DropzoneRootProps;\n getInputProps: () => DropzoneInputProps;\n inputRef: React.RefObject<HTMLInputElement>;\n isDragActive: boolean;\n open: () => void;\n}\n\nfunction acceptToString(accept: DropzoneOptions[\"accept\"]): string | undefined {\n if (!accept) return undefined;\n if (typeof accept === \"string\") return accept;\n return Object.entries(accept)\n .flatMap(([mime, exts]) => [mime, ...exts])\n .join(\",\");\n}\n\n/**\n * Dependency-free file dropzone — the React twin of ui-solid's `createDropzone`.\n * Provides root/input prop getters, drag-active state and a programmatic `open()`.\n *\n * Replaces the `react-dropzone` import this package used to carry: that package was\n * only ever a devDependency while the build externalises every bare import, so the\n * published bundle asked consumers for a module they were never told to install.\n */\nexport function useDropzone(options: DropzoneOptions = {}): DropzoneState {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [isDragActive, setIsDragActive] = React.useState(false);\n\n // Latest options without re-creating the prop getters on every render.\n const optionsRef = React.useRef(options);\n optionsRef.current = options;\n\n const open = React.useCallback((): void => {\n if (!optionsRef.current.disabled) inputRef.current?.click();\n }, []);\n\n const handleFiles = React.useCallback((list: FileList | null, event: React.SyntheticEvent | Event): void => {\n if (!list) return;\n const { maxFiles, onDrop, onDropAccepted } = optionsRef.current;\n let files = Array.from(list);\n if (maxFiles && maxFiles > 0) files = files.slice(0, maxFiles);\n onDrop?.(files, event);\n onDropAccepted?.(files, event);\n }, []);\n\n const getRootProps = React.useCallback(\n (): DropzoneRootProps => ({\n onClick: () => open(),\n onDragOver: (event) => {\n event.preventDefault();\n if (!optionsRef.current.disabled) setIsDragActive(true);\n },\n onDragLeave: () => setIsDragActive(false),\n onDrop: (event) => {\n event.preventDefault();\n setIsDragActive(false);\n if (!optionsRef.current.disabled) handleFiles(event.dataTransfer?.files ?? null, event);\n },\n }),\n [handleFiles, open]\n );\n\n const getInputProps = React.useCallback(\n (): DropzoneInputProps => ({\n type: \"file\",\n multiple: optionsRef.current.multiple,\n accept: acceptToString(optionsRef.current.accept),\n disabled: optionsRef.current.disabled,\n style: { display: \"none\" },\n ref: inputRef,\n onChange: (event) => handleFiles(event.currentTarget.files, event),\n }),\n [handleFiles]\n );\n\n return { getRootProps, getInputProps, inputRef, isDragActive, open };\n}\n\nexport default useDropzone;\n","import { createContext, useContext, useMemo, useSyncExternalStore, type ReactNode } from \"react\";\nimport { registerIcons, type IconInput } from \"../../../icons/registry\";\nimport { getIconConfig } from \"../../../icons/config\";\nimport { subscribeIcons } from \"../../../icons/store\";\nimport type { IconSource } from \"../../../icons/types\";\n\nexport interface IconContextValue {\n /** Icon artwork for this subtree. Falls back to {@link configureIcons}. */\n source?: IconSource;\n}\n\nexport const IconContext = createContext<IconContextValue | null>(null);\n\nexport interface IconProviderProps extends IconContextValue {\n /**\n * Icons to make available to `<Icon name=\"...\">` inside this subtree.\n *\n * ```tsx\n * import { add, close, search } from \"@smwb/ui-react/icons\";\n *\n * <IconProvider source=\"smwb\" icons={[add, close, search]}>\n * <App />\n * </IconProvider>\n * ```\n *\n * Registration is process-wide (the registry is a module singleton), so the\n * prop is a convenience for apps that would otherwise call `registerIcons`\n * at startup — not a scoping mechanism.\n */\n icons?: IconInput;\n children?: ReactNode;\n}\n\n/**\n * Sets the icon source — and optionally registers icons — for a subtree.\n * `<Icon source>` still wins over the provider, and the provider wins over the\n * app-wide {@link configureIcons} default.\n */\nexport function IconProvider({ source, icons, children }: IconProviderProps) {\n // Icons have to be in the registry before the subtree's first paint, so this\n // cannot wait for an effect. registerIcons is idempotent, which keeps it safe\n // under StrictMode's double render.\n useMemo(() => {\n if (icons) registerIcons(icons);\n }, [icons]);\n\n const value = useMemo<IconContextValue>(() => ({ source }), [source]);\n return <IconContext.Provider value={value}>{children}</IconContext.Provider>;\n}\n\nconst getConfiguredSource = (): IconSource => getIconConfig().source;\n\n/**\n * Resolves the icon source the way `<Icon>` does: explicit prop, then the\n * nearest {@link IconProvider}, then the app-wide config (`\"auto\"` by default).\n */\nexport function useIconSource(override?: IconSource): IconSource {\n const context = useContext(IconContext);\n const configured = useSyncExternalStore(subscribeIcons, getConfiguredSource, getConfiguredSource);\n return override ?? context?.source ?? configured;\n}\n\nexport default IconProvider;\n","import { forwardRef, HTMLAttributes, useSyncExternalStore } from \"react\";\nimport cn from \"clsx\";\nimport { getIcon } from \"../../../icons/registry\";\nimport { getIconConfig } from \"../../../icons/config\";\nimport { subscribeIcons } from \"../../../icons/store\";\nimport type { IconDefinition, IconSource } from \"../../../icons/types\";\nimport { useIconSource } from \"./iconProvider\";\n\nexport type IconColor = \"inherit\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\" | \"disabled\";\n\nconst COLOR_TOKENS = [\"primary\", \"secondary\", \"error\", \"success\", \"warning\", \"info\", \"disabled\"];\n\nconst warned = new Set<string>();\n\nfunction warnMissing(name: string): void {\n if (!getIconConfig().warnOnMissing || warned.has(name)) return;\n warned.add(name);\n // eslint-disable-next-line no-console -- a missing icon is silent otherwise\n console.warn(\n `[smwb] Icon \"${name}\" is not registered. Register it (import { ${name} } from \"@smwb/ui-react/icons\") ` +\n `or use source=\"auto\" to fall back to Material Symbols.`\n );\n}\n\nexport interface IconProps extends HTMLAttributes<HTMLSpanElement> {\n /**\n * Icon name — the Google Material Symbols name, e.g. `\"arrow_right_alt\"`.\n * Lookup is forgiving: `arrowRightAlt` and `arrow-right-alt` resolve too, as\n * do an icon's aliases.\n *\n * An {@link IconDefinition} may be passed instead, which skips the registry\n * entirely and is the most bundle-friendly form:\n *\n * ```tsx\n * import { arrowRightAlt } from \"@smwb/ui-react/icons\";\n * <Icon name={arrowRightAlt} />\n * ```\n */\n name: string | IconDefinition;\n className?: string;\n /**\n * Material Symbols weight axis (100-700). For the smwb SVG set it maps to the\n * stroke width: 400 → 2px, 700 → 3px, 100 → 1px.\n */\n weight?: number;\n /** Material Symbols FILL axis. Not used by the smwb SVG set (it is a contour set). */\n fill?: 0 | 1;\n /** Pixel number or any CSS length (e.g. \"1.5rem\"). */\n size?: number | string;\n /** Material Symbols GRAD axis. Not used by the smwb SVG set. */\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, also shown as a tooltip. A non-empty `title`,\n * `aria-label` or `aria-labelledby` names the icon: it is exposed as\n * `role=\"img\"`, or with the `role` you pass. Without any of them the icon is\n * decorative and `aria-hidden`.\n */\n title?: string;\n /** Overrides the icon source for this icon only. See {@link IconSource}. */\n source?: IconSource;\n /** Test id of the root `<span>`; `icon` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const Icon = forwardRef<HTMLSpanElement, IconProps>(function Icon(\n {\n className,\n weight = 400,\n fill = 0,\n size = 20,\n grade = 100,\n name,\n color = \"inherit\",\n title,\n source,\n \"data-testid\": dataTestId = \"icon\",\n ...props\n },\n ref\n) {\n const resolvedSource = useIconSource(source);\n const lookup = typeof name === \"string\" ? name : null;\n // Subscribing keeps late registrations (lazy chunks, Storybook HMR) from\n // leaving a mounted icon blank. getIcon returns the same object for the same\n // registration, so the snapshot is stable.\n const getSnapshot = () => (lookup === null ? null : (getIcon(lookup) ?? null));\n const registered = useSyncExternalStore(subscribeIcons, getSnapshot, getSnapshot);\n const definition = typeof name === \"object\" ? name : registered;\n const glyph = typeof name === \"string\" ? name : name.name;\n\n const mode =\n resolvedSource === \"google\" ? \"google\" : definition ? \"smwb\" : resolvedSource === \"smwb\" ? \"missing\" : \"google\";\n if (mode === \"missing\") warnMissing(glyph);\n\n const decorative = !(title || props[\"aria-label\"] || props[\"aria-labelledby\"]);\n const colorClass = color && COLOR_TOKENS.includes(color) ? `smwb-icon_color-${color}` : null;\n const cssSize = typeof size === \"number\" ? `${size}px` : size;\n const strokeWidth = Math.round(Math.min(3, Math.max(1, weight / 200)) * 100) / 100;\n\n return (\n <span\n {...props}\n ref={ref}\n data-testid={dataTestId}\n data-icon-source={mode}\n // An unnamed icon is hidden over the caller's aria-hidden. A named one is\n // an image unless the caller gives it a role, and a title names it over\n // the caller's aria-label.\n role={props.role ?? (decorative ? undefined : \"img\")}\n aria-hidden={decorative ? true : props[\"aria-hidden\"]}\n aria-label={title || props[\"aria-label\"]}\n title={title}\n style={{\n ...props.style,\n ...(mode === \"google\"\n ? { fontVariationSettings: `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' 48` }\n : null),\n }}\n className={cn(\"smwb-icon__wrapper\", colorClass, className)}\n >\n {mode === \"google\" ? (\n <span className=\"material-symbols-outlined\" style={{ fontSize: cssSize }}>\n {glyph}\n </span>\n ) : (\n <svg\n className=\"smwb-icon__svg\"\n viewBox={definition?.viewBox ?? \"0 0 24 24\"}\n style={{ width: cssSize, height: cssSize }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n dangerouslySetInnerHTML={{ __html: definition?.body ?? \"\" }}\n />\n )}\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 /** Extra classes: `ripple` for the root, `child` for each ripple. */\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 /** Test id of the root `<span>`; `ripple` unless given. */\n \"data-testid\"?: string;\n}\n\n/**\n * ⚠️ Для правильной работы этого эффекта, установите у компонента родителя CSS: **position: relative;**\n */\n\nexport const Ripple = forwardRef<HTMLSpanElement, RippleProps>(function Ripple(\n { actionRef, className, classes, center, duration = 600, color, \"data-testid\": dataTestId = \"ripple\", ...rest },\n ref\n) {\n const [ripples, setRipples] = React.useState<React.ReactNode[]>([]);\n const nextKey = React.useRef<number>(0);\n // Removal timers still pending. Unmounting clears them: one left running would\n // set state on the unmounted Ripple, and in a test that ends first it fires\n // after jsdom's teardown, where React's setState throws \"window is not defined\".\n const timeouts = React.useRef(new Set<ReturnType<typeof setTimeout>>());\n\n React.useEffect(() => {\n const pending = timeouts.current;\n return () => {\n pending.forEach((timeout) => clearTimeout(timeout));\n pending.clear();\n };\n }, []);\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 left: coordX,\n top: coordY,\n width: diameter,\n height: diameter,\n backgroundColor: color,\n }}\n />,\n ]);\n\n nextKey.current += 1;\n\n const timeout = setTimeout(() => {\n timeouts.current.delete(timeout);\n setRipples((prevRipples) => prevRipples.slice(1));\n }, duration);\n timeouts.current.add(timeout);\n },\n }),\n [center, ripples, classes?.child, duration, color]\n );\n\n return (\n <span\n {...rest}\n ref={ref}\n className={cn(\"smwb-ripple\", className, classes?.ripple)}\n data-testid={dataTestId}\n aria-hidden=\"true\"\n >\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, { type Height } from \"../../base/animateHeight/animateHeight\";\nimport Icon from \"../../base/icon/icon\";\nimport { useId } from \"../../../hooks/useId\";\n\n/**\n * `filled` — the header is an app-bar strip on a raised panel (the original look).\n * `outlined` — a bordered card with a flat header: for feeds of records.\n * `plain` — no frame, a divider under each panel: for FAQ-style lists.\n * The flat variants stretch to the container and wrap long titles.\n */\nexport type AccordionVariant = \"filled\" | \"outlined\" | \"plain\";\n\nexport interface AccordionProps {\n className?: string;\n /** Header text or markup (a date, an author, a badge…). */\n title?: ReactNode;\n /** Secondary line under the title. */\n subtitle?: ReactNode;\n variant?: AccordionVariant;\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 /** Rendered after the title, before the expand icon. */\n endAdornment?: (isOpen: boolean) => React.ReactNode;\n noIcon?: boolean;\n /** Create the content on first open instead of up front. */\n lazy?: boolean;\n /** Remove the content once the panel has collapsed (created again on open). */\n unmountOnExit?: 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 subtitle,\n variant = \"filled\",\n isOpenByDefault = false,\n open,\n disabled,\n icon,\n id: idProp,\n children,\n startAdornment,\n endAdornment,\n noIcon,\n lazy,\n unmountOnExit,\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 // Deferred content (lazy / unmountOnExit) exists only once the panel has been\n // opened; unmountOnExit drops it again when the collapse animation ends.\n const deferred = Boolean(lazy || unmountOnExit);\n const [present, setPresent] = useState<boolean>(isOpen);\n if (isOpen && !present) {\n setPresent(true);\n }\n const onCollapsed = (height: Height) => {\n if (height === 0 && unmountOnExit && !isOpen) {\n setPresent(false);\n }\n };\n // A deferred panel keeps its region (it has nothing to test yet); otherwise\n // the region is there when there is content.\n const hasContent = deferred ? children !== undefined : Boolean(children);\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\n ref={ref}\n className={cn(\"smwb-accordion\", `smwb-accordion_${variant}`, { \"smwb-disabled\": disabled }, className)}\n data-testid=\"accordion\"\n >\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={hasContent ? contentId : undefined}\n >\n {startAdornment?.(isOpen)}\n <span className=\"smwb-accordion__heading\">\n <span className=\"smwb-accordion__title\">{title}</span>\n {subtitle ? <span className=\"smwb-accordion__subtitle\">{subtitle}</span> : null}\n </span>\n {endAdornment ? <span className=\"smwb-accordion__end\">{endAdornment(isOpen)}</span> : null}\n {!noIcon && (icon ?? <Icon className={arrowIconClasses} name=\"expand_more\" size={24} />)}\n </button>\n\n {hasContent && (\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 onHeightAnimationEnd={onCollapsed}\n >\n {!deferred || present ? children : null}\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 /** Test id of the root; `button`, or `button-link` for a link, unless given. */\n \"data-testid\"?: string;\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 // The button sets this on its root too; its own handler calls the caller's first.\n onPointerDown: onPointerDownProp,\n fullWidth,\n rippleCenter,\n disableRipple,\n\n size = \"medium\",\n colorTheme = \"primary\",\n color: colorProp,\n \"data-testid\": dataTestId,\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 onPointerDownProp?.(event);\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={dataTestId ?? \"button-link\"}\n ref={ref as React.LegacyRef<HTMLAnchorElement>}\n className={classes}\n href={href}\n target=\"_blank\"\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n {...rest}\n // A default: the caller's rel wins, and an explicit undefined keeps it.\n rel={rest.rel ?? \"noreferrer\"}\n >\n {icon && iconElement}\n {label ? label : children}\n {rippleElement}\n </a>\n );\n }\n\n return (\n <button\n data-testid={dataTestId ?? \"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","/** Attribute marking the root of a portaled overlay layer (modal, sheet wrapper, dropdown, …). */\nexport const OVERLAY_LAYER_ATTR = \"data-smwb-overlay-layer\";\n\n/** All open overlay layers in document order (last = topmost). */\nconst overlayLayers = (): Element[] =>\n typeof document === \"undefined\" ? [] : Array.from(document.querySelectorAll(`[${OVERLAY_LAYER_ATTR}]`));\n\n/**\n * True when `event` happened inside an overlay layer above `node`, so the\n * interaction is not a \"click away\" from `node`. A layer is above `node` when it\n * comes later in document order (portaled after it, as everything opened from\n * inside `node` is) or sits inside it. A layer that holds `node` or comes before\n * it is below: a click in the Modal a select menu was opened from is a click away\n * from the menu.\n */\nexport const isEventInForeignOverlay = (event: Event, node: Element): boolean => {\n if (typeof event.composedPath !== \"function\") return false;\n // A layer detached during the dispatch can't be ranked; it counts as above.\n const above = Node.DOCUMENT_POSITION_FOLLOWING | Node.DOCUMENT_POSITION_DISCONNECTED;\n return event\n .composedPath()\n .some(\n (el) =>\n el instanceof Element && el.hasAttribute(OVERLAY_LAYER_ATTR) && (node.compareDocumentPosition(el) & above) !== 0\n );\n};\n\n/**\n * True when `el` belongs to the topmost open overlay layer (or no layers are\n * open). Used to make Escape close only the top layer instead of every layer.\n * A layer inside `el`, such as a select menu rendered into a Modal through\n * `menuContainer`, is above `el` rather than part of it.\n */\nexport const isTopOverlayLayer = (el: Element | null | undefined): boolean => {\n if (!el) return true;\n const all = overlayLayers();\n const top = all[all.length - 1];\n return !top || top === el || top.contains(el);\n};\n\n/**\n * True when an open overlay layer other than `el` sits above it: inside it, or\n * later in document order (portaled after it). FloatingWindow and the fullscreen\n * ExpansionPanel leave Escape to such a layer, e.g. a select menu opened from\n * inside them. Layers earlier in document order are below `el`.\n */\nexport const hasOverlayLayerAbove = (el: Element | null | undefined): boolean => {\n if (!el || !el.isConnected) return false;\n return overlayLayers().some((layer) => (el.compareDocumentPosition(layer) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0);\n};\n","import React, { forwardRef, ReactNode, useEffect, useRef, 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 { FOCUSABLE } from \"../../../hooks/useFocusTrap\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { hasOverlayLayerAbove } from \"../../../utils/overlayLayer\";\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\n/** Focuses the first of `targets` that is in the document and takes focus. */\nconst focusFirst = (targets: Array<Element | null>): void => {\n for (const target of targets) {\n if (!(target instanceof HTMLElement) || !target.isConnected) continue;\n target.focus();\n if ((target.getRootNode() as Document | ShadowRoot).activeElement === target) return;\n }\n};\n\n/** The elements in `container` that Tab can reach, in document order. */\nconst tabbables = (container: HTMLElement): HTMLElement[] =>\n Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n // Older browsers (and jsdom) lack checkVisibility: count every match there.\n (el) => typeof el.checkVisibility !== \"function\" || el.checkVisibility({ visibilityProperty: true })\n );\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 const overlayRef = useRef<HTMLDivElement>(null);\n const cardRef = useRef<HTMLDivElement>(null);\n const cardRefs = useForkRef(ref, cardRef);\n const fullscreenButtonRef = useRef<HTMLButtonElement | HTMLAnchorElement>(null);\n const closeButtonRef = useRef<HTMLButtonElement | HTMLAnchorElement>(null);\n // Where focus goes back to when fullscreen ends; see the effect that sets them.\n const openerRef = useRef<Element | null>(null);\n const lastFocusedRef = useRef<Element | null>(null);\n const wasFullscreenRef = useRef(false);\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 ref={closeButtonRef}\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 ref={fullscreenButtonRef}\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 // An open layer above the overlay takes the Escape first: a select menu opened\n // from the panel, even one rendered inside it (`menuContainer`). An Escape handled\n // inside the panel, e.g. by a menu closing on it, keeps fullscreen too.\n if (event.key === \"Escape\" && !event.defaultPrevented && !hasOverlayLayerAbove(overlayRef.current)) {\n // Handled: a FloatingWindow, Modal or Sheet around the panel skips it. Focus goes\n // back into the tile, and their listener may come later in this dispatch.\n event.preventDefault();\n setMode(\"tile\");\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [isFullscreen, closeOnEsc, setMode]);\n\n // The overlay and the card replace each other, so focus in the one that goes falls to\n // <body>: focus in the overlay when fullscreen ends, on the tile's button when it\n // begins. A FloatingWindow around the panel then misses the next Escape, as it takes\n // Escape only while focus is inside it. So when fullscreen ends with focus on <body>,\n // focus goes to the element focused last in the overlay if it survived into the tile,\n // else to what had focus when fullscreen began, else to the tile's fullscreen button,\n // else to the tile's first focusable element. Focus anywhere else is left alone.\n useSafeLayoutEffect(() => {\n const active = document.activeElement;\n if (isFullscreen) {\n openerRef.current = active === document.body ? null : active;\n lastFocusedRef.current = null;\n } else if (wasFullscreenRef.current && (!active || active === document.body)) {\n focusFirst([\n lastFocusedRef.current,\n openerRef.current,\n fullscreenButtonRef.current,\n ...Array.from(cardRef.current?.querySelectorAll(FOCUSABLE) ?? []),\n ]);\n }\n wasFullscreenRef.current = isFullscreen;\n }, [isFullscreen]);\n\n // Entering fullscreen removes the tile, so focus in it falls to <body>, behind an\n // `aria-modal` overlay: Tab goes to the page under it and a screen reader is left on\n // nothing. So when the overlay appears with focus on <body>, focus moves into it: to\n // its close button, else to its first focusable element, else to the overlay itself.\n // Focus elsewhere is left alone: on a control outside the panel that set a controlled\n // `mode`, or on an element in the overlay that focused itself.\n const overlayShown = isFullscreen && domRoot !== undefined;\n useSafeLayoutEffect(() => {\n const overlay = overlayRef.current;\n const active = document.activeElement;\n if (!overlayShown || !overlay || (active && active !== document.body)) return;\n focusFirst([closeButtonRef.current, ...tabbables(overlay), overlay]);\n }, [overlayShown]);\n\n // Tab stays in the overlay: it wraps at either end, and focus on <body> or on the page\n // under the overlay comes back into it. Tab works as usual in what was opened from the\n // panel: a layer above the overlay, or anything portaled after it (a menu, a picker\n // panel). A Tab handled already is left alone too.\n useEffect(() => {\n if (!overlayShown) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n const overlay = overlayRef.current;\n if (event.key !== \"Tab\" || event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey || !overlay) {\n return;\n }\n const items = tabbables(overlay);\n const first = items[0] ?? overlay;\n const last = items[items.length - 1] ?? overlay;\n const active = document.activeElement;\n let target: HTMLElement | undefined;\n if (active && active !== document.body && overlay.contains(active)) {\n if (event.shiftKey ? active === first || active === overlay : active === last) {\n target = event.shiftKey ? last : first;\n }\n } else if (\n !hasOverlayLayerAbove(overlay) &&\n (!active ||\n active === document.body ||\n overlay.compareDocumentPosition(active) & Node.DOCUMENT_POSITION_PRECEDING)\n ) {\n target = event.shiftKey ? last : first;\n }\n if (target) {\n event.preventDefault();\n target.focus();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [overlayShown]);\n\n const card = (\n <div\n ref={cardRefs}\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 ref={overlayRef}\n className=\"smwb-expansion-panel__overlay smwb-dark\"\n data-smwb-overlay-layer=\"\"\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n data-testid=\"expansion-panel-overlay\"\n onFocus={(e) => {\n lastFocusedRef.current = e.target;\n }}\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 // The button sets this on its root too; its own handler calls the caller's first.\n onPointerDown: onPointerDownProp,\n // A default: the caller's type wins.\n type = \"button\",\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 onPointerDownProp?.(event);\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n };\n\n return (\n <button\n type={type}\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 // The button sets this on its root too; its own handler calls the caller's first.\n onPointerDown: onPointerDownProp,\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 onPointerDownProp?.(event);\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 type React from \"react\";\nimport { useId } from \"./useId\";\n\n/**\n * Whether `helperText` is shown under its control, so that it describes the control. TextFieldWrapper shows none for\n * an inline field, and without helper text it draws a blank line in its place, which describes nothing.\n */\nexport function hasHelperText(helperText: React.ReactNode, inline?: boolean): boolean {\n return !inline && Boolean(helperText);\n}\n\nexport interface HelperTextOptions {\n /** The field is inline: TextFieldWrapper draws no helper text for it. */\n inline?: boolean;\n /** The caller's own `aria-describedby`, kept after the helper text. */\n describedBy?: string;\n}\n\n/**\n * Links a control to the helper text drawn under it, by TextFieldWrapper or by the component itself (Rating). Put\n * `id` on the helper text (TextFieldWrapper takes it as `helperTextId`) and `describedBy` on the control's\n * `aria-describedby`: the helper text's id while it is shown, then the caller's own ids.\n */\nexport function useHelperText(\n helperText: React.ReactNode,\n { inline, describedBy }: HelperTextOptions = {}\n): { id: string; describedBy: string | undefined } {\n const id = useId(undefined, \"smwb-helper-text\");\n const ids = [hasHelperText(helperText, inline) ? id : undefined, describedBy].filter(Boolean).join(\" \");\n return { id, describedBy: ids || undefined };\n}\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldAdornment } from \"./textFieldAdornment\";\nimport { hasHelperText } from \"../../../hooks/useHelperText\";\n\nexport interface TextFieldWrapperProps extends React.HTMLAttributes<HTMLDivElement> {\n label?: string;\n helperText?: React.ReactNode;\n /**\n * Id of the helper text, for the control's `aria-describedby`. Only shown helper text takes it: not the blank line\n * drawn without helper text, and an inline field shows none.\n */\n helperTextId?: string;\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 /** Id of the control the label names. Without it, the label names nothing. */\n htmlFor?: string;\n /**\n * Id of the `<label>`. A control that `htmlFor` cannot label (one that is not\n * a form element, such as SelectField's `role=\"button\"`) points\n * `aria-labelledby` at it.\n */\n labelId?: string;\n shrink?: boolean;\n onHolderMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n inline?: boolean;\n /** Test id of the root `<div>`; `text-field` unless given. */\n \"data-testid\"?: string;\n}\n\nexport function TextFieldWrapper({\n label,\n helperText,\n helperTextId,\n variant,\n disabled,\n className,\n error,\n fullWidth,\n isFilledState,\n isFocused,\n htmlFor,\n labelId,\n shrink,\n children,\n onHolderMouseDown,\n startAdornment,\n endAdornment,\n inline,\n \"data-testid\": dataTestId = \"text-field\",\n ...rest\n}: TextFieldWrapperProps) {\n const isFilledVariant = variant === \"filled\";\n const isNotchedActive = label && (isFilledState || isFocused || shrink);\n // Without helper text a blank line holds its place.\n const helperLine = helperText === undefined ? <> </> : helperText;\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={dataTestId}>\n {!inline && label && (\n <label id={labelId} 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\">​</span>}</legend>\n </fieldset>\n )}\n </div>\n {!inline && helperLine && (\n <p className=\"smwb-text-field__helper-line\">\n <span\n className=\"smwb-text-field__helper-text\"\n id={hasHelperText(helperText, inline) ? helperTextId : undefined}\n >\n {helperLine}\n </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 { useId } from \"../../../hooks/useId\";\nimport { isFilled } from \"./utils\";\nimport { TextFieldWrapper } from \"./textFieldWrapper\";\nimport { useHelperText } from \"../../../hooks/useHelperText\";\n\nexport interface TextFieldProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onBlur\" | \"size\"\n> {\n /** Visible label; it points to the `<input>`, so it also names the field. Not drawn for an `inline` field. */\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 /**\n * Class name(s) for the root wrapper `<div>`. `style` and `data-*` attributes go to the wrapper too (a `data-testid`\n * replaces its default `text-field`); every other HTML attribute (`aria-*`, `autoFocus`, `maxLength`, event handlers)\n * goes to the `<input>`.\n */\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 of the `<input>`; the label points to it. Generated when not given. */\n id?: string;\n inline?: boolean;\n autoComplete?: string;\n}\n\ntype DataAttributes = Record<`data-${string}`, unknown>;\n\n// Splits off the `data-*` attributes, which stay on the wrapper as they always have.\nfunction splitDataAttributes<T extends object>(props: T): [DataAttributes, T] {\n const data: DataAttributes = {};\n const other: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith(\"data-\")) {\n data[key as keyof DataAttributes] = value;\n } else {\n other[key] = value;\n }\n }\n return [data, other as T];\n}\n\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(function TextField(props, ref) {\n const {\n label,\n helperText,\n \"aria-describedby\": ariaDescribedBy,\n variant = \"outlined\",\n size = \"medium\",\n required,\n className,\n style,\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 // Never drawn: an <input> takes no children (React throws on them).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n children,\n ...rest\n } = props;\n // `className`, `style` and `data-*` go to the wrapper; every other attribute\n // (aria-*, autoFocus, maxLength, event handlers) belongs to the <input>.\n const [dataAttributes, inputAttributes] = splitDataAttributes(rest);\n // Without an id the label would point at nothing and leave the input unnamed.\n const inputId = useId(id);\n const [isFocused, setIsFocused] = React.useState<boolean>(false);\n const [isFilledState, setIsFilledState] = React.useState<boolean>(false);\n\n // Controlled while the caller passes a value (`null` counts as none, as in\n // React DOM), checked on every render: a value passed after mount takes over.\n const isControlled = value != null;\n const inputRef = React.useRef<HTMLInputElement>(null);\n const inputForkRef = useForkRef<HTMLInputElement>(ref, inputRef);\n const helper = useHelperText(helperText, { inline, describedBy: ariaDescribedBy });\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 // Only the text counts: the element's `defaultValue` is the `value` attribute,\n // which React DOM leaves at the default, or at the last value a parent passed.\n checkDirty({ value: inputRef.current?.value });\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 helperTextId={helper.id}\n variant={variant}\n disabled={disabled}\n className={cn(className, size !== \"medium\" && `smwb-text-field_size-${size}`)}\n style={style}\n error={error}\n fullWidth={fullWidth}\n isFilledState={isFilledState}\n isFocused={isFocused}\n htmlFor={inputId}\n shrink={Boolean(startAdornment)}\n onHolderMouseDown={onHolderMouseDown}\n startAdornment={startAdornment}\n endAdornment={endAdornment}\n inline={inline}\n {...dataAttributes}\n >\n <input\n {...inputAttributes}\n type={type}\n defaultValue={defaultValue}\n name={name}\n readOnly={readOnly}\n required={required}\n // Set by `error` and `required`; without them, the caller's own values stay.\n aria-invalid={error || inputAttributes[\"aria-invalid\"]}\n aria-required={required || inputAttributes[\"aria-required\"]}\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={inputId}\n autoComplete={autoComplete}\n inputMode={inputMode}\n aria-describedby={helper.describedBy}\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, { CSSProperties, 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 // A subtitle is not a heading: as h6 it would break the page's outline.\n subtitle1: \"p\",\n subtitle2: \"p\",\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 /** Truncate with an ellipsis after this many lines. */\n lines?: number;\n /** Digits of equal width (`tabular-nums`), so figures line up in KPIs and tables. */\n tabularNums?: 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 {\n variant = \"body1\",\n color = \"inherit\",\n align,\n gutterBottom,\n noWrap,\n lines,\n tabularNums,\n component,\n className,\n style,\n children,\n ...rest\n },\n ref\n) {\n const Tag = (component ?? defaultTag[variant]) as \"p\";\n const clamped = lines !== undefined && lines > 0;\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 \"smwb-typography_clamp\": clamped,\n \"smwb-typography_tabular-nums\": tabularNums,\n },\n className\n )}\n style={clamped ? ({ ...style, \"--smwb-typography-lines\": lines } as CSSProperties) : style}\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 /** Test id of the root `<div>`; `avatar` unless given. */\n \"data-testid\"?: string;\n}\n\nconst isPresetSize = (size: AvatarSize | number): size is AvatarSize => typeof size === \"string\";\n\nexport const Avatar = forwardRef<HTMLDivElement, PropsWithChildren<AvatarProps>>(function Avatar(\n {\n className,\n src,\n alt,\n size = \"medium\",\n variant = \"circular\",\n color,\n style,\n imgProps,\n children,\n \"data-testid\": dataTestId = \"avatar\",\n ...props\n },\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={dataTestId} className={avatarClassName} style={inlineStyle}>\n {showImage ? (\n <img\n {...imgProps}\n className={cn(\"smwb-avatar__img\", imgProps?.className)}\n src={src}\n // Avatar's own alt wins; without it, the one in imgProps stays.\n alt={alt ?? imgProps?.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 /** Accessible name of the \"+N\" surplus chip. */\n surplusAriaLabel?: (count: number) => string;\n /** Size of the \"+N\" surplus chip: match the avatars in the group. */\n size?: AvatarSize | number;\n /** Test id of the root `<div>`; `avatar-group` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const AvatarGroup = forwardRef<HTMLDivElement, PropsWithChildren<AvatarGroupProps>>(function AvatarGroup(\n {\n className,\n max = 5,\n total,\n onSurplusClick,\n surplusAriaLabel = (count: number) => `${count} more`,\n size,\n children,\n \"data-testid\": dataTestId = \"avatar-group\",\n ...props\n },\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 // In order, the first avatar first; the \"+N\" chip ends the row.\n <div ref={ref} {...props} data-testid={dataTestId} className={cn(\"smwb-avatar-group\", className)}>\n {visible}\n {surplus > 0 ? (\n <Avatar\n className=\"smwb-avatar-group__surplus\"\n size={size}\n alt={surplusAriaLabel(surplus)}\n onClick={onSurplusClick}\n style={onSurplusClick ? { cursor: \"pointer\" } : undefined}\n >\n {`+${surplus}`}\n </Avatar>\n ) : null}\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 /**\n * Render N stacked placeholders. With `count` > 1 they sit in a group `<span>`, which takes the `ref` and the\n * other HTML attributes; `className` and `style` go on each placeholder.\n */\n count?: number;\n /** Stagger consecutive items by N ms (with `count`). */\n animationDelay?: number;\n /** Element of each placeholder. */\n component?: \"span\" | \"div\";\n /**\n * Test id of the placeholder; `skeleton` unless given. With `count` > 1 it\n * marks the group, and each placeholder keeps `skeleton`.\n */\n \"data-testid\"?: string;\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 \"data-testid\": dataTestId,\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 // An unset prop keeps the width or height the caller set in `style`.\n width: toCssSize(width) ?? style?.width,\n height: toCssSize(height) ?? style?.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={count === 1 ? (dataTestId ?? \"skeleton\") : \"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} data-testid={dataTestId} 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 React from \"react\";\nimport { type DropzoneAccept, type DropzoneInputProps, useDropzone } from \"../../../hooks/useDropzone\";\nimport { CHAT_DEFAULT_FILE_UPLOAD_MAX_FILES } from \"./types\";\n\n/** Kept as a named alias so `ChatProps.fileUploadAccept` reads the same as before. */\nexport type Accept = DropzoneAccept;\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 interface ChatFileUploadRootProps {\n onDragOver: (event: React.DragEvent<HTMLElement>) => void;\n onDragLeave: () => void;\n onDrop: (event: React.DragEvent<HTMLElement>) => void;\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 {\n getRootProps: getDropzoneRootProps,\n getInputProps: getDropzoneInputProps,\n open,\n isDragActive,\n inputRef,\n } = useDropzone({\n accept,\n maxFiles: resolvedMaxFiles,\n multiple: resolvedMaxFiles > 1,\n disabled: !active,\n onDropAccepted: (files) => {\n if (onUploadFiles) {\n void onUploadFiles(files);\n }\n },\n });\n\n // Drag/drop root props WITHOUT a click handler — the `noClick` behaviour this hook used to\n // configure on react-dropzone. Clicking the chat surface must never open the file picker;\n // the attach button calls `open()` explicitly. Mirrors ui-solid's createChatFileUpload.\n const getRootProps = (): ChatFileUploadRootProps => {\n const { onClick: _onClick, ...rest } = getDropzoneRootProps();\n void _onClick;\n return rest;\n };\n\n const getInputProps = (extra?: { id?: string }): DropzoneInputProps & { id?: string } => ({\n ...getDropzoneInputProps(),\n ...(extra ?? {}),\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 \"./useChatFileUpload\";\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 /** Test id of the root `<div>`; `chat-layout` unless given. */\n \"data-testid\"?: string;\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 \"data-testid\": dataTestId = \"chat-layout\",\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={dataTestId}\n {...rest}\n // The collapsed state is the layout's own; it wins over the caller's.\n data-collapsed=\"true\"\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={dataTestId}\n {...rest}\n // The collapsed state is the layout's own; it wins over the caller's.\n data-collapsed=\"false\"\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, { HTMLAttributes, ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport { Avatar, type AvatarSize } from \"../avatar\";\n\n/** Up to two initials from a name: \"Anna Petrova\" → \"AP\", \"anna\" → \"A\". */\nexport function initialsOf(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n const first = (word: string | undefined): string => (word ? (Array.from(word)[0] ?? \"\") : \"\");\n return (first(words[0]) + (words.length > 1 ? first(words[words.length - 1]) : \"\")).toUpperCase();\n}\n\n/**\n * A steady background colour for a person's avatar, derived from a seed (an id\n * or the name): the same person always gets the same colour, on the server too.\n */\nexport function avatarColor(seed: string): string {\n let hash = 0;\n for (const char of seed) hash = (hash * 31 + (char.codePointAt(0) ?? 0)) >>> 0;\n return `hsl(${hash % 360} 42% 42%)`;\n}\n\nexport interface PersonChipProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n className?: string;\n /** The person's name: shown beside the avatar, and the source of its initials. */\n name: string;\n /** Avatar image; initials on a colour without it or when it fails. */\n src?: string;\n /** Link to the person's card. */\n href?: string;\n /** The avatar only; the name becomes its tooltip and accessible name. */\n compact?: boolean;\n /** Avatar size: a preset or pixels. 24px by default. */\n size?: AvatarSize | number;\n /** Seed for the avatar colour (an id); the name by default. */\n colorSeed?: string;\n /** A fixed avatar colour instead of the derived one. */\n color?: string;\n /** A second line under the name: a role, a date. */\n meta?: ReactNode;\n /** Test id of the root; `person-chip` unless given. */\n \"data-testid\"?: string;\n}\n\n/** A person: avatar and name, a link to their card when `href` is set. */\nexport const PersonChip = React.forwardRef<HTMLElement, PersonChipProps>(function PersonChip(\n {\n className,\n name,\n src,\n href,\n compact,\n size = 24,\n colorSeed,\n color,\n meta,\n \"data-testid\": dataTestId = \"person-chip\",\n ...rest\n },\n ref\n) {\n const Tag = (href ? \"a\" : \"span\") as \"span\";\n return (\n <Tag\n {...rest}\n ref={ref}\n {...(href ? { href } : {})}\n title={compact ? name : undefined}\n // A compact chip is named by the person's name, as an image unless it is a\n // link: these win over the caller's. Otherwise the caller's stay.\n role={compact && !href ? \"img\" : rest.role}\n aria-label={compact ? name : rest[\"aria-label\"]}\n data-testid={dataTestId}\n className={cn(\n \"smwb-person-chip\",\n { \"smwb-person-chip_link\": !!href, \"smwb-person-chip_compact\": compact },\n className\n )}\n >\n <Avatar\n className=\"smwb-person-chip__avatar\"\n size={size}\n src={src}\n color={color ?? avatarColor(colorSeed ?? name)}\n aria-hidden=\"true\"\n >\n {initialsOf(name)}\n </Avatar>\n {compact ? null : (\n <span className=\"smwb-person-chip__text\">\n <span className=\"smwb-person-chip__name\">{name}</span>\n {meta ? <span className=\"smwb-person-chip__meta\">{meta}</span> : null}\n </span>\n )}\n </Tag>\n );\n});\n\nexport default PersonChip;\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\n {...rest}\n ref={ref}\n className={badgeClassname}\n // `badgeAriaLabel` wins over the caller's aria-label; without it, the caller's stays.\n aria-label={badgeAriaLabel ?? rest[\"aria-label\"]}\n >\n {hidden ? null : display}\n </span>\n </span>\n );\n});\n\nexport default Badge;\n","/**\n * Whatever takes a click of its own: a native control or link, a label,\n * anything focusable, a widget role, editable content.\n */\nconst INTERACTIVE = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"select\",\n \"textarea\",\n \"label\",\n \"summary\",\n \"[tabindex]\",\n \"[contenteditable]:not([contenteditable='false'])\",\n ...[\n \"button\",\n \"link\",\n \"checkbox\",\n \"radio\",\n \"switch\",\n \"textbox\",\n \"searchbox\",\n \"combobox\",\n \"spinbutton\",\n \"slider\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"tab\",\n ].map((role) => `[role='${role}']`),\n].join(\",\");\n\n/**\n * Whether a click belongs to the control that listens for it on a wrapper (a\n * sortable header, a selectable card) rather than to something inside it.\n *\n * The control must match `INTERACTIVE` itself (`role=\"button\"`, `tabindex`), and\n * then a click is its own when it is the nearest match from the click's target\n * up, and no handler has prevented the click's default yet. So a click in a\n * nested control is that control's, and so is a click in a portal rendered\n * inside: React delivers it to the wrapper, though it landed outside.\n *\n * The control is the element that listens (`currentTarget`), unless the caller\n * passes another: a box that holds a control and other content beside it (a\n * card's button and its corner slots) listens for both. A click on that content\n * is then the control's too, unless it lands in a control of its own there.\n */\nexport function isOwnClick(\n event: Pick<Event, \"target\" | \"currentTarget\" | \"defaultPrevented\">,\n control: Element | null = event.currentTarget as Element | null\n): boolean {\n if (event.defaultPrevented) return false;\n const target = event.target as Element | null;\n const nearest = target?.closest(INTERACTIVE) ?? null;\n if (nearest !== null && nearest === control) return true;\n const box = event.currentTarget as Element | null;\n if (control === box || !target || !box?.contains(target)) return false;\n return !(nearest && box.contains(nearest));\n}\n","import type React from \"react\";\n\n/** What an element is to the keyboard and to assistive tech. */\nexport type ControlProps = Pick<React.HTMLAttributes<HTMLElement>, \"role\" | \"tabIndex\" | \"onFocus\" | \"onBlur\"> &\n React.AriaAttributes;\n\nfunction isControlProp(key: string): boolean {\n return (\n key === \"role\" ||\n key === \"tabIndex\" ||\n key === \"onFocus\" ||\n key === \"onBlur\" ||\n (key.startsWith(\"aria-\") && key !== \"aria-hidden\")\n );\n}\n\n/**\n * Splits the caller's props of a component whose root is a box around its\n * control and other content beside it: a card's button and its footer or\n * corner slots, a chip's button and its delete button.\n *\n * What the component is to the keyboard and to assistive tech goes to the\n * control, the element that takes focus: `role`, `tabIndex`, `onFocus`,\n * `onBlur` and the `aria-*` attributes. The rest stays on the box, and so does\n * `aria-hidden`, which hides the whole component. While `toControl` is false\n * (the component is not a control, e.g. a card without `onClick`), all of them\n * stay on the box.\n */\nexport function splitControlProps<T extends object>(props: T, toControl = true): [ControlProps, T] {\n if (!toControl) return [{}, props];\n const control: Record<string, unknown> = {};\n const box: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n (isControlProp(key) ? control : box)[key] = value;\n }\n return [control, box as T];\n}\n","import React, { HTMLAttributes, PropsWithChildren, ReactNode, useRef } from \"react\";\nimport cn from \"clsx\";\nimport { isOwnClick } from \"../../../utils/ownClick\";\nimport { splitControlProps } from \"../../../utils/controlProps\";\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Class name(s) for the root `<div>`, the card's box. `style`, `id`, `data-*`, `aria-hidden`, `ref` and event\n * handlers go to the root too. With `onClick`, `role`, `tabIndex`, `onFocus`, `onBlur` and the other `aria-*`\n * attributes go to the card's button, `.smwb-card__content` (the title and the children), which is also the element\n * to focus. Without `onClick` the card is not a control, and they stay on the root, which holds the footer too.\n */\n className?: string;\n variant?: \"filled\" | \"elevated\" | \"outlined\";\n /**\n * Disables the card: it says `aria-disabled`, and neither clicks nor keys run `onClick`. With `onClick` the card is\n * still a button, out of the tab order.\n */\n disabled?: boolean;\n /**\n * A heading drawn at the top of the card, not the `title` attribute. With `onClick` it is part of the card's button,\n * and the button's name starts with it.\n */\n title?: string;\n /**\n * Footer slot rendered after the content. With `onClick` it sits beside the card's button, not inside it, so\n * controls here keep their own names, clicks and keys; see `onClick`.\n */\n footer?: ReactNode;\n /**\n * Makes the card interactive: its content (the title and the children) becomes a button, named by that content, with\n * a focus ring around the whole card. The footer is not part of that button but its sibling, so the card's controls\n * go there: a control in the children would sit inside the button, and its name would join the card's.\n *\n * Runs when the card is activated: a click on it, or Enter / Space while its button has focus. A click on a control\n * (button, link, input, anything focusable), in the footer or the children, or in a portal opened from the card does\n * not run it, and neither do Enter / Space pressed on such a control. Content that is not a control keeps its click\n * from activating the card by calling `preventDefault()` on it.\n */\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n /** Test id of the root `<div>`; `card` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const Card = React.forwardRef<HTMLDivElement, PropsWithChildren<CardProps>>(function Card(\n {\n className,\n variant = \"elevated\",\n children,\n disabled,\n title,\n footer,\n onClick,\n onKeyDown,\n \"data-testid\": dataTestId = \"card\",\n ...rest\n },\n ref\n) {\n const interactive = !!onClick && !disabled;\n // With onClick the card's content is its button, and what the card is to the\n // keyboard and to assistive tech goes there. Without it the card is not a\n // control: the caller's role and ARIA attributes stay on the root, around\n // the footer too.\n const [control, box] = splitControlProps(rest, !!onClick);\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Keys pressed in the footer or on a control inside bubble up here too; only\n // the keys of the card's button activate it. The caller's onKeyDown still\n // sees them all.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (!interactive || e.target !== contentRef.current) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n // A click on the card's button, or on what is not a control beside it (the\n // footer's text, the padding), activates the card: not one on a control, nor\n // one in a portal rendered inside (React delivers it here, though it landed\n // outside), nor one whose default a handler inside has prevented.\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (isOwnClick(e, contentRef.current)) onClick?.(e);\n };\n\n return (\n <div\n ref={ref}\n data-testid={dataTestId}\n className={cn(\"smwb-card\", `smwb-card_${variant}`, className, {\n card_disabled: disabled,\n \"smwb-card_interactive\": interactive,\n })}\n {...box}\n // A disabled card says so where the caller's ARIA attributes are: on its\n // button with onClick, on the root without.\n aria-disabled={onClick ? undefined : disabled || box[\"aria-disabled\"]}\n onClick={interactive ? handleClick : undefined}\n onKeyDown={handleKeyDown}\n >\n <div\n {...control}\n ref={contentRef}\n className=\"smwb-card__content\"\n // With onClick the content is the card's button, and a disabled card\n // says so: these win over the caller's, and where the card sets none,\n // the caller's stay. Its tabIndex is a default: the caller's wins, e.g.\n // for roving focus.\n role={onClick ? \"button\" : undefined}\n tabIndex={control.tabIndex ?? (interactive ? 0 : undefined)}\n aria-disabled={onClick ? disabled || control[\"aria-disabled\"] : undefined}\n >\n {title && <div className=\"smwb-card__title\">{title}</div>}\n {children}\n </div>\n {/* Beside the button, not in it: controls here keep their names and input. */}\n {footer && <div className=\"smwb-card__footer\">{footer}</div>}\n </div>\n );\n});\n\nexport default Card;\n","import React, { CSSProperties, HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type StatTone = \"neutral\" | \"info\" | \"success\" | \"warning\" | \"error\";\n\nexport interface StatProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n className?: string;\n /** What the figure counts. */\n label: ReactNode;\n /** The figure — a number, or a short value such as \"3 / 14\". */\n value: ReactNode;\n /** A line under the value: a comparison, a period, a caveat. */\n hint?: ReactNode;\n /** An icon beside the figure: a Material Symbols name or an element. */\n icon?: string | ReactNode;\n /** Colour of the accent (a tile's edge, the icon). `warning` and `error` colour the figure too. */\n tone?: StatTone;\n /** `tile`: a bordered card with an accent edge, for KPIs. `plain`: text only, for rows of small figures. */\n variant?: \"tile\" | \"plain\";\n /** Make the whole stat a link to what the figure is made of. */\n href?: string;\n /** Test id of the root; `stat` unless given. */\n \"data-testid\"?: string;\n}\n\n/**\n * A figure with its label: a KPI tile on a dashboard, or a small stat in a row.\n * Children go under it — a meter, a sparkline, a note.\n */\nexport const Stat = React.forwardRef<HTMLElement, PropsWithChildren<StatProps>>(function Stat(\n {\n className,\n label,\n value,\n hint,\n icon,\n tone = \"neutral\",\n variant = \"tile\",\n href,\n children,\n \"data-testid\": dataTestId = \"stat\",\n ...rest\n },\n ref\n) {\n const Tag = (href ? \"a\" : \"div\") as \"div\";\n return (\n <Tag\n {...rest}\n ref={ref as React.Ref<HTMLDivElement>}\n {...(href ? { href } : {})}\n data-testid={dataTestId}\n className={cn(\n \"smwb-stat\",\n `smwb-stat_${variant}`,\n `smwb-stat_tone-${tone}`,\n { \"smwb-stat_link\": !!href, \"smwb-stat_with-icon\": !!icon },\n className\n )}\n >\n {icon ? (\n <span className=\"smwb-stat__icon\" aria-hidden=\"true\">\n {typeof icon === \"string\" ? <Icon name={icon} size={20} /> : icon}\n </span>\n ) : null}\n <span className=\"smwb-stat__label\">{label}</span>\n <span className=\"smwb-stat__value\">{value}</span>\n {hint ? <span className=\"smwb-stat__hint\">{hint}</span> : null}\n {children ? <div className=\"smwb-stat__extra\">{children}</div> : null}\n </Tag>\n );\n});\n\nexport interface StatGroupProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** Narrowest a stat may get before the row wraps; a CSS length or px. 9rem by default. */\n minItemWidth?: number | string;\n}\n\n/** A responsive row of stats: as many columns as fit, each at least `minItemWidth` wide. */\nexport const StatGroup = React.forwardRef<HTMLDivElement, PropsWithChildren<StatGroupProps>>(function StatGroup(\n { className, style, minItemWidth, children, ...rest },\n ref\n) {\n const width = typeof minItemWidth === \"number\" ? `${minItemWidth}px` : minItemWidth;\n return (\n <div\n {...rest}\n ref={ref}\n className={cn(\"smwb-stat-group\", className)}\n style={width === undefined ? style : ({ ...style, \"--smwb-stat-min\": width } as CSSProperties)}\n >\n {children}\n </div>\n );\n});\n\nexport default Stat;\n","import React from \"react\";\nimport cn from \"clsx\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\nimport Icon from \"../../base/icon/icon\";\nimport { isOwnClick } from \"../../../utils/ownClick\";\nimport { splitControlProps } from \"../../../utils/controlProps\";\n\nexport type ChipColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface ChipProps extends React.HTMLAttributes<HTMLSpanElement | HTMLAnchorElement> {\n /**\n * Class name(s) for the chip's root, a `<span>` (an `<a>` with `asLink`). `style`, `id`, `data-*`, `aria-hidden`,\n * `ref` and event handlers go to the root too. In a clickable chip (`onClick`), `role`, `tabIndex`, `onFocus`,\n * `onBlur` and the other `aria-*` attributes go to its button, `.smwb-chip__content` (the icon and the label), which\n * is also the element to focus. Otherwise they stay on the root, which holds the delete button too.\n */\n className?: string;\n variant?: \"filled\" | \"outlined\";\n size?: \"small\" | \"medium\";\n color?: ChipColor;\n /**\n * Shows a delete button in the chip and runs when it is pressed: a click, or\n * Enter / Space while the button has focus. In a clickable chip it sits\n * beside the chip's button, not inside it, and pressing it does not run the\n * chip's `onClick`.\n */\n onDelete?: (event: React.SyntheticEvent) => void;\n icon?: React.ReactNode;\n deleteIcon?: React.ReactNode;\n label: string;\n /**\n * Makes the chip clickable: its icon and label become a button, named by\n * them, with a focus ring around the whole chip. The delete button is not\n * part of that button but its sibling, so it keeps its own name.\n *\n * Runs on a click on the chip and on Enter / Space while the chip's button\n * has focus, but not on a click or key on the delete button.\n */\n onClick?: () => void;\n onDeleteMouseDown?: React.MouseEventHandler;\n /**\n * Disables the chip: it is dimmed, takes no pointer input and says `aria-disabled`, and its delete button is\n * disabled too. With `onClick` the chip is still a button, out of the tab order.\n */\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 /**\n * Id of the label's element, for another element to take the chip's text as\n * its name (`aria-labelledby`) without the delete button's name.\n */\n labelId?: string;\n /** Accessible label for the delete control. */\n deleteAriaLabel?: string;\n /** Test id of the root; `chip`, or `chip-link` for a link, unless given. */\n \"data-testid\"?: string;\n}\n\nexport const Chip = React.forwardRef<HTMLSpanElement | HTMLAnchorElement, ChipProps>(function Chip(\n {\n label,\n labelId,\n className,\n deleteIcon,\n icon,\n onDelete,\n onMouseDown: onMouseDownProp,\n // The chip sets these on its root too; its own handlers call the caller's first.\n onKeyDown: onKeyDownProp,\n onPointerDown: onPointerDownProp,\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 \"data-testid\": dataTestId,\n ...rest\n },\n ref\n) {\n const rippleRef = React.useRef<RippleActionsRef>(null);\n const contentRef = React.useRef<HTMLSpanElement | null>(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 onPointerDownProp?.(event);\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 // The chip's own content: its button when it is clickable.\n const iconAndLabel = (\n <>\n {icon && <span className=\"smwb-chip__icon\">{icon}</span>}\n <span id={labelId} className=\"smwb-chip__label\">\n {label}\n </span>\n </>\n );\n // After the content: in a clickable chip, beside its button, not in it.\n const trailing = (\n <>\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={dataTestId ?? \"chip-link\"}\n className={classes}\n href={href}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n target={target}\n {...rest}\n // A default: the caller's rel wins, and an explicit undefined keeps it.\n rel={rest.rel ?? \"noreferrer\"}\n onKeyDown={onKeyDownProp}\n >\n {iconAndLabel}\n {trailing}\n </a>\n );\n }\n\n const clickable = !!onClick && !disabled;\n // With onClick the chip's content is its button, and what the chip is to the\n // keyboard and to assistive tech goes there. Without it the chip is not a\n // control: the caller's role and ARIA attributes stay on the root, around\n // the delete button too.\n const [control, box] = splitControlProps(rest, !!onClick);\n\n // Keys pressed on the delete button bubble up here too; only the keys of the\n // chip's button activate it.\n const onKeyDown = (event: React.KeyboardEvent<HTMLSpanElement>) => {\n onKeyDownProp?.(event);\n if (!clickable || event.target !== contentRef.current) return;\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onClick?.();\n }\n };\n\n // A click on the chip's button, or on its padding, activates the chip: not\n // one on the delete button, nor one in a portal rendered inside, which React\n // delivers here too. The click goes along to onClick, as it always has,\n // though its type takes none.\n const onChipClick = (event: React.MouseEvent<HTMLSpanElement>) => {\n if (isOwnClick(event, contentRef.current)) {\n (onClick as React.MouseEventHandler<HTMLSpanElement> | undefined)?.(event);\n }\n };\n\n return (\n <span\n ref={ref}\n data-testid={dataTestId ?? \"chip\"}\n className={classes}\n {...box}\n // A disabled chip says so where the caller's ARIA attributes are: on its\n // button with onClick, on the root without.\n aria-disabled={onClick ? undefined : disabled || box[\"aria-disabled\"]}\n onClick={clickable ? onChipClick : undefined}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n >\n <span\n {...control}\n ref={contentRef}\n className=\"smwb-chip__content\"\n // With onClick the content is the chip's button, and a disabled chip\n // says so: these win over the caller's, and where the chip sets none,\n // the caller's stay. Its tabIndex is a default: the caller's wins, e.g.\n // for roving focus.\n role={onClick ? \"button\" : undefined}\n tabIndex={control.tabIndex ?? (clickable ? 0 : undefined)}\n aria-disabled={onClick ? disabled || control[\"aria-disabled\"] : undefined}\n >\n {iconAndLabel}\n </span>\n {/* Beside the button, not in it: the delete button keeps its name and input. */}\n {trailing}\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 // role=\"group\" is a default: the caller's own wins, and an explicit undefined keeps it.\n <div {...rest} role={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, { HTMLAttributes, ReactNode } from \"react\";\nimport cn from \"clsx\";\n\nexport type MeterColor = \"neutral\" | \"primary\" | \"info\" | \"success\" | \"warning\" | \"error\";\n\n/** From this share of `max` (0–1) on, the meter takes `color`. */\nexport interface MeterThreshold {\n from: number;\n color: MeterColor;\n}\n\n/** Info while under way, success when complete. */\nexport const DEFAULT_METER_THRESHOLDS: readonly MeterThreshold[] = [\n { from: 0, color: \"info\" },\n { from: 1, color: \"success\" },\n];\n\nexport interface MeterProps extends Omit<HTMLAttributes<HTMLDivElement>, \"role\"> {\n className?: string;\n /** How many are done (X of Y). */\n value: number;\n /** How many there are in all (X of Y). */\n max: number;\n /** What is measured — the accessible name, e.g. \"Requirements accepted\". */\n label: string;\n /** Visible text instead of \"X of Y\": markup, or a function of (value, max). */\n text?: ReactNode | ((value: number, max: number) => ReactNode);\n /** The word between the figures in the default text and in aria-valuetext. */\n ofLabel?: string;\n /** Colour by share of `max`: the last threshold the share reaches wins. */\n thresholds?: readonly MeterThreshold[];\n /** A fixed colour, instead of the thresholds. */\n color?: MeterColor;\n /** The bar only; the text stays available to assistive technology. */\n hideText?: boolean;\n /** Test id of the root `<div>`; `meter` unless given. */\n \"data-testid\"?: string;\n}\n\n/** The colour for a share of the whole: the last threshold (by `from`) the share reaches. */\nexport function meterColor(share: number, thresholds: readonly MeterThreshold[]): MeterColor {\n let color: MeterColor = \"neutral\";\n let from = -Infinity;\n for (const threshold of thresholds) {\n if (share >= threshold.from && threshold.from >= from) {\n color = threshold.color;\n from = threshold.from;\n }\n }\n return color;\n}\n\n/** A share of a whole, \"X of Y\": a bar and the figures beside it, coloured by thresholds. */\nexport const Meter = React.forwardRef<HTMLDivElement, MeterProps>(function Meter(\n {\n className,\n value,\n max,\n label,\n text,\n ofLabel = \"of\",\n thresholds = DEFAULT_METER_THRESHOLDS,\n color,\n hideText,\n \"data-testid\": dataTestId = \"meter\",\n ...rest\n },\n ref\n) {\n const share = max > 0 ? Math.min(1, Math.max(0, value / max)) : 0;\n const tone = color ?? meterColor(share, thresholds);\n return (\n <div\n {...rest}\n ref={ref}\n role=\"meter\"\n aria-label={label}\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuetext={`${value} ${ofLabel} ${max}`}\n data-testid={dataTestId}\n className={cn(\"smwb-meter\", `smwb-meter_color-${tone}`, { \"smwb-meter_bar-only\": hideText }, className)}\n >\n <span className=\"smwb-meter__track\" aria-hidden=\"true\">\n <span className=\"smwb-meter__fill\" style={{ width: `${share * 100}%` }} />\n </span>\n {hideText ? null : (\n <span className=\"smwb-meter__text\" aria-hidden=\"true\">\n {text === undefined ? (\n <>\n <b className=\"smwb-meter__value\">{value}</b>\n <span className=\"smwb-meter__of\">\n {\" \"}\n {ofLabel} {max}\n </span>\n </>\n ) : typeof text === \"function\" ? (\n text(value, max)\n ) : (\n text\n )}\n </span>\n )}\n </div>\n );\n});\n\nexport default Meter;\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 // `lazy` wins over the caller's loading; without it, the caller's stays.\n // decoding=\"async\" is a default: the caller's wins, and an explicit\n // undefined keeps it.\n loading={lazy ? \"lazy\" : rest.loading}\n decoding={rest.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\";\nimport { isOwnClick } from \"../../../utils/ownClick\";\nimport { splitControlProps } from \"../../../utils/controlProps\";\n\nexport interface ThumbCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n /**\n * Class name(s) for the root `<div>`, the card's box. `style`, `id`, `data-*`, `aria-hidden`, `ref` and event\n * handlers go to the root too, but `role`, `tabIndex`, `onFocus`, `onBlur` and the other `aria-*` attributes go to\n * the card's content, `.smwb-thumb-card__content` (the image and the caption): that is the card's button when it has\n * `onSelect`, and the element to focus.\n */\n className?: string;\n /** Thumbnail URL; falls back to `fallback` when missing / failed. */\n src?: string;\n /**\n * Text under the image. With `onSelect` it is part of the card's button and names it, so keep controls out of it:\n * they go in `topStart` / `topEnd`.\n */\n caption?: React.ReactNode;\n /** Outlines the image; with `onSelect`, the card's button is also `aria-pressed=\"true\"`. */\n selected?: boolean;\n /**\n * Makes the card selectable: its content (the image and the caption) becomes a toggle button with `aria-pressed`,\n * selected by a click and by Enter / Space. The corner slots are not part of that button but its siblings, laid over\n * the image, so their controls keep their own names, clicks and keys.\n *\n * A click selects the card unless it lands in a control in a slot (button, link, input, anything focusable) or in a\n * portal opened from the card. Slot content that is not a control keeps its click from selecting the card by calling\n * `preventDefault()` on it.\n */\n onSelect?: () => void;\n /**\n * Runs on each click on the card, before `onSelect`, but not while the card is `disabled`.\n * A click on a control in a slot runs it too, without selecting the card.\n * Enter / Space select the card without a click, so they call only `onSelect`.\n */\n onClick?: React.MouseEventHandler<HTMLDivElement> | undefined;\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 /**\n * Top-left overlay slot (e.g. a favourite star). It sits over the image, outside the card's button, so controls here\n * keep their own names, clicks and keys; see `onSelect`.\n */\n topStart?: React.ReactNode;\n /**\n * Top-right overlay slot (e.g. a kebab menu). It sits over the image, outside the card's button, so controls here\n * keep their own names, clicks and keys; see `onSelect`.\n */\n topEnd?: React.ReactNode;\n lazy?: boolean;\n /**\n * Dims the card and ignores clicks on it: neither `onClick` nor `onSelect` runs.\n * Keys do not select it either, and there is no hover preview. With `onSelect`\n * the card is still a button, `aria-disabled` and out of the tab order.\n */\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 *\n * The root is a box around the card's content (the image and the caption, the\n * card's button when it is selectable) and the corner slots, which are laid\n * over the image beside that button rather than inside it.\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 // The card sets these on its root too; its own handlers call the caller's.\n onClick: onClickProp,\n onKeyDown: onKeyDownProp,\n onMouseEnter: onMouseEnterProp,\n onMouseLeave: onMouseLeaveProp,\n ...rest\n },\n ref\n) {\n // What the card is to the keyboard and to assistive tech goes to its\n // content, the element that is its button; the rest stays on the root.\n const [control, box] = splitControlProps(rest);\n const cardRef = useRef<HTMLDivElement | null>(null);\n const contentRef = 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 = (event: React.MouseEvent<HTMLDivElement>): void => {\n onMouseEnterProp?.(event);\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 = (event: React.MouseEvent<HTMLDivElement>): void => {\n onMouseLeaveProp?.(event);\n clearTimer();\n setPreview(null);\n };\n useEffect(() => clearTimer, []);\n\n const interactive = !!onSelect && !disabled;\n // A disabled card ignores clicks, the caller's onClick included: it says\n // aria-disabled, and its styles turn pointer events off. The caller's onClick\n // sees every other click, those in the slots too, but only clicks on the\n // card's content and on what is not a control in a slot select it: not one\n // on a control in a slot, nor one in a portal opened from the card. That is\n // settled before onClick runs, so what onClick does to the event or the DOM\n // does not change it.\n const onClick = (event: React.MouseEvent<HTMLDivElement>): void => {\n if (disabled) return;\n const selects = isOwnClick(event, contentRef.current);\n onClickProp?.(event);\n if (selects) onSelect?.();\n };\n // Keys pressed on a control in a slot bubble up here too; only the keys of\n // the card's button select it.\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n onKeyDownProp?.(event);\n if (!interactive || event.target !== contentRef.current) return;\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onSelect?.();\n }\n };\n\n return (\n <div\n {...box}\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 onClick={onClick}\n onKeyDown={onKeyDown}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n >\n <div\n {...control}\n ref={contentRef}\n className=\"smwb-thumb-card__content\"\n // With onSelect the content is the card's button and says whether it is\n // pressed, and a disabled card says so: these win over the caller's, and\n // where the card sets none, the caller's stay. Its tabIndex is a\n // default: the caller's wins, e.g. for roving focus.\n role={onSelect ? \"button\" : control.role}\n tabIndex={control.tabIndex ?? (interactive ? 0 : undefined)}\n aria-pressed={onSelect ? (selected ?? false) : control[\"aria-pressed\"]}\n aria-disabled={disabled || control[\"aria-disabled\"]}\n >\n <div className=\"smwb-thumb-card__media\">\n <LazyImage src={src} lazy={lazy} fallback={fallback} />\n </div>\n {caption ? <div className=\"smwb-thumb-card__caption\">{caption}</div> : null}\n </div>\n {/* Beside the button, not in it: controls here keep their names and input. */}\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 {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\";\nimport { isTopOverlayLayer } from \"../../../utils/overlayLayer\";\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 // Only the topmost overlay layer reacts to Escape, and not to one handled inside\n // it, e.g. by a menu closing on it.\n if (event.key === \"Escape\" && !event.defaultPrevented && isTopOverlayLayer(nodeRef.current)) {\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 data-smwb-overlay-layer=\"\"\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 // Always ends the hover, so a hover that ends while `pauseOnHover` is off\n // does not pause autoplay once it is back on.\n onMouseLeave={() => setIsHovered(false)}\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 // Lock the page's scroll while the viewer is open, and give it back as it was.\n // (Every item used to set it to \"auto\" when it mounted, undoing another lock.)\n useEffect(() => {\n if (!isOpen) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [isOpen]);\n\n const style: CSSProperties = {\n // No height is undefined, not \"\": React writes an empty value on the client\n // but not on the server, and hydration reports the style as mismatched.\n height: rowsHeight ? `${rowsHeight * rows}px` : undefined,\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, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useSafeLayoutEffect } from \"../../../../hooks/useSafeLayoutEffect\";\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 // The viewer is portalled: its target is resolved in the browser only, so the\n // image list renders on the server and hydrates.\n const [portalRoot, setPortalRoot] = useState<HTMLElement>();\n useSafeLayoutEffect(() => {\n setPortalRoot(document.body);\n }, []);\n if (!portalRoot) return 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 portalRoot\n );\n};\n\nexport default ImagesListItemModal;\n","import React, { CSSProperties, HTMLAttributes, PropsWithChildren, ReactNode, useId } from \"react\";\nimport cn from \"clsx\";\n\nexport interface KanbanProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /**\n * The narrowest a column gets before the board scrolls sideways: a number of\n * pixels or any CSS length. 15.5rem by default.\n */\n columnWidth?: number | string;\n /** Test id of the root `<div>`; `kanban` unless given. */\n \"data-testid\"?: string;\n}\n\nexport interface KanbanColumnProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n className?: string;\n /** The column's name: text or a badge. It names the column for assistive technology. */\n title: ReactNode;\n /** How many cards the column holds (it may show fewer), beside the title. Nothing is shown for null. */\n count?: number | string | null;\n /** The column's colour, a stripe along its top: any CSS colour. */\n accent?: string;\n /** Shown in place of the cards when there are none, e.g. \"Empty\". */\n empty?: ReactNode;\n /** Under the cards, e.g. a link to the rest as a list. */\n footer?: ReactNode;\n /** Test id of the column's `<div>`; `kanban-column` unless given. */\n \"data-testid\"?: string;\n}\n\nexport interface KanbanCardProps extends Omit<HTMLAttributes<HTMLLIElement>, \"title\"> {\n className?: string;\n /** The card's title, clamped to `titleLines` lines. */\n title?: ReactNode;\n /** Makes the title a link, and the whole card open it. */\n href?: string;\n /** Lines the title is clamped to: 3 by default. */\n titleLines?: number;\n /** Test id of the card's `<li>`; `kanban-card` unless given. */\n \"data-testid\"?: string;\n}\n\nconst cssLength = (value: number | string | undefined): string | undefined =>\n typeof value === \"number\" ? `${value}px` : value;\n\nconst present = (value: ReactNode): boolean =>\n value !== undefined && value !== null && value !== false && value !== true && value !== \"\";\n\n/** A board: KanbanColumn children side by side, scrolling sideways when they do not fit. */\nexport const Kanban = React.forwardRef<HTMLDivElement, PropsWithChildren<KanbanProps>>(function Kanban(\n { className, style, columnWidth, children, \"data-testid\": dataTestId = \"kanban\", ...rest },\n ref\n) {\n return (\n <div\n data-testid={dataTestId}\n {...rest}\n ref={ref}\n className={cn(\"smwb-kanban\", className)}\n style={\n columnWidth === undefined\n ? style\n : ({ ...style, \"--smwb-kanban-column-width\": cssLength(columnWidth) } as CSSProperties)\n }\n >\n {children}\n </div>\n );\n});\n\n/** A column of the board: its title and count, then its KanbanCard children, or `empty` when it has none. */\nexport const KanbanColumn = React.forwardRef<HTMLDivElement, PropsWithChildren<KanbanColumnProps>>(\n function KanbanColumn(\n {\n className,\n style,\n title,\n count,\n accent,\n empty,\n footer,\n children,\n \"data-testid\": dataTestId = \"kanban-column\",\n ...rest\n },\n ref\n ) {\n const titleId = `${useId()}-title`;\n const hasCards = React.Children.toArray(children).length > 0;\n return (\n <div\n data-testid={dataTestId}\n role=\"group\"\n aria-labelledby={titleId}\n {...rest}\n ref={ref}\n className={cn(\"smwb-kanban__column\", className)}\n style={accent === undefined ? style : ({ ...style, \"--smwb-kanban-accent\": accent } as CSSProperties)}\n >\n <div className=\"smwb-kanban__column-header\">\n <div className=\"smwb-kanban__column-title\" id={titleId}>\n {title}\n </div>\n {count !== undefined && count !== null ? <span className=\"smwb-kanban__count\">{count}</span> : null}\n </div>\n {hasCards ? (\n <ul className=\"smwb-kanban__cards\" role=\"list\">\n {children}\n </ul>\n ) : present(empty) ? (\n <div className=\"smwb-kanban__empty\">{empty}</div>\n ) : null}\n {present(footer) ? <div className=\"smwb-kanban__column-footer\">{footer}</div> : null}\n </div>\n );\n }\n);\n\n/**\n * A card on the board: its title (a link with `href`, and then the whole card\n * opens it) and the children under it.\n */\nexport const KanbanCard = React.forwardRef<HTMLLIElement, PropsWithChildren<KanbanCardProps>>(function KanbanCard(\n { className, style, title, href, titleLines = 3, children, \"data-testid\": dataTestId = \"kanban-card\", ...rest },\n ref\n) {\n return (\n <li\n data-testid={dataTestId}\n {...rest}\n ref={ref}\n className={cn(\"smwb-kanban__card\", { \"smwb-kanban__card_link\": Boolean(href) }, className)}\n style={{ ...style, \"--smwb-kanban-title-lines\": String(titleLines) } as CSSProperties}\n >\n {present(title) ? (\n href ? (\n <a className=\"smwb-kanban__card-title\" href={href}>\n {title}\n </a>\n ) : (\n <div className=\"smwb-kanban__card-title\">{title}</div>\n )\n ) : null}\n {present(children) ? <div className=\"smwb-kanban__card-body\">{children}</div> : null}\n </li>\n );\n});\n\nexport default Kanban;\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 /** Test id of the root `<ul>`; `list` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const List = forwardRef<HTMLUListElement, PropsWithChildren<ListProps>>(function List(\n { className, dense, subheader, children, \"data-testid\": dataTestId = \"list\", ...props },\n ref\n) {\n return (\n <ul\n ref={ref}\n data-testid={dataTestId}\n className={cn(\"smwb-list\", { \"smwb-list_dense\": dense }, className)}\n {...props}\n // A default: the caller's own wins, and an explicit undefined keeps it.\n role={props.role ?? \"list\"}\n >\n {subheader ? <li className=\"smwb-list__subheader\">{subheader}</li> : null}\n {children}\n </ul>\n );\n});\n\nexport default List;\n","import React, { CSSProperties, HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\n\nexport interface DescriptionListEntry {\n term: ReactNode;\n description: ReactNode;\n /** React key; the index is used without it. */\n key?: React.Key;\n}\n\n/**\n * `auto`: the term beside its description while the list is at least 420px\n * wide, above it when narrower (a container query on the list itself). `row`\n * and `stacked` fix one layout.\n */\nexport type DescriptionListLayout = \"auto\" | \"row\" | \"stacked\";\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n className?: string;\n /** The pairs as data; `DescriptionItem` children work too, and come after them. */\n items?: DescriptionListEntry[];\n /**\n * \"auto\" (default): each term beside its value while the list is at least\n * 420px wide, above it when narrower — the list's own width decides. So its\n * content does not widen it: where the parent takes its width from its\n * content (a flex item that does not grow, a popover, a table cell) the list\n * has no width; give it one there, or use \"row\" / \"stacked\", which fix one\n * layout and take their width from their content.\n */\n layout?: DescriptionListLayout;\n /** Width of the term column in the row layout: px or any CSS track size. 30% of the list, at least 6rem, by default. */\n termWidth?: number | string;\n /** Tighter spacing, for side panels. */\n dense?: boolean;\n}\n\nexport interface DescriptionItemProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** The field's name. */\n term: ReactNode;\n}\n\n/** One pair: the term and, as children, its description. */\nexport const DescriptionItem = React.forwardRef<HTMLDivElement, PropsWithChildren<DescriptionItemProps>>(\n function DescriptionItem({ className, term, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"smwb-description-list__item\", className)}>\n <dt className=\"smwb-description-list__term\">{term}</dt>\n <dd className=\"smwb-description-list__details\">{children}</dd>\n </div>\n );\n }\n);\n\n/** Field–value pairs (a `<dl>`): side by side, stacking on a narrow container. */\nexport const DescriptionList = React.forwardRef<HTMLDListElement, PropsWithChildren<DescriptionListProps>>(\n function DescriptionList({ className, style, items, layout = \"auto\", termWidth, dense, children, ...rest }, ref) {\n const width = typeof termWidth === \"number\" ? `${termWidth}px` : termWidth;\n return (\n <dl\n {...rest}\n ref={ref}\n className={cn(\n \"smwb-description-list\",\n `smwb-description-list_${layout}`,\n { \"smwb-description-list_dense\": dense },\n className\n )}\n style={width === undefined ? style : ({ ...style, \"--smwb-description-term\": width } as CSSProperties)}\n >\n {items?.map((item, index) => (\n <DescriptionItem key={item.key ?? index} term={item.term}>\n {item.description}\n </DescriptionItem>\n ))}\n {children}\n </dl>\n );\n }\n);\n\nexport default DescriptionList;\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 {\n Children,\n ComponentType,\n Fragment,\n ReactElement,\n ReactNode,\n cloneElement,\n createContext,\n isValidElement,\n useRef,\n} from \"react\";\n\n/**\n * The column labels of a stacked table (`Table stackBelow`): its head cells\n * publish them by column position, and the body cells of each column read them.\n * A column may have a head cell in several head rows; the lowest row's wins,\n * whatever order the cells wrote in, so each label is kept by its head row.\n *\n * Head cells write while they render, so cells rendered after them — the body\n * follows the head in the markup — read the labels in the same pass: on the\n * server too, and while hydrating, so the server markup has them and the client\n * makes the same. A change after that reaches the body cells through `notify`,\n * which head cells call from an effect.\n *\n * A render that never commits (an interrupted transition) leaves what it wrote\n * until the head cell of that row and column writes again. That is the price of\n * labels in the server markup. The next committed render of the head puts the\n * committed labels back in the store, but notifies only if the committed label\n * changed since its last commit: otherwise the body cells show it once they\n * render on their own.\n */\nexport class ColumnLabels {\n private readonly labels = new Map<number, Map<number, { owner: string; label: string | undefined }>>();\n private readonly listeners = new Set<() => void>();\n private changed = false;\n\n get(column: number): string | undefined {\n const rows = this.labels.get(column);\n if (!rows) return undefined;\n let row = -1;\n for (const at of rows.keys()) if (at > row) row = at;\n return rows.get(row)?.label;\n }\n\n set(column: number, row: number, owner: string, label: string | undefined): void {\n let rows = this.labels.get(column);\n if (!rows) {\n rows = new Map<number, { owner: string; label: string | undefined }>();\n this.labels.set(column, rows);\n }\n const prev = rows.get(row);\n if (prev?.owner === owner && prev.label === label) return;\n rows.set(row, { owner, label });\n this.changed = true;\n }\n\n /** Drops the label of the column's head cell in `row`, unless another head cell has taken that place since. */\n remove(column: number, row: number, owner: string): void {\n const rows = this.labels.get(column);\n if (rows?.get(row)?.owner !== owner) return;\n rows.delete(row);\n if (!rows.size) this.labels.delete(column);\n this.changed = true;\n }\n\n notify(): void {\n if (!this.changed) return;\n this.changed = false;\n this.listeners.forEach((listener) => listener());\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n}\n\n/** The column labels of the table around, while it stacks rows (`stackBelow`); null otherwise. */\nexport const TableLabelsContext = createContext<ColumnLabels | null>(null);\n\n/** Whether the cells around are in the table's head. */\nexport const TableHeadContext = createContext(false);\n\n/** Where a cell sits: the column it starts at and its row within the head or body, both from 0. */\nexport interface CellPlace {\n column: number;\n row: number;\n}\n\n/** A row's place in its head or body: its index, and the columns that cells of the rows above span into. */\nexport interface RowPlace {\n row: number;\n taken: ReadonlySet<number>;\n}\n\n/** The cell's place in a stacked table; null in a table that doesn't stack. */\nexport const TableColumnContext = createContext<CellPlace | null>(null);\n\n/** The row's place in its head or body, in a stacked table; null otherwise or outside a head or body. */\nexport const TableRowPlaceContext = createContext<RowPlace | null>(null);\n\n/** How many columns a cell spans, from its `colSpan`. */\nexport const cellSpan = (colSpan: number | string | undefined): number => Math.max(1, Math.floor(Number(colSpan)) || 1);\n\n/** How many rows a cell spans, from its `rowSpan`: `0` spans the rest of its head or body, as in HTML. */\nexport const cellRowSpan = (rowSpan: number | string | undefined): number => {\n if (rowSpan === undefined || rowSpan === \"\") return 1;\n const rows = Math.floor(Number(rowSpan));\n return rows === 0 ? Infinity : Math.max(1, rows) || 1;\n};\n\ntype SpanProps = { colSpan?: number | string; rowSpan?: number | string };\n\n/**\n * Places a row's cells on the grid of its head or body: each starts at the first\n * column from the left not taken by an earlier cell of the row or by a cell of\n * a row above that spans down into it. `taken[column]` is the row the column is\n * taken until (exclusive); the row's cells are added to it.\n */\nfunction placeRow(cells: SpanProps[], row: number, taken: number[]): number[] {\n let column = 0;\n return cells.map((cell) => {\n while ((taken[column] ?? 0) > row) column++;\n const at = column;\n const span = cellSpan(cell.colSpan);\n const until = row + cellRowSpan(cell.rowSpan);\n for (let i = 0; i < span; i++) taken[at + i] = until;\n column += span;\n return at;\n });\n}\n\n/** Keeps a place object of the last render while it is equal to this render's. */\nexport type KeepPlace<T> = (index: number, place: T) => T;\n\nconst sameRowPlace = (a: RowPlace, b: RowPlace): boolean =>\n a.row === b.row && a.taken.size === b.taken.size && [...a.taken].every((column) => b.taken.has(column));\n\nconst sameCellPlace = (a: CellPlace, b: CellPlace): boolean => a.column === b.column && a.row === b.row;\n\n/**\n * The place objects of the last render, kept while equal, so that a row or\n * cell under a memoized parent doesn't render again because its head or body\n * did. The cache holds values only: a render that never commits leaves equal\n * objects, which are as good.\n */\nfunction usePlaces<T>(same: (a: T, b: T) => boolean): KeepPlace<T> {\n const cache = useRef<T[]>([]);\n const last = cache.current;\n const next: T[] = [];\n cache.current = next;\n return (index, place) => {\n const prev = last[index];\n const kept = prev !== undefined && same(prev, place) ? prev : place;\n next[index] = kept;\n return kept;\n };\n}\n\nexport const useRowPlaces = (): KeepPlace<RowPlace> => usePlaces(sameRowPlace);\nexport const useCellPlaces = (): KeepPlace<CellPlace> => usePlaces(sameCellPlace);\n\n/** Maps a list's elements, the ones in arrays and fragments included, keeping its shape. */\nfunction mapElements(nodes: ReactNode, map: (element: ReactElement) => ReactNode): ReactNode {\n return Children.map(nodes, (child) => {\n if (!isValidElement(child)) return child;\n if (child.type === Fragment) {\n return cloneElement(\n child,\n undefined,\n mapElements((child as ReactElement<{ children?: ReactNode }>).props.children, map)\n );\n }\n return map(child);\n });\n}\n\n/** A list's elements, the ones in arrays and fragments included, in order. */\nfunction elementsOf(nodes: ReactNode): ReactElement[] {\n const list: ReactElement[] = [];\n mapElements(nodes, (element) => {\n list.push(element);\n return null;\n });\n return list;\n}\n\n/**\n * Gives each row of a head or body its place, so that its cells start after\n * the columns that `rowSpan` cells of the rows above take. Rows count in the\n * order they are written, the ones in arrays and fragments included. Only the\n * cells of a `rowType` element written there are seen: a component that renders\n * a row counts as a row whose cells span no further down.\n *\n * Every row is wrapped whether or not the table stacks, so a change of\n * `stackBelow` keeps the rows and their state.\n */\nexport function withRows(\n children: ReactNode,\n stacked: boolean,\n rowType: ComponentType<never>,\n keep: KeepPlace<RowPlace>\n): ReactNode {\n const taken: number[] = [];\n let row = 0;\n return mapElements(children, (element) => {\n let place: RowPlace | null = null;\n if (stacked) {\n const at = row++;\n place = keep(at, { row: at, taken: new Set(taken.flatMap((until, column) => (until > at ? [column] : []))) });\n const cells =\n element.type === rowType\n ? elementsOf((element as ReactElement<{ children?: ReactNode }>).props.children).map(\n (cell) => cell.props as SpanProps\n )\n : [];\n placeRow(cells, at, taken);\n }\n return <TableRowPlaceContext.Provider value={place}>{element}</TableRowPlaceContext.Provider>;\n });\n}\n\n/**\n * Gives each cell of a row its place. Cells count in the order they are written,\n * the ones in arrays and fragments included; any other element — a component\n * that renders a cell — counts as one cell, with its own `colSpan` and `rowSpan`.\n * Each cell is wrapped whether or not the table stacks, so a change of\n * `stackBelow` keeps the cells' content and its state.\n */\nexport function withColumns(\n children: ReactNode,\n stacked: boolean,\n place: RowPlace | null,\n keep: KeepPlace<CellPlace>\n): ReactNode {\n const row = place?.row ?? 0;\n const taken: number[] = [];\n place?.taken.forEach((column) => (taken[column] = row + 1));\n let index = 0;\n return mapElements(children, (element) => {\n const at = stacked ? keep(index++, { column: placeRow([element.props as SpanProps], row, taken)[0], row }) : null;\n return <TableColumnContext.Provider value={at}>{element}</TableColumnContext.Provider>;\n });\n}\n\n/**\n * The text of a header's content: its strings and numbers, those inside elements\n * included, with white space collapsed. A component that makes its text itself\n * (a translated message, an icon) gives none: name such a column by\n * `TableHeadCell label`.\n */\nexport function textOf(node: ReactNode): string {\n const collect = (value: ReactNode): string => {\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (Array.isArray(value)) return value.map(collect).join(\"\");\n if (isValidElement(value)) return collect((value as ReactElement<{ children?: ReactNode }>).props.children);\n return \"\";\n };\n return collect(node).replace(/\\s+/g, \" \").trim();\n}\n","import { HTMLAttributes, PropsWithChildren, ReactNode, forwardRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { TablePagination, TablePaginationProps } from \"./index\";\nimport {\n ColumnLabels,\n TableColumnContext,\n TableHeadContext,\n TableLabelsContext,\n TableRowPlaceContext,\n} from \"./tableColumns\";\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 /**\n * Show each row as a card — cells one under another, each with its column's\n * label — while the table's container is narrower than this breakpoint:\n * `sm` (420px), `md` (768px) or `lg` (1024px). A container query: the space\n * the table has decides, not the window.\n *\n * A cell's label is its `TableCell label`, or else the label of the head cell\n * of its column: the head cell's `label`, or the text of its content. Columns\n * count as in HTML: by position in the row, with `colSpan`, after the columns\n * that `rowSpan` cells of the rows above take in the same head or body. A cell\n * spanning several columns takes no label from the head and fills the card's\n * width, and a head cell spanning several columns labels none of them. With\n * several head rows, the lowest head cell over a column names it.\n *\n * The columns come from the elements written: rows written as `TableRow` in\n * `TableHead` or `TableBody`, and cells in a row (arrays and fragments\n * included). A component that renders a row counts as a row whose cells span\n * no rows down, and a component that renders cells counts as one cell, with\n * its own `colSpan` and `rowSpan`: give the cells after such a component, or\n * the component's own cells, a `label`.\n */\n stackBelow?: \"sm\" | \"md\" | \"lg\";\n paginationSettings?: TablePaginationProps;\n}\n\nconst Table = forwardRef<HTMLDivElement, PropsWithChildren<TableProps>>(\n (\n { className, dense, hovered, children, paginationSettings, isLoading, stickyHeader, caption, stackBelow, ...props },\n ref\n ) => {\n const [labels] = useState(() => new ColumnLabels());\n return (\n <div\n ref={ref}\n className={cn(\n \"smwb-table__wrapper\",\n className,\n {\n [\"smwb-table__wrapper_loading\"]: isLoading,\n },\n stackBelow && `smwb-table__wrapper_stack-${stackBelow}`\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 {/* A table inside a cell of another counts its own rows and cells. */}\n <TableLabelsContext.Provider value={stackBelow ? labels : null}>\n <TableHeadContext.Provider value={false}>\n <TableRowPlaceContext.Provider value={null}>\n <TableColumnContext.Provider value={null}>{children}</TableColumnContext.Provider>\n </TableRowPlaceContext.Provider>\n </TableHeadContext.Provider>\n </TableLabelsContext.Provider>\n </table>\n </div>\n {!!paginationSettings && <TablePagination {...paginationSettings} />}\n </div>\n );\n }\n);\n\nexport default Table;\n","import React, { HTMLAttributes, PropsWithChildren, useContext } from \"react\";\nimport cn from \"clsx\";\nimport { TableLabelsContext, TableRowPlaceContext, useCellPlaces, withColumns } from \"./tableColumns\";\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 /** Test id of the `<tr>`; `table-row` unless given. */\n \"data-testid\"?: string;\n}\n\nconst TableRow = ({\n children,\n className,\n selected,\n expanded,\n \"data-testid\": dataTestId = \"table-row\",\n ...props\n}: PropsWithChildren<TableRowProps>) => {\n // In a stacked table each cell learns its column, by which a body cell finds\n // its label in the head.\n const stacked = useContext(TableLabelsContext) != null;\n const place = useContext(TableRowPlaceContext);\n const keep = useCellPlaces();\n return (\n <tr\n data-testid={dataTestId}\n className={cn(\"smwb-table__row\", className, {\n \"smwb-table__row_selected\": selected,\n \"smwb-table__row_expanded\": expanded,\n })}\n {...props}\n // `selected` and `expanded` win over the caller's aria-selected and\n // aria-expanded; without them, the caller's stay.\n aria-selected={selected ?? props[\"aria-selected\"]}\n aria-expanded={expanded ?? props[\"aria-expanded\"]}\n >\n {withColumns(children, stacked, place, keep)}\n </tr>\n );\n};\nexport default TableRow;\n","import React, { HTMLAttributes, PropsWithChildren, useContext } from \"react\";\nimport cn from \"clsx\";\nimport { TableLabelsContext, useRowPlaces, withRows } from \"./tableColumns\";\nimport TableRow from \"./tableRow\";\n\nexport interface TableBodyProps extends HTMLAttributes<HTMLTableSectionElement> {\n className?: string;\n}\n\nconst TableBody = ({ children, className, ...props }: PropsWithChildren<TableBodyProps>) => {\n // In a stacked table each row learns the columns that `rowSpan` cells above\n // it take, so its cells find their columns' labels.\n const stacked = useContext(TableLabelsContext) != null;\n const keep = useRowPlaces();\n return (\n <tbody {...props} className={cn(\"smwb-table__body\", className)}>\n {withRows(children, stacked, TableRow, keep)}\n </tbody>\n );\n};\n\nexport default TableBody;\n","import React, { PropsWithChildren, TdHTMLAttributes, useContext, useSyncExternalStore } from \"react\";\nimport cn from \"clsx\";\nimport { TableColumnContext, TableHeadContext, TableLabelsContext, cellSpan } from \"./tableColumns\";\n\nexport interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n className?: string;\n cellAlign?: \"left\" | \"right\" | \"center\";\n /**\n * The column's name, shown next to the value when the table stacks rows as\n * cards (`Table stackBelow`). Without it, the cell takes the label of its\n * column's head cell; `false` keeps the cell unlabelled, so it fills the\n * card's width (an action, a sub-row). A caller's own `data-label` counts as a\n * given label too.\n */\n label?: string | false;\n /** The cell's label written by hand, as the attribute the stacked layout shows; `label` replaces it. */\n \"data-label\"?: string;\n}\n\nconst noSubscribe = () => () => {};\n\nconst TableCell = ({ children, cellAlign = \"left\", className, label, ...props }: PropsWithChildren<TableCellProps>) => {\n const ownDataLabel = props[\"data-label\"];\n const labels = useContext(TableLabelsContext);\n const place = useContext(TableColumnContext);\n const inHead = useContext(TableHeadContext);\n // Only a body cell of a stacked table, with no label of its own and one column\n // wide, looks its label up in the head.\n const fromHead =\n labels != null &&\n place != null &&\n !inHead &&\n label === undefined &&\n ownDataLabel === undefined &&\n cellSpan(props.colSpan) === 1;\n const read = () => (fromHead ? labels.get(place.column) : undefined);\n const headLabel = useSyncExternalStore(fromHead ? labels.subscribe : noSubscribe, read, read);\n const dataLabel = label === false ? ownDataLabel : (label ?? ownDataLabel ?? headLabel);\n\n return (\n <td\n {...props}\n className={cn(\"smwb-table__cell\", className)}\n align={cellAlign || \"left\"}\n // A caller's own data-label (the way to label cells by hand) survives\n // unless a label replaces it, as in Solid.\n {...(dataLabel !== undefined && { \"data-label\": dataLabel })}\n >\n {children}\n </td>\n );\n};\n\nexport default TableCell;\n","import { HTMLAttributes, PropsWithChildren, useContext } from \"react\";\nimport cn from \"clsx\";\nimport { TableHeadContext, TableLabelsContext, useRowPlaces, withRows } from \"./tableColumns\";\nimport TableRow from \"./tableRow\";\n\nexport interface TableHeadProps extends HTMLAttributes<HTMLTableSectionElement> {\n className?: string;\n}\n\nconst TableHead = ({ children, className, ...props }: PropsWithChildren<TableHeadProps>) => {\n // In a stacked table each row learns the columns that `rowSpan` cells above\n // it take, so its head cells label the columns they stand over.\n const stacked = useContext(TableLabelsContext) != null;\n const keep = useRowPlaces();\n return (\n <thead {...props} className={cn(\"smwb-table__head\", className)}>\n <TableHeadContext.Provider value={true}>{withRows(children, stacked, TableRow, keep)}</TableHeadContext.Provider>\n </thead>\n );\n};\n\nexport default TableHead;\n","import React, { PropsWithChildren, ReactNode, ThHTMLAttributes, useContext, useEffect } from \"react\";\nimport cn from \"clsx\";\nimport { isOwnClick } from \"../../../utils/ownClick\";\nimport Icon from \"../../base/icon/icon\";\nimport { useId } from \"../../../hooks/useId\";\nimport { TableColumnContext, TableHeadContext, TableLabelsContext, cellSpan, textOf } from \"./tableColumns\";\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 /**\n * Enables the interactive sort affordance with keyboard/aria support.\n *\n * The children sit inside the sort control, and controls among them keep\n * their own input: Enter and Space sort only while the sort control itself\n * has focus, and a click sorts unless it lands in a nested control (input,\n * button, link, label, anything focusable) or in a portal. Content that is not\n * a control, such as click-to-edit text, keeps its click from sorting by\n * calling `preventDefault()` on it. A nested control's name, or its value,\n * becomes part of the sort control's accessible name: put controls in\n * `actions` instead.\n */\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 * The column's controls — a filter field, a menu button, a column resizer —\n * drawn after the sort control, outside it. Their names and values stay out\n * of the sort control's accessible name, and their keys and clicks never\n * reach it. Rendered whether or not the cell is sortable.\n *\n * The column header is then named after the children alone: the cell's\n * `aria-labelledby` points at the sort control, unless the cell is given\n * `aria-label` or `aria-labelledby`. Named from its content, the header would\n * take in the controls' names and values too.\n */\n actions?: ReactNode;\n /**\n * The column's name for its body cells while the table stacks rows as cards\n * (`Table stackBelow`). Without it, the text of the children is the name; give\n * `label` where they hold no text of their own (an icon, a translated message\n * component) or more than the name. An empty `label` leaves the column's cells\n * unlabelled, so they fill the card's width.\n */\n label?: string;\n}\n\n/**\n * A head cell of a stacked table labels its column, for its own head row: the\n * lowest row's label wins. It writes the label while it renders, for the body\n * cells that render after it, and again from an effect: that also tells body\n * cells which rendered before a change.\n */\nfunction useColumnLabel(owner: string, colSpan: number | string | undefined, text: () => string): void {\n const labels = useContext(TableLabelsContext);\n const place = useContext(TableColumnContext);\n const inHead = useContext(TableHeadContext);\n const labelling = labels != null && place != null && inHead && cellSpan(colSpan) === 1;\n const column = place?.column ?? -1;\n const row = place?.row ?? -1;\n const label = labelling ? text() || undefined : undefined;\n // Written during render so the server markup has the labels: see ColumnLabels.\n if (labelling) labels.set(column, row, owner, label);\n useEffect(() => {\n if (!labelling) return;\n labels.set(column, row, owner, label);\n labels.notify();\n return () => {\n labels.remove(column, row, owner);\n labels.notify();\n };\n }, [labels, column, row, owner, labelling, label]);\n}\n\nconst TableHeadCell = ({\n children,\n className,\n cellAlign = \"left\",\n isSortedByAsc,\n isSortedByDesc,\n sortable,\n sortDirection,\n onSort,\n actions,\n label,\n ...props\n}: PropsWithChildren<TableHeadCellProps>) => {\n const id = useId();\n useColumnLabel(id, props.colSpan, () => label ?? textOf(children));\n\n const direction: SortDirection =\n sortDirection !== undefined ? sortDirection : isSortedByAsc ? \"asc\" : isSortedByDesc ? \"desc\" : false;\n\n // A sortable cell's sort state wins over the caller's aria-sort; a cell that\n // is not sortable keeps the caller's.\n const ariaSort = sortable\n ? direction === \"asc\"\n ? \"ascending\"\n : direction === \"desc\"\n ? \"descending\"\n : \"none\"\n : props[\"aria-sort\"];\n\n /**\n * A sortable column always shows a marker: the current direction once sorted,\n * and `unfold_more` before that — otherwise nothing tells the reader the column\n * can be sorted at all. A cell that is not sortable shows nothing; it used to\n * render an `<Icon name=\"\">`, which reserved a gap and warned about a missing\n * icon under `source: \"smwb\"`.\n */\n const iconName = direction === \"asc\" ? \"expand_more\" : direction === \"desc\" ? \"expand_less\" : \"unfold_more\";\n\n // Keys typed into an input or pressed on a button inside bubble up here too;\n // only the control's own keys sort.\n const onKeyDown = (event: React.KeyboardEvent<HTMLSpanElement>) => {\n if (event.target !== event.currentTarget) return;\n if (sortable && onSort && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n onSort();\n }\n };\n\n // A click sorts only when the control is the nearest thing that takes it. A\n // click in a portal rendered inside fails that too: React delivers it here,\n // though it landed outside the control.\n const onClick = (event: React.MouseEvent<HTMLSpanElement>) => {\n if (!isOwnClick(event)) return;\n onSort?.();\n };\n\n // With actions drawn, the column header is named after the content of its\n // sort control, not after the whole cell: the controls' names and the text\n // typed into them would join the header's name.\n const labelId = `${id}-label`;\n const labelled = !!actions && props[\"aria-label\"] == null && props[\"aria-labelledby\"] == null;\n\n return (\n <th\n {...props}\n aria-labelledby={labelled ? labelId : props[\"aria-labelledby\"]}\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 \"smwb-head-cell_sorted\": !!sortable && direction !== false,\n })}\n >\n <span\n id={labelled ? labelId : undefined}\n className=\"smwb-head-cell__content\"\n onClick={sortable ? onClick : undefined}\n onKeyDown={sortable ? onKeyDown : undefined}\n role={sortable ? \"button\" : undefined}\n tabIndex={sortable ? 0 : undefined}\n >\n {children}\n {sortable && <Icon className=\"smwb-head-cell__icon\" name={iconName} size={18} weight={800} />}\n </span>\n {actions ? <div className=\"smwb-head-cell__actions\">{actions}</div> : null}\n </th>\n );\n};\n\nexport default TableHeadCell;\n","import React, { forwardRef, KeyboardEvent, ReactNode, useMemo, useRef, 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 plus, for user toggles, the node that just changed. */\n onSelectedChange?: (selected: string[], changed?: { id: string; selected: boolean }) => 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 /** Test id of the root `<div>`; `tree-view` unless given. */\n \"data-testid\"?: string;\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 \"data-testid\": dataTestId = \"tree-view\",\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 lastToggledRef = useRef<{ id: string; selected: boolean }>();\n const [selectedIds, setSelectedIds] = useControllableState<string[]>({\n value: selected,\n defaultValue: defaultSelected,\n onChange: (next) => {\n // useControllableState calls onChange synchronously from the setter,\n // so lastToggledRef still refers to the toggle that caused this change.\n const changed = lastToggledRef.current;\n lastToggledRef.current = undefined;\n onSelectedChange?.(next, changed);\n },\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 lastToggledRef.current = { id, selected: !selectedIds.includes(id) };\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={dataTestId} {...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, { HTMLAttributes, LiHTMLAttributes, OlHTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport type TimelineTone = \"neutral\" | \"info\" | \"success\" | \"warning\" | \"error\";\n\nexport interface TimelineProps extends OlHTMLAttributes<HTMLOListElement> {\n className?: string;\n /** Tighter rows, for side panels. */\n dense?: boolean;\n /** Keep a group's label in view while its events scroll past (in a scrolling container). */\n stickyLabels?: boolean;\n}\n\nexport interface TimelineGroupProps extends Omit<LiHTMLAttributes<HTMLLIElement>, \"title\"> {\n className?: string;\n /** What groups the events — a day, a week, a stage. */\n label: ReactNode;\n}\n\nexport interface TimelineItemProps extends Omit<HTMLAttributes<HTMLLIElement>, \"title\"> {\n className?: string;\n /** The event itself: a line of text, usually a link. */\n title: ReactNode;\n /** A second line: who, what kind, where. */\n meta?: ReactNode;\n /** When: a time or a date, at the end of the row. */\n time?: ReactNode;\n /** The event's mark on the line: a Material Symbols name or an element. A dot without it. */\n icon?: string | ReactNode;\n /** Colour of the mark. */\n tone?: TimelineTone;\n}\n\n/**\n * Events on a line, newest or oldest first as given: TimelineItem children,\n * optionally grouped by TimelineGroup (a day, a week).\n */\nexport const Timeline = React.forwardRef<HTMLOListElement, PropsWithChildren<TimelineProps>>(function Timeline(\n { className, dense, stickyLabels, children, ...rest },\n ref\n) {\n return (\n <ol\n {...rest}\n ref={ref}\n className={cn(\n \"smwb-timeline\",\n { \"smwb-timeline_dense\": dense, \"smwb-timeline_sticky-labels\": stickyLabels },\n className\n )}\n >\n {children}\n </ol>\n );\n});\n\n/** A labelled run of events: the label, then its TimelineItem children on the line. */\nexport const TimelineGroup = React.forwardRef<HTMLLIElement, PropsWithChildren<TimelineGroupProps>>(\n function TimelineGroup({ className, label, children, ...rest }, ref) {\n return (\n <li {...rest} ref={ref} className={cn(\"smwb-timeline__group\", className)}>\n <div className=\"smwb-timeline__label\">{label}</div>\n <ol className=\"smwb-timeline__items\">{children}</ol>\n </li>\n );\n }\n);\n\n/** One event: its mark on the line, the title and meta lines, the time; children below. */\nexport const TimelineItem = React.forwardRef<HTMLLIElement, PropsWithChildren<TimelineItemProps>>(function TimelineItem(\n { className, title, meta, time, icon, tone = \"neutral\", children, ...rest },\n ref\n) {\n return (\n <li {...rest} ref={ref} className={cn(\"smwb-timeline__item\", `smwb-timeline__item_tone-${tone}`, className)}>\n <span className=\"smwb-timeline__mark\" aria-hidden=\"true\">\n {icon ? (\n typeof icon === \"string\" ? (\n <Icon name={icon} size={16} />\n ) : (\n icon\n )\n ) : (\n <span className=\"smwb-timeline__dot\" />\n )}\n </span>\n <div className=\"smwb-timeline__body\">\n <div className=\"smwb-timeline__title\">{title}</div>\n {meta ? <div className=\"smwb-timeline__meta\">{meta}</div> : null}\n {children ? <div className=\"smwb-timeline__content\">{children}</div> : null}\n </div>\n {time ? <div className=\"smwb-timeline__time\">{time}</div> : null}\n </li>\n );\n});\n\nexport default Timeline;\n","import React, { useEffect, useRef } from \"react\";\nimport { useForkRef } from \"../../hooks/useForkRef\";\nimport { useEventCallback } from \"../../hooks/useEventCallback\";\nimport { isEventInForeignOverlay } from \"../../utils/overlayLayer\";\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 // Interactions inside a portaled overlay layer above the child (modal,\n // dropdown, picker…) are not \"away\" from the child.\n if (isEventInForeignOverlay(event, nodeRef.current)) {\n return;\n }\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 /** Test id of the root `<div>`; `message` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const MessageContainer = forwardRef<HTMLDivElement, PropsWithChildren<MessageProps>>(\n (\n {\n className,\n children,\n type,\n severity,\n variant = \"filled\",\n onClose,\n closeAriaLabel = \"Close\",\n \"data-testid\": dataTestId = \"message\",\n ...props\n },\n ref\n ) => {\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={dataTestId}\n {...props}\n // Defaults: the caller's own role and aria-live win, and an explicit\n // undefined keeps these.\n role={props.role ?? \"alert\"}\n aria-live={props[\"aria-live\"] ?? (resolvedSeverity === \"error\" ? \"assertive\" : \"polite\")}\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 // The visible heading also names the dialog for screen readers.\n const heading = title ?? \"Save\";\n\n return (\n <Modal open={open} onClose={onClose} size=\"medium\" aria-label={heading}>\n <Modal.Header>{heading}</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 fullWidth\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, type CSSProperties, type ReactNode } 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 /** Upper bound of `progressValue` (100 by default): with `max={14}`, `progressValue={3}` is 3 of 14. */\n max?: number;\n /** Semantic color. */\n color?: ProgressColor;\n /** Circular size preset. */\n size?: \"small\" | \"medium\" | \"large\";\n /** Linear: fill the container's width instead of the fixed 240px track. */\n fullWidth?: boolean;\n /** Linear: the width, in px or any CSS length. */\n width?: number | string;\n /**\n * Linear, determinate: the value as text beside the bar. `true` shows a\n * percentage — or \"3 / 14\" with a custom `max`; a function formats it, e.g.\n * `(value, max) => <>{value} of {max}</>`.\n */\n valueLabel?: boolean | ((value: number, max: number) => ReactNode);\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 {\n type,\n variant,\n className,\n progressValue = 0,\n max = 100,\n color = \"primary\",\n size = \"medium\",\n fullWidth,\n width,\n valueLabel,\n id,\n ...rest\n },\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\": max } : {}),\n };\n const colorClass = color !== \"primary\" ? `smwb-indicator_color-${color}` : null;\n const percent = Math.min(100, Math.max(0, max > 0 ? (progressValue / max) * 100 : 0));\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={percent} />\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 // Width class and style go on the outermost element: the bar, or the wrapper\n // that also holds the value label.\n const sizeClass = { \"smwb-indicator_full-width\": fullWidth };\n const sizeStyle: CSSProperties | undefined =\n width !== undefined ? { width: typeof width === \"number\" ? `${width}px` : width } : undefined;\n const bar = (outer: boolean) => (\n <div\n ref={outer ? ref : undefined}\n className={cn(\"smwb-indicator_linear\", `smwb-${type}`, colorClass, outer && sizeClass, outer && className)}\n style={outer ? sizeStyle : undefined}\n {...ariaProps}\n >\n <div\n className=\"smwb-indicator_linear__thumb\"\n style={type === \"determinate\" ? { width: `${percent}%` } : {}}\n ></div>\n </div>\n );\n\n if (!valueLabel || type !== \"determinate\") {\n return bar(true);\n }\n const defaultText = max === 100 ? `${Math.round(progressValue)}%` : `${progressValue} / ${max}`;\n return (\n <div ref={ref} className={cn(\"smwb-indicator_labeled\", sizeClass, className)} style={sizeStyle}>\n {bar(false)}\n <span className=\"smwb-indicator__value\">\n {typeof valueLabel === \"function\" ? valueLabel(progressValue, max) : defaultText}\n </span>\n </div>\n );\n});\n\nexport interface CircularProgressProps {\n /** Percent, 0–100. */\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 React, { useId } from \"react\";\nimport cn from \"clsx\";\nimport { Modal } from \"../modal\";\nimport { Button } from \"../../inputs/button\";\nimport { Typography } from \"../../dataDisplay/typography\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n /** The subject of the action, shown emphasised on its own line (e.g. the asset name). */\n subject?: string;\n /** A secondary explanatory line (e.g. \"can't be undone\"). */\n message?: string;\n confirmLabel: string;\n cancelLabel?: string;\n /** Style the confirm button as destructive (red). */\n danger?: boolean;\n /** Disable the actions + gate Esc/outside-click while a confirm is in flight. */\n busy?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n className?: string;\n}\n\n/**\n * An alert/confirm dialog built on {@link Modal}: a title, an optional emphasised subject + secondary\n * message, and Cancel / Confirm actions. `role=\"alertdialog\"` with the subject + message wired to\n * `aria-describedby` so a screen reader announces the consequence, not just the title. While `busy`,\n * Escape + outside-click are gated and the buttons disabled. Pure presentation — the caller owns the\n * open state and the confirm/cancel handlers (and supplies localised labels).\n */\nexport function ConfirmDialog(props: ConfirmDialogProps): React.ReactElement {\n const { open, title, subject, message, confirmLabel, cancelLabel, danger, busy, onConfirm, onCancel, className } =\n props;\n\n const subjectId = useId();\n const messageId = useId();\n // Only describe when there IS something to describe — an empty aria-describedby would point a\n // screen reader at nothing.\n const describedBy = [subject ? subjectId : \"\", message ? messageId : \"\"].filter(Boolean).join(\" \");\n\n return (\n <Modal\n open={open}\n onClose={onCancel}\n size=\"medium\"\n role=\"alertdialog\"\n backdrop=\"dark\"\n closeOnEsc={!busy}\n closeOnOutsideClick={!busy}\n aria-label={title}\n {...(describedBy ? { \"aria-describedby\": describedBy } : {})}\n >\n <Modal.Header>{title}</Modal.Header>\n <Modal.Content>\n <div className={cn(\"smwb-confirm-dialog__body\", className)}>\n {subject ? (\n <Typography id={subjectId} variant=\"body2\" color=\"textPrimary\" component=\"span\">\n {subject}\n </Typography>\n ) : null}\n {message ? (\n <Typography id={messageId} variant=\"caption\" color=\"textSecondary\" component=\"span\">\n {message}\n </Typography>\n ) : null}\n </div>\n </Modal.Content>\n <Modal.Footer>\n <Button variant=\"text\" size=\"small\" disabled={!!busy} onClick={onCancel} label={cancelLabel ?? \"Cancel\"} />\n <Button\n variant=\"contained\"\n size=\"small\"\n color={danger ? \"error\" : \"primary\"}\n disabled={!!busy}\n onClick={onConfirm}\n label={confirmLabel}\n />\n </Modal.Footer>\n </Modal>\n );\n}\n\nexport default ConfirmDialog;\n","import React, { HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n className?: string;\n /** What is empty, e.g. \"No works yet\". */\n title?: ReactNode;\n /** An icon name, or an icon element. Decorative: the title and the message say it all. */\n icon?: ReactNode | string;\n /** What the reader can do about it: buttons or links. */\n actions?: ReactNode;\n /**\n * `block` (default): centred, for an empty page, panel or card.\n * `inline`: a muted line of text, for a list, a table or a column that came\n * out empty; an action follows the last word.\n */\n variant?: \"block\" | \"inline\";\n /** `small`: tighter, for a narrow column or a card. */\n size?: \"small\" | \"medium\";\n /** Test id of the root `<div>`; `empty-state` unless given. */\n \"data-testid\"?: string;\n}\n\nconst ICON_SIZE = { block: { medium: 32, small: 24 }, inline: { medium: 18, small: 16 } } as const;\n\nconst present = (value: ReactNode): boolean =>\n value !== undefined &&\n value !== null &&\n value !== false &&\n value !== \"\" &&\n !(Array.isArray(value) && value.length === 0);\n\n/**\n * What a list, a table or a panel shows when it has nothing: an icon, a title,\n * the message (the children) and actions.\n */\nexport const EmptyState = React.forwardRef<HTMLDivElement, PropsWithChildren<EmptyStateProps>>(function EmptyState(\n {\n className,\n title,\n icon,\n actions,\n variant = \"block\",\n size = \"medium\",\n children,\n \"data-testid\": dataTestId = \"empty-state\",\n ...rest\n },\n ref\n) {\n return (\n <div\n data-testid={dataTestId}\n {...rest}\n ref={ref}\n className={cn(\"smwb-empty-state\", `smwb-empty-state_${variant}`, `smwb-empty-state_${size}`, className)}\n >\n {present(icon) ? (\n <span className=\"smwb-empty-state__icon\" aria-hidden=\"true\">\n {typeof icon === \"string\" ? <Icon name={icon} size={ICON_SIZE[variant][size]} /> : icon}\n </span>\n ) : null}\n {present(title) ? <div className=\"smwb-empty-state__title\">{title}</div> : null}\n {present(children) ? <div className=\"smwb-empty-state__description\">{children}</div> : null}\n {present(actions) ? <div className=\"smwb-empty-state__actions\">{actions}</div> : null}\n </div>\n );\n});\n\nexport default EmptyState;\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 {...rest}\n // Defaults: the caller's own role, aria-live and aria-atomic win, and an\n // explicit undefined keeps these.\n role={rest.role ?? \"alert\"}\n aria-live={rest[\"aria-live\"] ?? (variant === \"danger\" ? \"assertive\" : \"polite\")}\n aria-atomic={rest[\"aria-atomic\"] ?? \"true\"}\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 { useEffect } from \"react\";\nimport { useEventCallback } from \"./useEventCallback\";\n\n/**\n * While `active`, Escape calls `onDismiss` wherever focus is and is marked as handled\n * (`preventDefault()`), so a window, fullscreen panel, Modal or Sheet around stays open\n * until the next press. For content shown on hover or focus, such as a tooltip, which\n * Escape must hide without moving the pointer or focus (WCAG 1.4.13).\n *\n * The listener runs in the capture phase on `document`: those surfaces listen on\n * `document` in the bubble phase, and one opened before the content showed would\n * otherwise see the key first.\n */\nexport function useDismissOnEscape(active: boolean, onDismiss: () => void): void {\n const dismiss = useEventCallback(onDismiss);\n useEffect(() => {\n if (!active) return undefined;\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n dismiss();\n };\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => document.removeEventListener(\"keydown\", onKeyDown, true);\n }, [active, dismiss]);\n}\n","import React, { forwardRef, PropsWithChildren, useCallback, useEffect, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { autoUpdate, flip, offset as offsetMiddleware, shift, useFloating } from \"@floating-ui/react\";\nimport { Placement, resolvePlacement } from \"../../../utils/floating\";\nimport { useDismissOnEscape } from \"../../../hooks/useDismissOnEscape\";\n\nexport type TooltipTrigger = \"hover\" | \"click\" | \"manual\";\n\nexport interface TooltipProps {\n className?: string;\n offset?: {\n offsetX?: number;\n offsetY?: number;\n };\n /** What the tip says: text or markup. */\n message: React.ReactNode;\n placement?: Placement;\n /** Controls tooltip visibility when trigger is manual. */\n open?: boolean;\n /**\n * What shows the tooltip. `hover` (default): the pointer over the target or keyboard focus\n * in it, until both have left. Keyboard focus is focus with a focus ring (`:focus-visible`),\n * not the focus a mouse press gives a button. `click`: a click on the target shows or hides\n * it. `manual`: `open` alone. Escape hides a `hover` or `click` tooltip.\n */\n trigger?: TooltipTrigger;\n /** Milliseconds from the pointer entering the target, or keyboard focus moving into it, until a hover tooltip shows. */\n openDelay?: number;\n /** Milliseconds from the pointer and keyboard focus both leaving the target until a hover tooltip hides. */\n closeDelay?: number;\n}\n\ninterface TooltipPopupProps {\n reference: HTMLElement;\n placement: Placement;\n offset: TooltipProps[\"offset\"];\n className?: string;\n children: React.ReactNode;\n}\n\n// Floating UI's hooks run layout effects, so they live here and mount only while\n// the tooltip shows: a closed tooltip runs none, on the server included. (Floating\n// UI picks useLayoutEffect when its module loads in a DOM, so a server render in\n// a DOM test environment warned for every closed tooltip.)\nfunction TooltipPopup({ reference, placement, offset, className, children }: TooltipPopupProps) {\n const resolved = resolvePlacement(placement);\n const { refs, floatingStyles } = useFloating({\n elements: { reference },\n placement: resolved.placement,\n whileElementsMounted: autoUpdate,\n middleware: [\n offsetMiddleware({ mainAxis: offset?.offsetY ?? 0, crossAxis: offset?.offsetX ?? 0 }),\n // A fixed placement turns to the other side, and slides along it, when the\n // viewport has no room for it.\n ...(resolved.autoMiddleware ? [resolved.autoMiddleware] : [flip(), shift({ padding: 8 })]),\n ],\n });\n return (\n <div ref={refs.setFloating} className={cn(\"smwb-tooltip\", className)} style={floatingStyles}>\n {children}\n </div>\n );\n}\n\n/**\n * Whether focus on `element` draws a focus ring (`:focus-visible`): focus from the keyboard,\n * not the focus a mouse press gives a button. An engine without the selector counts any focus.\n */\nfunction hasFocusRing(element: Element): boolean {\n try {\n return element.matches(\":focus-visible\");\n } catch {\n return true;\n }\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 [reference, setReference] = useState<HTMLDivElement | null>(null);\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 // The pointer over the target and keyboard focus in it each keep a hover tooltip shown.\n const pointerInsideRef = useRef(false);\n const focusInsideRef = useRef(false);\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 // Escape hides a tooltip shown on hover or focus wherever focus is (WCAG 1.4.13), and the\n // window, panel, Modal or Sheet around it stays open until the next press. Focus left in\n // the target no longer keeps it: the pointer alone shows and hides it until focus moves.\n useDismissOnEscape(trigger === \"hover\" && hoverOpen, () => {\n clearTimers();\n focusInsideRef.current = false;\n setHoverOpen(false);\n });\n // A click tooltip hides on Escape the same way.\n useDismissOnEscape(trigger === \"click\" && clickOpen, () => setClickOpen(false));\n\n const isVisible = trigger === \"manual\" ? openProp === true : trigger === \"click\" ? clickOpen : hoverOpen;\n\n const onPointerEnter = () => {\n pointerInsideRef.current = true;\n if (trigger === \"hover\") scheduleOpen();\n };\n const onPointerLeave = () => {\n pointerInsideRef.current = false;\n if (trigger === \"hover\" && !focusInsideRef.current) scheduleClose();\n };\n // Focus without a focus ring doesn't count: the focus a mouse press gives a button would\n // keep the tooltip shown after the pointer leaves.\n const onFocus = (event: React.FocusEvent<HTMLDivElement>) => {\n // Focus in a portal the target renders (a menu, a picker panel) reaches here through the\n // React tree, but it is not in the target.\n if (!event.currentTarget.contains(event.target)) return;\n focusInsideRef.current = hasFocusRing(event.target);\n if (trigger === \"hover\" && focusInsideRef.current) scheduleOpen();\n };\n const onBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n // Focus moving to another control in the target keeps the tooltip.\n if (event.currentTarget.contains(event.relatedTarget)) return;\n focusInsideRef.current = false;\n if (trigger === \"hover\" && !pointerInsideRef.current) scheduleClose();\n };\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={setReference}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onFocus={onFocus}\n onBlur={onBlur}\n onClick={onClick}\n >\n {children}\n </div>\n {isVisible && reference ? (\n <TooltipPopup reference={reference} placement={placement} offset={offset} className={className}>\n {message}\n </TooltipPopup>\n ) : null}\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 /** Test id of the root `<div>`; `button-group` unless given. */\n \"data-testid\"?: string;\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 \"data-testid\": dataTestId = \"button-group\",\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 data-testid={dataTestId}\n {...rest}\n // A default: the caller's own wins, and an explicit undefined keeps it.\n role={rest.role ?? \"group\"}\n >\n {React.Children.map(children, (child) => {\n // A child left out, such as `{show && <Button />}`, is null here: nothing to group.\n if (!React.isValidElement(child)) {\n return child;\n }\n const element = child as React.ReactElement<ButtonProps>;\n\n // The group's props are defaults: a button's own win, and its own class\n // adds to the group's.\n return React.cloneElement(element, {\n className: cn(\"smwb-button-group__grouped\", element.props.className),\n fullWidth: element.props.fullWidth ?? (orientation === \"vertical\" || 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 type React from \"react\";\n\n// `readonly` means nothing to a checkbox or radio input: a click on it or on its label, Space, and\n// the arrow keys in a radio group still toggle it, each through a click on the input. Checkbox,\n// RadioButton and Toggle call these two while read-only.\n//\n// A controlled input (`checked` given) needs neither: after every click React puts it back to\n// `checked`, and the rest of its named radio group to theirs. Cancelling the click as well would\n// give the last word to the browser, which restores the state from before the click even when the\n// click changed `checked` (say, a row that selects itself on click).\n\n/**\n * Call from the input's `onClick`. Cancels the click on an uncontrolled input; the browser then\n * restores its previous state, and re-checks the radio that was checked before.\n */\nexport function cancelToggle(event: React.MouseEvent<HTMLInputElement>, checked: boolean | null | undefined): void {\n if (checked == null) event.preventDefault();\n}\n\n/**\n * Call from the input's `onChange`. React has recorded the toggled state of an uncontrolled input,\n * and the browser puts the old one back after the cancelled click without React noticing; React\n * would then take the next real change for no change and skip `onChange`. Record the old state\n * instead: set it through the input's own `checked` (the property React watches), then put the\n * toggled one back through the prototype's setter, which React doesn't watch, so the input stays\n * as it is until the browser restores it.\n */\nexport function forgetCancelledToggle(\n event: React.ChangeEvent<HTMLInputElement>,\n checked: boolean | null | undefined\n): void {\n if (checked != null) return;\n const input = event.currentTarget;\n const toggled = input.checked;\n input.checked = !toggled;\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, \"checked\")?.set?.call(input, toggled);\n}\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { cancelToggle, forgetCancelledToggle } from \"../../../utils/readOnlyToggle\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useHelperText } from \"../../../hooks/useHelperText\";\nimport { useId } from \"../../../hooks/useId\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\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 /**\n * Keeps the checkbox as it is: clicks on it or its label and Space change nothing, and `onChange` is not called.\n * It stays focusable, and its input tells assistive technology it is read-only (`aria-readonly`).\n */\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n /**\n * Shows the checkbox as partly checked, as for a \"select all\" over a partial selection: drawn with a dash and\n * announced as \"mixed\" by screen readers, whatever `checked` is. A click does not clear it: the click toggles\n * `checked` as usual and `onChange` reports the new `checked`, while the checkbox stays mixed until this prop turns\n * false.\n */\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, forwardedRef) {\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 \"aria-describedby\": ariaDescribedBy,\n ...args\n } = props;\n const id = useId(idProp);\n const helper = useHelperText(helperText, { describedBy: ariaDescribedBy });\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n const ref = useForkRef(forwardedRef, inputRef);\n // `indeterminate` is a DOM property with no attribute, so no markup carries it:\n // set it on the input after every render.\n useSafeLayoutEffect(() => {\n if (inputRef.current) inputRef.current.indeterminate = Boolean(indeterminate);\n });\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n // A click clears the input's indeterminate property; the prop still decides it.\n e.target.indeterminate = Boolean(indeterminate);\n if (readOnly) {\n forgetCancelledToggle(e, props.checked);\n return;\n }\n onChange?.(e, e.target.checked, props);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLInputElement>) => {\n props.onClick?.(e);\n if (readOnly) cancelToggle(e, props.checked);\n };\n\n return (\n <TextFieldWrapper\n helperText={helperText}\n helperTextId={helper.id}\n disabled={disabled}\n error={error}\n className=\"smwb-text-field-checkbox\"\n >\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 aria-describedby={helper.describedBy}\n ref={ref}\n {...args}\n aria-readonly={readOnly || args[\"aria-readonly\"]}\n onChange={handleChange}\n onClick={handleClick}\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 // The button sets this on its root too; its own handler calls the caller's first.\n onPointerDown: onPointerDownProp,\n // A default: the caller's type wins.\n type = \"button\",\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 onPointerDownProp?.(event);\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={type}\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 // The day sets these on its root too; its own handlers call the caller's first.\n onPointerDown: onPointerDownProp,\n onClick: onClickProp,\n // A default: the caller's type wins.\n type = \"button\",\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 onPointerDownProp?.(event);\n if (!disabled) {\n rippleRef.current?.onRipple(event);\n }\n },\n [onPointerDownProp, disabled]\n );\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClickProp?.(event);\n if (!disabled) {\n onChange?.(undefined, day);\n }\n },\n [onClickProp, onChange, day, disabled]\n );\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={type}\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 /** A submenu's own list: ArrowLeft in it closes the submenu (onClose). */\n submenu?: boolean;\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\ntype DataAttributes = Record<`data-${string}`, unknown>;\n\nexport interface MenuItemProps extends React.HTMLAttributes<HTMLLIElement> {\n /**\n * Greys the item out and marks it `aria-disabled`. It takes no focus, the arrow keys\n * skip it, and neither a click nor Enter or Space chooses it.\n */\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 onKeyDown: onKeyDownProp,\n onClick: onClickProp,\n onMouseDown: onMouseDownProp,\n // The item sets this on its root too; its own handler calls the caller's first.\n onPointerDown: onPointerDownProp,\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 // Enter or Space chooses the focused item, as it would press a button: through a click,\n // so the item's onClick and whatever listens for its clicks (a submenu closing the menu)\n // run as for a pointer. An item with a link clicks the link. A key pressed on something\n // inside the item, such as the link itself, is that element's own.\n const onKeyDown = (event: React.KeyboardEvent<HTMLLIElement>) => {\n onKeyDownProp?.(event);\n\n if (event.defaultPrevented || disabled || event.target !== event.currentTarget) {\n return;\n }\n\n if (event.key === \"Enter\" || event.key === \" \") {\n // Handled: Space doesn't scroll, and Enter doesn't press the button that takes\n // focus when the menu closes.\n event.preventDefault();\n const link = href ? event.currentTarget.firstElementChild : null;\n ((link as HTMLElement | null) ?? event.currentTarget).click();\n }\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 onPointerDownProp?.(event);\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 {...rest}\n // A menu item's role wins over the caller's, and so does its data-value\n // where it has a value. Its tabIndex is a default: the caller's wins.\n role=\"menuitem\"\n ref={ref}\n aria-disabled={disabled || undefined}\n className={classes}\n tabIndex={rest.tabIndex ?? (disabled ? undefined : 0)}\n onClick={onClick}\n data-value={value ?? (rest as DataAttributes)[\"data-value\"]}\n onMouseDown={onMouseDown}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\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\n/** The items the arrow keys move between; a disabled item is marked aria-disabled. */\nexport const ENABLED_ITEM_SELECTOR = '[role=\"menuitem\"]:not([aria-disabled=\"true\"])';\n\nexport type MenuListProps = React.HTMLAttributes<HTMLDivElement>;\n/** `listRole`: the role of the inner list, `menu` by default (see `MenuProps`). */\ntype MenuListOwnProps = MenuListProps & { listRole?: React.AriaRole };\n\nexport const MenuList = React.forwardRef<HTMLDivElement, MenuListOwnProps>(function MenuList(props, ref) {\n const { children, className, ...rest } = props;\n const { variant, onClose, submenu } = useMenuContext();\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLUListElement>) => {\n // Handled inside already, e.g. by a submenu's own list: not this list's key.\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === \"Escape\") {\n // A floating menu closes on it and marks it handled, so what is around the menu\n // (a parent menu, FloatingWindow, fullscreen ExpansionPanel, Modal, Sheet) leaves\n // this press alone. A static menu stays in place and lets it through.\n if (variant === \"floating\") {\n event.preventDefault();\n }\n onClose();\n return;\n }\n if (event.key === \"ArrowLeft\" && submenu) {\n // A submenu closes and gives focus back to its row (MenuFloating does that).\n event.preventDefault();\n onClose();\n return;\n }\n // This list's own items: an open submenu drawn inside it keeps its items to itself.\n const list = event.currentTarget;\n const items = Array.from(list.querySelectorAll<HTMLElement>(ENABLED_ITEM_SELECTOR)).filter(\n (item) => item.closest('[role=\"menu\"]') === list\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 }\n };\n\n const { listRole = \"menu\", ...divProps } = rest;\n\n return (\n <div ref={ref} className={cn(\"smwb-menu\", className, `smwb-menu--${variant}`)} {...divProps}>\n <ul\n className={cn(\"smwb-menu__list\", `smwb-menu__list--${variant}`)}\n role={listRole}\n // ARIA allows an orientation on a menu, not on a presentation list.\n aria-orientation={listRole === \"menu\" ? \"vertical\" : undefined}\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 // While the menu is open, Escape on its anchor (focus left on the button that opened\n // it, or on a submenu's row) closes it, marked as handled like an Escape in the list.\n React.useEffect(() => {\n if (!isOpen || !onClose || !anchorElement) {\n return undefined;\n }\n const onAnchorKeyDown = (event: Event) => {\n if ((event as KeyboardEvent).key === \"Escape\" && !event.defaultPrevented) {\n event.preventDefault();\n onClose();\n }\n };\n anchorElement.addEventListener(\"keydown\", onAnchorKeyDown);\n return () => anchorElement.removeEventListener(\"keydown\", onAnchorKeyDown);\n }, [isOpen, onClose, anchorElement]);\n\n // A menu that closes while it holds focus (on Escape, on a chosen item) hands focus\n // back to its anchor, the button or submenu row it opened from. Otherwise focus falls\n // to <body> when the items unmount, out of a FloatingWindow or Modal around the menu,\n // and the next Escape does not reach them.\n React.useEffect(() => {\n if (!isOpen && nodeRef.current?.contains(document.activeElement)) {\n (anchorElement as HTMLElement | null | undefined)?.focus?.();\n }\n }, [isOpen, anchorElement]);\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 { ENABLED_ITEM_SELECTOR } from \"./menuList\";\nimport { MenuItemProps } from \"./menuItem\";\nimport { MenuContext, useMenuContext } from \"./menuContext\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\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 // Counts the row's keyboard opens: after each, the submenu's first item takes focus.\n const [focusRequest, setFocusRequest] = React.useState(0);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const floatingRef = useForkRef(ref, panelRef);\n React.useEffect(() => {\n if (focusRequest > 0) {\n panelRef.current?.querySelector<HTMLElement>(ENABLED_ITEM_SELECTOR)?.focus();\n }\n }, [focusRequest]);\n const contextValue = useMenuContext();\n\n // The toggle keeps its own ref and handlers; the submenu's handlers run after\n // its own.\n const toggleProps: MenuItemProps = (toggleElement as React.ReactElement<MenuItemProps> | undefined)?.props ?? {};\n const toggleRef = useForkRef((toggleElement as { ref?: React.Ref<HTMLElement> } | undefined)?.ref, setAnchorElement);\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<HTMLLIElement>) => {\n toggleProps.onClick?.(event);\n\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<HTMLLIElement>) => {\n toggleProps.onKeyDown?.(event);\n\n if (event.key === \"ArrowRight\" || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setIsOpen(true);\n setFocusRequest((count) => count + 1);\n } else if (event.key === \"ArrowLeft\" || event.key === \"Escape\") {\n // Closing its own open submenu takes the key: the menu the row is in stays open.\n if (isOpen) {\n event.preventDefault();\n }\n setIsOpen(false);\n }\n };\n\n const onToggleMouseEnter = (event: React.MouseEvent<HTMLLIElement>) => {\n toggleProps.onMouseEnter?.(event);\n\n if (openOnHover) {\n setIsOpen(true);\n }\n };\n\n // aria-haspopup, aria-expanded and selected show the submenu's state: they win\n // over the toggle's own.\n const toggle = React.cloneElement(\n toggleElement as React.ReactElement,\n {\n ref: toggleRef,\n onClick: onToggle,\n onKeyDown: onToggleKeyDown,\n onMouseEnter: onToggleMouseEnter,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": isOpen,\n selected: isOpen,\n } as MenuItemProps\n );\n\n // Escape or ArrowLeft in the submenu's own list closes this submenu, not the whole menu.\n return (\n <MenuContext.Provider value={{ ...contextValue, variant: \"floating\", onClose, submenu: true }}>\n {toggle}\n <MenuFloating\n ref={floatingRef}\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 * Role of the list inside the menu, `menu` by default. A component that draws\n * a list of its own on the menu's surface sets `presentation`: SelectField's\n * options are a `listbox` inside it.\n */\n listRole?: React.AriaRole;\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, useEffect, 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 { isTopOverlayLayer } from \"../../../utils/overlayLayer\";\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 // The calendar is portalled: its target is resolved in the browser only. A server\n // render (no document) and the first client render emit nothing there, so the\n // picker renders and hydrates on a server-rendered page.\n const [portalRoot, setPortalRoot] = useState<HTMLElement>();\n useSafeLayoutEffect(() => {\n setPortalRoot(document.body);\n }, []);\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 panelOpen = isOpen && !disabled && !disableCalendar;\n\n // Escape closes the panel while it is the topmost overlay layer, so the next one\n // reaches a Modal or Sheet around the picker. Focus left in the panel (or on\n // <body> after a click there) goes back to the input rather than being lost.\n useEffect(() => {\n if (!panelOpen) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n const panel = calendarRef.current;\n if (event.key !== \"Escape\" || !panel || !isTopOverlayLayer(panel)) {\n return;\n }\n setIsOpen(false);\n const active = document.activeElement;\n if (!active || active === document.body || panel.contains(active)) {\n anchorRef.current?.focus();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [panelOpen]);\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 {portalRoot\n ? createPortal(\n <Transition nodeRef={calendarRef} in={panelOpen} timeout={150} mountOnEnter unmountOnExit>\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 data-smwb-overlay-layer=\"\"\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 portalRoot\n )\n : null}\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, useEffect, 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 { isTopOverlayLayer } from \"../../../utils/overlayLayer\";\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 // The calendar is portalled: its target is resolved in the browser only. A server\n // render (no document) and the first client render emit nothing there, so the\n // picker renders and hydrates on a server-rendered page.\n const [portalRoot, setPortalRoot] = useState<HTMLElement>();\n useSafeLayoutEffect(() => {\n setPortalRoot(document.body);\n }, []);\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 panelOpen = isOpen && !disabled && !disableCalendar;\n\n // Escape closes the panel while it is the topmost overlay layer, so the next one\n // reaches a Modal or Sheet around the picker. Focus left in the panel (or on\n // <body> after a click there) goes back to the input rather than being lost.\n useEffect(() => {\n if (!panelOpen) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n const panel = popupRef.current;\n if (event.key !== \"Escape\" || !panel || !isTopOverlayLayer(panel)) {\n return;\n }\n setIsOpen(false);\n const active = document.activeElement;\n if (!active || active === document.body || panel.contains(active)) {\n anchorRef.current?.focus();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [panelOpen]);\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 {portalRoot\n ? createPortal(\n <Transition nodeRef={popupRef} in={panelOpen} timeout={150} mountOnEnter unmountOnExit>\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 data-smwb-overlay-layer=\"\"\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 portalRoot\n )\n : null}\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, useEffect, 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 { isTopOverlayLayer } from \"../../../utils/overlayLayer\";\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 // The clock is portalled: its target is resolved in the browser only. A server\n // render (no document) and the first client render emit nothing there, so the\n // picker renders and hydrates on a server-rendered page.\n const [portalRoot, setPortalRoot] = useState<HTMLElement>();\n useSafeLayoutEffect(() => {\n setPortalRoot(document.body);\n }, []);\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 panelOpen = isOpen && !disabled && !disableClock;\n\n // Escape closes the panel while it is the topmost overlay layer, so the next one\n // reaches a Modal or Sheet around the picker. Focus left in the panel (or on\n // <body> after a click there) goes back to the input rather than being lost.\n useEffect(() => {\n if (!panelOpen) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n const panel = clockRef.current;\n if (event.key !== \"Escape\" || !panel || !isTopOverlayLayer(panel)) {\n return;\n }\n setIsOpen(false);\n const active = document.activeElement;\n if (!active || active === document.body || panel.contains(active)) {\n anchorRef.current?.focus();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [panelOpen]);\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 {portalRoot\n ? createPortal(\n <Transition nodeRef={clockRef} in={panelOpen} timeout={150} mountOnEnter unmountOnExit>\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 data-smwb-overlay-layer=\"\"\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 portalRoot\n )\n : null}\n </>\n );\n});\n\nexport default TimePicker;\n","export function isImageFile(file: File): boolean {\n return /^image\\/(png|jpeg)$/.test(file.type);\n}\n","import { FloatingButton } from \"../floatingButton\";\nimport { Icon } from \"../../base/icon\";\nimport { ImagesList, ImagesListItem } from \"../../dataDisplay/imagesList\";\nimport { isImageFile } from \"./utils\";\nimport React from \"react\";\nimport cn from \"clsx\";\n\nexport interface PreviewProps {\n previewCols?: number;\n galleryItemSize?: number;\n previewClassName?: string;\n files: File[];\n handleRemoveAll: () => void;\n}\n\nexport function Preview(props: PreviewProps) {\n const { files, handleRemoveAll, previewCols, galleryItemSize, previewClassName } = props;\n\n const previewClasses = cn(\"smwb-file-drop__preview\", previewClassName);\n\n return (\n <div className={previewClasses}>\n <FloatingButton onClick={handleRemoveAll} className=\"smwb-file-drop__preview-button\">\n <Icon name=\"delete\" size={28} />\n </FloatingButton>\n <ImagesList className=\"smwb-file-drop__preview-gallery\" cols={previewCols as number} rowsHeight={galleryItemSize}>\n {files.map((file: File) => {\n const src = isImageFile(file) ? URL.createObjectURL(file) : null;\n\n return src ? (\n <ImagesListItem\n className=\"smwb-file-drop__preview-gallery-image\"\n key={file.name}\n src={src}\n rows={1}\n cols={1}\n itemBarContent={file.name}\n />\n ) : (\n <div\n key={file.name}\n className=\"smwb-file-drop__preview-gallery-file\"\n style={{\n width: `${(galleryItemSize as number) - 4}px`,\n }}\n >\n {file.name}\n </div>\n );\n })}\n </ImagesList>\n </div>\n );\n}\n","import { FloatingButton } from \"../floatingButton\";\nimport { Icon } from \"../../base/icon\";\nimport React from \"react\";\nimport cn from \"clsx\";\n\nexport interface CountPreviewProps {\n previewClassName?: string;\n text?: string;\n filesLength: number;\n handleRemoveAll: () => void;\n}\n\nexport function CountPreview({ handleRemoveAll, filesLength, previewClassName, text }: CountPreviewProps) {\n const previewClasses = cn(\"smwb-file-drop__preview\", previewClassName);\n\n return (\n <div className={previewClasses}>\n <FloatingButton onClick={handleRemoveAll} className=\"smwb-file-drop__preview-button\">\n <Icon name=\"delete\" size={28} />\n </FloatingButton>\n <div className=\"smwb-file-drop__preview-count\">{`${text ? text : \"uploaded files:\"} ${filesLength}`}</div>\n </div>\n );\n}\n","import { Preview } from \"./preview\";\nimport { CountPreview } from \"./countPreview\";\nimport React from \"react\";\n\nexport interface PreviewWrapperProps {\n preview?: boolean;\n files: File[];\n handleRemoveAll: () => void;\n previewCols?: number;\n galleryItemSize?: number;\n previewClassName?: string;\n}\n\nexport function PreviewWrapper(props: PreviewWrapperProps) {\n const { previewCols, preview, galleryItemSize, handleRemoveAll, files, previewClassName } = props;\n\n return (\n <>\n {preview ? (\n <Preview\n files={files}\n handleRemoveAll={handleRemoveAll}\n previewCols={previewCols}\n galleryItemSize={galleryItemSize}\n previewClassName={previewClassName}\n />\n ) : (\n <CountPreview\n filesLength={files.length}\n handleRemoveAll={handleRemoveAll}\n previewClassName={previewClassName}\n />\n )}\n </>\n );\n}\n","import React, { forwardRef } from \"react\";\nimport { type DropzoneOptions, useDropzone } from \"../../../hooks/useDropzone\";\nimport { PreviewWrapper } from \"./previewWrapper\";\nimport cn from \"clsx\";\n\nexport interface FileUploadProps extends DropzoneOptions {\n preview?: boolean;\n previewCols?: number;\n galleryItemSize?: number;\n onDrop: (files: File[]) => void;\n label?: string;\n className?: string;\n previewClassName?: string;\n disabled?: boolean;\n /** Validation message rendered below the drop zone. */\n error?: string;\n}\n\nexport const FileDrop = forwardRef<HTMLDivElement, FileUploadProps>(function FileDrop(props, ref) {\n const {\n preview,\n previewCols = 3,\n galleryItemSize = 100,\n onDrop: onDropProp,\n label = \"\",\n className,\n previewClassName,\n disabled,\n error,\n ...dropzoneOptions\n } = props;\n\n const [files, setFiles] = React.useState<File[]>([]);\n\n const onDrop = (acceptedFiles: File[]) => {\n setFiles((prev) => [...prev, ...acceptedFiles]);\n onDropProp(acceptedFiles);\n };\n\n const { getRootProps, getInputProps } = useDropzone({\n onDrop,\n disabled,\n ...dropzoneOptions,\n });\n\n const handleRemoveAll = () => {\n setFiles([]);\n };\n\n const wrapperClasses = cn(\"smwb-file-drop\", { \"smwb-disabled\": disabled, \"smwb-error\": !!error }, className);\n\n return (\n <div ref={ref} className={wrapperClasses} data-testid=\"file-drop\">\n {files.length > 0 ? (\n <PreviewWrapper\n preview={preview}\n files={files}\n handleRemoveAll={handleRemoveAll}\n previewCols={previewCols}\n galleryItemSize={galleryItemSize}\n previewClassName={previewClassName}\n />\n ) : (\n <div\n className=\"smwb-file-drop__input\"\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-label={label || \"Upload files\"}\n {...getRootProps()}\n >\n <div className=\"smwb-file-drop__input-text\">{label}</div>\n <input {...getInputProps()} />\n </div>\n )}\n {error ? (\n <span className=\"smwb-file-drop__error\" role=\"alert\">\n {error}\n </span>\n ) : null}\n </div>\n );\n});\n\nexport default FileDrop;\n","import React, { forwardRef } from \"react\";\nimport { type DropzoneOptions, useDropzone } from \"../../../hooks/useDropzone\";\nimport cn from \"clsx\";\n\nexport interface FileInputProps extends DropzoneOptions {\n label?: string;\n className?: string;\n buttonClassName?: string;\n disabled?: boolean;\n /** Validation message shown below the control. */\n error?: string;\n /** Fired with the accepted files when the user picks them. */\n onFilesSelected?: (files: File[]) => void;\n /** @deprecated optional click passthrough on the trigger button. */\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport const FileInput = forwardRef<HTMLDivElement, FileInputProps>(function FileInput(props, ref) {\n const { label, onClick, onFilesSelected, className, buttonClassName, disabled, error, ...dropzoneOptions } = props;\n\n const { getRootProps, getInputProps } = useDropzone({\n ...dropzoneOptions,\n disabled,\n onDropAccepted: (accepted, event) => {\n onFilesSelected?.(accepted);\n dropzoneOptions.onDropAccepted?.(accepted, event);\n },\n });\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n };\n\n return (\n <div\n ref={ref}\n className={cn(\"smwb-file-input\", { \"smwb-disabled\": disabled }, className)}\n data-testid=\"file-input\"\n {...getRootProps()}\n >\n <button type=\"button\" className={cn(buttonClassName)} disabled={disabled} onClick={handleClick}>\n {label}\n </button>\n <input {...getInputProps()} />\n {error ? (\n <span className=\"smwb-file-input__error\" role=\"alert\">\n {error}\n </span>\n ) : null}\n </div>\n );\n});\n\nexport default FileInput;\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useHelperText } from \"../../../hooks/useHelperText\";\nimport { useId } from \"../../../hooks/useId\";\nimport { cancelToggle, forgetCancelledToggle } from \"../../../utils/readOnlyToggle\";\nimport type { SelectionControlColor, SelectionControlSize } from \"../checkbox/checkbox\";\n\nexport interface RadioButtonProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n label?: string;\n disabled?: boolean;\n /**\n * Keeps the radio as it is: clicks on it or its label, Space and the arrow keys of its group do not check it, and\n * `onChange` is not called. It stays focusable.\n *\n * The input does not tell assistive technology it is read-only: ARIA has no read-only state for a single radio,\n * only for its group. Put `role=\"radiogroup\"`, a name and `aria-readonly=\"true\"` on the element around the radios.\n */\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 /** Test id of the `<input>`; `radio` unless given. */\n \"data-testid\"?: string;\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 \"data-testid\": dataTestId = \"radio\",\n helperText,\n error,\n onChange,\n className,\n \"aria-describedby\": ariaDescribedBy,\n ...args\n } = props;\n const id = useId(idProp);\n const helper = useHelperText(helperText, { describedBy: ariaDescribedBy });\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) {\n forgetCancelledToggle(e, props.checked);\n return;\n }\n onChange?.(e, props.value !== undefined ? props.value : e.target.checked, props);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLInputElement>) => {\n props.onClick?.(e);\n if (readOnly) cancelToggle(e, props.checked);\n };\n\n return (\n <TextFieldWrapper\n helperText={helperText}\n helperTextId={helper.id}\n disabled={disabled}\n error={error}\n className=\"smwb-text-field-checkbox\"\n >\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 aria-describedby={helper.describedBy}\n className={cn(\"smwb-radio__input\", className)}\n type=\"radio\"\n data-testid={dataTestId}\n ref={ref}\n {...args}\n onChange={handleChange}\n onClick={handleClick}\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\";\nimport { hasHelperText, useHelperText } from \"../../../hooks/useHelperText\";\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 of the control: the slider, or the image of a read-only rating. */\n id?: string;\n /**\n * What is rated: the accessible name of the slider, \"Rating\" by default. A read-only rating is an image named by\n * its value (\"3 of 5\"), after this label.\n */\n \"aria-label\"?: string;\n /** Ids of more elements that describe the control, after its helper text. */\n \"aria-describedby\"?: 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 \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\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 const helper = useHelperText(helperText, { describedBy: ariaDescribedBy });\n const valueText = `${current} of ${max}`;\n // The slider is named by what is rated. An image has no value, so its name\n // carries the value too.\n const label = readOnly ? (ariaLabel ? `${ariaLabel} ${valueText}` : valueText) : ariaLabel || \"Rating\";\n\n // The control is a slider, or an image named by its value when the rating is\n // read-only. The helper text stays outside it: the children of a slider or an\n // image are presentational, so assistive technology would never read it.\n return (\n <span\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 >\n <span\n ref={ref}\n id={id}\n className=\"smwb-rating__control\"\n data-testid=\"rating\"\n role={readOnly ? \"img\" : \"slider\"}\n aria-label={label}\n aria-valuemin={readOnly ? undefined : 0}\n aria-valuemax={readOnly ? undefined : max}\n aria-valuenow={readOnly ? undefined : current}\n aria-valuetext={readOnly ? undefined : valueText}\n aria-disabled={!readOnly && disabled ? true : undefined}\n aria-describedby={helper.describedBy}\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 // Always clears the preview, so a rating that turns read-only while\n // hovered does not keep it.\n onMouseLeave={() => setHover(null)}\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 </span>\n {name ? <input type=\"hidden\" name={name} value={current} readOnly /> : null}\n {hasHelperText(helperText) ? (\n <span id={helper.id} className={cn(\"smwb-rating__helper\", error && \"smwb-rating__helper_error\")}>\n {helperText}\n </span>\n ) : null}\n </span>\n );\n});\n\nexport default Rating;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport cn from \"clsx\";\nimport { useVirtualList } from \"../../../hooks/useVirtualList\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { Menu, MenuDivider, MenuItemProps } from \"../../navigation/menu\";\nimport { TextFieldWrapper } from \"../textField\";\nimport ProgressIndicator from \"../../feedBack/progressIndicator/progressIndicator\";\nimport { Ripple, RippleActionsRef } from \"../../base/ripple/ripple\";\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 /** Id of the listbox; the options' ids follow from it (`dropdownOptionId`). */\n listboxId?: string;\n /** Ids of the elements that name the listbox and the search box in the menu. */\n labelledBy?: string;\n /** Names the listbox and the search box in the menu when no element does. */\n label?: string;\n /** Several options can be selected (`aria-multiselectable`). */\n multiple?: boolean;\n /** Index of the active option, counting `items` and then the create option; -1 for none. */\n activeIndex?: number;\n /** Marks the active option and keeps it in view: the keyboard moved to it. */\n showActive?: boolean;\n /** Attributes and handlers of the search box in the menu, which the field makes a combobox. */\n searchInputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n searchInputRef?: React.Ref<HTMLInputElement>;\n /** The menu's root element. */\n menuRef?: React.Ref<HTMLDivElement>;\n}\n\n/** Id of the option at `index` in the listbox `listboxId`. */\nexport function dropdownOptionId(listboxId: string, index: number): string {\n return `${listboxId}-option-${index}`;\n}\n\n// Scrolls each scrolling box from the element up to `root` so the element shows.\nfunction keepInView(element: HTMLElement, root: HTMLElement | null) {\n for (let box = element.parentElement; box; box = box.parentElement) {\n if (box.scrollHeight > box.clientHeight) {\n const outer = box.getBoundingClientRect();\n const inner = element.getBoundingClientRect();\n if (inner.top < outer.top) {\n box.scrollTop -= outer.top - inner.top;\n } else if (inner.bottom > outer.bottom) {\n box.scrollTop += inner.bottom - outer.bottom;\n }\n }\n if (box === root) {\n break;\n }\n }\n}\n\n// An option of the listbox. It takes no focus: the field keeps it and points at\n// the active option with aria-activedescendant.\nfunction DropdownOption(props: MenuItemProps) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { children, className, disabled, selected, value, onClick, optionRenderer, ...rest } = props;\n const rippleRef = useRef<RippleActionsRef>(null);\n\n return (\n <li\n {...rest}\n className={cn(\"smwb-menu__item\", className, {\n \"smwb-menu__item--disabled\": disabled,\n \"smwb-menu__item--selected\": selected,\n })}\n data-value={value}\n onClick={onClick}\n onPointerDown={(event) => rippleRef.current?.onRipple(event)}\n >\n <span className=\"smwb-menu__item-inner\">{children}</span>\n <Ripple actionRef={rippleRef} />\n </li>\n );\n}\n\n// The search box at the top of the menu: drawn as a TextField, with the input\n// in the field's hands (TextField puts ARIA attributes on its wrapper).\nfunction MenuSearchInput(props: {\n value?: string | number;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n inputRef?: React.Ref<HTMLInputElement>;\n}) {\n const { value, onChange, inputProps, inputRef } = props;\n const [isFocused, setIsFocused] = useState(false);\n const ownRef = useRef<HTMLInputElement>(null);\n const ref = useForkRef<HTMLInputElement>(inputRef, ownRef);\n\n return (\n <TextFieldWrapper\n className=\"smwb-select-field__menu-search-input\"\n variant=\"outlined\"\n fullWidth\n isFilledState={Boolean(value)}\n isFocused={isFocused}\n onHolderMouseDown={(event) => {\n if (ownRef.current && event.currentTarget === event.target) {\n event.preventDefault();\n ownRef.current.focus();\n }\n }}\n >\n <input\n {...inputProps}\n ref={ref}\n type=\"text\"\n className=\"smwb-text-field__input smwb-text-field__input--show-placeholder\"\n placeholder=\"Найти...\"\n autoComplete=\"off\"\n value={value}\n onChange={onChange}\n onFocus={(event) => {\n setIsFocused(true);\n inputProps?.onFocus?.(event);\n }}\n onBlur={(event) => {\n setIsFocused(false);\n inputProps?.onBlur?.(event);\n }}\n />\n </TextFieldWrapper>\n );\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,\n createOption,\n virtualized,\n itemHeight = 40,\n listboxId,\n labelledBy,\n label,\n multiple,\n activeIndex = -1,\n showActive,\n searchInputProps,\n searchInputRef,\n menuRef,\n}: DropdownItemProps<T>) {\n const valueArray = Array.isArray(value) ? value : [value];\n const hasGroups = items.some((i) => !!i.group);\n const optionCount = items.length + (createOption ? 1 : 0);\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 const menuElementRef = useRef<HTMLDivElement>(null);\n const forkedMenuRef = useForkRef<HTMLDivElement>(menuRef, menuElementRef);\n const scrollerRef = useRef<HTMLDivElement>(null);\n\n // Props of the option at `index`, as an optionRenderer gets them too: its\n // element needs the id, role and ARIA state for the field to point at it.\n const optionProps = (\n index: number,\n selected: boolean,\n disabled: boolean | undefined,\n extra: MenuItemProps\n ): MenuItemProps => ({\n id: listboxId ? dropdownOptionId(listboxId, index) : undefined,\n role: \"option\",\n \"aria-selected\": selected,\n \"aria-disabled\": disabled || undefined,\n // With a virtual list only a window of the options exists.\n \"aria-setsize\": useVirtual ? optionCount : undefined,\n \"aria-posinset\": useVirtual ? index + 1 : undefined,\n // The virtual list places its rows at itemHeight: a row takes that height.\n style: useVirtual && index < items.length ? { height: itemHeight } : undefined,\n disabled,\n selected,\n ...extra,\n className: cn(\n \"smwb-select-field__option\",\n extra.className,\n showActive && index === activeIndex && \"smwb-select-field__option--active\"\n ),\n });\n\n const renderItem = (el: DropdownItem, index: number) => {\n const props = optionProps(\n index,\n valueArray.some((v) => v === el.value),\n el.disabled,\n {\n value: el.value,\n onClick: (e: React.SyntheticEvent) => {\n if (!el.disabled) {\n onItemClick(e, el);\n }\n },\n optionRenderer,\n children: (\n <>\n {el.text}\n {el.helperText ? <span className=\"smwb-select-field__option__helper-text\">{el.helperText}</span> : null}\n </>\n ),\n }\n );\n const key = el.key ?? el.value ?? index;\n\n return optionRenderer ? (\n <React.Fragment key={key}>{optionRenderer(props)}</React.Fragment>\n ) : (\n <DropdownOption key={key} {...props} />\n );\n };\n\n // Consecutive items of one group sit in a `group` named by its header. Items\n // without a group before the first one stay loose; after a group, they get an\n // empty header, as they always did.\n const renderGroups = () => {\n const nodes: React.ReactNode[] = [];\n let lastGroup: string | undefined;\n let run: { group?: string; start: number; options: React.ReactNode[] } | undefined;\n const flush = () => {\n if (!run) {\n return;\n }\n if (run.group === undefined) {\n if (run.start > 0) {\n nodes.push(<li key={`group-${run.start}`} className=\"smwb-select-field__group-label\" role=\"presentation\" />);\n }\n nodes.push(...run.options);\n } else {\n const labelId = `${listboxId}-group-${run.start}`;\n nodes.push(\n <li key={`group-${run.start}`} role=\"group\" aria-labelledby={labelId} className=\"smwb-select-field__group\">\n <div id={labelId} className=\"smwb-select-field__group-label\">\n {run.group}\n </div>\n <ul role=\"presentation\" className=\"smwb-select-field__group-options\">\n {run.options}\n </ul>\n </li>\n );\n }\n };\n items.forEach((el, index) => {\n if (!run || el.group !== lastGroup) {\n flush();\n lastGroup = el.group;\n run = { group: el.group, start: index, options: [] };\n }\n run.options.push(renderItem(el, index));\n });\n flush();\n return nodes;\n };\n\n const [menuMinWidth, setMenuMinWidth] = React.useState<number>();\n // The menu is portalled: its target is resolved in the browser only. A server\n // render (no document) and the first client render emit nothing here, so the\n // select renders and hydrates on a server-rendered page.\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n useSafeLayoutEffect(() => {\n setDomRoot(container ?? document.body);\n }, [container]);\n\n useEffect(() => {\n if (isOpen && anchorElementRef.current) {\n setMenuMinWidth(anchorElementRef.current.clientWidth);\n }\n }, [anchorElementRef, isOpen]);\n\n // An Escape the field did not take (the focus is elsewhere) still closes the menu.\n React.useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (isOpen && event.key === \"Escape\" && !event.defaultPrevented) {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOpen, onClose]);\n\n // The keyboard's active option stays in view. In a virtual list it may not\n // exist yet: scroll the window to it first.\n useSafeLayoutEffect(() => {\n if (!isOpen || !showActive || activeIndex < 0 || !listboxId) {\n return;\n }\n const scroller = scrollerRef.current;\n if (useVirtual && scroller && activeIndex < items.length) {\n const top = activeIndex * itemHeight;\n const height = scroller.clientHeight || viewportHeight;\n const scrollTop =\n top < scroller.scrollTop\n ? top\n : top + itemHeight > scroller.scrollTop + height\n ? top + itemHeight - height\n : scroller.scrollTop;\n if (scrollTop !== scroller.scrollTop) {\n scroller.scrollTop = scrollTop;\n onScroll({ currentTarget: { scrollTop } });\n }\n }\n const option = document.getElementById(dropdownOptionId(listboxId, activeIndex));\n if (option) {\n keepInView(option, menuElementRef.current);\n }\n }, [isOpen, showActive, activeIndex, listboxId, useVirtual, items.length, itemHeight, viewportHeight, onScroll]);\n\n if (!domRoot) {\n return null;\n }\n\n const createNode = createOption ? (\n <DropdownOption\n key=\"__create__\"\n {...optionProps(items.length, false, false, {\n value: \"__create__\",\n className: \"smwb-select-field__create-option\",\n onClick: (e: React.SyntheticEvent) => createOption.onCreate(e),\n children: createOption.text,\n })}\n />\n ) : null;\n\n return createPortal(\n <Menu\n ref={forkedMenuRef}\n isOpen={isOpen}\n onClose={onClose}\n anchorElement={anchorElementRef.current}\n middleware={menuMiddleware}\n data-smwb-overlay-layer=\"\"\n // The menu is a surface: the options are a listbox of their own inside,\n // with the search box and the messages beside it.\n listRole=\"presentation\"\n // A menu that scrolls, with nothing in it that takes the focus, would be a\n // tab stop of its own (browsers make such scrollers one): Tab from the field\n // would land in the closing menu and drop to the page.\n tabIndex={-1}\n // The field keeps the focus while the menu is used with the pointer; only\n // the search box in the menu takes it.\n onMouseDown={(event) => {\n if (!(event.target instanceof HTMLInputElement)) {\n event.preventDefault();\n }\n }}\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 <MenuSearchInput\n value={searchValue}\n onChange={(e) => onSearchInputChange?.(e, e.target.value)}\n inputProps={searchInputProps}\n inputRef={searchInputRef}\n />\n </li>\n <MenuDivider />\n </>\n )}\n {isLoading ? (\n <li className=\"smwb-select-field__menu-loading\">\n <ProgressIndicator type=\"indeterminate\" variant=\"circular\" className=\"smwb-select-field__menu__loader\" />\n </li>\n ) : null}\n <li>\n <ul\n id={listboxId}\n role=\"listbox\"\n className=\"smwb-select-field__listbox\"\n aria-labelledby={labelledBy}\n aria-label={label}\n aria-multiselectable={multiple || undefined}\n aria-busy={isLoading || undefined}\n >\n {isLoading ? null : useVirtual ? (\n <li role=\"presentation\" className=\"smwb-select-field__virtual-viewport\">\n <div\n ref={scrollerRef}\n className=\"smwb-select-field__virtual-scroller\"\n tabIndex={-1}\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, i) => renderItem(el, startIndex + i))}\n </ul>\n </div>\n </div>\n </li>\n ) : hasGroups ? (\n renderGroups()\n ) : (\n items.map((el, index) => renderItem(el, index))\n )}\n {createNode}\n </ul>\n </li>\n {!isLoading && !items.length && !createOption ? (\n <li className=\"smwb-select-field__empty-items\">{menuNoItemsMessage || \"Опций не найдено.\"}</li>\n ) : null}\n </Menu>,\n domRoot\n );\n}\n","// Moves of the active option over a select's options, by index in the order\n// they are drawn. A disabled option is passed over, as in a native select.\n\nexport type IsOptionEnabled = (index: number) => boolean;\n\n/** The first enabled option, or -1. */\nexport function firstOption(count: number, isEnabled: IsOptionEnabled): number {\n for (let index = 0; index < count; index++) {\n if (isEnabled(index)) {\n return index;\n }\n }\n return -1;\n}\n\n/** The last enabled option, or -1. */\nexport function lastOption(count: number, isEnabled: IsOptionEnabled): number {\n for (let index = count - 1; index >= 0; index--) {\n if (isEnabled(index)) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The enabled option `steps` options after `from` (before it for a negative\n * count), stopping at the first or the last one. With no active option, a move\n * down starts at the first option and a move up at the last.\n */\nexport function moveOption(count: number, isEnabled: IsOptionEnabled, from: number, steps: number): number {\n if (from < 0) {\n return steps > 0 ? firstOption(count, isEnabled) : lastOption(count, isEnabled);\n }\n const direction = steps > 0 ? 1 : -1;\n let result = from;\n let left = Math.abs(steps);\n for (let index = from + direction; index >= 0 && index < count && left > 0; index += direction) {\n if (isEnabled(index)) {\n result = index;\n left--;\n }\n }\n return result;\n}\n\n/**\n * Type-ahead: the next enabled option whose text starts with what was typed.\n * One character typed again and again (\"ttt\") steps through the options that\n * start with it; a longer string keeps the current option while it matches.\n */\nexport function matchOption(texts: string[], isEnabled: IsOptionEnabled, typed: string, from: number): number {\n const query = typed.toLowerCase();\n const repeated = Array.from(query).every((char) => char === query.charAt(0));\n const prefix = repeated ? query.charAt(0) : query;\n const start = repeated ? from + 1 : Math.max(from, 0);\n for (let step = 0; step < texts.length; step++) {\n const index = (start + step) % texts.length;\n if (isEnabled(index) && texts[index]?.toLowerCase().startsWith(prefix)) {\n return index;\n }\n }\n return -1;\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 { useId } from \"../../../hooks/useId\";\nimport { DropdownMenu, DropdownItem, DropdownItemProps, dropdownOptionId } from \"./dropdownMenu\";\nimport { firstOption, lastOption, matchOption, moveOption } from \"./optionNavigation\";\nimport Chip from \"../../dataDisplay/chip/chip\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useHelperText } from \"../../../hooks/useHelperText\";\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\n// The items a value selects, in the order of `items`.\nfunction findSelectedItems(items: DropdownItem[], value: SelectFieldProps[\"value\"]): DropdownItem[] {\n if (Array.isArray(value)) {\n return items.filter((item) => value.includes(item.value));\n }\n if (value == null || value === \"\") {\n return [];\n }\n const item = items.find((item) => item.value === value);\n return item ? [item] : [];\n}\n\n// The items whose text holds the search text, in any case. The text is taken\n// literally: \"C++\" or \"(\" searches for those characters.\nfunction filterItems(items: DropdownItem[], searchText: string): DropdownItem[] {\n if (!searchText) {\n return items;\n }\n const pattern = new RegExp(searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), \"i\");\n return items.filter((el) => el.text.search(pattern) !== -1);\n}\n\n// A key that types a character: type-ahead in the options.\nfunction isPrintableKey(event: React.KeyboardEvent) {\n return event.key.length === 1 && event.key !== \" \" && !event.altKey && !event.ctrlKey && !event.metaKey;\n}\n\n// Keys come to the combobox: the control, the search box in the field, or the\n// search box in the menu. The two search boxes keep the keys that edit text.\ntype ComboboxKind = \"control\" | \"search\" | \"menuSearch\";\n\nexport type OnSelectChange = (e: SyntheticEvent, data: SelectFieldProps) => void;\n\nexport interface SelectFieldProps {\n className?: string;\n /**\n * The selected value, or the values of a `multiple` field. Any value but\n * `undefined` makes the field controlled: it shows this value and nothing\n * else, and a pick, a chip delete or a clear only asks for a change through\n * `onChange`. `null` means nothing is selected. While `value` is `undefined`,\n * the field keeps its own value, starting from `defaultValue`.\n */\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 /**\n * A search box for the options: `true` puts it in the field, where it takes\n * the focus and is the combobox; `\"menu\"` puts it at the top of the menu,\n * which moves the focus into it when it opens.\n */\n search?: true | false | \"menu\";\n chips?: boolean;\n isFocused?: boolean;\n error?: boolean;\n items: DropdownItem[];\n /**\n * Visible label, drawn above the field (an `inline` field draws none). It\n * names the combobox, whose value is the selected text: \"Country\", \"Russia\".\n * With `chips` the chips' texts follow it in the name: \"Labels Backend Docs\".\n */\n label?: string;\n variant?: \"outlined\" | \"filled\";\n /** Height of the field, as for TextField: `small` (40px, for toolbars), `medium` (default) or `large`. */\n size?: \"small\" | \"medium\" | \"large\";\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 /**\n * Draws an option in place of the default one. It gets the option's props\n * and returns its `<li>`: pass `id`, `role`, `aria-selected`, `aria-disabled`,\n * `className` and `onClick` on to it, so the option can be reached from the\n * keyboard, read out and picked.\n */\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 /**\n * Accessible name of the combobox. Replaces the name the visible `label`\n * gives it; a field without a drawn label needs it.\n */\n \"aria-label\"?: string;\n /**\n * Id of the control, the part of the field that holds the selected text. It is\n * the combobox, unless `search` puts a search box in it: then the box is.\n */\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 size = \"medium\",\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 helper = useHelperText(helperText, { inline });\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [valueState, setValueState] = useState<typeof valueProp>(defaultValue);\n // Seeded from `defaultValue`, like `valueState`, so an uncontrolled field\n // shows its selection (and floats the label) before any interaction.\n const [ownSelectedItems, setOwnSelectedItems] = useState<typeof items>(() => findSelectedItems(items, defaultValue));\n const [searchValue, setSearchValue] = useState(\"\");\n // The option the keyboard is on (aria-activedescendant), by index in the\n // options drawn; it shows once a key moves it, not on a pointer's open.\n const [activeIndex, setActiveIndex] = useState(-1);\n const [showActive, setShowActive] = useState(false);\n const typeaheadRef = useRef<{ text: string; timer?: ReturnType<typeof setTimeout> }>({ text: \"\" });\n // Controlled while the parent passes a `value` other than `undefined` (`null`\n // is \"nothing selected\"), checked on every render as in `useControllableState`.\n const isControlled = valueProp !== undefined;\n const anchorElementRef = useRef<HTMLSpanElement>(null);\n const controlRef = useRef<HTMLSpanElement>(null);\n const forkedControlRef = useForkRef<HTMLSpanElement>(ref, controlRef);\n const searchWrapperRef = useRef<HTMLSpanElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuSearchInputRef = useRef<HTMLInputElement>(null);\n const value = isControlled ? valueProp : valueState;\n // A controlled field shows the items of its `value` and nothing else, in the\n // same render as the value. A pick, a chip delete or a clear only asks the\n // parent through `onChange`: it shows once the parent passes the new value\n // back, and never when the parent keeps the old one. An uncontrolled field\n // shows the items its handlers and the effect below set.\n const selectedItems = useMemo(\n () => (isControlled ? findSelectedItems(items, value) : ownSelectedItems),\n [isControlled, items, value, ownSelectedItems]\n );\n\n const isFocused = useMemo(() => isFocusedProp || isOpen, [isFocusedProp, isOpen]);\n\n // The combobox is named by the label, and its value is the selected text it\n // holds. Chips sit beside the control with their delete buttons, so their\n // labels follow the label in the name (\"Labels Backend Docs\"). With neither a\n // drawn label nor chips, the selected text names it, as before it was a\n // combobox. A caller's aria-label replaces all of these: on one element\n // aria-labelledby would win over it.\n const baseId = useId();\n const labelId = `${baseId}-label`;\n const valueId = `${baseId}-value`;\n const listboxId = `${baseId}-listbox`;\n const valueIds = chips ? selectedItems.map((_, index) => `${valueId}-${index}`) : [valueId];\n const chipIds = chips ? valueIds : [];\n const controlLabelledBy = ariaLabel\n ? undefined\n : label && !inline\n ? [labelId, ...chipIds].join(\" \")\n : chipIds.length > 0\n ? chipIds.join(\" \")\n : !chips && selectedItems.length > 0\n ? valueId\n : undefined;\n // A search box in the field is a combobox whose value is the typed text, so\n // the selected text follows the label in its name.\n const labelledBy = ariaLabel\n ? undefined\n : label && !inline\n ? [labelId, ...valueIds].join(\" \")\n : chips && valueIds.length > 0\n ? valueIds.join(\" \")\n : undefined;\n\n // The search input takes the keyboard focus, so it is the field's only tab\n // stop. A focusable span before it would take Shift+Tab from the input and\n // hand the focus straight back to the input.\n const hasSearchInput = search === true && !readOnly;\n\n // The options as drawn: the items the search text keeps (all of them when\n // the caller searches itself), then the create option.\n const displayedItems = onSearch ? items : filterItems(items, searchValue);\n const 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 closeMenu();\n },\n }\n : undefined;\n const createIndex = createOption ? displayedItems.length : -1;\n const optionCount = displayedItems.length + (createOption ? 1 : 0);\n // A loading menu shows no items, only the create option.\n const isOptionEnabled = (index: number) =>\n index >= 0 &&\n (index === createIndex || (!isLoading && index < displayedItems.length && !displayedItems[index].disabled));\n const currentActive = isOpen && isOptionEnabled(activeIndex) ? activeIndex : -1;\n const activeDescendant = showActive && currentActive >= 0 ? dropdownOptionId(listboxId, currentActive) : undefined;\n\n const isItemSelected = (item: DropdownItem) =>\n Array.isArray(value) ? value.includes(item.value) : value != null && value !== \"\" && value === item.value;\n\n // The keyboard starts on the selected option (the first one of several), or\n // on the first option.\n const initialActive = () => {\n const selected = displayedItems.findIndex(isItemSelected);\n return isOptionEnabled(selected) ? selected : firstOption(optionCount, isOptionEnabled);\n };\n\n // A pointer's open marks no option: the keyboard's active option starts on\n // the selected one, unshown, or with nothing selected on none, so the first\n // ArrowDown reaches the first option.\n const pointerActive = () => {\n const selected = displayedItems.findIndex(isItemSelected);\n return isOptionEnabled(selected) ? selected : -1;\n };\n\n const openMenu = (active: number, byKeyboard: boolean) => {\n setActiveIndex(active);\n setShowActive(byKeyboard);\n setIsOpen(true);\n };\n\n // A menu that had the focus (its search box) hands it back to the control;\n // one closed by a press elsewhere leaves the focus where the press put it.\n const closeMenu = () => {\n if (menuRef.current?.contains(menuRef.current.ownerDocument.activeElement)) {\n controlRef.current?.focus();\n }\n setIsOpen(false);\n setActiveIndex(-1);\n setShowActive(false);\n };\n\n const onMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n // Только для левой клавиши мышки.\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n controlRef.current?.focus();\n if (isOpen) {\n closeMenu();\n } else {\n openMenu(pointerActive(), false);\n }\n };\n\n const onFocus = (event: React.FocusEvent<HTMLSpanElement>) => {\n // React's onFocus bubbles: only the span's own focus (a press on it, a\n // closed menu) moves on to the input, not the focus of a chip's button.\n if (hasSearchInput && event.target === event.currentTarget) {\n searchInputRef.current?.focus();\n }\n };\n\n // The field's own items and value change only while it is uncontrolled, as\n // in `useControllableState`: a parent that stops passing `value` gets back\n // the field's `defaultValue`, or the picks made before it passed one.\n const setSelectedItems = (next: typeof items) => {\n if (!isControlled) {\n setOwnSelectedItems(next);\n }\n };\n\n const updateValue = (event: React.SyntheticEvent, value: typeof valueProp) => {\n onChange?.(event, { ...props, value, name: name || undefined });\n if (!isControlled) {\n setValueState(value);\n }\n };\n\n // Picks an item: `multiple` toggles it; a single select takes it, and a click\n // on the selected item clears the value (`toggleOff`), where a key keeps it.\n const chooseItem = (event: React.SyntheticEvent, item: DropdownItem, toggleOff: boolean) => {\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 if (value === item.value && !toggleOff) {\n return;\n }\n newValue = value === item.value ? \"\" : item.value;\n newSelectedItem = [item];\n }\n\n if (searchValue) {\n setSearchValue(\"\");\n }\n\n setSelectedItems(newSelectedItem);\n updateValue(event, newValue);\n };\n\n const onItemClick = (event: React.SyntheticEvent, item: DropdownItem) => {\n chooseItem(event, item, true);\n\n if (multiple) {\n // The search text goes with the pick, so the item's place is in all items.\n setActiveIndex(items.indexOf(item));\n } else {\n closeMenu();\n controlRef.current?.focus();\n }\n };\n\n // Enter, Space, Tab or Alt+ArrowUp on the active option, once it shows: an\n // option a key has not marked yet (after a pointer's open) is not picked.\n const chooseActive = (event: React.SyntheticEvent) => {\n if (!showActive) {\n return;\n }\n if (currentActive === createIndex) {\n createOption?.onCreate(event);\n } else if (currentActive >= 0) {\n chooseItem(event, displayedItems[currentActive], false);\n if (multiple) {\n setActiveIndex(searchValue ? items.indexOf(displayedItems[currentActive]) : currentActive);\n } else {\n closeMenu();\n }\n }\n };\n\n const moveActive = (event: React.KeyboardEvent, index: number) => {\n event.preventDefault();\n if (index >= 0) {\n setActiveIndex(index);\n }\n setShowActive(true);\n };\n\n // Type-ahead: letters typed in quick succession make a prefix to look for.\n const typeahead = (key: string) => {\n const state = typeaheadRef.current;\n clearTimeout(state.timer);\n state.text += key;\n state.timer = setTimeout(() => {\n state.text = \"\";\n }, 500);\n const texts = displayedItems.map((item) => item.text);\n return matchOption(texts, isOptionEnabled, state.text, currentActive);\n };\n\n useEffect(() => {\n const state = typeaheadRef.current;\n return () => clearTimeout(state.timer);\n }, []);\n\n // The combobox's keys (WAI-ARIA combobox pattern): arrows, Home, End and the\n // page keys move the active option and open a closed menu; Enter and Space\n // pick it; Tab picks it in a single select and moves on; Escape closes.\n // The search boxes leave Space, Home, End and typing to the text.\n const onComboboxKeyDown = (event: React.KeyboardEvent<HTMLElement>, kind: ComboboxKind) => {\n const { key } = event;\n if (disabled || readOnly || event.ctrlKey || event.metaKey) {\n return;\n }\n const isControl = kind === \"control\";\n\n if (!isOpen) {\n if (key === \"ArrowDown\" || key === \"ArrowUp\" || key === \"Enter\" || (isControl && key === \" \")) {\n event.preventDefault();\n openMenu(initialActive(), true);\n } else if (isControl && (key === \"Home\" || key === \"End\")) {\n event.preventDefault();\n openMenu(\n key === \"Home\" ? firstOption(optionCount, isOptionEnabled) : lastOption(optionCount, isOptionEnabled),\n true\n );\n } else if (isControl && !search && isPrintableKey(event)) {\n event.preventDefault();\n const match = typeahead(key);\n openMenu(match >= 0 ? match : initialActive(), true);\n }\n return;\n }\n\n if (key === \"ArrowDown\") {\n moveActive(event, event.altKey ? currentActive : moveOption(optionCount, isOptionEnabled, currentActive, 1));\n } else if (key === \"ArrowUp\" && event.altKey) {\n event.preventDefault();\n if (!multiple) {\n chooseActive(event);\n }\n closeMenu();\n } else if (key === \"ArrowUp\") {\n moveActive(event, moveOption(optionCount, isOptionEnabled, currentActive, -1));\n } else if (key === \"PageDown\" || key === \"PageUp\") {\n moveActive(event, moveOption(optionCount, isOptionEnabled, currentActive, key === \"PageDown\" ? 10 : -10));\n } else if (isControl && (key === \"Home\" || key === \"End\")) {\n moveActive(\n event,\n key === \"Home\" ? firstOption(optionCount, isOptionEnabled) : lastOption(optionCount, isOptionEnabled)\n );\n } else if (key === \"Enter\" || (isControl && key === \" \")) {\n event.preventDefault();\n // After a pointer's open the first press shows the active option, the\n // next one picks it.\n chooseActive(event);\n setShowActive(true);\n if (!multiple && currentActive < 0 && isControl) {\n closeMenu();\n }\n } else if (key === \"Escape\") {\n // Handled: the overlays around the field leave this press alone.\n event.preventDefault();\n closeMenu();\n } else if (key === \"Tab\") {\n if (kind === \"menuSearch\") {\n // The search box in the menu goes with it: the focus goes back to the\n // control, which Tab then leaves as usual.\n event.preventDefault();\n } else if (isControl && !multiple) {\n chooseActive(event);\n }\n closeMenu();\n } else if (isControl && !search && isPrintableKey(event)) {\n const match = typeahead(key);\n moveActive(event, match);\n }\n };\n\n // Keys pressed on a button inside (a chip's delete button) bubble up here\n // too. Only the control's own keys work the menu: preventing the default\n // of theirs would cancel the button's activation.\n const onKeyDown = (event: React.KeyboardEvent<HTMLSpanElement>) => {\n if (event.target !== event.currentTarget || hasSearchInput) {\n return;\n }\n onComboboxKeyDown(event, \"control\");\n };\n\n // A read-only field opens no menu: one that was open when the field became\n // read-only closes, so none of its options can be picked.\n useEffect(() => {\n if (readOnly && isOpen) {\n setIsOpen(false);\n }\n }, [readOnly, isOpen]);\n\n useEffect(() => {\n if (!isFocused || (search === \"menu\" && !isOpen)) {\n setSearchValue(\"\");\n resetSearch?.();\n }\n }, [isFocused, search, isOpen, resetSearch]);\n\n // A disabled field has no menu: one that was open when the field got\n // disabled closes, so none of its options can be picked.\n useEffect(() => {\n if (disabled && isOpen) {\n setIsOpen(false);\n }\n }, [disabled, isOpen]);\n\n // The search box in the menu takes the focus when the menu opens.\n useSafeLayoutEffect(() => {\n if (isOpen && search === \"menu\") {\n menuSearchInputRef.current?.focus();\n }\n }, [isOpen, search]);\n\n // Keep the displayed selection in sync with the effective value (controlled\n // fields derive theirs above), so the label floats whenever there is a\n // value — including the initial default, without focus.\n useEffect(() => {\n if (!isControlled) {\n setOwnSelectedItems(findSelectedItems(items, value));\n }\n }, [isControlled, value, items]);\n\n useSafeLayoutEffect(() => {\n if (searchWrapperRef.current) {\n searchWrapperRef.current.scrollLeft = searchWrapperRef.current.scrollWidth;\n }\n }, [value]);\n\n const onSearchInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const text = event.target.value;\n setSearchValue(text);\n onSearch?.(event);\n // The keyboard moves on to the first option the text keeps, so Enter picks\n // it; items the caller searches for itself are not here yet.\n const kept = filterItems(items, text);\n const canCreate = creatable && text && !items.some((i) => i.text.toLowerCase() === text.toLowerCase());\n const count = onSearch ? 0 : kept.length + (canCreate ? 1 : 0);\n setActiveIndex(firstOption(count, (index) => index >= kept.length || !kept[index].disabled));\n setShowActive(true);\n if (!isOpen) {\n setIsOpen(true);\n }\n };\n\n // A delete or clear button goes away with what it removes. When it had the\n // focus (a key press: a click leaves the focus where it was), the control\n // takes the focus over, so it does not drop to the page.\n const hasFocus = (event: React.SyntheticEvent) =>\n event.currentTarget.contains(event.currentTarget.ownerDocument.activeElement);\n\n const onDeleteChip = (currentValue: typeof valueProp) => (event: React.SyntheticEvent) => {\n if (Array.isArray(value)) {\n const refocus = hasFocus(event);\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 if (refocus) controlRef.current?.focus();\n }\n };\n\n const onResetSelected = (event: React.MouseEvent) => {\n const refocus = hasFocus(event);\n updateValue(event, []);\n setSelectedItems([]);\n if (refocus) controlRef.current?.focus();\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 }, index) => (\n <Chip\n key={key || value}\n label={text}\n labelId={valueIds[index]}\n deleteAriaLabel={`Remove ${text}`}\n size={size === \"small\" ? \"small\" : \"medium\"}\n // A read-only field shows its chips without delete buttons.\n onDelete={readOnly ? undefined : onDeleteChip(value)}\n onDeleteMouseDown={stopEvent}\n disabled={disabled}\n />\n ));\n } else {\n displayValues = selectedItems.map((el) => el.text).join(\", \");\n }\n\n // Neither a disabled nor a read-only field offers to clear its value.\n const canClear =\n ((Array.isArray(value) && value.length > 0) || (clearable && selectedItems.length > 0)) && !disabled && !readOnly;\n\n // What makes an element the combobox; the search box in the field takes it\n // from the control.\n const comboboxProps = {\n role: \"combobox\",\n \"aria-haspopup\": \"listbox\" as const,\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? listboxId : undefined,\n };\n\n return (\n <>\n <TextFieldWrapper\n labelId={labelId}\n label={label}\n helperText={helperText}\n helperTextId={helper.id}\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={!!selectedItems.length || !!searchValue}\n isFocused={isFocused}\n inline={inline}\n {...rest}\n >\n {/* The field: a press anywhere in it opens the menu, which lines up\n under it. The control, the part that is the combobox, sits inside,\n with the chips and the clear button beside it: nested in it, they\n would be read into its name. */}\n <span ref={anchorElementRef} className={classes} onMouseDown={disabled || readOnly ? undefined : onMouseDown}>\n <span className=\"smwb-select-field__search-wrapper\" ref={searchWrapperRef}>\n {chips && <span className=\"smwb-select-field__values\">{displayValues}</span>}\n <span\n ref={forkedControlRef}\n id={id}\n className=\"smwb-select-field__control\"\n tabIndex={disabled ? undefined : hasSearchInput ? -1 : 0}\n {...(hasSearchInput\n ? undefined\n : {\n ...comboboxProps,\n \"aria-labelledby\": controlLabelledBy,\n \"aria-label\": ariaLabel,\n \"aria-activedescendant\": search === \"menu\" ? undefined : activeDescendant,\n \"aria-disabled\": disabled || undefined,\n \"aria-readonly\": readOnly || undefined,\n \"aria-describedby\": helper.describedBy,\n })}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n data-testid=\"select-field\"\n >\n {!chips && displayValues && (\n <span id={valueId} className=\"smwb-select-field__values\">\n {displayValues}\n </span>\n )}\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 disabled={disabled}\n value={searchValue}\n {...comboboxProps}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeDescendant}\n autoComplete=\"off\"\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-describedby={helper.describedBy}\n onChange={onSearchInputChange}\n onMouseDown={(event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation();\n if (!isOpen) {\n openMenu(pointerActive(), false);\n }\n }}\n onKeyDown={(event) => {\n onComboboxKeyDown(event, \"search\");\n // Typed keys must not reach the span. Escape goes on: the\n // overlays around the field listen for it on the document,\n // and React's stopPropagation would stop it before the document.\n if (event.key !== \"Escape\") {\n event.stopPropagation();\n }\n }}\n data-testid=\"search-input\"\n />\n </span>\n )}\n </span>\n </span>\n <span className=\"smwb-select-field__actions\">\n {canClear && (\n <button\n type=\"button\"\n className=\"smwb-select-field__clear\"\n aria-label=\"Clear selection\"\n onClick={onResetSelected}\n onMouseDown={stopEvent}\n >\n <ClearIcon className={cn(\"smwb-select-field__icon\", \"smwb-select-field__icon--close\")} />\n </button>\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 menuRef={menuRef}\n menuMaxHeight={menuMaxHeight}\n menuMiddleware={menuMiddleware}\n search={search === \"menu\"}\n onSearchInputChange={onSearchInputChange}\n searchInputRef={menuSearchInputRef}\n searchInputProps={{\n ...comboboxProps,\n \"aria-autocomplete\": \"list\",\n \"aria-activedescendant\": activeDescendant,\n \"aria-labelledby\": controlLabelledBy,\n \"aria-label\": ariaLabel,\n onKeyDown: (event) => onComboboxKeyDown(event, \"menuSearch\"),\n }}\n optionRenderer={optionRenderer}\n items={displayedItems}\n searchValue={searchValue}\n isOpen={isOpen}\n onClose={closeMenu}\n onItemClick={onItemClick}\n value={value}\n isLoading={isLoading}\n menuNoItemsMessage={menuNoItemsMessage}\n container={menuContainer}\n virtualized={virtualized}\n itemHeight={itemHeight}\n createOption={createOption}\n listboxId={listboxId}\n labelledBy={ariaLabel ? undefined : label && !inline ? labelId : controlLabelledBy}\n label={ariaLabel}\n multiple={multiple}\n activeIndex={currentActive}\n showActive={showActive}\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 { useId } from \"../../../hooks/useId\";\nimport { rescale, toPercent, coordX, coordY, decimatedClamp } from \"./utils\";\nimport { TextField, TextFieldWrapper } from \"../textField\";\nimport { useHelperText } from \"../../../hooks/useHelperText\";\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 /**\n * Draws a number field beside the slider for typing the value; a single\n * `discrete` slider only. The field is named as the slider is (see `label`\n * and `aria-label`).\n */\n valueField?: boolean;\n withTicks?: boolean;\n /**\n * Visible label, drawn above the slider. It names the slider; each thumb of a\n * range adds its own word: with `label=\"Price\"` they read \"Price minimum\" and\n * \"Price maximum\".\n */\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 /**\n * Accessible name of the slider. Replaces the name the visible `label` gives\n * it; a slider without a label needs it or `aria-labelledby`. Each thumb of a\n * range adds its own word, as with `label`.\n */\n \"aria-label\"?: string;\n /**\n * Ids of the elements whose text names the slider. It goes on the range input,\n * not the root, and replaces the name the visible `label` gives it; as on any\n * element, it also wins over `aria-label`. Each thumb of a range adds its own\n * word, as with `label`.\n */\n \"aria-labelledby\"?: string;\n /** Maps the numeric value to a human-readable string for assistive tech. */\n getAriaValueText?: (value: number) => string;\n}\n\n// The word each thumb of a range adds to the slider's name, so the two read apart.\nconst THUMB_WORDS = [\"minimum\", \"maximum\"] as const;\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 \"aria-labelledby\": ariaLabelledBy,\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 // The slider sets this on its root too; its own handler calls the caller's first.\n onMouseDown: onMouseDownProp,\n ...rest\n } = props;\n const helper = useHelperText(helperText);\n // The visible label names each thumb, followed by the thumb's own word\n // (\"Price minimum\"), as a caller's aria-label does. That aria-label replaces\n // the label: on one element aria-labelledby would win over it. A caller's\n // aria-labelledby replaces the label too, and names the thumbs the same way.\n const baseId = useId();\n const labelId = `${baseId}-label`;\n const thumbWordId = (idx: 0 | 1) => `${baseId}-${THUMB_WORDS[idx]}`;\n const labelledBy = ariaLabelledBy || (label && !ariaLabel ? labelId : undefined);\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 onMouseDownProp?.(event);\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\n label={label}\n labelId={labelId}\n helperText={helperText}\n helperTextId={helper.id}\n disabled={disabled}\n error={error}\n fullWidth\n shrink\n >\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} ${THUMB_WORDS[idx]}` : undefined}\n aria-labelledby={labelledBy ? `${labelledBy} ${thumbWordId(idx)}` : undefined}\n aria-describedby={helper.describedBy}\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 {labelledBy ? (\n <span id={thumbWordId(idx)} hidden>\n {THUMB_WORDS[idx]}\n </span>\n ) : null}\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 \"aria-labelledby\": ariaLabelledBy,\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 // The slider sets these on its root too; its own handlers call the caller's first.\n onMouseDown: onMouseDownProp,\n onKeyDown: onKeyDownProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n ...rest\n } = props;\n const helper = useHelperText(helperText);\n // The visible label names the slider. A caller's aria-label replaces it: on\n // one element aria-labelledby would win over it. A caller's aria-labelledby\n // replaces it too, on the input rather than the root.\n const baseId = useId();\n const labelId = `${baseId}-label`;\n const labelledBy = ariaLabelledBy || (label && !ariaLabel ? labelId : undefined);\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 onMouseDownProp?.(event);\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<HTMLSpanElement>) => {\n onKeyDownProp?.(e);\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 handleFocus = (event: React.FocusEvent<HTMLSpanElement>) => {\n onFocusProp?.(event);\n setIsFocused(true);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLSpanElement>) => {\n onBlurProp?.(event);\n setIsFocused(false);\n document.removeEventListener(\"keydown\", handleArrowsControls as (e: unknown) => void);\n };\n\n // The value field shows the text typed into it until that text is committed,\n // on blur or Enter; `null` shows the slider's value. A typed value the slider\n // can take (in its range and on its step grid) moves the slider at once. Any\n // other waits for the commit, which snaps it to the nearest value the slider\n // can take: so \"35\" with a step of 10 becomes 40, and \"50\" can be typed past\n // its \"5\" below a min of 10.\n const [fieldText, setFieldText] = React.useState<string | null>(null);\n\n const onFieldChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const text = event.target.value;\n setFieldText(text);\n const typed = Number(text);\n if (text.trim() !== \"\" && decimatedClamp(typed, min, max, step) === typed) {\n updateValue(typed, event);\n }\n };\n\n const commitField = (event: React.SyntheticEvent<HTMLInputElement>) => {\n if (fieldText === null) return;\n setFieldText(null);\n const typed = Number(fieldText);\n if (fieldText.trim() === \"\" || !Number.isFinite(typed)) return;\n const snapped = decimatedClamp(typed, min, max, step);\n if (snapped !== value) updateValue(snapped, event);\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\n label={label}\n labelId={labelId}\n helperText={helperText}\n helperTextId={helper.id}\n disabled={disabled}\n error={error}\n fullWidth\n shrink\n >\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={handleFocus}\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-labelledby={labelledBy}\n aria-describedby={helper.describedBy}\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 // Stepped, bounded and disabled as the slider is.\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n value={fieldText ?? value}\n onChange={onFieldChange}\n onBlur={commitField}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") commitField(e);\n }}\n variant=\"filled\"\n helperText={null}\n // It sets the slider's value, so it takes the slider's name.\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\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 { useId } from \"../../../hooks/useId\";\nimport { Slider, type SliderProps, type SliderValue } from \"../slider\";\n\nexport interface ValueSliderProps extends SliderProps {\n /**\n * Label text, drawn in the header row beside the readout. It names the slider,\n * as `Slider`'s label does; each thumb of a range adds its own word: with\n * `label=\"Price\"` they read \"Price minimum\" and \"Price maximum\".\n */\n label?: string;\n /**\n * Accessible name of the slider. Replaces the name the header `label` gives\n * it; a ValueSlider without a label needs it or `aria-labelledby`. Each thumb\n * of a range adds its own word, as with `label`.\n */\n \"aria-label\"?: string;\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 // The header label names the slider through Slider's aria-labelledby, which\n // goes on its range input (each thumb of a range adds its own word). A\n // caller's aria-label or aria-labelledby replaces it, as with Slider's label.\n const labelId = `${useId()}-label`;\n const labelledBy = sliderProps[\"aria-labelledby\"] || (label && !sliderProps[\"aria-label\"] ? labelId : undefined);\n\n return (\n <div className={cn(\"smwb-value-slider\", className)}>\n {showHeader ? (\n <div className=\"smwb-value-slider__header\">\n {label != null ? (\n <span id={labelId} className=\"smwb-value-slider__label\">\n {label}\n </span>\n ) : 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} aria-labelledby={labelledBy} />\n </div>\n );\n}\n\nexport default ValueSlider;\n","import React, { InputHTMLAttributes } from \"react\";\nimport cn from \"clsx\";\nimport { TextFieldWrapper } from \"../textField\";\nimport { useHelperText } from \"../../../hooks/useHelperText\";\nimport { useId } from \"../../../hooks/useId\";\nimport { cancelToggle, forgetCancelledToggle } from \"../../../utils/readOnlyToggle\";\nimport type { SelectionControlColor, SelectionControlSize } from \"../checkbox/checkbox\";\n\nexport interface ToggleProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n disabled?: boolean;\n /**\n * Keeps the switch as it is: clicks on it or its label and Space change nothing, and `onChange` is not called.\n * It stays focusable, and its input tells assistive technology it is read-only (`aria-readonly`).\n */\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 \"aria-describedby\": ariaDescribedBy,\n ...args\n } = props;\n const id = useId(idProp);\n const helper = useHelperText(helperText, { describedBy: ariaDescribedBy });\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) {\n forgetCancelledToggle(e, checked);\n return;\n }\n props.onChange?.(e, e.target.checked, props);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLInputElement>) => {\n props.onClick?.(e);\n if (readOnly) cancelToggle(e, checked);\n };\n\n return (\n <TextFieldWrapper\n helperText={helperText}\n helperTextId={helper.id}\n disabled={disabled}\n error={error}\n className=\"smwb-text-field-checkbox\"\n >\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 aria-describedby={helper.describedBy}\n role={\"switch\"}\n checked={checked}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n ref={ref}\n {...args}\n aria-readonly={readOnly || args[\"aria-readonly\"]}\n onChange={handleChange}\n onClick={handleClick}\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\ntype DivProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Test id of the root `<div>`; `grid` unless given. */\n \"data-testid\"?: string;\n};\n\nexport const Grid = React.forwardRef<HTMLDivElement, DivProps>(function Grid(\n { className, \"data-testid\": dataTestId = \"grid\", ...rest },\n ref\n) {\n return <div ref={ref} data-testid={dataTestId} 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 /** Test id of the root `<div>`; `grid-row` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const Row = React.forwardRef<HTMLDivElement, RowProps>(function Row(\n { className, justifyContent, alignItems, direction, wrap, spacing, \"data-testid\": dataTestId = \"grid-row\", ...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={dataTestId} 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 /** Test id of the root `<div>`; `grid-col` unless given. */\n \"data-testid\"?: string;\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 {\n className,\n xs,\n sm,\n md,\n lg,\n xl,\n xsOffset,\n smOffset,\n mdOffset,\n lgOffset,\n xlOffset,\n hidden,\n \"data-testid\": dataTestId = \"grid-col\",\n ...rest\n },\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={dataTestId} {...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 /** Test id of the root `<div>`; `grid-container` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const Container = React.forwardRef<HTMLDivElement, ContainerProps>(function Container(\n { className, maxWidth = \"lg\", disableGutters = false, \"data-testid\": dataTestId = \"grid-container\", ...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={dataTestId} 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 /** Test id of the root `<div>`; `divider` unless given. */\n \"data-testid\"?: string;\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 \"data-testid\": dataTestId = \"divider\",\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={dataTestId}\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\";\nimport { isTopOverlayLayer } from \"../../../utils/overlayLayer\";\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 /** Test id of the sheet panel (the dialog); `sheet` unless given. */\n \"data-testid\"?: 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 // Only the topmost overlay layer reacts to Escape, and not to one handled inside\n // it, e.g. by a menu closing on it.\n if (event.key === \"Escape\" && !event.defaultPrevented && isTopOverlayLayer(nodeRef.current)) {\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\n className={cn(disableOutsideClick ? \"smwb-sheet__overlay\" : \"smwb-sheet__default\")}\n ref={nodeRef}\n data-smwb-overlay-layer=\"\"\n >\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 data-smwb-overlay-layer=\"\"\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 \"data-testid\": dataTestId = \"sheet\",\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={dataTestId}\n {...rest}\n // A sheet is a dialog, focused as a whole when it opens: its role and\n // tabIndex win over the caller's, and so does aria-modal on a modal\n // sheet. On another, the caller's aria-modal stays.\n tabIndex={-1}\n role=\"dialog\"\n aria-modal={variant === \"modal\" || rest[\"aria-modal\"]}\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, {\n type CSSProperties,\n type PropsWithChildren,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CSSTransition } from \"react-transition-group\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport { hasOverlayLayerAbove } from \"../../../utils/overlayLayer\";\n\nexport interface FloatingWindowPosition {\n x: number;\n y: number;\n}\n\nexport interface FloatingWindowSize {\n width: number;\n height: number;\n}\n\n/** The eight edge/corner resize directions. */\nexport type FloatingWindowResizeDir = \"n\" | \"s\" | \"e\" | \"w\" | \"ne\" | \"nw\" | \"se\" | \"sw\";\n\nexport interface FloatingWindowProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onResize\" | \"title\" | \"children\"\n> {\n /** Controlled open state of the window. */\n open: boolean;\n /** Title bar content. When given, the window is labelled by it. */\n title?: ReactNode;\n /** Extra header controls, rendered before the built-in collapse/close buttons. */\n headerActions?: ReactNode;\n\n /** Controlled top-left position in viewport px. */\n position?: FloatingWindowPosition;\n /** Initial position when uncontrolled. */\n defaultPosition?: FloatingWindowPosition;\n /** Called on every move frame and on viewport re-clamp, with the clamped position. */\n onPositionChange?: (position: FloatingWindowPosition) => void;\n /** Called once when a move gesture ends — the point at which to persist. */\n onMoveEnd?: (position: FloatingWindowPosition) => void;\n\n /** Controlled size in px. */\n size?: FloatingWindowSize;\n /** Initial size when uncontrolled. */\n defaultSize?: FloatingWindowSize;\n /** Called on every resize frame and on viewport re-clamp, with the clamped size. */\n onResize?: (size: FloatingWindowSize) => void;\n /** Called once when a resize gesture ends — the point at which to persist. */\n onResizeEnd?: (size: FloatingWindowSize) => void;\n\n /** Minimum width in px (default 200). */\n minWidth?: number;\n /** Minimum height in px (default 120). */\n minHeight?: number;\n /** Maximum width in px (default: viewport width). */\n maxWidth?: number;\n /** Maximum height in px (default: viewport height). */\n maxHeight?: number;\n /** Px of the window that must stay inside the viewport (default 56). */\n keepVisible?: number;\n /** Step in px for keyboard moving (default 24). */\n moveStep?: number;\n /** Step in px for keyboard resizing (default 24). */\n resizeStep?: number;\n\n /** Inline stacking order. The host owns z-order across several windows. */\n zIndex?: number;\n /** Called on pointerdown anywhere in the window, so the host can raise it. */\n onActivate?: () => void;\n\n /** Shade the window down to its title bar. */\n collapsed?: boolean;\n /** Initial collapsed state when uncontrolled. */\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Render the built-in collapse toggle (default true). */\n collapsible?: boolean;\n\n /** Allow drag-to-move by the title bar (default true). */\n movable?: boolean;\n /** Allow drag-to-resize from the edges and corners (default true). */\n resizable?: boolean;\n /** Close on Escape while focus is inside the window (default false). */\n closeOnEsc?: boolean;\n onClose?: () => void;\n\n /** Accessible label for the move handle. */\n moveHandleAriaLabel?: string;\n /** Accessible label for the resize handle. */\n resizeHandleAriaLabel?: string;\n /** Accessible label for the close button. */\n closeAriaLabel?: string;\n /** Accessible label for the collapse toggle while expanded. */\n collapseAriaLabel?: string;\n /** Accessible label for the collapse toggle while collapsed. */\n expandAriaLabel?: string;\n\n \"aria-label\"?: string;\n /** Test id of the window's root `<div>`; `floating-window` unless given. */\n \"data-testid\"?: string;\n}\n\ninterface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface Viewport {\n width: number;\n height: number;\n}\n\n/** Sign vector per resize direction: how the pointer delta maps onto x/y/width/height. */\nconst RESIZE_DIRS: Record<FloatingWindowResizeDir, { dx: 0 | 1; dy: 0 | 1; dw: -1 | 0 | 1; dh: -1 | 0 | 1 }> = {\n n: { dx: 0, dy: 1, dw: 0, dh: -1 },\n s: { dx: 0, dy: 0, dw: 0, dh: 1 },\n e: { dx: 0, dy: 0, dw: 1, dh: 0 },\n w: { dx: 1, dy: 0, dw: -1, dh: 0 },\n ne: { dx: 0, dy: 1, dw: 1, dh: -1 },\n nw: { dx: 1, dy: 1, dw: -1, dh: -1 },\n se: { dx: 0, dy: 0, dw: 1, dh: 1 },\n sw: { dx: 1, dy: 0, dw: -1, dh: 1 },\n};\n\nconst RESIZE_ORDER: FloatingWindowResizeDir[] = [\"n\", \"s\", \"e\", \"w\", \"ne\", \"nw\", \"se\", \"sw\"];\n\nconst viewportOf = (): Viewport =>\n typeof window === \"undefined\" ? { width: 0, height: 0 } : { width: window.innerWidth, height: window.innerHeight };\n\nconst DEFAULT_POSITION: FloatingWindowPosition = { x: 24, y: 24 };\nconst DEFAULT_SIZE: FloatingWindowSize = { width: 360, height: 420 };\n\n/**\n * Free-floating, non-modal window: draggable by its title bar, resizable from every\n * edge and corner, clamped so a grabbable strip always stays on screen.\n *\n * Unlike Sheet/Modal it is deliberately NOT an overlay layer: no backdrop, no focus\n * trap, no `data-smwb-overlay-layer`. Several windows are meant to be open and usable\n * at once alongside the page behind them, so it must not trap focus, swallow clicks,\n * or steal Escape from a Modal stacked above it. Stacking order is the host's job —\n * pass `zIndex` and raise the window from `onActivate`.\n */\nexport const FloatingWindow = forwardRef<HTMLDivElement, PropsWithChildren<FloatingWindowProps>>(\n function FloatingWindow(props, ref) {\n const {\n open,\n title,\n headerActions,\n position: positionProp,\n defaultPosition = DEFAULT_POSITION,\n onPositionChange,\n onMoveEnd,\n size: sizeProp,\n defaultSize = DEFAULT_SIZE,\n onResize,\n onResizeEnd,\n minWidth = 200,\n minHeight = 120,\n maxWidth,\n maxHeight,\n keepVisible = 56,\n moveStep = 24,\n resizeStep = 24,\n zIndex,\n onActivate,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n collapsible = true,\n movable = true,\n resizable = true,\n closeOnEsc = false,\n onClose,\n moveHandleAriaLabel = \"Move window\",\n resizeHandleAriaLabel = \"Resize window\",\n closeAriaLabel = \"Close window\",\n collapseAriaLabel = \"Collapse window\",\n expandAriaLabel = \"Expand window\",\n // The window sets this on its root too; its own handler calls the caller's first.\n onPointerDown: onPointerDownProp,\n className,\n style,\n children,\n \"data-testid\": dataTestId = \"floating-window\",\n ...rest\n } = props;\n\n const [domRoot, setDomRoot] = useState<HTMLElement>();\n const rootRef = useRef<HTMLDivElement>(null);\n const forkedRootRef = useForkRef<HTMLDivElement>(ref, rootRef);\n const titleId = useId();\n\n useSafeLayoutEffect(() => {\n setDomRoot(document.body);\n }, []);\n\n const [position, setPosition] = useControllableState<FloatingWindowPosition>({\n value: positionProp,\n defaultValue: defaultPosition,\n onChange: onPositionChange,\n });\n const [size, setSize] = useControllableState<FloatingWindowSize>({\n value: sizeProp,\n defaultValue: defaultSize,\n onChange: onResize,\n });\n const [collapsed, setCollapsed] = useControllableState<boolean>({\n value: collapsedProp,\n defaultValue: defaultCollapsed,\n onChange: onCollapsedChange,\n });\n\n /**\n * Size first, then position against the clamped size. `y` is never negative, so the\n * title bar can never be dragged above the top edge and become ungrabbable — the gap\n * that makes an off-screen Sheet unrecoverable.\n */\n const clampRect = useCallback(\n (rectIn: Rect, vp: Viewport): Rect => {\n const maxW = maxWidth ?? vp.width;\n const maxH = maxHeight ?? vp.height;\n const width = Math.max(minWidth, Math.min(maxW, rectIn.width));\n const height = Math.max(minHeight, Math.min(maxH, rectIn.height));\n const keep = Math.min(keepVisible, width);\n const x = Math.max(keep - width, Math.min(vp.width - keep, rectIn.x));\n const y = Math.max(0, Math.min(Math.max(0, vp.height - keep), rectIn.y));\n return { x, y, width, height };\n },\n [keepVisible, maxHeight, maxWidth, minHeight, minWidth]\n );\n\n /**\n * Where a window is placed before anyone touches it: fully inside the viewport when\n * it fits at all. `clampRect` alone only keeps `keepVisible` px reachable, which is\n * right for a window the user parked at an edge but wrong on opening — a 760px\n * default on a 375px phone opened a quarter of a screen off to the right.\n */\n const fitRect = useCallback(\n (rectIn: Rect, vp: Viewport): Rect => {\n const clamped = clampRect(rectIn, vp);\n return {\n ...clamped,\n x: Math.max(0, Math.min(clamped.x, vp.width - clamped.width)),\n y: Math.max(0, Math.min(clamped.y, vp.height - clamped.height)),\n };\n },\n [clampRect]\n );\n\n // Set by the first move/resize: from then on the user's placement wins and only the\n // reachability clamp applies, so a window can still be parked half off-screen.\n const [placed, setPlaced] = useState(false);\n useEffect(() => {\n // A closed window forgets that it was moved: opening it again should land on\n // screen like the first time, whatever the viewport is now.\n if (!open) setPlaced(false);\n }, [open]);\n\n /** The geometry actually rendered. Clamping the CONTROLLED value (not just drag\n * frames) means a rect restored from a larger monitor lands on screen immediately. */\n const current = { x: position.x, y: position.y, width: size.width, height: size.height };\n const rect = placed ? clampRect(current, viewportOf()) : fitRect(current, viewportOf());\n\n // The gesture handlers are attached once (pointer capture), so they must not close over a\n // stale rect. A ref mirroring the rendered rect keeps them reading the current geometry.\n const rectRef = useRef(rect);\n rectRef.current = rect;\n\n const commitRect = useCallback(\n (next: Rect, gesture = true): void => {\n if (gesture) setPlaced(true);\n const clamped = clampRect(next, viewportOf());\n if (clamped.x !== position.x || clamped.y !== position.y) setPosition({ x: clamped.x, y: clamped.y });\n if (clamped.width !== size.width || clamped.height !== size.height) {\n setSize({ width: clamped.width, height: clamped.height });\n }\n },\n [clampRect, position.x, position.y, setPosition, setSize, size.height, size.width]\n );\n\n const commitRectRef = useRef(commitRect);\n commitRectRef.current = commitRect;\n\n // Re-clamp when the viewport shrinks, so a window parked near an edge on a large\n // screen stays reachable on a small one. Sheet has no such listener, which is why a\n // dragged sheet survives a viewport shrink oversized.\n useEffect(() => {\n if (!open) return undefined;\n const onViewportResize = (): void => commitRectRef.current(rectRef.current, false);\n window.addEventListener(\"resize\", onViewportResize);\n return () => window.removeEventListener(\"resize\", onViewportResize);\n }, [open]);\n\n // Escape only while focus is inside this window. FloatingWindow is not an overlay\n // layer, so `isTopOverlayLayer` (document order, not z-index) would be the wrong\n // arbiter with several windows open. An open layer above it, such as a select menu\n // opened from inside it, takes the Escape first; other windows never do.\n useEffect(() => {\n if (!open || !closeOnEsc || !onClose) return undefined;\n const onKeyDown = (event: KeyboardEvent): void => {\n // An Escape handled inside the window, e.g. by a menu closing on it, is not the window's.\n if (event.defaultPrevented) return;\n if (event.key !== \"Escape\") return;\n const root = rootRef.current;\n if (!root || !root.contains(document.activeElement) || hasOverlayLayerAbove(root)) return;\n onClose();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [closeOnEsc, onClose, open]);\n\n const activate = useCallback((): void => {\n onActivate?.();\n // Only when focus is elsewhere — an unconditional focus() would steal the caret\n // from an input inside the window on every raise.\n const root = rootRef.current;\n if (root && !root.contains(document.activeElement)) root.focus({ preventScroll: true });\n }, [onActivate]);\n\n const onRootPointerDown = (event: React.PointerEvent<HTMLDivElement>): void => {\n onPointerDownProp?.(event);\n activate();\n };\n\n // Pointer capture keeps `pointermove` flowing to the handle even outside it, so there\n // are no document-level listeners to leak (Sheet's pattern, not screenDivider's).\n const move = useRef<{ px: number; py: number; x: number; y: number } | null>(null);\n\n const onMoveHandlePointerDown = (event: React.PointerEvent<HTMLDivElement>): void => {\n if (!movable) return;\n // Header buttons stay clickable.\n if ((event.target as Element | null)?.closest(\"button,[data-no-drag]\")) return;\n event.preventDefault();\n const current = rectRef.current;\n move.current = { px: event.clientX, py: event.clientY, x: current.x, y: current.y };\n try {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n } catch {\n /* best-effort */\n }\n };\n\n const onMoveHandlePointerMove = (event: React.PointerEvent<HTMLDivElement>): void => {\n const start = move.current;\n if (!start) return;\n commitRect({\n ...rectRef.current,\n x: start.x + event.clientX - start.px,\n y: start.y + event.clientY - start.py,\n });\n };\n\n const endMove = (event: React.PointerEvent<HTMLDivElement>): void => {\n if (move.current) {\n move.current = null;\n const current = rectRef.current;\n onMoveEnd?.({ x: current.x, y: current.y });\n }\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n };\n\n const resize = useRef<{ dir: FloatingWindowResizeDir; px: number; py: number; rect: Rect } | null>(null);\n\n const onResizePointerDown = (dir: FloatingWindowResizeDir, event: React.PointerEvent<HTMLDivElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n resize.current = { dir, px: event.clientX, py: event.clientY, rect: rectRef.current };\n // Grabbing a resize grip is an interaction with the window, so raise it too — the\n // root handler does not see it because this handler stops propagation.\n activate();\n try {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n } catch {\n /* best-effort */\n }\n };\n\n const onResizePointerMove = (event: React.PointerEvent<HTMLDivElement>): void => {\n const gesture = resize.current;\n if (!gesture) return;\n const sign = RESIZE_DIRS[gesture.dir];\n const dx = event.clientX - gesture.px;\n const dy = event.clientY - gesture.py;\n const start = gesture.rect;\n // A west/north drag moves the origin AND changes the size, so width is recomputed from\n // the moved edge rather than from the delta alone — otherwise dragging past minWidth\n // would keep sliding the window instead of stopping at the minimum.\n //\n // The size must be clamped to BOTH bounds here, before the origin is derived from it.\n // Clamping only the minimum and leaving the maximum to commitRect's own clamp would\n // compute the origin from a width that then gets shrunk, so the edge the user is NOT\n // dragging would drift away under the cursor.\n const vp = viewportOf();\n const maxW = maxWidth ?? vp.width;\n const maxH = maxHeight ?? vp.height;\n const width = Math.min(maxW, Math.max(minWidth, start.width + sign.dw * dx));\n const height = Math.min(maxH, Math.max(minHeight, start.height + sign.dh * dy));\n commitRect({\n x: sign.dx ? start.x + start.width - width : start.x,\n y: sign.dy ? start.y + start.height - height : start.y,\n width,\n height,\n });\n };\n\n const endResize = (event: React.PointerEvent<HTMLDivElement>): void => {\n if (resize.current) {\n resize.current = null;\n const current = rectRef.current;\n onResizeEnd?.({ width: current.width, height: current.height });\n }\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n };\n\n /** A keypress is a COMPLETE gesture, so it reports move/resize end as well as the\n * per-frame change — otherwise a consumer that persists only on `*End` (the documented\n * way to avoid thrashing storage during a drag) would silently never save\n * keyboard-driven geometry. */\n const endKeyboardGesture = (resized: boolean, next: Rect): void => {\n const current = clampRect(next, viewportOf());\n if (resized) onResizeEnd?.({ width: current.width, height: current.height });\n else onMoveEnd?.({ x: current.x, y: current.y });\n };\n\n /** Arrows move; Shift+Arrows resize. */\n const onMoveHandleKeyDown = (event: React.KeyboardEvent<HTMLSpanElement>): void => {\n const current = rectRef.current;\n const step = event.shiftKey ? resizeStep : moveStep;\n const delta: Record<string, [number, number]> = {\n ArrowLeft: [-step, 0],\n ArrowRight: [step, 0],\n ArrowUp: [0, -step],\n ArrowDown: [0, step],\n };\n const d = delta[event.key];\n if (!d) return;\n event.preventDefault();\n const next = event.shiftKey\n ? { ...current, width: current.width + d[0], height: current.height + d[1] }\n : { ...current, x: current.x + d[0], y: current.y + d[1] };\n commitRect(next);\n endKeyboardGesture(event.shiftKey, next);\n };\n\n const onResizeHandleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n const current = rectRef.current;\n const vp = viewportOf();\n let next: Rect;\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n const dir = event.key === \"ArrowRight\" ? 1 : -1;\n next = { ...current, width: current.width + dir * resizeStep };\n } else if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const dir = event.key === \"ArrowDown\" ? 1 : -1;\n next = { ...current, height: current.height + dir * resizeStep };\n } else if (event.key === \"Home\") {\n event.preventDefault();\n next = { ...current, width: minWidth, height: minHeight };\n } else if (event.key === \"End\") {\n event.preventDefault();\n next = { ...current, width: maxWidth ?? vp.width, height: maxHeight ?? vp.height };\n } else {\n return;\n }\n commitRect(next);\n endKeyboardGesture(true, next);\n };\n\n const toggleCollapsed = (): void => setCollapsed((prev) => !prev);\n\n if (!domRoot) {\n return <></>;\n }\n\n const windowStyle: CSSProperties = {\n left: `${rect.x}px`,\n top: `${rect.y}px`,\n width: `${rect.width}px`,\n ...(collapsed ? {} : { height: `${rect.height}px` }),\n ...(zIndex === undefined ? {} : { zIndex }),\n ...(style ?? {}),\n };\n\n return createPortal(\n <CSSTransition\n in={open}\n timeout={120}\n mountOnEnter\n unmountOnExit\n appear\n classNames={{ enterDone: \"smwb-floating-window_entered\" }}\n nodeRef={rootRef}\n >\n <div\n {...rest}\n ref={forkedRootRef}\n data-testid={dataTestId}\n role=\"dialog\"\n tabIndex={-1}\n // Labelled by its title when it has one; without, the caller's own stays.\n aria-labelledby={title ? titleId : rest[\"aria-labelledby\"]}\n className={cn(\"smwb-floating-window\", className, { \"smwb-collapsed\": collapsed })}\n style={windowStyle}\n onPointerDown={onRootPointerDown}\n >\n <div\n className=\"smwb-floating-window__header\"\n data-testid=\"floating-window-header\"\n onPointerDown={onMoveHandlePointerDown}\n onPointerMove={onMoveHandlePointerMove}\n onPointerUp={endMove}\n onPointerCancel={endMove}\n >\n {/* The move affordance is the grip, not the header: the header also hosts the\n collapse/close buttons and any consumer `headerActions`, and nesting those\n inside a role=\"button\" is an a11y violation. Pointer drag still works\n anywhere on the header; only the keyboard affordance lives here. */}\n <span\n className=\"smwb-floating-window__grip\"\n data-testid=\"floating-window-move\"\n role=\"button\"\n tabIndex={0}\n aria-label={moveHandleAriaLabel}\n onKeyDown={onMoveHandleKeyDown}\n >\n <Icon name=\"drag_indicator\" />\n </span>\n {title ? (\n <span className=\"smwb-floating-window__title\" id={titleId}>\n {title}\n </span>\n ) : null}\n <div className=\"smwb-floating-window__actions\" data-no-drag>\n {headerActions}\n {collapsible ? (\n <button\n type=\"button\"\n className=\"smwb-floating-window__action\"\n data-testid=\"floating-window-collapse\"\n aria-label={collapsed ? expandAriaLabel : collapseAriaLabel}\n aria-expanded={!collapsed}\n onClick={toggleCollapsed}\n >\n <Icon name={collapsed ? \"open_in_full\" : \"close_fullscreen\"} />\n </button>\n ) : null}\n {onClose ? (\n <button\n type=\"button\"\n className=\"smwb-floating-window__action\"\n data-testid=\"floating-window-close\"\n aria-label={closeAriaLabel}\n onClick={onClose}\n >\n <Icon name=\"close\" />\n </button>\n ) : null}\n </div>\n </div>\n\n {!collapsed ? (\n <div className=\"smwb-floating-window__body\" data-testid=\"floating-window-body\">\n {children}\n </div>\n ) : null}\n\n {resizable && !collapsed\n ? RESIZE_ORDER.map((dir) => (\n <div\n key={dir}\n className={cn(\"smwb-floating-window__resize\", `smwb-floating-window__resize_${dir}`)}\n data-testid={`floating-window-resize-${dir}`}\n // Only the south-east grip is reachable by keyboard: eight tab stops per\n // window would make Tab unusable once a few windows are open.\n {...(dir === \"se\"\n ? {\n role: \"separator\" as const,\n tabIndex: 0,\n \"aria-label\": resizeHandleAriaLabel,\n \"aria-valuemin\": minWidth,\n \"aria-valuemax\": Math.round(maxWidth ?? viewportOf().width),\n \"aria-valuenow\": Math.round(rect.width),\n onKeyDown: onResizeHandleKeyDown,\n }\n : { \"aria-hidden\": true, tabIndex: -1 })}\n onPointerDown={(event) => onResizePointerDown(dir, event)}\n onPointerMove={onResizePointerMove}\n onPointerUp={endResize}\n onPointerCancel={endResize}\n />\n ))\n : null}\n </div>\n </CSSTransition>,\n domRoot\n );\n }\n);\n\nexport default FloatingWindow;\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 /** Test id of the root `<div>`; `stack` unless given. */\n \"data-testid\"?: 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 {\n direction = \"column\",\n spacing = \"md\",\n align,\n justify,\n wrap,\n divider,\n className,\n style,\n children,\n \"data-testid\": dataTestId = \"stack\",\n ...rest\n },\n ref\n) {\n const items = Children.toArray(children).filter(isValidElement);\n return (\n <div\n ref={ref}\n data-testid={dataTestId}\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 /** Test id of the root element; `page` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const Page = React.forwardRef<HTMLElement, PropsWithChildren<PageProps>>(function Page(\n {\n maxWidth = \"lg\",\n disableGutters = false,\n component,\n className,\n children,\n \"data-testid\": dataTestId = \"page\",\n ...rest\n },\n ref\n) {\n const Tag = (component ?? \"main\") as \"main\";\n return (\n <Tag\n ref={ref}\n data-testid={dataTestId}\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 /** Test id of the root `<header>`; `page-header` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const PageHeader = React.forwardRef<HTMLElement, PageHeaderProps>(function PageHeader(\n {\n title,\n subtitle,\n breadcrumbs,\n actions,\n divider = false,\n className,\n \"data-testid\": dataTestId = \"page-header\",\n ...rest\n },\n ref\n) {\n return (\n <header\n ref={ref}\n data-testid={dataTestId}\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, { HTMLAttributes, PropsWithChildren, ReactNode, useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { Tooltip } from \"../../feedBack/tooltip\";\nimport { useDismissOnEscape } from \"../../../hooks/useDismissOnEscape\";\n\nexport interface SectionHeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n className?: string;\n /** The section's name. */\n title: ReactNode;\n /** Heading level of the title: 2 by default. */\n level?: 2 | 3 | 4 | 5 | 6;\n /** How many items the section holds, beside the title. Nothing is shown for null. */\n count?: number | string | null;\n /**\n * How to read the section, behind a \"?\" icon: shown on hover and on keyboard\n * focus, and the icon's accessible name. Text only — the tooltip renders in\n * the browser.\n */\n help?: string;\n /** The \"?\" icon's accessible name, e.g. \"Explanation: …\"; the help text by default. */\n helpLabel?: string;\n /** Id of the heading, for anchors and aria-labelledby. */\n titleId?: string;\n /** A line under the title. */\n subtitle?: ReactNode;\n /** Test id of the root `<header>`; `section-header` unless given. */\n \"data-testid\"?: string;\n}\n\n/** The \"?\" icon with its tooltip, open on hover and on keyboard focus. */\nfunction HelpHint({ text, label }: { text: string; label?: string }) {\n const [open, setOpen] = useState(false);\n // Escape hides the tooltip wherever focus is, shown by hover or by focus (WCAG 1.4.13),\n // and is marked as handled, so a window, panel, Modal or Sheet around the hint stays\n // open; with the tooltip hidden, the key is theirs.\n useDismissOnEscape(open, () => setOpen(false));\n return (\n <Tooltip\n className=\"smwb-section-header__tooltip\"\n message={text}\n trigger=\"manual\"\n open={open}\n placement=\"top\"\n offset={{ offsetY: 6 }}\n >\n <span\n className=\"smwb-section-header__help\"\n role=\"img\"\n aria-label={label ?? text}\n tabIndex={0}\n onPointerEnter={() => setOpen(true)}\n onPointerLeave={() => setOpen(false)}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n >\n <Icon name=\"help\" size={16} />\n </span>\n </Tooltip>\n );\n}\n\n/**\n * A section's heading row: the title with a count and a help hint, a subtitle\n * under them, and the section's actions (the children) at the end. On a narrow\n * screen the actions wrap under the title.\n */\nexport const SectionHeader = React.forwardRef<HTMLElement, PropsWithChildren<SectionHeaderProps>>(\n function SectionHeader(\n {\n className,\n title,\n level = 2,\n count,\n help,\n helpLabel,\n titleId,\n subtitle,\n children,\n \"data-testid\": dataTestId = \"section-header\",\n ...rest\n },\n ref\n ) {\n const Heading = `h${level}` as \"h2\";\n return (\n <header\n data-testid={dataTestId}\n {...rest}\n ref={ref}\n className={cn(\"smwb-section-header\", `smwb-section-header_level-${level}`, className)}\n >\n <div className=\"smwb-section-header__titles\">\n <div className=\"smwb-section-header__title-line\">\n <Heading id={titleId} className=\"smwb-section-header__title\">\n {title}\n </Heading>\n {count !== undefined && count !== null ? <span className=\"smwb-section-header__count\">{count}</span> : null}\n {help ? <HelpHint text={help} label={helpLabel} /> : null}\n </div>\n {subtitle ? <div className=\"smwb-section-header__subtitle\">{subtitle}</div> : null}\n </div>\n {children ? <div className=\"smwb-section-header__actions\">{children}</div> : null}\n </header>\n );\n }\n);\n\nexport default SectionHeader;\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 /** Test id of the root `<div>`; `app-layout` unless given. */\n \"data-testid\"?: 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 \"data-testid\": dataTestId = \"app-layout\",\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={dataTestId}\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 /** Test id of the root (`<header>`, or `<footer>` at the bottom); `app-bar` unless given. */\n \"data-testid\"?: string;\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 \"data-testid\": dataTestId = \"app-bar\",\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={dataTestId}\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 /** Test id of the root `<nav>`; `breadcrumbs` unless given. */\n \"data-testid\"?: 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 \"data-testid\": dataTestId = \"breadcrumbs\",\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={dataTestId}\n // A default the caller's own replaces, to name it in their language; an\n // explicit undefined keeps it.\n aria-label={props[\"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 /** Test id of the root `<nav>`; `pagination` unless given. */\n \"data-testid\"?: string;\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 \"data-testid\": dataTestId = \"pagination\",\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={dataTestId}\n // A default the caller's own replaces, to name it in their language; an\n // explicit undefined keeps it.\n aria-label={props[\"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 /** Longer text under the label, in every orientation. */\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\n/**\n * `auto` lays the steps out in a row while the stepper's container is wide\n * enough for them — about 8rem per step, a theme variable — and in a column when\n * it is not. It is a CSS container query, so the server renders the same markup\n * and nothing changes on hydration.\n */\nexport type StepperOrientation = \"horizontal\" | \"vertical\" | \"auto\";\n\ntype DataAttributes = Record<`data-${string}`, unknown>;\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?: StepperOrientation;\n /** Place the label under the icon (in a row: horizontal, or auto while wide). */\n alternativeLabel?: boolean;\n /** Makes steps clickable; receives the clicked step index. */\n onStepClick?: (index: number) => void;\n /** Test id of the stepper `<div>`; `stepper` unless given. */\n \"data-testid\"?: string;\n}\n\n/** Step counts with their own `auto` breakpoint; longer steppers use the last one. */\nconst AUTO_MAX_STEPS = 12;\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(function Stepper(\n {\n className,\n steps,\n activeStep,\n orientation = \"horizontal\",\n alternativeLabel = false,\n onStepClick,\n \"data-testid\": dataTestId = \"stepper\",\n ...props\n },\n ref\n) {\n const auto = orientation === \"auto\";\n const stepper = (\n <div\n {...props}\n ref={ref}\n data-testid={dataTestId}\n // The auto layout's step count wins; without it, the caller's data-steps stays.\n data-steps={auto ? String(Math.min(steps.length, AUTO_MAX_STEPS)) : (props as DataAttributes)[\"data-steps\"]}\n className={cn(\n \"smwb-stepper\",\n auto ? \"smwb-stepper_horizontal smwb-stepper_auto\" : `smwb-stepper_${orientation}`,\n { \"smwb-stepper_alt-label\": alternativeLabel && orientation !== \"vertical\" },\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 ? <span className=\"smwb-stepper__description\">{step.description}</span> : 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 // `auto` needs a query container around the stepper: its own flex direction is\n // what the container query switches.\n return auto ? <div className=\"smwb-stepper-auto\">{stepper}</div> : stepper;\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 {...rest}\n // A default: the caller's own wins, and an explicit undefined keeps it.\n role={rest.role ?? \"menubar\"}\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 // role=\"navigation\" is a default: the caller's own wins, and an explicit undefined keeps it.\n <nav ref={ref} className={cn(\"smwb-bottom-bar\", className)} {...rest} role={rest.role ?? \"navigation\"}>\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 /** With `tag=\"a\"`: where the link goes, so the tab stays a real link. */\n href?: string;\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 // The tab sets this on its root too; its own handler calls the caller's first.\n onPointerDown: onPointerDownProp,\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 onPointerDownProp?.(event);\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 {...rest}\n ref={ref}\n className={classes}\n onMouseDown={onMouseDown}\n onPointerDown={onPointerDown}\n // The role, the selection and the roving tabIndex belong to the tab list:\n // they win over the caller's. A tab that is not disabled keeps the\n // caller's aria-disabled.\n role={\"tab\"}\n aria-selected={isActive}\n aria-disabled={disabled || rest[\"aria-disabled\"]}\n tabIndex={isActive ? 0 : -1}\n disabled={Tag === \"button\" ? disabled : undefined}\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 { animate } from \"../../../utils/animate\";\nimport Icon from \"../../base/icon/icon\";\n\nexport interface TabsProps {\n /**\n * Index of the selected tab. Tabs count in the order they render: a tab left out,\n * such as `{show && <Tab />}` while `show` is false, takes no index.\n */\n value: number;\n /** Called with the index of the clicked tab, counted as for `value`. */\n onChange: (e: React.MouseEvent<HTMLButtonElement>, index: number) => void;\n /** Draw the indicator as wide as the selected tab's label rather than the whole tab. */\n indicatorContent?: boolean;\n /**\n * Let the tab row scroll sideways instead of clipping it. The edge beyond which\n * more tabs are hidden fades out.\n */\n scrollable?: boolean;\n /** With `scrollable`: buttons at both ends that scroll the row while it overflows. */\n scrollButtons?: boolean;\n /** Compact tabs: labels as written (no capitals, no letter spacing) and less padding. */\n dense?: boolean;\n /** Accessible label of the button that scrolls back. */\n scrollBackAriaLabel?: string;\n /** Accessible label of the button that scrolls forward. */\n scrollForwardAriaLabel?: string;\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\n/** A scroll button moves the row by this share of its visible width. */\nconst SCROLL_PAGE = 0.8;\n\ninterface Overflow {\n start: boolean;\n end: boolean;\n}\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 scrollButtons = false,\n dense = false,\n scrollBackAriaLabel = \"Scroll tabs back\",\n scrollForwardAriaLabel = \"Scroll tabs forward\",\n \"aria-label\": ariaLabel,\n ...rest\n } = props;\n const [mounted, setMounted] = React.useState(false);\n const [indicatorStyle, setIndicatorStyle] = React.useState<IndicatorStyle>(defaultIndicatorStyle);\n // Whether tabs are hidden past the start / the end of a scrollable row. Only\n // measured in the browser, so the server markup shows neither.\n const [overflow, setOverflow] = React.useState<Overflow>({ start: false, end: false });\n\n const tabsRef = React.useRef<HTMLDivElement>(null);\n const tabListRef = React.useRef<HTMLDivElement>(null);\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 // The label box of that same tab, found in the DOM like the tab itself.\n const content = tab ? tab.querySelector(\".smwb-tab__content\") : null;\n tabContentMeta = content ? content.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 updateOverflow = useEventCallback(() => {\n const node = tabsRef.current;\n const max = node ? node.scrollWidth - node.clientWidth : 0;\n const next: Overflow =\n node && scrollable\n ? { start: node.scrollLeft > 1, end: node.scrollLeft < max - 1 }\n : { start: false, end: false };\n setOverflow((prev) => (prev.start === next.start && prev.end === next.end ? prev : next));\n });\n\n const scrollByPage = (direction: -1 | 1) => {\n const node = tabsRef.current;\n if (node) {\n scroll(node.scrollLeft + direction * node.clientWidth * SCROLL_PAGE);\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 updateOverflow();\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 const scroller = tabsRef.current;\n scroller.addEventListener(\"scroll\", updateOverflow, { passive: true });\n\n let resizeObserver: ResizeObserver;\n\n // The row and each tab: a label can grow with its data while the row keeps\n // its width.\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(scroller);\n\n Array.from(tabListRef.current?.children ?? []).forEach((child) => {\n resizeObserver.observe(child);\n });\n }\n updateOverflow();\n\n return () => {\n onResize.cancel();\n\n window.removeEventListener(\"resize\", onResize);\n scroller.removeEventListener(\"scroll\", updateOverflow);\n\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n };\n }, [updateIndicatorState, updateOverflow]);\n\n React.useEffect(() => {\n // Не анимировать при первом рендере\n scrollSelectedIntoView(defaultIndicatorStyle !== indicatorStyle);\n }, [scrollSelectedIntoView, indicatorStyle]);\n\n // Only elements are tabs: a child left out, such as `{show && <Tab />}`, takes no\n // index, so `value` counts the tabs that render, as the indicator does in the DOM.\n const tabs = React.Children.toArray(children)\n .filter((child): child is React.ReactElement<TabProps> => React.isValidElement(child))\n .map((child, index) =>\n React.cloneElement(child, {\n isActive: value === index,\n // The tab's own onClick runs first, then the tab list picks the tab.\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n child.props.onClick?.(event);\n onChange(event, index);\n },\n } as TabProps)\n );\n\n const showScrollButtons = scrollable && scrollButtons && (overflow.start || overflow.end);\n\n return (\n <div\n className={cn(\n \"smwb-tabs\",\n {\n \"smwb-tabs--dense\": dense,\n \"smwb-tabs--overflow-start\": overflow.start,\n \"smwb-tabs--overflow-end\": overflow.end,\n },\n className\n )}\n role={\"tabpanel\"}\n ref={ref}\n {...rest}\n >\n {showScrollButtons && (\n <button\n type=\"button\"\n className=\"smwb-tabs__scroll-button smwb-tabs__scroll-button--start\"\n aria-label={scrollBackAriaLabel}\n disabled={!overflow.start}\n onClick={() => scrollByPage(-1)}\n >\n <Icon name=\"chevron_left\" size={20} />\n </button>\n )}\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 {showScrollButtons && (\n <button\n type=\"button\"\n className=\"smwb-tabs__scroll-button smwb-tabs__scroll-button--end\"\n aria-label={scrollForwardAriaLabel}\n disabled={!overflow.end}\n onClick={() => scrollByPage(1)}\n >\n <Icon name=\"chevron_right\" size={20} />\n </button>\n )}\n </div>\n );\n});\n\nexport { Tab };\nexport type { TabProps };\n"],"names":["Observable","value","cb","l","useObservable","observable","val","setVal","useState","useEffect","useSafeLayoutEffect","effect","deps","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","resolvePlacement","placement","alignment","autoPlacement","FLOATING_OFFSET_PX","FLOATING_SHIFT_PADDING_PX","buildFloatingMiddleware","custom","flip","shift","offset","DEFAULT_PLACEMENT","DEFAULT_OFFSET_PX","SHIFT_PADDING_PX","rectFromPoint","x","y","useHoverPopover","params","offsetPx","openDelay","closeDelay","middleware","open","setOpen","cursorRef","anchorRef","anchorElRef","openTimerRef","closeTimerRef","floatingMiddleware","refs","floatingStyles","update","useFloating","autoUpdate","virtualReference","clearTimers","freezeAnchor","openNow","scheduleOpen","scheduleClose","close","setVirtualAnchor","point","setAnchorEl","element","handleEnter","handleMove","getReferenceProps","userHandlers","cancelClose","getFloatingProps","userProps","acceptToString","accept","mime","exts","useDropzone","options","inputRef","isDragActive","setIsDragActive","optionsRef","handleFiles","list","maxFiles","onDrop","onDropAccepted","files","getRootProps","_b","getInputProps","IconContext","createContext","IconProvider","source","icons","children","jsx","getConfiguredSource","getIconConfig","useIconSource","override","context","useContext","configured","useSyncExternalStore","subscribeIcons","COLOR_TOKENS","warned","warnMissing","name","Icon","forwardRef","className","weight","fill","size","grade","color","title","dataTestId","props","ref","resolvedSource","lookup","getSnapshot","getIcon","registered","definition","glyph","mode","decorative","colorClass","cssSize","strokeWidth","cn","_c","Ripple","actionRef","classes","center","duration","rest","ripples","setRipples","nextKey","timeouts","pending","timeout","rect","diameter","radius","coordX","coordY","prevRipples","setRef","useForkRef","instance","isNumber","n","number","isPercentage","height","hideContent","showContent","ANIMATION_STATE_CLASSES","getStaticStateClasses","animationStateClasses","classNames","AnimateHeight","animateOpacity","applyInlineTransitions","contentClassName","userDelay","userDuration","easing","onHeightAnimationEnd","onHeightAnimationStart","style","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","subtitle","variant","isOpenByDefault","disabled","icon","startAdornment","endAdornment","noIcon","lazy","unmountOnExit","onToggleClick","internalOpen","setInternalOpen","isOpen","baseId","contentId","headerId","deferred","present","setPresent","onCollapsed","hasContent","arrowIconClasses","toggle","e","jsxs","Button","label","iconProps","href","onMouseDownProp","onPointerDownProp","fullWidth","rippleCenter","disableRipple","colorTheme","colorProp","rippleRef","onMouseDown","onPointerDown","rippleElement","iconElement","OVERLAY_LAYER_ATTR","overlayLayers","isEventInForeignOverlay","node","above","isTopOverlayLayer","all","top","hasOverlayLayerAbove","layer","DEFAULT_LABELS","resolveChildren","ctx","resolveControls","controls","focusFirst","targets","tabbables","ExpansionPanel","header","modeProp","defaultMode","onModeChange","disableExpand","noControls","renderControls","closeOnOutsideClick","closeOnEsc","labels","setMode","domRoot","setDomRoot","overlayRef","cardRef","cardRefs","fullscreenButtonRef","closeButtonRef","openerRef","lastFocusedRef","wasFullscreenRef","effectiveMode","isFullRow","isFullscreen","toggleRow","openFullscreen","closeFullscreen","controlsContext","overlay","defaultControls","Fragment","renderControlBar","content","overlayShown","card","createPortal","ChatIconButton","edge","type","FloatingButton","hasValue","isFilled","obj","TextFieldAdornment","position","disablePointerEvents","inline","hasHelperText","helperText","useHelperText","describedBy","id","ids","TextFieldWrapper","helperTextId","error","isFilledState","isFocused","htmlFor","labelId","shrink","onHolderMouseDown","isFilledVariant","isNotchedActive","helperLine","labelClasses","notchedClasses","splitDataAttributes","data","other","key","TextField","ariaDescribedBy","required","onChangeProp","onFocusProp","onBlurProp","readOnly","placeholder","autoComplete","inputMode","dataAttributes","inputAttributes","inputId","setIsFocused","setIsFilledState","inputForkRef","helper","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","resolveChatMessageStatusLabel","isImageAttachment","attachment","formatChatTimestamp","date","resolveAllowedLayouts","input","pickInitialLayout","allowed","preferred","getChatLayoutActions","allowedLayouts","currentLayout","shouldShowChatCloseButton","shouldComposerNewlineOnEnter","shiftEnterNewline","ctrlEnterNewline","isCtrl","stopPropagation","insertNewlineAtCursor","start","end","nextValue","ChatComposer","onSendMessage","sendAriaLabel","fileUpload","attachInputId","onAttachClick","attachAriaLabel","textareaRef","multiline","canSend","showAttach","handleSend","text","handleKeyDown","attachClassName","attachButton","sendButton","layoutIcons","layoutAriaLabels","ChatHeader","actions","layout","onLayoutChange","onClose","layoutActions","showLayoutActions","defaultTag","Typography","align","gutterBottom","noWrap","lines","tabularNums","component","Tag","clamped","ChatAttachmentImage","nodeRef","CSSTransition","ChatAttachments","attachments","enabled","isPresetSize","Avatar","src","alt","imgProps","imgFailed","setImgFailed","showImage","avatarClassName","inlineStyle","AvatarGroup","max","total","onSurplusClick","surplusAriaLabel","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","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","useChatFileUpload","onUploadFiles","resolvedMaxFiles","getDropzoneRootProps","getDropzoneInputProps","_onClick","extra","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","initialsOf","words","word","avatarColor","seed","hash","char","PersonChip","compact","colorSeed","meta","Badge","badgeContent","vertical","horizontal","showZero","badgeAriaLabel","isZero","hidden","display","badgeClassname","INTERACTIVE","role","isOwnClick","control","nearest","box","isControlProp","splitControlProps","toControl","Card","onClick","interactive","contentRef","handleClick","Stat","hint","tone","StatGroup","minItemWidth","Chip","deleteIcon","onDelete","onKeyDownProp","onDeleteMouseDownProp","asLink","selected","deleteAriaLabel","onDeleteMouseDown","deleteBtn","iconAndLabel","trailing","clickable","onChipClick","ChipGroup","multiple","selectedValues","isSelected","option","v","DEFAULT_METER_THRESHOLDS","meterColor","share","thresholds","from","Meter","ofLabel","hideText","LazyImage","fallback","aspectRatio","onError","failed","setFailed","setVisible","imgRef","setRefs","io","showFallback","handleError","ThumbCard","caption","onSelect","hoverPreview","topStart","topEnd","hoverDelay","onClickProp","onMouseEnterProp","onMouseLeaveProp","preview","setPreview","timer","clearTimer","onEnter","onLeave","selects","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","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","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","previous","ImagesListItemModal","ImagesList","portalRoot","setPortalRoot","cssLength","Kanban","columnWidth","KanbanColumn","accent","empty","titleId","hasCards","KanbanCard","titleLines","ListItem","dense","divider","List","subheader","DescriptionItem","term","DescriptionList","termWidth","TablePagination","limit","page","onPrev","onNext","limitOptions","onLimitChange","hasNextPage","isInfiniteMode","isDisabledNext","handleLimitChange","handlePrev","handleNext","renderCountText","to","opt","ColumnLabels","listener","column","at","owner","TableLabelsContext","TableHeadContext","TableColumnContext","TableRowPlaceContext","cellSpan","colSpan","cellRowSpan","rowSpan","placeRow","cells","taken","cell","span","until","sameRowPlace","a","b","sameCellPlace","usePlaces","same","cache","place","kept","useRowPlaces","useCellPlaces","mapElements","nodes","map","cloneElement","elementsOf","withRows","stacked","rowType","keep","withColumns","textOf","collect","Table","hovered","paginationSettings","isLoading","stickyHeader","stackBelow","TableRow","expanded","TableBody","noSubscribe","TableCell","cellAlign","ownDataLabel","inHead","fromHead","read","headLabel","dataLabel","TableHead","useColumnLabel","labelling","TableHeadCell","isSortedByAsc","isSortedByDesc","sortable","sortDirection","onSort","ariaSort","labelled","TreeView","listIcon","nodeIcon","defaultExpanded","onExpandedChange","defaultSelected","onSelectedChange","selectable","checkboxes","renderLabel","loadChildren","loadedChildren","setLoadedChildren","loadingIds","setLoadingIds","expandedIds","setExpandedIds","lastToggledRef","selectedIds","setSelectedIds","changed","toggleExpanded","has","toggleSelected","ensureLoaded","nodeId","renderNode","path","resolvedChildren","isLazy","hasChildNodes","onLabelClick","idx","tree","d","Timeline","stickyLabels","TimelineGroup","TimelineItem","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","heading","ProgressIndicator","progressValue","valueLabel","ariaProps","percent","CircularProgress","sizeClass","sizeStyle","bar","outer","defaultText","circleRef","circleRadius","circleLength","ConfirmDialog","subject","danger","onCancel","subjectId","messageId","ICON_SIZE","EmptyState","useSnackbarsPortal","domElement","setDomElement","v4","SnackTransition","snack","autoClose","autoCloseTime","snackRest","onSnackRemove","Snackbar","_d","_e","SnackbarContext","SnackbarProvider","closeOnClick","snacks","setSnacks","snackbarDomRoot","addSnackbar","clearAllSnackbars","clearFirstSnackbar","clearLastSnackbar","clearByIdSnackbar","currentPositions","acc","currentPosition","snackbars","TransitionGroup","isAutoClose","action","timerClose","setCloseTimer","Element","useSnackbar","useDismissOnEscape","onDismiss","dismiss","TooltipPopup","reference","offsetMiddleware","hasFocusRing","Tooltip","trigger","setReference","hoverOpen","setHoverOpen","clickOpen","setClickOpen","pointerInsideRef","focusInsideRef","isVisible","onPointerEnter","onPointerLeave","ButtonGroup","_f","cancelToggle","checked","forgetCancelledToggle","toggled","Checkbox","forwardedRef","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","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","linkElement","linkProps","optionRenderer","link","MenuItemIcon","MenuItemText","inset","classnames","MenuDivider","ENABLED_ITEM_SELECTOR","MenuList","submenu","listRole","divProps","buildMenuFloatingMiddleware","defaultStyle","transitionStyles","MenuFloating","anchorElement","menuElement","setMenuElement","menuRef","onAnchorKeyDown","onAwayClick","Transition","state","MenuSubmenu","toggleElement","onCloseProp","openOnHover","setAnchorElement","focusRequest","setFocusRequest","panelRef","floatingRef","contextValue","toggleProps","toggleRef","onToggle","onToggleKeyDown","onToggleMouseEnter","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","calendarRef","anchorForkRef","calendarForkRef","onViewValueChange","onMonthChange","onYearChange","panelOpen","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","isImageFile","file","Preview","handleRemoveAll","previewCols","galleryItemSize","previewClassName","previewClasses","CountPreview","filesLength","PreviewWrapper","FileDrop","onDropProp","dropzoneOptions","setFiles","acceptedFiles","wrapperClasses","FileInput","onFilesSelected","buttonClassName","accepted","RadioButton","Rating","precision","emptyIcon","hover","setHover","valueFromEvent","starIndex","left","isLeftHalf","handleSelect","filledIcon","blankIcon","commit","valueText","fillRatio","dropdownOptionId","listboxId","keepInView","inner","DropdownOption","MenuSearchInput","inputProps","ownRef","DropdownMenu","menuMaxHeight","menuMiddleware","search","onSearchInputChange","searchValue","anchorElementRef","menuNoItemsMessage","createOption","virtualized","labelledBy","showActive","searchInputProps","searchInputRef","valueArray","hasGroups","optionCount","useVirtual","totalHeight","offsetY","menuElementRef","forkedMenuRef","scrollerRef","optionProps","renderGroups","lastGroup","run","flush","menuMinWidth","setMenuMinWidth","scroller","createNode","firstOption","isEnabled","lastOption","moveOption","steps","result","matchOption","texts","query","repeated","SelectArrowIcon","ClearIcon","stopEvent","findSelectedItems","filterItems","searchText","isPrintableKey","SelectField","menuContainer","chips","isFocusedProp","onSearch","resetSearch","hideSelectArrowIcon","clearable","creatable","onCreate","valueState","setValueState","ownSelectedItems","setOwnSelectedItems","setSearchValue","setActiveIndex","setShowActive","typeaheadRef","controlRef","forkedControlRef","searchWrapperRef","menuSearchInputRef","selectedItems","valueId","valueIds","chipIds","controlLabelledBy","hasSearchInput","displayedItems","closeMenu","createIndex","isOptionEnabled","currentActive","activeDescendant","isItemSelected","initialActive","pointerActive","openMenu","byKeyboard","setSelectedItems","updateValue","chooseItem","toggleOff","newValue","newSelectedItem","itemIndex","chooseActive","moveActive","typeahead","onComboboxKeyDown","kind","isControl","canCreate","hasFocus","onDeleteChip","currentValue","refocus","newSelectedItems","onResetSelected","displayValues","canClear","comboboxProps","toPercent","precisionRound","factor","decimatedClamp","prec","decimatedOffset","decimatedRange","rescale","scaled","THUMB_WORDS","resolveMarks","marks","s","RangeSlider","ariaLabelledBy","getAriaValueText","valueField","withTicks","thumbWordId","isVertical","normalize","arr","lo","hi","activeThumb","isPressedRef","markList","positionToValue","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","handleFocus","handleBlur","fieldText","setFieldText","onFieldChange","commitField","snapped","pct","thumbStyle","getTicks","t","Slider","formatReadout","readout","ValueSlider","onReset","resetLabel","sliderProps","hasReadout","showHeader","Toggle","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","RESIZE_DIRS","RESIZE_ORDER","viewportOf","DEFAULT_POSITION","DEFAULT_SIZE","FloatingWindow","positionProp","defaultPosition","onPositionChange","onMoveEnd","sizeProp","defaultSize","onResizeEnd","minWidth","minHeight","maxHeight","keepVisible","moveStep","zIndex","onActivate","collapsible","movable","moveHandleAriaLabel","setPosition","setSize","clampRect","rectIn","vp","maxW","maxH","fitRect","placed","setPlaced","rectRef","commitRect","gesture","commitRectRef","onViewportResize","activate","onRootPointerDown","move","onMoveHandlePointerDown","onMoveHandlePointerMove","endMove","resize","onResizePointerDown","dir","onResizePointerMove","sign","dx","dy","endResize","endKeyboardGesture","resized","onMoveHandleKeyDown","onResizeHandleKeyDown","toggleCollapsed","windowStyle","flexAlign","resolveGap","Stack","justify","Page","PageHeader","breadcrumbs","HelpHint","SectionHeader","level","help","helpLabel","Heading","AppLayout","sidebar","sidebarWidth","sidebarCollapsed","defaultSidebarCollapsed","onSidebarCollapsedChange","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","AUTO_MAX_STEPS","Stepper","activeStep","alternativeLabel","onStepClick","auto","stepper","completed","onStepKeyDown","OverflowMenu","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","tag","easeInOutSin","animate","property","ease","cancelled","cancel","defaultIndicatorStyle","SCROLL_PAGE","Tabs","indicatorContent","scrollable","scrollButtons","scrollBackAriaLabel","scrollForwardAriaLabel","mounted","setMounted","indicatorStyle","setIndicatorStyle","tabsRef","tabListRef","viewNextTabInPixels","getTabsMeta","tabsNode","tabsMeta","tabMeta","tabContentMeta","tab","updateIndicatorState","startValue","newIndicatorStyle","dStart","dSize","scroll","scrollValue","updateOverflow","scrollByPage","scrollSelectedIntoView","nextScrollStart","window","resizeObserver","tabs","showScrollButtons"],"mappings":"iXAGO,MAAMA,EAAc,CAIzB,YAAYC,EAAU,CAHtB,KAAQ,IAAqB,CAAA,EAI3B,KAAK,OAASA,CAChB,CAEO,SAASA,EAAU,CACxB,GAAI,KAAK,QAAUA,EAGnB,MAAK,OAASA,EACd,UAAWC,KAAM,KAAK,IACpBA,EAAGD,CAAK,EAEZ,CAEA,IAAW,OAAW,CACpB,OAAO,KAAK,MACd,CAEO,UAAUC,EAA+B,CAC9C,YAAK,IAAI,KAAKA,CAAE,EACT,IAAM,CACX,KAAK,IAAM,KAAK,IAAI,OAAQC,GAAMA,IAAMD,CAAE,CAC5C,CACF,CACF,CC7BO,SAASE,GAAiBC,EAA8B,CAC7D,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAYH,EAAW,KAAK,EAClDI,OAAAA,EAAAA,UAAU,KACRF,EAAOF,EAAW,KAAK,EAChBA,EAAW,UAAUE,CAAM,GACjC,CAACF,CAAU,CAAC,EACRC,CACT,CCDO,SAASI,GAAoBC,EAA8BC,EAAmC,EAClG,OAAO,QAAW,YAAcC,EAAM,UAAYA,EAAM,iBAAiBF,EAAQC,CAAI,CACxF,CCLO,IAAKE,IAAAA,IACVA,EAAA,KAAO,OACPA,EAAA,MAAQ,QAFEA,IAAAA,IAAA,CAAA,CAAA,EAKZ,MAAMC,GAAkB,aAElBC,GAAkB,IAAIhB,GAAkB,OAAA,EAExCiB,GAAW,IAAM,CACrB,MAAMC,EAAQd,GAAcY,EAAe,EAErCG,EAAcC,EAAAA,OAAO,EAAI,EAC/BV,GAAoB,IAAM,CACxB,MAAMW,EAAa,aAAa,QAAQN,EAAe,EACvD,GAAII,EAAY,QAEd,GADAA,EAAY,QAAU,GAClBE,EACFL,GAAgB,SAASK,CAAU,EACnC,SAAS,gBAAgB,QAAQ,MAAQA,MACpC,CACL,MAAMC,EAAsB,OAAO,WAAW,+BAA+B,EAAE,QAC3E,QACA,OACAD,IAAeH,GACjBF,GAAgB,SAASM,CAAY,EAEvC,aAAa,QAAQP,GAAiBO,CAAY,EAClD,SAAS,gBAAgB,QAAQ,MAAQA,CAC3C,CAEJ,EAAG,CAACJ,CAAK,CAAC,EAEV,MAAMK,EAAgB,SAAUC,EAAqB,CACnD,GAAIA,EAAM,cAAgB,aAAc,CACtC,MAAMH,EAAa,aAAa,QAAQN,EAAe,EACvD,SAAS,gBAAgB,QAAQ,MAAQM,EACzCL,GAAgB,SAASK,CAAU,CACrC,CACF,EAEAZ,OAAAA,EAAAA,UAAU,KACR,OAAO,iBAAiB,UAAWc,CAAa,EACzC,IAAM,OAAO,oBAAoB,UAAWA,CAAa,GAC/D,CAAA,CAAE,EAEE,CACL,MAAAL,EACA,SAAWjB,GAAiB,CAC1B,aAAa,QAAQc,GAAiBd,CAAK,EAC3Ce,GAAgB,SAAS,KAAKA,EAAe,EAAEf,CAAK,EACpD,SAAS,gBAAgB,QAAQ,MAAQA,CAC3C,CAAA,CAEJ,ECpCO,SAASwB,GAAwB,CACtC,MAAAxB,EACA,aAAAyB,EACA,SAAAC,CACF,EAAmE,CACjE,MAAMC,EAAe3B,IAAU,OACzB,CAAC4B,EAAUC,CAAW,EAAItB,EAAAA,SAAYkB,CAAY,EAElDK,EAAUH,EAAgB3B,EAAc4B,EAGxCG,EAAaZ,EAAAA,OAAOW,CAAO,EACjCC,EAAW,QAAUD,EACrB,MAAME,EAAcb,EAAAA,OAAOO,CAAQ,EACnCM,EAAY,QAAUN,EAEtB,MAAMO,EAAWC,EAAAA,YACdC,GAAqB,OACpB,MAAMC,EAAOL,EAAW,QAClBM,EAAW,OAAOF,GAAS,WAAcA,EAAqBC,CAAI,EAAID,EAEvER,GACHE,EAAYQ,CAAQ,GAEtBC,EAAAN,EAAY,UAAZ,MAAAM,EAAA,KAAAN,EAAsBK,EACxB,EACA,CAACV,CAAY,CAAA,EAGf,MAAO,CAACG,EAASG,CAAQ,CAC3B,CC5CO,SAASM,GAAMC,EAAiBC,EAAS,OAAgB,CAC9D,MAAMC,EAAYC,EAAAA,MAAA,EAClB,OAAOH,GAAA,KAAAA,EAAU,GAAGC,CAAM,IAAIC,EAAU,QAAQ,OAAQ,EAAE,CAAC,EAC7D,CCTO,MAAME,GACX,uIAeK,SAASC,GACdC,EACA,CAAE,OAAAC,EAAQ,aAAAC,EAAe,GAAM,UAAAC,EAAY,IACrC,CACN,MAAMC,EAAc/B,EAAAA,OAA2B,IAAI,EAEnDX,EAAAA,UAAU,IAAM,CACd,GAAI,CAACuC,EACH,OAEF,MAAMI,EAAYL,EAAa,QAC/B,GAAI,CAACK,EACH,OAGFD,EAAY,QAAU,SAAS,cAE/B,MAAME,EAAa,IACjB,MAAM,KAAKD,EAAU,iBAA8BP,EAAS,CAAC,EAAE,OAC5DS,GAAOA,EAAG,eAAiB,MAAQA,IAAO,SAAS,aAAA,EAGxD,GAAIJ,EAAW,CACb,MAAMK,EAAQF,EAAA,EAAa,CAAC,GAC3BE,GAAA,KAAAA,EAASH,GAAW,MAAM,CAAE,cAAe,GAAM,CACpD,CAEA,MAAMI,EAAahC,GAAyB,CAC1C,GAAIA,EAAM,MAAQ,MAChB,OAEF,MAAMiC,EAAQJ,EAAA,EACd,GAAII,EAAM,SAAW,EAAG,CACtBjC,EAAM,eAAA,EACN,MACF,CACA,MAAM+B,EAAQE,EAAM,CAAC,EACfC,EAAOD,EAAMA,EAAM,OAAS,CAAC,EAC7BE,EAAW,SAAS,cAEtBnC,EAAM,UAAYmC,IAAaJ,GACjC/B,EAAM,eAAA,EACNkC,EAAK,MAAA,GACI,CAAClC,EAAM,UAAYmC,IAAaD,GACzClC,EAAM,eAAA,EACN+B,EAAM,MAAA,GACIH,EAAU,SAASO,CAAQ,IACrCnC,EAAM,eAAA,EACN+B,EAAM,MAAA,EAEV,EAEA,gBAAS,iBAAiB,UAAWC,EAAW,EAAI,EAC7C,IAAM,CACX,SAAS,oBAAoB,UAAWA,EAAW,EAAI,EACnDP,GAAgBE,EAAY,SAC9BA,EAAY,QAAQ,MAAM,CAAE,cAAe,GAAM,CAErD,CACF,EAAG,CAACH,EAAQE,EAAWD,EAAcF,CAAY,CAAC,CACpD,CCzDO,SAASa,GAAkB,CAChC,MAAAC,EACA,YAAAC,EACA,OAAAC,EACA,YAAAC,EAAc,aACd,KAAAC,EAAO,GACP,WAAAC,CACF,EAA6B,CAC3B,OAAO/B,EAAAA,YACJX,GAAyB,CACxB,GAAIqC,IAAU,EACZ,OAEF,MAAMM,EAAQH,IAAgB,cAAgBA,IAAgB,OACxDI,EAAOJ,IAAgB,YAAcA,IAAgB,OACrD5B,EAAQ+B,GAAS3C,EAAM,MAAQ,cAAkB4C,GAAQ5C,EAAM,MAAQ,YACvEa,EAAQ8B,GAAS3C,EAAM,MAAQ,aAAiB4C,GAAQ5C,EAAM,MAAQ,UAE5E,IAAI6C,EAAwB,KAU5B,GATIjC,EACFiC,EAASP,EAAc,EACdzB,EACTgC,EAASP,EAAc,EACdtC,EAAM,MAAQ,OACvB6C,EAAS,EACA7C,EAAM,MAAQ,QACvB6C,EAASR,EAAQ,GAEfQ,IAAW,KACb,OAGF,MAAMC,EAASC,GAAeN,GAAQM,EAAIV,GAASA,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAQ,EAAGU,CAAC,CAAC,EAG7F,GAFAF,EAASC,EAAMD,CAAM,EAEjBH,EAAY,CACd,IAAIM,EAAQ,EACZ,MAAMC,EAAOrC,GAAQZ,EAAM,MAAQ,OAAS,EAAI,GAChD,KAAO0C,EAAWG,CAAM,GAAKG,EAAQX,GACnCQ,EAASC,EAAMD,EAASI,CAAI,EAC5BD,GAAS,EAEX,GAAIN,EAAWG,CAAM,EACnB,MAEJ,CAEA7C,EAAM,eAAA,EACNuC,EAAOM,CAAM,CACf,EACA,CAACR,EAAOC,EAAaC,EAAQC,EAAaC,EAAMC,CAAU,CAAA,CAE9D,CC1CO,SAASQ,GAAe,CAC7B,UAAAC,EACA,WAAAC,EACA,eAAAC,EACA,SAAAC,EAAW,CACb,EAA+C,CAC7C,KAAM,CAACC,EAAWC,CAAY,EAAIxE,EAAAA,SAAS,CAAC,EAEtCyE,EAAW9C,cAAaX,GAAoD,CAChFwD,EAAaxD,EAAM,cAAc,SAAS,CAC5C,EAAG,CAAA,CAAE,EAEL,OAAO0D,EAAAA,QAAQ,IAAM,CACnB,MAAMC,EAAiBP,EAAa,EAAIA,EAAa,EAC/CQ,EAAe,KAAK,KAAKP,EAAiBM,CAAc,EACxDE,EAAa,KAAK,IAAI,EAAG,KAAK,MAAMN,EAAYI,CAAc,EAAIL,CAAQ,EAC1EQ,EAAW,KAAK,IAAIX,EAAWU,EAAaD,EAAeN,EAAW,CAAC,EAE7E,MAAO,CACL,WAAAO,EACA,SAAAC,EACA,YAAaX,EAAYQ,EACzB,QAASE,EAAaF,EACtB,SAAAF,CAAA,CAEJ,EAAG,CAACN,EAAWC,EAAYC,EAAgBC,EAAUC,EAAWE,CAAQ,CAAC,CAC3E,CC/BO,SAASM,GAAiBC,EAAyC,CACxE,GAAIA,IAAc,QAAUA,IAAc,cAAgBA,IAAc,WAAY,CAClF,MAAMC,EAAYD,IAAc,aAAe,QAAUA,IAAc,WAAa,MAAQ,KAE5F,MAAO,CAAE,eAAgBE,GAAAA,cAAc,CAAE,UAAAD,CAAA,CAAW,CAAA,CACtD,CAEA,MAAO,CAAE,UAAAD,CAAA,CACX,CAEA,MAAMG,GAAqB,EACrBC,GAA4B,EAE3B,SAASC,GAAwBvD,EAA6BwD,EAAqC,CACxG,OAAIA,GAAA,MAAAA,EAAQ,OACH,CAAC,GAAGA,EAAQC,QAAA,EAAQC,GAAAA,MAAM,CAAE,QAASJ,EAAA,CAA2B,CAAC,EAEtEtD,EAAS,eACJ,CAAC2D,GAAAA,OAAON,EAAkB,EAAGK,GAAAA,MAAM,CAAE,QAASJ,EAAA,CAA2B,EAAGtD,EAAS,cAAc,EAErG,CAAC2D,GAAAA,OAAON,EAAkB,EAAGI,GAAAA,KAAA,EAAQC,GAAAA,MAAM,CAAE,QAASJ,EAAA,CAA2B,CAAC,CAC3F,CCiBA,MAAMM,GAA+B,eAC/BC,GAAoB,EACpBC,GAAmB,EAEnBC,GAAgB,CAAC,CAAE,EAAAC,EAAG,EAAAC,MAA4B,CACtD,EAAAD,EACA,EAAAC,EACA,IAAKA,EACL,KAAMD,EACN,MAAOA,EACP,OAAQC,EACR,MAAO,EACP,OAAQ,CACV,GAgBO,SAASC,GAAgBC,EAAgC,GAA2B,CACzF,KAAM,CACJ,UAAAjB,EAAYU,GACZ,SAAAQ,EAAWP,GACX,UAAAQ,EAAY,EACZ,WAAAC,EAAa,EACb,WAAAC,CAAA,EACEJ,EAEE,CAACK,EAAMC,CAAO,EAAIvG,EAAAA,SAAS,EAAK,EAEhCwG,EAAY5F,EAAAA,OAA0B,CAAE,EAAG,EAAG,EAAG,EAAG,EACpD6F,EAAY7F,EAAAA,OAA0B,CAAE,EAAG,EAAG,EAAG,EAAG,EACpD8F,EAAc9F,EAAAA,OAAuB,IAAI,EACzC+F,EAAe/F,EAAAA,OAA6C,IAAI,EAChEgG,EAAgBhG,EAAAA,OAA6C,IAAI,EAEjEkB,EAAWiD,GAAiBC,CAAS,EAErC6B,EAAqBnC,EAAAA,QACzB,IAAM,CACJe,GAAAA,OAAO,CAAE,SAAUS,EAAU,UAAWA,EAAU,EAClD,GAAIpE,EAAS,eAAiB,CAACA,EAAS,cAAc,EAAI,CAACyD,GAAAA,MAAM,EACjEC,SAAM,CAAE,QAASI,GAAkB,EACnC,GAAIS,GAAA,KAAAA,EAAc,CAAA,CAAC,EAErB,CAACH,EAAUpE,EAAS,eAAgBuE,CAAU,CAAA,EAG1C,CAAE,KAAAS,EAAM,eAAAC,EAAgB,OAAAC,CAAA,EAAWC,GAAAA,YAAY,CACnD,KAAAX,EACA,UAAWxE,EAAS,UACpB,qBAAsBoF,GAAAA,WACtB,WAAYL,CAAA,CACb,EAEKM,EAAmBzC,EAAAA,QACvB,KAAO,CAAE,sBAAuB,IAAMmB,GAAcY,EAAU,OAAO,CAAA,GACrE,CAAA,CAAC,EAGGW,EAAczF,EAAAA,YAAY,IAAM,CAChCgF,EAAa,UAAY,OAC3B,aAAaA,EAAa,OAAO,EACjCA,EAAa,QAAU,MAErBC,EAAc,UAAY,OAC5B,aAAaA,EAAc,OAAO,EAClCA,EAAc,QAAU,KAE5B,EAAG,CAAA,CAAE,EAEL3G,EAAAA,UAAU,IAAM,IAAMmH,IAAe,CAACA,CAAW,CAAC,EAIlDnH,EAAAA,UAAU,IAAM,OACTqG,IACLQ,EAAK,sBAAqB/E,EAAA2E,EAAY,UAAZ,KAAA3E,EAAuBoF,CAAgB,EAC5DH,EAAA,EACP,EAAG,CAACV,EAAMQ,EAAME,EAAQG,CAAgB,CAAC,EAEzC,MAAME,EAAe1F,EAAAA,YAAY,IAAM,CACjC+E,EAAY,UAAY,OAAMD,EAAU,QAAUD,EAAU,QAClE,EAAG,CAAA,CAAE,EAECc,EAAU3F,EAAAA,YAAY,IAAM,CAChCyF,EAAA,EACAC,EAAA,EACAd,EAAQ,EAAI,CACd,EAAG,CAACa,EAAaC,CAAY,CAAC,EAExBE,EAAe5F,EAAAA,YAAY,IAAM,CAErC,GADAyF,EAAA,EACIjB,GAAa,EAAG,CAClBkB,EAAA,EACAd,EAAQ,EAAI,EACZ,MACF,CACAI,EAAa,QAAU,WAAW,IAAM,CACtCU,EAAA,EACAd,EAAQ,EAAI,CACd,EAAGJ,CAAS,CACd,EAAG,CAACiB,EAAaC,EAAclB,CAAS,CAAC,EAEnCqB,EAAgB7F,EAAAA,YAAY,IAAM,CAEtC,GADAyF,EAAA,EACIhB,GAAc,EAAG,CACnBG,EAAQ,EAAK,EACb,MACF,CACAK,EAAc,QAAU,WAAW,IAAML,EAAQ,EAAK,EAAGH,CAAU,CACrE,EAAG,CAACgB,EAAahB,CAAU,CAAC,EAEtBqB,EAAQ9F,EAAAA,YAAY,IAAM,CAC9ByF,EAAA,EACAb,EAAQ,EAAK,CACf,EAAG,CAACa,CAAW,CAAC,EAEVM,EAAmB/F,cAAagG,GAA6B,CACjEjB,EAAY,QAAU,KACtBD,EAAU,QAAUkB,CACtB,EAAG,CAAA,CAAE,EAECC,EAAcjG,cAAakG,GAA4B,CAC3DnB,EAAY,QAAUmB,CACxB,EAAG,CAAA,CAAE,EAECC,EAAcnG,EAAAA,YACjBX,GAA6B,CAC5BwF,EAAU,QAAU,CAAE,EAAGxF,EAAM,QAAS,EAAGA,EAAM,OAAA,EACjDuG,EAAA,CACF,EACA,CAACA,CAAY,CAAA,EAGTQ,EAAapG,cAAaX,GAA6B,CAC3DwF,EAAU,QAAU,CAAE,EAAGxF,EAAM,QAAS,EAAGA,EAAM,OAAA,CACnD,EAAG,CAAA,CAAE,EAECgH,EAAoBrG,EAAAA,YACvBsG,IAAkB,CACjB,eAAiBjH,GAAU,QACzBe,EAAAkG,GAAA,YAAAA,EAAc,iBAAd,MAAAlG,EAAA,KAAAkG,EAA+BjH,GAC/B8G,EAAY9G,CAAK,CACnB,EACA,cAAgBA,GAAU,QACxBe,EAAAkG,GAAA,YAAAA,EAAc,gBAAd,MAAAlG,EAAA,KAAAkG,EAA8BjH,GAC9B+G,EAAW/G,CAAK,CAClB,EACA,eAAiBA,GAAU,QACzBe,EAAAkG,GAAA,YAAAA,EAAc,iBAAd,MAAAlG,EAAA,KAAAkG,EAA+BjH,GAC/BwG,EAAA,CACF,CAAA,GAEF,CAACM,EAAaC,EAAYP,CAAa,CAAA,EAGnCU,EAAcvG,EAAAA,YAAY,IAAM,CACpCyF,EAAA,EACAb,EAAQ,EAAI,CACd,EAAG,CAACa,CAAW,CAAC,EAEVe,EAAmBxG,EAAAA,YACtByG,IAAe,CACd,IAAKtB,EAAK,YACV,MAAO,CAAE,GAAGC,EAAgB,GAAGqB,GAAA,YAAAA,EAAW,KAAA,EAC1C,eAAgBF,EAChB,eAAgBV,CAAA,GAElB,CAACV,EAAMC,EAAgBmB,EAAaV,CAAa,CAAA,EAGnD,MAAO,CACL,KAAAlB,EACA,kBAAA0B,EACA,iBAAAG,EACA,YAAAP,EACA,iBAAAF,EACA,QAAAJ,EACA,aAAAC,EACA,cAAAC,EACA,MAAAC,CAAA,CAEJ,CC1NA,SAASY,GAAeC,EAAuD,CAC7E,GAAKA,EACL,OAAI,OAAOA,GAAW,SAAiBA,EAChC,OAAO,QAAQA,CAAM,EACzB,QAAQ,CAAC,CAACC,EAAMC,CAAI,IAAM,CAACD,EAAM,GAAGC,CAAI,CAAC,EACzC,KAAK,GAAG,CACb,CAUO,SAASC,GAAYC,EAA2B,GAAmB,CACxE,MAAMC,EAAWtI,EAAM,OAAyB,IAAI,EAC9C,CAACuI,EAAcC,CAAe,EAAIxI,EAAM,SAAS,EAAK,EAGtDyI,EAAazI,EAAM,OAAOqI,CAAO,EACvCI,EAAW,QAAUJ,EAErB,MAAMpC,EAAOjG,EAAM,YAAY,IAAY,OACpCyI,EAAW,QAAQ,WAAU/G,EAAA4G,EAAS,UAAT,MAAA5G,EAAkB,OACtD,EAAG,CAAA,CAAE,EAECgH,EAAc1I,EAAM,YAAY,CAAC2I,EAAuBhI,IAA8C,CAC1G,GAAI,CAACgI,EAAM,OACX,KAAM,CAAE,SAAAC,EAAU,OAAAC,EAAQ,eAAAC,CAAA,EAAmBL,EAAW,QACxD,IAAIM,EAAQ,MAAM,KAAKJ,CAAI,EACvBC,GAAYA,EAAW,MAAWG,EAAM,MAAM,EAAGH,CAAQ,GAC7DC,GAAA,MAAAA,EAASE,EAAOpI,GAChBmI,GAAA,MAAAA,EAAiBC,EAAOpI,EAC1B,EAAG,CAAA,CAAE,EAECqI,EAAehJ,EAAM,YACzB,KAA0B,CACxB,QAAS,IAAMiG,EAAA,EACf,WAAatF,GAAU,CACrBA,EAAM,eAAA,EACD8H,EAAW,QAAQ,YAA0B,EAAI,CACxD,EACA,YAAa,IAAMD,EAAgB,EAAK,EACxC,OAAS7H,GAAU,SACjBA,EAAM,eAAA,EACN6H,EAAgB,EAAK,EAChBC,EAAW,QAAQ,aAAsBQ,GAAAvH,EAAAf,EAAM,eAAN,YAAAe,EAAoB,QAApB,KAAAuH,EAA6B,KAAMtI,CAAK,CACxF,CAAA,GAEF,CAAC+H,EAAazC,CAAI,CAAA,EAGdiD,EAAgBlJ,EAAM,YAC1B,KAA2B,CACzB,KAAM,OACN,SAAUyI,EAAW,QAAQ,SAC7B,OAAQT,GAAeS,EAAW,QAAQ,MAAM,EAChD,SAAUA,EAAW,QAAQ,SAC7B,MAAO,CAAE,QAAS,MAAA,EAClB,IAAKH,EACL,SAAW3H,GAAU+H,EAAY/H,EAAM,cAAc,MAAOA,CAAK,CAAA,GAEnE,CAAC+H,CAAW,CAAA,EAGd,MAAO,CAAE,aAAAM,EAAc,cAAAE,EAAe,SAAAZ,EAAU,aAAAC,EAAc,KAAAtC,CAAA,CAChE,CCjGO,MAAMkD,GAAcC,EAAAA,cAAuC,IAAI,EA2B/D,SAASC,GAAa,CAAE,OAAAC,EAAQ,MAAAC,EAAO,SAAAC,GAA+B,CAI3EnF,EAAAA,QAAQ,IAAM,CACRkF,oBAAqBA,CAAK,CAChC,EAAG,CAACA,CAAK,CAAC,EAEV,MAAMnK,EAAQiF,EAAAA,QAA0B,KAAO,CAAE,OAAAiF,IAAW,CAACA,CAAM,CAAC,EACpE,OAAOG,EAAAA,IAACN,GAAY,SAAZ,CAAqB,MAAA/J,EAAe,SAAAoK,CAAA,CAAS,CACvD,CAEA,MAAME,GAAsB,IAAkBC,GAAAA,cAAA,EAAgB,OAMvD,SAASC,GAAcC,EAAmC,OAC/D,MAAMC,EAAUC,EAAAA,WAAWZ,EAAW,EAChCa,EAAaC,EAAAA,qBAAqBC,kBAAgBR,GAAqBA,EAAmB,EAChG,OAAOhI,EAAAmI,GAAA,KAAAA,EAAYC,GAAA,YAAAA,EAAS,SAArB,KAAApI,EAA+BsI,CACxC,CClDA,MAAMG,GAAe,CAAC,UAAW,YAAa,QAAS,UAAW,UAAW,OAAQ,UAAU,EAEzFC,OAAa,IAEnB,SAASC,GAAYC,EAAoB,CACnC,CAACX,GAAAA,cAAA,EAAgB,eAAiBS,GAAO,IAAIE,CAAI,IACrDF,GAAO,IAAIE,CAAI,EAEf,QAAQ,KACN,gBAAgBA,CAAI,8CAA8CA,CAAI,wFAAA,EAG1E,CAgDO,MAAMC,GAAOC,EAAAA,WAAuC,SACzD,CACE,UAAAC,EACA,OAAAC,EAAS,IACT,KAAAC,EAAO,EACP,KAAAC,EAAO,GACP,MAAAC,EAAQ,IACR,KAAAP,EACA,MAAAQ,EAAQ,UACR,MAAAC,EACA,OAAAzB,EACA,cAAe0B,EAAa,OAC5B,GAAGC,CACL,EACAC,EACA,WACA,MAAMC,EAAiBvB,GAAcN,CAAM,EACrC8B,EAAS,OAAOd,GAAS,SAAWA,EAAO,KAI3Ce,EAAc,IAAA,OAAO,OAAAD,IAAW,KAAO,MAAQE,EAAAA,GAAAA,QAAQF,CAAM,IAAdE,KAAAA,EAAmB,MAClEC,EAAatB,EAAAA,qBAAqBC,kBAAgBmB,EAAaA,CAAW,EAC1EG,EAAa,OAAOlB,GAAS,SAAWA,EAAOiB,EAC/CE,EAAQ,OAAOnB,GAAS,SAAWA,EAAOA,EAAK,KAE/CoB,EACJP,IAAmB,SAAW,SAAWK,EAAa,OAASL,IAAmB,OAAS,UAAY,SACrGO,IAAS,WAAWrB,GAAYoB,CAAK,EAEzC,MAAME,EAAa,EAAEZ,GAASE,EAAM,YAAY,GAAKA,EAAM,iBAAiB,GACtEW,EAAad,GAASX,GAAa,SAASW,CAAK,EAAI,mBAAmBA,CAAK,GAAK,KAClFe,EAAU,OAAOjB,GAAS,SAAW,GAAGA,CAAI,KAAOA,EACnDkB,EAAc,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGpB,EAAS,GAAG,CAAC,EAAI,GAAG,EAAI,IAE/E,OACEjB,EAAAA,IAAC,OAAA,CACE,GAAGwB,EACJ,IAAAC,EACA,cAAaF,EACb,mBAAkBU,EAIlB,MAAMhK,EAAAuJ,EAAM,OAAN,KAAAvJ,EAAeiK,EAAa,OAAY,MAC9C,cAAaA,EAAa,GAAOV,EAAM,aAAa,EACpD,aAAYF,GAASE,EAAM,YAAY,EACvC,MAAAF,EACA,MAAO,CACL,GAAGE,EAAM,MACT,GAAIS,IAAS,SACT,CAAE,sBAAuB,UAAUf,CAAI,YAAYD,CAAM,YAAYG,CAAK,aAAA,EAC1E,IAAA,EAEN,UAAWkB,EAAG,qBAAsBH,EAAYnB,CAAS,EAExD,SAAAiB,IAAS,SACRjC,EAAAA,IAAC,OAAA,CAAK,UAAU,4BAA4B,MAAO,CAAE,SAAUoC,CAAA,EAC5D,SAAAJ,CAAA,CACH,EAEAhC,EAAAA,IAAC,MAAA,CACC,UAAU,iBACV,SAASR,EAAAuC,GAAA,YAAAA,EAAY,UAAZ,KAAAvC,EAAuB,YAChC,MAAO,CAAE,MAAO4C,EAAS,OAAQA,CAAA,EACjC,KAAK,OACL,OAAO,eACP,YAAAC,EACA,cAAc,QACd,eAAe,QACf,cAAY,OACZ,wBAAyB,CAAE,QAAQE,EAAAR,GAAA,YAAAA,EAAY,OAAZ,KAAAQ,EAAoB,EAAA,CAAG,CAAA,CAC5D,CAAA,CAIR,CAAC,ECrHYC,GAASzB,EAAAA,WAAyC,SAC7D,CAAE,UAAA0B,EAAW,UAAAzB,EAAW,QAAA0B,EAAS,OAAAC,EAAQ,SAAAC,EAAW,IAAK,MAAAvB,EAAO,cAAeE,EAAa,SAAU,GAAGsB,CAAA,EACzGpB,EACA,CACA,KAAM,CAACqB,EAASC,CAAU,EAAIxM,EAAM,SAA4B,CAAA,CAAE,EAC5DyM,EAAUzM,EAAM,OAAe,CAAC,EAIhC0M,EAAW1M,EAAM,OAAO,IAAI,GAAoC,EAEtE,OAAAA,EAAM,UAAU,IAAM,CACpB,MAAM2M,EAAUD,EAAS,QACzB,MAAO,IAAM,CACXC,EAAQ,QAASC,GAAY,aAAaA,CAAO,CAAC,EAClDD,EAAQ,MAAA,CACV,CACF,EAAG,CAAA,CAAE,EAEL3M,EAAM,oBACJkM,EACA,KAAO,CACL,SAASvL,EAAyB,CAEhC,MAAMkM,EADSlM,EAAM,cACD,sBAAA,EACdmM,EAAW,KAAK,IAAID,EAAK,MAAOA,EAAK,MAAM,EAC3CE,EAASD,EAAW,EAE1B,IAAIE,EACAC,EAEAb,GACFY,EAASH,EAAK,MAAQA,EAAK,OAAS,EAAIA,EAAK,MAAQ,EAAIE,EACzDE,EAASJ,EAAK,OAASA,EAAK,MAAQ,EAAIA,EAAK,OAAS,EAAIE,IAE1DC,EAASrM,EAAM,QAAUkM,EAAK,KAAOE,EACrCE,EAAStM,EAAM,QAAUkM,EAAK,IAAME,GAGtCP,EAAW,CACT,GAAGD,EACH9C,EAAAA,IAAC,OAAA,CAEC,UAAWsC,EAAG,qBAAsBI,GAAA,YAAAA,EAAS,KAAK,EAClD,MAAO,CACL,KAAMa,EACN,IAAKC,EACL,MAAOH,EACP,OAAQA,EACR,gBAAiBhC,CAAA,CACnB,EARK2B,EAAQ,OAAA,CASf,CACD,EAEDA,EAAQ,SAAW,EAEnB,MAAMG,EAAU,WAAW,IAAM,CAC/BF,EAAS,QAAQ,OAAOE,CAAO,EAC/BJ,EAAYU,GAAgBA,EAAY,MAAM,CAAC,CAAC,CAClD,EAAGb,CAAQ,EACXK,EAAS,QAAQ,IAAIE,CAAO,CAC9B,CAAA,GAEF,CAACR,EAAQG,EAASJ,GAAA,YAAAA,EAAS,MAAOE,EAAUvB,CAAK,CAAA,EAIjDrB,EAAAA,IAAC,OAAA,CACE,GAAG6C,EACJ,IAAApB,EACA,UAAWa,EAAG,cAAetB,EAAW0B,GAAA,YAAAA,EAAS,MAAM,EACvD,cAAanB,EACb,cAAY,OAEX,SAAAuB,CAAA,CAAA,CAGP,CAAC,ECxGM,SAASY,GACdjC,EACA9L,EACM,CACF,OAAO8L,GAAQ,WACjBA,EAAI9L,CAAK,EACA8L,IACTA,EAAI,QAAU9L,EAElB,CCRO,SAASgO,MACX3G,EACiC,CAMpC,OAAOzG,EAAM,QAAQ,IACfyG,EAAK,MAAOyE,GAAQA,GAAO,IAAI,EAC1B,KAGDmC,GAAa,CACnB5G,EAAK,QAASyE,GAAQ,CACpBiC,GAAOjC,EAAKmC,CAAQ,CACtB,CAAC,CACH,EAGC5G,CAAI,CACT,CCwBA,SAAS6G,GAASC,EAAW,CAC3B,MAAMC,EAAS,WAAWD,CAAC,EAC3B,MAAO,CAAC,MAAMC,CAAM,GAAK,SAASA,CAAM,CAC1C,CAEA,SAASC,GAAaC,EAAgB,CAEpC,OACE,OAAOA,GAAW,UAAYA,EAAOA,EAAO,OAAS,CAAC,IAAM,KAAOJ,GAASI,EAAO,UAAU,EAAGA,EAAO,OAAS,CAAC,CAAC,CAEtH,CAEA,SAASC,GAAYnG,EAAgCkG,EAAgB,CAG/DA,IAAW,IAAKlG,GAAA,MAAAA,EAAS,SAC3BA,EAAQ,MAAM,QAAU,OAE5B,CAEA,SAASoG,GAAYpG,EAAgCkG,EAAgB,CAG/DA,IAAW,IAAKlG,GAAA,MAAAA,EAAS,SAC3BA,EAAQ,MAAM,QAAU,GAE5B,CAEA,MAAMqG,GAAiD,CACrD,UAAW,gBACX,YAAa,oBACb,cAAe,sBACf,sBAAuB,gCACvB,sBAAuB,gCACvB,0BAA2B,oCAC3B,OAAQ,aACR,iBAAkB,0BAClB,iBAAkB,0BAClB,qBAAsB,6BACxB,EAEA,SAASC,GAAsBC,EAA8CL,EAAgB,CAC3F,OAAOM,EAAW,CAChB,CAACD,EAAsB,MAAM,EAAG,GAChC,CAACA,EAAsB,gBAAgB,EAAGL,IAAW,EACrD,CAACK,EAAsB,oBAAoB,EAAG,OAAOL,GAAW,UAAYA,EAAS,EACrF,CAACK,EAAsB,gBAAgB,EAAGL,IAAW,MAAA,CACtD,CACH,CAqBA,MAAMO,GAAgBzD,EAAAA,WAA+C,SACnE,CACE,eAAA0D,EAAiB,GACjB,sBAAAH,EAAwB,CAAA,EACxB,uBAAAI,EAAyB,GACzB,SAAA3E,EACA,UAAAiB,EAAY,GACZ,iBAAA2D,EACA,MAAOC,EAAY,EACnB,SAAUC,EAAe,IACzB,OAAAC,EAAS,OACT,OAAAb,EACA,qBAAAc,EACA,uBAAAC,EACA,MAAAC,EACA,GAAGzD,CACL,EACAC,EACA,CAEA,MAAMyD,EAAapO,EAAAA,OAAemN,CAAM,EAClCkB,EAAiBrO,EAAAA,OAAuB,IAAI,EAC5CsO,EAActO,EAAAA,OAAuB,IAAI,EACzCuO,EAAgB1B,GAA2BlC,EAAK2D,CAAW,EAE3DE,EAA4BxO,EAAAA,OAAA,EAC5ByO,EAAYzO,EAAAA,OAAA,EAEZ0O,EAAe1O,EAAAA,OAA8B,CACjD,GAAGsN,GACH,GAAGE,CAAA,CACJ,EAEKmB,EAAQb,EACRhC,EAAWiC,EAEjB,IAAIa,EAAqBzB,EACrB0B,EAAyB,UAEzB,OAAOD,GAAe,UAExBA,EAAa,OAAOzB,GAAW,UAAYA,EAAS,EAAI,EAAIA,EAC5D0B,EAAe,UACN3B,GAAa0B,CAAU,IAEhCA,EAAazB,IAAW,KAAO,EAAIA,EACnC0B,EAAe,UAGjB,KAAM,CAACC,EAAeC,CAAgB,EAAI3P,EAAAA,SAAiBwP,CAAU,EAC/D,CAACI,EAAUC,CAAW,EAAI7P,EAAAA,SAAmByP,CAAY,EACzD,CAACK,EAAgBC,CAAiB,EAAI/P,EAAAA,SAAkB,EAAK,EAC7D,CAACgQ,EAA0BC,CAA2B,EAAIjQ,EAAAA,SAC9DmO,GAAsBmB,EAAa,QAASvB,CAAM,CAAA,EAIpD9N,EAAAA,UAAU,IAAM,CAEd+N,GAAYiB,EAAe,QAASS,CAAa,CAInD,EAAG,CAAA,CAAE,EAGLzP,EAAAA,UAAU,IAAM,CACd,GAAI8N,IAAWiB,EAAW,SAAWC,EAAe,QAAS,CAC3DhB,GAAYgB,EAAe,QAASD,EAAW,OAAO,EAGtDC,EAAe,QAAQ,MAAM,SAAW,SACxC,MAAMiB,EAAgBjB,EAAe,QAAQ,aAC7CA,EAAe,QAAQ,MAAM,SAAW,GAGxC,MAAMkB,EAAgBzD,EAAW6C,EAEjC,IAAIa,EACAC,EACAC,GAA4B,SAC5BC,GAEJ,MAAMC,GAAsBxB,EAAW,UAAY,OAE/C,OAAOjB,GAAW,UAEpBqC,EAAYrC,EAAS,EAAI,EAAIA,EAC7BsC,EAAgBD,GACPtC,GAAaC,CAAM,GAE5BqC,EAAYrC,IAAW,KAAO,EAAIA,EAClCsC,EAAgBD,IAIhBA,EAAYF,EACZG,EAAgB,OAChBC,GAAkB,QAGhBE,KAEFH,EAAgBD,EAIhBA,EAAYF,GAId,MAAMO,GAA8BpC,EAAW,CAC7C,CAACiB,EAAa,QAAQ,SAAS,EAAG,GAClC,CAACA,EAAa,QAAQ,WAAW,EAAGN,EAAW,UAAY,QAAUjB,EAASiB,EAAW,QACzF,CAACM,EAAa,QAAQ,aAAa,EAAGvB,IAAW,QAAUA,EAASiB,EAAW,QAC/E,CAACM,EAAa,QAAQ,qBAAqB,EAAGe,IAAkB,EAChE,CAACf,EAAa,QAAQ,qBAAqB,EAAGe,IAAkB,OAChE,CAACf,EAAa,QAAQ,yBAAyB,EAAG,OAAOe,GAAkB,UAAYA,EAAgB,CAAA,CACxG,EAGKK,GAA+BvC,GAAsBmB,EAAa,QAASe,CAAa,EAK9FV,EAAiBS,CAAS,EAC1BP,EAAY,QAAQ,EACpBE,EAAkB,CAACS,EAAmB,EACtCP,EAA4BQ,EAA2B,EAGvD,aAAapB,EAAU,OAAO,EAC9B,aAAaD,EAA0B,OAAO,EAE1CoB,IAGFD,GAAwB,GAGxBlB,EAAU,QAAU,WAAW,IAAM,CACnCM,EAAiBU,CAAa,EAC9BR,EAAYS,EAAe,EAC3BP,EAAkBQ,EAAqB,EAGvCzB,GAAA,MAAAA,EAAyBuB,EAC3B,EAAG,EAAE,EAGLjB,EAA0B,QAAU,WAAW,IAAM,CACnDW,EAAkB,EAAK,EACvBE,EAA4BS,EAA4B,EAIxD1C,GAAYiB,EAAe,QAASoB,CAAa,EAEjDxB,GAAA,MAAAA,EAAuBwB,EACzB,EAAGF,CAAa,IAGhBrB,GAAA,MAAAA,EAAyBsB,GAGzBf,EAAU,QAAU,WAAW,IAAM,CACnCM,EAAiBU,CAAa,EAC9BR,EAAYS,EAAe,EAC3BP,EAAkB,EAAK,EACvBE,EAA4BS,EAA4B,EAKpD3C,IAAW,QAEbC,GAAYiB,EAAe,QAASmB,CAAS,EAG/CvB,GAAA,MAAAA,EAAuBuB,EACzB,EAAGD,CAAa,EAEpB,CAEA,OAAAnB,EAAW,QAAUjB,EAEd,IAAM,CACX,aAAasB,EAAU,OAAO,EAC9B,aAAaD,EAA0B,OAAO,CAChD,CAIF,EAAG,CAACrB,CAAM,CAAC,EAIX,MAAM4C,EAAgC,CACpC,GAAG5B,EACH,OAAQW,EACR,SAAUE,IAAYb,GAAA,YAAAA,EAAO,SAAA,EAG3Be,GAAkBtB,IACpBmC,EAAe,WAAa,UAAUjE,CAAQ,MAAMkC,CAAM,IAAIW,CAAK,KAG/DR,GAAA,MAAAA,EAAO,aACT4B,EAAe,WAAa,GAAG5B,EAAM,UAAU,KAAK4B,EAAe,UAAU,IAI/EA,EAAe,iBAAmBA,EAAe,YAGnD,MAAMC,EAA8B,CAAA,EAEhCrC,IACFqC,EAAa,WAAa,WAAWlE,CAAQ,MAAMkC,CAAM,IAAIW,CAAK,KAElEqB,EAAa,iBAAmBA,EAAa,WAEzClB,IAAkB,IACpBkB,EAAa,QAAU,IAM3B,MAAMC,EADoB,OAAOvF,EAAM,aAAa,GAAM,YACnBA,EAAM,aAAa,EAAIyC,IAAW,EAEzE,OACEjE,EAAAA,IAAC,MAAA,CACE,GAAGwB,EACJ,IAAK6D,EACL,cAAa0B,EACb,UAAW,GAAGb,CAAwB,IAAIlF,CAAS,GACnD,MAAO6F,EAEP,SAAA7G,EAAAA,IAAC,OAAI,UAAW2E,EAAkB,MAAOmC,EAAc,IAAK3B,EACzD,SAAApF,CAAA,CACH,CAAA,CAAA,CAGN,CAAC,EC/TYiH,GAAYjG,EAAAA,WAA2C,SAClE,CACE,UAAAC,EACA,MAAAM,EACA,SAAA2F,EACA,QAAAC,EAAU,SACV,gBAAAC,EAAkB,GAClB,KAAA3K,EACA,SAAA4K,EACA,KAAAC,EACA,GAAIlP,EACJ,SAAA4H,EACA,eAAAuH,EACA,aAAAC,EACA,OAAAC,EACA,KAAAC,EACA,cAAAC,EACA,cAAAC,EACA,SAAAtQ,CACF,EACAoK,EACA,CACA,MAAMnK,EAAekF,IAAS,OACxB,CAACoL,EAAcC,CAAe,EAAI3R,EAAAA,SAAkBiR,CAAe,EACnEW,EAASxQ,EAAe,CAAC,CAACkF,EAAOoL,EACjCG,EAAS7P,GAAMC,CAAM,EACrB6P,EAAY,GAAGD,CAAM,WACrBE,EAAW,GAAGF,CAAM,UAIpBG,EAAW,GAAQT,GAAQC,GAC3B,CAACS,EAASC,CAAU,EAAIlS,EAAAA,SAAkB4R,CAAM,EAClDA,GAAU,CAACK,GACbC,EAAW,EAAI,EAEjB,MAAMC,EAAepE,GAAmB,CAClCA,IAAW,GAAKyD,GAAiB,CAACI,GACpCM,EAAW,EAAK,CAEpB,EAGME,EAAaJ,EAAWnI,IAAa,OAAY,EAAQA,EAEzDwI,EAAmBjG,EAAG,6BAA8B,CAAE,oCAAqCwF,EAAQ,EAEnGU,EAAUC,GAAuD,CACrE,GAAIrB,EACF,OAEF,MAAMtP,EAAO,CAACgQ,EACTxQ,GACHuQ,EAAgB/P,CAAI,EAEtBT,GAAA,MAAAA,EAAWS,GACX6P,GAAA,MAAAA,EAAgBc,EAClB,EAEA,OACEC,EAAAA,KAAC,MAAA,CACC,IAAAjH,EACA,UAAWa,EAAG,iBAAkB,kBAAkB4E,CAAO,GAAI,CAAE,gBAAiBE,CAAA,EAAYpG,CAAS,EACrG,cAAY,YAEZ,SAAA,CAAA0H,EAAAA,KAAC,SAAA,CACC,GAAIT,EACJ,UAAU,yBACV,QAASO,EACT,KAAK,SACL,SAAApB,EACA,gBAAeU,EACf,gBAAeQ,EAAaN,EAAY,OAEvC,SAAA,CAAAV,GAAA,YAAAA,EAAiBQ,GAClBY,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAA1I,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAsB,EAAM,EAC9C2F,EAAWjH,EAAAA,IAAC,OAAA,CAAK,UAAU,2BAA4B,WAAS,EAAU,IAAA,EAC7E,EACCuH,QAAgB,OAAA,CAAK,UAAU,sBAAuB,SAAAA,EAAaO,CAAM,EAAE,EAAU,KACrF,CAACN,IAAWH,GAAA,KAAAA,EAAQrH,EAAAA,IAACc,GAAA,CAAK,UAAWyH,EAAkB,KAAK,cAAc,KAAM,EAAA,CAAI,EAAA,CAAA,CAAA,EAGtFD,SACE,MAAA,CAAI,GAAIN,EAAW,KAAK,SAAS,kBAAiBC,EACjD,SAAAjI,EAAAA,IAACwE,GAAA,CACC,OAAQsD,EAAS,OAAS,EAC1B,eAAgB,GAChB,SAAU,IACV,UAAU,0BACV,qBAAsBO,EAErB,SAAA,CAACH,GAAYC,EAAUpI,EAAW,IAAA,CAAA,CACrC,CACF,CAAA,CAAA,CAAA,CAIR,CAAC,EClEY4I,GAASpS,EAAM,WAC1B,SAAgBiL,EAAOC,EAAK,OAC1B,KAAM,CACJ,MAAAmH,EACA,QAAA1B,EAAU,YACV,KAAAG,EACA,UAAAwB,EAAY,CAAA,EACZ,KAAAC,EACA,UAAA9H,EACA,SAAAoG,EACA,SAAArH,EACA,YAAagJ,EAEb,cAAeC,EACf,UAAAC,EACA,aAAAC,EACA,cAAAC,EAEA,KAAAhI,EAAO,SACP,WAAAiI,EAAa,UACb,MAAOC,EACP,cAAe9H,EACf,GAAGsB,CAAA,EACDrB,EACEH,EAAQgI,GAAA,KAAAA,EAAaD,EACrBE,EAAY/S,EAAM,OAAyB,IAAI,EAE/CgT,EAAerS,GAAmE,CACtF6R,GAAA,MAAAA,EAAkB7R,EACpB,EAGMsS,EAAiBtS,GAAqE,OAC1F8R,GAAA,MAAAA,EAAoB9R,GACfkQ,IACHnP,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAEhC,EAEMwL,EAAUJ,EACd,cACA,QAAQ4E,CAAO,GACf,QAAQ/F,CAAI,GACZE,IAAU,UAAY,eAAiB,qBAAqBA,CAAK,GACjEL,EACA,CACE,gBAAiBoG,EACjB,kBAAmB6B,CAAA,CACrB,EAGIQ,EAAgB,CAACN,GAAiBnJ,MAACwC,IAAO,UAAW8G,EAAW,OAAQJ,EAAc,EACtFQ,EAAc,OAAOrC,GAAS,SAAWrH,EAAAA,IAACc,IAAM,GAAG+H,EAAW,KAAMxB,CAAA,CAAM,EAAKA,EAErF,OAAIyB,EAEAJ,EAAAA,KAAC,IAAA,CACC,cAAanH,GAAA,KAAAA,EAAc,cAC3B,IAAAE,EACA,UAAWiB,EACX,KAAAoG,EACA,OAAO,SACP,YAAAS,EACA,cAAAC,EACC,GAAG3G,EAEJ,KAAK5K,EAAA4K,EAAK,MAAL,KAAA5K,EAAY,aAEhB,SAAA,CAAAoP,GAAQqC,EACRd,GAAgB7I,EAChB0J,CAAA,CAAA,CAAA,EAMLf,EAAAA,KAAC,SAAA,CACC,cAAanH,GAAA,KAAAA,EAAc,SAC3B,IAAAE,EACA,UAAWiB,EACX,YAAA6G,EACA,cAAAC,EACA,SAAU,CAAC,CAACpC,EACX,GAAGvE,EAEH,SAAA,CAAAwE,GAAQqC,EACRd,GAAgB7I,EAChB0J,CAAA,CAAA,CAAA,CAGP,CACF,ECrKaE,GAAqB,0BAG5BC,GAAgB,IACpB,OAAO,UAAa,YAAc,CAAA,EAAK,MAAM,KAAK,SAAS,iBAAiB,IAAID,EAAkB,GAAG,CAAC,EAU3FE,GAA0B,CAAC3S,EAAc4S,IAA2B,CAC/E,GAAI,OAAO5S,EAAM,cAAiB,WAAY,MAAO,GAErD,MAAM6S,EAAQ,KAAK,4BAA8B,KAAK,+BACtD,OAAO7S,EACJ,eACA,KACE8B,GACCA,aAAc,SAAWA,EAAG,aAAa2Q,EAAkB,IAAMG,EAAK,wBAAwB9Q,CAAE,EAAI+Q,KAAW,CAAA,CAEvH,EAQaC,GAAqBhR,GAA4C,CAC5E,GAAI,CAACA,EAAI,MAAO,GAChB,MAAMiR,EAAML,GAAA,EACNM,EAAMD,EAAIA,EAAI,OAAS,CAAC,EAC9B,MAAO,CAACC,GAAOA,IAAQlR,GAAMkR,EAAI,SAASlR,CAAE,CAC9C,EAQamR,GAAwBnR,GAC/B,CAACA,GAAM,CAACA,EAAG,YAAoB,GAC5B4Q,GAAA,EAAgB,KAAMQ,IAAWpR,EAAG,wBAAwBoR,CAAK,EAAI,KAAK,+BAAiC,CAAC,ECsB/GC,GAAiD,CACrD,UAAW,qBACX,YAAa,mBACb,iBAAkB,uBAClB,gBAAiB,mBACjB,YAAa,8BACb,iBAAkB,OACpB,EAEMC,GAAkB,CAACvK,EAAkCwK,IACzD,OAAOxK,GAAa,WAAaA,EAASwK,CAAG,EAAIxK,EAE7CyK,GAAkB,CAACC,EAAkCF,IACzD,OAAOE,GAAa,WAAaA,EAASF,CAAG,EAAIE,EAG7CC,GAAcC,GAAyC,CAC3D,UAAW5Q,KAAU4Q,EACnB,GAAI,IAAE5Q,aAAkB,cAAgB,CAACA,EAAO,eAChDA,EAAO,MAAA,EACFA,EAAO,cAAwC,gBAAkBA,GAAQ,MAElF,EAGM6Q,GAAa9R,GACjB,MAAM,KAAKA,EAAU,iBAA8BP,EAAS,CAAC,EAAE,OAE5DS,GAAO,OAAOA,EAAG,iBAAoB,YAAcA,EAAG,gBAAgB,CAAE,mBAAoB,EAAA,CAAM,CACrG,EAEW6R,GAAiB9J,EAAAA,WAAgD,SAC5E,CACE,UAAAC,EACA,OAAA8J,EACA,KAAMC,EACN,YAAAC,EAAc,OACd,aAAAC,EACA,cAAAC,EAAgB,GAChB,WAAAC,EAAa,GACb,eAAAC,EACA,oBAAAC,EAAsB,GACtB,WAAAC,EAAa,GACb,OAAAC,EACA,SAAAxL,CACF,EACA0B,EACA,CACA,KAAM,CAACQ,EAAMuJ,CAAO,EAAIrU,GAAoC,CAC1D,MAAO4T,EACP,aAAcC,EACd,SAAUC,CAAA,CACX,EAEKpV,EAAI,CAAE,GAAGwU,GAAgB,GAAGkB,CAAA,EAC5B,CAACE,EAASC,CAAU,EAAIxV,WAAA,EACxByV,EAAa7U,EAAAA,OAAuB,IAAI,EACxC8U,EAAU9U,EAAAA,OAAuB,IAAI,EACrC+U,EAAWlI,GAAWlC,EAAKmK,CAAO,EAClCE,EAAsBhV,EAAAA,OAA8C,IAAI,EACxEiV,EAAiBjV,EAAAA,OAA8C,IAAI,EAEnEkV,EAAYlV,EAAAA,OAAuB,IAAI,EACvCmV,EAAiBnV,EAAAA,OAAuB,IAAI,EAC5CoV,EAAmBpV,EAAAA,OAAO,EAAK,EAErCV,GAAoB,IAAM,CACxBsV,EAAW,SAAS,IAAI,CAC1B,EAAG,CAAA,CAAE,EAIL,MAAMS,EAA+BjB,EAAgB,OAASjJ,EACxDmK,EAAYD,IAAkB,MAC9BE,EAAeF,IAAkB,aAEjCG,EAAY,IAAMd,EAAS/T,GAAaA,IAAY,MAAQ,OAAS,KAAM,EAC3E8U,EAAiB,IAAMf,EAAQ,YAAY,EAC3CgB,EAAkB,IAAMhB,EAAQ,MAAM,EAEtCiB,EAAmBC,IAAqD,CAC5E,KAAMP,EACN,aAAcO,EACd,UAAWA,EAAU,GAAQN,EAC7B,QAAAZ,EACA,UAAAc,EACA,eAAAC,EACA,gBAAAC,EACA,OAAQ3W,CAAA,GAGJ8W,EAAmBD,GACnBA,EAEA1M,EAAAA,IAAC2I,GAAA,CACC,IAAKoD,EACL,KAAK,SACL,QAAQ,WACR,KAAK,QACL,aAAYlW,EAAE,gBACd,MAAOA,EAAE,gBACT,QAAS2W,EACT,cAAY,wBACZ,KAAMxM,EAAAA,IAACc,GAAA,CAAK,KAAK,QAAQ,KAAM,EAAA,CAAI,CAAA,CAAA,EAMvC4H,EAAAA,KAAAkE,WAAA,CACE,SAAA,CAAA5M,EAAAA,IAAC2I,GAAA,CACC,KAAK,SACL,QAAQ,WACR,KAAK,QACL,eAAcyD,EACd,aAAYA,EAAYvW,EAAE,YAAcA,EAAE,UAC1C,MAAOuW,EAAYvW,EAAE,YAAcA,EAAE,UACrC,QAASyW,EACT,cAAY,sBACZ,WAAOxL,GAAA,CAAK,KAAMsL,EAAY,YAAc,aAAc,KAAM,EAAA,CAAI,CAAA,CAAA,EAEtEpM,EAAAA,IAAC2I,GAAA,CACC,IAAKmD,EACL,KAAK,SACL,QAAQ,WACR,KAAK,QACL,aAAYjW,EAAE,iBACd,MAAOA,EAAE,iBACT,QAAS0W,EACT,cAAY,6BACZ,KAAMvM,EAAAA,IAACc,GAAA,CAAK,KAAK,eAAe,KAAM,EAAA,CAAI,CAAA,CAAA,CAC5C,EACF,EAIE+L,EAAoBH,GAAqB,CAC7C,GAAIxB,GAAiBC,EACnB,OAAO,KAGT,MAAM2B,EAAU1B,EACZZ,GAAgBY,EAAgBqB,EAAgBC,CAAO,CAAC,EACxDC,EAAgBD,CAAO,EAE3B,OAAKI,EAIE9M,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAkC,SAAA8M,EAAQ,EAHvD,IAIX,EAEA3W,EAAAA,UAAU,IAAM,CACd,GAAI,CAACkW,EACH,OAEF,MAAMtU,EAAO,SAAS,KAAK,MAAM,SACjC,gBAAS,KAAK,MAAM,SAAW,SACxB,IAAM,CACX,SAAS,KAAK,MAAM,SAAWA,CACjC,CACF,EAAG,CAACsU,CAAY,CAAC,EAEjBlW,EAAAA,UAAU,IAAM,CACd,GAAI,CAACkW,GAAgB,CAACf,EACpB,OAEF,MAAMpS,EAAahC,GAAyB,CAItCA,EAAM,MAAQ,UAAY,CAACA,EAAM,kBAAoB,CAACiT,GAAqBwB,EAAW,OAAO,IAG/FzU,EAAM,eAAA,EACNsU,EAAQ,MAAM,EAElB,EACA,gBAAS,iBAAiB,UAAWtS,CAAS,EACvC,IAAM,SAAS,oBAAoB,UAAWA,CAAS,CAChE,EAAG,CAACmT,EAAcf,EAAYE,CAAO,CAAC,EAStCpV,GAAoB,IAAM,SACxB,MAAMsC,EAAS,SAAS,cACpB2T,GACFL,EAAU,QAAUtT,IAAW,SAAS,KAAO,KAAOA,EACtDuT,EAAe,QAAU,MAChBC,EAAiB,UAAY,CAACxT,GAAUA,IAAW,SAAS,OACrEgS,GAAW,CACTuB,EAAe,QACfD,EAAU,QACVF,EAAoB,QACpB,GAAG,MAAM,MAAKtM,GAAAvH,EAAA2T,EAAQ,UAAR,YAAA3T,EAAiB,iBAAiBM,MAAlC,KAAAiH,EAAgD,CAAA,CAAE,CAAA,CACjE,EAEH0M,EAAiB,QAAUG,CAC7B,EAAG,CAACA,CAAY,CAAC,EAQjB,MAAMU,EAAeV,GAAgBZ,IAAY,OACjDrV,GAAoB,IAAM,CACxB,MAAMsW,EAAUf,EAAW,QACrBjT,EAAS,SAAS,cACpB,CAACqU,GAAgB,CAACL,GAAYhU,GAAUA,IAAW,SAAS,MAChEgS,GAAW,CAACqB,EAAe,QAAS,GAAGnB,GAAU8B,CAAO,EAAGA,CAAO,CAAC,CACrE,EAAG,CAACK,CAAY,CAAC,EAMjB5W,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC4W,EACH,OAEF,MAAM7T,EAAahC,GAAyB,WAC1C,MAAMwV,EAAUf,EAAW,QAC3B,GAAIzU,EAAM,MAAQ,OAASA,EAAM,kBAAoBA,EAAM,QAAUA,EAAM,SAAWA,EAAM,SAAW,CAACwV,EACtG,OAEF,MAAMvT,EAAQyR,GAAU8B,CAAO,EACzBzT,GAAQhB,GAAAkB,EAAM,CAAC,IAAP,KAAAlB,GAAYyU,EACpBtT,IAAOoG,GAAArG,EAAMA,EAAM,OAAS,CAAC,IAAtB,KAAAqG,GAA2BkN,EAClChU,GAAS,SAAS,cACxB,IAAIqB,GACArB,IAAUA,KAAW,SAAS,MAAQgU,EAAQ,SAAShU,EAAM,GAC3DxB,EAAM,SAAWwB,KAAWO,GAASP,KAAWgU,EAAUhU,KAAWU,MACvEW,GAAS7C,EAAM,SAAWkC,GAAOH,GAGnC,CAACkR,GAAqBuC,CAAO,IAC5B,CAAChU,IACAA,KAAW,SAAS,MACpBgU,EAAQ,wBAAwBhU,EAAM,EAAI,KAAK,+BAEjDqB,GAAS7C,EAAM,SAAWkC,GAAOH,GAE/Bc,KACF7C,EAAM,eAAA,EACN6C,GAAO,MAAA,EAEX,EACA,gBAAS,iBAAiB,UAAWb,CAAS,EACvC,IAAM,SAAS,oBAAoB,UAAWA,CAAS,CAChE,EAAG,CAAC6T,CAAY,CAAC,EAEjB,MAAMC,EACJtE,EAAAA,KAAC,MAAA,CACC,IAAKmD,EACL,UAAWvJ,EAAG,uBAAwB,CAAE,2BAA4B8J,CAAA,EAAapL,CAAS,EAC1F,cAAY,kBAEZ,SAAA,CAAA0H,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACb,SAAA,CAAA1I,EAAAA,IAAC,MAAA,CAAI,UAAU,+BAAgC,SAAA8K,EAAO,EACrD+B,EAAiB,EAAK,CAAA,EACzB,EACA7M,EAAAA,IAAC,MAAA,CAAI,UAAU,6BACZ,YAAgBD,EAAU,CACzB,KAAMoM,EACN,aAAc,GACd,UAAAC,CAAA,CACD,CAAA,CACH,CAAA,CAAA,CAAA,EAIJ,MAAI,CAACC,GAAgB,CAACZ,EACbuB,EAIPtE,EAAAA,KAAAkE,WAAA,CACE,SAAA,CAAAlE,EAAAA,KAAC,MAAA,CAAI,UAAU,oCAAoC,cAAY,8BAC7D,SAAA,CAAA1I,EAAAA,IAAC,OAAA,CAAM,WAAE,WAAA,CAAY,EACrBA,EAAAA,IAAC2I,GAAA,CACC,KAAK,SACL,QAAQ,WACR,KAAK,QACL,MAAO9S,EAAE,iBACT,QAAS,IAAM2V,EAAQ,MAAM,CAAA,CAAA,CAC/B,EACF,EACCyB,GAAAA,aACCjN,EAAAA,IAAC,MAAA,CACC,IAAK2L,EACL,UAAU,0CACV,0BAAwB,GACxB,KAAK,SACL,aAAW,OACX,SAAU,GACV,cAAY,0BACZ,QAAUlD,GAAM,CACdwD,EAAe,QAAUxD,EAAE,MAC7B,EACA,QACE4C,EACK5C,GAAM,CACDA,EAAE,SAAWA,EAAE,eACjB+C,EAAQ,MAAM,CAElB,EACA,OAGN,SAAA9C,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACb,SAAA,CAAA1I,EAAAA,IAAC,MAAA,CAAI,UAAU,+BAAgC,SAAA8K,EAAO,EACrD+B,EAAiB,EAAI,CAAA,EACxB,EACA7M,EAAAA,IAAC,MAAA,CAAI,UAAU,mEACZ,YAAgBD,EAAU,CACzB,KAAMoM,EACN,aAAc,GACd,UAAW,EAAA,CACZ,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,EAEFV,CAAA,CACF,EACF,CAEJ,CAAC,EC1YM,SAASyB,GAAe,CAC7B,UAAAlM,EACA,SAAAjB,EACA,SAAAqH,EACA,KAAA+F,EACA,MAAA9L,EAAQ,UACR,YAAa0H,EAEb,cAAeC,EAEf,KAAAoE,EAAO,SACP,GAAGvK,CACL,EAAwB,CACtB,MAAMyG,EAAY/S,EAAM,OAAyB,IAAI,EAE/CgT,EAAerS,GAA+C,CAClE6R,GAAA,MAAAA,EAAkB7R,EACpB,EAEMsS,EAAiBtS,GAAiD,OACtE8R,GAAA,MAAAA,EAAoB9R,GACfkQ,IACHnP,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAEhC,EAEA,OACEwR,EAAAA,KAAC,SAAA,CACC,KAAA0E,EACA,UAAW9K,EACT,wBACA6K,IAAS,SAAW,mCACpBA,IAAS,OAAS,iCAClB9L,IAAU,WAAa,gCACvB+F,GAAY,iCACZpG,CAAA,EAEF,SAAAoG,EACA,YAAAmC,EACA,cAAAC,EACC,GAAG3G,EAEH,SAAA,CAAA9C,EACCqH,EAAqD,KAA1CpH,EAAAA,IAACwC,GAAA,CAAO,UAAW8G,EAAW,OAAM,GAAC,CAAK,CAAA,CAAA,CAG7D,CC1CO,MAAM+D,GAAiB9W,EAAM,WAAmD,SACrF,CACE,SAAAwJ,EACA,UAAAiB,EACA,YAAa+H,EAEb,cAAeC,EACf,QAAA9B,EAAU,UACV,KAAA/F,EAAO,SACP,MAAAE,EAAQ,UACR,KAAA+L,EAAO,SACP,GAAGvK,CACL,EACApB,EACA,CACA,MAAM6H,EAAY/S,EAAM,OAAyB,IAAI,EAE/CgT,EAAerS,GAA+C,CAClE6R,GAAA,MAAAA,EAAkB7R,EACpB,EAGMsS,EAAiBtS,GAAiD,OACtE8R,GAAA,MAAAA,EAAoB9R,IACpBe,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAC9B,EAEA,OACEwR,EAAAA,KAAC,SAAA,CACC,IAAAjH,EACA,KAAA2L,EACA,UAAW9K,EAAG,WAAY,QAAQ4E,CAAO,GAAI,QAAQ/F,CAAI,GAAI,kBAAkBE,CAAK,GAAIL,CAAS,EACjG,YAAAuI,EACA,cAAAC,EACC,GAAG3G,EAEH,SAAA,CAAA9C,EACDC,EAAAA,IAACwC,GAAA,CAAO,UAAW8G,CAAA,CAAW,CAAA,CAAA,CAAA,CAGpC,CAAC,ECpDM,SAASgE,GAAS3X,EAAgB,CACvC,OAAOA,GAAS,MAAQ,EAAE,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,EACrE,CAEO,SAAS4X,GACdC,EAIA,CACA,OAAOA,IAASF,GAASE,EAAI,KAAK,GAAKA,EAAI,QAAU,IAAQF,GAASE,EAAI,YAAY,GAAKA,EAAI,eAAiB,GAClH,CCFO,SAASC,GAAmB,CACjC,SAAAC,EACA,QAAAxG,EACA,SAAAnH,EACA,UAAAiB,EACA,qBAAA2M,EACA,OAAAC,CACF,EAA4B,CAC1B,MAAMlL,EAAUJ,EACd,6BACAtB,EACA0M,IAAa,SAAW,oCACxBA,IAAa,OAAS,kCACtBC,GAAwB,8CACxB,CAACC,GAAU1G,IAAY,UAAY,qCACnC,OAAOnH,GAAa,UAAY,kCAAA,EAGlC,OAAOC,EAAAA,IAAC,OAAA,CAAK,UAAW0C,EAAU,SAAA3C,CAAA,CAAS,CAC7C,CCvBO,SAAS8N,GAAcC,EAA6BF,EAA2B,CACpF,MAAO,CAACA,GAAU,EAAQE,CAC5B,CAcO,SAASC,GACdD,EACA,CAAE,OAAAF,EAAQ,YAAAI,CAAA,EAAmC,CAAA,EACI,CACjD,MAAMC,EAAK/V,GAAM,OAAW,kBAAkB,EACxCgW,EAAM,CAACL,GAAcC,EAAYF,CAAM,EAAIK,EAAK,OAAWD,CAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACtG,MAAO,CAAE,GAAAC,EAAI,YAAaC,GAAO,MAAA,CACnC,CCQO,SAASC,GAAiB,CAC/B,MAAAvF,EACA,WAAAkF,EACA,aAAAM,EACA,QAAAlH,EACA,SAAAE,EACA,UAAApG,EACA,MAAAqN,EACA,UAAApF,EACA,cAAAqF,EACA,UAAAC,EACA,QAAAC,EACA,QAAAC,EACA,OAAAC,EACA,SAAA3O,EACA,kBAAA4O,EACA,eAAArH,EACA,aAAAC,EACA,OAAAqG,EACA,cAAerM,EAAa,aAC5B,GAAGsB,CACL,EAA0B,CACxB,MAAM+L,EAAkB1H,IAAY,SAC9B2H,EAAkBjG,IAAU0F,GAAiBC,GAAaG,GAE1DI,EAAahB,IAAe,OAAY9N,EAAAA,IAAA4M,EAAAA,SAAA,CAAE,aAAM,EAAMkB,EAEtDpL,EAAUJ,EAAGtB,EAAW,kBAAmB,CAC/C,0BAA2B,CAAC4M,GAAUgB,EACtC,0BAA2BhB,EAC3B,2BAA4B,CAACA,GAAUW,EACvC,yBAA0BF,EAC1B,4BAA6BjH,EAC7B,8BAA+B6B,CAAA,CAChC,EACK8F,EAAezM,EAAG,yBAA0B,CAChD,iCAAkCuM,CAAA,CACnC,EACKG,EAAiB1M,EAAG,2BAA4B,CACpD,uCAAwCsG,EACxC,mCAAoCiG,CAAA,CACrC,EAED,cACG,MAAA,CAAI,UAAWnM,EAAU,GAAGG,EAAM,cAAatB,EAC7C,SAAA,CAAA,CAACqM,GAAUhF,GACV5I,MAAC,QAAA,CAAM,GAAIyO,EAAS,UAAWM,EAAc,QAAAP,EAC1C,SAAA5F,CAAA,CACH,EAEFF,EAAAA,KAAC,MAAA,CAAI,UAAU,gCAAgC,YAAaiG,EACzD,SAAA,CAAArH,GACCtH,EAAAA,IAACyN,IAAmB,QAAAvG,EAAkB,OAAQ,EAAQ0G,EAAS,SAAS,QACrE,SAAAtG,CAAA,CACH,EAEDvH,EACAwH,GAAgBvH,EAAAA,IAACyN,GAAA,CAAmB,SAAS,MAAO,SAAAlG,EAAa,EACjE,CAACqG,GAAU1G,IAAY,kBACrB,WAAA,CAAS,UAAW8H,EACnB,SAAAhP,EAAAA,IAAC,SAAA,CAAQ,WAAQA,MAAC,OAAA,CAAM,WAAM,EAAUA,EAAAA,IAAC,QAAK,UAAU,mBAAmB,SAAA,GAAA,CAAO,CAAA,CAAQ,CAAA,CAC5F,CAAA,EAEJ,EACC,CAAC4N,GAAUkB,GACV9O,MAAC,IAAA,CAAE,UAAU,+BACX,SAAAA,EAAAA,IAAC,OAAA,CACC,UAAU,+BACV,GAAI6N,GAAcC,EAAYF,CAAM,EAAIQ,EAAe,OAEtD,SAAAU,CAAA,CAAA,CACH,CACF,CAAA,EAEJ,CAEJ,CCnEA,SAASG,GAAsCzN,EAA+B,CAC5E,MAAM0N,EAAuB,CAAA,EACvBC,EAAiC,CAAA,EACvC,SAAW,CAACC,EAAKzZ,CAAK,IAAK,OAAO,QAAQ6L,CAAK,EACzC4N,EAAI,WAAW,OAAO,EACxBF,EAAKE,CAA2B,EAAIzZ,EAEpCwZ,EAAMC,CAAG,EAAIzZ,EAGjB,MAAO,CAACuZ,EAAMC,CAAU,CAC1B,CAEO,MAAME,GAAY9Y,EAAM,WAA6C,SAAmBiL,EAAOC,EAAK,CACzG,KAAM,CACJ,MAAAmH,EACA,WAAAkF,EACA,mBAAoBwB,EACpB,QAAApI,EAAU,WACV,KAAA/F,EAAO,SACP,SAAAoO,EACA,UAAAvO,EACA,MAAAiE,EACA,SAAAmC,EACA,MAAAzR,EACA,aAAAyB,EACA,SAAUoY,EACV,QAASC,EACT,OAAQC,EACR,MAAArB,EACA,KAAAxN,EACA,KAAAuM,EAAO,OACP,SAAAuC,EACA,YAAAC,EACA,UAAA3G,EACA,GAAAgF,EACA,eAAA3G,EACA,aAAAC,EACA,OAAAqG,EACA,aAAAiC,EACA,UAAAC,EAGA,SAAA/P,EACA,GAAG8C,CAAA,EACDrB,EAGE,CAACuO,EAAgBC,CAAe,EAAIf,GAAoBpM,CAAI,EAE5DoN,EAAU/X,GAAM+V,CAAE,EAClB,CAACM,EAAW2B,CAAY,EAAI3Z,EAAM,SAAkB,EAAK,EACzD,CAAC+X,EAAe6B,CAAgB,EAAI5Z,EAAM,SAAkB,EAAK,EAIjEe,EAAe3B,GAAS,KACxBkJ,EAAWtI,EAAM,OAAyB,IAAI,EAC9C6Z,EAAezM,GAA6BlC,EAAK5C,CAAQ,EACzDwR,EAAStC,GAAcD,EAAY,CAAE,OAAAF,EAAQ,YAAa0B,EAAiB,EAE3EgB,EAAWpZ,GAA8C,CAC7D,GAAIkQ,EAAU,CACZlQ,EAAM,gBAAA,EACN,MACF,CAEAuY,GAAA,MAAAA,EAAcvY,GAEdgZ,EAAa,EAAI,CACnB,EAEMK,GAAUrZ,GAA8C,CAC5D,GAAI,CAACI,EAAc,CACjB,MAAMyG,GAAU7G,EAAM,QAAU2H,EAAS,QAEzC2R,GAAW,CACT,MAAOzS,GAAQ,KAAA,CAChB,CACH,CACA2R,GAAA,MAAAA,EAAaxY,EAAOsK,GACpB0O,EAAa,EAAK,CACpB,EAEMM,GAAaja,EAAM,YAAaiX,GAAwC,CAC5E,MAAMiD,GAAS,EAAQlD,GAASC,CAAG,EACnC2C,EAAkBpY,IAAUA,KAAS0Y,GAAS1Y,GAAO0Y,EAAO,CAC9D,EAAG,CAAA,CAAE,EAECpZ,GAAkDH,GAAU,CAChE,GAAI,CAACI,EAAc,CACjB,MAAMyG,GAAU7G,EAAM,QAAU2H,EAAS,QAEzC2R,GAAW,CACT,MAAOzS,GAAQ,KAAA,CAChB,CACH,CACAyR,GAAA,MAAAA,EAAetY,EAAOsK,EACxB,EAEMmN,GAA8DzX,GAAU,CACxE2H,EAAS,SAAW3H,EAAM,gBAAkBA,EAAM,SACpDA,EAAM,eAAA,EACN2H,EAAS,QAAQ,MAAA,EAErB,EAEAtI,EAAM,UAAU,IAAM,CAChB6Q,GAAYmH,GACd2B,EAAa,EAAK,CAEtB,EAAG,CAAC9I,EAAUmH,CAAS,CAAC,EAMxBhY,EAAM,UAAU,IAAM,OACfe,GAGHkZ,GAAW,CAAE,OAAOvY,EAAA4G,EAAS,UAAT,YAAA5G,EAAkB,MAAO,CAEjD,CAAC,EAED7B,GAAoB,IAAM,CACpBkB,GACFkZ,GAAW,CAAE,MAAA7a,EAAO,CAExB,EAAG,CAACA,EAAO2B,EAAckZ,EAAU,CAAC,EAEpC,MAAME,GAAepO,EACnB,0BACC,CAACsG,GAASgF,IAAW,2CACtBtG,GAAkB,0CAClBC,GAAgB,wCAChBqG,GAAU,gCAAA,EAGZ,OACE5N,EAAAA,IAACmO,GAAA,CACC,MAAAvF,EACA,WAAAkF,EACA,aAAcuC,EAAO,GACrB,QAAAnJ,EACA,SAAAE,EACA,UAAW9E,EAAGtB,EAAWG,IAAS,UAAY,wBAAwBA,CAAI,EAAE,EAC5E,MAAA8D,EACA,MAAAoJ,EACA,UAAApF,EACA,cAAAqF,EACA,UAAAC,EACA,QAAS0B,EACT,OAAQ,EAAQ3I,EAChB,kBAAAqH,GACA,eAAArH,EACA,aAAAC,EACA,OAAAqG,EACC,GAAGmC,EAEJ,SAAA/P,EAAAA,IAAC,QAAA,CACE,GAAGgQ,EACJ,KAAA5C,EACA,aAAAhW,EACA,KAAAyJ,EACA,SAAA8O,EACA,SAAAJ,EAEA,eAAclB,GAAS2B,EAAgB,cAAc,EACrD,gBAAeT,GAAYS,EAAgB,eAAe,EAC1D,YAAAJ,EACA,SAAAxI,EACA,MAAAzR,EACA,UAAW+a,GACX,IAAKN,EACL,SAAA/Y,GACA,QAAAiZ,EACA,OAAAC,GACA,GAAIN,EACJ,aAAAJ,EACA,UAAAC,EACA,mBAAkBO,EAAO,WAAA,CAAA,CAC3B,CAAA,CAGN,CAAC,EC3KYM,GAA8D,CAAC,UAAW,OAAQ,YAAa,MAAM,EAErGC,GAAuE,CAClF,QAAS,oBACT,KAAM,QACN,UAAW,WACX,KAAM,UACR,EAEaC,GAAwE,CACnF,QAAS,cACT,KAAM,aACN,UAAW,aACX,KAAM,WACR,EAEaC,GAAwC,CAAC,WAAY,aAAc,YAAY,EAI/EC,GAAqC,GCrE3C,SAASC,GAA4BC,EAAgE,CAC1G,OAAON,GAA+B,SAASM,CAAmC,CACpF,CAEO,SAASC,GACdD,EACAnR,EACoB,CACpB,MAAMtE,EAASsE,GAAA,YAAAA,EAAQmR,GACvB,GAAIzV,EACF,OAAOA,EAGT,GAAIwV,GAA4BC,CAAM,EACpC,OAAOL,GAA0BK,CAAM,CAI3C,CAEO,SAASE,GAA8BF,EAAmC,CAC/E,OAAID,GAA4BC,CAAM,EAC7BJ,GAA2BI,CAAM,EAGnC,OAAOA,CAAM,CACtB,CAEO,SAASG,GAAkBC,EAAqC,OACrE,OAAIpZ,EAAAoZ,EAAW,WAAX,MAAApZ,EAAqB,WAAW,UAC3B,GAGF,mCAAmC,KAAKoZ,EAAW,IAAI,CAChE,CAEO,SAASC,GAAoB3b,EAA+B,CACjE,GAAI,CAACA,EACH,MAAO,GAGT,MAAM4b,EAAO5b,aAAiB,KAAOA,EAAQ,IAAI,KAAKA,CAAK,EAE3D,OAAI,OAAO,MAAM4b,EAAK,QAAA,CAAS,EACtB,OAAO5b,CAAK,EAGd,IAAI,KAAK,eAAe,OAAW,CACxC,KAAM,UACN,OAAQ,SAAA,CACT,EAAE,OAAO4b,CAAI,CAChB,CAEO,SAASC,GAAsBC,EAA4C,CAChF,OAAIA,GAAS,KACJ,CAAC,UAAU,EAGhBA,EAAM,SAAW,EACZ,CAAA,EAGFX,GAAoB,OAAQ7O,GAASwP,EAAM,SAASxP,CAAI,CAAC,CAClE,CAEO,SAASyP,GAAkBC,EAA2BC,EAA4C,OACvG,OAAIA,GAAaA,IAAc,UAAYD,EAAQ,SAASC,CAAS,EAC5DA,GAGF3Z,EAAA0Z,EAAQ,CAAC,IAAT,KAAA1Z,EAAc,UACvB,CAEO,SAAS4Z,GACdC,EACAC,EACqC,CACrC,OAAOP,GAAsBM,CAAc,EAAE,OAC1C7P,GAAoDA,IAAS,UAAYA,IAAS8P,CAAA,CAEvF,CAEO,SAASC,GAA0BpT,EAM9B,CACV,OAAIA,EAAQ,kBAAoB,GACvB,GAGLA,EAAQ,kBAAoB,IAK9BA,EAAQ,gBACRA,EAAQ,iBACR,CAACA,EAAQ,WACRA,EAAQ,kBAAoB,YAAcA,EAAQ,kBAAoB,cAEhE,GAGF,GAAQA,EAAQ,iBAAmB,CAACA,EAAQ,UAAYA,EAAQ,kBAAoB,WAC7F,CAOO,SAASqT,GACd/a,EACA0H,EAAsC,GAC7B,CACT,GAAI1H,EAAM,MAAQ,QAChB,MAAO,GAGT,KAAM,CAAE,kBAAAgb,EAAoB,GAAM,iBAAAC,EAAmB,IAASvT,EACxDwT,EAASlb,EAAM,SAAWA,EAAM,QAMtC,MAJI,GAAAgb,GAAqBhb,EAAM,UAAY,CAACkb,GAIxCD,GAAoBC,GAAU,CAAClb,EAAM,SAK3C,CC5HA,SAASmb,GAAgBnb,EAA6B,CACpDA,EAAM,gBAAA,CACR,CAEA,SAASob,GAAsBvU,EAA8BpI,EAAeiC,EAAkC,SAC5G,MAAM2a,GAAQta,EAAA8F,EAAQ,iBAAR,KAAA9F,EAA0BtC,EAAM,OACxC6c,GAAMhT,EAAAzB,EAAQ,eAAR,KAAAyB,EAAwB7J,EAAM,OACpC8c,EAAY,GAAG9c,EAAM,MAAM,EAAG4c,CAAK,CAAC;AAAA,EAAK5c,EAAM,MAAM6c,CAAG,CAAC,GAE/D5a,EAAS6a,CAAS,EAElB,sBAAsB,IAAM,CAC1B1U,EAAQ,eAAiBwU,EAAQ,EACjCxU,EAAQ,aAAewU,EAAQ,CACjC,CAAC,CACH,CAEO,SAASG,GAAa,CAC3B,UAAA1R,EACA,cAAA2R,EACA,YAAA/C,EAAc,UACd,SAAAxI,EAAW,GACX,cAAAwL,EAAgB,eAChB,kBAAAV,EAAoB,GACpB,iBAAAC,EAAmB,GACnB,WAAAU,EAAa,GACb,cAAAC,EACA,cAAAC,EACA,gBAAAC,EAAkB,aACpB,EAAsB,CACpB,KAAM,CAACrd,EAAOiC,CAAQ,EAAI1B,EAAAA,SAAS,EAAE,EAC/B,CAACqY,EAAW2B,CAAY,EAAIha,EAAAA,SAAS,EAAK,EAC1C+Z,EAAU/X,EAAAA,MAAA,EACV+a,EAAcnc,EAAAA,OAA4B,IAAI,EAC9Coc,EAAYhB,GAAqBC,EACjCgB,EAAU,EAAQR,GAAkBhd,EAAM,OAAO,OAAS,GAAK,CAACyR,EAChEgM,EAAaP,GAAc,GAAQC,GAAiBC,GAEpDM,EAAa,IAAM,CACvB,GAAI,CAACV,EACH,OAGF,MAAMW,EAAO3d,EAAM,KAAA,EAEf,CAAC2d,GAAQlM,IAIRuL,EAAcW,CAAI,EACvB1b,EAAS,EAAE,EACb,EAEM2b,EAAiBrc,GAAuE,CAC5F,GAAI+a,GAA6B/a,EAAO,CAAE,kBAAAgb,EAAmB,iBAAAC,CAAA,CAAkB,EAAG,CAC5Ejb,EAAM,yBAAyB,sBACjCA,EAAM,eAAA,EACNob,GAAsBpb,EAAM,cAAevB,EAAOiC,CAAQ,GAG5D,MACF,CAEIV,EAAM,MAAQ,UAIlBA,EAAM,eAAA,EACNmc,EAAA,EACF,EAEMG,EAAkBlR,EACtB,wBACA,mCACA8E,GAAY,gCAAA,EAGRqM,EAAeL,EACnBN,EACE9S,EAAAA,IAAC,QAAA,CACC,QAASoH,EAAW,OAAY0L,EAChC,UAAWU,EACX,aAAYR,EACZ,gBAAe5L,GAAY,OAC3B,cAAY,uBACZ,YAAaiL,GAEb,SAAArS,EAAAA,IAACc,GAAA,CAAK,KAAK,cAAc,KAAM,EAAA,CAAI,CAAA,CAAA,EAGrCd,EAAAA,IAACkN,GAAA,CACC,KAAK,QACL,aAAY8F,EACZ,cAAY,uBACZ,SAAA5L,EACA,QAAS2L,EACT,YAAaV,GAEb,SAAArS,EAAAA,IAACc,GAAA,CAAK,KAAK,cAAc,KAAM,EAAA,CAAI,CAAA,CAAA,EAGrC,KAEE4S,EAAaf,EACjB3S,EAAAA,IAACkN,GAAA,CACC,KAAK,MACL,MAAM,UACN,aAAY0F,EACZ,cAAY,qBACZ,SAAU,CAACO,EACX,QAASE,EACT,YAAahB,GAEb,SAAArS,EAAAA,IAACc,GAAA,CAAK,KAAK,OAAO,KAAM,EAAA,CAAI,CAAA,CAAA,EAE5B,KAEJ,GAAIsS,GAAc,CAACT,EACjB,OACE3S,EAAAA,IAAC,MAAA,CACC,UAAWsC,EAAG,qBAAsB,iCAAkCtB,CAAS,EAC/E,cAAY,gBAEX,SAAAyS,CAAA,CAAA,EAKP,GAAI,CAACP,EACH,OACElT,EAAAA,IAACqP,GAAA,CACC,UAAW/M,EAAG,qBAAsBtB,CAAS,EAC7C,cAAY,gBACZ,UAAS,GACT,MAAArL,EACA,SAAAyR,EACA,YAAAwI,EACA,SAAW1Y,GAAUU,EAASV,EAAM,OAAO,KAAK,EAChD,eAAgBuc,EAChB,aAAcC,EACd,UAAWH,CAAA,CAAA,EAKjB,MAAM5E,EAA8DzX,GAAU,CACxE+b,EAAY,SAAW/b,EAAM,gBAAkBA,EAAM,SACvDA,EAAM,eAAA,EACN+b,EAAY,QAAQ,MAAA,EAExB,EAEA,OACEjT,EAAAA,IAACmO,GAAA,CACC,UAAW7L,EAAG,qBAAsBtB,CAAS,EAC7C,cAAY,gBACZ,UAAS,GACT,SAAAoG,EACA,cAAezR,EAAM,OAAS,EAC9B,UAAA4Y,EACA,QAAS0B,EACT,OAAQ,EAAQwD,EAChB,kBAAA9E,EACA,eAAgB8E,EAChB,aAAcC,EAEd,SAAA1T,EAAAA,IAAC,WAAA,CACC,GAAIiQ,EACJ,IAAKgD,EACL,UAAW3Q,EACT,yBACA,4BACA,2CACAmR,GAAgB,0CAChBC,GAAc,uCAAA,EAEhB,MAAA/d,EACA,SAAAyR,EACA,YAAAwI,EACA,KAAM,EACN,SAAW1Y,GAAUU,EAASV,EAAM,OAAO,KAAK,EAChD,QAAS,IAAMgZ,EAAa,EAAI,EAChC,OAAQ,IAAMA,EAAa,EAAK,EAChC,UAAWqD,CAAA,CAAA,CACb,CAAA,CAGN,CC/LA,MAAMI,GAAiE,CACrE,SAAU,qBACV,WAAY,aACZ,WAAY,cACd,EAEMC,GAAsE,CAC1E,SAAU,kBACV,WAAY,cACZ,WAAY,YACd,EAEO,SAASC,GAAW,CACzB,UAAA7S,EACA,MAAAM,EACA,SAAA2F,EACA,QAAA6M,EACA,OAAAC,EACA,eAAAjC,EAAiB,CAAC,UAAU,EAC5B,eAAAkC,EACA,QAAAC,CACF,EAAoB,CAClB,MAAMC,EAAgBrC,GAAqBC,EAAgBiC,CAAM,EAC3DI,EAAoB,EAAQH,GAAmBE,EAAc,OAAS,EAE5E,OACExL,OAAC,OAAI,UAAWpG,EAAG,mBAAoBtB,CAAS,EAAG,cAAY,cAC7D,SAAA,CAAA0H,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACZ,SAAA,CAAApH,EAAQtB,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAM,EAAS,KACjEiH,EAAWjH,EAAAA,IAAC,MAAA,CAAI,UAAU,6BAA8B,WAAS,EAAS,IAAA,EAC7E,EACA0I,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAoL,EACAK,EACGD,EAAc,IAAKjS,GACjBjC,EAAAA,IAACkN,GAAA,CAEC,eAAc6G,IAAW9R,EACzB,aAAY2R,GAAiB3R,CAAI,EACjC,cAAa,eAAeA,CAAI,GAChC,QAAS,IAAM+R,GAAA,YAAAA,EAAiB/R,GAEhC,eAACnB,GAAA,CAAK,KAAM6S,GAAY1R,CAAI,EAAG,KAAM,EAAA,CAAI,CAAA,EANpCA,CAAA,CAQR,EACD,KACHgS,EACCjU,EAAAA,IAACkN,GAAA,CAAe,aAAW,aAAa,cAAY,aAAa,QAAS+G,EACxE,SAAAjU,EAAAA,IAACc,IAAK,KAAK,QAAQ,KAAM,GAAI,EAC/B,EACE,IAAA,CAAA,CACN,CAAA,EACF,CAEJ,CC1CA,MAAMsT,GAAqE,CACzE,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,KACJ,GAAI,KAEJ,UAAW,IACX,UAAW,IACX,MAAO,IACP,MAAO,IACP,QAAS,OACT,SAAU,OACV,OAAQ,MACV,EAmBaC,GAAa9d,EAAM,WAA4D,SAC1F,CACE,QAAA2Q,EAAU,QACV,MAAA7F,EAAQ,UACR,MAAAiT,EACA,aAAAC,EACA,OAAAC,EACA,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,UAAA3T,EACA,MAAAiE,EACA,SAAAlF,EACA,GAAG8C,CACL,EACApB,EACA,CACA,MAAMmT,EAAOD,GAAA,KAAAA,EAAaP,GAAWlN,CAAO,EACtC2N,EAAUJ,IAAU,QAAaA,EAAQ,EAC/C,OACEzU,EAAAA,IAAC4U,EAAA,CACC,IAAAnT,EACA,UAAWa,EACT,kBACA,mBAAmB4E,CAAO,GAC1B7F,IAAU,WAAa,yBAAyBA,CAAK,GACrDiT,GAAS,yBAAyBA,CAAK,GACvC,CACE,yBAA0BC,EAC1B,yBAA0BC,EAC1B,wBAAyBK,EACzB,+BAAgCH,CAAA,EAElC1T,CAAA,EAEF,MAAO6T,EAAW,CAAE,GAAG5P,EAAO,0BAA2BwP,GAA4BxP,EACpF,GAAGpC,EAEH,SAAA9C,CAAA,CAAA,CAGP,CAAC,EC7FM,SAAS+U,GAAoB,CAAE,WAAAzD,EAAY,UAAArQ,GAAuC,CACvF,KAAM,CAACxE,EAAMC,CAAO,EAAIvG,EAAAA,SAAS,EAAK,EAChC,CAACuV,EAASC,CAAU,EAAIxV,WAAA,EACxB6e,EAAUje,EAAAA,OAAuB,IAAI,EAM3C,OAJAV,GAAoB,IAAM,CACxBsV,EAAW,SAAS,IAAI,CAC1B,EAAG,CAAA,CAAE,EAEA2F,EAAW,IAKd3I,EAAAA,KAAAkE,WAAA,CACE,SAAA,CAAA5M,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWsC,EAAG,6BAA8BtB,CAAS,EACrD,QAAS,IAAMvE,EAAQ,EAAI,EAC3B,cAAY,wBACZ,aAAY4U,EAAW,KAEvB,SAAArR,EAAAA,IAAC,OAAI,IAAKqR,EAAW,IAAK,IAAKA,EAAW,KAAM,UAAU,iCAAA,CAAkC,CAAA,CAAA,EAE7F5F,EACGwB,GAAAA,aACEjN,EAAAA,IAACgV,GAAAA,cAAA,CACC,GAAIxY,EACJ,QAAS,IACT,aAAY,GACZ,cAAa,GACb,QAAAuY,EACA,WAAY,CACV,YAAa,mDACb,UAAW,gDAAA,EAGb,SAAA/U,EAAAA,IAAC,MAAA,CACC,IAAK+U,EACL,UAAU,gDACV,KAAK,SACL,aAAW,OACX,aAAY1D,EAAW,KACvB,cAAY,gCACZ,QAAS,IAAM5U,EAAQ,EAAK,EAE5B,SAAAuD,EAAAA,IAAC,MAAA,CACC,IAAKqR,EAAW,IAChB,IAAKA,EAAW,KAChB,UAAU,0CACV,QAAUna,GAAUA,EAAM,gBAAA,CAAgB,CAAA,CAC5C,CAAA,CACF,CAAA,EAEFuU,CAAA,EAEF,IAAA,EACN,EA/CO,IAiDX,CC3DO,SAASwJ,GAAgB,CAAE,YAAAC,EAAa,UAAAlU,EAAW,QAAAmU,EAAU,IAA8B,CAChG,MAAI,CAACA,GAAW,EAACD,GAAA,MAAAA,EAAa,QACrB,KAIPlV,MAAC,OAAI,UAAWsC,EAAG,wBAAyBtB,CAAS,EAAG,cAAY,mBACjE,SAAAkU,EAAY,IAAK7D,GAChBD,GAAkBC,CAAU,QACzByD,GAAA,CAAwC,WAAAzD,CAAA,EAAfA,EAAW,EAA4B,EAEjErR,EAAAA,IAAC,IAAA,CAEC,UAAU,8BACV,KAAMqR,EAAW,IACjB,SAAUA,EAAW,KACrB,OAAO,SACP,IAAI,aACJ,cAAY,uBAEX,SAAAA,EAAW,IAAA,EARPA,EAAW,EAAA,CASlB,EAGN,CAEJ,CCPA,MAAM+D,GAAgBjU,GAAkD,OAAOA,GAAS,SAE3EkU,GAAStU,EAAAA,WAA2D,SAC/E,CACE,UAAAC,EACA,IAAAsU,EACA,IAAAC,EACA,KAAApU,EAAO,SACP,QAAA+F,EAAU,WACV,MAAA7F,EACA,MAAA4D,EACA,SAAAuQ,EACA,SAAAzV,EACA,cAAewB,EAAa,SAC5B,GAAGC,CACL,EACAC,EACA,CACA,KAAM,CAACgU,EAAWC,CAAY,EAAIxf,EAAAA,SAAS,EAAK,EAC1Cyf,EAAY,EAAQL,GAAQ,CAACG,EAE7BG,EAAkBtT,EACtB,cACA,eAAe4E,CAAO,GACtBkO,GAAajU,CAAI,EAAI,eAAeA,CAAI,GAAK,KAC7CH,CAAA,EAGI6U,EAA6B,CACjC,GAAG5Q,EACH,GAAImQ,GAAajU,CAAI,EAAI,CAAA,EAAK,CAAE,MAAOA,EAAM,OAAQA,EAAM,SAAUA,EAAO,GAAA,EAC5E,GAAIE,GAAS,CAACsU,EAAY,CAAE,gBAAiBtU,CAAA,EAAU,CAAA,CAAC,EAG1D,OACErB,EAAAA,IAAC,MAAA,CAAI,IAAAyB,EAAW,GAAGD,EAAO,cAAaD,EAAY,UAAWqU,EAAiB,MAAOC,EACnF,SAAAF,EACC3V,EAAAA,IAAC,MAAA,CACE,GAAGwV,EACJ,UAAWlT,EAAG,mBAAoBkT,GAAA,YAAAA,EAAU,SAAS,EACrD,IAAAF,EAEA,IAAKC,GAAA,KAAAA,EAAOC,GAAA,YAAAA,EAAU,IACtB,QAAU/M,GAAM,OACdiN,EAAa,EAAI,GACjBzd,EAAAud,GAAA,YAAAA,EAAU,UAAV,MAAAvd,EAAA,KAAAud,EAAoB/M,EACtB,CAAA,CAAA,EAGFzI,MAAC,OAAA,CAAK,UAAU,wBAAwB,KAAK,MAAM,aAAYuV,EAC5D,SAAAxV,CAAA,CACH,CAAA,CAEJ,CAEJ,CAAC,EAkBY+V,GAAc/U,EAAAA,WAAgE,SACzF,CACE,UAAAC,EACA,IAAA+U,EAAM,EACN,MAAAC,EACA,eAAAC,EACA,iBAAAC,EAAoB3c,GAAkB,GAAGA,CAAK,QAC9C,KAAA4H,EACA,SAAApB,EACA,cAAewB,EAAa,eAC5B,GAAGC,CACL,EACAC,EACA,CACA,MAAMtI,EAAQgd,EAAAA,SAAS,QAAQpW,CAAQ,EAAE,OAAOqW,gBAAc,EACxDC,EAAaL,GAAA,KAAAA,EAAS7c,EAAM,OAC5Bmd,EAAa,KAAK,IAAIP,EAAK,CAAC,EAC5BQ,EAAuBpd,EAAM,MAAM,EAAGmd,CAAU,EAChDE,EAAUH,EAAaE,EAAQ,OAErC,OAEE7N,EAAAA,KAAC,MAAA,CAAI,IAAAjH,EAAW,GAAGD,EAAO,cAAaD,EAAY,UAAWe,EAAG,oBAAqBtB,CAAS,EAC5F,SAAA,CAAAuV,EACAC,EAAU,EACTxW,EAAAA,IAACqV,GAAA,CACC,UAAU,6BACV,KAAAlU,EACA,IAAK+U,EAAiBM,CAAO,EAC7B,QAASP,EACT,MAAOA,EAAiB,CAAE,OAAQ,WAAc,OAE/C,aAAIO,CAAO,EAAA,CAAA,EAEZ,IAAA,CAAA,CACN,CAEJ,CAAC,EClIM,SAASC,GAAkB,CAAE,OAAAC,EAAQ,QAAAvB,EAAU,GAAM,UAAAnU,GAAqC,SAC/F,OAAKmU,EAKHnV,EAAAA,IAAC,MAAA,CAAI,UAAWsC,EAAG,4BAA6BtB,CAAS,EAAG,cAAY,sBACtE,SAAAhB,EAAAA,IAACqV,GAAA,CAAO,IAAKqB,GAAA,YAAAA,EAAQ,UAAW,KAAKze,EAAAye,GAAA,YAAAA,EAAQ,YAAR,KAAAze,EAAqBye,GAAA,YAAAA,EAAQ,KAAM,KAAK,QAC1E,UAAAlX,EAAAkX,GAAA,YAAAA,EAAQ,OAAR,YAAAlX,EAAc,MAAM,EAAG,EAAC,CAC3B,EACF,EARO,IAUX,CCJO,SAASmX,GAAkB,CAAE,UAAA3V,EAAW,QAAA4V,EAAS,OAAA3F,EAAQ,YAAA4F,EAAa,aAAAC,GAAwC,CACnH,GAAIA,EAAc,CAChB,MAAMtb,EAASsb,EAAa,CAAE,QAAAF,EAAS,OAAA3F,EAAQ,EAC/C,GAAIzV,GAAU,KACZ,OACEwE,EAAAA,IAAC,OAAA,CACC,UAAWsC,EAAG,4BAA6B,6BAA6B2O,CAAM,GAAIjQ,CAAS,EAC3F,cAAY,sBAEX,SAAAxF,CAAA,CAAA,CAIT,CAEA,MAAMub,EAAW7F,GAA6BD,EAAQ4F,CAAW,EAEjE,GAAI,CAACE,EACH,OAAO,KAGT,MAAMnO,EAAQuI,GAA8BF,CAAM,EAC5CR,EAASQ,IAAW,OAE1B,OACEjR,EAAAA,IAAC,OAAA,CACC,UAAWsC,EAAG,4BAA6B,6BAA6B2O,CAAM,GAAIjQ,CAAS,EAC3F,cAAY,sBACZ,aAAY4H,EACZ,MAAOA,EAEP,SAAA5I,EAAAA,IAACc,IAAK,KAAMiW,EAAU,KAAM,GAAI,KAAMtG,EAAS,EAAI,CAAA,CAAG,CAAA,CAAA,CAG5D,CCpBO,SAASuG,GAAkB,CAChC,UAAAhW,EACA,MAAAsT,EACA,QAAAsC,EACA,OAAAF,EACA,KAAApD,EACA,YAAA4B,EACA,UAAA+B,EACA,OAAAhG,EACA,YAAAiG,EAAc,GACd,gBAAAC,EAAkB,GAClB,WAAAC,EAAa,GACb,YAAAP,EACA,aAAAC,EACA,gBAAAO,CACF,EAA2B,CACzB,MAAMC,EAAOhG,GAAoB2F,CAAS,EACpCM,EAAiBtG,GAAA,KAAAA,EAAU2F,EAAQ,OACnCY,EAAmBJ,GAAc9C,IAAU,OAASiD,EAE1D,OACE7O,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,oBAAqB,qBAAqBgS,CAAK,GAAItT,CAAS,EAC1E,cAAa,gBAAgBsT,CAAK,GAEjC,SAAA,CAAAA,IAAU,QAAUtU,EAAAA,IAACyW,GAAA,CAAkB,OAAAC,EAAgB,QAASQ,EAAa,EAAK,KACnFxO,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACZ,SAAA,CAAAgO,GAAA,MAAAA,EAAQ,WACNrC,GAAA,CAAW,QAAQ,UAAU,UAAU,4BACrC,SAAAqC,EAAO,IAAA,CACV,EACE,YACH,MAAA,CAAI,UAAWpU,EAAG,4BAA6B+U,CAAe,EAC5D,SAAA,CAAA/D,EAAOtT,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAK,EAAS,KAChEA,EAAAA,IAACiV,GAAA,CAAgB,YAAAC,EAA0B,QAASiC,CAAA,CAAiB,CAAA,EACvE,EACCG,GAAQE,EACP9O,EAAAA,KAAC,OAAI,UAAU,0BAA0B,cAAY,oBAClD,SAAA,CAAA4O,QACEjD,GAAA,CAAW,QAAQ,UAAU,UAAU,0BACrC,WACH,EACE,KACHmD,EACCxX,EAAAA,IAAC2W,GAAA,CACC,QAAAC,EACA,OAAQW,EACR,YAAAV,EACA,aAAAC,CAAA,CAAA,EAEA,IAAA,CAAA,CACN,EACE,IAAA,EACN,EACCxC,IAAU,MAAQtU,EAAAA,IAACyW,IAAkB,OAAAC,EAAgB,QAASQ,EAAa,EAAK,IAAA,CAAA,CAAA,CAGvF,CCjFO,SAASO,GAAoB,CAAE,QAAAb,EAAS,YAAAM,EAAa,gBAAAC,EAAiB,UAAAnW,GAAuC,CAClH,OACEhB,EAAAA,IAACgX,GAAA,CACC,UAAAhW,EACA,MAAM,QACN,QAAA4V,EACA,OAAQA,EAAQ,OAChB,KAAMA,EAAQ,KACd,YAAaA,EAAQ,YACrB,UAAWA,EAAQ,UACnB,YAAAM,EACA,gBAAAC,EACA,gBAAgB,oCAAA,CAAA,CAGtB,CCfO,SAASO,GAAoB,CAClC,QAAAd,EACA,YAAAM,EACA,gBAAAC,EACA,WAAAC,EACA,YAAAP,EACA,aAAAC,EACA,UAAA9V,CACF,EAA6B,CAC3B,OACEhB,EAAAA,IAACgX,GAAA,CACC,UAAAhW,EACA,MAAM,MACN,QAAA4V,EACA,OAAQA,EAAQ,OAChB,KAAMA,EAAQ,KACd,YAAaA,EAAQ,YACrB,UAAWA,EAAQ,UACnB,OAAQA,EAAQ,OAChB,YAAAM,EACA,gBAAAC,EACA,WAAAC,EACA,YAAAP,EACA,aAAAC,EACA,gBAAgB,oCAAA,CAAA,CAGtB,CC1BO,SAASa,GAAkB,CAAE,QAAAf,EAAS,UAAA5V,GAAqC,OAChF,MAAM8L,GAAU7U,EAAA2e,EAAQ,UAAR,KAAA3e,EAAmB2e,EAAQ,KAE3C,OAAK9J,EAKH9M,EAAAA,IAAC,MAAA,CAAI,UAAWsC,EAAG,2BAA4BtB,CAAS,EAAG,cAAY,sBACrE,SAAAhB,EAAAA,IAACqU,GAAA,CAAW,QAAQ,UAAW,WAAQ,EACzC,EANO,IAQX,CCTO,SAASuD,GAAgB,CAC9B,QAAAhB,EACA,YAAAM,EACA,gBAAAC,EACA,WAAAC,EACA,YAAAP,EACA,aAAAC,EACA,UAAA9V,EACA,cAAA6W,CACF,EAAyB,OACvB,MAAMtN,EAAM,CAAE,YAAA2M,EAAa,gBAAAC,EAAiB,WAAAC,EAAY,YAAAP,EAAa,aAAAC,CAAA,EAErE,GAAIe,EACF,OAAO7X,EAAAA,IAAC,MAAA,CAAI,UAAWsC,EAAG,yBAA0BtB,CAAS,EAAI,SAAA6W,EAAcjB,EAASrM,CAAG,CAAA,CAAE,EAG/F,OAAQqM,EAAQ,QAAA,CACd,IAAK,WACH,OACE5W,EAAAA,IAAC0X,GAAA,CACC,QAAAd,EACA,YAAAM,EACA,gBAAAC,EACA,WAAAC,EACA,YAAAP,EACA,aAAAC,EACA,UAAA9V,CAAA,CAAA,EAGN,IAAK,SACH,OAAOhB,EAAAA,IAAC2X,GAAA,CAAkB,QAAAf,EAAkB,UAAA5V,CAAA,CAAsB,EACpE,IAAK,SACH,OACEhB,EAAAA,IAAC,MAAA,CACC,UAAWsC,EAAG,yBAA0B,gCAAiCtB,CAAS,EAClF,cAAY,sBAEX,UAAA/I,EAAA2e,EAAQ,UAAR,KAAA3e,EAAmB2e,EAAQ,IAAA,CAAA,EAGlC,IAAK,WACL,QACE,OACE5W,EAAAA,IAACyX,GAAA,CACC,QAAAb,EACA,YAAAM,EACA,gBAAAC,EACA,UAAAnW,CAAA,CAAA,CACF,CAGR,CCnCA,MAAM8W,GAAaniB,GAAiD,OAAOA,GAAU,SAAW,GAAGA,CAAK,KAAOA,EAElGoiB,GAAWhX,EAAAA,WAAuC,SAC7D,CACE,UAAAC,EACA,QAAAkG,EAAU,OACV,MAAA8Q,EACA,OAAA/T,EACA,UAAAgU,EAAY,QACZ,MAAA1e,EAAQ,EACR,eAAA2e,EACA,UAAAvD,EAAY,OACZ,MAAA1P,EACA,cAAe1D,EACf,GAAGC,CACL,EACAC,EACA,CACA,MAAM0W,EAAoB7V,EACxB,gBACA,iBAAiB4E,CAAO,GACxB+Q,IAAc,GAAQ,6BAA+B,iBAAiBA,CAAS,GAC/EjX,CAAA,EAGI4T,EAAMD,EAENyD,EAAane,GAAc,SAC/B,MAAM4b,EAA6B,CACjC,GAAG5Q,EAEH,OAAOhN,EAAA6f,GAAUE,CAAK,IAAf,KAAA/f,EAAoBgN,GAAA,YAAAA,EAAO,MAClC,QAAQzF,EAAAsY,GAAU7T,CAAM,IAAhB,KAAAzE,EAAqByF,GAAA,YAAAA,EAAO,OACpC,GAAIiT,EAAiB,CAAE,eAAgB,GAAGje,EAAIie,CAAc,MAAS,CAAA,CAAC,EAExE,OACElY,EAAAA,IAAC4U,EAAA,CAEC,IAAKrb,IAAU,EAAIkI,EAAM,OACxB,GAAIlI,IAAU,EAAIiI,EAAQ,CAAA,EAC3B,cAAajI,IAAU,GAAKgI,GAAA,KAAAA,EAA4B,WACxD,cAAY,OACZ,UAAW4W,EACX,MAAOtC,CAAA,EANF5b,CAAA,CASX,EAEA,OAAIV,IAAU,EACL6e,EAAU,CAAC,EAIlBpY,MAAC,QAAK,IAAAyB,EAAW,GAAGD,EAAO,cAAaD,EAAY,UAAU,uBAAuB,cAAY,OAC9F,eAAM,KAAK,CAAE,OAAQhI,CAAA,EAAS,CAAC,EAAGU,IAAMme,EAAUne,CAAC,CAAC,CAAA,CACvD,CAEJ,CAAC,EC3EM,SAASoe,GAAoB,CAClC,UAAArX,EACA,MAAAsT,EAAQ,QACR,WAAAgE,EAAa,GACb,MAAA7D,EAAQ,CACV,EAA6B,CAC3B,MAAM8D,EAAcjE,IAAU,QAAU,MAAQ,MAEhD,OACE5L,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,oBAAqB,qBAAqBgS,CAAK,GAAI,6BAA8BtT,CAAS,EACxG,cAAY,wBACZ,cAAY,OAEX,SAAA,CAAAsT,IAAU,SAAWgE,EAAatY,EAAAA,IAAC+X,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,EAAA,CAAI,EAAK,WAC3F,MAAA,CAAI,UAAU,6BACb,SAAArP,EAAAA,KAAC,MAAA,CAAI,UAAU,qCACb,SAAA,CAAA1I,MAAC+X,IAAS,QAAQ,UAAU,MAAOQ,EAAa,OAAQ,GAAI,EAC3D9D,EAAQ,EAAIzU,MAAC+X,GAAA,CAAS,QAAQ,UAAU,MAAM,MAAM,OAAQ,EAAA,CAAI,EAAK,IAAA,CAAA,CACxE,CAAA,CACF,EACCzD,IAAU,OAASgE,EAAatY,EAAAA,IAAC+X,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,EAAA,CAAI,EAAK,IAAA,CAAA,CAAA,CAGhG,CCzBO,SAASS,GAAsB,CACpC,aAAA/f,EACA,WAAAggB,EACA,QAAAC,EAAU,GACV,QAAAC,EAAU,GACV,WAAAC,EAAa,MACf,EAAgC,CAC9B,MAAMC,EAAc/hB,EAAAA,OAAuB,IAAI,EACzCgiB,EAAahiB,EAAAA,OAAO6hB,CAAO,EAEjC,OAAAG,EAAW,QAAUH,EAErBxiB,EAAAA,UAAU,IAAM,CACd,MAAM4iB,EAAOtgB,EAAa,QACpBugB,EAAWH,EAAY,QAE7B,GAAI,CAACE,GAAQ,CAACC,GAAY,CAACN,GAAW,CAACD,GAAc,OAAO,sBAAyB,YACnF,OAGF,MAAMQ,EAAW,IAAI,qBAClBC,GAAY,CACPA,EAAQ,KAAMC,GAAUA,EAAM,cAAc,GAAK,CAACL,EAAW,SAC1DL,EAAA,CAET,EACA,CAAE,KAAAM,EAAM,WAAAH,EAAY,UAAW,CAAA,CAAE,EAGnC,OAAAK,EAAS,QAAQD,CAAQ,EAElB,IAAMC,EAAS,WAAA,CACxB,EAAG,CAACxgB,EAAcigB,EAASD,EAAYG,CAAU,CAAC,EAE3C,CAAE,YAAAC,CAAA,CACX,CCpCO,SAASO,GAAmBrb,EAAsBsb,EAAY,GAAa,CAChF,OAAOtb,EAAQ,aAAeA,EAAQ,UAAYA,EAAQ,cAAgBsb,CAC5E,CAEO,SAASC,GAAmBvb,EAA4B,CAC7DA,EAAQ,UAAYA,EAAQ,YAC9B,CAEO,SAASwb,GAAqB,CAAE,aAAA9gB,EAAc,SAAA+gB,EAAU,UAAAH,EAAY,IAAkC,CAC3G,MAAMI,EAAgB3iB,EAAAA,OAAO,EAAI,EAC3B4iB,EAA0B5iB,EAAAA,OAAO,CAAC,EAClC6iB,EAA4B7iB,EAAAA,OAAA,EAC5B8iB,EAA2B9iB,EAAAA,OAAA,EAEjCX,EAAAA,UAAU,IAAM,CACd,MAAM4H,EAAUtF,EAAa,QAE7B,GAAI,CAACsF,EACH,OAGF,MAAM8b,EAAe,IAAM,CACzBJ,EAAc,QAAUL,GAAmBrb,EAASsb,CAAS,CAC/D,EAEA,OAAAQ,EAAA,EACA9b,EAAQ,iBAAiB,SAAU8b,EAAc,CAAE,QAAS,GAAM,EAE3D,IAAM9b,EAAQ,oBAAoB,SAAU8b,CAAY,CACjE,EAAG,CAACphB,EAAc4gB,CAAS,CAAC,EAE5BjjB,GAAoB,IAAM,SACxB,MAAM2H,EAAUtF,EAAa,QAE7B,GAAI,CAACsF,EACH,OAGF,MAAM+b,EAAuBJ,EAAwB,QAC/CK,EAAyBJ,EAA0B,QACnDK,EAAwBJ,EAAyB,QACjDK,GAAiBhiB,EAAAuhB,EAAS,CAAC,IAAV,YAAAvhB,EAAa,GAC9BiiB,GAAgB1a,EAAAga,EAASA,EAAS,OAAS,CAAC,IAA5B,YAAAha,EAA+B,GAErD,GAAIua,IAA2B,OAC7BT,GAAmBvb,CAAO,EAC1B0b,EAAc,QAAU,OACnB,CACL,MAAMU,EACJF,IAAmB,QACnBA,IAAmBF,GACnBG,IAAkBF,EACdI,EAAWF,IAAkB,QAAaA,IAAkBF,EAE9DG,GAAaL,EAAuB,EACtC/b,EAAQ,WAAaA,EAAQ,aAAe+b,EACnCM,GAAYX,EAAc,SACnCH,GAAmBvb,CAAO,CAE9B,CAEA2b,EAAwB,QAAU3b,EAAQ,aAC1C4b,EAA0B,QAAUM,EACpCL,EAAyB,QAAUM,CACrC,EAAG,CAACzhB,EAAc+gB,CAAQ,CAAC,CAC7B,CCvDO,SAASa,GAAa,CAC3B,UAAArZ,EACA,SAAAwY,EACA,YAAAtC,EACA,gBAAAC,EACA,WAAAC,EACA,YAAAP,EACA,aAAAC,EACA,WAAA2B,EACA,QAAAC,EAAU,GACV,QAAAC,EAAU,GACV,YAAA2B,EAAc,GACd,qBAAAC,EAAuB,EACvB,cAAA1C,CACF,EAAsB,CACpB,MAAMpf,EAAe3B,EAAAA,OAAuB,IAAI,EAC1C,CAAE,YAAA+hB,CAAA,EAAgBL,GAAsB,CAC5C,aAAA/f,EACA,WAAAggB,EACA,QAAAC,EACA,QAAS4B,GAAe3B,CAAA,CACzB,EAEDY,GAAqB,CACnB,aAAA9gB,EACA,SAAA+gB,CAAA,CACD,EAED,MAAMgB,EAAgB7B,GAAW2B,EAC3BG,EAAkBC,GAAoCA,EAAQ,IAAM,EAAI,QAAU,MAExF,OACEhS,EAAAA,KAAC,MAAA,CAAI,IAAKjQ,EAAc,UAAW6J,EAAG,qBAAsBtB,CAAS,EAAG,cAAY,gBAClF,SAAA,CAAAhB,MAAC,OAAI,IAAK6Y,EAAa,UAAU,+BAA+B,cAAY,yBAAyB,EACpG2B,EACCxa,EAAAA,IAAC,MAAA,CACC,UAAU,gCACV,cAAY,0BACZ,YAAU,OACV,aAAW,mBAEV,SAAA,MAAM,KAAK,CAAE,OAAQua,GAAwB,CAACI,EAAGD,IAChD1a,EAAAA,IAACqY,GAAA,CAEC,MAAOoC,EAAeC,CAAK,EAC3B,WAAYxD,EACZ,MAAOwD,EAAQ,IAAM,EAAI,EAAI,CAAA,EAHxBA,CAAA,CAKR,CAAA,CAAA,EAED,KACF/B,EAaE,KAZAa,EAAS,IAAK5C,GACZ5W,EAAAA,IAAC4X,GAAA,CAEC,QAAAhB,EACA,YAAAM,EACA,gBAAAC,EACA,WAAAC,EACA,YAAAP,EACA,aAAAC,EACA,cAAAe,CAAA,EAPKjB,EAAQ,EAAA,CAShB,CACD,EACN,CAEJ,CCnEO,SAASgE,GAAU,CACxB,UAAA5Z,EACA,OAAA+S,EACA,OAAA8G,EAAS,eACT,UAAAC,EAAY,UACZ,SAAAC,EAAW,GACX,eAAAC,EAAiB,GACjB,OAAAlQ,EACA,OAAAmQ,EACA,SAAAlb,EACA,sBAAAmb,EACA,mBAAAC,EAAqB,EACvB,EAAmB,CACjB,KAAM,CAAC1P,EAASC,CAAU,EAAInV,EAAM,SAAA,EAmBpC,GAjBAH,GAAoB,IAAM,CACxBsV,EAAW,SAAS,IAAI,CAC1B,EAAG,CAAA,CAAE,EAELvV,EAAAA,UAAU,IAAM,CACd,GAAI4d,IAAW,aACb,OAGF,MAAMhc,EAAO,SAAS,KAAK,MAAM,SACjC,gBAAS,KAAK,MAAM,SAAW,SAExB,IAAM,CACX,SAAS,KAAK,MAAM,SAAWA,CACjC,CACF,EAAG,CAACgc,CAAM,CAAC,EAEPA,IAAW,SACb,OAAO,KAGT,KAAM,CAAE,UAAWqH,EAAmB,GAAGC,CAAA,EAAsBH,GAAA,KAAAA,EAAyB,CAAA,EAElFI,EACJ5S,EAAAA,KAAC,MAAA,CACE,GAAG2S,EACJ,UAAW/Y,EACT,kBACA,mBAAmByR,CAAM,GACzB,CAACgH,GAAY,mBAAmBF,CAAM,GACtC,CACE,YAAaC,IAAc,OAC3B,2BAA4BC,EAC5B,kCAAmCC,EACnC,4BAA6BG,CAAA,EAE/BC,EACApa,CAAA,EAEF,cAAY,aACZ,cAAa+S,EAEZ,SAAA,CAAAjJ,EAAS9K,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAO,EAAS,KACpEA,EAAAA,IAAC,MAAA,CAAI,UAAU,wBAAyB,SAAAD,CAAA,CAAS,EAChDkb,EAASjb,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAO,EAAS,IAAA,CAAA,CAAA,EAIxE,OAAI+T,IAAW,cAAgBtI,EACtBwB,GAAAA,aAAaqO,EAAO7P,CAAO,EAG7B6P,CACT,CClEO,SAASC,GAA8Bpc,EAA2B,CACvE,OAAIA,GAAY,KACP4R,GAGF,KAAK,IAAI,EAAG5R,CAAQ,CAC7B,CAEO,SAASqc,GAAkB,CAChC,QAAArG,EAAU,GACV,OAAA3W,EACA,SAAAW,EACA,cAAAsc,EACA,SAAArU,EAAW,EACb,EAA6B,CAC3B,MAAMsU,EAAmBH,GAA8Bpc,CAAQ,EACzDzG,EAASyc,GAAW,EAAQsG,GAAkB,CAACrU,EAE/C,CACJ,aAAcuU,EACd,cAAeC,EACf,KAAApf,EACA,aAAAsC,EACA,SAAAD,CAAA,EACEF,GAAY,CACd,OAAAH,EACA,SAAUkd,EACV,SAAUA,EAAmB,EAC7B,SAAU,CAAChjB,EACX,eAAiB4G,GAAU,CACrBmc,GACGA,EAAcnc,CAAK,CAE5B,CAAA,CACD,EAoBD,MAAO,CACL,QAAS5G,EACT,SAAUgjB,EACV,aAlBmB,IAA+B,CAClD,KAAM,CAAE,QAASG,EAAU,GAAGhZ,CAAA,EAAS8Y,EAAA,EAEvC,OAAO9Y,CACT,EAeE,cAbqBiZ,IAAmE,CACxF,GAAGF,EAAA,EACH,GAAIE,GAAA,KAAAA,EAAS,CAAA,CAAC,GAYd,KATqB,IAAM,CAC3Btf,EAAA,CACF,EAQE,SAAAqC,EACA,aAAAC,CAAA,CAEJ,CCjBO,SAASid,GAAK,CACnB,UAAA/a,EACA,SAAAwY,EACA,YAAAtC,EAAc,GACd,gBAAAC,EAAkB,GAClB,YAAA6E,EACA,eAAAC,EACA,cAAAC,EACA,OAAAjB,EACA,SAAAlb,EACA,OAAA8a,EAAS,eACT,UAAAC,EAAY,UACZ,eAAgBqB,EAChB,OAAQC,EACR,cAAAC,EACA,eAAArI,EACA,KAAMsI,EACN,YAAAC,EAAc,GACd,aAAAC,EACA,gBAAAC,EAAkB,GAClB,YAAAC,EACA,aAAAC,EACA,WAAAlE,EACA,QAAAC,EACA,cAAA/F,EACA,oBAAAiK,EAAsB,UACtB,iBAAAC,EACA,0BAAAC,EAA4B,GAC5B,yBAAAC,EAA2B,GAC3B,WAAAlK,EAAa,GACb,cAAA4I,EACA,iBAAAuB,EACA,mBAAAC,EACA,gBAAAjK,EACA,QAAA2F,EACA,YAAA2B,EACA,qBAAAC,EACA,cAAA1C,EACA,SAAAkD,EAAW,GACX,eAAAC,EAAiB,GACjB,WAAA5D,EAAa,GACb,YAAAP,EACA,aAAAC,EACA,gBAAAoG,CACF,EAAc,QACZ,MAAMpL,GAAiBlX,EAAAA,QACrB,IAAM4W,GAAsB2K,GAAA,KAAAA,EAAsBrL,EAAmB,EACrE,CAACqL,CAAkB,CAAA,EAGf,CAAC3f,GAAMC,EAAO,EAAItF,GAA8B,CACpD,MAAOmlB,EACP,aAAcC,EACd,SAAUC,CAAA,CACX,EAEK,CAACzI,GAAQoJ,EAAS,EAAIhmB,GAAqC,CAC/D,MAAOilB,EACP,aAAc1K,GAAkBI,GAAgBuK,CAAa,EAC7D,SAAUrI,CAAA,CACX,EAEKoJ,EAAkCrC,EACpC,aACA0B,EACEjgB,GACEuX,GACA,SACFA,GAEAsJ,GAAa,IAAM,CACvB5gB,GAAQ,EAAI,EACRsX,KAAW,UACboJ,GAAUzL,GAAkBI,GAAgBuK,CAAa,CAAC,CAE9D,EAEMiB,GAAc,IAAM,CACxB7gB,GAAQ,EAAK,CACf,EAEM8gB,GAAsBzlB,IAAyB,CACnD2E,GAAQ,EAAI,EACZ0gB,GAAUrlB,EAAI,CAChB,EAEM,CACJ,QAAS0lB,GACT,aAAAje,GACA,cAAAE,GACA,aAAAX,EAAA,EACE0c,GAAkB,CACpB,QAAS3I,EACT,OAAQmK,EACR,SAAUC,EACV,cAAAxB,EACA,SAAUoB,CAAA,CACX,EAEK/J,GAAgB5a,EAAAA,MAAA,EAEhBulB,GAAe,EAAQ9K,GAAkB6K,GAEzCE,GAAYF,GAChBxd,EAAAA,IAAC,QAAA,CAAO,GAAGP,GAAc,CAAE,GAAIqT,EAAA,CAAe,EAAG,cAAY,kBAAkB,EAC7E,KAEE6K,IACJ1lB,GAAAgjB,GAAA,KAAAA,EACAlb,IADA,KAAA9H,GAECwlB,GACC/U,OAAAkE,EAAAA,SAAA,CACG,SAAA,CAAA8Q,GACD1d,EAAAA,IAAC0S,GAAA,CACC,cAAAC,EACA,YAAaiK,EACb,SAAUC,EACV,kBAAmBC,EACnB,iBAAkBC,EAClB,WAAYS,GACZ,cAAeA,GAAoB1K,GAAgB,OACnD,gBAAAE,CAAA,CAAA,CACF,CAAA,CACF,EACE,OAmBA4K,EAhBJ5d,EAAAA,IAACqa,GAAA,CACC,SAAAb,EACA,YAAAtC,EACA,gBAAAC,EACA,WAAAC,EACA,YAAAP,EACA,aAAAC,EACA,WAAA2B,EACA,QAAAC,EACA,QAAAC,EACA,YAAA2B,EACA,qBAAAC,EACA,cAAA1C,CAAA,CAAA,EAMEqD,EAAwBsC,GAAoBje,GAAA,EAAiB,OAE7Dse,GAAqB7L,GAA0B,CACnD,gBAAAyK,EACA,SAAA1B,EACA,eAAAC,EACA,gBAAAoC,EACA,gBAAAF,CAAA,CACD,EAED,OACExU,EAAAA,KAAC,MAAA,CACC,UAAWpG,EACT,YACA,CAACyY,GAAY,aAAaF,CAAM,GAChCE,GAAY,qBACZC,GAAkB,4BAClBha,CAAA,EAEF,cAAY,OAEX,SAAA,CAAAyb,GAAmB,CAAC1B,GAAY,CAACve,GAChCwD,EAAAA,IAACqN,GAAA,CACC,UAAU,qBACV,aAAYsP,GAAA,KAAAA,EAAgB,YAC5B,cAAY,eACZ,QAASU,GAER,mBAAerd,EAAAA,IAACc,GAAA,CAAK,KAAK,OAAO,KAAM,EAAA,CAAI,CAAA,CAAA,EAE5C,KACJd,EAAAA,IAAC4a,GAAA,CACC,OAAQwC,EACR,OAAAvC,EACA,UAAAC,EACA,SAAAC,EACA,eAAAC,EACA,sBAAAE,EACA,mBAAoBsC,IAAqB1e,GACzC,OACEkB,EAAAA,IAAC6T,GAAA,CACC,MAAOmI,EACP,SAAUC,EACV,QAASC,EACT,OAAQkB,IAAoB,SAAWrJ,GAASqJ,EAChD,eAAAtL,GACA,eAAgByL,GAChB,QAASM,GAAqBP,GAAc,MAAA,CAAA,EAGhD,OAAQK,GAEP,SAAAC,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,CCpQA,MAAME,GAAOnoB,GAA4B,OAAOA,GAAU,SAAW,GAAGA,CAAK,KAAOA,EAE9EooB,GAAyBC,GAAsCA,IAAS,OAAS,cAAgB,eAkChG,SAASC,GAAW,CACzB,UAAAjd,EACA,iBAAA2D,EACA,cAAAuZ,EACA,KAAAF,EAAO,QACP,UAAAG,EAAY,IACZ,UAAWC,EACX,iBAAAC,EAAmB,GACnB,kBAAAC,EACA,kBAAAC,EAAoB,sBACpB,gBAAAC,EAAkB,oBAClB,eAAAC,EACA,KAAAC,EACA,SAAA3e,EACA,MAAAkF,EACA,cAAe1D,EAAa,cAC5B,GAAGsB,CACL,EAAoB,CAClB,KAAM,CAAC8b,EAAWC,CAAY,EAAIznB,GAA8B,CAC9D,MAAOinB,EACP,aAAcC,EACd,SAAUC,CAAA,CACX,EAEK,CAACO,EAAcC,CAAe,EAAI3nB,GAA8B,CACpE,aAAc,EAAA,CACf,EAEDhB,EAAAA,UAAU,IAAM,CACTwoB,GACHG,EAAgB,EAAK,CAEzB,EAAG,CAACH,EAAWG,CAAe,CAAC,EAE/B,MAAMjE,EAAS4D,GAAA,KAAAA,EAAkBV,GAAsBC,CAAI,EACrDe,EAAWf,IAAS,OAAS,eAAiB,gBAC9CgB,EAAehB,IAAS,OAAS,mBAAqB,oBAEtDiB,EACJjf,EAAAA,IAACkN,GAAA,CACC,aAAYqR,EACZ,cAAY,uBACZ,QAAS,IAAMK,EAAa,EAAI,EAEhC,SAAA5e,EAAAA,IAACc,GAAA,CAAK,KAAMke,EAAc,KAAM,EAAA,CAAI,CAAA,CAAA,EAIlCE,EACJlf,MAACkN,GAAA,CAAe,aAAYsR,EAAiB,cAAY,qBAAqB,QAAS,IAAMI,EAAa,EAAK,EAC7G,SAAA5e,EAAAA,IAACc,GAAA,CAAK,KAAMie,EAAU,KAAM,GAAI,EAClC,EAGII,EACJzW,EAAAA,KAAAkE,EAAAA,SAAA,CACG,SAAA,CAAA8R,EAAK,cACLO,CAAA,EACH,EAGIG,EACJ1W,EAAAA,KAAAkE,EAAAA,SAAA,CACG,SAAA,CAAA8R,EAAK,cACLQ,CAAA,EACH,EAGIG,EAAU,CACd,uBAAwBvB,GAAIK,CAAS,CAAA,EAGvC,GAAIQ,EACF,OACEjW,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,mBAAoB,6BAA8BtB,CAAS,EACzE,MAAO,CAAE,GAAGqe,EAAS,GAAGpa,CAAA,EACxB,cAAa1D,EACZ,GAAGsB,EAEJ,iBAAe,OAEf,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAWsC,EAAG,4BAA6BqC,CAAgB,EAAG,cAAY,sBAC5E,SAAA5E,EACH,EACAC,EAAAA,IAAC+b,GAAA,CACE,GAAG2C,EACJ,UAAWR,EACX,gBAAe,GACf,OAAArD,EACA,eAAgB,CAAC,UAAU,EAC3B,OAAO,WACP,KAAMgE,EACN,aAAcC,EACd,cAAeM,CAAA,CAAA,CACjB,CAAA,CAAA,EAKN,MAAM9D,QACH,QAAA,CAAM,UAAU,0BAA0B,cAAY,oBACrD,eAACS,GAAA,CAAM,GAAG2C,EAAM,UAAWR,EAAe,SAAQ,GAAC,eAAgB,CAAA,EAAI,cAAeiB,EAAqB,EAC7G,EAGF,OACEzW,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,mBAAoB,oBAAoB0b,CAAI,GAAIhd,CAAS,EACvE,MAAO,CAAE,GAAGqe,EAAS,GAAGpa,CAAA,EACxB,cAAa1D,EACZ,GAAGsB,EAEJ,iBAAe,QAEd,SAAA,CAAAmb,IAAS,OAAS1C,EAAQ,KAC3Btb,EAAAA,IAAC,OAAI,UAAWsC,EAAG,4BAA6BqC,CAAgB,EAAG,cAAY,sBAC5E,SAAA5E,EACH,EACCie,IAAS,QAAU1C,EAAQ,IAAA,CAAA,CAAA,CAGlC,CCjKO,SAASgE,GAAWze,EAAsB,CAC/C,MAAM0e,EAAQ1e,EAAK,KAAA,EAAO,MAAM,KAAK,EAAE,OAAO,OAAO,EAC/C5H,EAASumB,GAAA,OAAsC,OAAAA,IAAQvnB,EAAA,MAAM,KAAKunB,CAAI,EAAE,CAAC,IAAlB,KAAAvnB,EAA6B,IAC1F,OAAQgB,EAAMsmB,EAAM,CAAC,CAAC,GAAKA,EAAM,OAAS,EAAItmB,EAAMsmB,EAAMA,EAAM,OAAS,CAAC,CAAC,EAAI,KAAK,YAAA,CACtF,CAMO,SAASE,GAAYC,EAAsB,OAChD,IAAIC,EAAO,EACX,UAAWC,KAAQF,EAAMC,EAAQA,EAAO,KAAM1nB,EAAA2nB,EAAK,YAAY,CAAC,IAAlB,KAAA3nB,EAAuB,KAAQ,EAC7E,MAAO,OAAO0nB,EAAO,GAAG,WAC1B,CAyBO,MAAME,GAAatpB,EAAM,WAAyC,SACvE,CACE,UAAAyK,EACA,KAAAH,EACA,IAAAyU,EACA,KAAAxM,EACA,QAAAgX,EACA,KAAA3e,EAAO,GACP,UAAA4e,EACA,MAAA1e,EACA,KAAA2e,EACA,cAAeze,EAAa,cAC5B,GAAGsB,CACL,EACApB,EACA,CACA,MAAMmT,EAAO9L,EAAO,IAAM,OAC1B,OACEJ,EAAAA,KAACkM,EAAA,CACE,GAAG/R,EACJ,IAAApB,EACC,GAAIqH,EAAO,CAAE,KAAAA,CAAA,EAAS,CAAA,EACvB,MAAOgX,EAAUjf,EAAO,OAGxB,KAAMif,GAAW,CAAChX,EAAO,MAAQjG,EAAK,KACtC,aAAYid,EAAUjf,EAAOgC,EAAK,YAAY,EAC9C,cAAatB,EACb,UAAWe,EACT,mBACA,CAAE,wBAAyB,CAAC,CAACwG,EAAM,2BAA4BgX,CAAA,EAC/D9e,CAAA,EAGF,SAAA,CAAAhB,EAAAA,IAACqV,GAAA,CACC,UAAU,2BACV,KAAAlU,EACA,IAAAmU,EACA,MAAOjU,GAAA,KAAAA,EAASoe,GAAYM,GAAA,KAAAA,EAAalf,CAAI,EAC7C,cAAY,OAEX,YAAWA,CAAI,CAAA,CAAA,EAEjBif,EAAU,KACTpX,OAAC,OAAA,CAAK,UAAU,yBACd,SAAA,CAAA1I,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAA0B,SAAAa,EAAK,EAC9Cmf,EAAOhgB,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAA0B,WAAK,EAAU,IAAA,CAAA,CACnE,CAAA,CAAA,CAAA,CAIR,CAAC,EC7EYigB,GAAQlf,EAAAA,WAA2D,SAC9E,CACE,UAAAC,EACA,MAAAK,EAAQ,UACR,aAAA6e,EACA,QAAAhZ,EAAU,UACV,SAAAiZ,EAAW,MACX,WAAAC,EAAa,QACb,IAAArK,EACA,SAAAsK,EAAW,GACX,eAAAC,EACA,SAAAvgB,EACA,GAAG8C,CACL,EACApB,EACA,CACA,MAAM8e,EAASL,IAAiB,GAAKA,IAAiB,IAChDM,GAAwCN,GAAiB,MAASK,GAAU,CAACF,KAAe,GAElG,IAAII,EAA2BP,EAC3B,OAAOA,GAAiB,UAAYnK,IAAQ,QAAamK,EAAenK,IAC1E0K,EAAU,GAAG1K,CAAG,KAGlB,MAAM2K,EAAiBpe,EACrB,aACA,cAAcjB,CAAK,GACnB,cAAc6F,CAAO,GACrB,cAAcA,CAAO,IAAIiZ,CAAQ,GACjC,cAAcjZ,CAAO,IAAIiZ,CAAQ,IAAIC,CAAU,GAC/Cpf,EACA,CAAE,wBAAyBwf,CAAA,CAAO,EAGpC,OACE9X,EAAAA,KAAC,OAAA,CAAK,UAAU,sBAAsB,cAAY,QAC/C,SAAA,CAAA3I,EACDC,EAAAA,IAAC,OAAA,CACE,GAAG6C,EACJ,IAAApB,EACA,UAAWif,EAEX,aAAYJ,GAAA,KAAAA,EAAkBzd,EAAK,YAAY,EAE9C,WAAS,KAAO4d,CAAA,CAAA,CACnB,EACF,CAEJ,CAAC,EC9DKE,GAAc,CAClB,UACA,SACA,QACA,SACA,WACA,QACA,UACA,aACA,mDACA,GAAG,CACD,SACA,OACA,WACA,QACA,SACA,UACA,YACA,WACA,aACA,SACA,WACA,mBACA,gBACA,SACA,KAAA,EACA,IAAKC,GAAS,UAAUA,CAAI,IAAI,CACpC,EAAE,KAAK,GAAG,EAiBH,SAASC,GACd3pB,EACA4pB,EAA0B5pB,EAAM,cACvB,OACT,GAAIA,EAAM,iBAAkB,MAAO,GACnC,MAAM6C,EAAS7C,EAAM,OACf6pB,GAAU9oB,EAAA8B,GAAA,YAAAA,EAAQ,QAAQ4mB,MAAhB,KAAA1oB,EAAgC,KAChD,GAAI8oB,IAAY,MAAQA,IAAYD,EAAS,MAAO,GACpD,MAAME,EAAM9pB,EAAM,cAClB,OAAI4pB,IAAYE,GAAO,CAACjnB,GAAU,EAACinB,GAAA,MAAAA,EAAK,SAASjnB,IAAgB,GAC1D,EAAEgnB,GAAWC,EAAI,SAASD,CAAO,EAC1C,CCrDA,SAASE,GAAc7R,EAAsB,CAC3C,OACEA,IAAQ,QACRA,IAAQ,YACRA,IAAQ,WACRA,IAAQ,UACPA,EAAI,WAAW,OAAO,GAAKA,IAAQ,aAExC,CAcO,SAAS8R,GAAoC1f,EAAU2f,EAAY,GAAyB,CACjG,GAAI,CAACA,EAAW,MAAO,CAAC,CAAA,EAAI3f,CAAK,EACjC,MAAMsf,EAAmC,CAAA,EACnCE,EAA+B,CAAA,EACrC,SAAW,CAAC5R,EAAKzZ,CAAK,IAAK,OAAO,QAAQ6L,CAAK,GAC5Cyf,GAAc7R,CAAG,EAAI0R,EAAUE,GAAK5R,CAAG,EAAIzZ,EAE9C,MAAO,CAACmrB,EAASE,CAAQ,CAC3B,CCQO,MAAMI,GAAO7qB,EAAM,WAAyD,SACjF,CACE,UAAAyK,EACA,QAAAkG,EAAU,WACV,SAAAnH,EACA,SAAAqH,EACA,MAAA9F,EACA,OAAA2Z,EACA,QAAAoG,EACA,UAAAnoB,EACA,cAAeqI,EAAa,OAC5B,GAAGsB,CACL,EACApB,EACA,OACA,MAAM6f,EAAc,CAAC,CAACD,GAAW,CAACja,EAK5B,CAAC0Z,EAASE,CAAG,EAAIE,GAAkBre,EAAM,CAAC,CAACwe,CAAO,EAClDE,EAAazqB,EAAAA,OAA8B,IAAI,EAK/Cyc,EAAiB9K,GAA2C,CAChEvP,GAAA,MAAAA,EAAYuP,GACR,GAAC6Y,GAAe7Y,EAAE,SAAW8Y,EAAW,WACxC9Y,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACF4Y,GAAA,MAAAA,EAAU5Y,GAEd,EAMM+Y,EAAe/Y,GAAwC,CACvDoY,GAAWpY,EAAG8Y,EAAW,OAAO,eAAa9Y,GACnD,EAEA,OACEC,EAAAA,KAAC,MAAA,CACC,IAAAjH,EACA,cAAaF,EACb,UAAWe,EAAG,YAAa,aAAa4E,CAAO,GAAIlG,EAAW,CAC5D,cAAeoG,EACf,wBAAyBka,CAAA,CAC1B,EACA,GAAGN,EAGJ,gBAAeK,EAAU,OAAYja,GAAY4Z,EAAI,eAAe,EACpE,QAASM,EAAcE,EAAc,OACrC,UAAWjO,EAEX,SAAA,CAAA7K,EAAAA,KAAC,MAAA,CACE,GAAGoY,EACJ,IAAKS,EACL,UAAU,qBAKV,KAAMF,EAAU,SAAW,OAC3B,UAAUppB,EAAA6oB,EAAQ,WAAR,KAAA7oB,EAAqBqpB,EAAc,EAAI,OACjD,gBAAeD,EAAUja,GAAY0Z,EAAQ,eAAe,EAAI,OAE/D,SAAA,CAAAxf,GAAStB,EAAAA,IAAC,MAAA,CAAI,UAAU,mBAAoB,SAAAsB,EAAM,EAClDvB,CAAA,CAAA,CAAA,EAGFkb,GAAUjb,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAqB,SAAAib,CAAA,CAAO,CAAA,CAAA,CAAA,CAG5D,CAAC,EC3FYwG,GAAOlrB,EAAM,WAAsD,SAC9E,CACE,UAAAyK,EACA,MAAA4H,EACA,MAAAjT,EACA,KAAA+rB,EACA,KAAAra,EACA,KAAAsa,EAAO,UACP,QAAAza,EAAU,OACV,KAAA4B,EACA,SAAA/I,EACA,cAAewB,EAAa,OAC5B,GAAGsB,CACL,EACApB,EACA,CACA,MAAMmT,EAAO9L,EAAO,IAAM,MAC1B,OACEJ,EAAAA,KAACkM,EAAA,CACE,GAAG/R,EACJ,IAAApB,EACC,GAAIqH,EAAO,CAAE,KAAAA,CAAA,EAAS,CAAA,EACvB,cAAavH,EACb,UAAWe,EACT,YACA,aAAa4E,CAAO,GACpB,kBAAkBya,CAAI,GACtB,CAAE,iBAAkB,CAAC,CAAC7Y,EAAM,sBAAuB,CAAC,CAACzB,CAAA,EACrDrG,CAAA,EAGD,SAAA,CAAAqG,QACE,OAAA,CAAK,UAAU,kBAAkB,cAAY,OAC3C,SAAA,OAAOA,GAAS,SAAWrH,MAACc,IAAK,KAAMuG,EAAM,KAAM,GAAI,EAAKA,EAC/D,EACE,KACJrH,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAoB,SAAA4I,EAAM,EAC1C5I,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAoB,SAAArK,EAAM,EACzC+rB,EAAO1hB,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAmB,WAAK,EAAU,KACzDD,EAAWC,EAAAA,IAAC,MAAA,CAAI,UAAU,mBAAoB,SAAAD,EAAS,EAAS,IAAA,CAAA,CAAA,CAGvE,CAAC,EASY6hB,GAAYrrB,EAAM,WAA8D,SAC3F,CAAE,UAAAyK,EAAW,MAAAiE,EAAO,aAAA4c,EAAc,SAAA9hB,EAAU,GAAG8C,CAAA,EAC/CpB,EACA,CACA,MAAMuW,EAAQ,OAAO6J,GAAiB,SAAW,GAAGA,CAAY,KAAOA,EACvE,OACE7hB,EAAAA,IAAC,MAAA,CACE,GAAG6C,EACJ,IAAApB,EACA,UAAWa,EAAG,kBAAmBtB,CAAS,EAC1C,MAAOgX,IAAU,OAAY/S,EAAS,CAAE,GAAGA,EAAO,kBAAmB+S,CAAA,EAEpE,SAAAjY,CAAA,CAAA,CAGP,CAAC,ECnCY+hB,GAAOvrB,EAAM,WAA2D,SACnF,CACE,MAAAqS,EACA,QAAA6F,EACA,UAAAzN,EACA,WAAA+gB,EACA,KAAA1a,EACA,SAAA2a,EACA,YAAajZ,EAEb,UAAWkZ,EACX,cAAejZ,EACf,kBAAmBkZ,EACnB,OAAAC,EACA,KAAArZ,EACA,OAAA/O,EAAS,SACT,SAAAqoB,EACA,QAAAlb,EAAU,SACV,KAAA/F,EAAO,SACP,MAAAE,EAAQ,UACR,SAAA+F,EAAW,GACX,QAAAia,EACA,gBAAAgB,EAAkB,SAClB,cAAe9gB,EACf,GAAGsB,CACL,EACApB,EACA,SACA,MAAM6H,EAAY/S,EAAM,OAAyB,IAAI,EAC/CgrB,EAAahrB,EAAM,OAA+B,IAAI,EAEtDgT,EAAerS,GAAiE,CACpF6R,GAAA,MAAAA,EAAkB7R,EACpB,EAGMsS,EAAiBtS,GAAmE,OACxF8R,GAAA,MAAAA,EAAoB9R,GACfkQ,IACHnP,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAEhC,EAEMorB,EAAqBprB,GAA4B,CACrDgrB,GAAA,MAAAA,EAAwBhrB,GACxBA,EAAM,gBAAA,CACR,EAEMwL,EAAUJ,EACd,YACA,QAAQ4E,CAAO,GACf,kBAAkB/F,CAAI,GACtBE,IAAU,WAAa,mBAAmBA,CAAK,GAC/CL,EACA,CAAE,gBAAiBoG,EAAU,gBAAiBgb,CAAA,CAAS,EAGnDG,EAAY,CAAC,CAACP,GAClBhiB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,yBACV,aAAYqiB,EACZ,SAAAjb,EACA,QAAS4a,EACT,YAAaM,EAEZ,SAAAP,GAA0B/hB,EAAAA,IAACc,GAAA,CAAK,KAAK,SAAS,KAAM,GAAI,KAAM,CAAA,CAAG,CAAA,CAAA,EAKhE0hB,EACJ9Z,EAAAA,KAAAkE,EAAAA,SAAA,CACG,SAAA,CAAAvF,GAAQrH,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAmB,SAAAqH,EAAK,QAChD,OAAA,CAAK,GAAIoH,EAAS,UAAU,mBAC1B,SAAA7F,CAAA,CACH,CAAA,EACF,EAGI6Z,EACJ/Z,EAAAA,KAAAkE,EAAAA,SAAA,CACG,SAAA,CAAA2V,EACDviB,EAAAA,IAACwC,GAAA,CAAO,UAAW8G,CAAA,CAAW,CAAA,EAChC,EAGF,GAAI6Y,GAAUrZ,EACZ,OACEJ,EAAAA,KAAC,IAAA,CACC,IAAAjH,EACA,cAAaF,GAAA,KAAAA,EAAc,YAC3B,UAAWmB,EACX,KAAAoG,EACA,YAAAS,EACA,cAAAC,EACA,OAAAzP,EACC,GAAG8I,EAEJ,KAAK5K,EAAA4K,EAAK,MAAL,KAAA5K,EAAY,aACjB,UAAWgqB,EAEV,SAAA,CAAAO,EACAC,CAAA,CAAA,CAAA,EAKP,MAAMC,EAAY,CAAC,CAACrB,GAAW,CAACja,EAK1B,CAAC0Z,EAASE,CAAG,EAAIE,GAAkBre,EAAM,CAAC,CAACwe,CAAO,EAIlDnoB,EAAahC,GAAgD,CACjE+qB,GAAA,MAAAA,EAAgB/qB,GACZ,GAACwrB,GAAaxrB,EAAM,SAAWqqB,EAAW,WAC1CrqB,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzCA,EAAM,eAAA,EACNmqB,GAAA,MAAAA,IAEJ,EAMMsB,EAAezrB,GAA6C,CAC5D2pB,GAAW3pB,EAAOqqB,EAAW,OAAO,IACrCF,GAAA,MAAAA,EAAmEnqB,GAExE,EAEA,OACEwR,EAAAA,KAAC,OAAA,CACC,IAAAjH,EACA,cAAaF,GAAA,KAAAA,EAAc,OAC3B,UAAWmB,EACV,GAAGse,EAGJ,gBAAeK,EAAU,OAAYja,GAAY4Z,EAAI,eAAe,EACpE,QAAS0B,EAAYC,EAAc,OACnC,UAAAzpB,EACA,YAAAqQ,EACA,cAAAC,EAEA,SAAA,CAAAxJ,EAAAA,IAAC,OAAA,CACE,GAAG8gB,EACJ,IAAKS,EACL,UAAU,qBAKV,KAAMF,EAAU,SAAW,OAC3B,UAAU7hB,EAAAshB,EAAQ,WAAR,KAAAthB,EAAqBkjB,EAAY,EAAI,OAC/C,gBAAerB,EAAUja,GAAY0Z,EAAQ,eAAe,EAAI,OAE/D,SAAA0B,CAAA,CAAA,EAGFC,CAAA,CAAA,CAAA,CAGP,CAAC,ECxMM,SAASG,GAAU,CACxB,QAAAhkB,EACA,MAAAjJ,EACA,SAAAktB,EACA,SAAAxrB,EACA,KAAA8J,EAAO,SACP,MAAAE,EAAQ,UACR,SAAA+F,EACA,UAAApG,EACA,GAAG6B,CACL,EAAuC,OACrC,MAAMigB,EAAiB,IACjBntB,GAAS,KAAa,CAAA,EACnB,MAAM,QAAQA,CAAK,EAAIA,EAAQ,CAACA,CAAK,EAExCotB,EAAcC,GAA4BF,EAAA,EAAiB,SAASE,CAAM,EAE1Exa,EAAUwa,GAAyB,CACvC,GAAIH,EAAU,CACZ,MAAMprB,EAAUqrB,EAAA,EACVhrB,EAAOL,EAAQ,SAASurB,CAAM,EAAIvrB,EAAQ,OAAQwrB,GAAMA,IAAMD,CAAM,EAAI,CAAC,GAAGvrB,EAASurB,CAAM,EACjG3rB,GAAA,MAAAA,EAAWS,EACb,MACET,GAAA,MAAAA,EAAW2rB,EAEf,EAEA,aAEG,MAAA,CAAK,GAAGngB,EAAM,MAAM5K,EAAA4K,EAAK,OAAL,KAAA5K,EAAa,QAAS,UAAWqK,EAAG,kBAAmBtB,CAAS,EAClF,SAAApC,EAAQ,IAAKokB,GACZhjB,EAAAA,IAAC8hB,GAAA,CAEC,MAAOkB,EAAO,MACd,KAAMA,EAAO,KACb,KAAA7hB,EACA,MAAAE,EACA,SAAU0hB,EAAWC,EAAO,KAAK,EACjC,QAASD,EAAWC,EAAO,KAAK,EAAI,SAAW,WAC/C,SAAU,CAAC,EAAE5b,GAAY4b,EAAO,UAChC,QAAS,IAAMxa,EAAOwa,EAAO,KAAK,CAAA,EAR7BA,EAAO,KAAA,CAUf,CAAA,CACH,CAEJ,CC9DO,MAAME,GAAsD,CACjE,CAAE,KAAM,EAAG,MAAO,MAAA,EAClB,CAAE,KAAM,EAAG,MAAO,SAAA,CACpB,EAyBO,SAASC,GAAWC,EAAeC,EAAmD,CAC3F,IAAIhiB,EAAoB,UACpBiiB,EAAO,KACX,UAAWjK,KAAagK,EAClBD,GAAS/J,EAAU,MAAQA,EAAU,MAAQiK,IAC/CjiB,EAAQgY,EAAU,MAClBiK,EAAOjK,EAAU,MAGrB,OAAOhY,CACT,CAGO,MAAMkiB,GAAQhtB,EAAM,WAAuC,SAChE,CACE,UAAAyK,EACA,MAAArL,EACA,IAAAogB,EACA,MAAAnN,EACA,KAAA0K,EACA,QAAAkQ,EAAU,KACV,WAAAH,EAAaH,GACb,MAAA7hB,EACA,SAAAoiB,EACA,cAAeliB,EAAa,QAC5B,GAAGsB,CACL,EACApB,EACA,CACA,MAAM2hB,EAAQrN,EAAM,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGpgB,EAAQogB,CAAG,CAAC,EAAI,EAC1D4L,EAAOtgB,GAAA,KAAAA,EAAS8hB,GAAWC,EAAOC,CAAU,EAClD,OACE3a,EAAAA,KAAC,MAAA,CACE,GAAG7F,EACJ,IAAApB,EACA,KAAK,QACL,aAAYmH,EACZ,gBAAejT,EACf,gBAAe,EACf,gBAAeogB,EACf,iBAAgB,GAAGpgB,CAAK,IAAI6tB,CAAO,IAAIzN,CAAG,GAC1C,cAAaxU,EACb,UAAWe,EAAG,aAAc,oBAAoBqf,CAAI,GAAI,CAAE,sBAAuB8B,CAAA,EAAYziB,CAAS,EAEtG,SAAA,CAAAhB,MAAC,QAAK,UAAU,oBAAoB,cAAY,OAC9C,eAAC,OAAA,CAAK,UAAU,mBAAmB,MAAO,CAAE,MAAO,GAAGojB,EAAQ,GAAG,KAAO,EAC1E,EACCK,EAAW,KACVzjB,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAmB,cAAY,OAC5C,SAAAsT,IAAS,OACR5K,EAAAA,KAAAkE,EAAAA,SAAA,CACE,SAAA,CAAA5M,EAAAA,IAAC,IAAA,CAAE,UAAU,oBAAqB,SAAArK,EAAM,EACxC+S,EAAAA,KAAC,OAAA,CAAK,UAAU,iBACb,SAAA,CAAA,IACA8a,EAAQ,IAAEzN,CAAA,CAAA,CACb,CAAA,EACF,EACE,OAAOzC,GAAS,WAClBA,EAAK3d,EAAOogB,CAAG,EAEfzC,CAAA,CAEJ,CAAA,CAAA,CAAA,CAIR,CAAC,EClFYoQ,GAAY3iB,EAAAA,WAA6C,SACpE,CAAE,IAAAuU,EAAK,IAAAC,EAAK,SAAAoO,EAAU,KAAAlc,EAAO,GAAM,YAAAmc,EAAa,UAAA5iB,EAAW,QAAA6iB,EAAS,GAAGhhB,CAAA,EACvEpB,EACA,OACA,KAAM,CAACqiB,EAAQC,CAAS,EAAI7tB,EAAAA,SAAS,EAAK,EACpC,CAACqgB,EAASyN,CAAU,EAAI9tB,EAAAA,SAAS,CAACuR,CAAI,EACtCwc,EAASntB,EAAAA,OAAgC,IAAI,EAC7CotB,EAAUvgB,GAAWlC,EAAKwiB,CAAM,EAEtC9tB,EAAAA,UAAU,IAAM,CACd,GAAI,CAACsR,GAAQ8O,EAAS,OACtB,MAAMvd,EAAKirB,EAAO,QAClB,GAAI,CAACjrB,EAAI,OACT,GAAI,OAAO,sBAAyB,YAAa,CAC/CgrB,EAAW,EAAI,EACf,MACF,CACA,MAAMG,EAAK,IAAI,qBAAsBjL,GAAY,CAC3CA,EAAQ,KAAMC,GAAUA,EAAM,cAAc,IAC9C6K,EAAW,EAAI,EACfG,EAAG,WAAA,EAEP,CAAC,EACD,OAAAA,EAAG,QAAQnrB,CAAE,EACN,IAAMmrB,EAAG,WAAA,CAClB,EAAG,CAAC1c,EAAM8O,CAAO,CAAC,EAElB,MAAM6N,EAAeN,GAAU,CAACxO,EAC1B+O,EAAentB,GAAwD,CAC3E6sB,EAAU,EAAI,EACdF,GAAA,MAAAA,EAAU3sB,EACZ,EAEA,OACEwR,EAAAA,KAAC,OAAA,CACC,UAAWpG,EAAG,kBAAmBtB,EAAW,CAAE,yBAA0BojB,EAAc,EACtF,MAAOR,GAAe,KAAO,CAAE,YAAa,OAAOA,CAAW,GAAM,OAEnE,SAAA,CAAAQ,GAAgBT,EAAW3jB,EAAAA,IAAC,OAAA,CAAK,UAAU,4BAA6B,WAAS,EAAU,KAC1FokB,EAcE,KAbFpkB,EAAAA,IAAC,MAAA,CACE,GAAG6C,EACJ,IAAKqhB,EACL,UAAU,uBACV,IAAK3N,EAAUjB,EAAM,OACrB,IAAKC,GAAA,KAAAA,EAAO,GAIZ,QAAS9N,EAAO,OAAS5E,EAAK,QAC9B,UAAU5K,EAAA4K,EAAK,WAAL,KAAA5K,EAAiB,QAC3B,QAASosB,CAAA,CAAA,CAET,CAAA,CAAA,CAGV,CAAC,ECJYC,GAAYvjB,EAAAA,WAA2C,SAClE,CACE,IAAAuU,EACA,QAAAiP,EACA,SAAAnC,EACA,SAAAoC,EACA,SAAAb,EACA,aAAAc,EACA,SAAAC,EACA,OAAAC,EACA,KAAAld,EAAO,GACP,SAAAL,EACA,WAAAwd,EAAa,IACb,UAAA5jB,EAEA,QAAS6jB,EACT,UAAW5C,EACX,aAAc6C,EACd,aAAcC,EACd,GAAGliB,CACL,EACApB,EACA,OAGA,KAAM,CAACqf,EAASE,CAAG,EAAIE,GAAkBre,CAAI,EACvC+I,EAAU9U,EAAAA,OAA8B,IAAI,EAC5CyqB,EAAazqB,EAAAA,OAA8B,IAAI,EAC/CotB,EAAUvgB,GAAWlC,EAAKmK,CAAO,EACjC,CAACoZ,EAASC,CAAU,EAAI/uB,EAAAA,SAA+C,IAAI,EAC3EgvB,EAAQpuB,EAAAA,OAA6C,IAAI,EAEzDquB,EAAa,IAAY,CACzBD,EAAM,UACR,aAAaA,EAAM,OAAO,EAC1BA,EAAM,QAAU,KAEpB,EACME,EAAWluB,GAAkD,CACjE4tB,GAAA,MAAAA,EAAmB5tB,GACf,EAAAutB,GAAgB,MAAQrd,KAC5B+d,EAAA,EACAD,EAAM,QAAU,WAAW,IAAM,OAC/B,MAAM9hB,GAAOnL,EAAA2T,EAAQ,UAAR,YAAA3T,EAAiB,wBAC1BmL,GAAM6hB,EAAW,CAAE,IAAK7hB,EAAK,IAAK,KAAMA,EAAK,MAAQ,EAAG,CAC9D,EAAGwhB,CAAU,EACf,EACMS,EAAWnuB,GAAkD,CACjE6tB,GAAA,MAAAA,EAAmB7tB,GACnBiuB,EAAA,EACAF,EAAW,IAAI,CACjB,EACA9uB,YAAU,IAAMgvB,EAAY,EAAE,EAE9B,MAAM7D,EAAc,CAAC,CAACkD,GAAY,CAACpd,EAQ7Bia,EAAWnqB,GAAkD,CACjE,GAAIkQ,EAAU,OACd,MAAMke,EAAUzE,GAAW3pB,EAAOqqB,EAAW,OAAO,EACpDsD,GAAA,MAAAA,EAAc3tB,GACVouB,IAASd,GAAA,MAAAA,IACf,EAGMtrB,EAAahC,GAAqD,CACtE+qB,GAAA,MAAAA,EAAgB/qB,GACZ,GAACoqB,GAAepqB,EAAM,SAAWqqB,EAAW,WAC5CrqB,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzCA,EAAM,eAAA,EACNstB,GAAA,MAAAA,IAEJ,EAEA,OACE9b,EAAAA,KAAC,MAAA,CACE,GAAGsY,EACJ,IAAKkD,EACL,UAAW5hB,EAAG,kBAAmBtB,EAAW,CAC1C,4BAA6BohB,EAC7B,4BAA6Bhb,EAC7B,+BAAgCka,CAAA,CACjC,EACD,QAAAD,EACA,UAAAnoB,EACA,aAAcksB,EACd,aAAcC,EAEd,SAAA,CAAA3c,EAAAA,KAAC,MAAA,CACE,GAAGoY,EACJ,IAAKS,EACL,UAAU,2BAKV,KAAMiD,EAAW,SAAW1D,EAAQ,KACpC,UAAU7oB,EAAA6oB,EAAQ,WAAR,KAAA7oB,EAAqBqpB,EAAc,EAAI,OACjD,eAAckD,EAAYpC,GAAA,KAAAA,EAAY,GAAStB,EAAQ,cAAc,EACrE,gBAAe1Z,GAAY0Z,EAAQ,eAAe,EAElD,SAAA,CAAA9gB,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACb,SAAAA,EAAAA,IAAC0jB,IAAU,IAAApO,EAAU,KAAA7N,EAAY,SAAAkc,EAAoB,CAAA,CACvD,EACCY,EAAUvkB,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAA4B,WAAQ,EAAS,IAAA,CAAA,CAAA,EAGxE0kB,EAAW1kB,EAAAA,IAAC,MAAA,CAAI,UAAU,qDAAsD,WAAS,EAAS,KAClG2kB,EAAS3kB,EAAAA,IAAC,MAAA,CAAI,UAAU,mDAAoD,WAAO,EAAS,KAC5FglB,GAAW,OAAO,UAAa,YAC5B/X,GAAAA,aACEjN,EAAAA,IAAC,MAAA,CACC,UAAU,2BACV,MAAO,CAAE,SAAU,QAAS,IAAKglB,EAAQ,IAAK,KAAMA,EAAQ,IAAA,EAE3D,SAAA,OAAOP,GAAiB,SAAWzkB,MAAC,OAAI,IAAKykB,EAAc,IAAI,EAAA,CAAG,EAAKA,CAAA,CAAA,EAE1E,SAAS,IAAA,EAEX,IAAA,CAAA,CAAA,CAGV,CAAC,EC3KM,SAASc,GAAa,CAC3B,MAAApsB,EACA,WAAAqsB,EACA,UAAAC,EAAY,IACZ,UAAAC,EACA,IAAAC,EAAM,EACN,SAAAnrB,EAAW,EACX,QAAAme,EACA,aAAAiN,EAAe,GACf,WAAAC,EACA,UAAA7kB,EACA,MAAAiE,CACF,EAA0C,CACxC,MAAM6gB,EAAchvB,EAAAA,OAA8B,IAAI,EAChD,CAACkhB,EAAO+N,CAAQ,EAAI7vB,EAAAA,SAAS,CAAC,EAC9B,CAAC+N,EAAQ+hB,CAAS,EAAI9vB,EAAAA,SAAS,CAAC,EAChC,CAAC+vB,EAAOC,CAAQ,EAAIhwB,EAAAA,SAAS,EAAK,EAExCC,EAAAA,UAAU,IAAM,CACd,MAAM6C,EAAK8sB,EAAY,QACvB,GAAI,CAAC9sB,GAAM,OAAO,gBAAmB,YAAa,OAClD,MAAMmtB,EAAK,IAAI,eAAe,IAAM,CAClCJ,EAAS/sB,EAAG,WAAW,EACvBgtB,EAAUhtB,EAAG,YAAY,EACzBktB,EAAS,EAAI,CACf,CAAC,EACD,OAAAC,EAAG,QAAQntB,CAAE,EACN,IAAMmtB,EAAG,WAAA,CAClB,EAAG,CAAA,CAAE,EAEL,MAAMC,EAAOxrB,EAAAA,QACX,IAAOod,GAAS,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,OAAOA,EAAQ2N,IAAQF,EAAYE,EAAI,CAAC,EACjF,CAAC3N,EAAO2N,EAAKF,CAAS,CAAA,EAElBY,EAAW,KAAK,KAAKltB,EAAM,OAASitB,CAAI,EACxCE,EAAKlsB,GAAe,CACxB,UAAWisB,EACX,WAAYX,EAAYC,EACxB,eAAgB1hB,GAAU,EAC1B,SAAAzJ,CAAA,CACD,EAEK+rB,EAAkC,CACtC,QAAS,OACT,oBAAqB,4BAA4Bd,CAAS,YAC1D,IAAAE,EACA,aAAcD,CAAA,EAEVc,EAAgC,CACpC,QAAS,OACT,oBAAqB,UAAUJ,CAAI,oBACnC,IAAAT,EACA,OAAQD,EACR,aAAcC,CAAA,EAGhB,IAAIc,EACJ,OAAI9N,EACF8N,EACEzmB,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAAyB,MAAOumB,EAC5C,SAAA,MAAM,KAAK,CAAE,OAAQX,CAAA,CAAc,EAAE,IAAI,CAACjL,EAAG1gB,IAC5C+F,EAAAA,IAAC,MAAA,CAAY,UAAU,4BAA4B,MAAO,CAAE,OAAQ0lB,CAAA,CAAU,EAApEzrB,CAAuE,CAClF,CAAA,CACH,EAEOd,EAAM,SAAW,EAC1BstB,EAAOzmB,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAA0B,SAAA6lB,EAAW,EACjDI,EASVQ,EACEzmB,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAAyB,MAAO,CAAE,OAAQsmB,EAAG,YAAa,SAAU,UAAA,EACjF,SAAAtmB,EAAAA,IAAC,MAAA,CACC,UAAU,wBACV,MAAO,CAAE,SAAU,WAAY,IAAK,EAAG,KAAM,EAAG,MAAO,EAAG,UAAW,cAAcsmB,EAAG,OAAO,KAAA,EAE5F,eAAM,KAAK,CAAE,OAAQ,KAAK,IAAI,EAAGA,EAAG,SAAWA,EAAG,UAAU,CAAA,CAAG,EAAE,IAAI,CAAC3L,EAAG+L,IAAM,CAC9E,MAAMC,EAAML,EAAG,WAAaI,EAC5B,aACG,MAAA,CAAc,UAAU,uBAAuB,MAAOF,EACpD,SAAA,MAAM,KAAK,CAAE,OAAQJ,EAAM,EAAE,IAAI,CAACzL,EAAGiM,IAAM,CAC1C,MAAMlM,EAAQiM,EAAMP,EAAOQ,EAC3B,OAAOlM,EAAQvhB,EAAM,OACnB6G,EAAAA,IAACzJ,EAAM,SAAN,CAAwB,SAAAivB,EAAWrsB,EAAMuhB,CAAK,EAAGA,CAAK,CAAA,EAAlCkM,CAAoC,EACvD,IACN,CAAC,GANOD,CAOV,CAEJ,CAAC,CAAA,CAAA,EAEL,EA5BFF,EACEzmB,EAAAA,IAAC,OAAI,UAAU,yBAAyB,MAAOumB,EAC5C,SAAAptB,EAAM,IAAI,CAAC0tB,EAAMnM,IAChB1a,MAACzJ,EAAM,SAAN,CAA4B,SAAAivB,EAAWqB,EAAMnM,CAAK,CAAA,EAA9BA,CAAgC,CACtD,CAAA,CACH,EA4BF1a,EAAAA,IAAC,MAAA,CAAI,IAAK8lB,EAAa,UAAWxjB,EAAG,kBAAmBtB,CAAS,EAAG,MAAAiE,EAAc,SAAUqhB,EAAG,SAC5F,SAAAG,EACH,CAEJ,CC9GA,MAAMK,GAAY/lB,EAAAA,WAA0D,SAC1E,CACE,SAAAhB,EACA,QAAAkU,EACA,KAAAzX,EACA,UAAAwE,EACA,UAAAiX,EAAY,OACZ,SAAA8O,EAAW,OACX,KAAA5lB,EAAO,QACP,oBAAAkK,EAAsB,GACtB,OAAA2b,EAAS,GACT,uBAAAC,EAAyB,GACzB,KAAArG,EAAO,SACP,WAAAtV,EAAa,GACb,GAAGzI,CACL,EACApB,EACA,CACA,KAAM,CAACgK,EAASC,CAAU,EAAIxV,WAAA,EAExB6e,EAAUje,EAAAA,OAAuB,IAAI,EACrCyqB,EAAazqB,EAAAA,OAAuB,IAAI,EACxCowB,EAAmBvjB,GAA2BlC,EAAK8f,CAAU,EAsBnE,GApBAnrB,GAAoB,IAAM,CACxBsV,EAAW,SAAS,IAAI,CAC1B,EAAG,CAAA,CAAE,EAELvV,EAAAA,UAAU,IAAM,CACd,GAAI,CAACqG,GAAQ,CAAC8O,GAAc,CAAC2I,EAC3B,OAEF,MAAM/a,EAAahC,GAAyB,CAGtCA,EAAM,MAAQ,UAAY,CAACA,EAAM,kBAAoB8S,GAAkB+K,EAAQ,OAAO,GACxFd,EAAA,CAEJ,EACA,gBAAS,iBAAiB,UAAW/a,CAAS,EAEvC,IAAM,SAAS,oBAAoB,UAAWA,CAAS,CAChE,EAAG,CAACsD,EAAM8O,EAAY2I,CAAO,CAAC,EAE1B,CAACxI,EACH,OAAOzL,EAAAA,IAAA4M,EAAAA,SAAA,EAAE,EAGX,MAAMua,EAAaH,EAAS,OAAS,MAErC,OAAO/Z,GAAAA,aACLjN,EAAAA,IAACgV,GAAAA,cAAA,CACC,QAAS,CACP,OAAQ,IACR,MAAO,IACP,KAAM,GAAA,EAER,GAAIxY,EACJ,WAAY,CACV,OAAQ,6BACR,aAAc,oCACd,WAAY,kCACZ,MAAO,4BACP,YAAa,mCACb,UAAW,iCACX,KAAM,2BACN,WAAY,iCAAA,EAEd,OAAQ,CAACyqB,EACT,aAAY,GACZ,cAAa,GACb,QAAAlS,EAEA,SAAA/U,EAAAA,IAAC,MAAA,CACC,IAAK+U,EACL,0BAAwB,GACxB,UAAWzS,EAAG,sBAAuB,QAAQykB,CAAQ,GAAI,QAAQ5lB,CAAI,EAAE,EACvE,QAASkK,GAAuB4I,EAAUA,EAAU,OAEpD,SAAAjU,EAAAA,IAACmnB,EAAA,CACC,IAAKD,EACL,UAAW5kB,EAAG,aAAc,QAAQnB,CAAI,GAAI,QAAQ8W,CAAS,GAAIjX,CAAS,EAC1E,QAAUyH,GAAMA,EAAE,gBAAA,EAClB,KAAAmY,EACA,aAAW,OACV,GAAG/d,EAEH,SAAA9C,CAAA,CAAA,CACH,CAAA,CACF,CAAA,EAEF0L,CAAA,CAEJ,CAAC,EAMM,SAAS2b,GAAO,CAAE,UAAApmB,EAAW,SAAAjB,GAA4C,CAC9E,aAAQ,MAAA,CAAI,UAAWuC,EAAG,qBAAsBtB,CAAS,EAAI,SAAAjB,EAAS,CACxE,CAMO,SAASsnB,GAAQ,CAAE,UAAArmB,EAAW,SAAAjB,GAA6C,CAChF,aAAQ,MAAA,CAAI,UAAWuC,EAAG,sBAAuBtB,CAAS,EAAI,SAAAjB,EAAS,CACzE,CAMO,SAASunB,GAAO,CAAE,UAAAtmB,EAAW,SAAAjB,GAA4C,CAC9E,aAAQ,MAAA,CAAI,UAAWuC,EAAG,qBAAsBtB,CAAS,EAAI,SAAAjB,EAAS,CACxE,CAEO,MAAMwnB,GAAQ,OAAO,OAAOT,GAAW,CAC5C,OAAAQ,GAAA,OACAF,GACA,QAAAC,EACF,CAAC,ECpJM,SAASG,GAAyBC,EAAqBC,EAA8B,CAC1F,MAAMC,EAAO,KAAK,MAAMF,EAAcC,CAAY,EAElD,OAAOD,EAAcC,IAAiB,EAAIC,EAAO,EAAIA,CACvD,CAEO,SAASC,GACdpuB,EACAkuB,EACAD,EACAI,EACQ,CACR,MAAMC,EAAaN,GAAyBC,EAAaC,CAAY,EAErE,OAAIluB,IAAgBiuB,EAAcC,EACzB,EAGLG,GAAwBruB,EAAckuB,GAAgBluB,IAAgB,EACjEsuB,EAGLtuB,IAAgB,EACXiuB,EAAcC,IAAiB,EAAII,EAAaA,EAAa,EAG/DJ,EAAe,EAAI,KAAK,MAAMluB,EAAckuB,CAAY,EAAI,EAAI,CACzE,CAEO,SAASK,GAAa7wB,EAAoE,CAC/F,MAAO,EAAEA,aAAiB,MAC5B,CAEO,SAAS8wB,GACd9wB,EACwC,CACxC,OAAQ6wB,GAAa7wB,CAAK,GAAKA,EAAM,uBAAuB,YAAeA,aAAiB,UAC9F,CAEO,SAAS+wB,GACd/wB,EACwC,CACxC,OACE,OAAO,aACL6wB,GAAa7wB,CAAK,GAAKA,EAAM,uBAAuB,YAAeA,aAAiB,WAE1F,CAEO,SAASqM,GAAOrM,EAA8E,CACnG,OAAI8wB,GAAa9wB,CAAK,EACbA,EAAM,QAGX+wB,GAAa/wB,CAAK,EACbA,EAAM,eAAe,CAAC,EAAE,QAG1B,CACT,CAEO,SAASsM,GAAOtM,EAA8E,CACnG,OAAI8wB,GAAa9wB,CAAK,EACbA,EAAM,QAGX+wB,GAAa/wB,CAAK,EACbA,EAAM,eAAe,CAAC,EAAE,QAG1B,CACT,CAEO,SAASgxB,GAAYhxB,EAA6B,CACvD,MAAM6C,EAAS7C,EAAM,QAEjB6C,EAAO,UAAY,KAAOA,EAAO,UAAY,QAC/C7C,EAAM,eAAA,CAEV,CAEO,SAASixB,GAAcT,EAA2C,CAGvE,MAAO,CAAE,MAFK,GAAGU,GAAcV,CAAY,CAAC,GAEnC,CACX,CAEO,SAASU,GAAcV,EAA8B,CAC1D,MAAO,KAAMA,CACf,CAEO,SAASW,GAAgBX,EAAsBD,EAA6B,CACjF,OAAIC,GAAgB,GAAKD,IAAgB,EAChC,EAGLC,EAAeD,EACVA,EAGFC,CACT,CAEO,SAAS1tB,GAAMrE,EAAe2yB,EAAavS,EAAqB,CACrE,OAAO,KAAK,IAAI,KAAK,IAAIpgB,EAAO2yB,CAAG,EAAGvS,CAAG,CAC3C,CAGO,SAASwS,GAAY5yB,EAA6C,CACvE,GAA2BA,GAAU,KAIrC,OAAO,OAAOA,GAAU,SAAW,GAAGA,CAAK,KAAOA,CACpD,CAGO,SAAS6yB,GAAY7yB,EAA6C,CACvE,GAA2BA,GAAU,KAIrC,OAAO,OAAOA,CAAK,CACrB,CAEO,SAAS8yB,GAAcC,EAAoBjB,EAA6B,CAC7E,GAAIiB,GAAc,GAAKjB,IAAgB,EACrC,MAAO,GAGT,MAAMkB,EAAWlB,EAAc,EAE/B,OAAIiB,EAAaC,EACRA,EAGFD,CACT,CCpIO,SAASE,GACdC,EAC2B,CAC3B,MAAMpnB,EAAMlL,EAAM,OAAOsyB,CAAE,EAI3B,OAAAzyB,GAAoB,IAAM,CACxBqL,EAAI,QAAUonB,CAChB,CAAC,EAEMtyB,EAAM,YAAY,IAAIuyB,OAAmBrnB,EAAI,SAAS,GAAGqnB,CAAI,EAAG,EAAE,CAC3E,CCmDA,MAAMC,GAA+B,CACnC,UAAW,GACX,OAAQ,EACR,OAAQ,EACR,MAAO,EACP,MAAO,EACP,KAAM,KACN,QAAS,EACX,EAGMC,GAAgB,EAEhBC,GAAiB,GAEVC,GAAWnoB,EAAAA,WAA0C,SAChE,CACE,aAAcooB,EAAmB,EACjC,WAAYC,EAAiB,EAC7B,SAAArpB,EACA,UAAAiB,EACA,eAAAqoB,EAAiB,GACjB,WAAYC,EACZ,WAAAC,EAAa,GACb,oBAAAC,EACA,cAAAC,EACA,sBAAAC,EACA,aAAcC,EAAY,WAC1B,SAAAC,EAAW,GACX,iBAAAC,EAAmB,IACnB,aAAAC,EAAe,GACf,WAAAC,EACA,YAAAnG,EACA,IAAA+B,EACA,SAAAqE,EACA,iBAAAC,EAAmB,EACrB,EACAxoB,EACA,CACA,MAAMgmB,EAAclxB,EAAM,SAAS,MAAMwJ,CAAQ,EAC3C2nB,EAAeW,GAAgBc,EAAkB1B,CAAW,EAC5DiB,EAAaD,GAAcW,EAAgB3B,CAAW,EACtDyC,EAAaZ,GAAkB7B,EAAc,EAC7C0C,EAAW,KAAK,IAAI,EAAG1C,EAAcC,CAAY,EAEjD,CAAC0C,EAAkBC,CAAmB,EAAIn0B,EAAAA,SAAiBwyB,CAAU,EACrE,CAAC4B,EAAYC,CAAa,EAAIr0B,WAAqB,CACvD,UAAW,MAAA,CACZ,EAEK,CAACs0B,EAAQC,CAAS,EAAIv0B,EAAAA,SAAiB,CAAC,EACxC,CAACw0B,EAAYC,CAAa,EAAIz0B,EAAAA,SAAkB,EAAK,EACrD,CAAC00B,EAAiBC,CAAkB,EAAI30B,EAAAA,SAAwB,IAAI,EAEpE,CAAC40B,EAAkBC,CAAmB,EAAI70B,EAAAA,SAAiB,CAAC,EAC5D,CAAC80B,EAAsBC,CAAuB,EAAI/0B,EAAAA,SAAkB,EAAK,EAEzEg1B,EAAUp0B,EAAAA,OAAuB,IAAI,EACrCq0B,EAAWr0B,EAAAA,OAAuB,IAAI,EACtCs0B,EAAiBznB,GAA2BlC,EAAK0pB,CAAQ,EACzDE,GAAWv0B,EAAAA,OAAuB,IAAI,EACtC,CAACw0B,GAAWC,EAAY,EAAIr1B,EAAAA,SAAkB,EAAK,EAEnDs1B,GAAS10B,EAAAA,OAAe,CAAE,GAAGiyB,GAAsB,EAEzD3yB,GAAoB,IAAM,CACxBm0B,EAAekB,IAAe,CAC5B,GAAGA,EACH,UAAW,EAAA,EACX,CACJ,EAAG,CAAC/D,CAAY,CAAC,EAEjBtxB,GAAoB,IAAM,CACxBi0B,EAAoB3B,CAAU,EAC9Be,GAAA,MAAAA,EAAgBf,GAEZ4B,EAAW,YAAc,QAC3BC,EAAekB,IAAe,CAC5B,GAAGA,EACH,UAAW,EAAA,EACX,CAEN,EAAG,CAAC/C,CAAU,CAAC,EAEf,MAAMgD,GAAa/1B,GAA2B,CAC5C,OAAO,OAAgC61B,GAAO,QAAS71B,CAAK,CAC9D,EAEMg2B,EAAM,IAAO,OAAO,aAAgB,YAAc,YAAY,IAAA,EAAQ,KAAK,IAAA,EAE3EC,GAAalR,GAAkB,CACnC,MAAM3gB,GAASC,GAAM0gB,EAAO,EAAGyP,CAAQ,EAEvCE,EAAoBtwB,EAAM,EAC1BwwB,EAAekB,IAAe,CAAE,GAAGA,EAAW,UAAW,IAAO,EAChEhC,GAAA,MAAAA,EAAgB1vB,GAClB,EAEM8xB,GAAkBC,GAAsB,CAC5CjB,EAAoB9yB,IAAUA,KAAS,KAAOA,IAAQA,GAAO+zB,EAAYrE,GAAeA,CAAY,CACtG,EAEMsE,GAAmBj1B,EAAAA,OAAsB,IAAI,EAE7Ck1B,GAAmBC,GAAqB,CACvCZ,GAAS,UAIdA,GAAS,QAAQ,oBAAoBY,EAAU,YAAc,YAAaxyB,EAAM,EAChF4xB,GAAS,QAAQ,oBAAoBY,EAAU,UAAY,WAAYC,EAAK,EAExED,GACFZ,GAAS,QAAQ,oBAAoB,aAAca,EAAK,EAE5D,EAEMC,GAAUvD,GAAkB1xB,GAA+E,CAC/G,GAAI,CAACm0B,GAAS,QACZ,OAGF,MAAMY,GAAUjE,GAAa9wB,CAAK,EAElC,GAAI+0B,IAAW/0B,EAAM,SAAW,EAC9B,OAGFA,EAAM,gBAAA,EAEN,MAAMk1B,EAAU7oB,GAAOrM,CAAK,EACtBm1B,EAAU7oB,GAAOtM,CAAK,EAE5Bw0B,GAAU,CACR,UAAW,GACX,OAAQU,EACR,OAAQC,EACR,MAAOD,EACP,MAAOT,EAAA,EACP,KAAM,KACN,QAAS,EAAA,CACV,EAEDN,GAAS,QAAQ,iBAAiBY,GAAU,YAAc,YAAaxyB,GAAQ,CAAE,QAAS,GAAO,EACjG4xB,GAAS,QAAQ,iBAAiBY,GAAU,UAAY,WAAYC,EAAK,EAErED,IACFZ,GAAS,QAAQ,iBAAiB,aAAca,EAAK,CAEzD,CAAC,EAEKzyB,GAASmvB,GAAkB1xB,GAAmC,CAClE,GAAI,CAACg0B,EAAQ,SAAW,CAACM,GAAO,QAAQ,UACtC,OAGF,GAAIvD,GAAa/wB,CAAK,GAAKA,EAAM,QAAQ,OAAS,EAChD,OAAOg1B,GAAMh1B,CAAK,EAGpB,MAAMk1B,GAAU7oB,GAAOrM,CAAK,EACtBm1B,EAAU7oB,GAAOtM,CAAK,EACtBo1B,EAASF,GAAUZ,GAAO,QAAQ,OAClCe,EAASF,EAAUb,GAAO,QAAQ,OAGxC,GAAIA,GAAO,QAAQ,OAAS,KAAM,CAChC,GAAI,KAAK,IAAIc,CAAM,EAAItD,IAAiB,KAAK,IAAIuD,CAAM,EAAIvD,GACzD,OAGF,MAAMwD,GAAa,KAAK,IAAIF,CAAM,GAAK,KAAK,IAAIC,CAAM,EAAI,IAAM,IAIhE,GAHAb,GAAU,CAAE,KAAAc,GAAM,QAAS,EAAA,CAAM,EAG7BA,KAAS,IACX,OAAON,GAAMh1B,CAAK,EAGhBuwB,EAAc,GAChBkD,EAAc,EAAI,CAEtB,CAEA,GAAIa,GAAO,QAAQ,OAAS,IAQ5B,IAHAt0B,EAAM,eAAA,EACNA,EAAM,gBAAA,EAEFuwB,EAAc,EAAG,CACnB,MAAMgF,GAAUrC,GAAoB,EAC9BsC,GAAQtC,GAAoBD,EAE5BxuB,GAAU8wB,IAAWH,EAAS,GAAOI,IAASJ,EAAS,EAAKA,EAAS,IAAOA,EAClF7B,EAAU9uB,EAAM,CAClB,CAEA6vB,GAAO,QAAQ,MAAQY,GACvBZ,GAAO,QAAQ,MAAQG,EAAA,EACzB,CAAC,EAEKO,GAAQtD,GAAkB1xB,GAAmC,CACjE,GAAI,CAACs0B,GAAO,QAAQ,UAClB,OAGF,MAAMS,GAAUjE,GAAa9wB,CAAK,EAClC80B,GAAgBC,EAAO,EAEvB,KAAM,CAAE,KAAAO,EAAM,QAAAG,EAAS,OAAAC,EAAQ,MAAAC,GAAO,MAAAC,EAAA,EAAUtB,GAAO,QAIvD,GAHAE,GAAU,CAAE,UAAW,GAAO,EAC9Bf,EAAc,EAAK,EAEf6B,IAAS,KAAOG,GAAWlF,EAAc,GAAKyD,EAAQ,QAAS,CACjE,MAAMkB,GAAU7oB,GAAOrM,CAAK,EACtB61B,GAAaX,GAAUQ,EACvBI,GAAgB9B,EAAQ,QAAQ,YAAcxD,EAC9CuF,GAAWH,IAASV,GAAUS,IAAS,KAAK,IAAI,EAAGlB,IAAQmB,EAAK,EAAI,EAE1E,IAAII,GAAcF,GAAgB,EAAI,KAAK,MAAM,CAACD,GAAaC,EAAa,EAAI,EAE5EE,KAAgB,GAAK,KAAK,IAAID,EAAQ,EAAIhE,KAC5CiE,GAAcD,GAAW,EAAI,EAAI,IAGnCrB,GAAUxB,EAAmB8C,EAAW,CAC1C,CAGAzC,EAAU,CAAC,CACb,CAAC,EAEK0C,GAAgBzS,GAAkB,IAAM,CAExC8Q,GAAO,QAAQ,SAIfvB,GACFY,EAAmBnQ,CAAK,CAE5B,EAEM0S,GAAyB1S,GAAkB,IAAMkR,GAAUlR,CAAK,EAEhE2S,GAAgBvB,GAAsB,CAC1C,MAAMwB,GAAgB5F,IAAiB,EACjC6F,EAAcD,GAAgB7F,EAAc,KAAK,KAAKA,EAAcC,CAAY,EAChFluB,EAAc4wB,EAAmB1C,EACjCG,EAAsBJ,EAAcC,GAAgB0C,EAGpDoD,IADe5F,GAA8BpuB,EAAakuB,EAAcD,EAAaI,CAAmB,EAC5EiE,EAAYyB,GAAeA,EAE7D,OAAOD,GAAgBE,GAAYA,GAAY9F,CACjD,EAEM+F,GAAgB,IAAM,CAC1B,GAAI,CAACpE,EACH,OAAOrpB,EAAAA,IAAA4M,EAAAA,SAAA,EAAE,EAGX,MAAMib,EAAsBJ,EAAcC,GAAgB0C,EACpDsD,GAAoBhG,IAAiB,EACrCnuB,EAAQm0B,GAAoBjG,EAAc,KAAK,KAAKA,EAAcC,CAAY,EAC9EiG,EAAgC,CAAA,EAEtC,QAASjT,EAAQ,EAAGA,EAAQnhB,EAAOmhB,IAAS,CAC1C,IAAI8S,GAAY9S,EACZkT,GAAexD,EAEnB,GAAI,CAACsD,GAAmB,CACtB,MAAMG,GAASnT,IAAUnhB,EAAQ,EAC3BC,GAAc4wB,EAAmB1C,EAEvC8F,GAAYK,GAASpG,EAAcC,EAAehN,EAAQgN,EAC1DkG,GAAehG,GAA8BpuB,GAAakuB,EAAcD,EAAaI,CAAmB,CAC1G,CAEA,MAAMiG,GAAWF,KAAiBlT,EAC5B2G,GAAU+L,GAAsBI,EAAS,EAE/C,IAAIO,GACF/tB,EAAAA,IAAC,MAAA,CAAgB,UAAWsC,EAAG,iCAAkCwrB,IAAY,SAAS,EAAG,QAAAzM,EAAA,EAA/E3G,CAAiG,EAGzGgP,IACFqE,GAAYrE,EAAsBhP,EAAOoT,GAAUzM,EAAO,GAG5DsM,EAAW,KAAKI,EAAS,CAC3B,CAEA,aAAQ,MAAA,CAAI,UAAWzrB,EAAG,4BAA6BknB,CAAmB,EAAI,SAAAmE,EAAW,CAC3F,EAEMK,GAAY,IAAM,CACtB,MAAMC,EAAc7D,EAAmBD,EAAWA,EAAWC,EAE7D,OAAOhC,GAAcV,CAAY,EAAIuG,CACvC,EAEMC,EAAUh2B,EAAAA,MAAA,EACVi2B,EAAahG,GAAcT,CAAY,EAIvC0G,GAAkC,CACtC,UAAW,oBAHEJ,GAAA,CAGwB,OAAOxD,CAAM,OAClD,WACEE,GAAcJ,EAAW,YAAc,OACnC,OACAA,EAAW,UACT,8CACA,MAAA,EAGJ+D,GAAiC,CAAA,EACjCC,GAAkB/F,GAAYwB,CAAU,EACxCwE,GAAmB/F,GAAY5E,CAAW,EAC1C4K,GAAWjG,GAAY5C,CAAG,EAC1B8I,GAAgBlG,GAAYyB,CAAQ,EAkD1C,GAjDIsE,KAAkBD,GAAqC,6BAA6B,EAAIC,IACxFC,KAAmBF,GAAqC,8BAA8B,EAAIE,IAC1FC,KAAWH,GAAqC,qBAAqB,EAAIG,IACzEC,KAAgBJ,GAAqC,2BAA2B,EAAII,IAExFl4B,EAAM,UAAU,IAAM,CACf,MAAM,QAAQwJ,CAAQ,GACzB,QAAQ,MAAM,kGAAkG,CAEpH,EAAG,CAACA,CAAQ,CAAC,EAEb5J,EAAAA,UAAU,IAAM,CACd,GAAI,CAACyzB,GAAYnC,GAAe,GAAMqC,GAAgBwB,IAAcV,IAAoB,KACtF,OAEF,MAAM1F,EAAQ,OAAO,YAAY,IAAM,CACrCkI,GAAsBC,GAAa,CAAC,CAAC,EAAA,CACvC,EAAGxD,CAAgB,EAEnB,MAAO,IAAM,OAAO,cAAc3E,CAAK,CAEzC,EAAG,CACD0E,EACAC,EACAC,EACAwB,GACA7D,EACA2C,EACA1C,EACAkD,CAAA,CACD,EAEDz0B,EAAAA,UAAU,IAAM,CACd,GAAIy0B,IAAoB,MAAQnD,GAAe,EAC7C,OAEF,MAAMvuB,EAAahC,IAAyB,CACtCA,GAAM,MAAQ,YAChB20B,GAAe,EAAE,EACR30B,GAAM,MAAQ,cACvB20B,GAAe,CAAC,CAEpB,EACA,gBAAS,iBAAiB,UAAW3yB,CAAS,EAEvC,IAAM,SAAS,oBAAoB,UAAWA,CAAS,CAEhE,EAAG,CAAC0xB,EAAiBnD,CAAW,CAAC,EAE7B,CAAC,MAAM,QAAQ1nB,CAAQ,EACzB,OAAOC,EAAAA,IAAA4M,EAAAA,SAAA,EAAE,EAGX,MAAM8hB,GAAgB3uB,EAEhB4uB,GAA0Bz3B,GAA4B,UAC1D60B,GAAiB,SAAUvsB,GAAAvH,GAAAf,EAAM,QAAQ,CAAC,IAAf,YAAAe,GAAkB,UAAlB,KAAAuH,EAA6B,IAC1D,EAEMovB,GAAyB13B,GAA4B,SACzD,GAAI60B,GAAiB,UAAY,MAAQtE,GAAe,EACtD,OAEF,MAAMoH,KAASrvB,GAAAvH,EAAAf,EAAM,QAAQ,CAAC,IAAf,YAAAe,EAAkB,UAAlB,KAAAuH,EAA6BusB,GAAiB,SAAWA,GAAiB,QACzFd,EAAwB,EAAI,EAC5BF,EAAoB8D,EAAK,CAC3B,EAEMC,GAAwB53B,GAA4B,SACxD,MAAM01B,GAASb,GAAiB,QAKhC,GAJAA,GAAiB,QAAU,KAC3Bd,EAAwB,EAAK,EAC7BF,EAAoB,CAAC,EAEjB6B,KAAW,MAAQnF,GAAe,EACpC,OAEF,MAAMoH,IAASrvB,GAAAvH,EAAAf,EAAM,eAAe,CAAC,IAAtB,YAAAe,EAAyB,UAAzB,KAAAuH,EAAoCotB,IAAUA,GACzD,KAAK,IAAIiC,CAAK,EAAI,IACpBhD,GAAegD,EAAQ,EAAI,EAAI,EAAE,CAErC,EAEME,GAA4C,CAChD,UAAW,qBAAqBnE,GAAA,KAAAA,EAAmB,GAAK,GAAG,OAAOE,CAAgB,OAClF,WAAYE,EAAuB,OAAS,gDAAA,EAG9C,OACEtiB,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,gBAAiBtB,CAAS,EACxC,cAAY,WACZ,IAAKoqB,EACL,KAAK,SACL,uBAAqB,WACrB,aAAYzB,EACZ,MAAO0E,GACP,aAAcvE,EAAe,IAAMyB,GAAa,EAAI,EAAI,OAGxD,aAAc,IAAMA,GAAa,EAAK,EAEtC,SAAA,CAAA7iB,OAAC,OAAI,UAAWpG,EAAG,sBAAsB,EAAG,IAAK4oB,EAC9C,SAAA,CAAAhB,GACClqB,EAAAA,IAACc,GAAA,CACC,KAAK,eACL,KAAMyoB,EACN,UAAWjnB,EAAG,uBAAwB,2BAA2B,EACjE,MAAO,CACL,IAAK,cAAcinB,EAAa,CAAC,MACjC,KAAM,CAACA,EAAa,CAAA,EAEtB,QAAS,IAAM6D,GAAsBC,GAAa,EAAE,CAAC,EAAA,CAAE,CAAA,EAG3DrtB,EAAAA,IAAC,MAAA,CACC,IAAKqrB,GACL,UAAU,uBACV,YAAac,GACb,aAAcA,GACd,YAAajE,GACb,UAAWA,GAEX,SAAAloB,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAuB,MAAOouB,GAC1C,SAAA73B,EAAM,SAAS,IAAIwJ,EAAU,CAACivB,EAAOtU,KACpC1a,EAAAA,IAAC,MAAA,CAAgB,GAAI,GAAGkuB,CAAO,GAAGxT,EAAK,GAAI,UAAU,uBAAuB,MAAOyT,EACjF,SAAAnuB,EAAAA,IAAC,MAAA,CACC,UAAWsC,EACT,6BACA2nB,GAAoB,sCAAA,EAEtB,QAASA,EAAmBkD,GAAazS,EAAK,EAAI,OAEjD,SAAAsU,CAAA,CAAA,CACH,EATQtU,EAUV,CACD,CAAA,CACH,CAAA,CAAA,EAEDwP,GACClqB,EAAAA,IAACc,GAAA,CACC,KAAK,gBACL,KAAMyoB,EACN,UAAWjnB,EAAG,uBAAwB,2BAA2B,EACjE,MAAO,CACL,IAAK,cAAcinB,EAAa,CAAC,MACjC,MAAO,CAACA,EAAa,CAAA,EAEvB,QAAS,IAAM6D,GAAsBC,GAAa,CAAC,CAAC,EAAA,CAAE,CAAA,CACxD,EAEJ,EACCI,GAAA,EACAxD,GACCjqB,EAAAA,IAACunB,GAAA,CACC,KAAMqD,IAAoB,KAC1B,KAAK,aACL,SAAS,aACT,UAAU,4BACV,QAAS,IAAMC,EAAmB,IAAI,EACtC,aAAW,eAEV,SAAAD,IAAoB,MACnBliB,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACZ,SAAA,CAAA+e,EAAc,GACbznB,EAAAA,IAACc,GAAA,CACC,KAAK,eACL,KAAM,GACN,UAAWwB,EAAG,kCAAmC,sCAAsC,EACvF,QAAS,IAAMupB,GAAe,EAAE,CAAA,CAAA,EAGpC7rB,EAAAA,IAAC,MAAA,CACC,UAAU,kCACV,aAAc2uB,GACd,YAAaC,GACb,WAAYE,GAEZ,SAAA9uB,EAAAA,IAAC,MAAA,CAAI,UAAU,kCAAkC,MAAO+uB,GACrD,SAAAL,GAAc,IAAI,CAACM,EAAOtU,KACzB1a,EAAAA,IAAC,MAAA,CAEC,UAAU,kCACV,cAAa0a,KAAUkQ,EAEtB,SAAAoE,CAAA,EAJItU,EAAA,CAMR,CAAA,CACH,CAAA,CAAA,EAED+M,EAAc,GACbznB,EAAAA,IAACc,GAAA,CACC,KAAK,gBACL,KAAM,GACN,UAAWwB,EAAG,kCAAmC,sCAAsC,EACvF,QAAS,IAAMupB,GAAe,CAAC,CAAA,CAAA,EAGnC7rB,EAAAA,IAACc,GAAA,CACC,KAAK,QACL,KAAM,GACN,UAAU,kCACV,QAAS,IAAM+pB,EAAmB,IAAI,CAAA,CAAA,CACxC,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CAIR,CAAC,EC1lBYoE,GAAgB,IAAM,CACjC,KAAM,CAACnnB,EAAQonB,CAAS,EAAIh5B,EAAAA,SAAS,EAAK,EAEpC+d,EAAUpc,EAAAA,YAAY,IAAM,CAChCq3B,EAAU,EAAK,CACjB,EAAG,CAAA,CAAE,EAECC,EAASt3B,EAAAA,YAAY,IAAM,CAC/Bq3B,EAAU,EAAI,CAChB,EAAG,CAAA,CAAE,EAEL,MAAO,CAAE,QAAAjb,EAAS,OAAAkb,EAAQ,OAAArnB,CAAA,CAC5B,ECZasnB,GAAoB74B,EAAM,cAGpC,CACD,WAAY,CACd,CAAC,ECWK84B,GAAiB,CAAC,CACtB,UAAAruB,EACA,IAAAsU,EACA,QAAAga,EACA,eAAAC,EACA,KAAAnJ,EAAO,EACP,KAAAoJ,EAAO,EACP,iBAAAC,EAAmB,SACnB,IAAAla,EAAM,OACR,IAA2B,CACzB,KAAM,CAAE,OAAAzN,EAAQ,QAAAmM,EAAS,OAAAkb,CAAA,EAAWF,GAAA,EAC9B,CAAE,WAAAS,EAAY,QAAAxoB,GAAY5G,EAAAA,WAAW8uB,EAAiB,EAI5Dj5B,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC2R,EAAQ,OACb,MAAM6nB,EAAW,SAAS,KAAK,MAAM,SACrC,gBAAS,KAAK,MAAM,SAAW,SACxB,IAAM,CACX,SAAS,KAAK,MAAM,SAAWA,CACjC,CACF,EAAG,CAAC7nB,CAAM,CAAC,EAEX,MAAM7C,EAAuB,CAG3B,OAAQyqB,EAAa,GAAGA,EAAaF,CAAI,KAAO,OAChD,WAAY,QAAQA,CAAI,GACxB,cAAe,QAAQpJ,CAAI,EAAA,EAG7B,OACE1d,EAAAA,KAAAkE,WAAA,CACE,SAAA,CAAA5M,EAAAA,IAAC,KAAA,CACC,cAAY,mBACZ,UAAWsC,EAAG,2BAA4BtB,EAAW,oBAAqB,QAAQkG,CAAO,EAAE,EAC3F,QAASioB,EACT,MAAAlqB,EAEA,SAAAyD,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAA1I,MAAC,OAAI,UAAU,iCACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,IAAAsV,EAAU,IAAKC,GAAO,QAAS,UAAWjT,EAAG,yBAA0B,CAAE,eAAgBgtB,CAAA,CAAS,EAAG,EAC5G,EACCC,GACCvvB,EAAAA,IAAC,MAAA,CACC,UAAWsC,EAAG,yBAA0BtB,EAAW,QAAQyuB,CAAgB,GAAI,CAC7E,eAAgBH,CAAA,CACjB,EAEA,SAAAC,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,CAAA,EAEFvvB,EAAAA,IAAC4vB,GAAA,CAAoB,IAAAta,EAAU,QAAArB,EAAkB,OAAAnM,CAAA,CAAgB,CAAA,EACnE,CAEJ,EC7Da+nB,GAAa9uB,EAAAA,WAA+D,SACvF,CAAE,UAAAC,EAAW,SAAAjB,EAAU,IAAA4lB,EAAM,EAAG,KAAAS,EAAO,EAAG,WAAAsJ,EAAa,EAAG,QAAAxoB,EAAU,UAAW,aAAcyiB,EAAW,GAAA1b,CAAA,EACxGxM,EACA,CACA,aACG2tB,GAAkB,SAAlB,CAA2B,MAAO,CAAE,WAAAM,EAAY,QAAAxoB,CAAA,EAC/C,eAAC,MAAA,CAAI,UAAW5E,EAAG,eAAgBtB,CAAS,EAAG,cAAY,cAAc,IAAAS,EAAU,GAAAwM,EACjF,SAAAjO,EAAAA,IAAC,KAAA,CACC,aAAY2pB,EACZ,UAAWrnB,EAAG,qBAAsB,QAAQ4E,CAAO,EAAE,EACrD,MAAO,CAAE,eAAgBkf,EAAM,QAAS,GAAGT,CAAG,IAAA,EAE7C,SAAA5lB,CAAA,CAAA,EAEL,CAAA,CACF,CAEJ,CAAC,ECrBK6vB,GAAsB,CAAC,CAAE,IAAAta,EAAK,QAAArB,EAAS,OAAAnM,KAAuC,CAClF,MAAMiN,EAAUje,EAAAA,OAAuB,IAAI,EAGrC,CAACg5B,EAAYC,CAAa,EAAI75B,WAAA,EAIpC,OAHAE,GAAoB,IAAM,CACxB25B,EAAc,SAAS,IAAI,CAC7B,EAAG,CAAA,CAAE,EACAD,EACE7iB,GAAAA,aACLjN,EAAAA,IAACgV,GAAAA,cAAA,CACC,QAAS,IACT,GAAIlN,EACJ,WAAY,CACV,YAAa,yCACb,UAAW,sCAAA,EAEb,aAAY,GACZ,cAAa,GACb,QAAAiN,EAEA,SAAA/U,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAA4B,QAASiU,EAAS,IAAKc,EAChE,SAAA/U,EAAAA,IAAC,MAAA,CAAI,UAAU,mBAAmB,QAAUyI,GAAMA,EAAE,gBAAA,EAClD,SAAAzI,EAAAA,IAAC,MAAA,CAAI,IAAAsV,EAAU,IAAI,GAAG,UAAU,uBAAA,CAAwB,CAAA,CAC1D,CAAA,CACF,CAAA,CAAA,EAEFwa,CAAA,EAnBsB,IAqB1B,ECEME,GAAar6B,GACjB,OAAOA,GAAU,SAAW,GAAGA,CAAK,KAAOA,EAEvCwS,GAAWxS,GACQA,GAAU,MAAQA,IAAU,IAASA,IAAU,IAAQA,IAAU,GAG7Es6B,GAAS15B,EAAM,WAA2D,SACrF,CAAE,UAAAyK,EAAW,MAAAiE,EAAO,YAAAirB,EAAa,SAAAnwB,EAAU,cAAewB,EAAa,SAAU,GAAGsB,CAAA,EACpFpB,EACA,CACA,OACEzB,EAAAA,IAAC,MAAA,CACC,cAAauB,EACZ,GAAGsB,EACJ,IAAApB,EACA,UAAWa,EAAG,cAAetB,CAAS,EACtC,MACEkvB,IAAgB,OACZjrB,EACC,CAAE,GAAGA,EAAO,6BAA8B+qB,GAAUE,CAAW,CAAA,EAGrE,SAAAnwB,CAAA,CAAA,CAGP,CAAC,EAGYowB,GAAe55B,EAAM,WAChC,SACE,CACE,UAAAyK,EACA,MAAAiE,EACA,MAAA3D,EACA,MAAA/H,EACA,OAAA62B,EACA,MAAAC,EACA,OAAApV,EACA,SAAAlb,EACA,cAAewB,EAAa,gBAC5B,GAAGsB,CAAA,EAELpB,EACA,CACA,MAAM6uB,EAAU,GAAGp4B,EAAAA,MAAA,CAAO,SACpBq4B,EAAWh6B,EAAM,SAAS,QAAQwJ,CAAQ,EAAE,OAAS,EAC3D,OACE2I,EAAAA,KAAC,MAAA,CACC,cAAanH,EACb,KAAK,QACL,kBAAiB+uB,EAChB,GAAGztB,EACJ,IAAApB,EACA,UAAWa,EAAG,sBAAuBtB,CAAS,EAC9C,MAAOovB,IAAW,OAAYnrB,EAAS,CAAE,GAAGA,EAAO,uBAAwBmrB,CAAA,EAE3E,SAAA,CAAA1nB,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACb,SAAA,CAAA1I,MAAC,MAAA,CAAI,UAAU,4BAA4B,GAAIswB,EAC5C,SAAAhvB,EACH,EACwB/H,GAAU,WAAQ,OAAA,CAAK,UAAU,qBAAsB,SAAAA,CAAA,CAAM,EAAU,IAAA,EACjG,EACCg3B,EACCvwB,EAAAA,IAAC,KAAA,CAAG,UAAU,qBAAqB,KAAK,OACrC,SAAAD,EACH,EACEoI,GAAQkoB,CAAK,EACfrwB,MAAC,OAAI,UAAU,qBAAsB,WAAM,EACzC,KACHmI,GAAQ8S,CAAM,EAAIjb,EAAAA,IAAC,OAAI,UAAU,6BAA8B,WAAO,EAAS,IAAA,CAAA,CAAA,CAGtF,CACF,EAMawwB,GAAaj6B,EAAM,WAA8D,SAC5F,CAAE,UAAAyK,EAAW,MAAAiE,EAAO,MAAA3D,EAAO,KAAAwH,EAAM,WAAA2nB,EAAa,EAAG,SAAA1wB,EAAU,cAAewB,EAAa,cAAe,GAAGsB,CAAA,EACzGpB,EACA,CACA,OACEiH,EAAAA,KAAC,KAAA,CACC,cAAanH,EACZ,GAAGsB,EACJ,IAAApB,EACA,UAAWa,EAAG,oBAAqB,CAAE,yBAA0B,EAAQwG,CAAI,EAAK9H,CAAS,EACzF,MAAO,CAAE,GAAGiE,EAAO,4BAA6B,OAAOwrB,CAAU,CAAA,EAEhE,SAAA,CAAAtoB,GAAQ7G,CAAK,EACZwH,EACE9I,EAAAA,IAAC,KAAE,UAAU,0BAA0B,KAAA8I,EACpC,SAAAxH,EACH,EAEAtB,MAAC,MAAA,CAAI,UAAU,0BAA2B,WAAM,EAEhD,KACHmI,GAAQpI,CAAQ,EAAIC,MAAC,OAAI,UAAU,yBAA0B,SAAAD,EAAS,EAAS,IAAA,CAAA,CAAA,CAGtF,CAAC,EClIY2wB,GAAW3vB,EAAAA,WAA4D,SAClF,CAAE,UAAAC,EAAW,SAAAjB,EAAU,SAAAqH,EAAU,SAAAgb,EAAU,MAAAuO,EAAO,QAAAC,EAAS,eAAAtpB,EAAgB,aAAAC,EAAc,QAAA8Z,CAAA,EACzF5f,EACA,CACA,MAAM6f,EAAc,CAAC,CAACD,GAAW,CAACja,EAElC,OACEsB,EAAAA,KAAC,KAAA,CACC,IAAAjH,EACA,KAAK,WACL,SAAU6f,EAAc,EAAI,OAC5B,gBAAela,GAAY,OAC3B,gBAAegb,GAAY,OAC3B,QAAShb,EAAW,OAAYia,EAChC,UACEC,EACK7Y,GAAM,EACDA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACjCA,EAAE,eAAA,EACF4Y,GAAA,MAAAA,EAAU5Y,GAEd,EACA,OAEN,UAAWnG,EAAG,kBAAmBtB,EAAW,CAC1C,gBAAiBoG,EACjB,gBAAiBgb,EACjB,wBAAyBuO,EACzB,0BAA2BC,CAAA,CAC5B,EACD,cAAY,YAEZ,SAAA,CAAA5wB,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAA0B,SAAAsH,EAAe,EACzDtH,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAD,CAAA,CAAS,EAClDC,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAwB,SAAAuH,CAAA,CAAa,CAAA,CAAA,CAAA,CAG3D,CAAC,ECxCYspB,GAAO9vB,EAAAA,WAA2D,SAC7E,CAAE,UAAAC,EAAW,MAAA2vB,EAAO,UAAAG,EAAW,SAAA/wB,EAAU,cAAewB,EAAa,OAAQ,GAAGC,CAAA,EAChFC,EACA,OACA,OACEiH,EAAAA,KAAC,KAAA,CACC,IAAAjH,EACA,cAAaF,EACb,UAAWe,EAAG,YAAa,CAAE,kBAAmBquB,CAAA,EAAS3vB,CAAS,EACjE,GAAGQ,EAEJ,MAAMvJ,EAAAuJ,EAAM,OAAN,KAAAvJ,EAAc,OAEnB,SAAA,CAAA64B,EAAY9wB,EAAAA,IAAC,KAAA,CAAG,UAAU,uBAAwB,WAAU,EAAQ,KACpED,CAAA,CAAA,CAAA,CAGP,CAAC,ECaYgxB,GAAkBx6B,EAAM,WACnC,SAAyB,CAAE,UAAAyK,EAAW,KAAAgwB,EAAM,SAAAjxB,EAAU,GAAG8C,CAAA,EAAQpB,EAAK,CACpE,OACEiH,OAAC,OAAK,GAAG7F,EAAM,IAAApB,EAAU,UAAWa,EAAG,8BAA+BtB,CAAS,EAC7E,SAAA,CAAAhB,EAAAA,IAAC,KAAA,CAAG,UAAU,8BAA+B,SAAAgxB,EAAK,EAClDhxB,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAkC,SAAAD,CAAA,CAAS,CAAA,EAC3D,CAEJ,CACF,EAGakxB,GAAkB16B,EAAM,WACnC,SAAyB,CAAE,UAAAyK,EAAW,MAAAiE,EAAO,MAAA9L,EAAO,OAAA4a,EAAS,OAAQ,UAAAmd,EAAW,MAAAP,EAAO,SAAA5wB,EAAU,GAAG8C,CAAA,EAAQpB,EAAK,CAC/G,MAAMuW,EAAQ,OAAOkZ,GAAc,SAAW,GAAGA,CAAS,KAAOA,EACjE,OACExoB,EAAAA,KAAC,KAAA,CACE,GAAG7F,EACJ,IAAApB,EACA,UAAWa,EACT,wBACA,yBAAyByR,CAAM,GAC/B,CAAE,8BAA+B4c,CAAA,EACjC3vB,CAAA,EAEF,MAAOgX,IAAU,OAAY/S,EAAS,CAAE,GAAGA,EAAO,0BAA2B+S,CAAA,EAE5E,SAAA,CAAA7e,GAAA,YAAAA,EAAO,IAAI,CAAC0tB,EAAMnM,IAAA,oBAChBqW,GAAA,CAAwC,KAAMlK,EAAK,KACjD,SAAAA,EAAK,WAAA,GADc5uB,EAAA4uB,EAAK,MAAL,KAAA5uB,EAAYyiB,CAElC,IAED3a,CAAA,CAAA,CAAA,CAGP,CACF,ECpDMoxB,GAAkB,CAAC,CACvB,MAAAC,EACA,KAAAC,EACA,WAAAhb,EACA,OAAAib,EACA,OAAAC,EACA,aAAAC,EACA,cAAAC,EACA,YAAAC,CACF,IAA4B,CAE1B,MAAMC,EAAiB,OAAOtb,GAAe,YAEvCub,EAAiBD,EAAiB,CAACD,EAAcL,IAAS,KAAK,KAAKhb,EAAa+a,CAAK,EAEtFS,EAAqBppB,GAA4C,CAChEgpB,GACLA,EAAc,CAAChpB,EAAE,OAAO,KAAK,CAC/B,EAEMqpB,EAAa,IAAM,CACvBR,GAAA,MAAAA,GACF,EAEMS,EAAa,IAAM,CACvBR,GAAA,MAAAA,GACF,EAEMS,EAAkB,IAAM,CAC5B,MAAM1O,EAAO+N,EAAOD,EAAQA,EACtBa,EAAKZ,EAAOD,EAElB,MAAO,GAAG9N,CAAI,IAAI2O,CAAE,IAAMN,EAAiB,GAAK,OAAOtb,CAAU,GACnE,EAEA,aACG,MAAA,CAAI,UAAU,yBACb,SAAA3N,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACZ,SAAA,CAAA8oB,GAAgBA,EAAa,OAAS,GACrC9oB,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAA1I,EAAAA,IAAC,QAAK,SAAA,eAAA,CAAa,EACnBA,EAAAA,IAAC,SAAA,CAAO,GAAG,OAAO,UAAU,iCAAiC,SAAU6xB,EAAmB,MAAOT,EAC9F,SAAAI,EAAa,IAAKU,GACjBlyB,EAAAA,IAAC,SAAA,CAAO,MAAOkyB,EAAK,UAAW5vB,EAAG,qBAAsB,CAAE,SAAU4vB,IAAQd,CAAA,CAAO,EAChF,SAAAc,CAAA,EADwFA,CAE3F,CACD,CAAA,CACH,CAAA,EACF,EAEFlyB,EAAAA,IAAC,MAAA,CAAI,UAAU,wCAAyC,aAAkB,EAC1E0I,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAA1I,MAAC,UAAO,UAAU,kCAAkC,QAAS8xB,EAAY,SAAUT,IAAS,EAC1F,SAAArxB,EAAAA,IAACc,GAAA,CAAK,KAAK,eAAe,KAAM,GAAI,OAAQ,IAAK,EACnD,EACAd,EAAAA,IAAC,OAAA,CAAK,UAAU,+BAAgC,SAAAqxB,EAAK,QACpD,SAAA,CAAO,UAAU,kCAAkC,QAASU,EAAY,SAAUH,EACjF,SAAA5xB,EAAAA,IAACc,GAAA,CAAK,KAAK,gBAAgB,KAAM,GAAI,OAAQ,IAAK,CAAA,CACpD,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,EC3DO,MAAMqxB,EAAa,CAAnB,aAAA,CACL,KAAiB,WAAa,IAC9B,KAAiB,cAAgB,IACjC,KAAQ,QAAU,GAqClB,KAAA,UAAaC,IACX,KAAK,UAAU,IAAIA,CAAQ,EACpB,IAAM,CACX,KAAK,UAAU,OAAOA,CAAQ,CAChC,EACF,CAxCA,IAAIC,EAAoC,OACtC,MAAM7C,EAAO,KAAK,OAAO,IAAI6C,CAAM,EACnC,GAAI,CAAC7C,EAAM,OACX,IAAI7I,EAAM,GACV,UAAW2L,KAAM9C,EAAK,KAAA,EAAY8C,EAAK3L,IAAKA,EAAM2L,GAClD,OAAOr6B,EAAAu3B,EAAK,IAAI7I,CAAG,IAAZ,YAAA1uB,EAAe,KACxB,CAEA,IAAIo6B,EAAgB1L,EAAa4L,EAAe3pB,EAAiC,CAC/E,IAAI4mB,EAAO,KAAK,OAAO,IAAI6C,CAAM,EAC5B7C,IACHA,MAAW,IACX,KAAK,OAAO,IAAI6C,EAAQ7C,CAAI,GAE9B,MAAMz3B,EAAOy3B,EAAK,IAAI7I,CAAG,GACrB5uB,GAAA,YAAAA,EAAM,SAAUw6B,GAASx6B,EAAK,QAAU6Q,IAC5C4mB,EAAK,IAAI7I,EAAK,CAAE,MAAA4L,EAAO,MAAA3pB,EAAO,EAC9B,KAAK,QAAU,GACjB,CAGA,OAAOypB,EAAgB1L,EAAa4L,EAAqB,OACvD,MAAM/C,EAAO,KAAK,OAAO,IAAI6C,CAAM,IAC/Bp6B,EAAAu3B,GAAA,YAAAA,EAAM,IAAI7I,KAAV,YAAA1uB,EAAgB,SAAUs6B,IAC9B/C,EAAK,OAAO7I,CAAG,EACV6I,EAAK,MAAM,KAAK,OAAO,OAAO6C,CAAM,EACzC,KAAK,QAAU,GACjB,CAEA,QAAe,CACR,KAAK,UACV,KAAK,QAAU,GACf,KAAK,UAAU,QAASD,GAAaA,GAAU,EACjD,CAQF,CAGO,MAAMI,GAAqB7yB,EAAAA,cAAmC,IAAI,EAG5D8yB,GAAmB9yB,EAAAA,cAAc,EAAK,EAetC+yB,GAAqB/yB,EAAAA,cAAgC,IAAI,EAGzDgzB,GAAuBhzB,EAAAA,cAA+B,IAAI,EAG1DizB,GAAYC,GAAiD,KAAK,IAAI,EAAG,KAAK,MAAM,OAAOA,CAAO,CAAC,GAAK,CAAC,EAGzGC,GAAeC,GAAiD,CAC3E,GAAIA,IAAY,QAAaA,IAAY,GAAI,MAAO,GACpD,MAAMvD,EAAO,KAAK,MAAM,OAAOuD,CAAO,CAAC,EACvC,OAAOvD,IAAS,EAAI,IAAW,KAAK,IAAI,EAAGA,CAAI,GAAK,CACtD,EAUA,SAASwD,GAASC,EAAoBtM,EAAauM,EAA2B,CAC5E,IAAIb,EAAS,EACb,OAAOY,EAAM,IAAKE,GAAS,OACzB,OAAQl7B,EAAAi7B,EAAMb,CAAM,IAAZ,KAAAp6B,EAAiB,GAAK0uB,GAAK0L,IACnC,MAAMC,EAAKD,EACLe,EAAOR,GAASO,EAAK,OAAO,EAC5BE,EAAQ1M,EAAMmM,GAAYK,EAAK,OAAO,EAC5C,QAASl5B,EAAI,EAAGA,EAAIm5B,EAAMn5B,IAAKi5B,EAAMZ,EAAKr4B,CAAC,EAAIo5B,EAC/C,OAAAhB,GAAUe,EACHd,CACT,CAAC,CACH,CAKA,MAAMgB,GAAe,CAACC,EAAaC,IACjCD,EAAE,MAAQC,EAAE,KAAOD,EAAE,MAAM,OAASC,EAAE,MAAM,MAAQ,CAAC,GAAGD,EAAE,KAAK,EAAE,MAAOlB,GAAWmB,EAAE,MAAM,IAAInB,CAAM,CAAC,EAElGoB,GAAgB,CAACF,EAAcC,IAA0BD,EAAE,SAAWC,EAAE,QAAUD,EAAE,MAAQC,EAAE,IAQpG,SAASE,GAAaC,EAA6C,CACjE,MAAMC,EAAQ98B,EAAAA,OAAY,EAAE,EACtBsC,EAAOw6B,EAAM,QACb97B,EAAY,CAAA,EAClB,OAAA87B,EAAM,QAAU97B,EACT,CAAC4iB,EAAOmZ,IAAU,CACvB,MAAM97B,EAAOqB,EAAKshB,CAAK,EACjBoZ,EAAO/7B,IAAS,QAAa47B,EAAK57B,EAAM87B,CAAK,EAAI97B,EAAO87B,EAC9D,OAAA/7B,EAAK4iB,CAAK,EAAIoZ,EACPA,CACT,CACF,CAEO,MAAMC,GAAe,IAA2BL,GAAUJ,EAAY,EAChEU,GAAgB,IAA4BN,GAAUD,EAAa,EAGhF,SAASQ,GAAYC,EAAkBC,EAAsD,CAC3F,OAAOhe,WAAS,IAAI+d,EAAQlF,GACrB5Y,EAAAA,eAAe4Y,CAAK,EACrBA,EAAM,OAASpiB,WACVwnB,EAAAA,aACLpF,EACA,OACAiF,GAAajF,EAAiD,MAAM,SAAUmF,CAAG,CAAA,EAG9EA,EAAInF,CAAK,EARmBA,CASpC,CACH,CAGA,SAASqF,GAAWH,EAAkC,CACpD,MAAMh1B,EAAuB,CAAA,EAC7B,OAAA+0B,GAAYC,EAAQn2B,IAClBmB,EAAK,KAAKnB,CAAO,EACV,KACR,EACMmB,CACT,CAYO,SAASo1B,GACdv0B,EACAw0B,EACAC,EACAC,EACW,CACX,MAAMvB,EAAkB,CAAA,EACxB,IAAIvM,EAAM,EACV,OAAOsN,GAAYl0B,EAAWhC,GAAY,CACxC,IAAI81B,EAAyB,KAC7B,GAAIU,EAAS,CACX,MAAMjC,EAAK3L,IACXkN,EAAQY,EAAKnC,EAAI,CAAE,IAAKA,EAAI,MAAO,IAAI,IAAIY,EAAM,QAAQ,CAACG,EAAOhB,IAAYgB,EAAQf,EAAK,CAACD,CAAM,EAAI,EAAG,CAAC,EAAG,EAC5G,MAAMY,EACJl1B,EAAQ,OAASy2B,EACbH,GAAYt2B,EAAmD,MAAM,QAAQ,EAAE,IAC5Eo1B,GAASA,EAAK,KAAA,EAEjB,CAAA,EACNH,GAASC,EAAOX,EAAIY,CAAK,CAC3B,CACA,aAAQP,GAAqB,SAArB,CAA8B,MAAOkB,EAAQ,SAAA91B,EAAQ,CAC/D,CAAC,CACH,CASO,SAAS22B,GACd30B,EACAw0B,EACAV,EACAY,EACW,OACX,MAAM9N,GAAM1uB,EAAA47B,GAAA,YAAAA,EAAO,MAAP,KAAA57B,EAAc,EACpBi7B,EAAkB,CAAA,EACxBW,GAAA,MAAAA,EAAO,MAAM,QAASxB,GAAYa,EAAMb,CAAM,EAAI1L,EAAM,GACxD,IAAIjM,EAAQ,EACZ,OAAOuZ,GAAYl0B,EAAWhC,GAAY,CACxC,MAAMu0B,EAAKiC,EAAUE,EAAK/Z,IAAS,CAAE,OAAQsY,GAAS,CAACj1B,EAAQ,KAAkB,EAAG4oB,EAAKuM,CAAK,EAAE,CAAC,EAAG,IAAAvM,CAAA,CAAK,EAAI,KAC7G,aAAQ+L,GAAmB,SAAnB,CAA4B,MAAOJ,EAAK,SAAAv0B,EAAQ,CAC1D,CAAC,CACH,CAQO,SAAS42B,GAAO7qB,EAAyB,CAC9C,MAAM8qB,EAAWj/B,GACX,OAAOA,GAAU,UAAY,OAAOA,GAAU,SAAiB,OAAOA,CAAK,EAC3E,MAAM,QAAQA,CAAK,EAAUA,EAAM,IAAIi/B,CAAO,EAAE,KAAK,EAAE,EACvDxe,EAAAA,eAAezgB,CAAK,EAAUi/B,EAASj/B,EAAiD,MAAM,QAAQ,EACnG,GAET,OAAOi/B,EAAQ9qB,CAAI,EAAE,QAAQ,OAAQ,GAAG,EAAE,KAAA,CAC5C,CCxNA,MAAM+qB,GAAQ9zB,EAAAA,WACZ,CACE,CAAE,UAAAC,EAAW,MAAA2vB,EAAO,QAAAmE,EAAS,SAAA/0B,EAAU,mBAAAg1B,EAAoB,UAAAC,EAAW,aAAAC,EAAc,QAAA1Q,EAAS,WAAA2Q,EAAY,GAAG1zB,CAAA,EAC5GC,IACG,CACH,KAAM,CAAC8J,CAAM,EAAIrV,EAAAA,SAAS,IAAM,IAAIi8B,EAAc,EAClD,OACEzpB,EAAAA,KAAC,MAAA,CACC,IAAAjH,EACA,UAAWa,EACT,sBACAtB,EACA,CACG,8BAAgCg0B,CAAA,EAEnCE,GAAc,6BAA6BA,CAAU,EAAA,EAEtD,GAAG1zB,EAEJ,SAAA,CAAAxB,EAAAA,IAAC,MAAA,CAAI,UAAWsC,EAAG,wBAAyB,CAAE,sBAAuB,CAAC,CAACyyB,EAAoB,EACzF,SAAArsB,EAAAA,KAAC,QAAA,CACC,UAAWpG,EAAG,aAAc,CAC1B,aAAcquB,EACb,eAAiBmE,EAClB,2BAA4BG,CAAA,CAC7B,EAEA,SAAA,CAAA1Q,GAAW,MAAQvkB,EAAAA,IAAC,UAAA,CAAQ,UAAU,sBAAuB,SAAAukB,EAAQ,EAEtEvkB,EAAAA,IAACwyB,GAAmB,SAAnB,CAA4B,MAAO0C,EAAa3pB,EAAS,KACxD,SAAAvL,EAAAA,IAACyyB,GAAiB,SAAjB,CAA0B,MAAO,GAChC,SAAAzyB,EAAAA,IAAC2yB,GAAqB,SAArB,CAA8B,MAAO,KACpC,SAAA3yB,EAAAA,IAAC0yB,GAAmB,SAAnB,CAA4B,MAAO,KAAO,SAAA3yB,CAAA,CAAS,CAAA,CACtD,EACF,CAAA,CACF,CAAA,CAAA,CAAA,EAEJ,EACC,CAAC,CAACg1B,GAAsB/0B,EAAAA,IAACmxB,GAAA,CAAiB,GAAG4D,CAAA,CAAoB,CAAA,CAAA,CAAA,CAGxE,CACF,ECzEMI,GAAW,CAAC,CAChB,SAAAp1B,EACA,UAAAiB,EACA,SAAAohB,EACA,SAAAgT,EACA,cAAe7zB,EAAa,YAC5B,GAAGC,CACL,IAAwC,CAGtC,MAAM+yB,EAAUj0B,EAAAA,WAAWkyB,EAAkB,GAAK,KAC5CqB,EAAQvzB,EAAAA,WAAWqyB,EAAoB,EACvC8B,EAAOT,GAAA,EACb,OACEh0B,EAAAA,IAAC,KAAA,CACC,cAAauB,EACb,UAAWe,EAAG,kBAAmBtB,EAAW,CAC1C,2BAA4BohB,EAC5B,2BAA4BgT,CAAA,CAC7B,EACA,GAAG5zB,EAGJ,gBAAe4gB,GAAA,KAAAA,EAAY5gB,EAAM,eAAe,EAChD,gBAAe4zB,GAAA,KAAAA,EAAY5zB,EAAM,eAAe,EAE/C,SAAAkzB,GAAY30B,EAAUw0B,EAASV,EAAOY,CAAI,CAAA,CAAA,CAGjD,EClCMY,GAAY,CAAC,CAAE,SAAAt1B,EAAU,UAAAiB,EAAW,GAAGQ,KAA+C,CAG1F,MAAM+yB,EAAUj0B,EAAAA,WAAWkyB,EAAkB,GAAK,KAC5CiC,EAAOV,GAAA,EACb,OACE/zB,EAAAA,IAAC,QAAA,CAAO,GAAGwB,EAAO,UAAWc,EAAG,mBAAoBtB,CAAS,EAC1D,SAAAszB,GAASv0B,EAAUw0B,EAASY,GAAUV,CAAI,EAC7C,CAEJ,ECAMa,GAAc,IAAM,IAAM,CAAC,EAE3BC,GAAY,CAAC,CAAE,SAAAx1B,EAAU,UAAAy1B,EAAY,OAAQ,UAAAx0B,EAAW,MAAA4H,EAAO,GAAGpH,KAA+C,OACrH,MAAMi0B,EAAej0B,EAAM,YAAY,EACjC+J,EAASjL,EAAAA,WAAWkyB,EAAkB,EACtCqB,EAAQvzB,EAAAA,WAAWoyB,EAAkB,EACrCgD,EAASp1B,EAAAA,WAAWmyB,EAAgB,EAGpCkD,EACJpqB,GAAU,MACVsoB,GAAS,MACT,CAAC6B,GACD9sB,IAAU,QACV6sB,IAAiB,QACjB7C,GAASpxB,EAAM,OAAO,IAAM,EACxBo0B,EAAO,IAAOD,EAAWpqB,EAAO,IAAIsoB,EAAM,MAAM,EAAI,OACpDgC,EAAYr1B,EAAAA,qBAAqBm1B,EAAWpqB,EAAO,UAAY+pB,GAAaM,EAAMA,CAAI,EACtFE,EAAYltB,IAAU,GAAQ6sB,GAAgBx9B,EAAA2Q,GAAA,KAAAA,EAAS6sB,IAAT,KAAAx9B,EAAyB49B,EAE7E,OACE71B,EAAAA,IAAC,KAAA,CACE,GAAGwB,EACJ,UAAWc,EAAG,mBAAoBtB,CAAS,EAC3C,MAAOw0B,GAAa,OAGnB,GAAIM,IAAc,QAAa,CAAE,aAAcA,CAAA,EAE/C,SAAA/1B,CAAA,CAAA,CAGP,EC1CMg2B,GAAY,CAAC,CAAE,SAAAh2B,EAAU,UAAAiB,EAAW,GAAGQ,KAA+C,CAG1F,MAAM+yB,EAAUj0B,EAAAA,WAAWkyB,EAAkB,GAAK,KAC5CiC,EAAOV,GAAA,EACb,OACE/zB,MAAC,SAAO,GAAGwB,EAAO,UAAWc,EAAG,mBAAoBtB,CAAS,EAC3D,SAAAhB,EAAAA,IAACyyB,GAAiB,SAAjB,CAA0B,MAAO,GAAO,SAAA6B,GAASv0B,EAAUw0B,EAASY,GAAUV,CAAI,CAAA,CAAE,CAAA,CACvF,CAEJ,EC0CA,SAASuB,GAAezD,EAAeM,EAAsCvf,EAA0B,SACrG,MAAM/H,EAASjL,EAAAA,WAAWkyB,EAAkB,EACtCqB,EAAQvzB,EAAAA,WAAWoyB,EAAkB,EACrCgD,EAASp1B,EAAAA,WAAWmyB,EAAgB,EACpCwD,EAAY1qB,GAAU,MAAQsoB,GAAS,MAAQ6B,GAAU9C,GAASC,CAAO,IAAM,EAC/ER,GAASp6B,EAAA47B,GAAA,YAAAA,EAAO,SAAP,KAAA57B,EAAiB,GAC1B0uB,GAAMnnB,EAAAq0B,GAAA,YAAAA,EAAO,MAAP,KAAAr0B,EAAc,GACpBoJ,EAAQqtB,GAAY3iB,EAAA,GAAU,OAEhC2iB,GAAW1qB,EAAO,IAAI8mB,EAAQ1L,EAAK4L,EAAO3pB,CAAK,EACnDzS,EAAAA,UAAU,IAAM,CACd,GAAK8/B,EACL,OAAA1qB,EAAO,IAAI8mB,EAAQ1L,EAAK4L,EAAO3pB,CAAK,EACpC2C,EAAO,OAAA,EACA,IAAM,CACXA,EAAO,OAAO8mB,EAAQ1L,EAAK4L,CAAK,EAChChnB,EAAO,OAAA,CACT,CACF,EAAG,CAACA,EAAQ8mB,EAAQ1L,EAAK4L,EAAO0D,EAAWrtB,CAAK,CAAC,CACnD,CAEA,MAAMstB,GAAgB,CAAC,CACrB,SAAAn2B,EACA,UAAAiB,EACA,UAAAw0B,EAAY,OACZ,cAAAW,EACA,eAAAC,EACA,SAAAC,EACA,cAAAC,EACA,OAAAC,EACA,QAAAziB,EACA,MAAAlL,EACA,GAAGpH,CACL,IAA6C,CAC3C,MAAMyM,EAAK/V,GAAA,EACX89B,GAAe/nB,EAAIzM,EAAM,QAAS,IAAMoH,GAAA,KAAAA,EAAS+rB,GAAO50B,CAAQ,CAAC,EAEjE,MAAM+rB,EACJwK,IAAkB,OAAYA,EAAgBH,EAAgB,MAAQC,EAAiB,OAAS,GAI5FI,EAAWH,EACbvK,IAAc,MACZ,YACAA,IAAc,OACZ,aACA,OACJtqB,EAAM,WAAW,EASfuV,EAAW+U,IAAc,MAAQ,cAAgBA,IAAc,OAAS,cAAgB,cAIxF5yB,EAAahC,GAAgD,CAC7DA,EAAM,SAAWA,EAAM,eACvBm/B,GAAYE,IAAWr/B,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OAChEA,EAAM,eAAA,EACNq/B,EAAA,EAEJ,EAKMlV,EAAWnqB,GAA6C,CACvD2pB,GAAW3pB,CAAK,IACrBq/B,GAAA,MAAAA,IACF,EAKM9nB,EAAU,GAAGR,CAAE,SACfwoB,EAAW,CAAC,CAAC3iB,GAAWtS,EAAM,YAAY,GAAK,MAAQA,EAAM,iBAAiB,GAAK,KAEzF,OACEkH,EAAAA,KAAC,KAAA,CACE,GAAGlH,EACJ,kBAAiBi1B,EAAWhoB,EAAUjN,EAAM,iBAAiB,EAC7D,YAAWg1B,EACX,UAAWl0B,EAAG,mBAAoB,iBAAkBtB,EAAW,CAC7D,CAAC,cAAcw0B,CAAS,EAAE,EAAG,CAAC,CAACA,EAC/B,0BAA2Ba,EAC3B,wBAAyB,CAAC,CAACA,GAAYvK,IAAc,EAAA,CACtD,EAED,SAAA,CAAApjB,EAAAA,KAAC,OAAA,CACC,GAAI+tB,EAAWhoB,EAAU,OACzB,UAAU,0BACV,QAAS4nB,EAAWhV,EAAU,OAC9B,UAAWgV,EAAWn9B,EAAY,OAClC,KAAMm9B,EAAW,SAAW,OAC5B,SAAUA,EAAW,EAAI,OAExB,SAAA,CAAAt2B,EACAs2B,GAAYr2B,EAAAA,IAACc,GAAA,CAAK,UAAU,uBAAuB,KAAMiW,EAAU,KAAM,GAAI,OAAQ,GAAA,CAAK,CAAA,CAAA,CAAA,EAE5FjD,EAAU9T,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAQ,EAAS,IAAA,CAAA,CAAA,CAG5E,EC5Ha02B,GAAW31B,EAAAA,WAA0C,SAChE,CACE,UAAAC,EACA,SAAA21B,EAAW,QACX,SAAAC,EAAW,CAAE,OAAQ,SAAU,OAAQ,aAAA,EACvC,KAAA1nB,EAAO,CAAA,EACP,SAAAkmB,EACA,gBAAAyB,EAAkB,CAAA,EAClB,iBAAAC,EACA,SAAA1U,EACA,gBAAA2U,EAAkB,CAAA,EAClB,iBAAAC,EACA,WAAAC,EAAa,GACb,WAAAC,EAAa,GACb,YAAAC,EACA,aAAAC,EACA,cAAe71B,EAAa,YAC5B,GAAGC,CACL,EACAC,EACA,CACA,KAAM,CAAC41B,EAAgBC,CAAiB,EAAIphC,EAAAA,SAA0C,CAAA,CAAE,EAClF,CAACqhC,EAAYC,CAAa,EAAIthC,EAAAA,SAAmB,CAAA,CAAE,EACnD,CAACuhC,EAAaC,CAAc,EAAIvgC,GAA+B,CACnE,MAAOi+B,EACP,aAAcyB,EACd,SAAUC,CAAA,CACX,EACKa,EAAiB7gC,EAAAA,OAAA,EACjB,CAAC8gC,EAAaC,CAAc,EAAI1gC,GAA+B,CACnE,MAAOirB,EACP,aAAc2U,EACd,SAAWj/B,GAAS,CAGlB,MAAMggC,EAAUH,EAAe,QAC/BA,EAAe,QAAU,OACzBX,GAAA,MAAAA,EAAmBl/B,EAAMggC,EAC3B,CAAA,CACD,EAEKC,EAAkB9pB,GAAe,CACrCypB,EAAgB3/B,GAAUA,EAAK,SAASkW,CAAE,EAAIlW,EAAK,OAAQiE,GAAMA,IAAMiS,CAAE,EAAI,CAAC,GAAGlW,EAAMkW,CAAE,CAAE,CAC7F,EAEMxR,EAAU,CAACwR,EAAYzR,IAAkB,CAC7Ck7B,EAAgB3/B,GAAS,CACvB,MAAMigC,EAAMjgC,EAAK,SAASkW,CAAE,EAC5B,OAAIzR,GAAQ,CAACw7B,EAAY,CAAC,GAAGjgC,EAAMkW,CAAE,EACjC,CAACzR,GAAQw7B,EAAYjgC,EAAK,OAAQiE,GAAMA,IAAMiS,CAAE,EAC7ClW,CACT,CAAC,CACH,EAEMkgC,EAAkBhqB,GAAe,CACrC0pB,EAAe,QAAU,CAAE,GAAA1pB,EAAI,SAAU,CAAC2pB,EAAY,SAAS3pB,CAAE,CAAA,EACjE4pB,EAAgB9/B,GAAUA,EAAK,SAASkW,CAAE,EAAIlW,EAAK,OAAQiE,GAAMA,IAAMiS,CAAE,EAAI,CAAC,GAAGlW,EAAMkW,CAAE,CAAE,CAC7F,EAEMiqB,EAAe,CAACrR,EAAqBsR,IAAmB,CACxD,CAACf,GAAgBC,EAAec,CAAM,GAAMtR,EAAK,UAAYA,EAAK,SAAS,OAAS,IAGxF2Q,EAAez/B,GAAUA,EAAK,SAASogC,CAAM,EAAIpgC,EAAO,CAAC,GAAGA,EAAMogC,CAAM,CAAE,EACrEf,EAAavQ,EAAMsR,CAAM,EAC3B,KAAMp4B,GAAa,CAClBu3B,EAAmBv/B,IAAU,CAAE,GAAGA,EAAM,CAACogC,CAAM,EAAGp4B,CAAA,EAAW,CAC/D,CAAC,EACA,QAAQ,IAAM,CACby3B,EAAez/B,GAASA,EAAK,OAAQiE,GAAMA,IAAMm8B,CAAM,CAAC,CAC1D,CAAC,EACL,EAEMC,EAAa,CAACvR,EAAqBwR,IAA4B,WACnE,MAAMF,GAASlgC,GAAA4uB,EAAK,KAAL,KAAA5uB,GAAWogC,EACpBC,GAAmB94B,GAAAqnB,EAAK,WAAL,KAAArnB,GAAiB63B,EAAec,CAAM,EACzDI,EAAS,CAAC,CAACnB,IAAiBvQ,EAAK,aAAe,CAAC,CAACwQ,EAAec,CAAM,GACvEK,EAAiB,CAAC,CAACF,GAAoBA,EAAiB,OAAS,GAAMC,EACvEzwB,EAAS2vB,EAAY,SAASU,CAAM,EACpCpV,EAAa6U,EAAY,SAASO,CAAM,EACxCnD,EAAYuC,EAAW,SAASY,CAAM,EAEtCM,EAAe,IAAM,CACrBD,IACG1wB,GACHowB,EAAarR,EAAMsR,CAAM,EAE3BJ,EAAeI,CAAM,GAEnBlB,GACFgB,EAAeE,CAAM,CAEzB,EAEMj/B,GAAahC,IAA0C,CACvDA,GAAM,MAAQ,SAAWA,GAAM,MAAQ,KACzCA,GAAM,eAAA,EACNuhC,EAAA,GACSvhC,GAAM,MAAQ,cAAgBshC,GACvCN,EAAarR,EAAMsR,CAAM,EACzB17B,EAAQ07B,EAAQ,EAAI,GACXjhC,GAAM,MAAQ,aAAeshC,GACtC/7B,EAAQ07B,EAAQ,EAAK,CAEzB,EAEA,OACEzvB,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,kBAAmB,CAAE,2BAA4BygB,EAAY,EAC3E,KAAK,WACL,gBAAeyV,EAAgB1wB,EAAS,OACxC,gBAAemvB,GAAcC,EAAanU,EAAa,OAGvD,SAAA,CAAAra,EAAAA,KAAC,OAAA,CACC,UAAU,2BACV,QAAS+vB,EACT,UAAAv/B,GACA,SAAU,EACV,KAAK,SAEJ,SAAA,CAAAg+B,GACCl3B,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,UAAU,4BACV,QAAS+iB,EACT,QAAUta,IAAMA,GAAE,gBAAA,EAClB,SAAU,IAAMwvB,EAAeE,CAAM,EACrC,aAAYtR,EAAK,KAAA,CAAA,EAGrBne,EAAAA,KAAC,OAAA,CAAK,UAAU,yBACb,SAAA,CAAA8vB,GAAiB1wB,EAChB9H,EAAAA,IAACc,GAAA,CAAK,KAAM81B,GAAA,YAAAA,EAAU,OAAkB,KAAM,EAAG,KAAM,EAAA,CAAI,EACzD4B,EACFx4B,EAAAA,IAACc,GAAA,CAAK,KAAM81B,GAAA,YAAAA,EAAU,OAAkB,KAAM,EAAG,KAAM,EAAA,CAAI,EAE3D52B,EAAAA,IAACc,GAAA,CAAK,KAAM61B,EAAU,KAAM,GAAI,EAEjCQ,EAAcA,EAAYtQ,EAAMsR,CAAM,EAAItR,EAAK,KAAA,CAAA,CAClD,CAAA,CAAA,CAAA,EAED2R,GAAiB1wB,GAChB9H,EAAAA,IAAC,MAAA,CAAI,KAAK,QACP,SAAAg1B,GAAa,CAACsD,EACbt4B,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAA2B,KAAK,SAAS,SAAA,WAAA,CAExD,EAEAs4B,GAAA,YAAAA,EAAkB,IAAI,CAAC1R,GAAG8R,KAAQN,EAAWxR,GAAG,GAAGyR,CAAI,IAAIK,EAAG,EAAE,EAAC,CAErE,CAAA,CAAA,EAvCGP,CAAA,CA2CX,EAEMQ,EAAO/9B,EAAAA,QACX,IAAMsU,EAAK,IAAI,CAAC0pB,EAAGF,IAAQN,EAAWQ,EAAG,GAAGF,CAAG,EAAE,CAAC,EAElD,CACExpB,EACAuoB,EACAG,EACAX,EACAC,EACAP,EACAC,EACAO,EACAE,EACAE,CAAA,CACF,EAGF,OACEv3B,EAAAA,IAAC,MAAA,CAAI,cAAauB,EAAa,GAAGC,EAAO,IAAAC,EAAU,KAAK,OAAO,UAAWa,EAAG,YAAatB,CAAS,EAChG,SAAA23B,EAAK,IAAI,CAAC7uB,EAAM4uB,IACf14B,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAA+B,KAAK,eAChD,SAAA8J,CAAA,EADsC4uB,CAEzC,CACD,EACH,CAEJ,CAAC,EC9LYG,GAAWtiC,EAAM,WAA+D,SAC3F,CAAE,UAAAyK,EAAW,MAAA2vB,EAAO,aAAAmI,EAAc,SAAA/4B,EAAU,GAAG8C,CAAA,EAC/CpB,EACA,CACA,OACEzB,EAAAA,IAAC,KAAA,CACE,GAAG6C,EACJ,IAAApB,EACA,UAAWa,EACT,gBACA,CAAE,sBAAuBquB,EAAO,8BAA+BmI,CAAA,EAC/D93B,CAAA,EAGD,SAAAjB,CAAA,CAAA,CAGP,CAAC,EAGYg5B,GAAgBxiC,EAAM,WACjC,SAAuB,CAAE,UAAAyK,EAAW,MAAA4H,EAAO,SAAA7I,EAAU,GAAG8C,CAAA,EAAQpB,EAAK,CACnE,OACEiH,OAAC,MAAI,GAAG7F,EAAM,IAAApB,EAAU,UAAWa,EAAG,uBAAwBtB,CAAS,EACrE,SAAA,CAAAhB,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAwB,SAAA4I,EAAM,EAC7C5I,EAAAA,IAAC,KAAA,CAAG,UAAU,uBAAwB,SAAAD,CAAA,CAAS,CAAA,EACjD,CAEJ,CACF,EAGai5B,GAAeziC,EAAM,WAAgE,SAChG,CAAE,UAAAyK,EAAW,MAAAM,EAAO,KAAA0e,EAAM,KAAA1I,EAAM,KAAAjQ,EAAM,KAAAsa,EAAO,UAAW,SAAA5hB,EAAU,GAAG8C,CAAA,EACrEpB,EACA,CACA,OACEiH,EAAAA,KAAC,KAAA,CAAI,GAAG7F,EAAM,IAAApB,EAAU,UAAWa,EAAG,sBAAuB,4BAA4Bqf,CAAI,GAAI3gB,CAAS,EACxG,SAAA,CAAAhB,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAsB,cAAY,OAC/C,SAAAqH,EACC,OAAOA,GAAS,SACdrH,EAAAA,IAACc,IAAK,KAAMuG,EAAM,KAAM,EAAA,CAAI,EAE5BA,EAGFrH,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAA,CAAqB,CAAA,CAEzC,EACA0I,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAA1I,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAwB,SAAAsB,EAAM,EAC5C0e,EAAOhgB,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAuB,WAAK,EAAS,KAC3DD,EAAWC,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAA0B,SAAAD,EAAS,EAAS,IAAA,EACzE,EACCuX,EAAOtX,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAuB,WAAK,EAAS,IAAA,EAC9D,CAEJ,CAAC,ECvFD,SAASi5B,GAAoBC,EAAoE,CAC/F,OAAOA,EAAU,UAAU,CAAC,EAAE,YAAA,CAQhC,CAEA,SAASC,GAAqBjiC,EAAmBkiC,EAAe,CAC9D,OAAOA,EAAI,gBAAgB,YAAcliC,EAAM,SAAWkiC,EAAI,gBAAgB,aAAeliC,EAAM,OACrG,CAYO,SAASmiC,GAAkB,CAChC,SAAAt5B,EACA,iBAAAu5B,EAAmB,GACnB,WAAAC,EAAa,YACb,YAAAC,EACA,WAAAC,EAAa,aACb,QAAAtkB,EAAU,EACZ,EAA2B,CACzB,MAAMukB,EAAW5iC,EAAAA,OAAO,EAAK,EACvBie,EAAUje,EAAAA,OAAgB,IAAI,EAC9B6iC,EAAe7iC,EAAAA,OAAO,EAAK,EAC3B8iC,EAAoB9iC,EAAAA,OAAO,EAAK,EAEtCX,EAAAA,UAAU,KAER,WAAW,IAAM,CACfwjC,EAAa,QAAU,EACzB,EAAG,CAAC,EACG,IAAM,CACXA,EAAa,QAAU,EACzB,GACC,CAAA,CAAE,EAEL,MAAME,EAAYl2B,GAAY5D,EAA8D,IAAKgV,CAAO,EAElG+kB,EAAkBlR,GAAkB1xB,GAAmC,CAC3E,MAAM6iC,EAAkBH,EAAkB,QAG1C,GAFAA,EAAkB,QAAU,GAG1B,CAACzkB,GACD,CAACwkB,EAAa,SACd,CAAC5kB,EAAQ,SACR,YAAa7d,GAASiiC,GAAqBjiC,EAAO,QAAQ,EAE3D,OAGF,GAAIwiC,EAAS,QAAS,CACpBA,EAAS,QAAU,GACnB,MACF,CAEA,IAAIM,EAEJ,GAAI9iC,EAAM,aACR8iC,EAAY9iC,EAAM,aAAA,EAAe,QAAQ6d,EAAQ,OAAO,EAAI,OACvD,CACL,MAAMhb,EAAS7C,EAAM,OAErB8iC,EAAY,CAAC,SAAS,gBAAgB,SAASjgC,CAAM,GAAKgb,EAAQ,QAAQ,SAAShb,CAAM,CAC3F,CAEA,GAAI,CAACigC,IAAcV,GAAoB,CAACS,GAAkB,CAGxD,GAAIlwB,GAAwB3S,EAAO6d,EAAQ,OAAO,EAChD,OAEFykB,EAAYtiC,CAAK,CACnB,CACF,CAAC,EAEK+iC,EAAyBC,GAAyBhjC,GAAgC,CACtF0iC,EAAkB,QAAU,GAG5B,MAAMO,EAAuBp6B,EAAS,MAAMm6B,CAAW,EAEnDC,GAEFA,EAAqBjjC,CAAK,CAE9B,EAEMkjC,EAGF,CAAE,IAAKP,CAAA,EAEX,OAAIJ,IAAe,KACjBW,EAAcX,CAAU,EAAIQ,EAAsBR,CAAU,GAG9DtjC,EAAAA,UAAU,IAAM,CACd,GAAIsjC,IAAe,GAAO,CACxB,MAAMY,EAAmBpB,GAAoBQ,CAAU,EAEjDa,EAAkB,IAAM,CAC5BZ,EAAS,QAAU,EACrB,EAEA,gBAAS,iBAAiBW,EAAkBP,CAAe,EAC3D,SAAS,iBAAiB,YAAaQ,CAAe,EAE/C,IAAM,CACX,SAAS,oBAAoBD,EAAkBP,CAAe,EAC9D,SAAS,oBAAoB,YAAaQ,CAAe,CAC3D,CACF,CAGF,EAAG,CAACR,EAAiBL,CAAU,CAAC,EAE5BF,IAAe,KACjBa,EAAcb,CAAU,EAAIU,EAAsBV,CAAU,GAG9DpjC,EAAAA,UAAU,IAAM,CACd,GAAIojC,IAAe,GAAO,CACxB,MAAMgB,EAAmBtB,GAAoBM,CAAU,EAEvD,gBAAS,iBAAiBgB,EAAkBT,CAAe,EAEpD,IAAM,CACX,SAAS,oBAAoBS,EAAkBT,CAAe,CAChE,CACF,CAGF,EAAG,CAACA,EAAiBP,CAAU,CAAC,EAEzBv5B,EAAAA,IAAA4M,EAAAA,SAAA,CAAG,SAAArW,EAAM,aAAawJ,EAAUq6B,CAAa,EAAE,CACxD,CCxIO,MAAMI,GAAmBz5B,EAAAA,WAC9B,CACE,CACE,UAAAC,EACA,SAAAjB,EACA,KAAAqN,EACA,SAAAqtB,EACA,QAAAvzB,EAAU,SACV,QAAA+M,EACA,eAAAymB,EAAiB,QACjB,cAAen5B,EAAa,UAC5B,GAAGC,CAAA,EAELC,IACG,SACH,MAAMk5B,EAAmBF,GAAA,KAAAA,EAAYrtB,EAC/BwtB,EAAoBt4B,EAAG,eAAgB,gBAAgB4E,CAAO,GAAIlG,EAAW,CACjF,CAAC,gBAAgB25B,CAAgB,EAAE,EAAG,EAAQA,CAAgB,CAC/D,EAED,OACEjyB,EAAAA,KAAC,MAAA,CACC,cAAanH,EACZ,GAAGC,EAGJ,MAAMvJ,EAAAuJ,EAAM,OAAN,KAAAvJ,EAAc,QACpB,aAAWuH,EAAAgC,EAAM,WAAW,IAAjB,KAAAhC,EAAuBm7B,IAAqB,QAAU,YAAc,SAC/E,UAAWC,EACX,IAAAn5B,EAEC,SAAA,CAAA1B,EACAkU,GACCjU,EAAAA,IAAC,SAAA,CAAO,UAAU,0BAA0B,QAASiU,EAAS,aAAYymB,EAAgB,KAAK,SAC7F,SAAA16B,EAAAA,IAACc,GAAA,CAAK,KAAK,QAAQ,OAAQ,IAAM,CAAA,CACnC,CAAA,CAAA,CAAA,CAIR,CACF,EAEMsmB,GAAS,CAAC,CAAE,SAAArnB,KACTC,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAwB,SAAAD,CAAA,CAAS,EAGnD86B,GAAU,OAAO,OAAOL,GAAkB,CAAE,OAAApT,GAAQ,EChCnD,SAAS0T,GAAgB,CAC9B,KAAAt+B,EACA,MAAA8E,EACA,UAAAy5B,EACA,KAAAl6B,EACA,aAAAm6B,EACA,WAAAC,EACA,UAAAC,EACA,aAAAC,EACA,KAAAC,EACA,aAAAC,EACA,YAAAC,EACA,UAAAC,EACA,QAAAtnB,EACA,SAAAlU,EACA,UAAAiB,CACF,EAA6C,CAC3C,MAAMw6B,EAAgBR,IAAiB,QAAan6B,IAAS,OAEvD46B,EAAUn6B,GAAA,KAAAA,EAAS,OAEzB,cACGimB,GAAA,CAAM,KAAA/qB,EAAY,QAAAyX,EAAkB,KAAK,SAAS,aAAYwnB,EAC7D,SAAA,CAAAz7B,EAAAA,IAACunB,GAAM,OAAN,CAAc,SAAAkU,CAAA,CAAQ,EACvBz7B,EAAAA,IAACunB,GAAM,QAAN,CACC,SAAA7e,EAAAA,KAAC,OAAI,UAAWpG,EAAG,+BAAgCtB,CAAS,EACzD,SAAA,CAAAw6B,EACCx7B,EAAAA,IAACqP,GAAA,CACC,MAAO0rB,GAAA,KAAAA,EAAa,OACpB,MAAOl6B,GAAA,KAAAA,EAAQ,GACf,UAAS,GACT,SAAU,CAAC,CAACu6B,EACZ,SAAWlkC,GAAU8jC,GAAA,YAAAA,EAAe9jC,EAAM,cAAc,MAAK,CAAA,EAE7D,KACH+jC,EACCj7B,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,IAAKi7B,EAAY,IAAI,EAAA,CAAG,CAAA,CAC/B,EACE,KACHC,EACCl7B,EAAAA,IAAC2I,GAAA,CACC,QAAQ,WACR,KAAK,QACL,SAAU,CAAC,CAACyyB,EACZ,QAAS,IAAMF,EAAA,EACf,MAAOC,GAAA,KAAAA,EAAgB,iBAAA,CAAA,EAEvB,KACHp7B,CAAA,CAAA,CACH,CAAA,CACF,EACA2I,EAAAA,KAAC6e,GAAM,OAAN,CACC,SAAA,CAAAvnB,EAAAA,IAAC2I,GAAA,CAAO,QAAQ,OAAO,SAAU,CAAC,CAACyyB,EAAM,QAAS,IAAMnnB,EAAA,EAAW,MAAOqnB,GAAA,KAAAA,EAAe,QAAA,CAAU,EACnGt7B,EAAAA,IAAC2I,GAAA,CAAO,QAAQ,YAAY,SAAU,CAAC,CAACyyB,EAAM,QAAS,IAAMG,EAAA,EAAa,MAAOF,GAAA,KAAAA,EAAgB,MAAA,CAAQ,CAAA,CAAA,CAC3G,CAAA,EACF,CAEJ,CC7DO,MAAMK,GAAoB36B,EAAAA,WAAmD,SAClF,CACE,KAAAqM,EACA,QAAAlG,EACA,UAAAlG,EACA,cAAA26B,EAAgB,EAChB,IAAA5lB,EAAM,IACN,MAAA1U,EAAQ,UACR,KAAAF,EAAO,SACP,UAAA8H,EACA,MAAA+O,EACA,WAAA4jB,EACA,GAAA3tB,EACA,GAAGpL,CACL,EACApB,EACA,CACA,MAAMo6B,EAAY,CAChB,KAAM,cACN,aAAch5B,EAAK,YAAY,EAC/B,GAAAoL,EACA,GAAIb,IAAS,cAAgB,CAAE,gBAAiBuuB,EAAe,gBAAiB,EAAG,gBAAiB5lB,GAAQ,CAAA,CAAC,EAEzG5T,EAAad,IAAU,UAAY,wBAAwBA,CAAK,GAAK,KACrEy6B,EAAU,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG/lB,EAAM,EAAK4lB,EAAgB5lB,EAAO,IAAM,CAAC,CAAC,EAEpF,GAAI7O,IAAY,WACd,OACElH,EAAAA,IAAC,MAAA,CACC,IAAAyB,EACA,UAAWa,EAAG,0BAA2B,QAAQ8K,CAAI,GAAIjL,EAAY,uBAAuBhB,CAAI,GAAIH,CAAS,EAC5G,GAAG66B,EAEH,aAAS,cACR77B,EAAAA,IAAC+7B,IAAiB,cAAeD,CAAA,CAAS,EAE1CpzB,EAAAA,KAAAkE,EAAAA,SAAA,CACE,SAAA,CAAA5M,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAA,CAAiC,QAC/C,MAAA,EAAI,QACJ,MAAA,EAAI,QACJ,MAAA,CAAA,CAAI,CAAA,CAAA,CACP,CAAA,CAAA,EAQR,MAAMg8B,EAAY,CAAE,4BAA6B/yB,CAAA,EAC3CgzB,EACJjkB,IAAU,OAAY,CAAE,MAAO,OAAOA,GAAU,SAAW,GAAGA,CAAK,KAAOA,CAAA,EAAU,OAChFkkB,EAAOC,GACXn8B,EAAAA,IAAC,MAAA,CACC,IAAKm8B,EAAQ16B,EAAM,OACnB,UAAWa,EAAG,wBAAyB,QAAQ8K,CAAI,GAAIjL,EAAYg6B,GAASH,EAAWG,GAASn7B,CAAS,EACzG,MAAOm7B,EAAQF,EAAY,OAC1B,GAAGJ,EAEJ,SAAA77B,EAAAA,IAAC,MAAA,CACC,UAAU,+BACV,MAAOoN,IAAS,cAAgB,CAAE,MAAO,GAAG0uB,CAAO,KAAQ,CAAA,CAAC,CAAA,CAC7D,CAAA,EAIL,GAAI,CAACF,GAAcxuB,IAAS,cAC1B,OAAO8uB,EAAI,EAAI,EAEjB,MAAME,EAAcrmB,IAAQ,IAAM,GAAG,KAAK,MAAM4lB,CAAa,CAAC,IAAM,GAAGA,CAAa,MAAM5lB,CAAG,GAC7F,OACErN,EAAAA,KAAC,MAAA,CAAI,IAAAjH,EAAU,UAAWa,EAAG,yBAA0B05B,EAAWh7B,CAAS,EAAG,MAAOi7B,EAClF,SAAA,CAAAC,EAAI,EAAK,EACVl8B,EAAAA,IAAC,OAAA,CAAK,UAAU,wBACb,SAAA,OAAO47B,GAAe,WAAaA,EAAWD,EAAe5lB,CAAG,EAAIqmB,CAAA,CACvE,CAAA,EACF,CAEJ,CAAC,EAOM,SAASL,GAAiB,CAAE,cAAAJ,EAAgB,GAA4B,CAC7E,MAAMU,EAAYvlC,EAAAA,OAAyB,IAAI,EAE/CX,OAAAA,EAAAA,UAAU,IAAM,OACd,GAAI,CAACkmC,EAAU,SAAW,CAACA,EAAU,QAAQ,EAAG,OAEhD,MAAMC,GAAerkC,EAAAokC,EAAU,UAAV,YAAApkC,EAAmB,EAAE,QAAQ,MAClD,GAAIqkC,GAAgBD,EAAU,QAAS,CACrC,MAAME,EAAe,EAAI,KAAK,GAAKD,EACnCD,EAAU,QAAQ,MAAM,gBAAkB,GAAGE,CAAY,IAAIA,CAAY,GACzEF,EAAU,QAAQ,MAAM,iBAAmB,GAAGE,CAAY,GAE1D,MAAM5gC,EAAS4gC,EAAgBZ,EAAgB,IAAOY,EACtDF,EAAU,QAAQ,MAAM,iBAAmB,GAAG1gC,CAAM,EACtD,CACF,EAAG,CAAC0gC,EAAWV,CAAa,CAAC,QAG1B,MAAA,CAAI,UAAU,+BACb,SAAA37B,EAAAA,IAAC,UAAO,UAAU,kCAAkC,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,IAAKq8B,EAAW,EAC7F,CAEJ,CC3GO,SAASG,GAAch7B,EAA+C,CAC3E,KAAM,CAAE,KAAAhF,EAAM,MAAA8E,EAAO,QAAAm7B,EAAS,QAAA7lB,EAAS,aAAAykB,EAAc,YAAAC,EAAa,OAAAoB,EAAQ,KAAAtB,EAAM,UAAAG,EAAW,SAAAoB,EAAU,UAAA37B,CAAA,EACnGQ,EAEIo7B,EAAY1kC,EAAAA,MAAA,EACZ2kC,EAAY3kC,EAAAA,MAAA,EAGZ8V,EAAc,CAACyuB,EAAUG,EAAY,GAAIhmB,EAAUimB,EAAY,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAEjG,OACEn0B,EAAAA,KAAC6e,GAAA,CACC,KAAA/qB,EACA,QAASmgC,EACT,KAAK,SACL,KAAK,cACL,SAAS,OACT,WAAY,CAACvB,EACb,oBAAqB,CAACA,EACtB,aAAY95B,EACX,GAAI0M,EAAc,CAAE,mBAAoBA,CAAA,EAAgB,CAAA,EAEzD,SAAA,CAAAhO,EAAAA,IAACunB,GAAM,OAAN,CAAc,SAAAjmB,CAAA,CAAM,EACrBtB,EAAAA,IAACunB,GAAM,QAAN,CACC,SAAA7e,EAAAA,KAAC,OAAI,UAAWpG,EAAG,4BAA6BtB,CAAS,EACtD,SAAA,CAAAy7B,EACCz8B,EAAAA,IAACqU,GAAA,CAAW,GAAIuoB,EAAW,QAAQ,QAAQ,MAAM,cAAc,UAAU,OACtE,SAAAH,CAAA,CACH,EACE,KACH7lB,EACC5W,EAAAA,IAACqU,GAAA,CAAW,GAAIwoB,EAAW,QAAQ,UAAU,MAAM,gBAAgB,UAAU,OAC1E,SAAAjmB,CAAA,CACH,EACE,IAAA,CAAA,CACN,CAAA,CACF,EACAlO,EAAAA,KAAC6e,GAAM,OAAN,CACC,SAAA,CAAAvnB,EAAAA,IAAC2I,GAAA,CAAO,QAAQ,OAAO,KAAK,QAAQ,SAAU,CAAC,CAACyyB,EAAM,QAASuB,EAAU,MAAOrB,GAAA,KAAAA,EAAe,SAAU,EACzGt7B,EAAAA,IAAC2I,GAAA,CACC,QAAQ,YACR,KAAK,QACL,MAAO+zB,EAAS,QAAU,UAC1B,SAAU,CAAC,CAACtB,EACZ,QAASG,EACT,MAAOF,CAAA,CAAA,CACT,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CCzDA,MAAMyB,GAAY,CAAE,MAAO,CAAE,OAAQ,GAAI,MAAO,IAAM,OAAQ,CAAE,OAAQ,GAAI,MAAO,GAAG,EAEhF30B,GAAWxS,GAEfA,GAAU,MACVA,IAAU,IACVA,IAAU,IACV,EAAE,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,GAMhConC,GAAaxmC,EAAM,WAA+D,SAC7F,CACE,UAAAyK,EACA,MAAAM,EACA,KAAA+F,EACA,QAAAyM,EACA,QAAA5M,EAAU,QACV,KAAA/F,EAAO,SACP,SAAApB,EACA,cAAewB,EAAa,cAC5B,GAAGsB,CACL,EACApB,EACA,CACA,OACEiH,EAAAA,KAAC,MAAA,CACC,cAAanH,EACZ,GAAGsB,EACJ,IAAApB,EACA,UAAWa,EAAG,mBAAoB,oBAAoB4E,CAAO,GAAI,oBAAoB/F,CAAI,GAAIH,CAAS,EAErG,SAAA,CAAAmH,GAAQd,CAAI,EACXrH,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAAyB,cAAY,OAClD,SAAA,OAAOqH,GAAS,eAAYvG,GAAA,CAAK,KAAMuG,EAAM,KAAMy1B,GAAU51B,CAAO,EAAE/F,CAAI,CAAA,CAAG,EAAKkG,CAAA,CACrF,EACE,KACHc,GAAQ7G,CAAK,EAAItB,EAAAA,IAAC,OAAI,UAAU,0BAA2B,WAAM,EAAS,KAC1EmI,GAAQpI,CAAQ,EAAIC,EAAAA,IAAC,OAAI,UAAU,gCAAiC,SAAAD,EAAS,EAAS,KACtFoI,GAAQ2L,CAAO,EAAI9T,EAAAA,IAAC,OAAI,UAAU,4BAA6B,WAAQ,EAAS,IAAA,CAAA,CAAA,CAGvF,CAAC,EChEM,SAASg9B,IAAqB,CACnC,KAAM,CAACC,EAAYC,CAAa,EAAIhnC,EAAAA,SAA6B,IAAI,EAErE,OAAAE,GAAoB,IAAM,CACxB,MAAM2H,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,GAAK,mBAAmBo/B,GAAAA,GAAA,CAAI,GACpC,SAAS,KAAK,QAAQp/B,CAAO,EAE7Bm/B,EAAcn/B,CAAO,EAEd,IAAM,CACX,SAAS,KAAK,YAAYA,CAAO,CACnC,CACF,EAAG,CAAA,CAAE,EAEE,CAAE,gBAAiBk/B,CAAA,CAC5B,CCwBA,SAASG,GAAgB,CACvB,MAAAC,EACA,SAAA3vB,EACA,QAAAxG,EACA,UAAAlG,EACA,UAAA2T,EACA,UAAA2oB,EACA,cAAAC,EACA,UAAAC,EACA,cAAAC,EACA,QAAAxpB,CACF,EAAyB,eACvB,MAAMc,EAAUje,EAAAA,OAAuB,IAAI,EAE3C,OACEkJ,EAAAA,IAACgV,GAAAA,cAAA,CACC,OAAM,GACN,QAAS,IACT,WAAY,CACV,OAAQ,sBACR,aAAc,6BACd,WAAY,2BACZ,MAAO,sBACP,YAAa,6BACb,UAAW,2BACX,WAAY,2BAAA,EAEd,cAAa,GACb,GAAE,GACF,QAAAD,EAEA,SAAA/U,EAAAA,IAAC09B,GAAA,CACC,IAAK3oB,EACL,WAAW9c,EAAAolC,EAAM,YAAN,KAAAplC,EAAmB0c,EAC9B,QAAS0oB,EAAM,QACf,UAAU79B,EAAA69B,EAAM,WAAN,KAAA79B,EAAkBkO,EAC5B,SAASnL,EAAA86B,EAAM,UAAN,KAAA96B,EAAiB2E,EAC1B,QAASu2B,EAAcJ,EAAM,EAAE,EAC/B,UAAW/6B,EAAGtB,EAAWq8B,EAAM,SAAS,EACxC,aAAaM,EAAAN,EAAM,YAAN,KAAAM,EAAmBL,EAChC,eAAeM,EAAAP,EAAM,gBAAN,KAAAO,EAAuBL,EACtC,QAAStpB,EAAQopB,EAAM,EAAE,EACxB,GAAGG,CAAA,CAAA,CACN,CAAA,CAGN,CAiBA,MAAMK,GAAkBl+B,EAAAA,cAA+B,CACrD,YAAa,IAAM,GACnB,kBAAmB,IAAA,GACnB,mBAAoB,IAAA,GACpB,kBAAmB,IAAA,GACnB,kBAAmB,IAAA,EACrB,CAAC,EAEM,SAASm+B,GAAiBt8B,EAA+B,CAC9D,KAAM,CACJ,SAAAkM,EAAW,YACX,QAAAxG,EAAU,OACV,UAAAlG,EACA,UAAAs8B,EAAY,GACZ,cAAAC,EAAgB,IAChB,aAAAQ,EAAe,GACf,QAAA1c,EACA,UAAA1M,EAAY,MACZ,SAAA5U,EACA,GAAG8C,CAAA,EACDrB,EAEE,CAACw8B,EAAQC,CAAS,EAAI/nC,EAAAA,SAAkB,CAAA,CAAE,EAC1C,CAAE,gBAAAgoC,CAAA,EAAoBlB,GAAA,EAEtBmB,EAA2BtmC,cAAa+G,GAAY,CACxD,KAAM,CAAE,IAAAwQ,EAAK,GAAGvM,CAAAA,EAASjE,EAEnBqP,EAAKmB,GAAA,KAAAA,EAAO+tB,MAAA,EACZE,EAAe,CAAE,GAAApvB,EAAI,GAAGpL,CAAAA,EAE9B,OAAAo7B,EAAWxS,GAAc,CACvB,MAAM/Q,EAAQ+Q,EAAU,UAAW5E,GAASA,EAAK,KAAO5Y,CAAE,EAC1D,GAAIyM,IAAU,GACZ,MAAO,CAAC,GAAG+Q,EAAW4R,CAAK,EAE7B,MAAMvlC,EAAO,CAAC,GAAG2zB,CAAS,EAC1B,OAAA3zB,EAAK4iB,CAAK,EAAI2iB,EACPvlC,CACT,CAAC,EAEMmW,CACT,EAAG,CAAA,CAAE,EAECmwB,EAAoB,IAAM,CAC9BH,EAAU,CAAA,CAAE,CACd,EAEMI,EAAqB,IAAM,CAC/BJ,EAAWxS,GAAcA,EAAU,MAAM,CAAC,CAAC,CAC7C,EAEM6S,EAAoB,IAAM,CAC9BL,EAAWxS,GAAcA,EAAU,MAAM,EAAG,EAAE,CAAC,CACjD,EAEM8S,EAAqBtwB,GAAe,CACxCgwB,EAAWxS,GAAcA,EAAU,OAAQ91B,GAAUA,EAAM,KAAOsY,CAAE,CAAC,CACvE,EAEMwvB,EAAiBxvB,GAAgB/W,GAAyC,CAC9EmqB,GAAA,MAAAA,EAAUnqB,GAEN6mC,GACFQ,EAAkBtwB,CAAE,CAExB,EAEMgG,EAAWhG,GAAe,IAAM,CACpCswB,EAAkBtwB,CAAE,CACtB,EAEMuwB,EAAmBR,EAAO,OAC9B,CAACS,EAAKpB,IAAU,SACd,MAAMqB,GAAkBzmC,EAAAolC,EAAM,WAAN,KAAAplC,EAAkByV,EAE1C,OAAA+wB,EAAIC,CAAe,EAAI,CAAC,IAAIl/B,EAAAi/B,EAAIC,CAAe,IAAnB,KAAAl/B,EAAwB,CAAA,EAAK69B,CAAK,EAEvDoB,CACT,EACA,CAAA,CAAC,EAGGE,EAAa,OAAO,KAAKH,CAAgB,EAAkC,IAAKpvB,GAAQ,CAC5F,MAAM4uB,EAASQ,EAAiBpvB,CAAG,EAEnC,OACEpP,EAAAA,IAAC4+B,GAAAA,gBAAA,CAEC,UAAWt8B,EAAG,iBAAkB,QAAQ8M,CAAG,EAAE,EAC7C,cAAa,aAAaA,CAAG,GAC7B,OAAM,GAEL,SAAA4uB,EAAO,IAAKX,GACXr9B,EAAAA,IAACo9B,GAAA,CAEC,MAAAC,EACA,SAAA3vB,EACA,QAAAxG,EACA,UAAAlG,EACA,UAAA2T,EACA,UAAA2oB,EACA,cAAAC,EACA,UAAW16B,EACX,cAAA46B,EACA,QAAAxpB,CAAA,EAVKopB,EAAM,EAAA,CAYd,CAAA,EAnBIjuB,CAAA,CAsBX,CAAC,EAED,OACE1G,EAAAA,KAACm1B,GAAgB,SAAhB,CACC,MAAO,CAAE,YAAAM,EAAa,kBAAAC,EAAmB,mBAAAC,EAAoB,kBAAAC,EAAmB,kBAAAC,CAAA,EAE/E,SAAA,CAAAx+B,EACAm+B,GAAmBjxB,GAAAA,aAAa0xB,EAAWT,CAAe,CAAA,CAAA,CAAA,CAGjE,CAcO,MAAMR,GAAWnnC,EAAM,WAAW,SACvC,CACE,UAAAyK,EACA,QAAA4V,EACA,QAAA1P,EAAU,OACV,SAAAwG,EAAW,YACX,QAAA2T,EACA,UAAA1M,EAAY,MACZ,YAAAkqB,EACA,cAAAtB,EACA,QAAAtpB,EACA,OAAA6qB,EACA,GAAGj8B,CACL,EACApB,EACA,WACA,MAAMs9B,EAAajoC,EAAAA,OAAA,EAEbkoC,EAAgBpW,GAAiB,IAAM,CACvC,CAAC3U,GAAW,CAAC4qB,GAAe,CAACtB,IAI7BwB,EAAW,SACb,aAAaA,EAAW,OAAO,EAGjCA,EAAW,QAAU,WAAW,IAAM,CACpC9qB,EAAA,CACF,EAAGspB,CAAa,EAClB,CAAC,EAEDpnC,EAAAA,UAAU,KACR6oC,EAAA,EAEO,IAAM,CACPD,EAAW,SACb,aAAaA,EAAW,OAAO,CAEnC,GACC,CAACC,CAAa,CAAC,EAElB,MAAMC,EAAUtqB,EAEhB,OACEjM,EAAAA,KAACu2B,EAAA,CACC,IAAAx9B,EACA,UAAWa,EAAG,gBAAiBtB,EAAW,QAAQkG,CAAO,GAAI,QAAQwG,CAAQ,EAAE,EAC/E,QAAA2T,EACC,GAAGxe,EAGJ,MAAM5K,EAAA4K,EAAK,OAAL,KAAA5K,EAAa,QACnB,aAAWuH,EAAAqD,EAAK,WAAW,IAAhB,KAAArD,EAAsB0H,IAAY,SAAW,YAAc,SACtE,eAAa3E,EAAAM,EAAK,aAAa,IAAlB,KAAAN,EAAuB,OAEpC,SAAA,CAAAvC,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAuB,SAAA4W,EAAQ,EAC7CkoB,GAAU,KAAO9+B,EAAAA,IAAC,OAAI,UAAU,wBAAyB,WAAO,EAAS,IAAA,CAAA,CAAA,CAGhF,CAAC,EAEM,SAASk/B,IAAc,CAC5B,OAAO5+B,EAAAA,WAAWu9B,EAAe,CACnC,CCpSO,SAASsB,GAAmBzmC,EAAiB0mC,EAA6B,CAC/E,MAAMC,EAAUzW,GAAiBwW,CAAS,EAC1CjpC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACuC,EAAQ,OACb,MAAMQ,EAAahC,GAA+B,CAC5CA,EAAM,MAAQ,WAClBA,EAAM,eAAA,EACNmoC,EAAA,EACF,EACA,gBAAS,iBAAiB,UAAWnmC,EAAW,EAAI,EAC7C,IAAM,SAAS,oBAAoB,UAAWA,EAAW,EAAI,CACtE,EAAG,CAACR,EAAQ2mC,CAAO,CAAC,CACtB,CCmBA,SAASC,GAAa,CAAE,UAAAC,EAAW,UAAArkC,EAAW,OAAAS,EAAQ,UAAAqF,EAAW,SAAAjB,GAA+B,SAC9F,MAAM/H,EAAWiD,GAAiBC,CAAS,EACrC,CAAE,KAAA8B,EAAM,eAAAC,CAAA,EAAmBE,eAAY,CAC3C,SAAU,CAAE,UAAAoiC,CAAA,EACZ,UAAWvnC,EAAS,UACpB,qBAAsBoF,GAAAA,WACtB,WAAY,CACVoiC,UAAiB,CAAE,UAAUvnC,EAAA0D,GAAA,YAAAA,EAAQ,UAAR,KAAA1D,EAAmB,EAAG,WAAWuH,EAAA7D,GAAA,YAAAA,EAAQ,UAAR,KAAA6D,EAAmB,EAAG,EAGpF,GAAIxH,EAAS,eAAiB,CAACA,EAAS,cAAc,EAAI,CAACyD,GAAAA,KAAA,EAAQC,GAAAA,MAAM,CAAE,QAAS,CAAA,CAAG,CAAC,CAAA,CAC1F,CACD,EACD,OACEsE,EAAAA,IAAC,MAAA,CAAI,IAAKhD,EAAK,YAAa,UAAWsF,EAAG,eAAgBtB,CAAS,EAAG,MAAO/D,EAC1E,SAAA8C,CAAA,CACH,CAEJ,CAMA,SAAS0/B,GAAa1hC,EAA2B,CAC/C,GAAI,CACF,OAAOA,EAAQ,QAAQ,gBAAgB,CACzC,MAAQ,CACN,MAAO,EACT,CACF,CAEO,MAAM2hC,GAAU3+B,EAAAA,WAA4D,SACjF,CACE,UAAAC,EACA,SAAAjB,EACA,UAAA7E,EAAY,MACZ,OAAAS,EAAS,CAAE,QAAS,EAAG,QAAS,CAAA,EAChC,QAAAib,EACA,KAAM0F,EACN,QAAAqjB,EAAU,QACV,UAAAtjC,EAAY,EACZ,WAAAC,EAAa,CACf,EACAmF,EACA,CACA,KAAM,CAAC89B,EAAWK,CAAY,EAAI1pC,EAAAA,SAAgC,IAAI,EAChE,CAAC2pC,EAAWC,CAAY,EAAI5pC,EAAAA,SAAS,EAAK,EAC1C,CAAC6pC,EAAWC,CAAY,EAAI9pC,EAAAA,SAAS,EAAK,EAC1C2G,EAAe/F,EAAAA,OAA6C,IAAI,EAChEgG,EAAgBhG,EAAAA,OAA6C,IAAI,EAEjEmpC,EAAmBnpC,EAAAA,OAAO,EAAK,EAC/BopC,EAAiBppC,EAAAA,OAAO,EAAK,EAE7BwG,EAAczF,EAAAA,YAAY,IAAM,CAChCgF,EAAa,UAAY,OAC3B,aAAaA,EAAa,OAAO,EACjCA,EAAa,QAAU,MAErBC,EAAc,UAAY,OAC5B,aAAaA,EAAc,OAAO,EAClCA,EAAc,QAAU,KAE5B,EAAG,CAAA,CAAE,EAEL3G,EAAAA,UAAU,IAAM,IAAMmH,IAAe,CAACA,CAAW,CAAC,EAElD,MAAMG,EAAe5F,EAAAA,YAAY,IAAM,CAErC,GADAyF,EAAA,EACIjB,GAAa,EAAG,CAClByjC,EAAa,EAAI,EACjB,MACF,CACAjjC,EAAa,QAAU,WAAW,IAAMijC,EAAa,EAAI,EAAGzjC,CAAS,CACvE,EAAG,CAACiB,EAAajB,CAAS,CAAC,EAErBqB,EAAgB7F,EAAAA,YAAY,IAAM,CAEtC,GADAyF,EAAA,EACIhB,GAAc,EAAG,CACnBwjC,EAAa,EAAK,EAClB,MACF,CACAhjC,EAAc,QAAU,WAAW,IAAMgjC,EAAa,EAAK,EAAGxjC,CAAU,CAC1E,EAAG,CAACgB,EAAahB,CAAU,CAAC,EAK5B6iC,GAAmBQ,IAAY,SAAWE,EAAW,IAAM,CACzDviC,EAAA,EACA4iC,EAAe,QAAU,GACzBJ,EAAa,EAAK,CACpB,CAAC,EAEDX,GAAmBQ,IAAY,SAAWI,EAAW,IAAMC,EAAa,EAAK,CAAC,EAE9E,MAAMG,EAAYR,IAAY,SAAWrjB,IAAa,GAAOqjB,IAAY,QAAUI,EAAYF,EAEzFO,EAAiB,IAAM,CAC3BH,EAAiB,QAAU,GACvBN,IAAY,SAASliC,EAAA,CAC3B,EACM4iC,EAAiB,IAAM,CAC3BJ,EAAiB,QAAU,GACvBN,IAAY,SAAW,CAACO,EAAe,SAASxiC,EAAA,CACtD,EAGM4S,EAAWpZ,GAA4C,CAGtDA,EAAM,cAAc,SAASA,EAAM,MAAM,IAC9CgpC,EAAe,QAAUT,GAAavoC,EAAM,MAAM,EAC9CyoC,IAAY,SAAWO,EAAe,SAASziC,EAAA,EACrD,EACM8S,EAAUrZ,GAA4C,CAEtDA,EAAM,cAAc,SAASA,EAAM,aAAa,IACpDgpC,EAAe,QAAU,GACrBP,IAAY,SAAW,CAACM,EAAiB,SAASviC,EAAA,EACxD,EACM2jB,EACJse,IAAY,QACR,IAAM,CACJK,EAAcjoC,GAAS,CAACA,CAAI,CAC9B,EACA,OAEN,cACG,MAAA,CAAI,UAAU,wBAAwB,KAAK,UAAU,IAAA0J,EACpD,SAAA,CAAAzB,EAAAA,IAAC,MAAA,CACC,UAAU,oBACV,IAAK4/B,EACL,eAAAQ,EACA,eAAAC,EACA,QAAA/vB,EACA,OAAAC,EACA,QAAA8Q,EAEC,SAAAthB,CAAA,CAAA,EAEFogC,GAAaZ,EACZv/B,MAACs/B,GAAA,CAAa,UAAAC,EAAsB,UAAArkC,EAAsB,OAAAS,EAAgB,UAAAqF,EACvE,SAAA4V,CAAA,CACH,EACE,IAAA,EACN,CAEJ,CAAC,EC/KY0pB,GAAc/pC,EAAM,WAAW,SAC1CiL,EACAC,EACA,OACA,KAAM,CACJ,UAAAT,EACA,SAAAjB,EACA,QAAAmH,EAAU,YACV,KAAA/F,EAAO,SACP,YAAAzH,EAAc,aACd,WAAA0P,EAAa,UACb,MAAA/H,EACA,UAAA4H,EAAY,GACZ,SAAA7B,EAAW,GACX,cAAe7F,EAAa,eAC5B,GAAGsB,CAAA,EACDrB,EAEJ,OACExB,EAAAA,IAAC,MAAA,CACC,IAAAyB,EACA,UAAWa,EACT,oBACAtB,EACA,QAAQtH,CAAW,GACnB,QAAQwN,CAAO,GACf+B,GAAa,kBACb7B,CAAA,EAEF,cAAa7F,EACZ,GAAGsB,EAEJ,MAAM5K,EAAA4K,EAAK,OAAL,KAAA5K,EAAa,QAElB,SAAA1B,EAAM,SAAS,IAAIwJ,EAAWivB,GAAU,iBAEvC,GAAI,CAACz4B,EAAM,eAAey4B,CAAK,EAC7B,OAAOA,EAET,MAAMjxB,EAAUixB,EAIhB,OAAOz4B,EAAM,aAAawH,EAAS,CACjC,UAAWuE,EAAG,6BAA8BvE,EAAQ,MAAM,SAAS,EACnE,WAAW9F,EAAA8F,EAAQ,MAAM,YAAd,KAAA9F,EAA4ByB,IAAgB,YAAcuP,EACrE,SAASzJ,EAAAzB,EAAQ,MAAM,UAAd,KAAAyB,EAAyB0H,EAClC,MAAM3E,EAAAxE,EAAQ,MAAM,OAAd,KAAAwE,EAAsBpB,EAC5B,UAAUw8B,EAAA5/B,EAAQ,MAAM,WAAd,KAAA4/B,EAA0Bv2B,EACpC,YAAYw2B,EAAA7/B,EAAQ,MAAM,aAAd,KAAA6/B,EAA4Bx0B,EACxC,OAAOm3B,EAAAxiC,EAAQ,MAAM,QAAd,KAAAwiC,EAAuBl/B,CAAA,CAC/B,CACH,CAAC,CAAA,CAAA,CAGP,CAAC,EC1DM,SAASm/B,GAAatpC,EAA2CupC,EAA2C,CAC7GA,GAAW,MAAMvpC,EAAM,eAAA,CAC7B,CAUO,SAASwpC,GACdxpC,EACAupC,EACM,SACN,GAAIA,GAAW,KAAM,OACrB,MAAMhvB,EAAQva,EAAM,cACdypC,EAAUlvB,EAAM,QACtBA,EAAM,QAAU,CAACkvB,GACjBnhC,GAAAvH,EAAA,OAAO,yBAAyB,iBAAiB,UAAW,SAAS,IAArE,YAAAA,EAAwE,MAAxE,MAAAuH,EAA6E,KAAKiS,EAAOkvB,EAC3F,CCIO,MAAMC,GAAWrqC,EAAM,WAA4C,SAAkBiL,EAAOq/B,EAAc,CAC/G,KAAM,CACJ,MAAAj4B,EACA,SAAAxB,EACA,SAAAuI,EACA,SAAAJ,EACA,KAAA1O,EACA,GAAI1I,EACJ,cAAA2oC,EACA,UAAA9/B,EACA,KAAAG,EAAO,SACP,MAAAE,EAAQ,UACR,SAAAhK,EACA,WAAAyW,EACA,MAAAO,EACA,mBAAoBiB,EACpB,GAAGwZ,CAAA,EACDtnB,EACEyM,EAAK/V,GAAMC,CAAM,EACjBkY,EAAStC,GAAcD,EAAY,CAAE,YAAawB,EAAiB,EAEnEzQ,EAAWtI,EAAM,OAAyB,IAAI,EAC9CkL,EAAMkC,GAAWk9B,EAAchiC,CAAQ,EAG7CzI,GAAoB,IAAM,CACpByI,EAAS,UAASA,EAAS,QAAQ,cAAgB,EAAQiiC,EACjE,CAAC,EAED,MAAMC,EAAgBt4B,GAA2C,CAG/D,GADAA,EAAE,OAAO,cAAgB,EAAQq4B,EAC7BnxB,EAAU,CACZ+wB,GAAsBj4B,EAAGjH,EAAM,OAAO,EACtC,MACF,CACAnK,GAAA,MAAAA,EAAWoR,EAAGA,EAAE,OAAO,QAASjH,EAClC,EAEMggB,EAAe/Y,GAA0C,QAC7DxQ,EAAAuJ,EAAM,UAAN,MAAAvJ,EAAA,KAAAuJ,EAAgBiH,GACZkH,GAAU6wB,GAAa/3B,EAAGjH,EAAM,OAAO,CAC7C,EAEA,OACExB,EAAAA,IAACmO,GAAA,CACC,WAAAL,EACA,aAAcuC,EAAO,GACrB,SAAAjJ,EACA,MAAAiH,EACA,UAAU,2BAEV,SAAA3F,EAAAA,KAAC,QAAA,CACC,QAASuF,EACT,UAAW3L,EACT,yBACA,sBAAsBnB,CAAI,GAC1B,uBAAuBE,CAAK,GAC5BL,EACA,CACE,gBAAiBoG,EACjB,gBAAiBuI,EACjB,qBAAsBmxB,CAAA,CACxB,EAGF,SAAA,CAAA9gC,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,GAAAiO,EACA,KAAApN,EACA,UAAU,uBACV,SAAAuG,EACA,SAAAuI,EACA,SAAAJ,EACA,eAAclB,GAAS,OACvB,gBAAekB,GAAY,OAC3B,mBAAkBc,EAAO,YACzB,IAAA5O,EACC,GAAGqnB,EACJ,gBAAenZ,GAAYmZ,EAAK,eAAe,EAC/C,SAAUiY,EACV,QAASvf,CAAA,CAAA,EAEXxhB,EAAAA,IAAC,OAAA,CAAK,UAAWsC,EAAG,qBAAsB,CAAE,qBAAsBw+B,CAAA,CAAe,EAC9E,SAAAA,EACC9gC,MAACc,GAAA,CAAK,KAAK,SAAS,KAAM,GAAI,UAAU,sBAAsB,OAAQ,GAAA,CAAK,QAE1EA,GAAA,CAAK,KAAK,QAAQ,KAAM,GAAI,UAAU,sBAAsB,OAAQ,IAAK,EAE9E,EACC8H,GAAS5I,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAwB,SAAA4I,CAAA,CAAM,CAAA,CAAA,CAAA,CAC1D,CAAA,CAGN,CAAC,EC7HM,SAASo4B,GAAqB,CACnC,UAAAhgC,EACA,SAAAjB,EACA,YAAagJ,EAEb,cAAeC,EAEf,KAAAoE,EAAO,SACP,SAAAhG,EACA,KAAAjG,EAAO,SACP,KAAAgM,EACA,GAAGtK,CACL,EAA8B,CAC5B,MAAMyG,EAAY/S,EAAM,OAAyB,IAAI,EAE/CgT,EAAerS,GAA+C,CAClE6R,GAAA,MAAAA,EAAkB7R,EACpB,EAGMsS,EAAiBtS,GAAiD,OACtE8R,GAAA,MAAAA,EAAoB9R,GACfkQ,IACHnP,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAEhC,EAEMwL,EAAUJ,EAAG,gCAAiCtB,EAAW,CAC7D,uCAAwCG,IAAS,QACjD,4CAA6CgM,IAAS,QACtD,0CAA2CA,IAAS,MACpD,0CAA2C/F,CAAA,CAC5C,EAED,OACEsB,EAAAA,KAAC,SAAA,CACC,YAAAa,EACA,cAAAC,EACA,KAAA4D,EACA,UAAW1K,EACX,SAAA0E,EACC,GAAGvE,EAEH,SAAA,CAAA9C,EACA,CAACqH,GAAYpH,EAAAA,IAACwC,IAAO,UAAW8G,EAAW,OAAM,EAAA,CAAC,CAAA,CAAA,CAAA,CAGzD,CCxCO,SAAS23B,GAAsB,CACpC,MAAAr4B,EACA,gBAAAs4B,EACA,iBAAAC,EACA,aAAA1I,EACA,SAAArxB,EACA,OAAA1O,EACA,eAAA0oC,EACA,aAAAC,EACA,GAAGx+B,CACL,EAAoB,CAClB,MAAMy+B,EAAgBh/B,EAAG,2BAA4B,CACnD,mCAAoC8+B,CAAA,CACrC,EAED,OACE14B,EAAAA,KAAC,MAAA,CAAI,UAAU,2BAA4B,GAAG7F,EAC5C,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAWshC,EACd,SAAAthC,MAACghC,IAAqB,KAAK,QAAQ,QAAS55B,EAAW,OAAY85B,EACjE,SAAAlhC,EAAAA,IAACc,GAAA,CAAK,KAAK,sBAAsB,OAAQ,IAAK,KAAM,GAAI,EAC1D,CAAA,CACF,EACA4H,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,iCAAkC,CAC9C,2CAA4C8E,EAC5C,yCAA0C1O,CAAA,CAC3C,EACD,cAAa2oC,EACb,QAASj6B,EAAW,OAAYqxB,EAEhC,SAAA,CAAAz4B,EAAAA,IAAC,OAAA,CAAK,UAAU,gCAAiC,SAAA4I,EAAM,QACtD9H,GAAA,CAAK,KAAK,kBAAkB,OAAQ,IAAK,KAAM,EAAA,CAAI,CAAA,CAAA,CAAA,EAEtDd,EAAAA,IAAC,OAAI,UAAWshC,EACd,eAACN,GAAA,CAAqB,KAAK,QAAQ,QAAS55B,EAAW,OAAY+5B,EACjE,SAAAnhC,EAAAA,IAACc,IAAK,KAAK,uBAAuB,OAAQ,IAAK,KAAM,EAAA,CAAI,CAAA,CAC3D,CAAA,CACF,CAAA,EACF,CAEJ,CCxDA,MAAMygC,GAAoB,cAI1B,SAASC,GAAcC,EAA8B,CACnD,MAAMC,EAAsB,CAAA,EAC5B,IAAIC,EAGJ,IADAJ,GAAkB,UAAY,GACtBI,EAAQJ,GAAkB,KAAKE,CAAO,KAAO,MACnDC,EAAO,KAAKC,EAAM,CAAC,CAAc,EAGnC,OAAOD,CACT,CAEA,SAASE,GAAajsC,EAAuB,CAC3C,OAAOA,EAAM,QAAQ,sBAAuB,MAAM,CACpD,CAEA,SAASksC,GAAgBJ,EAAyB,CAChD,IAAIK,EAAQ,IACRC,EAAY,EACZJ,EAGJ,IADAJ,GAAkB,UAAY,GACtBI,EAAQJ,GAAkB,KAAKE,CAAO,KAAO,MACnDK,GAASF,GAAaH,EAAQ,MAAMM,EAAWJ,EAAM,KAAK,CAAC,EAC3DG,GAASH,EAAM,CAAC,IAAM,OAAS,WAAa,WAC5CI,EAAYR,GAAkB,UAGhC,OAAAO,GAASF,GAAaH,EAAQ,MAAMM,CAAS,CAAC,EAC9CD,GAAS,IAEF,IAAI,OAAOA,CAAK,CACzB,CAEA,SAASE,GAAoBC,EAAcC,EAAeC,EAAsB,CAC9E,GAAID,EAAQ,GAAKA,EAAQ,IAAMC,EAAM,EACnC,MAAO,GAGT,MAAM5wB,EAAO,IAAI,KAAK0wB,EAAMC,EAAQ,EAAGC,CAAG,EAE1C,OAAO5wB,EAAK,gBAAkB0wB,GAAQ1wB,EAAK,aAAe2wB,EAAQ,GAAK3wB,EAAK,QAAA,IAAc4wB,CAC5F,CAEO,SAASC,GAAoB7wB,EAAYkwB,EAAyB,CACvE,MAAMQ,EAAO1wB,EAAK,YAAA,EACZ2wB,EAAQ3wB,EAAK,SAAA,EAAa,EAC1B4wB,EAAM5wB,EAAK,QAAA,EAEjB,OAAOkwB,EAAQ,QAAQF,GAAoBc,GACrCA,IAAU,OACL,OAAOJ,CAAI,EAAE,SAAS,EAAG,GAAG,EAGjCI,IAAU,KACL,OAAOH,CAAK,EAAE,SAAS,EAAG,GAAG,EAG/B,OAAOC,CAAG,EAAE,SAAS,EAAG,GAAG,CACnC,CACH,CAEO,SAASG,GAAmB3sC,EAAe8rC,EAAmC,CACnF,MAAMC,EAASF,GAAcC,CAAO,EAEpC,GAAIC,EAAO,SAAW,GAAK,CAACA,EAAO,SAAS,MAAM,GAAK,CAACA,EAAO,SAAS,IAAI,GAAK,CAACA,EAAO,SAAS,IAAI,EACpG,OAGF,MAAMC,EAAQE,GAAgBJ,CAAO,EAAE,KAAK9rC,CAAK,EAEjD,GAAI,CAACgsC,EACH,OAGF,IAAIM,EACAC,EACAC,EAkBJ,GAhBAT,EAAO,QAAQ,CAACW,EAAO3nB,IAAU,CAC/B,MAAM6nB,EAAO,OAAOZ,EAAMjnB,EAAQ,CAAC,CAAC,EAEpC,GAAI2nB,IAAU,OAAQ,CACpBJ,EAAOM,EACP,MACF,CAEA,GAAIF,IAAU,KAAM,CAClBH,EAAQK,EACR,MACF,CAEAJ,EAAMI,CACR,CAAC,EAEG,EAAAN,IAAS,QAAaC,IAAU,QAAaC,IAAQ,SAIpDH,GAAoBC,EAAMC,EAAOC,CAAG,EAIzC,OAAO,IAAI,KAAKF,EAAMC,EAAQ,EAAGC,CAAG,CACtC,CAEO,SAASK,GAAmB7sC,EAAe8rC,EAA0B,CAC1E,OAAOa,GAAmB3sC,EAAO8rC,CAAO,IAAM,MAChD,CC7GO,SAASgB,GAAYlxB,EAAYmxB,EAAY,EAAG,CACrDA,EAAYA,EAAY,EAExB,MAAMP,EAAM,IAAI,KAAK5wB,CAAI,EACnBoxB,EAAUR,EAAI,OAAA,EACdS,GAAQD,EAAUD,EAAY,EAAI,GAAKC,EAAUD,EAEvD,OAAO,IAAI,KAAKP,EAAI,QAAQA,EAAI,QAAA,EAAYS,CAAI,CAAC,CACnD,CAGO,SAASC,GAAUtxB,EAAYmxB,EAAY,EAAG,CACnD,MAAMP,EAAM,IAAI,KAAKM,GAAYlxB,EAAMmxB,CAAS,CAAC,EAEjD,OAAO,IAAI,KAAKP,EAAI,QAAQA,EAAI,QAAA,EAAY,CAAC,CAAC,CAChD,CAGO,SAASW,GAAkBvwB,EAAaC,EAAW,CACxD,MAAMuwB,EAAgB,CAAA,EAChBC,EAAY,IAAI,KAAKzwB,CAAK,EAG1B0wB,EAFU,IAAI,KAAKzwB,CAAG,EAEJ,QAAA,EAClB0wB,EAAcF,EAGpB,IAFAE,EAAY,SAAS,EAAG,EAAG,EAAG,CAAC,EAExBA,EAAY,QAAA,GAAaD,GAC9BF,EAAM,KAAK,IAAI,KAAKG,EAAY,QAAA,CAAS,CAAC,EAC1CA,EAAY,QAAQA,EAAY,QAAA,EAAY,CAAC,EAC7CA,EAAY,SAAS,EAAG,EAAG,EAAG,CAAC,EAGjC,OAAOH,CACT,CAGO,MAAMI,GAAc,CAACxX,EAAWyX,EAAyCC,IAAoB,CAClG,MAAMC,EAAY,IAAI,KAAK,eAAeD,EAAQ,CAAE,QAAS,SAAU,EAEvE,OAAOP,GAAkBL,GAAY9W,EAAKyX,CAAY,EAAGP,GAAUlX,EAAKyX,CAAY,CAAC,EAAE,IAAKjB,GAC1FmB,EAAU,OAAOnB,CAAG,CAAA,CAExB,EAGO,SAASoB,GAAahyB,EAAY,CACvC,MAAMiyB,EAAQ,IAAI,KAAKjyB,CAAI,EAE3B,OAAO,IAAI,KAAKiyB,EAAM,YAAA,EAAeA,EAAM,SAAA,EAAY,CAAC,CAC1D,CAGO,SAASC,GAAWlyB,EAAY,CACrC,OAAOmyB,GAAW,IAAI,KAAKnyB,EAAK,YAAA,EAAeA,EAAK,SAAA,EAAa,EAAG,CAAC,CAAC,CACxE,CAGO,SAASoyB,GAASC,EAAaC,EAAa,CACjD,OAAO,IAAI,KAAKD,CAAK,EAAI,IAAI,KAAKC,CAAK,CACzC,CAGO,SAASC,GAAQF,EAAaC,EAAa,CAChD,OAAOF,GAASE,EAAOD,CAAK,CAC9B,CAGO,SAASG,GAAQxyB,EAAYyyB,EAAc,CAChD,MAAMR,EAAQ,IAAI,KAAKjyB,CAAI,EAE3B,OAAAiyB,EAAM,QAAQA,EAAM,QAAA,EAAYQ,CAAI,EAE7BR,CACT,CAGO,MAAMS,GAAW,CAAC1yB,EAAY6xB,IAA4C,CAC/E,MAAM7wB,EAAQkwB,GAAYc,GAAahyB,CAAI,EAAG6xB,CAAY,EACpD5wB,EAAMqwB,GAAUY,GAAWlyB,CAAI,EAAG6xB,CAAY,EAEpD,IAAI7pC,EAAQ,EACR9B,EAAU8a,EACd,MAAM2xB,EAAwB,CAAA,EAC9B,IAAIC,EAAU,KAEd,KAAOR,GAASlsC,EAAS+a,CAAG,GAAG,CAC7B,MAAM4xB,EAAa,KAAK,MAAM7qC,EAAQ,CAAC,EACvC2qC,EAAYE,CAAU,EAAIF,EAAYE,CAAU,GAAK,CAAA,EACrD,MAAMjC,EAAM1qC,EAAQ,OAAA,EAEhB0sC,IAAYhC,IACdgC,EAAUhC,EACV+B,EAAYE,CAAU,EAAE,KAAK3sC,CAAO,EACpC8B,GAAS,GAGX9B,EAAUssC,GAAQtsC,EAAS,CAAC,CAC9B,CAEA,OAAOysC,CACT,EAGO,SAASG,GAAYT,EAAaC,EAAa,CACpD,OAAON,GAAaM,CAAK,GAAKD,GAASA,GAASH,GAAWI,CAAK,CAClE,CAGO,SAASS,GAAU/yB,EAAY,CACpC,OAAO,IAAI,KAAKA,EAAK,YAAA,EAAeA,EAAK,SAAA,EAAYA,EAAK,SAAS,CACrE,CAGO,SAASmyB,GAAWnyB,EAAY,CACrC,OAAO,IAAI,KAAKA,EAAK,YAAA,EAAeA,EAAK,SAAA,EAAYA,EAAK,QAAA,EAAW,GAAI,GAAI,GAAI,GAAG,CACtF,CAGO,SAASgzB,GAAUX,EAAaC,EAAa,CAClD,OAAOS,GAAUV,CAAK,EAAE,QAAA,IAAcU,GAAUT,CAAK,EAAE,QAAA,CACzD,CAGO,SAASW,GAAUjzB,EAAYkzB,EAAgB,CACpD,OAAOC,GAASnzB,EAAMA,EAAK,SAAA,EAAakzB,CAAM,CAChD,CAGO,SAASE,GAASpzB,EAAYqzB,EAAe,CAClD,OAAOC,GAAQtzB,EAAMA,EAAK,YAAA,EAAgBqzB,CAAK,CACjD,CAGO,SAASE,GAASvzB,EAAY,CACnC,OAAOmyB,GAAWnyB,CAAI,CACxB,CAGO,SAASwzB,GAAWxzB,EAAY,CACrC,OAAO+yB,GAAU/yB,CAAI,CACvB,CAGO,SAASyzB,GAAU3B,EAAiB,CACzC,MAAMoB,EAGA,CAAA,EACAnB,EAAY,IAAI,KAAK,eAAeD,EAAQ,CAAE,MAAO,OAAQ,EAEnE,QAASppC,EAAI,EAAGA,EAAI,GAAIA,IACtBwqC,EAAO,KAAK,CACV,MAAOnB,EAAU,OAAOkB,OAAc,KAAK,YAAY,EAAGvqC,CAAC,CAAC,EAC5D,MAAOA,CAAA,CACR,EAGH,OAAOwqC,CACT,CAGO,SAASC,GAASnzB,EAAY2wB,EAAe,CAClD,MAAMsB,EAAQ,IAAI,KAAKjyB,CAAI,EAE3B,OAAAiyB,EAAM,SAAStB,CAAK,EAEbsB,CACT,CAGO,SAASyB,GAASC,EAAqBC,EAAe,CAC3D,MAAMP,EAGA,CAAA,EAEN,QAAS3qC,EAAIirC,EAAcC,EAAOlrC,GAAKirC,EAAcC,EAAOlrC,IAC1D2qC,EAAM,KAAK,CAAE,MAAO,OAAO3qC,CAAC,EAAE,SAAS,EAAG,GAAG,EAAG,MAAOA,CAAA,CAAG,EAG5D,OAAO2qC,CACT,CAGO,SAASC,GAAQtzB,EAAY0wB,EAAc,CAChD,MAAMuB,EAAQ,IAAI,KAAKjyB,CAAI,EAE3B,OAAAiyB,EAAM,YAAYvB,CAAI,EAEfuB,CACT,CAEO,SAAS4B,GAAc7zB,EAAY8xB,EAAiB,CACzD,OAAO,IAAI,KAAK,eAAeA,EAAQ,CAAE,MAAO,OAAA,CAAS,EAAE,OAAO9xB,CAAI,CACxE,CAEO,SAAS8zB,GAAa9zB,EAAY8xB,EAAiB,CACxD,OAAO,IAAI,KAAK,eAAeA,EAAQ,CAAE,KAAM,SAAA,CAAW,EAAE,OAAO9xB,CAAI,CACzE,CAEO,SAAS+zB,GAAe/zB,EAAeg0B,EAAiB,CAC7D,OAAKC,GAAYj0B,CAAI,EAIjBg0B,EACKnD,GAAoB7wB,EAAMg0B,CAAM,EAGlC,IAAI,KAAK,eAAe,OAAW,CAAE,IAAK,UAAW,MAAO,UAAW,KAAM,SAAA,CAAW,EAAE,OAAOh0B,CAAI,EAPnG,EAQX,CAEO,SAASk0B,GAAqBF,EAAyB,CAC5D,GAAIA,EACF,OAAOA,EAGT,MAAMG,EAAmC,CACvC,KAAM,OACN,MAAO,KACP,IAAK,IAAA,EAKP,OAHkB,IAAI,KAAK,eAAe,OAAW,CAAE,IAAK,UAAW,MAAO,UAAW,KAAM,SAAA,CAAW,EAC9E,cAAc,IAAI,KAAK,YAAY,CAAC,EAE/C,IAAK3nC,GAAY2nC,EAAM3nC,EAAQ,IAAI,GAAKA,EAAQ,KAAK,EAAE,KAAK,EAAE,CACjF,CAEA,MAAM4nC,GAAmB,OACnBC,GAAoB,YAEnB,SAASC,GAAcN,EAAiB,CAC7C,OAAIA,EACKA,EAAO,QAAQK,GAAmB,GAAG,EAGjC,IAAI,KAAK,eAAe,OAAW,CAAE,IAAK,UAAW,MAAO,UAAW,KAAM,SAAA,CAAW,EAAE,OACrG,IAAI,KAAK,YAAY,CAAA,EAGX,QAAQD,GAAkB,GAAG,CAC3C,CAEO,SAASG,GAAoBC,EAAc,CAChD,OAAQpwC,GAAkB,CACxB,IAAIqwC,EAAkB,EAEtB,OAAOrwC,EACJ,MAAM,EAAE,EACR,IAAI,CAACiqB,EAAMqmB,IAAmB,CAG7B,GAFAN,GAAiB,UAAY,EAEzBK,EAAkBD,EAAK,OAAS,EAClC,MAAO,GAGT,MAAMG,EAAWH,EAAKC,CAAe,EAC/BG,EAAeJ,EAAKC,EAAkB,CAAC,EAEvCI,EAAeT,GAAiB,KAAK/lB,CAAI,EAAIA,EAAO,GACpDymB,EAAgBH,IAAa,IAAME,EAAeF,EAAWE,EAMnE,OAJAJ,GAAmBK,EAAc,OAETJ,IAAmBtwC,EAAM,OAAS,GAEnCwwC,GAAgBA,IAAiB,IAC/CE,EAAgBA,EAAgBF,EAAe,GAGjDE,CACT,CAAC,EACA,KAAK,EAAE,CACZ,CACF,CAEO,SAASC,GAAY3wC,EAAe4vC,EAAgB,CACzD,OAAO/C,GAAmB7sC,EAAO4vC,CAAM,CACzC,CAEO,SAASgB,GAAgB5wC,EAAe4vC,EAAgB,CAC7D,MAAMiB,EAASlE,GAAmB3sC,EAAO4vC,CAAM,EAE/C,OAAKiB,GACI,IAAI,KAAK,OAAO,GAAG,CAI9B,CAEO,SAAShB,GAAY7vC,EAA+B,CACzD,OAAO,OAAO,UAAU,SAAS,KAAKA,CAAK,IAAM,iBAAmB,CAAC,MAAMA,CAAe,CAC5F,CC1RO,SAAS8wC,GAAiB,CAC/B,UAAAC,EACA,SAAAC,EACA,SAAAtvC,EACA,kBAAAuvC,EACA,iBAAAC,EACA,OAAAxD,CACF,EAA0B,CACxB,MAAMyD,EAAmBvwC,EAAM,YAC5BZ,GAAkB,IAAM,CACvB0B,GAAA,MAAAA,EAAWmtC,GAAUkC,EAAW/wC,CAAK,EACvC,EACA,CAAC0B,EAAUqvC,CAAS,CAAA,EAGhBK,EAAkBxwC,EAAM,YAC3BZ,GAAkB,IAAM,CACvB0B,GAAA,MAAAA,EAAWstC,GAAS+B,EAAW/wC,CAAK,EACtC,EACA,CAAC0B,EAAUqvC,CAAS,CAAA,EAGhBtF,EAAiBuF,IAAaK,GAAS,QAAUL,IAAaK,GAAS,MAE7E,OACEt+B,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAA1I,EAAAA,IAACihC,GAAA,CACC,MAAOmE,GAAcsB,EAAWrD,CAAM,EACtC,gBAAiByD,EAAiB,EAAE,EACpC,iBAAkBA,EAAiB,CAAC,EACpC,aAAcF,EACd,SAAUD,IAAaK,GAAS,MAChC,OAAQL,IAAaK,GAAS,OAC9B,eAAA5F,EACA,aAAa,2BAAA,CAAA,EAEfphC,EAAAA,IAACihC,GAAA,CACC,MAAOoE,GAAaqB,EAAWrD,CAAM,EACrC,gBAAiB0D,EAAgB,EAAE,EACnC,iBAAkBA,EAAgB,CAAC,EACnC,aAAcF,EACd,SAAUF,IAAaK,GAAS,OAChC,OAAQL,IAAaK,GAAS,MAC9B,eAAA5F,EACA,aAAa,0BAAA,CAAA,CACf,EACF,CAEJ,CC/CO,MAAM6F,GAAgB1wC,EAAM,KAAK,SAAuB,CAC7D,UAAAyK,EACA,SAAAjB,EACA,YAAagJ,EAEb,cAAeC,EACf,QAAS6b,EAET,KAAAzX,EAAO,SACP,SAAA/V,EACA,OAAAqB,EACA,QAAAjB,EACA,OAAA+oB,EACA,QAAA0mB,EACA,SAAA9/B,EACA,QAAA+/B,EACA,IAAAhF,EACA,GAAGt/B,CACL,EAAuB,CACrB,MAAMyG,EAAY/S,EAAM,OAAyB,IAAI,EAE/CgT,EAAchT,EAAM,YACvBW,GAA+C,CAC9C6R,GAAA,MAAAA,EAAkB7R,EACpB,EACA,CAAC6R,CAAe,CAAA,EAIZS,EAAgBjT,EAAM,YACzBW,GAAiD,OAChD8R,GAAA,MAAAA,EAAoB9R,GACfkQ,IACHnP,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAEhC,EACA,CAAC8R,EAAmB5B,CAAQ,CAAA,EAGxBia,EAAU9qB,EAAM,YACnBW,GAA+C,CAC9C2tB,GAAA,MAAAA,EAAc3tB,GACTkQ,GACH/P,GAAA,MAAAA,EAAW,OAAW8qC,EAE1B,EACA,CAACtd,EAAaxtB,EAAU8qC,EAAK/6B,CAAQ,CAAA,EAGvC,GAAIoZ,EACF,OAAOxgB,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAAA,CAA+B,EAGxD,MAAM0C,EAAUJ,EAAG,wBAAyBtB,EAAW,CACrD,gCAAiC,CAACoG,GAAY1O,EAC9C,iCAAkCjB,GAAW,CAACiB,EAC9C,iCAAkC,CAAC0O,GAAY8/B,EAC/C,kCAAmC9/B,EACnC,kCAAmC,CAACA,GAAY+/B,CAAA,CACjD,EAED,OACEz+B,EAAAA,KAAC,SAAA,CACC,UAAWhG,EACX,KAAA0K,EACA,YAAA7D,EACA,cAAAC,EACA,QAAA6X,EACA,SAAAja,EACC,GAAGvE,EAEH,SAAA,CAAA9C,EACA,CAACqH,GAAYpH,EAAAA,IAACwC,IAAO,UAAW8G,EAAW,OAAM,EAAA,CAAC,CAAA,CAAA,CAAA,CAGzD,CAAC,ECrDM,SAAS89B,GAAe,CAC7B,UAAAV,EACA,MAAA/wC,EACA,qBAAA0xC,EACA,SAAAhwC,EACA,YAAAiwC,EACA,cAAAC,EACA,aAAAnE,EAAe,EACf,QAAAoE,EACA,QAAAC,EACA,eAAAC,EACA,OAAArE,EACA,MAAA8B,EACA,WAAAwC,EACA,SAAAC,CACF,EAAwB,CACtB,KAAM,CAACjc,CAAG,EAAIz1B,WAAS,IAAI,IAAM,EAE3B2xC,EAAWjtC,EAAAA,QAAQ,IAAMuoC,GAAYxX,EAAKyX,EAAcC,CAAM,EAAG,CAAC1X,EAAKyX,EAAcC,CAAM,CAAC,EAC5FyE,EAAQltC,UAAQ,IAAMqpC,GAASyC,EAAWtD,CAAY,EAAG,CAACsD,EAAWtD,CAAY,CAAC,EAElFtV,EAAWj2B,EAAAA,YACdsqC,GACKgD,EAECK,GAAYmC,CAAU,GAAKpD,GAAUpC,EAAKwF,CAAU,GAAOnC,GAAYoC,CAAQ,GAAKrD,GAAUpC,EAAKyF,CAAQ,EAI3GpC,GAAY7vC,CAAK,EAIf4uC,GAAUpC,EAAKxsC,CAAK,EAHlB,GAKX,CAACA,EAAOwvC,EAAOwC,EAAYC,CAAQ,CAAA,EAG/BG,EAAYlwC,EAAAA,YACfsqC,GACK,CAACgD,GAAS,CAACK,GAAYmC,CAAU,GAAK,CAACnC,GAAYoC,CAAQ,EACtD,GAEF9D,GAAQiB,GAAW5C,CAAG,EAAG4C,GAAW4C,CAAU,CAAC,GAAKhE,GAASmB,GAAS3C,CAAG,EAAG2C,GAAS8C,CAAQ,CAAC,EAEvG,CAACzC,EAAOwC,EAAYC,CAAQ,CAAA,EAGxBI,EAAgBnwC,EAAAA,YACnBsqC,GAAc,CACb,IAAI/6B,EAAW,GAEf,OAAIkgC,IACFlgC,EAAWu8B,GAASmB,GAAS3C,CAAG,EAAGxW,CAAG,GAGpC4b,IACFngC,EAAWA,GAAY08B,GAAQiB,GAAW5C,CAAG,EAAGxW,CAAG,GAGjD6b,GAAW7D,GAASmB,GAAS3C,CAAG,EAAG4C,GAAWyC,CAAO,CAAC,IACxDpgC,EAAW,IAGTqgC,GAAW3D,GAAQiB,GAAW5C,CAAG,EAAG2C,GAAS2C,CAAO,CAAC,IACvDrgC,EAAW,IAGTsgC,GAAA,MAAAA,EAAiBvF,KACnB/6B,EAAW,IAGNA,CACT,EACA,CAACkgC,EAAaC,EAAe5b,EAAK6b,EAASC,EAASC,CAAc,CAAA,EAG9DO,EAAWrtC,EAAAA,QAAQ,IAChBitC,EAAS,IAAI,CAAC1F,EAAKznB,IACxB1a,EAAAA,IAAC,OAAA,CAAiB,UAAU,6BACzB,SAAAmiC,EAAI,SAAA,CAAS,EADLznB,CAEX,CACD,EACA,CAACmtB,CAAQ,CAAC,EAEb,OACEn/B,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAA1I,EAAAA,IAAC,MAAA,CAAI,UAAU,8BAA+B,SAAAioC,EAAS,QACtD,MAAA,CAAI,UAAU,0BACZ,SAAAH,EAAM,IAAI,CAACI,EAAMxtB,IAChB1a,MAAC,OAAgB,UAAU,yBACxB,SAAAkoC,EAAK,IAAK/F,GAAQ,CACjB,MAAMgG,EAAY,CAAC9D,GAAYlC,EAAKuE,CAAS,EAE7C,OACE1mC,EAAAA,IAACinC,GAAA,CAEC,IAAA9E,EACA,QAASoC,GAAUpC,EAAKxW,CAAG,EAC3B,OAAQmC,EAASqU,CAAG,EACpB,QAAS4F,EAAU5F,CAAG,EACtB,OAAQ,CAACkF,GAAwBc,EACjC,QAASA,EACT,SAAA9wC,EACA,SAAU2wC,EAAc7F,CAAG,EAE1B,WAAI,QAAA,CAAQ,EAVRA,EAAI,YAAA,CAAY,CAa3B,CAAC,CAAA,EAnBOznB,CAoBV,CACD,CAAA,CACH,CAAA,EACF,CAEJ,CC9IO,MAAM0tB,GAAc7xC,EAAM,cAAgC,CAC/D,MAAO,GACP,QAAS,WACT,QAAS,IAAM,IACjB,CAAC,EAEM,SAAS8xC,IAAiB,CAC/B,OAAO9xC,EAAM,WAAW6xC,EAAW,CACrC,CCQO,MAAME,GAAW/xC,EAAM,WAAyC,SAAuBiL,EAAOC,EAAK,OACxG,KAAM,CACJ,SAAA1B,EACA,UAAAiB,EACA,SAAAoG,EACA,SAAAgb,EACA,UAAWH,EACX,QAAS4C,EACT,YAAa9b,EAEb,cAAeC,EACf,KAAAF,EACA,YAAAy/B,EACA,UAAAC,EACA,MAAA7yC,EACA,eAAA8yC,EACA,GAAG5lC,CAAA,EACDrB,EACE,CAAE,MAAAmvB,CAAA,EAAUp6B,EAAM,WAAW6xC,EAAW,EACxC9+B,EAAY/S,EAAM,OAAyB,IAAI,EAE/C8qB,EAAWnqB,GAA2C,CAC1D,GAAIkQ,EAAU,CACR0B,GACF5R,EAAM,eAAA,EAGR,MACF,CAEA2tB,GAAA,MAAAA,EAAc3tB,EAChB,EAMMgC,EAAahC,GAA8C,CAG/D,GAFA+qB,GAAA,MAAAA,EAAgB/qB,GAEZ,EAAAA,EAAM,kBAAoBkQ,GAAYlQ,EAAM,SAAWA,EAAM,iBAI7DA,EAAM,MAAQ,SAAWA,EAAM,MAAQ,KAAK,CAG9CA,EAAM,eAAA,EACN,MAAMwxC,EAAO5/B,EAAO5R,EAAM,cAAc,kBAAoB,MAC1DwxC,GAAA,KAAAA,EAA+BxxC,EAAM,eAAe,MAAA,CACxD,CACF,EAEMqS,EAAerS,GAA2C,CACzDkQ,GACH2B,GAAA,MAAAA,EAAkB7R,EAEtB,EAGMsS,EAAiBtS,GAA6C,OAClE8R,GAAA,MAAAA,EAAoB9R,IACpBe,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAC9B,EAEA,IAAI4V,EAEJ,GAAIhE,EAAM,CACR,MAAM8L,EAAyB2zB,GAAA,KAAAA,EAAe,IAE9Cz7B,SACG8H,EAAA,CAAI,UAAU,wBAAwB,KAAA9L,EAAa,GAAG0/B,EACpD,SAAA,CAAAzoC,EACDC,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAAA,CAA+B,CAAA,EACjD,CAEJ,MACE8M,EAAU9M,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAD,EAAS,EAG9D,MAAM2C,EAAUJ,EAAG,kBAAmBtB,EAAW,CAC/C,yBAA0B2vB,EAC1B,4BAA6BvpB,EAC7B,4BAA6Bgb,CAAA,CAC9B,EAED,OAAOqmB,EACLA,EAAejnC,CAAK,EAEpBkH,EAAAA,KAAC,KAAA,CACE,GAAG7F,EAGJ,KAAK,WACL,IAAApB,EACA,gBAAe2F,GAAY,OAC3B,UAAW1E,EACX,UAAUzK,EAAA4K,EAAK,WAAL,KAAA5K,EAAkBmP,EAAW,OAAY,EACnD,QAAAia,EACA,aAAY1rB,GAAA,KAAAA,EAAUkN,EAAwB,YAAY,EAC1D,YAAA0G,EACA,UAAArQ,EACA,cAAAsQ,EAEC,SAAA,CAAAsD,EACD9M,EAAAA,IAACwC,GAAA,CAAO,UAAW8G,CAAA,CAAW,CAAA,CAAA,CAAA,CAGpC,CAAC,EC9HYq/B,GAAepyC,EAAM,WAA+C,SAAsBiL,EAAOC,EAAK,CACjH,KAAM,CAAE,SAAA1B,EAAU,UAAAiB,EAAW,KAAAmM,EAAM,GAAGtK,GAASrB,EACzC,CAAE,MAAAmvB,CAAA,EAAUp6B,EAAM,WAAW6xC,EAAW,EACxC1lC,EAAUJ,EAAG,kBAAmBtB,EAAW,CAC/C,yBAA0B2vB,EAC1B,yBAA0BxjB,IAAS,QACnC,uBAAwBA,IAAS,KAAA,CAClC,EAED,aACG,OAAA,CAAK,IAAA1L,EAAU,UAAWiB,EAAU,GAAGG,EACrC,SAAA9C,EACH,CAEJ,CAAC,ECZY6oC,GAAeryC,EAAM,WAA+C,SAAsBiL,EAAOC,EAAK,CACjH,KAAM,CAAE,SAAA1B,EAAU,UAAAiB,EAAW,MAAA6nC,EAAQ,GAAO,GAAGhmC,GAASrB,EAClD,CAAE,MAAAmvB,CAAA,EAAUp6B,EAAM,WAAW6xC,EAAW,EACxCU,EAAaxmC,EAAG,kBAAmBtB,EAAW,CAClD,yBAA0B6nC,EAC1B,yBAA0BlY,CAAA,CAC3B,EAED,aACG,OAAA,CAAK,IAAAlvB,EAAU,UAAWqnC,EAAa,GAAGjmC,EACxC,SAAA9C,EACH,CAEJ,CAAC,ECjBYgpC,GAAcxyC,EAAM,WAA4C,SAAqBiL,EAAOC,EAAK,CAC5G,KAAM,CAAE,UAAAT,EAAW,GAAG6B,CAAA,EAASrB,EACzB,CAAE,QAAA0F,CAAA,EAAYmhC,GAAA,EAEpB,OACEroC,EAAAA,IAAC,KAAA,CACC,IAAAyB,EACA,UAAWa,EAAG,qBAAsBtB,EAAWkG,IAAY,UAAY,8BAA8B,EACpG,GAAGrE,CAAA,CAAA,CAGV,CAAC,ECZYmmC,GAAwB,gDAMxBC,GAAW1yC,EAAM,WAA6C,SAAkBiL,EAAOC,EAAK,CACvG,KAAM,CAAE,SAAA1B,EAAU,UAAAiB,EAAW,GAAG6B,GAASrB,EACnC,CAAE,QAAA0F,EAAS,QAAA+M,EAAS,QAAAi1B,CAAA,EAAYb,GAAA,EAEhCnvC,EAAahC,GAAiD,aAElE,GAAIA,EAAM,iBACR,OAEF,GAAIA,EAAM,MAAQ,SAAU,CAItBgQ,IAAY,YACdhQ,EAAM,eAAA,EAER+c,EAAA,EACA,MACF,CACA,GAAI/c,EAAM,MAAQ,aAAegyC,EAAS,CAExChyC,EAAM,eAAA,EACN+c,EAAA,EACA,MACF,CAEA,MAAM/U,EAAOhI,EAAM,cACbiC,EAAQ,MAAM,KAAK+F,EAAK,iBAA8B8pC,EAAqB,CAAC,EAAE,OACjFniB,GAASA,EAAK,QAAQ,eAAe,IAAM3nB,CAAA,EAE9C,GAAI/F,EAAM,SAAW,EACnB,OAEF,MAAMy0B,EAAez0B,EAAM,QAAQ,SAAS,aAA4B,EAEpEjC,EAAM,MAAQ,aAChBA,EAAM,eAAA,GACNe,EAAAkB,GAAOy0B,EAAe,EAAIz0B,EAAM,QAAUA,EAAM,MAAM,IAAtD,MAAAlB,EAAyD,SAChDf,EAAM,MAAQ,WACvBA,EAAM,eAAA,GACNsI,EAAArG,GAAOy0B,EAAe,EAAIz0B,EAAM,QAAUA,EAAM,MAAM,IAAtD,MAAAqG,EAAyD,SAChDtI,EAAM,MAAQ,QACvBA,EAAM,eAAA,GACNqL,EAAApJ,EAAM,CAAC,IAAP,MAAAoJ,EAAU,SACDrL,EAAM,MAAQ,QACvBA,EAAM,eAAA,GACNymC,EAAAxkC,EAAMA,EAAM,OAAS,CAAC,IAAtB,MAAAwkC,EAAyB,QAE7B,EAEM,CAAE,SAAAwL,EAAW,OAAQ,GAAGC,GAAavmC,EAE3C,OACE7C,EAAAA,IAAC,MAAA,CAAI,IAAAyB,EAAU,UAAWa,EAAG,YAAatB,EAAW,cAAckG,CAAO,EAAE,EAAI,GAAGkiC,EACjF,SAAAppC,EAAAA,IAAC,KAAA,CACC,UAAWsC,EAAG,kBAAmB,oBAAoB4E,CAAO,EAAE,EAC9D,KAAMiiC,EAEN,mBAAkBA,IAAa,OAAS,WAAa,OACrD,UAAAjwC,EAEC,SAAA6G,CAAA,CAAA,EAEL,CAEJ,CAAC,ECpEM,SAASspC,GAA4BrxC,EAA6BwD,EAAqC,CAC5G,OAAOD,GAAwBvD,EAAUwD,CAAM,CACjD,CAEA,MAAM8tC,GAAgB1mC,IAA2C,CAC/D,WAAY,WAAWA,CAAQ,iBAC/B,QAAS,CACX,GAEM2mC,GAAmB,CACvB,SAAU,CAAE,QAAS,CAAA,EACrB,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,CAAA,CACtB,EAUaC,GAAejzC,EAAM,WAA8C,SAAsBiL,EAAOC,EAAK,CAChH,KAAM,CAAE,cAAAgoC,EAAe,OAAA3hC,EAAQ,QAAAmM,EAAS,UAAA/Y,EAAY,eAAgB,WAAAqB,EAAY,MAAA0I,EAAO,GAAGpC,CAAA,EAASrB,EAC7F,CAACkoC,EAAaC,CAAc,EAAIpzC,EAAM,SAA6B,IAAI,EACvEwe,EAAUxe,EAAM,OAAoB,IAAI,EAExCyB,EAAWiD,GAAiBC,CAAS,EACrC,CAAE,KAAA8B,EAAM,eAAAC,CAAA,EAAmBE,eAAY,CAC3C,KAAM,EAAQ2K,EACd,UAAW9P,EAAS,UACpB,qBAAsBoF,GAAAA,WACtB,SAAU,CAAE,UAAWqsC,GAAA,KAAAA,EAAiB,IAAA,EACxC,WAAYJ,GAA4BrxC,EAAUuE,CAAU,CAAA,CAC7D,EAEKqtC,EAAUjmC,GAAWlC,EAAKsT,EAAS40B,EAAgB3sC,EAAK,WAAW,EAIzEzG,EAAM,UAAU,IAAM,CACpB,GAAI,CAACuR,GAAU,CAACmM,GAAW,CAACw1B,EAC1B,OAEF,MAAMI,EAAmB3yC,GAAiB,CACnCA,EAAwB,MAAQ,UAAY,CAACA,EAAM,mBACtDA,EAAM,eAAA,EACN+c,EAAA,EAEJ,EACA,OAAAw1B,EAAc,iBAAiB,UAAWI,CAAe,EAClD,IAAMJ,EAAc,oBAAoB,UAAWI,CAAe,CAC3E,EAAG,CAAC/hC,EAAQmM,EAASw1B,CAAa,CAAC,EAMnClzC,EAAM,UAAU,IAAM,SAChB,CAACuR,KAAU7P,EAAA8c,EAAQ,UAAR,MAAA9c,EAAiB,SAAS,SAAS,mBAC/CuH,EAAAiqC,GAAA,YAAAA,EAAkD,QAAlD,MAAAjqC,EAAA,KAAAiqC,GAEL,EAAG,CAAC3hC,EAAQ2hC,CAAa,CAAC,EAE1B,MAAMK,EAAe5yC,GAAmC,CACtD,GAAI,CAAC4Q,GAAU,CAACmM,GAAW,CAACy1B,EAC1B,OAGF,MAAM3vC,EAAS7C,EAAM,OAEjBwyC,EAAY,SAAS3vC,CAAM,GAAM0vC,GAAA,MAAAA,EAAsC,SAAS1vC,IAIpFka,GAAA,MAAAA,GACF,EAEA,aACG81B,GAAA,CAAW,QAAAh1B,EAAkB,GAAI,EAAQjN,EAAS,QAAS,IAAK,cAAa,GAC3E,SAACkiC,GACAhqC,EAAAA,IAACq5B,GAAA,CAAkB,YAAayQ,EAC9B,SAAA9pC,EAAAA,IAACipC,GAAA,CACC,IAAKW,EACL,MAAO,CACL,GAAG3sC,EACH,GAAGgI,EACH,GAAGqkC,GAAa,GAAG,EACnB,GAAGC,GAAiBS,CAAK,CAAA,EAE1B,GAAGnnC,CAAA,CAAA,EAER,CAAA,CAEJ,CAEJ,CAAC,ECxFYonC,GAAc1zC,EAAM,WAA6C,SAAS0zC,EAAYzoC,EAAOC,EAAK,OAC7G,KAAM,CAAE,SAAA1B,EAAU,cAAAmqC,EAAe,UAAAhvC,EAAY,cAAe,QAASivC,EAAa,YAAAC,EAAa,GAAGvnC,CAAA,EAASrB,EACrG,CAACsG,EAAQonB,CAAS,EAAI34B,EAAM,SAAS,EAAK,EAC1C,CAACkzC,EAAeY,CAAgB,EAAI9zC,EAAM,SAA6B,IAAI,EAE3E,CAAC+zC,EAAcC,CAAe,EAAIh0C,EAAM,SAAS,CAAC,EAClDi0C,EAAWj0C,EAAM,OAAuB,IAAI,EAC5Ck0C,EAAc9mC,GAAWlC,EAAK+oC,CAAQ,EAC5Cj0C,EAAM,UAAU,IAAM,SAChB+zC,EAAe,KACjB9qC,GAAAvH,EAAAuyC,EAAS,UAAT,YAAAvyC,EAAkB,cAA2B+wC,MAA7C,MAAAxpC,EAAqE,QAEzE,EAAG,CAAC8qC,CAAY,CAAC,EACjB,MAAMI,EAAerC,GAAA,EAIfsC,GAA8B1yC,EAAAiyC,GAAA,YAAAA,EAAiE,QAAjE,KAAAjyC,EAA0E,CAAA,EACxG2yC,EAAYjnC,GAAYumC,GAAA,YAAAA,EAAgE,IAAKG,CAAgB,EAE7G9tC,EAA8C,CAClDZ,GAAAA,OAAO,CAAC,CAAE,UAAAT,KAAgB,CACxB,OAAQA,EAAAA,CACN,IAAK,cACL,IAAK,aACH,MAAO,CAAE,UAAW,GAAI,SAAU,CAAA,EACpC,IAAK,YACL,IAAK,WACH,MAAO,CAAE,UAAW,EAAG,SAAU,CAAA,EACnC,QACE,MAAO,CAAE,UAAW,EAAG,SAAU,CAAA,CAAE,CAEzC,CAAC,CAAA,EAGG2vC,EAAY3zC,GAA2C,QAC3De,EAAA0yC,EAAY,UAAZ,MAAA1yC,EAAA,KAAA0yC,EAAsBzzC,GAGlBA,EAAM,SAAW,GAIrBg4B,EAAWzD,GAAc,CAACA,CAAS,CACrC,EAEMxX,EAAU,IAAM,CACpBib,EAAU,EAAK,EACfib,GAAA,MAAAA,GACF,EAEMW,EAAmB5zC,GAA8C,QACrEe,EAAA0yC,EAAY,YAAZ,MAAA1yC,EAAA,KAAA0yC,EAAwBzzC,GAEpBA,EAAM,MAAQ,cAAgBA,EAAM,MAAQ,SAAWA,EAAM,MAAQ,KACvEA,EAAM,eAAA,EACNg4B,EAAU,EAAI,EACdqb,EAAiBhxC,GAAUA,EAAQ,CAAC,IAC3BrC,EAAM,MAAQ,aAAeA,EAAM,MAAQ,YAEhD4Q,GACF5Q,EAAM,eAAA,EAERg4B,EAAU,EAAK,EAEnB,EAEM6b,EAAsB7zC,GAA2C,QACrEe,EAAA0yC,EAAY,eAAZ,MAAA1yC,EAAA,KAAA0yC,EAA2BzzC,GAEvBkzC,GACFlb,EAAU,EAAI,CAElB,EAIM1mB,EAASjS,EAAM,aACnB2zC,EACA,CACE,IAAKU,EACL,QAASC,EACT,UAAWC,EACX,aAAcC,EACd,gBAAiB,OACjB,gBAAiBjjC,EACjB,SAAUA,CAAA,CACZ,EAIF,OACEY,EAAAA,KAAC0/B,GAAY,SAAZ,CAAqB,MAAO,CAAE,GAAGsC,EAAc,QAAS,WAAY,QAAAz2B,EAAS,QAAS,IACpF,SAAA,CAAAzL,EACDxI,EAAAA,IAACwpC,GAAA,CACC,IAAKiB,EACJ,GAAG5nC,EACJ,UAAA3H,EACA,OAAA4M,EACA,QAAAmM,EACA,cAAAw1B,EACA,WAAAltC,EAEC,SAAAhG,EAAM,SAAS,IAAIwJ,EAAWivB,GAAU,CACvC,GAAI,CAACz4B,EAAM,eAAey4B,CAAK,EAC7B,OAAO,KAIT,GAAIA,EAAM,OAASib,EACjB,OAAOjb,EAET,MAAMgc,EAAQhc,EACd,OAAOz4B,EAAM,aAAay0C,EAAO,CAC/B,QAAUviC,GAAmD,UAC3DjJ,GAAAvH,EAAA+yC,EAAM,OAAM,UAAZ,MAAAxrC,EAAA,KAAAvH,EAAsBwQ,GACtBwL,EAAA,EACAy2B,EAAa,QAAA,CACf,CAAA,CACD,CACH,CAAC,CAAA,CAAA,CACH,EACF,CAEJ,CAAC,ECxIYO,GAAgB10C,EAAM,WAA8C,SAAuBiL,EAAOC,EAAK,CAClH,KAAM,CAAE,QAAAyF,CAAA,EAAYmhC,GAAA,EACpB,GAAInhC,IAAY,SAAU,CAIxB,KAAM,CAAE,cAAAuiC,EAAe,OAAA3hC,EAAQ,QAAAmM,EAAS,UAAA/Y,EAAW,WAAAqB,EAAY,GAAG2uC,GAAa1pC,EAC/E,OAAOxB,EAAAA,IAACipC,GAAA,CAAS,IAAAxnC,EAAW,GAAGypC,CAAA,CAAU,CAC3C,CACA,OAAOlrC,EAAAA,IAACwpC,GAAA,CAAa,IAAA/nC,EAAW,GAAGD,CAAA,CAAO,CAC5C,CAAC,ECEY2pC,GAAO50C,EAAM,WAAsC,SAAciL,EAAOC,EAAK,CACxF,KAAM,CAAE,MAAAkvB,EAAQ,GAAO,QAAAzpB,EAAU,WAAY,QAASijC,EAAa,GAAGtnC,CAAA,EAASrB,EAEzEyS,EAAU,IAAM,CACpBk2B,GAAA,MAAAA,GACF,EAEA,aACG/B,GAAY,SAAZ,CAAqB,MAAO,CAAE,MAAAzX,EAAO,QAAAzpB,EAAS,QAAA+M,CAAA,EAC7C,eAACg3B,GAAA,CAAc,IAAAxpC,EAAU,QAAS0oC,EAAc,GAAGtnC,EAAM,EAC3D,CAEJ,CAAC,ECbM,SAASuoC,GAAe,CAAE,MAAOC,EAAW,MAAAlyC,EAAO,SAAA9B,GAAiC,CACzF,MAAMi0C,EAAc/0C,EAAM,OAAuB,IAAI,EAC/Cg1C,EAAkBh1C,EAAM,OAAsB,IAAI,EAExDH,GAAoB,IAAM,CACxB,GAAIk1C,EAAY,SAAWC,EAAgB,QAAS,CAClD,MAAMC,GAAUF,EAAY,QAAQ,aAAeC,EAAgB,QAAQ,cAAgB,EAG3FD,EAAY,QAAQ,UAAYC,EAAgB,QAAQ,UAAYC,CACtE,CACF,CAAC,EAED,MAAMC,EAAcl1C,EAAM,YACvBZ,GAAkB,IAAM,CACvB0B,GAAA,MAAAA,EAAW1B,EACb,EACA,CAAC0B,CAAQ,CAAA,EAGLqM,EAASnN,EAAM,YAClBZ,GAAmBoI,GAA2B,CACzCstC,IAAc11C,IAGhB41C,EAAgB,QAAUxtC,EAE9B,EACA,CAACstC,CAAS,CAAA,EAGZ,aACG,MAAA,CAAI,UAAU,6BAA6B,IAAKC,EAAa,cAAY,mBACxE,SAAAtrC,EAAAA,IAAC,KAAA,CAAG,UAAU,yBACX,SAAA7G,EAAM,IAAI,CAAC,CAAE,MAAAyP,EAAO,MAAAjT,KAAY,CAC/B,MAAMotB,EAAasoB,IAAc11C,EAEjC,OACE+S,EAAAA,KAAC4/B,GAAA,CAAqB,SAAUvlB,EAAY,QAAS0oB,EAAY91C,CAAK,EAAG,IAAK+N,EAAO/N,CAAK,EACvF,SAAA,CAAAotB,GACC/iB,EAAAA,IAAC2oC,GAAA,CACC,SAAA3oC,EAAAA,IAACc,GAAA,CAAK,KAAK,QAAQ,OAAQ,IAAK,KAAM,EAAA,CAAI,CAAA,CAC5C,QAED8nC,GAAA,CAAa,UAAU,8BAA8B,MAAO,CAAC7lB,EAC3D,SAAAna,CAAA,CACH,CAAA,CAAA,EARajT,CASf,CAEJ,CAAC,EACH,EACF,CAEJ,CC5CA,MAAM+1C,GAAoBjG,GAAA,EAEnB,SAASkG,GAAa,CAC3B,MAAON,EACP,SAAU77B,EACV,OAAQE,EACR,OAAA61B,CACF,EAA0C,CACxC,MAAMqG,EAAoBhxC,UAAQ,IAAO2qC,EAASE,GAAqBF,CAAM,EAAImG,GAAoB,CAACnG,CAAM,CAAC,EACvG,CAACsG,EAAgBC,CAAiB,EAAI51C,EAAAA,SAASovC,GAAe+F,EAAW9F,CAAM,CAAC,EAGhFwG,EAAanxC,EAAAA,QAAQ,IAAMirC,GAAcN,CAAM,EAAG,CAACA,CAAM,CAAC,EAE1DjC,EAAY1oC,EAAAA,QAAQ,IAAMkrC,GAAoBiG,CAAU,EAAG,CAACA,CAAU,CAAC,EAEvEC,EAAYl1C,EAAAA,OAAmC,MAAS,EAE9DP,EAAM,UAAU,IAAM,CACpB,MAAM01C,EAAiBZ,IAAcW,EAAU,QAC/CA,EAAU,QAAUX,EAEfY,GAILH,EAAkBxG,GAAe+F,EAAW9F,CAAM,CAAC,CACrD,EAAG,CAAC8F,EAAW9F,CAAM,CAAC,EAEtB,MAAMluC,EAAY1B,GAAkB,CAClCm2C,EAAkBn2C,CAAK,EAElB6Z,IAID82B,GAAY3wC,EAAOi2C,CAAiB,EACtCp8B,EAAa,OAAW+2B,GAAgB5wC,EAAOi2C,CAAiB,CAAC,EACxDj2C,IAAU,IACnB6Z,EAAa,MAAS,EAE1B,EAEMe,EAAS1Y,EAAAA,YAAY,IAAM,aAC1B6X,IAID42B,IAAY9mC,GAAAvH,EAAA+zC,EAAU,UAAV,YAAA/zC,EAAmB,aAAnB,KAAAuH,EAAiC,GAAIosC,CAAiB,EACpEl8B,EAAW,OAAW62B,IAAgB5I,GAAAp7B,EAAAypC,EAAU,UAAV,YAAAzpC,EAAmB,aAAnB,KAAAo7B,EAAiC,GAAIiO,CAAiB,CAAC,EACpFI,EAAU,UAAY,IAC/Bt8B,EAAW,MAAS,EAGtBo8B,EAAkBxG,GAAe+F,EAAW9F,CAAM,CAAC,EACrD,EAAG,CAAC71B,EAAY27B,EAAW9F,EAAQqG,CAAiB,CAAC,EAE/CM,EAAYC,GAAAA,QAAQ,CACxB,MAAON,EACP,SAAAx0C,EACA,OAAQisC,CAAA,CACT,EAEK1zB,EAAcg8B,EAAkB,YAAA,EAEtC,MAAO,CACL,GAAGM,EACH,OAAA37B,EACA,YAAAX,CAAA,CAEJ,CCjFA,SAASyC,GAAgBnb,EAA6B,CACpDA,EAAM,gBAAA,CACR,CAEO,MAAMk1C,GAAkB71C,EAAM,WAAW,SAC9CiL,EACAC,EACA,CACA,KAAM,CAAE,MAAA9L,EAAO,SAAA0B,EAAU,OAAAkZ,EAAQ,SAAAs6B,EAAU,SAAAzjC,EAAU,gBAAAilC,EAAiB,aAAAC,EAAc,OAAA/G,EAAQ,GAAG1iC,CAAA,EAASrB,EAClG+qC,EAAcZ,GAAa,CAAE,MAAAh2C,EAAO,SAAA0B,EAAU,OAAAkZ,EAAQ,OAAAg1B,EAAQ,EAEpE,OACEvlC,EAAAA,IAACqP,GAAA,CACC,IAAA5N,EACC,GAAG8qC,EACJ,KAAK,MACL,aACE,CAACF,GACCrsC,EAAAA,IAACghC,GAAA,CACC,KAAK,MACL,QAAS6J,EACT,YAAax4B,GACb,SAAU,EAAQjL,EAClB,cAAY,0BAEX,SAAAklC,GAAgBtsC,EAAAA,IAACc,GAAA,CAAK,KAAK,iBAAiB,KAAM,EAAG,OAAQ,IAAK,KAAM,EAAA,CAAI,CAAA,CAAA,EAInF,SAAU,EAAQsG,EACjB,GAAGvE,CAAA,CAAA,CAGV,CAAC,EC7BM,IAAKmkC,IAAAA,IACVA,EAAA,KAAO,OACPA,EAAA,OAAS,SACTA,EAAA,MAAQ,QAHEA,IAAAA,IAAA,CAAA,CAAA,EAMZ,MAAMsC,GAAgB1mC,IAAsB,CAC1C,WAAY,WAAWA,CAAQ,iBAC/B,QAAS,CACX,GAEM2mC,GAAmB,CACvB,SAAU,CAAE,QAAS,CAAA,EACrB,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,CAAA,CACtB,EAmCaiD,GAAaj2C,EAAM,WAAW,SAAoBiL,EAAwBC,EAAK,CAC1F,KAAM,CACJ,MAAO4pC,EACP,SAAU77B,EACV,qBAAA63B,EACA,YAAAC,EACA,cAAAC,EACA,aAAAnE,EAAe,EACf,UAAAloC,EAAY,eACZ,SAAAkM,EACA,gBAAAilC,EACA,kBAAAI,EAAoB,cACpB,QAAAjF,EACA,QAAAC,EACA,eAAAC,EACA,OAAArE,EACA,OAAAkC,EACA,MAAAJ,EACA,WAAAuH,EACA,cAAAC,EACA,aAAAL,EACA,OAAQ58B,EACR,GAAG7M,CAAA,EACDrB,EACE7L,EAAQiF,EAAAA,QAAQ,IAAOywC,IAAc,OAAY,OAAY,IAAI,KAAKA,CAAS,EAAI,CAACA,CAAS,CAAC,EAC9FuB,EAAoBF,IAAe,OACnC,CAACG,EAAYC,CAAa,EAAI52C,EAAAA,SAA+C,CAAC,OAAW,MAAS,CAAC,EACnG62C,EAAeH,GAAqBF,EAAaA,EAAaG,EAC9D,CAACnG,EAAWsG,CAAY,EAAI92C,WAAe,IAAOsvC,GAAY7vC,CAAK,EAAIA,EAAQ,IAAI,IAAO,EAC1F,CAACgxC,EAAUsG,CAAW,EAAI/2C,EAAAA,SAAmB,MAAA,EAC7C,CAAC4R,EAAQonB,CAAS,EAAIh5B,EAAAA,SAAS,EAAK,EAEpCyG,EAAY7F,EAAAA,OAA8B,IAAI,EAC9Co2C,EAAcp2C,EAAAA,OAA8B,IAAI,EAEhDkB,EAAWiD,GAAiBC,CAAS,EACrC,CAAE,KAAA8B,EAAM,eAAAC,CAAA,EAAmBE,eAAY,CAC3C,KAAM2K,EACN,UAAW9P,EAAS,UACpB,qBAAsBoF,GAAAA,WACtB,WAAY7B,GAAwBvD,CAAQ,CAAA,CAC7C,EAEKm1C,EAAgBxpC,GAAWhH,EAAWK,EAAK,aAAcyE,CAAG,EAC5D2rC,EAAkBzpC,GAAWupC,EAAalwC,EAAK,WAAW,EAK1D,CAAC8yB,EAAYC,EAAa,EAAI75B,WAAA,EACpCE,GAAoB,IAAM,CACxB25B,GAAc,SAAS,IAAI,CAC7B,EAAG,CAAA,CAAE,EAEL35B,GAAoB,IAAM,CACpBgR,GAIJ4lC,EAAaxH,GAAY7vC,CAAK,EAAIA,EAAQ,IAAI,IAAM,CACtD,EAAG,CAACA,EAAOyR,CAAQ,CAAC,EAEpB,MAAMimC,GAAoBx1C,cAAalC,IAAgB,CACrDq3C,EAAar3C,EAAK,CACpB,EAAG,CAAA,CAAE,EAECixC,GAAoB/uC,EAAAA,YAAY,IAAM,CAC1Co1C,EAAYtG,IAAa,SAAkB,OAAgB,QAAA,CAC7D,EAAG,CAACA,CAAQ,CAAC,EAEPE,GAAmBhvC,EAAAA,YAAY,IAAM,CACzCo1C,EAAYtG,IAAa,QAAiB,OAAgB,OAAA,CAC5D,EAAG,CAACA,CAAQ,CAAC,EAEP2G,GAAgBz1C,EAAAA,YACnBqqC,IAAkB,CACjB8K,EAAatI,GAASgC,EAAWxE,EAAK,CAAC,EACvC+K,EAAY,MAAA,CACd,EACA,CAACvG,CAAS,CAAA,EAGN6G,EAAe11C,EAAAA,YAClBqqC,IAAkB,CACjB8K,EAAanI,GAAQ6B,EAAWxE,EAAK,CAAC,EACtC+K,EAAY,MAAA,CACd,EACA,CAACvG,CAAS,CAAA,EAGNrvC,GAAWQ,EAAAA,YACf,CAACX,GAA6Cqa,KAAgB,CAC5D,GAAI4zB,EAAO,CACT,GAAI,CAAC5zB,GACH,OAEF,KAAM,CAACgB,GAAOC,EAAG,EAAIu6B,EACrB,IAAIj1C,EACA,CAACya,IAAUA,IAASC,GACtB1a,EAAO,CAACyZ,GAAM,MAAS,EAEvBzZ,EAAO0tC,GAAYjzB,EAAK,GAAKhB,GAAK,UAAYgB,GAAM,QAAA,EAAY,CAAChB,GAAMgB,EAAK,EAAI,CAACA,GAAOhB,EAAI,EAEzFq7B,GACHE,EAAch1C,CAAI,EAEpB60C,GAAA,MAAAA,EAAgB70C,GACZA,EAAK,CAAC,GAAKA,EAAK,CAAC,GACnBo3B,EAAU,EAAK,EAEjB,MACF,CACA1f,GAAA,MAAAA,EAAetY,GAAOqa,GAAM/P,GAC5B0tB,EAAU,EAAK,CACjB,EACA,CAAC1f,EAAchO,EAAO2jC,EAAO4H,EAAcH,EAAmBD,CAAa,CAAA,EAGvE9B,GAAWhzC,EAAAA,YAAY,IAAM,CAC5BuP,GACH8nB,EAAWzD,IAAc,CAACA,EAAS,CAEvC,EAAG,CAACrkB,CAAQ,CAAC,EAEPoyB,GAAc3hC,cAAaX,IAAwC,WACvE,MAAM6C,GAAS7C,GAAM,QAEjBe,GAAAi1C,EAAY,UAAZ,MAAAj1C,GAAqB,SAAS8B,MAAWyF,GAAA7C,EAAU,UAAV,MAAA6C,GAAmB,SAASzF,KAIzEm1B,EAAU,EAAK,CACjB,EAAG,CAAA,CAAE,EAECse,GAAY1lC,GAAU,CAACV,GAAY,CAACilC,EAK1Cl2C,EAAAA,UAAU,IAAM,CACd,GAAI,CAACq3C,GACH,OAEF,MAAMt0C,GAAahC,IAAyB,OAC1C,MAAMokB,GAAQ4xB,EAAY,QAC1B,GAAIh2C,GAAM,MAAQ,UAAY,CAACokB,IAAS,CAACtR,GAAkBsR,EAAK,EAC9D,OAEF4T,EAAU,EAAK,EACf,MAAMx2B,GAAS,SAAS,eACpB,CAACA,IAAUA,KAAW,SAAS,MAAQ4iB,GAAM,SAAS5iB,EAAM,MAC9DT,EAAA0E,EAAU,UAAV,MAAA1E,EAAmB,QAEvB,EACA,gBAAS,iBAAiB,UAAWiB,EAAS,EAEvC,IAAM,SAAS,oBAAoB,UAAWA,EAAS,CAChE,EAAG,CAACs0C,EAAS,CAAC,EAEd,MAAM/I,GAAS7pC,EAAAA,QAAQ,IAAMoqC,GAAU3B,CAAM,EAAG,CAACA,CAAM,CAAC,EAClDuB,GAAQhqC,EAAAA,QAAQ,IAAMqqC,GAAS,IAAI,KAAA,EAAO,YAAA,EAAe,GAAG,EAAG,EAAE,EAEvE,IAAIwI,GAAwB,KAE5B,OAAQ9G,EAAA,CACN,IAAK,OACH8G,GACEztC,EAAAA,IAAConC,GAAA,CACC,UAAAV,EACA,MAAA/wC,EACA,qBAAA0xC,EACA,SAAAhwC,GACA,YAAAiwC,EACA,cAAAC,EACA,aAAAnE,EACA,QAAAoE,EACA,QAAAC,EACA,eAAAC,EACA,OAAArE,EACA,MAAA8B,EACA,WAAY4H,EAAa,CAAC,EAC1B,SAAUA,EAAa,CAAC,CAAA,CAAA,EAG5B,MACF,IAAK,SACHU,GAAOztC,EAAAA,IAACorC,IAAe,MAAO1E,EAAU,WAAY,MAAOjC,GAAQ,SAAU6I,EAAA,CAAe,EAC5F,MACF,IAAK,QACHG,GAAOztC,EAAAA,IAACorC,IAAe,MAAO1E,EAAU,cAAe,MAAO9B,GAAO,SAAU2I,CAAA,CAAc,EAC7F,KAAA,CAGJ,MAAMG,GACJvI,IAAU4H,EAAa,CAAC,GAAKA,EAAa,CAAC,GACvC,GAAGzH,GAAeyH,EAAa,CAAC,EAAGxH,CAAM,CAAC,MAAMD,GAAeyH,EAAa,CAAC,EAAGxH,CAAM,CAAC,GACvF,GAEN,OACE78B,EAAAA,KAAAkE,WAAA,CACG,SAAA,CAAAu4B,EACCnlC,EAAAA,IAACqP,GAAA,CACC,IAAK89B,EACL,MAAOO,GACP,SAAQ,GACR,SAAU,IAAA,GACV,SAAU,EAAQtmC,EAClB,YAAam+B,EAAS,GAAGA,CAAM,MAAMA,CAAM,GAAK,OAChD,aACE,CAAC8G,GACCrsC,EAAAA,IAACghC,GAAA,CACC,KAAK,MACL,QAAS6J,GACT,SAAU,EAAQzjC,EAClB,cAAY,0BAEX,SAAAklC,GAAgBtsC,EAAAA,IAACc,GAAA,CAAK,KAAK,iBAAiB,KAAM,EAAG,OAAQ,IAAK,KAAM,EAAA,CAAI,CAAA,CAAA,EAIlF,GAAG+B,CAAA,CAAA,EAGN7C,EAAAA,IAACosC,GAAA,CACC,IAAKe,EACL,MAAAx3C,EACA,SAAU6Z,EACV,OAAQE,EACR,SAAAm7B,GACA,SAAAzjC,EACA,gBAAAilC,EACA,OAAA9G,EACA,aAAA+G,EACC,GAAGzpC,CAAA,CAAA,EAGPitB,EACG7iB,GAAAA,mBACG88B,GAAA,CAAW,QAASmD,EAAa,GAAIM,GAAW,QAAS,IAAK,aAAY,GAAC,cAAa,GACtF,SAACxD,IACAhqC,EAAAA,IAACq5B,IAAkB,YAAAG,GACjB,SAAAx5B,EAAAA,IAAC,MAAA,CACC,IAAKotC,EACL,UAAU,mBACV,MAAO,CACL,GAAGnwC,EACH,GAAGqsC,GAAa,GAAG,EACnB,GAAGC,GAAiBS,EAAK,CAAA,EAE3B,cAAY,cACZ,0BAAwB,GACxB,KAAK,SACL,aAAW,QACX,aAAYyC,EAEZ,SAAA/jC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAA1I,EAAAA,IAACymC,GAAA,CACC,UAAAC,EACA,OAAArD,EACA,SAAAsD,EACA,SAAU0G,GACV,kBAAAzG,GACA,iBAAAC,EAAA,CAAA,EAEF7mC,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAA0B,SAAAytC,EAAA,CAAK,CAAA,CAAA,CAChD,CAAA,CAAA,EAEJ,CAAA,CAEJ,EACA3d,CAAA,EAEF,IAAA,EACN,CAEJ,CAAC,ECvVK6d,GAAwB,uBAI9B,SAASnM,GAAcC,EAAkC,CACvD,MAAMC,EAA0B,CAAA,EAChC,IAAIC,EAGJ,IADAgM,GAAsB,UAAY,GAC1BhM,EAAQgM,GAAsB,KAAKlM,CAAO,KAAO,MACvDC,EAAO,KAAKC,EAAM,CAAC,CAAkB,EAGvC,OAAOD,CACT,CAEA,SAASE,GAAajsC,EAAuB,CAC3C,OAAOA,EAAM,QAAQ,sBAAuB,MAAM,CACpD,CAEA,SAASksC,GAAgBJ,EAAyB,CAChD,IAAIK,EAAQ,IACRC,EAAY,EACZJ,EAGJ,IADAgM,GAAsB,UAAY,GAC1BhM,EAAQgM,GAAsB,KAAKlM,CAAO,KAAO,MACvDK,GAASF,GAAaH,EAAQ,MAAMM,EAAWJ,EAAM,KAAK,CAAC,EAC3DG,GAASH,EAAM,CAAC,IAAM,OAAS,WAAa,WAC5CI,EAAY4L,GAAsB,UAGpC,OAAA7L,GAASF,GAAaH,EAAQ,MAAMM,CAAS,CAAC,EAC9CD,GAAS,IAEF,IAAI,OAAOA,CAAK,CACzB,CAEA,SAASE,GAAoBC,EAAcC,EAAeC,EAAsB,CAC9E,GAAID,EAAQ,GAAKA,EAAQ,IAAMC,EAAM,EACnC,MAAO,GAGT,MAAM5wB,EAAO,IAAI,KAAK0wB,EAAMC,EAAQ,EAAGC,CAAG,EAE1C,OAAO5wB,EAAK,gBAAkB0wB,GAAQ1wB,EAAK,aAAe2wB,EAAQ,GAAK3wB,EAAK,QAAA,IAAc4wB,CAC5F,CAEA,SAASyL,GAAYC,EAAeC,EAAiBC,EAA0B,CAC7E,OAAOF,GAAS,GAAKA,GAAS,IAAMC,GAAW,GAAKA,GAAW,IAAMC,GAAW,GAAKA,GAAW,EAClG,CAEO,SAASC,GAAwBz8B,EAAYkwB,EAAyB,CAC3E,MAAMQ,EAAO1wB,EAAK,YAAA,EACZ2wB,EAAQ3wB,EAAK,SAAA,EAAa,EAC1B4wB,EAAM5wB,EAAK,QAAA,EACXs8B,EAAQt8B,EAAK,SAAA,EACbu8B,EAAUv8B,EAAK,WAAA,EACfw8B,EAAUx8B,EAAK,WAAA,EAErB,OAAOkwB,EAAQ,QAAQkM,GAAwBtL,GACzCA,IAAU,OACL,OAAOJ,CAAI,EAAE,SAAS,EAAG,GAAG,EAGjCI,IAAU,KACL,OAAOH,CAAK,EAAE,SAAS,EAAG,GAAG,EAGlCG,IAAU,KACL,OAAOF,CAAG,EAAE,SAAS,EAAG,GAAG,EAGhCE,IAAU,KACL,OAAOwL,CAAK,EAAE,SAAS,EAAG,GAAG,EAGlCxL,IAAU,KACL,OAAOyL,CAAO,EAAE,SAAS,EAAG,GAAG,EAGjC,OAAOC,CAAO,EAAE,SAAS,EAAG,GAAG,CACvC,CACH,CAEO,SAASE,GAAuBt4C,EAAe8rC,EAAmC,CACvF,MAAMC,EAASF,GAAcC,CAAO,EAEpC,GACE,CAACC,EAAO,SAAS,MAAM,GACvB,CAACA,EAAO,SAAS,IAAI,GACrB,CAACA,EAAO,SAAS,IAAI,GACrB,CAACA,EAAO,SAAS,IAAI,GACrB,CAACA,EAAO,SAAS,IAAI,EAErB,OAGF,MAAMC,EAAQE,GAAgBJ,CAAO,EAAE,KAAK9rC,CAAK,EAEjD,GAAI,CAACgsC,EACH,OAGF,IAAIM,EACAC,EACAC,EACA0L,EACAC,EACAC,EAAU,EAiCd,GA/BArM,EAAO,QAAQ,CAACW,EAAO3nB,IAAU,CAC/B,MAAM6nB,EAAO,OAAOZ,EAAMjnB,EAAQ,CAAC,CAAC,EAEpC,GAAI2nB,IAAU,OAAQ,CACpBJ,EAAOM,EACP,MACF,CAEA,GAAIF,IAAU,KAAM,CAClBH,EAAQK,EACR,MACF,CAEA,GAAIF,IAAU,KAAM,CAClBF,EAAMI,EACN,MACF,CAEA,GAAIF,IAAU,KAAM,CAClBwL,EAAQtL,EACR,MACF,CAEA,GAAIF,IAAU,KAAM,CAClByL,EAAUvL,EACV,MACF,CAEAwL,EAAUxL,CACZ,CAAC,EAEG,EAAAN,IAAS,QAAaC,IAAU,QAAaC,IAAQ,QAAa0L,IAAU,QAAaC,IAAY,SAIrG,GAAC9L,GAAoBC,EAAMC,EAAOC,CAAG,GAAK,CAACyL,GAAYC,EAAOC,EAASC,CAAO,GAIlF,OAAO,IAAI,KAAK9L,EAAMC,EAAQ,EAAGC,EAAK0L,EAAOC,EAASC,CAAO,CAC/D,CAEO,SAASG,GAAuBv4C,EAAe8rC,EAA0B,CAC9E,OAAOwM,GAAuBt4C,EAAO8rC,CAAO,IAAM,MACpD,CC1IA,MAAMmE,GAAoB,YAE1B,SAASuI,GAAmB58B,EAAeg0B,EAAiB,CAC1D,MAAI,CAACh0B,GAAQ,OAAO,UAAU,SAAS,KAAKA,CAAI,IAAM,iBAAmB,MAAMA,CAAc,EACpF,GAGLg0B,EACKyI,GAAwBz8B,EAAcg0B,CAAM,EAG9C,IAAI,KAAK,eAAe,OAAW,CACxC,IAAK,UACL,MAAO,UACP,KAAM,UACN,KAAM,UACN,OAAQ,UACR,OAAQ,EAAA,CACT,EAAE,OAAOh0B,CAAY,CACxB,CAEA,SAAS68B,GAAyB7I,EAAyB,CACzD,OAAIA,GAIG,GAAGE,IAAsB,QAClC,CAEA,SAAS4I,GAAsB9I,EAAiB,CAC9C,OAAO6I,GAAyB7I,CAAM,EAAE,QAAQK,GAAmB,GAAG,CACxE,CAEA,SAAS0I,GAAoB34C,EAAe4vC,EAAgB,CAC1D,MAAMiB,EAASyH,GAAuBt4C,EAAO4vC,CAAM,EAEnD,OAAKiB,GACI,IAAI,KAAK,OAAO,GAAG,CAI9B,CAEO,SAAS+H,GAAiB,CAC/B,MAAOlD,EACP,SAAU77B,EACV,OAAQE,EACR,OAAA61B,CACF,EAAkD,CAChD,MAAMiJ,EAAgB5zC,EAAAA,QAAQ,IAAMwzC,GAAyB7I,CAAM,EAAG,CAACA,CAAM,CAAC,EACxE,CAACsG,EAAgBC,CAAiB,EAAI51C,EAAAA,SAASi4C,GAAmB9C,EAAW9F,CAAM,CAAC,EACpFwG,EAAanxC,EAAAA,QAAQ,IAAMyzC,GAAsB9I,CAAM,EAAG,CAACA,CAAM,CAAC,EAClEjC,EAAY1oC,EAAAA,QAAQ,IAAMkrC,GAAoBiG,CAAU,EAAG,CAACA,CAAU,CAAC,EACvEC,EAAYl1C,EAAAA,OAAuC,MAAS,EAElEP,EAAM,UAAU,IAAM,CACpB,MAAM01C,EAAiBZ,IAAcW,EAAU,QAC/CA,EAAU,QAAUX,EAEfY,GAILH,EAAkBqC,GAAmB9C,EAAW9F,CAAM,CAAC,CACzD,EAAG,CAAC8F,EAAW9F,CAAM,CAAC,EAEtB,MAAMluC,EAAY1B,GAAkB,CAClCm2C,EAAkBn2C,CAAK,EAElB6Z,IAID0+B,GAAuBv4C,EAAO64C,CAAa,EAC7Ch/B,EAAa,OAAW8+B,GAAoB34C,EAAO64C,CAAa,CAAC,EACxD74C,IAAU,IACnB6Z,EAAa,MAAS,EAE1B,EAEMe,EAAS1Y,EAAAA,YAAY,IAAM,CAC/B,GAAI,CAAC6X,EACH,OAGF,MAAM3X,EAAOi0C,EAAU,QAEnBj0C,aAAgB,MAAQm2C,GAAuBC,GAAmBp2C,EAAMwtC,CAAM,EAAGiJ,CAAa,EAChG9+B,EAAW,OAAW3X,CAAI,EACjB,OAAOA,GAAS,UAAYm2C,GAAuBn2C,EAAMy2C,CAAa,EAC/E9+B,EAAW,OAAW4+B,GAAoBv2C,EAAMy2C,CAAa,CAAC,GACrDz2C,IAAS,QAAaA,IAAS,KACxC2X,EAAW,MAAS,EAGtBo8B,EAAkBqC,GAAmB9C,EAAW9F,CAAM,CAAC,CACzD,EAAG,CAAC71B,EAAY27B,EAAW9F,EAAQiJ,CAAa,CAAC,EAQjD,MAAO,CACL,GAPgBrC,GAAAA,QAAQ,CACxB,MAAON,EACP,SAAAx0C,EACA,OAAQisC,CAAA,CACT,EAIC,OAAA/yB,EACA,YAAa69B,GAAyB7I,CAAM,EAAE,YAAA,CAAY,CAE9D,CCxGA,SAASlzB,GAAgBnb,EAA6B,CACpDA,EAAM,gBAAA,CACR,CAEO,MAAMu3C,GAAsBl4C,EAAM,WAAW,SAClDiL,EACAC,EACA,CACA,KAAM,CAAE,MAAA9L,EAAO,SAAA0B,EAAU,OAAAkZ,EAAQ,SAAAs6B,EAAU,SAAAzjC,EAAU,gBAAAilC,EAAiB,aAAAC,EAAc,OAAA/G,EAAQ,GAAG1iC,CAAA,EAASrB,EAClG+qC,EAAcgC,GAAiB,CAAE,MAAA54C,EAAO,SAAA0B,EAAU,OAAAkZ,EAAQ,OAAAg1B,EAAQ,EAExE,OACEvlC,EAAAA,IAACqP,GAAA,CACC,IAAA5N,EACC,GAAG8qC,EACJ,KAAK,MACL,aACE,CAACF,GACCrsC,EAAAA,IAACghC,GAAA,CACC,KAAK,MACL,QAAS6J,EACT,YAAax4B,GACb,SAAU,EAAQjL,EAClB,cAAY,+BAEX,SAAAklC,GAAgBtsC,EAAAA,IAACc,GAAA,CAAK,KAAK,QAAQ,KAAM,EAAG,OAAQ,IAAK,KAAM,EAAA,CAAI,CAAA,CAAA,EAI1E,SAAU,EAAQsG,EACjB,GAAGvE,CAAA,CAAA,CAGV,CAAC,ECxCM,SAAS6rC,GAAe,CAAE,MAAOrD,EAAW,MAAAlyC,EAAO,SAAA9B,GAAiC,CACzF,MAAMi0C,EAAc/0C,EAAM,OAAuB,IAAI,EAC/Cg1C,EAAkBh1C,EAAM,OAAsB,IAAI,EAExDH,GAAoB,IAAM,CACxB,GAAIk1C,EAAY,SAAWC,EAAgB,QAAS,CAClD,MAAMC,GAAUF,EAAY,QAAQ,aAAeC,EAAgB,QAAQ,cAAgB,EAE3FD,EAAY,QAAQ,UAAYC,EAAgB,QAAQ,UAAYC,CACtE,CACF,CAAC,EAED,MAAMC,EAAcl1C,EAAM,YACvBZ,GAAkB,IAAM,CACvB0B,GAAA,MAAAA,EAAW1B,EACb,EACA,CAAC0B,CAAQ,CAAA,EAGLqM,EAASnN,EAAM,YAClBZ,GAAmBoI,GAA2B,CACzCstC,IAAc11C,IAGhB41C,EAAgB,QAAUxtC,EAE9B,EACA,CAACstC,CAAS,CAAA,EAGZ,aACG,MAAA,CAAI,UAAU,6BAA6B,IAAKC,EAAa,cAAY,mBACxE,SAAAtrC,EAAAA,IAAC,KAAA,CAAG,UAAU,yBACX,SAAA7G,EAAM,IAAI,CAAC,CAAE,MAAAyP,EAAO,MAAAjT,KAAY,CAC/B,MAAMotB,EAAasoB,IAAc11C,EAEjC,OACEqK,EAAAA,IAAC,KAAA,CAEC,IAAK0D,EAAO/N,CAAK,EACjB,UAAW2M,EAAG,yBAA0B,CACtC,mCAAoCygB,CAAA,CACrC,EACD,QAAS0oB,EAAY91C,CAAK,EAEzB,SAAAiT,CAAA,EAPIjT,CAAA,CAUX,CAAC,EACH,EACF,CAEJ,CCnEA,MAAMg5C,GAAoB,YAI1B,SAASnN,GAAcC,EAA8B,CACnD,MAAMC,EAAsB,CAAA,EAC5B,IAAIC,EAGJ,IADAgN,GAAkB,UAAY,GACtBhN,EAAQgN,GAAkB,KAAKlN,CAAO,KAAO,MACnDC,EAAO,KAAKC,EAAM,CAAC,CAAc,EAGnC,OAAOD,CACT,CAEA,SAASE,GAAajsC,EAAuB,CAC3C,OAAOA,EAAM,QAAQ,sBAAuB,MAAM,CACpD,CAEA,SAASksC,GAAgBJ,EAAyB,CAChD,IAAIK,EAAQ,IACRC,EAAY,EACZJ,EAGJ,IADAgN,GAAkB,UAAY,GACtBhN,EAAQgN,GAAkB,KAAKlN,CAAO,KAAO,MACnDK,GAASF,GAAaH,EAAQ,MAAMM,EAAWJ,EAAM,KAAK,CAAC,EAC3DG,GAAS,WACTC,EAAY4M,GAAkB,UAGhC,OAAA7M,GAASF,GAAaH,EAAQ,MAAMM,CAAS,CAAC,EAC9CD,GAAS,IAEF,IAAI,OAAOA,CAAK,CACzB,CAEA,SAAS8L,GAAYC,EAAeC,EAAiBC,EAA0B,CAC7E,OAAOF,GAAS,GAAKA,GAAS,IAAMC,GAAW,GAAKA,GAAW,IAAMC,GAAW,GAAKA,GAAW,EAClG,CAEO,SAASa,GAAkBnN,EAA0B,CAC1D,OAAOD,GAAcC,CAAO,EAAE,SAAS,IAAI,CAC7C,CAEO,SAASoN,GAAoBt9B,EAAYkwB,EAAyB,CACvE,MAAMoM,EAAQt8B,EAAK,SAAA,EACbu8B,EAAUv8B,EAAK,WAAA,EACfw8B,EAAUx8B,EAAK,WAAA,EAErB,OAAOkwB,EAAQ,QAAQkN,GAAoBtM,GACrCA,IAAU,KACL,OAAOwL,CAAK,EAAE,SAAS,EAAG,GAAG,EAGlCxL,IAAU,KACL,OAAOyL,CAAO,EAAE,SAAS,EAAG,GAAG,EAGjC,OAAOC,CAAO,EAAE,SAAS,EAAG,GAAG,CACvC,CACH,CAEO,SAASe,GAAmBn5C,EAAe8rC,EAAmC,CACnF,MAAMC,EAASF,GAAcC,CAAO,EAEpC,GAAI,CAACC,EAAO,SAAS,IAAI,GAAK,CAACA,EAAO,SAAS,IAAI,EACjD,OAGF,MAAMC,EAAQE,GAAgBJ,CAAO,EAAE,KAAK9rC,CAAK,EAEjD,GAAI,CAACgsC,EACH,OAGF,IAAIkM,EACAC,EACAC,EAAU,EAsBd,GApBArM,EAAO,QAAQ,CAACW,EAAO3nB,IAAU,CAC/B,MAAM6nB,EAAO,OAAOZ,EAAMjnB,EAAQ,CAAC,CAAC,EAEpC,GAAI2nB,IAAU,KAAM,CAClBwL,EAAQtL,EACR,MACF,CAEA,GAAIF,IAAU,KAAM,CAClByL,EAAUvL,EACV,MACF,CAEAwL,EAAUxL,CACZ,CAAC,EAEGsL,IAAU,QAAaC,IAAY,QAInC,CAACF,GAAYC,EAAOC,EAASC,CAAO,EACtC,OAGF,MAAMpiB,MAAU,KAEhB,OAAO,IAAI,KAAKA,EAAI,YAAA,EAAeA,EAAI,WAAYA,EAAI,QAAA,EAAWkiB,EAAOC,EAASC,CAAO,CAC3F,CAEO,SAASgB,GAAmBp5C,EAAe8rC,EAA0B,CAC1E,OAAOqN,GAAmBn5C,EAAO8rC,CAAO,IAAM,MAChD,CC9GA,MAAMuN,GAAoB,OACpBpJ,GAAoB,YAEbqJ,GAAsB,QAE5B,SAASC,IAAe,CAC7B,OAAO,MAAM,KAAK,CAAE,OAAQ,IAAM,CAACv0B,EAAGhlB,KAAW,CAC/C,MAAAA,EACA,MAAO,OAAOA,CAAK,EAAE,SAAS,EAAG,GAAG,CAAA,EACpC,CACJ,CAEO,SAASw5C,IAAiB,CAC/B,OAAO,MAAM,KAAK,CAAE,OAAQ,IAAM,CAACx0B,EAAGhlB,KAAW,CAC/C,MAAAA,EACA,MAAO,OAAOA,CAAK,EAAE,SAAS,EAAG,GAAG,CAAA,EACpC,CACJ,CAEO,SAASy5C,IAAiB,CAC/B,OAAO,MAAM,KAAK,CAAE,OAAQ,IAAM,CAACz0B,EAAGhlB,KAAW,CAC/C,MAAAA,EACA,MAAO,OAAOA,CAAK,EAAE,SAAS,EAAG,GAAG,CAAA,EACpC,CACJ,CAEO,SAAS05C,GAAQ99B,EAAYs8B,EAAeC,EAAiBC,EAAiB,CACnF,MAAMj2C,EAAO,IAAI,KAAKyZ,CAAI,EAE1B,OAAAzZ,EAAK,SAAS+1C,EAAOC,EAASC,EAAS,CAAC,EAEjCj2C,CACT,CAEO,SAASw3C,GAAe/9B,EAAeg0B,EAAiB,CAC7D,OAAKgK,GAAgBh+B,CAAI,EAIlBs9B,GAAoBt9B,EAAMg0B,GAAA,KAAAA,EAAU0J,EAAmB,EAHrD,EAIX,CAEO,SAASO,GAAqBjK,EAAyB,CAC5D,OAAOA,GAAA,KAAAA,EAAU0J,EACnB,CAEO,SAASQ,GAAkBlK,EAAiB,CACjD,OAAOiK,GAAqBjK,CAAM,EAAE,QAAQK,GAAmB,GAAG,CACpE,CAEO,SAAS8J,GAAoB3J,EAAc,CAChD,OAAQpwC,GAAkB,CACxB,IAAIqwC,EAAkB,EAEtB,OAAOrwC,EACJ,MAAM,EAAE,EACR,IAAI,CAACiqB,EAAMqmB,IAAmB,CAG7B,GAFA+I,GAAkB,UAAY,EAE1BhJ,EAAkBD,EAAK,OAAS,EAClC,MAAO,GAGT,MAAMG,EAAWH,EAAKC,CAAe,EAC/BG,EAAeJ,EAAKC,EAAkB,CAAC,EAEvCI,EAAe4I,GAAkB,KAAKpvB,CAAI,EAAIA,EAAO,GACrDymB,EAAgBH,IAAa,IAAME,EAAeF,EAAWE,EAMnE,OAJAJ,GAAmBK,EAAc,OAETJ,IAAmBtwC,EAAM,OAAS,GAEnCwwC,GAAgBA,IAAiB,IAC/CE,EAAgBA,EAAgBF,EAAe,GAGjDE,CACT,CAAC,EACA,KAAK,EAAE,CACZ,CACF,CAEO,SAASsJ,GAAYh6C,EAAe4vC,EAAgB,CACzD,OAAOwJ,GAAmBp5C,EAAO4vC,CAAM,CACzC,CAEO,SAASqK,GAAgBj6C,EAAe4vC,EAAgB,CAC7D,MAAMiB,EAASsI,GAAmBn5C,EAAO4vC,CAAM,EAE/C,OAAKiB,GACI,IAAI,KAAK,OAAO,GAAG,CAI9B,CAEO,SAAS+I,GAAgB55C,EAA+B,CAC7D,OAAO,OAAO,UAAU,SAAS,KAAKA,CAAK,IAAM,iBAAmB,CAAC,MAAMA,CAAe,CAC5F,CAEO,SAASk6C,GAAUC,EAAgBC,EAAgB,CACxD,OAAO,IAAI,KACTD,EAAS,YAAA,EACTA,EAAS,SAAA,EACTA,EAAS,QAAA,EACTC,EAAS,SAAA,EACTA,EAAS,WAAA,EACTA,EAAS,WAAA,EACT,CAAA,CAEJ,CAEO,SAASC,GAAUz+B,EAAY0+B,EAAkB,CACtD,OAAO,IAAI,KACT1+B,EAAK,YAAA,EACLA,EAAK,SAAA,EACLA,EAAK,QAAA,EACL0+B,EAAW,SAAA,EACXA,EAAW,WAAA,EACXA,EAAW,WAAA,EACX,CAAA,CAEJ,CC1GO,SAASC,GAAkB,CAAE,MAAAv6C,EAAO,OAAA4vC,EAAQ,SAAAluC,EAAU,WAAA84C,GAAsC,CACjG,MAAM14C,EAAUlB,EAAM,QAAQ,IAAOg5C,GAAgB55C,CAAK,EAAIA,EAAQ,IAAI,KAAS,CAACA,CAAK,CAAC,EACpFy6C,EAAa7K,GAAA,KAAAA,EAAU0J,GACvBoB,EAAczB,GAAkBwB,CAAU,EAC1CvC,EAAQt3C,EAAM,QAAQ,IAAM24C,GAAA,EAAgB,CAAA,CAAE,EAC9CpB,EAAUv3C,EAAM,QAAQ,IAAM44C,GAAA,EAAkB,CAAA,CAAE,EAClDpB,EAAUx3C,EAAM,QAAQ,IAAM64C,GAAA,EAAkB,CAAA,CAAE,EAElDkB,EAAe/5C,EAAM,YACxBg6C,GAAiB,CAChBl5C,EAASg4C,GAAQ53C,EAAS84C,EAAM94C,EAAQ,aAAcA,EAAQ,WAAA,CAAY,CAAC,CAC7E,EACA,CAACA,EAASJ,CAAQ,CAAA,EAGdm5C,EAAiBj6C,EAAM,YAC1Bk6C,GAAmB,CAClBp5C,EAASg4C,GAAQ53C,EAASA,EAAQ,SAAA,EAAYg5C,EAAQh5C,EAAQ,WAAA,CAAY,CAAC,EAEtE44C,GACHF,GAAA,MAAAA,GAEJ,EACA,CAAC14C,EAASJ,EAAU84C,EAAYE,CAAW,CAAA,EAGvCK,EAAiBn6C,EAAM,YAC1Bo6C,GAAmB,CAClBt5C,EAASg4C,GAAQ53C,EAASA,EAAQ,SAAA,EAAYA,EAAQ,aAAck5C,CAAM,CAAC,EAC3ER,GAAA,MAAAA,GACF,EACA,CAAC14C,EAASJ,EAAU84C,CAAU,CAAA,EAGhC,OACEznC,EAAAA,KAAC,MAAA,CAAI,UAAU,4BAA4B,cAAY,sBACrD,SAAA,CAAA1I,EAAAA,IAAC,MAAA,CAAI,UAAU,2BACb,SAAAA,EAAAA,IAAC0uC,GAAA,CAAe,MAAOj3C,EAAQ,SAAA,EAAY,MAAOo2C,EAAO,SAAUyC,EAAc,EACnF,EACAtwC,EAAAA,IAAC,MAAA,CAAI,UAAU,2BACb,eAAC0uC,GAAA,CAAe,MAAOj3C,EAAQ,WAAA,EAAc,MAAOq2C,EAAS,SAAU0C,EAAgB,EACzF,EACCH,GACCrwC,EAAAA,IAAC,MAAA,CAAI,UAAU,2BACb,SAAAA,EAAAA,IAAC0uC,GAAA,CAAe,MAAOj3C,EAAQ,aAAc,MAAOs2C,EAAS,SAAU2C,EAAgB,CAAA,CACzF,CAAA,EAEJ,CAEJ,CCjDA,MAAMpH,GAAgB1mC,IAAsB,CAC1C,WAAY,WAAWA,CAAQ,iBAC/B,QAAS,CACX,GAEM2mC,GAAmB,CACvB,SAAU,CAAE,QAAS,CAAA,EACrB,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,CAAA,CACtB,EA0BaqH,GAAiBr6C,EAAM,WAAW,SAAwBiL,EAA4BC,EAAK,CACtG,KAAM,CACJ,MAAO4pC,EACP,SAAU77B,EACV,qBAAA63B,EACA,YAAAC,EACA,cAAAC,EACA,aAAAnE,EAAe,EACf,UAAAloC,EAAY,eACZ,SAAAkM,EACA,gBAAAilC,EACA,kBAAAI,EAAoB,uBACpB,QAAAjF,EACA,QAAAC,EACA,eAAAC,EACA,OAAArE,EACA,OAAAkC,EACA,WAAA6K,EACA,aAAA9D,EACA,OAAQ58B,EACR,GAAG7M,CAAA,EACDrB,EACE7L,EAAQiF,EAAAA,QAAQ,IAAOywC,IAAc,OAAY,OAAY,IAAI,KAAKA,CAAS,EAAI,CAACA,CAAS,CAAC,EAC9F,CAAC3E,EAAWsG,CAAY,EAAI92C,EAAAA,SAAe,IAC/CsvC,GAAY7vC,CAAK,GAAK45C,GAAgB55C,CAAK,EAAIA,EAAQ,IAAI,IAAK,EAE5D,CAACgxC,EAAUsG,CAAW,EAAI/2C,EAAAA,SAAmB8wC,GAAS,IAAI,EAC1D,CAACl/B,EAAQonB,CAAS,EAAIh5B,EAAAA,SAAS,EAAK,EAEpCyG,EAAY7F,EAAAA,OAA8B,IAAI,EAC9C+5C,EAAW/5C,EAAAA,OAA8B,IAAI,EAE7CkB,EAAWiD,GAAiBC,CAAS,EACrC,CAAE,KAAA8B,EAAM,eAAAC,CAAA,EAAmBE,eAAY,CAC3C,KAAM2K,EACN,UAAW9P,EAAS,UACpB,qBAAsBoF,GAAAA,WACtB,WAAY7B,GAAwBvD,CAAQ,CAAA,CAC7C,EAEKm1C,EAAgBxpC,GAAWhH,EAAWK,EAAK,aAAcyE,CAAG,EAC5DqvC,EAAentC,GAAWktC,EAAU7zC,EAAK,WAAW,EAKpD,CAAC8yB,EAAYC,CAAa,EAAI75B,WAAA,EACpCE,GAAoB,IAAM,CACxB25B,EAAc,SAAS,IAAI,CAC7B,EAAG,CAAA,CAAE,EAEL35B,GAAoB,IAAM,CACpBgR,GAIJ4lC,EAAaxH,GAAY7vC,CAAK,GAAK45C,GAAgB55C,CAAK,EAAIA,EAAQ,IAAI,IAAM,CAChF,EAAG,CAACA,EAAOyR,CAAQ,CAAC,EAEpB,MAAMimC,EAAoBx1C,cAAaC,IAAe,CACpDk1C,EAAal1C,EAAI,CACnB,EAAG,CAAA,CAAE,EAEC8uC,EAAoB/uC,EAAAA,YAAY,IAAM,CAC1Co1C,EAAYtG,IAAaK,GAAS,OAASA,GAAS,KAAOA,GAAS,MAAM,CAC5E,EAAG,CAACL,CAAQ,CAAC,EAEPE,EAAmBhvC,EAAAA,YAAY,IAAM,CACzCo1C,EAAYtG,IAAaK,GAAS,MAAQA,GAAS,KAAOA,GAAS,KAAK,CAC1E,EAAG,CAACL,CAAQ,CAAC,EAEP2G,EAAgBz1C,EAAAA,YACnBqqC,IAAkB,CACjB8K,EAAatI,GAASgC,EAAWxE,EAAK,CAAC,EACvC+K,EAAYjG,GAAS,IAAI,CAC3B,EACA,CAACN,CAAS,CAAA,EAGN6G,EAAe11C,EAAAA,YAClBoqC,IAAiB,CAChB+K,EAAanI,GAAQ6B,EAAWzE,EAAI,CAAC,EACrCgL,EAAYjG,GAAS,IAAI,CAC3B,EACA,CAACN,CAAS,CAAA,EAGNqK,GAAal5C,EAAAA,YAChBC,IAAe,CACdk1C,EAAal1C,EAAI,EACjB0X,GAAA,MAAAA,EAAe,OAAW1X,GAAM0J,EAClC,EACA,CAACgO,EAAchO,CAAK,CAAA,EAGhBwvC,GAAen5C,EAAAA,YACnB,CAACo5C,GAA8C1/B,KAAgB,CAC7D,GAAI,CAACA,GACH,OAGF,MAAM0+B,GAAaV,GAAgB55C,CAAK,EAAIA,EAAQ+wC,EACpDqK,GAAWf,GAAUz+B,GAAM0+B,EAAU,CAAC,CACxC,EACA,CAACc,GAAYp7C,EAAO+wC,CAAS,CAAA,EAGzBwK,GAAer5C,EAAAA,YAClBk4C,IAAmB,CAClB,MAAMoB,GAAa3L,GAAY7vC,CAAK,EAAIA,EAAQ+wC,EAChDqK,GAAWlB,GAAUsB,GAAYpB,EAAQ,CAAC,CAC5C,EACA,CAACgB,GAAYp7C,EAAO+wC,CAAS,CAAA,EAGzBmE,GAAWhzC,EAAAA,YAAY,IAAM,CAC5BuP,GACH8nB,EAAWzD,IAAc,CAACA,EAAS,CAEvC,EAAG,CAACrkB,CAAQ,CAAC,EAEPoyB,GAAc3hC,cAAaX,IAAwC,WACvE,MAAM6C,GAAS7C,GAAM,QAEjBe,GAAA44C,EAAS,UAAT,MAAA54C,GAAkB,SAAS8B,MAAWyF,GAAA7C,EAAU,UAAV,MAAA6C,GAAmB,SAASzF,KAItEm1B,EAAU,EAAK,CACjB,EAAG,CAAA,CAAE,EAECse,EAAY1lC,GAAU,CAACV,GAAY,CAACilC,EAK1Cl2C,EAAAA,UAAU,IAAM,CACd,GAAI,CAACq3C,EACH,OAEF,MAAMt0C,GAAahC,IAAyB,QAC1C,MAAMokB,GAAQu1B,EAAS,QACvB,GAAI35C,GAAM,MAAQ,UAAY,CAACokB,IAAS,CAACtR,GAAkBsR,EAAK,EAC9D,OAEF4T,EAAU,EAAK,EACf,MAAMx2B,GAAS,SAAS,eACpB,CAACA,IAAUA,KAAW,SAAS,MAAQ4iB,GAAM,SAAS5iB,EAAM,MAC9DT,GAAA0E,EAAU,UAAV,MAAA1E,GAAmB,QAEvB,EACA,gBAAS,iBAAiB,UAAWiB,EAAS,EAEvC,IAAM,SAAS,oBAAoB,UAAWA,EAAS,CAChE,EAAG,CAACs0C,CAAS,CAAC,EAEd,MAAM4D,GAAqBx2C,EAAAA,QAAQ,IAC7Bw1C,IAIA7K,GAAA,MAAAA,EAAQ,SAAS,YACZ,WAGF0J,IACN,CAAC1J,EAAQ6K,CAAU,CAAC,EAEjB3L,GAAS7pC,EAAAA,QAAQ,IAAMoqC,GAAU3B,CAAM,EAAG,CAACA,CAAM,CAAC,EAClDuB,GAAQhqC,EAAAA,QAAQ,IAAMqqC,GAAS,IAAI,KAAA,EAAO,YAAA,EAAe,GAAG,EAAG,EAAE,EAEvE,IAAIwI,GAAwB,KAE5B,OAAQ9G,EAAA,CACN,KAAKK,GAAS,KACZyG,GACEztC,EAAAA,IAAConC,GAAA,CACC,UAAAV,EACA,MAAA/wC,EACA,qBAAA0xC,EACA,SAAU2J,GACV,YAAA1J,EACA,cAAAC,EACA,aAAAnE,EACA,QAAAoE,EACA,QAAAC,EACA,eAAAC,EACA,OAAArE,CAAA,CAAA,EAGJ,MACF,KAAK2D,GAAS,OACZyG,GAAOztC,EAAAA,IAACorC,IAAe,MAAO1E,EAAU,WAAY,MAAOjC,GAAQ,SAAU6I,CAAA,CAAe,EAC5F,MACF,KAAKtG,GAAS,MACZyG,GAAOztC,EAAAA,IAACorC,IAAe,MAAO1E,EAAU,cAAe,MAAO9B,GAAO,SAAU2I,CAAA,CAAc,EAC7F,KAAA,CAGJ,OACE7kC,EAAAA,KAAAkE,WAAA,CACE,SAAA,CAAA5M,EAAAA,IAACyuC,GAAA,CACC,IAAKtB,EACL,MAAAx3C,EACA,SAAU6Z,EACV,OAAQE,EACR,SAAAm7B,GACA,SAAAzjC,EACA,gBAAAilC,EACA,OAAA9G,EACA,aAAA+G,EACC,GAAGzpC,CAAA,CAAA,EAELitB,EACG7iB,GAAAA,mBACG88B,GAAA,CAAW,QAAS8G,EAAU,GAAIrD,EAAW,QAAS,IAAK,aAAY,GAAC,cAAa,GACnF,SAACxD,IACAhqC,EAAAA,IAACq5B,IAAkB,YAAAG,GACjB,SAAAx5B,EAAAA,IAAC,MAAA,CACC,IAAK8wC,EACL,UAAU,yCACV,MAAO,CACL,GAAG7zC,EACH,GAAGqsC,GAAa,GAAG,EACnB,GAAGC,GAAiBS,EAAK,CAAA,EAE3B,cAAY,mBACZ,0BAAwB,GACxB,KAAK,SACL,aAAW,QACX,aAAYyC,EAEZ,SAAA/jC,EAAAA,KAAC,MAAA,CAAI,UAAU,uDACb,SAAA,CAAA1I,EAAAA,IAACymC,GAAA,CACC,UAAAC,EACA,OAAArD,EACA,SAAAsD,EACA,SAAU0G,EACV,kBAAAzG,EACA,iBAAAC,CAAA,CAAA,EAEFn+B,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAA1I,EAAAA,IAAC,MAAA,CAAI,UAAU,qDAAsD,SAAAytC,GAAK,QACzEyC,GAAA,CAAkB,MAAOxJ,EAAW,OAAQ0K,GAAoB,SAAUF,EAAA,CAAc,CAAA,CAAA,CAC3F,CAAA,CAAA,CACF,CAAA,CAAA,EAEJ,CAAA,CAEJ,EACAphB,CAAA,EAEF,IAAA,EACN,CAEJ,CAAC,EC9RKuhB,GAAoB7B,GAAA,EAEnB,SAAS8B,GAAa,CAC3B,MAAOjG,EACP,SAAU77B,EACV,OAAQE,EACR,OAAA61B,CACF,EAA0C,CACxC,MAAMgM,EAAoB32C,EAAAA,QAAQ,IAAM40C,GAAqBjK,CAAM,EAAG,CAACA,CAAM,CAAC,EACxE,CAACsG,EAAgBC,CAAiB,EAAI51C,EAAAA,SAASo5C,GAAejE,EAAW9F,CAAM,CAAC,EAChFwG,EAAanxC,EAAAA,QAAQ,IAAM60C,GAAkBlK,CAAM,EAAG,CAACA,CAAM,CAAC,EAC9DjC,EAAY1oC,EAAAA,QAAQ,IAAM80C,GAAoB3D,CAAU,EAAG,CAACA,CAAU,CAAC,EACvEC,EAAYl1C,EAAAA,OAAmC,MAAS,EAE9DP,EAAM,UAAU,IAAM,CACpB,MAAM01C,EAAiBZ,IAAcW,EAAU,QAC/CA,EAAU,QAAUX,EAEfY,GAILH,EAAkBwD,GAAejE,EAAW9F,CAAM,CAAC,CACrD,EAAG,CAAC8F,EAAW9F,CAAM,CAAC,EAEtB,MAAMluC,EAAY1B,GAAkB,CAClCm2C,EAAkBn2C,CAAK,EAElB6Z,IAIDmgC,GAAYh6C,EAAO47C,CAAiB,EACtC/hC,EAAa,OAAWogC,GAAgBj6C,EAAO47C,CAAiB,CAAC,EACxD57C,IAAU,IACnB6Z,EAAa,MAAS,EAE1B,EAEMe,EAAS1Y,EAAAA,YAAY,IAAM,CAC/B,GAAI,CAAC6X,EACH,OAGF,MAAM3X,EAAOi0C,EAAU,QAEnBj0C,aAAgB,MAAQ43C,GAAYL,GAAev3C,EAAMwtC,CAAM,EAAGgM,CAAiB,EACrF7hC,EAAW,OAAW3X,CAAI,EACjB,OAAOA,GAAS,UAAY43C,GAAY53C,EAAMw5C,CAAiB,EACxE7hC,EAAW,OAAWkgC,GAAgB73C,EAAMw5C,CAAiB,CAAC,GACrDx5C,IAAS,QAAaA,IAAS,KACxC2X,EAAW,MAAS,EAGtBo8B,EAAkBwD,GAAejE,EAAW9F,CAAM,CAAC,CACrD,EAAG,CAAC71B,EAAY27B,EAAW9F,EAAQgM,CAAiB,CAAC,EAQrD,MAAO,CACL,GAPgBpF,GAAAA,QAAQ,CACxB,MAAON,EACP,SAAAx0C,EACA,OAAQisC,CAAA,CACT,EAIC,OAAA/yB,EACA,aAAcg1B,GAAA,KAAAA,EAAU8L,IAAmB,YAAA,CAAY,CAE3D,CC7EA,SAASh/B,GAAgBnb,EAA6B,CACpDA,EAAM,gBAAA,CACR,CAEO,MAAMs6C,GAAkBj7C,EAAM,WAAW,SAC9CiL,EACAC,EACA,CACA,KAAM,CAAE,MAAA9L,EAAO,SAAA0B,EAAU,OAAAkZ,EAAQ,SAAAs6B,EAAU,SAAAzjC,EAAU,aAAAqqC,EAAc,UAAAC,EAAW,OAAAnM,EAAQ,GAAG1iC,CAAA,EAASrB,EAC5F+qC,EAAc+E,GAAa,CAAE,MAAA37C,EAAO,SAAA0B,EAAU,OAAAkZ,EAAQ,OAAAg1B,EAAQ,EAEpE,OACEvlC,EAAAA,IAACqP,GAAA,CACC,IAAA5N,EACC,GAAG8qC,EACJ,KAAK,MACL,aACE,CAACkF,GACCzxC,EAAAA,IAACghC,GAAA,CACC,KAAK,MACL,QAAS6J,EACT,YAAax4B,GACb,SAAU,EAAQjL,EAClB,cAAY,0BAEX,SAAAsqC,GAAa1xC,EAAAA,IAACc,GAAA,CAAK,KAAK,WAAW,KAAM,EAAG,OAAQ,IAAK,KAAM,EAAA,CAAI,CAAA,CAAA,EAI1E,SAAU,EAAQsG,EACjB,GAAGvE,CAAA,CAAA,CAGV,CAAC,ECjCKymC,GAAgB1mC,IAAsB,CAC1C,WAAY,WAAWA,CAAQ,iBAC/B,QAAS,CACX,GAEM2mC,GAAmB,CACvB,SAAU,CAAE,QAAS,CAAA,EACrB,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,CAAA,CACtB,EAgBaoI,GAAap7C,EAAM,WAAW,SAAoBiL,EAAwBC,EAAK,CAC1F,KAAM,CACJ,MAAO4pC,EACP,SAAU77B,EACV,UAAAtU,EAAY,eACZ,SAAAkM,EACA,aAAAqqC,EACA,eAAAG,EAAiB,cACjB,OAAArM,EACA,OAAQ71B,EACR,GAAG7M,CAAA,EACDrB,EACE7L,EAAQiF,EAAAA,QAAQ,IAAOywC,IAAc,OAAY,OAAY,IAAI,KAAKA,CAAS,EAAI,CAACA,CAAS,CAAC,EAC9F,CAAC3E,EAAWsG,CAAY,EAAI92C,WAAe,IAAOq5C,GAAgB55C,CAAK,EAAIA,EAAQ,IAAI,IAAO,EAC9F,CAACmS,EAAQonB,CAAS,EAAIh5B,EAAAA,SAAS,EAAK,EAEpCyG,EAAY7F,EAAAA,OAA8B,IAAI,EAC9C+6C,EAAW/6C,EAAAA,OAA8B,IAAI,EAE7CkB,EAAWiD,GAAiBC,CAAS,EACrC,CAAE,KAAA8B,EAAM,eAAAC,CAAA,EAAmBE,eAAY,CAC3C,KAAM2K,EACN,UAAW9P,EAAS,UACpB,qBAAsBoF,GAAAA,WACtB,WAAY7B,GAAwBvD,CAAQ,CAAA,CAC7C,EAEKm1C,EAAgBxpC,GAAWhH,EAAWK,EAAK,aAAcyE,CAAG,EAC5DqwC,EAAenuC,GAAWkuC,EAAU70C,EAAK,WAAW,EAKpD,CAAC8yB,EAAYC,CAAa,EAAI75B,WAAA,EACpCE,GAAoB,IAAM,CACxB25B,EAAc,SAAS,IAAI,CAC7B,EAAG,CAAA,CAAE,EAEL35B,GAAoB,IAAM,CACpBgR,GAIJ4lC,EAAauC,GAAgB55C,CAAK,EAAIA,EAAQ,IAAI,IAAM,CAC1D,EAAG,CAACA,EAAOyR,CAAQ,CAAC,EAEpB,MAAMyjC,EAAWhzC,EAAAA,YAAY,IAAM,CAC5BuP,GACH8nB,EAAWzD,GAAc,CAACA,CAAS,CAEvC,EAAG,CAACrkB,CAAQ,CAAC,EAEPoyB,EAAc3hC,cAAaX,GAAwC,SACvE,MAAM6C,EAAS7C,EAAM,QAEjBe,EAAA45C,EAAS,UAAT,MAAA55C,EAAkB,SAAS8B,KAAWyF,EAAA7C,EAAU,UAAV,MAAA6C,EAAmB,SAASzF,IAItEm1B,EAAU,EAAK,CACjB,EAAG,CAAA,CAAE,EAECse,EAAY1lC,GAAU,CAACV,GAAY,CAACqqC,EAK1Ct7C,EAAAA,UAAU,IAAM,CACd,GAAI,CAACq3C,EACH,OAEF,MAAMt0C,EAAahC,GAAyB,OAC1C,MAAMokB,EAAQu2B,EAAS,QACvB,GAAI36C,EAAM,MAAQ,UAAY,CAACokB,GAAS,CAACtR,GAAkBsR,CAAK,EAC9D,OAEF4T,EAAU,EAAK,EACf,MAAMx2B,EAAS,SAAS,eACpB,CAACA,GAAUA,IAAW,SAAS,MAAQ4iB,EAAM,SAAS5iB,CAAM,MAC9DT,EAAA0E,EAAU,UAAV,MAAA1E,EAAmB,QAEvB,EACA,gBAAS,iBAAiB,UAAWiB,CAAS,EAEvC,IAAM,SAAS,oBAAoB,UAAWA,CAAS,CAChE,EAAG,CAACs0C,CAAS,CAAC,EAEd,MAAM0D,EAAer5C,EAAAA,YAClBC,GAAe,CACdk1C,EAAal1C,CAAI,EACjB0X,GAAA,MAAAA,EAAe,OAAW1X,EAAM0J,EAClC,EACA,CAACgO,EAAchO,CAAK,CAAA,EAGhB2uC,EAAat4C,EAAAA,YAAY,IAAM,CACnCq3B,EAAU,EAAK,CACjB,EAAG,CAAA,CAAE,EAEL,OACExmB,EAAAA,KAAAkE,WAAA,CACE,SAAA,CAAA5M,EAAAA,IAACwxC,GAAA,CACC,IAAKrE,EACL,MAAAx3C,EACA,SAAU6Z,EACV,OAAQE,EACR,SAAAm7B,EACA,SAAAzjC,EACA,aAAAqqC,EACA,OAAAlM,EACC,GAAG1iC,CAAA,CAAA,EAELitB,EACG7iB,GAAAA,mBACG88B,GAAA,CAAW,QAAS8H,EAAU,GAAIrE,EAAW,QAAS,IAAK,aAAY,GAAC,cAAa,GACnF,SAACxD,GACAhqC,EAAAA,IAACq5B,IAAkB,YAAAG,EACjB,SAAAx5B,EAAAA,IAAC,MAAA,CACC,IAAK8xC,EACL,UAAU,oCACV,MAAO,CACL,GAAG70C,EACH,GAAGqsC,GAAa,GAAG,EACnB,GAAGC,GAAiBS,CAAK,CAAA,EAE3B,cAAY,cACZ,0BAAwB,GACxB,KAAK,SACL,aAAW,QACX,aAAY4H,EAEZ,SAAA5xC,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACb,SAAAA,EAAAA,IAACkwC,GAAA,CACC,MAAOxJ,EACP,OAAAnB,EACA,SAAU2L,EACV,WAAAf,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EAEJ,CAAA,CAEJ,EACArgB,CAAA,EAEF,IAAA,EACN,CAEJ,CAAC,EC3LM,SAASiiB,GAAYC,EAAqB,CAC/C,MAAO,sBAAsB,KAAKA,EAAK,IAAI,CAC7C,CCaO,SAASC,GAAQzwC,EAAqB,CAC3C,KAAM,CAAE,MAAAlC,EAAO,gBAAA4yC,EAAiB,YAAAC,EAAa,gBAAAC,EAAiB,iBAAAC,GAAqB7wC,EAE7E8wC,EAAiBhwC,EAAG,0BAA2B+vC,CAAgB,EAErE,OACE3pC,EAAAA,KAAC,MAAA,CAAI,UAAW4pC,EACd,SAAA,CAAAtyC,EAAAA,IAACqN,GAAA,CAAe,QAAS6kC,EAAiB,UAAU,iCAClD,SAAAlyC,EAAAA,IAACc,GAAA,CAAK,KAAK,SAAS,KAAM,EAAA,CAAI,EAChC,EACAd,EAAAA,IAAC6vB,GAAA,CAAW,UAAU,kCAAkC,KAAMsiB,EAAuB,WAAYC,EAC9F,SAAA9yC,EAAM,IAAK0yC,GAAe,CACzB,MAAM18B,EAAMy8B,GAAYC,CAAI,EAAI,IAAI,gBAAgBA,CAAI,EAAI,KAE5D,OAAO18B,EACLtV,EAAAA,IAACqvB,GAAA,CACC,UAAU,wCAEV,IAAA/Z,EACA,KAAM,EACN,KAAM,EACN,eAAgB08B,EAAK,IAAA,EAJhBA,EAAK,IAAA,EAOZhyC,EAAAA,IAAC,MAAA,CAEC,UAAU,uCACV,MAAO,CACL,MAAO,GAAIoyC,EAA6B,CAAC,IAAA,EAG1C,SAAAJ,EAAK,IAAA,EANDA,EAAK,IAAA,CAShB,CAAC,CAAA,CACH,CAAA,EACF,CAEJ,CCzCO,SAASO,GAAa,CAAE,gBAAAL,EAAiB,YAAAM,EAAa,iBAAAH,EAAkB,KAAA/+B,GAA2B,CACxG,MAAMg/B,EAAiBhwC,EAAG,0BAA2B+vC,CAAgB,EAErE,OACE3pC,EAAAA,KAAC,MAAA,CAAI,UAAW4pC,EACd,SAAA,CAAAtyC,EAAAA,IAACqN,GAAA,CAAe,QAAS6kC,EAAiB,UAAU,iCAClD,SAAAlyC,EAAAA,IAACc,GAAA,CAAK,KAAK,SAAS,KAAM,EAAA,CAAI,EAChC,EACAd,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAiC,SAAA,GAAGsT,GAAc,iBAAiB,IAAIk/B,CAAW,EAAA,CAAG,CAAA,EACtG,CAEJ,CCVO,SAASC,GAAejxC,EAA4B,CACzD,KAAM,CAAE,YAAA2wC,EAAa,QAAAntB,EAAS,gBAAAotB,EAAiB,gBAAAF,EAAiB,MAAA5yC,EAAO,iBAAA+yC,GAAqB7wC,EAE5F,yBAEK,SAAAwjB,EACChlB,EAAAA,IAACiyC,GAAA,CACC,MAAA3yC,EACA,gBAAA4yC,EACA,YAAAC,EACA,gBAAAC,EACA,iBAAAC,CAAA,CAAA,EAGFryC,EAAAA,IAACuyC,GAAA,CACC,YAAajzC,EAAM,OACnB,gBAAA4yC,EACA,iBAAAG,CAAA,CAAA,EAGN,CAEJ,CCjBO,MAAMK,GAAW3xC,EAAAA,WAA4C,SAAkBS,EAAOC,EAAK,CAChG,KAAM,CACJ,QAAAujB,EACA,YAAAmtB,EAAc,EACd,gBAAAC,EAAkB,IAClB,OAAQO,EACR,MAAA/pC,EAAQ,GACR,UAAA5H,EACA,iBAAAqxC,EACA,SAAAjrC,EACA,MAAAiH,EACA,GAAGukC,CAAA,EACDpxC,EAEE,CAAClC,EAAOuzC,CAAQ,EAAIt8C,EAAM,SAAiB,CAAA,CAAE,EAE7C6I,EAAU0zC,GAA0B,CACxCD,EAAU96C,GAAS,CAAC,GAAGA,EAAM,GAAG+6C,CAAa,CAAC,EAC9CH,EAAWG,CAAa,CAC1B,EAEM,CAAE,aAAAvzC,EAAc,cAAAE,CAAA,EAAkBd,GAAY,CAClD,OAAAS,EACA,SAAAgI,EACA,GAAGwrC,CAAA,CACJ,EAEKV,EAAkB,IAAM,CAC5BW,EAAS,CAAA,CAAE,CACb,EAEME,EAAiBzwC,EAAG,iBAAkB,CAAE,gBAAiB8E,EAAU,aAAc,CAAC,CAACiH,CAAA,EAASrN,CAAS,EAE3G,cACG,MAAA,CAAI,IAAAS,EAAU,UAAWsxC,EAAgB,cAAY,YACnD,SAAA,CAAAzzC,EAAM,OAAS,EACdU,EAAAA,IAACyyC,GAAA,CACC,QAAAztB,EACA,MAAA1lB,EACA,gBAAA4yC,EACA,YAAAC,EACA,gBAAAC,EACA,iBAAAC,CAAA,CAAA,EAGF3pC,EAAAA,KAAC,MAAA,CACC,UAAU,wBACV,KAAK,SACL,SAAUtB,EAAW,GAAK,EAC1B,gBAAeA,GAAY,OAC3B,aAAYwB,GAAS,eACpB,GAAGrJ,EAAA,EAEJ,SAAA,CAAAS,EAAAA,IAAC,MAAA,CAAI,UAAU,6BAA8B,SAAA4I,EAAM,EACnD5I,EAAAA,IAAC,QAAA,CAAO,GAAGP,GAAc,CAAG,CAAA,CAAA,CAAA,EAG/B4O,QACE,OAAA,CAAK,UAAU,wBAAwB,KAAK,QAC1C,WACH,EACE,IAAA,EACN,CAEJ,CAAC,ECjEY2kC,GAAYjyC,EAAAA,WAA2C,SAAmBS,EAAOC,EAAK,CACjG,KAAM,CAAE,MAAAmH,EAAO,QAAAyY,EAAS,gBAAA4xB,EAAiB,UAAAjyC,EAAW,gBAAAkyC,EAAiB,SAAA9rC,EAAU,MAAAiH,EAAO,GAAGukC,CAAA,EAAoBpxC,EAEvG,CAAE,aAAAjC,EAAc,cAAAE,CAAA,EAAkBd,GAAY,CAClD,GAAGi0C,EACH,SAAAxrC,EACA,eAAgB,CAAC+rC,EAAUj8C,IAAU,OACnC+7C,GAAA,MAAAA,EAAkBE,IAClBl7C,EAAA26C,EAAgB,iBAAhB,MAAA36C,EAAA,KAAA26C,EAAiCO,EAAUj8C,EAC7C,CAAA,CACD,EAEKsqB,EAAe/Y,GAA2C,CAC9D4Y,GAAA,MAAAA,EAAU5Y,EACZ,EAEA,OACEC,EAAAA,KAAC,MAAA,CACC,IAAAjH,EACA,UAAWa,EAAG,kBAAmB,CAAE,gBAAiB8E,CAAA,EAAYpG,CAAS,EACzE,cAAY,aACX,GAAGzB,EAAA,EAEJ,SAAA,CAAAS,EAAAA,IAAC,SAAA,CAAO,KAAK,SAAS,UAAWsC,EAAG4wC,CAAe,EAAG,SAAA9rC,EAAoB,QAASoa,EAChF,SAAA5Y,CAAA,CACH,EACA5I,EAAAA,IAAC,QAAA,CAAO,GAAGP,EAAA,CAAc,CAAG,EAC3B4O,QACE,OAAA,CAAK,UAAU,yBAAyB,KAAK,QAC3C,WACH,EACE,IAAA,CAAA,CAAA,CAGV,CAAC,ECdY+kC,GAAc78C,EAAM,WAA+C,SAAqBiL,EAAOC,EAAK,CAC/G,KAAM,CACJ,MAAAmH,EACA,SAAAxB,EACA,SAAAuI,EACA,SAAAJ,EACA,KAAA1O,EACA,GAAI1I,EACJ,KAAAgJ,EAAO,SACP,MAAAE,EAAQ,UACR,cAAeE,EAAa,QAC5B,WAAAuM,EACA,MAAAO,EACA,SAAAhX,EACA,UAAA2J,EACA,mBAAoBsO,EACpB,GAAGwZ,CAAA,EACDtnB,EACEyM,EAAK/V,GAAMC,CAAM,EACjBkY,EAAStC,GAAcD,EAAY,CAAE,YAAawB,EAAiB,EAEnEyxB,EAAgBt4B,GAA2C,CAC/D,GAAIkH,EAAU,CACZ+wB,GAAsBj4B,EAAGjH,EAAM,OAAO,EACtC,MACF,CACAnK,GAAA,MAAAA,EAAWoR,EAAGjH,EAAM,QAAU,OAAYA,EAAM,MAAQiH,EAAE,OAAO,QAASjH,EAC5E,EAEMggB,EAAe/Y,GAA0C,QAC7DxQ,EAAAuJ,EAAM,UAAN,MAAAvJ,EAAA,KAAAuJ,EAAgBiH,GACZkH,GAAU6wB,GAAa/3B,EAAGjH,EAAM,OAAO,CAC7C,EAEA,OACExB,EAAAA,IAACmO,GAAA,CACC,WAAAL,EACA,aAAcuC,EAAO,GACrB,SAAAjJ,EACA,MAAAiH,EACA,UAAU,2BAEV,SAAA3F,EAAAA,KAAC,QAAA,CACC,QAASuF,EACT,UAAW3L,EAAG,aAAc,mBAAmBnB,CAAI,GAAI,oBAAoBE,CAAK,GAAI,CAClF,gBAAiB+F,EACjB,gBAAiBuI,CAAA,CAClB,EAED,SAAA,CAAAjH,EAAAA,KAAC,OAAA,CAAK,UAAU,sBACd,SAAA,CAAA1I,EAAAA,IAAC,QAAA,CACC,GAAAiO,EACA,KAAApN,EACA,SAAAuG,EACA,SAAAuI,EACA,SAAAJ,EACA,eAAclB,GAAS,OACvB,gBAAekB,GAAY,OAC3B,mBAAkBc,EAAO,YACzB,UAAW/N,EAAG,oBAAqBtB,CAAS,EAC5C,KAAK,QACL,cAAaO,EACb,IAAAE,EACC,GAAGqnB,EACJ,SAAUiY,EACV,QAASvf,CAAA,CAAA,EAEXxhB,MAAC,QAAK,UAAWsC,EAAG,kBAAmB,CAAE,gBAAiB8E,CAAA,CAAU,EAAG,EACvEpH,MAAC,QAAK,UAAWsC,EAAG,iBAAkB,CAAE,gBAAiB8E,CAAA,CAAU,CAAA,CAAG,CAAA,EACxE,EACCwB,GAAS5I,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAqB,SAAA4I,CAAA,CAAM,CAAA,CAAA,CAAA,CACvD,CAAA,CAGN,CAAC,ECpEYyqC,GAAStyC,EAAAA,WAAyC,SAC7D,CACE,UAAAC,EACA,MAAArL,EACA,aAAAyB,EAAe,EACf,IAAA2e,EAAM,EACN,UAAAu9B,EAAY,EACZ,SAAA3jC,EAAW,GACX,SAAAvI,EAAW,GACX,KAAAjG,EAAO,GACP,KAAAkG,EACA,UAAAksC,EACA,KAAA1yC,EACA,MAAAQ,EAAQ,UACR,MAAAgN,EACA,WAAAP,EACA,GAAAG,EACA,aAAc0b,EACd,mBAAoBra,EACpB,SAAAjY,CACF,EACAoK,EACA,CACA,MAAMnK,EAAe3B,IAAU,OACzB,CAAC4B,EAAUC,CAAW,EAAItB,EAAAA,SAASkB,CAAY,EAC/C,CAACo8C,EAAOC,CAAQ,EAAIv9C,EAAAA,SAAwB,IAAI,EAEhDuB,EAAU9B,IAAU,OAAYA,EAAQ4B,EACxCkpB,EAAU+yB,GAAA,KAAAA,EAAS/7C,EAEnB6pB,EAAc,CAAC3R,GAAY,CAACvI,EAE5BssC,EAAiB,CAACx8C,EAAoCy8C,IAA8B,CACxF,GAAIL,IAAc,EAChB,OAAOK,EAAY,EAErB,KAAM,CAAE,KAAAC,EAAM,MAAA57B,CAAA,EAAU9gB,EAAM,cAAc,sBAAA,EACtC28C,EAAa38C,EAAM,QAAU08C,EAAO57B,EAAQ,EAClD,OAAO27B,GAAaE,EAAa,GAAM,EACzC,EAEMC,EAAe,CAAC58C,EAAoCy8C,IAAsB,CAC9E,GAAI,CAACryB,EACH,OAEF,MAAMxpB,EAAO47C,EAAex8C,EAAOy8C,CAAS,EACvCr8C,GACHE,EAAYM,CAAI,EAElBT,GAAA,MAAAA,EAAWS,EACb,EAEMi8C,EAAa1sC,GAAA,KAAAA,EAAQrH,EAAAA,IAACc,GAAA,CAAK,KAAK,OAAO,KAAM,EAAG,KAAAK,EAAY,EAC5D6yC,EAAYT,GAAA,KAAAA,EAAavzC,MAACc,GAAA,CAAK,KAAK,OAAO,KAAAK,EAAY,EAEvD8yC,EAAUn8C,GAAiB,CAC/B,MAAM+c,EAAU,KAAK,IAAI,EAAG,KAAK,IAAIkB,EAAKje,CAAI,CAAC,EAC1CR,GACHE,EAAYqd,CAAO,EAErBxd,GAAA,MAAAA,EAAWwd,EACb,EAEMtB,EAAiBrc,GAA0C,CAC1DoqB,IAGDpqB,EAAM,MAAQ,cAAgBA,EAAM,MAAQ,WAC9CA,EAAM,eAAA,EACN+8C,EAAOx8C,EAAU67C,CAAS,GACjBp8C,EAAM,MAAQ,aAAeA,EAAM,MAAQ,aACpDA,EAAM,eAAA,EACN+8C,EAAOx8C,EAAU67C,CAAS,GACjBp8C,EAAM,MAAQ,QACvBA,EAAM,eAAA,EACN+8C,EAAO,CAAC,GACC/8C,EAAM,MAAQ,QACvBA,EAAM,eAAA,EACN+8C,EAAOl+B,CAAG,GAEd,EAEM1F,EAAStC,GAAcD,EAAY,CAAE,YAAawB,EAAiB,EACnE4kC,EAAY,GAAGz8C,CAAO,OAAOse,CAAG,GAGhCnN,EAAQ+G,EAAYga,EAAY,GAAGA,CAAS,IAAIuqB,CAAS,GAAKA,EAAavqB,GAAa,SAK9F,OACEjhB,EAAAA,KAAC,OAAA,CACC,UAAWpG,EACT,cACA,CAAE,uBAAwBqN,EAAU,uBAAwBvI,EAAU,oBAAqBiH,CAAA,EAC3FhN,IAAU,WAAa,qBAAqBA,CAAK,GACjDL,CAAA,EAGF,SAAA,CAAAhB,EAAAA,IAAC,OAAA,CACC,IAAAyB,EACA,GAAAwM,EACA,UAAU,uBACV,cAAY,SACZ,KAAM0B,EAAW,MAAQ,SACzB,aAAY/G,EACZ,gBAAe+G,EAAW,OAAY,EACtC,gBAAeA,EAAW,OAAYoG,EACtC,gBAAepG,EAAW,OAAYlY,EACtC,iBAAgBkY,EAAW,OAAYukC,EACvC,gBAAe,CAACvkC,GAAYvI,EAAW,GAAO,OAC9C,mBAAkBiJ,EAAO,YACzB,SAAUiR,EAAc,EAAI,OAC5B,UAAWA,EAAc/N,EAAgB,OAExC,SAAA,MAAM,KAAK,CAAE,OAAQwC,GAAO,CAAC4E,EAAGD,IAAU,CACzC,MAAMy5B,EAAY,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG1zB,EAAU/F,CAAK,CAAC,EAC1D,OACEhS,EAAAA,KAAC,OAAA,CAEC,UAAU,oBACV,MAAO,CAAE,MAAOvH,EAAM,OAAQA,EAAM,OAAQmgB,EAAc,UAAY,SAAA,EACtE,QAAUpqB,GAAU48C,EAAa58C,EAAOwjB,CAAK,EAC7C,YACE4G,GAAegyB,IAAc,GACxBp8C,GAAUu8C,EAASC,EAAex8C,EAAOwjB,CAAK,CAAC,EAChD4G,EACE,IAAMmyB,EAAS/4B,EAAQ,CAAC,EACxB,OAIR,aAAc,IAAM+4B,EAAS,IAAI,EAEjC,SAAA,CAAAzzC,EAAAA,IAAC,OAAA,CAAK,UAAU,4CAA6C,SAAAg0C,EAAU,EACvEh0C,EAAAA,IAAC,OAAA,CAAK,UAAU,6CAA6C,MAAO,CAAE,MAAO,GAAGm0C,EAAY,GAAG,GAAA,EAC5F,SAAAJ,CAAA,CACH,CAAA,CAAA,EAlBKr5B,CAAA,CAqBX,CAAC,CAAA,CAAA,EAEF7Z,EAAOb,EAAAA,IAAC,QAAA,CAAM,KAAK,SAAS,KAAAa,EAAY,MAAOpJ,EAAS,SAAQ,EAAA,CAAC,EAAK,KACtEoW,GAAcC,CAAU,EACvB9N,EAAAA,IAAC,QAAK,GAAIqQ,EAAO,GAAI,UAAW/N,EAAG,sBAAuB+L,GAAS,2BAA2B,EAC3F,WACH,EACE,IAAA,CAAA,CAAA,CAGV,CAAC,ECjIM,SAAS+lC,GAAiBC,EAAmB35B,EAAuB,CACzE,MAAO,GAAG25B,CAAS,WAAW35B,CAAK,EACrC,CAGA,SAAS45B,GAAWv2C,EAAsBgb,EAA0B,CAClE,QAASiI,EAAMjjB,EAAQ,cAAeijB,EAAKA,EAAMA,EAAI,cAAe,CAClE,GAAIA,EAAI,aAAeA,EAAI,aAAc,CACvC,MAAMmb,EAAQnb,EAAI,sBAAA,EACZuzB,EAAQx2C,EAAQ,sBAAA,EAClBw2C,EAAM,IAAMpY,EAAM,IACpBnb,EAAI,WAAamb,EAAM,IAAMoY,EAAM,IAC1BA,EAAM,OAASpY,EAAM,SAC9Bnb,EAAI,WAAauzB,EAAM,OAASpY,EAAM,OAE1C,CACA,GAAInb,IAAQjI,EACV,KAEJ,CACF,CAIA,SAASy7B,GAAehzC,EAAsB,CAE5C,KAAM,CAAE,SAAAzB,EAAU,UAAAiB,EAAW,SAAAoG,EAAU,SAAAgb,EAAU,MAAAzsB,EAAO,QAAA0rB,EAAS,eAAAonB,EAAgB,GAAG5lC,CAAA,EAASrB,EACvF8H,EAAYxS,EAAAA,OAAyB,IAAI,EAE/C,OACE4R,EAAAA,KAAC,KAAA,CACE,GAAG7F,EACJ,UAAWP,EAAG,kBAAmBtB,EAAW,CAC1C,4BAA6BoG,EAC7B,4BAA6Bgb,CAAA,CAC9B,EACD,aAAYzsB,EACZ,QAAA0rB,EACA,cAAgBnqB,GAAA,OAAU,OAAAe,EAAAqR,EAAU,UAAV,YAAArR,EAAmB,SAASf,IAEtD,SAAA,CAAA8I,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAD,CAAA,CAAS,EAClDC,EAAAA,IAACwC,GAAA,CAAO,UAAW8G,CAAA,CAAW,CAAA,CAAA,CAAA,CAGpC,CAIA,SAASmrC,GAAgBjzC,EAKtB,CACD,KAAM,CAAE,MAAA7L,EAAO,SAAA0B,EAAU,WAAAq9C,EAAY,SAAA71C,GAAa2C,EAC5C,CAAC+M,EAAW2B,CAAY,EAAIha,EAAAA,SAAS,EAAK,EAC1Cy+C,EAAS79C,EAAAA,OAAyB,IAAI,EACtC2K,EAAMkC,GAA6B9E,EAAU81C,CAAM,EAEzD,OACE30C,EAAAA,IAACmO,GAAA,CACC,UAAU,uCACV,QAAQ,WACR,UAAS,GACT,cAAe,EAAQxY,EACvB,UAAA4Y,EACA,kBAAoBrX,GAAU,CACxBy9C,EAAO,SAAWz9C,EAAM,gBAAkBA,EAAM,SAClDA,EAAM,eAAA,EACNy9C,EAAO,QAAQ,MAAA,EAEnB,EAEA,SAAA30C,EAAAA,IAAC,QAAA,CACE,GAAG00C,EACJ,IAAAjzC,EACA,KAAK,OACL,UAAU,kEACV,YAAY,WACZ,aAAa,MACb,MAAA9L,EACA,SAAA0B,EACA,QAAUH,GAAU,OAClBgZ,EAAa,EAAI,GACjBjY,EAAAy8C,GAAA,YAAAA,EAAY,UAAZ,MAAAz8C,EAAA,KAAAy8C,EAAsBx9C,EACxB,EACA,OAASA,GAAU,OACjBgZ,EAAa,EAAK,GAClBjY,EAAAy8C,GAAA,YAAAA,EAAY,SAAZ,MAAAz8C,EAAA,KAAAy8C,EAAqBx9C,EACvB,CAAA,CAAA,CACF,CAAA,CAGN,CAEO,SAAS09C,GAAoC,CAClD,cAAAC,EACA,eAAAC,EACA,OAAAC,EACA,oBAAAC,EACA,MAAA77C,EACA,YAAA87C,EACA,OAAAntC,EACA,QAAAmM,EACA,iBAAAihC,EACA,MAAAv/C,EACA,YAAA81C,EACA,UAAAzW,EACA,eAAAyT,EACA,mBAAA0M,EACA,UAAAr8C,EACA,aAAAs8C,EACA,YAAAC,EACA,WAAA/6C,EAAa,GACb,UAAA+5C,EACA,WAAAiB,EACA,MAAA1sC,EACA,SAAAia,EACA,YAAArpB,EAAc,GACd,WAAA+7C,EACA,iBAAAC,EACA,eAAAC,EACA,QAAA7L,CACF,EAAyB,CACvB,MAAM8L,EAAa,MAAM,QAAQ//C,CAAK,EAAIA,EAAQ,CAACA,CAAK,EAClDggD,EAAYx8C,EAAM,KAAMc,GAAM,CAAC,CAACA,EAAE,KAAK,EACvC27C,EAAcz8C,EAAM,QAAUi8C,EAAe,EAAI,GAEjDS,EAAa,CAAC,CAACR,GAAe,CAACM,GAAa,CAAC3gB,GAAa77B,EAAM,OAAS,EACzEoB,EAAiBs6C,GAAiB,IAClC,CAAE,WAAA95C,EAAY,SAAAC,EAAU,YAAA86C,EAAa,QAAAC,EAAS,SAAAp7C,CAAA,EAAaP,GAAe,CAC9E,UAAWy7C,EAAa18C,EAAM,OAAS,EACvC,WAAAmB,EACA,eAAAC,CAAA,CACD,EACKy7C,EAAiBl/C,EAAAA,OAAuB,IAAI,EAC5Cm/C,EAAgBtyC,GAA2BimC,EAASoM,CAAc,EAClEE,EAAcp/C,EAAAA,OAAuB,IAAI,EAIzCq/C,EAAc,CAClBz7B,EACA0H,GACAhb,GACA0U,MACmB,CACnB,GAAIu4B,EAAYD,GAAiBC,EAAW35B,CAAK,EAAI,OACrD,KAAM,SACN,gBAAiB0H,GACjB,gBAAiBhb,IAAY,OAE7B,eAAgByuC,EAAaD,EAAc,OAC3C,gBAAiBC,EAAan7B,EAAQ,EAAI,OAE1C,MAAOm7B,GAAcn7B,EAAQvhB,EAAM,OAAS,CAAE,OAAQmB,GAAe,OACrE,SAAA8M,GACA,SAAAgb,GACA,GAAGtG,GACH,UAAWxZ,EACT,4BACAwZ,GAAM,UACNy5B,GAAc76B,IAAUlhB,GAAe,mCAAA,CACzC,GAGIgsB,EAAa,CAACxsB,EAAkB0hB,KAAkB,WACtD,MAAMlZ,GAAQ20C,EACZz7B,GACAg7B,EAAW,KAAMzyB,IAAMA,KAAMjqB,EAAG,KAAK,EACrCA,EAAG,SACH,CACE,MAAOA,EAAG,MACV,QAAUyP,IAA4B,CAC/BzP,EAAG,UACNyyC,EAAYhjC,GAAGzP,CAAE,CAErB,EACA,eAAAyvC,EACA,SACE//B,EAAAA,KAAAkE,WAAA,CACG,SAAA,CAAA5T,EAAG,KACHA,EAAG,WAAagH,MAAC,OAAA,CAAK,UAAU,yCAA0C,SAAAhH,EAAG,WAAW,EAAU,IAAA,CAAA,CACrG,CAAA,CAEJ,EAEIoW,IAAM5P,IAAAvH,GAAAe,EAAG,MAAH,KAAAf,GAAUe,EAAG,QAAb,KAAAwG,GAAsBkb,GAElC,OAAO+tB,EACLzoC,EAAAA,IAACzJ,EAAM,SAAN,CAA0B,SAAAkyC,EAAejnC,EAAK,CAAA,EAA1B4N,EAA4B,EAEjDpP,MAACw0C,GAAA,CAA0B,GAAGhzC,IAAT4N,EAAgB,CAEzC,EAKMgnC,EAAe,IAAM,CACzB,MAAMliB,EAA2B,CAAA,EACjC,IAAImiB,GACAC,GACJ,MAAMC,GAAQ,IAAM,CAClB,GAAKD,GAGL,GAAIA,GAAI,QAAU,OACZA,GAAI,MAAQ,GACdpiB,EAAM,KAAKl0B,EAAAA,IAAC,KAAA,CAA8B,UAAU,iCAAiC,KAAK,cAAA,EAAtE,SAASs2C,GAAI,KAAK,EAAmE,CAAE,EAE7GpiB,EAAM,KAAK,GAAGoiB,GAAI,OAAO,MACpB,CACL,MAAM7nC,GAAU,GAAG4lC,CAAS,UAAUiC,GAAI,KAAK,GAC/CpiB,EAAM,YACH,KAAA,CAA8B,KAAK,QAAQ,kBAAiBzlB,GAAS,UAAU,2BAC9E,SAAA,CAAAzO,MAAC,OAAI,GAAIyO,GAAS,UAAU,iCACzB,YAAI,MACP,QACC,KAAA,CAAG,KAAK,eAAe,UAAU,mCAC/B,YAAI,OAAA,CACP,CAAA,CAAA,EANO,SAAS6nC,GAAI,KAAK,EAO3B,CAAA,CAEJ,CACF,EACA,OAAAn9C,EAAM,QAAQ,CAACH,GAAI0hB,KAAU,EACvB,CAAC47B,IAAOt9C,GAAG,QAAUq9C,MACvBE,GAAA,EACAF,GAAYr9C,GAAG,MACfs9C,GAAM,CAAE,MAAOt9C,GAAG,MAAO,MAAO0hB,GAAO,QAAS,EAAC,GAEnD47B,GAAI,QAAQ,KAAK9wB,EAAWxsB,GAAI0hB,EAAK,CAAC,CACxC,CAAC,EACD67B,GAAA,EACOriB,CACT,EAEM,CAACsiB,GAAcC,EAAe,EAAIlgD,EAAM,SAAA,EAIxC,CAACkV,GAASC,EAAU,EAAIxV,WAAA,EAqD9B,GApDAE,GAAoB,IAAM,CACxBsV,GAAW5S,GAAA,KAAAA,EAAa,SAAS,IAAI,CACvC,EAAG,CAACA,CAAS,CAAC,EAEd3C,EAAAA,UAAU,IAAM,CACV2R,GAAUotC,EAAiB,SAC7BuB,GAAgBvB,EAAiB,QAAQ,WAAW,CAExD,EAAG,CAACA,EAAkBptC,CAAM,CAAC,EAG7BvR,EAAM,UAAU,IAAM,CACpB,MAAM2C,EAAahC,IAAyB,CACtC4Q,GAAU5Q,GAAM,MAAQ,UAAY,CAACA,GAAM,kBAC7C+c,EAAA,CAEJ,EAEA,gBAAS,iBAAiB,UAAW/a,CAAS,EAEvC,IAAM,CACX,SAAS,oBAAoB,UAAWA,CAAS,CACnD,CACF,EAAG,CAAC4O,EAAQmM,CAAO,CAAC,EAIpB7d,GAAoB,IAAM,CACxB,GAAI,CAAC0R,GAAU,CAACytC,GAAc/7C,EAAc,GAAK,CAAC66C,EAChD,OAEF,MAAMqC,EAAWR,EAAY,QAC7B,GAAIL,GAAca,GAAYl9C,EAAcL,EAAM,OAAQ,CACxD,MAAM+Q,GAAM1Q,EAAcc,EACpB2J,GAASyyC,EAAS,cAAgBn8C,EAClCE,GACJyP,GAAMwsC,EAAS,UACXxsC,GACAA,GAAM5P,EAAao8C,EAAS,UAAYzyC,GACtCiG,GAAM5P,EAAa2J,GACnByyC,EAAS,UACbj8C,KAAci8C,EAAS,YACzBA,EAAS,UAAYj8C,GACrBE,EAAS,CAAE,cAAe,CAAE,UAAAF,EAAA,EAAa,EAE7C,CACA,MAAMuoB,GAAS,SAAS,eAAeoxB,GAAiBC,EAAW76C,CAAW,CAAC,EAC3EwpB,IACFsxB,GAAWtxB,GAAQgzB,EAAe,OAAO,CAE7C,EAAG,CAACluC,EAAQytC,EAAY/7C,EAAa66C,EAAWwB,EAAY18C,EAAM,OAAQmB,EAAYC,EAAgBI,CAAQ,CAAC,EAE3G,CAAC8Q,GACH,OAAO,KAGT,MAAMkrC,GAAavB,EACjBp1C,EAAAA,IAACw0C,GAAA,CAEE,GAAG2B,EAAYh9C,EAAM,OAAQ,GAAO,GAAO,CAC1C,MAAO,aACP,UAAW,mCACX,QAAUsP,GAA4B2sC,EAAa,SAAS3sC,CAAC,EAC7D,SAAU2sC,EAAa,IAAA,CACxB,CAAA,EANG,YAAA,EAQJ,KAEJ,OAAOnoC,GAAAA,aACLvE,EAAAA,KAACyiC,GAAA,CACC,IAAK8K,EACL,OAAAnuC,EACA,QAAAmM,EACA,cAAeihC,EAAiB,QAChC,WAAYJ,EACZ,0BAAwB,GAGxB,SAAS,eAIT,SAAU,GAGV,YAAc59C,GAAU,CAChBA,EAAM,kBAAkB,kBAC5BA,EAAM,eAAA,CAEV,EACA,MAAO,CACL,SAAUs/C,GACV,UAAW3B,GAAiB,OAC5B,UAAWA,EAAgB,OAAS,MAAA,EAGrC,SAAA,CAAAE,GACCrsC,EAAAA,KAAAkE,WAAA,CACE,SAAA,CAAA5M,EAAAA,IAAC,KAAA,CAAG,UAAU,iCACZ,SAAAA,EAAAA,IAACy0C,GAAA,CACC,MAAOQ,EACP,SAAWxsC,GAAMusC,GAAA,YAAAA,EAAsBvsC,EAAGA,EAAE,OAAO,OACnD,WAAY+sC,EACZ,SAAUC,CAAA,CAAA,EAEd,QACC1M,GAAA,CAAA,CAAY,CAAA,EACf,EAED/T,EACCh1B,EAAAA,IAAC,KAAA,CAAG,UAAU,kCACZ,SAAAA,EAAAA,IAAC07B,GAAA,CAAkB,KAAK,gBAAgB,QAAQ,WAAW,UAAU,iCAAA,CAAkC,EACzG,EACE,WACH,KAAA,CACC,SAAAhzB,EAAAA,KAAC,KAAA,CACC,GAAI2rC,EACJ,KAAK,UACL,UAAU,6BACV,kBAAiBiB,EACjB,aAAY1sC,EACZ,uBAAsBia,GAAY,OAClC,YAAWmS,GAAa,OAEvB,SAAA,CAAAA,EAAY,KAAO6gB,EAClB71C,EAAAA,IAAC,MAAG,KAAK,eAAe,UAAU,sCAChC,SAAAA,EAAAA,IAAC,MAAA,CACC,IAAKk2C,EACL,UAAU,sCACV,SAAU,GACV,MAAO,CAAE,UAAW37C,EAAgB,UAAW,MAAA,EAC/C,SAAAI,EAEA,SAAAqF,EAAAA,IAAC,OAAI,MAAO,CAAE,OAAQ81C,EAAa,SAAU,YAC3C,SAAA91C,EAAAA,IAAC,KAAA,CACC,KAAK,eACL,UAAU,kCACV,MAAO,CAAE,UAAW,cAAc+1C,CAAO,MAAO,UAAW,OAAQ,OAAQ,EAAG,QAAS,CAAA,EAEtF,SAAA58C,EAAM,MAAM4B,EAAYC,CAAQ,EAAE,IAAI,CAAChC,EAAIiB,KAAMurB,EAAWxsB,EAAI+B,EAAad,EAAC,CAAC,CAAA,CAAA,CAClF,CACF,CAAA,CAAA,CACF,CACF,EACE07C,EACFS,EAAA,EAEAj9C,EAAM,IAAI,CAACH,EAAI0hB,KAAU8K,EAAWxsB,EAAI0hB,EAAK,CAAC,EAE/Ci8B,EAAA,CAAA,CAAA,EAEL,EACC,CAAC3hB,GAAa,CAAC77B,EAAM,QAAU,CAACi8C,EAC/Bp1C,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAkC,SAAAm1C,GAAsB,oBAAoB,EACxF,IAAA,CAAA,CAAA,EAEN1pC,EAAA,CAEJ,CC5cO,SAASmrC,GAAYr9C,EAAes9C,EAAoC,CAC7E,QAASn8B,EAAQ,EAAGA,EAAQnhB,EAAOmhB,IACjC,GAAIm8B,EAAUn8B,CAAK,EACjB,OAAOA,EAGX,MAAO,EACT,CAGO,SAASo8B,GAAWv9C,EAAes9C,EAAoC,CAC5E,QAASn8B,EAAQnhB,EAAQ,EAAGmhB,GAAS,EAAGA,IACtC,GAAIm8B,EAAUn8B,CAAK,EACjB,OAAOA,EAGX,MAAO,EACT,CAOO,SAASq8B,GAAWx9C,EAAes9C,EAA4BvzB,EAAc0zB,EAAuB,CACzG,GAAI1zB,EAAO,EACT,OAAO0zB,EAAQ,EAAIJ,GAAYr9C,EAAOs9C,CAAS,EAAIC,GAAWv9C,EAAOs9C,CAAS,EAEhF,MAAM/qB,EAAYkrB,EAAQ,EAAI,EAAI,GAClC,IAAIC,EAAS3zB,EACTswB,EAAO,KAAK,IAAIoD,CAAK,EACzB,QAASt8B,EAAQ4I,EAAOwI,EAAWpR,GAAS,GAAKA,EAAQnhB,GAASq6C,EAAO,EAAGl5B,GAASoR,EAC/E+qB,EAAUn8B,CAAK,IACjBu8B,EAASv8B,EACTk5B,KAGJ,OAAOqD,CACT,CAOO,SAASC,GAAYC,EAAiBN,EAA4B7L,EAAe1nB,EAAsB,OAC5G,MAAM8zB,EAAQpM,EAAM,YAAA,EACdqM,EAAW,MAAM,KAAKD,CAAK,EAAE,MAAOx3B,GAASA,IAASw3B,EAAM,OAAO,CAAC,CAAC,EACrEh/C,EAASi/C,EAAWD,EAAM,OAAO,CAAC,EAAIA,EACtC7kC,EAAQ8kC,EAAW/zB,EAAO,EAAI,KAAK,IAAIA,EAAM,CAAC,EACpD,QAASnpB,EAAO,EAAGA,EAAOg9C,EAAM,OAAQh9C,IAAQ,CAC9C,MAAMugB,GAASnI,EAAQpY,GAAQg9C,EAAM,OACrC,GAAIN,EAAUn8B,CAAK,KAAKziB,EAAAk/C,EAAMz8B,CAAK,IAAX,MAAAziB,EAAc,cAAc,WAAWG,IAC7D,OAAOsiB,CAEX,CACA,MAAO,EACT,CCjDA,MAAM48B,GAAmB91C,GAA2CxB,MAACc,IAAK,KAAK,kBAAmB,GAAGU,EAAO,EAEtG+1C,GAAa/1C,GAA2CxB,EAAAA,IAACc,GAAA,CAAK,KAAK,QAAQ,KAAM,GAAK,GAAGU,CAAA,CAAO,EAEtG,SAASg2C,GAAUtgD,EAA6B,CAC9CA,EAAM,eAAA,EACNA,EAAM,gBAAA,CACR,CAGA,SAASugD,GAAkBt+C,EAAuBxD,EAAkD,CAClG,GAAI,MAAM,QAAQA,CAAK,EACrB,OAAOwD,EAAM,OAAQ0tB,GAASlxB,EAAM,SAASkxB,EAAK,KAAK,CAAC,EAE1D,GAAIlxB,GAAS,MAAQA,IAAU,GAC7B,MAAO,CAAA,EAET,MAAMkxB,EAAO1tB,EAAM,KAAM0tB,GAASA,EAAK,QAAUlxB,CAAK,EACtD,OAAOkxB,EAAO,CAACA,CAAI,EAAI,CAAA,CACzB,CAIA,SAAS6wB,GAAYv+C,EAAuBw+C,EAAoC,CAC9E,GAAI,CAACA,EACH,OAAOx+C,EAET,MAAMsoC,EAAU,IAAI,OAAOkW,EAAW,QAAQ,sBAAuB,MAAM,EAAG,GAAG,EACjF,OAAOx+C,EAAM,OAAQH,GAAOA,EAAG,KAAK,OAAOyoC,CAAO,IAAM,EAAE,CAC5D,CAGA,SAASmW,GAAe1gD,EAA4B,CAClD,OAAOA,EAAM,IAAI,SAAW,GAAKA,EAAM,MAAQ,KAAO,CAACA,EAAM,QAAU,CAACA,EAAM,SAAW,CAACA,EAAM,OAClG,CAoFO,MAAM2gD,GAAc92C,EAAAA,WAA8C,SAAqBS,EAAOC,EAAK,CACxG,KAAM,CACJ,UAAAT,EACA,MAAOqqC,EACP,aAAAj0C,EACA,SAAAC,EACA,SAAA+P,EACA,SAAAuI,EACA,KAAA9O,EACA,SAAAgiB,EACA,cAAAgyB,EACA,eAAAC,EACA,mBAAAK,EACA,cAAA2C,EACA,OAAA/C,EACA,MAAAgD,EACA,UAAWC,EACX,MAAA3pC,EACA,MAAAlV,EACA,MAAAyP,EACA,QAAA1B,EAAU,WACV,KAAA/F,EAAO,SACP,UAAA8H,EACA,WAAA6E,EACA,SAAAmqC,EACA,YAAAC,EACA,UAAAljB,EACA,OAAApnB,EACA,aAAArG,EACA,oBAAA4wC,EACA,eAAA1P,EACA,UAAA2P,EACA,UAAAC,EACA,SAAAC,EACA,YAAAjD,EACA,WAAA/6C,EACA,aAAcqvB,EACd,GAAA1b,EACA,GAAGpL,CAAA,EACDrB,EACE6O,EAAStC,GAAcD,EAAY,CAAE,OAAAF,EAAQ,EAC7C,CAAC9F,EAAQonB,CAAS,EAAIh5B,EAAAA,SAAkB,EAAK,EAC7C,CAACqiD,GAAYC,EAAa,EAAItiD,EAAAA,SAA2BkB,CAAY,EAGrE,CAACqhD,GAAkBC,EAAmB,EAAIxiD,EAAAA,SAAuB,IAAMuhD,GAAkBt+C,EAAO/B,CAAY,CAAC,EAC7G,CAAC69C,GAAa0D,CAAc,EAAIziD,EAAAA,SAAS,EAAE,EAG3C,CAACsD,GAAao/C,EAAc,EAAI1iD,EAAAA,SAAS,EAAE,EAC3C,CAACq/C,GAAYsD,EAAa,EAAI3iD,EAAAA,SAAS,EAAK,EAC5C4iD,GAAehiD,EAAAA,OAAgE,CAAE,KAAM,GAAI,EAG3FQ,GAAe+zC,IAAc,OAC7B6J,GAAmBp+C,EAAAA,OAAwB,IAAI,EAC/CiiD,GAAajiD,EAAAA,OAAwB,IAAI,EACzCkiD,GAAmBr1C,GAA4BlC,EAAKs3C,EAAU,EAC9DE,GAAmBniD,EAAAA,OAAwB,IAAI,EAC/C2+C,GAAiB3+C,EAAAA,OAAyB,IAAI,EAC9C8yC,GAAU9yC,EAAAA,OAAuB,IAAI,EACrCoiD,EAAqBpiD,EAAAA,OAAyB,IAAI,EAClDnB,EAAQ2B,GAAe+zC,EAAYkN,GAMnCY,GAAgBv+C,EAAAA,QACpB,IAAOtD,GAAemgD,GAAkBt+C,EAAOxD,CAAK,EAAI8iD,GACxD,CAACnhD,GAAc6B,EAAOxD,EAAO8iD,EAAgB,CAAA,EAGzClqC,GAAY3T,EAAAA,QAAQ,IAAMo9C,GAAiBlwC,EAAQ,CAACkwC,EAAelwC,CAAM,CAAC,EAQ1EC,GAAS7P,GAAA,EACTuW,GAAU,GAAG1G,EAAM,SACnBqxC,GAAU,GAAGrxC,EAAM,SACnBssC,GAAY,GAAGtsC,EAAM,WACrBsxC,GAAWtB,EAAQoB,GAAc,IAAI,CAACx+B,EAAGD,KAAU,GAAG0+B,EAAO,IAAI1+B,EAAK,EAAE,EAAI,CAAC0+B,EAAO,EACpFE,GAAUvB,EAAQsB,GAAW,CAAA,EAC7BE,GAAoB5vB,EACtB,OACA/gB,GAAS,CAACgF,EACR,CAACa,GAAS,GAAG6qC,EAAO,EAAE,KAAK,GAAG,EAC9BA,GAAQ,OAAS,EACfA,GAAQ,KAAK,GAAG,EAChB,CAACvB,GAASoB,GAAc,OAAS,EAC/BC,GACA,OAGJ9D,GAAa3rB,EACf,OACA/gB,GAAS,CAACgF,EACR,CAACa,GAAS,GAAG4qC,EAAQ,EAAE,KAAK,GAAG,EAC/BtB,GAASsB,GAAS,OAAS,EACzBA,GAAS,KAAK,GAAG,EACjB,OAKFG,GAAiBzE,IAAW,IAAQ,CAACplC,EAIrC8pC,GAAiBxB,EAAW9+C,EAAQu+C,GAAYv+C,EAAO87C,EAAW,EAClEG,EACJiD,GAAapD,IAAe,CAAC97C,EAAM,KAAMc,GAAMA,EAAE,KAAK,gBAAkB,OAAOg7C,EAAW,EAAE,YAAA,CAAa,EACrG,CACE,KAAM,YAAYA,EAAW,IAC7B,SAAW/9C,GAAgC,CACzCohD,GAAA,MAAAA,EAAW,OAAOrD,EAAW,EAAG/9C,GAChCyhD,EAAe,EAAE,EACjBe,GAAA,CACF,CAAA,EAEF,OACAC,GAAcvE,EAAeqE,GAAe,OAAS,GACrD7D,EAAc6D,GAAe,QAAUrE,EAAe,EAAI,GAE1DwE,EAAmBl/B,GACvBA,GAAS,IACRA,IAAUi/B,IAAgB,CAAC3kB,GAAata,EAAQ++B,GAAe,QAAU,CAACA,GAAe/+B,CAAK,EAAE,UAC7Fm/B,EAAgB/xC,GAAU8xC,EAAgBpgD,EAAW,EAAIA,GAAc,GACvEsgD,GAAmBvE,IAAcsE,GAAiB,EAAIzF,GAAiBC,GAAWwF,CAAa,EAAI,OAEnGE,GAAkBlzB,GACtB,MAAM,QAAQlxB,CAAK,EAAIA,EAAM,SAASkxB,EAAK,KAAK,EAAIlxB,GAAS,MAAQA,IAAU,IAAMA,IAAUkxB,EAAK,MAIhGmzB,GAAgB,IAAM,CAC1B,MAAM53B,EAAWq3B,GAAe,UAAUM,EAAc,EACxD,OAAOH,EAAgBx3B,CAAQ,EAAIA,EAAWw0B,GAAYhB,EAAagE,CAAe,CACxF,EAKMK,GAAgB,IAAM,CAC1B,MAAM73B,EAAWq3B,GAAe,UAAUM,EAAc,EACxD,OAAOH,EAAgBx3B,CAAQ,EAAIA,EAAW,EAChD,EAEM83B,GAAW,CAACxhD,EAAgByhD,KAAwB,CACxDvB,GAAelgD,CAAM,EACrBmgD,GAAcsB,EAAU,EACxBjrB,EAAU,EAAI,CAChB,EAIMwqB,GAAY,IAAM,WAClBzhD,EAAA2xC,GAAQ,UAAR,MAAA3xC,EAAiB,SAAS2xC,GAAQ,QAAQ,cAAc,kBAC1DpqC,GAAAu5C,GAAW,UAAX,MAAAv5C,GAAoB,SAEtB0vB,EAAU,EAAK,EACf0pB,GAAe,EAAE,EACjBC,GAAc,EAAK,CACrB,EAEMtvC,GAAerS,GAA4C,QAE3DA,EAAM,SAAW,IAGrBA,EAAM,eAAA,GACNe,GAAA8gD,GAAW,UAAX,MAAA9gD,GAAoB,QAChB6P,EACF4xC,GAAA,EAEAQ,GAASD,GAAA,EAAiB,EAAK,EAEnC,EAEM3pC,GAAWpZ,GAA6C,QAGxDsiD,IAAkBtiD,EAAM,SAAWA,EAAM,iBAC3Ce,GAAAw9C,GAAe,UAAf,MAAAx9C,GAAwB,QAE5B,EAKMmiD,GAAoBtiD,GAAuB,CAC1CR,IACHohD,GAAoB5gD,CAAI,CAE5B,EAEMuiD,GAAc,CAACnjD,EAA6BvB,KAA4B,CAC5E0B,GAAA,MAAAA,EAAWH,EAAO,CAAE,GAAGsK,EAAO,MAAA7L,GAAO,KAAMkL,GAAQ,SAC9CvJ,IACHkhD,GAAc7iD,EAAK,CAEvB,EAIM2kD,GAAa,CAACpjD,EAA6B2vB,GAAoB0zB,KAAuB,CAC1F,IAAIC,GACAC,GACJ,GAAI53B,EAAU,CACZ,MAAM6yB,GAAa,MAAM,QAAQ//C,CAAK,EAAIA,EAAQ,CAACA,CAAK,EAAE,OAAO,OAAO,EACxE6kD,GAAW9E,GAAW,MAAA,EACtB+E,GAAkBtB,GAAc,MAAA,EAChC,MAAMuB,GAAYhF,GAAW,UAAW18C,IAAOA,KAAO6tB,GAAK,KAAK,EAE5D6zB,KAAc,IAChBF,GAAS,KAAK3zB,GAAK,KAAK,EACxB4zB,GAAgB,KAAK5zB,EAAI,IAEzB2zB,GAAS,OAAOE,GAAW,CAAC,EAC5BD,GAAgB,OAAOC,GAAW,CAAC,EAEvC,KAAO,CACL,GAAI/kD,IAAUkxB,GAAK,OAAS,CAAC0zB,GAC3B,OAEFC,GAAW7kD,IAAUkxB,GAAK,MAAQ,GAAKA,GAAK,MAC5C4zB,GAAkB,CAAC5zB,EAAI,CACzB,CAEIouB,IACF0D,EAAe,EAAE,EAGnByB,GAAiBK,EAAe,EAChCJ,GAAYnjD,EAAOsjD,EAAQ,CAC7B,EAEM/O,GAAc,CAACv0C,EAA6B2vB,KAAuB,QACvEyzB,GAAWpjD,EAAO2vB,GAAM,EAAI,EAExBhE,EAEF+1B,GAAez/C,EAAM,QAAQ0tB,EAAI,CAAC,GAElC6yB,GAAA,GACAzhD,GAAA8gD,GAAW,UAAX,MAAA9gD,GAAoB,QAExB,EAIM0iD,GAAgBzjD,GAAgC,CAC/Cq+C,KAGDsE,IAAkBF,GACpBvE,GAAA,MAAAA,EAAc,SAASl+C,GACd2iD,GAAiB,IAC1BS,GAAWpjD,EAAOuiD,GAAeI,CAAa,EAAG,EAAK,EAClDh3B,EACF+1B,GAAe3D,GAAc97C,EAAM,QAAQsgD,GAAeI,CAAa,CAAC,EAAIA,CAAa,EAEzFH,GAAA,GAGN,EAEMkB,GAAa,CAAC1jD,EAA4BwjB,KAAkB,CAChExjB,EAAM,eAAA,EACFwjB,IAAS,GACXk+B,GAAel+B,EAAK,EAEtBm+B,GAAc,EAAI,CACpB,EAGMgC,GAAazrC,GAAgB,CACjC,MAAM46B,GAAQ8O,GAAa,QAC3B,aAAa9O,GAAM,KAAK,EACxBA,GAAM,MAAQ56B,EACd46B,GAAM,MAAQ,WAAW,IAAM,CAC7BA,GAAM,KAAO,EACf,EAAG,GAAG,EACN,MAAMmN,GAAQsC,GAAe,IAAK5yB,IAASA,GAAK,IAAI,EACpD,OAAOqwB,GAAYC,GAAOyC,EAAiB5P,GAAM,KAAM6P,CAAa,CACtE,EAEA1jD,EAAAA,UAAU,IAAM,CACd,MAAM6zC,EAAQ8O,GAAa,QAC3B,MAAO,IAAM,aAAa9O,EAAM,KAAK,CACvC,EAAG,CAAA,CAAE,EAML,MAAM8Q,GAAoB,CAAC5jD,EAAyC6jD,KAAuB,CACzF,KAAM,CAAE,IAAA3rC,IAAQlY,EAChB,GAAIkQ,GAAYuI,GAAYzY,EAAM,SAAWA,EAAM,QACjD,OAEF,MAAM8jD,GAAYD,KAAS,UAE3B,GAAI,CAACjzC,EAAQ,CACX,GAAIsH,KAAQ,aAAeA,KAAQ,WAAaA,KAAQ,SAAY4rC,IAAa5rC,KAAQ,IACvFlY,EAAM,eAAA,EACNgjD,GAASF,GAAA,EAAiB,EAAI,UACrBgB,KAAc5rC,KAAQ,QAAUA,KAAQ,OACjDlY,EAAM,eAAA,EACNgjD,GACE9qC,KAAQ,OAASwnC,GAAYhB,EAAagE,CAAe,EAAI9C,GAAWlB,EAAagE,CAAe,EACpG,EAAA,UAEOoB,IAAa,CAACjG,GAAU6C,GAAe1gD,CAAK,EAAG,CACxDA,EAAM,eAAA,EACN,MAAMyqC,GAAQkZ,GAAUzrC,EAAG,EAC3B8qC,GAASvY,IAAS,EAAIA,GAAQqY,GAAA,EAAiB,EAAI,CACrD,CACA,MACF,CAEA,GAAI5qC,KAAQ,YACVwrC,GAAW1jD,EAAOA,EAAM,OAAS2iD,EAAgB9C,GAAWnB,EAAagE,EAAiBC,EAAe,CAAC,CAAC,UAClGzqC,KAAQ,WAAalY,EAAM,OACpCA,EAAM,eAAA,EACD2rB,GACH83B,GAAazjD,CAAK,EAEpBwiD,GAAA,UACStqC,KAAQ,UACjBwrC,GAAW1jD,EAAO6/C,GAAWnB,EAAagE,EAAiBC,EAAe,EAAE,CAAC,UACpEzqC,KAAQ,YAAcA,KAAQ,SACvCwrC,GAAW1jD,EAAO6/C,GAAWnB,EAAagE,EAAiBC,EAAezqC,KAAQ,WAAa,GAAK,GAAG,CAAC,UAC/F4rC,KAAc5rC,KAAQ,QAAUA,KAAQ,OACjDwrC,GACE1jD,EACAkY,KAAQ,OAASwnC,GAAYhB,EAAagE,CAAe,EAAI9C,GAAWlB,EAAagE,CAAe,CAAA,UAE7FxqC,KAAQ,SAAY4rC,IAAa5rC,KAAQ,IAClDlY,EAAM,eAAA,EAGNyjD,GAAazjD,CAAK,EAClB2hD,GAAc,EAAI,EACd,CAACh2B,GAAYg3B,EAAgB,GAAKmB,IACpCtB,GAAA,UAEOtqC,KAAQ,SAEjBlY,EAAM,eAAA,EACNwiD,GAAA,UACStqC,KAAQ,MACb2rC,KAAS,aAGX7jD,EAAM,eAAA,EACG8jD,IAAa,CAACn4B,GACvB83B,GAAazjD,CAAK,EAEpBwiD,GAAA,UACSsB,IAAa,CAACjG,GAAU6C,GAAe1gD,CAAK,EAAG,CACxD,MAAMyqC,GAAQkZ,GAAUzrC,EAAG,EAC3BwrC,GAAW1jD,EAAOyqC,EAAK,CACzB,CACF,EAKMzoC,GAAahC,GAAgD,CAC7DA,EAAM,SAAWA,EAAM,eAAiBsiD,IAG5CsB,GAAkB5jD,EAAO,SAAS,CACpC,EAIAf,EAAAA,UAAU,IAAM,CACVwZ,GAAY7H,GACdonB,EAAU,EAAK,CAEnB,EAAG,CAACvf,EAAU7H,CAAM,CAAC,EAErB3R,EAAAA,UAAU,IAAM,EACV,CAACoY,IAAcwmC,IAAW,QAAU,CAACjtC,KACvC6wC,EAAe,EAAE,EACjBT,GAAA,MAAAA,IAEJ,EAAG,CAAC3pC,GAAWwmC,EAAQjtC,EAAQowC,CAAW,CAAC,EAI3C/hD,EAAAA,UAAU,IAAM,CACViR,GAAYU,GACdonB,EAAU,EAAK,CAEnB,EAAG,CAAC9nB,EAAUU,CAAM,CAAC,EAGrB1R,GAAoB,IAAM,OACpB0R,GAAUitC,IAAW,UACvB98C,EAAAihD,EAAmB,UAAnB,MAAAjhD,EAA4B,QAEhC,EAAG,CAAC6P,EAAQitC,CAAM,CAAC,EAKnB5+C,EAAAA,UAAU,IAAM,CACTmB,IACHohD,GAAoBjB,GAAkBt+C,EAAOxD,CAAK,CAAC,CAEvD,EAAG,CAAC2B,GAAc3B,EAAOwD,CAAK,CAAC,EAE/B/C,GAAoB,IAAM,CACpB6iD,GAAiB,UACnBA,GAAiB,QAAQ,WAAaA,GAAiB,QAAQ,YAEnE,EAAG,CAACtjD,CAAK,CAAC,EAEV,MAAMq/C,GAAuB99C,GAA+C,CAC1E,MAAMoc,GAAOpc,EAAM,OAAO,MAC1ByhD,EAAerlC,EAAI,EACnB2kC,GAAA,MAAAA,EAAW/gD,GAGX,MAAM48B,GAAO4jB,GAAYv+C,EAAOma,EAAI,EAC9B2nC,GAAY5C,GAAa/kC,IAAQ,CAACna,EAAM,KAAMc,IAAMA,GAAE,KAAK,YAAA,IAAkBqZ,GAAK,aAAa,EAC/F/Z,GAAQ0+C,EAAW,EAAInkB,GAAK,QAAUmnB,GAAY,EAAI,GAC5DrC,GAAehC,GAAYr9C,GAAQmhB,IAAUA,IAASoZ,GAAK,QAAU,CAACA,GAAKpZ,EAAK,EAAE,QAAQ,CAAC,EAC3Fm+B,GAAc,EAAI,EACb/wC,GACHonB,EAAU,EAAI,CAElB,EAKMgsB,GAAYhkD,GAChBA,EAAM,cAAc,SAASA,EAAM,cAAc,cAAc,aAAa,EAExEikD,GAAgBC,GAAoClkD,IAAgC,QACxF,GAAI,MAAM,QAAQvB,CAAK,EAAG,CACxB,MAAM0lD,GAAUH,GAAShkD,EAAK,EACxBsjD,GAAW7kD,EAAM,OAAQA,IAAUylD,IAAiBzlD,EAAK,EAC/D0kD,GAAYnjD,GAAOsjD,EAAQ,EAC3B,MAAMc,GAAmBnC,GAAc,OAAQngD,IAAOA,GAAG,QAAUoiD,CAAY,EAC/EhB,GAAiBkB,EAAgB,EAC7BD,MAASpjD,GAAA8gD,GAAW,UAAX,MAAA9gD,GAAoB,QACnC,CACF,EAEMsjD,GAAmBrkD,GAA4B,QACnD,MAAMmkD,GAAUH,GAAShkD,CAAK,EAC9BmjD,GAAYnjD,EAAO,EAAE,EACrBkjD,GAAiB,CAAA,CAAE,EACfiB,MAASpjD,GAAA8gD,GAAW,UAAX,MAAA9gD,GAAoB,QACnC,EAEA,IAAIujD,GAEJ,MAAM94C,GAAUJ,EAAG,oBAAqBtB,EAAW,CACjD,4BAA6BkG,IAAY,UAAY0B,EACrD,8BAA+BxB,EAC/B,4BAA6B2tC,EAC7B,4BAA6BnnC,CAAA,CAC9B,EAEGmqC,EACFyD,GAAgBrC,GAAc,IAAI,CAAC,CAAE,IAAA/pC,EAAK,MAAAzZ,GAAO,KAAA2d,IAAQoH,KACvD1a,EAAAA,IAAC8hB,GAAA,CAEC,MAAOxO,GACP,QAAS+lC,GAAS3+B,EAAK,EACvB,gBAAiB,UAAUpH,EAAI,GAC/B,KAAMnS,IAAS,QAAU,QAAU,SAEnC,SAAUwO,EAAW,OAAYwrC,GAAaxlD,EAAK,EACnD,kBAAmB6hD,GACnB,SAAApwC,CAAA,EARKgI,GAAOzZ,EAAA,CAUf,EAED6lD,GAAgBrC,GAAc,IAAKngD,GAAOA,EAAG,IAAI,EAAE,KAAK,IAAI,EAI9D,MAAMyiD,IACF,MAAM,QAAQ9lD,CAAK,GAAKA,EAAM,OAAS,GAAOyiD,GAAae,GAAc,OAAS,IAAO,CAAC/xC,GAAY,CAACuI,EAIrG+rC,GAAgB,CACpB,KAAM,WACN,gBAAiB,UACjB,gBAAiB5zC,EACjB,gBAAiBA,EAASusC,GAAY,MAAA,EAGxC,OACE3rC,EAAAA,KAAAkE,WAAA,CACE,SAAA,CAAA5M,EAAAA,IAACmO,GAAA,CACC,QAAAM,GACA,MAAA7F,EACA,WAAAkF,EACA,aAAcuC,EAAO,GACrB,QAAAnJ,EACA,SAAAE,EACA,UAAW9E,EAAGtB,EAAWG,IAAS,UAAY,wBAAwBA,CAAI,EAAE,EAC5E,MAAAkN,EACA,UAAApF,EACA,cAAe,CAAC,CAACkwC,GAAc,QAAU,CAAC,CAAClE,GAC3C,UAAA1mC,GACA,OAAAX,EACC,GAAG/K,EAMJ,SAAA6F,EAAAA,KAAC,OAAA,CAAK,IAAKwsC,GAAkB,UAAWxyC,GAAS,YAAa0E,GAAYuI,EAAW,OAAYpG,GAC/F,SAAA,CAAAb,EAAAA,KAAC,OAAA,CAAK,UAAU,oCAAoC,IAAKuwC,GACtD,SAAA,CAAAlB,GAAS/3C,EAAAA,IAAC,OAAA,CAAK,UAAU,4BAA6B,SAAAw7C,GAAc,EACrE9yC,EAAAA,KAAC,OAAA,CACC,IAAKswC,GACL,GAAA/qC,EACA,UAAU,6BACV,SAAU7G,EAAW,OAAYoyC,GAAiB,GAAK,EACtD,GAAIA,GACD,OACA,CACE,GAAGkC,GACH,kBAAmBnC,GACnB,aAAc5vB,EACd,wBAAyBorB,IAAW,OAAS,OAAY+E,GACzD,gBAAiB1yC,GAAY,OAC7B,gBAAiBuI,GAAY,OAC7B,mBAAoBU,EAAO,WAAA,EAEjC,QAAAC,GACA,UAAApX,GACA,cAAY,eAEX,SAAA,CAAA,CAAC6+C,GAASyD,IACTx7C,EAAAA,IAAC,OAAA,CAAK,GAAIo5C,GAAS,UAAU,4BAC1B,SAAAoC,EAAA,CACH,EAEDzG,GAAU,OAAOA,GAAW,WAAa,CAACplC,GACzCjH,OAAC,OAAA,CAAK,UAAU,4BACd,SAAA,CAAA1I,EAAAA,IAAC,OAAA,CAAK,UAAU,iCAAkC,SAAAi1C,GAAY,EAC9Dj1C,EAAAA,IAAC,QAAA,CACC,UAAU,kCACV,IAAKy1C,GACL,KAAK,OACL,SAAAruC,EACA,MAAO6tC,GACN,GAAGyG,GACJ,oBAAkB,OAClB,wBAAuB5B,GACvB,aAAa,MACb,aAAYnwB,EACZ,kBAAiB2rB,GACjB,mBAAkBjlC,EAAO,YACzB,SAAU2kC,GACV,YAAc99C,GAA8C,CAC1DA,EAAM,gBAAA,EACD4Q,GACHoyC,GAASD,GAAA,EAAiB,EAAK,CAEnC,EACA,UAAY/iD,GAAU,CACpB4jD,GAAkB5jD,EAAO,QAAQ,EAI7BA,EAAM,MAAQ,UAChBA,EAAM,gBAAA,CAEV,EACA,cAAY,cAAA,CAAA,CACd,CAAA,CACF,CAAA,CAAA,CAAA,CAEJ,EACF,EACAwR,EAAAA,KAAC,OAAA,CAAK,UAAU,6BACb,SAAA,CAAA+yC,IACCz7C,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,2BACV,aAAW,kBACX,QAASu7C,GACT,YAAa/D,GAEb,eAACD,GAAA,CAAU,UAAWj1C,EAAG,0BAA2B,gCAAgC,CAAA,CAAG,CAAA,CAAA,EAG1FiF,EACA,CAAC4wC,GACAn4C,EAAAA,IAACs3C,GAAA,CACC,UAAWh1C,EAAG,0BAA2B,iCAAkC,CACzE,kCAAmCwF,EACnC,mCAAoCyG,GACpC,iCAAkCF,CAAA,CACnC,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,EAEFrO,EAAAA,IAAC40C,GAAA,CACC,iBAAAM,GACA,QAAAtL,GACA,cAAAiL,EACA,eAAAC,EACA,OAAQC,IAAW,OACnB,oBAAAC,GACA,eAAgBkE,EAChB,iBAAkB,CAChB,GAAGwC,GACH,oBAAqB,OACrB,wBAAyB5B,GACzB,kBAAmBP,GACnB,aAAc5vB,EACd,UAAYzyB,GAAU4jD,GAAkB5jD,EAAO,YAAY,CAAA,EAE7D,eAAAuxC,EACA,MAAOgR,GACP,YAAAxE,GACA,OAAAntC,EACA,QAAS4xC,GACT,YAAAjO,GACA,MAAA91C,EACA,UAAAq/B,EACA,mBAAAmgB,EACA,UAAW2C,EACX,YAAAzC,EACA,WAAA/6C,EACA,aAAA86C,EACA,UAAAf,GACA,WAAY1qB,EAAY,OAAY/gB,GAAS,CAACgF,EAASa,GAAU8qC,GACjE,MAAO5vB,EACP,SAAA9G,EACA,YAAag3B,EACb,WAAAtE,EAAA,CAAA,CACF,EACF,CAEJ,CAAC,ECjxBM,SAASoG,GAAUhmD,EAAe2yB,EAAavS,EAAa,CACjE,OAASpgB,EAAQ2yB,IAAQvS,EAAMuS,GAAQ,GACzC,CAEO,SAASgrB,GAAUvvC,EAAgB,CACxC,OAAQ,GAAGA,CAAM,GAAG,MAAM,GAAG,EAAE,CAAC,GAAK,IAAI,MAC3C,CAEO,SAAS/J,GAAMrE,EAAe2yB,EAAavS,EAAa,CAC7D,OAAO,KAAK,IAAIuS,EAAK,KAAK,IAAI3yB,EAAOogB,CAAG,CAAC,CAC3C,CAEO,SAAS6lC,GAAe73C,EAAgBuvC,EAAY,EAAG,CAC5D,MAAMuI,EAAS,KAAK,IAAI,GAAIvI,CAAS,EAErC,OAAO,KAAK,MAAMvvC,EAAS83C,CAAM,EAAIA,CACvC,CAEO,SAASC,GAAe9lD,EAAasyB,EAAavS,EAAa5b,EAAe,CACnF,GAAIA,GAAQ,MAAQA,GAAQ,EAC1B,OAAOH,GAAMhE,EAAKsyB,EAAKvS,CAAG,EAG5B,MAAMgmC,EAAOzI,GAAUn5C,CAAI,EAErB6hD,EAAkBJ,GAAe,KAAK,OAAO5lD,EAAMsyB,GAAOnuB,CAAI,EAAIA,EAAM4hD,CAAI,EAE5EE,EAAiBL,GAAe,KAAK,OAAO7lC,EAAMuS,GAAOnuB,CAAI,EAAIA,EAAM4hD,CAAI,EAEjF,OAAOzzB,EAAMtuB,GAAMgiD,EAAiB,EAAGC,CAAc,CACvD,CAEO,SAASC,GAAQvmD,EAAe2tB,EAAwB2O,EAAsBrzB,EAA6B,CAAA,EAAI,CACpH,MAAMu9C,GAAWxmD,EAAQ2tB,EAAK,CAAC,IAAMA,EAAK,CAAC,EAAIA,EAAK,CAAC,IAAO2O,EAAG,CAAC,EAAIA,EAAG,CAAC,GAAKA,EAAG,CAAC,EAEjF,OAAO6pB,GAAeK,EAAQlqB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGrzB,EAAQ,IAAI,CAC1D,CAEO,SAAS2E,GAAOrM,EAAoD,CACzE,OAAIA,aAAiB,WACZA,EAAM,QAEXA,aAAiB,WACZA,EAAM,eAAe,CAAC,EAAE,QAE1B,CACT,CAEO,SAASsM,GAAOtM,EAAoD,CACzE,OAAIA,aAAiB,WACZA,EAAM,QAEXA,aAAiB,WACZA,EAAM,eAAe,CAAC,EAAE,QAE1B,CACT,CCUA,MAAMklD,GAAc,CAAC,UAAW,SAAS,EAEzC,SAASC,GACPC,EACAh0B,EACAvS,EACA5b,EACc,CACd,GAAI,CAACmiD,EACH,MAAO,CAAA,EAET,GAAI,MAAM,QAAQA,CAAK,EACrB,OAAOA,EAET,MAAMC,EAAIpiD,GAAQA,EAAO,EAAIA,GAAQ4b,EAAMuS,GAAO,GAC5C2uB,EAAuB,CAAA,EAC7B,QAASh0B,EAAIqF,EAAKrF,GAAKlN,EAAM,KAAMkN,GAAKs5B,EACtCtF,EAAO,KAAK,CAAE,MAAO,KAAK,MAAMh0B,EAAI,GAAG,EAAI,IAAK,EAElD,OAAOg0B,CACT,CAEA,MAAMuF,GAAcjmD,EAAM,WAAyC,SAAqBiL,EAAOC,EAAK,CAClG,KAAM,CACJ,aAAArK,EACA,MAAOi0C,EACP,SAAAh0C,EACA,IAAAixB,EAAM,EACN,IAAAvS,EAAM,IACN,KAAAlV,EACA,SAAAuG,EAAW,GACX,UAAApG,EACA,KAAA7G,EACA,MAAAyO,EACA,kBAAmB6zC,EACnB,WAAA3uC,EACA,MAAAO,EACA,KAAAlN,EAAO,SACP,MAAAE,EAAQ,UACR,YAAA3H,EAAc,aACd,MAAA4iD,EACA,iBAAAI,EACA,aAAc/yB,EAGd,MAAAwb,EACA,QAAAj+B,EACA,WAAAy1C,EACA,UAAAC,EAGA,YAAa7zC,EACb,GAAGlG,CAAA,EACDrB,EACE6O,EAAStC,GAAcD,CAAU,EAKjC/F,EAAS7P,GAAA,EACTuW,EAAU,GAAG1G,CAAM,SACnB80C,EAAenkB,GAAe,GAAG3wB,CAAM,IAAIq0C,GAAY1jB,CAAG,CAAC,GAC3D4c,EAAamH,IAAmB7zC,GAAS,CAAC+gB,EAAYlb,EAAU,QAEhEquC,EAAapjD,IAAgB,WAC7BqjD,EAAa95B,GAAiD,iBAClE,MAAM+5B,EAAM,MAAM,QAAQ/5B,CAAC,EAAIA,EAAI,CAACqF,EAAKvS,CAAG,EACtCknC,GAAK,KAAK,KAAIhlD,GAAA+kD,EAAI,CAAC,IAAL,KAAA/kD,GAAUqwB,GAAK9oB,GAAAw9C,EAAI,CAAC,IAAL,KAAAx9C,GAAUuW,CAAG,EAC1CmnC,GAAK,KAAK,KAAI36C,GAAAy6C,EAAI,CAAC,IAAL,KAAAz6C,GAAU+lB,GAAKqV,GAAAqf,EAAI,CAAC,IAAL,KAAArf,GAAU5nB,CAAG,EAChD,MAAO,CAACknC,GAAIC,EAAE,CAChB,EAEM5lD,EAAe+zC,IAAc,OAC7B,CAACkN,EAAYC,CAAa,EAAIjiD,EAAM,SAA2B,IAAMwmD,EAAU3lD,CAAY,CAAC,EAC5FzB,EAAQ2B,EAAeylD,EAAU1R,CAAS,EAAIkN,EAE9C9/C,EAAelC,EAAM,OAAwB,IAAI,EACjD20B,EAAUvnB,GAA4BlC,EAAKhJ,CAAY,EACvD0kD,EAAc5mD,EAAM,OAAc,CAAC,EACnC6mD,EAAe7mD,EAAM,OAAgB,EAAK,EAE1C8mD,GAAWhB,GAAaC,EAAOh0B,EAAKvS,EAAK5b,CAAI,EAE7CmjD,GAAmBpmD,GAAyE,QAChG,MAAMkM,GAAOnL,GAAAQ,EAAa,UAAb,YAAAR,GAAsB,wBACnC,GAAI,CAACmL,EACH,OAAOklB,EAET,GAAIw0B,EAAY,CACd,MAAM7gD,IACH,OAAQ/E,EAAqB,SAAY,SACrCA,EAAqB,QACtBsM,GAAOtM,CAAyB,GAAKkM,EAAK,IAChD,OAAO84C,GAAQ94C,EAAK,OAASnH,GAAG,CAAC,EAAGmH,EAAK,MAAM,EAAG,CAACklB,EAAKvS,CAAG,EAAG,CAAE,KAAA5b,EAAM,CACxE,CACA,MAAM6B,IACH,OAAQ9E,EAAqB,SAAY,SACrCA,EAAqB,QACtBqM,GAAOrM,CAAyB,GAAKkM,EAAK,KAChD,OAAO84C,GAAQlgD,GAAG,CAAC,EAAGoH,EAAK,KAAK,EAAG,CAACklB,EAAKvS,CAAG,EAAG,CAAE,KAAA5b,EAAM,CACzD,EAEM85C,GAAS,CAACn8C,EAAwBZ,IAAwC,CAC9E,MAAM+lD,GAAK,KAAK,IAAInlD,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC9BolD,GAAK,KAAK,IAAIplD,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC9B+c,GAA4B,CAAC,KAAK,IAAIyT,EAAK20B,EAAE,EAAG,KAAK,IAAIlnC,EAAKmnC,EAAE,CAAC,EAClE5lD,GACHkhD,EAAc3jC,EAAO,EAEvBxd,GAAA,MAAAA,EAAWH,EAAO2d,GAASrT,EAC7B,EAEM+7C,GAAY,CAACC,EAAatmD,IAAwC,CACtE,MAAMwhC,GAAMykB,EAAY,QAClBrlD,GAAyB,CAACnC,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAClDmC,GAAK4gC,EAAG,EAAI,KAAK,IAAIpQ,EAAK,KAAK,IAAIvS,EAAKynC,CAAG,CAAC,EAC5CvJ,GAAOn8C,GAAMZ,CAAK,CACpB,EAEMumD,GAAaD,GAAgB,CACjCL,EAAY,QAAU,KAAK,IAAIK,EAAM7nD,EAAM,CAAC,CAAC,GAAK,KAAK,IAAI6nD,EAAM7nD,EAAM,CAAC,CAAC,EAAI,EAAI,CACnF,EAEM+nD,EAAc90B,GAAkB1xB,GAAmC,CAClEkmD,EAAa,UAGlBlmD,EAAM,eAAA,EACNqmD,GAAUD,GAAgBpmD,CAAK,EAAGA,CAAK,EACzC,CAAC,EAEKymD,GAAa/0B,GAAiB,IAAM,CACxCw0B,EAAa,QAAU,GACvB,SAAS,oBAAoB,YAAaM,CAAW,EACrD,SAAS,oBAAoB,UAAWC,EAAU,EAClD,SAAS,oBAAoB,YAAaD,CAAW,EACrD,SAAS,oBAAoB,WAAYC,EAAU,CACrD,CAAC,EAEKp0C,GAAerS,GAA6C,CAEhE,GADA6R,GAAA,MAAAA,EAAkB7R,GACdkQ,GAAYlQ,EAAM,SAAW,EAC/B,OAEF,MAAMsmD,EAAMF,GAAgBpmD,CAAK,EACjCumD,GAAUD,CAAG,EACbJ,EAAa,QAAU,GACvBG,GAAUC,EAAKtmD,CAAK,EACpB,SAAS,iBAAiB,YAAawmD,CAAW,EAClD,SAAS,iBAAiB,UAAWC,EAAU,CACjD,EAEMC,GAAsB1mD,GAAsB,CAChD,GAAIkQ,EACF,OAEF,MAAMo2C,EAAMF,GAAgBpmD,CAAK,EACjCumD,GAAUD,CAAG,EACbJ,EAAa,QAAU,GACvBG,GAAUC,EAAKtmD,CAAK,EACpB,SAAS,iBAAiB,YAAawmD,CAAW,EAClD,SAAS,iBAAiB,WAAYC,EAAU,CAClD,EAEAvnD,GAAoB,IAAM,CACxB,MAAM4C,EAAKP,EAAa,QACxB,GAAKO,EAGL,OAAAA,EAAG,iBAAiB,aAAc4kD,EAAkB,EAC7C,IAAM5kD,EAAG,oBAAoB,aAAc4kD,EAAkB,CACtE,CAAC,EAED,MAAMC,GAAkBnlB,GAAgBxhC,GAA+B,CACrE,GAAIkQ,EACF,OAEF,MAAMynB,GAAQ10B,GAAQA,EAAO,EAAIA,EAAO,EACxC,IAAIrC,GAAsB,KACtBZ,EAAM,MAAQ,aAAeA,EAAM,MAAQ,YAC7CY,GAAOnC,EAAM+iC,CAAG,EAAI7J,GACX33B,EAAM,MAAQ,cAAgBA,EAAM,MAAQ,UACrDY,GAAOnC,EAAM+iC,CAAG,EAAI7J,GACX33B,EAAM,MAAQ,OACvBY,GAAOwwB,EACEpxB,EAAM,MAAQ,QACvBY,GAAOie,GAELje,KAAS,OACXZ,EAAM,eAAA,EACNimD,EAAY,QAAUzkB,EACtB6kB,GAAUzlD,GAAMZ,CAAK,EAEzB,EAEMqN,GAAajC,EACjB,cACA,qBACAtB,EACA,CACE,wBAAyBoG,EACzB,wBAAyB01C,CAAA,EAE3B37C,IAAS,UAAY,oBAAoBA,CAAI,GAC7CE,IAAU,WAAa,qBAAqBA,CAAK,EAAA,EAG7Cy8C,GAAKnC,GAAUhmD,EAAM,CAAC,EAAG2yB,EAAKvS,CAAG,EACjCgoC,GAAKpC,GAAUhmD,EAAM,CAAC,EAAG2yB,EAAKvS,CAAG,EACjCioC,GAAW,GAAG,KAAK,IAAIF,GAAIC,EAAE,CAAC,IAC9BE,GAAU,GAAG,KAAK,IAAIF,GAAKD,EAAE,CAAC,IAC9BI,GAAYpB,EAAa,CAAE,OAAQ,GAAGgB,EAAE,GAAA,EAAQ,CAAE,KAAM,GAAGA,EAAE,GAAA,EAC7DK,GAAUrB,EAAa,CAAE,OAAQ,GAAGiB,EAAE,GAAA,EAAQ,CAAE,KAAM,GAAGA,EAAE,GAAA,EAC3DK,GAAatB,EAAa,CAAE,OAAQkB,GAAU,OAAQC,EAAA,EAAY,CAAE,KAAMD,GAAU,MAAOC,EAAA,EAEjG,OACEj+C,EAAAA,IAACmO,GAAA,CACC,MAAAvF,EACA,QAAA6F,EACA,WAAAX,EACA,aAAcuC,EAAO,GACrB,SAAAjJ,EACA,MAAAiH,EACA,UAAS,GACT,OAAM,GAEN,SAAArO,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACb,SAAA0I,OAAC,OAAA,CAAK,IAAKwiB,EAAS,YAAA3hB,GAA0B,UAAWhF,GAAa,GAAG1B,EACtE,SAAA,CAAAw6C,GAAS,OAAS,GACjBr9C,EAAAA,IAAC,OAAA,CAAK,UAAU,qBAAqB,cAAY,OAC9C,SAAAq9C,GAAS,IAAKgB,GAAM,CACnB,MAAMC,EAAK,GAAG3C,GAAU0C,EAAE,MAAO/1B,EAAKvS,CAAG,CAAC,IAC1C,OACE/V,EAAAA,IAAC,OAAA,CAAmB,UAAU,oBAAoB,MAAO88C,EAAa,CAAE,OAAQwB,CAAA,EAAO,CAAE,KAAMA,GAC5F,SAAAD,EAAE,OAAS,MAAQr+C,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA2B,SAAAq+C,EAAE,KAAA,CAAM,CAAA,EAD9DA,EAAE,KAEb,CAEJ,CAAC,CAAA,CACH,EAEFr+C,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAA,CAAoB,EACpCA,EAAAA,IAAC,OAAA,CAAK,UAAU,qBAAqB,MAAOo+C,GAAY,EACtD,CAAC,EAAG,CAAC,EAAY,IAAK1lB,GACtBhwB,EAAAA,KAAC,OAAA,CAEC,UAAWpG,EAAG,qBAAsB,uBAAuBo2B,IAAQ,EAAI,QAAU,KAAK,EAAE,EACxF,MAAOA,IAAQ,EAAIwlB,GAAYC,GAE/B,SAAA,CAAAn+C,EAAAA,IAAC,QAAA,CACC,cAAa,gBAAgB04B,CAAG,GAChC,UAAU,qBACV,KAAK,QACL,IAAApQ,EACA,IAAAvS,EACA,KAAA5b,EACA,KAAM0G,EAAO,GAAGA,CAAI,IAAI63B,CAAG,IAAM,OACjC,MAAO/iC,EAAM+iC,CAAG,EAChB,SAAAtxB,EACA,SAAU,IAAA,GACV,UAAWy2C,GAAenlB,CAAG,EAC7B,SAAUtxB,EAAW,GAAK,EAC1B,aAAYuiB,EAAY,GAAGA,CAAS,IAAIyyB,GAAY1jB,CAAG,CAAC,GAAK,OAC7D,kBAAiB4c,EAAa,GAAGA,CAAU,IAAIuH,EAAYnkB,CAAG,CAAC,GAAK,OACpE,mBAAkBroB,EAAO,YACzB,mBAAkB3W,EAClB,gBAAe/D,EAAM+iC,CAAG,EACxB,gBAAeA,IAAQ,EAAIpQ,EAAM3yB,EAAM,CAAC,EACxC,gBAAe+iC,IAAQ,EAAI/iC,EAAM,CAAC,EAAIogB,EACtC,iBAAgB2mC,EAAmBA,EAAiB/mD,EAAM+iC,CAAG,CAAC,EAAI,OAClE,gBAAetxB,GAAY,MAAA,CAAA,EAE5BkuC,EACCt1C,EAAAA,IAAC,OAAA,CAAK,GAAI68C,EAAYnkB,CAAG,EAAG,OAAM,GAC/B,SAAA0jB,GAAY1jB,CAAG,CAAA,CAClB,EACE,IAAA,CAAA,EA/BCA,CAAA,CAiCR,CAAA,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CAGN,CAAC,EAEK6lB,GAAehoD,EAAM,WAAyC,SAAsBiL,EAAOC,EAAK,CACpG,KAAM,CACJ,aAAArK,EACA,MAAOi0C,EACP,SAAAh0C,EACA,IAAAixB,EAAM,EACN,IAAAvS,EAAM,IACN,KAAAlV,EACA,SAAAuG,EAAW,GACX,UAAApG,EACA,KAAA7G,EACA,QAAA+M,EAAU,aACV,WAAAy1C,EACA,UAAAC,EACA,MAAAh0C,EACA,kBAAmB6zC,EACnB,WAAA3uC,EACA,MAAAO,EACA,KAAAlN,EAAO,SACP,MAAAE,EAAQ,UACR,YAAA3H,EAAc,aACd,MAAA4iD,EAGA,MAAAnX,EACA,iBAAAuX,EACA,aAAc/yB,EAEd,YAAa5gB,EACb,UAAWkZ,EACX,QAASxS,EACT,OAAQC,EACR,GAAG7M,CAAA,EACDrB,EACE6O,EAAStC,GAAcD,CAAU,EAKjCW,EAAU,GADDvW,GAAA,CACU,SACnBo9C,EAAamH,IAAmB7zC,GAAS,CAAC+gB,EAAYlb,EAAU,QAEhE+vC,EAAgB,OAAOpnD,GAAiB,SAAWA,EAAe,OAClEqnD,EAAkB,OAAOpT,GAAc,SAAWA,EAAY,OAC9DyR,EAAapjD,IAAgB,WAE7B,CAAC6+C,EAAY3gD,CAAQ,EAAIrB,EAAM,SAAiBioD,GAAA,KAAAA,EAAiBl2B,CAAG,EACpE,CAACoC,EAAYC,CAAa,EAAIp0B,EAAM,SAAkB,EAAK,EAC3D,CAACu3B,EAAU4wB,EAAW,EAAInoD,EAAM,SAAkB,EAAK,EACvD,CAACgY,GAAW2B,EAAY,EAAI3Z,EAAM,SAAkB,EAAK,EAEzDkC,GAAelC,EAAM,OAAwB,IAAI,EACjD20B,GAAUvnB,GAA4BlC,EAAKhJ,EAAY,EACvD2kD,EAAe7mD,EAAM,OAAgB,EAAK,EAE1Ce,GAAemnD,IAAoB,OACnCE,GAAaz3C,IAAY,WACzBvR,GAAQ2B,GAAemnD,EAAkBlG,EAEzC8B,GAAc,CAAC1kD,GAAeuB,KAAwC,CACtEvB,GAAQ2yB,GAAO3yB,GAAQogB,IACtBze,IACHM,EAASjC,EAAK,EAEhB0B,GAAA,MAAAA,EAAWH,GAAOvB,GAAO6L,GAC3B,EAEMo9C,GAAgB,CAACC,GAAkBC,KAChC5C,GAAQ2C,GAAU,CAAC,EAAGC,EAAa,EAAG,CAACx2B,EAAKvS,CAAG,EAAG,CAAE,KAAA5b,EAAM,EAG7DoP,GAAerS,IAA6C,CAMhE,GALA6R,GAAA,MAAAA,EAAkB7R,IACdkQ,GAIAlQ,GAAM,SAAW,EACnB,OAGFkmD,EAAa,QAAU,GAEvB,MAAMr/C,GAAUtF,GAAa,QACvB2K,GAAOrF,IAAA,YAAAA,GAAS,wBAEtB,GAAIqF,GAAM,CACR,MAAM27C,EAAmBjC,EAAa15C,GAAK,QAAUlM,GAAM,QAAUkM,GAAK,KAAOlM,GAAM,QAAUkM,GAAK,KAChGo3C,GAAWoE,GAAcG,EAAkBjC,EAAa15C,GAAK,OAASA,GAAK,KAAK,EAEjF0qB,GACH4wB,GAAY,EAAI,EAGlBrE,GAAYG,GAAUtjD,EAAK,CAC7B,CAEA,SAAS,iBAAiB,YAAawmD,EAAW,EAClD,SAAS,iBAAiB,UAAWC,EAAU,CACjD,EAEMqB,GAAgB9nD,IAAsB,OAC1C,GAAIkQ,EACF,OAGFg2C,EAAa,QAAU,GAEvB,MAAMr/C,GAAUtF,GAAa,QACvB2K,GAAOrF,IAAA,YAAAA,GAAS,wBAEtB,GAAIqF,GAAM,CACR,MAAM67C,IAAQhnD,EAAAf,GAAM,iBAAN,YAAAe,EAAuB,GAC/B8mD,EAAmBjC,EAAa15C,GAAK,QAAU67C,GAAM,QAAU77C,GAAK,KAAO67C,GAAM,QAAU77C,GAAK,KAChGo3C,EAAWoE,GAAcG,EAAkBjC,EAAa15C,GAAK,OAASA,GAAK,KAAK,EAEjF0qB,GACH4wB,GAAY,EAAI,EAElBrE,GAAYG,EAAUtjD,EAAK,CAC7B,CAEA,SAAS,iBAAiB,YAAawmD,EAAW,EAClD,SAAS,iBAAiB,WAAYC,EAAU,CAClD,EAEMD,GAAc90B,GAAkB1xB,IAAmC,CACvE,GAAIkmD,EAAa,QAAS,CACxB,MAAMr/C,GAAUtF,GAAa,QACvB2K,GAAOrF,IAAA,YAAAA,GAAS,wBAEtB,GAAIqF,GAAM,CAIR,MAAMgpB,EAAU7oB,GAAOrM,EAAK,EAGtBm1B,GAAU7oB,GAAOtM,EAAK,EACtB6nD,EAAmBjC,EAAa15C,GAAK,QAAUipB,GAAUjpB,GAAK,KAAOgpB,EAAUhpB,GAAK,KACpFo3C,EAAWoE,GAAcG,EAAkBjC,EAAa15C,GAAK,OAASA,GAAK,KAAK,EAMtF,GAJK0qB,GACH4wB,GAAY,EAAI,EAGd/oD,KAAU6kD,EACZ,OAGG9vB,GACHC,EAAc,EAAI,EAGpB0vB,GAAYG,EAAUtjD,EAAK,CAC7B,CACF,CACF,CAAC,EAEKymD,GAAa/0B,GAAiB,IAAM,CACxCw0B,EAAa,QAAU,GAEnB1yB,GACFC,EAAc,EAAK,EAGjBmD,GACF4wB,GAAY,EAAK,EAGnBQ,GAAA,CACF,CAAC,EAEKA,GAAkB,IAAM,CAC5B,SAAS,oBAAoB,YAAaxB,EAAW,EACrD,SAAS,oBAAoB,UAAWC,EAAU,EAClD,SAAS,oBAAoB,YAAaD,EAAW,EACrD,SAAS,oBAAoB,WAAYC,EAAU,CACrD,EAEMwB,GAAwB12C,IAA4C,CACxEwZ,GAAA,MAAAA,EAAgBxZ,IACZ,GAAC8F,IAAanH,MACdqB,GAAE,MAAQ,aAAeA,GAAE,MAAQ,cACrC4xC,GAAY1kD,IAASwE,GAAQ,GAAIsO,EAAC,GAEhCA,GAAE,MAAQ,cAAgBA,GAAE,MAAQ,YACtC4xC,GAAY1kD,IAASwE,GAAQ,GAAIsO,EAAC,EAEtC,EAEM22C,GAAeloD,IAA6C,CAChEuY,GAAA,MAAAA,EAAcvY,IACdgZ,GAAa,EAAI,CACnB,EAEMmvC,EAAcnoD,IAA6C,CAC/DwY,GAAA,MAAAA,EAAaxY,IACbgZ,GAAa,EAAK,EAClB,SAAS,oBAAoB,UAAWivC,EAA4C,CACtF,EAQM,CAACG,EAAWC,EAAY,EAAIhpD,EAAM,SAAwB,IAAI,EAE9DipD,GAAiBtoD,IAA+C,CACpE,MAAMoc,GAAOpc,GAAM,OAAO,MAC1BqoD,GAAajsC,EAAI,EACjB,MAAM03B,GAAQ,OAAO13B,EAAI,EACrBA,GAAK,SAAW,IAAMwoC,GAAe9Q,GAAO1iB,EAAKvS,EAAK5b,CAAI,IAAM6wC,IAClEqP,GAAYrP,GAAO9zC,EAAK,CAE5B,EAEMuoD,GAAevoD,IAAkD,CACrE,GAAIooD,IAAc,KAAM,OACxBC,GAAa,IAAI,EACjB,MAAMvU,GAAQ,OAAOsU,CAAS,EAC9B,GAAIA,EAAU,SAAW,IAAM,CAAC,OAAO,SAAStU,EAAK,EAAG,OACxD,MAAM0U,GAAU5D,GAAe9Q,GAAO1iB,EAAKvS,EAAK5b,CAAI,EAChDulD,KAAY/pD,IAAO0kD,GAAYqF,GAASxoD,EAAK,CACnD,EAEAd,GAAoB,IAAM,CACxB,GAAIqC,GAAa,QACf,OAAAA,GAAa,QAAQ,iBAAiB,aAAcumD,EAAY,EAEzD,IAAM,SACX/mD,GAAAQ,GAAa,UAAb,MAAAR,GAAsB,oBAAoB,aAAc+mD,GAC1D,CAEJ,CAAC,EAED5oD,GAAoB,IAAM,WACpBgR,KAAYnP,GAAAQ,GAAa,UAAb,MAAAR,GAAsB,SAAS,SAAS,mBACrDuH,GAAA,SAAS,gBAAT,MAAAA,GAAwC,OAE7C,EAAG,CAAC4H,CAAQ,CAAC,EAEb,MAAM7C,GAAajC,EACjB,cACAtB,EACA,CACE,wBAAyBoG,EACzB,wBAAyBsjB,EACzB,wBAAyBi0B,GACzB,wBAAyB7B,CAAA,EAE3B37C,IAAS,UAAY,oBAAoBA,CAAI,GAC7CE,IAAU,WAAa,qBAAqBA,CAAK,EAAA,EAG7Cs+C,GAAM,GAAGhE,GAAUhmD,GAAO2yB,EAAKvS,CAAG,CAAC,IACnCqoC,GAAatB,EAAa,CAAE,OAAQ6C,IAAQ,CAAE,MAAOA,EAAA,EACrDC,GAAa9C,EAAa,CAAE,OAAQ6C,IAAQ,CAAE,KAAMA,EAAA,EAEpDE,GAAW,IAAM,MAAM,KAAK,MAAM9pC,GAAO5b,GAAQ,EAAE,EAAI,CAAC,EAAE,KAAK,CAAC,EAChEkjD,GAAWhB,GAAaC,EAAOh0B,EAAKvS,EAAK5b,CAAI,EAEnD,OACE6F,EAAAA,IAACmO,GAAA,CACC,MAAAvF,EACA,QAAA6F,EACA,WAAAX,EACA,aAAcuC,EAAO,GACrB,SAAAjJ,EACA,MAAAiH,EACA,UAAS,GACT,OAAM,GAEN,SAAA3F,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CACC,UAAWy2C,GACX,IAAKj0B,GACL,YAAA3hB,GACA,UAAWhF,GACX,SAAU6C,EAAW,GAAK,EAC1B,QAASg4C,GACT,OAAQC,EACP,GAAGx8C,EAEH,SAAA,CAAA+5C,GACC58C,EAAAA,IAAC,QAAK,UAAU,qBAAqB,MAAO,CAAE,IAAK,GAAG7F,CAAI,EAAA,EACvD,cAAW,IAAI,CAAC2lD,GAAGpnB,KAClB14B,EAAAA,IAAC,QAAK,UAAU,mBAAA,EAAyB04B,EAAK,CAC/C,CAAA,CACH,EAED2kB,GAAS,OAAS,GACjBr9C,EAAAA,IAAC,OAAA,CAAK,UAAU,qBAAqB,cAAY,OAC9C,SAAAq9C,GAAS,IAAKgB,IAAM,CACnB,MAAMC,GAAK,GAAG3C,GAAU0C,GAAE,MAAO/1B,EAAKvS,CAAG,CAAC,IAC1C,OACE/V,EAAAA,IAAC,OAAA,CAAmB,UAAU,oBAAoB,MAAO88C,EAAa,CAAE,OAAQwB,EAAA,EAAO,CAAE,KAAMA,IAC5F,SAAAD,GAAE,OAAS,MAAQr+C,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA2B,SAAAq+C,GAAE,KAAA,CAAM,CAAA,EAD9DA,GAAE,KAEb,CAEJ,CAAC,CAAA,CACH,EAEFr+C,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAA,CAAoB,EACpCA,EAAAA,IAAC,OAAA,CAAK,UAAU,qBAAqB,MAAOo+C,GAAY,EACxD11C,EAAAA,KAAC,OAAA,CACC,UAAWpG,EAAG,qBAAsB,CAClC,6BAA8BwrB,EAC9B,+BAAgC6wB,EAAA,CACjC,EACD,MAAOiB,GAEN,SAAA,CAAAjB,UAAe,OAAA,CAAK,UAAU,6BAA8B,SAAA,KAAK,MAAMhpD,EAAK,EAAE,EAC/EqK,EAAAA,IAAC,QAAA,CACC,cAAY,eACZ,UAAU,qBACV,KAAK,QACL,IAAAsoB,EACA,IAAAvS,EACA,KAAAlV,EACA,MAAAlL,GACA,SAAQ,GACR,aAAYg0B,EACZ,kBAAiB2rB,EACjB,mBAAkBjlC,EAAO,YACzB,mBAAkB3W,EAClB,gBAAe/D,GACf,gBAAe2yB,EACf,gBAAevS,EACf,iBAAgB2mC,EAAmBA,EAAiB/mD,EAAK,EAAI,OAC7D,gBAAeyR,GAAY,MAAA,CAAA,CAC7B,CAAA,CAAA,CACF,CAAA,CAAA,EAEDu1C,GAAcgC,IACb3+C,EAAAA,IAACqP,GAAA,CACC,KAAK,SAEL,IAAAiZ,EACA,IAAAvS,EACA,KAAA5b,EACA,SAAAiN,EACA,MAAOk4C,GAAA,KAAAA,EAAa3pD,GACpB,SAAU6pD,GACV,OAAQC,GACR,UAAYh3C,IAA6C,CACnDA,GAAE,MAAQ,SAASg3C,GAAYh3C,EAAC,CACtC,EACA,QAAQ,SACR,WAAY,KAEZ,aAAYkhB,EACZ,kBAAiB2rB,CAAA,CAAA,CACnB,CAAA,CAEJ,CAAA,CAAA,CAGN,CAAC,EAEYyK,GAASxpD,EAAM,WAAyC,SAAgBiL,EAAOC,EAAK,CAG/F,OAFoBD,EAAM,QAAU,IAAQ,MAAM,QAAQA,EAAM,KAAK,GAAK,MAAM,QAAQA,EAAM,YAAY,EAErFxB,EAAAA,IAACw8C,GAAA,CAAY,IAAA/6C,EAAW,GAAGD,EAAO,EAAKxB,EAAAA,IAACu+C,GAAA,CAAa,IAAA98C,EAAW,GAAGD,CAAA,CAAO,CACjG,CAAC,EC/qBD,SAASw+C,GAAcC,EAAsCtqD,EAAwC,CACnG,OAAI,OAAOsqD,GAAY,WAAmBA,EAAQtqD,CAAK,EACnD,MAAM,QAAQA,CAAK,EAAU,GAAGA,EAAM,CAAC,CAAC,MAAMA,EAAM,CAAC,CAAC,GACnDA,GAAS,KAAO,GAAK,OAAOA,CAAK,CAC1C,CAQO,SAASuqD,GAAY,CAC1B,QAAAD,EACA,aAAA14C,EACA,QAAA44C,EACA,WAAAC,EACA,MAAAx3C,EACA,UAAA5H,EACA,GAAGq/C,CACL,EAAyC,CACvC,MAAMC,EAAaL,IAAY,QAAaA,IAAY,GAClDM,EAAa33C,GAAS,MAAQ03C,GAAc/4C,GAAgB,MAAQ44C,GAAW,KAI/E1xC,EAAU,GAAGvW,GAAA,CAAO,SACpBo9C,EAAa+K,EAAY,iBAAiB,IAAMz3C,GAAS,CAACy3C,EAAY,YAAY,EAAI5xC,EAAU,QAEtG,cACG,MAAA,CAAI,UAAWnM,EAAG,oBAAqBtB,CAAS,EAC9C,SAAA,CAAAu/C,EACC73C,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAE,GAAS,WACP,OAAA,CAAK,GAAI6F,EAAS,UAAU,2BAC1B,WACH,EACE,KACJzO,EAAAA,IAAC,OAAA,CAAK,UAAU,2BAAA,CAA4B,EAC3CsgD,EACCtgD,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA8B,YAAcigD,EAASI,EAAY,KAAK,CAAA,CAAE,EACtF,KACH94C,EACA44C,GAAW,KACVngD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,2BACV,aAAYogD,GAAA,KAAAA,EAAc,QAC1B,SAAU,CAAC,CAACC,EAAY,SACxB,QAAS,IAAMF,EAAA,EAEf,SAAAngD,EAAAA,IAAC,MAAA,CACC,QAAQ,YACR,MAAM,KACN,OAAO,KACP,cAAY,OACZ,KAAK,OACL,OAAO,eACP,YAAY,IAEZ,eAAC,OAAA,CAAK,EAAE,gCAAgC,cAAc,QAAQ,eAAe,OAAA,CAAQ,CAAA,CAAA,CACvF,CAAA,EAEA,IAAA,CAAA,CACN,EACE,KACJA,EAAAA,IAAC+/C,GAAA,CAAQ,GAAGM,EAAa,kBAAiB/K,CAAA,CAAY,CAAA,EACxD,CAEJ,CCvEO,MAAMkL,GAASjqD,EAAM,WAA0C,SAAgBiL,EAAOC,EAAK,CAChG,KAAM,CACJ,SAAA2F,EACA,SAAAuI,EACA,SAAAJ,EACA,QAAAkxB,EACA,UAAAz/B,EACA,GAAI7I,EACJ,MAAAyQ,EACA,eAAA63C,EACA,KAAAt/C,EAAO,SACP,MAAAE,EAAQ,UACR,WAAAyM,EACA,MAAAO,EACA,mBAAoBiB,EACpB,GAAGwZ,CAAA,EACDtnB,EACEyM,EAAK/V,GAAMC,CAAM,EACjBkY,EAAStC,GAAcD,EAAY,CAAE,YAAawB,EAAiB,EAEnEyxB,EAAgBt4B,GAA2C,OAC/D,GAAIkH,EAAU,CACZ+wB,GAAsBj4B,EAAGg4B,CAAO,EAChC,MACF,EACAxoC,EAAAuJ,EAAM,WAAN,MAAAvJ,EAAA,KAAAuJ,EAAiBiH,EAAGA,EAAE,OAAO,QAASjH,EACxC,EAEMggB,EAAe/Y,GAA0C,QAC7DxQ,EAAAuJ,EAAM,UAAN,MAAAvJ,EAAA,KAAAuJ,EAAgBiH,GACZkH,GAAU6wB,GAAa/3B,EAAGg4B,CAAO,CACvC,EAEA,OACEzgC,EAAAA,IAACmO,GAAA,CACC,WAAAL,EACA,aAAcuC,EAAO,GACrB,SAAAjJ,EACA,MAAAiH,EACA,UAAU,2BAEV,SAAA3F,EAAAA,KAAC,QAAK,UAAWpG,EAAG,uBAAwBm+C,GAAkB,8BAA8BA,CAAc,EAAE,EACzG,SAAA,CAAA73C,QACE,QAAA,CAAM,QAASqF,EAAI,UAAU,qBAC3B,WACH,EACE,KACJvF,EAAAA,KAAC,QAAA,CACC,UAAWpG,EAAG,cAAe,oBAAoBnB,CAAI,GAAI,qBAAqBE,CAAK,GAAIL,EAAW,CAChG,gBAAiBoG,EACjB,gBAAiBuI,CAAA,CAClB,EAED,SAAA,CAAA3P,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,GAAAiO,EACA,UAAU,wBACV,eAAcwyB,EACd,eAAcpyB,GAAS,OACvB,gBAAekB,GAAY,OAC3B,mBAAkBc,EAAO,YACzB,KAAM,SACN,QAAAowB,EACA,SAAAr5B,EACA,SAAAuI,EACA,SAAAJ,EACA,IAAA9N,EACC,GAAGqnB,EACJ,gBAAenZ,GAAYmZ,EAAK,eAAe,EAC/C,SAAUiY,EACV,QAASvf,CAAA,CAAA,EAEXxhB,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAA,CAAqB,EACrCA,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAA,CAAqB,CAAA,CAAA,CAAA,CACvC,CAAA,CACF,CAAA,CAAA,CAGN,CAAC,ECnGY0gD,GAAOnqD,EAAM,WAAqC,SAC7D,CAAE,UAAAyK,EAAW,cAAeO,EAAa,OAAQ,GAAGsB,CAAA,EACpDpB,EACA,CACA,OAAOzB,EAAAA,IAAC,MAAA,CAAI,IAAAyB,EAAU,cAAaF,EAAY,UAAWe,EAAG,YAAatB,CAAS,EAAI,GAAG6B,CAAA,CAAM,CAClG,CAAC,EAUY89C,GAAc,CAAC,OAAQ,SAAU,cAAc,EAC/CC,GAAwB,CACnC,aACA,SACA,WACA,gBACA,eACA,cACF,EACaC,GAAoB,CAAC,aAAc,SAAU,WAAY,UAAW,UAAU,EAC9EC,GAAmB,CAAC,MAAO,cAAe,SAAU,gBAAgB,EAYpEC,GAAMxqD,EAAM,WAAqC,SAC5D,CAAE,UAAAyK,EAAW,eAAAggD,EAAgB,WAAAC,EAAY,UAAAn1B,EAAW,KAAAo1B,EAAM,QAAAC,EAAS,cAAe5/C,EAAa,WAAY,GAAGsB,CAAA,EAC9GpB,EACA,CACA,MAAM2/C,EACJJ,GAAkBJ,GAAsB,SAASI,CAAc,GAAKA,IAAmB,aACnFK,EAAeJ,GAAcJ,GAAkB,SAASI,CAAU,GAAKA,IAAe,aACtFK,EAAcx1B,GAAag1B,GAAiB,SAASh1B,CAAS,GAAKA,IAAc,MACjFy1B,EAAaL,GAAQP,GAAY,SAASO,CAAI,GAAKA,IAAS,OAE5Dx+C,EAAUJ,EAAG,iBAAkBtB,EAAW,CAC9C,CAAC,2BAA2BmgD,CAAO,EAAE,EAAGA,EACxC,CAAC,kCAAkCH,CAAc,EAAE,EAAGI,EACtD,CAAC,8BAA8BH,CAAU,EAAE,EAAGI,EAC9C,CAAC,6BAA6Bv1B,CAAS,EAAE,EAAGw1B,EAC5C,CAAC,mBAAmBJ,CAAI,EAAE,EAAGK,CAAA,CAC9B,EAED,OAAOvhD,EAAAA,IAAC,OAAI,IAAAyB,EAAU,cAAaF,EAAY,UAAWmB,EAAU,GAAGG,EAAM,CAC/E,CAAC,EAqBK2+C,GAAiBhhC,GACjBA,IAAW,OACN,CAAA,EAEL,OAAOA,GAAW,UACb,CAAE,4BAA6BA,CAAA,EAEhC,OAAO,KAAKA,CAAM,EAAmB,OAAgC,CAACie,EAAKgjB,KACjFhjB,EAAI,6BAA6BgjB,CAAE,EAAE,EAAIjhC,EAAOihC,CAAE,IAAM,GACxDhjB,EAAI,8BAA8BgjB,CAAE,EAAE,EAAIjhC,EAAOihC,CAAE,IAAM,GAClDhjB,GACN,CAAA,CAAE,EAGMijB,GAASnrD,EAAM,WAAwC,SAClE,CACE,UAAAyK,EACA,GAAA2gD,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,GAAAC,EACA,SAAAC,EACA,SAAAC,EACA,SAAAC,EACA,SAAAC,EACA,SAAAC,EACA,OAAA5hC,EACA,cAAejf,EAAa,WAC5B,GAAGsB,CACL,EACApB,EACA,CACA,MAAMiB,EAAUJ,EAAG,oBAAqBtB,EAAW,CACjD,CAAC,yBAAyB2gD,CAAE,EAAE,EAAGA,EACjC,CAAC,yBAAyBC,CAAE,EAAE,EAAGA,EACjC,CAAC,yBAAyBC,CAAE,EAAE,EAAGA,EACjC,CAAC,yBAAyBC,CAAE,EAAE,EAAGA,EACjC,CAAC,yBAAyBC,CAAE,EAAE,EAAGA,EACjC,CAAC,gCAAgCC,CAAQ,EAAE,EAAGA,EAC9C,CAAC,gCAAgCC,CAAQ,EAAE,EAAGA,EAC9C,CAAC,gCAAgCC,CAAQ,EAAE,EAAGA,EAC9C,CAAC,gCAAgCC,CAAQ,EAAE,EAAGA,EAC9C,CAAC,gCAAgCC,CAAQ,EAAE,EAAGA,EAC9C,GAAGZ,GAAchhC,CAAM,CAAA,CACxB,EAED,OAAOxgB,EAAAA,IAAC,OAAI,IAAAyB,EAAU,UAAWiB,EAAS,cAAanB,EAAa,GAAGsB,EAAM,CAC/E,CAAC,EAYYw/C,GAAY9rD,EAAM,WAA2C,SACxE,CAAE,UAAAyK,EAAW,SAAAgpB,EAAW,KAAM,eAAAs4B,EAAiB,GAAO,cAAe/gD,EAAa,iBAAkB,GAAGsB,CAAA,EACvGpB,EACA,CACA,MAAMiB,EAAUJ,EACd,iBACA,CACE,CAAC,mBAAmB0nB,CAAQ,EAAE,EAAGA,IAAa,GAC9C,6BAA8Bs4B,CAAA,EAEhCthD,CAAA,EAEF,OAAOhB,EAAAA,IAAC,OAAI,IAAAyB,EAAU,cAAaF,EAAY,UAAWmB,EAAU,GAAGG,EAAM,CAC/E,CAAC,ECvIK0/C,GAAqD,CACzD,QAAS,OACT,QAAS,2BACT,UAAW,6BACX,MAAO,yBACP,QAAS,2BACT,QAAS,2BACT,KAAM,uBACR,EAEaC,GAAUzhD,EAAAA,WAA4D,SACjF,CACE,UAAAC,EACA,YAAAtH,EAAc,aACd,QAAAwN,EAAU,YACV,UAAAu7C,EAAY,SACZ,MAAAphD,EAAQ,UACR,UAAAqhD,EACA,SAAAC,EACA,MAAA19C,EACA,SAAAlF,EACA,cAAewB,EAAa,UAC5B,GAAGC,CACL,EACAC,EACA,CACA,MAAMmhD,EAAoC7iD,GAAa,MAAQA,IAAa,GACtE6mB,EAAI27B,GAASlhD,CAAK,EAClBy+C,EAAI,OAAO4C,GAAc,SAAW,GAAGA,CAAS,KAAOA,EAEvDG,EAA8B,CAClC,GAAG59C,EACH,GAAI2hB,EAAI,CAAE,YAAaA,CAAA,EAAM,CAAA,EAC7B,GAAIk5B,EAAKpmD,IAAgB,WAAa,CAAE,gBAAiBomD,GAAM,CAAE,kBAAmBA,GAAO,CAAA,CAAC,EAGxFgD,EAAmBxgD,EACvB,eACA,gBAAgB5I,CAAW,GAC3B,gBAAgBwN,CAAO,GACvB,CACE,yBAA0B07C,GAAWlpD,IAAgB,aACrD,CAAC,sBAAsB+oD,CAAS,EAAE,EAAGG,GAAWlpD,IAAgB,aAChE,yBAA0BipD,CAAA,EAE5B3hD,CAAA,EAGF,OACEhB,EAAAA,IAAC,MAAA,CACE,GAAGwB,EACJ,IAAAC,EACA,cAAaF,EACb,KAAK,YACL,mBAAkB7H,EAClB,UAAWopD,EACX,MAAOD,EAEN,SAAAD,GAAWlpD,IAAgB,aAAesG,EAAAA,IAAC,QAAK,UAAU,qBAAsB,SAAAD,EAAS,EAAU,IAAA,CAAA,CAG1G,CAAC,EC/EM,SAASgjD,GAA8Bl6B,EAA0Bm6B,EAAoC,CAC1G,IAAIC,EAAW,EACX/9B,EACAg+B,EAEJ,MAAMC,EAAS,CAAC7rC,EAAcwR,IAAkB,CAC9Cm6B,EAAW3rC,EACXuR,EAAG,GAAGC,CAAI,CACZ,EAEMs6B,EAAY,IAAIt6B,IAAkB,CACtC,MAAM6C,EAAM,KAAK,IAAA,EACX03B,EAAYL,GAAQr3B,EAAMs3B,GAChCC,EAAWp6B,EAEPu6B,GAAa,GAAKA,EAAYL,GAC5B99B,IAAU,SACZ,aAAaA,CAAK,EAClBA,EAAQ,QAEVi+B,EAAOx3B,EAAK7C,CAAI,GACP5D,IAAU,SACnBA,EAAQ,WAAW,IAAM,CACvBA,EAAQ,OACJg+B,IAAa,QACfC,EAAO,KAAK,IAAA,EAAOD,CAAQ,CAE/B,EAAGG,CAAS,EAEhB,EAEA,OAAAD,EAAU,OAAS,IAAY,CACzBl+B,IAAU,SACZ,aAAaA,CAAK,EAClBA,EAAQ,QAEV+9B,EAAW,EACXC,EAAW,MACb,EAEOE,CACT,CClBA,MAAME,GAAoB,CAACC,EAA2BC,IAChD,CAACD,GAAaC,EACT,IAAMA,EAEXD,GAGG,GAGIE,GAAgB1iD,EAAAA,WAAkE,SAC7F,CACE,UAAAC,EACA,YAAAtH,EAAc,aACd,UAAA6pD,EACA,WAAAC,EACA,SAAAzjD,EACA,aAAA2jD,EACA,aAAAC,EAAe,EACf,iBAAAC,EAAmB,eACrB,EACAniD,EACA,CACA,MAAMoiD,EAAa/sD,EAAAA,OAAuB,IAAI,EACxCgtD,EAAmBngD,GAA2BlC,EAAKoiD,CAAU,EAC7D,CAACjzB,EAASmzB,CAAU,EAAI7tD,EAAAA,SAAiBotD,GAAkBC,EAAWC,CAAU,CAAC,EACjF,CAACQ,EAAgBC,CAAiB,EAAI/tD,EAAAA,SAAgC,IAAI,EAC1E,CAACw0B,EAAYC,CAAa,EAAIz0B,EAAAA,SAAS,EAAK,EAElDC,EAAAA,UAAU,IAAM,CACd4tD,EAAWT,GAAkBC,EAAWC,CAAU,CAAC,CACrD,EAAG,CAACD,EAAWC,CAAU,CAAC,EAE1B,MAAMx0B,EAAQ7Y,EAAAA,SAAS,QAAQpW,CAAQ,EACvC,GAAIivB,EAAM,OAAS,EACjB,MAAM,IAAI,MAAM,kCAAkC,EAGpD,MAAMk1B,EAAkB,IAAM,CAC5BD,EAAkBJ,EAAW,OAAO,EACpCl5B,EAAc,EAAI,CACpB,EAEMw5B,EAAkBvpD,EAAAA,QACtB,IACEmoD,GAAUt6C,GAAoB,CAC5B,GAAI,CAACiiB,EAAY,OACjB,MAAM05B,EAAUP,EAAW,QAC3B,GAAI,CAACO,GAAWA,IAAYJ,EAAgB,OAK5C,MAAM5gD,EAAOghD,EAAQ,sBAAA,EACfpuC,EAAQtc,IAAgB,WAAa0J,EAAK,OAASA,EAAK,MACxDihD,EAAS3qD,IAAgB,WAAa+O,EAAE,QAAUrF,EAAK,IAAMqF,EAAE,QAAUrF,EAAK,KAE9EyR,EAAU,KAAK,IAAI,EAAG,KAAK,IAAImB,EAAQ,EAAGquC,CAAM,CAAC,EACvDN,EAAYlvC,EAAUmB,EAAS,GAAG,CACpC,EAAG,IAAO,EAAE,EACd,CAAC0U,EAAYs5B,EAAgBtqD,CAAW,CAAA,EAGpC4qD,EAAgBzsD,EAAAA,YAAY,IAAM,CACtCosD,EAAkB,IAAI,EACtBt5B,EAAc,EAAK,EACnB,SAAS,KAAK,oBAAoB,YAAa25B,CAAa,EAC5D,SAAS,KAAK,oBAAoB,cAAeH,CAAe,CAClE,EAAG,CAACA,CAAe,CAAC,EAEpBhuD,EAAAA,UAAU,IAAM,CACdutD,GAAA,MAAAA,EAAe9yB,EACjB,EAAG,CAACA,EAAS8yB,CAAY,CAAC,EAE1B,MAAMa,EAAoBrtD,GAA0C,CAClE,MAAMstD,EAAc9qD,IAAgB,WAAa,UAAY,YACvD+qD,EAAc/qD,IAAgB,WAAa,YAAc,aAE3DxC,EAAM,MAAQstD,GAChBttD,EAAM,eAAA,EACN6sD,EAAYhsD,GAAS,KAAK,IAAI,EAAGA,EAAO4rD,CAAY,CAAC,GAC5CzsD,EAAM,MAAQutD,GACvBvtD,EAAM,eAAA,EACN6sD,EAAYhsD,GAAS,KAAK,IAAI,IAAKA,EAAO4rD,CAAY,CAAC,GAC9CzsD,EAAM,MAAQ,QACvBA,EAAM,eAAA,EACN6sD,EAAW,CAAC,GACH7sD,EAAM,MAAQ,QACvBA,EAAM,eAAA,EACN6sD,EAAW,GAAG,EAElB,EAEMW,EACJhrD,IAAgB,WAAa,CAAE,OAAQ,GAAG,IAAMk3B,CAAO,GAAA,EAAQ,CAAE,MAAO,GAAG,IAAMA,CAAO,GAAA,EAEpF+zB,EAAkBjrD,IAAgB,WAAa,CAAE,OAAQ,GAAGk3B,CAAO,GAAA,EAAQ,CAAE,MAAO,GAAGA,CAAO,GAAA,EAEpGz6B,OAAAA,EAAAA,UAAU,KACJu0B,GACF,SAAS,KAAK,iBAAiB,YAAa45B,CAAa,EACzD,SAAS,KAAK,iBAAiB,cAAeH,CAAe,EAC7D,SAAS,KAAK,MAAM,OAASzqD,IAAgB,aAAe,WAAa,YAEzE,SAAS,KAAK,MAAM,OAAS,UAGxB,IAAM,CACX,SAAS,KAAK,oBAAoB,YAAa4qD,CAAa,EAC5D,SAAS,KAAK,oBAAoB,cAAeH,CAAe,CAClE,GACC,CAACA,EAAiBG,EAAe55B,EAAYhxB,CAAW,CAAC,EAG1DgP,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,+BAAgC,QAAQ5I,CAAW,GAAIsH,CAAS,EAC9E,IAAK8iD,EACL,cAAY,iBAEZ,SAAA,CAAA9jD,EAAAA,IAAC,MAAA,CAAI,UAAWsC,EAAG,6BAA8B,QAAQ5I,CAAW,EAAE,EAAG,MAAOirD,EAC7E,SAAA31B,EAAM,CAAC,GAAK,GACf,EACAhvB,EAAAA,IAAC,OAAA,CACC,UAAU,+BACV,cAAekkD,EACf,UAAW,GACX,KAAK,YACL,mBAAkBxqD,IAAgB,WAAa,aAAe,WAC9D,gBAAe,KAAK,MAAMk3B,CAAO,EACjC,gBAAe,EACf,gBAAe,IACf,aAAYgzB,EACZ,SAAU,EACV,UAAWW,CAAA,CAAA,EAEbvkD,EAAAA,IAAC,MAAA,CAAI,UAAWsC,EAAG,8BAA+B,QAAQ5I,CAAW,EAAE,EAAG,MAAOgrD,EAC9E,SAAA11B,EAAM,CAAC,GAAK,EAAA,CACf,CAAA,CAAA,CAAA,CAGN,CAAC,EC1HY41B,GAAQ7jD,EAAAA,WAA0D,SAC7E,CACE,OAAA+G,EACA,QAAAmM,EACA,QAAA/M,EAAU,UACV,SAAAnH,EACA,UAAA7E,EAAY,SACZ,oBAAA2pD,EACA,WAAAv5C,EAAa,GACb,GAAG9J,CACL,EACAC,EACA,CACA,KAAM,CAACQ,EAAMuJ,CAAO,EAAItV,EAAAA,SAAe,IAAI,EACrC6e,EAAUje,EAAAA,OAAuB,IAAI,EAE3CX,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC2R,GAAU,CAACwD,GAAc,CAAC2I,EAC7B,OAEF,MAAM/a,EAAahC,GAAyB,CAGtCA,EAAM,MAAQ,UAAY,CAACA,EAAM,kBAAoB8S,GAAkB+K,EAAQ,OAAO,GACxFd,EAAA,CAEJ,EACA,gBAAS,iBAAiB,UAAW/a,CAAS,EAEvC,IAAM,SAAS,oBAAoB,UAAWA,CAAS,CAChE,EAAG,CAAC4O,EAAQwD,EAAY2I,CAAO,CAAC,EAEhC,MAAM6wC,EAAmB,IAAM,CAE3Bt5C,EADEvJ,IAAS,WACH,QACEA,EAGF,KAFA,UAFO,CAMnB,EAEMqb,EAAc,IAAM,CACxBrJ,GAAA,MAAAA,IACAzI,EAAQ,IAAI,CACd,EAEA,OAAOyB,GAAAA,aACLjN,EAAAA,IAACgV,GAAAA,cAAA,CACC,GAAIlN,EACJ,QAAS,GACT,aAAY,GACZ,cAAa,GACb,WAAY,CAAE,UAAW,cAAA,EACzB,OAAM,GACN,QAAAiN,EAEC,aAAY,UACX/U,EAAAA,IAAC,MAAA,CACC,UAAWsC,EAAGuiD,EAAsB,sBAAwB,qBAAqB,EACjF,IAAK9vC,EACL,0BAAwB,GAExB,SAAA/U,EAAAA,IAAC+kD,GAAA,CACC,IAAAtjD,EACA,QAAAwS,EACA,iBAAA6wC,EACA,YAAAxnC,EACA,OAAAxV,EACA,KAAA7F,EACA,UAAA/G,EACA,QAAAgM,EACC,GAAG1F,EAEH,SAAAzB,CAAA,CAAA,CACH,CAAA,EAGFC,EAAAA,IAAC,MAAA,CACC,UAAWsC,EAAG,sBAAuB,YAAa,QAAQpH,CAAS,GAAI,cAAcgM,CAAO,EAAE,EAC9F,IAAK6N,EACL,0BAAwB,GAExB,eAACskB,GAAA,CAAkB,YAAa,IAAM,CAACwrB,GAAuBvnC,IAC5D,SAAAtd,EAAAA,IAAC+kD,GAAA,CACC,IAAAtjD,EACA,QAAAwS,EACA,iBAAA6wC,EACA,YAAAxnC,EACA,OAAAxV,EACA,KAAA7F,EACA,UAAA/G,EACA,QAAAgM,EACC,GAAG1F,EAEH,SAAAzB,CAAA,CAAA,CACH,CACF,CAAA,CAAA,CACF,CAAA,EAGJ,SAAS,IAAA,CAEb,CAAC,EAWKilD,GAAkB9pD,GAAuCA,IAAc,UAAYA,IAAc,MAEjG6pD,GAAaxuD,EAAM,WAAW,SAAoBiL,EAAwBC,EAAgC,CAC9G,KAAM,CACJ,OAAAqG,EACA,UAAA5M,EACA,UAAA8F,EACA,KAAAiB,EAEA,KAAAd,EAAO,MACP,QAAA+F,EACA,QAAA+M,EACA,eAAAgxC,EAAiB,GACjB,kBAAAC,EAAoB,GACpB,qBAAAC,EAAuB,GACvB,UAAAC,EAAY,GACZ,QAAAC,EAAU,GACV,QAAAC,EACA,WAAAC,EAAa,GACb,sBAAAC,EAAwB,eACxB,SAAAC,EACA,MAAAxgD,EACA,YAAAqY,EACA,iBAAAwnC,EACA,SAAA/kD,EACA,cAAewB,EAAa,QAC5B,GAAGsB,CAAA,EACDrB,EACEkkD,EAAc,CAACR,IAAsB,CAAC,CAACjxC,GAAWgxC,GAClDU,EAAuC,CAAA,EACzCV,GACFU,EAAkB,KAChB3lD,EAAAA,IAAC2I,GAAA,CAAO,QAAS,WAAY,KAAK,QAAQ,QAASm8C,EACjD,SAAA9kD,EAAAA,IAACc,GAAA,CAAK,KAAK,cAAA,CAAe,GAD6C,MAEzE,CAAA,EAGAmT,GACF0xC,EAAkB,KAChB3lD,EAAAA,IAAC2I,GAAA,CAAO,QAAS,WAAY,KAAK,QAAQ,QAAS2U,EACjD,SAAAtd,EAAAA,IAACc,GAAA,CAAK,KAAK,OAAA,CAAQ,GAD+C,OAEpE,CAAA,EAGAqkD,GACFQ,EAAkB,QAAA,EAEpB,MAAM5wC,EAAUje,EAAAA,OAAuB,IAAI,EACrCo0B,EAAUp0B,EAAAA,OAAuB,IAAI,EACrC8uD,EAAUjiD,GAAWlC,EAAKsT,EAASmW,CAAO,EAI1C,CAAC26B,EAAUC,CAAW,EAAI5vD,EAAAA,SAAwB,IAAI,EACtDiqB,EAAW6kC,GAAe9pD,CAAS,EAEnClB,EAAQnC,EAAAA,YACXkuD,GAAe,CACd,MAAMC,GAAW7lC,EAAW,OAAO,YAAc,OAAO,WAClDpK,GAAMuvC,GAAA,KAAAA,EAAWU,GACvB,OAAO,KAAK,IAAIX,EAAS,KAAK,IAAItvC,GAAKgwC,CAAE,CAAC,CAC5C,EACA,CAAC5lC,EAAUmlC,EAASD,CAAO,CAAA,EAGvBY,EAAgBpuD,EAAAA,YAAY,IAAM,QACtC,MAAMuL,GAAOnL,GAAAizB,EAAQ,UAAR,YAAAjzB,GAAiB,wBAC9B,OAAKmL,EAGE+c,EAAW/c,EAAK,OAASA,EAAK,MAF5BiiD,CAGX,EAAG,CAACllC,EAAUklC,CAAO,CAAC,EAEhBa,EAAYruD,EAAAA,YACfkuD,GAAe,CACd,MAAMjuD,GAAOkC,EAAM+rD,CAAE,EACrBD,EAAYhuD,EAAI,EAChB2tD,GAAA,MAAAA,EAAW3tD,GACb,EACA,CAACkC,EAAOyrD,CAAQ,CAAA,EAGZU,EAAUrvD,EAAAA,OAA+C,IAAI,EAE7D0S,EAAgB3R,EAAAA,YACnBX,GAA8C,WAC7CA,EAAM,eAAA,EACNivD,EAAQ,QAAU,CAChB,MAAOhmC,EAAWjpB,EAAM,QAAUA,EAAM,QACxC,KAAM+uD,EAAA,CAAc,EAEtB,GAAI,EACFzmD,IAAAvH,GAAAf,EAAM,eAAc,oBAApB,MAAAsI,GAAA,KAAAvH,GAAwCf,EAAM,UAChD,MAAQ,CAER,CACF,EACA,CAACipB,EAAU8lC,CAAa,CAAA,EAGpBG,EAAgBvuD,EAAAA,YACnBX,GAA8C,CAC7C,MAAMmvD,GAAOF,EAAQ,QACrB,GAAI,CAACE,GACH,OAGF,MAAMx3B,IADM1O,EAAWjpB,EAAM,QAAUA,EAAM,SACzBmvD,GAAK,MAEnBC,GAAOprD,IAAc,UAAYA,IAAc,QAAU,CAAC2zB,GAAQA,GACxEq3B,EAAUG,GAAK,KAAOC,EAAI,CAC5B,EACA,CAACnmC,EAAUjlB,EAAWgrD,CAAS,CAAA,EAG3BK,EAAU1uD,cAAaX,GAA8C,iBACzEivD,EAAQ,QAAU,MACd3mD,IAAAvH,GAAAf,EAAM,eAAc,oBAApB,MAAAsI,GAAA,KAAAvH,GAAwCf,EAAM,cAChDymC,IAAAp7B,GAAArL,EAAM,eAAc,wBAApB,MAAAymC,GAAA,KAAAp7B,GAA4CrL,EAAM,WAEtD,EAAG,CAAA,CAAE,EAECsvD,EAAkB3uD,EAAAA,YACrBX,GAA+C,CAC9C,MAAMuvD,GAAOZ,GAAA,KAAAA,EAAYI,EAAA,EACnBlwC,GAAMuvC,GAAA,KAAAA,EAAYnlC,EAAW,OAAO,YAAc,OAAO,WAEzDumC,GACJxrD,IAAc,SACV,UACAA,IAAc,MACZ,YACAA,IAAc,OACZ,aACA,YACJyrD,GACJzrD,IAAc,SACV,YACAA,IAAc,MACZ,UACAA,IAAc,OACZ,YACA,aACNhE,EAAM,MAAQwvD,IAChBxvD,EAAM,eAAA,EACNgvD,EAAUO,GAAOlB,CAAU,GAClBruD,EAAM,MAAQyvD,IACvBzvD,EAAM,eAAA,EACNgvD,EAAUO,GAAOlB,CAAU,GAClBruD,EAAM,MAAQ,QACvBA,EAAM,eAAA,EACNgvD,EAAUb,CAAO,GACRnuD,EAAM,MAAQ,QACvBA,EAAM,eAAA,EACNgvD,EAAUnwC,EAAG,EAEjB,EACA,CAAC8vC,EAAUI,EAAe9lC,EAAUjlB,EAAWgrD,EAAWX,EAAYF,EAASC,CAAO,CAAA,EAGxF/uD,EAAM,UAAU,IAAM,OACpB,GAAI,CAACuR,EAAQ,CACXg+C,EAAY,IAAI,EAChB,MACF,EAEA7tD,EAAAizB,EAAQ,UAAR,MAAAjzB,EAAiB,OACnB,EAAG,CAAC6P,CAAM,CAAC,EAKX,MAAMm0B,EACJmpB,GAAaS,IAAa,KACtB,CAAE,GAAI1lC,EAAW,CAAE,OAAQ0lC,CAAA,EAAa,CAAE,MAAOA,CAAA,EAAa,WAAY,MAAA,EAC1E,CAAA,EAEN,OACE7lD,EAAAA,IAACgV,GAAAA,cAAA,CAAc,GAAIlN,EAAQ,QAAS,IAAK,OAAM,GAAC,WAAY,CAAE,UAAW,oBAAA,EAAwB,QAAAiN,EAC/F,SAAArM,EAAAA,KAAC,MAAA,CACC,IAAKk9C,EACL,cAAarkD,EACZ,GAAGsB,EAIJ,SAAU,GACV,KAAK,SACL,aAAYqE,IAAY,SAAWrE,EAAK,YAAY,EACpD,UAAWP,EAAG,aAActB,EAAW,cAAckG,CAAO,GAAI,QAAQhM,CAAS,GAAI,CACnF,gBAAiB+G,IAAS,WAC1B,aAAcA,IAAS,QACvB,uBAAwBmjD,CAAA,CACzB,EACD,MAAO,CAAE,aAAcjkD,EAAM,GAAG86B,EAAW,GAAGh3B,CAAA,EAE7C,SAAA,CAAAmgD,GACCplD,EAAAA,IAAC,MAAA,CACC,UAAU,0BACV,cAAY,oBACZ,KAAK,YACL,SAAU,EACV,mBAAkBmgB,EAAW,aAAe,WAC5C,aAAYqlC,EACZ,gBAAeH,EACf,gBAAe,KAAK,MAAMC,GAAA,KAAAA,EAAYnlC,EAAW,OAAO,YAAc,OAAO,UAAW,EACxF,gBAAe,KAAK,MAAM0lC,GAAA,KAAAA,EAAYI,GAAe,EACrD,cAAAz8C,EACA,cAAA48C,EACA,YAAaG,EACb,gBAAiBA,EACjB,UAAWC,EAEX,SAAAxmD,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAAA,CAA8B,CAAA,CAAA,EAGjD0lD,GAAe1lD,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAsB,SAAA2lD,EAAkB,EACtE79C,GAAU7F,IAAS,eAAY,MAAA,CAAI,UAAU,oBAAqB,SAAAlC,CAAA,CAAS,CAAA,CAAA,CAAA,EAEhF,CAEJ,CAAC,EC9PK6mD,GAAyG,CAC7G,EAAG,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAA,EAC9B,EAAG,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,CAAA,EAC9B,EAAG,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,CAAA,EAC9B,EAAG,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,CAAA,EAC/B,GAAI,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAA,EAC/B,GAAI,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAA,EAChC,GAAI,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,CAAA,EAC/B,GAAI,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,CAAA,CAClC,EAEMC,GAA0C,CAAC,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,KAAM,IAAI,EAErFC,GAAa,IACjB,OAAO,QAAW,YAAc,CAAE,MAAO,EAAG,OAAQ,CAAA,EAAM,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,WAAA,EAEjGC,GAA2C,CAAE,EAAG,GAAI,EAAG,EAAA,EACvDC,GAAmC,CAAE,MAAO,IAAK,OAAQ,GAAA,EAYlDC,GAAiBlmD,EAAAA,WAC5B,SAAwBS,EAAOC,EAAK,CAClC,KAAM,CACJ,KAAAjF,EACA,MAAA8E,EACA,cAAA4a,EACA,SAAUgrC,EACV,gBAAAC,EAAkBJ,GAClB,iBAAAK,EACA,UAAAC,EACA,KAAMC,EACN,YAAAC,EAAcP,GACd,SAAAvB,EACA,YAAA+B,EACA,SAAAC,EAAW,IACX,UAAAC,EAAY,IACZ,SAAA19B,EACA,UAAA29B,EACA,YAAAC,EAAc,GACd,SAAAC,EAAW,GACX,WAAAtC,EAAa,GACb,OAAAuC,EACA,WAAAC,EACA,UAAW3pC,EACX,iBAAAC,EAAmB,GACnB,kBAAAC,EACA,YAAA0pC,EAAc,GACd,QAAAC,EAAU,GACV,UAAA7C,EAAY,GACZ,WAAA95C,EAAa,GACb,QAAA2I,EACA,oBAAAi0C,EAAsB,cACtB,sBAAA1C,EAAwB,gBACxB,eAAA9qB,EAAiB,eACjB,kBAAAnc,EAAoB,kBACpB,gBAAAC,EAAkB,gBAElB,cAAexV,EACf,UAAAhI,EACA,MAAAiE,EACA,SAAAlF,EACA,cAAewB,EAAa,kBAC5B,GAAGsB,CAAA,EACDrB,EAEE,CAACiK,EAASC,EAAU,EAAIxV,WAAA,EACxBg1B,GAAUp0B,EAAAA,OAAuB,IAAI,EACrCuO,GAAgB1B,GAA2BlC,EAAKypB,EAAO,EACvDoF,GAAUp4B,EAAAA,MAAA,EAEhB9B,GAAoB,IAAM,CACxBsV,GAAW,SAAS,IAAI,CAC1B,EAAG,CAAA,CAAE,EAEL,KAAM,CAACgC,GAAUy6C,CAAW,EAAIhxD,GAA6C,CAC3E,MAAO+vD,EACP,aAAcC,EACd,SAAUC,CAAA,CACX,EACK,CAACjmD,GAAMinD,EAAO,EAAIjxD,GAAyC,CAC/D,MAAOmwD,EACP,aAAcC,EACd,SAAU9B,CAAA,CACX,EACK,CAAC9mC,GAAWC,EAAY,EAAIznB,GAA8B,CAC9D,MAAOinB,EACP,aAAcC,EACd,SAAUC,CAAA,CACX,EAOK+pC,GAAYxwD,EAAAA,YAChB,CAACywD,EAAcC,IAAuB,CACpC,MAAMC,EAAOx+B,GAAA,KAAAA,EAAYu+B,EAAG,MACtBE,GAAOd,GAAA,KAAAA,EAAaY,EAAG,OACvBvwC,GAAQ,KAAK,IAAIyvC,EAAU,KAAK,IAAIe,EAAMF,EAAO,KAAK,CAAC,EACvDrkD,GAAS,KAAK,IAAIyjD,EAAW,KAAK,IAAIe,GAAMH,EAAO,MAAM,CAAC,EAC1D7zB,GAAO,KAAK,IAAImzB,EAAa5vC,EAAK,EAClChc,GAAI,KAAK,IAAIy4B,GAAOzc,GAAO,KAAK,IAAIuwC,EAAG,MAAQ9zB,GAAM6zB,EAAO,CAAC,CAAC,EAC9DrsD,GAAI,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,IAAI,EAAGssD,EAAG,OAAS9zB,EAAI,EAAG6zB,EAAO,CAAC,CAAC,EACvE,MAAO,CAAE,EAAAtsD,GAAG,EAAAC,GAAG,MAAA+b,GAAO,OAAA/T,EAAA,CACxB,EACA,CAAC2jD,EAAaD,EAAW39B,EAAU09B,EAAWD,CAAQ,CAAA,EASlDiB,GAAU7wD,EAAAA,YACd,CAACywD,EAAcC,IAAuB,CACpC,MAAM1zC,EAAUwzC,GAAUC,EAAQC,CAAE,EACpC,MAAO,CACL,GAAG1zC,EACH,EAAG,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAQ,EAAG0zC,EAAG,MAAQ1zC,EAAQ,KAAK,CAAC,EAC5D,EAAG,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAQ,EAAG0zC,EAAG,OAAS1zC,EAAQ,MAAM,CAAC,CAAA,CAElE,EACA,CAACwzC,EAAS,CAAA,EAKN,CAACM,GAAQC,EAAS,EAAI1yD,EAAAA,SAAS,EAAK,EAC1CC,EAAAA,UAAU,IAAM,CAGTqG,GAAMosD,GAAU,EAAK,CAC5B,EAAG,CAACpsD,CAAI,CAAC,EAIT,MAAM/E,GAAU,CAAE,EAAGiW,GAAS,EAAG,EAAGA,GAAS,EAAG,MAAOvM,GAAK,MAAO,OAAQA,GAAK,MAAA,EAC1EiC,GAAOulD,GAASN,GAAU5wD,GAASqvD,GAAA,CAAY,EAAI4B,GAAQjxD,GAASqvD,IAAY,EAIhF+B,GAAU/xD,EAAAA,OAAOsM,EAAI,EAC3BylD,GAAQ,QAAUzlD,GAElB,MAAM0lD,GAAajxD,EAAAA,YACjB,CAACC,EAAYixD,EAAU,KAAe,CAChCA,MAAmB,EAAI,EAC3B,MAAMl0C,EAAUwzC,GAAUvwD,EAAMgvD,GAAA,CAAY,GACxCjyC,EAAQ,IAAMnH,GAAS,GAAKmH,EAAQ,IAAMnH,GAAS,IAAGy6C,EAAY,CAAE,EAAGtzC,EAAQ,EAAG,EAAGA,EAAQ,EAAG,GAChGA,EAAQ,QAAU1T,GAAK,OAAS0T,EAAQ,SAAW1T,GAAK,SAC1DinD,GAAQ,CAAE,MAAOvzC,EAAQ,MAAO,OAAQA,EAAQ,OAAQ,CAE5D,EACA,CAACwzC,GAAW36C,GAAS,EAAGA,GAAS,EAAGy6C,EAAaC,GAASjnD,GAAK,OAAQA,GAAK,KAAK,CAAA,EAG7E6nD,EAAgBlyD,EAAAA,OAAOgyD,EAAU,EACvCE,EAAc,QAAUF,GAKxB3yD,EAAAA,UAAU,IAAM,CACd,GAAI,CAACqG,EAAM,OACX,MAAMysD,EAAmB,IAAYD,EAAc,QAAQH,GAAQ,QAAS,EAAK,EACjF,cAAO,iBAAiB,SAAUI,CAAgB,EAC3C,IAAM,OAAO,oBAAoB,SAAUA,CAAgB,CACpE,EAAG,CAACzsD,CAAI,CAAC,EAMTrG,EAAAA,UAAU,IAAM,CACd,GAAI,CAACqG,GAAQ,CAAC8O,GAAc,CAAC2I,EAAS,OACtC,MAAM/a,EAAahC,GAA+B,CAGhD,GADIA,EAAM,kBACNA,EAAM,MAAQ,SAAU,OAC5B,MAAM6hB,EAAOmS,GAAQ,QACjB,CAACnS,GAAQ,CAACA,EAAK,SAAS,SAAS,aAAa,GAAK5O,GAAqB4O,CAAI,GAChF9E,EAAA,CACF,EACA,gBAAS,iBAAiB,UAAW/a,CAAS,EACvC,IAAM,SAAS,oBAAoB,UAAWA,CAAS,CAChE,EAAG,CAACoS,EAAY2I,EAASzX,CAAI,CAAC,EAE9B,MAAM0sD,EAAWrxD,EAAAA,YAAY,IAAY,CACvCkwD,GAAA,MAAAA,IAGA,MAAMhvC,EAAOmS,GAAQ,QACjBnS,GAAQ,CAACA,EAAK,SAAS,SAAS,aAAa,GAAGA,EAAK,MAAM,CAAE,cAAe,EAAA,CAAM,CACxF,EAAG,CAACgvC,CAAU,CAAC,EAEToB,GAAqBjyD,GAAoD,CAC7E8R,GAAA,MAAAA,EAAoB9R,GACpBgyD,EAAA,CACF,EAIME,GAAOtyD,EAAAA,OAAgE,IAAI,EAE3EuyD,GAA2BnyD,GAAoD,aAGnF,GAFI,CAAC+wD,IAEAhwD,EAAAf,EAAM,SAAN,MAAAe,EAAiC,QAAQ,yBAA0B,OACxEf,EAAM,eAAA,EACN,MAAMO,EAAUoxD,GAAQ,QACxBO,GAAK,QAAU,CAAE,GAAIlyD,EAAM,QAAS,GAAIA,EAAM,QAAS,EAAGO,EAAQ,EAAG,EAAGA,EAAQ,CAAA,EAChF,GAAI,EACF8K,IAAA/C,GAAAtI,EAAM,eAAc,oBAApB,MAAAqL,GAAA,KAAA/C,GAAwCtI,EAAM,UAChD,MAAQ,CAER,CACF,EAEMoyD,GAA2BpyD,GAAoD,CACnF,MAAMqb,EAAQ62C,GAAK,QACd72C,GACLu2C,GAAW,CACT,GAAGD,GAAQ,QACX,EAAGt2C,EAAM,EAAIrb,EAAM,QAAUqb,EAAM,GACnC,EAAGA,EAAM,EAAIrb,EAAM,QAAUqb,EAAM,EAAA,CACpC,CACH,EAEMg3C,GAAWryD,GAAoD,eACnE,GAAIkyD,GAAK,QAAS,CAChBA,GAAK,QAAU,KACf,MAAM3xD,GAAUoxD,GAAQ,QACxBxB,GAAA,MAAAA,EAAY,CAAE,EAAG5vD,GAAQ,EAAG,EAAGA,GAAQ,GACzC,EACI+H,GAAAvH,EAAAf,EAAM,eAAc,oBAApB,MAAAsI,EAAA,KAAAvH,EAAwCf,EAAM,cAChDymC,IAAAp7B,GAAArL,EAAM,eAAc,wBAApB,MAAAymC,GAAA,KAAAp7B,GAA4CrL,EAAM,WAEtD,EAEMsyD,GAAS1yD,EAAAA,OAAoF,IAAI,EAEjG2yD,GAAsB,CAACC,EAA8BxyD,IAAoD,UAC7GA,EAAM,eAAA,EACNA,EAAM,gBAAA,EACNsyD,GAAO,QAAU,CAAE,IAAAE,EAAK,GAAIxyD,EAAM,QAAS,GAAIA,EAAM,QAAS,KAAM2xD,GAAQ,OAAA,EAG5EK,EAAA,EACA,GAAI,EACF1pD,IAAAvH,EAAAf,EAAM,eAAc,oBAApB,MAAAsI,GAAA,KAAAvH,EAAwCf,EAAM,UAChD,MAAQ,CAER,CACF,EAEMyyD,GAAuBzyD,GAAoD,CAC/E,MAAM6xD,EAAUS,GAAO,QACvB,GAAI,CAACT,EAAS,OACd,MAAMa,EAAOhD,GAAYmC,EAAQ,GAAG,EAC9Bc,GAAK3yD,EAAM,QAAU6xD,EAAQ,GAC7Be,GAAK5yD,EAAM,QAAU6xD,EAAQ,GAC7Bx2C,GAAQw2C,EAAQ,KAShBR,GAAKzB,GAAA,EACL0B,GAAOx+B,GAAA,KAAAA,EAAYu+B,GAAG,MACtBE,GAAOd,GAAA,KAAAA,EAAaY,GAAG,OACvBvwC,GAAQ,KAAK,IAAIwwC,GAAM,KAAK,IAAIf,EAAUl1C,GAAM,MAAQq3C,EAAK,GAAKC,EAAE,CAAC,EACrE5lD,GAAS,KAAK,IAAIwkD,GAAM,KAAK,IAAIf,EAAWn1C,GAAM,OAASq3C,EAAK,GAAKE,EAAE,CAAC,EAC9EhB,GAAW,CACT,EAAGc,EAAK,GAAKr3C,GAAM,EAAIA,GAAM,MAAQyF,GAAQzF,GAAM,EACnD,EAAGq3C,EAAK,GAAKr3C,GAAM,EAAIA,GAAM,OAAStO,GAASsO,GAAM,EACrD,MAAAyF,GACA,OAAA/T,EAAA,CACD,CACH,EAEM8lD,GAAa7yD,GAAoD,eACrE,GAAIsyD,GAAO,QAAS,CAClBA,GAAO,QAAU,KACjB,MAAM/xD,GAAUoxD,GAAQ,QACxBrB,GAAA,MAAAA,EAAc,CAAE,MAAO/vD,GAAQ,MAAO,OAAQA,GAAQ,QACxD,EACI+H,GAAAvH,EAAAf,EAAM,eAAc,oBAApB,MAAAsI,EAAA,KAAAvH,EAAwCf,EAAM,cAChDymC,IAAAp7B,GAAArL,EAAM,eAAc,wBAApB,MAAAymC,GAAA,KAAAp7B,GAA4CrL,EAAM,WAEtD,EAMM8yD,GAAqB,CAACC,EAAkBnyD,IAAqB,CACjE,MAAML,EAAU4wD,GAAUvwD,EAAMgvD,GAAA,CAAY,EACxCmD,aAAuB,CAAE,MAAOxyD,EAAQ,MAAO,OAAQA,EAAQ,SAC9D4vD,GAAA,MAAAA,EAAY,CAAE,EAAG5vD,EAAQ,EAAG,EAAGA,EAAQ,GAC9C,EAGMyyD,GAAuBhzD,GAAsD,CACjF,MAAMO,EAAUoxD,GAAQ,QAClB1uD,EAAOjD,EAAM,SAAWquD,EAAasC,EAOrCjvB,GAN0C,CAC9C,UAAW,CAAC,CAACz+B,EAAM,CAAC,EACpB,WAAY,CAACA,EAAM,CAAC,EACpB,QAAS,CAAC,EAAG,CAACA,CAAI,EAClB,UAAW,CAAC,EAAGA,CAAI,CAAA,EAELjD,EAAM,GAAG,EACzB,GAAI,CAAC0hC,GAAG,OACR1hC,EAAM,eAAA,EACN,MAAMY,GAAOZ,EAAM,SACf,CAAE,GAAGO,EAAS,MAAOA,EAAQ,MAAQmhC,GAAE,CAAC,EAAG,OAAQnhC,EAAQ,OAASmhC,GAAE,CAAC,CAAA,EACvE,CAAE,GAAGnhC,EAAS,EAAGA,EAAQ,EAAImhC,GAAE,CAAC,EAAG,EAAGnhC,EAAQ,EAAImhC,GAAE,CAAC,CAAA,EACzDkwB,GAAWhxD,EAAI,EACfkyD,GAAmB9yD,EAAM,SAAUY,EAAI,CACzC,EAEMqyD,GAAyBjzD,GAAqD,CAClF,MAAMO,EAAUoxD,GAAQ,QAClBN,EAAKzB,GAAA,EACX,IAAIhvD,GACJ,GAAIZ,EAAM,MAAQ,aAAeA,EAAM,MAAQ,aAAc,CAC3DA,EAAM,eAAA,EACN,MAAMwyD,GAAMxyD,EAAM,MAAQ,aAAe,EAAI,GAC7CY,GAAO,CAAE,GAAGL,EAAS,MAAOA,EAAQ,MAAQiyD,GAAMnE,CAAA,CACpD,SAAWruD,EAAM,MAAQ,WAAaA,EAAM,MAAQ,YAAa,CAC/DA,EAAM,eAAA,EACN,MAAMwyD,GAAMxyD,EAAM,MAAQ,YAAc,EAAI,GAC5CY,GAAO,CAAE,GAAGL,EAAS,OAAQA,EAAQ,OAASiyD,GAAMnE,CAAA,CACtD,SAAWruD,EAAM,MAAQ,OACvBA,EAAM,eAAA,EACNY,GAAO,CAAE,GAAGL,EAAS,MAAOgwD,EAAU,OAAQC,CAAA,UACrCxwD,EAAM,MAAQ,MACvBA,EAAM,eAAA,EACNY,GAAO,CAAE,GAAGL,EAAS,MAAOuyB,GAAA,KAAAA,EAAYu+B,EAAG,MAAO,OAAQZ,GAAA,KAAAA,EAAaY,EAAG,MAAA,MAE1E,QAEFO,GAAWhxD,EAAI,EACfkyD,GAAmB,GAAMlyD,EAAI,CAC/B,EAEMsyD,EAAkB,IAAYxrC,GAAc7mB,GAAS,CAACA,CAAI,EAEhE,GAAI,CAAC0T,EACH,OAAOzL,EAAAA,IAAA4M,EAAAA,SAAA,EAAE,EAGX,MAAMy9C,GAA6B,CACjC,KAAM,GAAGjnD,GAAK,CAAC,KACf,IAAK,GAAGA,GAAK,CAAC,KACd,MAAO,GAAGA,GAAK,KAAK,KACpB,GAAIub,GAAY,CAAA,EAAK,CAAE,OAAQ,GAAGvb,GAAK,MAAM,IAAA,EAC7C,GAAI0kD,IAAW,OAAY,CAAA,EAAK,CAAE,OAAAA,CAAA,EAClC,GAAI7iD,GAAA,KAAAA,EAAS,CAAA,CAAC,EAGhB,OAAOgI,GAAAA,aACLjN,EAAAA,IAACgV,GAAAA,cAAA,CACC,GAAIxY,EACJ,QAAS,IACT,aAAY,GACZ,cAAa,GACb,OAAM,GACN,WAAY,CAAE,UAAW,8BAAA,EACzB,QAAS0uB,GAET,SAAAxiB,EAAAA,KAAC,MAAA,CACE,GAAG7F,EACJ,IAAKwC,GACL,cAAa9D,EACb,KAAK,SACL,SAAU,GAEV,kBAAiBD,EAAQgvB,GAAUztB,EAAK,iBAAiB,EACzD,UAAWP,EAAG,uBAAwBtB,EAAW,CAAE,iBAAkB2d,GAAW,EAChF,MAAO0rC,GACP,cAAelB,GAEf,SAAA,CAAAzgD,EAAAA,KAAC,MAAA,CACC,UAAU,+BACV,cAAY,yBACZ,cAAe2gD,GACf,cAAeC,GACf,YAAaC,GACb,gBAAiBA,GAMjB,SAAA,CAAAvpD,EAAAA,IAAC,OAAA,CACC,UAAU,6BACV,cAAY,uBACZ,KAAK,SACL,SAAU,EACV,aAAYkoD,EACZ,UAAWgC,GAEX,SAAAlqD,EAAAA,IAACc,GAAA,CAAK,KAAK,gBAAA,CAAiB,CAAA,CAAA,EAE7BQ,QACE,OAAA,CAAK,UAAU,8BAA8B,GAAIgvB,GAC/C,WACH,EACE,KACJ5nB,EAAAA,KAAC,MAAA,CAAI,UAAU,gCAAgC,eAAY,GACxD,SAAA,CAAAwT,EACA8rC,EACChoD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,+BACV,cAAY,2BACZ,aAAY2e,GAAYH,EAAkBD,EAC1C,gBAAe,CAACI,GAChB,QAASyrC,EAET,SAAApqD,EAAAA,IAACc,GAAA,CAAK,KAAM6d,GAAY,eAAiB,kBAAA,CAAoB,CAAA,CAAA,EAE7D,KACH1K,EACCjU,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,+BACV,cAAY,wBACZ,aAAY06B,EACZ,QAASzmB,EAET,SAAAjU,EAAAA,IAACc,GAAA,CAAK,KAAK,OAAA,CAAQ,CAAA,CAAA,EAEnB,IAAA,CAAA,CACN,CAAA,CAAA,CAAA,EAGA6d,GAIE,KAHF3e,EAAAA,IAAC,MAAA,CAAI,UAAU,6BAA6B,cAAY,uBACrD,SAAAD,CAAA,CACH,EAGDqlD,GAAa,CAACzmC,GACXkoC,GAAa,IAAK6C,GAChB1pD,EAAAA,IAAC,MAAA,CAEC,UAAWsC,EAAG,+BAAgC,gCAAgConD,CAAG,EAAE,EACnF,cAAa,0BAA0BA,CAAG,GAGzC,GAAIA,IAAQ,KACT,CACE,KAAM,YACN,SAAU,EACV,aAAclE,EACd,gBAAiBiC,EACjB,gBAAiB,KAAK,MAAMz9B,GAAA,KAAAA,EAAY88B,GAAA,EAAa,KAAK,EAC1D,gBAAiB,KAAK,MAAM1jD,GAAK,KAAK,EACtC,UAAW+mD,EAAA,EAEb,CAAE,cAAe,GAAM,SAAU,EAAA,EACrC,cAAgBjzD,GAAUuyD,GAAoBC,EAAKxyD,CAAK,EACxD,cAAeyyD,GACf,YAAaI,GACb,gBAAiBA,EAAA,EAnBZL,CAAA,CAqBR,EACD,IAAA,CAAA,CAAA,CACN,CAAA,EAEFj+C,CAAA,CAEJ,CACF,ECrlBM6+C,GAAarnC,GAAoCA,IAAM,SAAWA,IAAM,MAAQ,QAAQA,CAAC,GAAKA,EAE9FsnC,GAAchO,GAClB,OAAOA,GAAM,SAAW,wCAAwCA,CAAC,IAAMA,IAAM,OAAS,IAAM,oBAAoBA,CAAC,IAEtGiO,GAAQj0D,EAAM,WAA0D,SACnF,CACE,UAAAu1B,EAAY,SACZ,QAAAq1B,EAAU,KACV,MAAA7sC,EACA,QAAAm2C,EACA,KAAAvJ,EACA,QAAAtwB,EACA,UAAA5vB,EACA,MAAAiE,EACA,SAAAlF,EACA,cAAewB,EAAa,QAC5B,GAAGsB,CACL,EACApB,EACA,CACA,MAAMtI,EAAQgd,EAAAA,SAAS,QAAQpW,CAAQ,EAAE,OAAOqW,gBAAc,EAC9D,OACEpW,EAAAA,IAAC,MAAA,CACC,IAAAyB,EACA,cAAaF,EACb,UAAWe,EAAG,aAActB,CAAS,EACrC,MAAO,CACL,QAAS,OACT,cAAe8qB,EACf,SAAUo1B,EAAO,OAAS,OAC1B,WAAYoJ,GAAUh2C,CAAK,EAC3B,eAAgBg2C,GAAUG,CAAO,EACjC,IAAKF,GAAWpJ,CAAO,EACvB,GAAGl8C,CAAA,EAEJ,GAAGpC,EAEH,WACG1J,EAAM,IAAI,CAAC61B,EAAO/0B,WACf2S,WAAA,CACE,SAAA,CAAA3S,EAAI,EAAI+F,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAuB,WAAQ,EAAS,KAC/DgvB,CAAA,CAAA,EAFY/0B,CAGf,CACD,EACD8F,CAAA,CAAA,CAGV,CAAC,EClDY2qD,GAAOn0D,EAAM,WAAsD,SAC9E,CACE,SAAAyzB,EAAW,KACX,eAAAs4B,EAAiB,GACjB,UAAA3tC,EACA,UAAA3T,EACA,SAAAjB,EACA,cAAewB,EAAa,OAC5B,GAAGsB,CACL,EACApB,EACA,CACA,MAAMmT,EAAOD,GAAA,KAAAA,EAAa,OAC1B,OACE3U,EAAAA,IAAC4U,EAAA,CACC,IAAAnT,EACA,cAAaF,EACb,UAAWe,EAAG,YAAa,iBAAiB0nB,CAAQ,GAAI,CAAE,uBAAwBs4B,CAAA,EAAkBthD,CAAS,EAC5G,GAAG6B,EAEJ,SAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,mBAAoB,SAAAD,CAAA,CAAS,CAAA,CAAA,CAGlD,CAAC,ECtBY4qD,GAAap0D,EAAM,WAAyC,SACvE,CACE,MAAA+K,EACA,SAAA2F,EACA,YAAA2jD,EACA,QAAA92C,EACA,QAAA8c,EAAU,GACV,UAAA5vB,EACA,cAAeO,EAAa,cAC5B,GAAGsB,CACL,EACApB,EACA,CACA,OACEiH,EAAAA,KAAC,SAAA,CACC,IAAAjH,EACA,cAAaF,EACb,UAAWe,EAAG,mBAAoB,CAAE,2BAA4BsuB,CAAA,EAAW5vB,CAAS,EACnF,GAAG6B,EAEH,SAAA,CAAA+nD,EAAc5qD,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAiC,WAAY,EAAS,KACpF0I,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACZ,SAAA,CAAA,OAAOpH,GAAU,SAChBtB,EAAAA,IAACqU,GAAA,CAAW,QAAQ,KAAK,UAAU,KAAK,UAAU,0BAC/C,WACH,EAEArU,MAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAsB,EAAM,EAEjD2F,EACCjH,EAAAA,IAACqU,GAAA,CAAW,QAAQ,QAAQ,MAAM,gBAAgB,UAAU,6BACzD,SAAApN,CAAA,CACH,EACE,IAAA,EACN,EACC6M,EAAU9T,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAA6B,WAAQ,EAAS,IAAA,CAAA,CAC1E,CAAA,CAAA,CAAA,CAGN,CAAC,EC3BD,SAAS6qD,GAAS,CAAE,KAAAv3C,EAAM,MAAA1K,GAA2C,CACnE,KAAM,CAACpM,EAAMC,CAAO,EAAIvG,EAAAA,SAAS,EAAK,EAItC,OAAAipC,GAAmB3iC,EAAM,IAAMC,EAAQ,EAAK,CAAC,EAE3CuD,EAAAA,IAAC0/B,GAAA,CACC,UAAU,+BACV,QAASpsB,EACT,QAAQ,SACR,KAAA9W,EACA,UAAU,MACV,OAAQ,CAAE,QAAS,CAAA,EAEnB,SAAAwD,EAAAA,IAAC,OAAA,CACC,UAAU,4BACV,KAAK,MACL,aAAY4I,GAAA,KAAAA,EAAS0K,EACrB,SAAU,EACV,eAAgB,IAAM7W,EAAQ,EAAI,EAClC,eAAgB,IAAMA,EAAQ,EAAK,EACnC,QAAS,IAAMA,EAAQ,EAAI,EAC3B,OAAQ,IAAMA,EAAQ,EAAK,EAE3B,SAAAuD,EAAAA,IAACc,GAAA,CAAK,KAAK,OAAO,KAAM,EAAA,CAAI,CAAA,CAAA,CAC9B,CAAA,CAGN,CAOO,MAAMgqD,GAAgBv0D,EAAM,WACjC,SACE,CACE,UAAAyK,EACA,MAAAM,EACA,MAAAypD,EAAQ,EACR,MAAAxxD,EACA,KAAAyxD,EACA,UAAAC,EACA,QAAA36B,EACA,SAAArpB,EACA,SAAAlH,EACA,cAAewB,EAAa,iBAC5B,GAAGsB,CAAA,EAELpB,EACA,CACA,MAAMypD,EAAU,IAAIH,CAAK,GACzB,OACEriD,EAAAA,KAAC,SAAA,CACC,cAAanH,EACZ,GAAGsB,EACJ,IAAApB,EACA,UAAWa,EAAG,sBAAuB,6BAA6ByoD,CAAK,GAAI/pD,CAAS,EAEpF,SAAA,CAAA0H,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAA1I,MAACkrD,EAAA,CAAQ,GAAI56B,EAAS,UAAU,6BAC7B,SAAAhvB,EACH,EACwB/H,GAAU,WAAQ,OAAA,CAAK,UAAU,6BAA8B,SAAAA,CAAA,CAAM,EAAU,KACtGyxD,EAAOhrD,EAAAA,IAAC6qD,GAAA,CAAS,KAAMG,EAAM,MAAOC,EAAW,EAAK,IAAA,EACvD,EACChkD,EAAWjH,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAiC,WAAS,EAAS,IAAA,EAChF,EACCD,EAAWC,EAAAA,IAAC,MAAA,CAAI,UAAU,+BAAgC,SAAAD,EAAS,EAAS,IAAA,CAAA,CAAA,CAGnF,CACF,ECvEM+d,GAAOmF,GAAwB,OAAOA,GAAM,SAAW,GAAGA,CAAC,KAAOA,EAE3DkoC,GAAY50D,EAAM,WAA8D,SAC3F,CACE,OAAAuU,EACA,QAAAsgD,EACA,OAAAnwC,EACA,aAAAowC,EAAe,IACf,iBAAAC,EACA,wBAAAC,EAA0B,GAC1B,yBAAAC,EACA,YAAAxD,EAAc,GACd,eAAAyD,EACA,wBAAAC,EAA0B,oBAC1B,sBAAAC,EAAwB,GACxB,aAAA12B,EAAe,GACf,UAAAj0B,EACA,MAAAiE,EACA,SAAAlF,EACA,cAAewB,EAAa,aAC5B,GAAGsB,CACL,EACApB,EACA,CACA,KAAM,CAACkd,EAAWC,CAAY,EAAIznB,GAA8B,CAC9D,MAAOm0D,EACP,aAAcC,EACd,SAAUC,CAAA,CACX,EAEKI,EAAY1zD,EAAAA,MAAA,EAEZmnB,EAAU,CACd,uBAAoCvB,GAAZa,EAAgBgtC,EAA6BN,CAAR,CAAoB,EAGnF,OACE3iD,EAAAA,KAAC,MAAA,CACC,IAAAjH,EACA,cAAaF,EACb,UAAWe,EACT,kBACA,CAAE,gCAAiC2yB,EAAc,4BAA6BtW,CAAA,EAC9E3d,CAAA,EAEF,MAAO,CAAE,GAAGqe,EAAS,GAAGpa,CAAA,EACvB,GAAGpC,EAEH,SAAA,CAAAiI,EAAS9K,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAO,EAAS,KACpE0I,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACZ,SAAA,CAAA0iD,EACC1iD,EAAAA,KAAC,QAAA,CAAM,GAAIkjD,EAAW,UAAU,2BAC7B,SAAA,CAAA5D,EACChoD,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACZ,SAAAyrD,GAAA,KAAAA,EACCzrD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,gCACV,aAAY0rD,EACZ,gBAAe,CAAC/sC,EAChB,gBAAeitC,EACf,QAAS,IAAMhtC,EAAa,CAACD,CAAS,EAEtC,eAAC7d,GAAA,CAAK,KAAM6d,EAAY,gBAAkB,eAAgB,KAAM,EAAA,CAAI,CAAA,CAAA,EAG1E,EACE,KACHysC,CAAA,CAAA,CACH,EACE,KACJ1iD,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACZ,SAAA,CAAA3I,EACAkb,EAASjb,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAO,EAAS,IAAA,CAAA,CACtE,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CAAC,EC3FY6rD,GAAS9qD,EAAAA,WAAqC,SACzD,CACE,UAAAC,EACA,SAAAjB,EACA,MAAA4wB,EACA,SAAAjjB,EAAW,SACX,UAAAxS,EAAY,MACZ,YAAA4wD,EACA,WAAAC,EACA,gBAAAC,EAAkB,SAClB,aAAAC,EACA,MAAA3qD,EACA,MAAAD,EAAQ,UACR,cAAeE,EAAa,UAC5B,GAAGsB,CACL,EACApB,EACA,CACA,MAAMyqD,EAAUhxD,IAAc,MAAQ,SAAW,SAEjD,OACE8E,EAAAA,IAACksD,EAAA,CACC,IAAAzqD,EACA,UAAWa,EACT,cACAtB,EACA,QAAQ0M,CAAQ,GAChB,QAAQxS,CAAS,GACjB,CAAE,aAAcy1B,CAAA,EAChBtvB,IAAU,WAAa,qBAAqBA,CAAK,EAAA,EAEnD,cAAaE,EACZ,GAAGsB,EAEH,SAAA9C,GAGC2I,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oBACZ,SAAA,CAAApH,GAAStB,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAA4B,SAAAsB,EAAM,EAC1DwqD,CAAA,EACH,EACA9rD,EAAAA,IAAC,OAAI,UAAWsC,EAAG,mBAAoB,QAAQ0pD,CAAe,EAAE,EAAI,SAAAD,CAAA,CAAW,EAC/E/rD,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAsB,SAAAisD,CAAA,CAAa,CAAA,CAAA,CACpD,CAAA,CAAA,CAIR,CAAC,ECtCYE,GAAcprD,EAAAA,WAA6D,SACtF,CACE,UAAAC,EACA,UAAAorD,EAAY,IACZ,SAAAC,EAAW,EACX,oBAAAC,EAAsB,EACtB,mBAAAC,EAAqB,EACrB,SAAUC,EACV,SAAAC,EACA,YAAAC,EAAc,YACd,SAAA3sD,EACA,cAAewB,EAAa,cAC5B,GAAGC,CACL,EACAC,EACA,OACA,MAAMnK,EAAek1D,IAAiB,OAChC,CAACG,EAAkBC,CAAmB,EAAI12D,EAAAA,SAAS,EAAK,EACxDk/B,EAAW99B,EAAe,CAAC,CAACk1D,EAAeG,EAC3CE,EAAS12C,EAAAA,SAAS,QAAQpW,CAAQ,EAAE,OAAOqW,gBAAc,EAEzDuI,EAAY,CAACyW,GAAYy3B,EAAO,OAASR,GAAYC,EAAsBC,EAAqBM,EAAO,OAEvGC,EAAe,IAAM,CACzBL,GAAA,MAAAA,IACKn1D,GACHs1D,EAAoB,EAAI,CAE5B,EAEMG,EAAwBpuC,EAC1B,CACE,GAAGkuC,EAAO,MAAM,EAAGP,CAAmB,EACtCtsD,EAAAA,IAAC,SAAA,CAEC,KAAK,SACL,UAAU,2BACV,aAAY0sD,EACZ,QAASI,EACV,SAAA,GAAA,EALK,yBAAA,EAQN,GAAGD,EAAO,MAAMA,EAAO,OAASN,CAAkB,CAAA,EAEpDM,EAEJ,OACE7sD,EAAAA,IAAC,MAAA,CACE,GAAGwB,EACJ,IAAAC,EACA,cAAaF,EAGb,cAAYtJ,EAAAuJ,EAAM,YAAY,IAAlB,KAAAvJ,EAAuB,aACnC,UAAWqK,EAAG,mBAAoBtB,CAAS,EAE3C,SAAAhB,EAAAA,IAAC,KAAA,CAAG,UAAU,yBACX,SAAA+sD,EAAS,IAAI,CAACC,EAAOtyC,IACpBhS,EAAAA,KAACkE,EAAAA,SAAA,CACC,SAAA,CAAA5M,EAAAA,IAAC,KAAA,CAAG,UAAU,yBAA0B,SAAAgtD,EAAM,EAC7CtyC,EAAQqyC,EAAS,OAAS,EACzB/sD,EAAAA,IAAC,KAAA,CAAG,UAAU,8BAA8B,cAAY,OACrD,SAAAosD,CAAA,CACH,EACE,IAAA,CAAA,EANS1xC,CAOf,CACD,CAAA,CACH,CAAA,CAAA,CAGN,CAAC,ECnEKyqB,GAAQ,CAAC5yB,EAAeC,IAC5B,MAAM,KAAK,CAAE,OAAQ,KAAK,IAAIA,EAAMD,EAAQ,EAAG,CAAC,CAAA,EAAK,CAACoI,EAAG1gB,IAAMsY,EAAQtY,CAAC,EAEpEgzD,GAAa,CAAC1zD,EAAe83B,EAAc67B,EAAsBC,IAA4C,CACjH,MAAMC,EAAajoB,GAAM,EAAG,KAAK,IAAIgoB,EAAe5zD,CAAK,CAAC,EACpD8zD,EAAWloB,GAAM,KAAK,IAAI5rC,EAAQ4zD,EAAgB,EAAGA,EAAgB,CAAC,EAAG5zD,CAAK,EAE9E+zD,EAAgB,KAAK,IACzB,KAAK,IAAIj8B,EAAO67B,EAAc3zD,EAAQ4zD,EAAgBD,EAAe,EAAI,CAAC,EAC1EC,EAAgB,CAAA,EAEZI,EAAc,KAAK,IACvB,KAAK,IAAIl8B,EAAO67B,EAAcC,EAAgBD,EAAe,EAAI,CAAC,EAClEG,EAAS,OAAS,EAAIA,EAAS,CAAC,EAAI,EAAI9zD,EAAQ,CAAA,EAGlD,MAAO,CACL,GAAG6zD,EACH,GAAIE,EAAgBH,EAAgB,EAC/B,CAAC,gBAAgB,EAClBA,EAAgB,EAAI5zD,EAAQ4zD,EAC1B,CAACA,EAAgB,CAAC,EAClB,CAAA,EACN,GAAGhoB,GAAMmoB,EAAeC,CAAW,EACnC,GAAIA,EAAch0D,EAAQ4zD,EAAgB,EACrC,CAAC,cAAc,EAChB5zD,EAAQ4zD,EAAgBA,EACtB,CAAC5zD,EAAQ4zD,CAAa,EACtB,CAAA,EACN,GAAGE,CAAA,CAEP,EAEaG,GAAazsD,EAAAA,WAAyC,SACjE,CACE,UAAAC,EACA,MAAAzH,EACA,KAAA83B,EACA,aAAA67B,EAAe,EACf,cAAAC,EAAgB,EAChB,KAAAhsD,EAAO,SACP,QAAA+F,EAAU,SACV,MAAAumD,EAAQ,WACR,MAAApsD,EAAQ,UACR,SAAA+F,EAAW,GACX,gBAAAsmD,EAAkB,GAClB,eAAAC,EAAiB,GACjB,eAAAC,EAAiB,GACjB,eAAAC,EAAiB,GACjB,SAAAx2D,EACA,cAAekK,EAAa,aAC5B,GAAGC,CACL,EACAC,EACA,OACA,MAAMqsD,EAASh3D,EAAAA,OAAoB,IAAI,EACjCi3D,EAAYpqD,GAAwBlC,EAAKqsD,CAAM,EAE/CE,EAAMj0D,GAAmB,CACzBqN,GAAYrN,IAAWs3B,GAAQt3B,EAAS,GAAKA,EAASR,GAG1DlC,GAAA,MAAAA,EAAW0C,EACb,EAEMb,EAAauP,GAAuC,WACxD,GAAI,CAAC,CAAC,YAAa,aAAc,OAAQ,KAAK,EAAE,SAASA,EAAE,GAAG,EAC5D,OAEF,MAAMwlD,EAAU,MAAM,MACpBzuD,GAAAvH,EAAA61D,EAAO,UAAP,YAAA71D,EAAgB,iBAAoC,iDAApD,KAAAuH,EAAsG,CAAA,CAAC,EAEzG,GAAIyuD,EAAQ,SAAW,EACrB,OAEF,MAAMx2D,EAAUw2D,EAAQ,QAAQ,SAAS,aAAkC,EAC3E,IAAIn2D,EAAOL,EACPgR,EAAE,MAAQ,aAAc3Q,EAAO,KAAK,IAAIL,EAAU,EAAGw2D,EAAQ,OAAS,CAAC,EAClExlD,EAAE,MAAQ,YAAa3Q,EAAO,KAAK,IAAIL,EAAU,EAAG,CAAC,EACrDgR,EAAE,MAAQ,OAAQ3Q,EAAO,EACzB2Q,EAAE,MAAQ,QAAO3Q,EAAOm2D,EAAQ,OAAS,GAClDxlD,EAAE,eAAA,GACFlG,EAAA0rD,EAAQn2D,CAAI,IAAZ,MAAAyK,EAAe,OACjB,EAEMpJ,EAAQ8zD,GAAW1zD,EAAO83B,EAAM67B,EAAcC,CAAa,EAE3De,EAAY,CAAC9+C,EAAaxG,EAAe7O,EAAgBgd,EAAkByJ,IAC/EA,EAAS,KACPxgB,EAAAA,IAAC,KAAA,CACC,SAAAA,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,6CACV,aAAY4I,EACZ,SAAUxB,GAAYrN,EAAS,GAAKA,EAASR,EAC7C,QAAS,IAAMy0D,EAAGj0D,CAAM,EAExB,SAAAiG,EAAAA,IAACc,IAAK,KAAMiW,EAAU,KAAM5V,IAAS,QAAU,GAAK,EAAA,CAAI,CAAA,CAAA,GARnDiO,CAUT,EAGJ,OACEpP,EAAAA,IAAC,MAAA,CACE,GAAGwB,EACJ,IAAKusD,EACL,cAAaxsD,EAGb,cAAYtJ,EAAAuJ,EAAM,YAAY,IAAlB,KAAAvJ,EAAuB,aACnC,UAAWqK,EACT,kBACA,mBAAmBnB,CAAI,GACvB,mBAAmB+F,CAAO,GAC1B,yBAAyBumD,CAAK,GAC9BpsD,IAAU,WAAa,yBAAyBA,CAAK,GACrD,CAAE,2BAA4B+F,CAAA,EAC9BpG,CAAA,EAGF,SAAA0H,EAAAA,KAAC,KAAA,CAAG,UAAU,wBAAwB,UAAAxP,EACnC,SAAA,CAAAg1D,EAAU,QAAS,aAAc,EAAG,aAAc,CAACR,CAAe,EAClEQ,EAAU,OAAQ,gBAAiB78B,EAAO,EAAG,eAAgBu8B,CAAc,EAC3Ez0D,EAAM,IAAI,CAAC0tB,EAAMnM,IAChB,OAAOmM,GAAS,eACb,KAAA,CACC,SAAA7mB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWsC,EAAG,wBAAyB,CAAE,iCAAkCukB,IAASwK,EAAM,EAC1F,eAAcxK,IAASwK,EAAO,OAAS,OACvC,SAAAjqB,EACA,QAAS,IAAM4mD,EAAGnnC,CAAI,EAErB,SAAAA,CAAA,CAAA,CACH,EATOA,CAUT,EAEA7mB,EAAAA,IAAC,MAA4B,UAAU,4BAA4B,cAAY,OAAO,SAAA,KAA7E,GAAG6mB,CAAI,IAAInM,CAAK,EAEzB,CAAA,EAGHwzC,EAAU,OAAQ,YAAa78B,EAAO,EAAG,gBAAiBw8B,CAAc,EACxEK,EAAU,OAAQ,YAAa30D,EAAO,YAAa,CAACo0D,CAAc,CAAA,CAAA,CACrE,CAAA,CAAA,CAGN,CAAC,EC5IKQ,GAAiB,GAEVC,GAAUrtD,EAAAA,WAAyC,SAC9D,CACE,UAAAC,EACA,MAAAg2C,EACA,WAAAqX,EACA,YAAA30D,EAAc,aACd,iBAAA40D,EAAmB,GACnB,YAAAC,EACA,cAAehtD,EAAa,UAC5B,GAAGC,CACL,EACAC,EACA,CACA,MAAM+sD,EAAO90D,IAAgB,OACvB+0D,EACJzuD,EAAAA,IAAC,MAAA,CACE,GAAGwB,EACJ,IAAAC,EACA,cAAaF,EAEb,aAAYitD,EAAO,OAAO,KAAK,IAAIxX,EAAM,OAAQmX,EAAc,CAAC,EAAK3sD,EAAyB,YAAY,EAC1G,UAAWc,EACT,eACAksD,EAAO,4CAA8C,gBAAgB90D,CAAW,GAChF,CAAE,yBAA0B40D,GAAoB50D,IAAgB,UAAA,EAChEsH,CAAA,EAGD,SAAAg2C,EAAM,IAAI,CAAC78C,EAAMugB,IAAU,OAC1B,MAAMg0C,EAAYh0C,EAAQ2zC,EACpB31D,EAASgiB,IAAU2zC,EACnBxgC,EAASnT,IAAUs8B,EAAM,OAAS,EAClCt0B,EAAY,EAAQ6rC,GAAgB,CAACp0D,EAAK,SAE1Cw0D,EAAiBz3D,GAAyC,CAC1DwrB,IAAcxrB,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACvDA,EAAM,eAAA,EACNq3D,GAAA,MAAAA,EAAc7zC,GAElB,EAEA,cACG9N,WAAA,CACC,SAAA,CAAAlE,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,qBAAsB,CAClC,4BAA6B5J,EAC7B,+BAAgCg2D,EAChC,2BAA4Bv0D,EAAK,MACjC,8BAA+BA,EAAK,SACpC,+BAAgCuoB,CAAA,CACjC,EACD,eAAchqB,EAAS,OAAS,OAChC,gBAAeyB,EAAK,UAAY,OAChC,KAAMuoB,EAAY,SAAW,OAC7B,SAAUA,EAAY,EAAI,OAC1B,QAASA,EAAY,IAAM6rC,GAAA,YAAAA,EAAc7zC,GAAS,OAClD,UAAWgI,EAAYisC,EAAgB,OAEvC,SAAA,CAAA3uD,EAAAA,IAAC,OAAI,UAAU,qBAAqB,cAAY,OAC7C,UAAA/H,EAAAkC,EAAK,OAAL,KAAAlC,EAAcy2D,EAAY1uD,EAAAA,IAACc,IAAK,KAAK,QAAQ,KAAM,EAAA,CAAI,QAAM,OAAA,CAAM,SAAA4Z,EAAQ,EAAE,CAAA,CAChF,EACAhS,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACb,SAAA,CAAA1I,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAuB,SAAA7F,EAAK,MAAM,EACjDA,EAAK,SAAW6F,MAAC,OAAA,CAAK,UAAU,yBAA0B,SAAA7F,EAAK,SAAS,EAAU,KAClFA,EAAK,YAAc6F,MAAC,OAAA,CAAK,UAAU,4BAA6B,SAAA7F,EAAK,YAAY,EAAU,IAAA,CAAA,CAC9F,CAAA,CAAA,CAAA,EAEA0zB,EAA0E,KAAjE7tB,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA0B,cAAY,OAAO,CAAK,CAAA,EAzB/D0a,CA0Bf,CAEJ,CAAC,CAAA,CAAA,EAML,OAAO8zC,EAAOxuD,MAAC,MAAA,CAAI,UAAU,oBAAqB,WAAQ,EAASyuD,CACrE,CAAC,ECzFM,SAASG,GAAa,CAC3B,MAAAz1D,EACA,KAAAkO,EAAO,YACP,UAAAnM,EACA,aAAcyuB,EACd,SAAAviB,EACA,UAAApG,CACF,EAA0C,CACxC,MAAMrE,EAAY7F,EAAAA,OAAqD,IAAI,EACrE,CAAC0F,EAAMC,CAAO,EAAIvG,EAAAA,SAAS,EAAK,EAChCyH,EAAQ,IAAYlB,EAAQ,EAAK,EAEvC,cACG,OAAA,CAAK,UAAW6F,EAAG,qBAAsBtB,CAAS,EACjD,SAAA,CAAAhB,EAAAA,IAAC2I,GAAA,CACC,IAAKhM,EACL,QAAQ,OACR,KAAK,QACL,KAAA0K,EACA,aAAYsiB,GAAA,KAAAA,EAAa,eACzB,gBAAc,OACd,SAAU,CAAC,CAACviB,EACZ,QAAS,IAAM3K,EAAS9G,GAAU,CAACA,CAAK,CAAA,CAAA,QAEzCw1C,GAAA,CAAK,OAAQ3uC,EAAM,QAASmB,EAAO,cAAehB,EAAU,QAAU,GAAIzB,EAAY,CAAE,UAAAA,GAAc,CAAA,EACpG,SAAA/B,EAAM,IAAK0tB,GACVne,EAAAA,KAAC4/B,GAAA,CAEC,UAAWhmC,EAAG,CAAE,mCAAoCukB,EAAK,OAAQ,EACjE,SAAUA,EAAK,SACf,QAAS,IAAM,OACTA,EAAK,YACT5uB,EAAA4uB,EAAK,WAAL,MAAA5uB,EAAA,KAAA4uB,GACAlpB,EAAA,EACF,EAEC,SAAA,CAAAkpB,EAAK,KAAO,OAAOA,EAAK,MAAS,SAAW7mB,EAAAA,IAACc,GAAA,CAAK,KAAM+lB,EAAK,IAAA,CAAM,EAAKA,EAAK,KAAO,KACpFA,EAAK,KAAA,CAAA,EAVDA,EAAK,EAAA,CAYb,CAAA,CACH,CAAA,EACF,CAEJ,CC/CO,MAAMgoC,GAAU9tD,EAAAA,WAAsC,SAC3D,CACE,UAAAC,EACA,QAAAkG,EAAU,UACV,UAAA4nD,EACA,WAAYC,EACZ,kBAAAC,EAAoB,KACpB,mBAAAC,EACA,YAAAjH,EAAc,GACd,UAAW5pC,EACX,iBAAAC,EAAmB,GACnB,kBAAAC,EACA,wBAAAotC,EAA0B,oBAC1B,GAAG7oD,CACL,EACApB,EACA,OACA,MAAMnK,EAAey3D,IAAmB,OAClC,CAACG,EAAiBC,CAAkB,EAAIj5D,EAAAA,SAAwB84D,CAAiB,EACjFI,EAAa93D,EAAey3D,EAAiBG,EAE7C,CAACvwC,EAAWC,CAAY,EAAIznB,GAA8B,CAC9D,MAAOinB,EACP,aAAcC,EACd,SAAUC,CAAA,CACX,EAIK+wC,EAAmBrH,GAAerpC,EAAY,cAAgBzX,EAEpE,OACEwB,EAAAA,KAAC,QAAA,CACC,IAAAjH,EACA,UAAWa,EAAG,eAAgBtB,EAAW,QAAQquD,CAAgB,GAAI,CACnE,2BAA4BrH,EAC5B,yBAA0BA,GAAerpC,CAAA,CAC1C,EACA,GAAG9b,EAEJ,MAAM5K,EAAA4K,EAAK,OAAL,KAAA5K,EAAa,UAElB,SAAA,CAAA+vD,GACChoD,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACb,SAAAA,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,6BACV,aAAY0rD,EACZ,gBAAe,CAAC/sC,EAChB,QAAS,IAAMC,EAAa,CAACD,CAAS,EAEtC,eAAC7d,GAAA,CAAK,KAAM6d,EAAY,gBAAkB,eAAgB,KAAM,EAAA,CAAI,CAAA,CAAA,EAExE,EAEF3e,EAAAA,IAAC,OAAI,UAAU,oBACZ,aACC8uD,GAAA,YAAAA,EAAW,IAAI,CAACjoC,EAAM6R,IACpB14B,EAAAA,IAACsoC,GAAA,CAEC,GAAIzhB,EAAK,GACT,SAAUuoC,IAAe12B,EACzB,QAAUjwB,GAAM,OACTnR,GACH63D,EAAmBz2B,CAAG,EAExBu2B,GAAA,MAAAA,EAAqBv2B,IACrBzgC,EAAA4uB,EAAK,UAAL,MAAA5uB,EAAA,KAAA4uB,EAAepe,EACjB,EACA,KAAMoe,EAAK,KACX,MAAOA,EAAK,MACZ,KAAMA,EAAK,KACX,QAASwoC,CAAA,EAbJ32B,CAAA,GAeR,CACL,CAAA,CAAA,CAAA,CAGN,CAAC,EAcD,SAAS4P,GAAS,CAChB,SAAAxa,EACA,KAAAzmB,EACA,MAAA/F,EACA,GAAAguD,EAAK,MACL,KAAAxmD,EACA,YAAaC,EACb,QAAA7B,EACA,GAAGrE,CACL,EAAkB,CAChB,MAAMyG,EAAY/S,EAAM,OAAyB,IAAI,EAE/CgT,EAAerS,GAA4C,CAC/D6R,GAAA,MAAAA,EAAkB7R,EACpB,EAGMsS,EAAiBtS,GAA8C,QACnEe,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAC9B,EAEMuS,EAAgBzJ,EAAAA,IAACwC,GAAA,CAAO,UAAW8G,CAAA,CAAW,EAE9CimD,EAAcD,EAEpB,OACE5mD,EAAAA,KAAC6mD,EAAA,CACC,KAAAzmD,EACA,KAAK,WACL,UAAWxG,EAAG,qBAAsB,gBAAiB4E,EAAS,CAAE,OAAQ4mB,EAAU,EAClF,YAAAvkB,EACA,cAAAC,EACC,GAAG3G,EAEH,SAAA,CAAAwE,GAAQrH,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAuB,SAAAqH,EAAK,EACpD/F,GAAStB,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAwB,SAAAsB,EAAM,EACvDmI,CAAA,CAAA,CAAA,CAGP,CC5IO,MAAM+lD,GAAYzuD,EAAAA,WAAwC,SAC/D,CACE,UAAAC,EACA,UAAA8tD,EAAY,CAAA,EACZ,aAAAh0D,EAAe,EACf,WAAYi0D,EACZ,kBAAAC,EAAoB,KACpB,mBAAAC,EACA,sBAAAQ,EAAwB,kBACxB,GAAG5sD,CACL,EACApB,EACA,OACA,MAAMnK,EAAey3D,IAAmB,OAClC,CAACG,EAAiBC,CAAkB,EAAIj5D,EAAAA,SAAwB84D,CAAiB,EACjFI,EAAa93D,EAAey3D,EAAiBG,EAE7C,CAACQ,EAAcC,CAAe,EAAIz5D,EAAAA,SAAS,EAAK,EAChD,CAAC05D,EAAgBC,CAAiB,EAAI35D,EAAAA,SAA6B,IAAI,EAEvE45D,EAAmB,KAAK,IAAI,EAAGh1D,CAAY,EAC3Ci1D,EAAen1D,EAAAA,QAAQ,IAAMk0D,EAAU,MAAM,EAAGgB,CAAgB,EAAG,CAAChB,EAAWgB,CAAgB,CAAC,EAChGE,EAAgBp1D,UAAQ,IAAMk0D,EAAU,MAAMgB,CAAgB,EAAG,CAAChB,EAAWgB,CAAgB,CAAC,EAC9FG,EAAcD,EAAc,OAAS,EACrCE,EAAiBD,GAAeb,IAAe,MAAQA,GAAcU,EAErEK,EAAaz1C,GAAkB,CAC9BpjB,GACH63D,EAAmBz0C,CAAK,EAE1Bu0C,GAAA,MAAAA,EAAqBv0C,EACvB,EAEM01C,EAAe,CAAC11C,EAAe2G,IAC3BnqB,GAA4C,CAClDi5D,EAAUz1C,CAAK,EACf2G,GAAA,MAAAA,EAAUnqB,EACZ,EAGIm5D,EAAmB,IAAM,CAC7BV,EAAiB53D,GAAS,CAACA,CAAI,CACjC,EAEMu4D,EAAkB,IAAM,CAC5BX,EAAgB,EAAK,CACvB,EAEA,OAEEjnD,EAAAA,KAAC,MAAA,CAAI,IAAAjH,EAAU,UAAWa,EAAG,kBAAmBtB,CAAS,EAAI,GAAG6B,EAAM,MAAM5K,EAAA4K,EAAK,OAAL,KAAA5K,EAAa,aACvF,SAAA,CAAAyQ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBAAuB,KAAK,UACxC,SAAA,CAAAqnD,EAAa,IAAI,CAAClpC,EAAM6R,IACvB14B,EAAAA,IAACuwD,GAAA,CAEC,GAAI1pC,EAAK,GACT,SAAUuoC,IAAe12B,EACzB,QAAS03B,EAAa13B,EAAK7R,EAAK,OAAO,EACvC,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,KAAMA,EAAK,IAAA,EANN6R,CAAA,CAQR,EACAu3B,GACCjwD,EAAAA,IAACuwD,GAAA,CACC,IAAKV,EACL,SAAUK,EACV,QAASG,EACT,KAAMrwD,EAAAA,IAACc,GAAA,CAAK,KAAK,OAAO,KAAM,GAAI,EAClC,aAAY2uD,EACZ,gBAAc,OACd,gBAAeC,CAAA,CAAA,CACjB,EAEJ,EACCO,GACCjwD,EAAAA,IAACmrC,GAAA,CAAK,OAAQukB,EAAc,QAASY,EAAiB,cAAeV,EAAgB,UAAU,MAAM,MAAK,GACvG,WAAc,IAAI,CAAC/oC,EAAM6R,IAAQ,CAChC,MAAMgiB,EAAYoV,EAAmBp3B,EAErC,OACEhwB,EAAAA,KAAC4/B,GAAA,CAEC,SAAU8mB,IAAe1U,EACzB,KAAM7zB,EAAK,KACX,QAAU3vB,GAAU,OAClBi5D,EAAUzV,CAAS,GACnBziD,EAAA4uB,EAAK,UAAL,MAAA5uB,EAAA,KAAA4uB,EAAe3vB,GACfo5D,EAAA,CACF,EAEC,SAAA,CAAAzpC,EAAK,KAAO7mB,EAAAA,IAAC2oC,GAAA,CAAc,SAAA9hB,EAAK,KAAK,EAAkB,WACvD+hB,GAAA,CAAa,MAAO,CAAC/hB,EAAK,KAAO,WAAK,KAAA,CAAM,CAAA,CAAA,EAVxC6zB,CAAA,CAaX,CAAC,CAAA,CACH,CAAA,CAAA,CAEJ,CAEJ,CAAC,EAYK6V,GAAUxvD,EAAAA,WAAyC,SACvD,CAAE,SAAA+sB,EAAU,KAAAzmB,EAAM,MAAA/F,EAAO,GAAAguD,EAAK,MAAO,KAAAxmD,EAAM,YAAaC,EAAiB,GAAGlG,CAAA,EAC5EpB,EACA,CACA,MAAM6H,EAAY/S,EAAM,OAAyB,IAAI,EAE/CgT,EAAerS,GAA4C,CAC/D6R,GAAA,MAAAA,EAAkB7R,EACpB,EAEMsS,EAAiBtS,GAA8C,QACnEe,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAC9B,EAEMq4D,EAAcD,EAEpB,OACE5mD,EAAAA,KAAC6mD,EAAA,CACC,IAAA9tD,EACA,KAAAqH,EACA,KAAK,WACL,UAAWxG,EAAG,wBAAyB,CAAE,+BAAgCwrB,EAAU,EACnF,YAAAvkB,EACA,cAAAC,EACC,GAAG3G,EAEH,SAAA,CAAAwE,GAAQrH,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA8B,SAAAqH,EAAK,EAC3D/F,EAAQtB,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAA+B,WAAM,EAAU,KACxEA,EAAAA,IAACwC,GAAA,CAAO,UAAW8G,CAAA,CAAW,CAAA,CAAA,CAAA,CAGpC,CAAC,EC7JM,SAASknD,GAA8B3nC,EAA0Bm6B,EAAoC,CAC1G,IAAI99B,EAEJ,MAAMurC,EAAY,IAAI3nC,IAAkB,CAClC5D,IAAU,QACZ,aAAaA,CAAK,EAGpBA,EAAQ,WAAW,IAAM,CACvBA,EAAQ,OACR2D,EAAG,GAAGC,CAAI,CACZ,EAAGk6B,CAAI,CACT,EAEA,OAAAyN,EAAU,OAAS,IAAY,CACzBvrC,IAAU,SACZ,aAAaA,CAAK,EAClBA,EAAQ,OAEZ,EAEOurC,CACT,CCXO,MAAMC,GAAMn6D,EAAM,WAA4D,SAAaiL,EAAOC,EAAK,CAC5G,KAAM,CACJ,UAAAT,EACA,MAAA4H,EACA,SAAAklB,EAAW,GACX,WAAAvM,EACA,KAAAla,EACA,QAAAktB,EAAU,GACV,IAAAo8B,EACA,SAAAvpD,EACA,YAAa2B,EAEb,cAAeC,EACf,GAAGnG,CAAA,EACDrB,EACE8H,EAAY/S,EAAM,OAAyB,IAAI,EAE/CgT,EAAerS,GAAmE,CACtF6R,GAAA,MAAAA,EAAkB7R,EACpB,EAGMsS,EAAiBtS,GAAqE,OAC1F8R,GAAA,MAAAA,EAAoB9R,IACpBe,EAAAqR,EAAU,UAAV,MAAArR,EAAmB,SAASf,EAC9B,EAEM0d,EAAM+7C,GAAA,KAAAA,EAAQA,GAAO,SACrBjuD,EAAUJ,EAAG,WAAYtB,EAAW,CACxC,mBAAoB8sB,EACpB,oBAAqByG,EACrB,qBAAsBntB,CAAA,CACvB,EAED,OACEsB,EAAAA,KAACkM,EAAA,CACE,GAAG/R,EACJ,IAAApB,EACA,UAAWiB,EACX,YAAA6G,EACA,cAAAC,EAIA,KAAM,MACN,gBAAeskB,EACf,gBAAe1mB,GAAYvE,EAAK,eAAe,EAC/C,SAAUirB,EAAW,EAAI,GACzB,SAAUlZ,IAAQ,SAAWxN,EAAW,OAExC,SAAA,CAAAsB,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAoB,IAAK6Y,EACtC,SAAA,CAAAla,GAAQrH,EAAAA,IAAC,OAAA,CAAK,UAAU,iBAAkB,SAAAqH,EAAK,EAC/CuB,GAAS5I,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAwB,SAAA4I,CAAA,CAAM,CAAA,EAC1D,EACA5I,MAACwC,IAAO,UAAW8G,EAAW,QAAS,CAAE,MAAO,oBAAoB,CAAG,CAAA,CAAA,CAAA,CAG7E,CAAC,ECtEKsnD,GAAgBt5C,IACZ,EAAI,KAAK,IAAI,KAAK,GAAKA,EAAO,KAAK,GAAK,CAAC,GAAK,EASjD,SAASu5C,GACd9yD,EACA+yD,EACA7+B,EACArzB,EAAmB,CAAA,EACnBhJ,EAAkC,IAAM,CAExC,EACA,CACA,KAAM,CAAE,KAAAm7D,EAAOH,GAAc,SAAAhuD,EAAW,KAAQhE,EAEhD,IAAI2T,EAAoC,KACxC,MAAM+Q,EAAOvlB,EAAQ+yD,CAAQ,EAC7B,IAAIE,EAAY,GAEhB,MAAMC,EAAS,IAAM,CACnBD,EAAY,EACd,EAEM72D,EAAQ8c,GAAmC,CAC/C,GAAI+5C,EAAW,CACbp7D,EAAG,IAAI,MAAM,qBAAqB,CAAC,EACnC,MACF,CAEI2c,IAAU,OACZA,EAAQ0E,GAGV,MAAMK,EAAO,KAAK,IAAI,GAAIL,EAAY1E,GAAS3P,CAAQ,EAGvD,GAFA7E,EAAQ+yD,CAAQ,EAAIC,EAAKz5C,CAAI,GAAK2a,EAAK3O,GAAQA,EAE3ChM,GAAQ,EAAG,CACb,sBAAsB,IAAM,CAC1B1hB,EAAG,IAAI,CACT,CAAC,EACD,MACF,CAEA,sBAAsBuE,CAAI,CAC5B,EAEA,OAAImpB,IAAS2O,GACXr8B,EAAG,IAAI,MAAM,oCAAoC,CAAC,EAC3Cq7D,IAGT,sBAAsB92D,CAAI,EACnB82D,EACT,CCfA,MAAMC,GAAwB,CAC5B,KAAM,CAAA,EACN,QAAS,CAAA,CACX,EAGMC,GAAc,GAOPC,GAAO76D,EAAM,WAAsC,SAAciL,EAAOC,EAAK,CACxF,KAAM,CACJ,UAAAT,EACA,SAAAjB,EACA,SAAA1I,EACA,MAAA1B,EACA,iBAAA07D,EAAmB,GACnB,WAAAC,EAAa,GACb,cAAAC,EAAgB,GAChB,MAAA5gC,EAAQ,GACR,oBAAA6gC,EAAsB,mBACtB,uBAAAC,EAAyB,sBACzB,aAAc9nC,EACd,GAAG9mB,CAAA,EACDrB,EACE,CAACkwD,EAASC,CAAU,EAAIp7D,EAAM,SAAS,EAAK,EAC5C,CAACq7D,EAAgBC,CAAiB,EAAIt7D,EAAM,SAAyB26D,EAAqB,EAG1F,CAACprD,EAAUC,CAAW,EAAIxP,EAAM,SAAmB,CAAE,MAAO,GAAO,IAAK,GAAO,EAE/Eu7D,EAAUv7D,EAAM,OAAuB,IAAI,EAC3Cw7D,EAAax7D,EAAM,OAAuB,IAAI,EAG9Cy7D,EAAsB,GAEtBC,EAAc,IAAM,CACxB,MAAMC,EAAWJ,EAAQ,QAEzB,IAAIK,EAEJ,GAAID,EAAU,CACZ,MAAM9uD,EAAO8uD,EAAS,sBAAA,EAEtBC,EAAW,CACT,YAAaD,EAAS,YACtB,WAAYA,EAAS,WACrB,UAAWA,EAAS,UACpB,YAAaA,EAAS,YACtB,IAAK9uD,EAAK,IACV,OAAQA,EAAK,OACb,KAAMA,EAAK,KACX,MAAOA,EAAK,KAAA,CAEhB,CAEA,IAAIgvD,EAA0B,KAC1BC,EAAiC,KAKrC,GAHKN,EAAW,SACd,QAAQ,MAAM,iCAAiC,EAE7CG,GAAYH,EAAW,QAAS,CAClC,MAAMhyD,EAAWgyD,EAAW,QAAQ,SAEpC,GAAIhyD,EAAS,OAAS,EAAG,CACvB,MAAMuyD,EAAMvyD,EAASpK,CAAK,EAI1B,GAFAy8D,EAAUE,EAAMA,EAAI,sBAAA,EAA0B,KAE1CjB,EAAkB,CAEpB,MAAMvkD,EAAUwlD,EAAMA,EAAI,cAAc,oBAAoB,EAAI,KAChED,EAAiBvlD,EAAUA,EAAQ,sBAAA,EAA0B,IAC/D,CACF,CACF,CACA,MAAO,CAAE,SAAAqlD,EAAU,QAAAC,EAAS,eAAAC,CAAA,CAC9B,EAEME,EAAuB3pC,GAAiB,IAAM,CAClD,KAAM,CAAE,SAAAupC,EAAU,QAAAC,EAAS,eAAAC,CAAA,EAAmBJ,EAAA,EAC9C,IAAIO,EAAa,EAEbJ,GAAWD,IACbK,EAAa,GAAKJ,EAAQ,KAAOD,EAAS,KAAOA,EAAS,aAG5D,MAAMM,EAAoC,CACxC,KAAM,CACJ,KAAMD,EACN,MAAOJ,EAAUA,EAAQ,MAAQ,CAAA,CACnC,EASF,GANIf,GAAoBgB,IACtBI,EAAkB,QAAU,CAC1B,MAAOJ,EAAe,KAAA,GAItB,MAAMT,EAAe,KAAK,IAAI,GAAK,MAAMA,EAAe,KAAK,KAAK,EACpEC,EAAkBY,CAAiB,MAC9B,CACL,MAAMC,EAAS,KAAK,IAAId,EAAe,KAAK,KAAOa,EAAkB,KAAK,IAAI,EACxEE,EAAQ,KAAK,IAAIf,EAAe,KAAK,MAAQa,EAAkB,KAAK,KAAK,GAE3EC,GAAU,GAAKC,GAAS,IAC1Bd,EAAkBY,CAAiB,CAEvC,CACF,CAAC,EAEKG,EAAS,CAACC,EAAqB,CAAE,UAAA56C,EAAY,EAAA,EAAS,KAAO,CAC5D65C,EAAQ,UAGT75C,EACF44C,GAAQiB,EAAQ,QAAS,aAAce,EAAa,CAClD,SAAU,GAAA,CACX,EAEDf,EAAQ,QAAQ,WAAae,EAEjC,EAEMC,EAAiBlqC,GAAiB,IAAM,CAC5C,MAAM9e,EAAOgoD,EAAQ,QACf/7C,EAAMjM,EAAOA,EAAK,YAAcA,EAAK,YAAc,EACnDhS,EACJgS,GAAQwnD,EACJ,CAAE,MAAOxnD,EAAK,WAAa,EAAG,IAAKA,EAAK,WAAaiM,EAAM,CAAA,EAC3D,CAAE,MAAO,GAAO,IAAK,EAAA,EAC3BhQ,EAAahO,GAAUA,EAAK,QAAUD,EAAK,OAASC,EAAK,MAAQD,EAAK,IAAMC,EAAOD,CAAK,CAC1F,CAAC,EAEKi7D,EAAgBjnC,GAAsB,CAC1C,MAAMhiB,EAAOgoD,EAAQ,QACjBhoD,GACF8oD,EAAO9oD,EAAK,WAAagiB,EAAYhiB,EAAK,YAAcqnD,EAAW,CAEvE,EAEM6B,EAAyBpqC,GAAkB3Q,GAAuB,CACtE,KAAM,CAAE,SAAAk6C,EAAU,QAAAC,CAAA,EAAYH,EAAA,EAE9B,GAAI,GAACG,GAAW,CAACD,IAIjB,GAAIC,EAAQ,KAAOD,EAAS,KAAM,CAEhC,MAAMc,EAAkBd,EAAS,YAAcC,EAAQ,KAAOD,EAAS,MACvES,EAAOK,EAAkBjB,EAAqB,CAAE,UAAA/5C,CAAA,CAAW,CAC7D,SAAWm6C,EAAQ,MAAQD,EAAS,MAAO,CAEzC,MAAMc,EAAkBd,EAAS,YAAcC,EAAQ,MAAQD,EAAS,OACxES,EAAOK,EAAkBjB,EAAqB,CAAE,UAAA/5C,CAAA,CAAW,CAC7D,EACF,CAAC,EAED1hB,EAAM,UAAU,IAAM,CACpBo7D,EAAW,EAAI,CACjB,EAAG,CAAA,CAAE,EAELp7D,EAAM,UAAU,IAAM,CACpBg8D,EAAA,CACF,CAAC,EAEDh8D,EAAM,UAAU,IAAM,SACpB,MAAMkvD,EAAW+K,GAAS,IAAM,CAC1BsB,EAAQ,UACVS,EAAA,EACAO,EAAA,EAEJ,EAAG,GAAG,EACN,GAAI,CAAChB,EAAQ,SAAW,CAACA,EAAQ,QAAQ,cAAc,YAAa,CAClE,QAAQ,MAAM,wDAAwD,EACtE,MACF,CACA,MAAMoB,EAAqCpB,EAAQ,QAAQ,cAAc,YAEzEoB,EAAO,iBAAiB,SAAUzN,CAAQ,EAC1C,MAAM/O,EAAWob,EAAQ,QACzBpb,EAAS,iBAAiB,SAAUoc,EAAgB,CAAE,QAAS,GAAM,EAErE,IAAIK,EAIJ,OAAI,OAAO,gBAAmB,cAC5BA,EAAiB,IAAI,eAAe1N,CAAQ,EAC5C0N,EAAe,QAAQzc,CAAQ,EAE/B,MAAM,MAAKl3C,GAAAvH,EAAA85D,EAAW,UAAX,YAAA95D,EAAoB,WAApB,KAAAuH,EAAgC,EAAE,EAAE,QAASwvB,GAAU,CAChEmkC,EAAe,QAAQnkC,CAAK,CAC9B,CAAC,GAEH8jC,EAAA,EAEO,IAAM,CACXrN,EAAS,OAAA,EAETyN,EAAO,oBAAoB,SAAUzN,CAAQ,EAC7C/O,EAAS,oBAAoB,SAAUoc,CAAc,EAEjDK,GACFA,EAAe,WAAA,CAEnB,CACF,EAAG,CAACZ,EAAsBO,CAAc,CAAC,EAEzCv8D,EAAM,UAAU,IAAM,CAEpBy8D,EAAuB9B,KAA0BU,CAAc,CACjE,EAAG,CAACoB,EAAwBpB,CAAc,CAAC,EAI3C,MAAMwB,EAAO78D,EAAM,SAAS,QAAQwJ,CAAQ,EACzC,OAAQivB,GAAiDz4B,EAAM,eAAey4B,CAAK,CAAC,EACpF,IAAI,CAACA,EAAOtU,IACXnkB,EAAM,aAAay4B,EAAO,CACxB,SAAUr5B,IAAU+kB,EAEpB,QAAUxjB,GAA+C,UACvDsI,GAAAvH,EAAA+2B,EAAM,OAAM,UAAZ,MAAAxvB,EAAA,KAAAvH,EAAsBf,GACtBG,EAASH,EAAOwjB,CAAK,CACvB,CAAA,CACW,CAAA,EAGX24C,EAAoB/B,GAAcC,IAAkBzrD,EAAS,OAASA,EAAS,KAErF,OACE4C,EAAAA,KAAC,MAAA,CACC,UAAWpG,EACT,YACA,CACE,mBAAoBquB,EACpB,4BAA6B7qB,EAAS,MACtC,0BAA2BA,EAAS,GAAA,EAEtC9E,CAAA,EAEF,KAAM,WACN,IAAAS,EACC,GAAGoB,EAEH,SAAA,CAAAwwD,GACCrzD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,2DACV,aAAYwxD,EACZ,SAAU,CAAC1rD,EAAS,MACpB,QAAS,IAAMitD,EAAa,EAAE,EAE9B,SAAA/yD,EAAAA,IAACc,GAAA,CAAK,KAAK,eAAe,KAAM,EAAA,CAAI,CAAA,CAAA,EAGxC4H,EAAAA,KAAC,MAAA,CACC,UAAWpG,EAAG,sBAAuB,CACnC,kCAAmCgvD,CAAA,CACpC,EACD,IAAKQ,EAEL,SAAA,CAAA9xD,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAAyB,IAAK+xD,EAAY,KAAK,UAAU,aAAYpoC,EACjF,SAAAypC,CAAA,CACH,EACC1B,GACC1xD,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAuB,MAAO4xD,EAAe,KAC3D,SAAA5xD,MAAC,QAAK,UAAU,+BAA+B,MAAO4xD,EAAe,QAAS,CAAA,CAChF,CAAA,CAAA,CAAA,EAGHyB,GACCrzD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,yDACV,aAAYyxD,EACZ,SAAU,CAAC3rD,EAAS,IACpB,QAAS,IAAMitD,EAAa,CAAC,EAE7B,SAAA/yD,EAAAA,IAACc,GAAA,CAAK,KAAK,gBAAgB,KAAM,EAAA,CAAI,CAAA,CAAA,CACvC,CAAA,CAAA,CAIR,CAAC"}
|