fui-material 2.6.0 → 2.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/f-ui-kit.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"f-ui-kit.es.js","sources":["../src/material/FButton/FButton.tsx","../src/icons/FTrashIcon/FTrashIcon.tsx","../src/material/FFile/FFile.tsx","../src/material/FButtonFile/FButtonFile.tsx","../src/icons/FLoadIcon/FLoadIcon.tsx","../src/material/FTextField/FTextField.tsx","../src/material/FStack/FStack.tsx","../src/material/GridComponents/FGrid/FGrid.tsx","../src/material/GridComponents/FGridRow/FGridRow.tsx","../src/material/FContainer/FContainer.tsx","../src/material/FPaper/FPaper.tsx","../src/material/TableComponents/FTableHead/FTableHead.tsx","../src/material/TableComponents/FTableBody/FTableBody.tsx","../src/material/TableComponents/FTable/FTable.tsx","../src/material/TableComponents/FTableRow/FTableRow.tsx","../src/material/TableComponents/FTableHeaderCell/FTableHeaderCell.tsx","../src/material/TableComponents/FTableDataCell/FTableDataCell.tsx","../src/material/TableComponents/FTableFooter/FTableFooter.tsx","../src/material/Dialog/FDialog/FDialog.tsx","../src/icons/FCloseIcon/FCloseIcon.tsx","../src/material/Dialog/FDialogHeader/FDialogHeader.tsx","../src/material/Dialog/FDialogBody/FDialogBody.tsx","../src/material/Dialog/FDialogFooter/FDialogFooter.tsx","../src/material/FProgress/FProgress.tsx","../src/material/FPreloader/FPreloader.tsx","../src/material/FCheckbox/FCheckbox.tsx","../src/material/FRadioButton/FRadioButton.tsx","../src/material/FPagination/hooks/usePagination.tsx","../src/material/FPagination/FPagination.tsx","../src/material/TimelineComponents/FTimeline/FTimeline.tsx","../src/material/TimelineComponents/FTimelineCard/FTimelineCard.tsx","../src/icons/FArrowIcon/FArrowIcon.tsx","../src/material/FOpenImgFull/FOpenImgFull.tsx","../src/material/FAccordion/FAccordion.tsx","../src/material/FInputFileForm/FInputFileForm.tsx","../src/material/SelectComponents/FSelect/FSelect.tsx","../src/material/SelectComponents/FSelectItem/FSelectItem.tsx","../src/material/FFullDateField/FFullDateField.tsx","../src/material/FSelectSearchDb/FSelectSearchDb.tsx","../src/material/FTextArea/FTextArea.tsx","../src/dop-function/fGenerateUniqueId/fGenerateUniqueId.ts","../src/material/FAlert/FAlert.tsx","../src/material/FNative/FNative.tsx","../src/material/Tabs/FTabs/FTabs.tsx","../src/material/Tabs/FTab/FTab.tsx","../src/material/Dropdown/FDropdown/FDropdown.tsx","../src/material/Dropdown/FDropdownItem/FDropdownItem.tsx","../src/material/FSearchBox/FSearchBox.tsx","../src/material/CarouselComponent/static/arrow-left.svg","../src/material/CarouselComponent/static/arrow-right.svg","../src/material/CarouselComponent/FCarousel/FCarousel.tsx","../src/material/CarouselComponent/FCarouselItem/FCarouselItem.tsx","../src/material/FSkeleton/FSkeleton.tsx","../src/material/NavigateBarComponents/FNavigateBar/FNavigateBar.tsx","../src/material/NavigateBarComponents/FNavigateBarItem/FNavigateBarItem.tsx","../src/material/MenuLinks/FMenuBlockLinks/FMenuBlockLinks.tsx","../src/material/MenuLinks/FMenuLinks/FMenuLinks.tsx","../src/material/FTooltip/FTooltip.tsx","../src/material/FSearchableSelect/FSearchableSelect.tsx","../src/icons/FPlusIcon/FPlusIcon.tsx","../src/icons/FCheckIcon/FCheckIcon.tsx","../src/icons/FListIcon/FListIcon.tsx","../src/icons/FPenIcon/FPenIcon.tsx","../src/icons/FDownloadIcon/FDownloadIcon.tsx","../src/icons/FCopyAddIcon/FCopyAddIcon.tsx","../src/icons/FUnlinkIcon/FUnlinkIcon.tsx","../src/icons/FFilterIcon/FFilterIcon.tsx","../src/icons/FDocumentIcon/FDocumentIcon.tsx","../src/icons/FReloadIcon/FReloadIcon.tsx","../src/icons/FMinusIcon/FMinusIcon.tsx","../src/icons/FInfoCircleIcon/FInfoCircleIcon.tsx","../src/icons/FSafeIcon/FSafeIcon.tsx","../src/icons/FArrowRightCircleIcon/FArrowRightCircleIcon.tsx","../src/icons/FArrowLeftCircleIcon/FArrowLeftCircleIcon.tsx","../src/icons/FArrowUpCircleIcon/FArrowUpCircleIcon.tsx","../src/icons/FArrowDownCircleIcon/FArrowDownCircleIcon.tsx","../src/function-elements/fAlert/fAlert.ts","../src/function-elements/fConfirm/fConfirm.ts","../src/function-elements/fPrompt/fPrompt.ts","../src/function-elements/fExportTableToExcel/dop-function/export-excel/tszip.min.ts","../src/function-elements/fExportTableToExcel/dop-function/export-excel/core.ts","../src/function-elements/fExportTableToExcel/dop-function/jsxToHtml.ts","../src/function-elements/fExportTableToExcel/fExportTableToExcel.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/getCellData.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/createXmlTags.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/convertHtmlToXml/createRow.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/convertHtmlToXml/convertHtmlTbToXml.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/contentTypes.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/_rels/rels.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/docProps/app.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/_rels/documentXmlRels.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/fontTable.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/settings.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/document.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/styles.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/theme/theme1.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/webSettings.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/generateDocx.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/convertHtmlToXml/convertJsxElementToXml.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/jsxToHtml.ts","../src/function-elements/fExportHtmlOrJsxToWord/fExportHtmlOrJsxToWord.ts","../src/function-elements/fExportingHtmlToDocx/fExportingHtmlToDocx.ts","../src/function-elements/fExportingHtmlToXlsx/fExportingHtmlToXlsx.ts","../src/function-elements/fExportingHtmlToXlsx/fInstallFormatCodeXlsx.ts","../src/function-elements/Notification/fNotification/fNotification.ts","../src/function-elements/Notification/fNotificationDelete/fNotificationDelete.ts","../src/function-elements/fConvertFileToBase64/fConvertFileToBase64.ts","../src/function-elements/fDownloadFileFromBase64/fDownloadFileFromBase64.ts","../src/function-elements/fDownloadBlobFile/fDownloadBlobFile.ts","../src/function-elements/fBankRound/fBankRound.ts","../src/function-elements/fFormatRuNumber/fFormatRuNumber.ts","../src/function-elements/fConvertDate/fConvertDate.ts","../src/hooks/useFApi/useFApi.ts","../src/pages/error-boundary/Page.tsx"],"sourcesContent":["import styles from \"./FButton.module.scss\";\r\nimport { forwardRef } from 'react';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FButton.\r\n *\r\n * @interface IFButton\r\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\r\n */\r\nexport interface IFButton extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n /**\r\n * Дочерние элементы, отображаемые внутри кнопки (например, текст или иконка).\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Вариант стилей кнопки: заполненный (`contained`) или контурный (`default`).\r\n * @type {'contained' | 'default'}\r\n * @default 'contained'\r\n */\r\n variant?: 'contained' | 'default';\r\n\r\n /**\r\n * Цветовая схема кнопки.\r\n * @type {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер кнопки.\r\n * @type {'btn-lg' | 'btn-sm' | 'btn-xs'}\r\n * @default 'btn-sm'\r\n */\r\n size?: 'btn-lg' | 'btn-sm' | 'btn-xs';\r\n\r\n /**\r\n * Флаг, указывающий, должна ли кнопка занимать всю доступную ширину.\r\n * @type {boolean}\r\n * @default false\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Дополнительные инлайновые стили для кнопки.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Обработчик события клика на кнопку.\r\n * @type {React.MouseEventHandler<HTMLButtonElement> | undefined}\r\n */\r\n onClick?: React.MouseEventHandler<HTMLButtonElement> | undefined;\r\n\r\n /**\r\n * ID кнопки для идентификации в DOM.\r\n * @type {string}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Тип кнопки.\r\n * @type {\"button\" | \"submit\" | \"reset\" | undefined}\r\n * @default \"button\"\r\n */\r\n type?: \"button\" | \"submit\" | \"reset\" | undefined;\r\n}\r\n\r\n/**\r\n * Компонент `FButton` — универсальная кнопка с поддержкой цветовых схем, размеров и вариантов оформления.\r\n *\r\n * Кнопка поддерживает:\r\n * - разные цвета (`primary`, `secondary`, `success`, `danger`, `warning`, `info`, `light`, `dark`, `link`)\r\n * - разные размеры (`btn-lg`, `btn-sm`, `btn-xs`)\r\n * - типы (`contained`, `default`)\r\n * - дополнительные стили и классы\r\n * - автоматическое установление ширины через `fullWidth`\r\n *\r\n * @component\r\n * @example\r\n * // Пример простой кнопки\r\n * <FButton\r\n * variant=\"contained\"\r\n * color=\"primary\"\r\n * size=\"btn-lg\"\r\n * fullWidth={true}\r\n * onClick={() => alert('Клик!')}\r\n * >\r\n * Отправить\r\n * </FButton>\r\n *\r\n * @example\r\n * // Контурная кнопка с пользовательским классом и стилем\r\n * <FButton\r\n * variant=\"default\"\r\n * color=\"danger\"\r\n * style={{ fontWeight: 'bold' }}\r\n * className=\"custom-button\"\r\n * >\r\n * Отменить\r\n * </FButton>\r\n *\r\n * @param {React.ReactNode} children - Содержимое кнопки.\r\n * @param {'contained' | 'default'} [variant='contained'] - Тип кнопки: заполненная или контурная.\r\n * @param {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'} [color='primary'] - Цвет кнопки.\r\n * @param {'btn-lg' | 'btn-sm' | 'btn-xs'} [size='btn-sm'] - Размер кнопки.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {boolean} [fullWidth=false] - Если true, кнопка занимает 100% ширины родителя.\r\n * @param {React.MouseEventHandler<HTMLButtonElement>} [onClick] - Обработчик клика.\r\n * @param {\"button\" | \"submit\" | \"reset\"} [type='button'] - HTML-тип кнопки.\r\n * @param {string} [id] - Уникальный идентификатор кнопки.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<button>` с заданными стилями и пропсами.\r\n */\r\nconst FButton = forwardRef<HTMLButtonElement, IFButton>(({\r\n children,\r\n variant = 'contained',\r\n color = 'primary',\r\n size = 'btn-sm',\r\n st,\r\n fullWidth,\r\n ...props\r\n}, ref) => {\r\n const inputId = props.id || `button-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n let style: React.CSSProperties = { width: 'fit-content' }\r\n\r\n if (fullWidth) {\r\n if (style === undefined) {\r\n style = { width: '100%' };\r\n } else {\r\n style.width = '100%';\r\n }\r\n }\r\n\r\n style = st !== undefined ? { ...style, ...st } : style;\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n style={style}\r\n type={'button'}\r\n {...props}\r\n id={inputId}\r\n className={\r\n `${styles['btn']} ${styles[size]} ${styles[`btn${variant === 'contained' ? '-' : '-outline-'}${color}`]} ${props.className || ''}`\r\n }\r\n >\r\n {children}\r\n </button>\r\n );\r\n});\r\n\r\nFButton.displayName = 'FButton';\r\n\r\nexport default FButton;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTrashIcon.\r\n * @interface IFTrashIcon\r\n */\r\nexport interface IFTrashIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: React.SVGAttributes<SVGSVGElement>['width'];\r\n\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.SVGAttributes<SVGSVGElement>['style'];\r\n\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: React.SVGAttributes<SVGSVGElement>['id'];\r\n\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: React.SVGAttributes<SVGSVGElement>['className'];\r\n\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: React.DOMAttributes<SVGSVGElement>['onClick'];\r\n \r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FTrashIcon представляет собой SVG иконку корзины с возможностью настройки цвета, размера и обработки кликов.\r\n * \r\n * @function FTrashIcon\r\n * @param {IFTrashIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n * \r\n * @example\r\n * <FTrashIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n *\r\n */\r\n\r\nconst FTrashIcon = React.forwardRef<SVGSVGElement, IFTrashIcon>((\r\n {\r\n color = \"primary\",\r\n size = 32,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n }, ref\r\n) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n onClick={handleClick}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z\" />\r\n <path fillRule=\"evenodd\"\r\n d=\"M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFTrashIcon.displayName = 'FTrashIcon';\r\n\r\nexport default FTrashIcon;\r\n","import { FC } from 'react';\r\n\r\nimport FTrashIcon from '@icons/FTrashIcon';\r\nimport styles from './FFile.module.scss';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FFile.\r\n *\r\n * @interface IFFile\r\n */\r\nexport interface IFFile {\r\n /**\r\n * Уникальный идентификатор элемента (HTML id).\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для кастомизации внешнего вида.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили, применяемые к контейнеру файла.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Функция-обработчик удаления файла.\r\n * Вызывается при нажатии на иконку \"Удалить\".\r\n * @type {() => void | undefined}\r\n */\r\n handleDelete?: () => void;\r\n\r\n /**\r\n * Обязательное имя файла, отображается в интерфейсе.\r\n * @type {string}\r\n */\r\n name: string;\r\n\r\n /**\r\n * Размер файла в байтах. Отображается в КБ.\r\n * @type {number | undefined}\r\n */\r\n size?: number;\r\n\r\n /**\r\n * Прогресс загрузки файла в процентах (0-100).\r\n * @type {number | undefined}\r\n */\r\n progress?: number;\r\n}\r\n\r\n/**\r\n * Компонент `FFile` — отображает карточку одного файла с возможностью удаления\r\n * и индикатором прогресса загрузки.\r\n *\r\n * Используется в связке с `FButtonFile` или другими компонентами,\r\n * где нужно показать загруженный файл с именем, размером и кнопкой удаления.\r\n *\r\n * @component\r\n * @example\r\n * <FFile\r\n * name=\"report.pdf\"\r\n * size={20480} // 20 КБ\r\n * progress={75} // 75% загружено\r\n * handleDelete={() => console.log('Файл удален')}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским классом и стилем\r\n * <FFile\r\n * name=\"photo.jpg\"\r\n * size={987654} // ~964 КБ\r\n * className=\"custom-file-card\"\r\n * st={{ margin: '1rem 0' }}\r\n * />\r\n *\r\n * @param {string} [id] - ID элемента.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {() => void} [handleDelete] - Callback при клике на удаление.\r\n * @param {string} name - Имя файла (обязательное).\r\n * @param {number} [size] - Размер файла в байтах (необязательно, отображается в КБ).\r\n * @param {number} [progress] - Прогресс загрузки в процентах (0-100).\r\n *\r\n * @returns {JSX.Element} — Рендерит карточку файла с именем, размером, прогрессом и иконкой удаления.\r\n */\r\nconst FFile: FC<IFFile> = ({\r\n id,\r\n className,\r\n st,\r\n handleDelete,\r\n name,\r\n size,\r\n progress\r\n}) => {\r\n return (\r\n <div\r\n className={`${styles['file-preview-card']} ${className || ''}`}\r\n id={id}\r\n style={st}\r\n >\r\n <div className={styles['file-preview-info']}>\r\n <span className={styles['file-preview-name']} title={name}>\r\n {name}\r\n </span>\r\n {typeof size === 'number' && (\r\n <span className={styles['file-preview-size']}>\r\n {Math.round(size / 1024)} КБ\r\n </span>\r\n )}\r\n </div>\r\n {handleDelete && (\r\n <div className={styles[\"trash-icon\"]}>\r\n <FTrashIcon\r\n size={20}\r\n color=\"danger\"\r\n handleClick={handleDelete}\r\n />\r\n </div>\r\n )}\r\n {typeof progress === 'number' && (\r\n <div className={`${styles.progressBar} ${progress === 100 ? styles.completed : ''}`}>\r\n <div \r\n className={styles.progress}\r\n style={{ width: `${progress}%` }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FFile;","import { useRef, useState } from 'react';\r\n\r\nimport defaultStyles from './FButtonFile.module.scss';\r\nimport FButton from '@material/FButton/FButton';\r\nimport FFile from '@material/FFile';\r\n\r\n/**\r\n * Типы вариантов цвета кнопки.\r\n * @typedef {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'} ButtonColorType\r\n */\r\ntype ButtonColorType = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n/**\r\n * Типы вариантов отображения кнопки.\r\n * @typedef {'contained' | 'default'} ButtonVariantType\r\n */\r\ntype ButtonVariantType = 'contained' | 'default';\r\n\r\n/**\r\n * Размеры кнопок.\r\n * @typedef {'btn-lg' | 'btn-sm' | 'btn-xs'} ButtonSizeType\r\n */\r\ntype ButtonSizeType = 'btn-lg' | 'btn-sm' | 'btn-xs';\r\n\r\n/**\r\n * Направление расположения файлов.\r\n * @typedef {\"row\" | \"row-reverse\" | \"column\" | \"column-reverse\"} FlexDirectionType\r\n */\r\ntype FlexDirectionType = 'row' | 'row-reverse' | 'column' | 'column-reverse';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FButtonFile.\r\n *\r\n * @interface IFButtonFile\r\n */\r\nexport interface IFButtonFile {\r\n /**\r\n * Дочерние элементы, отображаемые внутри кнопки.\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Вариант кнопки: заполненный (`contained`) или контурный (`default`).\r\n * @type {ButtonVariantType}\r\n * @default contained\r\n */\r\n variant?: ButtonVariantType;\r\n\r\n /**\r\n * Цветовая схема кнопки.\r\n * @type {ButtonColorType}\r\n * @default primary\r\n */\r\n color?: ButtonColorType;\r\n\r\n /**\r\n * Размер кнопки.\r\n * @type {ButtonSizeType}\r\n * @default btn-sm\r\n */\r\n size?: ButtonSizeType;\r\n\r\n /**\r\n * Флаг блокировки кнопки и поля ввода файла.\r\n * @type {boolean}\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Дополнительные инлайновые стили для контейнера.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Пользовательский CSS-класс.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю ширину.\r\n * @type {boolean}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Обязательное поле (HTML5 required).\r\n * @type {boolean}\r\n */\r\n required?: boolean;\r\n\r\n /**\r\n * Callback, вызываемый при выборе файла(ов).\r\n * @param {File[] | null} file - Массив выбранных файлов или `null`, если файлы удалены.\r\n */\r\n onChange: (file: File[] | null) => void;\r\n\r\n /**\r\n * Разрешает выбор нескольких файлов.\r\n * @type {boolean}\r\n */\r\n multiple?: boolean;\r\n\r\n /**\r\n * Список типов файлов, разрешённых к загрузке.\r\n * Например: `'image/*'`, `'application/pdf'`\r\n * @type {string}\r\n */\r\n accept?: string;\r\n\r\n /**\r\n * Направление отображения предпросмотра файлов.\r\n * @type {FlexDirectionType}\r\n */\r\n direction?: FlexDirectionType;\r\n}\r\n\r\n/**\r\n * Компонент `FButtonFile` — кнопка для выбора файла(ов), которая:\r\n * - оборачивает стандартный `<input type=\"file\">`\r\n * - предоставляет предпросмотр файлов\r\n * - поддерживает удаление загруженных файлов\r\n * - интегрирована с `FButton` и `FTrashIcon`\r\n *\r\n * @component\r\n * @example\r\n * <FButtonFile\r\n * variant=\"contained\"\r\n * color=\"primary\"\r\n * multiple={true}\r\n * onChange={(files) => console.log(files)}\r\n * >\r\n * Загрузить файлы\r\n * </FButtonFile>\r\n *\r\n * @example\r\n * // Только изображения\r\n * <FButtonFile\r\n * variant=\"default\"\r\n * color=\"secondary\"\r\n * accept=\"image/*\"\r\n * onChange={(files) => files && alert(`${files.length} файл(ов) загружено`)}\r\n * />\r\n *\r\n * @param {React.ReactNode} [children] - Контент кнопки.\r\n * @param {ButtonVariantType} [variant='contained'] - Вариант кнопки.\r\n * @param {ButtonColorType} [color='primary'] - Цвет кнопки.\r\n * @param {ButtonSizeType} [size='btn-sm'] - Размер кнопки.\r\n * @param {boolean} [disabled=false] - Блокировка кнопки.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [className] - Дополнительный CSS-класс.\r\n * @param {boolean} [fullWidth=false] - Настройка ширины.\r\n * @param {string} [id] - ID элемента.\r\n * @param {boolean} [multiple=false] - Поддержка множественного выбора.\r\n * @param {string} [accept] - Фильтр допустимых форматов.\r\n * @param {FlexDirectionType} [direction='row'] - Расположение файлов.\r\n * @param {Function} onChange - Callback с массивом файлов.\r\n */\r\nconst FButtonFile = ({\r\n children,\r\n variant = 'contained',\r\n color = 'primary',\r\n size = 'btn-sm',\r\n disabled,\r\n st,\r\n className,\r\n fullWidth,\r\n id,\r\n onChange,\r\n multiple = false,\r\n accept,\r\n direction = 'row',\r\n required,\r\n}: IFButtonFile) => {\r\n const fileRef = useRef<HTMLInputElement>(null);\r\n const [files, setFiles] = useState<File[]>([]);\r\n const [uploadProgress, setUploadProgress] = useState<{ [key: string]: number }>({});\r\n\r\n const style = fullWidth ? { ...st, width: '100%' } : st;\r\n\r\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!e.target.files || e.target.files.length === 0) return;\r\n\r\n const selectedFiles = Array.from(e.target.files);\r\n setFiles((prev) => [...prev, ...selectedFiles]);\r\n onChange([...selectedFiles]);\r\n\r\n // Имитация прогресса загрузки\r\n selectedFiles.forEach(file => {\r\n let progress = 0;\r\n const interval = setInterval(() => {\r\n progress += 10;\r\n setUploadProgress(prev => ({ ...prev, [file.name]: progress }));\r\n if (progress >= 100) clearInterval(interval);\r\n }, 200);\r\n });\r\n };\r\n\r\n const handleRemoveFile = (index: number) => {\r\n setFiles((prev) => {\r\n const updatedFiles = prev.filter((_, i) => i !== index);\r\n if (updatedFiles.length === 0) {\r\n onChange(null);\r\n if (fileRef.current) fileRef.current.value = '';\r\n } else {\r\n onChange(updatedFiles);\r\n }\r\n return updatedFiles;\r\n });\r\n\r\n // Удаляем прогресс при удалении файла\r\n const fileName = files[index].name;\r\n setUploadProgress(prev => {\r\n const newProgress = { ...prev };\r\n delete newProgress[fileName];\r\n return newProgress;\r\n });\r\n };\r\n\r\n return (\r\n <div className={defaultStyles['f-button-file']} style={style}>\r\n <FButton\r\n variant={variant}\r\n color={color}\r\n size={size}\r\n disabled={disabled}\r\n className={className}\r\n style={style}\r\n id={id}\r\n onClick={() => fileRef.current?.click()}\r\n >\r\n {children}\r\n </FButton>\r\n\r\n <input\r\n ref={fileRef}\r\n type=\"file\"\r\n style={{ display: \"none\" }}\r\n multiple={multiple}\r\n accept={accept}\r\n onChange={handleFileChange}\r\n disabled={disabled}\r\n required={required}\r\n />\r\n\r\n {/* Предпросмотр файлов */}\r\n {files.length > 0 && (\r\n <div className={defaultStyles[\"custom-files-preview\"]} id=\"files\" style={{ marginTop: '16px' }}>\r\n <div className={defaultStyles[\"file-preview-list\"]} style={{ flexDirection: direction }}>\r\n {files.map((opt, index) => (\r\n <FFile \r\n key={index} \r\n name={opt.name} \r\n size={opt.size} \r\n handleDelete={() => handleRemoveFile(index)}\r\n progress={uploadProgress[opt.name]}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FButtonFile;","import './FLoadIconCss.scss'\r\n\r\nimport React, { useRef } from \"react\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FLoadIcon.\r\n * @interface IFLoadIcon\r\n */\r\nexport interface IFLoadIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties,\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string,\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string,\r\n}\r\n\r\n/**\r\n * Компонент FLoadIcon представляет собой анимированную иконку загрузки с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FLoadIcon\r\n * @param {IFLoadIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для элемента.\r\n * @param {string} [id] - Уникальный идентификатор для элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для элемента.\r\n * @param {React.Ref<HTMLDivElement>} ref - Ref для div элемента.\r\n * @returns {JSX.Element} - Возвращает анимированный элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FLoadIcon\r\n * color=\"success\"\r\n * size={50}\r\n * />\r\n */\r\nconst FLoadIcon = React.forwardRef<HTMLDivElement, IFLoadIcon>(({ \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n color = 'primary',\r\n ...props \r\n}, ref) => {\r\n\r\n const randomId = useRef<string>((Math.random() + 1).toString(36).substring(2))\r\n\r\n return (\r\n <div ref={ref} style={{ margin: 0, padding: 0 }} {...props}>\r\n <style>\r\n {\r\n `\r\n .f-load-icon-${randomId.current} {\r\n width: ${size}px;\r\n height: ${size * 2.25}px;\r\n -webkit-animation: anim-f-load-icon-${randomId.current} 2s linear infinite alternate;\r\n animation: anim-f-load-icon-${randomId.current} 2s linear infinite alternate;\r\n transform: perspective(${size * 2.5}px) rotateX(-45deg);\r\n border-width: ${size / 10}px !important;\r\n }\r\n `\r\n }\r\n {\r\n `@-webkit-keyframes anim-f-load-icon-${randomId.current} {\r\n 0% {\r\n box-shadow: 0 0 inset;\r\n }\r\n 100% {\r\n box-shadow: 0 calc((${size * 2.25}px - 2px) * -1) inset;\r\n }\r\n }`\r\n }\r\n {\r\n `@keyframes anim-f-load-icon-${randomId.current} {\r\n 0% {\r\n box-shadow: 0 0 inset;\r\n }\r\n 100% {\r\n box-shadow: 0 calc((${size * 2.25}px - 2px) * -1) inset;\r\n }\r\n }`\r\n }\r\n </style>\r\n <span\r\n className={`f-load-icon f-load-icon-${randomId.current} ${color} ${className !== undefined ? className : ''}`}\r\n style={st}\r\n id={id}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nFLoadIcon.displayName = 'FLoadIcon';\r\n\r\nexport default FLoadIcon;\r\n","import React, { forwardRef } from \"react\";\r\nimport styles from \"./FTextField.module.scss\";\r\nimport FLoadIcon from \"@icons/FLoadIcon\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTextField.\r\n * @interface IFTextField\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFTextField extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Текст метки для поля ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Дополнительные стили для поля ввода.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю доступную ширину.\r\n * @type {boolean | undefined}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст под полем ввода.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Флаг, указывающий, находится ли поле в состоянии загрузки.\r\n * @type {boolean | undefined}\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Ширина поля ввода.\r\n * @type {string | number | undefined}\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Высота поля ввода.\r\n * @type {string | number | undefined}\r\n */\r\n height?: string | number;\r\n}\r\n\r\n/**\r\n * Компонент FTextField представляет собой поле ввода с дополнительными функциями,\r\n * такими как метка, сообщения об ошибках, вспомогательный текст и индикатор загрузки.\r\n *\r\n * @component\r\n * @example\r\n * <FTextField\r\n * label=\"Имя пользователя\"\r\n * type=\"text\"\r\n * fullWidth={true}\r\n * errText={['Поле обязательно для заполнения']}\r\n * helpText=\"Введите ваше имя\"\r\n * load={false}\r\n * />\r\n *\r\n * @param {IFTextField} props - Пропсы компонента.\r\n * @param {React.Ref<HTMLInputElement>} ref - Референс для доступа к DOM-элементу.\r\n * @returns {JSX.Element} - Элемент поля ввода.\r\n */\r\nconst FTextField = forwardRef<HTMLInputElement, IFTextField>(\r\n (\r\n {\r\n label,\r\n type = 'text',\r\n fullWidth,\r\n errText,\r\n helpText,\r\n st,\r\n id,\r\n className,\r\n load = false,\r\n height = 'auto',\r\n width,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const baseStyle: React.CSSProperties = {\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n width: fullWidth ? '100%' : width || 'fit-content',\r\n height: height || 'auto',\r\n };\r\n\r\n const mergedStyle = { ...baseStyle, ...st };\r\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n return (\r\n <div\r\n className={`f-form-element ${styles[\"f-text-field\"]} ${className || ''}`}\r\n style={mergedStyle}\r\n role=\"group\"\r\n id={inputId + '-text-field-block'}\r\n aria-labelledby={label ? inputId + '-label' : undefined}\r\n >\r\n {/* Label */}\r\n {label && (\r\n <label\r\n id={inputId + '-label'}\r\n htmlFor={inputId}\r\n className={`f-form-element__label ${errText ? 'error' : ''}`}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n {/* Input wrapper */}\r\n <div className={`f-form-element__control ${load ? 'is-loading' : ''}`}>\r\n <input\r\n ref={ref}\r\n id={inputId}\r\n type={type}\r\n className={`f-form-element__control-element ${errText ? 'error' : ''}`}\r\n aria-invalid={!!errText}\r\n aria-describedby={\r\n [helpText ? inputId + '-helptext' : null, errText?.length ? inputId + '-errortext' : null]\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n {...props}\r\n step={props.step !== undefined ? props.step : 'any'}\r\n disabled={props.disabled || load}\r\n />\r\n\r\n {load && (\r\n <span className={'f-form-element__loader'}>\r\n <FLoadIcon size={10} />\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Help Text */}\r\n {helpText && (\r\n <p\r\n id={inputId + '-helptext'}\r\n className={'f-form-element__helptext'}\r\n >\r\n {helpText}\r\n </p>\r\n )}\r\n\r\n {/* Error Messages */}\r\n {(typeof errText === 'string' && errText) && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n <p\r\n id={`${inputId}-errortext`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {errText}\r\n </p>\r\n </div>\r\n )}\r\n {errText && errText.length > 0 && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n {typeof errText !== 'string' && errText.map((error, index) => (\r\n <p\r\n key={index}\r\n id={`${inputId}-errortext-${index}`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {error}\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FTextField;","import { FC } from \"react\";\r\n\r\n/**\r\n * Тип направления расположения дочерних элементов.\r\n * @typedef {'row' | 'row-reverse' | 'column' | 'column-reverse'} DirectionType\r\n */\r\ntype DirectionType = 'row' | 'row-reverse' | 'column' | 'column-reverse';\r\n\r\n/**\r\n * Тип выравнивания элементов по перекрёстной оси.\r\n * @typedef {\"flex-start\" | \"center\" | \"flex-end\" | \"stretch\" | \"baseline\"} AlignItemsType\r\n */\r\ntype AlignItemsType = \"flex-start\" | \"center\" | \"flex-end\" | \"stretch\" | \"baseline\";\r\n\r\n/**\r\n * Тип выравнивания элементов по главной оси.\r\n * @typedef {\"flex-start\" | \"center\" | \"flex-end\" | \"space-between\" | \"space-around\" | \"space-evenly\"} JustifyContentType\r\n */\r\ntype JustifyContentType =\r\n | \"flex-start\"\r\n | \"center\"\r\n | \"flex-end\"\r\n | \"space-between\"\r\n | \"space-around\"\r\n | \"space-evenly\";\r\n\r\n/**\r\n * Тип оборачивания дочерних элементов.\r\n * @typedef {\"nowrap\" | \"wrap\" | \"wrap-reverse\" | undefined} WrapType\r\n */\r\ntype WrapType = \"nowrap\" | \"wrap\" | \"wrap-reverse\" | undefined;\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FStack.\r\n *\r\n * @interface IFStack\r\n */\r\nexport interface IFStack {\r\n /**\r\n * Направление расположения дочерних элементов.\r\n * @type {DirectionType}\r\n * @default 'column'\r\n */\r\n direction?: DirectionType;\r\n\r\n /**\r\n * Выравнивание элементов по перекрёстной оси.\r\n * @type {AlignItemsType | undefined}\r\n */\r\n alignItems?: AlignItemsType;\r\n\r\n /**\r\n * Выравнивание элементов по главной оси.\r\n * @type {JustifyContentType | undefined}\r\n */\r\n justifyContent?: JustifyContentType;\r\n\r\n /**\r\n * Расстояние между элементами (умножается на 8px).\r\n * @type {number | undefined}\r\n * @default 0\r\n */\r\n spacing?: number;\r\n\r\n /**\r\n * Дочерние элементы, которые будут отрендерены внутри контейнера.\r\n * @type {React.ReactElement | React.ReactNode | undefined}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Дополнительные инлайновые стили.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Флаг, указывающий, должен ли контейнер переносить дочерние элементы на новую строку.\r\n * @type {WrapType}\r\n */\r\n wrap?: WrapType;\r\n}\r\n\r\n/**\r\n * Компонент `FStack` — гибкий контейнер с возможностью управления расположением дочерних элементов.\r\n *\r\n * Основан на Flexbox. Позволяет:\r\n * - задавать направление (`direction`)\r\n * - управлять отступами (`spacing`)\r\n * - выравнивать элементы (`alignItems`, `justifyContent`)\r\n * - добавлять кастомные классы и стили\r\n *\r\n * @component\r\n * @example\r\n * <FStack\r\n * direction=\"row\"\r\n * spacing={2}\r\n * alignItems=\"center\"\r\n * justifyContent=\"space-between\"\r\n * >\r\n * <div>Элемент 1</div>\r\n * <div>Элемент 2</div>\r\n * </FStack>\r\n *\r\n * @param {DirectionType} [direction='column'] - Направление дочерних элементов.\r\n * @param {AlignItemsType} [alignItems] - Выравнивание по перекрёстной оси.\r\n * @param {JustifyContentType} [justifyContent] - Выравнивание по главной оси.\r\n * @param {number} [spacing=0] - Отступ между элементами (умножается на 8px).\r\n * @param {React.ReactNode} [children] - Дочерние элементы.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - ID элемента.\r\n * @param {WrapType} [wrap] - Перенос дочерних элементов на следующую строку.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<div>` с Flexbox-стилями и переданными свойствами.\r\n */\r\nconst FStack: FC<IFStack> = ({\r\n children,\r\n alignItems,\r\n justifyContent,\r\n direction = 'column',\r\n wrap,\r\n spacing = 0,\r\n className,\r\n st,\r\n id\r\n}) => {\r\n let style: React.CSSProperties = {\r\n gap: `${+spacing * 8}px`,\r\n display: 'flex',\r\n flexDirection: direction,\r\n justifyContent: justifyContent,\r\n alignItems: alignItems,\r\n flexWrap: wrap\r\n };\r\n\r\n if (st !== undefined) {\r\n style = Object.assign(style, st);\r\n }\r\n\r\n return (\r\n <div\r\n className={className}\r\n style={style}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FStack;","import { FC } from \"react\";\r\n\r\nimport styles from \"./FGrid.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента `FGrid`.\r\n *\r\n * Используется для создания адаптивной сетки по принципам Bootstrap.\r\n */\r\nexport interface IFGrid {\r\n /**\r\n * Контент внутри контейнера или элемента.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Пользовательский CSS класс.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Тип объекта: `\"container\"` — для контейнера, `\"item\"` — для элемента (колонки).\r\n */\r\n obj?: \"container\" | \"item\";\r\n\r\n /**\r\n * Ширина колонки на мобильных устройствах (`xs`: от 0 до 576px).\r\n * @default 12\r\n */\r\n xs?: number;\r\n\r\n /**\r\n * Ширина колонки на маленьких устройствах (`sm`: ≥576px).\r\n */\r\n sm?: number;\r\n\r\n /**\r\n * Ширина колонки на планшетах (`md`: ≥768px).\r\n */\r\n md?: number;\r\n\r\n /**\r\n * Ширина колонки на десктопах (`lg`: ≥992px).\r\n */\r\n lg?: number;\r\n\r\n /**\r\n * Ширина колонки на больших десктопах (`xl`: ≥1200px).\r\n */\r\n xl?: number;\r\n\r\n /**\r\n * Ширина колонки на очень больших экранах (`xxl`: ≥1400px).\r\n */\r\n xxl?: number;\r\n\r\n /**\r\n * Если true — элемент занимает только необходимое пространство (`col-auto`).\r\n */\r\n colAuto?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FGrid` — адаптивная сетка, основанная на системе Bootstrap.\r\n *\r\n * Может быть как контейнером, так и элементом-колонкой.\r\n *\r\n * @component\r\n * @example\r\n * // Пример использования как контейнера\r\n * <FGrid obj=\"container\">\r\n * <FGrid obj=\"item\" xs={12} md={6}>\r\n * <p>Контент</p>\r\n * </FGrid>\r\n * </FGrid>\r\n *\r\n * @example\r\n * // Элемент с автоматической шириной\r\n * <FGrid obj=\"item\" colAuto>\r\n * Авто-ширина\r\n * </FGrid>\r\n *\r\n * @param {React.ReactNode} [children] - Контент внутри контейнера или колонки.\r\n * @param {string} [className] - Кастомный класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - HTML ID.\r\n * @param {\"container\"|\"item\"} [obj] - Тип элемента: контейнер или колонка.\r\n * @param {number} [xs=12] - Ширина на мобильных устройствах.\r\n * @param {number} [sm] - Ширина на малых устройствах.\r\n * @param {number} [md] - Ширина на планшетах.\r\n * @param {number} [lg] - Ширина на десктопах.\r\n * @param {number} [xl] - Ширина на больших десктопах.\r\n * @param {number} [xxl] - Ширина на очень больших экранах.\r\n * @param {boolean} [colAuto=false] - Элемент занимает только нужное пространство.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<div>` с соответствующими классами и стилями.\r\n */\r\nconst FGrid: FC<IFGrid> = ({\r\n children,\r\n className = \"\",\r\n st,\r\n id,\r\n obj,\r\n xs = 12,\r\n sm,\r\n md,\r\n lg,\r\n xl,\r\n xxl,\r\n colAuto = false,\r\n}) => {\r\n const style: React.CSSProperties = {\r\n ...st,\r\n };\r\n\r\n const resolvedSizes = {\r\n xs,\r\n sm: sm ?? xs,\r\n md: md ?? sm ?? xs,\r\n lg: lg ?? md ?? sm ?? xs,\r\n xl: xl ?? lg ?? md ?? sm ?? xs,\r\n xxl: xxl ?? xl ?? lg ?? md ?? sm ?? xs,\r\n };\r\n\r\n const getColumnClasses = () => {\r\n if (colAuto) return styles['f-grid__col--auto'];\r\n\r\n const classes = [styles['f-grid__col']];\r\n if (resolvedSizes.xs !== undefined) classes.push(styles[`f-grid__col--xs-${resolvedSizes.xs}`]);\r\n if (resolvedSizes.sm !== undefined) classes.push(styles[`f-grid__col--sm-${resolvedSizes.sm}`]);\r\n if (resolvedSizes.md !== undefined) classes.push(styles[`f-grid__col--md-${resolvedSizes.md}`]);\r\n if (resolvedSizes.lg !== undefined) classes.push(styles[`f-grid__col--lg-${resolvedSizes.lg}`]);\r\n if (resolvedSizes.xl !== undefined) classes.push(styles[`f-grid__col--xl-${resolvedSizes.xl}`]);\r\n if (resolvedSizes.xxl !== undefined) classes.push(styles[`f-grid__col--xxl-${resolvedSizes.xxl}`]);\r\n\r\n return classes.join(\" \");\r\n };\r\n\r\n return (\r\n <>\r\n {obj === \"container\" && (\r\n <div\r\n className={`${styles['f-grid']} ${className || \"\"}`}\r\n style={style}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n\r\n {obj === \"item\" && (\r\n <div\r\n className={`${getColumnClasses()} ${className || \"\"}`}\r\n style={style}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n\r\n {obj === undefined && (\r\n <div className={className} style={style} id={id}>\r\n {children}\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default FGrid;","import { FC } from \"react\";\r\n\r\nimport styles from \"./FGridRow.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FGridRow — обёртка для горизонтального Flexbox-ряда.\r\n */\r\nexport interface IFGridRow {\r\n /**\r\n * Контент, который будет отображён внутри строки.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для строки.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Выравнивание дочерних элементов по горизонтали.\r\n * @default 'flex-start'\r\n */\r\n justifyContent?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\";\r\n\r\n /**\r\n * Выравнивание дочерних элементов по вертикали.\r\n * @default 'stretch'\r\n */\r\n alignItems?: \"start\" | \"center\" | \"end\" | \"stretch\";\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FGridRow` — обёртка для горизонтальной Flex-строки.\r\n *\r\n * Используется вместе с `FGridItem` или `FGrid` для создания адаптивного макета.\r\n *\r\n * @component\r\n * @example\r\n * <FGridRow justifyContent=\"center\" alignItems=\"center\">\r\n * <div>Элемент 1</div>\r\n * <div>Элемент 2</div>\r\n * </FGridRow>\r\n *\r\n * @param {React.ReactNode} [children] - Дочерние элементы, размещаемые в строке.\r\n * @param {string} [className] - Кастомный класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {\"start\"|\"center\"|\"end\"|\"between\"|\"around\"} [justifyContent='start'] - Горизонтальное выравнивание.\r\n * @param {\"start\"|\"center\"|\"end\"|\"stretch\"} [alignItems='stretch'] - Вертикальное выравнивание.\r\n * @param {string} [id] - HTML ID.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<div>` как Flex-строку с заданными свойствами.\r\n */\r\nconst FGridRow: FC<IFGridRow> = ({\r\n children,\r\n className = '',\r\n st,\r\n id,\r\n justifyContent,\r\n alignItems,\r\n}) => {\r\n const getJustifyContentClass = () => {\r\n if (!justifyContent) return '';\r\n return styles[`f-grid-row--justify-${justifyContent}`];\r\n };\r\n\r\n const getAlignItemsClass = () => {\r\n if (!alignItems) return '';\r\n return styles[`f-grid-row--align-${alignItems}`];\r\n };\r\n\r\n const rowClasses = [\r\n styles['f-grid-row'],\r\n getJustifyContentClass(),\r\n getAlignItemsClass(),\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n return (\r\n <div className={rowClasses} style={st} id={id}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FGridRow;","import { FC } from \"react\";\r\nimport styles from \"./FContainer.module.scss\";\r\n\r\n/**\r\n * Тип, определяющий максимальную ширину контейнера.\r\n *\r\n * @typedef {'container-xs' | 'container-sm' | 'container-md' | 'container-lg' | 'container-xl' | 'container-xxl' | 'container-fluid'} ContainerSizeType\r\n */\r\ntype ContainerSizeType = 'container-xs' | 'container-sm' | 'container-md' | 'container-lg' | 'container-xl' | 'container-xxl' | 'container-fluid';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FContainer.\r\n *\r\n * @interface IFContainer\r\n */\r\nexport interface IFContainer {\r\n /**\r\n * Размер контейнера — влияет на максимальную ширину.\r\n * @type {ContainerSizeType}\r\n * @default 'container-xs'\r\n */\r\n maxWidth?: ContainerSizeType;\r\n\r\n /**\r\n * Дочерние элементы, отображаемые внутри контейнера.\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string}\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FContainer` — универсальный контейнер с разными размерами (`maxWidth`) и поддержкой пользовательских классов и стилей.\r\n *\r\n * Используется для ограничения ширины макета в зависимости от устройства:\r\n * - `container-xs`: 576px\r\n * - `container-sm`: 768px\r\n * - `container-md`: 992px\r\n * - `container-lg`: 1200px\r\n * - `container-xl`: 1400px\r\n * - `container-xxl`: 1600px\r\n * - `container-fluid`: 100%\r\n *\r\n * @component\r\n * @example\r\n * <FContainer maxWidth=\"container-md\" className=\"my-container\" st={{ padding: '2rem' }}>\r\n * <div>Контент</div>\r\n * </FContainer>\r\n *\r\n * @param {ContainerSizeType} [maxWidth='container-xs'] - Размер контейнера.\r\n * @param {React.ReactNode} [children] - Содержимое контейнера.\r\n * @param {string} [className] - Дополнительный CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - ID элемента.\r\n *\r\n * @returns {JSX.Element} - Рендерит `<div>` с заданным классом и стилями.\r\n */\r\nconst FContainer: FC<IFContainer> = ({\r\n children,\r\n className,\r\n st,\r\n id,\r\n maxWidth = 'container-xs'\r\n}) => {\r\n return (\r\n <div\r\n className={`${styles['f-container']} ${styles[maxWidth]} ${className || ''}`}\r\n style={st}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FContainer;","import { FC, useEffect } from \"react\";\r\nimport styles from \"./FPaper.module.scss\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FPaper.\r\n *\r\n * @interface IFPaper\r\n */\r\nexport interface IFPaper {\r\n /**\r\n * Заголовок панели (необязательно).\r\n * Отображается в `.panel-heading`.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Дочерние элементы, отображаемые внутри `.panel-body`.\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Инлайновые стили для внешнего контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Размер шрифта заголовка (например: '16px').\r\n * @type {string | undefined}\r\n */\r\n fontSizeLabel?: string;\r\n\r\n /**\r\n * Размер шрифта содержимого (например: '14px').\r\n * @type {string | undefined}\r\n */\r\n fontSizeBody?: string;\r\n\r\n /**\r\n * Уникальный ID элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для кастомизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Callback, вызываемый при завершении анимации.\r\n * @type {() => void | undefined}\r\n */\r\n onAnimationEnd?: () => void;\r\n\r\n /**\r\n * Настройки анимации. Например: `{ name: 'data-animation', value: 'fade-in' }`\r\n * @type {{ name: string; value: string } | undefined}\r\n */\r\n animated?: {\r\n name: string;\r\n value: string;\r\n };\r\n}\r\n\r\n/**\r\n * Компонент `FPaper` — универсальная панель с поддержкой:\r\n * - заголовка (`label`)\r\n * - динамических стилей (`st`, `fontSizeLabel`, `fontSizeBody`)\r\n * - анимаций через `animated`\r\n * - пользовательских классов (`className`)\r\n *\r\n * Основан на Bootstrap-подобной структуре: `.panel .panel-default`\r\n *\r\n * @component\r\n * @example\r\n * // Пример базового использования\r\n * <FPaper label=\"Информация\">\r\n * Это текстовое содержимое панели.\r\n * </FPaper>\r\n *\r\n * @example\r\n * // С пользовательским стилем и анимацией\r\n * <FPaper\r\n * label=\"Настройки\"\r\n * fontSizeLabel=\"18px\"\r\n * fontSizeBody=\"14px\"\r\n * className=\"custom-paper\"\r\n * animated={{ name: 'data-animation', value: 'fade-in' }}\r\n * >\r\n * <p>С настраиваемым размером шрифта и анимацией</p>\r\n * </FPaper>\r\n *\r\n * @param {string} [label] - Текст заголовка панели.\r\n * @param {React.ReactNode} [children] - Содержимое панели.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для контейнера.\r\n * @param {string} [fontSizeLabel] - Размер шрифта заголовка.\r\n * @param {string} [fontSizeBody] - Размер шрифта тела панели.\r\n * @param {string} [id] - HTML ID.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n * @param {Function} [onAnimationEnd] - Callback при завершении анимации.\r\n * @param {{name: string, value: string}} [animated] - Атрибут анимации.\r\n *\r\n * @returns {JSX.Element} — Рендерит панель с заголовком и содержимым.\r\n */\r\nconst FPaper: FC<IFPaper> = ({\r\n label,\r\n children,\r\n st,\r\n fontSizeLabel,\r\n fontSizeBody,\r\n id,\r\n className,\r\n onAnimationEnd,\r\n animated\r\n}) => {\r\n\r\n useEffect(() => {\r\n if (animated) {\r\n const element = document.getElementsByClassName(`animated-${animated.name}`)[0];\r\n if (element) {\r\n element.setAttribute(animated.name, animated.value);\r\n }\r\n }\r\n }, [animated]);\r\n\r\n return (\r\n <div\r\n className={`${styles['panel']} ${styles['panel-default']} ${className || ''} ${animated ? `${styles[`animated-${animated.name}`]} ${animated.name}` : ''}`}\r\n style={st}\r\n id={id}\r\n onAnimationEnd={onAnimationEnd}\r\n >\r\n {label && (\r\n <div className={styles['panel-heading']}>\r\n <h3\r\n className={styles['panel-title']}\r\n style={{ fontSize: fontSizeLabel }}\r\n >\r\n {label}\r\n </h3>\r\n </div>\r\n )}\r\n <div\r\n className={styles['panel-body']}\r\n style={{ fontSize: fontSizeBody }}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FPaper;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableHead.\r\n * @interface IFTableHead\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface IFTableHead extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n /**\r\n * Дополнительные стили для заголовка таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, строки `<tr>` или ячейки `<th>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри заголовка таблицы.\r\n * @type {\"left\" | \"right\" | \"center\" | \"justify\"}\r\n * @default \"left\"\r\n */\r\n textAlignment?: \"left\" | \"right\" | \"center\" | \"justify\";\r\n\r\n /**\r\n * Флаг, указывающий, должен ли заголовок быть \"липким\" (sticky).\r\n * @type {boolean}\r\n * @default false\r\n */\r\n isSticky?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент FTableHead представляет собой заголовок таблицы (`<thead>`).\r\n * Он поддерживает настройку стилей, выравнивания текста и режима \"липкости\".\r\n *\r\n * @component\r\n * @example\r\n * <FTableHead\r\n * textAlignment=\"center\"\r\n * isSticky={true}\r\n * st={{ backgroundColor: '#f9f9f9' }}\r\n * >\r\n * <tr>\r\n * <th>Заголовок 1</th>\r\n * <th>Заголовок 2</th>\r\n * </tr>\r\n * </FTableHead>\r\n *\r\n * @param {IFTableHead} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент заголовка таблицы.\r\n */\r\nconst FTableHead: FC<IFTableHead> = ({\r\n st,\r\n children,\r\n textAlignment = \"left\", // По умолчанию выравнивание слева\r\n isSticky = false, // По умолчанию заголовок не \"липкий\"\r\n ...props\r\n}) => {\r\n\r\n return (\r\n <thead\r\n style={st} // Применяем пользовательские стили\r\n {...props} // Передаем остальные пропсы\r\n className={`${styles['f-table-component__table_header']} ${isSticky ? styles[\"is-sticky\"] : \"\"} ${props.className || \"\"} ${styles[textAlignment]}`}\r\n >\r\n {children}\r\n </thead>\r\n );\r\n};\r\n\r\nexport default FTableHead;","import React, { type FC, useCallback, useEffect, useRef, useState, useLayoutEffect, useMemo } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableBody.\r\n * @interface IFTableBody\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface IFTableBody extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n /**\r\n * Дополнительные стили для тела таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, строки `<tr>` или ячейки `<td>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри тела таблицы.\r\n * @type {'left' | 'right' | 'center' | 'justify'}\r\n * @default 'left'\r\n */\r\n textAlignment?: 'left' | 'right' | 'center' | 'justify';\r\n\r\n /**\r\n * Ref для родительского контейнера с прокруткой.\r\n * Используется для отслеживания события прокрутки.\r\n * @type {React.RefObject<HTMLDivElement>}\r\n */\r\n tableWrapperRef?: React.RefObject<HTMLDivElement>;\r\n\r\n /**\r\n * Количество видимых строк для виртуализации. Если не указано — виртуализация отключена.\r\n */\r\n visibleRowCount?: number;\r\n}\r\n\r\n/**\r\n * Компонент FTableBody представляет собой тело таблицы (`<tbody>`).\r\n * Он поддерживает настройку стилей, выравнивания текста и передачу дочерних элементов.\r\n * Также реализована виртуализация строк для оптимизации производительности при большом количестве данных.\r\n *\r\n * @component\r\n * @example\r\n * <FTableBody st={{ backgroundColor: '#f9f9f9' }} textAlignment=\"center\">\r\n * <tr>\r\n * <td>Ячейка 1</td>\r\n * <td>Ячейка 2</td>\r\n * </tr>\r\n * <tr>\r\n * <td>Ячейка 3</td>\r\n * <td>Ячейка 4</td>\r\n * </tr>\r\n * </FTableBody>\r\n *\r\n * @param {IFTableBody} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент тела таблицы.\r\n */\r\nconst FTableBody: FC<IFTableBody> = ({\r\n st,\r\n children,\r\n textAlignment = 'left', // По умолчанию выравнивание слева\r\n tableWrapperRef,\r\n visibleRowCount = undefined,\r\n ...props\r\n}) => {\r\n\r\n /**\r\n * Ref для элемента `<tbody>`, используется для измерения высот строк.\r\n * @type {React.RefObject<HTMLTableSectionElement>}\r\n */\r\n const tableBodyRef = useRef<HTMLTableSectionElement>(null);\r\n\r\n /**\r\n * Преобразуем дочерние элементы в массив для удобства работы.\r\n * @type {React.ReactNode[]}\r\n */\r\n const flatChildren = useMemo(() => React.Children.toArray(children), [children]);\r\n const totalRows = flatChildren.length;\r\n\r\n // Состояние для хранения индекса первой видимой строки (только если виртуализация включена)\r\n const [startIdx, setStartIdx] = useState(0);\r\n\r\n /**\r\n * Состояние для хранения высот строк.\r\n * @type {number[]}\r\n */\r\n const [rowHeights, setRowHeights] = useState<number[]>(Array(flatChildren.length).fill(0));\r\n\r\n // --- Виртуализация ---\r\n // Если виртуализация выключена, рендерим все строки\r\n const virtualizationEnabled = typeof visibleRowCount === 'number' && visibleRowCount > 0;\r\n\r\n /**\r\n * Гарантируем, что массив `rowHeights` всегда соответствует количеству дочерних элементов.\r\n * Если количество детей увеличивается, добавляем недостающие нулевые значения.\r\n */\r\n useEffect(() => {\r\n if (rowHeights.length < flatChildren.length) {\r\n setRowHeights(prev => [...prev, ...Array(flatChildren.length - prev.length).fill(0)]);\r\n }\r\n }, [flatChildren.length, rowHeights.length]);\r\n\r\n // --- Обновление индекса первой видимой строки ---\r\n const updateStartIdx = useCallback(() => {\r\n if (!virtualizationEnabled) return;\r\n if (!tableWrapperRef?.current || !tableBodyRef.current) return;\r\n const wrapper = tableWrapperRef.current;\r\n const scrollTop = wrapper.scrollTop;\r\n let acc = 0;\r\n let idx = 0;\r\n for (let i = 0; i < rowHeights.length; i++) {\r\n if (acc + rowHeights[i] > scrollTop) {\r\n idx = i;\r\n break;\r\n }\r\n acc += rowHeights[i];\r\n }\r\n setStartIdx(idx);\r\n }, [rowHeights, tableWrapperRef, virtualizationEnabled]);\r\n\r\n // --- Обработчик скролла ---\r\n const handleScroll = useCallback(() => {\r\n if (!virtualizationEnabled) return;\r\n requestAnimationFrame(updateStartIdx);\r\n }, [updateStartIdx, virtualizationEnabled]);\r\n\r\n // --- Эффект для подписки на скролл и resize ---\r\n useEffect(() => {\r\n if (!virtualizationEnabled) return;\r\n const handleResize = () => requestAnimationFrame(updateStartIdx);\r\n window.addEventListener('resize', handleResize);\r\n tableWrapperRef?.current?.addEventListener('scroll', handleScroll);\r\n handleResize();\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n tableWrapperRef?.current?.removeEventListener('scroll', handleScroll);\r\n };\r\n }, [handleScroll, updateStartIdx, virtualizationEnabled]);\r\n\r\n // --- Измерение высот строк ---\r\n useLayoutEffect(() => {\r\n if (!tableBodyRef.current) return;\r\n const rows = tableBodyRef.current.querySelectorAll('tr[data-row-index]');\r\n const newHeights = [...rowHeights];\r\n let changed = false;\r\n rows.forEach((row, idx) => {\r\n // Если виртуализация выключена, индексы совпадают\r\n const realIdx = virtualizationEnabled ? startIdx + idx : idx;\r\n const h = row.getBoundingClientRect().height;\r\n if (h > 0 && newHeights[realIdx] !== h) {\r\n newHeights[realIdx] = h;\r\n changed = true;\r\n }\r\n });\r\n if (changed) setRowHeights(newHeights);\r\n }, [flatChildren, rowHeights, startIdx, virtualizationEnabled]);\r\n\r\n // --- Вычисление видимых строк ---\r\n let visibleItems: React.ReactNode[];\r\n let topOffset = 0;\r\n let bottomOffset = 0;\r\n if (virtualizationEnabled) {\r\n const endIdx = Math.min(startIdx + (visibleRowCount as number), totalRows);\r\n visibleItems = flatChildren.slice(startIdx, endIdx);\r\n function getEstimatedHeight(index: number, heights: number[]): number {\r\n for (let i = index - 1; i >= 0; i--) {\r\n if (heights[i] > 0) return heights[i];\r\n }\r\n for (let i = index + 1; i < heights.length; i++) {\r\n if (heights[i] > 0) return heights[i];\r\n }\r\n return 0;\r\n }\r\n topOffset = rowHeights.slice(0, startIdx).reduce((a, b, i) => a + (b > 0 ? b : getEstimatedHeight(i, rowHeights)), 0);\r\n bottomOffset = rowHeights.slice(endIdx).reduce((a, b, i) => a + (b > 0 ? b : getEstimatedHeight(endIdx + i, rowHeights)), 0);\r\n } else {\r\n visibleItems = flatChildren;\r\n }\r\n\r\n return (\r\n <tbody ref={tableBodyRef} style={st} {...props} className={`${styles['f-table-component__table_body']} ${props.className || ''} ${styles[textAlignment]}`}>\r\n {/* Пустая строка для создания отступа сверху */}\r\n {virtualizationEnabled && rowHeights.some(h => h > 0) && <tr style={{ height: topOffset }} />}\r\n {/* Рендерим строки */}\r\n {visibleItems.map((child, idx) => (\r\n React.isValidElement(child)\r\n ? React.cloneElement(child as React.ReactElement, { 'data-row-index': virtualizationEnabled ? startIdx + idx : idx, key: virtualizationEnabled ? startIdx + idx : idx })\r\n : child\r\n ))}\r\n {/* Пустая строка для создания отступа снизу */}\r\n {virtualizationEnabled && rowHeights.some(h => h > 0) && <tr style={{ height: bottomOffset }} />}\r\n </tbody>\r\n );\r\n};\r\n\r\nexport default React.memo(FTableBody);","import React, { FC, useEffect, useRef, useState } from \"react\";\r\nimport FTableHead, { IFTableHead } from \"../FTableHead/FTableHead\";\r\nimport FTableBody from \"../FTableBody\";\r\nimport { IFTableBody } from \"../FTableBody/FTableBody\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTable.\r\n * @interface IFTable\r\n * @extends {React.HTMLAttributes<HTMLTableElement>}\r\n */\r\nexport interface IFTable extends React.HTMLAttributes<HTMLTableElement> {\r\n /**\r\n * Дополнительные стили для таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, `<thead>`, `<tbody>`, `<tfoot>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Управление горизонтальным переполнением контейнера таблицы.\r\n * @type {\"visible\" | \"hidden\" | \"clip\" | \"scroll\" | \"auto\" | undefined}\r\n * @default \"auto\"\r\n */\r\n overflowX?: \"visible\" | \"hidden\" | \"clip\" | \"scroll\" | \"auto\";\r\n\r\n /**\r\n * Управление вертикальным переполнением контейнера таблицы.\r\n * @type {\"visible\" | \"hidden\" | \"clip\" | \"scroll\" | \"auto\" | undefined}\r\n * @default \"auto\"\r\n */\r\n overflowY?: \"visible\" | \"hidden\" | \"clip\" | \"scroll\" | \"auto\";\r\n}\r\n\r\n/**\r\n * Компонент FTable представляет собой таблицу с возможностью управления переполнением и \"липким\" заголовком.\r\n * Он поддерживает настройку стилей, обработку скролла и динамическое изменение состояния заголовка.\r\n *\r\n * @component\r\n * @example\r\n * <FTable overflowX=\"auto\" overflowY=\"scroll\">\r\n * <FTableHead>\r\n * <tr>\r\n * <th>Заголовок 1</th>\r\n * <th>Заголовок 2</th>\r\n * </tr>\r\n * </FTableHead>\r\n * <tbody>\r\n * <tr>\r\n * <td>Ячейка 1</td>\r\n * <td>Ячейка 2</td>\r\n * </tr>\r\n * </tbody>\r\n * </FTable>\r\n *\r\n * @param {IFTable} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент таблицы.\r\n */\r\nconst FTable: FC<IFTable> = ({\r\n st,\r\n children,\r\n overflowX = \"auto\", // По умолчанию горизонтальное переполнение автоматическое\r\n overflowY = \"auto\", // По умолчанию вертикальное переполнение автоматическое\r\n ...props\r\n}) => {\r\n const tableWrapperRef = useRef<HTMLDivElement>(null);\r\n const [isSticky, setIsSticky] = useState(false);\r\n\r\n useEffect(() => {\r\n /**\r\n * Обработчик события прокрутки для определения состояния \"липкости\" заголовка.\r\n */\r\n const handleScroll = () => {\r\n if (tableWrapperRef.current) {\r\n // Проверяем, достигнут ли верхний край контейнера\r\n const isScrolled = tableWrapperRef.current.scrollTop > 0;\r\n setIsSticky(isScrolled);\r\n }\r\n };\r\n\r\n const wrapper = tableWrapperRef.current;\r\n if (wrapper) {\r\n wrapper.addEventListener(\"scroll\", handleScroll);\r\n }\r\n\r\n return () => {\r\n if (wrapper) {\r\n wrapper.removeEventListener(\"scroll\", handleScroll);\r\n }\r\n };\r\n }, []);\r\n \r\n return (\r\n <div\r\n ref={tableWrapperRef}\r\n className={styles[\"f-table-component\"]}\r\n style={{ overflowX, overflowY }}\r\n >\r\n <table\r\n style={st}\r\n {...props}\r\n className={`table ${styles['f-table-component__table']} ${styles['bordered']} ${styles['bordered-half']} ${props.className || \"\"}`}\r\n >\r\n {React.Children.map(children, (child) => {\r\n if (\r\n React.isValidElement(child) &&\r\n child.type === FTableHead\r\n ) {\r\n // Явно приводим тип props к IFTableHead\r\n const headProps = child.props as IFTableHead;\r\n\r\n // Клонируем FTableHead и добавляем isSticky\r\n return React.cloneElement(\r\n child as React.ReactElement<IFTableHead>,\r\n {\r\n ...headProps,\r\n isSticky: isSticky,\r\n }\r\n );\r\n }\r\n\r\n if (\r\n React.isValidElement(child) &&\r\n child.type === FTableBody\r\n ) {\r\n // Явно приводим тип props к IFTableBody\r\n const headProps = child.props as IFTableBody;\r\n\r\n // Клонируем FTableBody и добавляем tableWrapperRef\r\n return React.cloneElement(\r\n child as React.ReactElement<IFTableBody>,\r\n {\r\n ...headProps,\r\n tableWrapperRef,\r\n }\r\n );\r\n }\r\n return child;\r\n })}\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FTable;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableRow.\r\n * @interface IFTableRow\r\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\r\n */\r\nexport interface IFTableRow extends React.HTMLAttributes<HTMLTableRowElement> {\r\n /**\r\n * Дополнительные стили для строки таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, ячейки `<td>` или `<th>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри строки.\r\n * @type {\"left\" | \"right\" | \"center\" | \"justify\"}\r\n * @default \"left\"\r\n */\r\n textAlignment?: \"left\" | \"right\" | \"center\" | \"justify\";\r\n}\r\n\r\n/**\r\n * Компонент FTableRow представляет собой строку таблицы (`<tr>`).\r\n * Он поддерживает настройку стилей и передачу дочерних элементов.\r\n *\r\n * @component\r\n * @example\r\n * <FTableRow st={{ backgroundColor: '#f9f9f9' }}>\r\n * <td>Ячейка 1</td>\r\n * <td>Ячейка 2</td>\r\n * </FTableRow>\r\n *\r\n * @param {IFTableRow} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент строки таблицы.\r\n */\r\nconst FTableRow: FC<IFTableRow> = ({\r\n st,\r\n children,\r\n textAlignment,\r\n ...props\r\n}) => {\r\n return (\r\n <tr\r\n style={st} // Применяем пользовательские стили\r\n {...props} // Передаем остальные пропсы\r\n className={`${styles['f-table-component__table_row']} ${props.className || ''}${textAlignment !== undefined ? ` ${styles[textAlignment]}` : ''}`} // Применяем классы стилей\r\n >\r\n {children}\r\n </tr>\r\n );\r\n};\r\n\r\nexport default FTableRow;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableHeaderCell.\r\n * @interface IFTableHeaderCell\r\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\r\n */\r\nexport interface IFTableHeaderCell extends React.ThHTMLAttributes<HTMLTableCellElement> {\r\n /**\r\n * Дополнительные стили для ячейки заголовка.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Значение rowspan для объединения строк.\r\n * @type {number}\r\n */\r\n row?: number;\r\n\r\n /**\r\n * Значение colspan для объединения столбцов.\r\n * @type {number}\r\n */\r\n col?: number;\r\n\r\n /**\r\n * Дочерние элементы (например, текст или другие компоненты).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри ячейки.\r\n * @type {'left' | 'right' | 'center' | 'justify'}\r\n * @default 'left'\r\n */\r\n textAlignment?: 'left' | 'right' | 'center' | 'justify';\r\n\r\n /**\r\n * Ширина ячейки.\r\n * @type {number | string}\r\n * @default 'auto'\r\n */\r\n width?: number | string;\r\n}\r\n\r\n/**\r\n * Компонент FTableHeaderCell представляет собой ячейку заголовка таблицы (`<th>`).\r\n * Он поддерживает настройку стилей, объединение строк и столбцов, а также выравнивание текста.\r\n *\r\n * @component\r\n * @example\r\n * <FTableHeaderCell\r\n * textAlignment=\"center\"\r\n * width=\"200px\"\r\n * row={2}\r\n * col={3}\r\n * >\r\n * Заголовок\r\n * </FTableHeaderCell>\r\n *\r\n * @param {IFTableHeaderCell} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент заголовка таблицы.\r\n */\r\nconst FTableHeaderCell: FC<IFTableHeaderCell> = ({\r\n st,\r\n row,\r\n col,\r\n children,\r\n textAlignment, // По умолчанию выравнивания нет\r\n width = 'auto', // По умолчанию ширина автоматическая\r\n ...props\r\n}) => {\r\n /**\r\n * Объединяем пользовательские стили с базовыми стилями.\r\n * @type {React.CSSProperties}\r\n */\r\n const style: React.CSSProperties = {\r\n textAlign: textAlignment,\r\n width,\r\n ...st,\r\n };\r\n\r\n return (\r\n <th\r\n rowSpan={row && row > 1 ? row : undefined} // Проверяем, чтобы row было больше 1\r\n colSpan={col && col > 1 ? col : undefined} // Проверяем, чтобы col было больше 1\r\n {...props}\r\n className={`${styles['f-table-component__table_header-cell']} ${props.className || ''}`}\r\n style={style}\r\n >\r\n {children}\r\n </th>\r\n );\r\n};\r\n\r\nexport default FTableHeaderCell;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableDataCell.\r\n * @interface IFTableDataCell\r\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\r\n */\r\nexport interface IFTableDataCell extends React.TdHTMLAttributes<HTMLTableCellElement> {\r\n /**\r\n * Дополнительные стили для ячейки таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Значение rowspan для объединения строк.\r\n * @type {number | undefined}\r\n */\r\n row?: number;\r\n\r\n /**\r\n * Значение colspan для объединения столбцов.\r\n * @type {number | undefined}\r\n */\r\n col?: number;\r\n\r\n /**\r\n * Дочерние элементы (например, текст или другие компоненты).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри ячейки.\r\n * @type {'left' | 'right' | 'center' | 'justify'}\r\n * @default 'left'\r\n */\r\n textAlignment?: 'left' | 'right' | 'center' | 'justify';\r\n\r\n /**\r\n * Высота ячейки.\r\n * @type {number | string}\r\n * @default 'auto'\r\n */\r\n height?: number | string;\r\n}\r\n\r\n/**\r\n * Компонент FTableDataCell представляет собой ячейку данных таблицы (`<td>`).\r\n * Он поддерживает настройку стилей, объединение строк и столбцов, а также обработку событий.\r\n *\r\n * @component\r\n * @example\r\n * <FTableDataCell\r\n * textAlignment=\"center\"\r\n * height=\"50px\"\r\n * row={2}\r\n * col={3}\r\n * onClick={() => console.log('Cell clicked!')}\r\n * >\r\n * Ячейка данных\r\n * </FTableDataCell>\r\n *\r\n * @param {IFTableDataCell} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент данных таблицы.\r\n */\r\nconst FTableDataCell: FC<IFTableDataCell> = ({\r\n st,\r\n row,\r\n col,\r\n children,\r\n textAlignment, // По умолчанию выравнивания нет\r\n height = 'auto', // По умолчанию высота автоматическая\r\n ...props\r\n}) => {\r\n /**\r\n * Объединяем пользовательские стили с базовыми стилями.\r\n * @type {React.CSSProperties}\r\n */\r\n const style: React.CSSProperties = {\r\n textAlign: textAlignment,\r\n height,\r\n ...st,\r\n };\r\n\r\n return (\r\n <td\r\n rowSpan={row && row > 1 ? row : undefined} // Проверяем, чтобы row было больше 1\r\n colSpan={col && col > 1 ? col : undefined} // Проверяем, чтобы col было больше 1\r\n {...props}\r\n className={`${styles['f-table-component__table_body-cell']} ${props.className || ''}`}\r\n style={style}\r\n >\r\n {children}\r\n </td>\r\n );\r\n};\r\n\r\nexport default FTableDataCell;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableFooter.\r\n * @interface IFTableFooter\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface IFTableFooter extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n /**\r\n * Дополнительные стили для нижнего колонтитула таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, строки `<tr>` или ячейки `<td>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Компонент FTableFooter представляет собой нижний колонтитул таблицы (`<tfoot>`).\r\n * Он поддерживает настройку стилей и передачу дочерних элементов.\r\n *\r\n * @component\r\n * @example\r\n * <FTableFooter st={{ borderTop: '2px solid #000' }}>\r\n * <tr>\r\n * <td>Итого</td>\r\n * <td>100</td>\r\n * </tr>\r\n * </FTableFooter>\r\n *\r\n * @param {IFTableFooter} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент нижнего колонтитула таблицы.\r\n */\r\nconst FTableFooter: FC<IFTableFooter> = ({\r\n st,\r\n children,\r\n ...props\r\n}) => {\r\n return (\r\n <tfoot\r\n style={st} // Применяем пользовательские стили\r\n {...props} // Передаем остальные пропсы\r\n className={`${styles[\"f-table-component__table_footer\"]} ${props.className || \"\"}`}\r\n\r\n >\r\n {children}\r\n </tfoot>\r\n );\r\n};\r\n\r\nexport default FTableFooter;","import { FC, useEffect } from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\n\r\nimport styles from \"../style/FDialog.module.scss\";\r\n\r\n/**\r\n * Тип ширины диалогового окна.\r\n */\r\nexport type DialogWidth = 'xs' | 'md' | 'lg' | 'xxl' | 'adaptive';\r\n\r\n/**\r\n * Пропсы компонента `FDialog`.\r\n */\r\nexport interface IFDialog {\r\n /**\r\n * Флаг открытия/закрытия диалога.\r\n */\r\n openAndClose: boolean;\r\n\r\n /**\r\n * Callback для закрытия диалога (например, из родителя).\r\n */\r\n closeButtonBackPage?: React.Dispatch<React.SetStateAction<boolean>>;\r\n\r\n /**\r\n * Если true — скрывает фон и контент за диалогом.\r\n */\r\n hide?: boolean;\r\n\r\n /**\r\n * Контент внутри диалога (может быть любым React-узлом).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Кастомный CSS класс.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для корневого контейнера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Ширина диалога.\r\n * @default 'lg'\r\n */\r\n width?: DialogWidth;\r\n}\r\n\r\n/**\r\n * Компонент `FDialog` — модальное окно, которое отображается поверх основного контента.\r\n *\r\n * Поддерживает:\r\n * - настройку ширины (`xs`, `md`, `lg`, `xxl`, `adaptive`)\r\n * - скрытие фона (`hide`)\r\n * - управление состоянием через `closeButtonBackPage`\r\n * - прокидывание кастомных стилей и классов\r\n *\r\n * @component\r\n * @example\r\n * <FDialog\r\n * openAndClose={isOpen}\r\n * closeButtonBackPage={setIsOpen}\r\n * width=\"md\"\r\n * className=\"custom-dialog\"\r\n * st={{ maxWidth: '600px' }}\r\n * >\r\n * <p>Содержимое диалога</p>\r\n * </FDialog>\r\n *\r\n * @param {boolean} openAndClose - Открывает/закрывает диалог.\r\n * @param {Function} [closeButtonBackPage] - Callback для закрытия диалога.\r\n * @param {boolean} [hide=false] - Если true — фон затемняется и блокируется.\r\n * @param {React.ReactNode} [children] - Контент диалога.\r\n * @param {string} [id] - HTML ID.\r\n * @param {string} [className] - Кастомный класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {DialogWidth} [width='lg'] - Ширина диалога.\r\n *\r\n * @returns {JSX.Element | null} — Рендерит диалог или null, если не открыт.\r\n */\r\nconst FDialog: FC<IFDialog> = ({\r\n openAndClose,\r\n closeButtonBackPage,\r\n hide = false,\r\n children,\r\n id,\r\n className,\r\n st,\r\n width = 'lg',\r\n}) => {\r\n // Обновляем состояние body при открытии/закрытии\r\n useEffect(() => {\r\n if (!openAndClose) return;\r\n\r\n const dialogCount = document.querySelectorAll(\".active-dialog\").length;\r\n\r\n if (dialogCount > 0) {\r\n document.body.classList.add(\"open-dialog\");\r\n } else {\r\n document.body.classList.remove(\"open-dialog\");\r\n }\r\n\r\n return () => {\r\n const updatedCount = document.querySelectorAll(\".active-dialog\").length;\r\n if (updatedCount === 0) {\r\n document.body.classList.remove(\"open-dialog\");\r\n }\r\n };\r\n }, [openAndClose]);\r\n\r\n // Не рендерим, если не открыто\r\n if (!openAndClose) return null;\r\n\r\n // Объект с ширинами\r\n const widthStyles: Record<DialogWidth, string> = {\r\n xs: '50vw',\r\n md: '65vw',\r\n lg: '80vw',\r\n xxl: '95vw',\r\n adaptive: 'fit-content',\r\n };\r\n\r\n const contentWidth = widthStyles[width];\r\n\r\n return ReactDOM.createPortal(\r\n <div\r\n id={id}\r\n style={st}\r\n className={`${styles[\"f-dialog\"]} ${openAndClose ? styles[\"active-dialog\"] : ''} ${className || ''}`}\r\n onClick={() => closeButtonBackPage?.(false)}\r\n >\r\n <div\r\n className={`${styles[\"f-dialog__content\"]} ${openAndClose ? styles['active'] : ''} ${hide ? styles['hide'] : ''}`}\r\n style={{\r\n width: contentWidth,\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {children}\r\n </div>\r\n </div>,\r\n document.body\r\n );\r\n};\r\n\r\nexport default FDialog;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FCloseIcon.\r\n * @interface IFCloseIcon\r\n */\r\nexport interface IFCloseIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события закрытия (клика по иконке).\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClose?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FCloseIcon представляет собой SVG иконку закрытия (крестик) с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FCloseIcon\r\n * @param {IFCloseIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClose] - Обработчик события закрытия (клика по иконке).\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FCloseIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClose={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FCloseIcon = React.forwardRef<SVGSVGElement, IFCloseIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClose, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClose ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClose}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFCloseIcon.displayName = 'FCloseIcon';\r\n\r\nexport default FCloseIcon;\r\n","import { FC } from \"react\";\r\nimport FCloseIcon from \"@icons/FCloseIcon\";\r\nimport styles from \"../style/FDialog.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FDialogHeader.\r\n */\r\nexport interface IFDialogHeader {\r\n /**\r\n * Заголовок диалога (отображается как текст).\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Callback, вызываемый при нажатии на кнопку закрытия.\r\n */\r\n handleClose?: () => void;\r\n}\r\n\r\n/**\r\n * Компонент `FDialogHeader` — шапка модального окна с заголовком и кнопкой закрытия.\r\n *\r\n * Используется внутри `FDialog`, чтобы отобразить заголовок и контролы в верхней части окна.\r\n *\r\n * @component\r\n * @example\r\n * <FDialogHeader\r\n * title=\"Подтвердите действие\"\r\n * handleClose={() => setIsOpen(false)}\r\n * />\r\n *\r\n * @param {string} [title] - Текст заголовка диалога.\r\n * @param {Function} [handleClose] - Callback для закрытия диалога.\r\n *\r\n * @returns {JSX.Element} — Рендерит шапку с заголовком и кнопкой закрытия.\r\n */\r\nconst FDialogHeader: FC<IFDialogHeader> = ({ title, handleClose }) => {\r\n return (\r\n <div className={styles[\"f-dialog__header\"]}>\r\n <h3 className={styles[\"f-dialog__header_title\"]}>\r\n {title}\r\n </h3>\r\n {handleClose && (\r\n <div className={styles[\"f-dialog__header_close\"]}>\r\n <FCloseIcon\r\n handleClose={handleClose}\r\n color=\"primary\"\r\n size={30}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FDialogHeader;","import { FC } from \"react\";\r\nimport styles from \"../style/FDialog.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FDialogBody.\r\n */\r\nexport interface IFDialogBody {\r\n /**\r\n * Инлайновые стили для контейнера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Контент внутри тела диалога (может быть любым React-узлом).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Включает вертикальную прокрутку при переполнении.\r\n * @default true\r\n */\r\n scroll?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FDialogBody` — тело модального окна с возможностью прокрутки.\r\n *\r\n * Используется внутри `FDialog` для отображения содержимого.\r\n *\r\n * @component\r\n * @example\r\n * <FDialogBody scroll={false} st={{ padding: '2rem' }}>\r\n * <p>Контент без прокрутки и с кастомным паддингом</p>\r\n * </FDialogBody>\r\n *\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {boolean} [scroll=true] - Если true — включает вертикальную прокрутку.\r\n * @param {React.ReactNode} [children] - Содержимое тела диалога.\r\n *\r\n * @returns {JSX.Element} — Рендерит обёртку с заданными стилями и прокруткой.\r\n */\r\nconst FDialogBody: FC<IFDialogBody> = ({ st, children, scroll = true }) => {\r\n const style = {\r\n ...(scroll ? { overflowY: 'auto' as const } : {}),\r\n ...st,\r\n };\r\n\r\n return (\r\n <div className={styles[\"f-dialog__body\"]} style={style}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FDialogBody;","import { FC } from \"react\";\r\nimport styles from \"../style/FDialog.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FDialogFooter.\r\n */\r\nexport interface IFDialogFooter {\r\n /**\r\n * Контент внутри футера (может быть любым React-узлом).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для футера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * HTML ID для идентификации элемента.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FDialogFooter` — область футера модального окна.\r\n *\r\n * Используется внутри `FDialog` для отображения кнопок или других элементов в нижней части диалога.\r\n *\r\n * @component\r\n * @example\r\n * <FDialogFooter\r\n * className=\"custom-footer\"\r\n * st={{ padding: '1rem', justifyContent: 'flex-end' }}\r\n * id=\"dialog-footer\"\r\n * >\r\n * <button>Закрыть</button>\r\n * </FDialogFooter>\r\n *\r\n * @param {React.ReactNode} [children] - Содержимое футера.\r\n * @param {string} [className] - Дополнительный CSS класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - HTML ID элемента.\r\n *\r\n * @returns {JSX.Element} — Рендерит обёртку с заданными стилями и классами.\r\n */\r\nconst FDialogFooter: FC<IFDialogFooter> = ({ children, className, st, id }) => {\r\n return (\r\n <div\r\n id={id}\r\n style={st}\r\n className={`${styles[\"f-dialog__footer\"]} ${className || ''}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FDialogFooter;","import { FC } from 'react';\r\nimport styles from './FProgress.module.scss';\r\n\r\n/**\r\n * Тип цвета для прогресс-бара или спиннера.\r\n *\r\n * @typedef {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'} ProgressColorType\r\n */\r\ntype ProgressColorType =\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'danger'\r\n | 'warning'\r\n | 'info'\r\n | 'light'\r\n | 'dark'\r\n | 'link';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FProgress.\r\n *\r\n * @interface IFProgress\r\n */\r\nexport interface IFProgress {\r\n /**\r\n * Инлайновые стили для внешнего контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Цвет индикатора загрузки.\r\n * @default 'primary'\r\n */\r\n color?: ProgressColorType;\r\n\r\n /**\r\n * Уникальный идентификатор уведомления.\r\n * Если не указан, генерируется автоматически.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n \r\n /**\r\n * Дополнительный CSS-класс для кастомизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FProgress` — индикатор загрузки (спиннер) с поддержкой:\r\n * - разных цветов (`primary`, `success`, `danger` и т.д.)\r\n * - пользовательских стилей через `st`\r\n * - CSS Modules для изоляции стилей\r\n *\r\n * Используется как универсальный спиннер, например на экране авторизации.\r\n *\r\n * @component\r\n * @example\r\n * // Простой пример\r\n * <FProgress />\r\n *\r\n * @example\r\n * // С кастомным стилем и цветом\r\n * <FProgress\r\n * color=\"danger\"\r\n * st={{ margin: '40px auto', width: 'fit-content' }}\r\n * />\r\n *\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {ProgressColorType} [color='primary'] - Цвет индикатора.\r\n * @param {string} [id] - HTML ID.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n *\r\n * @returns {JSX.Element} — Рендерит спиннер с указанным цветом и стилями.\r\n */\r\nconst FProgress: FC<IFProgress> = ({ st, color = 'primary', id, className }) => {\r\n\r\n return (\r\n <div\r\n className={`${styles['authorization-spinner']} ${styles.visible} ${className || ''}`}\r\n id={id}\r\n style={st}\r\n >\r\n <div className={`${styles['spinner-item']} ${styles[color]}`} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default FProgress;","import { FC, useEffect } from \"react\";\r\nimport styles from \"./FPreloader.module.scss\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FPreloader.\r\n *\r\n * @interface IFPreloader\r\n */\r\nexport interface IFPreloader {\r\n /**\r\n * Инлайновые стили для контейнера прелоадера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Цвет фона спиннера (прозрачности и т.д.)\r\n * @default '#e0e0e0'\r\n */\r\n backgroundColor?: string;\r\n\r\n /**\r\n * Дочерние элементы — обычно это SVG или индикатор загрузки.\r\n * @type {React.ReactElement | React.ReactNode | undefined}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Флаг открытия/закрытия прелоадера.\r\n * @type {boolean}\r\n */\r\n open: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FPreloader` — универсальный прелоадер (спиннер) с возможностью:\r\n * - управления состоянием через `open`\r\n * - кастомного цвета фона\r\n * - добавления дочерних элементов (например, логотипа)\r\n * - поддержка темизации через CSS Module\r\n *\r\n * При `open={true}` блокирует `body` скролл и показывает спиннер.\r\n *\r\n * @component\r\n * @example\r\n * // Базовое использование\r\n * <FPreloader open={true}>\r\n * <FLoadIcon size={24} />\r\n * </FPreloader>\r\n *\r\n * @example\r\n * // С пользовательским стилем и фоном\r\n * <FPreloader\r\n * open={isLoading}\r\n * backgroundColor=\"#ffffffaa\"\r\n * st={{ zIndex: 9999 }}\r\n * >\r\n * <div>Загрузка...</div>\r\n * </FPreloader>\r\n *\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для контейнера.\r\n * @param {string} [backgroundColor='#e0e0e0'] - Цвет фона спиннера.\r\n * @param {React.ReactNode} [children] - Элементы, отображаемые внутри.\r\n * @param {boolean} open - Открывать ли спиннер.\r\n *\r\n * @returns {JSX.Element} — Рендерит прелоадер поверх всего содержимого.\r\n */\r\nconst FPreloader: FC<IFPreloader> = ({\r\n st,\r\n backgroundColor = '#e0e0e0',\r\n children,\r\n open\r\n}) => {\r\n\r\n const mergedStyle: React.CSSProperties = {\r\n backgroundColor,\r\n ...st\r\n };\r\n\r\n useEffect(() => {\r\n if (document.querySelectorAll(\".active-preloader\").length > 0) {\r\n document.body.classList.add('open-preloader');\r\n } else {\r\n document.body.classList.remove('open-preloader');\r\n }\r\n\r\n return () => {\r\n document.body.classList.remove('open-preloader');\r\n };\r\n }, [open]);\r\n\r\n return (\r\n <div\r\n className={`${styles['f-preloader']} ${open ? styles['active-preloader'] : ''}`}\r\n style={mergedStyle}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FPreloader;","import { forwardRef } from \"react\";\r\n\r\nimport styles from \"./FCheckbox.module.scss\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FCheckbox.\r\n *\r\n * @interface IFCheckbox\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFCheckbox extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Текст или элемент, отображаемый рядом с чекбоксом.\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n label?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации контейнера.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * Компонент `FCheckbox` — кастомный чекбокс с поддержкой:\r\n * - метки (label)\r\n * - пользовательских классов и стилей\r\n * - всех стандартных атрибутов `<input type=\"checkbox\">`\r\n *\r\n * Использует CSS Modules для изоляции стилей.\r\n *\r\n * @component\r\n * @example\r\n * <FCheckbox\r\n * label=\"Согласен с условиями\"\r\n * defaultChecked={true}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским классом и стилем\r\n * <FCheckbox\r\n * label={<span>Подписаться на рассылку</span>}\r\n * className=\"my-custom-checkbox\"\r\n * st={{ marginBottom: '1rem' }}\r\n * />\r\n *\r\n * @param {React.ReactNode} [label] - Текст/элемент рядом с чекбоксом.\r\n * @param {string} [className] - Дополнительный CSS-класс для обёртки.\r\n * @param {string} [id] - ID для контейнера.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для контейнера.\r\n * @param {...React.InputHTMLAttributes<HTMLInputElement>} props - Атрибуты HTMLInputElement.\r\n *\r\n * @returns {JSX.Element} - Рендерит кастомный чекбокс с меткой.\r\n */\r\nconst FCheckbox = forwardRef<HTMLInputElement, IFCheckbox>(\r\n (\r\n {\r\n label,\r\n className,\r\n st,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <div\r\n className={`${styles['f-checkbox']} ${className || ''}`}\r\n style={st}\r\n >\r\n <label>\r\n <input ref={ref} type=\"checkbox\" {...props} />\r\n {label}\r\n </label>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FCheckbox;","import { forwardRef } from \"react\";\r\nimport styles from './RadioButton.module.scss';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FRadioButton.\r\n *\r\n * @interface IFRadioButton\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFRadioButton extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Дочерний элемент, отображается рядом с радио-кнопкой (например, текст или иконка).\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n label?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для внешнего контейнера.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * Компонент `FRadioButton` — кастомная радио-кнопка с поддержкой:\r\n * - различных цветовых вариантов\r\n * - метки (label)\r\n * - инлайновых стилей\r\n * - темизации через CSS Modules\r\n * - всех стандартных атрибутов `<input type=\"radio\">`\r\n *\r\n * @component\r\n * @example\r\n * <FRadioButton\r\n * label=\"Выбрать\"\r\n * checked={isChecked}\r\n * onChange={handleChange}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским классом и стилем\r\n * <FRadioButton\r\n * label=\"Заблокировано\"\r\n * disabled\r\n * className={styles.danger}\r\n * st={{ margin: '1rem 0' }}\r\n * />\r\n *\r\n * @param {React.ReactNode} [label] - Текст или элемент рядом с радио.\r\n * @param {string} [className] - Пользовательский класс для цвета/стилей.\r\n * @param {string} [id] - ID элемента.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {...React.InputHTMLAttributes<HTMLInputElement>} props - Атрибуты HTMLInputElement.\r\n *\r\n * @returns {JSX.Element} — Рендерит кастомную радио-кнопку с меткой.\r\n */\r\nconst FRadioButton = forwardRef<HTMLInputElement, IFRadioButton>(\r\n (\r\n {\r\n label,\r\n className,\r\n st,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <div\r\n className={`${styles['f-radio']} ${className || ''}`}\r\n style={st}\r\n >\r\n <label>\r\n <input ref={ref} type=\"radio\" {...props} />\r\n {label}\r\n </label>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FRadioButton;","import { useMemo } from 'react';\r\n\r\n/**\r\n * Константа, обозначающая точки (`...`) между страницами.\r\n * @constant DOTS\r\n * @type {string}\r\n */\r\nexport const DOTS = '...';\r\n\r\n/**\r\n * Функция генерации массива чисел от `start` до `end`.\r\n *\r\n * @function range\r\n * @param {number} start - Начальное число диапазона (включительно).\r\n * @param {number} end - Конечное число диапазона (включительно).\r\n * @returns {number[]} — Массив чисел от `start` до `end`.\r\n *\r\n * @example\r\n * range(1, 5); // [1, 2, 3, 4, 5]\r\n */\r\nconst range = (start: number, end: number): number[] => {\r\n const length = end - start + 1;\r\n return Array.from({ length }, (_, idx) => idx + start);\r\n};\r\n\r\n/**\r\n * Интерфейс параметров для хука `usePagination`.\r\n *\r\n * @interface IUsePaginationProps\r\n */\r\ninterface IProps {\r\n /**\r\n * Текущая активная страница. Нумерация начинается с 1.\r\n * @type {number}\r\n */\r\n currentPage: number;\r\n\r\n /**\r\n * Общее количество элементов (например, записей).\r\n * @type {number}\r\n */\r\n totalCount: number;\r\n\r\n /**\r\n * Количество элементов на одной странице.\r\n * @type {number}\r\n */\r\n pageSize: number;\r\n\r\n /**\r\n * Количество соседних страниц, показываемых по обе стороны от текущей.\r\n * Допустимые значения: `0`, `1` или `2`.\r\n * @type {number}\r\n */\r\n siblingCount: number;\r\n}\r\n\r\n/**\r\n * Хук `usePagination` рассчитывает диапазон страниц для отображения,\r\n * включая поддержку точек (`...`) при большом количестве страниц.\r\n *\r\n * Используется в компоненте `FPagination`.\r\n *\r\n * @function usePagination\r\n * @param {IProps} props - Параметры пагинации.\r\n * @param {number} props.currentPage - Текущая страница (начинается с 1).\r\n * @param {number} props.totalCount - Общее количество элементов.\r\n * @param {number} props.pageSize - Элементов на странице.\r\n * @param {number} props.siblingCount - Сколько соседей показывать вокруг текущей страницы.\r\n *\r\n * @returns {Array<number | string> | null} — Возвращает массив с номерами страниц и точками (`'...'`),\r\n * или `null`, если не нужно отображать пагинацию.\r\n *\r\n * @example\r\n * const paginationRange = usePagination({\r\n * currentPage: 2,\r\n * totalCount: 100,\r\n * pageSize: 10,\r\n * siblingCount: 1\r\n * });\r\n * // returns [1, 2, 3, \"...\", 10]\r\n *\r\n * @example\r\n * // При малом количестве страниц\r\n * usePagination({\r\n * currentPage: 3,\r\n * totalCount: 30,\r\n * pageSize: 10,\r\n * siblingCount: 1\r\n * });\r\n * // returns [1, 2, 3]\r\n */\r\nexport const usePagination = ({\r\n totalCount,\r\n pageSize,\r\n siblingCount = 1,\r\n currentPage\r\n}: IProps) => {\r\n const paginationRange = useMemo(() => {\r\n const totalPageCount = Math.ceil(totalCount / pageSize);\r\n\r\n const totalPageNumbers = siblingCount + 5; // 1 (current) + 2* siblingCount + first + last + dots\r\n\r\n if (totalPageNumbers >= totalPageCount) {\r\n return range(1, totalPageCount);\r\n }\r\n\r\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\r\n const rightSiblingIndex = Math.min(\r\n currentPage + siblingCount,\r\n totalPageCount\r\n );\r\n\r\n const shouldShowLeftDots = leftSiblingIndex > 2;\r\n const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2;\r\n\r\n const firstPageIndex = 1;\r\n const lastPageIndex = totalPageCount;\r\n\r\n if (!shouldShowLeftDots && shouldShowRightDots) {\r\n const leftItemCount = 3 + 2 * siblingCount;\r\n const leftRange = range(1, leftItemCount);\r\n return [...leftRange, DOTS, totalPageCount];\r\n }\r\n\r\n if (shouldShowLeftDots && !shouldShowRightDots) {\r\n const rightItemCount = 3 + 2 * siblingCount;\r\n const rightRange = range(\r\n totalPageCount - rightItemCount + 1,\r\n totalPageCount\r\n );\r\n return [firstPageIndex, DOTS, ...rightRange];\r\n }\r\n\r\n if (shouldShowLeftDots && shouldShowRightDots) {\r\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\r\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];\r\n }\r\n\r\n return null;\r\n }, [totalCount, pageSize, siblingCount, currentPage]);\r\n\r\n return paginationRange;\r\n};","import { FC } from 'react';\r\n\r\nimport { DOTS, usePagination } from './hooks/usePagination';\r\nimport styles from './FPagination.module.scss';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FPagination.\r\n *\r\n * @interface IFPagination\r\n */\r\nexport interface IFPagination {\r\n /**\r\n * Номер текущей страницы (начинается с 1).\r\n * @type {number}\r\n */\r\n currentPage: number;\r\n\r\n /**\r\n * Общее количество элементов (для вычисления страниц).\r\n * @type {number}\r\n */\r\n totalCount: number;\r\n\r\n /**\r\n * Количество элементов на странице.\r\n * @type {number}\r\n */\r\n pageSize: number;\r\n\r\n /**\r\n * Callback при изменении страницы. Принимает номер страницы или строку (\"prev\", \"next\").\r\n * @param {number | string} page - новый номер страницы или команда.\r\n */\r\n onPageChange: (page: number | string) => void;\r\n\r\n /**\r\n * Уникальный ID элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для контейнера пагинации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для внешнего контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Сколько соседних страниц показывать вокруг текущей (0, 1 или 2).\r\n * @type {0 | 1 | 2}\r\n */\r\n siblingCount: 0 | 1 | 2;\r\n}\r\n\r\n/**\r\n * Компонент `FPagination` — горизонтальная навигация по страницам.\r\n *\r\n * Показывает:\r\n * - кнопки для перехода к предыдущей/следующей странице\r\n * - диапазон страниц\r\n * - точки (`...`) при большом количестве страниц\r\n *\r\n * @component\r\n * @example\r\n * <FPagination\r\n * currentPage={currentPage}\r\n * totalCount={100}\r\n * pageSize={5}\r\n * siblingCount={1}\r\n * onPageChange={(page) => setCurrentPage(page)}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским классом и стилем\r\n * <FPagination\r\n * currentPage={1}\r\n * totalCount={100}\r\n * pageSize={10}\r\n * siblingCount={2}\r\n * onPageChange={(page) => console.log('Перешли на', page)}\r\n * className=\"custom-pagination\"\r\n * st={{ justifyContent: 'flex-start' }}\r\n * />\r\n *\r\n * @param {number} currentPage - Номер текущей страницы (начинается с 1).\r\n * @param {number} totalCount - Общее количество записей.\r\n * @param {number} pageSize - Элементов на странице.\r\n * @param {(page: number | string) => void} onPageChange - Изменение страницы.\r\n * @param {string} [id] - HTML ID для контейнера.\r\n * @param {string} [className] - Дополнительный CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {0 | 1 | 2} siblingCount - Число видимых страниц рядом с текущей.\r\n *\r\n * @returns {JSX.Element | null} — Рендерит `<ul>` с кнопками навигации или возвращает `null`, если не нужно отображать.\r\n */\r\nconst FPagination: FC<IFPagination> = ({\r\n currentPage,\r\n totalCount,\r\n pageSize,\r\n onPageChange,\r\n id,\r\n className,\r\n st,\r\n siblingCount\r\n}) => {\r\n const paginationRange = usePagination({\r\n currentPage,\r\n totalCount,\r\n siblingCount,\r\n pageSize\r\n });\r\n\r\n if (currentPage === 0 || !paginationRange || paginationRange.length < 2) {\r\n return null;\r\n }\r\n\r\n const onNext = () => onPageChange(currentPage + 1);\r\n const onPrevious = () => onPageChange(currentPage - 1);\r\n const lastPage = paginationRange[paginationRange.length - 1];\r\n\r\n return (\r\n <ul\r\n className={`${styles['pagination-container']} ${className || ''}`}\r\n style={st}\r\n id={id}\r\n >\r\n <li\r\n className={`${styles['pagination-item']} ${currentPage === 1 ? styles.disabled : ''}`}\r\n onClick={onPrevious}\r\n >\r\n <div className={`${styles.arrow} ${styles.left}`} />\r\n </li>\r\n\r\n {paginationRange.map((pageNumber, index) => {\r\n if (pageNumber === DOTS) {\r\n return (\r\n <li key={index} className={`${styles['pagination-item']} ${styles.dots}`}>\r\n …\r\n </li>\r\n );\r\n }\r\n\r\n return (\r\n <li\r\n key={index}\r\n className={`${styles['pagination-item']} ${pageNumber === currentPage ? styles.selected : ''}`}\r\n onClick={() => onPageChange(pageNumber)}\r\n >\r\n {pageNumber}\r\n </li>\r\n );\r\n })}\r\n\r\n <li\r\n className={`${styles['pagination-item']} ${currentPage === lastPage ? styles.disabled : ''}`}\r\n onClick={onNext}\r\n >\r\n <div className={`${styles.arrow} ${styles.right}`} />\r\n </li>\r\n </ul>\r\n );\r\n};\r\n\r\nexport default FPagination;","import { FC } from 'react';\r\n\r\nimport styles from \"../static/FTimeline.module.scss\";\r\n\r\nexport interface IFTimeline {\r\n children?: React.ReactElement | React.ReactNode,\r\n st?: React.CSSProperties,\r\n id?: string,\r\n className?: string\r\n}\r\n\r\nconst FTimeline: FC<IFTimeline> = ({\r\n children,\r\n st,\r\n id,\r\n className\r\n}) => {\r\n\r\n return (\r\n <div className={`${styles[\"f-time-line\"]} ${className || ''}`} style={st} id={id}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FTimeline;","import { FC } from 'react';\r\n\r\nimport styles from \"../static/FTimeline.module.scss\";\r\n\r\nexport interface IFTimelineCard {\r\n children?: React.ReactElement | React.ReactNode,\r\n st?: React.CSSProperties,\r\n title?: string,\r\n id?: string,\r\n className?: string\r\n}\r\n\r\nconst FTimelineCard: FC<IFTimelineCard> = ({\r\n children,\r\n st,\r\n title,\r\n id,\r\n className\r\n}) => {\r\n return (\r\n <div className={`${styles[\"f-time-line__block\"]} ${className || ''}`} id={id}>\r\n <div className={styles['f-time-line__block-circle']} />\r\n <div className={styles['f-time-line__block-inner']} style={st}>\r\n {title && <div className={styles['f-time-line__block-title']}>{title}</div>}\r\n <div className={styles['f-time-line__block-content']}>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FTimelineCard;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowIcon.\r\n * @interface IFArrowIcon\r\n */\r\nexport interface IFArrowIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Направление стрелки.\r\n * @type {('up' | 'down' | 'left' | 'right')}\r\n * @default 'right'\r\n */\r\n direction?: 'up' | 'down' | 'left' | 'right';\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowIcon представляет собой SVG иконку стрелки с возможностью настройки цвета, размера, направления и обработки кликов.\r\n *\r\n * @function FArrowIcon\r\n * @param {IFArrowIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {('up' | 'down' | 'left' | 'right')} [direction='right'] - Направление стрелки. По умолчанию 'right'.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * direction=\"down\"\r\n * handleClick={() => console.log('Arrow clicked!')}\r\n * />\r\n */\r\nconst FArrowIcon = React.forwardRef<SVGSVGElement, IFArrowIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n direction = 'right',\r\n handleClick,\r\n id,\r\n className,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n\r\n const style = {\r\n transform: `rotate(\r\n ${direction === 'down' ? 90 :\r\n direction === 'up' ? -90 :\r\n direction === 'right' ? 0 :\r\n 180}deg)`\r\n }\r\n\r\n st = Object.assign({}, style, st)\r\n\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 320 512\"\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n style={st}\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"></path>\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowIcon.displayName = 'FArrowIcon';\r\n\r\nexport default FArrowIcon;\r\n","import { FC, useEffect, useState, useCallback } from 'react';\r\n\r\nimport styles from './FOpenImgFull.module.scss';\r\nimport FCloseIcon from '@icons/FCloseIcon';\r\nimport FArrowIcon from '@icons/FArrowIcon';\r\n\r\nimport FDialog from '@material/Dialog/FDialog';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента `FOpenImgFull`.\r\n *\r\n * @interface IFOpenImgFull\r\n */\r\nexport interface IFOpenImgFull {\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для контейнера.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для диалогового окна.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Массив URL-адресов изображений.\r\n * @type {string[]}\r\n * @required\r\n */\r\n imagesUrl: string[];\r\n\r\n /**\r\n * Индекс активного изображения.\r\n * @type {number}\r\n * @required\r\n */\r\n selectedImg: number;\r\n\r\n /**\r\n * Функция изменения текущего изображения.\r\n * @param {number} index - Новый индекс изображения.\r\n * @returns {void}\r\n */\r\n setSelectedImg: (index: number) => void;\r\n\r\n /**\r\n * Callback, вызываемый при закрытии диалога.\r\n * @type {() => void | undefined}\r\n */\r\n handleClose?: () => void;\r\n\r\n /**\r\n * Флаг открытия/закрытия модального окна.\r\n * @type {boolean}\r\n */\r\n openAndClose: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FOpenImgFull` — модальное окно для просмотра изображений в полный экран с навигацией.\r\n *\r\n * Отображает:\r\n * - текущее изображение по индексу `selectedImg`\r\n * - стрелки навигации (влево/вправо)\r\n * - кнопку закрытия (`FCloseIcon`)\r\n *\r\n * Используется в связке с `FDialog` и поддерживает кастомные стили и классы.\r\n *\r\n * @component\r\n * @example\r\n * // Базовое использование\r\n * const [open, setOpen] = useState(true);\r\n * const [selected, setSelected] = useState(0);\r\n *\r\n * <FOpenImgFull\r\n * imagesUrl={['/img1.jpg', '/img2.png']}\r\n * selectedImg={selected}\r\n * setSelectedImg={setSelected}\r\n * openAndClose={open}\r\n * handleClose={() => setOpen(false)}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским стилем\r\n * <FOpenImgFull\r\n * imagesUrl={['/img1.jpg']}\r\n * selectedImg={0}\r\n * setSelectedImg={(i) => console.log(i)}\r\n * openAndClose={true}\r\n * st={{ maxWidth: '90%', maxHeight: '90%' }}\r\n * />\r\n *\r\n * @param {string[]} imagesUrl - Массив ссылок на изображения.\r\n * @param {number} selectedImg - Индекс текущего изображения.\r\n * @param {(index: number) => void} setSelectedImg - Обработчик изменения изображения.\r\n * @param {() => void} [handleClose] - Callback, вызывается при закрытии.\r\n * @param {boolean} openAndClose - Флаг открытия/закрытия окна.\r\n * @param {string} [id] - ID элемента.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n *\r\n * @returns {JSX.Element | null} — Рендерит модальное окно с изображением или `null`, если данные некорректны.\r\n */\r\nconst FOpenImgFull: FC<IFOpenImgFull> = ({\r\n id,\r\n className,\r\n st,\r\n imagesUrl,\r\n selectedImg,\r\n setSelectedImg,\r\n handleClose,\r\n openAndClose\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState(false);\r\n const [touchStart, setTouchStart] = useState<number | null>(null);\r\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\r\n const [isZoomed, setIsZoomed] = useState(false);\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n setError(false);\r\n setIsZoomed(false);\r\n\r\n // Предзагрузка следующего изображения\r\n const nextImage = new Image();\r\n nextImage.src = imagesUrl[selectedImg];\r\n nextImage.onload = () => {\r\n setIsLoading(false);\r\n };\r\n nextImage.onerror = () => {\r\n setError(true);\r\n setIsLoading(false);\r\n };\r\n }, [selectedImg, imagesUrl]);\r\n\r\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\r\n if (!openAndClose) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowLeft':\r\n if (selectedImg > 0) {\r\n setSelectedImg(selectedImg - 1);\r\n }\r\n break;\r\n case 'ArrowRight':\r\n if (selectedImg < imagesUrl.length - 1) {\r\n setSelectedImg(selectedImg + 1);\r\n }\r\n break;\r\n case 'Escape':\r\n handleClose?.();\r\n break;\r\n case 'z':\r\n setIsZoomed(prev => !prev);\r\n break;\r\n }\r\n }, [selectedImg, openAndClose, handleClose, setSelectedImg]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [handleKeyDown]);\r\n\r\n const handleTouchStart = (e: React.TouchEvent) => {\r\n setTouchStart(e.touches[0].clientX);\r\n };\r\n\r\n const handleTouchMove = (e: React.TouchEvent) => {\r\n setTouchEnd(e.touches[0].clientX);\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n if (!touchStart || !touchEnd) return;\r\n\r\n const distance = touchStart - touchEnd;\r\n const isLeftSwipe = distance > 50;\r\n const isRightSwipe = distance < -50;\r\n\r\n if (isLeftSwipe && selectedImg < imagesUrl.length - 1) {\r\n setSelectedImg(selectedImg + 1);\r\n } else if (isRightSwipe && selectedImg > 0) {\r\n setSelectedImg(selectedImg - 1);\r\n }\r\n\r\n setTouchStart(null);\r\n setTouchEnd(null);\r\n };\r\n\r\n const handleImageClick = () => {\r\n setIsZoomed(prev => !prev);\r\n };\r\n\r\n if (!imagesUrl.length || selectedImg < 0 || selectedImg >= imagesUrl.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n <FDialog\r\n openAndClose={openAndClose}\r\n st={st}\r\n className={`${styles['fv-opn-img-full']} ${className || ''}`}\r\n id={id}\r\n >\r\n <div className={styles['fv-opn-img-full-body']}>\r\n {/* Кнопка закрытия */}\r\n <div className={styles['close-button']}>\r\n {handleClose && (\r\n <FCloseIcon\r\n handleClose={() => {\r\n handleClose();\r\n document.body.style.overflow = 'auto';\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Навигация и изображение */}\r\n <div\r\n className={styles['image-container']}\r\n onTouchStart={handleTouchStart}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n >\r\n {/* Левая стрелка */}\r\n {selectedImg > 0 && (\r\n <div className={styles['arrow-left']}>\r\n <FArrowIcon\r\n direction=\"left\"\r\n handleClick={() => setSelectedImg(selectedImg - 1)}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Изображение */}\r\n <div className={styles['image-wrapper']}>\r\n {isLoading && (\r\n <div className={styles['loading-spinner']}>\r\n <div className={styles['spinner']}></div>\r\n </div>\r\n )}\r\n {error ? (\r\n <div className={styles['error-message']}>\r\n Ошибка загрузки изображения\r\n </div>\r\n ) : (\r\n <img\r\n src={imagesUrl[selectedImg]}\r\n alt=\"Полноэкранное изображение\"\r\n onLoad={() => setIsLoading(false)}\r\n onError={() => {\r\n setError(true);\r\n setIsLoading(false);\r\n }}\r\n className={styles['full-image']}\r\n onClick={handleImageClick}\r\n style={{\r\n cursor: 'zoom-in',\r\n transform: isZoomed ? 'scale(1.5)' : 'scale(1)',\r\n transition: 'transform 0.3s ease'\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Правая стрелка */}\r\n {selectedImg < imagesUrl.length - 1 && (\r\n <div className={styles['arrow-right']}>\r\n <FArrowIcon\r\n direction=\"right\"\r\n handleClick={() => setSelectedImg(selectedImg + 1)}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Индикатор прогресса */}\r\n {imagesUrl.length > 1 && (\r\n <div className={styles['progress-indicator']}>\r\n {imagesUrl.map((_, index) => (\r\n <div\r\n key={index}\r\n className={`${styles['progress-dot']} ${index === selectedImg ? styles['active'] : ''\r\n }`}\r\n onClick={() => setSelectedImg(index)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </FDialog>\r\n );\r\n};\r\n\r\nexport default FOpenImgFull;","import { FC, useEffect, useState } from 'react';\r\n\r\nimport styles from './FAccordion.module.scss';\r\n\r\n/**\r\n * Тип варианта цветовой схемы аккордеона.\r\n * @typedef {'info' | 'alert' | 'warning'} FAccordionVariant\r\n */\r\ntype FAccordionVariant = 'info' | 'alert' | 'warning';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FAccordion.\r\n *\r\n * @interface IFAccordion\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface IFAccordion {\r\n /**\r\n * Дочерние элементы, отображаемые внутри аккордеона.\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Вариант цветовой схемы аккордеона.\r\n * @type {FAccordionVariant}\r\n * @default 'info'\r\n */\r\n variant?: FAccordionVariant;\r\n\r\n /**\r\n * Заголовок аккордеона, отображается в элементе `<summary>`.\r\n * @type {string}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера аккордеона.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Обработчик клика по заголовку аккордеона.\r\n * @type {React.MouseEventHandler<HTMLDivElement> | undefined}\r\n */\r\n onClick?: React.MouseEventHandler<HTMLDivElement> | undefined;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли содержимое быть открытым.\r\n * Если задан, управляет состоянием извне.\r\n * @type {boolean}\r\n */\r\n open?: boolean;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли содержимое быть открытым по умолчанию.\r\n * Используется только при монтировании компонента.\r\n * @type {boolean}\r\n */\r\n defaultOpen?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FAccordion` — простой аккордеон на основе HTML `<details>` и `<summary>`.\r\n *\r\n * Поддерживает:\r\n * - разные цветовые схемы (`variant`)\r\n * - кастомный заголовок (`title`)\r\n * - внешнее управление состоянием (`open`)\r\n * - начальное состояние (`defaultOpen`)\r\n * - пользовательские классы и стили\r\n *\r\n * @component\r\n * @example\r\n * // Аккордеон с начальным открытым состоянием\r\n * <FAccordion\r\n * variant=\"success\"\r\n * title=\"Информация\"\r\n * defaultOpen={true}\r\n * >\r\n * <p>Содержимое аккордеона</p>\r\n * </FAccordion>\r\n *\r\n * @example\r\n * // Контролируемый аккордеон\r\n * const [isOpen, setIsOpen] = useState(false);\r\n * <FAccordion\r\n * title=\"Детали\"\r\n * open={isOpen}\r\n * onClick={() => setIsOpen(!isOpen)}\r\n * >\r\n * <div>Раскрытый текст</div>\r\n * </FAccordion>\r\n *\r\n * @param {React.ReactNode} [children] - Содержимое, которое будет показано/скрыто.\r\n * @param {FAccordionVariant} [variant='info'] - Цветовая схема аккордеона.\r\n * @param {string} [title] - Заголовок аккордеона.\r\n * @param {string} [id] - ID для идентификации в DOM.\r\n * @param {string} [className] - Дополнительный CSS-класс.\r\n * @param {React.CSSProperties} [st] - Дополнительные инлайновые стили.\r\n * @param {boolean} [open] - Контролируемое состояние открытия.\r\n * @param {boolean} [defaultOpen=false] - Начальное состояние открытия.\r\n * @param {React.MouseEventHandler<HTMLDivElement>} [onClick] - Обработчик клика.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<details>` обёрнутый в `<div>` с возможностью управления состоянием.\r\n */\r\nconst FAccordion: FC<IFAccordion> = ({\r\n variant = 'info',\r\n title,\r\n children,\r\n id,\r\n className,\r\n st,\r\n onClick,\r\n open,\r\n defaultOpen\r\n}) => {\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n\r\n useEffect(() => {\r\n if (open !== undefined) {\r\n setIsOpen(open);\r\n }\r\n }, [open]);\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n className={`${styles.card} ${className || ''}`}\r\n id={id}\r\n >\r\n <details\r\n className={styles[variant]}\r\n open={isOpen}\r\n style={st}\r\n >\r\n <summary className={styles['fv-accord-title']}>\r\n {title}\r\n </summary>\r\n {children}\r\n </details>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FAccordion;","import { FC, useEffect, useRef, useState } from 'react';\r\nimport FFile from '@material/FFile';\r\nimport styles from './FInputFileForm.module.scss';\r\n\r\n/**\r\n * Тип размера файла.\r\n * @typedef {'КБ' | 'МБ'} FileSizeUnit\r\n */\r\ntype FileSizeUnit = 'КБ' | 'МБ';\r\n\r\n/**\r\n * Интерфейс для ограничения максимального размера файла.\r\n *\r\n * @interface IMaxSize\r\n */\r\nexport interface IMaxSize {\r\n /**\r\n * Единица измерения: `'КБ'` или `'МБ'`\r\n * @type {FileSizeUnit}\r\n */\r\n dimension: FileSizeUnit;\r\n\r\n /**\r\n * Числовое значение размера.\r\n * @type {number}\r\n */\r\n size: number;\r\n}\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FInputFileForm.\r\n *\r\n * @interface IFInputFileForm\r\n */\r\nexport interface IFInputFileForm {\r\n /**\r\n * Уникальный идентификатор поля ввода.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для кастомизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Ограничение на максимальный размер загружаемого файла.\r\n * @type {IMaxSize | undefined}\r\n */\r\n dataMaxSize?: IMaxSize;\r\n\r\n /**\r\n * Атрибут name у `<input type=\"file\">`.\r\n * @type {string | undefined}\r\n */\r\n name?: string;\r\n\r\n /**\r\n * Форматы файлов, разрешённые к загрузке.\r\n * Например: `\"image/*\"`, `\"application/pdf\"`, `\"audio/*\"`\r\n * @type {string | undefined}\r\n */\r\n accept?: string;\r\n\r\n /**\r\n * Разрешить ли множественную загрузку.\r\n * @type {boolean | undefined}\r\n */\r\n multiple?: boolean;\r\n\r\n /**\r\n * Callback, вызываемый при изменении списка файлов.\r\n * @param {FileList} files - Список выбранных файлов.\r\n */\r\n onChange: (files: FileList) => void;\r\n\r\n /**\r\n * Заблокировать ли поле загрузки.\r\n * @type {boolean}\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Сбросить выбранное значение (очистка инпута).\r\n * @type {boolean}\r\n */\r\n deleteFile?: boolean;\r\n\r\n /**\r\n * Заголовок элемента input (title).\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Указывает, что поле обязательно для заполнения.\r\n * @type {boolean}\r\n */\r\n required?: boolean;\r\n\r\n /**\r\n * Callback, вызываемый при возникновении ошибок валидации.\r\n * @param {string[]} errors - Массив ошибок.\r\n */\r\n onValidationError?: (errors: string[]) => void;\r\n\r\n /**\r\n * Показывать ли предварительный просмотр загруженных файлов.\r\n * @type {boolean}\r\n */\r\n showPreview?: boolean;\r\n\r\n /**\r\n * Максимальное количество файлов для загрузки.\r\n * @type {number | undefined}\r\n */\r\n maxFiles?: number;\r\n}\r\n\r\n/**\r\n * Компонент `FInputFileForm` — кастомная зона загрузки файлов с поддержкой:\r\n * - drag & drop\r\n * - ограничения по размеру\r\n * - отображения допустимых форматов\r\n * - темизации через CSS Modules\r\n *\r\n * @component\r\n * @example\r\n * <FInputFileForm\r\n * multiple={true}\r\n * accept=\"image/*\"\r\n * dataMaxSize={{ dimension: \"МБ\", size: 5 }}\r\n * onChange={(files) => console.log(files)}\r\n * />\r\n *\r\n * @example\r\n * // Отключённое состояние\r\n * <FInputFileForm\r\n * disabled\r\n * onChange={() => {}}\r\n * />\r\n *\r\n * @param {string} [id] - ID элемента.\r\n * @param {string} [className] - Пользовательский класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {IMaxSize} [dataMaxSize] - Ограничение на размер файла.\r\n * @param {string} [accept] - Допустимые форматы.\r\n * @param {boolean} [multiple=false] - Множественная загрузка.\r\n * @param {Function} onChange - Обработчик изменения файлов.\r\n * @param {boolean} [disabled=false] - Блокировка поля.\r\n * @param {boolean} [deleteFile] - Очистка файла.\r\n * @param {string} [title] - HTML атрибут `title`.\r\n * @param {boolean} [required] - Флаг обязательности.\r\n * @param {Function} [onValidationError] - Обработчик ошибок валидации.\r\n * @param {boolean} [showPreview=true] - Показывать ли предварительный просмотр.\r\n * @param {number} [maxFiles] - Максимальное количество файлов для загрузки.\r\n *\r\n * @returns {JSX.Element} — Рендерит зону загрузки файлов с иконкой и текстом.\r\n */\r\nconst FInputFileForm: FC<IFInputFileForm> = ({\r\n id,\r\n className,\r\n st,\r\n dataMaxSize,\r\n name,\r\n accept,\r\n multiple = false,\r\n onChange,\r\n disabled = false,\r\n deleteFile,\r\n title,\r\n required,\r\n onValidationError,\r\n showPreview = true,\r\n maxFiles\r\n}) => {\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\r\n const [uploadProgress, setUploadProgress] = useState<{ [key: string]: number }>({});\r\n const [errors, setErrors] = useState<string[]>([]);\r\n\r\n const validateFiles = (files: File[]): string[] => {\r\n const newErrors: string[] = [];\r\n\r\n if (maxFiles && files.length > maxFiles) {\r\n newErrors.push(`Максимальное количество файлов: ${maxFiles}`);\r\n }\r\n\r\n files.forEach(file => {\r\n if (dataMaxSize) {\r\n const maxSizeInBytes = dataMaxSize.dimension === 'МБ'\r\n ? dataMaxSize.size * 1024 * 1024\r\n : dataMaxSize.size * 1024;\r\n\r\n if (file.size > maxSizeInBytes) {\r\n newErrors.push(`Файл ${file.name} превышает максимальный размер ${dataMaxSize.size} ${dataMaxSize.dimension}`);\r\n }\r\n }\r\n\r\n if (accept) {\r\n const fileType = file.type;\r\n const fileName = file.name.toLowerCase();\r\n const acceptedTypes = accept.split(',').map(type => type.trim());\r\n\r\n const isValidType = acceptedTypes.some(type => {\r\n // Для MIME-типов\r\n if (type.includes('/')) {\r\n if (type.endsWith('/*')) {\r\n const category = type.split('/')[0];\r\n return fileType.startsWith(`${category}/`);\r\n }\r\n return type === fileType;\r\n }\r\n // Для расширений\r\n else {\r\n return fileName.endsWith(type.toLowerCase());\r\n }\r\n });\r\n\r\n if (!isValidType) {\r\n newErrors.push(`Файл ${file.name} имеет недопустимый формат`);\r\n }\r\n }\r\n });\r\n\r\n return newErrors;\r\n };\r\n\r\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!e.target.files) return;\r\n\r\n const files = Array.from(e.target.files);\r\n const validationErrors = validateFiles(files);\r\n\r\n if (validationErrors.length > 0) {\r\n setErrors(validationErrors);\r\n onValidationError?.(validationErrors);\r\n return;\r\n }\r\n\r\n setErrors([]);\r\n setSelectedFiles(files);\r\n\r\n const dt = new DataTransfer();\r\n files.forEach(file => dt.items.add(file));\r\n onChange(dt.files);\r\n\r\n // Имитация прогресса загрузки\r\n files.forEach(file => {\r\n let progress = 0;\r\n const interval = setInterval(() => {\r\n progress += 10;\r\n setUploadProgress(prev => ({ ...prev, [file.name]: progress }));\r\n if (progress >= 100) clearInterval(interval);\r\n }, 200);\r\n });\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n\r\n if (disabled) return;\r\n\r\n const files = Array.from(e.dataTransfer.files);\r\n const validationErrors = validateFiles(files);\r\n\r\n if (validationErrors.length > 0) {\r\n setErrors(validationErrors);\r\n onValidationError?.(validationErrors);\r\n return;\r\n }\r\n\r\n setErrors([]);\r\n setSelectedFiles(files);\r\n\r\n const dt = new DataTransfer();\r\n files.forEach(file => dt.items.add(file));\r\n onChange(dt.files);\r\n };\r\n\r\n const removeFile = (fileName: string) => {\r\n setSelectedFiles(prev => prev.filter(file => file.name !== fileName));\r\n setUploadProgress(prev => {\r\n const newProgress = { ...prev };\r\n delete newProgress[fileName];\r\n return newProgress;\r\n });\r\n\r\n // Обновляем FileList после удаления\r\n const dt = new DataTransfer();\r\n selectedFiles\r\n .filter(file => file.name !== fileName)\r\n .forEach(file => dt.items.add(file));\r\n onChange(dt.files);\r\n };\r\n\r\n useEffect(() => {\r\n if (deleteFile && inputRef.current) {\r\n inputRef.current.value = '';\r\n setSelectedFiles([]);\r\n setUploadProgress({});\r\n }\r\n }, [deleteFile]);\r\n\r\n return (\r\n <div className={styles.container}>\r\n <div\r\n className={`${styles['custom-file']} ${styles['custom-file-dropzone']} ${isDragging ? styles.dragging : ''}`}\r\n style={st}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n <input\r\n required={required}\r\n accept={accept}\r\n type=\"file\"\r\n className={`${styles['custom-file-input']} ${className || ''}`}\r\n name={name}\r\n id={id}\r\n title={title}\r\n data-max-size={dataMaxSize?.size}\r\n multiple={multiple}\r\n onChange={handleFileChange}\r\n disabled={disabled}\r\n ref={inputRef}\r\n />\r\n <label htmlFor={id} className={styles['custom-file-label']} style={disabled ? { backgroundColor: '#F3F3F3', border: '1px dashed #C4C4C4' } : undefined}>\r\n <svg width=\"30\" height=\"30\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\r\n <path fill-rule=\"evenodd\" d=\"M7.646 5.146a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1-.708.708L8.5 6.707V10.5a.5.5 0 0 1-1 0V6.707L6.354 7.854a.5.5 0 1 1-.708-.708z\" />\r\n <path d=\"M4.406 3.342A5.53 5.53 0 0 1 8 2c2.69 0 4.923 2 5.166 4.579C14.758 6.804 16 8.137 16 9.773 16 11.569 14.502 13 12.687 13H3.781C1.708 13 0 11.366 0 9.318c0-1.763 1.266-3.223 2.942-3.593.143-.863.698-1.723 1.464-2.383m.653.757c-.757.653-1.153 1.44-1.153 2.056v.448l-.445.049C2.064 6.805 1 7.952 1 9.318 1 10.785 2.23 12 3.781 12h8.906C13.98 12 15 10.988 15 9.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 4.825 10.328 3 8 3a4.53 4.53 0 0 0-2.941 1.1z\" />\r\n </svg>\r\n <br />\r\n <span style={disabled ? { color: '#C4C4C4' } : undefined}>\r\n <b style={disabled ? { color: '#888888' } : undefined}>Выберите</b> или перетащите файл для загрузки<br />\r\n {accept !== undefined ? (\r\n <>\r\n Разрешается загрузить файлы с форматом: <b style={disabled ? { color: '#888888' } : undefined}>{accept}</b><br />\r\n </>\r\n ) : 'Разрешается загрузить любой формат файлов'}\r\n {dataMaxSize && <small>Максимальный размер {dataMaxSize.size} {dataMaxSize.dimension}</small>}\r\n </span>\r\n </label>\r\n </div>\r\n\r\n {errors.length > 0 && (\r\n <div className={styles.errors}>\r\n {errors.map((error, index) => (\r\n <div key={index} className={styles.error}>{error}</div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {showPreview && selectedFiles.length > 0 && (\r\n <div className={styles['custom-files-preview']}>\r\n {selectedFiles.map((file, index) => (\r\n <div key={index} className={styles.fileItem}>\r\n <FFile\r\n name={file.name}\r\n size={file.size}\r\n progress={uploadProgress[file.name]}\r\n handleDelete={disabled ? undefined : () => removeFile(file.name)}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FInputFileForm;","import { forwardRef } from \"react\";\r\n\r\nimport styles from \"../static/FSelect.module.scss\"\r\n\r\nimport FLoadIcon from \"@icons/FLoadIcon\";\r\n\r\n/**\r\n * Пропсы для компонента FSelect — кастомный `<select>` с поддержкой:\r\n * - метки (label)\r\n * - ошибок\r\n * - вспомогательного текста\r\n * - загрузки\r\n */\r\nexport interface IFSelect extends React.InputHTMLAttributes<HTMLSelectElement> {\r\n /**\r\n * Текст метки, отображается над полем.\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Инлайновые стили для `<select>`.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Контент внутри `<select>` (обычно список `<option>`).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Если true — ширина поля будет 100%.\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Флаг состояния загрузки (отключает выбор и показывает лоадер).\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст, отображается под инпутом.\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Ширина поля.\r\n * @default 'fit-content'\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Высота поля.\r\n * @default 'auto'\r\n */\r\n height?: string | number;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FSelect` — кастомное поле `<select>` с дополнительными возможностями:\r\n *\r\n * Поддерживает:\r\n * - метку\r\n * - состояние загрузки\r\n * - сообщения об ошибках\r\n * - вспомогательный текст\r\n * - темизацию через CSS-классы\r\n *\r\n * @component\r\n * @example\r\n * <FSelect\r\n * label=\"Выберите город\"\r\n * fullWidth\r\n * errText={[\"Поле обязательно\"]}\r\n * helpText=\"Выберите значение из списка\"\r\n * >\r\n * <option value=\"\">Выберите...</option>\r\n * <option value=\"moscow\">Москва</option>\r\n * </FSelect>\r\n *\r\n * @param {string} [label] - Текст метки над полем.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для `<select>`.\r\n * @param {React.ReactNode} [children] - Список `<option>` или `<optgroup>`.\r\n * @param {boolean} [fullWidth=false] - Поле занимает всю ширину контейнера.\r\n * @param {boolean} [load=false] - Показывает индикатор загрузки.\r\n * @param {string[]} [errText] - Сообщения об ошибках.\r\n * @param {string} [helpText] - Вспомогательный текст под полем.\r\n * @param {string|number} [width='fit-content'] - Ширина поля.\r\n * @param {string|number} [height='auto'] - Высота поля.\r\n * @param {string} [id] - HTML ID.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<select>` с меткой, стилями и вспомогательным текстом.\r\n */\r\nconst FSelect = forwardRef<HTMLSelectElement, IFSelect>(\r\n (\r\n {\r\n label,\r\n st,\r\n children,\r\n fullWidth,\r\n load = false,\r\n errText,\r\n helpText,\r\n height = \"auto\",\r\n width = \"fit-content\",\r\n id,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const baseStyle: React.CSSProperties = {\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n width: fullWidth ? '100%' : width || 'fit-content',\r\n height: height || 'auto',\r\n };\r\n\r\n const mergedStyle = Object.assign({}, baseStyle, st);\r\n\r\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n return (\r\n <div\r\n className={`f-form-element ${styles[\"f-select\"]}`}\r\n style={mergedStyle}\r\n id={inputId + '-select-block'}\r\n role=\"group\"\r\n aria-labelledby={label ? inputId + '-label' : undefined}\r\n >\r\n {/* Label */}\r\n {label && (\r\n <label\r\n id={inputId + '-label'}\r\n htmlFor={inputId}\r\n className={`f-form-element__label ${errText ? 'error' : ''}`}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className={`f-form-element__control ${load ? 'is-loading' : ''}`}>\r\n <select\r\n ref={ref}\r\n aria-invalid={!!errText}\r\n aria-describedby={\r\n [helpText ? inputId + '-helptext' : null, errText?.length ? inputId + '-errortext' : null]\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n {...props}\r\n id={inputId}\r\n disabled={props.disabled || load}\r\n className={`f-form-element__control-element ${styles[\"f-select__control-element\"]} ${errText ? 'error' : ''} ${props.className || ''}`}\r\n >\r\n {!load && children}\r\n </select>\r\n\r\n {load && (\r\n <div className={`f-form-element__loader`}>\r\n <FLoadIcon size={10} />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Вспомогательный текст */}\r\n {helpText && (\r\n <p\r\n id={inputId + '-helptext'}\r\n className={`f-form-element__helptext`}\r\n >\r\n {helpText}\r\n </p>\r\n )}\r\n\r\n {/* Сообщения об ошибках */}\r\n {(typeof errText === 'string' && errText) && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n <p\r\n id={`${inputId}-errortext`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {errText}\r\n </p>\r\n </div>\r\n )}\r\n {errText && errText.length > 0 && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n {typeof errText !== 'string' && errText.map((error, index) => (\r\n <p\r\n key={index}\r\n id={`${inputId}-errortext-${index}`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {error}\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FSelect;","import React from \"react\";\r\n\r\n/**\r\n * Пропсы для компонента `FSelectItem` — обёртка над `<option>`.\r\n */\r\nexport interface IFSelectItem extends React.OptionHTMLAttributes<HTMLOptionElement> {\r\n /**\r\n * Инлайновые стили для элемента `<option>`.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Контент пункта выпадающего списка (отображается как текст внутри `<option>`).\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Компонент `FSelectItem` — обёртка над `<option>`.\r\n *\r\n * Используется внутри `FSelect` для создания пунктов выпадающего меню.\r\n *\r\n * @component\r\n * @example\r\n * <FSelect label=\"Выберите цвет\">\r\n * <FSelectItem value=\"red\">Красный</FSelectItem>\r\n * <FSelectItem value=\"blue\" disabled>Синий</FSelectItem>\r\n * </FSelect>\r\n *\r\n * @param {React.CSSProperties} [st] - Стили для пункта (редко используется, т.к. браузеры ограничивают стилизацию `<option>`).\r\n * @param {React.ReactNode} [children] - Отображаемый текст или JSX внутри `<option>`.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<option>` с заданными свойствами.\r\n */\r\n\r\nconst FSelectItem = React.forwardRef<HTMLOptionElement, IFSelectItem>((\r\n {\r\n st,\r\n children,\r\n ...props\r\n }, ref\r\n) => {\r\n return (\r\n <option\r\n ref={ref}\r\n style={st}\r\n {...props}\r\n >\r\n {children}\r\n </option>\r\n );\r\n});\r\n\r\nexport default FSelectItem;","import { forwardRef } from \"react\";\r\nimport FTextField from \"@material/FTextField\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FFullDateField.\r\n *\r\n * @interface IFFullDateField\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFFullDateField extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Текст метки (label), отображается над полем ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Дополнительные инлайновые стили для контейнера поля ввода.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Значение поля даты. Может быть строкой или числом.\r\n * @type {string | number | readonly string[] | undefined}\r\n */\r\n value?: string | number | readonly string[];\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю ширину родителя.\r\n * @type {boolean}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Флаг состояния загрузки — если true, показывает спиннер и блокирует ввод.\r\n * @type {boolean}\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст под полем даты.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Ширина поля ввода.\r\n * @type {string | number | undefined}\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Высота поля ввода.\r\n * @type {string | number | undefined}\r\n */\r\n height?: string | number;\r\n}\r\n\r\n/**\r\n * Компонент `FFullDateField` — универсальное поле ввода даты с поддержкой:\r\n * - метки (`label`)\r\n * - сообщений об ошибках (`errText`)\r\n * - вспомогательного текста (`helpText`)\r\n * - состояния загрузки (`load`)\r\n * - пользовательских стилей и классов\r\n *\r\n * Использует стандартный `<input type=\"date\">` с расширенным UI.\r\n *\r\n * @component\r\n * @example\r\n * // Пример базового использования\r\n * <FFullDateField\r\n * label=\"Выберите дату\"\r\n * value=\"2024-06-15\"\r\n * fullWidth\r\n * />\r\n *\r\n * @example\r\n * // С ошибкой и кастомной шириной\r\n * <FFullDateField\r\n * label=\"Дата рождения\"\r\n * errText={['Поле обязательное']}\r\n * width=\"300px\"\r\n * />\r\n *\r\n * @param {IFFullDateField} props - Пропсы компонента.\r\n * @param {React.Ref<HTMLInputElement>} ref - Референс на DOM-элемент `<input>`.\r\n * @returns {JSX.Element} — Рендерит поле ввода даты с меткой, стилями и иконкой загрузки.\r\n */\r\nconst FFullDateField = forwardRef<HTMLInputElement, IFFullDateField>(\r\n (\r\n {\r\n label,\r\n st,\r\n value,\r\n fullWidth,\r\n load = false,\r\n errText,\r\n helpText,\r\n width,\r\n height,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n\r\n return (\r\n <FTextField\r\n label={label}\r\n st={st}\r\n width={width}\r\n height={height}\r\n fullWidth={fullWidth}\r\n ref={ref}\r\n load={load}\r\n value={load ? '' : value}\r\n type={load ? 'text' : \"date\"}\r\n helpText={helpText}\r\n errText={typeof errText === 'string' ? [errText] : errText}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nexport default FFullDateField;","import { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport styles from './FSelectSearchDb.module.scss';\r\nimport FArrowIcon from \"@icons/FArrowIcon\";\r\nimport FTextField from \"@material/FTextField\";\r\n\r\n/**\r\n * Параметры для компонента FSelectSearchDb\r\n */\r\nexport interface IFSelectSearchDb<T> {\r\n /**\r\n * Функция, которая выполняет асинхронный запрос поиска.\r\n * Принимает строку и возвращает массив объектов типа T.\r\n */\r\n fetchingFunc: (text: string) => Promise<T[]>;\r\n\r\n /**\r\n * Callback, вызываемый при выборе элемента из списка.\r\n */\r\n selectedElement: (item: T | null | undefined) => void;\r\n\r\n /**\r\n * Функция, возвращающая строковое представление элемента (для отображения).\r\n */\r\n selectItem: (item: T) => string;\r\n\r\n /**\r\n * Callback, вызываемый при вводе данных в поле ввода.\r\n * @param {File[] | null} file - Массив выбранных файлов или `null`, если файлы удалены.\r\n */\r\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n\r\n /**\r\n * Текст метки поля ввода.\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Встроенные стили для корневого контейнера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * HTML id для поля ввода.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Если true — поле занимает всю ширину родителя.\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Кастомный CSS класс.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Блокирует редактирование поля.\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Поле только для чтения.\r\n */\r\n readOnly?: boolean;\r\n\r\n /**\r\n * Поле обязательное для заполнения.\r\n */\r\n required?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст под инпутом.\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Обработчик события onFocus.\r\n */\r\n onFocus?: React.FocusEventHandler<HTMLInputElement>;\r\n\r\n /**\r\n * Обработчик события onBlur.\r\n */\r\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\r\n\r\n /**\r\n * Минимальная длина текста для начала поиска.\r\n * @default 3\r\n */\r\n minLengthText?: number;\r\n\r\n /**\r\n * Начальное значение поля ввода.\r\n */\r\n defaultValue?: string;\r\n\r\n /**\r\n * Тип поля ввода.\r\n */\r\n type?: React.HTMLInputTypeAttribute;\r\n\r\n /**\r\n * Текст placeholder.\r\n */\r\n placeholder?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FSelectSearchDb` — кастомное поле ввода с автопоиском по базе данных.\r\n * Поддерживает:\r\n * - асинхронный поиск по API (`fetchingFunc`)\r\n * - дебаунс запросов\r\n * - отображение выпадающего списка результатов\r\n * - автоматическое позиционирование дропдауна (вверх/вниз)\r\n * - обработку ошибок и состояния загрузки\r\n * - работу с TypeScript-типами через `selectItem`\r\n * - портал для рендера дропдауна вне родителя со скроллом\r\n *\r\n * @component\r\n *\r\n * @example\r\n * <FSelectSearchDb<Employee>\r\n * label=\"Поиск сотрудника\"\r\n * fetchingFunc={async (text) => await fetch(`/api/employees?query=${text}`)}\r\n * selectedElement={(item) => setSelectedEmployee(item)}\r\n * selectItem={(item) => item.name}\r\n * />\r\n *\r\n * @example\r\n * // С начальным значением и пользовательским стилем\r\n * <FSelectSearchDb<City>\r\n * label=\"Город\"\r\n * defaultValue=\"Москва\"\r\n * fetchingFunc={async (text) => await fetch(`/api/cities?query=${text}`)}\r\n * selectItem={(item) => item.name}\r\n * selectedElement={(item) => setSelectedCity(item)}\r\n * st={{ maxWidth: '300px' }}\r\n * className={styles.customSelect}\r\n * />\r\n *\r\n * @param {Function} fetchingFunc - Асинхронная функция, которая принимает строку и возвращает массив объектов типа T.\r\n * @param {Function} selectedElement - Callback, вызываемый при выборе элемента из списка. Принимает выбранный объект типа T.\r\n * @param {Function} selectItem - Функция, возвращающая строковое представление элемента (для отображения в списке).\r\n * @param {string} [label] - Текст метки поля ввода.\r\n * @param {React.CSSProperties} [st] - Встроенные стили для корневого контейнера.\r\n * @param {string} [id] - HTML id для поля ввода.\r\n * @param {string} [className] - Кастомный CSS класс для переопределения стилей.\r\n * @param {boolean} [disabled=false] - Блокирует редактирование поля.\r\n * @param {boolean} [readOnly=false] - Поле только для чтения.\r\n * @param {boolean} [fullWidth=false] - Если true — поле занимает всю ширину родителя.\r\n * @param {React.FocusEventHandler<HTMLInputElement>} [onFocus] - Обработчик события focus.\r\n * @param {React.FocusEventHandler<HTMLInputElement>} [onBlur] - Обработчик события blur.\r\n * @param {string[] | string} [errText] - Массив текстовых ошибок для отображения под полем.\r\n * @param {string} [helpText] - Вспомогательный текст под инпутом.\r\n * @param {boolean} [required=false] - Определяет, является ли поле обязательным.\r\n * @param {string} [defaultValue] - Начальное значение поля ввода.\r\n * @param {React.HTMLInputTypeAttribute} [type=\"text\"] - Тип поля ввода (например, \"text\", \"search\").\r\n * @param {string} [placeholder] - Текст placeholder.\r\n *\r\n * @returns {JSX.Element} — Рендерит поле ввода с выпадающим списком результатов поиска.\r\n */\r\nconst FSelectSearchDb = <T,>({\r\n fetchingFunc,\r\n selectedElement,\r\n selectItem,\r\n onChange,\r\n st,\r\n id,\r\n className,\r\n disabled,\r\n readOnly,\r\n fullWidth,\r\n label,\r\n onBlur,\r\n onFocus,\r\n errText,\r\n helpText,\r\n required,\r\n defaultValue,\r\n type,\r\n placeholder,\r\n}: IFSelectSearchDb<T>) => {\r\n const [valueInput, setValueInput] = useState<string>(defaultValue || '');\r\n const [arrObject, setArrObject] = useState<T[]>([]);\r\n const timerDebounceRef = useRef<NodeJS.Timeout>();\r\n const [load, setLoad] = useState<boolean>(false);\r\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\r\n const [dropdownPosition, setDropdownPosition] = useState<'top' | 'bottom'>('bottom');\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const dropdownRef = useRef<HTMLDivElement>(null); // <-- реф для дропдауна\r\n const dropdownPortalRef = useRef<HTMLDivElement | null>(null); // <-- реф для portal контейнера\r\n const [textInput, setTextInput] = useState<boolean>(false);\r\n const [error, setError] = useState<string[] | undefined>(undefined);\r\n\r\n // Создаём div для portal и добавляем в body\r\n useEffect(() => {\r\n dropdownPortalRef.current = document.createElement('div');\r\n document.body.appendChild(dropdownPortalRef.current);\r\n\r\n return () => {\r\n const portalElement = dropdownPortalRef.current;\r\n if (portalElement && portalElement.parentNode === document.body) {\r\n document.body.removeChild(portalElement);\r\n }\r\n };\r\n }, []);\r\n\r\n // Рассчитываем позицию дропдауна и обновляем его стили\r\n const updateDropdownPosition = useCallback(() => {\r\n if (!containerRef.current || !dropdownRef.current || !dropdownPortalRef.current) return;\r\n\r\n const containerRect = containerRef.current.getBoundingClientRect();\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n\r\n const offset = 4; // <-- отступ в пикселях\r\n\r\n const top = containerRect.top + scrollTop + (dropdownPosition === 'bottom' ? containerRect.height - offset : -dropdownRef.current.offsetHeight - offset);\r\n const left = containerRect.left + scrollLeft;\r\n\r\n Object.assign(dropdownPortalRef.current.style, {\r\n position: 'absolute',\r\n top: `${top}px`,\r\n left: `${left}px`,\r\n width: `${containerRect.width}px`,\r\n zIndex: '9999',\r\n });\r\n }, [dropdownPosition]);\r\n\r\n // Обновляем позицию при открытии дропдауна и при изменении размеров окна\r\n useEffect(() => {\r\n if (isDropdownOpen) {\r\n updateDropdownPosition();\r\n window.addEventListener('resize', updateDropdownPosition);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateDropdownPosition);\r\n };\r\n }, [isDropdownOpen, updateDropdownPosition]);\r\n\r\n // Определяем положение дропдауна (вверх или вниз)\r\n const updateDropdownPositionBasedOnSpace = () => {\r\n if (!containerRef.current) return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n const dropdownHeight = 200;\r\n\r\n setDropdownPosition(spaceBelow >= dropdownHeight || spaceBelow >= spaceAbove ? 'bottom' : 'top');\r\n };\r\n\r\n // Следим за изменением размеров окна\r\n useEffect(() => {\r\n if (isDropdownOpen) {\r\n updateDropdownPositionBasedOnSpace();\r\n window.addEventListener('resize', updateDropdownPositionBasedOnSpace);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateDropdownPositionBasedOnSpace);\r\n };\r\n }, [isDropdownOpen]);\r\n\r\n // Обработка изменения текста\r\n const handlerOnChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const text = e.target.value;\r\n if (onChange) {\r\n onChange(e)\r\n }\r\n setValueInput(text);\r\n setIsDropdownOpen(false);\r\n setTextInput(true);\r\n\r\n if (timerDebounceRef.current) clearTimeout(timerDebounceRef.current);\r\n\r\n if (text.trim() !== '') {\r\n timerDebounceRef.current = setTimeout(async () => {\r\n try {\r\n setLoad(true);\r\n const result = await fetchingFunc(text);\r\n setArrObject(result);\r\n\r\n if (result.length === 0) {\r\n setError(['- Данные не найдены']);\r\n setTimeout(() => setError(undefined), 3000);\r\n } else {\r\n setIsDropdownOpen(true);\r\n }\r\n } catch {\r\n setError(['- Ошибка']);\r\n setTimeout(() => setError(undefined), 3000);\r\n } finally {\r\n setLoad(false);\r\n setTextInput(false);\r\n }\r\n }, 500);\r\n } else {\r\n selectedElement(null);\r\n setArrObject([]);\r\n setIsDropdownOpen(false);\r\n setTextInput(false);\r\n }\r\n };\r\n\r\n // Открытие/закрытие дропдауна\r\n const handleArrowClick = () => {\r\n if (disabled || readOnly || load) return;\r\n\r\n if (isDropdownOpen) {\r\n setIsDropdownOpen(false);\r\n } else if (arrObject.length > 0) {\r\n setIsDropdownOpen(true);\r\n } else if (valueInput.trim() !== '') {\r\n handleDefaultFetch(valueInput);\r\n }\r\n };\r\n\r\n // Выбор элемента из списка\r\n const handleItemClick = (opt: T) => {\r\n selectedElement(opt);\r\n setValueInput(selectItem(opt));\r\n setIsDropdownOpen(false);\r\n };\r\n\r\n // Закрытие дропдауна при клике вне области\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\r\n setIsDropdownOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, []);\r\n\r\n // Дефолтный запрос\r\n const handleDefaultFetch = (text: string) => {\r\n if (timerDebounceRef.current) clearTimeout(timerDebounceRef.current);\r\n\r\n if (text !== '') {\r\n timerDebounceRef.current = setTimeout(async () => {\r\n try {\r\n setLoad(true);\r\n const result = await fetchingFunc(text);\r\n setArrObject(result);\r\n\r\n if (result.length === 0) {\r\n setError(['- Данные не найдены']);\r\n setTimeout(() => setError(undefined), 3000);\r\n } else {\r\n setIsDropdownOpen(true);\r\n }\r\n } catch {\r\n setError(['- Ошибка']);\r\n setTimeout(() => setError(undefined), 3000);\r\n } finally {\r\n setLoad(false);\r\n }\r\n }, 3000);\r\n } else {\r\n setArrObject([]);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`${styles['f-select-search-db']} ${className || ''}`}\r\n style={st}\r\n id={id}\r\n data-position={dropdownPosition}\r\n >\r\n <div className={styles['f-select-search-db__input']}>\r\n <FTextField\r\n fullWidth={fullWidth}\r\n readOnly={readOnly || isDropdownOpen}\r\n disabled={disabled || load}\r\n required={required}\r\n label={label}\r\n type={type}\r\n placeholder={placeholder}\r\n className={styles['f-select-search-db__input_field']}\r\n value={valueInput}\r\n onChange={handlerOnChange}\r\n onFocus={onFocus}\r\n onBlur={() => {\r\n setTimeout(() => {\r\n onBlur?.(new Event('blur') as any);\r\n }, 100);\r\n }}\r\n load={load}\r\n helpText={load\r\n ? 'Загрузка...'\r\n : textInput\r\n ? 'После окончания ввода запрос отправится через 3 сек'\r\n : helpText}\r\n errText={typeof errText === 'string' ? [errText] : errText || error}\r\n />\r\n {!load && !disabled && arrObject.length > 0 && (\r\n <div\r\n className={styles['f-select-search-db__input_arrow']}\r\n style={{ marginTop: label ? '28px' : '7px' }}\r\n onClick={handleArrowClick}\r\n >\r\n <FArrowIcon direction={isDropdownOpen ? 'up' : 'down'} size={15} />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {isDropdownOpen && (arrObject.length > 0 || valueInput.trim() === '') && dropdownPortalRef.current && (\r\n createPortal(\r\n <div\r\n ref={dropdownRef}\r\n className={`${styles['f-select-search-db__dropdown']} ${isDropdownOpen ? styles.active : ''}`}\r\n >\r\n {arrObject.length === 0 && valueInput.trim() === '' ? (\r\n <li>Введите текст</li>\r\n ) : arrObject.length === 0 && valueInput.trim() !== '' && !load ? (\r\n <li>Ничего не найдено</li>\r\n ) : (\r\n <ul className={styles['f-select-search-db__dropdown_content']}>\r\n {arrObject.slice(0, 10).map((opt, index) => (\r\n <li key={index} onMouseDown={() => handleItemClick(opt)}>\r\n {selectItem(opt)}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>,\r\n dropdownPortalRef.current\r\n )\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FSelectSearchDb;","import React, { forwardRef } from \"react\";\r\nimport styles from \"./FTextArea.module.scss\";\r\nimport FLoadIcon from \"@icons/FLoadIcon\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FTextArea.\r\n *\r\n * @interface IFTextArea\r\n * @extends {React.TextareaHTMLAttributes<HTMLTextAreaElement>}\r\n */\r\nexport interface IFTextArea extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n /**\r\n * Текст метки (label), отображаемый над полем ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Дополнительные инлайновые стили для контейнера текстового поля.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Значение текстового поля. Может быть не определено, если используется как uncontrolled.\r\n * @type {string | undefined}\r\n */\r\n value?: string | undefined;\r\n\r\n /**\r\n * Флаг, указывающий, что поле заблокировано для редактирования.\r\n * @type {boolean | undefined}\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю доступную ширину.\r\n * @type {boolean | undefined}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Массив сообщений об ошибках, связанных с этим полем.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст, отображается под текстовым полем.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Флаг, указывающий, находится ли поле в состоянии загрузки.\r\n * @type {boolean | undefined}\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Ширина контейнера компонента.\r\n * @type {string | number | undefined}\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Высота контейнера компонента.\r\n * @type {string | number | undefined}\r\n */\r\n height?: string | number;\r\n}\r\n\r\n/**\r\n * Компонент `FTextArea` — универсальное поле ввода типа `<textarea>` с дополнительными функциями:\r\n * - Поддержка метки (`label`)\r\n * - Сообщения об ошибках (`errText`)\r\n * - Вспомогательный текст (`helpText`)\r\n * - Индикатор загрузки (`load`)\r\n * - Поддержка стилей и размеров\r\n *\r\n * @component\r\n * @example\r\n * <FTextArea\r\n * label=\"Комментарий\"\r\n * value={text}\r\n * onChange={(e) => setText(e.target.value)}\r\n * fullWidth\r\n * errText={['Поле обязательное']}\r\n * />\r\n *\r\n * @param {IFTextField} props - Пропсы компонента.\r\n * @param {React.Ref<HTMLTextAreaElement>} ref - Референс на DOM-элемент textarea.\r\n * @returns {JSX.Element} - Рендерит текстовое поле с меткой, ошибками и возможностью загрузки.\r\n */\r\nconst FTextArea = forwardRef<HTMLTextAreaElement, IFTextArea>(\r\n (\r\n {\r\n label,\r\n fullWidth,\r\n errText,\r\n helpText,\r\n st,\r\n id,\r\n className,\r\n load = false,\r\n height = 'auto',\r\n width,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const baseStyle: React.CSSProperties = {\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n width: fullWidth ? '100%' : width || 'fit-content',\r\n height: height || 'auto',\r\n };\r\n const mergedStyle = { ...baseStyle, ...st };\r\n const areaId = id || `textarea-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n return (\r\n <div\r\n className={`f-form-element ${styles[\"f-text-area\"]} ${className || ''}`}\r\n style={mergedStyle}\r\n role=\"group\"\r\n id={areaId + '-text-area-block'}\r\n aria-labelledby={label ? areaId + '-label' : undefined}\r\n >\r\n {/* Label */}\r\n {label && (\r\n <label\r\n id={areaId + '-label'}\r\n htmlFor={areaId}\r\n className={`f-form-element__label ${errText ? 'error' : ''}`}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n {/* Textarea wrapper */}\r\n <div className={`f-form-element__control ${load ? 'is-loading' : ''}`}>\r\n <textarea\r\n ref={ref}\r\n id={areaId}\r\n className={`f-form-element__control-element ${errText ? 'error' : ''}`}\r\n aria-invalid={!!errText}\r\n aria-describedby={\r\n [helpText ? areaId + '-helptext' : null, errText?.length ? areaId + '-errortext' : null]\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n {...props}\r\n disabled={props.disabled || load}\r\n style={{ height: height || 'auto' }}\r\n />\r\n {load && (\r\n <span className={'f-form-element__loader'}>\r\n <FLoadIcon size={10} />\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Help Text */}\r\n {helpText && (\r\n <p\r\n id={areaId + '-helptext'}\r\n className={'f-form-element__helptext'}\r\n >\r\n {helpText}\r\n </p>\r\n )}\r\n\r\n {/* Error Messages */}\r\n {(typeof errText === 'string' && errText) && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n <p\r\n id={`${areaId}-errortext`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {errText}\r\n </p>\r\n </div>\r\n )}\r\n {errText && errText.length > 0 && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n {typeof errText !== 'string' && errText.map((error, index) => (\r\n <p\r\n key={index}\r\n id={`${areaId}-errortext-${index}`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {error}\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FTextArea;","/**\r\n * Генерирует уникальную строку на основе временной метки и случайного числа.\r\n *\r\n * @description\r\n * Функция объединяет текущее время в миллисекундах и случайное целое число\r\n * от 0 до 999 999 для создания псевдоуникального идентификатора.\r\n *\r\n * @returns {string} Уникальная строка, например: \"1717029203456789123\"\r\n *\r\n * @example\r\n * const id = fGenerateUniqueId();\r\n * console.log(id); // \"1717029203456789123\"\r\n */\r\nfunction fGenerateUniqueId(): string {\r\n const timestamp = Date.now(); // Более короткий и современный способ\r\n const randomPart = Math.floor(Math.random() * 1_000_000);\r\n return `${timestamp}${randomPart}`;\r\n}\r\n\r\nexport default fGenerateUniqueId;","import { FC, Fragment, useEffect, useRef, useState } from \"react\";\r\n\r\nimport FCloseIcon from \"@icons/FCloseIcon\";\r\n\r\nimport './FAlert.css'\r\n\r\nimport FStack from \"@material/FStack\";\r\n\r\nimport fGenerateUniqueId from \"@dop-function/fGenerateUniqueId\";\r\n\r\n\r\nexport interface IFAlert {\r\n title?: string,\r\n body?: string,\r\n variant: 'info' | 'error' | 'success' | 'warning',\r\n onClose?: (e: boolean) => void,\r\n st?: React.CSSProperties | undefined,\r\n open: boolean,\r\n vertical?: 'top' | 'bottom' | 'center',\r\n horizontal?: 'left' | 'center' | 'right',\r\n buttonClose?: boolean,\r\n className?: string,\r\n displayTime?: number,\r\n size?: string\r\n}\r\n\r\nconst FAlert: FC<IFAlert> = (\r\n {\r\n title,\r\n body,\r\n variant = 'info',\r\n displayTime,\r\n open,\r\n onClose,\r\n vertical = 'center',\r\n horizontal = 'center',\r\n buttonClose = false,\r\n size\r\n }\r\n) => {\r\n\r\n const visible = useRef<NodeJS.Timeout>();\r\n const hidden = useRef<NodeJS.Timeout>();\r\n const close = useRef<NodeJS.Timeout>();\r\n\r\n const [randomId] = useState<string>(fGenerateUniqueId())\r\n\r\n let newTime = displayTime\r\n\r\n useEffect(() => {\r\n\r\n const progress = document.getElementById(`f-alert-progress-value-${randomId}`)\r\n\r\n if (!open) {\r\n const el = document.querySelector(`#f-block-alert-${randomId}`)\r\n if (el !== null) {\r\n close.current = setTimeout(() => {\r\n if (onClose) {\r\n onClose(false)\r\n }\r\n el!.classList.remove('f-alert-hidden')\r\n el!.classList.remove('f-alert-visible')\r\n })\r\n }\r\n }\r\n\r\n visible.current = setTimeout(() => {\r\n if (open) {\r\n const el = document.querySelector(`#f-block-alert-${randomId}`)\r\n if (el !== null) {\r\n el!.classList.add('f-alert-visible')\r\n if (progress !== null) {\r\n progress!.style.width = '0'\r\n }\r\n }\r\n }\r\n if (newTime !== undefined && open && onClose !== undefined) {\r\n\r\n if (newTime < 1) newTime = 1\r\n\r\n const el = document.querySelector(`#f-block-alert-${randomId}`)\r\n\r\n if (el !== null) {\r\n progress!.style.transition = `${newTime}s linear`\r\n\r\n hidden.current = setTimeout(() => {\r\n el!.classList.remove('f-alert-visible')\r\n el!.classList.add('f-alert-hidden')\r\n }, (newTime - 1) * 1000)\r\n\r\n close.current = setTimeout(() => {\r\n onClose(false)\r\n el!.classList.remove('f-alert-hidden')\r\n el!.classList.remove('f-alert-visible')\r\n }, newTime * 1000)\r\n }\r\n }\r\n })\r\n }, [open]);\r\n\r\n const handlerIco = (): JSX.Element => {\r\n let ico: JSX.Element = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\" />\r\n </>\r\n\r\n switch (variant) {\r\n case 'info':\r\n ico = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\" />\r\n </>\r\n break\r\n case \"success\":\r\n ico = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"M10.97 4.97a.75.75 0 0 1 1.071 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.235.235 0 0 1 .02-.022z\" />\r\n </>\r\n break\r\n case 'error':\r\n ico = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\r\n </>\r\n break\r\n case 'warning':\r\n ico = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995z\" />\r\n </>\r\n break\r\n }\r\n return ico\r\n }\r\n\r\n const handlerPosition = () => {\r\n\r\n const styleVertical: {\r\n top?: string | number,\r\n bottom?: string | number,\r\n transform?: string\r\n } = {}\r\n\r\n const styleHorizontal: {\r\n left?: string | number,\r\n right?: string | number,\r\n transform?: string\r\n } = {}\r\n\r\n switch (vertical) {\r\n case 'top':\r\n styleVertical.top = 0\r\n break\r\n case 'bottom':\r\n styleVertical.bottom = 0\r\n break\r\n case 'center':\r\n if (vertical === 'center' && horizontal !== 'center') {\r\n styleVertical.transform = 'translateY(-50%)'\r\n }\r\n styleVertical.top = '50%'\r\n break\r\n }\r\n\r\n switch (horizontal) {\r\n case 'left':\r\n styleHorizontal.left = 0\r\n break\r\n case 'right':\r\n styleHorizontal.right = 0\r\n break\r\n case 'center':\r\n if (vertical === 'center' && horizontal === 'center') {\r\n styleHorizontal.transform = 'translate(-50%, -50%)'\r\n } else {\r\n styleHorizontal.transform = 'translateX(-50%)'\r\n }\r\n styleHorizontal.left = '50%'\r\n break\r\n }\r\n\r\n\r\n return Object.assign({}, styleHorizontal, styleVertical)\r\n }\r\n\r\n return (\r\n <Fragment>\r\n {open &&\r\n <div className='f-block-alert' id={`f-block-alert-${randomId}`}>\r\n <div className=\"f-alert-component\" style={handlerPosition()}>\r\n <div className='f-alert'>\r\n <div className={`f-alert-ico ${variant}`}>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n {handlerIco()}\r\n </svg>\r\n </div>\r\n <div className='f-alert-inside'\r\n style={{ width: size !== undefined ? `${size}` : \"fit-content\" }}>\r\n <div className='f-alert-header'>\r\n <h4>{title !== undefined ? title : ''}</h4>\r\n {(buttonClose && onClose) &&\r\n <FCloseIcon\r\n size={25}\r\n st={{\r\n cursor: 'pointer'\r\n }}\r\n handleClose={() => {\r\n const el = document.querySelector(`#f-block-alert-${randomId}`)\r\n el!.classList.remove('f-alert-visible')\r\n el!.classList.add('f-alert-hidden')\r\n onClose(false)\r\n el!.classList.remove('f-alert-visible')\r\n el!.classList.remove('f-alert-hidden')\r\n clearTimeout(visible.current)\r\n clearTimeout(hidden.current)\r\n clearTimeout(close.current)\r\n }} />\r\n }\r\n </div>\r\n <div className='f-alert-body'>\r\n <FStack direction={\"column\"} spacing={1}>\r\n {body !== undefined &&\r\n body.split('\\n').map((opt, index) => {\r\n return (\r\n <span key={index}>{opt}</span>\r\n )\r\n })\r\n }\r\n </FStack>\r\n </div>\r\n </div>\r\n {newTime !== undefined && newTime > 0 &&\r\n <div className={'f-alert-progress'}>\r\n <div className=\"f-alert-progress-bar\">\r\n <div className={`f-alert-progress-value ${variant}`}\r\n id={`f-alert-progress-value-${randomId}`} />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </Fragment>\r\n )\r\n};\r\n\r\nexport default FAlert;","import { FC } from \"react\"\r\n\r\nimport \"./FNative.css\"\r\n\r\nexport interface IFNative {\r\n label: string,\r\n id?: string,\r\n className?: string,\r\n st?: React.CSSProperties,\r\n children?: React.ReactElement | React.ReactNode,\r\n value?: string[] | number[],\r\n singleChoice?: (element: string[]) => void,\r\n multipleChoice?: (element: string[]) => void,\r\n disabled?: boolean,\r\n size?: number,\r\n overflowX?: boolean,\r\n width?: number | 'auto' | 'fit-content' | 'inherit' | 'initial' | 'max-content' | 'min-content' | 'revert' | 'unset' | '-webkit-fill-available'\r\n fullWidth?: boolean\r\n}\r\n\r\nconst FNative: FC<IFNative> = ({\r\n label,\r\n id,\r\n className,\r\n st,\r\n children,\r\n value,\r\n singleChoice,\r\n multipleChoice,\r\n disabled,\r\n size = 4,\r\n overflowX,\r\n width = '-webkit-fill-available',\r\n fullWidth\r\n}) => {\r\n\r\n const handleSingleChoice = (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n if (singleChoice) {\r\n const a = []\r\n a.push(event.target.value)\r\n singleChoice(a)\r\n }\r\n }\r\n\r\n const handlerMultipleChoice = (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n const { options } = event.target;\r\n const value: string[] = [];\r\n for (let i = 0, l = options.length; i < l; i += 1) {\r\n if (options[i].selected) {\r\n value.push(options[i].value);\r\n }\r\n }\r\n if (multipleChoice) {\r\n multipleChoice(value)\r\n }\r\n }\r\n\r\n if (fullWidth) {\r\n if (st === undefined) {\r\n st = {\r\n width: '100%'\r\n }\r\n } else {\r\n st.width = '100%'\r\n }\r\n }\r\n\r\n return (\r\n <div className={`f-form-native ${className !== undefined ? className : ''}`} style={st} id={id}>\r\n <label className={'f-native-label'}>{label}</label>\r\n <select\r\n style={{\r\n overflowX: overflowX ? 'auto' : 'hidden',\r\n width: width\r\n }}\r\n size={size}\r\n disabled={disabled}\r\n //@ts-ignore\r\n value={value}\r\n multiple={true}\r\n className={'f-native'}\r\n onChange={(event) => {\r\n if (singleChoice) {\r\n handleSingleChoice(event)\r\n } else if (multipleChoice) {\r\n handlerMultipleChoice(event)\r\n }\r\n }}>\r\n {children}\r\n </select>\r\n </div>\r\n )\r\n\r\n}\r\n\r\nexport default FNative","import { FC } from \"react\";\r\nimport styles from '../styles/FTabs.module.scss';\r\n\r\n/**\r\n * Пропсы для компонента `FTabs` — обёртка для системы вкладок.\r\n */\r\nexport interface IFTabs {\r\n /**\r\n * Дочерние элементы, обычно список `<FTab>` компонентов.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * HTML ID контейнера.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Ориентация вкладок: горизонтальная или вертикальная.\r\n * @default 'horizontal'\r\n */\r\n orientation?: 'vertical' | 'horizontal';\r\n}\r\n\r\n/**\r\n * Компонент `FTabs` — контейнер для системы вкладок.\r\n *\r\n * Используется вместе с `FTab` и `FTabContent` для создания переключаемых вкладок.\r\n *\r\n * @component\r\n * @example\r\n * <FTabs orientation=\"vertical\">\r\n * <FTab>Вкладка 1</FTab>\r\n * <FTab>Вкладка 2</FTab>\r\n * </FTabs>\r\n *\r\n * @param {React.ReactNode} [children] - Список вкладок (`<FTab>`).\r\n * @param {string} [id] - HTML ID контейнера.\r\n * @param {string} [className] - Кастомный класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {'horizontal'|'vertical'} [orientation='horizontal'] - Ориентация табов.\r\n *\r\n * @returns {JSX.Element} — Рендерит контейнер с вкладками.\r\n */\r\nconst FTabs: FC<IFTabs> = ({\r\n children,\r\n id,\r\n className,\r\n st,\r\n orientation = 'horizontal'\r\n}) => {\r\n return (\r\n <div\r\n id={id}\r\n style={st}\r\n className={`${styles[\"f-tabs\"]} ${styles[orientation]} ${className || ''}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FTabs;","import { forwardRef } from \"react\";\r\nimport styles from '../styles/FTabs.module.scss';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FTab.\r\n *\r\n * @interface IFButton\r\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\r\n */\r\nexport interface IFTab extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n /**\r\n * Контент вкладки — может быть текстом, иконкой или JSX.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для кнопки вкладки.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Если true — вкладка заблокирована и не реагирует на клик.\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Если true — вкладка активна (отображается как выбранная).\r\n */\r\n active?: boolean;\r\n\r\n /**\r\n * Callback, вызываемый при клике на вкладку.\r\n */\r\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\r\n}\r\n\r\n/**\r\n * Компонент `FTab` — отдельная вкладка в горизонтальной/вертикальной навигации.\r\n *\r\n * Используется внутри `FTabs` для отображения переключаемых вкладок.\r\n *\r\n * @component\r\n * @example\r\n * <FTab\r\n * active={true}\r\n * disabled={false}\r\n * onClick={() => setActiveTab('tab-1')}\r\n * >\r\n * Вкладка 1\r\n * </FTab>\r\n *\r\n * @param {React.ReactNode} [children] - Контент вкладки.\r\n * @param {string} [id] - HTML ID кнопки.\r\n * @param {string} [className] - Пользовательский класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {boolean} [disabled=false] - Блокировка вкладки.\r\n * @param {boolean} [active=false] - Активное состояние вкладки.\r\n * @param {Function} [onClick] - Callback при клике по вкладке.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<button>` с поддержкой состояния активности и дизейбла.\r\n */\r\nconst FTab = forwardRef<HTMLButtonElement, IFTab>(({\r\n children,\r\n st,\r\n active,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <button\r\n ref={ref}\r\n type={\"button\"}\r\n style={st}\r\n className={`${styles['f-tabs__tab']} ${active ? styles['active'] : ''} ${props.className || ''}`}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n );\r\n});\r\n\r\nFTab.displayName = 'FTab';\r\n\r\nexport default FTab;","import React, { useRef, useState, useEffect, cloneElement, isValidElement, forwardRef } from \"react\";\r\n\r\nimport styles from '../static/FDropdown.module.scss'\r\n\r\nimport FButton from \"@material/FButton\";\r\nimport FStack from \"@material/FStack\";\r\nimport FArrowIcon from \"@icons/FArrowIcon\";\r\n\r\n/**\r\n * Пропсы для компонента FDropdown.\r\n */\r\nexport interface IFDropdown {\r\n /**\r\n * Текст или элемент внутри кнопки дропдауна.\r\n */\r\n label?: React.ReactNode;\r\n\r\n /**\r\n * Контент, который будет отображён в выпадающем списке.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Вариант стиля кнопки: 'contained' или 'default'.\r\n * @default 'contained'\r\n */\r\n variant?: 'contained' | 'default';\r\n\r\n /**\r\n * Цветовая тема кнопки.\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер кнопки.\r\n * @default 'btn-sm'\r\n */\r\n size?: 'btn-lg' | 'btn-sm' | 'btn-xs';\r\n\r\n /**\r\n * Если true — кнопка заблокирована.\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Инлайновые стили для кнопки.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Пользовательский CSS класс.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * HTML ID кнопки.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FDropdown` — выпадающее меню с кастомной кнопкой и контентом.\r\n *\r\n * Отображает кнопку с иконкой стрелки, при клике показывает содержимое (`children`) как выпадающий список.\r\n *\r\n * @component\r\n * @example\r\n * <FDropdown label=\"Меню\" color=\"primary\" size=\"btn-sm\">\r\n * <div>Пункт 1</div>\r\n * <div>Пункт 2</div>\r\n * </FDropdown>\r\n *\r\n * @example\r\n * // Использование с FTooltip\r\n * <FTooltip title=\"Подсказка для дропдауна\">\r\n * <FDropdown label=\"Меню с подсказкой\">\r\n * <div>Пункт 1</div>\r\n * </FDropdown>\r\n * </FTooltip>\r\n *\r\n * @param {React.ReactNode} [label] - Текст или элемент внутри кнопки.\r\n * @param {React.ReactNode} [children] - Содержимое выпадающего списка.\r\n * @param {'contained'|'default'} [variant='contained'] - Вариант стиля кнопки.\r\n * @param {'primary'|'secondary'|...} [color='primary'] - Цвет кнопки.\r\n * @param {'btn-lg'|'btn-sm'|'btn-xs'} [size='btn-sm'] - Размер кнопки.\r\n * @param {boolean} [disabled=false] - Блокировка кнопки.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили кнопки.\r\n * @param {string} [className] - Кастомный класс для кнопки.\r\n * @param {string} [id] - HTML ID кнопки.\r\n *\r\n * @returns {JSX.Element} — Рендерит кнопку с выпадающим списком.\r\n */\r\nconst FDropdown = forwardRef<HTMLDivElement, IFDropdown>(({\r\n label,\r\n variant = 'contained',\r\n color = 'primary',\r\n size = 'btn-sm',\r\n disabled,\r\n st,\r\n className,\r\n id,\r\n children,\r\n ...props\r\n}, forwardedRef) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const internalRef = useRef<HTMLDivElement>(null);\r\n\r\n // Объединяем внутренний ref с переданным извне\r\n const ref = forwardedRef || internalRef;\r\n\r\n // Закрытие по клику вне\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleClick = (e: MouseEvent) => {\r\n const currentRef = typeof ref === 'function' ? null : ref?.current;\r\n if (currentRef && !currentRef.contains(e.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handleClick);\r\n return () => document.removeEventListener('mousedown', handleClick);\r\n }, [isOpen, ref]);\r\n\r\n // Закрытие по клику на пункт\r\n const handleItemClick = (child: React.ReactElement) => (e: React.MouseEvent) => {\r\n if (child.props && typeof child.props.onClick === 'function') {\r\n child.props.onClick(e);\r\n }\r\n setIsOpen(false);\r\n };\r\n\r\n // Оборачиваем FDropdownItem для автозакрытия\r\n const renderChildren = () => {\r\n return React.Children.map(children, (child) => {\r\n if (\r\n isValidElement(child) &&\r\n child.type &&\r\n (child.type as React.ComponentType).displayName === 'FDropdownItem'\r\n ) {\r\n return cloneElement(child as React.ReactElement, {\r\n onClick: handleItemClick(child as React.ReactElement)\r\n });\r\n }\r\n return child;\r\n });\r\n };\r\n\r\n return (\r\n <div className={styles[\"f-dropdown\"]} ref={ref} {...props}>\r\n <FButton\r\n variant={variant}\r\n color={color}\r\n size={size}\r\n disabled={disabled}\r\n st={st}\r\n className={`${styles[\"f-dropdown__button\"]} ${className || ''}`}\r\n id={id}\r\n onClick={() => setIsOpen((v) => !v)}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={isOpen}\r\n >\r\n <FStack direction=\"row\" spacing={2} justifyContent=\"center\" alignItems=\"center\">\r\n {label}\r\n <FArrowIcon className={styles[\"f-dropdown__arrow\"]} size={16} color={\"light\"} direction={isOpen ? 'up' : 'down'} />\r\n </FStack>\r\n </FButton>\r\n\r\n <div\r\n className={\r\n styles[\"f-dropdown__content\"] +\r\n (isOpen ? ' ' + styles[\"f-dropdown__content--open\"] : '')\r\n }\r\n role=\"menu\"\r\n >\r\n {renderChildren()}\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\n// Для корректного сравнения типа\r\nFDropdown.displayName = 'FDropdown';\r\n\r\nexport default FDropdown;","import { FC } from \"react\";\r\n\r\nimport styles from '../static/FDropdown.module.scss'\r\n\r\n/**\r\n * Пропсы для компонента FDropdownItem.\r\n */\r\nexport interface IFDropdownItem {\r\n /**\r\n * Если true — элемент неактивен, клики заблокированы.\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Инлайновые стили для элемента списка.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Контент внутри пункта меню (может быть текстом или JSX).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Callback, вызываемый при клике на элемент.\r\n */\r\n onClick?: React.MouseEventHandler<HTMLLIElement>;\r\n}\r\n\r\n/**\r\n * Компонент `FDropdownItem` — пункт выпадающего меню.\r\n *\r\n * Используется внутри `FDropdown` как отдельный элемент меню с поддержкой состояния `disabled`.\r\n *\r\n * @component\r\n * @example\r\n * <FDropdownItem\r\n * id=\"item-1\"\r\n * onClick={() => console.log('Клик по пункту')}\r\n * >\r\n * Пункт меню\r\n * </FDropdownItem>\r\n *\r\n * @param {boolean} [disabled] - Если true — элемент неактивен и не реагирует на клики.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [className] - Кастомный CSS класс.\r\n * @param {string} [id] - HTML ID элемента.\r\n * @param {React.ReactNode} [children] - Контент пункта меню.\r\n * @param {Function} [onClick] - Callback при клике на пункт.\r\n *\r\n * @returns {JSX.Element} — Рендерит пункт меню (`<li>`).\r\n */\r\nconst FDropdownItem: FC<IFDropdownItem> = ({\r\n disabled,\r\n st,\r\n className,\r\n id,\r\n children,\r\n onClick,\r\n}) => {\r\n return (\r\n <li\r\n id={id}\r\n style={st}\r\n className={`${styles[\"f-dropdown__content-link\"]} ${className || ''} ${disabled ? styles[\"disabled\"] : ''}`}\r\n onClick={disabled ? undefined : onClick}\r\n aria-disabled={disabled}\r\n role=\"menuitem\"\r\n >\r\n {children}\r\n </li>\r\n );\r\n};\r\n\r\nexport default FDropdownItem;","import { forwardRef } from \"react\";\r\nimport styles from './FSearchBox.module.scss';\r\nimport FButton from \"@material/FButton\";\r\nimport FTrashIcon from \"@icons/FTrashIcon\";\r\nimport FTextField from \"@material/FTextField\";\r\n\r\n/**\r\n * Тип цвета для кнопки.\r\n *\r\n * @typedef {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'} ButtonColorType\r\n */\r\ntype ButtonColorType =\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'danger'\r\n | 'warning'\r\n | 'info'\r\n | 'light'\r\n | 'dark'\r\n | 'link';\r\n\r\n/**\r\n * Тип варианта отображения кнопки.\r\n *\r\n * @typedef {'contained' | 'default'} ButtonVariantType\r\n */\r\ntype ButtonVariantType = 'contained' | 'default';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента `FSearchBox`.\r\n *\r\n * @interface IFSearchBox\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFSearchBox extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Метка (label), отображаемая над полем ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера поля ввода.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю ширину родителя.\r\n * @type {boolean}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Флаг, блокирующий поле ввода.\r\n * @type {boolean}\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Флаг, устанавливающий поле ввода как только для чтения.\r\n * @type {boolean | undefined}\r\n */\r\n readOnly?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст под полем ввода.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Флаг состояния загрузки — показывает спиннер рядом с полем ввода.\r\n * @type {boolean}\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Дочерние элементы — например, иконка поиска.\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Цвет кнопки справа.\r\n * @type {ButtonColorType}\r\n */\r\n color?: ButtonColorType;\r\n\r\n /**\r\n * Вариант кнопки: заполненная (`contained`) или контурная (`default`).\r\n * @type {ButtonVariantType}\r\n */\r\n variant?: ButtonVariantType;\r\n\r\n /**\r\n * Callback, вызываемый при клике на правую кнопку.\r\n * @type {React.MouseEventHandler<HTMLButtonElement> | undefined}\r\n */\r\n onClickButton?: React.MouseEventHandler<HTMLButtonElement>;\r\n\r\n /**\r\n * Callback, вызываемый при клике на кнопку очистки поля ввода.\r\n * @type {() => void | undefined}\r\n */\r\n clearDataFromInput?: () => void;\r\n}\r\n\r\n/**\r\n * Компонент `FSearchBox` — кастомное поле ввода с кнопкой справа и возможностью очистки.\r\n *\r\n * Поддерживает:\r\n * - метку (`label`)\r\n * - состояние загрузки (`load`)\r\n * - ошибки (`errText`)\r\n * - вспомогательный текст (`helpText`)\r\n * - пользовательские стили и классы\r\n *\r\n * @component\r\n * @example\r\n * <FSearchBox\r\n * label=\"Поиск\"\r\n * placeholder=\"Введите запрос\"\r\n * fullWidth\r\n * color=\"primary\"\r\n * variant=\"contained\"\r\n * onClickButton={() => alert('Искать')}\r\n * />\r\n *\r\n * @example\r\n * // С функцией очистки и ошибкой\r\n * <FSearchBox\r\n * label=\"Фильтр\"\r\n * value={searchValue}\r\n * onChange={(e) => setSearchValue(e.target.value)}\r\n * errText={['Поле обязательное']}\r\n * clearDataFromInput={() => setSearchValue('')}\r\n * />\r\n *\r\n * @param {string} [label] - Текст метки.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для контейнера.\r\n * @param {boolean} [fullWidth] - Если true, поле будет растянуто на 100% ширины.\r\n * @param {boolean} [disabled] - Блокировка ввода и кнопок.\r\n * @param {boolean} [readOnly] - Только для чтения.\r\n * @param {string[] | string} [errText] - Сообщения об ошибках.\r\n * @param {string} [helpText] - Вспомогательный текст.\r\n * @param {boolean} [load=false] - Показывает спиннер загрузки.\r\n * @param {React.ReactNode} [children] - Контент внутри кнопки справа.\r\n * @param {ButtonColorType} [color='primary'] - Цвет кнопки справа.\r\n * @param {ButtonVariantType} [variant='contained'] - Вариант кнопки: `contained` или `default`.\r\n * @param {Function} [onClickButton] - Обработчик клика по правой кнопке.\r\n * @param {Function} [clearDataFromInput] - Очистка данных из поля ввода.\r\n * @param {...React.InputHTMLAttributes<HTMLInputElement>} props - Атрибуты HTMLInputElement.\r\n *\r\n * @returns {JSX.Element} — Рендерит поле ввода с кнопками и дополнительными элементами.\r\n */\r\nconst FSearchBox = forwardRef<HTMLInputElement, IFSearchBox>(\r\n (\r\n {\r\n label,\r\n fullWidth,\r\n disabled,\r\n readOnly,\r\n errText,\r\n helpText,\r\n load = false,\r\n children,\r\n color = 'primary',\r\n variant = 'contained',\r\n onClickButton,\r\n clearDataFromInput,\r\n st,\r\n type,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n\r\n return (\r\n <div className={`${styles['f-search-box']} form-group`} style={st}>\r\n <FTextField\r\n fullWidth={fullWidth}\r\n label={label}\r\n ref={ref}\r\n disabled={disabled}\r\n readOnly={readOnly || load}\r\n type={type ?? 'text'}\r\n helpText={helpText}\r\n errText={typeof errText === 'string' ? [errText] : errText}\r\n load={load}\r\n {...props}\r\n className={`${styles['f-search-box__input']} ${props.className || ''}`}\r\n />\r\n <div className={styles['f-search-box__button']} style={{ marginTop: label ? \"21.8px\" : '0' }}>\r\n <FButton\r\n className={`${styles['f-search-box__button_search']} ${clearDataFromInput ? styles['clear-on'] : ''}`}\r\n type={'button'}\r\n disabled={disabled}\r\n onClick={onClickButton}\r\n color={color}\r\n variant={variant}\r\n >\r\n {children}\r\n </FButton>\r\n {clearDataFromInput && (\r\n <FButton\r\n className={`${styles['f-search-box__button_clear']}`}\r\n type={'button'}\r\n disabled={disabled}\r\n onClick={clearDataFromInput}\r\n color={'danger'}\r\n variant={variant}\r\n >\r\n <FTrashIcon color={\"light\"} size={20} />\r\n </FButton>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FSearchBox;","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iMTI4cHgiIGlkPSJMYXllcl8xIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMjggMTI4OyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48Zz48bGluZSBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMkYzNDM1O3N0cm9rZS13aWR0aDoxMjtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLW1pdGVybGltaXQ6MTA7IiB4MT0iODcuNSIgeDI9IjQwLjUiIHkxPSIxMTEiIHkyPSI2NCIvPjxsaW5lIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMyRjM0MzU7c3Ryb2tlLXdpZHRoOjEyO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbWl0ZXJsaW1pdDoxMDsiIHgxPSI0MC41IiB4Mj0iODcuNSIgeTE9IjY0IiB5Mj0iMTciLz48L2c+PC9zdmc+\"","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iMTI4cHgiIGlkPSJMYXllcl8xIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMjggMTI4OyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48Zz48bGluZSBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMkYzNDM1O3N0cm9rZS13aWR0aDoxMjtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLW1pdGVybGltaXQ6MTA7IiB4MT0iNDAuNSIgeDI9Ijg3LjUiIHkxPSIxNyIgeTI9IjY0Ii8+PGxpbmUgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzJGMzQzNTtzdHJva2Utd2lkdGg6MTI7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1taXRlcmxpbWl0OjEwOyIgeDE9Ijg3LjUiIHgyPSI0MC41IiB5MT0iNjQiIHkyPSIxMTEiLz48L2c+PC9zdmc+\"","import { FC, ReactNode, useRef, useState, useEffect } from 'react';\r\nimport styles from '../static/FCarouse.module.scss';\r\nimport arrowLeft from '../static/arrow-left.svg';\r\nimport arrowRight from '../static/arrow-right.svg';\r\n\r\n/**\r\n * Пропсы для компонента `FCarousel` — горизонтальная карусель с прокруткой.\r\n */\r\nexport interface IFCarousel {\r\n /**\r\n * Массив дочерних элементов (обычно слайды в виде JSX).\r\n */\r\n children: ReactNode[];\r\n\r\n /**\r\n * Количество одновременно отображаемых элементов.\r\n * @default 1\r\n */\r\n visibleCount?: number;\r\n\r\n /**\r\n * Отображение стрелок навигации (вкл/выкл).\r\n * @default true\r\n */\r\n showArrows?: boolean;\r\n\r\n /**\r\n * Включает цикличную прокрутку (зацикливание).\r\n * @default false\r\n */\r\n loop?: boolean;\r\n\r\n /**\r\n * Автоматическое переключение слайдов.\r\n * @default false\r\n */\r\n autoplay?: boolean;\r\n\r\n /**\r\n * Задержка автопрокрутки в миллисекундах.\r\n * @default 3000\r\n */\r\n autoplayInterval?: number;\r\n\r\n /**\r\n * Пользовательский CSS класс для контейнера карусели.\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Горизонтальный карусель с поддержкой:\r\n * - ручной и автоматической прокрутки\r\n * - свайпов на мобильных устройствах\r\n * - индикаторов текущего слайда\r\n * - циклической прокрутки\r\n *\r\n * @component\r\n * @example\r\n * <FCarousel\r\n * visibleCount={3}\r\n * showArrows={true}\r\n * loop={false}\r\n * autoplay={true}\r\n * autoplayInterval={4000}\r\n * >\r\n * <div>Слайд 1</div>\r\n * <div>Слайд 2</div>\r\n * <div>Слайд 3</div>\r\n * </FCarousel>\r\n *\r\n * @param {ReactNode[]} children - Список слайдов.\r\n * @param {number} [visibleCount=1] - Количество видимых слайдов одновременно.\r\n * @param {boolean} [showArrows=true] - Отображать ли стрелки навигации.\r\n * @param {boolean} [loop=false] - Включить зацикливание при достижении конца.\r\n * @param {boolean} [autoplay=false] - Автопрокрутка слайдов.\r\n * @param {number} [autoplayInterval=3000] - Интервал автопрокрутки в мс.\r\n * @param {string} [className] - Кастомный класс для внешнего контейнера.\r\n *\r\n * @returns {JSX.Element} — Рендерит карусель с кнопками и точками-индикаторами.\r\n */\r\nconst FCarousel: FC<IFCarousel> = ({\r\n children,\r\n visibleCount = 1,\r\n showArrows = true,\r\n loop = false,\r\n autoplay = false,\r\n autoplayInterval = 3000,\r\n className,\r\n}) => {\r\n const [current, setCurrent] = useState(0);\r\n const [isAnimating, setIsAnimating] = useState(false);\r\n const itemsCount = children.length;\r\n const trackRef = useRef<HTMLDivElement>(null);\r\n const autoplayRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n // Автопрокрутка\r\n useEffect(() => {\r\n if (autoplay) {\r\n autoplayRef.current = setInterval(() => {\r\n setIsAnimating(true);\r\n setCurrent((prev) => {\r\n if (prev >= itemsCount - visibleCount) return loop ? 0 : prev;\r\n return prev + 1;\r\n });\r\n }, autoplayInterval);\r\n\r\n return () => {\r\n if (autoplayRef.current) clearInterval(autoplayRef.current);\r\n };\r\n }\r\n }, [autoplay, autoplayInterval, itemsCount, visibleCount]);\r\n\r\n // Анимация перехода\r\n useEffect(() => {\r\n if (isAnimating) {\r\n const timeout = setTimeout(() => setIsAnimating(false), 500);\r\n return () => clearTimeout(timeout);\r\n }\r\n }, [isAnimating]);\r\n\r\n // Сброс позиции при изменении количества слайдов или видимых элементов\r\n useEffect(() => {\r\n setCurrent(0);\r\n }, [itemsCount, visibleCount]);\r\n\r\n // Обработчики навигации\r\n const handlePrev = () => {\r\n if (isAnimating) return;\r\n setIsAnimating(true);\r\n setCurrent((prev) =>\r\n prev === 0\r\n ? loop ? itemsCount - visibleCount : 0\r\n : prev - 1\r\n );\r\n };\r\n\r\n const handleNext = () => {\r\n if (isAnimating) return;\r\n setIsAnimating(true);\r\n setCurrent((prev) =>\r\n prev >= itemsCount - visibleCount\r\n ? loop ? 0 : prev\r\n : prev + 1\r\n );\r\n };\r\n\r\n // Обработка свайпов на мобильных\r\n const startX = useRef<number | null>(null);\r\n\r\n const handleTouchStart = (e: React.TouchEvent) => {\r\n startX.current = e.touches[0].clientX;\r\n };\r\n\r\n const handleTouchMove = (e: React.TouchEvent) => {\r\n if (startX.current === null) return;\r\n const diff = startX.current - e.touches[0].clientX;\r\n if (Math.abs(diff) > 50) {\r\n if (diff > 0) handleNext();\r\n else handlePrev();\r\n startX.current = null;\r\n }\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n startX.current = null;\r\n };\r\n\r\n // Классы\r\n const rootClass = [styles['f-carousel'], className]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const trackClass = [\r\n styles['f-carousel__track'],\r\n isAnimating ? styles['f-carousel__track--animating'] : ''\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const trackStyle = {\r\n transform: `translateX(-${(100 / itemsCount) * current}%)`,\r\n transition: isAnimating ? 'transform 0.6s cubic-bezier(.4,0,.2,1)' : 'none',\r\n width: `${(100 * itemsCount) / visibleCount}%`,\r\n };\r\n\r\n return (\r\n <div className={rootClass}>\r\n {showArrows && (\r\n <button\r\n className={`${styles['f-carousel__arrow']} ${styles['f-carousel__arrow--left']}`}\r\n onClick={handlePrev}\r\n disabled={!loop && current === 0}\r\n aria-label=\"Назад\"\r\n >\r\n <img src={arrowLeft} alt=\"Предыдущий слайд\" />\r\n </button>\r\n )}\r\n\r\n <div\r\n className={styles['f-carousel__viewport']}\r\n onTouchStart={handleTouchStart}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n >\r\n <div ref={trackRef} className={trackClass} style={trackStyle}>\r\n {children.map((child, idx) => (\r\n <div\r\n key={idx}\r\n className={styles['f-carousel__item']}\r\n style={{ width: `${100 / itemsCount}%` }}\r\n >\r\n {child}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {showArrows && (\r\n <button\r\n className={`${styles['f-carousel__arrow']} ${styles['f-carousel__arrow--right']}`}\r\n onClick={handleNext}\r\n disabled={!loop && current >= itemsCount - visibleCount}\r\n aria-label=\"Вперёд\"\r\n >\r\n <img src={arrowRight} alt=\"Следующий слайд\" />\r\n </button>\r\n )}\r\n\r\n <div className={styles['f-carousel__indicators']}>\r\n {Array.from({ length: itemsCount - visibleCount + 1 }).map((_, idx) => (\r\n <button\r\n key={idx}\r\n className={[\r\n styles['f-carousel__indicator'],\r\n idx === current ? styles['f-carousel__indicator--active'] : '',\r\n ].join(' ')}\r\n onClick={() => setCurrent(idx)}\r\n aria-label={`Перейти к слайду ${idx + 1}`}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FCarousel;","import { FC, ReactNode } from 'react';\r\nimport styles from '../static/FCarouse.module.scss';\r\n\r\n/**\r\n * Пропсы для компонента `FCarouselItem`.\r\n */\r\nexport interface FCarouselItemProps {\r\n /**\r\n * Контент слайда (обычно изображение или JSX).\r\n */\r\n children: ReactNode;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FCarouselItem` — отдельный элемент карусели.\r\n *\r\n * Используется внутри `FCarousel` как обёртка для каждого слайда.\r\n *\r\n * @component\r\n * @example\r\n * <FCarouselItem className=\"custom-slide\">\r\n * <img src=\"/slide1.jpg\" alt=\"Слайд 1\" />\r\n * </FCarouselItem>\r\n *\r\n * @param {React.ReactNode} children - Контент слайда.\r\n * @param {string} [className] - Пользовательский класс.\r\n * @param {string} [id] - HTML ID.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<div>` со стилями карусели и кастомным классом.\r\n */\r\nconst FCarouselItem: FC<FCarouselItemProps> = ({\r\n children,\r\n className,\r\n id,\r\n}) => {\r\n return (\r\n <div className={`${styles['f-carousel-item']} ${className || ''}`} id={id}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FCarouselItem;","import { FC, useEffect, useRef } from \"react\";\r\nimport styles from './FSkeleton.module.scss';\r\n\r\n/**\r\n * Параметры компонента FSkeleton.\r\n */\r\nexport interface IFSkeleton {\r\n /**\r\n * Дочерние элементы, которые будут заменены на скелетон.\r\n */\r\n children: React.ReactNode;\r\n\r\n /**\r\n * Флаг включения скелетона (показывает загрузку).\r\n */\r\n enable: boolean;\r\n\r\n /**\r\n * Кастомная ширина скелетона.\r\n * Если не указана — берётся из оригинального элемента.\r\n */\r\n width?: string;\r\n\r\n /**\r\n * Кастомная высота скелетона.\r\n * Если не указана — берётся из оригинального элемента.\r\n */\r\n height?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FSkeleton` — временная заглушка вместо контента во время загрузки.\r\n *\r\n * @component\r\n * @example\r\n * <FSkeleton enable={loading} width=\"100%\" height=\"20px\">\r\n * <div>Контент</div>\r\n * </FSkeleton>\r\n *\r\n * @param {ReactNode} children - Элементы, которые будут заменены на скелетон при `enable={true}`.\r\n * @param {boolean} enable - Включает режим скелетона.\r\n * @param {string} [width] - Кастомная ширина скелетона. По умолчанию — как у исходного элемента.\r\n * @param {string} [height] - Кастомная высота скелетона. По умолчанию — как у исходного элемента.\r\n *\r\n * @returns {JSX.Element} - Рендерит либо скелетон, либо оригинальный контент.\r\n */\r\nconst FSkeleton: FC<IFSkeleton> = ({ children, enable, width, height }) => {\r\n const elementRef = useRef<HTMLDivElement>(null);\r\n const originalElements = useRef<HTMLElement[]>([]);\r\n const skeletons = useRef<HTMLElement[]>([]);\r\n\r\n // Создание скелетона\r\n const createSkeleton = (element: Element): HTMLDivElement => {\r\n const skeleton = document.createElement('div');\r\n skeleton.className = styles.skeleton; // Используем класс из модульного CSS\r\n\r\n const computedStyle = window.getComputedStyle(element);\r\n\r\n skeleton.style.width = width ?? computedStyle.width;\r\n skeleton.style.height = height ?? computedStyle.height;\r\n skeleton.style.borderRadius = computedStyle.borderRadius === '0px' ? '10px' : computedStyle.borderRadius;\r\n skeleton.style.margin = computedStyle.margin;\r\n skeleton.style.display = computedStyle.display || 'block';\r\n skeleton.style.position = computedStyle.position || 'relative';\r\n\r\n return skeleton;\r\n };\r\n\r\n // Замена дочерних элементов на скелетоны\r\n const replaceWithSkeletons = () => {\r\n const container = elementRef.current;\r\n if (!container) return;\r\n\r\n const childrenArray = Array.from(container.children) as HTMLElement[];\r\n\r\n originalElements.current = [];\r\n skeletons.current = [];\r\n\r\n childrenArray.forEach((child) => {\r\n const skeleton = createSkeleton(child);\r\n originalElements.current.push(child);\r\n skeletons.current.push(skeleton);\r\n\r\n if (child.parentNode) {\r\n child.parentNode.replaceChild(skeleton, child);\r\n }\r\n });\r\n };\r\n\r\n // Восстановление оригинальных элементов\r\n const restoreOriginalElements = () => {\r\n const container = elementRef.current;\r\n if (!container) return;\r\n\r\n originalElements.current.forEach((original, index) => {\r\n const skeleton = skeletons.current[index];\r\n if (skeleton && original && skeleton.parentNode) {\r\n skeleton.parentNode.replaceChild(original, skeleton);\r\n }\r\n });\r\n\r\n skeletons.current = [];\r\n originalElements.current = [];\r\n };\r\n\r\n // Основной эффект\r\n useEffect(() => {\r\n if (enable) {\r\n replaceWithSkeletons();\r\n } else {\r\n restoreOriginalElements();\r\n }\r\n\r\n return () => {\r\n restoreOriginalElements(); // Чистка при размонтировании\r\n };\r\n }, [enable]);\r\n\r\n return (\r\n <div ref={elementRef} className={styles['skeleton-block']}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FSkeleton;","import FGrid from \"@material/GridComponents/FGrid\";\r\nimport FGridRow from \"@material/GridComponents/FGridRow\";\r\nimport { FC } from \"react\";\r\nimport styles from \"../static/FNavigateBar.module.scss\"\r\n\r\n/**\r\n * Пропсы для компонента `FNavigateBar` — обёртка для навигационной панели.\r\n */\r\nexport interface IFNavigateBar {\r\n /**\r\n * Инлайновые стили для элемента `<nav>`.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы, обычно пункты меню (`<li>`), оборачиваемые в `<ul>`.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * HTML ID компонента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Кастомный CSS класс.\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FNavigateBar` — обёртка для навигационной панели.\r\n *\r\n * Содержит список пунктов меню в семантической обёртке `<nav>`.\r\n * Поддерживает адаптивность через сетку (`FGrid`, `FGridRow`, `FGridItem`).\r\n *\r\n * @component\r\n * @example\r\n * const getActiveClass = (route: string) => {\r\n * const pathMatch = matchPath({ path: route + '/*' }, location.pathname);\r\n * return pathMatch ? 'nav-rout active' : 'nav-rout';\r\n * };\r\n *\r\n * <FNavigateBar>\r\n * <Link to=\"/\">\r\n * <FNavigateBarItem getActiveClass={getActiveClass('/')} className=\"nav-link\">\r\n * Главная\r\n * </FNavigateBarItem>\r\n * </Link>\r\n * </FNavigateBar>\r\n *\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для `<nav>`.\r\n * @param {React.ReactNode} [children] - Пункты меню (обычно `<li>`), оборачиваемые в `<ul>`.\r\n * @param {string} [id] - HTML ID для контейнера.\r\n * @param {string} [className] - Кастомный класс для контейнера.\r\n *\r\n * @returns {JSX.Element} — Рендерит панель навигации с адаптивным расположением.\r\n */\r\nconst FNavigateBar: FC<IFNavigateBar> = ({\r\n st,\r\n children,\r\n id,\r\n className,\r\n}) => {\r\n return (\r\n <FGrid obj={'container'} id={id} className={className}>\r\n <FGridRow>\r\n <FGrid obj=\"item\" sm={12}>\r\n <nav style={st} className={styles['f-nav-bar']}>\r\n <ul className={styles['f-nav-bar__menu']}>\r\n {children}\r\n </ul>\r\n </nav>\r\n </FGrid>\r\n </FGridRow>\r\n </FGrid>\r\n );\r\n};\r\n\r\nexport default FNavigateBar;","import { FC } from \"react\";\r\nimport styles from \"../static/FNavigateBar.module.scss\"\r\n\r\n/**\r\n * Пропсы для компонента `FNavigateBarItem`\r\n */\r\nexport interface IFNavigateBarItem {\r\n /**\r\n * Флаг, указывающий, является ли пункт меню активным.\r\n */\r\n activeClass: boolean;\r\n\r\n /**\r\n * Путь или имя маршрута для проверки активности (необязательный).\r\n * Может использоваться в будущем для расширения логики.\r\n */\r\n route?: string;\r\n\r\n /**\r\n * Контент пункта меню (например, текст или иконка).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для элемента `<li>`.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FNavigateBarItem` — пункт горизонтального меню навигации.\r\n *\r\n * Отображает отдельный элемент меню (`<li>`), применяя стиль активности на основе переданного флага.\r\n *\r\n * @component\r\n * @example\r\n * <FNavigateBarItem activeClass={location.pathname === '/'}>\r\n * Главная\r\n * </FNavigateBarItem>\r\n *\r\n * @param {boolean} activeClass - Определяет, является ли пункт активным.\r\n * @param {string} [route] - Необязательный путь, может использоваться для динамической проверки.\r\n * @param {React.ReactNode} [children] - Контент пункта меню (текст, иконка и т.д.).\r\n * @param {string} [className] - Кастомный класс для дополнительной стилизации.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - HTML ID элемента.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<li>` с возможностью активного состояния.\r\n */\r\nconst FNavigateBarItem: FC<IFNavigateBarItem> = ({\r\n st,\r\n children,\r\n id,\r\n className,\r\n activeClass,\r\n}) => {\r\n return (\r\n <li\r\n id={id}\r\n style={st}\r\n className={`${styles['f-nav-bar__menu-route']} ${activeClass ? styles.active : ''} ${className || ''}`}\r\n >\r\n {children}\r\n </li>\r\n );\r\n};\r\n\r\nexport default FNavigateBarItem;\r\n","import { FC } from \"react\";\r\nimport styles from \"../FMenuLinks.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FMenuBlockLinks — карточка-блок меню с заголовком и списком ссылок.\r\n *\r\n * @interface IFMenuBlockLinksProps\r\n */\r\ninterface IFMenuBlockLinksProps {\r\n /**\r\n * Содержимое блока. Компонент `<FMenuLinks>` с набором ссылок.\r\n */\r\n children: React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для контейнера карточки.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера карточки.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Количество столбцов в контейнере Grid.\r\n */\r\n columns?: number;\r\n}\r\n\r\n/**\r\n * Компонент-карточка для группировки ссылок меню.\r\n * Используется вместе с `FMenuLinks` для создания блоков вида:\r\n *\r\n * ```\r\n * ┌─────────────────────┐\r\n * │ Заголовок │\r\n * ├─────────────────────┤\r\n * │ Ссылка 1 │\r\n * │ Ссылка 2 │\r\n * └─────────────────────┘\r\n * ```\r\n *\r\n * @component\r\n * @example\r\n * <FMenuBlockLinks columns={3}>\r\n * <FMenuLinks>\r\n * <Link to=\"/card\">Карточка учета</Link>\r\n * <Link to=\"/report\">Отчет</Link>\r\n * </FMenuLinks>\r\n * </FMenuBlockLinks>\r\n *\r\n * @param {IFMenuBlockLinksProps} props\r\n * @returns {JSX.Element}\r\n */\r\nconst FMenuBlockLinks: FC<IFMenuBlockLinksProps> = ({\r\n children,\r\n className,\r\n st,\r\n id,\r\n columns = 3\r\n}) => {\r\n\r\n const style = st !== undefined ? { ...st, columns } : { columns }\r\n\r\n return (\r\n <div\r\n className={`${styles[\"sections-routes\"]} ${className ?? \"\"}`.trim()}\r\n style={style}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FMenuBlockLinks;","import { FC } from \"react\";\r\nimport React from \"react\";\r\nimport styles from \"../FMenuLinks.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FMenuLinks — список ссылок с единой стилистикой.\r\n *\r\n * @interface IFMenuLinksProps\r\n */\r\ninterface IFMenuLinksProps {\r\n /** Дочерние элементы (обычно <a>, <Link> или <button>). К каждому будет добавлен класс `link`. */\r\n children: React.ReactNode;\r\n\r\n /** Дополнительный класс для внешнего контейнера */\r\n className?: string;\r\n\r\n /** Инлайновые стили для внешнего контейнера */\r\n st?: React.CSSProperties;\r\n\r\n /** ID элемента */\r\n id?: string;\r\n\r\n /** Индексы дочерних элементов (начиная с 0), которые нужно отключить */\r\n disabled?: number[];\r\n\r\n /** Заголовок блока (отображается над списком ссылок) */\r\n title?: string;\r\n}\r\n\r\n/**\r\n * Компонент FMenuLinks — единый стилизованный список ссылок меню.\r\n * Автоматически добавляет класс `link` ко всем дочерним элементам,\r\n * поддерживает отключение отдельных пунктов и опциональный заголовок.\r\n *\r\n * Используется внутри `FMenuBlockLinks` или самостоятельно.\r\n *\r\n * @component\r\n * @example\r\n * <FMenuLinks title=\"Документы\">\r\n * <Link to=\"/cards\">Карточка учета</Link>\r\n * <Link to=\"/reports\">Сводная ведомость</Link>\r\n * </FMenuLinks>\r\n *\r\n * @example\r\n * // Отключение второй ссылки\r\n * <FMenuLinks disabled={[1]}>\r\n * <Link to=\"/profile\">Профиль</Link>\r\n * <Link to=\"/settings\">Настройки</Link>\r\n * </FMenuLinks>\r\n */\r\nconst FMenuLinks: FC<IFMenuLinksProps> = ({\r\n children,\r\n className,\r\n st,\r\n id,\r\n disabled = [],\r\n title,\r\n}) => {\r\n const enhancedChildren = React.Children.map(children, (child, index) => {\r\n if (!React.isValidElement(child)) return child;\r\n\r\n const isDisabled = disabled.includes(index);\r\n const childClass = [\r\n child.props.className,\r\n styles.link,\r\n isDisabled && styles.disabled,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return React.cloneElement(child as React.ReactElement<any>, {\r\n className: childClass,\r\n ...(isDisabled && { onClick: (e: React.MouseEvent) => e.preventDefault() }),\r\n });\r\n });\r\n\r\n return (\r\n <div\r\n className={`${styles[\"sections-routes_card\"]} ${className ?? \"\"}`.trim()}\r\n style={st}\r\n id={id}\r\n >\r\n {title && <div className={styles[\"sections-routes_card__title\"]}>{title}</div>}\r\n <div className={styles[\"sections-routes_card__links\"]}>{enhancedChildren}</div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FMenuLinks;","import React, {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useCallback,\r\n type ReactNode,\r\n cloneElement,\r\n type CSSProperties,\r\n ReactElement\r\n} from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport styles from './FTooltip.module.scss';\r\n\r\n/**\r\n * Интерфейс свойств компонента FTooltip\r\n * @interface FTooltipProps\r\n */\r\nexport interface FTooltipProps {\r\n /** \r\n * Текст или React-элемент, который будет отображаться в тултипе \r\n * @type {ReactNode}\r\n */\r\n title: ReactNode;\r\n\r\n /** \r\n * Дочерний элемент, к которому будет применен тултип. \r\n * Должен поддерживать передачу ref\r\n * @type {ReactElement}\r\n */\r\n children: ReactElement;\r\n\r\n /** \r\n * Расположение тултипа относительно дочернего элемента\r\n * @type {'top' | 'bottom' | 'left' | 'right'}\r\n * @default 'bottom'\r\n */\r\n placement?: 'top' | 'bottom' | 'left' | 'right';\r\n\r\n /** \r\n * Отображать ли стрелку у тултипа\r\n * @type {boolean}\r\n * @default false\r\n */\r\n arrow?: boolean;\r\n\r\n /** \r\n * Контролируемое состояние открытия тултипа. \r\n * Если не указано, компонент управляет состоянием самостоятельно\r\n * @type {boolean}\r\n */\r\n open?: boolean;\r\n\r\n /** \r\n * Callback, вызываемый при открытии тултипа\r\n * @type {Function}\r\n */\r\n onOpen?: () => void;\r\n\r\n /** \r\n * Callback, вызываемый при закрытии тултипа\r\n * @type {Function}\r\n */\r\n onClose?: () => void;\r\n\r\n /** \r\n * Отключает прослушивание событий наведения мыши\r\n * @type {boolean}\r\n * @default false\r\n */\r\n disableHoverListener?: boolean;\r\n\r\n /** \r\n * Отключает прослушивание событий фокуса\r\n * @type {boolean}\r\n * @default false\r\n */\r\n disableFocusListener?: boolean;\r\n\r\n /** \r\n * Отключает прослушивание touch-событий\r\n * @type {boolean}\r\n * @default false\r\n */\r\n disableTouchListener?: boolean;\r\n\r\n /** \r\n * Задержка перед открытием тултипа в миллисекундах\r\n * @type {number}\r\n * @default 0\r\n */\r\n enterDelay?: number;\r\n\r\n /** \r\n * Дополнительный CSS класс для тултипа\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /** \r\n * Inline стили для тултипа\r\n * @type {CSSProperties}\r\n */\r\n style?: CSSProperties;\r\n\r\n /**\r\n * Разрешает показывать тултип даже если элемент disabled\r\n * @type {boolean}\r\n * @default false\r\n */\r\n allowTooltipOnDisabled?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент FTooltip - отображает всплывающую подсказку при взаимодействии с дочерним элементом\r\n */\r\nconst FTooltip: React.FC<FTooltipProps> = ({\r\n title,\r\n children,\r\n placement = 'bottom',\r\n arrow = false,\r\n open: openProp,\r\n onOpen,\r\n onClose,\r\n disableHoverListener = false,\r\n disableFocusListener = false,\r\n disableTouchListener = false,\r\n enterDelay = 0,\r\n className = '',\r\n style,\r\n allowTooltipOnDisabled = false\r\n}) => {\r\n /** Состояние открытия тултипа (uncontrolled) */\r\n const [open, setOpen] = useState(false);\r\n\r\n /** Состояние монтирования тултипа в DOM */\r\n const [mountTooltip, setMountTooltip] = useState(false);\r\n\r\n /** Состояние видимости тултипа (для анимации появления) */\r\n const [isVisible, setIsVisible] = useState(false);\r\n\r\n /** Состояние выхода тултипа (для анимации исчезновения) */\r\n const [isExiting, setIsExiting] = useState(false);\r\n\r\n /** Стили позиционирования тултипа */\r\n const [tooltipStyles, setTooltipStyles] = useState<CSSProperties>({});\r\n\r\n /** Ref для дочернего элемента */\r\n const childRef = useRef<HTMLElement>(null);\r\n\r\n /** Ref для элемента тултипа */\r\n const tooltipRef = useRef<HTMLDivElement>(null);\r\n\r\n /** Таймеры и анимации */\r\n const enterTimer = useRef<NodeJS.Timeout | null>(null);\r\n const leaveTimer = useRef<NodeJS.Timeout | null>(null);\r\n const animationFrame = useRef<number | null>(null);\r\n\r\n /** Определяет текущее состояние открытия (controlled или uncontrolled) */\r\n const isOpen = openProp !== undefined ? openProp : open;\r\n\r\n /** Открытие тултипа */\r\n const handleOpen = () => {\r\n if (enterTimer.current) clearTimeout(enterTimer.current);\r\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\r\n\r\n enterTimer.current = setTimeout(() => {\r\n if (openProp === undefined) {\r\n setOpen(true);\r\n }\r\n setMountTooltip(true);\r\n setIsExiting(false);\r\n\r\n if (animationFrame.current) {\r\n cancelAnimationFrame(animationFrame.current);\r\n }\r\n\r\n animationFrame.current = requestAnimationFrame(() => {\r\n setIsVisible(true);\r\n onOpen?.();\r\n updatePosition();\r\n });\r\n }, enterDelay);\r\n };\r\n\r\n /** Закрытие тултипа */\r\n const handleClose = () => {\r\n if (enterTimer.current) clearTimeout(enterTimer.current);\r\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\r\n\r\n if (isOpen || isVisible) {\r\n if (openProp === undefined) {\r\n setOpen(false);\r\n }\r\n\r\n setIsVisible(false);\r\n setIsExiting(true);\r\n\r\n const tooltipNode = tooltipRef.current;\r\n if (tooltipNode) {\r\n const handleTransitionEnd = (event: TransitionEvent) => {\r\n if (event.propertyName === 'opacity') {\r\n setIsExiting(false);\r\n setMountTooltip(false);\r\n onClose?.();\r\n tooltipNode.removeEventListener('transitionend', handleTransitionEnd);\r\n }\r\n };\r\n tooltipNode.addEventListener('transitionend', handleTransitionEnd);\r\n } else {\r\n setIsExiting(false);\r\n setMountTooltip(false);\r\n onClose?.();\r\n }\r\n }\r\n };\r\n\r\n /** Обновляет позицию тултипа */\r\n const updatePosition = useCallback(() => {\r\n if (!childRef.current || !tooltipRef.current) return;\r\n\r\n const childRect = childRef.current.getBoundingClientRect();\r\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\r\n const scrollX = window.scrollX;\r\n const scrollY = window.scrollY;\r\n\r\n let top = 0;\r\n let left = 0;\r\n\r\n switch (placement) {\r\n case 'top':\r\n top = childRect.top + scrollY - tooltipRect.height - (arrow ? 8 : 0);\r\n left = childRect.left + scrollX + (childRect.width - tooltipRect.width) / 2;\r\n break;\r\n case 'bottom':\r\n top = childRect.bottom + scrollY + (arrow ? 8 : 0);\r\n left = childRect.left + scrollX + (childRect.width - tooltipRect.width) / 2;\r\n break;\r\n case 'left':\r\n top = childRect.top + scrollY + (childRect.height - tooltipRect.height) / 2;\r\n left = childRect.left + scrollX - tooltipRect.width - (arrow ? 8 : 0);\r\n break;\r\n case 'right':\r\n top = childRect.top + scrollY + (childRect.height - tooltipRect.height) / 2;\r\n left = childRect.right + scrollX + (arrow ? 8 : 0);\r\n break;\r\n }\r\n\r\n setTooltipStyles({ top: `${top}px`, left: `${left}px` });\r\n }, [placement, arrow]);\r\n\r\n /** Обновляем позицию при изменении видимости */\r\n useEffect(() => {\r\n if (isVisible) {\r\n updatePosition();\r\n }\r\n }, [isVisible, updatePosition]);\r\n\r\n /** Следим за ресайзом окна */\r\n useEffect(() => {\r\n const handleResize = () => {\r\n if (isVisible) updatePosition();\r\n };\r\n\r\n window.addEventListener('resize', handleResize);\r\n\r\n // Сохраняем текущие значения для cleanup\r\n const currentEnterTimer = enterTimer.current;\r\n const currentLeaveTimer = leaveTimer.current;\r\n const currentAnimationFrame = animationFrame.current;\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n if (currentEnterTimer) clearTimeout(currentEnterTimer);\r\n if (currentLeaveTimer) clearTimeout(currentLeaveTimer);\r\n if (currentAnimationFrame) cancelAnimationFrame(currentAnimationFrame);\r\n };\r\n }, [isVisible, updatePosition]);\r\n\r\n /** Подготавливает обработчики событий */\r\n const childProps: Record<string, React.EventHandler<React.SyntheticEvent> | React.Ref<HTMLElement>> = {\r\n ref: childRef\r\n };\r\n\r\n if (!disableHoverListener) {\r\n childProps.onMouseEnter = (e: React.MouseEvent) => {\r\n handleOpen();\r\n (children.props as Record<string, React.EventHandler<React.MouseEvent>>).onMouseEnter?.(e);\r\n };\r\n childProps.onMouseLeave = (e: React.MouseEvent) => {\r\n handleClose();\r\n (children.props as Record<string, React.EventHandler<React.MouseEvent>>).onMouseLeave?.(e);\r\n };\r\n }\r\n\r\n if (!disableFocusListener) {\r\n childProps.onFocus = (e: React.FocusEvent) => {\r\n handleOpen();\r\n (children.props as Record<string, React.EventHandler<React.FocusEvent>>).onFocus?.(e);\r\n };\r\n childProps.onBlur = (e: React.FocusEvent) => {\r\n handleClose();\r\n (children.props as Record<string, React.EventHandler<React.FocusEvent>>).onBlur?.(e);\r\n };\r\n }\r\n\r\n if (!disableTouchListener) {\r\n childProps.onTouchStart = (e: React.TouchEvent) => {\r\n handleOpen();\r\n (children.props as Record<string, React.EventHandler<React.TouchEvent>>).onTouchStart?.(e);\r\n };\r\n childProps.onTouchEnd = (e: React.TouchEvent) => {\r\n handleClose();\r\n (children.props as Record<string, React.EventHandler<React.TouchEvent>>).onTouchEnd?.(e);\r\n };\r\n }\r\n\r\n /** Оборачивание disabled элементов */\r\n let wrappedChild: ReactElement;\r\n const childPropsTyped = children.props as Record<string, unknown>;\r\n\r\n if (\r\n allowTooltipOnDisabled &&\r\n React.isValidElement(children) &&\r\n (childPropsTyped.disabled || childPropsTyped['aria-disabled'])\r\n ) {\r\n wrappedChild = (\r\n <span\r\n ref={childRef as React.Ref<HTMLSpanElement>}\r\n {...(childProps as Record<string, unknown>)}\r\n style={{ display: 'inline-block', cursor: 'not-allowed' }}\r\n >\r\n {children}\r\n </span>\r\n );\r\n } else {\r\n wrappedChild = cloneElement(children, childProps as Record<string, unknown>);\r\n }\r\n\r\n /** Классы тултипа */\r\n const tooltipClasses = [\r\n styles['f-tooltip'],\r\n styles[`f-tooltip--${placement}`],\r\n arrow ? styles['f-tooltip--with-arrow'] : '',\r\n isVisible ? styles['f-tooltip--open'] : '',\r\n isExiting ? styles['f-tooltip--exiting'] : '',\r\n className\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n /** JSX тултипа */\r\n const tooltipElement =\r\n mountTooltip && title ? (\r\n <div\r\n ref={tooltipRef}\r\n className={tooltipClasses}\r\n style={{ ...style, ...tooltipStyles }}\r\n role=\"tooltip\"\r\n >\r\n {arrow && <div className={styles['f-tooltip__arrow']} />}\r\n <div className={styles['f-tooltip__content']}>{title}</div>\r\n </div>\r\n ) : null;\r\n\r\n return (\r\n <>\r\n {wrappedChild}\r\n {tooltipElement && createPortal(tooltipElement, document.body)}\r\n </>\r\n );\r\n};\r\n\r\nexport default FTooltip;\r\n","import React, {\r\n forwardRef,\r\n useState,\r\n useMemo,\r\n useRef,\r\n useEffect,\r\n useDeferredValue,\r\n type ChangeEvent,\r\n type KeyboardEvent,\r\n type ReactNode,\r\n type CSSProperties,\r\n type ReactElement\r\n} from \"react\";\r\n\r\nimport styles from \"./FSearchableSelect.module.scss\";\r\nimport FLoadIcon from \"@icons/FLoadIcon\";\r\n\r\n// --- Иконки ---\r\nconst ChevronIcon = ({ className }: { className?: string }) => (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n);\r\nconst CloseIcon = () => (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n);\r\nconst PlusIcon = () => (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n);\r\n\r\n// --- Типы ---\r\ninterface IOptionData {\r\n value: string;\r\n label: string;\r\n isNew?: boolean;\r\n}\r\n\r\n/**\r\n * Интерфейс пропсов для компонента `FSearchableSelect`.\r\n *\r\n * @interface IFSearchableSelect\r\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'>}\r\n */\r\nexport interface IFSearchableSelect extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {\r\n /**\r\n * Метка (label), отображаемая над полем ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Инлайновые стили для внешнего контейнера компонента.\r\n * @type {CSSProperties | undefined}\r\n */\r\n st?: CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (обычно `<option>`), из которых формируется список выбора.\r\n * Значения извлекаются из пропсов `value` и `children` переданных элементов.\r\n * @type {ReactNode | undefined}\r\n */\r\n children?: ReactNode;\r\n\r\n /**\r\n * Флаг, указывающий, должен ли компонент занимать 100% ширины родителя.\r\n * @type {boolean | undefined}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Флаг состояния загрузки. Если true, отображается спиннер, а взаимодействие блокируется.\r\n * @type {boolean | undefined}\r\n */\r\n load?: boolean;\r\n \r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст, отображаемый под полем ввода.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Явное указание ширины компонента.\r\n * @type {string | number | undefined}\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Явное указание высоты компонента.\r\n * @type {string | number | undefined}\r\n */\r\n height?: string | number;\r\n\r\n /**\r\n * Разрешить создание новых элементов, отсутствующих в списке.\r\n * При вводе уникального текста появится опция \"Создать\".\r\n * @type {boolean | undefined}\r\n */\r\n allowCreate?: boolean;\r\n\r\n /**\r\n * Текущее значение поля (контролируемый компонент).\r\n * @type {string | number | readonly string[] | undefined}\r\n */\r\n value?: string | number | readonly string[];\r\n\r\n /**\r\n * Callback, вызываемый при изменении значения.\r\n * Возвращает синтетическое событие с объектом target, содержащим name и value.\r\n * @type {((event: { target: { name: string; value: string } } | ChangeEvent<HTMLInputElement>) => void) | undefined}\r\n */\r\n onChange?: (event: { target: { name: string; value: string } } | ChangeEvent<HTMLInputElement>) => void;\r\n}\r\n\r\n/**\r\n * Компонент подсветки найденного текста.\r\n * @ignore\r\n */\r\nconst HighlightedText = ({ text, highlight }: { text: string; highlight: string }) => {\r\n if (!highlight.trim()) return <span>{text}</span>;\r\n const escapeRegExp = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n const regex = new RegExp(`(${escapeRegExp(highlight)})`, \"gi\");\r\n const parts = text.split(regex);\r\n return (\r\n <span>\r\n {parts.map((part, i) =>\r\n regex.test(part) ? <span key={i} className={styles['f-select-highlight']}>{part}</span> : <span key={i}>{part}</span>\r\n )}\r\n </span>\r\n );\r\n};\r\n\r\n/**\r\n * Компонент `FSearchableSelect` — выпадающий список с возможностью поиска и фильтрации опций.\r\n *\r\n * Особенности:\r\n * - Поддерживает фильтрацию списка при вводе текста.\r\n * - Может работать как обычный Select или как Combobox (с `allowCreate`).\r\n * - Парсит опции из переданных `children` (например, `<option value=\"1\">One</option>`).\r\n * - Поддерживает навигацию с клавиатуры (стрелки, Enter, Escape).\r\n * - Имеет состояния: ошибка, загрузка, disabled.\r\n *\r\n * @component\r\n * @example\r\n * // Простой пример использования с опциями\r\n * <FSearchableSelect\r\n * label=\"Выберите город\"\r\n * value={city}\r\n * onChange={(e) => setCity(e.target.value)}\r\n * fullWidth\r\n * >\r\n * <option value=\"moscow\">Москва</option>\r\n * <option value=\"spb\">Санкт-Петербург</option>\r\n * </FSearchableSelect>\r\n *\r\n * @example\r\n * // Пример с созданием новых значений (allowCreate) и ошибкой\r\n * <FSearchableSelect\r\n * label=\"Теги\"\r\n * allowCreate\r\n * value={tag}\r\n * onChange={(e) => setTag(e.target.value)}\r\n * errText={hasError ? ['Некорректный тег'] : undefined}\r\n * >\r\n * {tagsList.map(t => <option key={t.id} value={t.name}>{t.name}</option>)}\r\n * </FSearchableSelect>\r\n *\r\n * @param {string} [label] - Метка поля.\r\n * @param {CSSProperties} [st] - Стили контейнера.\r\n * @param {ReactNode} [children] - Опции списка.\r\n * @param {boolean} [fullWidth=false] - Растянуть на 100%.\r\n * @param {boolean} [load=false] - Показать лоадер.\r\n * @param {string[] | string} [errText] - Текст ошибки.\r\n * @param {string} [helpText] - Подсказка.\r\n * @param {boolean} [allowCreate=false] - Разрешить ввод своих значений.\r\n * @param {string|number} [value] - Значение.\r\n * @param {Function} [onChange] - Обработчик изменений.\r\n *\r\n * @returns {JSX.Element} Рендерит кастомный Select с поиском.\r\n */\r\nconst FSearchableSelect = forwardRef<HTMLInputElement, IFSearchableSelect>(\r\n (\r\n {\r\n label,\r\n st,\r\n children,\r\n fullWidth,\r\n load = false,\r\n errText,\r\n helpText,\r\n height = \"auto\",\r\n width = \"fit-content\",\r\n allowCreate = false,\r\n disabled,\r\n onKeyDown: restOnKeyDown,\r\n onFocus: restOnFocus,\r\n ...restProps\r\n },\r\n ref\r\n ) => {\r\n // --- 1. Парсинг Children в массив данных ---\r\n const options = useMemo(() => {\r\n const results: IOptionData[] = [];\r\n React.Children.forEach(children, (child) => {\r\n if (React.isValidElement(child)) {\r\n const element = child as ReactElement<{ value?: string | number; children?: ReactNode }>;\r\n const { value: childValue, children: childLabel } = element.props;\r\n\r\n const valStr = childValue !== undefined ? String(childValue) : \"\";\r\n let labelStr = valStr;\r\n if (typeof childLabel === 'string' || typeof childLabel === 'number') {\r\n labelStr = String(childLabel);\r\n } else if (valStr) {\r\n labelStr = valStr;\r\n }\r\n\r\n if (valStr || labelStr) {\r\n results.push({ value: valStr, label: labelStr });\r\n }\r\n }\r\n });\r\n return results;\r\n }, [children]);\r\n\r\n // --- State ---\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState(\"\");\r\n const [highlightedIndex, setHighlightedIndex] = useState(0);\r\n\r\n // --- Refs ---\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const visibleInputRef = useRef<HTMLInputElement>(null);\r\n const listRef = useRef<HTMLUListElement>(null);\r\n const lastValueRef = useRef<string>(restProps.value !== undefined ? String(restProps.value) : \"\");\r\n\r\n // --- 2. Синхронизация внешнего Value с внутренним ---\r\n useEffect(() => {\r\n if (restProps.value !== undefined) {\r\n const strValue = String(restProps.value);\r\n lastValueRef.current = strValue;\r\n const found = options.find(o => o.value === strValue);\r\n setSearchQuery(found ? found.label : strValue);\r\n }\r\n }, [restProps.value, options]);\r\n\r\n // --- Фильтрация ---\r\n const deferredQuery = useDeferredValue(searchQuery);\r\n\r\n const filteredOptions = useMemo(() => {\r\n if (!isOpen) return options;\r\n const lowerQuery = deferredQuery.toLowerCase();\r\n return options.filter(opt => opt.label.toLowerCase().includes(lowerQuery));\r\n }, [options, deferredQuery, isOpen]);\r\n\r\n const showCreateOption = useMemo(() => {\r\n if (!allowCreate) return false;\r\n if (!deferredQuery.trim()) return false;\r\n const exactMatch = filteredOptions.find(opt => opt.label.toLowerCase() === deferredQuery.toLowerCase());\r\n return !exactMatch;\r\n }, [deferredQuery, filteredOptions, allowCreate]);\r\n\r\n const renderList = useMemo(() => {\r\n const list = filteredOptions.slice(0, 100);\r\n if (showCreateOption) {\r\n list.push({ value: deferredQuery, label: deferredQuery, isNew: true });\r\n }\r\n return list;\r\n }, [filteredOptions, showCreateOption, deferredQuery]);\r\n\r\n // --- Обработчики ---\r\n const triggerChange = (newValue: string) => {\r\n lastValueRef.current = newValue;\r\n if (restProps.onChange) {\r\n const syntheticEvent = {\r\n target: { name: restProps.name || \"\", value: newValue },\r\n };\r\n restProps.onChange(syntheticEvent);\r\n }\r\n };\r\n\r\n const handleSelect = (option: IOptionData) => {\r\n triggerChange(option.value);\r\n setSearchQuery(option.label);\r\n setIsOpen(false);\r\n setHighlightedIndex(0);\r\n };\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n triggerChange(\"\");\r\n setSearchQuery(\"\");\r\n visibleInputRef.current?.focus();\r\n };\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n const effectiveValue = restProps.value !== undefined ? String(restProps.value) : lastValueRef.current;\r\n\r\n if (effectiveValue) {\r\n const found = options.find(o => o.value === effectiveValue);\r\n setSearchQuery(found ? found.label : effectiveValue);\r\n } else {\r\n setSearchQuery(\"\");\r\n }\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [restProps.value, options]);\r\n\r\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\r\n if (restOnKeyDown) restOnKeyDown(e);\r\n\r\n if (e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n if (!isOpen) setIsOpen(true);\r\n else setHighlightedIndex(prev => prev < renderList.length - 1 ? prev + 1 : prev);\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n setHighlightedIndex(prev => prev > 0 ? prev - 1 : prev);\r\n } else if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (isOpen && renderList[highlightedIndex]) {\r\n handleSelect(renderList[highlightedIndex]);\r\n } else {\r\n setIsOpen(true);\r\n }\r\n } else if (e.key === \"Escape\") {\r\n setIsOpen(false);\r\n visibleInputRef.current?.blur();\r\n }\r\n };\r\n\r\n // --- Стили и ID ---\r\n const baseStyle: CSSProperties = {\r\n width: fullWidth ? '100%' : width || 'fit-content',\r\n height: height || 'auto',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n };\r\n\r\n const mergedStyle = { ...baseStyle, ...st };\r\n const inputId = restProps.id || `search-select-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n const hasValue = restProps.value !== undefined ? !!String(restProps.value) : !!lastValueRef.current;\r\n const currentValStr = restProps.value !== undefined ? String(restProps.value) : lastValueRef.current;\r\n\r\n return (\r\n <div\r\n className={`f-form-element ${styles['f-search-select']} ${restProps.className || ''}`}\r\n style={mergedStyle}\r\n ref={containerRef}\r\n id={inputId + '-block'}\r\n >\r\n {label && (\r\n <label\r\n id={inputId + '-label'}\r\n htmlFor={inputId}\r\n className={`f-form-element__label ${errText ? 'error' : ''}`}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n name={restProps.name}\r\n value={restProps.value !== undefined ? String(restProps.value) : \"\"}\r\n onChange={() => { }}\r\n className={styles['f-select-native-hidden']}\r\n tabIndex={-1}\r\n disabled={disabled}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <div className={`f-form-element__control ${load ? 'is-loading' : ''}`}>\r\n <input\r\n ref={visibleInputRef}\r\n id={inputId}\r\n type=\"text\"\r\n autoComplete=\"off\"\r\n className={`f-form-element__control-element ${styles['has-icons']} ${errText ? 'error' : ''}`}\r\n\r\n {...restProps}\r\n\r\n disabled={disabled || load}\r\n value={searchQuery}\r\n\r\n onChange={(e) => {\r\n const val = e.target.value;\r\n setSearchQuery(val);\r\n if (!isOpen) setIsOpen(true);\r\n if (allowCreate) {\r\n triggerChange(val);\r\n } else if (val === \"\") {\r\n triggerChange(\"\");\r\n }\r\n }}\r\n\r\n onKeyDown={handleKeyDown}\r\n onFocus={(e) => {\r\n if (!disabled && !load) setIsOpen(true);\r\n if (restOnFocus) restOnFocus(e);\r\n }}\r\n />\r\n\r\n {load ?\r\n <span className={'f-form-element__loader'}>\r\n <FLoadIcon size={10} />\r\n </span>\r\n :\r\n <div className={styles['f-select-actions']}>\r\n {hasValue && !disabled && (\r\n <div\r\n onClick={handleClear}\r\n className={`${styles['f-select-icon']} close`}\r\n title=\"Очистить\"\r\n onMouseDown={(e) => e.preventDefault()}\r\n >\r\n <CloseIcon />\r\n </div>\r\n )}\r\n <div className={`${styles['f-select-icon']} ${isOpen ? styles['rotate'] : ''}`}>\r\n <ChevronIcon />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n {\r\n isOpen && !disabled && !load && (\r\n <div className={styles['f-select-dropdown']}>\r\n <ul ref={listRef} className={styles['f-select-list']}>\r\n {renderList.length === 0 ? (\r\n <li className={styles['f-select-no-results']}>\r\n {allowCreate ? 'Нет данных' : 'Совпадений не найдено'}\r\n </li>\r\n ) : (\r\n renderList.map((option, index) => (\r\n <li\r\n key={option.value + index}\r\n className={`\r\n ${styles['f-select-option']} \r\n ${option.isNew ? styles['f-select-create'] : ''} \r\n ${index === highlightedIndex ? styles['focused'] : ''} \r\n ${currentValStr === option.value ? styles['selected'] : ''}\r\n `}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleSelect(option);\r\n }}\r\n onMouseEnter={() => setHighlightedIndex(index)}\r\n >\r\n <div style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {option.isNew && <span style={{ marginRight: 4 }}><PlusIcon /></span>}\r\n <HighlightedText text={option.label} highlight={deferredQuery} />\r\n {option.isNew && <span style={{ opacity: 0.6, fontSize: '0.85em', marginLeft: 6 }}>(Создать)</span>}\r\n </div>\r\n </li>\r\n ))\r\n )}\r\n </ul>\r\n </div>\r\n )\r\n }\r\n\r\n {helpText && (\r\n <p\r\n id={inputId + '-helptext'}\r\n className={'f-form-element__helptext'}\r\n >\r\n {helpText}\r\n </p>\r\n )}\r\n {(typeof errText === 'string' && errText) && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n <p\r\n id={`${inputId}-errortext`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {errText}\r\n </p>\r\n </div>\r\n )}\r\n {errText && errText.length > 0 && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n {typeof errText !== 'string' && errText.map((error, index) => (\r\n <p\r\n key={index}\r\n id={`${inputId}-errortext-${index}`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {error}\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div >\r\n );\r\n }\r\n);\r\n\r\nFSearchableSelect.displayName = \"FSearchableSelect\";\r\nexport default FSearchableSelect;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FPlusIcon.\r\n * @interface IFPlusIcon\r\n */\r\nexport interface IFPlusIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FPlusIcon представляет собой SVG иконку плюса с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FPlusIcon\r\n * @param {IFPlusIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FPlusIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FPlusIcon = React.forwardRef<SVGSVGElement, IFPlusIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n className,\r\n id,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n onClick={handleClick}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n id={id}\r\n width={size}\r\n style={st}\r\n focusable=\"false\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFPlusIcon.displayName = 'FPlusIcon';\r\n\r\nexport default FPlusIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FCheckIcon.\r\n * @interface IFCheckIcon\r\n */\r\nexport interface IFCheckIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FCheckIcon представляет собой SVG иконку галочки с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FCheckIcon\r\n * @param {IFCheckIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FCheckIcon\r\n * color=\"success\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FCheckIcon = React.forwardRef<SVGSVGElement, IFCheckIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n viewBox=\"0 0 16 16\"\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n id={id}\r\n onClick={handleClick}\r\n style={st}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path clipRule=\"evenodd\"\r\n d=\"M15.4142 4.41421L6 13.8284L0.585785 8.41421L3.41421 5.58578L6 8.17157L12.5858 1.58578L15.4142 4.41421Z\"\r\n fillRule=\"evenodd\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFCheckIcon.displayName = 'FCheckIcon';\r\n\r\nexport default FCheckIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FListIcon.\r\n * @interface IFListIcon\r\n */\r\nexport interface IFListIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties,\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string,\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string,\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void,\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FListIcon представляет собой SVG иконку списка с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FListIcon\r\n * @param {IFListIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FListIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FListIcon = React.forwardRef<SVGSVGElement, IFListIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n id={id}\r\n onClick={handleClick}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M14.5 3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-13a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h13zm-13-1A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2h-13z\" />\r\n <path\r\n d=\"M5 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 5 8zm0-2.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm0 5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-1-5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zM4 8a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 2.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFListIcon.displayName = 'FListIcon';\r\n\r\nexport default FListIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FPenIcon.\r\n * @interface IFPenIcon\r\n*/\r\nexport interface IFPenIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FPenIcon представляет собой SVG иконку карандаша с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FPenIcon\r\n * @param {IFPenIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FPenIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n*/\r\nconst FPenIcon = React.forwardRef<SVGSVGElement, IFPenIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClick, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0 0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168l10-10zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207 11.207 2.5zm1.586 3L10.5 3.207 4 9.707V10h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.293l6.5-6.5zm-9.761 5.175-.106.106-1.528 3.821 3.821-1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFPenIcon.displayName = 'FPenIcon';\r\n\r\nexport default FPenIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FDownloadIcon.\r\n * @interface IFDownloadIcon\r\n */\r\nexport interface IFDownloadIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FDownloadIcon представляет собой SVG иконку загрузки с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FDownloadIcon\r\n * @param {IFDownloadIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FDownloadIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FDownloadIcon = React.forwardRef<SVGSVGElement, IFDownloadIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n\r\n return (\r\n <svg\r\n ref={ref}\r\n style={st}\r\n id={id}\r\n width={size}\r\n onClick={handleClick}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z\" />\r\n <path d=\"M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFDownloadIcon.displayName = 'FDownloadIcon';\r\n\r\nexport default FDownloadIcon;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FCopyAddIcon.\r\n * @interface IFCopyAddIcon\r\n */\r\nexport interface IFCopyAddIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FCopyAddIcon представляет собой SVG иконку копирования с плюсом с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FCopyAddIcon\r\n * @param {IFCopyAddIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FCopyAddIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FCopyAddIcon = React.forwardRef<SVGSVGElement, IFCopyAddIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClick, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 32 32\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M27.2,8.22H23.78V5.42A3.42,3.42,0,0,0,20.36,2H5.42A3.42,3.42,0,0,0,2,5.42V20.36a3.42,3.42,0,0,0,3.42,3.42h2.8V27.2A2.81,2.81,0,0,0,11,30H27.2A2.81,2.81,0,0,0,30,27.2V11A2.81,2.81,0,0,0,27.2,8.22ZM5.42,21.91a1.55,1.55,0,0,1-1.55-1.55V5.42A1.54,1.54,0,0,1,5.42,3.87H20.36a1.55,1.55,0,0,1,1.55,1.55v2.8H11A2.81,2.81,0,0,0,8.22,11V21.91ZM28.13,27.2a.93.93,0,0,1-.93.93H11a.93.93,0,0,1-.93-.93V11a.93.93,0,0,1,.93-.93H27.2a.93.93,0,0,1,.93.93Z\" />\r\n <path d=\"M24.09,18.18H20v-4a.93.93,0,1,0-1.86,0v4h-4a.93.93,0,0,0,0,1.86h4v4.05a.93.93,0,1,0,1.86,0V20h4.05a.93.93,0,1,0,0-1.86Z\" />\r\n\r\n </svg>\r\n );\r\n});\r\n\r\nFCopyAddIcon.displayName = 'FCopyAddIcon';\r\n\r\nexport default FCopyAddIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FUnlinkIcon.\r\n * @interface IFUnlinkIcon\r\n */\r\nexport interface IFUnlinkIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: React.SVGAttributes<SVGSVGElement>['width'];\r\n\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.SVGAttributes<SVGSVGElement>['style'];\r\n\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: React.SVGAttributes<SVGSVGElement>['id'];\r\n\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: React.SVGAttributes<SVGSVGElement>['className'];\r\n\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: React.DOMAttributes<SVGSVGElement>['onClick'];\r\n\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FUnlinkIcon представляет собой SVG иконку разрыва связи с возможностью настройки цвета, размера и обработки кликов.\r\n * \r\n * @function FUnlinkIcon\r\n * @param {IFUnlinkIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n * \r\n * @example\r\n * <FUnlinkIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n *\r\n */\r\nconst FUnlinkIcon = React.forwardRef<SVGSVGElement, IFUnlinkIcon>((\r\n {\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n }, ref\r\n) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"-0.5 0 25 25\"\r\n onClick={handleClick}\r\n id={id}\r\n fill={'none'}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M9.23993 17.55L7.95993 18.84C7.33993 19.47 6.51992 19.79 5.69992 19.79C4.87992 19.79 4.05994 19.47 3.43994 18.84C2.18994 17.58 2.18994 15.54 3.43994 14.29L4.70993 13.02L6.11993 11.6L8.82993 8.86\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M8.82996 3.86V6.86\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M5.32996 5.22L6.82996 7.81\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M9.23993 17.55L7.95993 18.84C7.33993 19.47 6.51992 19.79 5.69992 19.79C4.87992 19.79 4.05994 19.47 3.43994 18.84C2.18994 17.58 2.18994 15.54 3.43994 14.29L4.70993 13.02L6.11993 11.6L8.82993 8.86\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M14.7599 7.45L16.0399 6.16C16.6599 5.53 17.4799 5.21 18.2999 5.21C19.1199 5.21 19.9399 5.53 20.5599 6.16C21.8099 7.42 21.8099 9.46 20.5599 10.71L19.2899 11.98L17.8799 13.4L15.1699 16.14\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M12.33 5.22L10.83 7.81\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M15.1699 21.14V18.14\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M18.6699 19.79L17.1699 17.19\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M11.6699 19.79L13.1699 17.19\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFUnlinkIcon.displayName = 'FUnlinkIcon';\r\n\r\nexport default FUnlinkIcon;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FFilterIcon.\r\n * @interface IFFilterIcon\r\n */\r\nexport interface IFFilterIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FFilterIcon представляет собой SVG иконку фильтра с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FFilterIcon\r\n * @param {IFFilterIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FFilterIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FFilterIcon = React.forwardRef<SVGSVGElement, IFFilterIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClick, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n viewBox=\"0 0 24 24\"\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n id={id}\r\n onClick={handleClick}\r\n style={st}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path fillRule=\"nonzero\" d=\"M14 14v6l-4 2v-8L4 5V3h16v2l-6 9zM6.404 5L12 13.394 17.596 5H6.404z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFFilterIcon.displayName = 'FFilterIcon';\r\n\r\nexport default FFilterIcon;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FDocumentIcon.\r\n * @interface IFDocumentIcon\r\n */\r\nexport interface IFDocumentIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void\r\n /**\r\n * Тип файла для отображения соответствующего значка.\r\n * @type {('check' | 'download' | 'upload' | 'close' | 'excel' | 'doc' | 'docx' | 'pdf' | 'jpg' | 'png' | 'txt')}\r\n */\r\n file?: 'check' | 'download' | 'upload' | 'close' | 'excel' | 'doc' | 'docx' | 'pdf' | 'jpg' | 'png' | 'txt'\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FDocumentIcon представляет собой SVG иконку документа с возможностью настройки цвета, размера, типа файла и обработки кликов.\r\n *\r\n * @function FDocumentIcon\r\n * @param {IFDocumentIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {('check' | 'download' | 'upload' | 'close' | 'excel' | 'doc' | 'docx' | 'pdf' | 'jpg' | 'png' | 'txt')} [file] - Тип файла для отображения соответствующего значка.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FDocumentIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * file=\"pdf\"\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FDocumentIcon = React.forwardRef<SVGSVGElement, IFDocumentIcon>(({\r\n color = \"primary\",\r\n size = 30,\r\n st,\r\n id,\r\n file,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n onClick={handleClick}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n {!file && <path d=\"M14 4.5V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h5.5L14 4.5zm-3 0A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V4.5h-2z\" />}\r\n {file === 'check' && <>\r\n <path d=\"M10.854 7.854a.5.5 0 0 0-.708-.708L7.5 9.793 6.354 8.646a.5.5 0 1 0-.708.708l1.5 1.5a.5.5 0 0 0 .708 0l3-3z\" />\r\n <path d=\"M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z\" />\r\n </>}\r\n {file === 'close' && <>\r\n <path d=\"M6.854 7.146a.5.5 0 1 0-.708.708L7.293 9l-1.147 1.146a.5.5 0 0 0 .708.708L8 9.707l1.146 1.147a.5.5 0 0 0 .708-.708L8.707 9l1.147-1.146a.5.5 0 0 0-.708-.708L8 8.293 6.854 7.146z\" />\r\n <path d=\"M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z\" />\r\n </>}\r\n {file === 'download' && <>\r\n <path d=\"M8.5 6.5a.5.5 0 0 0-1 0v3.793L6.354 9.146a.5.5 0 1 0-.708.708l2 2a.5.5 0 0 0 .708 0l2-2a.5.5 0 0 0-.708-.708L8.5 10.293V6.5z\" />\r\n <path d=\"M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z\" />\r\n </>}\r\n {file === 'upload' && <>\r\n <path d=\"M8 11a.5.5 0 0 0 .5-.5V6.707l1.146 1.147a.5.5 0 0 0 .708-.708l-2-2a.5.5 0 0 0-.708 0l-2 2a.5.5 0 1 0 .708.708L7.5 6.707V10.5a.5.5 0 0 0 .5.5z\" />\r\n <path d=\"M4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H4zm0 1h8a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1z\" />\r\n </>}\r\n {file === 'excel' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V11h-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5ZM7.86 14.841a1.13 1.13 0 0 0 .401.823c.13.108.29.192.479.252.19.061.411.091.665.091.338 0 .624-.053.858-.158.237-.105.416-.252.54-.44a1.17 1.17 0 0 0 .187-.656c0-.224-.045-.41-.135-.56a1.002 1.002 0 0 0-.375-.357 2.028 2.028 0 0 0-.565-.21l-.621-.144a.97.97 0 0 1-.405-.176.37.37 0 0 1-.143-.299c0-.156.061-.284.184-.384.125-.101.296-.152.513-.152.143 0 .266.023.37.068a.624.624 0 0 1 .245.181.56.56 0 0 1 .12.258h.75a1.093 1.093 0 0 0-.199-.566 1.21 1.21 0 0 0-.5-.41 1.813 1.813 0 0 0-.78-.152c-.293 0-.552.05-.777.15-.224.099-.4.24-.527.421-.127.182-.19.395-.19.639 0 .201.04.376.123.524.082.149.199.27.351.367.153.095.332.167.54.213l.618.144c.207.049.36.113.462.193a.387.387 0 0 1 .153.326.512.512 0 0 1-.085.29.558.558 0 0 1-.255.193c-.111.047-.25.07-.413.07-.117 0-.224-.013-.32-.04a.837.837 0 0 1-.249-.115.578.578 0 0 1-.255-.384h-.764Zm-3.726-2.909h.893l-1.274 2.007 1.254 1.992h-.908l-.85-1.415h-.035l-.853 1.415H1.5l1.24-2.016-1.228-1.983h.931l.832 1.438h.036l.823-1.438Zm1.923 3.325h1.697v.674H5.266v-3.999h.791v3.325Zm7.636-3.325h.893l-1.274 2.007 1.254 1.992h-.908l-.85-1.415h-.035l-.853 1.415h-.861l1.24-2.016-1.228-1.983h.931l.832 1.438h.036l.823-1.438Z\" />\r\n </>}\r\n {file === 'doc' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2v-1a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5Zm-7.839 9.166v.522c0 .256-.039.47-.117.641a.861.861 0 0 1-.322.387.877.877 0 0 1-.469.126.883.883 0 0 1-.471-.126.868.868 0 0 1-.32-.386 1.55 1.55 0 0 1-.117-.642v-.522c0-.257.04-.471.117-.641a.868.868 0 0 1 .32-.387.868.868 0 0 1 .471-.129c.176 0 .332.043.469.13a.861.861 0 0 1 .322.386c.078.17.117.384.117.641Zm.803.519v-.513c0-.377-.068-.7-.205-.972a1.46 1.46 0 0 0-.589-.63c-.254-.147-.56-.22-.917-.22-.355 0-.662.073-.92.22a1.441 1.441 0 0 0-.589.627c-.136.271-.205.596-.205.975v.513c0 .375.069.7.205.973.137.271.333.48.59.627.257.144.564.216.92.216.357 0 .662-.072.916-.216.256-.147.452-.356.59-.627.136-.274.204-.598.204-.973ZM0 11.926v4h1.459c.402 0 .735-.08.999-.238a1.45 1.45 0 0 0 .595-.689c.13-.3.196-.662.196-1.084 0-.42-.065-.778-.196-1.075a1.426 1.426 0 0 0-.59-.68c-.263-.156-.598-.234-1.004-.234H0Zm.791.645h.563c.248 0 .45.05.609.152a.89.89 0 0 1 .354.454c.079.201.118.452.118.753a2.3 2.3 0 0 1-.068.592 1.141 1.141 0 0 1-.196.422.8.8 0 0 1-.334.252 1.298 1.298 0 0 1-.483.082H.79V12.57Zm7.422.483a1.732 1.732 0 0 0-.103.633v.495c0 .246.034.455.103.627a.834.834 0 0 0 .298.393.845.845 0 0 0 .478.131.868.868 0 0 0 .401-.088.699.699 0 0 0 .273-.248.8.8 0 0 0 .117-.364h.765v.076a1.268 1.268 0 0 1-.226.674c-.137.194-.32.345-.55.454a1.81 1.81 0 0 1-.786.164c-.36 0-.664-.072-.914-.216a1.424 1.424 0 0 1-.571-.627c-.13-.272-.194-.597-.194-.976v-.498c0-.379.066-.705.197-.978.13-.274.321-.485.571-.633.252-.149.556-.223.911-.223.219 0 .421.032.607.097.187.062.35.153.489.272a1.326 1.326 0 0 1 .466.964v.073H9.78a.85.85 0 0 0-.12-.38.7.7 0 0 0-.273-.261.802.802 0 0 0-.398-.097.814.814 0 0 0-.475.138.868.868 0 0 0-.301.398Z\" />\r\n </>}\r\n {file === 'docx' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V11h-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5Zm-6.839 9.688v-.522a1.54 1.54 0 0 0-.117-.641.861.861 0 0 0-.322-.387.862.862 0 0 0-.469-.129.868.868 0 0 0-.471.13.868.868 0 0 0-.32.386 1.54 1.54 0 0 0-.117.641v.522c0 .256.04.47.117.641a.868.868 0 0 0 .32.387.883.883 0 0 0 .471.126.877.877 0 0 0 .469-.126.861.861 0 0 0 .322-.386 1.55 1.55 0 0 0 .117-.642Zm.803-.516v.513c0 .375-.068.7-.205.973a1.47 1.47 0 0 1-.589.627c-.254.144-.56.216-.917.216a1.86 1.86 0 0 1-.92-.216 1.463 1.463 0 0 1-.589-.627 2.151 2.151 0 0 1-.205-.973v-.513c0-.379.069-.704.205-.975.137-.274.333-.483.59-.627.257-.147.564-.22.92-.22.357 0 .662.073.916.22.256.146.452.356.59.63.136.271.204.595.204.972ZM1 15.925v-3.999h1.459c.406 0 .741.078 1.005.235.264.156.46.382.589.68.13.296.196.655.196 1.074 0 .422-.065.784-.196 1.084-.131.301-.33.53-.595.689-.264.158-.597.237-.999.237H1Zm1.354-3.354H1.79v2.707h.563c.185 0 .346-.028.483-.082a.8.8 0 0 0 .334-.252c.088-.114.153-.254.196-.422a2.3 2.3 0 0 0 .068-.592c0-.3-.04-.552-.118-.753a.89.89 0 0 0-.354-.454c-.158-.102-.361-.152-.61-.152Zm6.756 1.116c0-.248.034-.46.103-.633a.868.868 0 0 1 .301-.398.814.814 0 0 1 .475-.138c.15 0 .283.032.398.097a.7.7 0 0 1 .273.26.85.85 0 0 1 .12.381h.765v-.073a1.33 1.33 0 0 0-.466-.964 1.44 1.44 0 0 0-.49-.272 1.836 1.836 0 0 0-.606-.097c-.355 0-.66.074-.911.223-.25.148-.44.359-.571.633-.131.273-.197.6-.197.978v.498c0 .379.065.704.194.976.13.271.321.48.571.627.25.144.555.216.914.216.293 0 .555-.054.785-.164.23-.11.414-.26.551-.454a1.27 1.27 0 0 0 .226-.674v-.076h-.765a.8.8 0 0 1-.117.364.699.699 0 0 1-.273.248.874.874 0 0 1-.401.088.845.845 0 0 1-.478-.131.834.834 0 0 1-.298-.393 1.7 1.7 0 0 1-.103-.627v-.495Zm5.092-1.76h.894l-1.275 2.006 1.254 1.992h-.908l-.85-1.415h-.035l-.852 1.415h-.862l1.24-2.015-1.228-1.984h.932l.832 1.439h.035l.823-1.439Z\" />\r\n </>}\r\n {file === 'pdf' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2h-1v-1h1a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5ZM1.6 11.85H0v3.999h.791v-1.342h.803c.287 0 .531-.057.732-.173.203-.117.358-.275.463-.474a1.42 1.42 0 0 0 .161-.677c0-.25-.053-.476-.158-.677a1.176 1.176 0 0 0-.46-.477c-.2-.12-.443-.179-.732-.179Zm.545 1.333a.795.795 0 0 1-.085.38.574.574 0 0 1-.238.241.794.794 0 0 1-.375.082H.788V12.48h.66c.218 0 .389.06.512.181.123.122.185.296.185.522Zm1.217-1.333v3.999h1.46c.401 0 .734-.08.998-.237a1.45 1.45 0 0 0 .595-.689c.13-.3.196-.662.196-1.084 0-.42-.065-.778-.196-1.075a1.426 1.426 0 0 0-.589-.68c-.264-.156-.599-.234-1.005-.234H3.362Zm.791.645h.563c.248 0 .45.05.609.152a.89.89 0 0 1 .354.454c.079.201.118.452.118.753a2.3 2.3 0 0 1-.068.592 1.14 1.14 0 0 1-.196.422.8.8 0 0 1-.334.252 1.298 1.298 0 0 1-.483.082h-.563v-2.707Zm3.743 1.763v1.591h-.79V11.85h2.548v.653H7.896v1.117h1.606v.638H7.896Z\" />\r\n </>}\r\n {file === 'jpg' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2h-1v-1h1a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5Zm-4.34 8.132c.076.153.123.317.14.492h-.776a.797.797 0 0 0-.097-.249.689.689 0 0 0-.17-.19.707.707 0 0 0-.237-.126.96.96 0 0 0-.299-.044c-.285 0-.507.1-.665.302-.156.201-.234.484-.234.85v.498c0 .234.032.439.097.615a.881.881 0 0 0 .304.413.87.87 0 0 0 .519.146.967.967 0 0 0 .457-.096.67.67 0 0 0 .272-.264c.06-.11.091-.23.091-.363v-.255H8.24v-.59h1.576v.798c0 .193-.032.377-.097.55a1.29 1.29 0 0 1-.293.458 1.37 1.37 0 0 1-.495.313c-.197.074-.43.111-.697.111a1.98 1.98 0 0 1-.753-.132 1.447 1.447 0 0 1-.533-.377 1.58 1.58 0 0 1-.32-.58 2.482 2.482 0 0 1-.105-.745v-.506c0-.362.066-.678.2-.95.134-.271.328-.482.582-.633.256-.152.565-.228.926-.228.238 0 .45.033.636.1.187.066.347.158.48.275.133.117.238.253.314.407ZM0 14.786c0 .164.027.319.082.465.055.147.136.277.243.39.11.113.245.202.407.267.164.062.354.093.569.093.42 0 .748-.115.984-.345.238-.23.358-.566.358-1.005v-2.725h-.791v2.745c0 .202-.046.357-.138.466-.092.11-.233.164-.422.164a.499.499 0 0 1-.454-.246.577.577 0 0 1-.073-.27H0Zm4.92-2.86H3.322v4h.791v-1.343h.803c.287 0 .531-.057.732-.172.203-.118.358-.276.463-.475.108-.201.161-.427.161-.677 0-.25-.052-.475-.158-.677a1.176 1.176 0 0 0-.46-.477c-.2-.12-.443-.179-.732-.179Zm.546 1.333a.795.795 0 0 1-.085.381.574.574 0 0 1-.238.24.794.794 0 0 1-.375.082H4.11v-1.406h.66c.218 0 .389.06.512.182.123.12.185.295.185.521Z\" />\r\n </>}\r\n {file === 'png' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2v-1a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5Zm-3.76 8.132c.076.153.123.317.14.492h-.776a.797.797 0 0 0-.097-.249.689.689 0 0 0-.17-.19.707.707 0 0 0-.237-.126.96.96 0 0 0-.299-.044c-.285 0-.506.1-.665.302-.156.201-.234.484-.234.85v.498c0 .234.032.439.097.615a.881.881 0 0 0 .304.413.87.87 0 0 0 .519.146.967.967 0 0 0 .457-.096.67.67 0 0 0 .272-.264c.06-.11.091-.23.091-.363v-.255H8.82v-.59h1.576v.798c0 .193-.032.377-.097.55a1.29 1.29 0 0 1-.293.458 1.37 1.37 0 0 1-.495.313c-.197.074-.43.111-.697.111a1.98 1.98 0 0 1-.753-.132 1.447 1.447 0 0 1-.533-.377 1.58 1.58 0 0 1-.32-.58 2.482 2.482 0 0 1-.105-.745v-.506c0-.362.067-.678.2-.95.134-.271.328-.482.582-.633.256-.152.565-.228.926-.228.238 0 .45.033.636.1.187.066.347.158.48.275.133.117.238.253.314.407Zm-8.64-.706H0v4h.791v-1.343h.803c.287 0 .531-.057.732-.172.203-.118.358-.276.463-.475a1.42 1.42 0 0 0 .161-.677c0-.25-.053-.475-.158-.677a1.176 1.176 0 0 0-.46-.477c-.2-.12-.443-.179-.732-.179Zm.545 1.333a.795.795 0 0 1-.085.381.574.574 0 0 1-.238.24.794.794 0 0 1-.375.082H.788v-1.406h.66c.218 0 .389.06.512.182.123.12.185.295.185.521Zm1.964 2.666V13.25h.032l1.761 2.675h.656v-3.999h-.75v2.66h-.032l-1.752-2.66h-.662v4h.747Z\" />\r\n </>}\r\n {file === 'txt' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2h-2v-1h2a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5ZM1.928 15.849v-3.337h1.136v-.662H0v.662h1.134v3.337h.794Zm4.689-3.999h-.894L4.9 13.289h-.035l-.832-1.439h-.932l1.228 1.983-1.24 2.016h.862l.853-1.415h.035l.85 1.415h.907l-1.253-1.992 1.274-2.007Zm1.93.662v3.337h-.794v-3.337H6.619v-.662h3.064v.662H8.546Z\" />\r\n </>}\r\n </svg>\r\n );\r\n});\r\n\r\nFDocumentIcon.displayName = 'FDocumentIcon';\r\n\r\nexport default FDocumentIcon","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FReloadIcon.\r\n * @interface IFReloadIcon\r\n */\r\nexport interface IFReloadIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FReloadIcon представляет собой SVG иконку обновления с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FReloadIcon\r\n * @param {IFReloadIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FReloadIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FReloadIcon = React.forwardRef<SVGSVGElement, IFReloadIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n className,\r\n id,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2z\" />\r\n <path d=\"M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFReloadIcon.displayName = 'FReloadIcon';\r\n\r\nexport default FReloadIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FMinusIcon.\r\n * @interface IFMinusIcon\r\n */\r\nexport interface IFMinusIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FMinusIcon представляет собой SVG иконку минуса с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FMinusIcon\r\n * @param {IFMinusIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FMinusIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n*/\r\nconst FMinusIcon = React.forwardRef<SVGSVGElement, IFMinusIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n className,\r\n id,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\" />\r\n <path d=\"M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFMinusIcon.displayName = 'FMinusIcon';\r\n\r\nexport default FMinusIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FInfoCircleIcon.\r\n * @interface IFInfoCircleIcon\r\n*/\r\nexport interface IFInfoCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties,\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string,\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string,\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void,\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FInfoCircleIcon представляет собой SVG иконку информации с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FInfoCircleIcon\r\n * @param {IFInfoCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FInfoCircleIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FInfoCircleIcon = React.forwardRef<SVGSVGElement, IFInfoCircleIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClick, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\" />\r\n <path d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFInfoCircleIcon.displayName = 'FInfoCircleIcon';\r\n\r\nexport default FInfoCircleIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FSafeIcon.\r\n * @interface IFSafeIcon\r\n */\r\nexport interface IFSafeIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: React.SVGAttributes<SVGSVGElement>['width'];\r\n\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.SVGAttributes<SVGSVGElement>['style'];\r\n\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: React.SVGAttributes<SVGSVGElement>['id'];\r\n\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: React.SVGAttributes<SVGSVGElement>['className'];\r\n\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: React.DOMAttributes<SVGSVGElement>['onClick'];\r\n\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FSafeIcon представляет собой SVG иконку сейфа с возможностью настройки цвета, размера и обработки кликов.\r\n * \r\n * @function FSafeIcon\r\n * @param {IFSafeIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n * \r\n * @example\r\n * <FSafeIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n *\r\n */\r\n\r\nconst FSafeIcon = React.forwardRef<SVGSVGElement, IFSafeIcon>((\r\n {\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n }, ref\r\n) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M1 1.5A1.5 1.5 0 0 1 2.5 0h12A1.5 1.5 0 0 1 16 1.5v13a1.5 1.5 0 0 1-1.5 1.5h-12A1.5 1.5 0 0 1 1 14.5V13H.5a.5.5 0 0 1 0-1H1V8.5H.5a.5.5 0 0 1 0-1H1V4H.5a.5.5 0 0 1 0-1H1zM2.5 1a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5h12a.5.5 0 0 0 .5-.5v-13a.5.5 0 0 0-.5-.5z\" />\r\n <path d=\"M13.5 6a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-1 0v-3a.5.5 0 0 1 .5-.5M4.828 4.464a.5.5 0 0 1 .708 0l1.09 1.09a3 3 0 0 1 3.476 0l1.09-1.09a.5.5 0 1 1 .707.708l-1.09 1.09c.74 1.037.74 2.44 0 3.476l1.09 1.09a.5.5 0 1 1-.707.708l-1.09-1.09a3 3 0 0 1-3.476 0l-1.09 1.09a.5.5 0 1 1-.708-.708l1.09-1.09a3 3 0 0 1 0-3.476l-1.09-1.09a.5.5 0 0 1 0-.708M6.95 6.586a2 2 0 1 0 2.828 2.828A2 2 0 0 0 6.95 6.586\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFSafeIcon.displayName = 'FSafeIcon';\r\n\r\nexport default FSafeIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowRightCircleIcon.\r\n * @interface IFArrowRightCircleIcon\r\n */\r\nexport interface IFArrowRightCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowRightCircleIcon представляет собой SVG иконку стрелки вправо в круге с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FArrowRightCircleIcon\r\n * @param {IFArrowRightCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowRightCircleIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClick={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FArrowRightCircleIcon = React.forwardRef<SVGSVGElement, IFArrowRightCircleIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M4.5 7.5a.5.5 0 0 0 0 1h5.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowRightCircleIcon.displayName = 'FArrowRightCircleIcon';\r\n\r\nexport default FArrowRightCircleIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowLeftCircleIcon.\r\n * @interface IFArrowLeftCircleIcon\r\n */\r\nexport interface IFArrowLeftCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowLeftCircleIcon представляет собой SVG иконку стрелки влево в круге с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FArrowLeftCircleIcon\r\n * @param {IFArrowLeftCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowLeftCircleIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClick={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FArrowLeftCircleIcon = React.forwardRef<SVGSVGElement, IFArrowLeftCircleIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-4.5-.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowLeftCircleIcon.displayName = 'FArrowLeftCircleIcon';\r\n\r\nexport default FArrowLeftCircleIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowUpCircleIcon.\r\n * @interface IFArrowUpCircleIcon\r\n */\r\nexport interface IFArrowUpCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowUpCircleIcon представляет собой SVG иконку стрелки вверх в круге с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FArrowUpCircleIcon\r\n * @param {IFArrowUpCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowUpCircleIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClick={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FArrowUpCircleIcon = React.forwardRef<SVGSVGElement, IFArrowUpCircleIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-7.5 3.5a.5.5 0 0 1-1 0V5.707L5.354 7.854a.5.5 0 1 1-.708-.708l3-3a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708L8.5 5.707z\"/>\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowUpCircleIcon.displayName = 'FArrowUpCircleIcon';\r\n\r\nexport default FArrowUpCircleIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowDownCircleIcon.\r\n * @interface IFArrowDownCircleIcon\r\n */\r\nexport interface IFArrowDownCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowDownCircleIcon представляет собой SVG иконку стрелки влево в круге с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FArrowDownCircleIcon\r\n * @param {IFArrowDownCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowDownCircleIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClick={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FArrowDownCircleIcon = React.forwardRef<SVGSVGElement, IFArrowDownCircleIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowDownCircleIcon.displayName = 'FArrowDownCircleIcon';\r\n\r\nexport default FArrowDownCircleIcon;\r\n","import styles from './fAlert.module.scss';\r\nimport stylesBtn from \"../../material/FButton/FButton.module.scss\"\r\n\r\n/**\r\n * Интерфейс для настройки отображения модального уведомления.\r\n * @interface IfAlert\r\n */\r\nexport interface IfAlert {\r\n /**\r\n * Заголовок уведомления. Необязательный параметр.\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Основной текст уведомления. Обязательное поле.\r\n * Может содержать переносы строк (`\\n`), которые будут преобразованы в отдельные `<span>`.\r\n * @type {string}\r\n */\r\n body: string;\r\n\r\n /**\r\n * Тип уведомления. Определяет цветовую схему и иконку.\r\n * @type {'info' | 'error' | 'success' | 'warning'}\r\n */\r\n variant: 'info' | 'error' | 'success' | 'warning';\r\n}\r\n\r\n/**\r\n * Отображает модальное окно уведомления поверх текущей страницы.\r\n *\r\n * Уведомление добавляется через `insertAdjacentHTML` в `<body>`, имеет анимацию появления,\r\n * и может быть закрыто нажатием на кнопку \"Закрыть\".\r\n *\r\n * @function fAlert\r\n * @param {string} [title] - Заголовок уведомления.\r\n * @param {string} [body] - Текст уведомления (поддерживает переносы строк через `\\n`).\r\n * @param {'info' | 'error' | 'success' | 'warning'} [variant='info'] - Тип уведомления.\r\n * \r\n * @example\r\n * fAlert({\r\n * title: 'Успех',\r\n * body: 'Данные успешно сохранены.',\r\n * variant: 'success'\r\n * });\r\n *\r\n * @example\r\n * fAlert({\r\n * body: 'Ошибка сети\\\\nПроверьте соединение',\r\n * variant: 'error'\r\n * });\r\n */\r\nconst fAlert = ({ title, body, variant = 'info' }: IfAlert) => {\r\n\r\n let ico = ''\r\n\r\n switch (variant) {\r\n case 'info':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\"/>'\r\n break\r\n case \"success\":\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M10.97 4.97a.75.75 0 0 1 1.071 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.235.235 0 0 1 .02-.022z\"/>'\r\n break\r\n case 'error':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\"/>'\r\n break\r\n case 'warning':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M5.255 5.786a.237.237 0 0 0 .241.247h.825c.138 0 .248-.113.266-.25.09-.656.54-1.134 1.342-1.134.686 0 1.314.343 1.314 1.168 0 .635-.374.927-.965 1.371-.673.489-1.206 1.06-1.168 1.987l.003.217a.25.25 0 0 0 .25.246h.811a.25.25 0 0 0 .25-.25v-.105c0-.718.273-.927 1.01-1.486.609-.463 1.244-.977 1.244-2.056 0-1.511-1.276-2.241-2.673-2.241-1.267 0-2.655.59-2.75 2.286zm1.557 5.763c0 .533.425.927 1.01.927.609 0 1.028-.394 1.028-.927 0-.552-.42-.94-1.029-.94-.584 0-1.009.388-1.009.94z\"/>'\r\n break\r\n }\r\n\r\n const arrBody: string[] = []\r\n body.split('\\n').forEach(opt => {\r\n arrBody.push(`<span>${opt}</span>`)\r\n })\r\n\r\n window.document.body.insertAdjacentHTML(\r\n 'afterbegin',\r\n `\r\n <div class='${styles['f-function-block-alert']}' id='f-function-block-alert'>\r\n <div class='${styles['f-function-alert']}'>\r\n <div class='${styles['f-function-alert-ico']} ${styles[`${variant}-alert`]}' style='color: inherit; fill: inherit'>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n ${ico}\r\n </svg>\r\n </div>\r\n <div class='${styles['f-function-alert-inside']}'>\r\n <div class='${styles['f-function-alert-header']}'>\r\n <h4>${title || ''}</h4>\r\n </div>\r\n <div class='${styles['f-function-alert-body']}'>\r\n ${arrBody.join('')}\r\n </div>\r\n <div class='${styles['f-function-alert-footer']}'>\r\n <FButton\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-primary']}'\r\n onclick='document.querySelector(\"#f-function-block-alert\").remove()'\r\n >\r\n Закрыть\r\n </FButton>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n );\r\n}\r\n\r\nexport default fAlert;","import styles from './fConfirm.module.scss';\r\nimport stylesBtn from \"../../material/FButton/FButton.module.scss\"\r\n\r\n/**\r\n * Интерфейс параметров модального окна подтверждения.\r\n * @interface IfConfirm\r\n */\r\nexport interface IfConfirm {\r\n /**\r\n * Заголовок модального окна. Необязательный параметр.\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Основной текст сообщения, отображаемый в теле модального окна.\r\n * @type {string}\r\n */\r\n body: string;\r\n}\r\n\r\n/**\r\n * Отображает модальное окно подтверждения поверх текущей страницы.\r\n *\r\n * Функция добавляет HTML-элемент в `<body>`, отображая диалоговое окно с вопросом,\r\n * двумя кнопками (`Ок` и `Отменить`) и возвращает промис, который разрешается\r\n * значением `true` (при нажатии \"Ок\" или клавиши Enter) или `false` (при нажатии \"Отменить\").\r\n *\r\n * @function fConfirm\r\n * @param {string} [title] - Заголовок окна подтверждения.\r\n * @param {string} [body] - Текст сообщения, который будет отображен в теле окна.\r\n * \r\n * @returns {Promise<boolean>} Промис, который возвращает:\r\n * - `true` — если пользователь нажал \"Ок\" или Enter.\r\n * - `false` — если пользователь нажал \"Отменить\".\r\n * \r\n * @example\r\n * const result = await fConfirm({\r\n * title: 'Подтвердите действие',\r\n * body: 'Вы действительно хотите удалить запись?'\r\n * });\r\n * if (result) {\r\n * console.log('Пользователь согласился');\r\n * } else {\r\n * console.log('Пользователь отменил действие');\r\n * }\r\n */\r\nconst fConfirm = ({ title, body }: IfConfirm): Promise<boolean> => {\r\n return new Promise((resolve) => {\r\n // Вставляем HTML. Обрати внимание: убраны inline onclick attributes, \r\n // управление закрытием перенесено полностью в JS.\r\n window.document.body.insertAdjacentHTML(\r\n 'afterbegin',\r\n `\r\n <div class='${styles['f-function-block-confirm']}' id='f-function-block-confirm'>\r\n <div class='${styles['f-function-confirm']}'>\r\n <div class='${styles['f-function-confirm-ico']} ${styles.warning}'>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n <path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/>\r\n <path d=\"M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995z\"/>\r\n </svg>\r\n </div>\r\n <div class='${styles['f-function-confirm-inside']}'>\r\n <div class='${styles['f-function-confirm-header']}'>\r\n <h4>${title || ''}</h4>\r\n </div>\r\n <div class='${styles['f-function-confirm-body']}'>\r\n <span>${body}</span>\r\n </div>\r\n <div class='${styles['f-function-confirm-footer']}'>\r\n <button\r\n id=\"f-function-confirm-ok\"\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-success']}'\r\n >\r\n Ок\r\n </button>\r\n <button\r\n id=\"f-function-confirm-cancellation\"\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-danger']}'\r\n >\r\n Отменить\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n );\r\n\r\n const modalBlock = document.getElementById('f-function-block-confirm');\r\n const okBtn = document.getElementById('f-function-confirm-ok');\r\n const cancelBtn = document.getElementById('f-function-confirm-cancellation');\r\n\r\n /**\r\n * Функция очистки DOM и слушателей событий.\r\n * Вызывается перед разрешением промиса.\r\n */\r\n const closeModal = () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n okBtn?.removeEventListener('click', handleOk);\r\n cancelBtn?.removeEventListener('click', handleCancel);\r\n modalBlock?.remove();\r\n };\r\n\r\n const handleOk = () => {\r\n closeModal();\r\n resolve(true);\r\n };\r\n\r\n const handleCancel = () => {\r\n closeModal();\r\n resolve(false);\r\n };\r\n\r\n /**\r\n * Обработчик нажатия клавиш.\r\n */\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault(); // Предотвращаем стандартное действие, если нужно\r\n handleOk();\r\n }\r\n // Закрытие по Escape\r\n if (e.key === 'Escape') {\r\n handleCancel();\r\n }\r\n };\r\n\r\n // Навешиваем слушатели\r\n okBtn?.addEventListener('click', handleOk);\r\n cancelBtn?.addEventListener('click', handleCancel);\r\n window.addEventListener('keydown', handleKeyDown);\r\n });\r\n};\r\n\r\nexport default fConfirm;","import styles from './fPrompt.module.scss';\r\nimport stylesBtn from \"../../material/FButton/FButton.module.scss\"\r\n\r\n/**\r\n * Интерфейс параметров модального окна ввода.\r\n * @interface IfPrompt\r\n */\r\nexport interface IfPrompt {\r\n /**\r\n * Заголовок модального окна. Необязательный параметр.\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Текст сообщения, отображаемый над полем ввода. Необязательный параметр.\r\n * @type {string | undefined}\r\n */\r\n body?: string;\r\n}\r\n\r\n/**\r\n * Вспомогательная функция для получения значения из поля ввода.\r\n *\r\n * Если элемент существует, возвращает его значение (`input.value`),\r\n * иначе — `null`.\r\n *\r\n * @function getValue\r\n * @param {HTMLInputElement | null} element - HTMLInputElement или null.\r\n * @returns {string | null} Значение поля ввода или null, если элемент не найден.\r\n */\r\nexport function getValue(element: HTMLInputElement | null): string | null {\r\n if (element) {\r\n return element.value;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Отображает модальное окно с полем ввода и кнопками \"Ок\" и \"Отменить\".\r\n *\r\n * Функция возвращает промис, который разрешается:\r\n * - строкой с введённым текстом (если пользователь нажал \"Ок\"),\r\n * - `null` (если пользователь нажал \"Отменить\").\r\n *\r\n * Уведомление добавляется через `insertAdjacentHTML` в `<body>`.\r\n *\r\n * @function fPrompt\r\n * @param {string} [title] - Заголовок окна.\r\n * @param {string} [body] - Текст подсказки над полем ввода.\r\n *\r\n * @returns {Promise<string | null>} Промис, который возвращает:\r\n * - Введённую строку при нажатии \"Ок\".\r\n * - `null` при нажатии \"Отменить\".\r\n *\r\n * @example\r\n * const result = await fPrompt({\r\n * title: 'Введите имя',\r\n * body: 'Как вас зовут?'\r\n * });\r\n *\r\n * if (result !== null) {\r\n * console.log('Пользователь ввёл:', result);\r\n * } else {\r\n * console.log('Пользователь отменил ввод');\r\n * }\r\n */\r\nconst fPrompt = ({ title, body }: IfPrompt): Promise<string | null> => {\r\n return new Promise((resolve) => {\r\n window.document.body.insertAdjacentHTML(\r\n 'afterbegin',\r\n `\r\n <div class='${styles['f-function-block-prompt']}' id='f-function-block-prompt'>\r\n <div class='${styles['f-function-prompt']}'>\r\n <div class='${styles['f-function-prompt-ico']} ${styles.warning}'>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n <path d=\"M14 1a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-2.5a2 2 0 0 0-1.6.8L8 14.333 6.1 11.8a2 2 0 0 0-1.6-.8H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2.5a1 1 0 0 1 .8.4l1.9 2.533a1 1 0 0 0 1.6 0l1.9-2.533a1 1 0 0 1 .8-.4H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/>\r\n <path d=\"M5 6a1 1 0 1 1-2 0 1 1 0 0 1 2 0zm4 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0zm4 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\"/>\r\n </svg>\r\n </div>\r\n <div class='${styles['f-function-prompt-inside']}'>\r\n <div class='${styles['f-function-prompt-header']}'>\r\n <h4>${title || ''}</h4>\r\n </div>\r\n <div class='${styles['f-function-prompt-body']}'>\r\n <span>${body || ''}</span>\r\n <input \r\n type=\"text\" \r\n id=\"f-function-prompt-input\"\r\n class=\"form-control ${styles['f-function-prompt-input']}\"\r\n />\r\n </div>\r\n <div class='${styles['f-function-prompt-footer']}'>\r\n <button\r\n id=\"f-function-prompt-ok\"\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-success']}'\r\n onclick='document.querySelector(\"#f-function-block-prompt\").remove()'\r\n >\r\n Ок\r\n </button>\r\n <button\r\n id=\"f-function-prompt-cancellation\"\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-danger']}'\r\n onclick='document.querySelector(\"#f-function-block-prompt\").remove()'\r\n >\r\n Отменить\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n );\r\n\r\n const ok: HTMLButtonElement | null = document.querySelector('#f-function-prompt-ok')\r\n const cancellation: HTMLButtonElement | null = document.querySelector('#f-function-prompt-cancellation')\r\n const submit: HTMLInputElement | null = document.querySelector('#f-function-prompt-input')\r\n\r\n ok!.addEventListener('click', function () {\r\n resolve(getValue(submit));\r\n })\r\n cancellation!.addEventListener('click', function () {\r\n resolve(null);\r\n })\r\n\r\n });\r\n};\r\n\r\nexport default fPrompt;","// @ts-nocheck\r\nexport class TSZip{\r\n\tfiles: Array<ZipObject> = new Array();\r\n\troot: string = \"\";\r\n\tsignature = {\r\n\t LOCAL_FILE_HEADER : \"\\x50\\x4b\\x03\\x04\",\r\n\t CENTRAL_FILE_HEADER : \"\\x50\\x4b\\x01\\x02\",\r\n\t CENTRAL_DIRECTORY_END : \"\\x50\\x4b\\x05\\x06\",\r\n\t ZIP64_CENTRAL_DIRECTORY_LOCATOR : \"\\x50\\x4b\\x06\\x07\",\r\n\t ZIP64_CENTRAL_DIRECTORY_END : \"\\x50\\x4b\\x06\\x06\",\r\n\t DATA_DESCRIPTOR : \"\\x50\\x4b\\x07\\x08\"\r\n\t};\r\n\tcompressions: TSZipStore = new TSZipStore();\r\n\toptions = {\r\n base64: false,\r\n binary: false,\r\n dir: false,\r\n date: null\r\n };\r\n\r\n\r\n\tdefaults = {\r\n\t base64: false,\r\n\t binary: false,\r\n\t dir: false,\r\n\t date: null\r\n\t};\r\n\t\r\n\t// utils: TSZipUtils = new TSZipUtils();\r\n\t// support: TSZipSupport = new TSZipSupport();\r\n\t// Base64: TSZipBase64 = new TSZipBase64();\r\n\t\r\n\tconstructor(data:any = false, options:any = false) {\r\n\t\tif (data) {\r\n\t\t\tthis.load(data, options);\r\n\t\t}\r\n\t}\r\n\t\r\n\tstatic decToHex(dec, bytes) {\r\n\t\tlet hex = \"\", i;\r\n\t\tfor(i = 0; i < bytes; i++) {\r\n hex += String.fromCharCode(dec&0xff);\r\n dec=dec>>>8;\r\n\t\t}\r\n\t\treturn hex;\r\n\t}\r\n\t\r\n\textend(o0, o1: any = false) {\r\n let result = {}, i, attr;\r\n for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\r\n for (attr in arguments[i]) {\r\n if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\r\n result[attr] = arguments[i][attr];\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n \r\n\tprepareFileAttrs(o) {\r\n\t\to = o || {};\r\n\t\tif (o.base64 === true && o.binary == null) {\r\n\t\t\to.binary = true;\r\n\t\t}\r\n\t\to = this.extend(o, this.defaults);\r\n\t\to.date = o.date || new Date();\r\n\t\t\r\n\t\treturn o;\r\n\t}\r\n\t\r\n\tfileAdd(name, data, o) {\r\n\t\t// be sure sub folders exist\r\n\t\tlet parent = this.parentFolder(name);\r\n\t\tif (parent) {\r\n\t\t\tthis.folderAdd(parent);\r\n\t\t}\r\n\t\t\r\n\t\to = this.prepareFileAttrs(o);\r\n\t\t\r\n\t\tif (TSZipSupport.uint8array && data instanceof Uint8Array) {\r\n\t\t\to.base64 = false;\r\n\t\t\to.binary = true;\r\n\t\t\tdata = TSZipUtils.uint8Array2String(data);\r\n\t\t} else if (TSZipSupport.arraybuffer && data instanceof ArrayBuffer) {\r\n\t\t\to.base64 = false;\r\n\t\t\to.binary = true;\r\n\t\t\tlet bufferView = new Uint8Array(data);\r\n\t\t\tdata = TSZipUtils.uint8Array2String(bufferView);\r\n\t\t} else if (o.binary && !o.base64) {\r\n\t\t\t// optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask\r\n\t\t\tif (o.optimizedBinaryString !== true) {\r\n\t\t\t\t// this is a string, not in a base64 format.\r\n\t\t\t\t// Be sure that this is a correct \"binary string\"\r\n\t\t\t\tdata = TSZipUtils.string2binary(data);\r\n\t\t\t}\r\n\t\t\t// we remove this option since it's only relevant here\r\n\t\t\tdelete o.optimizedBinaryString;\r\n\t\t}\r\n\t\t\r\n\t\treturn this.files[name] = new ZipObject(name, data, o);\r\n\t}\r\n\t\r\n\tparentFolder(path) {\r\n\t\tif (path.slice(-1) == '/') {\r\n\t\t\tpath = path.substring(0, path.length - 1);\r\n\t\t}\r\n\t\tlet lastSlash = path.lastIndexOf('/');\r\n\t\treturn (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\r\n\t}\r\n\t\r\n\tfolderAdd (name) {\r\n\t\t// Check the name ends with a /\r\n\t\tif (name.slice(-1) != \"/\") {\r\n\t\t\tname += \"/\"; // IE doesn't like substr(-1)\r\n\t\t}\r\n\t\t\r\n\t\t// Does this folder already exist?\r\n\t\tif (!this.files[name]) {\r\n\t\t\t// be sure sub folders exist\r\n\t\t\tlet parent = this.parentFolder(name);\r\n\t\t\t//Вроде как для рекурсивной херни\r\n\t\t\tif (parent) {\r\n\t\t\t\tthis.folderAdd(parent);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.fileAdd(name, '', {dir:true});\r\n\t\t}\r\n\t\treturn this.files[name];\r\n }\r\n \r\n prepareLocalHeaderData(file, utfEncodedFileName, compressionType) {\r\n\t\tlet useUTF8 = utfEncodedFileName !== file.name,\r\n\t\t\tdata = file.asBinary(),\r\n\t\t\to = file.options,\r\n\t\t\tdosTime,\r\n\t\t\tdosDate;\r\n\t\r\n\t\t// date\r\n\t\t// @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\r\n\t\t// @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\r\n\t\t// @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\r\n\t\r\n\t\tdosTime = o.date.getHours();\r\n\t\tdosTime = dosTime << 6;\r\n\t\tdosTime = dosTime | o.date.getMinutes();\r\n\t\tdosTime = dosTime << 5;\r\n\t\tdosTime = dosTime | o.date.getSeconds() / 2;\r\n\t\r\n\t\tdosDate = o.date.getFullYear() - 1980;\r\n\t\tdosDate = dosDate << 4;\r\n\t\tdosDate = dosDate | (o.date.getMonth() + 1);\r\n\t\tdosDate = dosDate << 5;\r\n\t\tdosDate = dosDate | o.date.getDate();\r\n\t\r\n\t\tlet compressedData = this.compressions.compress(data);\r\n\t\r\n\t\tlet header = \"\";\r\n\t\r\n\t\t// version needed to extract\r\n\t\theader += \"\\x0A\\x00\";\r\n\t\t// general purpose bit flag\r\n\t\t// set bit 11 if utf8\r\n\t\theader += useUTF8 ? \"\\x00\\x08\" : \"\\x00\\x00\";\r\n\t\t// compression method\r\n\t\theader += this.compressions.magic;\r\n\t\t// last mod file time\r\n\t\theader += TSZip.decToHex(dosTime, 2);\r\n\t\t// last mod file date\r\n\t\theader += TSZip.decToHex(dosDate, 2);\r\n\t\t// crc-32\r\n\t\theader += TSZip.decToHex(TSZip.crc32(data), 4);\r\n\t\t// compressed size\r\n\t\theader += TSZip.decToHex(compressedData.length, 4);\r\n\t\t// uncompressed size\r\n\t\theader += TSZip.decToHex(data.length, 4);\r\n\t\t// file name length\r\n\t\theader += TSZip.decToHex(utfEncodedFileName.length, 2);\r\n\t\t// extra field length\r\n\t\theader += \"\\x00\\x00\";\r\n\t\r\n\t\treturn {\r\n\t\t\theader: header,\r\n\t\t\tcompressedData: compressedData\r\n\t\t};\r\n\t}\r\n\t\r\n\tload(stream, options) { // Пока этого нет\r\n\t\tthrow new Error(\"Load method is not defined.\");\r\n }\r\n\t\r\n\tfilter(search: Function) {\r\n\t\tlet result = [], filename, relativePath, file, fileClone;\r\n\t\tfor (filename in this.files) {\r\n //Нужно поискать как решить эту проблему\r\n\t\t\t//if ( !this.files.has(filename) ) { continue; }\r\n\t\t\tfile = this.files[filename];\r\n\t\t\t// return a new object, don't let the user mess with our internal objects :)\r\n\t\t\tfileClone = new ZipObject(file.name, file.data, this.extend(file.options));\r\n\t\t\trelativePath = filename.slice(this.root.length, filename.length);\r\n\t\t\tif (filename.slice(0, this.root.length) === this.root && // the file is in the current root\r\n\t\t\t\tsearch(relativePath, fileClone)) { // and the file matches the function\r\n\t\t\t\tresult.push(fileClone);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tfile(name, data = null, o = null) {\r\n\t\tif (arguments.length === 1) {\r\n\t\t\tif (name instanceof RegExp) {\r\n\t\t\t\tlet regexp = name;\r\n\t\t\t\treturn this.filter(function(relativePath, file) {\r\n\t\t\t\t\treturn !file.options.dir && regexp.test(relativePath);\r\n\t\t\t\t});\r\n\t\t\t} else { // text\r\n\t\t\t\treturn this.filter(function (relativePath, file) {\r\n\t\t\t\t\treturn !file.options.dir && relativePath === name;\r\n\t\t\t\t})[0]||null;\r\n\t\t\t}\r\n\t\t} else { // more than one argument : we have data !\r\n\t\t\tname = this.root+name;\r\n\t\t\tthis.fileAdd(name, data, o);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\t\r\n\t\r\n\t//! Нужно продумать создание папок\r\n\tfolder(arg: any = false) {\r\n\t\tif (!arg) {\r\n\t\t\tthrow new Error(\"folder : wrong argument\");\r\n\t\t}\r\n\t\t\r\n\t\tif (arg instanceof RegExp) {\r\n\t\t\treturn this.filter(function(relativePath, file) {\r\n\t\t\t\treturn file.options.dir && arg.test(relativePath);\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\t// else, name is a new folder\r\n\t\tlet name = this.root + arg;\r\n\t\tlet newFolder = this.folderAdd(name);\r\n\t\t\r\n return true;\r\n\t\t// Allow chaining by returning a new object with this folder as the root\r\n\t\t//let ret: TSZip = this.clone();\r\n\t\t//ret.root = newFolder.name;\r\n\t\t//return ret;\r\n\t}\r\n\t\r\n\tremove(name:string = \"\") {\r\n if(name != \"\"){\r\n return false;\r\n }\r\n\t\tname = this.root + name;\r\n\t\tlet file = this.files[name];\r\n\t\tif (!file) {\r\n\t\t\t// Look for any folders\r\n\t\t\tif (name.slice(-1) != \"/\") {\r\n\t\t\t\tname += \"/\";\r\n\t\t\t}\r\n\t\t\tfile = this.files[name];\r\n\t\t}\r\n\t\t\r\n\t\tif (file) {\r\n\t\t\tif (!file.options.dir) {\r\n\t\t\t\t// file\r\n\t\t\t\tdelete this.files[name];\r\n\t\t\t} else {\r\n\t\t\t\t// folder\r\n\t\t\t\tlet kids = this.filter(function (relativePath, file) {\r\n\t\t\t\t\treturn file.name.slice(0, name.length) === name;\r\n\t\t\t\t});\r\n\t\t\t\tfor (let i = 0; i < kids.length; i++) {\r\n\t\t\t\t\tdelete this.files[kids[i].name];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn this;\r\n\t}\r\n\t\r\n\tgenerate(options:any = false) {\r\n\t\toptions = this.extend(options || {}, {\r\n\t\t\tbase64 : true,\r\n\t\t\tcompression : \"STORE\",\r\n\t\t\ttype : \"base64\"\r\n\t\t});\r\n\t\tlet compression = options.compression.toUpperCase();\r\n\t\t\r\n\t\t// The central directory, and files data\r\n\t\tlet directory = [], files = [], fileOffset = 0;\r\n\t\t\r\n\t\t//У нас нет сжатия(\r\n\t\t//if (!Zip.compressions[compression]) {\r\n\t\t//\tthrow compression + \" is not a valid compression method !\";\r\n\t\t//}\r\n\t\t\r\n\t\tfor (let name in this.files) {\r\n\t\t\tif ( !this.files.hasOwnProperty(name) ) { continue; }\r\n\t\t\r\n\t\t\tlet file = this.files[name];\r\n\t\t\r\n\t\t\tlet utfEncodedFileName = TSZip.utf8encode(file.name);\r\n\t\t\r\n\t\t\tlet fileRecord = \"\",\r\n\t\t\tdirRecord = \"\",\r\n\t\t\tdata = this.prepareLocalHeaderData(file, utfEncodedFileName, compression);\r\n\t\t\tfileRecord = this.signature.LOCAL_FILE_HEADER + data.header + utfEncodedFileName + data.compressedData;\r\n\t\t\r\n\t\t\tdirRecord = this.signature.CENTRAL_FILE_HEADER +\r\n\t\t\t// version made by (00: DOS)\r\n\t\t\t\"\\x14\\x00\" +\r\n\t\t\t// file header (common to file and central directory)\r\n\t\t\tdata.header +\r\n\t\t\t// file comment length\r\n\t\t\t\"\\x00\\x00\" +\r\n\t\t\t// disk number start\r\n\t\t\t\"\\x00\\x00\" +\r\n\t\t\t// internal file attributes TODO\r\n\t\t\t\"\\x00\\x00\" +\r\n\t\t\t// external file attributes\r\n\t\t\t(file.options.dir===true?\"\\x10\\x00\\x00\\x00\":\"\\x00\\x00\\x00\\x00\")+\r\n\t\t\t// relative offset of local header\r\n\t\t\tTSZip.decToHex(fileOffset, 4) +\r\n\t\t\t// file name\r\n\t\t\tutfEncodedFileName;\r\n\t\t\r\n\t\t\tfileOffset += fileRecord.length;\r\n\t\t\r\n\t\t\tfiles.push(fileRecord);\r\n\t\t\tdirectory.push(dirRecord);\r\n\t\t}\r\n\t\t\r\n\t\tlet fileData = files.join(\"\");\r\n\t\tlet dirData = directory.join(\"\");\r\n\t\t\r\n\t\tlet dirEnd = \"\";\r\n\t\t\r\n\t\t// end of central dir signature\r\n\t\tdirEnd = this.signature.CENTRAL_DIRECTORY_END +\r\n\t\t// number of this disk\r\n\t\t\"\\x00\\x00\" +\r\n\t\t// number of the disk with the start of the central directory\r\n\t\t\"\\x00\\x00\" +\r\n\t\t// total number of entries in the central directory on this disk\r\n\t\tTSZip.decToHex(files.length, 2) +\r\n\t\t// total number of entries in the central directory\r\n\t\tTSZip.decToHex(files.length, 2) +\r\n\t\t// size of the central directory 4 bytes\r\n\t\tTSZip.decToHex(dirData.length, 4) +\r\n\t\t// offset of start of central directory with respect to the starting disk number\r\n\t\tTSZip.decToHex(fileData.length, 4) +\r\n\t\t// .ZIP file comment length\r\n\t\t\"\\x00\\x00\";\r\n\t\t\r\n\t\tlet zip = fileData + dirData + dirEnd;\r\n\t\t\r\n\t\t\r\n\t\tswitch(options.type.toLowerCase()) {\r\n\t\t\tcase \"uint8array\" :\r\n\t\t\t\treturn TSZipUtils.string2Uint8Array(zip);\r\n\t\t\tcase \"arraybuffer\" :\r\n\t\t\t\treturn TSZipUtils.getArrayBuffer(zip);\r\n\t\t\tcase \"blob\" :\r\n\t\t\t\treturn TSZipUtils.string2Blob(zip);\r\n\t\t\tcase \"base64\" :\r\n\t\t\t\treturn (options.base64) ? TSZipBase64.encode(zip) : zip;\r\n\t\t\tdefault : // case \"string\" :\r\n\t\t\t\treturn zip;\r\n\t\t}\r\n\t}\r\n\t\r\n\tstatic crc32(str, crc = 0) {\r\n\t\tif (str === \"\" || typeof str === \"undefined\") {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\tlet table = [\r\n\t\t\t0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\r\n\t\t\t0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\r\n\t\t\t0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\r\n\t\t\t0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\r\n\t\t\t0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\r\n\t\t\t0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\r\n\t\t\t0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\r\n\t\t\t0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\r\n\t\t\t0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\r\n\t\t\t0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\r\n\t\t\t0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\r\n\t\t\t0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\r\n\t\t\t0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\r\n\t\t\t0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\r\n\t\t\t0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\r\n\t\t\t0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\r\n\t\t\t0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\r\n\t\t\t0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\r\n\t\t\t0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\r\n\t\t\t0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\r\n\t\t\t0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\r\n\t\t\t0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\r\n\t\t\t0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\r\n\t\t\t0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\r\n\t\t\t0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\r\n\t\t\t0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\r\n\t\t\t0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\r\n\t\t\t0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\r\n\t\t\t0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\r\n\t\t\t0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\r\n\t\t\t0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\r\n\t\t\t0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\r\n\t\t\t0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\r\n\t\t\t0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\r\n\t\t\t0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\r\n\t\t\t0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\r\n\t\t\t0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\r\n\t\t\t0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\r\n\t\t\t0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\r\n\t\t\t0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\r\n\t\t\t0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\r\n\t\t\t0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\r\n\t\t\t0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\r\n\t\t\t0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\r\n\t\t\t0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\r\n\t\t\t0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\r\n\t\t\t0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\r\n\t\t\t0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\r\n\t\t\t0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\r\n\t\t\t0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\r\n\t\t\t0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\r\n\t\t\t0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\r\n\t\t\t0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\r\n\t\t\t0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\r\n\t\t\t0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\r\n\t\t\t0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\r\n\t\t\t0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\r\n\t\t\t0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\r\n\t\t\t0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\r\n\t\t\t0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\r\n\t\t\t0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\r\n\t\t\t0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\r\n\t\t\t0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\r\n\t\t\t0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\r\n\t\t];\r\n\t\t\r\n\t\tif (typeof(crc) == \"undefined\") { crc = 0; }\r\n\t\tlet x = 0;\r\n\t\tlet y = 0;\r\n\t\t\r\n\t\tcrc = crc ^ (-1);\r\n\t\tfor( let i = 0, iTop = str.length; i < iTop; i++ ) {\r\n\t\t\ty = ( crc ^ str.charCodeAt( i ) ) & 0xFF;\r\n\t\t\tx = table[y];\r\n\t\t\tcrc = ( crc >>> 8 ) ^ x;\r\n\t\t}\r\n\t\t\r\n\t\treturn crc ^ (-1);\r\n\t}\r\n\t\r\n\t//Страшная штука, нужно лучше продумать и реализовать ее\r\n\t// clone() {\r\n\t// \tlet newObj = new TSZip();\r\n\t// \tfor (let i in this) {\r\n\t// \t\tif (typeof this[i] !== \"function\") {\r\n\t// \t\t\tnewObj[i] = this[i];\r\n\t// \t\t}\r\n\t// \t}\r\n\t// \treturn newObj;\r\n\t// }\r\n\t\r\n\tstatic utf8encode(str) {\r\n\t\tstr = str.replace(/\\r\\n/g,\"\\n\");\r\n\t\tlet utftext = \"\";\r\n\t\t\r\n\t\tfor (let n = 0; n < str.length; n++) {\r\n\t\t\r\n\t\t\tlet c = str.charCodeAt(n);\r\n\t\t\r\n\t\t\tif (c < 128) {\r\n\t\t\t\tutftext += String.fromCharCode(c);\r\n\t\t\t} else if ((c > 127) && (c < 2048)) {\r\n\t\t\t\tutftext += String.fromCharCode((c >> 6) | 192);\r\n\t\t\t\tutftext += String.fromCharCode((c & 63) | 128);\r\n\t\t\t} else {\r\n\t\t\t\tutftext += String.fromCharCode((c >> 12) | 224);\r\n\t\t\t\tutftext += String.fromCharCode(((c >> 6) & 63) | 128);\r\n\t\t\t\tutftext += String.fromCharCode((c & 63) | 128);\r\n\t\t\t}\r\n\t\t\r\n\t\t}\r\n\t\t\r\n\t\treturn utftext;\r\n\t}\r\n\t\r\n\tstatic utf8decode(utftext) {\r\n\t\tlet string = \"\";\r\n\t\tlet i = 0;\r\n\t\tlet c = 0, c1 = 0, c2 = 0, c3 = 0;\r\n\t\r\n\t\twhile (i < utftext.length) {\r\n\t\t\tc = utftext.charCodeAt(i);\r\n\t\r\n\t\t\tif (c < 128) {\r\n\t\t\t\tstring += String.fromCharCode(c);\r\n\t\t\t\ti++;\r\n\t\t\t} else if ((c > 191) && (c < 224)) {\r\n\t\t\t\tc2 = utftext.charCodeAt(i+1);\r\n\t\t\t\tstring += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\r\n\t\t\t\ti += 2;\r\n\t\t\t} else {\r\n\t\t\t\tc2 = utftext.charCodeAt(i+1);\r\n\t\t\t\tc3 = utftext.charCodeAt(i+2);\r\n\t\t\t\tstring += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n\t\t\t\ti += 3;\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\treturn string;\r\n\t}\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n}\r\n\r\nclass ZipObject {\r\n\tname: string = \"\";\r\n\tdata: string = \"\";\r\n\toptions = {\r\n\t\tbase64: false,\r\n\t\tbinary: false,\r\n\t\tdir: false,\r\n\t\tdate: null\r\n\t};\r\n\t\r\n\tconstructor(name, data, options) {\r\n\t\tthis.name = name;\r\n\t\tthis.data = data;\r\n\t\tthis.options = options;\r\n\t};\r\n\t\r\n\tasText() {\r\n let result = this.data;\r\n if (this.options.base64) {\r\n result = TSZipBase64.decode(result);\r\n }\r\n if (this.options.binary) {\r\n result = TSZip.utf8decode(result);\r\n }\r\n return result;\r\n }\r\n\t\r\n\tasBinary() {\r\n let result = this.data;\r\n if (this.options.base64) {\r\n result = TSZipBase64.decode(result);\r\n }\r\n if (!this.options.binary) {\r\n result = TSZip.utf8encode(result);\r\n }\r\n return result;\r\n }\r\n\t\r\n\tasUint8Array() {\r\n return TSZipUtils.string2Uint8Array(this.asBinary());\r\n }\r\n\t\r\n\tasArrayBuffer() {\r\n return TSZipUtils.getArrayBuffer(this.asBinary());\r\n }\r\n}\r\n\r\nclass TSZipStore{\r\n\tmagic: string = \"\\x00\\x00\";\r\n\tcompress(content) {\r\n\t\treturn content; // no compression\r\n\t}\r\n\tuncompress(content) {\r\n\t\treturn content; // no compression\r\n\t}\r\n}\r\n\r\nclass TSZipSupport {\r\n // contains true if Zip can read/generate ArrayBuffer, false otherwise.\r\n\tstatic arraybuffer(){\r\n\t\treturn typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\r\n\t}\r\n\t// contains true if Zip can read/generate Uint8Array, false otherwise.\r\n\tstatic uint8array(){\r\n\t\treturn typeof Uint8Array !== \"undefined\";\r\n\t}\r\n\t// contains true if Zip can read/generate Blob, false otherwise.\r\n\tstatic blob(){\r\n\t\t// the spec started with BlobBuilder then replaced it with a construtor for Blob.\r\n\t\t// Result : we have browsers that :\r\n\t\t// * know the BlobBuilder (but with prefix)\r\n\t\t// * know the Blob constructor\r\n\t\t// * know about Blob but not about how to build them\r\n\t\t// About the \"=== 0\" test : if given the wrong type, it may be converted to a string.\r\n\t\t// Instead of an empty content, we will get \"[object Uint8Array]\" for example.\r\n\t\tif (typeof ArrayBuffer === \"undefined\") {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlet buffer = new ArrayBuffer(0);\r\n\t\ttry {\r\n\t\t\treturn new Blob([buffer], { type: \"application/zip\" }).size === 0;\r\n\t\t}\r\n\t\tcatch(e) {}\r\n\t\t\r\n\t\t/*try {\r\n\t\t\tlet builder = new (window.BlobBuilder || window.WebKitBlobBuilder ||\r\n\t\t\t\t\t\t\t\twindow.MozBlobBuilder || window.MSBlobBuilder)();\r\n\t\t\tbuilder.append(buffer);\r\n\t\t\treturn builder.getBlob('application/zip').size === 0;\r\n\t\t}\r\n\t\tcatch(e) {}*/\r\n\t\t\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nclass TSZipUtils{\r\n\t/**\r\n\t* Convert a string to a \"binary string\" : a string containing only char codes between 0 and 255.\r\n\t* @param {string} str the string to transform.\r\n\t* @return {String} the binary string.\r\n\t*/\r\n\tstatic string2binary(str) {\r\n\t\tlet result = \"\";\r\n\t\tfor (let i = 0; i < str.length; i++) {\r\n\t\t\tresult += String.fromCharCode(str.charCodeAt(i) & 0xff);\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t/**\r\n\t* Create a Uint8Array from the string.\r\n\t* @param {string} str the string to transform.\r\n\t* @return {Uint8Array} the typed array.\r\n\t* @throws {Error} an Error if the browser doesn't support the requested feature.\r\n\t*/\r\n\tstatic string2Uint8Array(str) {\r\n\t\tif (!TSZipSupport.uint8array) {\r\n\t\t\tthrow new Error(\"Uint8Array is not supported by this browser\");\r\n\t\t}\r\n\t\tlet buffer = new ArrayBuffer(str.length);\r\n\t\tlet bufferView = new Uint8Array(buffer);\r\n\t\tfor(let i = 0; i < str.length; i++) {\r\n\t\t\tbufferView[i] = str.charCodeAt(i);\r\n\t\t}\r\n\t\t\r\n\t\treturn bufferView;\r\n\t}\r\n\t\r\n\tstatic getArrayBuffer(str){\r\n\t\treturn new ArrayBuffer(str.length);\r\n\t}\r\n\t\r\n\t/**\r\n\t* Create a string from the Uint8Array.\r\n\t* @param {Uint8Array} array the array to transform.\r\n\t* @return {string} the string.\r\n\t* @throws {Error} an Error if the browser doesn't support the requested feature.\r\n\t*/\r\n\tstatic uint8Array2String(array) {\r\n\t\tif (!TSZipSupport.uint8array) {\r\n\t\t\tthrow new Error(\"Uint8Array is not supported by this browser\");\r\n\t\t}\r\n\t\tlet result = \"\";\r\n\t\tfor(let i = 0; i < array.length; i++) {\r\n\t\t\tresult += String.fromCharCode(array[i]);\r\n\t\t}\r\n\t\t\r\n\t\treturn result;\r\n\t}\r\n\t/**\r\n\t* Create a blob from the given string.\r\n\t* @param {string} str the string to transform.\r\n\t* @return {Blob} the string.\r\n\t* @throws {Error} an Error if the browser doesn't support the requested feature.\r\n\t*/\r\n\tstatic string2Blob(str) {\r\n\t\tif (!TSZipSupport.blob) {\r\n\t\t\tthrow new Error(\"Blob is not supported by this browser\");\r\n\t\t}\r\n\t\t\r\n\t\tlet buffer = this.getArrayBuffer(str);\r\n\t\ttry {\r\n\t\t\t// Blob constructor\r\n\t\t\treturn new Blob([buffer], { type: \"application/zip\" });\r\n\t\t}\r\n\t\tcatch(e) {}\r\n\t\t\r\n\t\t/*try {\r\n\t\t\t// deprecated, browser only, old way\r\n\t\t\tlet builder = new (window.BlobBuilder || window.WebKitBlobBuilder ||\r\n\t\t\t\t\t\t\t\twindow.MozBlobBuilder || window.MSBlobBuilder)();\r\n\t\t\tbuilder.append(buffer);\r\n\t\t\treturn builder.getBlob('application/zip');\r\n\t\t}\r\n\t\tcatch(e) {}*/\r\n\t\t\r\n\t\t// well, fuck ?!\r\n\t\tthrow new Error(\"Bug : can't construct the Blob.\");\r\n\t}\r\n}\r\n\r\nclass TSZipBase64{\r\n\t// private property\r\n\tstatic _keyStr: string = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n\t\r\n\tstatic encode(input) {\r\n\t\tvar output = \"\";\r\n\t\tvar chr1, chr2, chr3, enc1, enc2, enc3, enc4;\r\n\t\tvar i = 0;\r\n\r\n\t\twhile (i < input.length) {\r\n\t\t\tchr1 = input.charCodeAt(i++);\r\n\t\t\tchr2 = input.charCodeAt(i++);\r\n\t\t\tchr3 = input.charCodeAt(i++);\r\n\t\t\t\r\n\t\t\tenc1 = chr1 >> 2;\r\n\t\t\tenc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\r\n\t\t\tenc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\r\n\t\t\tenc4 = chr3 & 63;\r\n\t\t\t\r\n\t\t\tif (isNaN(chr2)) {\r\n\t\t\t\tenc3 = enc4 = 64;\r\n\t\t\t} else if (isNaN(chr3)) {\r\n\t\t\t\tenc4 = 64;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\toutput = output +\r\n\t\t\t\tthis._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +\r\n\t\t\t\tthis._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);\r\n\t\t}\r\n\r\n\t\treturn output;\r\n\t}\r\n\r\n\tstatic decode(input) {\r\n\t\tvar output = \"\";\r\n\t\tvar chr1, chr2, chr3;\r\n\t\tvar enc1, enc2, enc3, enc4;\r\n\t\tvar i = 0;\r\n\t\t\r\n\t\tinput = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\r\n\t\t\r\n\t\twhile (i < input.length) {\r\n\t\t\tenc1 = this._keyStr.indexOf(input.charAt(i++));\r\n\t\t\tenc2 = this._keyStr.indexOf(input.charAt(i++));\r\n\t\t\tenc3 = this._keyStr.indexOf(input.charAt(i++));\r\n\t\t\tenc4 = this._keyStr.indexOf(input.charAt(i++));\r\n\t\t\r\n\t\t\tchr1 = (enc1 << 2) | (enc2 >> 4);\r\n\t\t\tchr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\r\n\t\t\tchr3 = ((enc3 & 3) << 6) | enc4;\r\n\t\t\r\n\t\t\toutput = output + String.fromCharCode(chr1);\r\n\t\t\r\n\t\t\tif (enc3 != 64) {\r\n\t\t\t\toutput = output + String.fromCharCode(chr2);\r\n\t\t\t}\r\n\t\t\tif (enc4 != 64) {\r\n\t\t\t\toutput = output + String.fromCharCode(chr3);\r\n\t\t\t}\r\n\t\t\r\n\t\t}\r\n\t\treturn output;\r\n\t}\r\n}\r\n","// @ts-nocheck\r\nimport {TSZip} from './tszip.min';\r\n\r\nexport class XLSXUni{\r\n\tpublic sheet: Sheet = null;\r\n\tpublic workBook: WorkBook = new WorkBook(\"Uni\");\r\n\tpublic cell: Cell = null;\r\n\tpublic style: XLSXStyle = null;\r\n\tpublic merge: SheetMerge = null;\r\n\r\n\tconstructor(){}\r\n\tngOnInit(author) {\r\n\t\tthis.workBook = new WorkBook(author);\r\n\t}\r\n\t\r\n\tgetWorkBook(author='Uni'){return new WorkBook(author)}\r\n\tgetSheet(name){return new Sheet(name)}\r\n\tgetCell(data = null, style = null){return new Cell(data, style)}\r\n\tgetStyle(number = 1, numFmtId = 0){return new XLSXStyle(number, numFmtId)}\r\n\tgetMerge(firstCol, firstRow, lastCol, lastRow){return new SheetMerge(firstCol, firstRow, lastCol, lastRow)}\r\n\t\r\n\tsave(name = 'file.xlsx'){return new RenderXLXS(this.workBook, name)}\r\n\t\r\n\tstatic exportDOMToXLSX(dom, name = 'export.xlsx'){\r\n\t\tlet getStTb = function(td, colI, rowI){\r\n\t\t\tif(td.rowSpan == 1){\r\n\t\t\t\tif(colI == 0){\r\n\t\t\t\t\treturn 9;\r\n\t\t\t\t}else if(colI != td.colSpan-1){\r\n\t\t\t\t\treturn 10;\r\n\t\t\t\t}else{\r\n\t\t\t\t\treturn 11;\r\n\t\t\t\t}\r\n\t\t\t}else if(td.colSpan == 1){\r\n\t\t\t\tif(rowI == 0){\r\n\t\t\t\t\treturn 12;\r\n\t\t\t\t}else if(rowI != td.rowSpan-1){\r\n\t\t\t\t\treturn 13;\r\n\t\t\t\t}else{\r\n\t\t\t\t\treturn 14;\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\tif(rowI == 0){\r\n\t\t\t\t\tif(colI == 0){\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}else if(colI != td.colSpan-1){\r\n\t\t\t\t\t\treturn 2;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\treturn 3;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else if(rowI != td.rowSpan-1){\r\n\t\t\t\t\tif(colI == 0){\r\n\t\t\t\t\t\treturn 4;\r\n\t\t\t\t\t}else if(colI != td.colSpan-1){\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\treturn 5;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(colI == 0){\r\n\t\t\t\t\t\treturn 6;\r\n\t\t\t\t\t}else if(colI != td.colSpan-1){\r\n\t\t\t\t\t\treturn 7;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\treturn 8;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\tlet getStartCol = function(arr){\r\n\t\t\tif(typeof arr === 'undefined') return 0;\r\n\t\t\tif(arr.length == 0) return 0;\r\n\t\t\tlet i;\r\n\t\t\tfor(i = 0; i < arr.length; i++){\r\n\t\t\t\tif(typeof arr[i] == 'undefined') return i;\r\n\t\t\t}\r\n\t\t\treturn i;\r\n\t\t};\r\n\t\tlet fixCell = function(x){\r\n\t\t\tlet a = x.trim()\r\n\t\t\tlet b = a.replace(',', '.');\r\n\t\t\tif(!Number.isNaN(Number.parseFloat(b)) && b == Number.parseFloat(b))\r\n\t\t\t\tif (Number.parseFloat(b) < 100000000000) return Number.parseFloat(b);\r\n\t\t\t\telse return a + ' ';\r\n\t\t\telse return a;\r\n\t\t}\r\n\t\tlet render = function(dom){\r\n\t\t\tlet items = [];\r\n\t\t\tdom.forEach( d => {\r\n\t\t\t\tif(d.tagName == 'TABLE') {\r\n\t\t\t\t\tlet table = {type: 'table', head: 0, merge: [], style: [], data: null, customWidth: {}}\r\n\t\t\t\t\tlet tb = [];\r\n\t\t\t\t\tlet row = 0;\r\n\t\t\t\t\tif(d.querySelector('thead') !== null)\r\n\t\t\t\t\td.querySelector('thead').querySelectorAll('tr').forEach(tr => {\r\n\t\t\t\t\t\ttable.head++;\r\n\t\t\t\t\t\tif(typeof tb[row] === 'undefined') tb[row] = [];\r\n\t\t\t\t\t\tif(typeof table.style[row] === 'undefined') table.style[row] = [];\r\n\t\t\t\t\t\ttr.querySelectorAll('th').forEach(th => {\r\n\t\t\t\t\t\t\tlet col = getStartCol(tb[row]);\r\n\t\t\t\t\t\t\ttb[row][col] = fixCell(th.innerText);\r\n\t\t\t\t\t\t\tif(th.colSpan == 1){\r\n\t\t\t\t\t\t\t\ttable.customWidth[col+1] = th.clientWidth / 9.;\r\n\t\t\t\t\t\t\t\tif(table.customWidth[col+1] < 3) table.customWidth[col+1] = 19;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(th.rowSpan > 1 || th.colSpan > 1){\r\n\t\t\t\t\t\t\t\ttable.merge.push([(col+1),(row+1),(col+th.colSpan),(row+th.rowSpan)]);\r\n\t\t\t\t\t\t\t\tfor(let rowI = 0; rowI < th.rowSpan; rowI++){\r\n\t\t\t\t\t\t\t\t\t//if(rowI>0) col = getStartCol(tb[row+rowI]);\r\n\t\t\t\t\t\t\t\t\tfor(let colI = 0; colI < th.colSpan; colI++){\r\n\t\t\t\t\t\t\t\t\t\tif(typeof table.style[row+rowI] === 'undefined') table.style[row+rowI] = Array();\r\n\t\t\t\t\t\t\t\t\t\ttable.style[row+rowI][col+colI] = getStTb(th, colI, rowI);\r\n\t\t\t\t\t\t\t\t\t\tif(rowI==0){\r\n\t\t\t\t\t\t\t\t\t\t\tif(colI == 0) continue;\r\n\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\tif(typeof tb[row+rowI] === 'undefined') tb[row+rowI] = Array();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\ttb[row+rowI][col+colI] = '';\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\ttable.style[row][col] = 0;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\trow++;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif(d.querySelector('tbody') !== null)\r\n\t\t\t\t\td.querySelector('tbody').querySelectorAll('tr').forEach(tr => {\r\n\t\t\t\t\t\tif(typeof tb[row] === 'undefined') tb[row] = [];\r\n\t\t\t\t\t\tif(typeof table.style[row] === 'undefined') table.style[row] = [];\r\n\t\t\t\t\t\ttr.querySelectorAll('td, th').forEach((td) => {\r\n\t\t\t\t\t\t\tlet col = getStartCol(tb[row]);\r\n\t\t\t\t\t\t\ttb[row][col] = fixCell(td.innerText);\r\n\t\t\t\t\t\t\tif(td.colSpan == 1){\r\n\t\t\t\t\t\t\t\ttable.customWidth[col+1] = td.clientWidth / 9.;\r\n\t\t\t\t\t\t\t\tif(table.customWidth[col+1] < 3) table.customWidth[col+1] = 20;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(td.rowSpan > 1 || td.colSpan > 1){\r\n\t\t\t\t\t\t\t\ttable.merge.push([(col+1),(row+1),(col+td.colSpan),(row+td.rowSpan)]);\r\n\t\t\t\t\t\t\t\tfor(let rowI = 0; rowI < td.rowSpan; rowI++){\r\n\t\t\t\t\t\t\t\t\t//if(rowI>0) col = getStartCol(tb[row+rowI]);\r\n\t\t\t\t\t\t\t\t\tfor(let colI = 0; colI < td.colSpan; colI++){\r\n\t\t\t\t\t\t\t\t\t\tif(typeof table.style[row+rowI] === 'undefined') table.style[row+rowI] = Array();\r\n\t\t\t\t\t\t\t\t\t\ttable.style[row+rowI][col+colI] = getStTb(td, colI, rowI);\r\n\t\t\t\t\t\t\t\t\t\tif(rowI==0){\r\n\t\t\t\t\t\t\t\t\t\t\tif(colI==0) continue;\r\n\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\tif(typeof tb[row+rowI] === 'undefined') tb[row+rowI] = Array();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\ttb[row+rowI][col+colI] = '';\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\ttable.style[row][col] = 0;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\trow++;\r\n\t\t\t\t\t});\r\n\t\t\t\t\ttable.data = tb;\r\n\t\t\t\t\titems.push(table);\r\n\t\t\t\t}else if (d.tagName == \"BR\") {\r\n\t\t\t\t\titems.push({type: 'text', data: '', tags: []});\r\n\t\t\t\t}else if(d.childNodes.length > 1){\r\n\t\t\t\t\trender(d.childNodes).forEach(i=>{items.push(i);});\r\n\t\t\t\t}\r\n\t\t\t\telse if(d.tagName != '#text' && d.innerText !== undefined){\r\n\t\t\t\t\tlet item = {type: 'text', data: d.innerText, tags: []};\r\n\t\t\t\t\t//if(window.getComputedStyle(d).fontWeight > 500) item.tags.push('b');\r\n\t\t\t\t\t//if (d.classList.contains('xlsx-filter')) item.filter = true;\r\n\t\t\t\t\t/*if(d.classList.contains('xlsx-right')){ \r\n\t\t\t\t\t\titem.row = ;\r\n\t\t\t\t\t\trightItems.push(item);\r\n\t\t\t\t\t}*/\r\n\t\t\t\t\t//else\r\n\t\t\t\t\titems.push(item);\r\n\t\t\t\t}else if(d.tagName == '#text'){\r\n\t\t\t\t\tlet item = {type: 'text', data: d.textContent, tags: []};\r\n\t\t\t\t\titems.push(item);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn items;\r\n\t\t};\r\n\r\n\t\tconst getNativeClass = function(obj:any) {\r\n\t\t\tif (typeof obj === \"undefined\") return \"undefined\";\r\n\t\t\tif (obj === null) return \"null\";\r\n\t\t\treturn Object.prototype.toString.call(obj).match(/^\\[object\\s(.*)\\]$/)[1];\r\n\t\t}\r\n\t\tlet items = [];\r\n\t\tlet rightItems = [];\r\n\t\tlet table = {};\r\n\t\tlet filter = [];\r\n\t\tif(getNativeClass(dom) == 'NodeList'){\r\n\t\t\titems = render(dom);\r\n\t\t}else{\r\n\t\t\titems = render(dom.childNodes);\r\n\t\t}\r\n\t\t\r\n\t\tlet exp: XLSXUni = new XLSXUni();\r\n\t\texp.workBook.createSheet('List 1');\r\n\t\tlet row = 1;\r\n\t\tlet tableSt = false;\r\n\t\tlet tableStyle = [];\r\n\t\titems.forEach( item => {\r\n\t\t\tif(item.type == 'text'){\r\n\t\t\t\titem.data.split('\\n').forEach(text => {\r\n\t\t\t\t\texp.workBook.addCell(0, row, text);\r\n\t\t\t\t\trow++;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif(item.type == 'table'){\r\n\t\t\t\tlet splap = exp.workBook.sheet[0].getMaxRow();\r\n\t\t\t\tif(!tableSt){\r\n\t\t\t\t\tXLSXUni.createStyleTable().forEach(st => {\r\n\t\t\t\t\t\ttableStyle.push(exp.workBook.addStyle(st));\r\n\t\t\t\t\t});\r\n\t\t\t\t\tXLSXUni.createStyleNumberTable().forEach(st => {\r\n\t\t\t\t\t\ttableStyle.push(exp.workBook.addStyle(st));\r\n\t\t\t\t\t});\r\n\t\t\t\t\ttableSt = true;\r\n\t\t\t\t}\r\n\t\t\t\titem.data.forEach((th, i) => {\r\n\t\t\t\t\tth.forEach((td, j) => {\r\n\t\t\t\t\t\tlet st = 0;\r\n\t\t\t\t\t\tif(typeof item.style[i][j] != undefined){\r\n\t\t\t\t\t\t\tif(typeof td === 'number') st = tableStyle[item.style[i][j] + 15];\r\n\t\t\t\t\t\t\telse st = tableStyle[item.style[i][j]];\r\n\t\t\t\t\t\t} else if(typeof td === 'number') st = 2;\r\n\t\t\t\t\t\texp.workBook.addCell(0, row, td, st);\r\n\t\t\t\t\t});\r\n\t\t\t\t\trow++;\r\n\t\t\t\t});\r\n\t\t\t\titem.merge.forEach( i => {\r\n\t\t\t\t\texp.workBook.sheet[0].addMerges(i[0], i[1] + splap, i[2], i[3] + splap);\r\n\t\t\t\t});\r\n\t\t\t\tObject.keys(item.customWidth).forEach(k => {\r\n\t\t\t\t\texp.workBook.sheet[0].setCustomWidth(item.customWidth[k], k);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn exp;\r\n\t}\r\n\t\r\n\tstatic createStyleTable(){\r\n\t\tlet st0 = new XLSXStyle();\r\n\t\tst0.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst0.alignment.wrapText = true;\r\n\t\tlet st1 = new XLSXStyle();\r\n\t\tst1.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst1.alignment.wrapText = true;\r\n\t\tlet st2 = new XLSXStyle();\r\n\t\tst2.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst2.alignment.wrapText = true;\r\n\t\tlet st3 = new XLSXStyle();\r\n\t\tst3.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst3.alignment.wrapText = true;\r\n\t\tlet st4 = new XLSXStyle();\r\n\t\tst4.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst4.alignment.wrapText = true;\r\n\t\tlet st5 = new XLSXStyle();\r\n\t\tst5.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst5.alignment.wrapText = true;\r\n\t\tlet st6 = new XLSXStyle();\r\n\t\tst6.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst6.alignment.wrapText = true;\r\n\t\tlet st7 = new XLSXStyle();\r\n\t\tst7.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst7.alignment.wrapText = true;\r\n\t\tlet st8 = new XLSXStyle();\r\n\t\tst8.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst8.alignment.wrapText = true;\r\n\t\tlet st9 = new XLSXStyle();\r\n\t\tst9.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst9.alignment.wrapText = true;\r\n\t\tlet st10 = new XLSXStyle();\r\n\t\tst10.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst10.alignment.wrapText = true;\r\n\t\tlet st11 = new XLSXStyle();\r\n\t\tst11.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tlet st12 = new XLSXStyle();\r\n\t\tst12.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tlet st13 = new XLSXStyle();\r\n\t\tst13.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tlet st14 = new XLSXStyle();\r\n\t\tst14.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst11.alignment.wrapText = true;\r\n\t\treturn [st0, st1, st2, st3, st4, st5, st6, st7, st8, st9, st10, st11, st12, st13, st14];\r\n\t}\r\n\r\n\tstatic createStyleNumberTable(){\r\n\t\tlet st0 = new XLSXStyle();\r\n\t\tst0.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst0.numFmtId = 164;\r\n\t\tst0.alignment.wrapText = true;\r\n\t\tlet st1 = new XLSXStyle();\r\n\t\tst1.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst1.alignment.wrapText = true;\r\n\t\tst1.numFmtId = 164;\r\n\t\tlet st2 = new XLSXStyle();\r\n\t\tst2.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst2.alignment.wrapText = true;\r\n\t\tst2.numFmtId = 164;\r\n\t\tlet st3 = new XLSXStyle();\r\n\t\tst3.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst3.alignment.wrapText = true;\r\n\t\tst3.numFmtId = 164;\r\n\t\tlet st4 = new XLSXStyle();\r\n\t\tst4.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst4.alignment.wrapText = true;\r\n\t\tst4.numFmtId = 164;\r\n\t\tlet st5 = new XLSXStyle();\r\n\t\tst5.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst5.alignment.wrapText = true;\r\n\t\tst5.numFmtId = 164;\r\n\t\tlet st6 = new XLSXStyle();\r\n\t\tst6.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst6.alignment.wrapText = true;\r\n\t\tst6.numFmtId = 164;\r\n\t\tlet st7 = new XLSXStyle();\r\n\t\tst7.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst7.alignment.wrapText = true;\r\n\t\tst7.numFmtId = 164;\r\n\t\tlet st8 = new XLSXStyle();\r\n\t\tst8.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst8.alignment.wrapText = true;\r\n\t\tst8.numFmtId = 164;\r\n\t\tlet st9 = new XLSXStyle();\r\n\t\tst9.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst9.alignment.wrapText = true;\r\n\t\tst9.numFmtId = 164;\r\n\t\tlet st10 = new XLSXStyle();\r\n\t\tst10.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst10.alignment.wrapText = true;\r\n\t\tst10.numFmtId = 164;\r\n\t\tlet st11 = new XLSXStyle();\r\n\t\tst11.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst11.numFmtId = 164;\r\n\t\tlet st12 = new XLSXStyle();\r\n\t\tst12.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst12.numFmtId = 164;\r\n\t\tlet st13 = new XLSXStyle();\r\n\t\tst13.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst13.numFmtId = 164;\r\n\t\tlet st14 = new XLSXStyle();\r\n\t\tst14.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst14.numFmtId = 164;\r\n\t\tst11.alignment.wrapText = true;\r\n\t\treturn [st0, st1, st2, st3, st4, st5, st6, st7, st8, st9, st10, st11, st12, st13, st14];\r\n\t}\r\n}\r\n\r\nclass XLSXStyle{\r\n\tfont = {\r\n\t\tsz: 11,\r\n\t\tcolor: 'FF000000',\r\n\t\tname: 'Calibri',\r\n\t\ttags: []\r\n\t}\r\n\tborder = {\r\n\t\tleft: [],\r\n\t\tright: [],\r\n\t\ttop: [],\r\n\t\tbottom: [],\r\n\t\tdiagonal: []\r\n\t}\r\n\tfill = {\r\n\t\tpatternType: 'none'\r\n\t}\r\n\talignment = {\r\n\t\thorizontal: null,\r\n\t\tvertical: null,\r\n\t\twrapText: null\r\n\t}\r\n\tnumber: Number;\r\n\tnumFmtId: Number;\r\n\tconstructor(number = 0, numFmtId = 0){\r\n\t\tthis.number = number;\r\n\t\tthis.numFmtId = numFmtId;\r\n\t}\r\n\t\r\n\tgetXMLFont(){\r\n\t\tlet xml = '<font>';\r\n\t\txml += '<sz val=\"'+this.font.sz+'\"/>';\r\n\t\txml += '<color rgb=\"'+this.font.color+'\"/>';\r\n\t\txml += '<name val=\"'+this.font.name+'\"/>';\r\n\t\txml += '<scheme val=\"minor\"/>';\r\n\t\tthis.font.tags.forEach(tag => {\r\n\t\t\txml += '<'+tag+' />';\r\n\t\t});\r\n\t\txml += '</font>';\r\n\t\treturn xml;\r\n\t}\r\n\t\r\n\tgetXMLBorder(){\r\n\t\tlet xml = '<border>';\r\n\t\tif(this.border.left.length == 0){\r\n\t\t\txml += '<left />';\r\n\t\t}else{\r\n\t\t\txml += '<left style=\"'+this.border.left[0]+'\">';\r\n\t\t\txml += '<color '+this.border.left[1]+'/>';\r\n\t\t\txml += '</left>';\r\n\t\t}\r\n\t\tif(this.border.right.length == 0){\r\n\t\t\txml += '<right />';\r\n\t\t}else{\r\n\t\t\txml += '<right style=\"'+this.border.right[0]+'\">';\r\n\t\t\txml += '<color '+this.border.right[1]+'/>';\r\n\t\t\txml += '</right>';\r\n\t\t}\r\n\t\tif(this.border.top.length == 0){\r\n\t\t\txml += '<top />';\r\n\t\t}else{\r\n\t\t\txml += '<top style=\"'+this.border.top[0]+'\">';\r\n\t\t\txml += '<color '+this.border.top[1]+'/>';\r\n\t\t\txml += '</top>';\r\n\t\t}\r\n\t\tif(this.border.bottom.length == 0){\r\n\t\t\txml += '<bottom />';\r\n\t\t}else{\r\n\t\t\txml += '<bottom style=\"'+this.border.bottom[0]+'\">';\r\n\t\t\txml += '<color '+this.border.bottom[1]+'/>';\r\n\t\t\txml += '</bottom>';\r\n\t\t}\r\n\t\tif(this.border.diagonal.length == 0){\r\n\t\t\txml += '<diagonal />';\r\n\t\t}else{\r\n\t\t\txml += '<diagonal style=\"'+this.border.diagonal[0]+'\">';\r\n\t\t\txml += '<color '+this.border.diagonal[1]+'/>';\r\n\t\t\txml += '</diagonal>';\r\n\t\t}\r\n\t\txml += '</border>';\r\n\t\treturn xml;\r\n\t}\r\n\t\r\n\tgetXMLFill(){\r\n\t\tlet xml = '';\r\n\t}\r\n\t\r\n\tgetNumber(){\r\n\t\treturn this.number;\r\n\t}\r\n\t\r\n\tisTrueAlignment(){\r\n\t\treturn this.alignment.horizontal !== null || this.alignment.vertical !== null || this.alignment.wrapText !== null;\r\n\t}\r\n\t\r\n\taddTag(tag){\r\n\t\tthis.font.tags.push(tag);\r\n\t}\r\n\r\n\tgetHashFont(){\r\n\t\tlet str = this.font.sz + 'px;';\r\n\t\tstr += this.font.color + 'rgb;';\r\n\t\tstr += this.font.name + 'fa;';\r\n\t\tthis.font.tags.forEach(tag => {str += tag + 'tag;'});\r\n\t\treturn cyrb53(str);\r\n\t}\r\n\r\n\tgetHashBorder(): number {\r\n\t\tlet str = this.border.top[0] + 'st;';\r\n\t\tstr += this.border.top[1] + 'color;';\r\n\t\tstr += this.border.left[0] + 'st;';\r\n\t\tstr += this.border.left[1] + 'color;';\r\n\t\tstr += this.border.right[0] + 'st;';\r\n\t\tstr += this.border.right[1] + 'color;';\r\n\t\tstr += this.border.bottom[0] + 'st;';\r\n\t\tstr += this.border.bottom[1] + 'color;';\r\n\t\tstr += this.border.diagonal[0] + 'st;';\r\n\t\tstr += this.border.diagonal[1] + 'color;';\r\n\t\treturn cyrb53(str);\r\n\t}\r\n\r\n\tgetHashFill(){\r\n\t\tlet str = this.fill.patternType + 'type;';\r\n\t\treturn cyrb53(str);\r\n\t}\r\n\r\n\tgetHash(){\r\n\t\tlet str = this.font.sz + 'px;';\r\n\t\tstr += this.font.color + 'rgb;';\r\n\t\tstr += this.font.name + 'fa;';\r\n\t\tthis.font.tags.forEach(tag => {str += tag + 'tag;'});\r\n\t\tstr += this.border.top[0] + 'st;';\r\n\t\tstr += this.border.top[1] + 'color;';\r\n\t\tstr += this.border.left[0] + 'st;';\r\n\t\tstr += this.border.left[1] + 'color;';\r\n\t\tstr += this.border.right[0] + 'st;';\r\n\t\tstr += this.border.right[1] + 'color;';\r\n\t\tstr += this.border.bottom[0] + 'st;';\r\n\t\tstr += this.border.bottom[1] + 'color;';\r\n\t\tstr += this.border.diagonal[0] + 'st;';\r\n\t\tstr += this.border.diagonal[1] + 'color;';\r\n\t\tstr += this.fill.patternType + 'type;';\r\n\t\tstr += this.numFmtId + 'num;';\r\n\t\tlet hor = this.alignment.horizontal !== null? this.alignment.horizontal : 'null';\r\n\t\tstr += hor + 'hor;';\r\n\t\tlet ver = this.alignment.vertical !== null? this.alignment.vertical : 'null';\r\n\t\tstr += ver + 'ver;';\r\n\t\tlet wra = this.alignment.wrapText !== null? this.alignment.wrapText : 'null';\r\n\t\tstr += wra + 'wra;';\r\n\t\treturn cyrb53(str);\r\n\t}\r\n}\r\n\r\nclass WorkBook{\r\n\tsheet: Array<Sheet> = [];\r\n\tnameSheet: Array<String> = [];\r\n\tstyleList: Array<XLSXStyle> = [new XLSXStyle(1), new XLSXStyle(1, 164)]\r\n\tnextStyle: number = 2;\r\n\tauthor: string = 'Uni';\r\n\tconstructor(author = 'Uni'){\r\n\t\tthis.author = author;\r\n\t}\r\n\t\r\n\tcreateSheet(name){\r\n\t\tthis.sheet.push(new Sheet(name));\r\n\t\tthis.nameSheet.push(name);\r\n\t\treturn this.sheet.length-1;\r\n\t}\r\n\t\r\n\tgetIndexSheet(name){\r\n\t\treturn name.indexOf(name);\r\n\t}\r\n\t\r\n\tgetNameSheet(){\r\n\t\treturn this.nameSheet;\r\n\t}\r\n\t\r\n\tgetSheet(){\r\n\t\treturn this.sheet;\r\n\t}\r\n\t\r\n\taddRow(indexSheet, row = null){\r\n\t\treturn this.sheet[indexSheet].addRow(row);\r\n\t}\r\n\t\r\n\taddCell(indexSheet, indexRow, data, style = null){\r\n\t\tif(Number.isInteger(style)) style = this.styleList[style];\r\n\t\tthis.sheet[indexSheet].addCell(indexRow, data, style);\r\n\t}\r\n\t\r\n\tgetStyleList(){\r\n\t\treturn this.styleList;\r\n\t}\r\n\t\r\n\tgetAuthor(){\r\n\t\treturn this.author;\r\n\t}\r\n\t\r\n\taddStyle(style){\r\n\t\tstyle.number = this.nextStyle;\r\n\t\tthis.nextStyle++;\r\n\t\tthis.styleList.push(style);\r\n\t\treturn style.number;\r\n\t}\r\n}\r\n\r\nclass Sheet{\r\n\trows = {};\r\n\tlastRow = 1;\r\n\tmaxCol = 1;\r\n\tmerges = [];\r\n\tautoFilter = [];\r\n\tname = \"\";\r\n\tcustomWidth: Array<number> = [];\r\n\r\n\tconstructor(name){\r\n\t\tthis.name = name;\r\n\t}\r\n\t\r\n\tgetName(){\r\n\t\treturn this.name;\r\n\t}\r\n\t\r\n\tgetRows(){\r\n\t\treturn this.rows;\r\n\t}\r\n\t\r\n\tgetMerges(){\r\n\t\treturn this.merges;\r\n\t}\r\n\t\r\n\tgetMaxCol(){\r\n\t\treturn this.maxCol;\r\n\t}\r\n\t\r\n\tgetMaxRow(){\r\n\t\treturn this.lastRow - 1;\r\n\t}\r\n\t\r\n\taddRow(row = null){\r\n\t\tif(row !== null) this.rows[this.lastRow] = row;\r\n\t\telse this.rows[this.lastRow] = new Row();\r\n\t\tthis.lastRow++;\r\n\t\treturn this.lastRow-1;\r\n\t}\r\n\t\r\n\taddCell(indexRow, data, style = null){\r\n\t\twhile(typeof this.rows[indexRow] == 'undefined') this.addRow();\r\n\t\tthis.rows[indexRow].push(new Cell(data, style));\r\n\t\tif(this.rows[indexRow].length > this.maxCol) this.maxCol = this.rows[indexRow].length;\r\n\t}\r\n\t\r\n\taddMerges(firstCol, firstRow, lastCol, lastRow){\r\n\t\tlet mer = new SheetMerge(firstCol, firstRow, lastCol, lastRow);\r\n\t\tthis.merges.push(mer);\r\n\t}\r\n\r\n\tsetCustomWidth(i, k){\r\n\t\tthis.customWidth[k] = i;\r\n\t}\r\n}\r\n\r\nclass Row{\r\n\tcells = {};\r\n\tlength = 0;\r\n\tlastCell = 1;\r\n\r\n\tconstructor(){\r\n\t}\r\n\t\r\n\tpush(cell){\r\n\t\tthis.cells[this.lastCell] = cell;\r\n\t\tthis.lastCell++;\r\n\t\tthis.length++;\r\n\t}\r\n\t\r\n\tgetSizeRow(){\r\n\t\treturn this.length;\r\n\t}\r\n\t\r\n\tgetCells(){\r\n\t\treturn this.cells;\r\n\t}\r\n}\r\n\r\nclass Cell{\r\n\tdata = null;\r\n\tstyle = null;\r\n\r\n\tconstructor(data = null, style = null){\r\n\t\tthis.data = data;\r\n\t\tthis.style = style;\r\n\t}\r\n\t\r\n\tisNumber(){\r\n\t\treturn +this.data == this.data && !this.haveWhitespace();\r\n\t}\r\n\t\r\n\thaveWhitespace(){\r\n\t\treturn typeof this.data === 'string' && this.data.substr(-1) != ' ';\r\n\t}\r\n\r\n\tisNull(){\r\n\t\treturn this.data == '' || this.data === null;\r\n\t}\r\n\t\r\n\tgetStyleNum(){\r\n\t\tif(this.style===null) return this.isNumber()? 1 : 0;\r\n\t\treturn this.style.getNumber();\r\n\t}\r\n\t\r\n\tgetData(){\r\n\t\treturn this.data;\r\n\t}\r\n\t\r\n\tsetData(data){\r\n\t\tif(+data == data){\r\n\t\t\tthis.data = +data;\r\n\t\t}else{\r\n\t\t\tthis.data = data;\r\n\t\t}\r\n\t}\r\n\t\r\n\tsetStyle(style){\r\n\t\tthis.style = style;\r\n\t}\r\n}\r\n\r\nclass SheetMerge{\r\n\tdata: Array<number>;\r\n\tconstructor(firstCol, firstRow, lastCol, lastRow){\r\n\t\tthis.data = [firstCol, firstRow, lastCol, lastRow];\r\n\t}\r\n\t\r\n\tgetFirst(){\r\n\t\treturn [this.data[0], this.data[1]];\r\n\t}\r\n\t\r\n\tgetLast(){\r\n\t\treturn [this.data[2], this.data[3]];\r\n\t}\r\n\t\r\n\tgetMerge(){\r\n\t\treturn numberToABC(this.data[0])+this.data[1]+':'+numberToABC(this.data[2])+this.data[3];\r\n\t}\r\n}\r\n\r\nclass RenderXLXS {\r\n\tsharedString: Array<string> = new Array();\r\n\tstyleHash: Array<number> = new Array();\r\n\tcreateXMLApp(nameSheet){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\"><Application>XLSX-Uni</Application><DocSecurity>0</DocSecurity>`;\r\n\t\t//<HeadingPairs>\r\n\t\tfile += `<HeadingPairs><vt:vector size=\"2\" baseType=\"variant\"><vt:variant><vt:lpstr>Лист</vt:lpstr></vt:variant><vt:variant><vt:i4>`+nameSheet.length+`</vt:i4></vt:variant></vt:vector></HeadingPairs>`;\r\n\t\t//<TitlesOfParts>\r\n\t\tfile += '<TitlesOfParts><vt:vector size=\"'+nameSheet.length+'\" baseType=\"lpstr\">';\r\n\t\tnameSheet.forEach(name => {\r\n\t\t\tfile += '<vt:lpstr>'+name+'</vt:lpstr>';\r\n\t\t});\r\n\t\tfile += `</vt:vector></TitlesOfParts>`;\r\n\t\t//End\r\n\t\tfile += '</Properties>';\r\n\t\t\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLCore(creator){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">`;\r\n\t\tfile += '<dc:creator>' + creator + '</dc:creator>';\r\n\t\tfile += '<dcterms:created xsi:type=\"dcterms:W3CDTF\">' + getDateW3CDTF() + '</dcterms:created>';\r\n\t\tfile += '</cp:coreProperties>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLShell(sheet: Sheet, styleList: Array<XLSXStyle>){\r\n\t\tlet rows = sheet.getRows();\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:etc=\"http://www.wps.cn/officeDocument/2017/etCustomData\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\" xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\">`;\r\n\t\tfile += '<dimension ref=\"A1:'+numberToABC(sheet.getMaxCol())+sheet.getMaxRow()+'\" />';\r\n\t\tfile += `<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><selection activeCell=\"A1\" sqref=\"A1\" /></sheetView></sheetViews><sheetFormatPr defaultColWidth=\"9\" defaultRowHeight=\"20\" outlineLevelCol=\"6\" />`;\r\n\t\tif(sheet.customWidth.length > 0){\r\n\t\t\tfile += `<cols>`;\r\n\t\t\tsheet.customWidth.forEach((i, k) => {\r\n\t\t\t\tif(typeof i !== 'undefined') file += `<col min=\"` + (k) + `\" max=\"` + (k) + `\" width=\"` + i + `\" customWidth=\"1\" />`;\r\n\t\t\t});\r\n\t\t\tfile += `</cols>`;\r\n\t\t}\r\n\t\tfile += `<sheetData>`;\r\n\t\tlet numStr = 0;\r\n\t\tObject.keys(rows).forEach((i) => {\r\n\t\t\tlet row = rows[i];\r\n\t\t\tlet span = i+Number.parseInt(row.getSizeRow());\r\n\t\t\tfile += '<row r=\"'+i+'\" spans=\"'+i+':'+span+'\">';\r\n\t\t\tlet cells = row.getCells();\r\n\t\t\tObject.keys(cells).forEach((j0) => {\r\n\t\t\t\tlet j = Number.parseInt(j0);\r\n\t\t\t\tlet cell = cells[j];\r\n\t\t\t\tif(typeof cell.getData() === 'number'){\r\n\t\t\t\t\tfile += '<c r=\"'+numberToABC(j)+i+'\" s=\"'+this.styleHash.indexOf(styleList[cell.getStyleNum()].getHash())+'\"><v>'+cell.getData()+'</v></c>';\r\n\t\t\t\t}else if(cell.isNull()){\r\n\t\t\t\t\tfile += '<c r=\"'+numberToABC(j)+i+'\" s=\"'+this.styleHash.indexOf(styleList[cell.getStyleNum()].getHash())+'\" />';\r\n\t\t\t\t}else{\r\n\t\t\t\t\tfile += '<c r=\"'+numberToABC(j)+i+'\" s=\"'+this.styleHash.indexOf(styleList[cell.getStyleNum()].getHash())+'\" t=\"s\"><v>'+numStr+'</v></c>';\r\n\t\t\t\t\tthis.sharedString.push(cell.getData());\r\n\t\t\t\t\tnumStr++;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tfile += '</row>';\r\n\t\t});\r\n\t\tfile += '</sheetData>';\r\n\t\tlet merges = sheet.getMerges()\r\n\t\tif(merges.length > 0){\r\n\t\t\tfile += '<mergeCells count=\"'+merges.length+'\">';\r\n\t\t\tmerges.forEach( (merge) => {\r\n\t\t\t\tfile += '<mergeCell ref=\"'+merge.getMerge()+'\" />';\r\n\t\t\t});\r\n\t\t\tfile += '</mergeCells>';\r\n\t\t}\r\n\t\tfile += '<headerFooter /></worksheet>';\r\n\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLSharedStrings(){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"9\" uniqueCount=\"9\">`;\r\n\t\tthis.sharedString.forEach((str)=>{\r\n\t\t\tfile += '<si><t>'+str+'</t></si>';\r\n\t\t});\r\n\t\tfile += '</sst>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLWorkBook(nameSheet){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"><fileVersion appName=\"xl\" lastEdited=\"3\" lowestEdited=\"0\" rupBuild=\"9302\"/><workbookPr/>`;\r\n\t\tfile += '<bookViews><workbookView windowHeight=\"17715\" /></bookViews>';\r\n\t\tfile += '<sheets>';\r\n\t\tnameSheet.forEach((name, i) => {\r\n\t\t\tconst id = i+1;\r\n\t\t\tfile += '<sheet name=\"'+name+'\" sheetId=\"'+id+'\" r:id=\"rId'+id+'\"/>';\r\n\t\t});\r\n\t\tfile += '</sheets>';\r\n\t\tfile += '<calcPr calcId=\"0\" />';\r\n\t\tfile += '</workbook>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLContentTypes(countSheet){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/>`;\r\n\t\tfile += '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/xl/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>';\r\n\t\tfor(let i=1;i<=countSheet;i++)\r\n\t\t\tfile += '<Override PartName=\"/xl/worksheets/sheet'+i+'.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>';\r\n\t\tfile += '</Types>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLRelsWorkBook(countSheet){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/><Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/><Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/>`;\r\n\t\tfor(let i = 1;i<=countSheet;i++){\r\n\t\t\tfile+='<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet'+i+'.xml\"/>';\r\n\t\t}\r\n\t\tfile += '</Relationships>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\treturnRelsMain(){\r\n\t\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/><Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/></Relationships>`;\r\n\t}\r\n\t\r\n\tcreateStyle(styleList: Array<XLSXStyle>){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><numFmts count=\"1\"><numFmt numFmtId=\"180\" formatCode=\"0.000000\" /></numFmts>`;\r\n\t\tlet fontStr: string = '';\r\n\t\tlet fontLen: number = 0;\r\n\t\tlet fontHas: Array<number> = [];\r\n\t\tstyleList.forEach((item: XLSXStyle) => {\r\n\t\t\tif(fontHas.indexOf(item.getHashFont()) === -1){\r\n\t\t\t\tfontStr += item.getXMLFont();\r\n\t\t\t\tfontLen++;\r\n\t\t\t\tfontHas.push(item.getHashFont());\r\n\t\t\t}\r\n\t\t});\r\n\t\tfile += '<fonts count=\"'+fontLen+'\">' + fontStr + '</fonts>';\r\n\t\t//\r\n\t\tfile += '<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>';\r\n\t\t//\r\n\t\tlet borStr: string = '';\r\n\t\tlet borLen: number = 0;\r\n\t\tlet borHas: Array<number> = [];\r\n\t\tstyleList.forEach((item: XLSXStyle) => {\r\n\t\t\tif(borHas.indexOf(item.getHashBorder()) === -1){\r\n\t\t\t\tborStr += item.getXMLBorder();\r\n\t\t\t\tborLen++;\r\n\t\t\t\tborHas.push(item.getHashBorder());\r\n\t\t\t}\r\n\t\t});\r\n\t\tfile += '<borders count=\"'+borLen+'\">' + borStr + '</borders>';\r\n\t\tfile += '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" /></cellStyleXfs>';\r\n\r\n\t\tlet fontXfStr: string = '';\r\n\t\tlet fontXfLen: number = 0;\r\n\t\tlet fontXfHas: Array<number> = [];\r\n\t\tstyleList.forEach((item, i) => {\r\n\t\t\tif(fontXfHas.indexOf(item.getHash()) === -1){\r\n\t\t\t\t//let num = item.numFmtId == 164? 49 : 0;\r\n\t\t\t\tlet num = 0;\r\n\t\t\t\tfontXfStr += '<xf numFmtId=\"'+num+'\" fontId=\"'+(fontHas.indexOf(item.getHashFont()))+'\" fillId=\"0\" borderId=\"'+(borHas.indexOf(item.getHashBorder()))+'\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" ';\r\n\t\t\t\tif(item.isTrueAlignment()){\r\n\t\t\t\t\tfontXfStr += 'applyAlignment=\"1\"><alignment ';\r\n\t\t\t\t\tif(item.alignment.horizontal !== null) fontXfStr += 'horizontal=\"'+item.alignment.horizontal+'\" ';\r\n\t\t\t\t\tif(item.alignment.vertical !== null) fontXfStr += 'vertical=\"'+item.alignment.vertical+'\" ';\r\n\t\t\t\t\tif(item.alignment.wrapText !== null) fontXfStr += 'wrapText=\"1\" ';\r\n\t\t\t\t\tfontXfStr += '/>';\r\n\t\t\t\t}else{\r\n\t\t\t\t\tfontXfStr += '>';\r\n\t\t\t\t}\r\n\t\t\t\tfontXfStr += '</xf>';\r\n\t\t\t\tfontXfLen++;\r\n\t\t\t\tfontXfHas.push(item.getHash());\r\n\t\t\t}\r\n\t\t});\r\n\t\tfile += '<cellXfs count=\"'+fontXfLen+'\">' + fontXfStr + '</cellXfs>';\r\n\t\tthis.styleHash = fontXfHas;\r\n\t\tfile += '<cellStyles count=\"1\"><cellStyle name=\"Обычный\" xfId=\"0\" builtinId=\"0\" /></cellStyles><dxfs count=\"0\" />';\r\n\t\tfile += '</styleSheet>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\treturnThemeOne(){\r\n\t\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"5B9BD5\"/></a:accent1><a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4><a:accent5><a:srgbClr val=\"4472C4\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink><a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Calibri Light\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"宋体\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Times New Roman\"/><a:font script=\"Hebr\" typeface=\"Times New Roman\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"MoolBoran\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Times New Roman\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"宋体\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Arial\"/><a:font script=\"Hebr\" typeface=\"Arial\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"DaunPenh\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Arial\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:satMod val=\"103000\"/><a:lumMod val=\"102000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"110000\"/><a:lumMod val=\"100000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\" algn=\"ctr\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"63000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"93000\"/><a:satMod val=\"150000\"/><a:shade val=\"98000\"/><a:lumMod val=\"102000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:tint val=\"98000\"/><a:satMod val=\"130000\"/><a:shade val=\"90000\"/><a:lumMod val=\"103000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"63000\"/><a:satMod val=\"120000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/></a:theme>`;\r\n\t}\r\n\r\n\tdownload(data, name){\r\n\t\tlet a = document.createElement(\"a\");\r\n\t\tvar byteCharacters = atob(data);\r\n\t\tvar byteArrays = [];\r\n\r\n\t\tfor (var offset = 0; offset < byteCharacters.length; offset += 512) {\r\n\t\t\tvar slice = byteCharacters.slice(offset, offset + 512);\r\n\r\n\t\t\tvar byteNumbers = new Array(slice.length);\r\n\t\t\tfor (var i = 0; i < slice.length; i++) {\r\n\t\t\t\tbyteNumbers[i] = slice.charCodeAt(i);\r\n\t\t\t}\r\n\t\t\r\n\t\t\tvar byteArray = new Uint8Array(byteNumbers);\r\n\t\t\r\n\t\t\tbyteArrays.push(byteArray);\r\n\t\t}\r\n\t\r\n\t\tvar file = new Blob(byteArrays, {type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"});\r\n\t\tlet url = URL.createObjectURL(file);\r\n\t\ta.href = url;\r\n\t\ta.download = name;\r\n\t\tdocument.body.appendChild(a);\r\n\t\ta.click();\r\n\t\tsetTimeout(function () {\r\n\t\t\tdocument.body.removeChild(a);\r\n\t\t\twindow.URL.revokeObjectURL(url);\r\n\t\t}, 0);\r\n\t}\r\n\t\r\n\tconstructor(workbook, name = \"file.xlsx\"){\r\n\t\tthis.sharedString = [];\r\n\r\n\t\tlet zip = new TSZip();\r\n\t\tzip.file(\"[Content_Types].xml\", this.createXMLContentTypes(workbook.getSheet().length));\r\n\t\tzip.folder(\"_rels\");\r\n\t\tzip.file(\"_rels/.rels\", this.returnRelsMain());\r\n\t\tzip.folder(\"docProps\");\r\n\t\tzip.file(\"docProps/app.xml\", this.createXMLApp(workbook.getNameSheet()));\r\n\t\tzip.file(\"docProps/core.xml\", this.createXMLCore(workbook.getAuthor()));\r\n\t\tzip.folder(\"xl\");\r\n\t\tzip.file(\"xl/workbook.xml\", this.createXMLWorkBook(workbook.getNameSheet()));\r\n\t\tzip.file(\"xl/styles.xml\", this.createStyle(workbook.getStyleList()));\r\n\t\tzip.folder(\"xl/worksheets\");\r\n\t\tworkbook.getSheet().forEach((sheet,i)=>{\r\n\t\t\tzip.file(\"xl/worksheets/sheet\"+(i+1)+\".xml\", this.createXMLShell(sheet, workbook.getStyleList()));\r\n\t\t});\r\n\t\tzip.file(\"xl/sharedStrings.xml\", this.createXMLSharedStrings());\r\n\t\tzip.folder(\"xl/_rels\");\r\n\t\tzip.file(\"xl/_rels/workbook.xml.rels\", this.createXMLRelsWorkBook(workbook.getSheet().length));\r\n\t\tzip.folder(\"xl/theme\");\r\n\t\tzip.file(\"xl/theme/theme1.xml\", this.returnThemeOne());\r\n\t\tvar content = zip.generate({type:\"base64\"});\r\n\t\tthis.download(content, name);\r\n\t}\r\n\r\n\t\r\n}\r\n\t\r\nfunction getDateW3CDTF(){\r\n\tconst d = new Date();\r\n\tconst year = d.getUTCFullYear();\r\n\tconst month = d.getUTCMonth() + 1;\r\n\tconst day = d.getUTCDate();\r\n\tconst hours = d.getUTCHours();\r\n\tconst minutes = d.getUTCMinutes();\r\n\tconst seconds = d.getUTCSeconds();\r\n\t\r\n\treturn year + '-' +\r\n\t\t\t(month > 9? month : '0' + month) + '-' +\r\n\t\t\t(day > 9? day : '0' + day) + 'T' +\r\n\t\t\t(hours > 9 ? hours : '0' + hours) + ':' +\r\n\t\t\t(minutes > 9? minutes : '0' + minutes) + ':' +\r\n\t\t\t(seconds > 9? seconds : '0' + seconds) + 'Z';\r\n}\r\n\r\nfunction numberToABC(number: number){\r\n\tconst abc = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];\r\n\tif (number <= 26) return abc[number-1];\r\n\tlet str = '';\r\n\twhile (number > 0){\r\n\t\tlet nppStr = (number%26) - 1;\r\n\t\tstr += abc[nppStr >= 0? nppStr : 25];\r\n\t\tnumber = Number.parseInt((number/26).toString());\r\n\t}\r\n\treturn str.split(\"\").reverse().join(\"\");\r\n}\r\n\r\nfunction cyrb53(str, seed = 0):number {\r\n\tlet h1 = 0xdeadbeef ^ seed,\r\n\t h2 = 0x41c6ce57 ^ seed;\r\n\tfor (let i = 0, ch; i < str.length; i++) {\r\n\t ch = str.charCodeAt(i);\r\n\t h1 = Math.imul(h1 ^ ch, 2654435761);\r\n\t h2 = Math.imul(h2 ^ ch, 1597334677);\r\n\t}\r\n\t\r\n\th1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\r\n\th2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\r\n\t\r\n\treturn 4294967296 * (2097151 & h2) + (h1 >>> 0);\r\n };\r\n","export function jsxToHtml(element: string): Promise<HTMLDivElement | null> {\r\n return new Promise((resolve) => {\r\n\r\n const container = document.createElement('div');\r\n\r\n container.innerHTML = element\r\n\r\n const allElements: HTMLElement[] = Array.from(container.querySelectorAll('table, span, br, p, h1, h2, h3, h4, h5'));\r\n\r\n if (allElements) {\r\n const divBlock = document.createElement('div')\r\n allElements.forEach(opt => {\r\n divBlock.appendChild(opt)\r\n })\r\n resolve(divBlock);\r\n } else {\r\n resolve(null);\r\n }\r\n\r\n\r\n // const container = document.createElement('div');\r\n // const root = ReactDOM.createRoot(container);\r\n // const observer = new MutationObserver((mutationsList) => {\r\n // for (const mutation of mutationsList) {\r\n // if (mutation.addedNodes.length) {\r\n // const allElements: HTMLElement[] = Array.from(container.querySelectorAll('table, span, br, p, h1, h2, h3, h4, h5'));\r\n // if (allElements) {\r\n // observer.disconnect(); // Отключаем наблюдателя\r\n //\r\n // const divBlock = document.createElement('div')\r\n // allElements.forEach(opt => {\r\n // divBlock.appendChild(opt)\r\n // })\r\n // resolve(divBlock);\r\n // }\r\n // }\r\n // }\r\n // });\r\n //\r\n // root.render(element);\r\n //\r\n // observer.observe(container, {childList: true, subtree: true});\r\n });\r\n}","import { XLSXUni } from \"./dop-function/export-excel/core\";\r\nimport { jsxToHtml } from \"./dop-function/jsxToHtml\";\r\n\r\nexport interface IfExportTableToExcel {\r\n tableId?: string,\r\n divId?: string,\r\n fileName: string,\r\n jsxElement?: string\r\n}\r\n\r\nconst fExportTableToExcel = async ({ tableId, fileName, jsxElement, divId }: IfExportTableToExcel) => {\r\n\r\n if (tableId !== undefined && jsxElement === undefined && divId === undefined) {\r\n\r\n const htmlTable = document.getElementById(tableId);\r\n if (htmlTable) {\r\n const container = document.createElement('div');\r\n const copiedElement = htmlTable.cloneNode(true); // Клонируем элемент\r\n container.appendChild(copiedElement); // Добавляем клонированный элемент в блок назначения\r\n\r\n const file: XLSXUni = XLSXUni.exportDOMToXLSX(container);\r\n file.save(`${fileName}.xlsx`);\r\n return true\r\n } else {\r\n return false\r\n }\r\n } else if (jsxElement !== undefined && divId === undefined && tableId === undefined) {\r\n\r\n let status: boolean = false\r\n\r\n await jsxToHtml(jsxElement).then((element) => {\r\n if (element !== null) {\r\n const file: XLSXUni = XLSXUni.exportDOMToXLSX(element);\r\n file.save(`${fileName}.xlsx`);\r\n status = true\r\n } else {\r\n status = false\r\n }\r\n });\r\n\r\n return status\r\n } else if (divId !== undefined && jsxElement === undefined && tableId === undefined) {\r\n\r\n const divBlock: HTMLElement | null = document.getElementById(divId);\r\n\r\n if (divBlock !== null) {\r\n\r\n const container = document.createElement('div');\r\n\r\n divBlock.querySelectorAll('span, p, br, table').forEach(opt => {\r\n const copiedElement = opt.cloneNode(true); // Клонируем элемент\r\n container.appendChild(copiedElement); // Добавляем клонированный элемент в блок назначения\r\n })\r\n\r\n const file: XLSXUni = XLSXUni.exportDOMToXLSX(container);\r\n\r\n file.save(`${fileName}.xlsx`);\r\n\r\n return true\r\n } else {\r\n return false\r\n }\r\n } else {\r\n return false\r\n }\r\n};\r\n\r\nexport default fExportTableToExcel\r\n","// Функция для получения значений и атрибутов ячеек\r\nexport function getCellData(cell: HTMLElement): { content: string, rowspan: number, colspan: number } {\r\n const content = cell.innerText.trim();\r\n const rowspan = cell.hasAttribute('rowspan') ? parseInt(cell.getAttribute('rowspan') || '1') : 1;\r\n const colspan = cell.hasAttribute('colspan') ? parseInt(cell.getAttribute('colspan') || '1') : 1;\r\n return {content, rowspan, colspan};\r\n}","export const createTagH1 = (text: string): string => {\r\n return `<w:p><w:pPr><w:pStyle w:val=\"a4\"/></w:pPr><w:r><w:t>${text}</w:t></w:r></w:p>`\r\n}\r\n\r\nexport const createTagH1ToH6 = (text: string): string => {\r\n return `<w:p><w:pPr><w:pStyle w:val=\"a6\"/></w:pPr><w:r><w:t>${text}</w:t></w:r></w:p>`\r\n}\r\n\r\nexport const createTagP = (text: string): string => {\r\n return `<w:p><w:pPr><w:ind w:firstLine=\"708\"/></w:pPr><w:r><w:t>${text}</w:t></w:r></w:p>`\r\n}\r\n\r\nexport const createStartSpan = (): string => {\r\n return `<w:p><w:pPr><w:ind w:firstLine=\"708\"/></w:pPr><w:r>`\r\n}\r\n\r\nexport const createEndSpan = () => {\r\n return `</w:r></w:p>`\r\n}\r\n\r\nexport const createTagSpan = (text: string) => {\r\n return `<w:t>${text}</w:t><w:t xml:space=\"preserve\"> </w:t>`\r\n}\r\n\r\nexport const createTagBr = () => {\r\n return `<w:p></w:p>`\r\n}\r\n\r\nexport const createTagTb = (table: string, rows: number, width: number): string => {\r\n\r\n const arr: string[] = ['<w:tblGrid>']\r\n\r\n for (let i = 0; i < rows; i++) {\r\n arr.push(`<w:gridCol w:w=\"${Math.floor(width/rows)}\"/>`)\r\n }\r\n\r\n arr.push('</w:tblGrid>')\r\n\r\n return `<w:tbl><w:tblPr><w:tblStyle w:val=\"a7\"/><w:tblW w:w=\"1\" w:type=\"auto\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr>${arr.join('')}${table}</w:tbl>`\r\n}\r\n\r\nexport const createTagTbRow = (listCel: string) => {\r\n return `<w:tr>${listCel}</w:tr>`\r\n}\r\n\r\nconst addTextTbHead = (text: string | undefined,) => {\r\n let newText = ''\r\n\r\n if (text !== undefined) {\r\n newText = `<w:r><w:rPr><w:rFonts w:cs=\"Times New Roman\"/><w:b/><w:bCs/><w:color w:val=\"000000\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>${text}</w:t></w:r>`\r\n }\r\n\r\n return newText\r\n}\r\n\r\nconst addTextTbBody = (text: string | undefined,) => {\r\n let newText = ''\r\n\r\n if (text !== undefined) {\r\n newText = `<w:r><w:rPr><w:rFonts w:cs=\"Times New Roman\"/><w:color w:val=\"000000\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>${text}</w:t></w:r>`\r\n }\r\n\r\n return newText\r\n}\r\n\r\nexport const createTagTbHeaderCell = (text?: string, rowSpan?: 'restart' | 'continue', colSpan?: number) => {\r\n return `<w:tc><w:tcPr><w:tcW w:w=\"1\" w:type=\"dxa\"/>${colSpan !== undefined ? `<w:gridSpan w:val=\"${colSpan}\"/>` : ''}${rowSpan !== undefined ? `<w:vMerge ${rowSpan === 'restart' ? 'w:val=\"restart\"' : 'w:val=\"continue\"'}/>` : ''}<w:vAlign w:val=\"center\"/></w:tcPr><w:p><w:pPr><w:ind w:firstLine=\"0\"/><w:jc w:val=\"center\"/><w:rPr><w:rFonts w:cs=\"Times New Roman\"/><w:b/><w:bCs/><w:color w:val=\"000000\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr>${addTextTbHead(text)}</w:p></w:tc>`\r\n}\r\n\r\nexport const createTagTbBodyCell = (text?: string, rowSpan?: 'restart' | 'continue', colSpan?: number) => {\r\n return `<w:tc><w:tcPr><w:tcW w:w=\"1\" w:type=\"dxa\"/>${colSpan !== undefined ? `<w:gridSpan w:val=\"${colSpan}\"/>` : ''}${rowSpan !== undefined ? `<w:vMerge ${rowSpan === 'restart' ? 'w:val=\"restart\"' : 'w:val=\"continue\"'}/>` : ''}<w:vAlign w:val=\"center\"/></w:tcPr><w:p><w:pPr><w:ind w:firstLine=\"0\"/><w:rPr><w:rFonts w:cs=\"Times New Roman\"/><w:color w:val=\"000000\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr>${addTextTbBody(text)}</w:p></w:tc>`\r\n}","import { getCellData } from \"../getCellData\";\r\nimport { createTagTbBodyCell, createTagTbHeaderCell, createTagTbRow } from \"../createXmlTags\";\r\n\r\nexport const createRow = (elTb: HTMLTableSectionElement): string => {\r\n\r\n const rows = Array.from(elTb.querySelectorAll('tr'));\r\n\r\n if (rows && rows.length > 0) {\r\n\r\n const listRow: { [key: number]: { [key: string]: string | null | undefined } } = {}\r\n\r\n let countCell = 0\r\n const defaultRow: { [key: number]: null } = {}\r\n\r\n const firstCell: HTMLTableCellElement[] = Array.from(rows[0].querySelectorAll('th, td'));\r\n\r\n if (firstCell && firstCell.length > 0) {\r\n\r\n firstCell.forEach((cell) => {\r\n const { colspan } = getCellData(cell);\r\n countCell += colspan\r\n })\r\n }\r\n\r\n for (let i = 0; i < countCell; i++) {\r\n defaultRow[i] = null\r\n }\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n listRow[i] = Object.assign({}, defaultRow)\r\n }\r\n\r\n const deleteCellFromRow: { [key: number]: number[] } = {}\r\n\r\n rows.forEach((row, iRow) => {\r\n\r\n const nullCell: number[] = []\r\n\r\n Object.values(listRow[iRow]).forEach((opt, index) => {\r\n if (opt === null) {\r\n nullCell.push(index)\r\n }\r\n })\r\n\r\n const cells: HTMLTableCellElement[] = Array.from(row.querySelectorAll('th, td'));\r\n\r\n let countEditCel = 0\r\n\r\n if (cells && cells.length > 0) {\r\n cells.forEach((cell) => {\r\n\r\n const { content, rowspan, colspan } = getCellData(cell);\r\n\r\n const listCellNull = nullCell.slice(countEditCel, countEditCel + colspan).reverse()\r\n let indexCellOnObj: number = 0\r\n\r\n listCellNull.map((nullCel, indexNullCel) => {\r\n if (indexNullCel === listCellNull.length - 1) {\r\n indexCellOnObj = nullCel\r\n } else {\r\n delete listRow[iRow][nullCel]\r\n }\r\n })\r\n\r\n if (rowspan > 1 && colspan < 2) {\r\n for (let i = 1; i < rowspan; i++) {\r\n if (cell.tagName === 'TH') {\r\n listRow[iRow + i][indexCellOnObj] = createTagTbHeaderCell(undefined, 'continue')\r\n } else if (cell.tagName === 'TD') {\r\n listRow[iRow + i][indexCellOnObj] = createTagTbBodyCell(undefined, 'continue')\r\n }\r\n\r\n }\r\n } else if (rowspan > 1 && colspan > 1) {\r\n for (let i = 1; i < rowspan; i++) {\r\n deleteCellFromRow[iRow + i] = []\r\n listCellNull.map((nullCel, indexNullCel) => {\r\n if (indexNullCel === listCellNull.length - 1) {\r\n if (cell.tagName === 'TH') {\r\n listRow[iRow + i][nullCel] = createTagTbHeaderCell(undefined, 'continue', colspan)\r\n } else if (cell.tagName === 'TD') {\r\n listRow[iRow + i][nullCel] = createTagTbBodyCell(undefined, 'continue', colspan)\r\n }\r\n } else {\r\n deleteCellFromRow[i].push(nullCel)\r\n listRow[iRow + i][nullCel] = undefined\r\n }\r\n })\r\n }\r\n }\r\n\r\n if (cell.tagName === 'TH') {\r\n listRow[iRow][indexCellOnObj] = createTagTbHeaderCell(content, rowspan > 1 ? 'restart' : undefined, colspan > 1 ? colspan : undefined)\r\n } else if (cell.tagName === 'TD') {\r\n listRow[iRow][indexCellOnObj] = createTagTbBodyCell(content, rowspan > 1 ? 'restart' : undefined, colspan > 1 ? colspan : undefined)\r\n }\r\n\r\n countEditCel += colspan\r\n })\r\n }\r\n })\r\n\r\n Object.entries(deleteCellFromRow).map(([key, value]) => {\r\n value.map(opt => {\r\n delete listRow[+key][opt]\r\n })\r\n })\r\n\r\n const render: string[] = []\r\n Object.values(listRow).forEach((opt) => {\r\n render.push(createTagTbRow(Object.values(opt).join('')))\r\n })\r\n\r\n return render.join('')\r\n } else {\r\n return ''\r\n }\r\n}","import { createRow } from \"./createRow\";\r\nimport { createTagTb } from \"../createXmlTags\";\r\nimport { getCellData } from \"../getCellData\";\r\n\r\nexport const convertHtmlTbToXml = (opt: Element, width: number) => {\r\n\r\n const thead = opt.querySelector('thead');\r\n const tbody = opt.querySelector('tbody');\r\n\r\n let theadXml = ''\r\n let tbodyXml = ''\r\n\r\n if (thead !== null) {\r\n theadXml = createRow(thead)\r\n }\r\n\r\n if (tbody !== null) {\r\n tbodyXml = createRow(tbody)\r\n }\r\n\r\n let countCell = 0\r\n\r\n if (thead !== null) {\r\n const rows = thead.querySelectorAll('tr')\r\n if (rows && rows.length > 0) {\r\n\r\n const listCell: any = rows[0].querySelectorAll('th, td')\r\n\r\n if (listCell && listCell.length > 0) {\r\n const firstCell: HTMLTableCellElement[] = Array.from(listCell);\r\n\r\n firstCell.forEach((cell) => {\r\n const { colspan } = getCellData(cell);\r\n countCell += colspan\r\n })\r\n }\r\n }\r\n } else if (tbody !== null) {\r\n const rows = tbody.querySelectorAll('tr')\r\n if (rows && rows.length > 0) {\r\n\r\n const listCell: any = rows[0].querySelectorAll('th, td')\r\n\r\n if (listCell && listCell.length > 0) {\r\n const firstCell: HTMLTableCellElement[] = Array.from(listCell);\r\n\r\n firstCell.forEach((cell) => {\r\n const { colspan } = getCellData(cell);\r\n countCell += colspan\r\n })\r\n }\r\n }\r\n }\r\n\r\n return createTagTb(theadXml + tbodyXml, countCell, width)\r\n\r\n}","export const contentTypes = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/><Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/><Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/><Override PartName=\"/word/webSettings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml\"/><Override PartName=\"/word/fontTable.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml\"/><Override PartName=\"/word/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/><Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/><Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/></Types>`\r\n}","export const rels = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/></Relationships>`\r\n}","export const app = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\"><Template>Normal.dotm</Template><TotalTime>2</TotalTime><Pages>1</Pages><Words>11</Words><Characters>66</Characters><Application>Microsoft Office Word</Application><DocSecurity>0</DocSecurity><Lines>1</Lines><Paragraphs>1</Paragraphs><ScaleCrop>false</ScaleCrop><Company></Company><LinksUpToDate>false</LinksUpToDate><CharactersWithSpaces>76</CharactersWithSpaces><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>16.0000</AppVersion></Properties>`\r\n}","export const documentXmlRels = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings\" Target=\"webSettings.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\"/><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/><Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/><Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\"/></Relationships>`\r\n}","export const fontTable = () => {\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:fonts xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\r\n xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\r\n xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\r\n xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\"\r\n xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"\r\n xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\"\r\n xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\"\r\n xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\"\r\n mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\">\r\n <w:font w:name=\"Times New Roman\">\r\n <w:panose1 w:val=\"02020603050405020304\"/>\r\n <w:charset w:val=\"CC\"/>\r\n <w:family w:val=\"roman\"/>\r\n <w:pitch w:val=\"variable\"/>\r\n <w:sig w:usb0=\"E0002EFF\" w:usb1=\"C000785B\" w:usb2=\"00000009\" w:usb3=\"00000000\" w:csb0=\"000001FF\"\r\n w:csb1=\"00000000\"/>\r\n </w:font>\r\n <w:font w:name=\"Calibri\">\r\n <w:panose1 w:val=\"020F0502020204030204\"/>\r\n <w:charset w:val=\"CC\"/>\r\n <w:family w:val=\"swiss\"/>\r\n <w:pitch w:val=\"variable\"/>\r\n <w:sig w:usb0=\"E4002EFF\" w:usb1=\"C000247B\" w:usb2=\"00000009\" w:usb3=\"00000000\" w:csb0=\"000001FF\"\r\n w:csb1=\"00000000\"/>\r\n </w:font>\r\n <w:font w:name=\"Times New Roman (Основной текст\">\r\n <w:altName w:val=\"Times New Roman\"/>\r\n <w:panose1 w:val=\"020B0604020202020204\"/>\r\n <w:charset w:val=\"00\"/>\r\n <w:family w:val=\"roman\"/>\r\n <w:notTrueType/>\r\n <w:pitch w:val=\"default\"/>\r\n </w:font>\r\n <w:font w:name=\"Calibri Light\">\r\n <w:panose1 w:val=\"020F0302020204030204\"/>\r\n <w:charset w:val=\"CC\"/>\r\n <w:family w:val=\"swiss\"/>\r\n <w:pitch w:val=\"variable\"/>\r\n <w:sig w:usb0=\"E4002EFF\" w:usb1=\"C000247B\" w:usb2=\"00000009\" w:usb3=\"00000000\" w:csb0=\"000001FF\"\r\n w:csb1=\"00000000\"/>\r\n </w:font>\r\n</w:fonts>`\r\n}","export const settings = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:settings xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\" xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\" xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\" xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\" xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\" xmlns:sl=\"http://schemas.openxmlformats.org/schemaLibrary/2006/main\" mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\"><w:zoom w:percent=\"160\"/><w:proofState w:spelling=\"clean\"/><w:defaultTabStop w:val=\"708\"/><w:drawingGridHorizontalSpacing w:val=\"120\"/><w:displayHorizontalDrawingGridEvery w:val=\"2\"/><w:displayVerticalDrawingGridEvery w:val=\"2\"/><w:characterSpacingControl w:val=\"doNotCompress\"/><w:compat><w:compatSetting w:name=\"compatibilityMode\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"15\"/><w:compatSetting w:name=\"overrideTableStyleFontSizeAndJustification\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"enableOpenTypeFeatures\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"doNotFlipMirrorIndents\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"differentiateMultirowTableHeaders\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"useWord2013TrackBottomHyphenation\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"0\"/></w:compat><w:rsids><w:rsidRoot w:val=\"0092750D\"/><w:rsid w:val=\"00180B28\"/><w:rsid w:val=\"00274130\"/><w:rsid w:val=\"002E4B92\"/><w:rsid w:val=\"005D448F\"/><w:rsid w:val=\"0064630D\"/><w:rsid w:val=\"0079781D\"/><w:rsid w:val=\"00843D5B\"/><w:rsid w:val=\"0092750D\"/><w:rsid w:val=\"00A35602\"/><w:rsid w:val=\"00A41BB6\"/><w:rsid w:val=\"00AB63E8\"/><w:rsid w:val=\"00B257F1\"/></w:rsids><m:mathPr><m:mathFont m:val=\"Cambria Math\"/><m:brkBin m:val=\"before\"/><m:brkBinSub m:val=\"--\"/><m:smallFrac m:val=\"0\"/><m:dispDef/><m:lMargin m:val=\"0\"/><m:rMargin m:val=\"0\"/><m:defJc m:val=\"centerGroup\"/><m:wrapIndent m:val=\"1440\"/><m:intLim m:val=\"subSup\"/><m:naryLim m:val=\"undOvr\"/></m:mathPr><w:themeFontLang w:val=\"ru-RU\"/><w:clrSchemeMapping w:bg1=\"light1\" w:t1=\"dark1\" w:bg2=\"light2\" w:t2=\"dark2\" w:accent1=\"accent1\" w:accent2=\"accent2\" w:accent3=\"accent3\" w:accent4=\"accent4\" w:accent5=\"accent5\" w:accent6=\"accent6\" w:hyperlink=\"hyperlink\" w:followedHyperlink=\"followedHyperlink\"/><w:decimalSymbol w:val=\",\"/><w:listSeparator w:val=\";\"/><w15:chartTrackingRefBased/><w15:docId w15:val=\"{8B742EB3-9A17-3442-B00E-554BC020C67C}\"/></w:settings>`\r\n}","export const document = (\r\n data: string,\r\n format: 'A4' | 'A3' | 'A2' | 'A1' = 'A4',\r\n orientation: 'landscape' | 'vertical' = 'vertical'\r\n) => {\r\n\r\n let width = 11906\r\n let height = 16838\r\n let top = 1134\r\n let right = 567\r\n let bottom = 1134\r\n let left = 1701\r\n const header = 709\r\n const footer = 709\r\n\r\n switch (format) {\r\n\r\n case \"A4\":\r\n width = orientation === 'landscape' ? 16838 : 11906\r\n height = orientation === 'landscape' ? 11906 : 16838\r\n top = orientation === 'landscape' ? 1134 : 1134\r\n right = orientation === 'landscape' ? 851 : 567\r\n bottom = orientation === 'landscape' ? 1418 : 1134\r\n left = orientation === 'landscape' ? 1701 : 1701\r\n break;\r\n case \"A3\":\r\n width = orientation === 'landscape' ? 23803 : 16817\r\n height = orientation === 'landscape' ? 16817 : 23803\r\n top = orientation === 'landscape' ? 1134 : 1134\r\n right = orientation === 'landscape' ? 851 : 851\r\n bottom = orientation === 'landscape' ? 1134 : 1134\r\n left = orientation === 'landscape' ? 1418 : 1418\r\n break;\r\n case \"A2\":\r\n width = orientation === 'landscape' ? 31678 : 23803\r\n height = orientation === 'landscape' ? 23803 : 31678\r\n top = orientation === 'landscape' ? 1418 : 1418\r\n right = orientation === 'landscape' ? 1134 : 1134\r\n bottom = orientation === 'landscape' ? 1418 : 1418\r\n left = orientation === 'landscape' ? 1701 : 1701\r\n break;\r\n case \"A1\":\r\n width = orientation === 'landscape' ? 31678 : 31678\r\n height = orientation === 'landscape' ? 31678 : 31678\r\n top = orientation === 'landscape' ? 1701 : 1701\r\n right = orientation === 'landscape' ? 1701 : 1701\r\n bottom = orientation === 'landscape' ? 1985 : 1985\r\n left = orientation === 'landscape' ? 2268 : 2268\r\n break;\r\n\r\n }\r\n\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:document xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:cx=\"http://schemas.microsoft.com/office/drawing/2014/chartex\" xmlns:cx1=\"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex\" xmlns:cx2=\"http://schemas.microsoft.com/office/drawing/2015/10/21/chartex\" xmlns:cx3=\"http://schemas.microsoft.com/office/drawing/2016/5/9/chartex\" xmlns:cx4=\"http://schemas.microsoft.com/office/drawing/2016/5/10/chartex\" xmlns:cx5=\"http://schemas.microsoft.com/office/drawing/2016/5/11/chartex\" xmlns:cx6=\"http://schemas.microsoft.com/office/drawing/2016/5/12/chartex\" xmlns:cx7=\"http://schemas.microsoft.com/office/drawing/2016/5/13/chartex\" xmlns:cx8=\"http://schemas.microsoft.com/office/drawing/2016/5/14/chartex\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:aink=\"http://schemas.microsoft.com/office/drawing/2016/ink\" xmlns:am3d=\"http://schemas.microsoft.com/office/drawing/2017/model3d\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:oel=\"http://schemas.microsoft.com/office/2019/extlst\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\" xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\" xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\" xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\" xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh wp14\"><w:body>${data}<w:sectPr><w:pgSz w:w=\"${width}\" w:h=\"${height}\" w:orient=\"${orientation}\"/><w:pgMar w:top=\"${top}\" w:right=\"${right}\" w:bottom=\"${bottom}\" w:left=\"${left}\" w:header=\"${header}\" w:footer=\"${footer}\" w:gutter=\"0\"/><w:cols w:space=\"708\"/><w:docGrid w:linePitch=\"360\"/></w:sectPr></w:body></w:document>`\r\n}","export const styles = () => {\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:styles xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\r\n xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\r\n xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\r\n xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\"\r\n xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"\r\n xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\"\r\n xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\"\r\n xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\"\r\n mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\">\r\n <w:docDefaults>\r\n <w:rPrDefault>\r\n <w:rPr>\r\n <w:rFonts w:ascii=\"Times New Roman\" w:eastAsiaTheme=\"minorHAnsi\" w:hAnsi=\"Times New Roman\"\r\n w:cs=\"Times New Roman (Основной текст\"/>\r\n <w:color w:val=\"000000\" w:themeColor=\"text1\"/>\r\n <w:kern w:val=\"2\"/>\r\n <w:sz w:val=\"28\"/>\r\n <w:szCs w:val=\"24\"/>\r\n <w:lang w:val=\"ru-RU\" w:eastAsia=\"en-US\" w:bidi=\"ar-SA\"/>\r\n <w14:ligatures w14:val=\"standardContextual\"/>\r\n </w:rPr>\r\n </w:rPrDefault>\r\n <w:pPrDefault>\r\n <w:pPr>\r\n <w:spacing w:line=\"360\" w:lineRule=\"auto\"/>\r\n <w:ind w:firstLine=\"709\"/>\r\n <w:jc w:val=\"both\"/>\r\n </w:pPr>\r\n </w:pPrDefault>\r\n </w:docDefaults>\r\n <w:latentStyles w:defLockedState=\"0\" w:defUIPriority=\"99\" w:defSemiHidden=\"0\" w:defUnhideWhenUsed=\"0\"\r\n w:defQFormat=\"0\" w:count=\"376\">\r\n <w:lsdException w:name=\"Normal\" w:uiPriority=\"0\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 1\" w:uiPriority=\"9\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 2\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 3\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 4\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 5\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 6\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 7\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 8\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 9\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"index 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 6\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 7\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 8\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 9\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 1\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 2\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 3\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 4\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 5\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 6\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 7\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 8\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 9\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Normal Indent\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"footnote text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"annotation text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"header\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"footer\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index heading\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"caption\" w:semiHidden=\"1\" w:uiPriority=\"35\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"table of figures\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"envelope address\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"envelope return\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"footnote reference\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"annotation reference\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"line number\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"page number\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"endnote reference\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"endnote text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"table of authorities\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"macro\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toa heading\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Title\" w:uiPriority=\"10\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Closing\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Signature\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Default Paragraph Font\" w:semiHidden=\"1\" w:uiPriority=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text Indent\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Message Header\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Subtitle\" w:uiPriority=\"11\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Salutation\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Date\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text First Indent\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text First Indent 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Note Heading\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text Indent 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text Indent 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Block Text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Hyperlink\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"FollowedHyperlink\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Strong\" w:uiPriority=\"22\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Emphasis\" w:uiPriority=\"20\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Document Map\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Plain Text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"E-mail Signature\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Top of Form\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Bottom of Form\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Normal (Web)\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Acronym\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Address\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Cite\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Code\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Definition\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Keyboard\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Preformatted\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Sample\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Typewriter\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Variable\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Normal Table\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"annotation subject\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"No List\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Outline List 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Outline List 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Outline List 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Simple 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Simple 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Simple 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Classic 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Classic 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Classic 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Classic 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Colorful 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Colorful 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Colorful 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 6\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 7\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 8\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 6\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 7\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 8\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table 3D effects 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table 3D effects 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table 3D effects 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Contemporary\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Elegant\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Professional\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Subtle 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Subtle 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Web 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Web 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Web 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Balloon Text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid\" w:uiPriority=\"39\"/>\r\n <w:lsdException w:name=\"Table Theme\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Placeholder Text\" w:semiHidden=\"1\"/>\r\n <w:lsdException w:name=\"No Spacing\" w:uiPriority=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Light Shading\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 1\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 1\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 1\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 1\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 1\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 1\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Revision\" w:semiHidden=\"1\"/>\r\n <w:lsdException w:name=\"List Paragraph\" w:uiPriority=\"34\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Quote\" w:uiPriority=\"29\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Intense Quote\" w:uiPriority=\"30\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 1\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 1\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 1\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 1\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 1\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 1\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 1\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 1\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 2\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 2\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 2\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 2\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 2\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 2\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 2\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 2\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 2\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 2\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 2\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 2\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 2\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 2\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 3\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 3\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 3\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 3\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 3\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 3\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 3\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 3\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 3\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 3\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 3\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 3\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 3\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 3\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 4\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 4\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 4\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 4\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 4\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 4\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 4\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 4\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 4\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 4\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 4\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 4\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 4\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 4\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 5\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 5\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 5\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 5\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 5\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 5\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 5\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 5\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 5\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 5\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 5\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 5\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 5\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 5\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 6\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 6\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 6\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 6\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 6\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 6\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 6\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 6\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 6\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 6\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 6\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 6\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 6\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 6\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Subtle Emphasis\" w:uiPriority=\"19\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Intense Emphasis\" w:uiPriority=\"21\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Subtle Reference\" w:uiPriority=\"31\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Intense Reference\" w:uiPriority=\"32\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Book Title\" w:uiPriority=\"33\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Bibliography\" w:semiHidden=\"1\" w:uiPriority=\"37\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"TOC Heading\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Plain Table 1\" w:uiPriority=\"41\"/>\r\n <w:lsdException w:name=\"Plain Table 2\" w:uiPriority=\"42\"/>\r\n <w:lsdException w:name=\"Plain Table 3\" w:uiPriority=\"43\"/>\r\n <w:lsdException w:name=\"Plain Table 4\" w:uiPriority=\"44\"/>\r\n <w:lsdException w:name=\"Plain Table 5\" w:uiPriority=\"45\"/>\r\n <w:lsdException w:name=\"Grid Table Light\" w:uiPriority=\"40\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 1\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 1\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 1\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 1\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 1\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 1\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 1\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 2\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 2\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 2\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 2\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 2\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 2\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 2\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 3\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 3\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 3\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 3\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 3\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 3\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 3\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 4\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 4\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 4\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 4\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 4\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 4\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 4\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 5\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 5\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 5\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 5\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 5\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 5\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 5\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 6\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 6\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 6\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 6\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 6\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 6\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 6\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 1\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 1\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 1\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 1\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 1\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 1\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 1\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 2\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 2\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 2\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 2\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 2\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 2\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 2\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 3\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 3\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 3\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 3\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 3\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 3\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 3\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 4\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 4\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 4\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 4\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 4\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 4\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 4\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 5\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 5\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 5\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 5\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 5\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 5\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 5\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 6\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 6\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 6\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 6\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 6\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 6\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 6\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Mention\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Smart Hyperlink\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Hashtag\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Unresolved Mention\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Smart Link\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n </w:latentStyles>\r\n <w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"a\">\r\n <w:name w:val=\"Normal\"/>\r\n <w:qFormat/>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"1\">\r\n <w:name w:val=\"heading 1\"/>\r\n <w:aliases w:val=\"Заголовок 1 ГОСТ\"/>\r\n <w:basedOn w:val=\"a\"/>\r\n <w:next w:val=\"a\"/>\r\n <w:link w:val=\"10\"/>\r\n <w:autoRedefine/>\r\n <w:uiPriority w:val=\"9\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"002E4B92\"/>\r\n <w:pPr>\r\n <w:keepNext/>\r\n <w:keepLines/>\r\n <w:spacing w:before=\"240\" w:after=\"240\"/>\r\n <w:jc w:val=\"center\"/>\r\n <w:outlineLvl w:val=\"0\"/>\r\n </w:pPr>\r\n <w:rPr>\r\n <w:rFonts w:eastAsiaTheme=\"majorEastAsia\" w:cstheme=\"majorBidi\"/>\r\n <w:b/>\r\n <w:szCs w:val=\"32\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"character\" w:default=\"1\" w:styleId=\"a0\">\r\n <w:name w:val=\"Default Paragraph Font\"/>\r\n <w:uiPriority w:val=\"1\"/>\r\n <w:semiHidden/>\r\n <w:unhideWhenUsed/>\r\n </w:style>\r\n <w:style w:type=\"table\" w:default=\"1\" w:styleId=\"a1\">\r\n <w:name w:val=\"Normal Table\"/>\r\n <w:uiPriority w:val=\"99\"/>\r\n <w:semiHidden/>\r\n <w:unhideWhenUsed/>\r\n <w:tblPr>\r\n <w:tblInd w:w=\"0\" w:type=\"dxa\"/>\r\n <w:tblCellMar>\r\n <w:top w:w=\"0\" w:type=\"dxa\"/>\r\n <w:left w:w=\"108\" w:type=\"dxa\"/>\r\n <w:bottom w:w=\"0\" w:type=\"dxa\"/>\r\n <w:right w:w=\"108\" w:type=\"dxa\"/>\r\n </w:tblCellMar>\r\n </w:tblPr>\r\n </w:style>\r\n <w:style w:type=\"numbering\" w:default=\"1\" w:styleId=\"a2\">\r\n <w:name w:val=\"No List\"/>\r\n <w:uiPriority w:val=\"99\"/>\r\n <w:semiHidden/>\r\n <w:unhideWhenUsed/>\r\n </w:style>\r\n <w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"10\">\r\n <w:name w:val=\"Заголовок 1 Знак\"/>\r\n <w:aliases w:val=\"Заголовок 1 ГОСТ Знак\"/>\r\n <w:basedOn w:val=\"a0\"/>\r\n <w:link w:val=\"1\"/>\r\n <w:uiPriority w:val=\"9\"/>\r\n <w:rsid w:val=\"002E4B92\"/>\r\n <w:rPr>\r\n <w:rFonts w:eastAsiaTheme=\"majorEastAsia\" w:cstheme=\"majorBidi\"/>\r\n <w:b/>\r\n <w:szCs w:val=\"32\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"a3\">\r\n <w:name w:val=\"ГОСТ\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"00A41BB6\"/>\r\n <w:pPr>\r\n <w:spacing w:before=\"240\" w:after=\"240\"/>\r\n <w:ind w:firstLine=\"0\"/>\r\n <w:jc w:val=\"center\"/>\r\n </w:pPr>\r\n <w:rPr>\r\n <w:rFonts w:cs=\"Times New Roman\"/>\r\n <w:b/>\r\n <w:bCs/>\r\n <w:color w:val=\"auto\"/>\r\n <w:kern w:val=\"0\"/>\r\n <w:szCs w:val=\"28\"/>\r\n <w14:ligatures w14:val=\"none\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"a4\">\r\n <w:name w:val=\"ГОСТ Заголовок или подзаголовок\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"00A41BB6\"/>\r\n <w:pPr>\r\n <w:spacing w:before=\"240\" w:after=\"400\"/>\r\n <w:ind w:firstLine=\"0\"/>\r\n <w:jc w:val=\"center\"/>\r\n </w:pPr>\r\n <w:rPr>\r\n <w:rFonts w:cs=\"Times New Roman\"/>\r\n <w:b/>\r\n <w:bCs/>\r\n <w:kern w:val=\"0\"/>\r\n <w:szCs w:val=\"28\"/>\r\n <w14:ligatures w14:val=\"none\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"a5\">\r\n <w:name w:val=\"ГОСТ Заголовок\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"00A41BB6\"/>\r\n <w:pPr>\r\n <w:spacing w:before=\"240\" w:after=\"400\"/>\r\n <w:ind w:firstLine=\"0\"/>\r\n <w:jc w:val=\"center\"/>\r\n </w:pPr>\r\n <w:rPr>\r\n <w:rFonts w:cs=\"Times New Roman\"/>\r\n <w:b/>\r\n <w:bCs/>\r\n <w:kern w:val=\"0\"/>\r\n <w:szCs w:val=\"28\"/>\r\n <w14:ligatures w14:val=\"none\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"a6\">\r\n <w:name w:val=\"ГОСТ Подзаголовок\"/>\r\n <w:basedOn w:val=\"a5\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"00A41BB6\"/>\r\n <w:pPr>\r\n <w:spacing w:after=\"240\"/>\r\n <w:ind w:firstLine=\"709\"/>\r\n <w:jc w:val=\"both\"/>\r\n </w:pPr>\r\n </w:style>\r\n <w:style w:type=\"table\" w:styleId=\"a7\">\r\n <w:name w:val=\"Table Grid\"/>\r\n <w:basedOn w:val=\"a1\"/>\r\n <w:uiPriority w:val=\"39\"/>\r\n <w:rsid w:val=\"0092750D\"/>\r\n <w:pPr>\r\n <w:spacing w:line=\"240\" w:lineRule=\"auto\"/>\r\n </w:pPr>\r\n <w:tblPr>\r\n <w:tblBorders>\r\n <w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n </w:tblBorders>\r\n </w:tblPr>\r\n </w:style>\r\n</w:styles>`\r\n}","export const theme1 = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Тема Office\"><a:themeElements><a:clrScheme name=\"Стандартная\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"4472C4\"/></a:accent1><a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4><a:accent5><a:srgbClr val=\"5B9BD5\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink><a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Стандартная\"><a:majorFont><a:latin typeface=\"Calibri Light\" panose=\"020F0302020204030204\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"游ゴシック Light\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"等线 Light\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Times New Roman\"/><a:font script=\"Hebr\" typeface=\"Times New Roman\"/><a:font script=\"Thai\" typeface=\"Angsana New\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"MoolBoran\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Times New Roman\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/><a:font script=\"Armn\" typeface=\"Arial\"/><a:font script=\"Bugi\" typeface=\"Leelawadee UI\"/><a:font script=\"Bopo\" typeface=\"Microsoft JhengHei\"/><a:font script=\"Java\" typeface=\"Javanese Text\"/><a:font script=\"Lisu\" typeface=\"Segoe UI\"/><a:font script=\"Mymr\" typeface=\"Myanmar Text\"/><a:font script=\"Nkoo\" typeface=\"Ebrima\"/><a:font script=\"Olck\" typeface=\"Nirmala UI\"/><a:font script=\"Osma\" typeface=\"Ebrima\"/><a:font script=\"Phag\" typeface=\"Phagspa\"/><a:font script=\"Syrn\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syrj\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syre\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Sora\" typeface=\"Nirmala UI\"/><a:font script=\"Tale\" typeface=\"Microsoft Tai Le\"/><a:font script=\"Talu\" typeface=\"Microsoft New Tai Lue\"/><a:font script=\"Tfng\" typeface=\"Ebrima\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\" panose=\"020F0502020204030204\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"游明朝\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"等线\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Arial\"/><a:font script=\"Hebr\" typeface=\"Arial\"/><a:font script=\"Thai\" typeface=\"Cordia New\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"DaunPenh\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Arial\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/><a:font script=\"Armn\" typeface=\"Arial\"/><a:font script=\"Bugi\" typeface=\"Leelawadee UI\"/><a:font script=\"Bopo\" typeface=\"Microsoft JhengHei\"/><a:font script=\"Java\" typeface=\"Javanese Text\"/><a:font script=\"Lisu\" typeface=\"Segoe UI\"/><a:font script=\"Mymr\" typeface=\"Myanmar Text\"/><a:font script=\"Nkoo\" typeface=\"Ebrima\"/><a:font script=\"Olck\" typeface=\"Nirmala UI\"/><a:font script=\"Osma\" typeface=\"Ebrima\"/><a:font script=\"Phag\" typeface=\"Phagspa\"/><a:font script=\"Syrn\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syrj\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syre\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Sora\" typeface=\"Nirmala UI\"/><a:font script=\"Tale\" typeface=\"Microsoft Tai Le\"/><a:font script=\"Talu\" typeface=\"Microsoft New Tai Lue\"/><a:font script=\"Tfng\" typeface=\"Ebrima\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Стандартная\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:satMod val=\"103000\"/><a:lumMod val=\"102000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"110000\"/><a:lumMod val=\"100000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\" algn=\"ctr\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"63000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"93000\"/><a:satMod val=\"150000\"/><a:shade val=\"98000\"/><a:lumMod val=\"102000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:tint val=\"98000\"/><a:satMod val=\"130000\"/><a:shade val=\"90000\"/><a:lumMod val=\"103000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"63000\"/><a:satMod val=\"120000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/><a:extLst><a:ext uri=\"{05A4C25C-085E-4340-85A3-A5531E510DB2}\"><thm15:themeFamily xmlns:thm15=\"http://schemas.microsoft.com/office/thememl/2012/main\" name=\"Office Theme\" id=\"{62F939B6-93AF-4DB8-9C6B-D6C7DFDC589F}\" vid=\"{4A3C46E8-61CC-4603-A589-7422A47A8E4A}\"/></a:ext></a:extLst></a:theme>`\r\n}","export const webSettings = () => {\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:webSettings xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\r\n xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\r\n xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\r\n xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\"\r\n xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"\r\n xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\"\r\n xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\"\r\n xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\"\r\n mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\">\r\n <w:optimizeForBrowser/>\r\n <w:allowPNG/>\r\n</w:webSettings>`\r\n}","import {contentTypes} from \"../xml-confs/contentTypes\";\r\nimport {rels} from \"../xml-confs/_rels/rels\";\r\nimport {app} from \"../xml-confs/docProps/app\";\r\nimport {documentXmlRels} from \"../xml-confs/word/_rels/documentXmlRels\";\r\nimport {fontTable} from \"../xml-confs/word/fontTable\";\r\nimport {settings} from \"../xml-confs/word/settings\";\r\nimport {document as createDocumentFile} from \"../xml-confs/word/document\";\r\nimport {styles} from \"../xml-confs/word/styles\";\r\nimport {theme1} from \"../xml-confs/word/theme/theme1\";\r\nimport {webSettings} from \"../xml-confs/word/webSettings\";\r\nimport JSZip from \"jszip\";\r\n\r\n\r\ninterface IProps {\r\n data: string,\r\n format?: 'A4' | 'A3' | 'A2' | 'A1',\r\n orientation?: 'landscape' | 'vertical',\r\n fileName: string\r\n}\r\n\r\nexport async function generateDocx({data, format, orientation, fileName}: IProps) {\r\n\r\n const zip = new JSZip();\r\n\r\n // [Content_Types].xml\r\n zip.file('[Content_Types].xml', contentTypes());\r\n\r\n // _rels/.rels\r\n zip.file('_rels/.rels', rels());\r\n\r\n // docProps/app.xml\r\n zip.file('docProps/app.xml', app());\r\n\r\n // word/_rels/document.xml.rels\r\n zip.file('word/_rels/document.xml.rels', documentXmlRels());\r\n\r\n // word/document.xml\r\n zip.file('word/document.xml', createDocumentFile(data, format, orientation))\r\n\r\n // word/fontTable.xml\r\n zip.file('word/fontTable.xml', fontTable())\r\n\r\n // word/settings.xml\r\n zip.file('word/settings.xml', settings());\r\n\r\n // word/styles.xml\r\n zip.file('word/styles.xml', styles());\r\n\r\n // word/theme/theme1.xml\r\n zip.file('word/theme/theme1.xml', theme1());\r\n\r\n // word/webSettings.xml\r\n zip.file('word/webSettings.xml', webSettings());\r\n\r\n // Создаем архив\r\n const content = await zip.generateAsync({type: 'blob'});\r\n\r\n const downloadUrl = window.URL.createObjectURL(new Blob([content]));\r\n const link = document.createElement('a');\r\n link.href = downloadUrl;\r\n link.setAttribute('download', fileName + '.docx'); // Установка имени файла\r\n\r\n // Эмуляция клика на ссылку\r\n document.body.appendChild(link);\r\n link.click();\r\n\r\n // Удаление ссылки после скачивания файла\r\n document.body.removeChild(link);\r\n}","import {\r\n createEndSpan,\r\n createStartSpan,\r\n createTagBr,\r\n createTagH1,\r\n createTagH1ToH6,\r\n createTagP,\r\n createTagSpan\r\n} from \"../createXmlTags\";\r\nimport { convertHtmlTbToXml } from \"./convertHtmlTbToXml\";\r\n\r\nexport const convertJsxElementToXml = (el: HTMLDivElement | HTMLElement, width: number) => {\r\n\r\n let listXmlStr: string[] = []\r\n\r\n const arr = el.querySelectorAll('h1, h2, h3, h4, h5, h6, p, span, br, table')\r\n\r\n if (arr && arr.length > 0) {\r\n let span = ''\r\n arr.forEach((opt, index) => {\r\n if (opt.textContent !== null) {\r\n if (opt.tagName === 'H1') {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(createTagH1(opt.textContent))\r\n } else {\r\n listXmlStr.push(createTagH1(opt.textContent))\r\n }\r\n } else if (opt.tagName === 'H2' || opt.tagName === 'H3' || opt.tagName === 'H4' || opt.tagName === 'H5' || opt.tagName === 'H6') {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(createTagH1ToH6(opt.textContent))\r\n } else {\r\n listXmlStr.push(createTagH1ToH6(opt.textContent))\r\n }\r\n } else if (opt.tagName === 'P') {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(createTagP(opt.textContent))\r\n } else {\r\n listXmlStr.push(createTagP(opt.textContent))\r\n }\r\n } else if (opt.tagName === 'SPAN') {\r\n if (span === '') {\r\n span = createStartSpan()\r\n span += createTagSpan(opt.textContent)\r\n } else {\r\n span += createTagSpan(opt.textContent)\r\n }\r\n if (arr.length === index + 1) {\r\n listXmlStr.push(span += createEndSpan())\r\n }\r\n } else if (opt.tagName === 'BR') {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(createTagBr())\r\n } else {\r\n listXmlStr.push(createTagBr())\r\n }\r\n } else if (opt.tagName === \"TABLE\") {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(convertHtmlTbToXml(opt, width))\r\n } else {\r\n listXmlStr.push(convertHtmlTbToXml(opt, width))\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n return listXmlStr.join('')\r\n}","export function jsxToHtml(element: string): Promise<HTMLDivElement | null> {\r\n return new Promise((resolve) => {\r\n\r\n const container = document.createElement('div');\r\n\r\n container.innerHTML = element\r\n\r\n const allElements: HTMLElement[] = Array.from(container.querySelectorAll('h1, h2, h3, h4, h5, h6, p, span, br, table'));\r\n\r\n if (allElements && allElements.length > 0) {\r\n const divBlock = document.createElement('div')\r\n allElements.forEach(opt => {\r\n divBlock.appendChild(opt)\r\n })\r\n resolve(divBlock);\r\n } else {\r\n resolve(null);\r\n }\r\n\r\n\r\n // const container = document.createElement('div');\r\n // const root = ReactDOM.createRoot(container);\r\n // const observer = new MutationObserver((mutationsList) => {\r\n // for (const mutation of mutationsList) {\r\n // if (mutation.addedNodes.length) {\r\n // const allElements: HTMLElement[] = Array.from(container.querySelectorAll('h1, h2, h3, h4, h5, h6, p, span, br, table'));\r\n // if (allElements) {\r\n // observer.disconnect(); // Отключаем наблюдателя\r\n //\r\n // const divBlock = document.createElement('div')\r\n // allElements.forEach(opt => {\r\n // divBlock.appendChild(opt)\r\n // })\r\n // resolve(divBlock);\r\n // }\r\n // }\r\n // }\r\n // });\r\n //\r\n // root.render(element);\r\n //\r\n // observer.observe(container, {childList: true, subtree: true});\r\n });\r\n}","import { convertHtmlTbToXml } from \"./functions/convertHtmlToXml/convertHtmlTbToXml\";\r\nimport { generateDocx } from \"./functions/generateDocx\";\r\nimport { convertJsxElementToXml } from \"./functions/convertHtmlToXml/convertJsxElementToXml\";\r\nimport { jsxToHtml } from \"./functions/jsxToHtml\";\r\n\r\nexport interface IfExportHtmlOrJsxToWord {\r\n tableId?: string,\r\n divId?: string,\r\n fileName: string,\r\n jsxElement?: string,\r\n format?: 'A4' | 'A3' | 'A2' | 'A1',\r\n orientation?: 'landscape' | 'vertical'\r\n}\r\n\r\nexport const fExportHtmlOrJsxToWord = async ({\r\n tableId,\r\n fileName,\r\n jsxElement,\r\n format = \"A4\",\r\n orientation = 'vertical',\r\n divId\r\n}: IfExportHtmlOrJsxToWord) => {\r\n\r\n let width = 0\r\n\r\n switch (format) {\r\n\r\n case \"A4\":\r\n width = (orientation === 'landscape' ? 16838 : 11906) - (orientation === 'landscape' ? 851 : 567) - (orientation === 'landscape' ? 1701 : 1701)\r\n break;\r\n case \"A3\":\r\n width = (orientation === 'landscape' ? 23803 : 16817) - (orientation === 'landscape' ? 851 : 851) - (orientation === 'landscape' ? 1418 : 1418)\r\n break;\r\n case \"A2\":\r\n width = (orientation === 'landscape' ? 31678 : 23803) - (orientation === 'landscape' ? 1134 : 1134) - (orientation === 'landscape' ? 1701 : 1701)\r\n break;\r\n case \"A1\":\r\n width = (orientation === 'landscape' ? 31678 : 31678) - (orientation === 'landscape' ? 1701 : 1701) - (orientation === 'landscape' ? 2268 : 2268)\r\n break;\r\n }\r\n\r\n if (tableId !== undefined && jsxElement === undefined && divId === undefined) {\r\n const htmlTable = document.getElementById(tableId);\r\n if (htmlTable) {\r\n const stringTb = convertHtmlTbToXml(htmlTable, width)\r\n await generateDocx({ data: stringTb, format: format, orientation: orientation, fileName: fileName })\r\n return true\r\n } else {\r\n return false\r\n }\r\n } else if (jsxElement !== undefined && divId === undefined && tableId === undefined) {\r\n\r\n let status: boolean = false\r\n\r\n await jsxToHtml(jsxElement).then(async (element) => {\r\n if (element !== null) {\r\n await generateDocx({\r\n data: convertJsxElementToXml(element, width),\r\n format: format,\r\n orientation: orientation,\r\n fileName: fileName\r\n })\r\n status = true\r\n } else {\r\n status = false\r\n }\r\n });\r\n\r\n return status\r\n } else if (divId !== undefined && jsxElement === undefined && tableId === undefined) {\r\n\r\n const divBlock: HTMLElement | null = document.getElementById(divId);\r\n\r\n if (divBlock !== null) {\r\n await generateDocx({\r\n data: convertJsxElementToXml(divBlock, width),\r\n format: format,\r\n orientation: orientation,\r\n fileName: fileName\r\n })\r\n return true\r\n } else {\r\n return false\r\n }\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default fExportHtmlOrJsxToWord\r\n","/**\r\n * Модуль для экспорта HTML-содержимого в формате JSX или строки в .docx файл.\r\n * @module fExportingHtmlToDocx\r\n */\r\n\r\nimport initializeModule from \"allorion-exporting-html-to-docx\";\r\nimport { IExportingHtmlToDocx } from \"allorion-exporting-html-to-docx/dist/exportingHtmlToDocx\";\r\nimport { renderToStaticMarkup } from \"react-dom/server\";\r\n\r\n/**\r\n * Объект с лицензией, необходимой для инициализации модуля экспорта.\r\n *\r\n * @constant\r\n * @type {{ licenseKey: string; signature: string }}\r\n */\r\nconst license = {\r\n licenseKey: 'fui',\r\n signature: 'ae3cbfc5f7847676551a091fabbe9e6fcda7cf028c64b32b918d2206c877cfc979535e9bc9a27bba4e25891f9e8a16d9c99a789669d8f764e7d3633e7a5c286dd9e1fb8dd3253b9389bc98558cd37cf34a76342e1b8ec329895766a0815aa0153ef06589d644d42b666995b6c833130606812bb7a4a8f52710f503664af5751b3d2da5856343eb136b194a9c5cf0b1337e7cbce459a1955ac41f5d6ba4e981b9b4b7ab740a8e415e2277d41f0f362adaf5cccf2be70334a2c25c2dd91f9801228c25234675e9917b94605e5462315ec7c9ef2a4156ff1a3c3a9d732198b43651a57c61640ee057972b95a8feace736379c95b9a1f4ab684c6ada4d266b92f667',\r\n};\r\n\r\n/**\r\n * Расширенный интерфейс параметров для настройки экспорта HTML в DOCX.\r\n *\r\n * @interface IProps\r\n * @extends {Omit<IExportingHtmlToDocx, 'jsxElement'>}\r\n */\r\nexport interface IProps extends Omit<IExportingHtmlToDocx, 'jsxElement'> {\r\n /**\r\n * JSX-элемент или строка HTML, которую нужно экспортировать.\r\n * Если передано как JSX, будет автоматически преобразовано в статическую разметку.\r\n * @type {string | JSX.Element | undefined}\r\n */\r\n jsxElement?: string | JSX.Element;\r\n}\r\n\r\n/**\r\n * Асинхронная функция, которая инициализирует модуль экспорта в формат .docx и запускает его.\r\n *\r\n * Если лицензия не прошла проверку, возвращает пустую функцию и выводит ошибку.\r\n *\r\n * @function fExportingHtmlToDocx\r\n * \r\n * @param {string | JSX.Element | undefined} [jsxElement] - HTML/JSX содержимое для экспорта. Если JSX — конвертируется в строку через `renderToStaticMarkup`.\r\n * @param {string | undefined} [divId] - ID div-блока на странице, содержимое которого будет использовано для экспорта.\r\n * @param {string | undefined} [fileName='export.docx'] - Имя файла, под которым будет сохранён `.docx` документ.\r\n * @param {'A4' | 'A3' | 'A2' | 'A1'} [format='A4'] - Формат листа документа.\r\n * @param {'landscape' | 'vertical'} [orientation='landscape'] - Ориентация страниц (`landscape` — горизонтальная, `vertical` — вертикальная).\r\n * \r\n * @returns {Promise<Function>} Возвращает промис, который резолвится:\r\n * - Функцией для начала загрузки файла `.docx`, если всё прошло успешно.\r\n * - Пустой функцией, если лицензия недействительна.\r\n *\r\n * @example\r\n * // Экспорт из JSX\r\n * const MyComponent = () => <div><h1>Отчет</h1><p>Текст отчета</p></div>;\r\n * fExportingHtmlToDocx({\r\n * fileName: 'report.docx',\r\n * jsxElement: <MyComponent />,\r\n * }).then(downloadFn => downloadFn());\r\n *\r\n * @example\r\n * // Экспорт из строки HTML\r\n * fExportingHtmlToDocx({\r\n * fileName: 'document.docx',\r\n * jsxElement: '<h1>Заголовок</h1><p>Параграф текста</p>',\r\n * }).then(downloadFn => downloadFn());\r\n *\r\n * @example\r\n * // Экспорт из див блока по ID\r\n * fExportingHtmlToDocx({\r\n * fileName: 'report.docx',\r\n * divId: 'export-data',\r\n * }).then(downloadFn => downloadFn());\r\n */\r\nconst fExportingHtmlToDocx = async (data: IProps) => {\r\n const licenseFlag = await initializeModule(license);\r\n if (licenseFlag === null) {\r\n console.error('Лицензия для модуля allorion-exporting-html-to-docx устарела');\r\n return () => { };\r\n } else {\r\n if (data.jsxElement !== undefined) {\r\n if (typeof data.jsxElement !== 'string') {\r\n data.jsxElement = renderToStaticMarkup(data.jsxElement);\r\n }\r\n }\r\n return licenseFlag(data as IExportingHtmlToDocx);\r\n }\r\n};\r\n\r\nexport default fExportingHtmlToDocx;","/**\r\n * Модуль для экспорта HTML-содержимого в формате JSX или строки в .xlsx файл.\r\n * @module fExportingHtmlToXlsx\r\n */\r\n\r\nimport { initializeModule } from \"allorion-exporting-html-to-xlsx\";\r\nimport { IExportingHtmlToXlsx } from \"allorion-exporting-html-to-xlsx/dist/exportingHtmlToXlsx\";\r\nimport { renderToStaticMarkup } from \"react-dom/server\";\r\n\r\n/**\r\n * Объект с лицензией, необходимой для инициализации модуля экспорта.\r\n *\r\n * @constant\r\n * @type {{ licenseKey: string; signature: string }}\r\n */\r\nconst license = {\r\n licenseKey: 'fui',\r\n signature: '99626fe6091102cfb69544832775098aa38f28e76d771f928b8e12138688588537bc89f7dd8a3e73188d8ce58d11f4bdf26e6febf88021786f38f2c4440cdec6fb262ae2d1fa32d0b59068b8923b712bf0310501ab76b31fcc31b0a43073509a3bdc235fe7e3ed49506c1e086444af0c2fc8dff79cf23f417119d96ac4b4eb1588a56dc657db64f782012468ce03fd134c9245cd3f2464d920a30a4c4af831b0f4868f738b815855d846eaa992e55cb73d2aa0bc4e24aa5992751b9721d241f0aa8b0d080359bd19ab74d738dd69bc9f22de22aa888023b4e7d3154a9dc76beb277a3fa3dec115fa591a8d16593d4fae9e604fcf0fc9965e3799145b64cccc0d',\r\n};\r\n\r\n/**\r\n * Расширенный интерфейс параметров для настройки экспорта HTML в XLSX.\r\n *\r\n * @interface IProps\r\n * @extends {Omit<IExportingHtmlToXlsx, 'jsxElement'>}\r\n */\r\ninterface IProps extends Omit<IExportingHtmlToXlsx, 'jsxElement'> {\r\n jsxElement?: string | JSX.Element;\r\n}\r\n\r\n/**\r\n * Асинхронная функция, которая инициализирует модуль экспорта HTML в формат XLSX (Excel) и запускает экспорт.\r\n *\r\n * Если лицензия не прошла проверку, возвращает пустую функцию и выводит ошибку.\r\n *\r\n * @function fExportingHtmlToXlsx\r\n *\r\n * @param {string | JSX.Element | undefined} [jsxElement] - JSX-элемент или строка HTML, которую нужно экспортировать.\r\n * Если передан как JSX — автоматически преобразуется в статическую разметку через `renderToStaticMarkup`.\r\n *\r\n * @param {string | undefined} [divId] - ID DOM-элемента на странице, содержимое которого будет использовано для экспорта.\r\n * Используется вместо `jsxElement`.\r\n *\r\n * @param {string} [fileName='export.xlsx'] - Название файла, под которым будет сохранён `.xlsx` документ.\r\n *\r\n * @param {'base64' | 'string' | 'text' | 'binarystring' | 'array' | 'uint8array' | 'arraybuffer' | 'blob' | 'nodebuffer'} [getFile] - Тип выходных данных:\r\n *\r\n * @returns {Promise<Function>} Возвращает промис, который резолвится:\r\n * - Функцией, начинающей загрузку файла `.xlsx` (или возвращающей данные, в зависимости от `getFile`),\r\n * - Пустой функцией, если лицензия недействительна.\r\n *\r\n * @example\r\n * // Экспорт из JSX\r\n * const MyTable = () => (\r\n * <table>\r\n * <tr><th>Имя</th><th>Возраст</th></tr>\r\n * <tr><td>Анна</td><td>25</td></tr>\r\n * </table>\r\n * );\r\n *\r\n * fExportingHtmlToXlsx({\r\n * fileName: 'report.xlsx',\r\n * jsxElement: <MyTable />,\r\n * }).then(downloadFn => downloadFn());\r\n *\r\n * @example\r\n * // Экспорт по ID элемента\r\n * fExportingHtmlToXlsx({\r\n * fileName: 'document.xlsx',\r\n * divId: 'my-table-id'\r\n * }).then(downloadFn => downloadFn());\r\n *\r\n * @example\r\n * // Получение файла в формате Base64\r\n * fExportingHtmlToXlsx({\r\n * fileName: 'data.xlsx',\r\n * jsxElement: '<table><tr><td>Пример</td></tr></table>',\r\n * getFile: 'base64'\r\n * }).then((getFileFn) => {\r\n * getFileFn().then(base64 => {\r\n * console.log('Base64:', base64);\r\n * });\r\n * });\r\n */\r\nconst fExportingHtmlToXlsx = async (data: IProps) => {\r\n\r\n const licenseFlag = await initializeModule(license)\r\n if (licenseFlag === null) {\r\n console.error('Лицензия для модуля allorion-exporting-html-to-xlsx устарела');\r\n return () => { }\r\n } else {\r\n console.log('Лицензия для модуля allorion-exporting-html-to-xlsx установлена');\r\n if (data.jsxElement !== undefined) {\r\n if (typeof data.jsxElement !== 'string') {\r\n data.jsxElement = renderToStaticMarkup(data.jsxElement)\r\n }\r\n }\r\n return licenseFlag(data as IExportingHtmlToXlsx)\r\n }\r\n}\r\n\r\nexport default fExportingHtmlToXlsx","/**\r\n * Интерфейс, описывающий формат настройки ячейки Excel.\r\n *\r\n * @property {number} [numFmtId] - Идентификатор стандартного формата Excel (например, 9 — это числовой формат).\r\n * @property {{ code: string; type?: ITypeCell }} [formatCode] - Пользовательский формат:\r\n * - `code` — строка формата (например `'0.00%'` или `'yyyy-mm-dd'`),\r\n * - `type` — тип данных (опционально, может быть `'date'`, `'text'`, `'number'` и т.д.).\r\n */\r\n\r\n/**\r\n * Перечисление допустимых типов данных ячейки.\r\n *\r\n * @typedef {'date' | 'text' | 'number' | 'string'} ITypeCell\r\n * @see ICellFormat\r\n */\r\n\r\n/**\r\n * Устанавливает формат ячейки в XLSX-документе.\r\n *\r\n * Функция принимает либо готовый идентификатор стандартного формата (`numFmtId`), либо пользовательский (`formatCode`).\r\n *\r\n * ⚠️ **Ошибка**, если указаны оба параметра или ни один не указан.\r\n *\r\n * @function fInstallFormatCodeXlsx\r\n * @param {ICellFormat} data - Объект с одним из параметров:\r\n * - `numFmtId` — стандартный ID формата Excel,\r\n * - `formatCode` — пользовательский формат:\r\n * - `code` — строка формата (например `'0.00%'`),\r\n * - `type` — тип данных (например `'number'`, `'date'`)\r\n *\r\n * @returns {string} JSON-строка с указанным форматом:\r\n * - `{ \"numFmtId\": 9 }`\r\n * - `{ \"formatCode\": { \"code\": \"0.00%\", \"type\": \"number\" } }`\r\n *\r\n * @throws {Error} Если указаны оба параметра или ни один не указан.\r\n *\r\n * @example\r\n * // Пример использования с numFmtId\r\n * const format = fInstallFormatCodeXlsx({ numFmtId: 9 });\r\n * console.log(format); // {\"numFmtId\":9}\r\n *\r\n * @example\r\n * // Пример использования с пользовательским форматом\r\n * const format = fInstallFormatCodeXlsx({\r\n * formatCode: {\r\n * code: '0.00%',\r\n * type: 'number'\r\n * }\r\n * });\r\n * console.log(format); // {\"formatCode\":{\"code\":\"0.00%\",\"type\":\"number\"}}\r\n *\r\n * @example\r\n * // Ошибка: указаны оба параметра\r\n * try {\r\n * fInstallFormatCodeXlsx({\r\n * numFmtId: 1,\r\n * formatCode: { code: '0.00%' }\r\n * });\r\n * } catch (e) {\r\n * console.error(e.message); // \"Можно указать только один из параметров: numFmtId или formatCode.\"\r\n * }\r\n *\r\n * @example\r\n * // Ошибка: не указано ничего\r\n * try {\r\n * fInstallFormatCodeXlsx({});\r\n * } catch (e) {\r\n * console.error(e.message); // \"Необходимо указать либо numFmtId, либо formatCode.\"\r\n * }\r\n */\r\nimport { installFormatCode } from \"allorion-exporting-html-to-xlsx\";\r\nimport type { ICellFormat } from \"allorion-exporting-html-to-xlsx/dist/type\";\r\n\r\nconst fInstallFormatCodeXlsx = (data: ICellFormat) => installFormatCode(data);\r\n\r\nexport default fInstallFormatCodeXlsx;","import fGenerateUniqueId from '@dop-function/fGenerateUniqueId';\r\nimport styles from './fNotification.module.scss';\r\n\r\n/**\r\n * Интерфейс, описывающий параметры модального уведомления.\r\n * @interface IfNotification\r\n */\r\nexport interface IfNotification {\r\n /**\r\n * Заголовок уведомления (необязательный).\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Основной текст уведомления. Обязательное поле.\r\n * Может содержать переносы строк (`\\n`), которые будут преобразованы в отдельные `<span>`.\r\n * @type {string}\r\n */\r\n body: string;\r\n\r\n /**\r\n * Тип уведомления. Определяет цветовую схему и иконку.\r\n * @type {'info' | 'error' | 'success' | 'warning'}\r\n */\r\n variant: 'info' | 'error' | 'success' | 'warning';\r\n\r\n /**\r\n * Время автозакрытия уведомления в секундах.\r\n * Если не указано — уведомление закрывается только по клику на кнопку \"Закрыть\".\r\n * @type {number | undefined}\r\n */\r\n timeSecClose?: number;\r\n\r\n /**\r\n * Показывать ли кнопку закрытия уведомления.\r\n * По умолчанию: `false`.\r\n * @type {boolean | undefined}\r\n */\r\n buttonClose?: boolean;\r\n\r\n /**\r\n * Уникальный идентификатор уведомления.\r\n * Если не указан, генерируется автоматически.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Отображает модальное уведомление в правом верхнем углу экрана.\r\n *\r\n * Уведомление имеет поддержку:\r\n * - различных типов (info, error, success, warning),\r\n * - кнопки закрытия,\r\n * - автоматического закрытия через заданное время,\r\n * - прогресс-бара при наличии `timeSecClose`.\r\n *\r\n * @function fNotification\r\n * @param {string} [title] - Заголовок уведомления.\r\n * @param {string} body - Текст уведомления (поддерживает переносы строк через `\\n`).\r\n * @param {'info' | 'error' | 'success' | 'warning'} [variant='info'] - Тип уведомления.\r\n * @param {number} [timeSecClose] - Время автозакрытия уведомления в секундах.\r\n * @param {boolean} [buttonClose=false] - Флаг, показывающий кнопку закрытия.\r\n * @param {string} [id] - Уникальный идентификатор уведомления.\r\n *\r\n * @returns {Promise<string>} Промис, возвращающий CSS-селектор созданного уведомления.\r\n * Например: `\"#f-function-block-notification-abc123\"`.\r\n *\r\n * @example\r\n * // Пример простого уведомления\r\n * fNotification({\r\n * title: 'Успех',\r\n * body: 'Данные успешно сохранены.',\r\n * variant: 'success'\r\n * });\r\n *\r\n * @example\r\n * // Уведомление с автозакрытием и кнопкой закрытия\r\n * fNotification({\r\n * title: 'Ошибка',\r\n * body: 'Проверьте соединение\\\\nНе удалось загрузить данные',\r\n * variant: 'error',\r\n * timeSecClose: 5,\r\n * buttonClose: true\r\n * }).then((id) => {\r\n * console.log('Уведомление показано:', id);\r\n * });\r\n */\r\nconst fNotification = (\r\n {\r\n title,\r\n body,\r\n variant = 'info',\r\n timeSecClose,\r\n buttonClose = false,\r\n id,\r\n }: IfNotification\r\n): Promise<string> => {\r\n return new Promise((resolve) => {\r\n let ico = ''\r\n\r\n switch (variant) {\r\n case 'info':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\"/>'\r\n break\r\n case \"success\":\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M10.97 4.97a.75.75 0 0 1 1.071 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.235.235 0 0 1 .02-.022z\"/>'\r\n break\r\n case 'error':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\"/>'\r\n break\r\n case 'warning':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M5.255 5.786a.237.237 0 0 0 .241.247h.825c.138 0 .248-.113.266-.25.09-.656.54-1.134 1.342-1.134.686 0 1.314.343 1.314 1.168 0 .635-.374.927-.965 1.371-.673.489-1.206 1.06-1.168 1.987l.003.217a.25.25 0 0 0 .25.246h.811a.25.25 0 0 0 .25-.25v-.105c0-.718.273-.927 1.01-1.486.609-.463 1.244-.977 1.244-2.056 0-1.511-1.276-2.241-2.673-2.241-1.267 0-2.655.59-2.75 2.286zm1.557 5.763c0 .533.425.927 1.01.927.609 0 1.028-.394 1.028-.927 0-.552-.42-.94-1.029-.94-.584 0-1.009.388-1.009.94z\"/>'\r\n break\r\n }\r\n\r\n const arrBody: string[] = []\r\n body.split('\\n').map(opt => {\r\n arrBody.push(\r\n `<span>${opt}</span>`\r\n )\r\n })\r\n\r\n const randId = fGenerateUniqueId()\r\n const idFuncBlockNot = 'f-function-block-notification-' + randId\r\n\r\n const not = `\r\n <div class='${styles['f-function-block-notification']}' id=\"${id === undefined ? idFuncBlockNot : id}\">\r\n <div class='${styles['f-function-notification']}'>\r\n <div class='${styles['f-function-notification-ico']} ${styles[variant + '-notification']}'>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n ${ico}\r\n </svg>\r\n </div>\r\n <div class='${styles['f-function-notification-inside']}'>\r\n <div class='${styles['f-function-notification-header']}'>\r\n <h4>${title !== undefined ? title : ''}</h4>\r\n ${buttonClose ? `<svg\r\n width=\"25\"\r\n class=\"bi bi-x-lg primary ${styles['close-not']}\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\r\n </svg>` : ''}\r\n </div>\r\n <div class='${styles['f-function-notification-body']}'>\r\n ${arrBody.join('')}\r\n </div>\r\n </div>\r\n ${timeSecClose ? `<div class=\"${styles['f-notification-progress']}\">\r\n <div class=\"${styles['f-notification-progress-bar']}\">\r\n <div class=\"${styles['f-notification-progress-value']} ${styles[variant]}\" id=\"f-notification-progress-value-${randId}\" style=\"animation: notification-progress-animated ${timeSecClose}s linear;\"/>\r\n </div>\r\n </div>` : ''}\r\n </div>\r\n </div>\r\n `\r\n\r\n // Функция для создания или получения блока уведомлений\r\n const getOrCreateNotificationBlock = (): HTMLDivElement => {\r\n let blockNotification: HTMLDivElement | null = document.querySelector('#block-notification');\r\n\r\n if (blockNotification === null) {\r\n blockNotification = document.createElement('div');\r\n blockNotification.id = 'block-notification';\r\n document.body.appendChild(blockNotification);\r\n }\r\n\r\n return blockNotification;\r\n }\r\n\r\n // Функция для удаления пустого блока уведомлений\r\n const removeEmptyNotificationBlock = () => {\r\n const blockNotification = document.querySelector('#block-notification');\r\n if (blockNotification && blockNotification.children.length === 0) {\r\n blockNotification.parentNode?.removeChild(blockNotification);\r\n }\r\n }\r\n\r\n // Создаем блок уведомлений и добавляем новое уведомление\r\n const blockNotification = getOrCreateNotificationBlock();\r\n blockNotification.insertAdjacentHTML('afterbegin', not);\r\n\r\n // Плавная прокрутка к верху\r\n blockNotification.scrollTo({ top: 0, behavior: 'smooth' });\r\n\r\n if (buttonClose) {\r\n const el = window.document.querySelector(`#${idFuncBlockNot}`);\r\n if (el !== null) {\r\n const svgElement = el.querySelector(`.${styles['close-not']}`);\r\n if (svgElement !== null) {\r\n svgElement.addEventListener('click', () => {\r\n el.classList.remove(styles['f-function-notification-visible']);\r\n el.classList.add(styles['f-function-notification-hidden']);\r\n setTimeout(() => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n // Проверяем и удаляем пустой блок\r\n removeEmptyNotificationBlock();\r\n }, 1000);\r\n });\r\n }\r\n }\r\n }\r\n\r\n setTimeout(() => {\r\n const el = window.document.querySelector(`#${idFuncBlockNot}`);\r\n if (el !== null && el !== undefined) {\r\n el.className += \" \" + styles['f-function-notification-visible'];\r\n }\r\n });\r\n\r\n if (timeSecClose !== undefined) {\r\n const el = window.document.querySelector(`#${idFuncBlockNot}`);\r\n if (el !== null) {\r\n setTimeout(() => {\r\n el.className = styles['f-function-notification-hidden'];\r\n }, (timeSecClose - 1) * 1000);\r\n setTimeout(() => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n // Проверяем и удаляем пустой блок\r\n removeEmptyNotificationBlock();\r\n }, timeSecClose * 1000);\r\n }\r\n }\r\n\r\n resolve(`#${idFuncBlockNot}`)\r\n })\r\n}\r\n\r\nexport default fNotification\r\n","import styles from '../fNotification/fNotification.module.scss';\r\n\r\n/**\r\n * Удаляет уведомление из DOM с анимацией скрытия.\r\n * После удаления проверяет контейнер #block-notification и удаляет его, если он пуст.\r\n *\r\n * @param {string} id - CSS-селектор уведомления (например, `\"#notification-123\"`)\r\n * @returns {void}\r\n */\r\nconst fNotificationDelete = (id: string): void => {\r\n const el = window.document.querySelector(id);\r\n if (!el) return;\r\n\r\n const container = document.getElementById('block-notification');\r\n if (!container) return;\r\n\r\n el.className = styles['f-function-notification-hidden'];\r\n\r\n setTimeout(() => {\r\n el.classList.remove(styles['f-function-notification-visible']);\r\n }, 1000);\r\n\r\n setTimeout(() => {\r\n if (el.parentNode) el.parentNode.removeChild(el);\r\n if (container.children.length === 0) container.remove();\r\n }, 2000);\r\n};\r\n\r\nexport default fNotificationDelete;","/**\r\n * Преобразует файл в строку формата Base64.\r\n *\r\n * @param {File} file - Файл, который нужно преобразовать в Base64.\r\n * @param {boolean} [deletePrefix=false] - Если `true`, удаляет префикс `data:base64,`.\r\n * @returns {Promise<string>} Возвращает промис, который резолвится строкой:\r\n * - Полной строкой Base64 (например, `data:image/png;base64,iVBORw0KG...`) — если `deletePrefix = false`\r\n * - Только данными Base64 (например, `iVBORw0KG...`) — если `deletePrefix = true`\r\n *\r\n * @throws {Error} Возникает при ошибке чтения файла.\r\n *\r\n * @example\r\n * const file = new File([blob], 'test.jpg');\r\n * fConvertFileToBase64(file)\r\n * .then(base64 => console.log(base64))\r\n * .catch(error => console.error('Ошибка:', error));\r\n *\r\n * // Пример вывода (без deletePrefix):\r\n * // \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAgMEBQgFQQMDBQQF\r\n *\r\n * // Пример вывода (с deletePrefix):\r\n * // fConvertFileToBase64(file, true).then(data => console.log(data));\r\n * // > \"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAgMEBQgFQQMDBQQF...\"\r\n */\r\nconst fConvertFileToBase64 = (file: File, deletePrefix: boolean = false): Promise<string> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n const result = reader.result as string; // Результат в формате Base64\r\n resolve(deletePrefix ? result.split(',')[1] : result);\r\n };\r\n\r\n reader.onerror = (error) => {\r\n reject(error);\r\n };\r\n\r\n reader.readAsDataURL(file); // Преобразуем файл в Base64\r\n });\r\n};\r\n\r\nexport default fConvertFileToBase64;","/**\r\n * Скачивает файл, созданный из строки Base64.\r\n *\r\n * Функция:\r\n * - принимает строку Base64 и имя файла,\r\n * - определяет MIME-тип (из строки или по расширению файла),\r\n * - преобразует данные в `Blob`,\r\n * - создаёт ссылку для скачивания,\r\n * - программно кликает по ней и удаляет после скачивания.\r\n *\r\n * @function fDownloadFileFromBase64\r\n * @param {string} base64String - Строка в формате Base64. Может содержать Data URI (`data:image/png;base64,...`) или быть чистыми данными.\r\n * @param {string} fileName - Имя файла, под которым будет сохранён файл.\r\n *\r\n * @returns {void}\r\n *\r\n * @example\r\n * // Base64 со стандартным Data URI\r\n * fDownloadFileFromBase64('data:image/png;base64,iVBORw0KG...', 'image.png');\r\n *\r\n * @example\r\n * // Чистая Base64 строка + имя файла\r\n * fDownloadFileFromBase64('iVBORw0KG...', 'document.pdf');\r\n *\r\n * @example\r\n * // Скачивание Excel файла\r\n * fDownloadFileFromBase64(base64Data, 'report.xlsx');\r\n */\r\nconst fDownloadFileFromBase64 = (base64String: string, fileName: string): void => {\r\n if (!base64String) {\r\n console.error('Invalid Base64 string');\r\n return;\r\n }\r\n\r\n let mimeType: string;\r\n let base64Data: string;\r\n\r\n if (base64String.startsWith('data:')) {\r\n const dataUriMatch = base64String.match(/^data:([^;]+);base64,/);\r\n if (dataUriMatch && dataUriMatch[1]) {\r\n mimeType = dataUriMatch[1];\r\n } else {\r\n mimeType = 'application/octet-stream';\r\n }\r\n base64Data = base64String.split(',')[1] || '';\r\n } else {\r\n mimeType = getMimeTypeFromFileName(fileName) || 'application/octet-stream';\r\n base64Data = base64String;\r\n }\r\n\r\n try {\r\n const byteCharacters = atob(base64Data);\r\n const byteNumbers = new Array(byteCharacters.length);\r\n for (let i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n const byteArray = new Uint8Array(byteNumbers);\r\n const blob = new Blob([byteArray], { type: mimeType });\r\n\r\n const url = window.URL.createObjectURL(blob);\r\n\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n } catch (error) {\r\n console.error('Ошибка при обработке Base64:', error);\r\n }\r\n};\r\n\r\n/**\r\n * Вспомогательная функция для определения MIME-типа по расширению файла.\r\n *\r\n * Если расширение неизвестно — возвращает `undefined`.\r\n *\r\n * @function getMimeTypeFromFileName\r\n * @param {string} fileName - Имя файла, на основе которого определяется MIME-тип.\r\n * @returns {string | undefined} MIME-тип или `undefined`, если расширение не распознано.\r\n *\r\n * @example\r\n * getMimeTypeFromFileName('report.pdf'); // \"application/pdf\"\r\n * getMimeTypeFromFileName('image.png'); // \"image/png\"\r\n * getMimeTypeFromFileName('unknown.xyz'); // undefined\r\n */\r\nconst getMimeTypeFromFileName = (fileName: string): string | undefined => {\r\n const extension = fileName.split('.').pop()?.toLowerCase();\r\n if (!extension) return undefined;\r\n\r\n const mimeTypes: { [key: string]: string } = {\r\n txt: 'text/plain',\r\n pdf: 'application/pdf',\r\n png: 'image/png',\r\n jpg: 'image/jpeg',\r\n jpeg: 'image/jpeg',\r\n gif: 'image/gif',\r\n svg: 'image/svg+xml',\r\n doc: 'application/msword',\r\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n xls: 'application/vnd.ms-excel',\r\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n ppt: 'application/vnd.ms-powerpoint',\r\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n json: 'application/json',\r\n zip: 'application/zip',\r\n mp3: 'audio/mpeg',\r\n mp4: 'video/mp4'\r\n };\r\n\r\n return mimeTypes[extension];\r\n};\r\n\r\nexport default fDownloadFileFromBase64;","/**\r\n * Загружает файл на устройство пользователя, создавая временный объект URL из Blob или строки.\r\n *\r\n * @param {Blob | string} blob - Данные для скачивания. Может быть Blob-объектом или строкой (например, JSON, текст).\r\n * @param {string} fileName - Имя файла, под которым он будет сохранён на устройстве пользователя.\r\n * @throws {Error} Если blob пустой или не может быть обработан.\r\n *\r\n * @example\r\n * // Скачать текстовый файл\r\n * downloadBlobFile(\"Привет, мир!\", \"hello.txt\");\r\n *\r\n * @example\r\n * // Скачать Blob (например, после fetch)\r\n * const blob = await response.blob();\r\n * downloadBlobFile(blob, \"image.png\");\r\n */\r\nfunction fDownloadBlobFile(blob: Blob | string, fileName: string): void {\r\n if (!blob) {\r\n throw new Error('Blob or string content must not be empty');\r\n }\r\n\r\n // Преобразуем строку в Blob, если необходимо\r\n const blobObject = typeof blob === 'string' ? new Blob([blob], { type: 'text/plain;charset=utf-8' }) : blob;\r\n\r\n // Создаём ссылку для скачивания\r\n const link = document.createElement('a');\r\n const url = window.URL.createObjectURL(blobObject);\r\n\r\n link.href = url;\r\n link.download = fileName;\r\n\r\n // Добавляем ссылку в DOM, чтобы гарантировать корректный вызов click()\r\n link.style.display = 'none';\r\n document.body.appendChild(link);\r\n\r\n // Имитируем клик\r\n link.click();\r\n\r\n // Очищаем ресурсы\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport default fDownloadBlobFile;","/**\r\n * Выполняет банковское округление числа (по ГОСТ Р 8.736-2011) с учётом практических особенностей,\r\n * используемых в финансовых калькуляторах.\r\n *\r\n * ### Математика банковского округления\r\n *\r\n * Банковское округление (англ. *bankers' rounding*, *round-to-even*) — метод, минимизирующий накопление ошибок\r\n * при многократных операциях. Отличается от стандартного округления только при **ровно 5**:\r\n *\r\n * | Условие | Действие |\r\n * |--------|---------|\r\n * | `roundingDigit > 5` | Округление вверх |\r\n * | `roundingDigit < 5` | Округление вниз |\r\n * | `roundingDigit = 5` и **есть ненулевые цифры после** (`hasTail`) | Округление вверх |\r\n * | `roundingDigit = 5` и **все нули после** | Округляем так, чтобы **последняя сохраняемая цифра была чётной** |\r\n *\r\n * **НО:** в банковских системах и калькуляторах **для отрицательных чисел** при `=5` — **всегда вверх**,\r\n * чтобы избежать \"потери копейки\" в пользу клиента.\r\n *\r\n * ---\r\n *\r\n * ### Примеры\r\n * - `1.2345` → `1.234` (до 3 знаков): `lastKept = 4` (чёт) → вниз\r\n * - `1.2355` → `1.236` (до 3 знаков): `lastKept = 5` (нечёт) → вверх → `6` (чёт)\r\n * - `-1.225` → `-1.23` (до 2 знаков): отрицательное + `=5` → вверх\r\n * - `2.5` → `2` (до 0): `lastKept = 2` (чёт) → вниз\r\n * - `-2.5` → `-3` (до 0): отрицательное + `=5` → вверх\r\n *\r\n * @param value - Число или строка, которую нужно округлить.\r\n * @param decimals - Количество знаков после запятой (по умолчанию 2).\r\n * @returns Округлённое число или `NaN`, если вход некорректен.\r\n *\r\n * @example\r\n * fBankRound(1.225, 2); // → 1.22\r\n * fBankRound(-1.225, 2); // → -1.23\r\n * fBankRound(2.5, 0); // → 2\r\n * fBankRound(-2.5, 0); // → -3\r\n */\r\nfunction fBankRound(value: number | string, decimals: number = 2): number {\r\n const str = String(value).trim();\r\n if (!/^[-+]?\\d+(\\.\\d+)?$/.test(str)) return NaN;\r\n if (decimals < 0) return NaN;\r\n\r\n const sign = str.startsWith('-') ? -1 : 1;\r\n const abs = str.replace(/^[-+]/, '');\r\n const [intPart, fracPart = ''] = abs.split('.');\r\n\r\n if (fracPart.length <= decimals) return Number(str);\r\n\r\n const roundPos = decimals;\r\n const roundingDigit = Number(fracPart[roundPos]);\r\n const tail = fracPart.slice(roundPos + 1);\r\n const hasTail = tail.length > 0 && /[1-9]/.test(tail);\r\n\r\n // Последняя сохраняемая цифра перед roundingDigit\r\n let lastKept: number;\r\n if (roundPos > 0) {\r\n lastKept = Number(fracPart[roundPos - 1]);\r\n } else {\r\n lastKept = intPart.length > 0 ? Number(intPart[intPart.length - 1]) : 0;\r\n }\r\n\r\n const isNegative = sign < 0;\r\n let carry = 0;\r\n\r\n // Основная логика округления\r\n if (roundingDigit > 5) {\r\n carry = 1;\r\n } else if (roundingDigit === 5) {\r\n if (hasTail || isNegative || lastKept % 2 === 1) {\r\n carry = 1;\r\n }\r\n // иначе carry = 0 → к чётному (вниз, если lastKept чёт)\r\n }\r\n\r\n let frac = fracPart.slice(0, roundPos).padEnd(decimals, '0');\r\n let int = intPart || '0';\r\n\r\n if (carry) {\r\n if (decimals === 0) {\r\n // Округление до целого — просто увеличиваем int\r\n int = (Number(int) + 1).toString();\r\n } else {\r\n // Прибавляем 1 к дробной части\r\n let i = decimals - 1;\r\n while (i >= 0) {\r\n if (frac[i] !== '9') {\r\n frac = frac.slice(0, i) + (Number(frac[i]) + 1) + frac.slice(i + 1);\r\n break;\r\n }\r\n frac = frac.slice(0, i) + '0' + frac.slice(i + 1);\r\n i--;\r\n }\r\n if (i < 0) {\r\n // Перенос в целую часть\r\n int = (Number(int) + 1).toString();\r\n frac = '0'.repeat(decimals);\r\n }\r\n }\r\n }\r\n\r\n const resultStr = int + (decimals > 0 ? '.' + frac : '');\r\n return sign * Number(resultStr);\r\n}\r\n\r\nexport default fBankRound;","import fBankRound from \"../fBankRound\";\r\n\r\n/**\r\n * Форматирует число в строку с русской локализацией (разделение тысяч, дробная часть и т.д.)\r\n * Может использовать банковское округление перед форматированием.\r\n * По флагу может вернуть число вместо строки.\r\n *\r\n * @param {number} a - Число для форматирования\r\n * @param {Object} [options] - Опциональные параметры\r\n * @param {number} [options.maximumFractionDigits] - Максимальное количество знаков после запятой\r\n * @param {number} [options.minimumFractionDigits] - Минимальное количество знаков после запятой\r\n * @param {boolean} [options.useBankRound=false] - Использовать ли банковское округление\r\n * @param {number} [options.bankRoundDecimalPlaces=2] - Количество знаков после запятой для банковского округления\r\n * @param {boolean} [options.returnNumber=false] - Вернуть ли число вместо строки\r\n * @returns {string|number} Отформатированная строка числа или число\r\n * \r\n * @example\r\n * fFormatRuNumber(1234.567); // \"1 234,567\"\r\n * fFormatRuNumber(1234.567, { useBankRound: true }); // \"1 234,57\"\r\n * fFormatRuNumber(1234.567, { maximumFractionDigits: 2 }); // \"1 234,57\"\r\n * fFormatRuNumber(1234.567, { useBankRound: true, returnNumber: true }); // 1234.57\r\n */\r\nconst fFormatRuNumber = (\r\n a: number,\r\n options?: {\r\n maximumFractionDigits?: number;\r\n minimumFractionDigits?: number;\r\n useBankRound?: boolean;\r\n bankRoundDecimalPlaces?: number;\r\n returnNumber?: boolean;\r\n }\r\n): string | number => {\r\n if (typeof a !== \"number\" || isNaN(a)) return options?.returnNumber ? NaN : \"\";\r\n\r\n let processedValue = a;\r\n\r\n if (options?.useBankRound) {\r\n const decimalPlaces = options.bankRoundDecimalPlaces ?? 2;\r\n processedValue = fBankRound(processedValue, decimalPlaces);\r\n }\r\n\r\n // 🔹 Если нужен результат числом — просто возвращаем округлённое значение\r\n if (options?.returnNumber) {\r\n // Если указаны ограничения по знакам, приведём число к нужному виду\r\n if (\r\n options.maximumFractionDigits !== undefined ||\r\n options.minimumFractionDigits !== undefined\r\n ) {\r\n const min = options.minimumFractionDigits ?? 0;\r\n const max = options.maximumFractionDigits ?? 20;\r\n\r\n processedValue = Number(processedValue.toLocaleString(\"en-US\", {\r\n minimumFractionDigits: min,\r\n maximumFractionDigits: max,\r\n useGrouping: false\r\n }));\r\n }\r\n return processedValue;\r\n }\r\n\r\n // 🔹 Вариант по умолчанию — строка с локализацией\r\n const formatOptions: Intl.NumberFormatOptions = {};\r\n if (options?.maximumFractionDigits !== undefined) {\r\n formatOptions.maximumFractionDigits = options.maximumFractionDigits;\r\n }\r\n if (options?.minimumFractionDigits !== undefined) {\r\n formatOptions.minimumFractionDigits = options.minimumFractionDigits;\r\n }\r\n\r\n return new Intl.NumberFormat(\"ru-RU\", formatOptions).format(processedValue);\r\n};\r\n\r\nexport default fFormatRuNumber;","type FormatOption = \"iso\" | \"ru\" | \"ru-datetime\" | \"date\" | \"time\" | \"custom\";\r\n\r\n/**\r\n * Настройки форматирования даты, generic по формату F\r\n */\r\ntype ConvertDateOptions<F extends FormatOption = FormatOption> = {\r\n /**\r\n * Стандартные форматы:\r\n * - \"iso\" → YYYY-MM-DD\r\n * - \"ru\" → DD.MM.YYYY\r\n * - \"ru-datetime\" → DD.MM.YYYY HH:MM:SS\r\n * - \"time\" → HH:MM:SS\r\n * - \"date\" → объект Date\r\n * - \"custom\" → использовать `customOptions`\r\n */\r\n format?: F;\r\n /** Локаль для кастомного формата (по умолчанию \"ru-RU\") */\r\n locale?: string;\r\n /** Опции для Intl.DateTimeFormat при `format: \"custom\"` */\r\n customOptions?: Intl.DateTimeFormatOptions;\r\n};\r\n\r\n/**\r\n * Тип возвращаемого значения в зависимости от выбранного формата\r\n */\r\ntype ConvertDateReturnType<F extends FormatOption | undefined> =\r\n F extends \"date\" ? Date | undefined : string;\r\n\r\n/**\r\n * Универсальный конвертер даты и времени.\r\n *\r\n * Поддерживает строки, числа (timestamp), Date, null и undefined.\r\n * Может возвращать дату в ISO, русскую дату, русскую дату с временем,\r\n * только время, объект Date или кастомный формат через Intl.DateTimeFormat.\r\n *\r\n * @param input - Дата в виде строки, числа, Date, null или undefined\r\n * @param options - Настройки форматирования\r\n *\r\n * @returns Отформатированная дата/время или '' / undefined для пустых значений\r\n *\r\n * @example\r\n * convertDate(\"2025-10-02T15:30:45\", { format: \"iso\" }); // \"2025-10-02\"\r\n * convertDate(\"2025-10-02T15:30:45\", { format: \"ru\" }); // \"02.10.2025\"\r\n * convertDate(\"2025-10-02T15:30:45\", { format: \"ru-datetime\" }); // \"02.10.2025 15:30:45\"\r\n * convertDate(new Date(), { format: \"time\" }); // \"14:30:05\"\r\n * convertDate(1696262400000, { format: \"date\" }); // Date object\r\n * convertDate(new Date(), { format: \"custom\", locale: \"en-US\", customOptions: { weekday: \"long\" } });\r\n * // \"Thursday, October 2, 2025\"\r\n */\r\nfunction fConvertDate<F extends FormatOption = \"iso\">(\r\n input: string | number | Date | null | undefined,\r\n options?: ConvertDateOptions<F>\r\n): ConvertDateReturnType<F> {\r\n const format = options?.format ?? \"iso\";\r\n const locale = options?.locale ?? \"ru-RU\";\r\n\r\n if (input === null || input === undefined || input === \"\") {\r\n return (format === \"date\" ? undefined : \"\") as ConvertDateReturnType<F>;\r\n }\r\n\r\n const date = input instanceof Date ? input : new Date(input);\r\n\r\n if (isNaN(date.getTime())) {\r\n return (format === \"date\" ? undefined : \"\") as ConvertDateReturnType<F>;\r\n }\r\n\r\n const pad = (num: number) => String(num).padStart(2, \"0\");\r\n\r\n switch (format) {\r\n case \"iso\":\r\n return date.toISOString().slice(0, 10) as ConvertDateReturnType<F>;\r\n case \"ru\":\r\n return date.toLocaleDateString(\"ru-RU\") as ConvertDateReturnType<F>;\r\n case \"ru-datetime\": {\r\n const dateStr = date.toLocaleDateString(\"ru-RU\");\r\n const timeStr = `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\r\n return `${dateStr} ${timeStr}` as ConvertDateReturnType<F>;\r\n }\r\n case \"time\":\r\n return `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}` as ConvertDateReturnType<F>;\r\n case \"date\":\r\n return date as ConvertDateReturnType<F>;\r\n case \"custom\":\r\n return new Intl.DateTimeFormat(locale, options?.customOptions).format(date) as ConvertDateReturnType<F>;\r\n default:\r\n return \"\" as ConvertDateReturnType<F>;\r\n }\r\n}\r\n\r\nexport default fConvertDate;\r\n","import { useState } from 'react';\r\nimport axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';\r\nimport { fNotification } from '../../function-elements';\r\n\r\n/**\r\n * Тип возвращаемого значения хука `useFApi`.\r\n *\r\n * @template T - Основной тип данных, который будет получен через API.\r\n */\r\nexport type IUseFApi<T> = {\r\n /**\r\n * Данные, полученные из API. Может быть `null`, если данные ещё не загружены или произошла ошибка.\r\n */\r\n data: T | null;\r\n\r\n /**\r\n * Флаг, указывающий на состояние загрузки.\r\n */\r\n loading: boolean;\r\n\r\n /**\r\n * Сообщение об ошибке, если запрос завершился неудачей. `null`, если ошибки нет.\r\n */\r\n error: string | null;\r\n\r\n /**\r\n * Асинхронная функция, отправляющая HTTP-запрос.\r\n *\r\n * @param {AxiosRequestConfig} config - Конфигурация для запроса (метод, URL, параметры и т.д.)\r\n * @returns {Promise<T | null>} — возвращает данные из ответа или `null` при ошибке.\r\n */\r\n execute: (config: AxiosRequestConfig) => Promise<T | null>;\r\n\r\n /**\r\n * Сбрасывает текущие данные на новое значение.\r\n *\r\n * @param {T | null} newData - Новые данные, которые будут установлены в состояние.\r\n */\r\n reset: (newData: T | null) => void;\r\n};\r\n\r\n/**\r\n * Интерфейс для ответа от API в случае ошибки.\r\n */\r\ninterface ApiErrorResponse {\r\n message: string;\r\n}\r\n\r\n/**\r\n * Рекурсивный тип для извлечения значения по строковому пути (например `'user.address.city'`)\r\n *\r\n * @template T - Базовый тип, из которого извлекается значение.\r\n * @template P - Строка, представляющая путь к значению (например `'user.address.city'`)\r\n */\r\ntype GetValueByPath<T, P extends string> = P extends `${infer Key}.${infer Rest}`\r\n ? Key extends keyof T\r\n ? GetValueByPath<T[Key], Rest>\r\n : never\r\n : P extends keyof T\r\n ? T[P]\r\n : never;\r\n\r\n/**\r\n * Конфигурационные параметры для хука `useFApi`.\r\n *\r\n * @template T - Тип данных, используемых по умолчанию.\r\n */\r\ntype IProps<T> = {\r\n /**\r\n * Если `true`, то хук не будет использовать внутреннее состояние (`useState`).\r\n * @default false\r\n */\r\n doNotUseState?: boolean;\r\n\r\n /**\r\n * Значение по умолчанию для состояния `data`.\r\n * @default null\r\n */\r\n defaultState?: T | null;\r\n\r\n /**\r\n * Путь к полю в ответе API, которое нужно вернуть вместо всего объекта.\r\n * Например: `'data.items'`\r\n */\r\n getValueByPath?: string;\r\n};\r\n\r\n/**\r\n * Хук `useFApi` предоставляет удобную обёртку над `axios` с поддержкой:\r\n * - управления состоянием (`data`, `loading`, `error`),\r\n * - автоматического вывода ошибок через `fNotification`,\r\n * - извлечения конкретного поля из ответа по пути (`getValueByPath`),\r\n * - возможности отключения внутреннего состояния (`doNotUseState`).\r\n *\r\n * @template T - Тип данных, возвращаемых API.\r\n * @param {boolean} [doNotUseState=false] - Отключение внутреннего состояния.\r\n * @param {T | null} [defaultState=null] - Начальное значение `data`.\r\n * @param {string} [getValueByPath=undefined] - Путь к данным в ответе (например `'data.items'`).\r\n *\r\n * @returns {IUseFApi<T>} — объект с данными, статусами и методами.\r\n *\r\n * @example\r\n * const MyComponent = () => {\r\n * const { data, loading, error, execute } = useFApi<{ name: string }>();\r\n *\r\n * useEffect(() => {\r\n * execute({ url: '/api/user/1' });\r\n * }, []);\r\n *\r\n * if (loading) return <div>Загрузка...</div>;\r\n * if (error) return <div>Ошибка: {error}</div>;\r\n *\r\n * return <div>Имя: {data?.name}</div>;\r\n * };\r\n *\r\n * @example\r\n * // Использование с getValueByPath\r\n * const { execute } = useFApi<{ data: { items: string[] } }>({\r\n * getValueByPath: 'data.items'\r\n * });\r\n *\r\n * const result = await execute({ url: '/api/data' });\r\n * // result будет массивом `string[]`, а не полным объектом\r\n *\r\n * @example\r\n * // Отключение внутреннего состояния\r\n * const { execute } = useFApi({ doNotUseState: true });\r\n *\r\n * const fetchData = async () => {\r\n * const data = await execute({ url: '/api/data' });\r\n * console.log(data);\r\n * };\r\n */\r\nconst useFApi = <T>({ doNotUseState = false, defaultState = null, getValueByPath = undefined }: IProps<T> = {}) => {\r\n const [data, setData] = useState<T | null>(defaultState === undefined ? null : defaultState);\r\n const [loading, setLoading] = useState<boolean>(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const execute = async (config: AxiosRequestConfig): Promise<\r\n typeof getValueByPath extends string ? GetValueByPath<T, typeof getValueByPath> : T | null\r\n > => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const response: AxiosResponse<T> = await axios(config);\r\n\r\n if (getValueByPath) {\r\n let returnValue: any = response.data;\r\n const pathParts = getValueByPath.split('.');\r\n for (const part of pathParts) {\r\n returnValue = returnValue?.[part];\r\n if (returnValue === undefined) break;\r\n }\r\n if (!doNotUseState) {\r\n setData(returnValue ?? null);\r\n }\r\n return returnValue ?? null;\r\n } else {\r\n if (!doNotUseState) {\r\n setData(response.data);\r\n }\r\n return response.data;\r\n }\r\n } catch (error) {\r\n const err = error as AxiosError<ApiErrorResponse>;\r\n const errorMessage = err.response?.data?.message || err.message || 'Неизвестная ошибка';\r\n fNotification({\r\n variant: 'error',\r\n title: 'Ошибка',\r\n body: `- Произошла ошибка ${err.response?.status}\\n- ${errorMessage}`,\r\n timeSecClose: 5,\r\n });\r\n setError(errorMessage);\r\n return null;\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const reset = (newData: T | null) => {\r\n if (!doNotUseState) {\r\n setData(newData);\r\n }\r\n };\r\n\r\n return { data, loading, error, execute, reset };\r\n};\r\n\r\nexport default useFApi;","import { FC } from 'react';\r\nimport styles from './WaterErrorBoundary.module.scss';\r\n\r\nconst FWaterErrorBoundaryPage: FC = () => {\r\n return (\r\n <div className={styles.waterError}>\r\n <div className={styles.scene}>\r\n <div className={styles.waves}>\r\n <div className={styles.wave1}></div>\r\n <div className={styles.wave2}></div>\r\n <div className={styles.wave3}></div>\r\n </div>\r\n\r\n <div className={styles.bubbles}>\r\n {[...Array(15)].map((_, i) => (\r\n <div\r\n key={i}\r\n className={styles.bubble}\r\n style={{\r\n left: `${Math.random() * 100}%`,\r\n animationDelay: `${Math.random() * 8}s`,\r\n animationDuration: `${10 + Math.random() * 10}s`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <div className={styles.container}>\r\n <div className={styles.card}>\r\n <div className={styles.drop}>\r\n <svg viewBox=\"0 0 100 120\" className={styles.dropSvg}>\r\n <defs>\r\n <linearGradient id=\"blueGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n <stop offset=\"0%\" stopColor=\"#00d4ff\" />\r\n <stop offset=\"100%\" stopColor=\"#0066ff\" />\r\n </linearGradient>\r\n </defs>\r\n <path d=\"M50 15 C25 55, 25 90, 50 115 C75 90, 75 55, 50 15\" fill=\"url(#blueGradient)\" />\r\n </svg>\r\n </div>\r\n\r\n <h1 className={styles.title}>Поток прерван</h1>\r\n <p className={styles.subtitle}>\r\n Произошла ошибка в системе водоучёта.<br />\r\n Мы уже направляем бригаду гидротехников.<br />\r\n Идёт восстановление данных…\r\n </p>\r\n\r\n <div className={styles.actions}>\r\n <button\r\n className={styles.btnPrimary}\r\n onClick={() => {\r\n const btn = document.querySelector(`.${styles.btnPrimary}`) as HTMLElement;\r\n const ripple = document.createElement('div');\r\n ripple.className = styles.ripple;\r\n btn.appendChild(ripple);\r\n setTimeout(() => ripple.remove(), 700);\r\n window.location.reload();\r\n }}\r\n >\r\n Обновить страницу\r\n </button>\r\n\r\n <button className={styles.btnSecondary} onClick={() => window.location.href = '/'}>\r\n На главную\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default FWaterErrorBoundaryPage;"],"names":["styles","progress","disabled","error","_a","FTableBody","hide","title","left","vertical","horizontal","Fragment","value","active","skeleton","container","arrow","file","dom","items","table","row","jsxToHtml","document","right","createDocumentFile","link","license","initializeModule","blockNotification","btn","ripple"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoHA,MAAM,UAAU,WAAwC,CAAC;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAG,QAAQ;AACP,QAAM,UAAU,MAAM,MAAM,UAAU,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAEhF,MAAI,QAA6B,EAAE,OAAO,cAAA;AAE1C,MAAI,WAAW;AACX,QAAI,UAAU,QAAW;AACrB,cAAQ,EAAE,OAAO,OAAA;AAAA,IACrB,OAAO;AACH,YAAM,QAAQ;AAAA,IAClB;AAAA,EACJ;AAEA,UAAQ,OAAO,SAAY,EAAE,GAAG,OAAO,GAAG,OAAO;AAEjD,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACL,GAAG;AAAA,MACJ,IAAI;AAAA,MACJ,WACI,GAAGA,UAAO,KAAK,CAAC,IAAIA,UAAO,IAAI,CAAC,IAAIA,UAAO,MAAM,YAAY,cAAc,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC,IAAI,MAAM,aAAa,EAAE;AAAA,MAGnI;AAAA,IAAA;AAAA,EAAA;AAGb,CAAC;AAED,QAAQ,cAAc;;;;;ACjFtB,MAAM,aAAa,MAAM,WAAuC,CAC5D;AAAA,EACI,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QACF;AACD,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,SAAS;AAAA,MACT,OAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QACN;AAAA,UAAC;AAAA,UAAA;AAAA,YAAK,UAAS;AAAA,YACX,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAA6O;AAAA,IAAA;AAAA,EAAA;AAG/P,CAAC;AAED,WAAW,cAAc;;;;;;;;;;;;;;ACjBzB,MAAM,QAAoB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAC;AACJ,MAAM;AACF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,GAAGD,SAAO,mBAAmB,CAAC,IAAI,aAAa,EAAE;AAAA,MAC5D;AAAA,MACA,OAAO;AAAA,MAEP,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAWA,SAAO,mBAAmB,GACtC,UAAA;AAAA,UAAA,oBAAC,UAAK,WAAWA,SAAO,mBAAmB,GAAG,OAAO,MAChD,UAAA,MACL;AAAA,UACC,OAAO,SAAS,YACb,qBAAC,UAAK,WAAWA,SAAO,mBAAmB,GACtC,UAAA;AAAA,YAAA,KAAK,MAAM,OAAO,IAAI;AAAA,YAAE;AAAA,UAAA,EAAA,CAC7B;AAAA,QAAA,GAER;AAAA,QACC,gBACG,oBAAC,OAAA,EAAI,WAAWA,SAAO,YAAY,GAC/B,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAM;AAAA,YACN,OAAM;AAAA,YACN,aAAa;AAAA,UAAA;AAAA,QAAA,GAErB;AAAA,QAEH,OAAOC,cAAa,YACjB,oBAAC,SAAI,WAAW,GAAGD,SAAO,WAAW,IAAIC,cAAa,MAAMD,SAAO,YAAY,EAAE,IAC7E,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWA,SAAO;AAAA,YAClB,OAAO,EAAE,OAAO,GAAGC,SAAQ,IAAA;AAAA,UAAI;AAAA,QAAA,EACnC,CACJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIhB;ACgCA,MAAM,cAAc,CAAC;AAAA,EACjB;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,YAAY;AAAA,EACZ;AACJ,MAAoB;AAChB,QAAM,UAAU,OAAyB,IAAI;AAC7C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB,CAAA,CAAE;AAC7C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAoC,CAAA,CAAE;AAElF,QAAM,QAAQ,YAAY,EAAE,GAAG,IAAI,OAAO,WAAW;AAErD,QAAM,mBAAmB,CAAC,MAA2C;AACjE,QAAI,CAAC,EAAE,OAAO,SAAS,EAAE,OAAO,MAAM,WAAW,EAAG;AAEpD,UAAM,gBAAgB,MAAM,KAAK,EAAE,OAAO,KAAK;AAC/C,aAAS,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,aAAa,CAAC;AAC9C,aAAS,CAAC,GAAG,aAAa,CAAC;AAG3B,kBAAc,QAAQ,CAAA,SAAQ;AAC1B,UAAID,YAAW;AACf,YAAM,WAAW,YAAY,MAAM;AAC/B,QAAAA,aAAY;AACZ,0BAAkB,CAAA,UAAS,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,GAAGA,UAAA,EAAW;AAC9D,YAAIA,aAAY,IAAK,eAAc,QAAQ;AAAA,MAC/C,GAAG,GAAG;AAAA,IACV,CAAC;AAAA,EACL;AAEA,QAAM,mBAAmB,CAAC,UAAkB;AACxC,aAAS,CAAC,SAAS;AACf,YAAM,eAAe,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AACtD,UAAI,aAAa,WAAW,GAAG;AAC3B,iBAAS,IAAI;AACb,YAAI,QAAQ,QAAS,SAAQ,QAAQ,QAAQ;AAAA,MACjD,OAAO;AACH,iBAAS,YAAY;AAAA,MACzB;AACA,aAAO;AAAA,IACX,CAAC;AAGD,UAAM,WAAW,MAAM,KAAK,EAAE;AAC9B,sBAAkB,CAAA,SAAQ;AACtB,YAAM,cAAc,EAAE,GAAG,KAAA;AACzB,aAAO,YAAY,QAAQ;AAC3B,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,8BACK,OAAA,EAAI,WAAW,cAAc,eAAe,GAAG,OAC5C,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAAC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,MAAA;;AAAM,+BAAQ,YAAR,mBAAiB;AAAA;AAAA,QAE/B;AAAA,MAAA;AAAA,IAAA;AAAA,IAGL;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAK;AAAA,QACL,MAAK;AAAA,QACL,OAAO,EAAE,SAAS,OAAA;AAAA,QAClB;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,UAAAA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,IAIH,MAAM,SAAS,KACZ,oBAAC,OAAA,EAAI,WAAW,cAAc,sBAAsB,GAAG,IAAG,SAAQ,OAAO,EAAE,WAAW,UAClF,UAAA,oBAAC,OAAA,EAAI,WAAW,cAAc,mBAAmB,GAAG,OAAO,EAAE,eAAe,UAAA,GACvE,UAAA,MAAM,IAAI,CAAC,KAAK,UACb;AAAA,MAAC;AAAA,MAAA;AAAA,QAEG,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,cAAc,MAAM,iBAAiB,KAAK;AAAA,QAC1C,UAAU,eAAe,IAAI,IAAI;AAAA,MAAA;AAAA,MAJ5B;AAAA,IAAA,CAMZ,GACL,EAAA,CACJ;AAAA,EAAA,GAER;AAER;;;;ACtNA,MAAM,YAAY,MAAM,WAAuC,CAAC;AAAA,EAC5D,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,GAAG;AACP,GAAG,QAAQ;AAEP,QAAM,WAAW,QAAgB,KAAK,OAAA,IAAW,GAAG,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;AAE7E,SACI,qBAAC,OAAA,EAAI,KAAU,OAAO,EAAE,QAAQ,GAAG,SAAS,EAAA,GAAM,GAAG,OACjD,UAAA;AAAA,IAAA,qBAAC,SAAA,EAEO,UAAA;AAAA,MAAA;AAAA,mCACe,SAAS,OAAO;AAAA,iCAClB,IAAI;AAAA,kCACH,OAAO,IAAI;AAAA,8DACiB,SAAS,OAAO;AAAA,sDACxB,SAAS,OAAO;AAAA,iDACrB,OAAO,GAAG;AAAA,wCACnB,OAAO,EAAE;AAAA;AAAA;AAAA,MAK7B,uCAAuC,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,kDAKzB,OAAO,IAAI;AAAA;AAAA;AAAA,MAKzC,+BAA+B,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,kDAKjB,OAAO,IAAI;AAAA;AAAA;AAAA,IAAA,GAIjD;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,2BAA2B,SAAS,OAAO,IAAI,KAAK,IAAI,cAAc,SAAY,YAAY,EAAE;AAAA,QAC3G,OAAO;AAAA,QACP;AAAA,MAAA;AAAA,IAAA;AAAA,EACJ,GACJ;AAER,CAAC;AAED,UAAU,cAAc;ACnCxB,MAAM,aAAa;AAAA,EACf,CACI;AAAA,IACI;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,IACT;AAAA,IACA,GAAG;AAAA,EAAA,GAEP,QACC;AACD,UAAM,YAAiC;AAAA,MACnC,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,MACd,OAAO,YAAY,SAAS,SAAS;AAAA,MACrC,QAAQ,UAAU;AAAA,IAAA;AAGtB,UAAM,cAAc,EAAE,GAAG,WAAW,GAAG,GAAA;AACvC,UAAM,UAAU,MAAM,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAEzE,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,kBAAkBF,SAAO,cAAc,CAAC,IAAI,aAAa,EAAE;AAAA,QACtE,OAAO;AAAA,QACP,MAAK;AAAA,QACL,IAAI,UAAU;AAAA,QACd,mBAAiB,QAAQ,UAAU,WAAW;AAAA,QAG7C,UAAA;AAAA,UAAA,SACG;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,UAAU;AAAA,cACd,SAAS;AAAA,cACT,WAAW,yBAAyB,UAAU,UAAU,EAAE;AAAA,cAEzD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,+BAKR,OAAA,EAAI,WAAW,2BAA2B,OAAO,eAAe,EAAE,IAC/D,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG;AAAA,gBACA,IAAI;AAAA,gBACJ;AAAA,gBACA,WAAW,mCAAmC,UAAU,UAAU,EAAE;AAAA,gBACpE,gBAAc,CAAC,CAAC;AAAA,gBAChB,oBACI,CAAC,WAAW,UAAU,cAAc,OAAM,mCAAS,UAAS,UAAU,eAAe,IAAI,EACpF,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBAEhB,GAAG;AAAA,gBACJ,MAAM,MAAM,SAAS,SAAY,MAAM,OAAO;AAAA,gBAC9C,UAAU,MAAM,YAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAG/B,4BACI,QAAA,EAAK,WAAW,0BACb,UAAA,oBAAC,WAAA,EAAU,MAAM,GAAA,CAAI,EAAA,CACzB;AAAA,UAAA,GAER;AAAA,UAGC,YACG;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,UAAU;AAAA,cACd,WAAW;AAAA,cAEV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAKP,OAAO,YAAY,YAAY,WAC7B;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cAEX,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,IAAI,GAAG,OAAO;AAAA,kBACd,WAAW;AAAA,kBAEV,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACL;AAAA,UAAA;AAAA,UAGP,WAAW,QAAQ,SAAS,KACzB;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cAEV,iBAAO,YAAY,YAAY,QAAQ,IAAI,CAACG,QAAO,UAChD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,IAAI,GAAG,OAAO,cAAc,KAAK;AAAA,kBACjC,WAAW;AAAA,kBAEV,UAAAA;AAAA,gBAAA;AAAA,gBAJI;AAAA,cAAA,CAMZ;AAAA,YAAA;AAAA,UAAA;AAAA,QACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;AChEA,MAAM,SAAsB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,MAAI,QAA6B;AAAA,IAC7B,KAAK,GAAG,CAAC,UAAU,CAAC;AAAA,IACpB,SAAS;AAAA,IACT,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EAAA;AAGd,MAAI,OAAO,QAAW;AAClB,YAAQ,OAAO,OAAO,OAAO,EAAE;AAAA,EACnC;AAEA,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtDA,MAAM,QAAoB,CAAC;AAAA,EACvB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AACd,MAAM;AACF,QAAM,QAA6B;AAAA,IAC/B,GAAG;AAAA,EAAA;AAGP,QAAM,gBAAgB;AAAA,IAClB;AAAA,IACA,IAAI,MAAM;AAAA,IACV,IAAI,MAAM,MAAM;AAAA,IAChB,IAAI,MAAM,MAAM,MAAM;AAAA,IACtB,IAAI,MAAM,MAAM,MAAM,MAAM;AAAA,IAC5B,KAAK,OAAO,MAAM,MAAM,MAAM,MAAM;AAAA,EAAA;AAGxC,QAAM,mBAAmB,MAAM;AAC3B,QAAI,QAAS,QAAOH,SAAO,mBAAmB;AAE9C,UAAM,UAAU,CAACA,SAAO,aAAa,CAAC;AACtC,QAAI,cAAc,OAAO,OAAW,SAAQ,KAAKA,SAAO,mBAAmB,cAAc,EAAE,EAAE,CAAC;AAC9F,QAAI,cAAc,OAAO,OAAW,SAAQ,KAAKA,SAAO,mBAAmB,cAAc,EAAE,EAAE,CAAC;AAC9F,QAAI,cAAc,OAAO,OAAW,SAAQ,KAAKA,SAAO,mBAAmB,cAAc,EAAE,EAAE,CAAC;AAC9F,QAAI,cAAc,OAAO,OAAW,SAAQ,KAAKA,SAAO,mBAAmB,cAAc,EAAE,EAAE,CAAC;AAC9F,QAAI,cAAc,OAAO,OAAW,SAAQ,KAAKA,SAAO,mBAAmB,cAAc,EAAE,EAAE,CAAC;AAC9F,QAAI,cAAc,QAAQ,OAAW,SAAQ,KAAKA,SAAO,oBAAoB,cAAc,GAAG,EAAE,CAAC;AAEjG,WAAO,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAEA,SACI,qBAAA,UAAA,EACK,UAAA;AAAA,IAAA,QAAQ,eACL;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,GAAGA,SAAO,QAAQ,CAAC,IAAI,aAAa,EAAE;AAAA,QACjD;AAAA,QACA;AAAA,QAEC;AAAA,MAAA;AAAA,IAAA;AAAA,IAIR,QAAQ,UACL;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,GAAG,iBAAA,CAAkB,IAAI,aAAa,EAAE;AAAA,QACnD;AAAA,QACA;AAAA,QAEC;AAAA,MAAA;AAAA,IAAA;AAAA,IAIR,QAAQ,UACL,oBAAC,SAAI,WAAsB,OAAc,IACpC,SAAA,CACL;AAAA,EAAA,GAER;AAER;;;;;;;;;;;;;ACnHA,MAAM,WAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,yBAAyB,MAAM;AACjC,QAAI,CAAC,eAAgB,QAAO;AAC5B,WAAOA,SAAO,uBAAuB,cAAc,EAAE;AAAA,EACzD;AAEA,QAAM,qBAAqB,MAAM;AAC7B,QAAI,CAAC,WAAY,QAAO;AACxB,WAAOA,SAAO,qBAAqB,UAAU,EAAE;AAAA,EACnD;AAEA,QAAM,aAAa;AAAA,IACfA,SAAO,YAAY;AAAA,IACnB,uBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,EAAA,EACF,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,6BACK,OAAA,EAAI,WAAW,YAAY,OAAO,IAAI,IAClC,UACL;AAER;;;;;;;;;;;AClBA,MAAM,aAA8B,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,MAAM;AACF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,GAAGA,SAAO,aAAa,CAAC,IAAIA,SAAO,QAAQ,CAAC,IAAI,aAAa,EAAE;AAAA,MAC1E,OAAO;AAAA,MACP;AAAA,MAEC;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;;;;;;;ACkBA,MAAM,SAAsB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AAEF,YAAU,MAAM;AACZ,QAAI,UAAU;AACV,YAAM,UAAU,SAAS,uBAAuB,YAAY,SAAS,IAAI,EAAE,EAAE,CAAC;AAC9E,UAAI,SAAS;AACT,gBAAQ,aAAa,SAAS,MAAM,SAAS,KAAK;AAAA,MACtD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,QAAQ,CAAC;AAEb,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,GAAGA,SAAO,OAAO,CAAC,IAAIA,SAAO,eAAe,CAAC,IAAI,aAAa,EAAE,IAAI,WAAW,GAAGA,SAAO,YAAY,SAAS,IAAI,EAAE,CAAC,IAAI,SAAS,IAAI,KAAK,EAAE;AAAA,MACxJ,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MAEC,UAAA;AAAA,QAAA,SACG,oBAAC,OAAA,EAAI,WAAWA,SAAO,eAAe,GAClC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWA,SAAO,aAAa;AAAA,YAC/B,OAAO,EAAE,UAAU,cAAA;AAAA,YAElB,UAAA;AAAA,UAAA;AAAA,QAAA,GAET;AAAA,QAEJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWA,SAAO,YAAY;AAAA,YAC9B,OAAO,EAAE,UAAU,aAAA;AAAA,YAElB;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA;AAAA,EAAA;AAGZ;;;;;;;;;;;;;;;;;;;;;ACjGA,MAAM,aAA8B,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA;AAAA,EAChB,WAAW;AAAA;AAAA,EACX,GAAG;AACP,MAAM;AAEF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAO;AAAA,MACN,GAAG;AAAA,MACJ,WAAW,GAAGA,SAAO,iCAAiC,CAAC,IAAI,WAAWA,SAAO,WAAW,IAAI,EAAE,IAAI,MAAM,aAAa,EAAE,IAAIA,SAAO,aAAa,CAAC;AAAA,MAE/I;AAAA,IAAA;AAAA,EAAA;AAGb;ACXA,MAAM,aAA8B,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA;AAAA,EAChB;AAAA,EACA,kBAAkB;AAAA,EAClB,GAAG;AACP,MAAM;AAMF,QAAM,eAAe,OAAgC,IAAI;AAMzD,QAAM,eAAe,QAAQ,MAAM,MAAM,SAAS,QAAQ,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAC/E,QAAM,YAAY,aAAa;AAG/B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,CAAC;AAM1C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAmB,MAAM,aAAa,MAAM,EAAE,KAAK,CAAC,CAAC;AAIzF,QAAM,wBAAwB,OAAO,oBAAoB,YAAY,kBAAkB;AAMvF,YAAU,MAAM;AACZ,QAAI,WAAW,SAAS,aAAa,QAAQ;AACzC,oBAAc,CAAA,SAAQ,CAAC,GAAG,MAAM,GAAG,MAAM,aAAa,SAAS,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,IACxF;AAAA,EACJ,GAAG,CAAC,aAAa,QAAQ,WAAW,MAAM,CAAC;AAG3C,QAAM,iBAAiB,YAAY,MAAM;AACrC,QAAI,CAAC,sBAAuB;AAC5B,QAAI,EAAC,mDAAiB,YAAW,CAAC,aAAa,QAAS;AACxD,UAAM,UAAU,gBAAgB;AAChC,UAAM,YAAY,QAAQ;AAC1B,QAAI,MAAM;AACV,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,UAAI,MAAM,WAAW,CAAC,IAAI,WAAW;AACjC,cAAM;AACN;AAAA,MACJ;AACA,aAAO,WAAW,CAAC;AAAA,IACvB;AACA,gBAAY,GAAG;AAAA,EACnB,GAAG,CAAC,YAAY,iBAAiB,qBAAqB,CAAC;AAGvD,QAAM,eAAe,YAAY,MAAM;AACnC,QAAI,CAAC,sBAAuB;AAC5B,0BAAsB,cAAc;AAAA,EACxC,GAAG,CAAC,gBAAgB,qBAAqB,CAAC;AAG1C,YAAU,MAAM;;AACZ,QAAI,CAAC,sBAAuB;AAC5B,UAAM,eAAe,MAAM,sBAAsB,cAAc;AAC/D,WAAO,iBAAiB,UAAU,YAAY;AAC9C,6DAAiB,YAAjB,mBAA0B,iBAAiB,UAAU;AACrD,iBAAA;AACA,WAAO,MAAM;;AACT,aAAO,oBAAoB,UAAU,YAAY;AACjD,OAAAI,MAAA,mDAAiB,YAAjB,gBAAAA,IAA0B,oBAAoB,UAAU;AAAA,IAC5D;AAAA,EACJ,GAAG,CAAC,cAAc,gBAAgB,qBAAqB,CAAC;AAGxD,kBAAgB,MAAM;AAClB,QAAI,CAAC,aAAa,QAAS;AAC3B,UAAM,OAAO,aAAa,QAAQ,iBAAiB,oBAAoB;AACvE,UAAM,aAAa,CAAC,GAAG,UAAU;AACjC,QAAI,UAAU;AACd,SAAK,QAAQ,CAAC,KAAK,QAAQ;AAEvB,YAAM,UAAU,wBAAwB,WAAW,MAAM;AACzD,YAAM,IAAI,IAAI,sBAAA,EAAwB;AACtC,UAAI,IAAI,KAAK,WAAW,OAAO,MAAM,GAAG;AACpC,mBAAW,OAAO,IAAI;AACtB,kBAAU;AAAA,MACd;AAAA,IACJ,CAAC;AACD,QAAI,uBAAuB,UAAU;AAAA,EACzC,GAAG,CAAC,cAAc,YAAY,UAAU,qBAAqB,CAAC;AAG9D,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,MAAI,uBAAuB;AAGvB,QAAS,qBAAT,SAA4B,OAAe,SAA2B;AAClE,eAAS,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;AACjC,YAAI,QAAQ,CAAC,IAAI,EAAG,QAAO,QAAQ,CAAC;AAAA,MACxC;AACA,eAAS,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAC7C,YAAI,QAAQ,CAAC,IAAI,EAAG,QAAO,QAAQ,CAAC;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAVA,UAAM,SAAS,KAAK,IAAI,WAAY,iBAA4B,SAAS;AACzE,mBAAe,aAAa,MAAM,UAAU,MAAM;AAUlD,gBAAY,WAAW,MAAM,GAAG,QAAQ,EAAE,OAAO,CAAC,GAAG,GAAG,MAAM,KAAK,IAAI,IAAI,IAAI,mBAAmB,GAAG,UAAU,IAAI,CAAC;AACpH,mBAAe,WAAW,MAAM,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,MAAM,KAAK,IAAI,IAAI,IAAI,mBAAmB,SAAS,GAAG,UAAU,IAAI,CAAC;AAAA,EAC/H,OAAO;AACH,mBAAe;AAAA,EACnB;AAEA,SACI,qBAAC,WAAM,KAAK,cAAc,OAAO,IAAK,GAAG,OAAO,WAAW,GAAGJ,SAAO,+BAA+B,CAAC,IAAI,MAAM,aAAa,EAAE,KAAKA,SAAO,aAAa,CAAC,IAEnJ,UAAA;AAAA,IAAA,yBAAyB,WAAW,KAAK,CAAA,MAAK,IAAI,CAAC,KAAK,oBAAC,MAAA,EAAG,OAAO,EAAE,QAAQ,UAAA,EAAU,CAAG;AAAA,IAE1F,aAAa,IAAI,CAAC,OAAO,QACtB,MAAM,eAAe,KAAK,IACpB,MAAM,aAAa,OAA6B,EAAE,kBAAkB,wBAAwB,WAAW,MAAM,KAAK,KAAK,wBAAwB,WAAW,MAAM,IAAA,CAAK,IACrK,KACT;AAAA,IAEA,yBAAyB,WAAW,KAAK,CAAA,MAAK,IAAI,CAAC,KAAK,oBAAC,MAAA,EAAG,OAAO,EAAE,QAAQ,eAAa,CAAG;AAAA,EAAA,GAClG;AAER;AAEA,MAAA,eAAe,MAAM,KAAK,UAAU;ACzIpC,MAAM,SAAsB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA,YAAY;AAAA;AAAA,EACZ,YAAY;AAAA;AAAA,EACZ,GAAG;AACP,MAAM;AACF,QAAM,kBAAkB,OAAuB,IAAI;AACnD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AAIZ,UAAM,eAAe,MAAM;AACvB,UAAI,gBAAgB,SAAS;AAEzB,cAAM,aAAa,gBAAgB,QAAQ,YAAY;AACvD,oBAAY,UAAU;AAAA,MAC1B;AAAA,IACJ;AAEA,UAAM,UAAU,gBAAgB;AAChC,QAAI,SAAS;AACT,cAAQ,iBAAiB,UAAU,YAAY;AAAA,IACnD;AAEA,WAAO,MAAM;AACT,UAAI,SAAS;AACT,gBAAQ,oBAAoB,UAAU,YAAY;AAAA,MACtD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAA,CAAE;AAEL,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAWA,SAAO,mBAAmB;AAAA,MACrC,OAAO,EAAE,WAAW,UAAA;AAAA,MAEpB,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,OAAO;AAAA,UACN,GAAG;AAAA,UACJ,WAAW,SAASA,SAAO,0BAA0B,CAAC,IAAIA,SAAO,UAAU,CAAC,IAAIA,SAAO,eAAe,CAAC,IAAI,MAAM,aAAa,EAAE;AAAA,UAE/H,UAAA,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU;AACrC,gBACI,MAAM,eAAe,KAAK,KAC1B,MAAM,SAAS,YACjB;AAEE,oBAAM,YAAY,MAAM;AAGxB,qBAAO,MAAM;AAAA,gBACT;AAAA,gBACA;AAAA,kBACI,GAAG;AAAA,kBACH;AAAA,gBAAA;AAAA,cACJ;AAAA,YAER;AAEA,gBACI,MAAM,eAAe,KAAK,KAC1B,MAAM,SAASK,cACjB;AAEE,oBAAM,YAAY,MAAM;AAGxB,qBAAO,MAAM;AAAA,gBACT;AAAA,gBACA;AAAA,kBACI,GAAG;AAAA,kBACH;AAAA,gBAAA;AAAA,cACJ;AAAA,YAER;AACA,mBAAO;AAAA,UACX,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IACL;AAAA,EAAA;AAGZ;ACxGA,MAAM,YAA4B,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAO;AAAA,MACN,GAAG;AAAA,MACJ,WAAW,GAAGL,SAAO,8BAA8B,CAAC,IAAI,MAAM,aAAa,EAAE,GAAG,kBAAkB,SAAY,IAAIA,SAAO,aAAa,CAAC,KAAK,EAAE;AAAA,MAE7I;AAAA,IAAA;AAAA,EAAA;AAGb;ACQA,MAAM,mBAA0C,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA,QAAQ;AAAA;AAAA,EACR,GAAG;AACP,MAAM;AAKF,QAAM,QAA6B;AAAA,IAC/B,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EAAA;AAGP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,SAAS,OAAO,MAAM,IAAI,MAAM;AAAA,MAChC,SAAS,OAAO,MAAM,IAAI,MAAM;AAAA,MAC/B,GAAG;AAAA,MACJ,WAAW,GAAGA,SAAO,sCAAsC,CAAC,IAAI,MAAM,aAAa,EAAE;AAAA,MACrF;AAAA,MAEC;AAAA,IAAA;AAAA,EAAA;AAGb;AC7BA,MAAM,iBAAsC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA,SAAS;AAAA;AAAA,EACT,GAAG;AACP,MAAM;AAKF,QAAM,QAA6B;AAAA,IAC/B,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EAAA;AAGP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,SAAS,OAAO,MAAM,IAAI,MAAM;AAAA,MAChC,SAAS,OAAO,MAAM,IAAI,MAAM;AAAA,MAC/B,GAAG;AAAA,MACJ,WAAW,GAAGA,SAAO,oCAAoC,CAAC,IAAI,MAAM,aAAa,EAAE;AAAA,MACnF;AAAA,MAEC;AAAA,IAAA;AAAA,EAAA;AAGb;AC3DA,MAAM,eAAkC,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAO;AAAA,MACN,GAAG;AAAA,MACJ,WAAW,GAAGA,SAAO,iCAAiC,CAAC,IAAI,MAAM,aAAa,EAAE;AAAA,MAG/E;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;;;;;;;;;ACkCA,MAAM,UAAwB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,MAAAM,QAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACZ,MAAM;AAEF,YAAU,MAAM;AACZ,QAAI,CAAC,aAAc;AAEnB,UAAM,cAAc,SAAS,iBAAiB,gBAAgB,EAAE;AAEhE,QAAI,cAAc,GAAG;AACjB,eAAS,KAAK,UAAU,IAAI,aAAa;AAAA,IAC7C,OAAO;AACH,eAAS,KAAK,UAAU,OAAO,aAAa;AAAA,IAChD;AAEA,WAAO,MAAM;AACT,YAAM,eAAe,SAAS,iBAAiB,gBAAgB,EAAE;AACjE,UAAI,iBAAiB,GAAG;AACpB,iBAAS,KAAK,UAAU,OAAO,aAAa;AAAA,MAChD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,YAAY,CAAC;AAGjB,MAAI,CAAC,aAAc,QAAO;AAG1B,QAAM,cAA2C;AAAA,IAC7C,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,UAAU;AAAA,EAAA;AAGd,QAAM,eAAe,YAAY,KAAK;AAEtC,SAAO,SAAS;AAAA,IACZ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA,OAAO;AAAA,QACP,WAAW,GAAGN,SAAO,UAAU,CAAC,IAAI,eAAeA,SAAO,eAAe,IAAI,EAAE,IAAI,aAAa,EAAE;AAAA,QAClG,SAAS,MAAM,2DAAsB;AAAA,QAErC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAW,GAAGA,SAAO,mBAAmB,CAAC,IAAI,eAAeA,SAAO,QAAQ,IAAI,EAAE,IAAIM,QAAON,SAAO,MAAM,IAAI,EAAE;AAAA,YAC/G,OAAO;AAAA,cACH,OAAO;AAAA,YAAA;AAAA,YAEX,SAAS,CAAC,MAAM,EAAE,gBAAA;AAAA,YAEjB;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA;AAAA,IAEJ,SAAS;AAAA,EAAA;AAEjB;ACrFA,MAAM,aAAa,MAAM,WAAuC,CAAC;AAAA,EAC7D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA,oBAAC,QAAA,EAAK,GAAE,mLAAA,CAAmL;AAAA,IAAA;AAAA,EAAA;AAGvM,CAAC;AAED,WAAW,cAAc;ACzDzB,MAAM,gBAAoC,CAAC,EAAE,OAAAO,QAAO,kBAAkB;AAClE,SACI,qBAAC,OAAA,EAAI,WAAWP,SAAO,kBAAkB,GACrC,UAAA;AAAA,IAAA,oBAAC,MAAA,EAAG,WAAWA,SAAO,wBAAwB,GACzC,UAAAO,QACL;AAAA,IACC,eACG,oBAAC,OAAA,EAAI,WAAWP,SAAO,wBAAwB,GAC3C,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA,OAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IAAA,EACV,CACJ;AAAA,EAAA,GAER;AAER;ACZA,MAAM,cAAgC,CAAC,EAAE,IAAI,UAAU,SAAS,WAAW;AACvE,QAAM,QAAQ;AAAA,IACV,GAAI,SAAS,EAAE,WAAW,OAAA,IAAoB,CAAA;AAAA,IAC9C,GAAG;AAAA,EAAA;AAGP,6BACK,OAAA,EAAI,WAAWA,SAAO,gBAAgB,GAAG,OACrC,UACL;AAER;ACFA,MAAM,gBAAoC,CAAC,EAAE,UAAU,WAAW,IAAI,SAAS;AAC3E,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,WAAW,GAAGA,SAAO,kBAAkB,CAAC,IAAI,aAAa,EAAE;AAAA,MAE1D;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;;;;;;;;;;;;;;;;;;;ACkBA,MAAM,YAA4B,CAAC,EAAE,IAAI,QAAQ,WAAW,IAAI,gBAAgB;AAE5E,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,GAAGA,SAAO,uBAAuB,CAAC,IAAIA,SAAO,OAAO,IAAI,aAAa,EAAE;AAAA,MAClF;AAAA,MACA,OAAO;AAAA,MAEP,UAAA,oBAAC,OAAA,EAAI,WAAW,GAAGA,SAAO,cAAc,CAAC,IAAIA,SAAO,KAAK,CAAC,GAAA,CAAI;AAAA,IAAA;AAAA,EAAA;AAG1E;;;;;ACtBA,MAAM,aAA8B,CAAC;AAAA,EACjC;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AACJ,MAAM;AAEF,QAAM,cAAmC;AAAA,IACrC;AAAA,IACA,GAAG;AAAA,EAAA;AAGP,YAAU,MAAM;AACZ,QAAI,SAAS,iBAAiB,mBAAmB,EAAE,SAAS,GAAG;AAC3D,eAAS,KAAK,UAAU,IAAI,gBAAgB;AAAA,IAChD,OAAO;AACH,eAAS,KAAK,UAAU,OAAO,gBAAgB;AAAA,IACnD;AAEA,WAAO,MAAM;AACT,eAAS,KAAK,UAAU,OAAO,gBAAgB;AAAA,IACnD;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,GAAGA,SAAO,aAAa,CAAC,IAAI,OAAOA,SAAO,kBAAkB,IAAI,EAAE;AAAA,MAC7E,OAAO;AAAA,MAEN;AAAA,IAAA;AAAA,EAAA;AAGb;;;;ACtCA,MAAM,YAAY;AAAA,EACd,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEP,QACC;AACD,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,GAAGA,SAAO,YAAY,CAAC,IAAI,aAAa,EAAE;AAAA,QACrD,OAAO;AAAA,QAEP,+BAAC,SAAA,EACG,UAAA;AAAA,UAAA,oBAAC,SAAA,EAAM,KAAU,MAAK,YAAY,GAAG,OAAO;AAAA,UAC3C;AAAA,QAAA,EAAA,CACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;;;;ACrBA,MAAM,eAAe;AAAA,EACjB,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEP,QACC;AACD,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,GAAGA,SAAO,SAAS,CAAC,IAAI,aAAa,EAAE;AAAA,QAClD,OAAO;AAAA,QAEP,+BAAC,SAAA,EACG,UAAA;AAAA,UAAA,oBAAC,SAAA,EAAM,KAAU,MAAK,SAAS,GAAG,OAAO;AAAA,UACxC;AAAA,QAAA,EAAA,CACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AC7EO,MAAM,OAAO;AAapB,MAAM,QAAQ,CAAC,OAAe,QAA0B;AACpD,QAAM,SAAS,MAAM,QAAQ;AAC7B,SAAO,MAAM,KAAK,EAAE,OAAA,GAAU,CAAC,GAAG,QAAQ,MAAM,KAAK;AACzD;AAqEO,MAAM,gBAAgB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AACJ,MAAc;AACV,QAAM,kBAAkB,QAAQ,MAAM;AAClC,UAAM,iBAAiB,KAAK,KAAK,aAAa,QAAQ;AAEtD,UAAM,mBAAmB,eAAe;AAExC,QAAI,oBAAoB,gBAAgB;AACpC,aAAO,MAAM,GAAG,cAAc;AAAA,IAClC;AAEA,UAAM,mBAAmB,KAAK,IAAI,cAAc,cAAc,CAAC;AAC/D,UAAM,oBAAoB,KAAK;AAAA,MAC3B,cAAc;AAAA,MACd;AAAA,IAAA;AAGJ,UAAM,qBAAqB,mBAAmB;AAC9C,UAAM,sBAAsB,oBAAoB,iBAAiB;AAEjE,UAAM,iBAAiB;AACvB,UAAM,gBAAgB;AAEtB,QAAI,CAAC,sBAAsB,qBAAqB;AAC5C,YAAM,gBAAgB,IAAI,IAAI;AAC9B,YAAM,YAAY,MAAM,GAAG,aAAa;AACxC,aAAO,CAAC,GAAG,WAAW,MAAM,cAAc;AAAA,IAC9C;AAEA,QAAI,sBAAsB,CAAC,qBAAqB;AAC5C,YAAM,iBAAiB,IAAI,IAAI;AAC/B,YAAM,aAAa;AAAA,QACf,iBAAiB,iBAAiB;AAAA,QAClC;AAAA,MAAA;AAEJ,aAAO,CAAC,gBAAgB,MAAM,GAAG,UAAU;AAAA,IAC/C;AAEA,QAAI,sBAAsB,qBAAqB;AAC3C,YAAM,cAAc,MAAM,kBAAkB,iBAAiB;AAC7D,aAAO,CAAC,gBAAgB,MAAM,GAAG,aAAa,MAAM,aAAa;AAAA,IACrE;AAEA,WAAO;AAAA,EACX,GAAG,CAAC,YAAY,UAAU,cAAc,WAAW,CAAC;AAEpD,SAAO;AACX;;;;;;;;;;;;;;;AC1CA,MAAM,cAAgC,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,kBAAkB,cAAc;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACH;AAED,MAAI,gBAAgB,KAAK,CAAC,mBAAmB,gBAAgB,SAAS,GAAG;AACrE,WAAO;AAAA,EACX;AAEA,QAAM,SAAS,MAAM,aAAa,cAAc,CAAC;AACjD,QAAM,aAAa,MAAM,aAAa,cAAc,CAAC;AACrD,QAAM,WAAW,gBAAgB,gBAAgB,SAAS,CAAC;AAE3D,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,GAAGA,SAAO,sBAAsB,CAAC,IAAI,aAAa,EAAE;AAAA,MAC/D,OAAO;AAAA,MACP;AAAA,MAEA,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAW,GAAGA,SAAO,iBAAiB,CAAC,IAAI,gBAAgB,IAAIA,SAAO,WAAW,EAAE;AAAA,YACnF,SAAS;AAAA,YAET,UAAA,oBAAC,SAAI,WAAW,GAAGA,SAAO,KAAK,IAAIA,SAAO,IAAI,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAGrD,gBAAgB,IAAI,CAAC,YAAY,UAAU;AACxC,cAAI,eAAe,MAAM;AACrB,mBACI,oBAAC,MAAA,EAAe,WAAW,GAAGA,SAAO,iBAAiB,CAAC,IAAIA,SAAO,IAAI,IAAI,UAAA,IAAA,GAAjE,KAET;AAAA,UAER;AAEA,iBACI;AAAA,YAAC;AAAA,YAAA;AAAA,cAEG,WAAW,GAAGA,SAAO,iBAAiB,CAAC,IAAI,eAAe,cAAcA,SAAO,WAAW,EAAE;AAAA,cAC5F,SAAS,MAAM,aAAa,UAAU;AAAA,cAErC,UAAA;AAAA,YAAA;AAAA,YAJI;AAAA,UAAA;AAAA,QAOjB,CAAC;AAAA,QAED;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAW,GAAGA,SAAO,iBAAiB,CAAC,IAAI,gBAAgB,WAAWA,SAAO,WAAW,EAAE;AAAA,YAC1F,SAAS;AAAA,YAET,UAAA,oBAAC,SAAI,WAAW,GAAGA,SAAO,KAAK,IAAIA,SAAO,KAAK,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MACvD;AAAA,IAAA;AAAA,EAAA;AAGZ;;;;;;;;;AC5JA,MAAM,YAA4B,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AAEF,SACI,oBAAC,OAAA,EAAI,WAAW,GAAGA,SAAO,aAAa,CAAC,IAAI,aAAa,EAAE,IAAI,OAAO,IAAI,IACrE,UACL;AAER;ACXA,MAAM,gBAAoC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA,OAAAO;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,SACI,qBAAC,OAAA,EAAI,WAAW,GAAGP,SAAO,oBAAoB,CAAC,IAAI,aAAa,EAAE,IAAI,IAClE,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAWA,SAAO,2BAA2B,EAAA,CAAG;AAAA,yBACpD,OAAA,EAAI,WAAWA,SAAO,0BAA0B,GAAG,OAAO,IACtD,UAAA;AAAA,MAAAO,8BAAU,OAAA,EAAI,WAAWP,SAAO,0BAA0B,GAAI,UAAAO,QAAM;AAAA,0BACpE,OAAA,EAAI,WAAWP,SAAO,4BAA4B,GAChD,SAAA,CACH;AAAA,IAAA,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;;;;;;;;;;;;;;;;;;;AC4CA,MAAM,aAAa,MAAM,WAAuC,CAAC;AAAA,EAC7D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AAEP,QAAM,QAAQ;AAAA,IACV,WAAW;AAAA,2BACQ,cAAc,SAAS,KAClC,cAAc,OAAO,MACjB,cAAc,UAAU,IACpB,GAAG;AAAA,EAAA;AAGvB,OAAK,OAAO,OAAO,CAAA,GAAI,OAAO,EAAE;AAEhC,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,OAAO;AAAA,MACP,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAA4R;AAAA,EAAA;AAG9S,CAAC;AAED,WAAW,cAAc;ACJzB,MAAM,eAAkC,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAACG,QAAO,QAAQ,IAAI,SAAS,KAAK;AACxC,QAAM,CAAC,YAAY,aAAa,IAAI,SAAwB,IAAI;AAChE,QAAM,CAAC,UAAU,WAAW,IAAI,SAAwB,IAAI;AAC5D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACZ,iBAAa,IAAI;AACjB,aAAS,KAAK;AACd,gBAAY,KAAK;AAGjB,UAAM,YAAY,IAAI,MAAA;AACtB,cAAU,MAAM,UAAU,WAAW;AACrC,cAAU,SAAS,MAAM;AACrB,mBAAa,KAAK;AAAA,IACtB;AACA,cAAU,UAAU,MAAM;AACtB,eAAS,IAAI;AACb,mBAAa,KAAK;AAAA,IACtB;AAAA,EACJ,GAAG,CAAC,aAAa,SAAS,CAAC;AAE3B,QAAM,gBAAgB,YAAY,CAAC,MAAqB;AACpD,QAAI,CAAC,aAAc;AAEnB,YAAQ,EAAE,KAAA;AAAA,MACN,KAAK;AACD,YAAI,cAAc,GAAG;AACjB,yBAAe,cAAc,CAAC;AAAA,QAClC;AACA;AAAA,MACJ,KAAK;AACD,YAAI,cAAc,UAAU,SAAS,GAAG;AACpC,yBAAe,cAAc,CAAC;AAAA,QAClC;AACA;AAAA,MACJ,KAAK;AACD;AACA;AAAA,MACJ,KAAK;AACD,oBAAY,CAAA,SAAQ,CAAC,IAAI;AACzB;AAAA,IAAA;AAAA,EAEZ,GAAG,CAAC,aAAa,cAAc,aAAa,cAAc,CAAC;AAE3D,YAAU,MAAM;AACZ,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EACpE,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,mBAAmB,CAAC,MAAwB;AAC9C,kBAAc,EAAE,QAAQ,CAAC,EAAE,OAAO;AAAA,EACtC;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAC7C,gBAAY,EAAE,QAAQ,CAAC,EAAE,OAAO;AAAA,EACpC;AAEA,QAAM,iBAAiB,MAAM;AACzB,QAAI,CAAC,cAAc,CAAC,SAAU;AAE9B,UAAM,WAAW,aAAa;AAC9B,UAAM,cAAc,WAAW;AAC/B,UAAM,eAAe,WAAW;AAEhC,QAAI,eAAe,cAAc,UAAU,SAAS,GAAG;AACnD,qBAAe,cAAc,CAAC;AAAA,IAClC,WAAW,gBAAgB,cAAc,GAAG;AACxC,qBAAe,cAAc,CAAC;AAAA,IAClC;AAEA,kBAAc,IAAI;AAClB,gBAAY,IAAI;AAAA,EACpB;AAEA,QAAM,mBAAmB,MAAM;AAC3B,gBAAY,CAAA,SAAQ,CAAC,IAAI;AAAA,EAC7B;AAEA,MAAI,CAAC,UAAU,UAAU,cAAc,KAAK,eAAe,UAAU,QAAQ;AACzE,WAAO;AAAA,EACX;AAEA,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,WAAW,GAAGH,SAAO,iBAAiB,CAAC,IAAI,aAAa,EAAE;AAAA,MAC1D;AAAA,MAEA,UAAA,qBAAC,OAAA,EAAI,WAAWA,SAAO,sBAAsB,GAEzC,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAWA,SAAO,cAAc,GAChC,UAAA,eACG;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,aAAa,MAAM;AACf,0BAAA;AACA,uBAAS,KAAK,MAAM,WAAW;AAAA,YACnC;AAAA,UAAA;AAAA,QAAA,GAGZ;AAAA,QAGA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAWA,SAAO,iBAAiB;AAAA,YACnC,cAAc;AAAA,YACd,aAAa;AAAA,YACb,YAAY;AAAA,YAGX,UAAA;AAAA,cAAA,cAAc,KACX,oBAAC,OAAA,EAAI,WAAWA,SAAO,YAAY,GAC/B,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,WAAU;AAAA,kBACV,aAAa,MAAM,eAAe,cAAc,CAAC;AAAA,gBAAA;AAAA,cAAA,GAEzD;AAAA,cAIJ,qBAAC,OAAA,EAAI,WAAWA,SAAO,eAAe,GACjC,UAAA;AAAA,gBAAA,aACG,oBAAC,OAAA,EAAI,WAAWA,SAAO,iBAAiB,GACpC,UAAA,oBAAC,OAAA,EAAI,WAAWA,SAAO,SAAS,EAAA,CAAG,GACvC;AAAA,gBAEHG,6BACI,OAAA,EAAI,WAAWH,SAAO,eAAe,GAAG,yCAEzC,IAEA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACG,KAAK,UAAU,WAAW;AAAA,oBAC1B,KAAI;AAAA,oBACJ,QAAQ,MAAM,aAAa,KAAK;AAAA,oBAChC,SAAS,MAAM;AACX,+BAAS,IAAI;AACb,mCAAa,KAAK;AAAA,oBACtB;AAAA,oBACA,WAAWA,SAAO,YAAY;AAAA,oBAC9B,SAAS;AAAA,oBACT,OAAO;AAAA,sBACH,QAAQ;AAAA,sBACR,WAAW,WAAW,eAAe;AAAA,sBACrC,YAAY;AAAA,oBAAA;AAAA,kBAChB;AAAA,gBAAA;AAAA,cACJ,GAER;AAAA,cAGC,cAAc,UAAU,SAAS,yBAC7B,OAAA,EAAI,WAAWA,SAAO,aAAa,GAChC,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,WAAU;AAAA,kBACV,aAAa,MAAM,eAAe,cAAc,CAAC;AAAA,gBAAA;AAAA,cAAA,EACrD,CACJ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAKP,UAAU,SAAS,KAChB,oBAAC,OAAA,EAAI,WAAWA,SAAO,oBAAoB,GACtC,UAAA,UAAU,IAAI,CAAC,GAAG,UACf;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,WAAW,GAAGA,SAAO,cAAc,CAAC,IAAI,UAAU,cAAcA,SAAO,QAAQ,IAAI,EAC/E;AAAA,YACJ,SAAS,MAAM,eAAe,KAAK;AAAA,UAAA;AAAA,UAH9B;AAAA,QAAA,CAKZ,EAAA,CACL;AAAA,MAAA,EAAA,CAER;AAAA,IAAA;AAAA,EAAA;AAGZ;;;;;;;;;;;;ACrLA,MAAM,aAA8B,CAAC;AAAA,EACjC,UAAU;AAAA,EACV,OAAAO;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,WAAW;AAEhD,YAAU,MAAM;AACZ,QAAI,SAAS,QAAW;AACpB,gBAAU,IAAI;AAAA,IAClB;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAGP,SAAO,IAAI,IAAI,aAAa,EAAE;AAAA,MAC5C;AAAA,MAEA,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWA,SAAO,OAAO;AAAA,UACzB,MAAM;AAAA,UACN,OAAO;AAAA,UAEP,UAAA;AAAA,YAAA,oBAAC,WAAA,EAAQ,WAAWA,SAAO,iBAAiB,GACvC,UAAAO,QACL;AAAA,YACC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACL;AAAA,EAAA;AAGZ;;;;;;;;;;ACWA,MAAM,iBAAsC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,UAAAL,YAAW;AAAA,EACX;AAAA,EACA,OAAAK;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACJ,MAAM;AACF,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAiB,CAAA,CAAE;AAC7D,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAoC,CAAA,CAAE;AAClF,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAmB,CAAA,CAAE;AAEjD,QAAM,gBAAgB,CAAC,UAA4B;AAC/C,UAAM,YAAsB,CAAA;AAE5B,QAAI,YAAY,MAAM,SAAS,UAAU;AACrC,gBAAU,KAAK,mCAAmC,QAAQ,EAAE;AAAA,IAChE;AAEA,UAAM,QAAQ,CAAA,SAAQ;AAClB,UAAI,aAAa;AACb,cAAM,iBAAiB,YAAY,cAAc,OAC3C,YAAY,OAAO,OAAO,OAC1B,YAAY,OAAO;AAEzB,YAAI,KAAK,OAAO,gBAAgB;AAC5B,oBAAU,KAAK,QAAQ,KAAK,IAAI,kCAAkC,YAAY,IAAI,IAAI,YAAY,SAAS,EAAE;AAAA,QACjH;AAAA,MACJ;AAEA,UAAI,QAAQ;AACR,cAAM,WAAW,KAAK;AACtB,cAAM,WAAW,KAAK,KAAK,YAAA;AAC3B,cAAM,gBAAgB,OAAO,MAAM,GAAG,EAAE,IAAI,CAAA,SAAQ,KAAK,MAAM;AAE/D,cAAM,cAAc,cAAc,KAAK,CAAA,SAAQ;AAE3C,cAAI,KAAK,SAAS,GAAG,GAAG;AACpB,gBAAI,KAAK,SAAS,IAAI,GAAG;AACrB,oBAAM,WAAW,KAAK,MAAM,GAAG,EAAE,CAAC;AAClC,qBAAO,SAAS,WAAW,GAAG,QAAQ,GAAG;AAAA,YAC7C;AACA,mBAAO,SAAS;AAAA,UACpB,OAEK;AACD,mBAAO,SAAS,SAAS,KAAK,YAAA,CAAa;AAAA,UAC/C;AAAA,QACJ,CAAC;AAED,YAAI,CAAC,aAAa;AACd,oBAAU,KAAK,QAAQ,KAAK,IAAI,4BAA4B;AAAA,QAChE;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAEA,QAAM,mBAAmB,CAAC,MAA2C;AACjE,QAAI,CAAC,EAAE,OAAO,MAAO;AAErB,UAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,KAAK;AACvC,UAAM,mBAAmB,cAAc,KAAK;AAE5C,QAAI,iBAAiB,SAAS,GAAG;AAC7B,gBAAU,gBAAgB;AAC1B,6DAAoB;AACpB;AAAA,IACJ;AAEA,cAAU,CAAA,CAAE;AACZ,qBAAiB,KAAK;AAEtB,UAAM,KAAK,IAAI,aAAA;AACf,UAAM,QAAQ,CAAA,SAAQ,GAAG,MAAM,IAAI,IAAI,CAAC;AACxC,aAAS,GAAG,KAAK;AAGjB,UAAM,QAAQ,CAAA,SAAQ;AAClB,UAAIN,YAAW;AACf,YAAM,WAAW,YAAY,MAAM;AAC/B,QAAAA,aAAY;AACZ,0BAAkB,CAAA,UAAS,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,GAAGA,UAAA,EAAW;AAC9D,YAAIA,aAAY,IAAK,eAAc,QAAQ;AAAA,MAC/C,GAAG,GAAG;AAAA,IACV,CAAC;AAAA,EACL;AAEA,QAAM,iBAAiB,CAAC,MAAuB;AAC3C,MAAE,eAAA;AACF,kBAAc,IAAI;AAAA,EACtB;AAEA,QAAM,kBAAkB,CAAC,MAAuB;AAC5C,MAAE,eAAA;AACF,kBAAc,KAAK;AAAA,EACvB;AAEA,QAAM,aAAa,CAAC,MAAuB;AACvC,MAAE,eAAA;AACF,kBAAc,KAAK;AAEnB,QAAIC,UAAU;AAEd,UAAM,QAAQ,MAAM,KAAK,EAAE,aAAa,KAAK;AAC7C,UAAM,mBAAmB,cAAc,KAAK;AAE5C,QAAI,iBAAiB,SAAS,GAAG;AAC7B,gBAAU,gBAAgB;AAC1B,6DAAoB;AACpB;AAAA,IACJ;AAEA,cAAU,CAAA,CAAE;AACZ,qBAAiB,KAAK;AAEtB,UAAM,KAAK,IAAI,aAAA;AACf,UAAM,QAAQ,CAAA,SAAQ,GAAG,MAAM,IAAI,IAAI,CAAC;AACxC,aAAS,GAAG,KAAK;AAAA,EACrB;AAEA,QAAM,aAAa,CAAC,aAAqB;AACrC,qBAAiB,UAAQ,KAAK,OAAO,UAAQ,KAAK,SAAS,QAAQ,CAAC;AACpE,sBAAkB,CAAA,SAAQ;AACtB,YAAM,cAAc,EAAE,GAAG,KAAA;AACzB,aAAO,YAAY,QAAQ;AAC3B,aAAO;AAAA,IACX,CAAC;AAGD,UAAM,KAAK,IAAI,aAAA;AACf,kBACK,OAAO,CAAA,SAAQ,KAAK,SAAS,QAAQ,EACrC,QAAQ,CAAA,SAAQ,GAAG,MAAM,IAAI,IAAI,CAAC;AACvC,aAAS,GAAG,KAAK;AAAA,EACrB;AAEA,YAAU,MAAM;AACZ,QAAI,cAAc,SAAS,SAAS;AAChC,eAAS,QAAQ,QAAQ;AACzB,uBAAiB,CAAA,CAAE;AACnB,wBAAkB,CAAA,CAAE;AAAA,IACxB;AAAA,EACJ,GAAG,CAAC,UAAU,CAAC;AAEf,SACI,qBAAC,OAAA,EAAI,WAAWF,SAAO,WACnB,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,GAAGA,SAAO,aAAa,CAAC,IAAIA,SAAO,sBAAsB,CAAC,IAAI,aAAaA,SAAO,WAAW,EAAE;AAAA,QAC1G,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,QAAQ;AAAA,QAER,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACG;AAAA,cACA;AAAA,cACA,MAAK;AAAA,cACL,WAAW,GAAGA,SAAO,mBAAmB,CAAC,IAAI,aAAa,EAAE;AAAA,cAC5D;AAAA,cACA;AAAA,cACA,OAAAO;AAAA,cACA,iBAAe,2CAAa;AAAA,cAC5B;AAAA,cACA,UAAU;AAAA,cACV,UAAAL;AAAA,cACA,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,+BAER,SAAA,EAAM,SAAS,IAAI,WAAWF,SAAO,mBAAmB,GAAG,OAAOE,YAAW,EAAE,iBAAiB,WAAW,QAAQ,qBAAA,IAAyB,QACzI,UAAA;AAAA,YAAA,qBAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,MAAK,gBAAe,SAAQ,aACpD,UAAA;AAAA,cAAA,oBAAC,QAAA,EAAK,aAAU,WAAU,GAAE,gIAA+H;AAAA,cAC3J,oBAAC,QAAA,EAAK,GAAE,ucAAA,CAAuc;AAAA,YAAA,GACnd;AAAA,gCACC,MAAA,EAAG;AAAA,YACJ,qBAAC,UAAK,OAAOA,YAAW,EAAE,OAAO,UAAA,IAAc,QAC3C,UAAA;AAAA,cAAA,oBAAC,KAAA,EAAE,OAAOA,YAAW,EAAE,OAAO,cAAc,QAAW,UAAA,WAAA,CAAQ;AAAA,cAAI;AAAA,kCAAkC,MAAA,EAAG;AAAA,cACvG,WAAW,SACR,qBAAA,UAAA,EAAE,UAAA;AAAA,gBAAA;AAAA,gBAC0C,oBAAC,OAAE,OAAOA,YAAW,EAAE,OAAO,cAAc,QAAY,UAAA,OAAA,CAAO;AAAA,oCAAK,MAAA,CAAA,CAAG;AAAA,cAAA,EAAA,CACnH,IACA;AAAA,cACH,oCAAgB,SAAA,EAAM,UAAA;AAAA,gBAAA;AAAA,gBAAqB,YAAY;AAAA,gBAAK;AAAA,gBAAE,YAAY;AAAA,cAAA,EAAA,CAAU;AAAA,YAAA,EAAA,CACzF;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGH,OAAO,SAAS,KACb,oBAAC,SAAI,WAAWF,SAAO,QAClB,UAAA,OAAO,IAAI,CAACG,QAAO,8BACf,OAAA,EAAgB,WAAWH,SAAO,OAAQ,UAAAG,OAAA,GAAjC,KAAuC,CACpD,EAAA,CACL;AAAA,IAGH,eAAe,cAAc,SAAS,KACnC,oBAAC,OAAA,EAAI,WAAWH,SAAO,sBAAsB,GACxC,UAAA,cAAc,IAAI,CAAC,MAAM,8BACrB,OAAA,EAAgB,WAAWA,SAAO,UAC/B,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,UAAU,eAAe,KAAK,IAAI;AAAA,QAClC,cAAcE,YAAW,SAAY,MAAM,WAAW,KAAK,IAAI;AAAA,MAAA;AAAA,IAAA,EACnE,GANM,KAOV,CACH,EAAA,CACL;AAAA,EAAA,GAER;AAER;;;;;AC9RA,MAAM,UAAU;AAAA,EACZ,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,QAAQ;AAAA,IACR;AAAA,IACA,GAAG;AAAA,EAAA,GAEP,QACC;AACD,UAAM,YAAiC;AAAA,MACnC,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,MACd,OAAO,YAAY,SAAS,SAAS;AAAA,MACrC,QAAQ,UAAU;AAAA,IAAA;AAGtB,UAAM,cAAc,OAAO,OAAO,CAAA,GAAI,WAAW,EAAE;AAEnD,UAAM,UAAU,MAAM,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAEzE,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,kBAAkBF,SAAO,UAAU,CAAC;AAAA,QAC/C,OAAO;AAAA,QACP,IAAI,UAAU;AAAA,QACd,MAAK;AAAA,QACL,mBAAiB,QAAQ,UAAU,WAAW;AAAA,QAG7C,UAAA;AAAA,UAAA,SACG;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,UAAU;AAAA,cACd,SAAS;AAAA,cACT,WAAW,yBAAyB,UAAU,UAAU,EAAE;AAAA,cAEzD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,+BAIR,OAAA,EAAI,WAAW,2BAA2B,OAAO,eAAe,EAAE,IAC/D,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG;AAAA,gBACA,gBAAc,CAAC,CAAC;AAAA,gBAChB,oBACI,CAAC,WAAW,UAAU,cAAc,OAAM,mCAAS,UAAS,UAAU,eAAe,IAAI,EACpF,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBAEhB,GAAG;AAAA,gBACJ,IAAI;AAAA,gBACJ,UAAU,MAAM,YAAY;AAAA,gBAC5B,WAAW,mCAAmCA,SAAO,2BAA2B,CAAC,IAAI,UAAU,UAAU,EAAE,IAAI,MAAM,aAAa,EAAE;AAAA,gBAEnI,WAAC,QAAQ;AAAA,cAAA;AAAA,YAAA;AAAA,YAGb,4BACI,OAAA,EAAI,WAAW,0BACZ,UAAA,oBAAC,WAAA,EAAU,MAAM,GAAA,CAAI,EAAA,CACzB;AAAA,UAAA,GAER;AAAA,UAGC,YACG;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,UAAU;AAAA,cACd,WAAW;AAAA,cAEV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAKP,OAAO,YAAY,YAAY,WAC7B;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cAEX,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,IAAI,GAAG,OAAO;AAAA,kBACd,WAAW;AAAA,kBAEV,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACL;AAAA,UAAA;AAAA,UAGP,WAAW,QAAQ,SAAS,KACzB;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cAEV,iBAAO,YAAY,YAAY,QAAQ,IAAI,CAACG,QAAO,UAChD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,IAAI,GAAG,OAAO,cAAc,KAAK;AAAA,kBACjC,WAAW;AAAA,kBAEV,UAAAA;AAAA,gBAAA;AAAA,gBAJI;AAAA,cAAA,CAMZ;AAAA,YAAA;AAAA,UAAA;AAAA,QACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;ACrLA,MAAM,cAAc,MAAM,WAA4C,CAClE;AAAA,EACI;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAG,QACF;AACD,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACN,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA;AAGb,CAAC;AC6CD,MAAM,iBAAiB;AAAA,EACnB,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEP,QACC;AAED,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,OAAO,KAAK;AAAA,QACnB,MAAM,OAAO,SAAS;AAAA,QACtB;AAAA,QACA,SAAS,OAAO,YAAY,WAAW,CAAC,OAAO,IAAI;AAAA,QAClD,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACJ;;;;;;;;;;;ACuCA,MAAM,kBAAkB,CAAK;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAA2B;AACvB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAiB,gBAAgB,EAAE;AACvE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAc,CAAA,CAAE;AAClD,QAAM,mBAAmB,OAAA;AACzB,QAAM,CAAC,MAAM,OAAO,IAAI,SAAkB,KAAK;AAC/C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAA2B,QAAQ;AACnF,QAAM,eAAe,OAAuB,IAAI;AAChD,QAAM,cAAc,OAAuB,IAAI;AAC/C,QAAM,oBAAoB,OAA8B,IAAI;AAC5D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAkB,KAAK;AACzD,QAAM,CAACC,QAAO,QAAQ,IAAI,SAA+B,MAAS;AAGlE,YAAU,MAAM;AACZ,sBAAkB,UAAU,SAAS,cAAc,KAAK;AACxD,aAAS,KAAK,YAAY,kBAAkB,OAAO;AAEnD,WAAO,MAAM;AACT,YAAM,gBAAgB,kBAAkB;AACxC,UAAI,iBAAiB,cAAc,eAAe,SAAS,MAAM;AAC7D,iBAAS,KAAK,YAAY,aAAa;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ,GAAG,CAAA,CAAE;AAGL,QAAM,yBAAyB,YAAY,MAAM;AAC7C,QAAI,CAAC,aAAa,WAAW,CAAC,YAAY,WAAW,CAAC,kBAAkB,QAAS;AAEjF,UAAM,gBAAgB,aAAa,QAAQ,sBAAA;AAC3C,UAAM,aAAa,OAAO,eAAe,SAAS,gBAAgB;AAClE,UAAM,YAAY,OAAO,eAAe,SAAS,gBAAgB;AAEjE,UAAM,SAAS;AAEf,UAAM,MAAM,cAAc,MAAM,aAAa,qBAAqB,WAAW,cAAc,SAAS,SAAS,CAAC,YAAY,QAAQ,eAAe;AACjJ,UAAMK,QAAO,cAAc,OAAO;AAElC,WAAO,OAAO,kBAAkB,QAAQ,OAAO;AAAA,MAC3C,UAAU;AAAA,MACV,KAAK,GAAG,GAAG;AAAA,MACX,MAAM,GAAGA,KAAI;AAAA,MACb,OAAO,GAAG,cAAc,KAAK;AAAA,MAC7B,QAAQ;AAAA,IAAA,CACX;AAAA,EACL,GAAG,CAAC,gBAAgB,CAAC;AAGrB,YAAU,MAAM;AACZ,QAAI,gBAAgB;AAChB,6BAAA;AACA,aAAO,iBAAiB,UAAU,sBAAsB;AAAA,IAC5D;AAEA,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,sBAAsB;AAAA,IAC/D;AAAA,EACJ,GAAG,CAAC,gBAAgB,sBAAsB,CAAC;AAG3C,QAAM,qCAAqC,MAAM;AAC7C,QAAI,CAAC,aAAa,QAAS;AAE3B,UAAM,OAAO,aAAa,QAAQ,sBAAA;AAClC,UAAM,aAAa,OAAO,cAAc,KAAK;AAC7C,UAAM,aAAa,KAAK;AACxB,UAAM,iBAAiB;AAEvB,wBAAoB,cAAc,kBAAkB,cAAc,aAAa,WAAW,KAAK;AAAA,EACnG;AAGA,YAAU,MAAM;AACZ,QAAI,gBAAgB;AAChB,yCAAA;AACA,aAAO,iBAAiB,UAAU,kCAAkC;AAAA,IACxE;AAEA,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,kCAAkC;AAAA,IAC3E;AAAA,EACJ,GAAG,CAAC,cAAc,CAAC;AAGnB,QAAM,kBAAkB,CAAC,MAA2C;AAChE,UAAM,OAAO,EAAE,OAAO;AACtB,QAAI,UAAU;AACV,eAAS,CAAC;AAAA,IACd;AACA,kBAAc,IAAI;AAClB,sBAAkB,KAAK;AACvB,iBAAa,IAAI;AAEjB,QAAI,iBAAiB,QAAS,cAAa,iBAAiB,OAAO;AAEnE,QAAI,KAAK,KAAA,MAAW,IAAI;AACpB,uBAAiB,UAAU,WAAW,YAAY;AAC9C,YAAI;AACA,kBAAQ,IAAI;AACZ,gBAAM,SAAS,MAAM,aAAa,IAAI;AACtC,uBAAa,MAAM;AAEnB,cAAI,OAAO,WAAW,GAAG;AACrB,qBAAS,CAAC,qBAAqB,CAAC;AAChC,uBAAW,MAAM,SAAS,MAAS,GAAG,GAAI;AAAA,UAC9C,OAAO;AACH,8BAAkB,IAAI;AAAA,UAC1B;AAAA,QACJ,QAAQ;AACJ,mBAAS,CAAC,UAAU,CAAC;AACrB,qBAAW,MAAM,SAAS,MAAS,GAAG,GAAI;AAAA,QAC9C,UAAA;AACI,kBAAQ,KAAK;AACb,uBAAa,KAAK;AAAA,QACtB;AAAA,MACJ,GAAG,GAAG;AAAA,IACV,OAAO;AACH,sBAAgB,IAAI;AACpB,mBAAa,CAAA,CAAE;AACf,wBAAkB,KAAK;AACvB,mBAAa,KAAK;AAAA,IACtB;AAAA,EACJ;AAGA,QAAM,mBAAmB,MAAM;AAC3B,QAAIN,aAAY,YAAY,KAAM;AAElC,QAAI,gBAAgB;AAChB,wBAAkB,KAAK;AAAA,IAC3B,WAAW,UAAU,SAAS,GAAG;AAC7B,wBAAkB,IAAI;AAAA,IAC1B,WAAW,WAAW,KAAA,MAAW,IAAI;AACjC,yBAAmB,UAAU;AAAA,IACjC;AAAA,EACJ;AAGA,QAAM,kBAAkB,CAAC,QAAW;AAChC,oBAAgB,GAAG;AACnB,kBAAc,WAAW,GAAG,CAAC;AAC7B,sBAAkB,KAAK;AAAA,EAC3B;AAGA,YAAU,MAAM;AACZ,UAAM,qBAAqB,CAAC,UAAsB;AAC9C,UAAI,aAAa,WAAW,CAAC,aAAa,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9E,0BAAkB,KAAK;AAAA,MAC3B;AAAA,IACJ;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM;AACT,eAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAChE;AAAA,EACJ,GAAG,CAAA,CAAE;AAGL,QAAM,qBAAqB,CAAC,SAAiB;AACzC,QAAI,iBAAiB,QAAS,cAAa,iBAAiB,OAAO;AAEnE,QAAI,SAAS,IAAI;AACb,uBAAiB,UAAU,WAAW,YAAY;AAC9C,YAAI;AACA,kBAAQ,IAAI;AACZ,gBAAM,SAAS,MAAM,aAAa,IAAI;AACtC,uBAAa,MAAM;AAEnB,cAAI,OAAO,WAAW,GAAG;AACrB,qBAAS,CAAC,qBAAqB,CAAC;AAChC,uBAAW,MAAM,SAAS,MAAS,GAAG,GAAI;AAAA,UAC9C,OAAO;AACH,8BAAkB,IAAI;AAAA,UAC1B;AAAA,QACJ,QAAQ;AACJ,mBAAS,CAAC,UAAU,CAAC;AACrB,qBAAW,MAAM,SAAS,MAAS,GAAG,GAAI;AAAA,QAC9C,UAAA;AACI,kBAAQ,KAAK;AAAA,QACjB;AAAA,MACJ,GAAG,GAAI;AAAA,IACX,OAAO;AACH,mBAAa,CAAA,CAAE;AAAA,IACnB;AAAA,EACJ;AAEA,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,GAAGF,SAAO,oBAAoB,CAAC,IAAI,aAAa,EAAE;AAAA,MAC7D,OAAO;AAAA,MACP;AAAA,MACA,iBAAe;AAAA,MAEf,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAWA,SAAO,2BAA2B,GAC9C,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACG;AAAA,cACA,UAAU,YAAY;AAAA,cACtB,UAAUE,aAAY;AAAA,cACtB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAWF,SAAO,iCAAiC;AAAA,cACnD,OAAO;AAAA,cACP,UAAU;AAAA,cACV;AAAA,cACA,QAAQ,MAAM;AACV,2BAAW,MAAM;AACb,mDAAS,IAAI,MAAM,MAAM;AAAA,gBAC7B,GAAG,GAAG;AAAA,cACV;AAAA,cACA;AAAA,cACA,UAAU,OACJ,gBACA,YACI,wDACA;AAAA,cACV,SAAS,OAAO,YAAY,WAAW,CAAC,OAAO,IAAI,WAAWG;AAAA,YAAA;AAAA,UAAA;AAAA,UAEjE,CAAC,QAAQ,CAACD,aAAY,UAAU,SAAS,KACtC;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAWF,SAAO,iCAAiC;AAAA,cACnD,OAAO,EAAE,WAAW,QAAQ,SAAS,MAAA;AAAA,cACrC,SAAS;AAAA,cAET,8BAAC,YAAA,EAAW,WAAW,iBAAiB,OAAO,QAAQ,MAAM,GAAA,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QACrE,GAER;AAAA,QAEC,mBAAmB,UAAU,SAAS,KAAK,WAAW,KAAA,MAAW,OAAO,kBAAkB,WACvF;AAAA,UACI;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,KAAK;AAAA,cACL,WAAW,GAAGA,SAAO,8BAA8B,CAAC,IAAI,iBAAiBA,SAAO,SAAS,EAAE;AAAA,cAE1F,UAAA,UAAU,WAAW,KAAK,WAAW,WAAW,KAC7C,oBAAC,MAAA,EAAG,UAAA,gBAAA,CAAa,IACjB,UAAU,WAAW,KAAK,WAAW,KAAA,MAAW,MAAM,CAAC,OACvD,oBAAC,MAAA,EAAG,UAAA,oBAAA,CAAiB,IAErB,oBAAC,QAAG,WAAWA,SAAO,sCAAsC,GACvD,UAAA,UAAU,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,KAAK,8BAC7B,MAAA,EAAe,aAAa,MAAM,gBAAgB,GAAG,GACjD,qBAAW,GAAG,KADV,KAET,CACH,EAAA,CACL;AAAA,YAAA;AAAA,UAAA;AAAA,UAGR,kBAAkB;AAAA,QAAA;AAAA,MACtB;AAAA,IAAA;AAAA,EAAA;AAIhB;;;;ACrVA,MAAM,YAAY;AAAA,EACd,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,IACT;AAAA,IACA,GAAG;AAAA,EAAA,GAEP,QACC;AACD,UAAM,YAAiC;AAAA,MACnC,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,MACd,OAAO,YAAY,SAAS,SAAS;AAAA,MACrC,QAAQ,UAAU;AAAA,IAAA;AAEtB,UAAM,cAAc,EAAE,GAAG,WAAW,GAAG,GAAA;AACvC,UAAM,SAAS,MAAM,YAAY,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAE3E,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,kBAAkBA,SAAO,aAAa,CAAC,IAAI,aAAa,EAAE;AAAA,QACrE,OAAO;AAAA,QACP,MAAK;AAAA,QACL,IAAI,SAAS;AAAA,QACb,mBAAiB,QAAQ,SAAS,WAAW;AAAA,QAG5C,UAAA;AAAA,UAAA,SACG;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,SAAS;AAAA,cACb,SAAS;AAAA,cACT,WAAW,yBAAyB,UAAU,UAAU,EAAE;AAAA,cAEzD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,+BAKR,OAAA,EAAI,WAAW,2BAA2B,OAAO,eAAe,EAAE,IAC/D,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG;AAAA,gBACA,IAAI;AAAA,gBACJ,WAAW,mCAAmC,UAAU,UAAU,EAAE;AAAA,gBACpE,gBAAc,CAAC,CAAC;AAAA,gBAChB,oBACI,CAAC,WAAW,SAAS,cAAc,OAAM,mCAAS,UAAS,SAAS,eAAe,IAAI,EAClF,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBAEhB,GAAG;AAAA,gBACJ,UAAU,MAAM,YAAY;AAAA,gBAC5B,OAAO,EAAE,QAAQ,UAAU,OAAA;AAAA,cAAO;AAAA,YAAA;AAAA,YAErC,4BACI,QAAA,EAAK,WAAW,0BACb,UAAA,oBAAC,WAAA,EAAU,MAAM,GAAA,CAAI,EAAA,CACzB;AAAA,UAAA,GAER;AAAA,UAGC,YACG;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,SAAS;AAAA,cACb,WAAW;AAAA,cAEV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAKP,OAAO,YAAY,YAAY,WAC7B;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cAEX,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,IAAI,GAAG,MAAM;AAAA,kBACb,WAAW;AAAA,kBAEV,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACL;AAAA,UAAA;AAAA,UAGP,WAAW,QAAQ,SAAS,KACzB;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cAEV,iBAAO,YAAY,YAAY,QAAQ,IAAI,CAACG,QAAO,UAChD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,IAAI,GAAG,MAAM,cAAc,KAAK;AAAA,kBAChC,WAAW;AAAA,kBAEV,UAAAA;AAAA,gBAAA;AAAA,gBAJI;AAAA,cAAA,CAMZ;AAAA,YAAA;AAAA,UAAA;AAAA,QACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;AC3MA,SAAS,oBAA4B;AACjC,QAAM,YAAY,KAAK,IAAA;AACvB,QAAM,aAAa,KAAK,MAAM,KAAK,OAAA,IAAW,GAAS;AACvD,SAAO,GAAG,SAAS,GAAG,UAAU;AACpC;ACSA,MAAM,SAAsB,CACxB;AAAA,EACI,OAAAI;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAE,YAAW;AAAA,EACX,YAAAC,cAAa;AAAA,EACb,cAAc;AAAA,EACd;AACJ,MACC;AAED,QAAM,UAAU,OAAA;AAChB,QAAM,SAAS,OAAA;AACf,QAAM,QAAQ,OAAA;AAEd,QAAM,CAAC,QAAQ,IAAI,SAAiB,mBAAmB;AAEvD,MAAI,UAAU;AAEd,YAAU,MAAM;AAEZ,UAAMT,YAAW,SAAS,eAAe,0BAA0B,QAAQ,EAAE;AAE7E,QAAI,CAAC,MAAM;AACP,YAAM,KAAK,SAAS,cAAc,kBAAkB,QAAQ,EAAE;AAC9D,UAAI,OAAO,MAAM;AACb,cAAM,UAAU,WAAW,MAAM;AAC7B,cAAI,SAAS;AACT,oBAAQ,KAAK;AAAA,UACjB;AACA,aAAI,UAAU,OAAO,gBAAgB;AACrC,aAAI,UAAU,OAAO,iBAAiB;AAAA,QAC1C,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,YAAQ,UAAU,WAAW,MAAM;AAC/B,UAAI,MAAM;AACN,cAAM,KAAK,SAAS,cAAc,kBAAkB,QAAQ,EAAE;AAC9D,YAAI,OAAO,MAAM;AACb,aAAI,UAAU,IAAI,iBAAiB;AACnC,cAAIA,cAAa,MAAM;AACnB,YAAAA,UAAU,MAAM,QAAQ;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AACA,UAAI,YAAY,UAAa,QAAQ,YAAY,QAAW;AAExD,YAAI,UAAU,EAAG,WAAU;AAE3B,cAAM,KAAK,SAAS,cAAc,kBAAkB,QAAQ,EAAE;AAE9D,YAAI,OAAO,MAAM;AACb,UAAAA,UAAU,MAAM,aAAa,GAAG,OAAO;AAEvC,iBAAO,UAAU,WAAW,MAAM;AAC9B,eAAI,UAAU,OAAO,iBAAiB;AACtC,eAAI,UAAU,IAAI,gBAAgB;AAAA,UACtC,IAAI,UAAU,KAAK,GAAI;AAEvB,gBAAM,UAAU,WAAW,MAAM;AAC7B,oBAAQ,KAAK;AACb,eAAI,UAAU,OAAO,gBAAgB;AACrC,eAAI,UAAU,OAAO,iBAAiB;AAAA,UAC1C,GAAG,UAAU,GAAI;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,aAAa,MAAmB;AAClC,QAAI,MAAmB,qBAAA,UAAA,EACnB,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,MACN;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAkP,GAC5P;AAEA,YAAQ,SAAA;AAAA,MACJ,KAAK;AACD,cAAM,qBAAA,UAAA,EACF,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,GAAE;AAAA,YAAA;AAAA,UAAA;AAAA,UACN;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,GAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAkP,GAC5P;AACA;AAAA,MACJ,KAAK;AACD,cAAM,qBAAA,UAAA,EACF,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,GAAE;AAAA,YAAA;AAAA,UAAA;AAAA,UACN;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,GAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAA2J,GACrK;AACA;AAAA,MACJ,KAAK;AACD,cAAM,qBAAA,UAAA,EACF,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,GAAE;AAAA,YAAA;AAAA,UAAA;AAAA,UACN;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,GAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAkM,GAC5M;AACA;AAAA,MACJ,KAAK;AACD,cAAM,qBAAA,UAAA,EACF,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,GAAE;AAAA,YAAA;AAAA,UAAA;AAAA,UACN;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,GAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAmH,GAC7H;AACA;AAAA,IAAA;AAER,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,MAAM;AAE1B,UAAM,gBAIF,CAAA;AAEJ,UAAM,kBAIF,CAAA;AAEJ,YAAQQ,WAAA;AAAA,MACJ,KAAK;AACD,sBAAc,MAAM;AACpB;AAAA,MACJ,KAAK;AACD,sBAAc,SAAS;AACvB;AAAA,MACJ,KAAK;AACD,YAAIA,cAAa,YAAYC,gBAAe,UAAU;AAClD,wBAAc,YAAY;AAAA,QAC9B;AACA,sBAAc,MAAM;AACpB;AAAA,IAAA;AAGR,YAAQA,aAAA;AAAA,MACJ,KAAK;AACD,wBAAgB,OAAO;AACvB;AAAA,MACJ,KAAK;AACD,wBAAgB,QAAQ;AACxB;AAAA,MACJ,KAAK;AACD,YAAID,cAAa,YAAYC,gBAAe,UAAU;AAClD,0BAAgB,YAAY;AAAA,QAChC,OAAO;AACH,0BAAgB,YAAY;AAAA,QAChC;AACA,wBAAgB,OAAO;AACvB;AAAA,IAAA;AAIR,WAAO,OAAO,OAAO,IAAI,iBAAiB,aAAa;AAAA,EAC3D;AAEA,SACI,oBAACC,YAAA,EACI,UAAA,4BACI,OAAA,EAAI,WAAU,iBAAgB,IAAI,iBAAiB,QAAQ,IACxD,UAAA,oBAAC,OAAA,EAAI,WAAU,qBAAoB,OAAO,mBACtC,UAAA,qBAAC,OAAA,EAAI,WAAU,WACX,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAW,eAAe,OAAO,IAClC,UAAA,oBAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAC/B,UAAA,cACL,GACJ;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAI,WAAU;AAAA,QACX,OAAO,EAAE,OAAO,SAAS,SAAY,GAAG,IAAI,KAAK,cAAA;AAAA,QACjD,UAAA;AAAA,UAAA,qBAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,YAAA,oBAAC,MAAA,EAAI,UAAAJ,WAAU,SAAYA,SAAQ,IAAG;AAAA,YACpC,eAAe,WACb;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,MAAM;AAAA,gBACN,IAAI;AAAA,kBACA,QAAQ;AAAA,gBAAA;AAAA,gBAEZ,aAAa,MAAM;AACf,wBAAM,KAAK,SAAS,cAAc,kBAAkB,QAAQ,EAAE;AAC9D,qBAAI,UAAU,OAAO,iBAAiB;AACtC,qBAAI,UAAU,IAAI,gBAAgB;AAClC,0BAAQ,KAAK;AACb,qBAAI,UAAU,OAAO,iBAAiB;AACtC,qBAAI,UAAU,OAAO,gBAAgB;AACrC,+BAAa,QAAQ,OAAO;AAC5B,+BAAa,OAAO,OAAO;AAC3B,+BAAa,MAAM,OAAO;AAAA,gBAC9B;AAAA,cAAA;AAAA,YAAA;AAAA,UAAG,GAEf;AAAA,8BACC,OAAA,EAAI,WAAU,gBACX,UAAA,oBAAC,QAAA,EAAO,WAAW,UAAU,SAAS,GACjC,UAAA,SAAS,UACN,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,KAAK,UAAU;AACjC,mBACI,oBAAC,QAAA,EAAkB,UAAA,IAAA,GAAR,KAAY;AAAA,UAE/B,CAAC,GAET,EAAA,CACJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,YAAY,UAAa,UAAU,KAChC,oBAAC,OAAA,EAAI,WAAW,oBACZ,UAAA,oBAAC,OAAA,EAAI,WAAU,wBACX,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAAI,WAAW,0BAA0B,OAAO;AAAA,QAC7C,IAAI,0BAA0B,QAAQ;AAAA,MAAA;AAAA,IAAA,GAC9C,EAAA,CACJ;AAAA,EAAA,GAER,EAAA,CACJ,GACJ,GAER;AAER;AC3OA,MAAM,UAAwB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAL;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,QAAQ;AAAA,EACR;AACJ,MAAM;AAEF,QAAM,qBAAqB,CAAC,UAAgD;AACxE,QAAI,cAAc;AACd,YAAM,IAAI,CAAA;AACV,QAAE,KAAK,MAAM,OAAO,KAAK;AACzB,mBAAa,CAAC;AAAA,IAClB;AAAA,EACJ;AAEA,QAAM,wBAAwB,CAAC,UAAgD;AAC3E,UAAM,EAAE,YAAY,MAAM;AAC1B,UAAMU,SAAkB,CAAA;AACxB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAAI,GAAG,KAAK,GAAG;AAC/C,UAAI,QAAQ,CAAC,EAAE,UAAU;AACrBA,eAAM,KAAK,QAAQ,CAAC,EAAE,KAAK;AAAA,MAC/B;AAAA,IACJ;AACA,QAAI,gBAAgB;AAChB,qBAAeA,MAAK;AAAA,IACxB;AAAA,EACJ;AAEA,MAAI,WAAW;AACX,QAAI,OAAO,QAAW;AAClB,WAAK;AAAA,QACD,OAAO;AAAA,MAAA;AAAA,IAEf,OAAO;AACH,SAAG,QAAQ;AAAA,IACf;AAAA,EACJ;AAEA,SACI,qBAAC,OAAA,EAAI,WAAW,iBAAiB,cAAc,SAAY,YAAY,EAAE,IAAI,OAAO,IAAI,IACpF,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAM,WAAW,kBAAmB,UAAA,OAAM;AAAA,IAC3C;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,UACH,WAAW,YAAY,SAAS;AAAA,UAChC;AAAA,QAAA;AAAA,QAEJ;AAAA,QACA,UAAAV;AAAA,QAEA;AAAA,QACA,UAAU;AAAA,QACV,WAAW;AAAA,QACX,UAAU,CAAC,UAAU;AACjB,cAAI,cAAc;AACd,+BAAmB,KAAK;AAAA,UAC5B,WAAW,gBAAgB;AACvB,kCAAsB,KAAK;AAAA,UAC/B;AAAA,QACJ;AAAA,QACC;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACJ;AAGR;;;;;;;;;;;ACvCA,MAAM,QAAoB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAClB,MAAM;AACF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,WAAW,GAAGF,SAAO,QAAQ,CAAC,IAAIA,SAAO,WAAW,CAAC,IAAI,aAAa,EAAE;AAAA,MAEvE;AAAA,IAAA;AAAA,EAAA;AAGb;ACCA,MAAM,OAAO,WAAqC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,QAAAa;AAAA,EACA,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,GAAGb,SAAO,aAAa,CAAC,IAAIa,UAASb,SAAO,QAAQ,IAAI,EAAE,IAAI,MAAM,aAAa,EAAE;AAAA,MAC7F,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA;AAGb,CAAC;AAED,KAAK,cAAc;;;;;;;;;;ACGnB,MAAM,YAAY,WAAuC,CAAC;AAAA,EACtD;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAAE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAG,iBAAiB;AAChB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,cAAc,OAAuB,IAAI;AAG/C,QAAM,MAAM,gBAAgB;AAG5B,YAAU,MAAM;AACZ,QAAI,CAAC,OAAQ;AACb,UAAM,cAAc,CAAC,MAAkB;AACnC,YAAM,aAAa,OAAO,QAAQ,aAAa,OAAO,2BAAK;AAC3D,UAAI,cAAc,CAAC,WAAW,SAAS,EAAE,MAAc,GAAG;AACtD,kBAAU,KAAK;AAAA,MACnB;AAAA,IACJ;AACA,aAAS,iBAAiB,aAAa,WAAW;AAClD,WAAO,MAAM,SAAS,oBAAoB,aAAa,WAAW;AAAA,EACtE,GAAG,CAAC,QAAQ,GAAG,CAAC;AAGhB,QAAM,kBAAkB,CAAC,UAA8B,CAAC,MAAwB;AAC5E,QAAI,MAAM,SAAS,OAAO,MAAM,MAAM,YAAY,YAAY;AAC1D,YAAM,MAAM,QAAQ,CAAC;AAAA,IACzB;AACA,cAAU,KAAK;AAAA,EACnB;AAGA,QAAM,iBAAiB,MAAM;AACzB,WAAO,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU;AAC3C,UACI,eAAe,KAAK,KACpB,MAAM,QACL,MAAM,KAA6B,gBAAgB,iBACtD;AACE,eAAO,aAAa,OAA6B;AAAA,UAC7C,SAAS,gBAAgB,KAA2B;AAAA,QAAA,CACvD;AAAA,MACL;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,SACI,qBAAC,SAAI,WAAWF,SAAO,YAAY,GAAG,KAAW,GAAG,OAChD,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAAE;AAAA,QACA;AAAA,QACA,WAAW,GAAGF,SAAO,oBAAoB,CAAC,IAAI,aAAa,EAAE;AAAA,QAC7D;AAAA,QACA,SAAS,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AAAA,QAClC,iBAAc;AAAA,QACd,iBAAe;AAAA,QAEf,UAAA,qBAAC,UAAO,WAAU,OAAM,SAAS,GAAG,gBAAe,UAAS,YAAW,UAClE,UAAA;AAAA,UAAA;AAAA,UACD,oBAAC,YAAA,EAAW,WAAWA,SAAO,mBAAmB,GAAG,MAAM,IAAI,OAAO,SAAS,WAAW,SAAS,OAAO,OAAA,CAAQ;AAAA,QAAA,EAAA,CACrH;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WACIA,SAAO,qBAAqB,KAC3B,SAAS,MAAMA,SAAO,2BAA2B,IAAI;AAAA,QAE1D,MAAK;AAAA,QAEJ,UAAA,eAAA;AAAA,MAAe;AAAA,IAAA;AAAA,EACpB,GACJ;AAER,CAAC;AAGD,UAAU,cAAc;ACxHxB,MAAM,gBAAoC,CAAC;AAAA,EACvC,UAAAE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,WAAW,GAAGF,SAAO,0BAA0B,CAAC,IAAI,aAAa,EAAE,IAAIE,YAAWF,SAAO,UAAU,IAAI,EAAE;AAAA,MACzG,SAASE,YAAW,SAAY;AAAA,MAChC,iBAAeA;AAAA,MACf,MAAK;AAAA,MAEJ;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;;;ACiFA,MAAM,aAAa;AAAA,EACf,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA,UAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEP,QACC;AAED,WACI,qBAAC,SAAI,WAAW,GAAGF,SAAO,cAAc,CAAC,eAAe,OAAO,IAC3D,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAAE;AAAA,UACA,UAAU,YAAY;AAAA,UACtB,MAAM,QAAQ;AAAA,UACd;AAAA,UACA,SAAS,OAAO,YAAY,WAAW,CAAC,OAAO,IAAI;AAAA,UACnD;AAAA,UACC,GAAG;AAAA,UACJ,WAAW,GAAGF,SAAO,qBAAqB,CAAC,IAAI,MAAM,aAAa,EAAE;AAAA,QAAA;AAAA,MAAA;AAAA,MAExE,qBAAC,OAAA,EAAI,WAAWA,SAAO,sBAAsB,GAAG,OAAO,EAAE,WAAW,QAAQ,WAAW,IAAA,GACnF,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAW,GAAGA,SAAO,6BAA6B,CAAC,IAAI,qBAAqBA,SAAO,UAAU,IAAI,EAAE;AAAA,YACnG,MAAM;AAAA,YACN,UAAAE;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YAEC;AAAA,UAAA;AAAA,QAAA;AAAA,QAEJ,sBACG;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAW,GAAGF,SAAO,4BAA4B,CAAC;AAAA,YAClD,MAAM;AAAA,YACN,UAAAE;AAAA,YACA,SAAS;AAAA,YACT,OAAO;AAAA,YACP;AAAA,YAEA,UAAA,oBAAC,YAAA,EAAW,OAAO,SAAS,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1C,EAAA,CAER;AAAA,IAAA,GACJ;AAAA,EAER;AACJ;;;;;;;;;;;;;;;ACnOA,MAAA,YAAe;ACAf,MAAA,aAAe;ACiFf,MAAM,YAA4B,CAAC;AAAA,EACjC;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,OAAO;AAAA,EACP,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB;AACF,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,CAAC;AACxC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,aAAa,SAAS;AAC5B,QAAM,WAAW,OAAuB,IAAI;AAC5C,QAAM,cAAc,OAA8B,IAAI;AAGtD,YAAU,MAAM;AACd,QAAI,UAAU;AACZ,kBAAY,UAAU,YAAY,MAAM;AACtC,uBAAe,IAAI;AACnB,mBAAW,CAAC,SAAS;AACnB,cAAI,QAAQ,aAAa,aAAc,QAAO,OAAO,IAAI;AACzD,iBAAO,OAAO;AAAA,QAChB,CAAC;AAAA,MACH,GAAG,gBAAgB;AAEnB,aAAO,MAAM;AACX,YAAI,YAAY,QAAS,eAAc,YAAY,OAAO;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,kBAAkB,YAAY,YAAY,CAAC;AAGzD,YAAU,MAAM;AACd,QAAI,aAAa;AACf,YAAM,UAAU,WAAW,MAAM,eAAe,KAAK,GAAG,GAAG;AAC3D,aAAO,MAAM,aAAa,OAAO;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAGhB,YAAU,MAAM;AACd,eAAW,CAAC;AAAA,EACd,GAAG,CAAC,YAAY,YAAY,CAAC;AAG7B,QAAM,aAAa,MAAM;AACvB,QAAI,YAAa;AACjB,mBAAe,IAAI;AACnB;AAAA,MAAW,CAAC,SACV,SAAS,IACL,OAAO,aAAa,eAAe,IACnC,OAAO;AAAA,IAAA;AAAA,EAEf;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,YAAa;AACjB,mBAAe,IAAI;AACnB;AAAA,MAAW,CAAC,SACV,QAAQ,aAAa,eACjB,OAAO,IAAI,OACX,OAAO;AAAA,IAAA;AAAA,EAEf;AAGA,QAAM,SAAS,OAAsB,IAAI;AAEzC,QAAM,mBAAmB,CAAC,MAAwB;AAChD,WAAO,UAAU,EAAE,QAAQ,CAAC,EAAE;AAAA,EAChC;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAC/C,QAAI,OAAO,YAAY,KAAM;AAC7B,UAAM,OAAO,OAAO,UAAU,EAAE,QAAQ,CAAC,EAAE;AAC3C,QAAI,KAAK,IAAI,IAAI,IAAI,IAAI;AACvB,UAAI,OAAO,EAAG,YAAA;AAAA,UACT,YAAA;AACL,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,WAAO,UAAU;AAAA,EACnB;AAGA,QAAM,YAAY,CAACF,SAAO,YAAY,GAAG,SAAS,EAC/C,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,aAAa;AAAA,IACjBA,SAAO,mBAAmB;AAAA,IAC1B,cAAcA,SAAO,8BAA8B,IAAI;AAAA,EAAA,EAEtD,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,aAAa;AAAA,IACjB,WAAW,eAAgB,MAAM,aAAc,OAAO;AAAA,IACtD,YAAY,cAAc,2CAA2C;AAAA,IACrE,OAAO,GAAI,MAAM,aAAc,YAAY;AAAA,EAAA;AAG7C,SACE,qBAAC,OAAA,EAAI,WAAW,WACb,UAAA;AAAA,IAAA,cACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGA,SAAO,mBAAmB,CAAC,IAAIA,SAAO,yBAAyB,CAAC;AAAA,QAC9E,SAAS;AAAA,QACT,UAAU,CAAC,QAAQ,YAAY;AAAA,QAC/B,cAAW;AAAA,QAEX,UAAA,oBAAC,OAAA,EAAI,KAAK,WAAW,KAAI,mBAAA,CAAmB;AAAA,MAAA;AAAA,IAAA;AAAA,IAIhD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWA,SAAO,sBAAsB;AAAA,QACxC,cAAc;AAAA,QACd,aAAa;AAAA,QACb,YAAY;AAAA,QAEZ,UAAA,oBAAC,OAAA,EAAI,KAAK,UAAU,WAAW,YAAY,OAAO,YAC/C,UAAA,SAAS,IAAI,CAAC,OAAO,QACpB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAWA,SAAO,kBAAkB;AAAA,YACpC,OAAO,EAAE,OAAO,GAAG,MAAM,UAAU,IAAA;AAAA,YAElC,UAAA;AAAA,UAAA;AAAA,UAJI;AAAA,QAAA,CAMR,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,IAGD,cACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGA,SAAO,mBAAmB,CAAC,IAAIA,SAAO,0BAA0B,CAAC;AAAA,QAC/E,SAAS;AAAA,QACT,UAAU,CAAC,QAAQ,WAAW,aAAa;AAAA,QAC3C,cAAW;AAAA,QAEX,UAAA,oBAAC,OAAA,EAAI,KAAK,YAAY,KAAI,kBAAA,CAAkB;AAAA,MAAA;AAAA,IAAA;AAAA,wBAI/C,OAAA,EAAI,WAAWA,SAAO,wBAAwB,GAC5C,gBAAM,KAAK,EAAE,QAAQ,aAAa,eAAe,EAAA,CAAG,EAAE,IAAI,CAAC,GAAG,QAC7D;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW;AAAA,UACTA,SAAO,uBAAuB;AAAA,UAC9B,QAAQ,UAAUA,SAAO,+BAA+B,IAAI;AAAA,QAAA,EAC5D,KAAK,GAAG;AAAA,QACV,SAAS,MAAM,WAAW,GAAG;AAAA,QAC7B,cAAY,oBAAoB,MAAM,CAAC;AAAA,MAAA;AAAA,MANlC;AAAA,IAAA,CAQR,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AC3MA,MAAM,gBAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,oBAAC,OAAA,EAAI,WAAW,GAAGA,SAAO,iBAAiB,CAAC,IAAI,aAAa,EAAE,IAAI,IAChE,SAAA,CACH;AAEJ;;;;;;ACLA,MAAM,YAA4B,CAAC,EAAE,UAAU,QAAQ,OAAO,aAAa;AACvE,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,mBAAmB,OAAsB,EAAE;AACjD,QAAM,YAAY,OAAsB,EAAE;AAG1C,QAAM,iBAAiB,CAAC,YAAqC;AACzD,UAAMc,YAAW,SAAS,cAAc,KAAK;AAC7C,IAAAA,UAAS,YAAYd,SAAO;AAE5B,UAAM,gBAAgB,OAAO,iBAAiB,OAAO;AAErD,IAAAc,UAAS,MAAM,QAAQ,SAAS,cAAc;AAC9C,IAAAA,UAAS,MAAM,SAAS,UAAU,cAAc;AAChD,IAAAA,UAAS,MAAM,eAAe,cAAc,iBAAiB,QAAQ,SAAS,cAAc;AAC5F,IAAAA,UAAS,MAAM,SAAS,cAAc;AACtC,IAAAA,UAAS,MAAM,UAAU,cAAc,WAAW;AAClD,IAAAA,UAAS,MAAM,WAAW,cAAc,YAAY;AAEpD,WAAOA;AAAA,EACX;AAGA,QAAM,uBAAuB,MAAM;AAC/B,UAAMC,aAAY,WAAW;AAC7B,QAAI,CAACA,WAAW;AAEhB,UAAM,gBAAgB,MAAM,KAAKA,WAAU,QAAQ;AAEnD,qBAAiB,UAAU,CAAA;AAC3B,cAAU,UAAU,CAAA;AAEpB,kBAAc,QAAQ,CAAC,UAAU;AAC7B,YAAMD,YAAW,eAAe,KAAK;AACrC,uBAAiB,QAAQ,KAAK,KAAK;AACnC,gBAAU,QAAQ,KAAKA,SAAQ;AAE/B,UAAI,MAAM,YAAY;AAClB,cAAM,WAAW,aAAaA,WAAU,KAAK;AAAA,MACjD;AAAA,IACJ,CAAC;AAAA,EACL;AAGA,QAAM,0BAA0B,MAAM;AAClC,UAAMC,aAAY,WAAW;AAC7B,QAAI,CAACA,WAAW;AAEhB,qBAAiB,QAAQ,QAAQ,CAAC,UAAU,UAAU;AAClD,YAAMD,YAAW,UAAU,QAAQ,KAAK;AACxC,UAAIA,aAAY,YAAYA,UAAS,YAAY;AAC7C,QAAAA,UAAS,WAAW,aAAa,UAAUA,SAAQ;AAAA,MACvD;AAAA,IACJ,CAAC;AAED,cAAU,UAAU,CAAA;AACpB,qBAAiB,UAAU,CAAA;AAAA,EAC/B;AAGA,YAAU,MAAM;AACZ,QAAI,QAAQ;AACR,2BAAA;AAAA,IACJ,OAAO;AACH,8BAAA;AAAA,IACJ;AAEA,WAAO,MAAM;AACT,8BAAA;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAEX,SACI,oBAAC,SAAI,KAAK,YAAY,WAAWd,SAAO,gBAAgB,GACnD,UACL;AAER;;;;;;;;ACjEA,MAAM,eAAkC,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,SACI,oBAAC,OAAA,EAAM,KAAK,aAAa,IAAQ,WAC7B,UAAA,oBAAC,UAAA,EACG,UAAA,oBAAC,OAAA,EAAM,KAAI,QAAO,IAAI,IAClB,UAAA,oBAAC,OAAA,EAAI,OAAO,IAAI,WAAWA,SAAO,WAAW,GACzC,8BAAC,MAAA,EAAG,WAAWA,SAAO,iBAAiB,GAClC,SAAA,CACL,GACJ,EAAA,CACJ,GACJ,GACJ;AAER;AClBA,MAAM,mBAA0C,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,WAAW,GAAGA,SAAO,uBAAuB,CAAC,IAAI,cAAcA,SAAO,SAAS,EAAE,IAAI,aAAa,EAAE;AAAA,MAEnG;AAAA,IAAA;AAAA,EAAA;AAGb;;;;;;;;;ACfA,MAAM,kBAA6C,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AACd,MAAM;AAEF,QAAM,QAAQ,OAAO,SAAY,EAAE,GAAG,IAAI,QAAA,IAAY,EAAE,QAAA;AAExD,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,GAAGA,SAAO,iBAAiB,CAAC,IAAI,aAAa,EAAE,GAAG,KAAA;AAAA,MAC7D;AAAA,MACA;AAAA,MAEC;AAAA,IAAA;AAAA,EAAA;AAGb;AC7BA,MAAM,aAAmC,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAE,YAAW,CAAA;AAAA,EACX,OAAAK;AACJ,MAAM;AACF,QAAM,mBAAmB,MAAM,SAAS,IAAI,UAAU,CAAC,OAAO,UAAU;AACpE,QAAI,CAAC,MAAM,eAAe,KAAK,EAAG,QAAO;AAEzC,UAAM,aAAaL,UAAS,SAAS,KAAK;AAC1C,UAAM,aAAa;AAAA,MACf,MAAM,MAAM;AAAA,MACZF,SAAO;AAAA,MACP,cAAcA,SAAO;AAAA,IAAA,EAEpB,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,WAAO,MAAM,aAAa,OAAkC;AAAA,MACxD,WAAW;AAAA,MACX,GAAI,cAAc,EAAE,SAAS,CAAC,MAAwB,EAAE,iBAAe;AAAA,IAAE,CAC5E;AAAA,EACL,CAAC;AAED,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,GAAGA,SAAO,sBAAsB,CAAC,IAAI,aAAa,EAAE,GAAG,KAAA;AAAA,MAClE,OAAO;AAAA,MACP;AAAA,MAEC,UAAA;AAAA,QAAAO,8BAAU,OAAA,EAAI,WAAWP,SAAO,6BAA6B,GAAI,UAAAO,QAAM;AAAA,4BACvE,OAAA,EAAI,WAAWP,SAAO,6BAA6B,GAAI,UAAA,iBAAA,CAAiB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGrF;;;;;;;;;;;;;;AC6BA,MAAM,WAAoC,CAAC;AAAA,EACvC,OAAAO;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,OAAAS,SAAQ;AAAA,EACR,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ;AAAA,EACA,yBAAyB;AAC7B,MAAM;AAEF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAGtC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AAGtD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAGhD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAGhD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,CAAA,CAAE;AAGpE,QAAM,WAAW,OAAoB,IAAI;AAGzC,QAAM,aAAa,OAAuB,IAAI;AAG9C,QAAM,aAAa,OAA8B,IAAI;AACrD,QAAM,aAAa,OAA8B,IAAI;AACrD,QAAM,iBAAiB,OAAsB,IAAI;AAGjD,QAAM,SAAS,aAAa,SAAY,WAAW;AAGnD,QAAM,aAAa,MAAM;AACrB,QAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AACvD,QAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AAEvD,eAAW,UAAU,WAAW,MAAM;AAClC,UAAI,aAAa,QAAW;AACxB,gBAAQ,IAAI;AAAA,MAChB;AACA,sBAAgB,IAAI;AACpB,mBAAa,KAAK;AAElB,UAAI,eAAe,SAAS;AACxB,6BAAqB,eAAe,OAAO;AAAA,MAC/C;AAEA,qBAAe,UAAU,sBAAsB,MAAM;AACjD,qBAAa,IAAI;AACjB;AACA,uBAAA;AAAA,MACJ,CAAC;AAAA,IACL,GAAG,UAAU;AAAA,EACjB;AAGA,QAAM,cAAc,MAAM;AACtB,QAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AACvD,QAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AAEvD,QAAI,UAAU,WAAW;AACrB,UAAI,aAAa,QAAW;AACxB,gBAAQ,KAAK;AAAA,MACjB;AAEA,mBAAa,KAAK;AAClB,mBAAa,IAAI;AAEjB,YAAM,cAAc,WAAW;AAC/B,UAAI,aAAa;AACb,cAAM,sBAAsB,CAAC,UAA2B;AACpD,cAAI,MAAM,iBAAiB,WAAW;AAClC,yBAAa,KAAK;AAClB,4BAAgB,KAAK;AACrB;AACA,wBAAY,oBAAoB,iBAAiB,mBAAmB;AAAA,UACxE;AAAA,QACJ;AACA,oBAAY,iBAAiB,iBAAiB,mBAAmB;AAAA,MACrE,OAAO;AACH,qBAAa,KAAK;AAClB,wBAAgB,KAAK;AACrB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,iBAAiB,YAAY,MAAM;AACrC,QAAI,CAAC,SAAS,WAAW,CAAC,WAAW,QAAS;AAE9C,UAAM,YAAY,SAAS,QAAQ,sBAAA;AACnC,UAAM,cAAc,WAAW,QAAQ,sBAAA;AACvC,UAAM,UAAU,OAAO;AACvB,UAAM,UAAU,OAAO;AAEvB,QAAI,MAAM;AACV,QAAIR,QAAO;AAEX,YAAQ,WAAA;AAAA,MACJ,KAAK;AACD,cAAM,UAAU,MAAM,UAAU,YAAY,UAAUQ,SAAQ,IAAI;AAClE,QAAAR,QAAO,UAAU,OAAO,WAAW,UAAU,QAAQ,YAAY,SAAS;AAC1E;AAAA,MACJ,KAAK;AACD,cAAM,UAAU,SAAS,WAAWQ,SAAQ,IAAI;AAChD,QAAAR,QAAO,UAAU,OAAO,WAAW,UAAU,QAAQ,YAAY,SAAS;AAC1E;AAAA,MACJ,KAAK;AACD,cAAM,UAAU,MAAM,WAAW,UAAU,SAAS,YAAY,UAAU;AAC1E,QAAAA,QAAO,UAAU,OAAO,UAAU,YAAY,SAASQ,SAAQ,IAAI;AACnE;AAAA,MACJ,KAAK;AACD,cAAM,UAAU,MAAM,WAAW,UAAU,SAAS,YAAY,UAAU;AAC1E,QAAAR,QAAO,UAAU,QAAQ,WAAWQ,SAAQ,IAAI;AAChD;AAAA,IAAA;AAGR,qBAAiB,EAAE,KAAK,GAAG,GAAG,MAAM,MAAM,GAAGR,KAAI,KAAA,CAAM;AAAA,EAC3D,GAAG,CAAC,WAAWQ,MAAK,CAAC;AAGrB,YAAU,MAAM;AACZ,QAAI,WAAW;AACX,qBAAA;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,WAAW,cAAc,CAAC;AAG9B,YAAU,MAAM;AACZ,UAAM,eAAe,MAAM;AACvB,UAAI,UAAW,gBAAA;AAAA,IACnB;AAEA,WAAO,iBAAiB,UAAU,YAAY;AAG9C,UAAM,oBAAoB,WAAW;AACrC,UAAM,oBAAoB,WAAW;AACrC,UAAM,wBAAwB,eAAe;AAE7C,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,YAAY;AACjD,UAAI,gCAAgC,iBAAiB;AACrD,UAAI,gCAAgC,iBAAiB;AACrD,UAAI,4CAA4C,qBAAqB;AAAA,IACzE;AAAA,EACJ,GAAG,CAAC,WAAW,cAAc,CAAC;AAG9B,QAAM,aAAgG;AAAA,IAClG,KAAK;AAAA,EAAA;AAGT,MAAI,CAAC,sBAAsB;AACvB,eAAW,eAAe,CAAC,MAAwB;;AAC/C,iBAAA;AACC,2BAAS,OAA+D,iBAAxE,4BAAuF;AAAA,IAC5F;AACA,eAAW,eAAe,CAAC,MAAwB;;AAC/C,kBAAA;AACC,2BAAS,OAA+D,iBAAxE,4BAAuF;AAAA,IAC5F;AAAA,EACJ;AAEA,MAAI,CAAC,sBAAsB;AACvB,eAAW,UAAU,CAAC,MAAwB;;AAC1C,iBAAA;AACC,2BAAS,OAA+D,YAAxE,4BAAkF;AAAA,IACvF;AACA,eAAW,SAAS,CAAC,MAAwB;;AACzC,kBAAA;AACC,2BAAS,OAA+D,WAAxE,4BAAiF;AAAA,IACtF;AAAA,EACJ;AAEA,MAAI,CAAC,sBAAsB;AACvB,eAAW,eAAe,CAAC,MAAwB;;AAC/C,iBAAA;AACC,2BAAS,OAA+D,iBAAxE,4BAAuF;AAAA,IAC5F;AACA,eAAW,aAAa,CAAC,MAAwB;;AAC7C,kBAAA;AACC,2BAAS,OAA+D,eAAxE,4BAAqF;AAAA,IAC1F;AAAA,EACJ;AAGA,MAAI;AACJ,QAAM,kBAAkB,SAAS;AAEjC,MACI,0BACA,MAAM,eAAe,QAAQ,MAC5B,gBAAgB,YAAY,gBAAgB,eAAe,IAC9D;AACE,mBACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAK;AAAA,QACJ,GAAI;AAAA,QACL,OAAO,EAAE,SAAS,gBAAgB,QAAQ,cAAA;AAAA,QAEzC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb,OAAO;AACH,mBAAe,aAAa,UAAU,UAAqC;AAAA,EAC/E;AAGA,QAAM,iBAAiB;AAAA,IACnBhB,SAAO,WAAW;AAAA,IAClBA,SAAO,cAAc,SAAS,EAAE;AAAA,IAChCgB,SAAQhB,SAAO,uBAAuB,IAAI;AAAA,IAC1C,YAAYA,SAAO,iBAAiB,IAAI;AAAA,IACxC,YAAYA,SAAO,oBAAoB,IAAI;AAAA,IAC3C;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAGb,QAAM,iBACF,gBAAgBO,SACZ;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW;AAAA,MACX,OAAO,EAAE,GAAG,OAAO,GAAG,cAAA;AAAA,MACtB,MAAK;AAAA,MAEJ,UAAA;AAAA,QAAAS,UAAS,oBAAC,OAAA,EAAI,WAAWhB,SAAO,kBAAkB,GAAG;AAAA,4BACrD,OAAA,EAAI,WAAWA,SAAO,oBAAoB,GAAI,UAAAO,OAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAEzD;AAER,SACI,qBAAA,UAAA,EACK,UAAA;AAAA,IAAA;AAAA,IACA,kBAAkB,aAAa,gBAAgB,SAAS,IAAI;AAAA,EAAA,GACjE;AAER;;;;;;;;;;;;;;;;;;;;AChWA,MAAM,cAAc,CAAC,EAAE,UAAA,MACnB,oBAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,WAAsB,UAAA,oBAAC,YAAA,EAAS,QAAO,iBAAA,CAAiB,EAAA,CAAW;AAEtN,MAAM,YAAY,MACd,qBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAA,CAAK;AAAA,EAAO,oBAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,GAAO;AAEzO,MAAM,WAAW,MACb,qBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,EAAO,oBAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,GAAO;AAiG3O,MAAM,kBAAkB,CAAC,EAAE,MAAM,gBAAqD;AAClF,MAAI,CAAC,UAAU,OAAQ,QAAO,oBAAC,UAAM,UAAA,MAAK;AAC1C,QAAM,eAAe,CAAC,QAAgB,IAAI,QAAQ,uBAAuB,MAAM;AAC/E,QAAM,QAAQ,IAAI,OAAO,IAAI,aAAa,SAAS,CAAC,KAAK,IAAI;AAC7D,QAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,SACI,oBAAC,UACI,UAAA,MAAM;AAAA,IAAI,CAAC,MAAM,MACd,MAAM,KAAK,IAAI,IAAI,oBAAC,QAAA,EAAa,WAAWP,SAAO,oBAAoB,GAAI,UAAA,KAAA,GAA7C,CAAkD,IAAU,oBAAC,QAAA,EAAc,kBAAJ,CAAS;AAAA,EAAA,GAEtH;AAER;AAkDA,MAAM,oBAAoB;AAAA,EACtB,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAAE;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT,GAAG;AAAA,EAAA,GAEP,QACC;AAED,UAAM,UAAU,QAAQ,MAAM;AAC1B,YAAM,UAAyB,CAAA;AAC/B,YAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AACxC,YAAI,MAAM,eAAe,KAAK,GAAG;AAC7B,gBAAM,UAAU;AAChB,gBAAM,EAAE,OAAO,YAAY,UAAU,WAAA,IAAe,QAAQ;AAE5D,gBAAM,SAAS,eAAe,SAAY,OAAO,UAAU,IAAI;AAC/D,cAAI,WAAW;AACf,cAAI,OAAO,eAAe,YAAY,OAAO,eAAe,UAAU;AAClE,uBAAW,OAAO,UAAU;AAAA,UAChC,WAAW,QAAQ;AACf,uBAAW;AAAA,UACf;AAEA,cAAI,UAAU,UAAU;AACpB,oBAAQ,KAAK,EAAE,OAAO,QAAQ,OAAO,UAAU;AAAA,UACnD;AAAA,QACJ;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX,GAAG,CAAC,QAAQ,CAAC;AAGb,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,UAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,UAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,CAAC;AAG1D,UAAM,eAAe,OAAuB,IAAI;AAChD,UAAM,kBAAkB,OAAyB,IAAI;AACrD,UAAM,UAAU,OAAyB,IAAI;AAC7C,UAAM,eAAe,OAAe,UAAU,UAAU,SAAY,OAAO,UAAU,KAAK,IAAI,EAAE;AAGhG,cAAU,MAAM;AACZ,UAAI,UAAU,UAAU,QAAW;AAC/B,cAAM,WAAW,OAAO,UAAU,KAAK;AACvC,qBAAa,UAAU;AACvB,cAAM,QAAQ,QAAQ,KAAK,CAAA,MAAK,EAAE,UAAU,QAAQ;AACpD,uBAAe,QAAQ,MAAM,QAAQ,QAAQ;AAAA,MACjD;AAAA,IACJ,GAAG,CAAC,UAAU,OAAO,OAAO,CAAC;AAG7B,UAAM,gBAAgB,iBAAiB,WAAW;AAElD,UAAM,kBAAkB,QAAQ,MAAM;AAClC,UAAI,CAAC,OAAQ,QAAO;AACpB,YAAM,aAAa,cAAc,YAAA;AACjC,aAAO,QAAQ,OAAO,CAAA,QAAO,IAAI,MAAM,YAAA,EAAc,SAAS,UAAU,CAAC;AAAA,IAC7E,GAAG,CAAC,SAAS,eAAe,MAAM,CAAC;AAEnC,UAAM,mBAAmB,QAAQ,MAAM;AACnC,UAAI,CAAC,YAAa,QAAO;AACzB,UAAI,CAAC,cAAc,KAAA,EAAQ,QAAO;AAClC,YAAM,aAAa,gBAAgB,KAAK,CAAA,QAAO,IAAI,MAAM,YAAA,MAAkB,cAAc,YAAA,CAAa;AACtG,aAAO,CAAC;AAAA,IACZ,GAAG,CAAC,eAAe,iBAAiB,WAAW,CAAC;AAEhD,UAAM,aAAa,QAAQ,MAAM;AAC7B,YAAM,OAAO,gBAAgB,MAAM,GAAG,GAAG;AACzC,UAAI,kBAAkB;AAClB,aAAK,KAAK,EAAE,OAAO,eAAe,OAAO,eAAe,OAAO,MAAM;AAAA,MACzE;AACA,aAAO;AAAA,IACX,GAAG,CAAC,iBAAiB,kBAAkB,aAAa,CAAC;AAGrD,UAAM,gBAAgB,CAAC,aAAqB;AACxC,mBAAa,UAAU;AACvB,UAAI,UAAU,UAAU;AACpB,cAAM,iBAAiB;AAAA,UACnB,QAAQ,EAAE,MAAM,UAAU,QAAQ,IAAI,OAAO,SAAA;AAAA,QAAS;AAE1D,kBAAU,SAAS,cAAc;AAAA,MACrC;AAAA,IACJ;AAEA,UAAM,eAAe,CAAC,WAAwB;AAC1C,oBAAc,OAAO,KAAK;AAC1B,qBAAe,OAAO,KAAK;AAC3B,gBAAU,KAAK;AACf,0BAAoB,CAAC;AAAA,IACzB;AAEA,UAAM,cAAc,CAAC,MAAwB;;AACzC,QAAE,gBAAA;AACF,oBAAc,EAAE;AAChB,qBAAe,EAAE;AACjB,4BAAgB,YAAhB,mBAAyB;AAAA,IAC7B;AAEA,cAAU,MAAM;AACZ,YAAM,qBAAqB,CAAC,UAAsB;AAC9C,YAAI,aAAa,WAAW,CAAC,aAAa,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9E,oBAAU,KAAK;AACf,gBAAM,iBAAiB,UAAU,UAAU,SAAY,OAAO,UAAU,KAAK,IAAI,aAAa;AAE9F,cAAI,gBAAgB;AAChB,kBAAM,QAAQ,QAAQ,KAAK,CAAA,MAAK,EAAE,UAAU,cAAc;AAC1D,2BAAe,QAAQ,MAAM,QAAQ,cAAc;AAAA,UACvD,OAAO;AACH,2BAAe,EAAE;AAAA,UACrB;AAAA,QACJ;AAAA,MACJ;AACA,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,aAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC7E,GAAG,CAAC,UAAU,OAAO,OAAO,CAAC;AAE7B,UAAM,gBAAgB,CAAC,MAAuC;;AAC1D,UAAI,6BAA6B,CAAC;AAElC,UAAI,EAAE,QAAQ,aAAa;AACvB,UAAE,eAAA;AACF,YAAI,CAAC,OAAQ,WAAU,IAAI;AAAA,YACtB,qBAAoB,UAAQ,OAAO,WAAW,SAAS,IAAI,OAAO,IAAI,IAAI;AAAA,MACnF,WAAW,EAAE,QAAQ,WAAW;AAC5B,UAAE,eAAA;AACF,4BAAoB,CAAA,SAAQ,OAAO,IAAI,OAAO,IAAI,IAAI;AAAA,MAC1D,WAAW,EAAE,QAAQ,SAAS;AAC1B,UAAE,eAAA;AACF,UAAE,gBAAA;AACF,YAAI,UAAU,WAAW,gBAAgB,GAAG;AACxC,uBAAa,WAAW,gBAAgB,CAAC;AAAA,QAC7C,OAAO;AACH,oBAAU,IAAI;AAAA,QAClB;AAAA,MACJ,WAAW,EAAE,QAAQ,UAAU;AAC3B,kBAAU,KAAK;AACf,8BAAgB,YAAhB,mBAAyB;AAAA,MAC7B;AAAA,IACJ;AAGA,UAAM,YAA2B;AAAA,MAC7B,OAAO,YAAY,SAAS,SAAS;AAAA,MACrC,QAAQ,UAAU;AAAA,MAClB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA;AAGlB,UAAM,cAAc,EAAE,GAAG,WAAW,GAAG,GAAA;AACvC,UAAM,UAAU,UAAU,MAAM,iBAAiB,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAE3F,UAAM,WAAW,UAAU,UAAU,SAAY,CAAC,CAAC,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC,aAAa;AAC5F,UAAM,gBAAgB,UAAU,UAAU,SAAY,OAAO,UAAU,KAAK,IAAI,aAAa;AAE7F,WACI;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,kBAAkBF,SAAO,iBAAiB,CAAC,IAAI,UAAU,aAAa,EAAE;AAAA,QACnF,OAAO;AAAA,QACP,KAAK;AAAA,QACL,IAAI,UAAU;AAAA,QAEb,UAAA;AAAA,UAAA,SACG;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,UAAU;AAAA,cACd,SAAS;AAAA,cACT,WAAW,yBAAyB,UAAU,UAAU,EAAE;AAAA,cAEzD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAIT;AAAA,YAAC;AAAA,YAAA;AAAA,cACG;AAAA,cACA,MAAM,UAAU;AAAA,cAChB,OAAO,UAAU,UAAU,SAAY,OAAO,UAAU,KAAK,IAAI;AAAA,cACjE,UAAU,MAAM;AAAA,cAAE;AAAA,cAClB,WAAWA,SAAO,wBAAwB;AAAA,cAC1C,UAAU;AAAA,cACV,UAAAE;AAAA,cACA,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,+BAGf,OAAA,EAAI,WAAW,2BAA2B,OAAO,eAAe,EAAE,IAC/D,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,KAAK;AAAA,gBACL,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,cAAa;AAAA,gBACb,WAAW,mCAAmCF,SAAO,WAAW,CAAC,IAAI,UAAU,UAAU,EAAE;AAAA,gBAE1F,GAAG;AAAA,gBAEJ,UAAUE,aAAY;AAAA,gBACtB,OAAO;AAAA,gBAEP,UAAU,CAAC,MAAM;AACb,wBAAM,MAAM,EAAE,OAAO;AACrB,iCAAe,GAAG;AAClB,sBAAI,CAAC,OAAQ,WAAU,IAAI;AAC3B,sBAAI,aAAa;AACb,kCAAc,GAAG;AAAA,kBACrB,WAAW,QAAQ,IAAI;AACnB,kCAAc,EAAE;AAAA,kBACpB;AAAA,gBACJ;AAAA,gBAEA,WAAW;AAAA,gBACX,SAAS,CAAC,MAAM;AACZ,sBAAI,CAACA,aAAY,CAAC,gBAAgB,IAAI;AACtC,sBAAI,yBAAyB,CAAC;AAAA,gBAClC;AAAA,cAAA;AAAA,YAAA;AAAA,YAGH,OACG,oBAAC,QAAA,EAAK,WAAW,0BACb,8BAAC,WAAA,EAAU,MAAM,IAAI,EAAA,CACzB,IAEA,qBAAC,OAAA,EAAI,WAAWF,SAAO,kBAAkB,GACpC,UAAA;AAAA,cAAA,YAAY,CAACE,aACV;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,SAAS;AAAA,kBACT,WAAW,GAAGF,SAAO,eAAe,CAAC;AAAA,kBACrC,OAAM;AAAA,kBACN,aAAa,CAAC,MAAM,EAAE,eAAA;AAAA,kBAEtB,8BAAC,WAAA,CAAA,CAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,kCAGlB,OAAA,EAAI,WAAW,GAAGA,SAAO,eAAe,CAAC,IAAI,SAASA,SAAO,QAAQ,IAAI,EAAE,IACxE,UAAA,oBAAC,eAAY,EAAA,CACjB;AAAA,YAAA,EAAA,CACJ;AAAA,UAAA,GAER;AAAA,UAGI,UAAU,CAACE,aAAY,CAAC,4BACnB,OAAA,EAAI,WAAWF,SAAO,mBAAmB,GACtC,UAAA,oBAAC,MAAA,EAAG,KAAK,SAAS,WAAWA,SAAO,eAAe,GAC9C,UAAA,WAAW,WAAW,IACnB,oBAAC,MAAA,EAAG,WAAWA,SAAO,qBAAqB,GACtC,UAAA,cAAc,eAAe,yBAClC,IAEA,WAAW,IAAI,CAAC,QAAQ,UACpB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEG,WAAW;AAAA,kDACLA,SAAO,iBAAiB,CAAC;AAAA,kDACzB,OAAO,QAAQA,SAAO,iBAAiB,IAAI,EAAE;AAAA,kDAC7C,UAAU,mBAAmBA,SAAO,SAAS,IAAI,EAAE;AAAA,kDACnD,kBAAkB,OAAO,QAAQA,SAAO,UAAU,IAAI,EAAE;AAAA;AAAA,cAE9D,aAAa,CAAC,MAAM,EAAE,eAAA;AAAA,cACtB,SAAS,CAAC,MAAM;AACZ,kBAAE,gBAAA;AACF,6BAAa,MAAM;AAAA,cACvB;AAAA,cACA,cAAc,MAAM,oBAAoB,KAAK;AAAA,cAE7C,UAAA,qBAAC,SAAI,OAAO,EAAE,UAAU,UAAU,cAAc,cAC3C,UAAA;AAAA,gBAAA,OAAO,SAAS,oBAAC,QAAA,EAAK,OAAO,EAAE,aAAa,EAAA,GAAK,UAAA,oBAAC,UAAA,CAAA,CAAS,EAAA,CAAE;AAAA,oCAC7D,iBAAA,EAAgB,MAAM,OAAO,OAAO,WAAW,eAAe;AAAA,gBAC9D,OAAO,SAAS,oBAAC,QAAA,EAAK,OAAO,EAAE,SAAS,KAAK,UAAU,UAAU,YAAY,EAAA,GAAK,UAAA,YAAA,CAAS;AAAA,cAAA,EAAA,CAChG;AAAA,YAAA;AAAA,YAlBK,OAAO,QAAQ;AAAA,UAAA,CAoB3B,GAET,EAAA,CACJ;AAAA,UAIP,YACG;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,UAAU;AAAA,cACd,WAAW;AAAA,cAEV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGP,OAAO,YAAY,YAAY,WAC7B;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cAEX,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,IAAI,GAAG,OAAO;AAAA,kBACd,WAAW;AAAA,kBAEV,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACL;AAAA,UAAA;AAAA,UAGP,WAAW,QAAQ,SAAS,KACzB;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,WAAW;AAAA,cAEV,iBAAO,YAAY,YAAY,QAAQ,IAAI,CAACG,QAAO,UAChD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,IAAI,GAAG,OAAO,cAAc,KAAK;AAAA,kBACjC,WAAW;AAAA,kBAEV,UAAAA;AAAA,gBAAA;AAAA,gBAJI;AAAA,cAAA,CAMZ;AAAA,YAAA;AAAA,UAAA;AAAA,QACL;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;AAEA,kBAAkB,cAAc;AChchC,MAAM,YAAY,MAAM,WAAsC,CAAC;AAAA,EAC3D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,SAAS;AAAA,MACT,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAiK;AAAA,EAAA;AAGnL,CAAC;AAED,UAAU,cAAc;AC9BxB,MAAM,aAAa,MAAM,WAAuC,CAAC;AAAA,EAC7D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,SAAQ;AAAA,MACR,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF;AAAA,MACA,SAAS;AAAA,MACT,OAAO;AAAA,MACP,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UAAK,UAAS;AAAA,UACX,GAAE;AAAA,UACF,UAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAU;AAAA,EAAA;AAGnC,CAAC;AAED,WAAW,cAAc;AC7BzB,MAAM,YAAY,MAAM,WAAsC,CAAC;AAAA,EAC3D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR;AAAA,MACA,SAAS;AAAA,MACT,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QACN;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAgS;AAAA,IAAA;AAAA,EAAA;AAGlT,CAAC;AAED,UAAU,cAAc;AC9BxB,MAAM,WAAW,MAAM,WAAqC,CAAC;AAAA,EACzD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAqZ;AAAA,EAAA;AAGva,CAAC;AAED,SAAS,cAAc;AC5BvB,MAAM,gBAAgB,MAAM,WAA0C,CAAC;AAAA,EACnE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AAEP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,GAAE,0IAAA,CAA0I;AAAA,QAClJ,oBAAC,QAAA,EAAK,GAAE,oIAAA,CAAoI;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGxJ,CAAC;AAED,cAAc,cAAc;AC7B5B,MAAM,eAAe,MAAM,WAAyC,CAAC;AAAA,EACjE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,GAAE,ybAAA,CAAyb;AAAA,QACjc,oBAAC,QAAA,EAAK,GAAE,0HAAA,CAA0H;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAI9I,CAAC;AAED,aAAa,cAAc;ACtB3B,MAAM,cAAc,MAAM,WAAwC,CAC9D;AAAA,EACI,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QACF;AACD,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,MAAM;AAAA,MACN,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,GAAE,sMAAqM,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,QACpS,oBAAC,QAAA,EAAK,GAAE,sBAAqB,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,QACpH,oBAAC,QAAA,EAAK,GAAE,8BAA6B,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,QAC5H,oBAAC,QAAA,EAAK,GAAE,sMAAqM,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,QACpS,oBAAC,QAAA,EAAK,GAAE,6LAA4L,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,QAC3R,oBAAC,QAAA,EAAK,GAAE,0BAAyB,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,QACxH,oBAAC,QAAA,EAAK,GAAE,wBAAuB,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,QACtH,oBAAC,QAAA,EAAK,GAAE,gCAA+B,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,QAC9H,oBAAC,QAAA,EAAK,GAAE,gCAA+B,QAAO,WAAU,qBAAkB,MAAK,kBAAe,SAAQ,mBAAgB,QAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG1I,CAAC;AAED,YAAY,cAAc;AC7C1B,MAAM,cAAc,MAAM,WAAwC,CAAC;AAAA,EAC/D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,SAAQ;AAAA,MACR,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF;AAAA,MACA,SAAS;AAAA,MACT,OAAO;AAAA,MACP,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,MAAK,QAAO,GAAE,iBAAgB;AAAA,QACpC,oBAAC,QAAA,EAAK,UAAS,WAAU,GAAE,sEAAA,CAAsE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG7G,CAAC;AAED,YAAY,cAAc;ACrB1B,MAAM,gBAAgB,MAAM,WAA0C,CAAC;AAAA,EACnE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,SAAS;AAAA,MACT,OAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEH,UAAA;AAAA,QAAA,CAAC,QAAQ,oBAAC,QAAA,EAAK,GAAE,2JAAA,CAA2J;AAAA,QAC5K,SAAS,WAAW,qBAAA,UAAA,EACjB,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,GAAE,8GAAA,CAA8G;AAAA,UACtH,oBAAC,QAAA,EAAK,GAAE,0JAAA,CAA0J;AAAA,QAAA,GACtK;AAAA,QACC,SAAS,WAAW,qBAAA,UAAA,EACjB,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,GAAE,mLAAA,CAAmL;AAAA,UAC3L,oBAAC,QAAA,EAAK,GAAE,0JAAA,CAA0J;AAAA,QAAA,GACtK;AAAA,QACC,SAAS,cAAc,qBAAA,UAAA,EACpB,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,GAAE,+HAAA,CAA+H;AAAA,UACvI,oBAAC,QAAA,EAAK,GAAE,0JAAA,CAA0J;AAAA,QAAA,GACtK;AAAA,QACC,SAAS,YAAY,qBAAA,UAAA,EAClB,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,GAAE,gJAAA,CAAgJ;AAAA,UACxJ,oBAAC,QAAA,EAAK,GAAE,+IAAA,CAA+I;AAAA,QAAA,GAC3J;AAAA,QACC,SAAS,WAAW,oBAAA,UAAA,EACjB,UAAA,oBAAC,UAAK,aAAU,WAAU,GAAE,8uCAAA,CAA8uC,EAAA,CAC9wC;AAAA,QACC,SAAS,SAAS,oBAAA,UAAA,EACf,UAAA,oBAAC,UAAK,aAAU,WAAU,GAAE,8tDAAA,CAA8tD,EAAA,CAC9vD;AAAA,QACC,SAAS,UAAU,oBAAA,UAAA,EAChB,UAAA,oBAAC,UAAK,aAAU,WAAU,GAAE,o0DAAA,CAAo0D,EAAA,CACp2D;AAAA,QACC,SAAS,SAAS,oBAAA,UAAA,EACf,UAAA,oBAAC,UAAK,aAAU,WAAU,GAAE,u5BAAA,CAAu5B,EAAA,CACv7B;AAAA,QACC,SAAS,SAAS,oBAAA,UAAA,EACf,UAAA,oBAAC,UAAK,aAAU,WAAU,GAAE,66CAAA,CAA66C,EAAA,CAC78C;AAAA,QACC,SAAS,SAAS,oBAAA,UAAA,EACf,UAAA,oBAAC,UAAK,aAAU,WAAU,GAAE,2uCAAA,CAA2uC,EAAA,CAC3wC;AAAA,QACC,SAAS,SAAS,oBAAA,UAAA,EACf,UAAA,oBAAC,UAAK,aAAU,WAAU,GAAE,2XAAA,CAA2X,EAAA,CAC3Z;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ,CAAC;AAED,cAAc,cAAc;ACzE5B,MAAM,cAAc,MAAM,WAAwC,CAAC;AAAA,EAC/D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,aAAU,WAAU,GAAE,iEAAgE;AAAA,QAC5F,oBAAC,QAAA,EAAK,GAAE,qGAAA,CAAqG;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGzH,CAAC;AAED,YAAY,cAAc;AC3B1B,MAAM,aAAa,MAAM,WAAuC,CAAC;AAAA,EAC7D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,GAAE,sEAAA,CAAsE;AAAA,QAC9E,oBAAC,QAAA,EAAK,GAAE,2DAAA,CAA2D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG/E,CAAC;AAED,WAAW,cAAc;AC7BzB,MAAM,kBAAkB,MAAM,WAA4C,CAAC;AAAA,EACvE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,GAAE,sEAAA,CAAsE;AAAA,QAC9E,oBAAC,QAAA,EAAK,GAAE,sOAAA,CAAsO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG1P,CAAC;AAED,gBAAgB,cAAc;ACpB9B,MAAM,YAAY,MAAM,WAAsC,CAC1D;AAAA,EACI,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QACF;AACD,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,GAAE,gQAAA,CAAgQ;AAAA,QACxQ,oBAAC,QAAA,EAAK,GAAE,sYAAA,CAAsY;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG1Z,CAAC;AAED,UAAU,cAAc;ACtCxB,MAAM,wBAAwB,MAAM,WAAkD,CAAC;AAAA,EACnF,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA,oBAAC,QAAA,EAAK,aAAU,WAAU,GAAE,+LAAA,CAA+L;AAAA,IAAA;AAAA,EAAA;AAGvO,CAAC;AAED,sBAAsB,cAAc;AC3BpC,MAAM,uBAAuB,MAAM,WAAiD,CAAC;AAAA,EACjF,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA,oBAAC,QAAA,EAAK,aAAU,WAAU,GAAE,6LAAA,CAA6L;AAAA,IAAA;AAAA,EAAA;AAGrO,CAAC;AAED,qBAAqB,cAAc;AC3BnC,MAAM,qBAAqB,MAAM,WAA+C,CAAC;AAAA,EAC7E,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA,oBAAC,QAAA,EAAK,aAAU,WAAU,GAAE,8LAAA,CAA6L;AAAA,IAAA;AAAA,EAAA;AAGrO,CAAC;AAED,mBAAmB,cAAc;AC3BjC,MAAM,uBAAuB,MAAM,WAAiD,CAAC;AAAA,EACjF,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,gBAAgB;AAAA,EACjB,GAAG;AACP,GAAG,QAAQ;AACP,SACI;AAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,UAAU,cAAc,mBAAmB,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,MACpF,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,UAAA,oBAAC,QAAA,EAAK,aAAU,WAAU,GAAE,8LAAA,CAA8L;AAAA,IAAA;AAAA,EAAA;AAGtO,CAAC;AAED,qBAAqB,cAAc;;;;;;;;;;;;;;ACzCnC,MAAM,SAAS,CAAC,EAAE,OAAAI,QAAO,MAAM,UAAU,aAAsB;AAE3D,MAAI,MAAM;AAEV,UAAQ,SAAA;AAAA,IACJ,KAAK;AACD,YAAM;AACN;AAAA,IACJ,KAAK;AACD,YAAM;AACN;AAAA,IACJ,KAAK;AACD,YAAM;AACN;AAAA,IACJ,KAAK;AACD,YAAM;AACN;AAAA,EAAA;AAGR,QAAM,UAAoB,CAAA;AAC1B,OAAK,MAAM,IAAI,EAAE,QAAQ,CAAA,QAAO;AAC5B,YAAQ,KAAK,SAAS,GAAG,SAAS;AAAA,EACtC,CAAC;AAED,SAAO,SAAS,KAAK;AAAA,IACjB;AAAA,IACA;AAAA,0BACkBP,SAAO,wBAAwB,CAAC;AAAA,8BAC5BA,SAAO,kBAAkB,CAAC;AAAA,kCACtBA,SAAO,sBAAsB,CAAC,IAAIA,SAAO,GAAG,OAAO,QAAQ,CAAC;AAAA;AAAA,8BAEhE,GAAG;AAAA;AAAA;AAAA,kCAGCA,SAAO,yBAAyB,CAAC;AAAA,sCAC7BA,SAAO,yBAAyB,CAAC;AAAA,kCACrCO,UAAS,EAAE;AAAA;AAAA,sCAEPP,SAAO,uBAAuB,CAAC;AAAA,8BACvC,QAAQ,KAAK,EAAE,CAAC;AAAA;AAAA,sCAERA,SAAO,yBAAyB,CAAC;AAAA;AAAA,yCAE9B,UAAU,KAAK,CAAC,IAAI,UAAU,QAAQ,CAAC,IAAI,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAW5G;;;;;;;;;;;;AC3DA,MAAM,WAAW,CAAC,EAAE,OAAAO,QAAO,WAAwC;AAC/D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAG5B,WAAO,SAAS,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,8BACkBP,SAAO,0BAA0B,CAAC;AAAA,kCAC9BA,SAAO,oBAAoB,CAAC;AAAA,sCACxBA,SAAO,wBAAwB,CAAC,IAAIA,SAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAMlDA,SAAO,2BAA2B,CAAC;AAAA,0CAC/BA,SAAO,2BAA2B,CAAC;AAAA,sCACvCO,UAAS,EAAE;AAAA;AAAA,0CAEPP,SAAO,yBAAyB,CAAC;AAAA,wCACnC,IAAI;AAAA;AAAA,0CAEFA,SAAO,2BAA2B,CAAC;AAAA;AAAA;AAAA,6CAGhC,UAAU,KAAK,CAAC,IAAI,UAAU,QAAQ,CAAC,IAAI,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAMnE,UAAU,KAAK,CAAC,IAAI,UAAU,QAAQ,CAAC,IAAI,UAAU,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAWvG,UAAM,aAAa,SAAS,eAAe,0BAA0B;AACrE,UAAM,QAAQ,SAAS,eAAe,uBAAuB;AAC7D,UAAM,YAAY,SAAS,eAAe,iCAAiC;AAM3E,UAAM,aAAa,MAAM;AACrB,aAAO,oBAAoB,WAAW,aAAa;AACnD,qCAAO,oBAAoB,SAAS;AACpC,6CAAW,oBAAoB,SAAS;AACxC,+CAAY;AAAA,IAChB;AAEA,UAAM,WAAW,MAAM;AACnB,iBAAA;AACA,cAAQ,IAAI;AAAA,IAChB;AAEA,UAAM,eAAe,MAAM;AACvB,iBAAA;AACA,cAAQ,KAAK;AAAA,IACjB;AAKA,UAAM,gBAAgB,CAAC,MAAqB;AACxC,UAAI,EAAE,QAAQ,SAAS;AACnB,UAAE,eAAA;AACF,iBAAA;AAAA,MACJ;AAEA,UAAI,EAAE,QAAQ,UAAU;AACpB,qBAAA;AAAA,MACJ;AAAA,IACJ;AAGA,mCAAO,iBAAiB,SAAS;AACjC,2CAAW,iBAAiB,SAAS;AACrC,WAAO,iBAAiB,WAAW,aAAa;AAAA,EACpD,CAAC;AACL;;;;;;;;;;;;ACtGO,SAAS,SAAS,SAAiD;AACtE,MAAI,SAAS;AACT,WAAO,QAAQ;AAAA,EACnB,OAAO;AACH,WAAO;AAAA,EACX;AACJ;AA+BA,MAAM,UAAU,CAAC,EAAE,OAAAO,QAAO,WAA6C;AACnE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,WAAO,SAAS,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,0BACcP,SAAO,yBAAyB,CAAC;AAAA,8BAC7BA,SAAO,mBAAmB,CAAC;AAAA,iCACxBA,SAAO,uBAAuB,CAAC,IAAIA,SAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAMjDA,SAAO,0BAA0B,CAAC;AAAA,sCAC7BA,SAAO,0BAA0B,CAAC;AAAA,kCACtCO,UAAS,EAAE;AAAA;AAAA,sCAEPP,SAAO,wBAAwB,CAAC;AAAA,oCAClC,QAAQ,EAAE;AAAA;AAAA;AAAA;AAAA,sDAIQA,SAAO,yBAAyB,CAAC;AAAA;AAAA;AAAA,sCAGjDA,SAAO,0BAA0B,CAAC;AAAA;AAAA;AAAA,yCAG/B,UAAU,KAAK,CAAC,IAAI,UAAU,QAAQ,CAAC,IAAI,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAOnE,UAAU,KAAK,CAAC,IAAI,UAAU,QAAQ,CAAC,IAAI,UAAU,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAYnG,UAAM,KAA+B,SAAS,cAAc,uBAAuB;AACnF,UAAM,eAAyC,SAAS,cAAc,iCAAiC;AACvG,UAAM,SAAkC,SAAS,cAAc,0BAA0B;AAEzF,OAAI,iBAAiB,SAAS,WAAY;AACtC,cAAQ,SAAS,MAAM,CAAC;AAAA,IAC5B,CAAC;AACD,iBAAc,iBAAiB,SAAS,WAAY;AAChD,cAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,EAEL,CAAC;AACL;AC9HO,MAAM,MAAK;AAAA;AAAA;AAAA;AAAA,EA+BjB,YAAY,OAAW,OAAO,UAAc,OAAO;AA9BnD,SAAA,QAA0B,IAAI,MAAA;AAC9B,SAAA,OAAe;AACf,SAAA,YAAY;AAAA,MACT,mBAAoB;AAAA,MACpB,qBAAsB;AAAA,MACtB,uBAAwB;AAAA,MACxB,iCAAkC;AAAA,MAClC,6BAA8B;AAAA,MAC9B,iBAAkB;AAAA,IAAA;AAErB,SAAA,eAA2B,IAAI,WAAA;AAC/B,SAAA,UAAU;AAAA,MACH,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,IAAA;AAIb,SAAA,WAAW;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,IAAA;AAQR,QAAI,MAAM;AACT,WAAK,KAAK,MAAM,OAAO;AAAA,IACxB;AAAA,EACD;AAAA,EAEA,OAAO,SAAS,KAAK,OAAO;AAC3B,QAAI,MAAM,IAAI;AACd,SAAI,IAAI,GAAG,IAAI,OAAO,KAAK;AACjB,aAAO,OAAO,aAAa,MAAI,GAAI;AACnC,YAAI,QAAM;AAAA,IACpB;AACA,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,IAAI,KAAU,OAAO;AACvB,QAAI,SAAS,IAAI,GAAG;AACpB,SAAK,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACpC,WAAK,QAAQ,UAAU,CAAC,GAAG;AACxB,YAAI,UAAU,CAAC,EAAE,eAAe,IAAI,KAAK,OAAO,OAAO,IAAI,MAAM,aAAa;AAC3E,iBAAO,IAAI,IAAI,UAAU,CAAC,EAAE,IAAI;AAAA,QACnC;AAAA,MACH;AAAA,IACH;AACA,WAAO;AAAA,EACV;AAAA,EAEF,iBAAiB,GAAG;AACnB,QAAI,KAAK,CAAA;AACT,QAAI,EAAE,WAAW,QAAQ,EAAE,UAAU,MAAM;AAC1C,QAAE,SAAS;AAAA,IACZ;AACA,QAAI,KAAK,OAAO,GAAG,KAAK,QAAQ;AAChC,MAAE,OAAO,EAAE,QAAQ,oBAAI,KAAA;AAEvB,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,MAAM,MAAM,GAAG;AAEtB,QAAI,SAAS,KAAK,aAAa,IAAI;AACnC,QAAI,QAAQ;AACX,WAAK,UAAU,MAAM;AAAA,IACtB;AAEA,QAAI,KAAK,iBAAiB,CAAC;AAE3B,QAAI,aAAa,cAAc,gBAAgB,YAAY;AAC1D,QAAE,SAAS;AACX,QAAE,SAAS;AACX,aAAO,WAAW,kBAAkB,IAAI;AAAA,IACzC,WAAW,aAAa,eAAe,gBAAgB,aAAa;AACnE,QAAE,SAAS;AACX,QAAE,SAAS;AACX,UAAI,aAAa,IAAI,WAAW,IAAI;AACpC,aAAO,WAAW,kBAAkB,UAAU;AAAA,IAC/C,WAAW,EAAE,UAAU,CAAC,EAAE,QAAQ;AAEjC,UAAI,EAAE,0BAA0B,MAAM;AAGrC,eAAO,WAAW,cAAc,IAAI;AAAA,MACrC;AAEA,aAAO,EAAE;AAAA,IACV;AAEA,WAAO,KAAK,MAAM,IAAI,IAAI,IAAI,UAAU,MAAM,MAAM,CAAC;AAAA,EACtD;AAAA,EAEA,aAAa,MAAM;AAClB,QAAI,KAAK,MAAM,EAAE,KAAK,KAAK;AAC1B,aAAO,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC;AAAA,IACzC;AACA,QAAI,YAAY,KAAK,YAAY,GAAG;AACpC,WAAQ,YAAY,IAAK,KAAK,UAAU,GAAG,SAAS,IAAI;AAAA,EACzD;AAAA,EAEA,UAAW,MAAM;AAEhB,QAAI,KAAK,MAAM,EAAE,KAAK,KAAK;AAC1B,cAAQ;AAAA,IACT;AAGA,QAAI,CAAC,KAAK,MAAM,IAAI,GAAG;AAEtB,UAAI,SAAS,KAAK,aAAa,IAAI;AAEnC,UAAI,QAAQ;AACX,aAAK,UAAU,MAAM;AAAA,MACtB;AAEA,WAAK,QAAQ,MAAM,IAAI,EAAC,KAAI,MAAK;AAAA,IAClC;AACA,WAAO,KAAK,MAAM,IAAI;AAAA,EACrB;AAAA,EAEA,uBAAuB,MAAM,oBAAoB,iBAAiB;AACnE,QAAI,UAAU,uBAAuB,KAAK,MACzC,OAAU,KAAK,SAAA,GACf,IAAU,KAAK,SACf,SACA;AAOD,cAAU,EAAE,KAAK,SAAA;AACjB,cAAU,WAAW;AACrB,cAAU,UAAU,EAAE,KAAK,WAAA;AAC3B,cAAU,WAAW;AACrB,cAAU,UAAU,EAAE,KAAK,WAAA,IAAe;AAE1C,cAAU,EAAE,KAAK,YAAA,IAAgB;AACjC,cAAU,WAAW;AACrB,cAAU,UAAW,EAAE,KAAK,SAAA,IAAa;AACzC,cAAU,WAAW;AACrB,cAAU,UAAU,EAAE,KAAK,QAAA;AAE3B,QAAI,iBAAiB,KAAK,aAAa,SAAS,IAAI;AAEpD,QAAI,SAAS;AAGb,cAAU;AAGV,cAAU,UAAU,SAAa;AAEjC,cAAU,KAAK,aAAa;AAE5B,cAAU,MAAM,SAAS,SAAS,CAAC;AAEnC,cAAU,MAAM,SAAS,SAAS,CAAC;AAEnC,cAAU,MAAM,SAAS,MAAM,MAAM,IAAI,GAAG,CAAC;AAE7C,cAAU,MAAM,SAAS,eAAe,QAAQ,CAAC;AAEjD,cAAU,MAAM,SAAS,KAAK,QAAQ,CAAC;AAEvC,cAAU,MAAM,SAAS,mBAAmB,QAAQ,CAAC;AAErD,cAAU;AAEV,WAAO;AAAA,MACN;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,KAAK,QAAQ,SAAS;AACrB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC3C;AAAA,EAEH,OAAO,QAAkB;AACxB,QAAI,SAAS,CAAA,GAAI,UAAU,cAAc,MAAM;AAC/C,SAAK,YAAY,KAAK,OAAO;AAG5B,aAAO,KAAK,MAAM,QAAQ;AAE1B,kBAAY,IAAI,UAAU,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO,CAAC;AACzE,qBAAe,SAAS,MAAM,KAAK,KAAK,QAAQ,SAAS,MAAM;AAC/D,UAAI,SAAS,MAAM,GAAG,KAAK,KAAK,MAAM,MAAM,KAAK;AAAA,MAChD,OAAO,cAAc,SAAS,GAAG;AACjC,eAAO,KAAK,SAAS;AAAA,MACtB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA,EAEA,KAAK,MAAM,OAAO,MAAM,IAAI,MAAM;AACjC,QAAI,UAAU,WAAW,GAAG;AAC3B,UAAI,gBAAgB,QAAQ;AAC3B,YAAI,SAAS;AACb,eAAO,KAAK,OAAO,SAAS,cAAc,MAAM;AAC/C,iBAAO,CAAC,KAAK,QAAQ,OAAO,OAAO,KAAK,YAAY;AAAA,QACrD,CAAC;AAAA,MACF,OAAO;AACN,eAAO,KAAK,OAAO,SAAU,cAAc,MAAM;AAChD,iBAAO,CAAC,KAAK,QAAQ,OAAO,iBAAiB;AAAA,QAC9C,CAAC,EAAE,CAAC,KAAG;AAAA,MACR;AAAA,IACD,OAAO;AACN,aAAO,KAAK,OAAK;AACjB,WAAK,QAAQ,MAAM,MAAM,CAAC;AAAA,IAC3B;AACA,WAAO;AAAA,EACR;AAAA;AAAA,EAIA,OAAO,MAAW,OAAO;AACxB,QAAI,CAAC,KAAK;AACT,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC1C;AAEA,QAAI,eAAe,QAAQ;AAC1B,aAAO,KAAK,OAAO,SAAS,cAAc,MAAM;AAC/C,eAAO,KAAK,QAAQ,OAAO,IAAI,KAAK,YAAY;AAAA,MACjD,CAAC;AAAA,IACF;AAGA,QAAI,OAAO,KAAK,OAAO;AACP,SAAK,UAAU,IAAI;AAE7B,WAAO;AAAA,EAKd;AAAA,EAEA,OAAO,OAAc,IAAI;AAClB,QAAG,QAAQ,IAAG;AACV,aAAO;AAAA,IACX;AACN,WAAO,KAAK,OAAO;AACnB,QAAI,OAAO,KAAK,MAAM,IAAI;AAC1B,QAAI,CAAC,MAAM;AAEV,UAAI,KAAK,MAAM,EAAE,KAAK,KAAK;AAC1B,gBAAQ;AAAA,MACT;AACA,aAAO,KAAK,MAAM,IAAI;AAAA,IACvB;AAEA,QAAI,MAAM;AACT,UAAI,CAAC,KAAK,QAAQ,KAAK;AAEtB,eAAO,KAAK,MAAM,IAAI;AAAA,MACvB,OAAO;AAEN,YAAI,OAAO,KAAK,OAAO,SAAU,cAAciB,OAAM;AACpD,iBAAOA,MAAK,KAAK,MAAM,GAAG,KAAK,MAAM,MAAM;AAAA,QAC5C,CAAC;AACD,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACrC,iBAAO,KAAK,MAAM,KAAK,CAAC,EAAE,IAAI;AAAA,QAC/B;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,SAAS,UAAc,OAAO;AAC7B,cAAU,KAAK,OAAO,WAAW,CAAA,GAAI;AAAA,MACpC,QAAS;AAAA,MACT,aAAc;AAAA,MACd,MAAO;AAAA,IAAA,CACP;AACD,QAAI,cAAc,QAAQ,YAAY,YAAA;AAGtC,QAAI,YAAY,CAAA,GAAI,QAAQ,CAAA,GAAI,aAAa;AAO7C,aAAS,QAAQ,KAAK,OAAO;AAC5B,UAAK,CAAC,KAAK,MAAM,eAAe,IAAI,GAAI;AAAE;AAAA,MAAU;AAEpD,UAAI,OAAO,KAAK,MAAM,IAAI;AAE1B,UAAI,qBAAqB,MAAM,WAAW,KAAK,IAAI;AAEnD,UAAI,aAAa,IACjB,YAAY,IACZ,OAAO,KAAK,uBAAuB,MAAM,oBAAoB,WAAW;AACxE,mBAAa,KAAK,UAAU,oBAAoB,KAAK,SAAS,qBAAqB,KAAK;AAExF,kBAAY,KAAK,UAAU;AAAA,MAE3B;AAAA,MAEA,KAAK;AAAA,MAEL;AAAA,OAMC,KAAK,QAAQ,QAAM,OAAK,YAAmB;AAAA,MAE5C,MAAM,SAAS,YAAY,CAAC;AAAA,MAE5B;AAEA,oBAAc,WAAW;AAEzB,YAAM,KAAK,UAAU;AACrB,gBAAU,KAAK,SAAS;AAAA,IACzB;AAEA,QAAI,WAAW,MAAM,KAAK,EAAE;AAC5B,QAAI,UAAU,UAAU,KAAK,EAAE;AAE/B,QAAI,SAAS;AAGb,aAAS,KAAK,UAAU;AAAA,IAExB;AAAA,IAIA,MAAM,SAAS,MAAM,QAAQ,CAAC;AAAA,IAE9B,MAAM,SAAS,MAAM,QAAQ,CAAC;AAAA,IAE9B,MAAM,SAAS,QAAQ,QAAQ,CAAC;AAAA,IAEhC,MAAM,SAAS,SAAS,QAAQ,CAAC;AAAA,IAEjC;AAEA,QAAI,MAAM,WAAW,UAAU;AAG/B,YAAO,QAAQ,KAAK,YAAA,GAAY;AAAA,MAC/B,KAAK;AACJ,eAAO,WAAW,kBAAkB,GAAG;AAAA,MACxC,KAAK;AACJ,eAAO,WAAW,eAAe,GAAG;AAAA,MACrC,KAAK;AACJ,eAAO,WAAW,YAAY,GAAG;AAAA,MAClC,KAAK;AACJ,eAAQ,QAAQ,SAAU,YAAY,OAAO,GAAG,IAAI;AAAA,MACrD;AACC,eAAO;AAAA,IAAA;AAAA,EAEV;AAAA,EAEA,OAAO,MAAM,KAAK,MAAM,GAAG;AAC1B,QAAI,QAAQ,MAAM,OAAO,QAAQ,aAAa;AAC7C,aAAO;AAAA,IACR;AAEA,QAAI,QAAQ;AAAA,MACX;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,IAAA;AAGrC,QAAI,OAAO,OAAQ,aAAa;AAAE,YAAM;AAAA,IAAG;AAC3C,QAAI,IAAI;AACR,QAAI,IAAI;AAER,UAAM,MAAO;AACb,aAAS,IAAI,GAAG,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAM;AAClD,WAAM,MAAM,IAAI,WAAY,CAAE,KAAM;AACpC,UAAI,MAAM,CAAC;AACX,YAAQ,QAAQ,IAAM;AAAA,IACvB;AAEA,WAAO,MAAO;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,WAAW,KAAK;AACtB,UAAM,IAAI,QAAQ,SAAQ,IAAI;AAC9B,QAAI,UAAU;AAEd,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAEpC,UAAI,IAAI,IAAI,WAAW,CAAC;AAExB,UAAI,IAAI,KAAK;AACZ,mBAAW,OAAO,aAAa,CAAC;AAAA,MACjC,WAAY,IAAI,OAAS,IAAI,MAAO;AACnC,mBAAW,OAAO,aAAc,KAAK,IAAK,GAAG;AAC7C,mBAAW,OAAO,aAAc,IAAI,KAAM,GAAG;AAAA,MAC9C,OAAO;AACN,mBAAW,OAAO,aAAc,KAAK,KAAM,GAAG;AAC9C,mBAAW,OAAO,aAAe,KAAK,IAAK,KAAM,GAAG;AACpD,mBAAW,OAAO,aAAc,IAAI,KAAM,GAAG;AAAA,MAC9C;AAAA,IAED;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,WAAW,SAAS;AAC1B,QAAI,SAAS;AACb,QAAI,IAAI;AACR,QAAI,IAAI,GAAW,KAAK,GAAG,KAAK;AAEhC,WAAO,IAAI,QAAQ,QAAQ;AAC1B,UAAI,QAAQ,WAAW,CAAC;AAExB,UAAI,IAAI,KAAK;AACZ,kBAAU,OAAO,aAAa,CAAC;AAC/B;AAAA,MACD,WAAY,IAAI,OAAS,IAAI,KAAM;AAClC,aAAK,QAAQ,WAAW,IAAE,CAAC;AAC3B,kBAAU,OAAO,cAAe,IAAI,OAAO,IAAM,KAAK,EAAG;AACzD,aAAK;AAAA,MACN,OAAO;AACN,aAAK,QAAQ,WAAW,IAAE,CAAC;AAC3B,aAAK,QAAQ,WAAW,IAAE,CAAC;AAC3B,kBAAU,OAAO,cAAe,IAAI,OAAO,MAAQ,KAAK,OAAO,IAAM,KAAK,EAAG;AAC7E,aAAK;AAAA,MACN;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAOD;AAEA,MAAM,UAAU;AAAA,EAUf,YAAY,MAAM,MAAM,SAAS;AATjC,SAAA,OAAe;AACf,SAAA,OAAe;AACf,SAAA,UAAU;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,IAAA;AAIN,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,SAAS;AACF,QAAI,SAAS,KAAK;AAClB,QAAI,KAAK,QAAQ,QAAQ;AACtB,eAAS,YAAY,OAAO,MAAM;AAAA,IACrC;AACA,QAAI,KAAK,QAAQ,QAAQ;AACtB,eAAS,MAAM,WAAW,MAAM;AAAA,IACnC;AACA,WAAO;AAAA,EACX;AAAA,EAEH,WAAW;AACL,QAAI,SAAS,KAAK;AAClB,QAAI,KAAK,QAAQ,QAAQ;AACtB,eAAS,YAAY,OAAO,MAAM;AAAA,IACrC;AACA,QAAI,CAAC,KAAK,QAAQ,QAAQ;AACvB,eAAS,MAAM,WAAW,MAAM;AAAA,IACnC;AACA,WAAO;AAAA,EACV;AAAA,EAEH,eAAe;AACT,WAAO,WAAW,kBAAkB,KAAK,SAAA,CAAU;AAAA,EACtD;AAAA,EAEH,gBAAgB;AACV,WAAO,WAAW,eAAe,KAAK,SAAA,CAAU;AAAA,EACnD;AACJ;AAEA,MAAM,WAAU;AAAA,EAAhB,cAAA;AACC,SAAA,QAAgB;AAAA,EAAA;AAAA,EAChB,SAAS,SAAS;AACjB,WAAO;AAAA,EACR;AAAA,EACA,WAAW,SAAS;AACnB,WAAO;AAAA,EACR;AACD;AAEA,MAAM,aAAa;AAAA;AAAA,EAElB,OAAO,cAAa;AACnB,WAAO,OAAO,gBAAgB,eAAe,OAAO,eAAe;AAAA,EACpE;AAAA;AAAA,EAEA,OAAO,aAAY;AAClB,WAAO,OAAO,eAAe;AAAA,EAC9B;AAAA;AAAA,EAEA,OAAO,OAAM;AAQZ,QAAI,OAAO,gBAAgB,aAAa;AACvC,aAAO;AAAA,IACR;AACA,QAAI,SAAS,IAAI,YAAY,CAAC;AAC9B,QAAI;AACH,aAAO,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,MAAM,kBAAA,CAAmB,EAAE,SAAS;AAAA,IACjE,SACM,GAAG;AAAA,IAAC;AAUV,WAAO;AAAA,EACR;AACD;AAEA,MAAM,WAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf,OAAO,cAAc,KAAK;AACzB,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACpC,gBAAU,OAAO,aAAa,IAAI,WAAW,CAAC,IAAI,GAAI;AAAA,IACvD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,kBAAkB,KAAK;AAC7B,QAAI,CAAC,aAAa,YAAY;AAC7B,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC9D;AACA,QAAI,SAAS,IAAI,YAAY,IAAI,MAAM;AACvC,QAAI,aAAa,IAAI,WAAW,MAAM;AACtC,aAAQ,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,iBAAW,CAAC,IAAI,IAAI,WAAW,CAAC;AAAA,IACjC;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,eAAe,KAAI;AACzB,WAAO,IAAI,YAAY,IAAI,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,kBAAkB,OAAO;AAC/B,QAAI,CAAC,aAAa,YAAY;AAC7B,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC9D;AACA,QAAI,SAAS;AACb,aAAQ,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAU,OAAO,aAAa,MAAM,CAAC,CAAC;AAAA,IACvC;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAY,KAAK;AACvB,QAAI,CAAC,aAAa,MAAM;AACvB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACxD;AAEA,QAAI,SAAS,KAAK,eAAe,GAAG;AACpC,QAAI;AAEH,aAAO,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,MAAM,mBAAmB;AAAA,IACtD,SACM,GAAG;AAAA,IAAC;AAYV,UAAM,IAAI,MAAM,iCAAiC;AAAA,EAClD;AACD;AAEA,MAAM,eAAN,MAAM,aAAW;AAAA,EAIhB,OAAO,OAAO,OAAO;AACpB,QAAI,SAAS;AACb,QAAI,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM;AACxC,QAAI,IAAI;AAER,WAAO,IAAI,MAAM,QAAQ;AACxB,aAAO,MAAM,WAAW,GAAG;AAC3B,aAAO,MAAM,WAAW,GAAG;AAC3B,aAAO,MAAM,WAAW,GAAG;AAE3B,aAAO,QAAQ;AACf,cAAS,OAAO,MAAM,IAAM,QAAQ;AACpC,cAAS,OAAO,OAAO,IAAM,QAAQ;AACrC,aAAO,OAAO;AAEd,UAAI,MAAM,IAAI,GAAG;AAChB,eAAO,OAAO;AAAA,MACf,WAAW,MAAM,IAAI,GAAG;AACvB,eAAO;AAAA,MACR;AAEA,eAAS,SACR,KAAK,QAAQ,OAAO,IAAI,IAAI,KAAK,QAAQ,OAAO,IAAI,IACpD,KAAK,QAAQ,OAAO,IAAI,IAAI,KAAK,QAAQ,OAAO,IAAI;AAAA,IACtD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,OAAO,OAAO;AACpB,QAAI,SAAS;AACb,QAAI,MAAM,MAAM;AAChB,QAAI,MAAM,MAAM,MAAM;AACtB,QAAI,IAAI;AAER,YAAQ,MAAM,QAAQ,uBAAuB,EAAE;AAE/C,WAAO,IAAI,MAAM,QAAQ;AACxB,aAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO,GAAG,CAAC;AAC7C,aAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO,GAAG,CAAC;AAC7C,aAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO,GAAG,CAAC;AAC7C,aAAO,KAAK,QAAQ,QAAQ,MAAM,OAAO,GAAG,CAAC;AAE7C,aAAQ,QAAQ,IAAM,QAAQ;AAC9B,cAAS,OAAO,OAAO,IAAM,QAAQ;AACrC,cAAS,OAAO,MAAM,IAAK;AAE3B,eAAS,SAAS,OAAO,aAAa,IAAI;AAE1C,UAAI,QAAQ,IAAI;AACf,iBAAS,SAAS,OAAO,aAAa,IAAI;AAAA,MAC3C;AACA,UAAI,QAAQ,IAAI;AACf,iBAAS,SAAS,OAAO,aAAa,IAAI;AAAA,MAC3C;AAAA,IAED;AACA,WAAO;AAAA,EACR;AACD;AA7DC,aAAO,UAAkB;AAF1B,IAAM,cAAN;ACjsBO,MAAM,QAAO;AAAA,EAOnB,cAAa;AANb,SAAO,QAAe;AACtB,SAAO,WAAqB,IAAI,SAAS,KAAK;AAC9C,SAAO,OAAa;AACpB,SAAO,QAAmB;AAC1B,SAAO,QAAoB;AAAA,EAEb;AAAA,EACd,SAAS,QAAQ;AAChB,SAAK,WAAW,IAAI,SAAS,MAAM;AAAA,EACpC;AAAA,EAEA,YAAY,SAAO,OAAM;AAAC,WAAO,IAAI,SAAS,MAAM;AAAA,EAAC;AAAA,EACrD,SAAS,MAAK;AAAC,WAAO,IAAI,MAAM,IAAI;AAAA,EAAC;AAAA,EACrC,QAAQ,OAAO,MAAM,QAAQ,MAAK;AAAC,WAAO,IAAI,KAAK,MAAM,KAAK;AAAA,EAAC;AAAA,EAC/D,SAAS,SAAS,GAAG,WAAW,GAAE;AAAC,WAAO,IAAI,UAAU,QAAQ,QAAQ;AAAA,EAAC;AAAA,EACzE,SAAS,UAAU,UAAU,SAAS,SAAQ;AAAC,WAAO,IAAI,WAAW,UAAU,UAAU,SAAS,OAAO;AAAA,EAAC;AAAA,EAE1G,KAAK,OAAO,aAAY;AAAC,WAAO,IAAI,WAAW,KAAK,UAAU,IAAI;AAAA,EAAC;AAAA,EAEnE,OAAO,gBAAgB,KAAK,OAAO,eAAc;AAChD,QAAI,UAAU,SAAS,IAAI,MAAM,MAAK;AACrC,UAAG,GAAG,WAAW,GAAE;AAClB,YAAG,QAAQ,GAAE;AACZ,iBAAO;AAAA,QACR,WAAS,QAAQ,GAAG,UAAQ,GAAE;AAC7B,iBAAO;AAAA,QACR,OAAK;AACJ,iBAAO;AAAA,QACR;AAAA,MACD,WAAS,GAAG,WAAW,GAAE;AACxB,YAAG,QAAQ,GAAE;AACZ,iBAAO;AAAA,QACR,WAAS,QAAQ,GAAG,UAAQ,GAAE;AAC7B,iBAAO;AAAA,QACR,OAAK;AACJ,iBAAO;AAAA,QACR;AAAA,MACD,OAAK;AACJ,YAAG,QAAQ,GAAE;AACZ,cAAG,QAAQ,GAAE;AACZ,mBAAO;AAAA,UACR,WAAS,QAAQ,GAAG,UAAQ,GAAE;AAC7B,mBAAO;AAAA,UACR,OAAK;AACJ,mBAAO;AAAA,UACR;AAAA,QACD,WAAS,QAAQ,GAAG,UAAQ,GAAE;AAC7B,cAAG,QAAQ,GAAE;AACZ,mBAAO;AAAA,UACR,WAAS,QAAQ,GAAG,UAAQ,GAAE;AAC7B,mBAAO;AAAA,UACR,OAAK;AACJ,mBAAO;AAAA,UACR;AAAA,QACD,OAAK;AACJ,cAAG,QAAQ,GAAE;AACZ,mBAAO;AAAA,UACR,WAAS,QAAQ,GAAG,UAAQ,GAAE;AAC7B,mBAAO;AAAA,UACR,OAAK;AACJ,mBAAO;AAAA,UACR;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,QAAI,cAAc,SAAS,KAAI;AAC9B,UAAG,OAAO,QAAQ,YAAa,QAAO;AACtC,UAAG,IAAI,UAAU,EAAG,QAAO;AAC3B,UAAI;AACJ,WAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAI;AAC9B,YAAG,OAAO,IAAI,CAAC,KAAK,YAAa,QAAO;AAAA,MACzC;AACA,aAAO;AAAA,IACR;AACA,QAAI,UAAU,SAAS,GAAE;AACxB,UAAI,IAAI,EAAE,KAAA;AACV,UAAI,IAAI,EAAE,QAAQ,KAAK,GAAG;AAC1B,UAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC,CAAC,KAAK,KAAK,OAAO,WAAW,CAAC;AACjE,YAAI,OAAO,WAAW,CAAC,IAAI,KAAc,QAAO,OAAO,WAAW,CAAC;AAAA,oBACvD,IAAI;AAAA,UACZ,QAAO;AAAA,IACb;AACA,QAAI,SAAS,SAASC,MAAI;AACzB,UAAIC,SAAQ,CAAA;AACZD,WAAI,QAAS,CAAA,MAAK;AACjB,YAAG,EAAE,WAAW,SAAS;AACxB,cAAIE,SAAQ,EAAC,MAAM,SAAS,MAAM,GAAG,OAAO,CAAA,GAAI,OAAO,CAAA,GAAI,MAAM,MAAM,aAAa,CAAA,EAAC;AACrF,cAAI,KAAK,CAAA;AACT,cAAIC,OAAM;AACV,cAAG,EAAE,cAAc,OAAO,MAAM;AAChC,cAAE,cAAc,OAAO,EAAE,iBAAiB,IAAI,EAAE,QAAQ,CAAA,OAAM;AAC7DD,qBAAM;AACN,kBAAG,OAAO,GAAGC,IAAG,MAAM,YAAa,IAAGA,IAAG,IAAI,CAAA;AAC7C,kBAAG,OAAOD,OAAM,MAAMC,IAAG,MAAM,YAAaD,QAAM,MAAMC,IAAG,IAAI,CAAA;AAC/D,iBAAG,iBAAiB,IAAI,EAAE,QAAQ,CAAA,OAAM;AACvC,oBAAI,MAAM,YAAY,GAAGA,IAAG,CAAC;AAC7B,mBAAGA,IAAG,EAAE,GAAG,IAAI,QAAQ,GAAG,SAAS;AACnC,oBAAG,GAAG,WAAW,GAAE;AAClBD,yBAAM,YAAY,MAAI,CAAC,IAAI,GAAG,cAAc;AAC5C,sBAAGA,OAAM,YAAY,MAAI,CAAC,IAAI,EAAGA,QAAM,YAAY,MAAI,CAAC,IAAI;AAAA,gBAC7D;AACA,oBAAG,GAAG,UAAU,KAAK,GAAG,UAAU,GAAE;AACnCA,yBAAM,MAAM,KAAK,CAAE,MAAI,GAAIC,OAAI,GAAI,MAAI,GAAG,SAAUA,OAAI,GAAG,OAAQ,CAAC;AACpE,2BAAQ,OAAO,GAAG,OAAO,GAAG,SAAS,QAAO;AAE3C,6BAAQ,OAAO,GAAG,OAAO,GAAG,SAAS,QAAO;AAC3C,0BAAG,OAAOD,OAAM,MAAMC,OAAI,IAAI,MAAM,YAAaD,QAAM,MAAMC,OAAI,IAAI,IAAI,MAAA;AACzED,6BAAM,MAAMC,OAAI,IAAI,EAAE,MAAI,IAAI,IAAI,QAAQ,IAAI,MAAM,IAAI;AACxD,0BAAG,QAAM,GAAE;AACV,4BAAG,QAAQ,EAAG;AAAA,sBACf,OAAK;AACJ,4BAAG,OAAO,GAAGA,OAAI,IAAI,MAAM,YAAa,IAAGA,OAAI,IAAI,IAAI,MAAA;AAAA,sBACxD;AACA,yBAAGA,OAAI,IAAI,EAAE,MAAI,IAAI,IAAI;AAAA,oBAC1B;AAAA,kBACD;AAAA,gBACD,OAAK;AACJD,yBAAM,MAAMC,IAAG,EAAE,GAAG,IAAI;AAAA,gBACzB;AAAA,cACD,CAAC;AACDA;AAAAA,YACD,CAAC;AACD,cAAG,EAAE,cAAc,OAAO,MAAM;AAChC,cAAE,cAAc,OAAO,EAAE,iBAAiB,IAAI,EAAE,QAAQ,CAAA,OAAM;AAC7D,kBAAG,OAAO,GAAGA,IAAG,MAAM,YAAa,IAAGA,IAAG,IAAI,CAAA;AAC7C,kBAAG,OAAOD,OAAM,MAAMC,IAAG,MAAM,YAAaD,QAAM,MAAMC,IAAG,IAAI,CAAA;AAC/D,iBAAG,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,OAAO;AAC7C,oBAAI,MAAM,YAAY,GAAGA,IAAG,CAAC;AAC7B,mBAAGA,IAAG,EAAE,GAAG,IAAI,QAAQ,GAAG,SAAS;AACnC,oBAAG,GAAG,WAAW,GAAE;AAClBD,yBAAM,YAAY,MAAI,CAAC,IAAI,GAAG,cAAc;AAC5C,sBAAGA,OAAM,YAAY,MAAI,CAAC,IAAI,EAAGA,QAAM,YAAY,MAAI,CAAC,IAAI;AAAA,gBAC7D;AACA,oBAAG,GAAG,UAAU,KAAK,GAAG,UAAU,GAAE;AACnCA,yBAAM,MAAM,KAAK,CAAE,MAAI,GAAIC,OAAI,GAAI,MAAI,GAAG,SAAUA,OAAI,GAAG,OAAQ,CAAC;AACpE,2BAAQ,OAAO,GAAG,OAAO,GAAG,SAAS,QAAO;AAE3C,6BAAQ,OAAO,GAAG,OAAO,GAAG,SAAS,QAAO;AAC3C,0BAAG,OAAOD,OAAM,MAAMC,OAAI,IAAI,MAAM,YAAaD,QAAM,MAAMC,OAAI,IAAI,IAAI,MAAA;AACzED,6BAAM,MAAMC,OAAI,IAAI,EAAE,MAAI,IAAI,IAAI,QAAQ,IAAI,MAAM,IAAI;AACxD,0BAAG,QAAM,GAAE;AACV,4BAAG,QAAM,EAAG;AAAA,sBACb,OAAK;AACJ,4BAAG,OAAO,GAAGA,OAAI,IAAI,MAAM,YAAa,IAAGA,OAAI,IAAI,IAAI,MAAA;AAAA,sBACxD;AACA,yBAAGA,OAAI,IAAI,EAAE,MAAI,IAAI,IAAI;AAAA,oBAC1B;AAAA,kBACD;AAAA,gBACD,OAAK;AACJD,yBAAM,MAAMC,IAAG,EAAE,GAAG,IAAI;AAAA,gBACzB;AAAA,cACD,CAAC;AACDA;AAAAA,YACD,CAAC;AACDD,iBAAM,OAAO;AACbD,iBAAM,KAAKC,MAAK;AAAA,QACjB,WAAU,EAAE,WAAW,MAAM;AAC5BD,iBAAM,KAAK,EAAC,MAAM,QAAQ,MAAM,IAAI,MAAM,CAAA,GAAG;AAAA,QAC9C,WAAS,EAAE,WAAW,SAAS,GAAE;AAChC,iBAAO,EAAE,UAAU,EAAE,QAAQ,CAAA,MAAG;AAACA,mBAAM,KAAK,CAAC;AAAA,UAAE,CAAC;AAAA,QACjD,WACQ,EAAE,WAAW,WAAW,EAAE,cAAc,QAAU;AACzD,cAAI,OAAO,EAAC,MAAM,QAAQ,MAAM,EAAE,WAAW,MAAM,GAAC;AAQpDA,iBAAM,KAAK,IAAI;AAAA,QAChB,WAAS,EAAE,WAAW,SAAQ;AAC7B,cAAI,OAAO,EAAC,MAAM,QAAQ,MAAM,EAAE,aAAa,MAAM,GAAC;AACtDA,iBAAM,KAAK,IAAI;AAAA,QAChB;AAAA,MACD,CAAC;AACD,aAAOA;AAAAA,IACR;AAEA,UAAM,iBAAiB,SAAS,KAAS;AACxC,UAAI,OAAO,QAAQ,YAAa,QAAO;AACvC,UAAI,QAAQ,KAAM,QAAO;AACzB,aAAO,OAAO,UAAU,SAAS,KAAK,GAAG,EAAE,MAAM,oBAAoB,EAAE,CAAC;AAAA,IACzE;AACA,QAAI,QAAQ,CAAA;AAIZ,QAAG,eAAe,GAAG,KAAK,YAAW;AACpC,cAAQ,OAAO,GAAG;AAAA,IACnB,OAAK;AACJ,cAAQ,OAAO,IAAI,UAAU;AAAA,IAC9B;AAEA,QAAI,MAAe,IAAI,QAAA;AACvB,QAAI,SAAS,YAAY,QAAQ;AACjC,QAAI,MAAM;AACV,QAAI,UAAU;AACd,QAAI,aAAa,CAAA;AACjB,UAAM,QAAS,CAAA,SAAQ;AACtB,UAAG,KAAK,QAAQ,QAAO;AACtB,aAAK,KAAK,MAAM,IAAI,EAAE,QAAQ,CAAA,SAAQ;AACrC,cAAI,SAAS,QAAQ,GAAG,KAAK,IAAI;AACjC;AAAA,QACD,CAAC;AAAA,MACF;AACA,UAAG,KAAK,QAAQ,SAAQ;AACvB,YAAI,QAAQ,IAAI,SAAS,MAAM,CAAC,EAAE,UAAA;AAClC,YAAG,CAAC,SAAQ;AACX,kBAAQ,iBAAA,EAAmB,QAAQ,CAAA,OAAM;AACxC,uBAAW,KAAK,IAAI,SAAS,SAAS,EAAE,CAAC;AAAA,UAC1C,CAAC;AACD,kBAAQ,uBAAA,EAAyB,QAAQ,CAAA,OAAM;AAC9C,uBAAW,KAAK,IAAI,SAAS,SAAS,EAAE,CAAC;AAAA,UAC1C,CAAC;AACD,oBAAU;AAAA,QACX;AACA,aAAK,KAAK,QAAQ,CAAC,IAAI,MAAM;AAC5B,aAAG,QAAQ,CAAC,IAAI,MAAM;AACrB,gBAAI,KAAK;AACT,gBAAG,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC,KAAK,QAAU;AACvC,kBAAG,OAAO,OAAO,SAAU,MAAK,WAAW,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;AAAA,wBACtD,WAAW,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AAAA,YACtC,WAAU,OAAO,OAAO,SAAU,MAAK;AACvC,gBAAI,SAAS,QAAQ,GAAG,KAAK,IAAI,EAAE;AAAA,UACpC,CAAC;AACD;AAAA,QACD,CAAC;AACD,aAAK,MAAM,QAAS,CAAA,MAAK;AACxB,cAAI,SAAS,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK;AAAA,QACvE,CAAC;AACD,eAAO,KAAK,KAAK,WAAW,EAAE,QAAQ,CAAA,MAAK;AAC1C,cAAI,SAAS,MAAM,CAAC,EAAE,eAAe,KAAK,YAAY,CAAC,GAAG,CAAC;AAAA,QAC5D,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,mBAAkB;AACxB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAA;AAAA,MACP,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAA;AAAA,MACN,OAAO,CAAA;AAAA,MACP,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAA;AAAA,MACP,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAA;AAAA,MACN,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAA;AAAA,MACP,KAAK,CAAA;AAAA,MACL,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAA;AAAA,MACN,OAAO,CAAA;AAAA,MACP,KAAK,CAAA;AAAA,MACL,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAA;AAAA,MACN,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAA;AAAA,MACP,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAA;AAAA,MACN,OAAO,CAAA;AAAA,MACP,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,SAAK,UAAU,WAAW;AAC1B,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAA;AAAA,MACN,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,SAAK,UAAU,WAAW;AAC1B,WAAO,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EACvF;AAAA,EAEA,OAAO,yBAAwB;AAC9B,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,WAAW;AACf,QAAI,UAAU,WAAW;AACzB,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAA;AAAA,MACP,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAA;AAAA,MACN,OAAO,CAAA;AAAA,MACP,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAA;AAAA,MACP,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAA;AAAA,MACN,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAA;AAAA,MACP,KAAK,CAAA;AAAA,MACL,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAA;AAAA,MACN,OAAO,CAAA;AAAA,MACP,KAAK,CAAA;AAAA,MACL,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAA;AAAA,MACN,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,MAAM,IAAI,UAAA;AACd,QAAI,SAAS;AAAA,MACZ,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAA;AAAA,MACP,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,QAAI,UAAU,WAAW;AACzB,QAAI,WAAW;AACf,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAA;AAAA,MACN,OAAO,CAAA;AAAA,MACP,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,SAAK,UAAU,WAAW;AAC1B,SAAK,WAAW;AAChB,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAA;AAAA,MACN,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,SAAK,WAAW;AAChB,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAC,QAAQ,gBAAgB;AAAA,MAC9B,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,SAAK,WAAW;AAChB,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,SAAK,WAAW;AAChB,QAAI,OAAO,IAAI,UAAA;AACf,SAAK,SAAS;AAAA,MACb,MAAM,CAAC,QAAQ,gBAAgB;AAAA,MAC/B,OAAO,CAAC,QAAQ,gBAAgB;AAAA,MAChC,KAAK,CAAA;AAAA,MACL,QAAQ,CAAC,QAAQ,gBAAgB;AAAA,MACjC,UAAU,CAAA;AAAA,IAAC;AAEZ,SAAK,WAAW;AAChB,SAAK,UAAU,WAAW;AAC1B,WAAO,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EACvF;AACD;AAEA,MAAM,UAAS;AAAA,EAwBd,YAAY,SAAS,GAAG,WAAW,GAAE;AAvBrC,SAAA,OAAO;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM,CAAA;AAAA,IAAC;AAER,SAAA,SAAS;AAAA,MACR,MAAM,CAAA;AAAA,MACN,OAAO,CAAA;AAAA,MACP,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAEZ,SAAA,OAAO;AAAA,MACN,aAAa;AAAA,IAAA;AAEd,SAAA,YAAY;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,IAAA;AAKV,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EACjB;AAAA,EAEA,aAAY;AACX,QAAI,MAAM;AACV,WAAO,cAAY,KAAK,KAAK,KAAG;AAChC,WAAO,iBAAe,KAAK,KAAK,QAAM;AACtC,WAAO,gBAAc,KAAK,KAAK,OAAK;AACpC,WAAO;AACP,SAAK,KAAK,KAAK,QAAQ,CAAA,QAAO;AAC7B,aAAO,MAAI,MAAI;AAAA,IAChB,CAAC;AACD,WAAO;AACP,WAAO;AAAA,EACR;AAAA,EAEA,eAAc;AACb,QAAI,MAAM;AACV,QAAG,KAAK,OAAO,KAAK,UAAU,GAAE;AAC/B,aAAO;AAAA,IACR,OAAK;AACJ,aAAO,kBAAgB,KAAK,OAAO,KAAK,CAAC,IAAE;AAC3C,aAAO,YAAU,KAAK,OAAO,KAAK,CAAC,IAAE;AACrC,aAAO;AAAA,IACR;AACA,QAAG,KAAK,OAAO,MAAM,UAAU,GAAE;AAChC,aAAO;AAAA,IACR,OAAK;AACJ,aAAO,mBAAiB,KAAK,OAAO,MAAM,CAAC,IAAE;AAC7C,aAAO,YAAU,KAAK,OAAO,MAAM,CAAC,IAAE;AACtC,aAAO;AAAA,IACR;AACA,QAAG,KAAK,OAAO,IAAI,UAAU,GAAE;AAC9B,aAAO;AAAA,IACR,OAAK;AACJ,aAAO,iBAAe,KAAK,OAAO,IAAI,CAAC,IAAE;AACzC,aAAO,YAAU,KAAK,OAAO,IAAI,CAAC,IAAE;AACpC,aAAO;AAAA,IACR;AACA,QAAG,KAAK,OAAO,OAAO,UAAU,GAAE;AACjC,aAAO;AAAA,IACR,OAAK;AACJ,aAAO,oBAAkB,KAAK,OAAO,OAAO,CAAC,IAAE;AAC/C,aAAO,YAAU,KAAK,OAAO,OAAO,CAAC,IAAE;AACvC,aAAO;AAAA,IACR;AACA,QAAG,KAAK,OAAO,SAAS,UAAU,GAAE;AACnC,aAAO;AAAA,IACR,OAAK;AACJ,aAAO,sBAAoB,KAAK,OAAO,SAAS,CAAC,IAAE;AACnD,aAAO,YAAU,KAAK,OAAO,SAAS,CAAC,IAAE;AACzC,aAAO;AAAA,IACR;AACA,WAAO;AACP,WAAO;AAAA,EACR;AAAA,EAEA,aAAY;AAAA,EAEZ;AAAA,EAEA,YAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,kBAAiB;AAChB,WAAO,KAAK,UAAU,eAAe,QAAQ,KAAK,UAAU,aAAa,QAAQ,KAAK,UAAU,aAAa;AAAA,EAC9G;AAAA,EAEA,OAAO,KAAI;AACV,SAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACxB;AAAA,EAEA,cAAa;AACZ,QAAI,MAAM,KAAK,KAAK,KAAK;AACzB,WAAO,KAAK,KAAK,QAAQ;AACzB,WAAO,KAAK,KAAK,OAAO;AACxB,SAAK,KAAK,KAAK,QAAQ,CAAA,QAAO;AAAC,aAAO,MAAM;AAAA,IAAM,CAAC;AACnD,WAAO,OAAO,GAAG;AAAA,EAClB;AAAA,EAEA,gBAAwB;AACvB,QAAI,MAAM,KAAK,OAAO,IAAI,CAAC,IAAI;AAC/B,WAAO,KAAK,OAAO,IAAI,CAAC,IAAI;AAC5B,WAAO,KAAK,OAAO,KAAK,CAAC,IAAI;AAC7B,WAAO,KAAK,OAAO,KAAK,CAAC,IAAI;AAC7B,WAAO,KAAK,OAAO,MAAM,CAAC,IAAI;AAC9B,WAAO,KAAK,OAAO,MAAM,CAAC,IAAI;AAC9B,WAAO,KAAK,OAAO,OAAO,CAAC,IAAI;AAC/B,WAAO,KAAK,OAAO,OAAO,CAAC,IAAI;AAC/B,WAAO,KAAK,OAAO,SAAS,CAAC,IAAI;AACjC,WAAO,KAAK,OAAO,SAAS,CAAC,IAAI;AACjC,WAAO,OAAO,GAAG;AAAA,EAClB;AAAA,EAEA,cAAa;AACZ,QAAI,MAAM,KAAK,KAAK,cAAc;AAClC,WAAO,OAAO,GAAG;AAAA,EAClB;AAAA,EAEA,UAAS;AACR,QAAI,MAAM,KAAK,KAAK,KAAK;AACzB,WAAO,KAAK,KAAK,QAAQ;AACzB,WAAO,KAAK,KAAK,OAAO;AACxB,SAAK,KAAK,KAAK,QAAQ,CAAA,QAAO;AAAC,aAAO,MAAM;AAAA,IAAM,CAAC;AACnD,WAAO,KAAK,OAAO,IAAI,CAAC,IAAI;AAC5B,WAAO,KAAK,OAAO,IAAI,CAAC,IAAI;AAC5B,WAAO,KAAK,OAAO,KAAK,CAAC,IAAI;AAC7B,WAAO,KAAK,OAAO,KAAK,CAAC,IAAI;AAC7B,WAAO,KAAK,OAAO,MAAM,CAAC,IAAI;AAC9B,WAAO,KAAK,OAAO,MAAM,CAAC,IAAI;AAC9B,WAAO,KAAK,OAAO,OAAO,CAAC,IAAI;AAC/B,WAAO,KAAK,OAAO,OAAO,CAAC,IAAI;AAC/B,WAAO,KAAK,OAAO,SAAS,CAAC,IAAI;AACjC,WAAO,KAAK,OAAO,SAAS,CAAC,IAAI;AACjC,WAAO,KAAK,KAAK,cAAc;AAC/B,WAAO,KAAK,WAAW;AACvB,QAAI,MAAM,KAAK,UAAU,eAAe,OAAM,KAAK,UAAU,aAAa;AAC1E,WAAO,MAAM;AACb,QAAI,MAAM,KAAK,UAAU,aAAa,OAAM,KAAK,UAAU,WAAW;AACtE,WAAO,MAAM;AACb,QAAI,MAAM,KAAK,UAAU,aAAa,OAAM,KAAK,UAAU,WAAW;AACtE,WAAO,MAAM;AACb,WAAO,OAAO,GAAG;AAAA,EAClB;AACD;AAEA,MAAM,SAAQ;AAAA,EAMb,YAAY,SAAS,OAAM;AAL3B,SAAA,QAAsB,CAAA;AACtB,SAAA,YAA2B,CAAA;AAC3B,SAAA,YAA8B,CAAC,IAAI,UAAU,CAAC,GAAG,IAAI,UAAU,GAAG,GAAG,CAAC;AACtE,SAAA,YAAoB;AACpB,SAAA,SAAiB;AAEhB,SAAK,SAAS;AAAA,EACf;AAAA,EAEA,YAAY,MAAK;AAChB,SAAK,MAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC/B,SAAK,UAAU,KAAK,IAAI;AACxB,WAAO,KAAK,MAAM,SAAO;AAAA,EAC1B;AAAA,EAEA,cAAc,MAAK;AAClB,WAAO,KAAK,QAAQ,IAAI;AAAA,EACzB;AAAA,EAEA,eAAc;AACb,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,WAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,OAAO,YAAY,MAAM,MAAK;AAC7B,WAAO,KAAK,MAAM,UAAU,EAAE,OAAO,GAAG;AAAA,EACzC;AAAA,EAEA,QAAQ,YAAY,UAAU,MAAM,QAAQ,MAAK;AAChD,QAAG,OAAO,UAAU,KAAK,EAAG,SAAQ,KAAK,UAAU,KAAK;AACxD,SAAK,MAAM,UAAU,EAAE,QAAQ,UAAU,MAAM,KAAK;AAAA,EACrD;AAAA,EAEA,eAAc;AACb,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,YAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,SAAS,OAAM;AACd,UAAM,SAAS,KAAK;AACpB,SAAK;AACL,SAAK,UAAU,KAAK,KAAK;AACzB,WAAO,MAAM;AAAA,EACd;AACD;AAEA,MAAM,MAAK;AAAA,EASV,YAAY,MAAK;AARjB,SAAA,OAAO,CAAA;AACP,SAAA,UAAU;AACV,SAAA,SAAS;AACT,SAAA,SAAS,CAAA;AACT,SAAA,aAAa,CAAA;AACb,SAAA,OAAO;AACP,SAAA,cAA6B,CAAA;AAG5B,SAAK,OAAO;AAAA,EACb;AAAA,EAEA,UAAS;AACR,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,UAAS;AACR,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,YAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,YAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,YAAW;AACV,WAAO,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,OAAO,MAAM,MAAK;AACjB,QAAG,QAAQ,KAAM,MAAK,KAAK,KAAK,OAAO,IAAI;AAAA,cACjC,KAAK,KAAK,OAAO,IAAI,IAAI,IAAA;AACnC,SAAK;AACL,WAAO,KAAK,UAAQ;AAAA,EACrB;AAAA,EAEA,QAAQ,UAAU,MAAM,QAAQ,MAAK;AACpC,WAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,kBAAkB,OAAA;AACtD,SAAK,KAAK,QAAQ,EAAE,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC;AAC9C,QAAG,KAAK,KAAK,QAAQ,EAAE,SAAS,KAAK,OAAQ,MAAK,SAAS,KAAK,KAAK,QAAQ,EAAE;AAAA,EAChF;AAAA,EAEA,UAAU,UAAU,UAAU,SAAS,SAAQ;AAC9C,QAAI,MAAM,IAAI,WAAW,UAAU,UAAU,SAAS,OAAO;AAC7D,SAAK,OAAO,KAAK,GAAG;AAAA,EACrB;AAAA,EAEA,eAAe,GAAG,GAAE;AACnB,SAAK,YAAY,CAAC,IAAI;AAAA,EACvB;AACD;AAEA,MAAM,IAAG;AAAA,EAKR,cAAa;AAJb,SAAA,QAAQ,CAAA;AACR,SAAA,SAAS;AACT,SAAA,WAAW;AAAA,EAGX;AAAA,EAEA,KAAK,MAAK;AACT,SAAK,MAAM,KAAK,QAAQ,IAAI;AAC5B,SAAK;AACL,SAAK;AAAA,EACN;AAAA,EAEA,aAAY;AACX,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,WAAU;AACT,WAAO,KAAK;AAAA,EACb;AACD;AAEA,MAAM,KAAI;AAAA,EAIT,YAAY,OAAO,MAAM,QAAQ,MAAK;AAHtC,SAAA,OAAO;AACP,SAAA,QAAQ;AAGP,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACd;AAAA,EAEA,WAAU;AACT,WAAO,CAAC,KAAK,QAAQ,KAAK,QAAQ,CAAC,KAAK,eAAA;AAAA,EACzC;AAAA,EAEA,iBAAgB;AACf,WAAO,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,OAAO,EAAE,KAAK;AAAA,EACjE;AAAA,EAEA,SAAQ;AACP,WAAO,KAAK,QAAQ,MAAM,KAAK,SAAS;AAAA,EACzC;AAAA,EAEA,cAAa;AACZ,QAAG,KAAK,UAAQ,aAAa,KAAK,SAAA,IAAY,IAAI;AAClD,WAAO,KAAK,MAAM,UAAA;AAAA,EACnB;AAAA,EAEA,UAAS;AACR,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,QAAQ,MAAK;AACZ,QAAG,CAAC,QAAQ,MAAK;AAChB,WAAK,OAAO,CAAC;AAAA,IACd,OAAK;AACJ,WAAK,OAAO;AAAA,IACb;AAAA,EACD;AAAA,EAEA,SAAS,OAAM;AACd,SAAK,QAAQ;AAAA,EACd;AACD;AAEA,MAAM,WAAU;AAAA,EAEf,YAAY,UAAU,UAAU,SAAS,SAAQ;AAChD,SAAK,OAAO,CAAC,UAAU,UAAU,SAAS,OAAO;AAAA,EAClD;AAAA,EAEA,WAAU;AACT,WAAO,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,EACnC;AAAA,EAEA,UAAS;AACR,WAAO,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,EACnC;AAAA,EAEA,WAAU;AACT,WAAO,YAAY,KAAK,KAAK,CAAC,CAAC,IAAE,KAAK,KAAK,CAAC,IAAE,MAAI,YAAY,KAAK,KAAK,CAAC,CAAC,IAAE,KAAK,KAAK,CAAC;AAAA,EACxF;AACD;AAEA,MAAM,WAAW;AAAA,EAyNhB,YAAY,UAAU,OAAO,aAAY;AAxNzC,SAAA,eAA8B,IAAI,MAAA;AAClC,SAAA,YAA2B,IAAI,MAAA;AAwN9B,SAAK,eAAe,CAAA;AAEpB,QAAI,MAAM,IAAI,MAAA;AACd,QAAI,KAAK,uBAAuB,KAAK,sBAAsB,SAAS,WAAW,MAAM,CAAC;AACtF,QAAI,OAAO,OAAO;AAClB,QAAI,KAAK,eAAe,KAAK,eAAA,CAAgB;AAC7C,QAAI,OAAO,UAAU;AACrB,QAAI,KAAK,oBAAoB,KAAK,aAAa,SAAS,aAAA,CAAc,CAAC;AACvE,QAAI,KAAK,qBAAqB,KAAK,cAAc,SAAS,UAAA,CAAW,CAAC;AACtE,QAAI,OAAO,IAAI;AACf,QAAI,KAAK,mBAAmB,KAAK,kBAAkB,SAAS,aAAA,CAAc,CAAC;AAC3E,QAAI,KAAK,iBAAiB,KAAK,YAAY,SAAS,aAAA,CAAc,CAAC;AACnE,QAAI,OAAO,eAAe;AAC1B,aAAS,SAAA,EAAW,QAAQ,CAAC,OAAM,MAAI;AACtC,UAAI,KAAK,yBAAuB,IAAE,KAAG,QAAQ,KAAK,eAAe,OAAO,SAAS,aAAA,CAAc,CAAC;AAAA,IACjG,CAAC;AACD,QAAI,KAAK,wBAAwB,KAAK,uBAAA,CAAwB;AAC9D,QAAI,OAAO,UAAU;AACrB,QAAI,KAAK,8BAA8B,KAAK,sBAAsB,SAAS,WAAW,MAAM,CAAC;AAC7F,QAAI,OAAO,UAAU;AACrB,QAAI,KAAK,uBAAuB,KAAK,eAAA,CAAgB;AACrD,QAAI,UAAU,IAAI,SAAS,EAAC,MAAK,UAAS;AAC1C,SAAK,SAAS,SAAS,IAAI;AAAA,EAC5B;AAAA,EA9OA,aAAa,WAAU;AACtB,QAAI,OAAO;AAAA;AAEX,YAAQ,+HAA6H,UAAU,SAAO;AAEtJ,YAAQ,qCAAmC,UAAU,SAAO;AAC5D,cAAU,QAAQ,CAAA,SAAQ;AACzB,cAAQ,eAAa,OAAK;AAAA,IAC3B,CAAC;AACD,YAAQ;AAER,YAAQ;AAER,WAAO;AAAA,EACR;AAAA,EAEA,cAAc,SAAQ;AACrB,QAAI,OAAO;AAAA;AACX,YAAQ,iBAAiB,UAAU;AACnC,YAAQ,gDAAgD,kBAAkB;AAC1E,YAAQ;AACR,WAAO;AAAA,EACR;AAAA,EAEA,eAAe,OAAc,WAA4B;AACxD,QAAI,OAAO,MAAM,QAAA;AACjB,QAAI,OAAO;AAAA;AACX,YAAQ,wBAAsB,YAAY,MAAM,UAAA,CAAW,IAAE,MAAM,cAAY;AAC/E,YAAQ;AACR,QAAG,MAAM,YAAY,SAAS,GAAE;AAC/B,cAAQ;AACR,YAAM,YAAY,QAAQ,CAAC,GAAG,MAAM;AACnC,YAAG,OAAO,MAAM,YAAa,SAAQ,eAAgB,IAAK,YAAa,IAAK,cAAc,IAAI;AAAA,MAC/F,CAAC;AACD,cAAQ;AAAA,IACT;AACA,YAAQ;AACR,QAAI,SAAS;AACb,WAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,MAAM;AAChC,UAAI,MAAM,KAAK,CAAC;AAChB,UAAI,OAAO,IAAE,OAAO,SAAS,IAAI,YAAY;AAC7C,cAAQ,aAAW,IAAE,cAAY,IAAE,MAAI,OAAK;AAC5C,UAAI,QAAQ,IAAI,SAAA;AAChB,aAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,OAAO;AAClC,YAAI,IAAI,OAAO,SAAS,EAAE;AAC1B,YAAI,OAAO,MAAM,CAAC;AAClB,YAAG,OAAO,KAAK,QAAA,MAAc,UAAS;AACrC,kBAAQ,WAAS,YAAY,CAAC,IAAE,IAAE,UAAQ,KAAK,UAAU,QAAQ,UAAU,KAAK,YAAA,CAAa,EAAE,QAAA,CAAS,IAAE,UAAQ,KAAK,YAAU;AAAA,QAClI,WAAS,KAAK,UAAS;AACtB,kBAAQ,WAAS,YAAY,CAAC,IAAE,IAAE,UAAQ,KAAK,UAAU,QAAQ,UAAU,KAAK,YAAA,CAAa,EAAE,QAAA,CAAS,IAAE;AAAA,QAC3G,OAAK;AACJ,kBAAQ,WAAS,YAAY,CAAC,IAAE,IAAE,UAAQ,KAAK,UAAU,QAAQ,UAAU,KAAK,aAAa,EAAE,SAAS,IAAE,gBAAc,SAAO;AAC/H,eAAK,aAAa,KAAK,KAAK,QAAA,CAAS;AACrC;AAAA,QACD;AAAA,MACD,CAAC;AACD,cAAQ;AAAA,IACT,CAAC;AACD,YAAQ;AACR,QAAI,SAAS,MAAM,UAAA;AACnB,QAAG,OAAO,SAAS,GAAE;AACpB,cAAQ,wBAAsB,OAAO,SAAO;AAC5C,aAAO,QAAS,CAAC,UAAU;AAC1B,gBAAQ,qBAAmB,MAAM,SAAA,IAAW;AAAA,MAC7C,CAAC;AACD,cAAQ;AAAA,IACT;AACA,YAAQ;AAER,WAAO;AAAA,EACR;AAAA,EAEA,yBAAwB;AACvB,QAAI,OAAO;AAAA;AACX,SAAK,aAAa,QAAQ,CAAC,QAAM;AAChC,cAAQ,YAAU,MAAI;AAAA,IACvB,CAAC;AACD,YAAQ;AACR,WAAO;AAAA,EACR;AAAA,EAEA,kBAAkB,WAAU;AAC3B,QAAI,OAAO;AAAA;AACX,YAAQ;AACR,YAAQ;AACR,cAAU,QAAQ,CAAC,MAAM,MAAM;AAC9B,YAAM,KAAK,IAAE;AACb,cAAQ,kBAAgB,OAAK,gBAAc,KAAG,gBAAc,KAAG;AAAA,IAChE,CAAC;AACD,YAAQ;AACR,YAAQ;AACR,YAAQ;AACR,WAAO;AAAA,EACR;AAAA,EAEA,sBAAsB,YAAW;AAChC,QAAI,OAAO;AAAA;AACX,YAAQ;AACR,YAAQ;AACR,YAAQ;AACR,YAAQ;AACR,YAAQ;AACR,YAAQ;AACR,aAAQ,IAAE,GAAE,KAAG,YAAW;AACzB,cAAQ,6CAA2C,IAAE;AACtD,YAAQ;AACR,WAAO;AAAA,EACR;AAAA,EAEA,sBAAsB,YAAW;AAChC,QAAI,OAAO;AAAA;AACX,aAAQ,IAAI,GAAE,KAAG,YAAW,KAAI;AAC/B,cAAM,0IAAwI,IAAE;AAAA,IACjJ;AACA,YAAQ;AACR,WAAO;AAAA,EACR;AAAA,EAEA,iBAAgB;AACf,WAAO;AAAA;AAAA,EACR;AAAA,EAEA,YAAY,WAA4B;AACvC,QAAI,OAAO;AAAA;AACX,QAAI,UAAkB;AACtB,QAAI,UAAkB;AACtB,QAAI,UAAyB,CAAA;AAC7B,cAAU,QAAQ,CAAC,SAAoB;AACtC,UAAG,QAAQ,QAAQ,KAAK,YAAA,CAAa,MAAM,IAAG;AAC7C,mBAAW,KAAK,WAAA;AAChB;AACA,gBAAQ,KAAK,KAAK,aAAa;AAAA,MAChC;AAAA,IACD,CAAC;AACD,YAAQ,mBAAiB,UAAQ,OAAO,UAAU;AAElD,YAAQ;AAER,QAAI,SAAiB;AACrB,QAAI,SAAiB;AACrB,QAAI,SAAwB,CAAA;AAC5B,cAAU,QAAQ,CAAC,SAAoB;AACtC,UAAG,OAAO,QAAQ,KAAK,cAAA,CAAe,MAAM,IAAG;AAC9C,kBAAU,KAAK,aAAA;AACf;AACA,eAAO,KAAK,KAAK,eAAe;AAAA,MACjC;AAAA,IACD,CAAC;AACD,YAAQ,qBAAmB,SAAO,OAAO,SAAS;AAClD,YAAQ;AAER,QAAI,YAAoB;AACxB,QAAI,YAAoB;AACxB,QAAI,YAA2B,CAAA;AAC/B,cAAU,QAAQ,CAAC,MAAM,MAAM;AAC9B,UAAG,UAAU,QAAQ,KAAK,QAAA,CAAS,MAAM,IAAG;AAE3C,YAAI,MAAM;AACV,qBAAa,mBAAiB,MAAI,eAAc,QAAQ,QAAQ,KAAK,YAAA,CAAa,IAAG,4BAA2B,OAAO,QAAQ,KAAK,cAAA,CAAe,IAAG;AACtJ,YAAG,KAAK,mBAAkB;AACzB,uBAAa;AACb,cAAG,KAAK,UAAU,eAAe,mBAAmB,iBAAe,KAAK,UAAU,aAAW;AAC7F,cAAG,KAAK,UAAU,aAAa,mBAAmB,eAAa,KAAK,UAAU,WAAS;AACvF,cAAG,KAAK,UAAU,aAAa,KAAM,cAAa;AAClD,uBAAa;AAAA,QACd,OAAK;AACJ,uBAAa;AAAA,QACd;AACA,qBAAa;AACb;AACA,kBAAU,KAAK,KAAK,SAAS;AAAA,MAC9B;AAAA,IACD,CAAC;AACD,YAAQ,qBAAmB,YAAU,OAAO,YAAY;AACxD,SAAK,YAAY;AACjB,YAAQ;AACR,YAAQ;AACR,WAAO;AAAA,EACR;AAAA,EAEA,iBAAgB;AACf,WAAO;AAAA;AAAA,EACR;AAAA,EAEA,SAAS,MAAM,MAAK;AACnB,QAAI,IAAI,SAAS,cAAc,GAAG;AAClC,QAAI,iBAAiB,KAAK,IAAI;AAC9B,QAAI,aAAa,CAAA;AAEjB,aAAS,SAAS,GAAG,SAAS,eAAe,QAAQ,UAAU,KAAK;AACnE,UAAI,QAAQ,eAAe,MAAM,QAAQ,SAAS,GAAG;AAErD,UAAI,cAAc,IAAI,MAAM,MAAM,MAAM;AACxC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,oBAAY,CAAC,IAAI,MAAM,WAAW,CAAC;AAAA,MACpC;AAEA,UAAI,YAAY,IAAI,WAAW,WAAW;AAE1C,iBAAW,KAAK,SAAS;AAAA,IAC1B;AAEA,QAAI,OAAO,IAAI,KAAK,YAAY,EAAC,MAAM,qEAAoE;AAC3G,QAAI,MAAM,IAAI,gBAAgB,IAAI;AAClC,MAAE,OAAO;AACT,MAAE,WAAW;AACb,aAAS,KAAK,YAAY,CAAC;AAC3B,MAAE,MAAA;AACF,eAAW,WAAY;AACtB,eAAS,KAAK,YAAY,CAAC;AAC3B,aAAO,IAAI,gBAAgB,GAAG;AAAA,IAC/B,GAAG,CAAC;AAAA,EACL;AA6BD;AAEA,SAAS,gBAAe;AACvB,QAAM,wBAAQ,KAAA;AACd,QAAM,OAAO,EAAE,eAAA;AACf,QAAM,QAAQ,EAAE,YAAA,IAAgB;AAChC,QAAM,MAAM,EAAE,WAAA;AACd,QAAM,QAAQ,EAAE,YAAA;AAChB,QAAM,UAAU,EAAE,cAAA;AAClB,QAAM,UAAU,EAAE,cAAA;AAElB,SAAO,OAAO,OACX,QAAQ,IAAG,QAAQ,MAAM,SAAS,OAClC,MAAM,IAAG,MAAM,MAAM,OAAO,OAC5B,QAAQ,IAAI,QAAQ,MAAM,SAAS,OACnC,UAAU,IAAG,UAAU,MAAM,WAAW,OACxC,UAAU,IAAG,UAAU,MAAM,WAAW;AAC5C;AAEA,SAAS,YAAY,QAAe;AACnC,QAAM,MAAM,CAAC,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAG;AACpH,MAAI,UAAU,GAAI,QAAO,IAAI,SAAO,CAAC;AACrC,MAAI,MAAM;AACV,SAAO,SAAS,GAAE;AACjB,QAAI,SAAU,SAAO,KAAM;AAC3B,WAAO,IAAI,UAAU,IAAG,SAAS,EAAE;AACnC,aAAS,OAAO,UAAU,SAAO,IAAI,UAAU;AAAA,EAChD;AACA,SAAO,IAAI,MAAM,EAAE,EAAE,QAAA,EAAU,KAAK,EAAE;AACvC;AAEA,SAAS,OAAO,KAAK,OAAO,GAAU;AACrC,MAAI,KAAK,aAAa,MACpB,KAAK,aAAa;AACpB,WAAS,IAAI,GAAG,IAAI,IAAI,IAAI,QAAQ,KAAK;AACvC,SAAK,IAAI,WAAW,CAAC;AACrB,SAAK,KAAK,KAAK,KAAK,IAAI,UAAU;AAClC,SAAK,KAAK,KAAK,KAAK,IAAI,UAAU;AAAA,EACpC;AAEA,OAAK,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU,IAAI,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU;AACrF,OAAK,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU,IAAI,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU;AAErF,SAAO,cAAc,UAAU,OAAO,OAAO;AAC5C;AC9oCK,SAASG,YAAU,SAAiD;AACvE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAE5B,UAAMP,aAAY,SAAS,cAAc,KAAK;AAE9C,IAAAA,WAAU,YAAY;AAEtB,UAAM,cAA6B,MAAM,KAAKA,WAAU,iBAAiB,wCAAwC,CAAC;AAElH,QAAI,aAAa;AACb,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,kBAAY,QAAQ,CAAA,QAAO;AACvB,iBAAS,YAAY,GAAG;AAAA,MAC5B,CAAC;AACD,cAAQ,QAAQ;AAAA,IACpB,OAAO;AACH,cAAQ,IAAI;AAAA,IAChB;AAAA,EAyBJ,CAAC;AACL;ACjCA,MAAM,sBAAsB,OAAO,EAAE,SAAS,UAAU,YAAY,YAAkC;AAElG,MAAI,YAAY,UAAa,eAAe,UAAa,UAAU,QAAW;AAE1E,UAAM,YAAY,SAAS,eAAe,OAAO;AACjD,QAAI,WAAW;AACX,YAAMA,aAAY,SAAS,cAAc,KAAK;AAC9C,YAAM,gBAAgB,UAAU,UAAU,IAAI;AAC9C,MAAAA,WAAU,YAAY,aAAa;AAEnC,YAAM,OAAgB,QAAQ,gBAAgBA,UAAS;AACvD,WAAK,KAAK,GAAG,QAAQ,OAAO;AAC5B,aAAO;AAAA,IACX,OAAO;AACH,aAAO;AAAA,IACX;AAAA,EACJ,WAAW,eAAe,UAAa,UAAU,UAAa,YAAY,QAAW;AAEjF,QAAI,SAAkB;AAEtB,UAAMO,YAAU,UAAU,EAAE,KAAK,CAAC,YAAY;AAC1C,UAAI,YAAY,MAAM;AAClB,cAAM,OAAgB,QAAQ,gBAAgB,OAAO;AACrD,aAAK,KAAK,GAAG,QAAQ,OAAO;AAC5B,iBAAS;AAAA,MACb,OAAO;AACH,iBAAS;AAAA,MACb;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX,WAAW,UAAU,UAAa,eAAe,UAAa,YAAY,QAAW;AAEjF,UAAM,WAA+B,SAAS,eAAe,KAAK;AAElE,QAAI,aAAa,MAAM;AAEnB,YAAMP,aAAY,SAAS,cAAc,KAAK;AAE9C,eAAS,iBAAiB,oBAAoB,EAAE,QAAQ,CAAA,QAAO;AAC3D,cAAM,gBAAgB,IAAI,UAAU,IAAI;AACxC,QAAAA,WAAU,YAAY,aAAa;AAAA,MACvC,CAAC;AAED,YAAM,OAAgB,QAAQ,gBAAgBA,UAAS;AAEvD,WAAK,KAAK,GAAG,QAAQ,OAAO;AAE5B,aAAO;AAAA,IACX,OAAO;AACH,aAAO;AAAA,IACX;AAAA,EACJ,OAAO;AACH,WAAO;AAAA,EACX;AACJ;AChEO,SAAS,YAAY,MAA0E;AAClG,QAAM,UAAU,KAAK,UAAU,KAAA;AAC/B,QAAM,UAAU,KAAK,aAAa,SAAS,IAAI,SAAS,KAAK,aAAa,SAAS,KAAK,GAAG,IAAI;AAC/F,QAAM,UAAU,KAAK,aAAa,SAAS,IAAI,SAAS,KAAK,aAAa,SAAS,KAAK,GAAG,IAAI;AAC/F,SAAO,EAAC,SAAS,SAAS,QAAA;AAC9B;ACNO,MAAM,cAAc,CAAC,SAAyB;AACjD,SAAO,uDAAuD,IAAI;AACtE;AAEO,MAAM,kBAAkB,CAAC,SAAyB;AACrD,SAAO,uDAAuD,IAAI;AACtE;AAEO,MAAM,aAAa,CAAC,SAAyB;AAChD,SAAO,2DAA2D,IAAI;AAC1E;AAEO,MAAM,kBAAkB,MAAc;AACzC,SAAO;AACX;AAEO,MAAM,gBAAgB,MAAM;AAC/B,SAAO;AACX;AAEO,MAAM,gBAAgB,CAAC,SAAiB;AAC3C,SAAO,QAAQ,IAAI;AACvB;AAEO,MAAM,cAAc,MAAM;AAC7B,SAAO;AACX;AAEO,MAAM,cAAc,CAAC,OAAe,MAAc,UAA0B;AAE/E,QAAM,MAAgB,CAAC,aAAa;AAEpC,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC3B,QAAI,KAAK,mBAAmB,KAAK,MAAM,QAAM,IAAI,CAAC,KAAK;AAAA,EAC3D;AAEA,MAAI,KAAK,cAAc;AAEvB,SAAO,yMAAyM,IAAI,KAAK,EAAE,CAAC,GAAG,KAAK;AACxO;AAEO,MAAM,iBAAiB,CAAC,YAAoB;AAC/C,SAAO,SAAS,OAAO;AAC3B;AAEA,MAAM,gBAAgB,CAAC,SAA8B;AACjD,MAAI,UAAU;AAEd,MAAI,SAAS,QAAW;AACpB,cAAU,yHAAyH,IAAI;AAAA,EAC3I;AAEA,SAAO;AACX;AAEA,MAAM,gBAAgB,CAAC,SAA8B;AACjD,MAAI,UAAU;AAEd,MAAI,SAAS,QAAW;AACpB,cAAU,2GAA2G,IAAI;AAAA,EAC7H;AAEA,SAAO;AACX;AAEO,MAAM,wBAAwB,CAAC,MAAe,SAAkC,YAAqB;AACxG,SAAO,8CAA8C,YAAY,SAAY,sBAAsB,OAAO,QAAQ,EAAE,GAAG,YAAY,SAAY,aAAa,YAAY,YAAY,oBAAoB,kBAAkB,OAAO,EAAE,oNAAoN,cAAc,IAAI,CAAC;AAC9c;AAEO,MAAM,sBAAsB,CAAC,MAAe,SAAkC,YAAqB;AACtG,SAAO,8CAA8C,YAAY,SAAY,sBAAsB,OAAO,QAAQ,EAAE,GAAG,YAAY,SAAY,aAAa,YAAY,YAAY,oBAAoB,kBAAkB,OAAO,EAAE,gLAAgL,cAAc,IAAI,CAAC;AAC1a;ACpEO,MAAM,YAAY,CAAC,SAA0C;AAEhE,QAAM,OAAO,MAAM,KAAK,KAAK,iBAAiB,IAAI,CAAC;AAEnD,MAAI,QAAQ,KAAK,SAAS,GAAG;AAEzB,UAAM,UAA2E,CAAA;AAEjF,QAAI,YAAY;AAChB,UAAM,aAAsC,CAAA;AAE5C,UAAM,YAAoC,MAAM,KAAK,KAAK,CAAC,EAAE,iBAAiB,QAAQ,CAAC;AAEvF,QAAI,aAAa,UAAU,SAAS,GAAG;AAEnC,gBAAU,QAAQ,CAAC,SAAS;AACxB,cAAM,EAAE,QAAA,IAAY,YAAY,IAAI;AACpC,qBAAa;AAAA,MACjB,CAAC;AAAA,IACL;AAEA,aAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAChC,iBAAW,CAAC,IAAI;AAAA,IACpB;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,cAAQ,CAAC,IAAI,OAAO,OAAO,CAAA,GAAI,UAAU;AAAA,IAC7C;AAEA,UAAM,oBAAiD,CAAA;AAEvD,SAAK,QAAQ,CAAC,KAAK,SAAS;AAExB,YAAM,WAAqB,CAAA;AAE3B,aAAO,OAAO,QAAQ,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,UAAU;AACjD,YAAI,QAAQ,MAAM;AACd,mBAAS,KAAK,KAAK;AAAA,QACvB;AAAA,MACJ,CAAC;AAED,YAAM,QAAgC,MAAM,KAAK,IAAI,iBAAiB,QAAQ,CAAC;AAE/E,UAAI,eAAe;AAEnB,UAAI,SAAS,MAAM,SAAS,GAAG;AAC3B,cAAM,QAAQ,CAAC,SAAS;AAEpB,gBAAM,EAAE,SAAS,SAAS,QAAA,IAAY,YAAY,IAAI;AAEtD,gBAAM,eAAe,SAAS,MAAM,cAAc,eAAe,OAAO,EAAE,QAAA;AAC1E,cAAI,iBAAyB;AAE7B,uBAAa,IAAI,CAAC,SAAS,iBAAiB;AACxC,gBAAI,iBAAiB,aAAa,SAAS,GAAG;AAC1C,+BAAiB;AAAA,YACrB,OAAO;AACH,qBAAO,QAAQ,IAAI,EAAE,OAAO;AAAA,YAChC;AAAA,UACJ,CAAC;AAED,cAAI,UAAU,KAAK,UAAU,GAAG;AAC5B,qBAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAC9B,kBAAI,KAAK,YAAY,MAAM;AACvB,wBAAQ,OAAO,CAAC,EAAE,cAAc,IAAI,sBAAsB,QAAW,UAAU;AAAA,cACnF,WAAW,KAAK,YAAY,MAAM;AAC9B,wBAAQ,OAAO,CAAC,EAAE,cAAc,IAAI,oBAAoB,QAAW,UAAU;AAAA,cACjF;AAAA,YAEJ;AAAA,UACJ,WAAW,UAAU,KAAK,UAAU,GAAG;AACnC,qBAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAC9B,gCAAkB,OAAO,CAAC,IAAI,CAAA;AAC9B,2BAAa,IAAI,CAAC,SAAS,iBAAiB;AACxC,oBAAI,iBAAiB,aAAa,SAAS,GAAG;AAC1C,sBAAI,KAAK,YAAY,MAAM;AACvB,4BAAQ,OAAO,CAAC,EAAE,OAAO,IAAI,sBAAsB,QAAW,YAAY,OAAO;AAAA,kBACrF,WAAW,KAAK,YAAY,MAAM;AAC9B,4BAAQ,OAAO,CAAC,EAAE,OAAO,IAAI,oBAAoB,QAAW,YAAY,OAAO;AAAA,kBACnF;AAAA,gBACJ,OAAO;AACH,oCAAkB,CAAC,EAAE,KAAK,OAAO;AACjC,0BAAQ,OAAO,CAAC,EAAE,OAAO,IAAI;AAAA,gBACjC;AAAA,cACJ,CAAC;AAAA,YACL;AAAA,UACJ;AAEA,cAAI,KAAK,YAAY,MAAM;AACvB,oBAAQ,IAAI,EAAE,cAAc,IAAI,sBAAsB,SAAS,UAAU,IAAI,YAAY,QAAW,UAAU,IAAI,UAAU,MAAS;AAAA,UACzI,WAAW,KAAK,YAAY,MAAM;AAC9B,oBAAQ,IAAI,EAAE,cAAc,IAAI,oBAAoB,SAAS,UAAU,IAAI,YAAY,QAAW,UAAU,IAAI,UAAU,MAAS;AAAA,UACvI;AAEA,0BAAgB;AAAA,QACpB,CAAC;AAAA,MACL;AAAA,IACJ,CAAC;AAED,WAAO,QAAQ,iBAAiB,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACpD,YAAM,IAAI,CAAA,QAAO;AACb,eAAO,QAAQ,CAAC,GAAG,EAAE,GAAG;AAAA,MAC5B,CAAC;AAAA,IACL,CAAC;AAED,UAAM,SAAmB,CAAA;AACzB,WAAO,OAAO,OAAO,EAAE,QAAQ,CAAC,QAAQ;AACpC,aAAO,KAAK,eAAe,OAAO,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,IAC3D,CAAC;AAED,WAAO,OAAO,KAAK,EAAE;AAAA,EACzB,OAAO;AACH,WAAO;AAAA,EACX;AACJ;ACjHO,MAAM,qBAAqB,CAAC,KAAc,UAAkB;AAE/D,QAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,QAAM,QAAQ,IAAI,cAAc,OAAO;AAEvC,MAAI,WAAW;AACf,MAAI,WAAW;AAEf,MAAI,UAAU,MAAM;AAChB,eAAW,UAAU,KAAK;AAAA,EAC9B;AAEA,MAAI,UAAU,MAAM;AAChB,eAAW,UAAU,KAAK;AAAA,EAC9B;AAEA,MAAI,YAAY;AAEhB,MAAI,UAAU,MAAM;AAChB,UAAM,OAAO,MAAM,iBAAiB,IAAI;AACxC,QAAI,QAAQ,KAAK,SAAS,GAAG;AAEzB,YAAM,WAAgB,KAAK,CAAC,EAAE,iBAAiB,QAAQ;AAEvD,UAAI,YAAY,SAAS,SAAS,GAAG;AACjC,cAAM,YAAoC,MAAM,KAAK,QAAQ;AAE7D,kBAAU,QAAQ,CAAC,SAAS;AACxB,gBAAM,EAAE,QAAA,IAAY,YAAY,IAAI;AACpC,uBAAa;AAAA,QACjB,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ,WAAW,UAAU,MAAM;AACvB,UAAM,OAAO,MAAM,iBAAiB,IAAI;AACxC,QAAI,QAAQ,KAAK,SAAS,GAAG;AAEzB,YAAM,WAAgB,KAAK,CAAC,EAAE,iBAAiB,QAAQ;AAEvD,UAAI,YAAY,SAAS,SAAS,GAAG;AACjC,cAAM,YAAoC,MAAM,KAAK,QAAQ;AAE7D,kBAAU,QAAQ,CAAC,SAAS;AACxB,gBAAM,EAAE,QAAA,IAAY,YAAY,IAAI;AACpC,uBAAa;AAAA,QACjB,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,YAAY,WAAW,UAAU,WAAW,KAAK;AAE5D;ACxDO,MAAM,eAAe,MAAM;AAC9B,SAAO;AACX;ACFO,MAAM,OAAO,MAAM;AACtB,SAAO;AAAA;AAEX;ACHO,MAAM,MAAM,MAAM;AACrB,SAAO;AACX;ACFO,MAAM,kBAAkB,MAAM;AACjC,SAAO;AACX;ACFO,MAAM,YAAY,MAAM;AAE3B,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6CX;AC/CO,MAAM,WAAW,MAAM;AAC1B,SAAO;AACX;ACFO,MAAMQ,aAAW,CACpB,MACA,SAAoC,MACpC,cAAwC,eACvC;AAED,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI,MAAM;AACV,MAAIC,SAAQ;AACZ,MAAI,SAAS;AACb,MAAIhB,QAAO;AACX,QAAM,SAAS;AACf,QAAM,SAAS;AAEf,UAAQ,QAAA;AAAA,IAEJ,KAAK;AACD,cAAQ,gBAAgB,cAAc,QAAQ;AAC9C,eAAS,gBAAgB,cAAc,QAAQ;AAC/C,YAAM,gBAAgB,cAAc,OAAO;AAC3C,MAAAgB,SAAQ,gBAAgB,cAAc,MAAM;AAC5C,eAAS,gBAAgB,cAAc,OAAO;AAC9C,MAAAhB,QAAO,gBAAgB,cAAc,OAAO;AAC5C;AAAA,IACJ,KAAK;AACD,cAAQ,gBAAgB,cAAc,QAAQ;AAC9C,eAAS,gBAAgB,cAAc,QAAQ;AAC/C,YAAM,gBAAgB,cAAc,OAAO;AAC3C,MAAAgB,SAAQ,gBAAgB,cAAc,MAAM;AAC5C,eAAS,gBAAgB,cAAc,OAAO;AAC9C,MAAAhB,QAAO,gBAAgB,cAAc,OAAO;AAC5C;AAAA,IACJ,KAAK;AACD,cAAQ,gBAAgB,cAAc,QAAQ;AAC9C,eAAS,gBAAgB,cAAc,QAAQ;AAC/C,YAAM,gBAAgB,cAAc,OAAO;AAC3C,MAAAgB,SAAQ,gBAAgB,cAAc,OAAO;AAC7C,eAAS,gBAAgB,cAAc,OAAO;AAC9C,MAAAhB,QAAO,gBAAgB,cAAc,OAAO;AAC5C;AAAA,IACJ,KAAK;AACD,cAAQ,gBAAgB,cAAc,QAAQ;AAC9C,eAAS,gBAAgB,cAAc,QAAQ;AAC/C,YAAM,gBAAgB,cAAc,OAAO;AAC3C,MAAAgB,SAAQ,gBAAgB,cAAc,OAAO;AAC7C,eAAS,gBAAgB,cAAc,OAAO;AAC9C,MAAAhB,QAAO,gBAAgB,cAAc,OAAO;AAC5C;AAAA,EAAA;AAKR,SAAO,w5EAAw5E,IAAI,0BAA0B,KAAK,UAAU,MAAM,eAAe,WAAW,sBAAsB,GAAG,cAAcgB,MAAK,eAAe,MAAM,aAAahB,KAAI,eAAe,MAAM,eAAe,MAAM;AAC5mF;ACtDO,MAAMR,WAAS,MAAM;AAExB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}
|
|
1
|
+
{"version":3,"file":"f-ui-kit.es.js","sources":["../src/material/FButton/FButton.tsx","../src/icons/FTrashIcon/FTrashIcon.tsx","../src/material/FFile/FFile.tsx","../src/material/FButtonFile/FButtonFile.tsx","../src/icons/FLoadIcon/FLoadIcon.tsx","../src/material/FTextField/FTextField.tsx","../src/material/FStack/FStack.tsx","../src/material/GridComponents/FGrid/FGrid.tsx","../src/material/GridComponents/FGridRow/FGridRow.tsx","../src/material/FContainer/FContainer.tsx","../src/material/FPaper/FPaper.tsx","../src/material/TableComponents/FTableHead/FTableHead.tsx","../src/material/TableComponents/FTableBody/FTableBody.tsx","../src/material/TableComponents/FTable/FTable.tsx","../src/material/TableComponents/FTableRow/FTableRow.tsx","../src/material/TableComponents/FTableHeaderCell/FTableHeaderCell.tsx","../src/material/TableComponents/FTableDataCell/FTableDataCell.tsx","../src/material/TableComponents/FTableFooter/FTableFooter.tsx","../src/material/Dialog/FDialog/FDialog.tsx","../src/icons/FCloseIcon/FCloseIcon.tsx","../src/material/Dialog/FDialogHeader/FDialogHeader.tsx","../src/material/Dialog/FDialogBody/FDialogBody.tsx","../src/material/Dialog/FDialogFooter/FDialogFooter.tsx","../src/material/FProgress/FProgress.tsx","../src/material/FPreloader/FPreloader.tsx","../src/material/FCheckbox/FCheckbox.tsx","../src/material/FRadioButton/FRadioButton.tsx","../src/material/FPagination/hooks/usePagination.tsx","../src/material/FPagination/FPagination.tsx","../src/material/TimelineComponents/FTimeline/FTimeline.tsx","../src/material/TimelineComponents/FTimelineCard/FTimelineCard.tsx","../src/icons/FArrowIcon/FArrowIcon.tsx","../src/material/FOpenImgFull/FOpenImgFull.tsx","../src/material/FAccordion/FAccordion.tsx","../src/material/FInputFileForm/FInputFileForm.tsx","../src/material/SelectComponents/FSelect/FSelect.tsx","../src/material/SelectComponents/FSelectItem/FSelectItem.tsx","../src/material/FFullDateField/FFullDateField.tsx","../src/material/FSelectSearchDb/FSelectSearchDb.tsx","../src/material/FTextArea/FTextArea.tsx","../src/dop-function/fGenerateUniqueId/fGenerateUniqueId.ts","../src/material/FAlert/FAlert.tsx","../src/material/FNative/FNative.tsx","../src/material/Tabs/FTabs/FTabs.tsx","../src/material/Tabs/FTab/FTab.tsx","../src/material/Dropdown/FDropdown/FDropdown.tsx","../src/material/Dropdown/FDropdownItem/FDropdownItem.tsx","../src/material/FSearchBox/FSearchBox.tsx","../src/material/CarouselComponent/static/arrow-left.svg","../src/material/CarouselComponent/static/arrow-right.svg","../src/material/CarouselComponent/FCarousel/FCarousel.tsx","../src/material/CarouselComponent/FCarouselItem/FCarouselItem.tsx","../src/material/FSkeleton/FSkeleton.tsx","../src/material/NavigateBarComponents/FNavigateBar/FNavigateBar.tsx","../src/material/NavigateBarComponents/FNavigateBarItem/FNavigateBarItem.tsx","../src/material/MenuLinks/FMenuBlockLinks/FMenuBlockLinks.tsx","../src/material/MenuLinks/FMenuLinks/FMenuLinks.tsx","../src/material/FTooltip/FTooltip.tsx","../src/material/FSearchableSelect/FSearchableSelect.tsx","../src/icons/FPlusIcon/FPlusIcon.tsx","../src/icons/FCheckIcon/FCheckIcon.tsx","../src/icons/FListIcon/FListIcon.tsx","../src/icons/FPenIcon/FPenIcon.tsx","../src/icons/FDownloadIcon/FDownloadIcon.tsx","../src/icons/FCopyAddIcon/FCopyAddIcon.tsx","../src/icons/FUnlinkIcon/FUnlinkIcon.tsx","../src/icons/FFilterIcon/FFilterIcon.tsx","../src/icons/FDocumentIcon/FDocumentIcon.tsx","../src/icons/FReloadIcon/FReloadIcon.tsx","../src/icons/FMinusIcon/FMinusIcon.tsx","../src/icons/FInfoCircleIcon/FInfoCircleIcon.tsx","../src/icons/FSafeIcon/FSafeIcon.tsx","../src/icons/FArrowRightCircleIcon/FArrowRightCircleIcon.tsx","../src/icons/FArrowLeftCircleIcon/FArrowLeftCircleIcon.tsx","../src/icons/FArrowUpCircleIcon/FArrowUpCircleIcon.tsx","../src/icons/FArrowDownCircleIcon/FArrowDownCircleIcon.tsx","../src/function-elements/fAlert/fAlert.ts","../src/function-elements/fConfirm/fConfirm.ts","../src/function-elements/fPrompt/fPrompt.ts","../src/function-elements/fExportTableToExcel/dop-function/export-excel/tszip.min.ts","../src/function-elements/fExportTableToExcel/dop-function/export-excel/core.ts","../src/function-elements/fExportTableToExcel/dop-function/jsxToHtml.ts","../src/function-elements/fExportTableToExcel/fExportTableToExcel.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/getCellData.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/createXmlTags.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/convertHtmlToXml/createRow.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/convertHtmlToXml/convertHtmlTbToXml.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/contentTypes.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/_rels/rels.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/docProps/app.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/_rels/documentXmlRels.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/fontTable.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/settings.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/document.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/styles.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/theme/theme1.ts","../src/function-elements/fExportHtmlOrJsxToWord/xml-confs/word/webSettings.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/generateDocx.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/convertHtmlToXml/convertJsxElementToXml.ts","../src/function-elements/fExportHtmlOrJsxToWord/functions/jsxToHtml.ts","../src/function-elements/fExportHtmlOrJsxToWord/fExportHtmlOrJsxToWord.ts","../src/function-elements/fExportingHtmlToDocx/fExportingHtmlToDocx.ts","../src/function-elements/fExportingHtmlToXlsx/fExportingHtmlToXlsx.ts","../src/function-elements/fExportingHtmlToXlsx/fInstallFormatCodeXlsx.ts","../src/function-elements/Notification/fNotification/fNotification.ts","../src/function-elements/Notification/fNotificationDelete/fNotificationDelete.ts","../src/function-elements/fConvertFileToBase64/fConvertFileToBase64.ts","../src/function-elements/fDownloadFileFromBase64/fDownloadFileFromBase64.ts","../src/function-elements/fDownloadBlobFile/fDownloadBlobFile.ts","../src/function-elements/fBankRound/fBankRound.ts","../src/function-elements/fFormatRuNumber/fFormatRuNumber.ts","../src/function-elements/fConvertDate/fConvertDate.ts","../src/hooks/useFApi/useFApi.ts","../src/pages/error-boundary/Page.tsx"],"sourcesContent":["import styles from \"./FButton.module.scss\";\r\nimport { forwardRef } from 'react';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FButton.\r\n *\r\n * @interface IFButton\r\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\r\n */\r\nexport interface IFButton extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n /**\r\n * Дочерние элементы, отображаемые внутри кнопки (например, текст или иконка).\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Вариант стилей кнопки: заполненный (`contained`) или контурный (`default`).\r\n * @type {'contained' | 'default'}\r\n * @default 'contained'\r\n */\r\n variant?: 'contained' | 'default';\r\n\r\n /**\r\n * Цветовая схема кнопки.\r\n * @type {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер кнопки.\r\n * @type {'btn-lg' | 'btn-sm' | 'btn-xs'}\r\n * @default 'btn-sm'\r\n */\r\n size?: 'btn-lg' | 'btn-sm' | 'btn-xs';\r\n\r\n /**\r\n * Флаг, указывающий, должна ли кнопка занимать всю доступную ширину.\r\n * @type {boolean}\r\n * @default false\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Дополнительные инлайновые стили для кнопки.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Обработчик события клика на кнопку.\r\n * @type {React.MouseEventHandler<HTMLButtonElement> | undefined}\r\n */\r\n onClick?: React.MouseEventHandler<HTMLButtonElement> | undefined;\r\n\r\n /**\r\n * ID кнопки для идентификации в DOM.\r\n * @type {string}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Тип кнопки.\r\n * @type {\"button\" | \"submit\" | \"reset\" | undefined}\r\n * @default \"button\"\r\n */\r\n type?: \"button\" | \"submit\" | \"reset\" | undefined;\r\n}\r\n\r\n/**\r\n * Компонент `FButton` — универсальная кнопка с поддержкой цветовых схем, размеров и вариантов оформления.\r\n *\r\n * Кнопка поддерживает:\r\n * - разные цвета (`primary`, `secondary`, `success`, `danger`, `warning`, `info`, `light`, `dark`, `link`)\r\n * - разные размеры (`btn-lg`, `btn-sm`, `btn-xs`)\r\n * - типы (`contained`, `default`)\r\n * - дополнительные стили и классы\r\n * - автоматическое установление ширины через `fullWidth`\r\n *\r\n * @component\r\n * @example\r\n * // Пример простой кнопки\r\n * <FButton\r\n * variant=\"contained\"\r\n * color=\"primary\"\r\n * size=\"btn-lg\"\r\n * fullWidth={true}\r\n * onClick={() => alert('Клик!')}\r\n * >\r\n * Отправить\r\n * </FButton>\r\n *\r\n * @example\r\n * // Контурная кнопка с пользовательским классом и стилем\r\n * <FButton\r\n * variant=\"default\"\r\n * color=\"danger\"\r\n * style={{ fontWeight: 'bold' }}\r\n * className=\"custom-button\"\r\n * >\r\n * Отменить\r\n * </FButton>\r\n *\r\n * @param {React.ReactNode} children - Содержимое кнопки.\r\n * @param {'contained' | 'default'} [variant='contained'] - Тип кнопки: заполненная или контурная.\r\n * @param {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'} [color='primary'] - Цвет кнопки.\r\n * @param {'btn-lg' | 'btn-sm' | 'btn-xs'} [size='btn-sm'] - Размер кнопки.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {boolean} [fullWidth=false] - Если true, кнопка занимает 100% ширины родителя.\r\n * @param {React.MouseEventHandler<HTMLButtonElement>} [onClick] - Обработчик клика.\r\n * @param {\"button\" | \"submit\" | \"reset\"} [type='button'] - HTML-тип кнопки.\r\n * @param {string} [id] - Уникальный идентификатор кнопки.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<button>` с заданными стилями и пропсами.\r\n */\r\nconst FButton = forwardRef<HTMLButtonElement, IFButton>(({\r\n children,\r\n variant = 'contained',\r\n color = 'primary',\r\n size = 'btn-sm',\r\n st,\r\n fullWidth,\r\n ...props\r\n}, ref) => {\r\n const inputId = props.id || `button-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n let style: React.CSSProperties = { width: 'fit-content' }\r\n\r\n if (fullWidth) {\r\n if (style === undefined) {\r\n style = { width: '100%' };\r\n } else {\r\n style.width = '100%';\r\n }\r\n }\r\n\r\n style = st !== undefined ? { ...style, ...st } : style;\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n style={style}\r\n type={'button'}\r\n {...props}\r\n id={inputId}\r\n className={\r\n `${styles['btn']} ${styles[size]} ${styles[`btn${variant === 'contained' ? '-' : '-outline-'}${color}`]} ${props.className || ''}`\r\n }\r\n >\r\n {children}\r\n </button>\r\n );\r\n});\r\n\r\nFButton.displayName = 'FButton';\r\n\r\nexport default FButton;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTrashIcon.\r\n * @interface IFTrashIcon\r\n */\r\nexport interface IFTrashIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: React.SVGAttributes<SVGSVGElement>['width'];\r\n\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.SVGAttributes<SVGSVGElement>['style'];\r\n\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: React.SVGAttributes<SVGSVGElement>['id'];\r\n\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: React.SVGAttributes<SVGSVGElement>['className'];\r\n\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: React.DOMAttributes<SVGSVGElement>['onClick'];\r\n \r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FTrashIcon представляет собой SVG иконку корзины с возможностью настройки цвета, размера и обработки кликов.\r\n * \r\n * @function FTrashIcon\r\n * @param {IFTrashIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n * \r\n * @example\r\n * <FTrashIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n *\r\n */\r\n\r\nconst FTrashIcon = React.forwardRef<SVGSVGElement, IFTrashIcon>((\r\n {\r\n color = \"primary\",\r\n size = 32,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n }, ref\r\n) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n onClick={handleClick}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z\" />\r\n <path fillRule=\"evenodd\"\r\n d=\"M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFTrashIcon.displayName = 'FTrashIcon';\r\n\r\nexport default FTrashIcon;\r\n","import { FC } from 'react';\r\n\r\nimport FTrashIcon from '@icons/FTrashIcon';\r\nimport styles from './FFile.module.scss';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FFile.\r\n *\r\n * @interface IFFile\r\n */\r\nexport interface IFFile {\r\n /**\r\n * Уникальный идентификатор элемента (HTML id).\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для кастомизации внешнего вида.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили, применяемые к контейнеру файла.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Функция-обработчик удаления файла.\r\n * Вызывается при нажатии на иконку \"Удалить\".\r\n * @type {() => void | undefined}\r\n */\r\n handleDelete?: () => void;\r\n\r\n /**\r\n * Обязательное имя файла, отображается в интерфейсе.\r\n * @type {string}\r\n */\r\n name: string;\r\n\r\n /**\r\n * Размер файла в байтах. Отображается в КБ.\r\n * @type {number | undefined}\r\n */\r\n size?: number;\r\n\r\n /**\r\n * Прогресс загрузки файла в процентах (0-100).\r\n * @type {number | undefined}\r\n */\r\n progress?: number;\r\n}\r\n\r\n/**\r\n * Компонент `FFile` — отображает карточку одного файла с возможностью удаления\r\n * и индикатором прогресса загрузки.\r\n *\r\n * Используется в связке с `FButtonFile` или другими компонентами,\r\n * где нужно показать загруженный файл с именем, размером и кнопкой удаления.\r\n *\r\n * @component\r\n * @example\r\n * <FFile\r\n * name=\"report.pdf\"\r\n * size={20480} // 20 КБ\r\n * progress={75} // 75% загружено\r\n * handleDelete={() => console.log('Файл удален')}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским классом и стилем\r\n * <FFile\r\n * name=\"photo.jpg\"\r\n * size={987654} // ~964 КБ\r\n * className=\"custom-file-card\"\r\n * st={{ margin: '1rem 0' }}\r\n * />\r\n *\r\n * @param {string} [id] - ID элемента.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {() => void} [handleDelete] - Callback при клике на удаление.\r\n * @param {string} name - Имя файла (обязательное).\r\n * @param {number} [size] - Размер файла в байтах (необязательно, отображается в КБ).\r\n * @param {number} [progress] - Прогресс загрузки в процентах (0-100).\r\n *\r\n * @returns {JSX.Element} — Рендерит карточку файла с именем, размером, прогрессом и иконкой удаления.\r\n */\r\nconst FFile: FC<IFFile> = ({\r\n id,\r\n className,\r\n st,\r\n handleDelete,\r\n name,\r\n size,\r\n progress\r\n}) => {\r\n return (\r\n <div\r\n className={`${styles['file-preview-card']} ${className || ''}`}\r\n id={id}\r\n style={st}\r\n >\r\n <div className={styles['file-preview-info']}>\r\n <span className={styles['file-preview-name']} title={name}>\r\n {name}\r\n </span>\r\n {typeof size === 'number' && (\r\n <span className={styles['file-preview-size']}>\r\n {Math.round(size / 1024)} КБ\r\n </span>\r\n )}\r\n </div>\r\n {handleDelete && (\r\n <div className={styles[\"trash-icon\"]}>\r\n <FTrashIcon\r\n size={20}\r\n color=\"danger\"\r\n handleClick={handleDelete}\r\n />\r\n </div>\r\n )}\r\n {typeof progress === 'number' && (\r\n <div className={`${styles.progressBar} ${progress === 100 ? styles.completed : ''}`}>\r\n <div \r\n className={styles.progress}\r\n style={{ width: `${progress}%` }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FFile;","import { useRef, useState } from 'react';\r\n\r\nimport defaultStyles from './FButtonFile.module.scss';\r\nimport FButton from '@material/FButton/FButton';\r\nimport FFile from '@material/FFile';\r\n\r\n/**\r\n * Типы вариантов цвета кнопки.\r\n * @typedef {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'} ButtonColorType\r\n */\r\ntype ButtonColorType = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n/**\r\n * Типы вариантов отображения кнопки.\r\n * @typedef {'contained' | 'default'} ButtonVariantType\r\n */\r\ntype ButtonVariantType = 'contained' | 'default';\r\n\r\n/**\r\n * Размеры кнопок.\r\n * @typedef {'btn-lg' | 'btn-sm' | 'btn-xs'} ButtonSizeType\r\n */\r\ntype ButtonSizeType = 'btn-lg' | 'btn-sm' | 'btn-xs';\r\n\r\n/**\r\n * Направление расположения файлов.\r\n * @typedef {\"row\" | \"row-reverse\" | \"column\" | \"column-reverse\"} FlexDirectionType\r\n */\r\ntype FlexDirectionType = 'row' | 'row-reverse' | 'column' | 'column-reverse';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FButtonFile.\r\n *\r\n * @interface IFButtonFile\r\n */\r\nexport interface IFButtonFile {\r\n /**\r\n * Дочерние элементы, отображаемые внутри кнопки.\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Вариант кнопки: заполненный (`contained`) или контурный (`default`).\r\n * @type {ButtonVariantType}\r\n * @default contained\r\n */\r\n variant?: ButtonVariantType;\r\n\r\n /**\r\n * Цветовая схема кнопки.\r\n * @type {ButtonColorType}\r\n * @default primary\r\n */\r\n color?: ButtonColorType;\r\n\r\n /**\r\n * Размер кнопки.\r\n * @type {ButtonSizeType}\r\n * @default btn-sm\r\n */\r\n size?: ButtonSizeType;\r\n\r\n /**\r\n * Флаг блокировки кнопки и поля ввода файла.\r\n * @type {boolean}\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Дополнительные инлайновые стили для контейнера.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Пользовательский CSS-класс.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю ширину.\r\n * @type {boolean}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Обязательное поле (HTML5 required).\r\n * @type {boolean}\r\n */\r\n required?: boolean;\r\n\r\n /**\r\n * Callback, вызываемый при выборе файла(ов).\r\n * @param {File[] | null} file - Массив выбранных файлов или `null`, если файлы удалены.\r\n */\r\n onChange: (file: File[] | null) => void;\r\n\r\n /**\r\n * Разрешает выбор нескольких файлов.\r\n * @type {boolean}\r\n */\r\n multiple?: boolean;\r\n\r\n /**\r\n * Список типов файлов, разрешённых к загрузке.\r\n * Например: `'image/*'`, `'application/pdf'`\r\n * @type {string}\r\n */\r\n accept?: string;\r\n\r\n /**\r\n * Направление отображения предпросмотра файлов.\r\n * @type {FlexDirectionType}\r\n */\r\n direction?: FlexDirectionType;\r\n}\r\n\r\n/**\r\n * Компонент `FButtonFile` — кнопка для выбора файла(ов), которая:\r\n * - оборачивает стандартный `<input type=\"file\">`\r\n * - предоставляет предпросмотр файлов\r\n * - поддерживает удаление загруженных файлов\r\n * - интегрирована с `FButton` и `FTrashIcon`\r\n *\r\n * @component\r\n * @example\r\n * <FButtonFile\r\n * variant=\"contained\"\r\n * color=\"primary\"\r\n * multiple={true}\r\n * onChange={(files) => console.log(files)}\r\n * >\r\n * Загрузить файлы\r\n * </FButtonFile>\r\n *\r\n * @example\r\n * // Только изображения\r\n * <FButtonFile\r\n * variant=\"default\"\r\n * color=\"secondary\"\r\n * accept=\"image/*\"\r\n * onChange={(files) => files && alert(`${files.length} файл(ов) загружено`)}\r\n * />\r\n *\r\n * @param {React.ReactNode} [children] - Контент кнопки.\r\n * @param {ButtonVariantType} [variant='contained'] - Вариант кнопки.\r\n * @param {ButtonColorType} [color='primary'] - Цвет кнопки.\r\n * @param {ButtonSizeType} [size='btn-sm'] - Размер кнопки.\r\n * @param {boolean} [disabled=false] - Блокировка кнопки.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [className] - Дополнительный CSS-класс.\r\n * @param {boolean} [fullWidth=false] - Настройка ширины.\r\n * @param {string} [id] - ID элемента.\r\n * @param {boolean} [multiple=false] - Поддержка множественного выбора.\r\n * @param {string} [accept] - Фильтр допустимых форматов.\r\n * @param {FlexDirectionType} [direction='row'] - Расположение файлов.\r\n * @param {Function} onChange - Callback с массивом файлов.\r\n */\r\nconst FButtonFile = ({\r\n children,\r\n variant = 'contained',\r\n color = 'primary',\r\n size = 'btn-sm',\r\n disabled,\r\n st,\r\n className,\r\n fullWidth,\r\n id,\r\n onChange,\r\n multiple = false,\r\n accept,\r\n direction = 'row',\r\n required,\r\n}: IFButtonFile) => {\r\n const fileRef = useRef<HTMLInputElement>(null);\r\n const [files, setFiles] = useState<File[]>([]);\r\n const [uploadProgress, setUploadProgress] = useState<{ [key: string]: number }>({});\r\n\r\n const style = fullWidth ? { ...st, width: '100%' } : st;\r\n\r\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!e.target.files || e.target.files.length === 0) return;\r\n\r\n const selectedFiles = Array.from(e.target.files);\r\n setFiles((prev) => [...prev, ...selectedFiles]);\r\n onChange([...selectedFiles]);\r\n\r\n // Имитация прогресса загрузки\r\n selectedFiles.forEach(file => {\r\n let progress = 0;\r\n const interval = setInterval(() => {\r\n progress += 10;\r\n setUploadProgress(prev => ({ ...prev, [file.name]: progress }));\r\n if (progress >= 100) clearInterval(interval);\r\n }, 200);\r\n });\r\n };\r\n\r\n const handleRemoveFile = (index: number) => {\r\n setFiles((prev) => {\r\n const updatedFiles = prev.filter((_, i) => i !== index);\r\n if (updatedFiles.length === 0) {\r\n onChange(null);\r\n if (fileRef.current) fileRef.current.value = '';\r\n } else {\r\n onChange(updatedFiles);\r\n }\r\n return updatedFiles;\r\n });\r\n\r\n // Удаляем прогресс при удалении файла\r\n const fileName = files[index].name;\r\n setUploadProgress(prev => {\r\n const newProgress = { ...prev };\r\n delete newProgress[fileName];\r\n return newProgress;\r\n });\r\n };\r\n\r\n return (\r\n <div className={defaultStyles['f-button-file']} style={style}>\r\n <FButton\r\n variant={variant}\r\n color={color}\r\n size={size}\r\n disabled={disabled}\r\n className={className}\r\n style={style}\r\n id={id}\r\n onClick={() => fileRef.current?.click()}\r\n >\r\n {children}\r\n </FButton>\r\n\r\n <input\r\n ref={fileRef}\r\n type=\"file\"\r\n style={{ display: \"none\" }}\r\n multiple={multiple}\r\n accept={accept}\r\n onChange={handleFileChange}\r\n disabled={disabled}\r\n required={required}\r\n />\r\n\r\n {/* Предпросмотр файлов */}\r\n {files.length > 0 && (\r\n <div className={defaultStyles[\"custom-files-preview\"]} id=\"files\" style={{ marginTop: '16px' }}>\r\n <div className={defaultStyles[\"file-preview-list\"]} style={{ flexDirection: direction }}>\r\n {files.map((opt, index) => (\r\n <FFile \r\n key={index} \r\n name={opt.name} \r\n size={opt.size} \r\n handleDelete={() => handleRemoveFile(index)}\r\n progress={uploadProgress[opt.name]}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FButtonFile;","import './FLoadIconCss.scss'\r\n\r\nimport React, { useRef } from \"react\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FLoadIcon.\r\n * @interface IFLoadIcon\r\n */\r\nexport interface IFLoadIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties,\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string,\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string,\r\n}\r\n\r\n/**\r\n * Компонент FLoadIcon представляет собой анимированную иконку загрузки с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FLoadIcon\r\n * @param {IFLoadIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для элемента.\r\n * @param {string} [id] - Уникальный идентификатор для элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для элемента.\r\n * @param {React.Ref<HTMLDivElement>} ref - Ref для div элемента.\r\n * @returns {JSX.Element} - Возвращает анимированный элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FLoadIcon\r\n * color=\"success\"\r\n * size={50}\r\n * />\r\n */\r\nconst FLoadIcon = React.forwardRef<HTMLDivElement, IFLoadIcon>(({ \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n color = 'primary',\r\n ...props \r\n}, ref) => {\r\n\r\n const randomId = useRef<string>((Math.random() + 1).toString(36).substring(2))\r\n\r\n return (\r\n <div ref={ref} style={{ margin: 0, padding: 0 }} {...props}>\r\n <style>\r\n {\r\n `\r\n .f-load-icon-${randomId.current} {\r\n width: ${size}px;\r\n height: ${size * 2.25}px;\r\n -webkit-animation: anim-f-load-icon-${randomId.current} 2s linear infinite alternate;\r\n animation: anim-f-load-icon-${randomId.current} 2s linear infinite alternate;\r\n transform: perspective(${size * 2.5}px) rotateX(-45deg);\r\n border-width: ${size / 10}px !important;\r\n }\r\n `\r\n }\r\n {\r\n `@-webkit-keyframes anim-f-load-icon-${randomId.current} {\r\n 0% {\r\n box-shadow: 0 0 inset;\r\n }\r\n 100% {\r\n box-shadow: 0 calc((${size * 2.25}px - 2px) * -1) inset;\r\n }\r\n }`\r\n }\r\n {\r\n `@keyframes anim-f-load-icon-${randomId.current} {\r\n 0% {\r\n box-shadow: 0 0 inset;\r\n }\r\n 100% {\r\n box-shadow: 0 calc((${size * 2.25}px - 2px) * -1) inset;\r\n }\r\n }`\r\n }\r\n </style>\r\n <span\r\n className={`f-load-icon f-load-icon-${randomId.current} ${color} ${className !== undefined ? className : ''}`}\r\n style={st}\r\n id={id}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nFLoadIcon.displayName = 'FLoadIcon';\r\n\r\nexport default FLoadIcon;\r\n","import React, { forwardRef } from \"react\";\r\nimport styles from \"./FTextField.module.scss\";\r\nimport FLoadIcon from \"@icons/FLoadIcon\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTextField.\r\n * @interface IFTextField\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFTextField extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Текст метки для поля ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Дополнительные стили для поля ввода.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю доступную ширину.\r\n * @type {boolean | undefined}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст под полем ввода.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Флаг, указывающий, находится ли поле в состоянии загрузки.\r\n * @type {boolean | undefined}\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Ширина поля ввода.\r\n * @type {string | number | undefined}\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Высота поля ввода.\r\n * @type {string | number | undefined}\r\n */\r\n height?: string | number;\r\n}\r\n\r\n/**\r\n * Компонент FTextField представляет собой поле ввода с дополнительными функциями,\r\n * такими как метка, сообщения об ошибках, вспомогательный текст и индикатор загрузки.\r\n *\r\n * @component\r\n * @example\r\n * <FTextField\r\n * label=\"Имя пользователя\"\r\n * type=\"text\"\r\n * fullWidth={true}\r\n * errText={['Поле обязательно для заполнения']}\r\n * helpText=\"Введите ваше имя\"\r\n * load={false}\r\n * />\r\n *\r\n * @param {IFTextField} props - Пропсы компонента.\r\n * @param {React.Ref<HTMLInputElement>} ref - Референс для доступа к DOM-элементу.\r\n * @returns {JSX.Element} - Элемент поля ввода.\r\n */\r\nconst FTextField = forwardRef<HTMLInputElement, IFTextField>(\r\n (\r\n {\r\n label,\r\n type = 'text',\r\n fullWidth,\r\n errText,\r\n helpText,\r\n st,\r\n id,\r\n className,\r\n load = false,\r\n height = 'auto',\r\n width,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const baseStyle: React.CSSProperties = {\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n width: fullWidth ? '100%' : width || 'fit-content',\r\n height: height || 'auto',\r\n };\r\n\r\n const mergedStyle = { ...baseStyle, ...st };\r\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n return (\r\n <div\r\n className={`f-form-element ${styles[\"f-text-field\"]} ${className || ''}`}\r\n style={mergedStyle}\r\n role=\"group\"\r\n id={inputId + '-text-field-block'}\r\n aria-labelledby={label ? inputId + '-label' : undefined}\r\n >\r\n {/* Label */}\r\n {label && (\r\n <label\r\n id={inputId + '-label'}\r\n htmlFor={inputId}\r\n className={`f-form-element__label ${errText ? 'error' : ''}`}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n {/* Input wrapper */}\r\n <div className={`f-form-element__control ${load ? 'is-loading' : ''}`}>\r\n <input\r\n ref={ref}\r\n id={inputId}\r\n type={type}\r\n className={`f-form-element__control-element ${errText ? 'error' : ''}`}\r\n aria-invalid={!!errText}\r\n aria-describedby={\r\n [helpText ? inputId + '-helptext' : null, errText?.length ? inputId + '-errortext' : null]\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n {...props}\r\n step={props.step !== undefined ? props.step : 'any'}\r\n disabled={props.disabled || load}\r\n />\r\n\r\n {load && (\r\n <span className={'f-form-element__loader'}>\r\n <FLoadIcon size={10} />\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Help Text */}\r\n {helpText && (\r\n <p\r\n id={inputId + '-helptext'}\r\n className={'f-form-element__helptext'}\r\n >\r\n {helpText}\r\n </p>\r\n )}\r\n\r\n {/* Error Messages */}\r\n {(typeof errText === 'string' && errText) && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n <p\r\n id={`${inputId}-errortext`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {errText}\r\n </p>\r\n </div>\r\n )}\r\n {errText && errText.length > 0 && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n {typeof errText !== 'string' && errText.map((error, index) => (\r\n <p\r\n key={index}\r\n id={`${inputId}-errortext-${index}`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {error}\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FTextField;","import { FC } from \"react\";\r\n\r\n/**\r\n * Тип направления расположения дочерних элементов.\r\n * @typedef {'row' | 'row-reverse' | 'column' | 'column-reverse'} DirectionType\r\n */\r\ntype DirectionType = 'row' | 'row-reverse' | 'column' | 'column-reverse';\r\n\r\n/**\r\n * Тип выравнивания элементов по перекрёстной оси.\r\n * @typedef {\"flex-start\" | \"center\" | \"flex-end\" | \"stretch\" | \"baseline\"} AlignItemsType\r\n */\r\ntype AlignItemsType = \"flex-start\" | \"center\" | \"flex-end\" | \"stretch\" | \"baseline\";\r\n\r\n/**\r\n * Тип выравнивания элементов по главной оси.\r\n * @typedef {\"flex-start\" | \"center\" | \"flex-end\" | \"space-between\" | \"space-around\" | \"space-evenly\"} JustifyContentType\r\n */\r\ntype JustifyContentType =\r\n | \"flex-start\"\r\n | \"center\"\r\n | \"flex-end\"\r\n | \"space-between\"\r\n | \"space-around\"\r\n | \"space-evenly\";\r\n\r\n/**\r\n * Тип оборачивания дочерних элементов.\r\n * @typedef {\"nowrap\" | \"wrap\" | \"wrap-reverse\" | undefined} WrapType\r\n */\r\ntype WrapType = \"nowrap\" | \"wrap\" | \"wrap-reverse\" | undefined;\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FStack.\r\n *\r\n * @interface IFStack\r\n */\r\nexport interface IFStack {\r\n /**\r\n * Направление расположения дочерних элементов.\r\n * @type {DirectionType}\r\n * @default 'column'\r\n */\r\n direction?: DirectionType;\r\n\r\n /**\r\n * Выравнивание элементов по перекрёстной оси.\r\n * @type {AlignItemsType | undefined}\r\n */\r\n alignItems?: AlignItemsType;\r\n\r\n /**\r\n * Выравнивание элементов по главной оси.\r\n * @type {JustifyContentType | undefined}\r\n */\r\n justifyContent?: JustifyContentType;\r\n\r\n /**\r\n * Расстояние между элементами (умножается на 8px).\r\n * @type {number | undefined}\r\n * @default 0\r\n */\r\n spacing?: number;\r\n\r\n /**\r\n * Дочерние элементы, которые будут отрендерены внутри контейнера.\r\n * @type {React.ReactElement | React.ReactNode | undefined}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Дополнительные инлайновые стили.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Флаг, указывающий, должен ли контейнер переносить дочерние элементы на новую строку.\r\n * @type {WrapType}\r\n */\r\n wrap?: WrapType;\r\n}\r\n\r\n/**\r\n * Компонент `FStack` — гибкий контейнер с возможностью управления расположением дочерних элементов.\r\n *\r\n * Основан на Flexbox. Позволяет:\r\n * - задавать направление (`direction`)\r\n * - управлять отступами (`spacing`)\r\n * - выравнивать элементы (`alignItems`, `justifyContent`)\r\n * - добавлять кастомные классы и стили\r\n *\r\n * @component\r\n * @example\r\n * <FStack\r\n * direction=\"row\"\r\n * spacing={2}\r\n * alignItems=\"center\"\r\n * justifyContent=\"space-between\"\r\n * >\r\n * <div>Элемент 1</div>\r\n * <div>Элемент 2</div>\r\n * </FStack>\r\n *\r\n * @param {DirectionType} [direction='column'] - Направление дочерних элементов.\r\n * @param {AlignItemsType} [alignItems] - Выравнивание по перекрёстной оси.\r\n * @param {JustifyContentType} [justifyContent] - Выравнивание по главной оси.\r\n * @param {number} [spacing=0] - Отступ между элементами (умножается на 8px).\r\n * @param {React.ReactNode} [children] - Дочерние элементы.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - ID элемента.\r\n * @param {WrapType} [wrap] - Перенос дочерних элементов на следующую строку.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<div>` с Flexbox-стилями и переданными свойствами.\r\n */\r\nconst FStack: FC<IFStack> = ({\r\n children,\r\n alignItems,\r\n justifyContent,\r\n direction = 'column',\r\n wrap,\r\n spacing = 0,\r\n className,\r\n st,\r\n id\r\n}) => {\r\n let style: React.CSSProperties = {\r\n gap: `${+spacing * 8}px`,\r\n display: 'flex',\r\n flexDirection: direction,\r\n justifyContent: justifyContent,\r\n alignItems: alignItems,\r\n flexWrap: wrap\r\n };\r\n\r\n if (st !== undefined) {\r\n style = Object.assign(style, st);\r\n }\r\n\r\n return (\r\n <div\r\n className={className}\r\n style={style}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FStack;","import { FC } from \"react\";\r\n\r\nimport styles from \"./FGrid.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента `FGrid`.\r\n *\r\n * Используется для создания адаптивной сетки по принципам Bootstrap.\r\n */\r\nexport interface IFGrid {\r\n /**\r\n * Контент внутри контейнера или элемента.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Пользовательский CSS класс.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Тип объекта: `\"container\"` — для контейнера, `\"item\"` — для элемента (колонки).\r\n */\r\n obj?: \"container\" | \"item\";\r\n\r\n /**\r\n * Ширина колонки на мобильных устройствах (`xs`: от 0 до 576px).\r\n * @default 12\r\n */\r\n xs?: number;\r\n\r\n /**\r\n * Ширина колонки на маленьких устройствах (`sm`: ≥576px).\r\n */\r\n sm?: number;\r\n\r\n /**\r\n * Ширина колонки на планшетах (`md`: ≥768px).\r\n */\r\n md?: number;\r\n\r\n /**\r\n * Ширина колонки на десктопах (`lg`: ≥992px).\r\n */\r\n lg?: number;\r\n\r\n /**\r\n * Ширина колонки на больших десктопах (`xl`: ≥1200px).\r\n */\r\n xl?: number;\r\n\r\n /**\r\n * Ширина колонки на очень больших экранах (`xxl`: ≥1400px).\r\n */\r\n xxl?: number;\r\n\r\n /**\r\n * Если true — элемент занимает только необходимое пространство (`col-auto`).\r\n */\r\n colAuto?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FGrid` — адаптивная сетка, основанная на системе Bootstrap.\r\n *\r\n * Может быть как контейнером, так и элементом-колонкой.\r\n *\r\n * @component\r\n * @example\r\n * // Пример использования как контейнера\r\n * <FGrid obj=\"container\">\r\n * <FGrid obj=\"item\" xs={12} md={6}>\r\n * <p>Контент</p>\r\n * </FGrid>\r\n * </FGrid>\r\n *\r\n * @example\r\n * // Элемент с автоматической шириной\r\n * <FGrid obj=\"item\" colAuto>\r\n * Авто-ширина\r\n * </FGrid>\r\n *\r\n * @param {React.ReactNode} [children] - Контент внутри контейнера или колонки.\r\n * @param {string} [className] - Кастомный класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - HTML ID.\r\n * @param {\"container\"|\"item\"} [obj] - Тип элемента: контейнер или колонка.\r\n * @param {number} [xs=12] - Ширина на мобильных устройствах.\r\n * @param {number} [sm] - Ширина на малых устройствах.\r\n * @param {number} [md] - Ширина на планшетах.\r\n * @param {number} [lg] - Ширина на десктопах.\r\n * @param {number} [xl] - Ширина на больших десктопах.\r\n * @param {number} [xxl] - Ширина на очень больших экранах.\r\n * @param {boolean} [colAuto=false] - Элемент занимает только нужное пространство.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<div>` с соответствующими классами и стилями.\r\n */\r\nconst FGrid: FC<IFGrid> = ({\r\n children,\r\n className = \"\",\r\n st,\r\n id,\r\n obj,\r\n xs = 12,\r\n sm,\r\n md,\r\n lg,\r\n xl,\r\n xxl,\r\n colAuto = false,\r\n}) => {\r\n const style: React.CSSProperties = {\r\n ...st,\r\n };\r\n\r\n const resolvedSizes = {\r\n xs,\r\n sm: sm ?? xs,\r\n md: md ?? sm ?? xs,\r\n lg: lg ?? md ?? sm ?? xs,\r\n xl: xl ?? lg ?? md ?? sm ?? xs,\r\n xxl: xxl ?? xl ?? lg ?? md ?? sm ?? xs,\r\n };\r\n\r\n const getColumnClasses = () => {\r\n if (colAuto) return styles['f-grid__col--auto'];\r\n\r\n const classes = [styles['f-grid__col']];\r\n if (resolvedSizes.xs !== undefined) classes.push(styles[`f-grid__col--xs-${resolvedSizes.xs}`]);\r\n if (resolvedSizes.sm !== undefined) classes.push(styles[`f-grid__col--sm-${resolvedSizes.sm}`]);\r\n if (resolvedSizes.md !== undefined) classes.push(styles[`f-grid__col--md-${resolvedSizes.md}`]);\r\n if (resolvedSizes.lg !== undefined) classes.push(styles[`f-grid__col--lg-${resolvedSizes.lg}`]);\r\n if (resolvedSizes.xl !== undefined) classes.push(styles[`f-grid__col--xl-${resolvedSizes.xl}`]);\r\n if (resolvedSizes.xxl !== undefined) classes.push(styles[`f-grid__col--xxl-${resolvedSizes.xxl}`]);\r\n\r\n return classes.join(\" \");\r\n };\r\n\r\n return (\r\n <>\r\n {obj === \"container\" && (\r\n <div\r\n className={`${styles['f-grid']} ${className || \"\"}`}\r\n style={style}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n\r\n {obj === \"item\" && (\r\n <div\r\n className={`${getColumnClasses()} ${className || \"\"}`}\r\n style={style}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n\r\n {obj === undefined && (\r\n <div className={className} style={style} id={id}>\r\n {children}\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default FGrid;","import { FC } from \"react\";\r\n\r\nimport styles from \"./FGridRow.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FGridRow — обёртка для горизонтального Flexbox-ряда.\r\n */\r\nexport interface IFGridRow {\r\n /**\r\n * Контент, который будет отображён внутри строки.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для строки.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Выравнивание дочерних элементов по горизонтали.\r\n * @default 'flex-start'\r\n */\r\n justifyContent?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\";\r\n\r\n /**\r\n * Выравнивание дочерних элементов по вертикали.\r\n * @default 'stretch'\r\n */\r\n alignItems?: \"start\" | \"center\" | \"end\" | \"stretch\";\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FGridRow` — обёртка для горизонтальной Flex-строки.\r\n *\r\n * Используется вместе с `FGridItem` или `FGrid` для создания адаптивного макета.\r\n *\r\n * @component\r\n * @example\r\n * <FGridRow justifyContent=\"center\" alignItems=\"center\">\r\n * <div>Элемент 1</div>\r\n * <div>Элемент 2</div>\r\n * </FGridRow>\r\n *\r\n * @param {React.ReactNode} [children] - Дочерние элементы, размещаемые в строке.\r\n * @param {string} [className] - Кастомный класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {\"start\"|\"center\"|\"end\"|\"between\"|\"around\"} [justifyContent='start'] - Горизонтальное выравнивание.\r\n * @param {\"start\"|\"center\"|\"end\"|\"stretch\"} [alignItems='stretch'] - Вертикальное выравнивание.\r\n * @param {string} [id] - HTML ID.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<div>` как Flex-строку с заданными свойствами.\r\n */\r\nconst FGridRow: FC<IFGridRow> = ({\r\n children,\r\n className = '',\r\n st,\r\n id,\r\n justifyContent,\r\n alignItems,\r\n}) => {\r\n const getJustifyContentClass = () => {\r\n if (!justifyContent) return '';\r\n return styles[`f-grid-row--justify-${justifyContent}`];\r\n };\r\n\r\n const getAlignItemsClass = () => {\r\n if (!alignItems) return '';\r\n return styles[`f-grid-row--align-${alignItems}`];\r\n };\r\n\r\n const rowClasses = [\r\n styles['f-grid-row'],\r\n getJustifyContentClass(),\r\n getAlignItemsClass(),\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n return (\r\n <div className={rowClasses} style={st} id={id}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FGridRow;","import { FC } from \"react\";\r\nimport styles from \"./FContainer.module.scss\";\r\n\r\n/**\r\n * Тип, определяющий максимальную ширину контейнера.\r\n *\r\n * @typedef {'container-xs' | 'container-sm' | 'container-md' | 'container-lg' | 'container-xl' | 'container-xxl' | 'container-fluid'} ContainerSizeType\r\n */\r\ntype ContainerSizeType = 'container-xs' | 'container-sm' | 'container-md' | 'container-lg' | 'container-xl' | 'container-xxl' | 'container-fluid';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FContainer.\r\n *\r\n * @interface IFContainer\r\n */\r\nexport interface IFContainer {\r\n /**\r\n * Размер контейнера — влияет на максимальную ширину.\r\n * @type {ContainerSizeType}\r\n * @default 'container-xs'\r\n */\r\n maxWidth?: ContainerSizeType;\r\n\r\n /**\r\n * Дочерние элементы, отображаемые внутри контейнера.\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string}\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FContainer` — универсальный контейнер с разными размерами (`maxWidth`) и поддержкой пользовательских классов и стилей.\r\n *\r\n * Используется для ограничения ширины макета в зависимости от устройства:\r\n * - `container-xs`: 576px\r\n * - `container-sm`: 768px\r\n * - `container-md`: 992px\r\n * - `container-lg`: 1200px\r\n * - `container-xl`: 1400px\r\n * - `container-xxl`: 1600px\r\n * - `container-fluid`: 100%\r\n *\r\n * @component\r\n * @example\r\n * <FContainer maxWidth=\"container-md\" className=\"my-container\" st={{ padding: '2rem' }}>\r\n * <div>Контент</div>\r\n * </FContainer>\r\n *\r\n * @param {ContainerSizeType} [maxWidth='container-xs'] - Размер контейнера.\r\n * @param {React.ReactNode} [children] - Содержимое контейнера.\r\n * @param {string} [className] - Дополнительный CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - ID элемента.\r\n *\r\n * @returns {JSX.Element} - Рендерит `<div>` с заданным классом и стилями.\r\n */\r\nconst FContainer: FC<IFContainer> = ({\r\n children,\r\n className,\r\n st,\r\n id,\r\n maxWidth = 'container-xs'\r\n}) => {\r\n return (\r\n <div\r\n className={`${styles['f-container']} ${styles[maxWidth]} ${className || ''}`}\r\n style={st}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FContainer;","import { FC, useEffect } from \"react\";\r\nimport styles from \"./FPaper.module.scss\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FPaper.\r\n *\r\n * @interface IFPaper\r\n */\r\nexport interface IFPaper {\r\n /**\r\n * Заголовок панели (необязательно).\r\n * Отображается в `.panel-heading`.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Дочерние элементы, отображаемые внутри `.panel-body`.\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Инлайновые стили для внешнего контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Размер шрифта заголовка (например: '16px').\r\n * @type {string | undefined}\r\n */\r\n fontSizeLabel?: string;\r\n\r\n /**\r\n * Размер шрифта содержимого (например: '14px').\r\n * @type {string | undefined}\r\n */\r\n fontSizeBody?: string;\r\n\r\n /**\r\n * Уникальный ID элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для кастомизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Callback, вызываемый при завершении анимации.\r\n * @type {() => void | undefined}\r\n */\r\n onAnimationEnd?: () => void;\r\n\r\n /**\r\n * Настройки анимации. Например: `{ name: 'data-animation', value: 'fade-in' }`\r\n * @type {{ name: string; value: string } | undefined}\r\n */\r\n animated?: {\r\n name: string;\r\n value: string;\r\n };\r\n}\r\n\r\n/**\r\n * Компонент `FPaper` — универсальная панель с поддержкой:\r\n * - заголовка (`label`)\r\n * - динамических стилей (`st`, `fontSizeLabel`, `fontSizeBody`)\r\n * - анимаций через `animated`\r\n * - пользовательских классов (`className`)\r\n *\r\n * Основан на Bootstrap-подобной структуре: `.panel .panel-default`\r\n *\r\n * @component\r\n * @example\r\n * // Пример базового использования\r\n * <FPaper label=\"Информация\">\r\n * Это текстовое содержимое панели.\r\n * </FPaper>\r\n *\r\n * @example\r\n * // С пользовательским стилем и анимацией\r\n * <FPaper\r\n * label=\"Настройки\"\r\n * fontSizeLabel=\"18px\"\r\n * fontSizeBody=\"14px\"\r\n * className=\"custom-paper\"\r\n * animated={{ name: 'data-animation', value: 'fade-in' }}\r\n * >\r\n * <p>С настраиваемым размером шрифта и анимацией</p>\r\n * </FPaper>\r\n *\r\n * @param {string} [label] - Текст заголовка панели.\r\n * @param {React.ReactNode} [children] - Содержимое панели.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для контейнера.\r\n * @param {string} [fontSizeLabel] - Размер шрифта заголовка.\r\n * @param {string} [fontSizeBody] - Размер шрифта тела панели.\r\n * @param {string} [id] - HTML ID.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n * @param {Function} [onAnimationEnd] - Callback при завершении анимации.\r\n * @param {{name: string, value: string}} [animated] - Атрибут анимации.\r\n *\r\n * @returns {JSX.Element} — Рендерит панель с заголовком и содержимым.\r\n */\r\nconst FPaper: FC<IFPaper> = ({\r\n label,\r\n children,\r\n st,\r\n fontSizeLabel,\r\n fontSizeBody,\r\n id,\r\n className,\r\n onAnimationEnd,\r\n animated\r\n}) => {\r\n\r\n useEffect(() => {\r\n if (animated) {\r\n const element = document.getElementsByClassName(`animated-${animated.name}`)[0];\r\n if (element) {\r\n element.setAttribute(animated.name, animated.value);\r\n }\r\n }\r\n }, [animated]);\r\n\r\n return (\r\n <div\r\n className={`${styles['panel']} ${styles['panel-default']} ${className || ''} ${animated ? `${styles[`animated-${animated.name}`]} ${animated.name}` : ''}`}\r\n style={st}\r\n id={id}\r\n onAnimationEnd={onAnimationEnd}\r\n >\r\n {label && (\r\n <div className={styles['panel-heading']}>\r\n <h3\r\n className={styles['panel-title']}\r\n style={{ fontSize: fontSizeLabel }}\r\n >\r\n {label}\r\n </h3>\r\n </div>\r\n )}\r\n <div\r\n className={styles['panel-body']}\r\n style={{ fontSize: fontSizeBody }}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FPaper;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableHead.\r\n * @interface IFTableHead\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface IFTableHead extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n /**\r\n * Дополнительные стили для заголовка таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, строки `<tr>` или ячейки `<th>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри заголовка таблицы.\r\n * @type {\"left\" | \"right\" | \"center\" | \"justify\"}\r\n * @default \"left\"\r\n */\r\n textAlignment?: \"left\" | \"right\" | \"center\" | \"justify\";\r\n\r\n /**\r\n * Флаг, указывающий, должен ли заголовок быть \"липким\" (sticky).\r\n * @type {boolean}\r\n * @default false\r\n */\r\n isSticky?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент FTableHead представляет собой заголовок таблицы (`<thead>`).\r\n * Он поддерживает настройку стилей, выравнивания текста и режима \"липкости\".\r\n *\r\n * @component\r\n * @example\r\n * <FTableHead\r\n * textAlignment=\"center\"\r\n * isSticky={true}\r\n * st={{ backgroundColor: '#f9f9f9' }}\r\n * >\r\n * <tr>\r\n * <th>Заголовок 1</th>\r\n * <th>Заголовок 2</th>\r\n * </tr>\r\n * </FTableHead>\r\n *\r\n * @param {IFTableHead} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент заголовка таблицы.\r\n */\r\nconst FTableHead: FC<IFTableHead> = ({\r\n st,\r\n children,\r\n textAlignment = \"left\", // По умолчанию выравнивание слева\r\n isSticky = true, // По умолчанию заголовок не \"липкий\"\r\n ...props\r\n}) => {\r\n\r\n return (\r\n <thead\r\n style={st} // Применяем пользовательские стили\r\n {...props} // Передаем остальные пропсы\r\n className={`${styles['f-table-component__table_header']} ${isSticky ? styles[\"is-sticky\"] : \"\"} ${props.className || \"\"} ${styles[textAlignment]}`}\r\n >\r\n {children}\r\n </thead>\r\n );\r\n};\r\n\r\nexport default FTableHead;","import React, { type FC, useCallback, useEffect, useRef, useState, useLayoutEffect, useMemo } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableBody.\r\n * @interface IFTableBody\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface IFTableBody extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n /**\r\n * Дополнительные стили для тела таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, строки `<tr>` или ячейки `<td>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри тела таблицы.\r\n * @type {'left' | 'right' | 'center' | 'justify'}\r\n * @default 'left'\r\n */\r\n textAlignment?: 'left' | 'right' | 'center' | 'justify';\r\n\r\n /**\r\n * Ref для родительского контейнера с прокруткой.\r\n * Используется для отслеживания события прокрутки.\r\n * @type {React.RefObject<HTMLDivElement>}\r\n */\r\n tableWrapperRef?: React.RefObject<HTMLDivElement>;\r\n\r\n /**\r\n * Количество видимых строк для виртуализации. Если не указано — виртуализация отключена.\r\n */\r\n visibleRowCount?: number;\r\n}\r\n\r\n/**\r\n * Компонент FTableBody представляет собой тело таблицы (`<tbody>`).\r\n * Он поддерживает настройку стилей, выравнивания текста и передачу дочерних элементов.\r\n * Также реализована виртуализация строк для оптимизации производительности при большом количестве данных.\r\n *\r\n * @component\r\n * @example\r\n * <FTableBody st={{ backgroundColor: '#f9f9f9' }} textAlignment=\"center\">\r\n * <tr>\r\n * <td>Ячейка 1</td>\r\n * <td>Ячейка 2</td>\r\n * </tr>\r\n * <tr>\r\n * <td>Ячейка 3</td>\r\n * <td>Ячейка 4</td>\r\n * </tr>\r\n * </FTableBody>\r\n *\r\n * @param {IFTableBody} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент тела таблицы.\r\n */\r\nconst FTableBody: FC<IFTableBody> = ({\r\n st,\r\n children,\r\n textAlignment = 'left', // По умолчанию выравнивание слева\r\n tableWrapperRef,\r\n visibleRowCount = undefined,\r\n ...props\r\n}) => {\r\n\r\n /**\r\n * Ref для элемента `<tbody>`, используется для измерения высот строк.\r\n * @type {React.RefObject<HTMLTableSectionElement>}\r\n */\r\n const tableBodyRef = useRef<HTMLTableSectionElement>(null);\r\n\r\n /**\r\n * Преобразуем дочерние элементы в массив для удобства работы.\r\n * @type {React.ReactNode[]}\r\n */\r\n const flatChildren = useMemo(() => React.Children.toArray(children), [children]);\r\n const totalRows = flatChildren.length;\r\n\r\n // Состояние для хранения индекса первой видимой строки (только если виртуализация включена)\r\n const [startIdx, setStartIdx] = useState(0);\r\n\r\n /**\r\n * Состояние для хранения высот строк.\r\n * @type {number[]}\r\n */\r\n const [rowHeights, setRowHeights] = useState<number[]>(Array(flatChildren.length).fill(0));\r\n\r\n // --- Виртуализация ---\r\n // Если виртуализация выключена, рендерим все строки\r\n const virtualizationEnabled = typeof visibleRowCount === 'number' && visibleRowCount > 0;\r\n\r\n /**\r\n * Гарантируем, что массив `rowHeights` всегда соответствует количеству дочерних элементов.\r\n * Если количество детей увеличивается, добавляем недостающие нулевые значения.\r\n */\r\n useEffect(() => {\r\n if (rowHeights.length < flatChildren.length) {\r\n setRowHeights(prev => [...prev, ...Array(flatChildren.length - prev.length).fill(0)]);\r\n }\r\n }, [flatChildren.length, rowHeights.length]);\r\n\r\n // --- Обновление индекса первой видимой строки ---\r\n const updateStartIdx = useCallback(() => {\r\n if (!virtualizationEnabled) return;\r\n if (!tableWrapperRef?.current || !tableBodyRef.current) return;\r\n const wrapper = tableWrapperRef.current;\r\n const scrollTop = wrapper.scrollTop;\r\n let acc = 0;\r\n let idx = 0;\r\n for (let i = 0; i < rowHeights.length; i++) {\r\n if (acc + rowHeights[i] > scrollTop) {\r\n idx = i;\r\n break;\r\n }\r\n acc += rowHeights[i];\r\n }\r\n setStartIdx(idx);\r\n }, [rowHeights, tableWrapperRef, virtualizationEnabled]);\r\n\r\n // --- Обработчик скролла ---\r\n const handleScroll = useCallback(() => {\r\n if (!virtualizationEnabled) return;\r\n requestAnimationFrame(updateStartIdx);\r\n }, [updateStartIdx, virtualizationEnabled]);\r\n\r\n // --- Эффект для подписки на скролл и resize ---\r\n useEffect(() => {\r\n if (!virtualizationEnabled) return;\r\n const handleResize = () => requestAnimationFrame(updateStartIdx);\r\n window.addEventListener('resize', handleResize);\r\n tableWrapperRef?.current?.addEventListener('scroll', handleScroll);\r\n handleResize();\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n tableWrapperRef?.current?.removeEventListener('scroll', handleScroll);\r\n };\r\n }, [handleScroll, updateStartIdx, virtualizationEnabled]);\r\n\r\n // --- Измерение высот строк ---\r\n useLayoutEffect(() => {\r\n if (!tableBodyRef.current) return;\r\n const rows = tableBodyRef.current.querySelectorAll('tr[data-row-index]');\r\n const newHeights = [...rowHeights];\r\n let changed = false;\r\n rows.forEach((row, idx) => {\r\n // Если виртуализация выключена, индексы совпадают\r\n const realIdx = virtualizationEnabled ? startIdx + idx : idx;\r\n const h = row.getBoundingClientRect().height;\r\n if (h > 0 && newHeights[realIdx] !== h) {\r\n newHeights[realIdx] = h;\r\n changed = true;\r\n }\r\n });\r\n if (changed) setRowHeights(newHeights);\r\n }, [flatChildren, rowHeights, startIdx, virtualizationEnabled]);\r\n\r\n // --- Вычисление видимых строк ---\r\n let visibleItems: React.ReactNode[];\r\n let topOffset = 0;\r\n let bottomOffset = 0;\r\n if (virtualizationEnabled) {\r\n const endIdx = Math.min(startIdx + (visibleRowCount as number), totalRows);\r\n visibleItems = flatChildren.slice(startIdx, endIdx);\r\n function getEstimatedHeight(index: number, heights: number[]): number {\r\n for (let i = index - 1; i >= 0; i--) {\r\n if (heights[i] > 0) return heights[i];\r\n }\r\n for (let i = index + 1; i < heights.length; i++) {\r\n if (heights[i] > 0) return heights[i];\r\n }\r\n return 0;\r\n }\r\n topOffset = rowHeights.slice(0, startIdx).reduce((a, b, i) => a + (b > 0 ? b : getEstimatedHeight(i, rowHeights)), 0);\r\n bottomOffset = rowHeights.slice(endIdx).reduce((a, b, i) => a + (b > 0 ? b : getEstimatedHeight(endIdx + i, rowHeights)), 0);\r\n } else {\r\n visibleItems = flatChildren;\r\n }\r\n\r\n return (\r\n <tbody ref={tableBodyRef} style={st} {...props} className={`${styles['f-table-component__table_body']} ${props.className || ''} ${styles[textAlignment]}`}>\r\n {/* Пустая строка для создания отступа сверху */}\r\n {virtualizationEnabled && rowHeights.some(h => h > 0) && <tr style={{ height: topOffset }} />}\r\n {/* Рендерим строки */}\r\n {visibleItems.map((child, idx) => (\r\n React.isValidElement(child)\r\n ? React.cloneElement(child as React.ReactElement, { 'data-row-index': virtualizationEnabled ? startIdx + idx : idx, key: virtualizationEnabled ? startIdx + idx : idx })\r\n : child\r\n ))}\r\n {/* Пустая строка для создания отступа снизу */}\r\n {virtualizationEnabled && rowHeights.some(h => h > 0) && <tr style={{ height: bottomOffset }} />}\r\n </tbody>\r\n );\r\n};\r\n\r\nexport default React.memo(FTableBody);","import React, { FC, useEffect, useRef, useState } from \"react\";\r\nimport FTableHead, { IFTableHead } from \"../FTableHead/FTableHead\";\r\nimport FTableBody from \"../FTableBody\";\r\nimport { IFTableBody } from \"../FTableBody/FTableBody\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTable.\r\n * @interface IFTable\r\n * @extends {React.HTMLAttributes<HTMLTableElement>}\r\n */\r\nexport interface IFTable extends React.HTMLAttributes<HTMLTableElement> {\r\n /**\r\n * Дополнительные стили для таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, `<thead>`, `<tbody>`, `<tfoot>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Управление горизонтальным переполнением контейнера таблицы.\r\n * @type {\"visible\" | \"hidden\" | \"clip\" | \"scroll\" | \"auto\" | undefined}\r\n * @default \"auto\"\r\n */\r\n overflowX?: \"visible\" | \"hidden\" | \"clip\" | \"scroll\" | \"auto\";\r\n\r\n /**\r\n * Управление вертикальным переполнением контейнера таблицы.\r\n * @type {\"visible\" | \"hidden\" | \"clip\" | \"scroll\" | \"auto\" | undefined}\r\n * @default \"auto\"\r\n */\r\n overflowY?: \"visible\" | \"hidden\" | \"clip\" | \"scroll\" | \"auto\";\r\n\r\n /**\r\n * Флаг, указывающий, должен ли заголовок быть \"липким\" (sticky).\r\n * @type {boolean}\r\n * @default false\r\n */\r\n isSticky?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент FTable представляет собой таблицу с возможностью управления переполнением и \"липким\" заголовком.\r\n * Он поддерживает настройку стилей, обработку скролла и динамическое изменение состояния заголовка.\r\n *\r\n * @component\r\n * @example\r\n * <FTable overflowX=\"auto\" overflowY=\"scroll\">\r\n * <FTableHead>\r\n * <tr>\r\n * <th>Заголовок 1</th>\r\n * <th>Заголовок 2</th>\r\n * </tr>\r\n * </FTableHead>\r\n * <tbody>\r\n * <tr>\r\n * <td>Ячейка 1</td>\r\n * <td>Ячейка 2</td>\r\n * </tr>\r\n * </tbody>\r\n * </FTable>\r\n *\r\n * @param {IFTable} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент таблицы.\r\n */\r\nconst FTable: FC<IFTable> = ({\r\n st,\r\n children,\r\n overflowX = \"auto\", // По умолчанию горизонтальное переполнение автоматическое\r\n overflowY = \"auto\", // По умолчанию вертикальное переполнение автоматическое\r\n isSticky = true, // По умолчанию заголовок не \"липкий\"\r\n ...props\r\n}) => {\r\n const tableWrapperRef = useRef<HTMLDivElement>(null);\r\n const [isStickyState, setIsStickyState] = useState(false);\r\n\r\n useEffect(() => {\r\n /**\r\n * Обработчик события прокрутки для определения состояния \"липкости\" заголовка.\r\n */\r\n const handleScroll = () => {\r\n if (tableWrapperRef.current && isSticky) {\r\n // Проверяем, достигнут ли верхний край контейнера\r\n const isScrolled = tableWrapperRef.current.scrollTop > 0;\r\n setIsStickyState(isScrolled);\r\n }\r\n };\r\n\r\n const wrapper = tableWrapperRef.current;\r\n if (wrapper) {\r\n wrapper.addEventListener(\"scroll\", handleScroll);\r\n }\r\n\r\n return () => {\r\n if (wrapper) {\r\n wrapper.removeEventListener(\"scroll\", handleScroll);\r\n }\r\n };\r\n }, []);\r\n\r\n return (\r\n <div\r\n ref={tableWrapperRef}\r\n className={styles[\"f-table-component\"]}\r\n style={{ overflowX, overflowY }}\r\n >\r\n <table\r\n style={st}\r\n {...props}\r\n className={`table ${styles['f-table-component__table']} ${styles['bordered']} ${styles['bordered-half']} ${props.className || \"\"}`}\r\n >\r\n {React.Children.map(children, (child) => {\r\n if (\r\n React.isValidElement(child) &&\r\n child.type === FTableHead\r\n ) {\r\n // Явно приводим тип props к IFTableHead\r\n const headProps = child.props as IFTableHead;\r\n\r\n // Клонируем FTableHead и добавляем isStickyState\r\n return React.cloneElement(\r\n child as React.ReactElement<IFTableHead>,\r\n {\r\n ...headProps,\r\n isSticky: isStickyState,\r\n }\r\n );\r\n }\r\n\r\n if (\r\n React.isValidElement(child) &&\r\n child.type === FTableBody\r\n ) {\r\n // Явно приводим тип props к IFTableBody\r\n const headProps = child.props as IFTableBody;\r\n\r\n // Клонируем FTableBody и добавляем tableWrapperRef\r\n return React.cloneElement(\r\n child as React.ReactElement<IFTableBody>,\r\n {\r\n ...headProps,\r\n tableWrapperRef,\r\n }\r\n );\r\n }\r\n return child;\r\n })}\r\n </table>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FTable;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableRow.\r\n * @interface IFTableRow\r\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\r\n */\r\nexport interface IFTableRow extends React.HTMLAttributes<HTMLTableRowElement> {\r\n /**\r\n * Дополнительные стили для строки таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, ячейки `<td>` или `<th>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри строки.\r\n * @type {\"left\" | \"right\" | \"center\" | \"justify\"}\r\n * @default \"left\"\r\n */\r\n textAlignment?: \"left\" | \"right\" | \"center\" | \"justify\";\r\n}\r\n\r\n/**\r\n * Компонент FTableRow представляет собой строку таблицы (`<tr>`).\r\n * Он поддерживает настройку стилей и передачу дочерних элементов.\r\n *\r\n * @component\r\n * @example\r\n * <FTableRow st={{ backgroundColor: '#f9f9f9' }}>\r\n * <td>Ячейка 1</td>\r\n * <td>Ячейка 2</td>\r\n * </FTableRow>\r\n *\r\n * @param {IFTableRow} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент строки таблицы.\r\n */\r\nconst FTableRow: FC<IFTableRow> = ({\r\n st,\r\n children,\r\n textAlignment,\r\n ...props\r\n}) => {\r\n return (\r\n <tr\r\n style={st} // Применяем пользовательские стили\r\n {...props} // Передаем остальные пропсы\r\n className={`${styles['f-table-component__table_row']} ${props.className || ''}${textAlignment !== undefined ? ` ${styles[textAlignment]}` : ''}`} // Применяем классы стилей\r\n >\r\n {children}\r\n </tr>\r\n );\r\n};\r\n\r\nexport default FTableRow;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableHeaderCell.\r\n * @interface IFTableHeaderCell\r\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\r\n */\r\nexport interface IFTableHeaderCell extends React.ThHTMLAttributes<HTMLTableCellElement> {\r\n /**\r\n * Дополнительные стили для ячейки заголовка.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Значение rowspan для объединения строк.\r\n * @type {number}\r\n */\r\n row?: number;\r\n\r\n /**\r\n * Значение colspan для объединения столбцов.\r\n * @type {number}\r\n */\r\n col?: number;\r\n\r\n /**\r\n * Дочерние элементы (например, текст или другие компоненты).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри ячейки.\r\n * @type {'left' | 'right' | 'center' | 'justify'}\r\n * @default 'left'\r\n */\r\n textAlignment?: 'left' | 'right' | 'center' | 'justify';\r\n\r\n /**\r\n * Ширина ячейки.\r\n * @type {number | string}\r\n * @default 'auto'\r\n */\r\n width?: number | string;\r\n}\r\n\r\n/**\r\n * Компонент FTableHeaderCell представляет собой ячейку заголовка таблицы (`<th>`).\r\n * Он поддерживает настройку стилей, объединение строк и столбцов, а также выравнивание текста.\r\n *\r\n * @component\r\n * @example\r\n * <FTableHeaderCell\r\n * textAlignment=\"center\"\r\n * width=\"200px\"\r\n * row={2}\r\n * col={3}\r\n * >\r\n * Заголовок\r\n * </FTableHeaderCell>\r\n *\r\n * @param {IFTableHeaderCell} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент заголовка таблицы.\r\n */\r\nconst FTableHeaderCell: FC<IFTableHeaderCell> = ({\r\n st,\r\n row,\r\n col,\r\n children,\r\n textAlignment, // По умолчанию выравнивания нет\r\n width = 'auto', // По умолчанию ширина автоматическая\r\n ...props\r\n}) => {\r\n /**\r\n * Объединяем пользовательские стили с базовыми стилями.\r\n * @type {React.CSSProperties}\r\n */\r\n const style: React.CSSProperties = {\r\n textAlign: textAlignment,\r\n width,\r\n ...st,\r\n };\r\n\r\n return (\r\n <th\r\n rowSpan={row && row > 1 ? row : undefined} // Проверяем, чтобы row было больше 1\r\n colSpan={col && col > 1 ? col : undefined} // Проверяем, чтобы col было больше 1\r\n {...props}\r\n className={`${styles['f-table-component__table_header-cell']} ${props.className || ''}`}\r\n style={style}\r\n >\r\n {children}\r\n </th>\r\n );\r\n};\r\n\r\nexport default FTableHeaderCell;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableDataCell.\r\n * @interface IFTableDataCell\r\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\r\n */\r\nexport interface IFTableDataCell extends React.TdHTMLAttributes<HTMLTableCellElement> {\r\n /**\r\n * Дополнительные стили для ячейки таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Значение rowspan для объединения строк.\r\n * @type {number | undefined}\r\n */\r\n row?: number;\r\n\r\n /**\r\n * Значение colspan для объединения столбцов.\r\n * @type {number | undefined}\r\n */\r\n col?: number;\r\n\r\n /**\r\n * Дочерние элементы (например, текст или другие компоненты).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Выравнивание текста внутри ячейки.\r\n * @type {'left' | 'right' | 'center' | 'justify'}\r\n * @default 'left'\r\n */\r\n textAlignment?: 'left' | 'right' | 'center' | 'justify';\r\n\r\n /**\r\n * Высота ячейки.\r\n * @type {number | string}\r\n * @default 'auto'\r\n */\r\n height?: number | string;\r\n}\r\n\r\n/**\r\n * Компонент FTableDataCell представляет собой ячейку данных таблицы (`<td>`).\r\n * Он поддерживает настройку стилей, объединение строк и столбцов, а также обработку событий.\r\n *\r\n * @component\r\n * @example\r\n * <FTableDataCell\r\n * textAlignment=\"center\"\r\n * height=\"50px\"\r\n * row={2}\r\n * col={3}\r\n * onClick={() => console.log('Cell clicked!')}\r\n * >\r\n * Ячейка данных\r\n * </FTableDataCell>\r\n *\r\n * @param {IFTableDataCell} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент данных таблицы.\r\n */\r\nconst FTableDataCell: FC<IFTableDataCell> = ({\r\n st,\r\n row,\r\n col,\r\n children,\r\n textAlignment, // По умолчанию выравнивания нет\r\n height = 'auto', // По умолчанию высота автоматическая\r\n ...props\r\n}) => {\r\n /**\r\n * Объединяем пользовательские стили с базовыми стилями.\r\n * @type {React.CSSProperties}\r\n */\r\n const style: React.CSSProperties = {\r\n textAlign: textAlignment,\r\n height,\r\n ...st,\r\n };\r\n\r\n return (\r\n <td\r\n rowSpan={row && row > 1 ? row : undefined} // Проверяем, чтобы row было больше 1\r\n colSpan={col && col > 1 ? col : undefined} // Проверяем, чтобы col было больше 1\r\n {...props}\r\n className={`${styles['f-table-component__table_body-cell']} ${props.className || ''}`}\r\n style={style}\r\n >\r\n {children}\r\n </td>\r\n );\r\n};\r\n\r\nexport default FTableDataCell;","import React, { FC } from \"react\";\r\n\r\nimport styles from \"../static/FTable.module.scss\";\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FTableFooter.\r\n * @interface IFTableFooter\r\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\r\n */\r\nexport interface IFTableFooter extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n /**\r\n * Дополнительные стили для нижнего колонтитула таблицы.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (например, строки `<tr>` или ячейки `<td>`).\r\n * @type {React.ReactNode}\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Компонент FTableFooter представляет собой нижний колонтитул таблицы (`<tfoot>`).\r\n * Он поддерживает настройку стилей и передачу дочерних элементов.\r\n *\r\n * @component\r\n * @example\r\n * <FTableFooter st={{ borderTop: '2px solid #000' }}>\r\n * <tr>\r\n * <td>Итого</td>\r\n * <td>100</td>\r\n * </tr>\r\n * </FTableFooter>\r\n *\r\n * @param {IFTableFooter} props - Пропсы компонента.\r\n * @returns {JSX.Element} - Элемент нижнего колонтитула таблицы.\r\n */\r\nconst FTableFooter: FC<IFTableFooter> = ({\r\n st,\r\n children,\r\n ...props\r\n}) => {\r\n return (\r\n <tfoot\r\n style={st} // Применяем пользовательские стили\r\n {...props} // Передаем остальные пропсы\r\n className={`${styles[\"f-table-component__table_footer\"]} ${props.className || \"\"}`}\r\n\r\n >\r\n {children}\r\n </tfoot>\r\n );\r\n};\r\n\r\nexport default FTableFooter;","import { FC, useEffect } from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\n\r\nimport styles from \"../style/FDialog.module.scss\";\r\n\r\n/**\r\n * Тип ширины диалогового окна.\r\n */\r\nexport type DialogWidth = 'xs' | 'md' | 'lg' | 'xxl' | 'adaptive';\r\n\r\n/**\r\n * Пропсы компонента `FDialog`.\r\n */\r\nexport interface IFDialog {\r\n /**\r\n * Флаг открытия/закрытия диалога.\r\n */\r\n openAndClose: boolean;\r\n\r\n /**\r\n * Callback для закрытия диалога (например, из родителя).\r\n */\r\n closeButtonBackPage?: React.Dispatch<React.SetStateAction<boolean>>;\r\n\r\n /**\r\n * Если true — скрывает фон и контент за диалогом.\r\n */\r\n hide?: boolean;\r\n\r\n /**\r\n * Контент внутри диалога (может быть любым React-узлом).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Кастомный CSS класс.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для корневого контейнера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Ширина диалога.\r\n * @default 'lg'\r\n */\r\n width?: DialogWidth;\r\n}\r\n\r\n/**\r\n * Компонент `FDialog` — модальное окно, которое отображается поверх основного контента.\r\n *\r\n * Поддерживает:\r\n * - настройку ширины (`xs`, `md`, `lg`, `xxl`, `adaptive`)\r\n * - скрытие фона (`hide`)\r\n * - управление состоянием через `closeButtonBackPage`\r\n * - прокидывание кастомных стилей и классов\r\n *\r\n * @component\r\n * @example\r\n * <FDialog\r\n * openAndClose={isOpen}\r\n * closeButtonBackPage={setIsOpen}\r\n * width=\"md\"\r\n * className=\"custom-dialog\"\r\n * st={{ maxWidth: '600px' }}\r\n * >\r\n * <p>Содержимое диалога</p>\r\n * </FDialog>\r\n *\r\n * @param {boolean} openAndClose - Открывает/закрывает диалог.\r\n * @param {Function} [closeButtonBackPage] - Callback для закрытия диалога.\r\n * @param {boolean} [hide=false] - Если true — фон затемняется и блокируется.\r\n * @param {React.ReactNode} [children] - Контент диалога.\r\n * @param {string} [id] - HTML ID.\r\n * @param {string} [className] - Кастомный класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {DialogWidth} [width='lg'] - Ширина диалога.\r\n *\r\n * @returns {JSX.Element | null} — Рендерит диалог или null, если не открыт.\r\n */\r\nconst FDialog: FC<IFDialog> = ({\r\n openAndClose,\r\n closeButtonBackPage,\r\n hide = false,\r\n children,\r\n id,\r\n className,\r\n st,\r\n width = 'lg',\r\n}) => {\r\n // Обновляем состояние body при открытии/закрытии\r\n useEffect(() => {\r\n if (!openAndClose) return;\r\n\r\n const dialogCount = document.querySelectorAll(\".active-dialog\").length;\r\n\r\n if (dialogCount > 0) {\r\n document.body.classList.add(\"open-dialog\");\r\n } else {\r\n document.body.classList.remove(\"open-dialog\");\r\n }\r\n\r\n return () => {\r\n const updatedCount = document.querySelectorAll(\".active-dialog\").length;\r\n if (updatedCount === 0) {\r\n document.body.classList.remove(\"open-dialog\");\r\n }\r\n };\r\n }, [openAndClose]);\r\n\r\n // Не рендерим, если не открыто\r\n if (!openAndClose) return null;\r\n\r\n // Объект с ширинами\r\n const widthStyles: Record<DialogWidth, string> = {\r\n xs: '50vw',\r\n md: '65vw',\r\n lg: '80vw',\r\n xxl: '95vw',\r\n adaptive: 'fit-content',\r\n };\r\n\r\n const contentWidth = widthStyles[width];\r\n\r\n return ReactDOM.createPortal(\r\n <div\r\n id={id}\r\n style={st}\r\n className={`${styles[\"f-dialog\"]} ${openAndClose ? styles[\"active-dialog\"] : ''} ${className || ''}`}\r\n onClick={() => closeButtonBackPage?.(false)}\r\n >\r\n <div\r\n className={`${styles[\"f-dialog__content\"]} ${openAndClose ? styles['active'] : ''} ${hide ? styles['hide'] : ''}`}\r\n style={{\r\n width: contentWidth,\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {children}\r\n </div>\r\n </div>,\r\n document.body\r\n );\r\n};\r\n\r\nexport default FDialog;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FCloseIcon.\r\n * @interface IFCloseIcon\r\n */\r\nexport interface IFCloseIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события закрытия (клика по иконке).\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClose?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FCloseIcon представляет собой SVG иконку закрытия (крестик) с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FCloseIcon\r\n * @param {IFCloseIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClose] - Обработчик события закрытия (клика по иконке).\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FCloseIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClose={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FCloseIcon = React.forwardRef<SVGSVGElement, IFCloseIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClose, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClose ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClose}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFCloseIcon.displayName = 'FCloseIcon';\r\n\r\nexport default FCloseIcon;\r\n","import { FC } from \"react\";\r\nimport FCloseIcon from \"@icons/FCloseIcon\";\r\nimport styles from \"../style/FDialog.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FDialogHeader.\r\n */\r\nexport interface IFDialogHeader {\r\n /**\r\n * Заголовок диалога (отображается как текст).\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Callback, вызываемый при нажатии на кнопку закрытия.\r\n */\r\n handleClose?: () => void;\r\n}\r\n\r\n/**\r\n * Компонент `FDialogHeader` — шапка модального окна с заголовком и кнопкой закрытия.\r\n *\r\n * Используется внутри `FDialog`, чтобы отобразить заголовок и контролы в верхней части окна.\r\n *\r\n * @component\r\n * @example\r\n * <FDialogHeader\r\n * title=\"Подтвердите действие\"\r\n * handleClose={() => setIsOpen(false)}\r\n * />\r\n *\r\n * @param {string} [title] - Текст заголовка диалога.\r\n * @param {Function} [handleClose] - Callback для закрытия диалога.\r\n *\r\n * @returns {JSX.Element} — Рендерит шапку с заголовком и кнопкой закрытия.\r\n */\r\nconst FDialogHeader: FC<IFDialogHeader> = ({ title, handleClose }) => {\r\n return (\r\n <div className={styles[\"f-dialog__header\"]}>\r\n <h3 className={styles[\"f-dialog__header_title\"]}>\r\n {title}\r\n </h3>\r\n {handleClose && (\r\n <div className={styles[\"f-dialog__header_close\"]}>\r\n <FCloseIcon\r\n handleClose={handleClose}\r\n color=\"primary\"\r\n size={30}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FDialogHeader;","import { FC } from \"react\";\r\nimport styles from \"../style/FDialog.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FDialogBody.\r\n */\r\nexport interface IFDialogBody {\r\n /**\r\n * Инлайновые стили для контейнера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Контент внутри тела диалога (может быть любым React-узлом).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Включает вертикальную прокрутку при переполнении.\r\n * @default true\r\n */\r\n scroll?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FDialogBody` — тело модального окна с возможностью прокрутки.\r\n *\r\n * Используется внутри `FDialog` для отображения содержимого.\r\n *\r\n * @component\r\n * @example\r\n * <FDialogBody scroll={false} st={{ padding: '2rem' }}>\r\n * <p>Контент без прокрутки и с кастомным паддингом</p>\r\n * </FDialogBody>\r\n *\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {boolean} [scroll=true] - Если true — включает вертикальную прокрутку.\r\n * @param {React.ReactNode} [children] - Содержимое тела диалога.\r\n *\r\n * @returns {JSX.Element} — Рендерит обёртку с заданными стилями и прокруткой.\r\n */\r\nconst FDialogBody: FC<IFDialogBody> = ({ st, children, scroll = true }) => {\r\n const style = {\r\n ...(scroll ? { overflowY: 'auto' as const } : {}),\r\n ...st,\r\n };\r\n\r\n return (\r\n <div className={styles[\"f-dialog__body\"]} style={style}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FDialogBody;","import { FC } from \"react\";\r\nimport styles from \"../style/FDialog.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FDialogFooter.\r\n */\r\nexport interface IFDialogFooter {\r\n /**\r\n * Контент внутри футера (может быть любым React-узлом).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для футера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * HTML ID для идентификации элемента.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FDialogFooter` — область футера модального окна.\r\n *\r\n * Используется внутри `FDialog` для отображения кнопок или других элементов в нижней части диалога.\r\n *\r\n * @component\r\n * @example\r\n * <FDialogFooter\r\n * className=\"custom-footer\"\r\n * st={{ padding: '1rem', justifyContent: 'flex-end' }}\r\n * id=\"dialog-footer\"\r\n * >\r\n * <button>Закрыть</button>\r\n * </FDialogFooter>\r\n *\r\n * @param {React.ReactNode} [children] - Содержимое футера.\r\n * @param {string} [className] - Дополнительный CSS класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - HTML ID элемента.\r\n *\r\n * @returns {JSX.Element} — Рендерит обёртку с заданными стилями и классами.\r\n */\r\nconst FDialogFooter: FC<IFDialogFooter> = ({ children, className, st, id }) => {\r\n return (\r\n <div\r\n id={id}\r\n style={st}\r\n className={`${styles[\"f-dialog__footer\"]} ${className || ''}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FDialogFooter;","import { FC } from 'react';\r\nimport styles from './FProgress.module.scss';\r\n\r\n/**\r\n * Тип цвета для прогресс-бара или спиннера.\r\n *\r\n * @typedef {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'} ProgressColorType\r\n */\r\ntype ProgressColorType =\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'danger'\r\n | 'warning'\r\n | 'info'\r\n | 'light'\r\n | 'dark'\r\n | 'link';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FProgress.\r\n *\r\n * @interface IFProgress\r\n */\r\nexport interface IFProgress {\r\n /**\r\n * Инлайновые стили для внешнего контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Цвет индикатора загрузки.\r\n * @default 'primary'\r\n */\r\n color?: ProgressColorType;\r\n\r\n /**\r\n * Уникальный идентификатор уведомления.\r\n * Если не указан, генерируется автоматически.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n \r\n /**\r\n * Дополнительный CSS-класс для кастомизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FProgress` — индикатор загрузки (спиннер) с поддержкой:\r\n * - разных цветов (`primary`, `success`, `danger` и т.д.)\r\n * - пользовательских стилей через `st`\r\n * - CSS Modules для изоляции стилей\r\n *\r\n * Используется как универсальный спиннер, например на экране авторизации.\r\n *\r\n * @component\r\n * @example\r\n * // Простой пример\r\n * <FProgress />\r\n *\r\n * @example\r\n * // С кастомным стилем и цветом\r\n * <FProgress\r\n * color=\"danger\"\r\n * st={{ margin: '40px auto', width: 'fit-content' }}\r\n * />\r\n *\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {ProgressColorType} [color='primary'] - Цвет индикатора.\r\n * @param {string} [id] - HTML ID.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n *\r\n * @returns {JSX.Element} — Рендерит спиннер с указанным цветом и стилями.\r\n */\r\nconst FProgress: FC<IFProgress> = ({ st, color = 'primary', id, className }) => {\r\n\r\n return (\r\n <div\r\n className={`${styles['authorization-spinner']} ${styles.visible} ${className || ''}`}\r\n id={id}\r\n style={st}\r\n >\r\n <div className={`${styles['spinner-item']} ${styles[color]}`} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default FProgress;","import { FC, useEffect } from \"react\";\r\nimport styles from \"./FPreloader.module.scss\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FPreloader.\r\n *\r\n * @interface IFPreloader\r\n */\r\nexport interface IFPreloader {\r\n /**\r\n * Инлайновые стили для контейнера прелоадера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Цвет фона спиннера (прозрачности и т.д.)\r\n * @default '#e0e0e0'\r\n */\r\n backgroundColor?: string;\r\n\r\n /**\r\n * Дочерние элементы — обычно это SVG или индикатор загрузки.\r\n * @type {React.ReactElement | React.ReactNode | undefined}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Флаг открытия/закрытия прелоадера.\r\n * @type {boolean}\r\n */\r\n open: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FPreloader` — универсальный прелоадер (спиннер) с возможностью:\r\n * - управления состоянием через `open`\r\n * - кастомного цвета фона\r\n * - добавления дочерних элементов (например, логотипа)\r\n * - поддержка темизации через CSS Module\r\n *\r\n * При `open={true}` блокирует `body` скролл и показывает спиннер.\r\n *\r\n * @component\r\n * @example\r\n * // Базовое использование\r\n * <FPreloader open={true}>\r\n * <FLoadIcon size={24} />\r\n * </FPreloader>\r\n *\r\n * @example\r\n * // С пользовательским стилем и фоном\r\n * <FPreloader\r\n * open={isLoading}\r\n * backgroundColor=\"#ffffffaa\"\r\n * st={{ zIndex: 9999 }}\r\n * >\r\n * <div>Загрузка...</div>\r\n * </FPreloader>\r\n *\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для контейнера.\r\n * @param {string} [backgroundColor='#e0e0e0'] - Цвет фона спиннера.\r\n * @param {React.ReactNode} [children] - Элементы, отображаемые внутри.\r\n * @param {boolean} open - Открывать ли спиннер.\r\n *\r\n * @returns {JSX.Element} — Рендерит прелоадер поверх всего содержимого.\r\n */\r\nconst FPreloader: FC<IFPreloader> = ({\r\n st,\r\n backgroundColor = '#e0e0e0',\r\n children,\r\n open\r\n}) => {\r\n\r\n const mergedStyle: React.CSSProperties = {\r\n backgroundColor,\r\n ...st\r\n };\r\n\r\n useEffect(() => {\r\n if (document.querySelectorAll(\".active-preloader\").length > 0) {\r\n document.body.classList.add('open-preloader');\r\n } else {\r\n document.body.classList.remove('open-preloader');\r\n }\r\n\r\n return () => {\r\n document.body.classList.remove('open-preloader');\r\n };\r\n }, [open]);\r\n\r\n return (\r\n <div\r\n className={`${styles['f-preloader']} ${open ? styles['active-preloader'] : ''}`}\r\n style={mergedStyle}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FPreloader;","import { forwardRef } from \"react\";\r\n\r\nimport styles from \"./FCheckbox.module.scss\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FCheckbox.\r\n *\r\n * @interface IFCheckbox\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFCheckbox extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Текст или элемент, отображаемый рядом с чекбоксом.\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n label?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации контейнера.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * Компонент `FCheckbox` — кастомный чекбокс с поддержкой:\r\n * - метки (label)\r\n * - пользовательских классов и стилей\r\n * - всех стандартных атрибутов `<input type=\"checkbox\">`\r\n *\r\n * Использует CSS Modules для изоляции стилей.\r\n *\r\n * @component\r\n * @example\r\n * <FCheckbox\r\n * label=\"Согласен с условиями\"\r\n * defaultChecked={true}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским классом и стилем\r\n * <FCheckbox\r\n * label={<span>Подписаться на рассылку</span>}\r\n * className=\"my-custom-checkbox\"\r\n * st={{ marginBottom: '1rem' }}\r\n * />\r\n *\r\n * @param {React.ReactNode} [label] - Текст/элемент рядом с чекбоксом.\r\n * @param {string} [className] - Дополнительный CSS-класс для обёртки.\r\n * @param {string} [id] - ID для контейнера.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для контейнера.\r\n * @param {...React.InputHTMLAttributes<HTMLInputElement>} props - Атрибуты HTMLInputElement.\r\n *\r\n * @returns {JSX.Element} - Рендерит кастомный чекбокс с меткой.\r\n */\r\nconst FCheckbox = forwardRef<HTMLInputElement, IFCheckbox>(\r\n (\r\n {\r\n label,\r\n className,\r\n st,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <div\r\n className={`${styles['f-checkbox']} ${className || ''}`}\r\n style={st}\r\n >\r\n <label>\r\n <input ref={ref} type=\"checkbox\" {...props} />\r\n {label}\r\n </label>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FCheckbox;","import { forwardRef } from \"react\";\r\nimport styles from './RadioButton.module.scss';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FRadioButton.\r\n *\r\n * @interface IFRadioButton\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFRadioButton extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Дочерний элемент, отображается рядом с радио-кнопкой (например, текст или иконка).\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n label?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для внешнего контейнера.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * Компонент `FRadioButton` — кастомная радио-кнопка с поддержкой:\r\n * - различных цветовых вариантов\r\n * - метки (label)\r\n * - инлайновых стилей\r\n * - темизации через CSS Modules\r\n * - всех стандартных атрибутов `<input type=\"radio\">`\r\n *\r\n * @component\r\n * @example\r\n * <FRadioButton\r\n * label=\"Выбрать\"\r\n * checked={isChecked}\r\n * onChange={handleChange}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским классом и стилем\r\n * <FRadioButton\r\n * label=\"Заблокировано\"\r\n * disabled\r\n * className={styles.danger}\r\n * st={{ margin: '1rem 0' }}\r\n * />\r\n *\r\n * @param {React.ReactNode} [label] - Текст или элемент рядом с радио.\r\n * @param {string} [className] - Пользовательский класс для цвета/стилей.\r\n * @param {string} [id] - ID элемента.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {...React.InputHTMLAttributes<HTMLInputElement>} props - Атрибуты HTMLInputElement.\r\n *\r\n * @returns {JSX.Element} — Рендерит кастомную радио-кнопку с меткой.\r\n */\r\nconst FRadioButton = forwardRef<HTMLInputElement, IFRadioButton>(\r\n (\r\n {\r\n label,\r\n className,\r\n st,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <div\r\n className={`${styles['f-radio']} ${className || ''}`}\r\n style={st}\r\n >\r\n <label>\r\n <input ref={ref} type=\"radio\" {...props} />\r\n {label}\r\n </label>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FRadioButton;","import { useMemo } from 'react';\r\n\r\n/**\r\n * Константа, обозначающая точки (`...`) между страницами.\r\n * @constant DOTS\r\n * @type {string}\r\n */\r\nexport const DOTS = '...';\r\n\r\n/**\r\n * Функция генерации массива чисел от `start` до `end`.\r\n *\r\n * @function range\r\n * @param {number} start - Начальное число диапазона (включительно).\r\n * @param {number} end - Конечное число диапазона (включительно).\r\n * @returns {number[]} — Массив чисел от `start` до `end`.\r\n *\r\n * @example\r\n * range(1, 5); // [1, 2, 3, 4, 5]\r\n */\r\nconst range = (start: number, end: number): number[] => {\r\n const length = end - start + 1;\r\n return Array.from({ length }, (_, idx) => idx + start);\r\n};\r\n\r\n/**\r\n * Интерфейс параметров для хука `usePagination`.\r\n *\r\n * @interface IUsePaginationProps\r\n */\r\ninterface IProps {\r\n /**\r\n * Текущая активная страница. Нумерация начинается с 1.\r\n * @type {number}\r\n */\r\n currentPage: number;\r\n\r\n /**\r\n * Общее количество элементов (например, записей).\r\n * @type {number}\r\n */\r\n totalCount: number;\r\n\r\n /**\r\n * Количество элементов на одной странице.\r\n * @type {number}\r\n */\r\n pageSize: number;\r\n\r\n /**\r\n * Количество соседних страниц, показываемых по обе стороны от текущей.\r\n * Допустимые значения: `0`, `1` или `2`.\r\n * @type {number}\r\n */\r\n siblingCount: number;\r\n}\r\n\r\n/**\r\n * Хук `usePagination` рассчитывает диапазон страниц для отображения,\r\n * включая поддержку точек (`...`) при большом количестве страниц.\r\n *\r\n * Используется в компоненте `FPagination`.\r\n *\r\n * @function usePagination\r\n * @param {IProps} props - Параметры пагинации.\r\n * @param {number} props.currentPage - Текущая страница (начинается с 1).\r\n * @param {number} props.totalCount - Общее количество элементов.\r\n * @param {number} props.pageSize - Элементов на странице.\r\n * @param {number} props.siblingCount - Сколько соседей показывать вокруг текущей страницы.\r\n *\r\n * @returns {Array<number | string> | null} — Возвращает массив с номерами страниц и точками (`'...'`),\r\n * или `null`, если не нужно отображать пагинацию.\r\n *\r\n * @example\r\n * const paginationRange = usePagination({\r\n * currentPage: 2,\r\n * totalCount: 100,\r\n * pageSize: 10,\r\n * siblingCount: 1\r\n * });\r\n * // returns [1, 2, 3, \"...\", 10]\r\n *\r\n * @example\r\n * // При малом количестве страниц\r\n * usePagination({\r\n * currentPage: 3,\r\n * totalCount: 30,\r\n * pageSize: 10,\r\n * siblingCount: 1\r\n * });\r\n * // returns [1, 2, 3]\r\n */\r\nexport const usePagination = ({\r\n totalCount,\r\n pageSize,\r\n siblingCount = 1,\r\n currentPage\r\n}: IProps) => {\r\n const paginationRange = useMemo(() => {\r\n const totalPageCount = Math.ceil(totalCount / pageSize);\r\n\r\n const totalPageNumbers = siblingCount + 5; // 1 (current) + 2* siblingCount + first + last + dots\r\n\r\n if (totalPageNumbers >= totalPageCount) {\r\n return range(1, totalPageCount);\r\n }\r\n\r\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\r\n const rightSiblingIndex = Math.min(\r\n currentPage + siblingCount,\r\n totalPageCount\r\n );\r\n\r\n const shouldShowLeftDots = leftSiblingIndex > 2;\r\n const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2;\r\n\r\n const firstPageIndex = 1;\r\n const lastPageIndex = totalPageCount;\r\n\r\n if (!shouldShowLeftDots && shouldShowRightDots) {\r\n const leftItemCount = 3 + 2 * siblingCount;\r\n const leftRange = range(1, leftItemCount);\r\n return [...leftRange, DOTS, totalPageCount];\r\n }\r\n\r\n if (shouldShowLeftDots && !shouldShowRightDots) {\r\n const rightItemCount = 3 + 2 * siblingCount;\r\n const rightRange = range(\r\n totalPageCount - rightItemCount + 1,\r\n totalPageCount\r\n );\r\n return [firstPageIndex, DOTS, ...rightRange];\r\n }\r\n\r\n if (shouldShowLeftDots && shouldShowRightDots) {\r\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\r\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];\r\n }\r\n\r\n return null;\r\n }, [totalCount, pageSize, siblingCount, currentPage]);\r\n\r\n return paginationRange;\r\n};","import { FC } from 'react';\r\n\r\nimport { DOTS, usePagination } from './hooks/usePagination';\r\nimport styles from './FPagination.module.scss';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FPagination.\r\n *\r\n * @interface IFPagination\r\n */\r\nexport interface IFPagination {\r\n /**\r\n * Номер текущей страницы (начинается с 1).\r\n * @type {number}\r\n */\r\n currentPage: number;\r\n\r\n /**\r\n * Общее количество элементов (для вычисления страниц).\r\n * @type {number}\r\n */\r\n totalCount: number;\r\n\r\n /**\r\n * Количество элементов на странице.\r\n * @type {number}\r\n */\r\n pageSize: number;\r\n\r\n /**\r\n * Callback при изменении страницы. Принимает номер страницы или строку (\"prev\", \"next\").\r\n * @param {number | string} page - новый номер страницы или команда.\r\n */\r\n onPageChange: (page: number | string) => void;\r\n\r\n /**\r\n * Уникальный ID элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для контейнера пагинации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для внешнего контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Сколько соседних страниц показывать вокруг текущей (0, 1 или 2).\r\n * @type {0 | 1 | 2}\r\n */\r\n siblingCount: 0 | 1 | 2;\r\n}\r\n\r\n/**\r\n * Компонент `FPagination` — горизонтальная навигация по страницам.\r\n *\r\n * Показывает:\r\n * - кнопки для перехода к предыдущей/следующей странице\r\n * - диапазон страниц\r\n * - точки (`...`) при большом количестве страниц\r\n *\r\n * @component\r\n * @example\r\n * <FPagination\r\n * currentPage={currentPage}\r\n * totalCount={100}\r\n * pageSize={5}\r\n * siblingCount={1}\r\n * onPageChange={(page) => setCurrentPage(page)}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским классом и стилем\r\n * <FPagination\r\n * currentPage={1}\r\n * totalCount={100}\r\n * pageSize={10}\r\n * siblingCount={2}\r\n * onPageChange={(page) => console.log('Перешли на', page)}\r\n * className=\"custom-pagination\"\r\n * st={{ justifyContent: 'flex-start' }}\r\n * />\r\n *\r\n * @param {number} currentPage - Номер текущей страницы (начинается с 1).\r\n * @param {number} totalCount - Общее количество записей.\r\n * @param {number} pageSize - Элементов на странице.\r\n * @param {(page: number | string) => void} onPageChange - Изменение страницы.\r\n * @param {string} [id] - HTML ID для контейнера.\r\n * @param {string} [className] - Дополнительный CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {0 | 1 | 2} siblingCount - Число видимых страниц рядом с текущей.\r\n *\r\n * @returns {JSX.Element | null} — Рендерит `<ul>` с кнопками навигации или возвращает `null`, если не нужно отображать.\r\n */\r\nconst FPagination: FC<IFPagination> = ({\r\n currentPage,\r\n totalCount,\r\n pageSize,\r\n onPageChange,\r\n id,\r\n className,\r\n st,\r\n siblingCount\r\n}) => {\r\n const paginationRange = usePagination({\r\n currentPage,\r\n totalCount,\r\n siblingCount,\r\n pageSize\r\n });\r\n\r\n if (currentPage === 0 || !paginationRange || paginationRange.length < 2) {\r\n return null;\r\n }\r\n\r\n const onNext = () => onPageChange(currentPage + 1);\r\n const onPrevious = () => onPageChange(currentPage - 1);\r\n const lastPage = paginationRange[paginationRange.length - 1];\r\n\r\n return (\r\n <ul\r\n className={`${styles['pagination-container']} ${className || ''}`}\r\n style={st}\r\n id={id}\r\n >\r\n <li\r\n className={`${styles['pagination-item']} ${currentPage === 1 ? styles.disabled : ''}`}\r\n onClick={onPrevious}\r\n >\r\n <div className={`${styles.arrow} ${styles.left}`} />\r\n </li>\r\n\r\n {paginationRange.map((pageNumber, index) => {\r\n if (pageNumber === DOTS) {\r\n return (\r\n <li key={index} className={`${styles['pagination-item']} ${styles.dots}`}>\r\n …\r\n </li>\r\n );\r\n }\r\n\r\n return (\r\n <li\r\n key={index}\r\n className={`${styles['pagination-item']} ${pageNumber === currentPage ? styles.selected : ''}`}\r\n onClick={() => onPageChange(pageNumber)}\r\n >\r\n {pageNumber}\r\n </li>\r\n );\r\n })}\r\n\r\n <li\r\n className={`${styles['pagination-item']} ${currentPage === lastPage ? styles.disabled : ''}`}\r\n onClick={onNext}\r\n >\r\n <div className={`${styles.arrow} ${styles.right}`} />\r\n </li>\r\n </ul>\r\n );\r\n};\r\n\r\nexport default FPagination;","import { FC } from 'react';\r\n\r\nimport styles from \"../static/FTimeline.module.scss\";\r\n\r\nexport interface IFTimeline {\r\n children?: React.ReactElement | React.ReactNode,\r\n st?: React.CSSProperties,\r\n id?: string,\r\n className?: string\r\n}\r\n\r\nconst FTimeline: FC<IFTimeline> = ({\r\n children,\r\n st,\r\n id,\r\n className\r\n}) => {\r\n\r\n return (\r\n <div className={`${styles[\"f-time-line\"]} ${className || ''}`} style={st} id={id}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FTimeline;","import { FC } from 'react';\r\n\r\nimport styles from \"../static/FTimeline.module.scss\";\r\n\r\nexport interface IFTimelineCard {\r\n children?: React.ReactElement | React.ReactNode,\r\n st?: React.CSSProperties,\r\n title?: string,\r\n id?: string,\r\n className?: string\r\n}\r\n\r\nconst FTimelineCard: FC<IFTimelineCard> = ({\r\n children,\r\n st,\r\n title,\r\n id,\r\n className\r\n}) => {\r\n return (\r\n <div className={`${styles[\"f-time-line__block\"]} ${className || ''}`} id={id}>\r\n <div className={styles['f-time-line__block-circle']} />\r\n <div className={styles['f-time-line__block-inner']} style={st}>\r\n {title && <div className={styles['f-time-line__block-title']}>{title}</div>}\r\n <div className={styles['f-time-line__block-content']}>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FTimelineCard;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowIcon.\r\n * @interface IFArrowIcon\r\n */\r\nexport interface IFArrowIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Направление стрелки.\r\n * @type {('up' | 'down' | 'left' | 'right')}\r\n * @default 'right'\r\n */\r\n direction?: 'up' | 'down' | 'left' | 'right';\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowIcon представляет собой SVG иконку стрелки с возможностью настройки цвета, размера, направления и обработки кликов.\r\n *\r\n * @function FArrowIcon\r\n * @param {IFArrowIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {('up' | 'down' | 'left' | 'right')} [direction='right'] - Направление стрелки. По умолчанию 'right'.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * direction=\"down\"\r\n * handleClick={() => console.log('Arrow clicked!')}\r\n * />\r\n */\r\nconst FArrowIcon = React.forwardRef<SVGSVGElement, IFArrowIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n direction = 'right',\r\n handleClick,\r\n id,\r\n className,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n\r\n const style = {\r\n transform: `rotate(\r\n ${direction === 'down' ? 90 :\r\n direction === 'up' ? -90 :\r\n direction === 'right' ? 0 :\r\n 180}deg)`\r\n }\r\n\r\n st = Object.assign({}, style, st)\r\n\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 320 512\"\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n style={st}\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"></path>\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowIcon.displayName = 'FArrowIcon';\r\n\r\nexport default FArrowIcon;\r\n","import { FC, useEffect, useState, useCallback } from 'react';\r\n\r\nimport styles from './FOpenImgFull.module.scss';\r\nimport FCloseIcon from '@icons/FCloseIcon';\r\nimport FArrowIcon from '@icons/FArrowIcon';\r\n\r\nimport FDialog from '@material/Dialog/FDialog';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента `FOpenImgFull`.\r\n *\r\n * @interface IFOpenImgFull\r\n */\r\nexport interface IFOpenImgFull {\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для контейнера.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для диалогового окна.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Массив URL-адресов изображений.\r\n * @type {string[]}\r\n * @required\r\n */\r\n imagesUrl: string[];\r\n\r\n /**\r\n * Индекс активного изображения.\r\n * @type {number}\r\n * @required\r\n */\r\n selectedImg: number;\r\n\r\n /**\r\n * Функция изменения текущего изображения.\r\n * @param {number} index - Новый индекс изображения.\r\n * @returns {void}\r\n */\r\n setSelectedImg: (index: number) => void;\r\n\r\n /**\r\n * Callback, вызываемый при закрытии диалога.\r\n * @type {() => void | undefined}\r\n */\r\n handleClose?: () => void;\r\n\r\n /**\r\n * Флаг открытия/закрытия модального окна.\r\n * @type {boolean}\r\n */\r\n openAndClose: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FOpenImgFull` — модальное окно для просмотра изображений в полный экран с навигацией.\r\n *\r\n * Отображает:\r\n * - текущее изображение по индексу `selectedImg`\r\n * - стрелки навигации (влево/вправо)\r\n * - кнопку закрытия (`FCloseIcon`)\r\n *\r\n * Используется в связке с `FDialog` и поддерживает кастомные стили и классы.\r\n *\r\n * @component\r\n * @example\r\n * // Базовое использование\r\n * const [open, setOpen] = useState(true);\r\n * const [selected, setSelected] = useState(0);\r\n *\r\n * <FOpenImgFull\r\n * imagesUrl={['/img1.jpg', '/img2.png']}\r\n * selectedImg={selected}\r\n * setSelectedImg={setSelected}\r\n * openAndClose={open}\r\n * handleClose={() => setOpen(false)}\r\n * />\r\n *\r\n * @example\r\n * // С пользовательским стилем\r\n * <FOpenImgFull\r\n * imagesUrl={['/img1.jpg']}\r\n * selectedImg={0}\r\n * setSelectedImg={(i) => console.log(i)}\r\n * openAndClose={true}\r\n * st={{ maxWidth: '90%', maxHeight: '90%' }}\r\n * />\r\n *\r\n * @param {string[]} imagesUrl - Массив ссылок на изображения.\r\n * @param {number} selectedImg - Индекс текущего изображения.\r\n * @param {(index: number) => void} setSelectedImg - Обработчик изменения изображения.\r\n * @param {() => void} [handleClose] - Callback, вызывается при закрытии.\r\n * @param {boolean} openAndClose - Флаг открытия/закрытия окна.\r\n * @param {string} [id] - ID элемента.\r\n * @param {string} [className] - Пользовательский CSS-класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n *\r\n * @returns {JSX.Element | null} — Рендерит модальное окно с изображением или `null`, если данные некорректны.\r\n */\r\nconst FOpenImgFull: FC<IFOpenImgFull> = ({\r\n id,\r\n className,\r\n st,\r\n imagesUrl,\r\n selectedImg,\r\n setSelectedImg,\r\n handleClose,\r\n openAndClose\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState(false);\r\n const [touchStart, setTouchStart] = useState<number | null>(null);\r\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\r\n const [isZoomed, setIsZoomed] = useState(false);\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n setError(false);\r\n setIsZoomed(false);\r\n\r\n // Предзагрузка следующего изображения\r\n const nextImage = new Image();\r\n nextImage.src = imagesUrl[selectedImg];\r\n nextImage.onload = () => {\r\n setIsLoading(false);\r\n };\r\n nextImage.onerror = () => {\r\n setError(true);\r\n setIsLoading(false);\r\n };\r\n }, [selectedImg, imagesUrl]);\r\n\r\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\r\n if (!openAndClose) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowLeft':\r\n if (selectedImg > 0) {\r\n setSelectedImg(selectedImg - 1);\r\n }\r\n break;\r\n case 'ArrowRight':\r\n if (selectedImg < imagesUrl.length - 1) {\r\n setSelectedImg(selectedImg + 1);\r\n }\r\n break;\r\n case 'Escape':\r\n handleClose?.();\r\n break;\r\n case 'z':\r\n setIsZoomed(prev => !prev);\r\n break;\r\n }\r\n }, [selectedImg, openAndClose, handleClose, setSelectedImg]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [handleKeyDown]);\r\n\r\n const handleTouchStart = (e: React.TouchEvent) => {\r\n setTouchStart(e.touches[0].clientX);\r\n };\r\n\r\n const handleTouchMove = (e: React.TouchEvent) => {\r\n setTouchEnd(e.touches[0].clientX);\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n if (!touchStart || !touchEnd) return;\r\n\r\n const distance = touchStart - touchEnd;\r\n const isLeftSwipe = distance > 50;\r\n const isRightSwipe = distance < -50;\r\n\r\n if (isLeftSwipe && selectedImg < imagesUrl.length - 1) {\r\n setSelectedImg(selectedImg + 1);\r\n } else if (isRightSwipe && selectedImg > 0) {\r\n setSelectedImg(selectedImg - 1);\r\n }\r\n\r\n setTouchStart(null);\r\n setTouchEnd(null);\r\n };\r\n\r\n const handleImageClick = () => {\r\n setIsZoomed(prev => !prev);\r\n };\r\n\r\n if (!imagesUrl.length || selectedImg < 0 || selectedImg >= imagesUrl.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n <FDialog\r\n openAndClose={openAndClose}\r\n st={st}\r\n className={`${styles['fv-opn-img-full']} ${className || ''}`}\r\n id={id}\r\n >\r\n <div className={styles['fv-opn-img-full-body']}>\r\n {/* Кнопка закрытия */}\r\n <div className={styles['close-button']}>\r\n {handleClose && (\r\n <FCloseIcon\r\n handleClose={() => {\r\n handleClose();\r\n document.body.style.overflow = 'auto';\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Навигация и изображение */}\r\n <div\r\n className={styles['image-container']}\r\n onTouchStart={handleTouchStart}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n >\r\n {/* Левая стрелка */}\r\n {selectedImg > 0 && (\r\n <div className={styles['arrow-left']}>\r\n <FArrowIcon\r\n direction=\"left\"\r\n handleClick={() => setSelectedImg(selectedImg - 1)}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Изображение */}\r\n <div className={styles['image-wrapper']}>\r\n {isLoading && (\r\n <div className={styles['loading-spinner']}>\r\n <div className={styles['spinner']}></div>\r\n </div>\r\n )}\r\n {error ? (\r\n <div className={styles['error-message']}>\r\n Ошибка загрузки изображения\r\n </div>\r\n ) : (\r\n <img\r\n src={imagesUrl[selectedImg]}\r\n alt=\"Полноэкранное изображение\"\r\n onLoad={() => setIsLoading(false)}\r\n onError={() => {\r\n setError(true);\r\n setIsLoading(false);\r\n }}\r\n className={styles['full-image']}\r\n onClick={handleImageClick}\r\n style={{\r\n cursor: 'zoom-in',\r\n transform: isZoomed ? 'scale(1.5)' : 'scale(1)',\r\n transition: 'transform 0.3s ease'\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Правая стрелка */}\r\n {selectedImg < imagesUrl.length - 1 && (\r\n <div className={styles['arrow-right']}>\r\n <FArrowIcon\r\n direction=\"right\"\r\n handleClick={() => setSelectedImg(selectedImg + 1)}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Индикатор прогресса */}\r\n {imagesUrl.length > 1 && (\r\n <div className={styles['progress-indicator']}>\r\n {imagesUrl.map((_, index) => (\r\n <div\r\n key={index}\r\n className={`${styles['progress-dot']} ${index === selectedImg ? styles['active'] : ''\r\n }`}\r\n onClick={() => setSelectedImg(index)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </FDialog>\r\n );\r\n};\r\n\r\nexport default FOpenImgFull;","import { FC, useEffect, useState } from 'react';\r\n\r\nimport styles from './FAccordion.module.scss';\r\n\r\n/**\r\n * Тип варианта цветовой схемы аккордеона.\r\n * @typedef {'info' | 'alert' | 'warning'} FAccordionVariant\r\n */\r\ntype FAccordionVariant = 'info' | 'alert' | 'warning';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FAccordion.\r\n *\r\n * @interface IFAccordion\r\n * @extends {React.HTMLAttributes<HTMLDivElement>}\r\n */\r\nexport interface IFAccordion {\r\n /**\r\n * Дочерние элементы, отображаемые внутри аккордеона.\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Вариант цветовой схемы аккордеона.\r\n * @type {FAccordionVariant}\r\n * @default 'info'\r\n */\r\n variant?: FAccordionVariant;\r\n\r\n /**\r\n * Заголовок аккордеона, отображается в элементе `<summary>`.\r\n * @type {string}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации.\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера аккордеона.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Обработчик клика по заголовку аккордеона.\r\n * @type {React.MouseEventHandler<HTMLDivElement> | undefined}\r\n */\r\n onClick?: React.MouseEventHandler<HTMLDivElement> | undefined;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли содержимое быть открытым.\r\n * Если задан, управляет состоянием извне.\r\n * @type {boolean}\r\n */\r\n open?: boolean;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли содержимое быть открытым по умолчанию.\r\n * Используется только при монтировании компонента.\r\n * @type {boolean}\r\n */\r\n defaultOpen?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент `FAccordion` — простой аккордеон на основе HTML `<details>` и `<summary>`.\r\n *\r\n * Поддерживает:\r\n * - разные цветовые схемы (`variant`)\r\n * - кастомный заголовок (`title`)\r\n * - внешнее управление состоянием (`open`)\r\n * - начальное состояние (`defaultOpen`)\r\n * - пользовательские классы и стили\r\n *\r\n * @component\r\n * @example\r\n * // Аккордеон с начальным открытым состоянием\r\n * <FAccordion\r\n * variant=\"success\"\r\n * title=\"Информация\"\r\n * defaultOpen={true}\r\n * >\r\n * <p>Содержимое аккордеона</p>\r\n * </FAccordion>\r\n *\r\n * @example\r\n * // Контролируемый аккордеон\r\n * const [isOpen, setIsOpen] = useState(false);\r\n * <FAccordion\r\n * title=\"Детали\"\r\n * open={isOpen}\r\n * onClick={() => setIsOpen(!isOpen)}\r\n * >\r\n * <div>Раскрытый текст</div>\r\n * </FAccordion>\r\n *\r\n * @param {React.ReactNode} [children] - Содержимое, которое будет показано/скрыто.\r\n * @param {FAccordionVariant} [variant='info'] - Цветовая схема аккордеона.\r\n * @param {string} [title] - Заголовок аккордеона.\r\n * @param {string} [id] - ID для идентификации в DOM.\r\n * @param {string} [className] - Дополнительный CSS-класс.\r\n * @param {React.CSSProperties} [st] - Дополнительные инлайновые стили.\r\n * @param {boolean} [open] - Контролируемое состояние открытия.\r\n * @param {boolean} [defaultOpen=false] - Начальное состояние открытия.\r\n * @param {React.MouseEventHandler<HTMLDivElement>} [onClick] - Обработчик клика.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<details>` обёрнутый в `<div>` с возможностью управления состоянием.\r\n */\r\nconst FAccordion: FC<IFAccordion> = ({\r\n variant = 'info',\r\n title,\r\n children,\r\n id,\r\n className,\r\n st,\r\n onClick,\r\n open,\r\n defaultOpen\r\n}) => {\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n\r\n useEffect(() => {\r\n if (open !== undefined) {\r\n setIsOpen(open);\r\n }\r\n }, [open]);\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n className={`${styles.card} ${className || ''}`}\r\n id={id}\r\n >\r\n <details\r\n className={styles[variant]}\r\n open={isOpen}\r\n style={st}\r\n >\r\n <summary className={styles['fv-accord-title']}>\r\n {title}\r\n </summary>\r\n {children}\r\n </details>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FAccordion;","import { FC, useEffect, useRef, useState } from 'react';\r\nimport FFile from '@material/FFile';\r\nimport styles from './FInputFileForm.module.scss';\r\n\r\n/**\r\n * Тип размера файла.\r\n * @typedef {'КБ' | 'МБ'} FileSizeUnit\r\n */\r\ntype FileSizeUnit = 'КБ' | 'МБ';\r\n\r\n/**\r\n * Интерфейс для ограничения максимального размера файла.\r\n *\r\n * @interface IMaxSize\r\n */\r\nexport interface IMaxSize {\r\n /**\r\n * Единица измерения: `'КБ'` или `'МБ'`\r\n * @type {FileSizeUnit}\r\n */\r\n dimension: FileSizeUnit;\r\n\r\n /**\r\n * Числовое значение размера.\r\n * @type {number}\r\n */\r\n size: number;\r\n}\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FInputFileForm.\r\n *\r\n * @interface IFInputFileForm\r\n */\r\nexport interface IFInputFileForm {\r\n /**\r\n * Уникальный идентификатор поля ввода.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Дополнительный CSS-класс для кастомизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Ограничение на максимальный размер загружаемого файла.\r\n * @type {IMaxSize | undefined}\r\n */\r\n dataMaxSize?: IMaxSize;\r\n\r\n /**\r\n * Атрибут name у `<input type=\"file\">`.\r\n * @type {string | undefined}\r\n */\r\n name?: string;\r\n\r\n /**\r\n * Форматы файлов, разрешённые к загрузке.\r\n * Например: `\"image/*\"`, `\"application/pdf\"`, `\"audio/*\"`\r\n * @type {string | undefined}\r\n */\r\n accept?: string;\r\n\r\n /**\r\n * Разрешить ли множественную загрузку.\r\n * @type {boolean | undefined}\r\n */\r\n multiple?: boolean;\r\n\r\n /**\r\n * Callback, вызываемый при изменении списка файлов.\r\n * @param {FileList} files - Список выбранных файлов.\r\n */\r\n onChange: (files: FileList) => void;\r\n\r\n /**\r\n * Заблокировать ли поле загрузки.\r\n * @type {boolean}\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Сбросить выбранное значение (очистка инпута).\r\n * @type {boolean}\r\n */\r\n deleteFile?: boolean;\r\n\r\n /**\r\n * Заголовок элемента input (title).\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Указывает, что поле обязательно для заполнения.\r\n * @type {boolean}\r\n */\r\n required?: boolean;\r\n\r\n /**\r\n * Callback, вызываемый при возникновении ошибок валидации.\r\n * @param {string[]} errors - Массив ошибок.\r\n */\r\n onValidationError?: (errors: string[]) => void;\r\n\r\n /**\r\n * Показывать ли предварительный просмотр загруженных файлов.\r\n * @type {boolean}\r\n */\r\n showPreview?: boolean;\r\n\r\n /**\r\n * Максимальное количество файлов для загрузки.\r\n * @type {number | undefined}\r\n */\r\n maxFiles?: number;\r\n}\r\n\r\n/**\r\n * Компонент `FInputFileForm` — кастомная зона загрузки файлов с поддержкой:\r\n * - drag & drop\r\n * - ограничения по размеру\r\n * - отображения допустимых форматов\r\n * - темизации через CSS Modules\r\n *\r\n * @component\r\n * @example\r\n * <FInputFileForm\r\n * multiple={true}\r\n * accept=\"image/*\"\r\n * dataMaxSize={{ dimension: \"МБ\", size: 5 }}\r\n * onChange={(files) => console.log(files)}\r\n * />\r\n *\r\n * @example\r\n * // Отключённое состояние\r\n * <FInputFileForm\r\n * disabled\r\n * onChange={() => {}}\r\n * />\r\n *\r\n * @param {string} [id] - ID элемента.\r\n * @param {string} [className] - Пользовательский класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {IMaxSize} [dataMaxSize] - Ограничение на размер файла.\r\n * @param {string} [accept] - Допустимые форматы.\r\n * @param {boolean} [multiple=false] - Множественная загрузка.\r\n * @param {Function} onChange - Обработчик изменения файлов.\r\n * @param {boolean} [disabled=false] - Блокировка поля.\r\n * @param {boolean} [deleteFile] - Очистка файла.\r\n * @param {string} [title] - HTML атрибут `title`.\r\n * @param {boolean} [required] - Флаг обязательности.\r\n * @param {Function} [onValidationError] - Обработчик ошибок валидации.\r\n * @param {boolean} [showPreview=true] - Показывать ли предварительный просмотр.\r\n * @param {number} [maxFiles] - Максимальное количество файлов для загрузки.\r\n *\r\n * @returns {JSX.Element} — Рендерит зону загрузки файлов с иконкой и текстом.\r\n */\r\nconst FInputFileForm: FC<IFInputFileForm> = ({\r\n id,\r\n className,\r\n st,\r\n dataMaxSize,\r\n name,\r\n accept,\r\n multiple = false,\r\n onChange,\r\n disabled = false,\r\n deleteFile,\r\n title,\r\n required,\r\n onValidationError,\r\n showPreview = true,\r\n maxFiles\r\n}) => {\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\r\n const [uploadProgress, setUploadProgress] = useState<{ [key: string]: number }>({});\r\n const [errors, setErrors] = useState<string[]>([]);\r\n\r\n const validateFiles = (files: File[]): string[] => {\r\n const newErrors: string[] = [];\r\n\r\n if (maxFiles && files.length > maxFiles) {\r\n newErrors.push(`Максимальное количество файлов: ${maxFiles}`);\r\n }\r\n\r\n files.forEach(file => {\r\n if (dataMaxSize) {\r\n const maxSizeInBytes = dataMaxSize.dimension === 'МБ'\r\n ? dataMaxSize.size * 1024 * 1024\r\n : dataMaxSize.size * 1024;\r\n\r\n if (file.size > maxSizeInBytes) {\r\n newErrors.push(`Файл ${file.name} превышает максимальный размер ${dataMaxSize.size} ${dataMaxSize.dimension}`);\r\n }\r\n }\r\n\r\n if (accept) {\r\n const fileType = file.type;\r\n const fileName = file.name.toLowerCase();\r\n const acceptedTypes = accept.split(',').map(type => type.trim());\r\n\r\n const isValidType = acceptedTypes.some(type => {\r\n // Для MIME-типов\r\n if (type.includes('/')) {\r\n if (type.endsWith('/*')) {\r\n const category = type.split('/')[0];\r\n return fileType.startsWith(`${category}/`);\r\n }\r\n return type === fileType;\r\n }\r\n // Для расширений\r\n else {\r\n return fileName.endsWith(type.toLowerCase());\r\n }\r\n });\r\n\r\n if (!isValidType) {\r\n newErrors.push(`Файл ${file.name} имеет недопустимый формат`);\r\n }\r\n }\r\n });\r\n\r\n return newErrors;\r\n };\r\n\r\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!e.target.files) return;\r\n\r\n const files = Array.from(e.target.files);\r\n const validationErrors = validateFiles(files);\r\n\r\n if (validationErrors.length > 0) {\r\n setErrors(validationErrors);\r\n onValidationError?.(validationErrors);\r\n return;\r\n }\r\n\r\n setErrors([]);\r\n setSelectedFiles(files);\r\n\r\n const dt = new DataTransfer();\r\n files.forEach(file => dt.items.add(file));\r\n onChange(dt.files);\r\n\r\n // Имитация прогресса загрузки\r\n files.forEach(file => {\r\n let progress = 0;\r\n const interval = setInterval(() => {\r\n progress += 10;\r\n setUploadProgress(prev => ({ ...prev, [file.name]: progress }));\r\n if (progress >= 100) clearInterval(interval);\r\n }, 200);\r\n });\r\n };\r\n\r\n const handleDragOver = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n };\r\n\r\n const handleDrop = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n\r\n if (disabled) return;\r\n\r\n const files = Array.from(e.dataTransfer.files);\r\n const validationErrors = validateFiles(files);\r\n\r\n if (validationErrors.length > 0) {\r\n setErrors(validationErrors);\r\n onValidationError?.(validationErrors);\r\n return;\r\n }\r\n\r\n setErrors([]);\r\n setSelectedFiles(files);\r\n\r\n const dt = new DataTransfer();\r\n files.forEach(file => dt.items.add(file));\r\n onChange(dt.files);\r\n };\r\n\r\n const removeFile = (fileName: string) => {\r\n setSelectedFiles(prev => prev.filter(file => file.name !== fileName));\r\n setUploadProgress(prev => {\r\n const newProgress = { ...prev };\r\n delete newProgress[fileName];\r\n return newProgress;\r\n });\r\n\r\n // Обновляем FileList после удаления\r\n const dt = new DataTransfer();\r\n selectedFiles\r\n .filter(file => file.name !== fileName)\r\n .forEach(file => dt.items.add(file));\r\n onChange(dt.files);\r\n };\r\n\r\n useEffect(() => {\r\n if (deleteFile && inputRef.current) {\r\n inputRef.current.value = '';\r\n setSelectedFiles([]);\r\n setUploadProgress({});\r\n }\r\n }, [deleteFile]);\r\n\r\n return (\r\n <div className={styles.container}>\r\n <div\r\n className={`${styles['custom-file']} ${styles['custom-file-dropzone']} ${isDragging ? styles.dragging : ''}`}\r\n style={st}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n <input\r\n required={required}\r\n accept={accept}\r\n type=\"file\"\r\n className={`${styles['custom-file-input']} ${className || ''}`}\r\n name={name}\r\n id={id}\r\n title={title}\r\n data-max-size={dataMaxSize?.size}\r\n multiple={multiple}\r\n onChange={handleFileChange}\r\n disabled={disabled}\r\n ref={inputRef}\r\n />\r\n <label htmlFor={id} className={styles['custom-file-label']} style={disabled ? { backgroundColor: '#F3F3F3', border: '1px dashed #C4C4C4' } : undefined}>\r\n <svg width=\"30\" height=\"30\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\r\n <path fill-rule=\"evenodd\" d=\"M7.646 5.146a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1-.708.708L8.5 6.707V10.5a.5.5 0 0 1-1 0V6.707L6.354 7.854a.5.5 0 1 1-.708-.708z\" />\r\n <path d=\"M4.406 3.342A5.53 5.53 0 0 1 8 2c2.69 0 4.923 2 5.166 4.579C14.758 6.804 16 8.137 16 9.773 16 11.569 14.502 13 12.687 13H3.781C1.708 13 0 11.366 0 9.318c0-1.763 1.266-3.223 2.942-3.593.143-.863.698-1.723 1.464-2.383m.653.757c-.757.653-1.153 1.44-1.153 2.056v.448l-.445.049C2.064 6.805 1 7.952 1 9.318 1 10.785 2.23 12 3.781 12h8.906C13.98 12 15 10.988 15 9.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 4.825 10.328 3 8 3a4.53 4.53 0 0 0-2.941 1.1z\" />\r\n </svg>\r\n <br />\r\n <span style={disabled ? { color: '#C4C4C4' } : undefined}>\r\n <b style={disabled ? { color: '#888888' } : undefined}>Выберите</b> или перетащите файл для загрузки<br />\r\n {accept !== undefined ? (\r\n <>\r\n Разрешается загрузить файлы с форматом: <b style={disabled ? { color: '#888888' } : undefined}>{accept}</b><br />\r\n </>\r\n ) : 'Разрешается загрузить любой формат файлов'}\r\n {dataMaxSize && <small>Максимальный размер {dataMaxSize.size} {dataMaxSize.dimension}</small>}\r\n </span>\r\n </label>\r\n </div>\r\n\r\n {errors.length > 0 && (\r\n <div className={styles.errors}>\r\n {errors.map((error, index) => (\r\n <div key={index} className={styles.error}>{error}</div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {showPreview && selectedFiles.length > 0 && (\r\n <div className={styles['custom-files-preview']}>\r\n {selectedFiles.map((file, index) => (\r\n <div key={index} className={styles.fileItem}>\r\n <FFile\r\n name={file.name}\r\n size={file.size}\r\n progress={uploadProgress[file.name]}\r\n handleDelete={disabled ? undefined : () => removeFile(file.name)}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FInputFileForm;","import { forwardRef } from \"react\";\r\n\r\nimport styles from \"../static/FSelect.module.scss\"\r\n\r\nimport FLoadIcon from \"@icons/FLoadIcon\";\r\n\r\n/**\r\n * Пропсы для компонента FSelect — кастомный `<select>` с поддержкой:\r\n * - метки (label)\r\n * - ошибок\r\n * - вспомогательного текста\r\n * - загрузки\r\n */\r\nexport interface IFSelect extends React.InputHTMLAttributes<HTMLSelectElement> {\r\n /**\r\n * Текст метки, отображается над полем.\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Инлайновые стили для `<select>`.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Контент внутри `<select>` (обычно список `<option>`).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Если true — ширина поля будет 100%.\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Флаг состояния загрузки (отключает выбор и показывает лоадер).\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст, отображается под инпутом.\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Ширина поля.\r\n * @default 'fit-content'\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Высота поля.\r\n * @default 'auto'\r\n */\r\n height?: string | number;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FSelect` — кастомное поле `<select>` с дополнительными возможностями:\r\n *\r\n * Поддерживает:\r\n * - метку\r\n * - состояние загрузки\r\n * - сообщения об ошибках\r\n * - вспомогательный текст\r\n * - темизацию через CSS-классы\r\n *\r\n * @component\r\n * @example\r\n * <FSelect\r\n * label=\"Выберите город\"\r\n * fullWidth\r\n * errText={[\"Поле обязательно\"]}\r\n * helpText=\"Выберите значение из списка\"\r\n * >\r\n * <option value=\"\">Выберите...</option>\r\n * <option value=\"moscow\">Москва</option>\r\n * </FSelect>\r\n *\r\n * @param {string} [label] - Текст метки над полем.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для `<select>`.\r\n * @param {React.ReactNode} [children] - Список `<option>` или `<optgroup>`.\r\n * @param {boolean} [fullWidth=false] - Поле занимает всю ширину контейнера.\r\n * @param {boolean} [load=false] - Показывает индикатор загрузки.\r\n * @param {string[]} [errText] - Сообщения об ошибках.\r\n * @param {string} [helpText] - Вспомогательный текст под полем.\r\n * @param {string|number} [width='fit-content'] - Ширина поля.\r\n * @param {string|number} [height='auto'] - Высота поля.\r\n * @param {string} [id] - HTML ID.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<select>` с меткой, стилями и вспомогательным текстом.\r\n */\r\nconst FSelect = forwardRef<HTMLSelectElement, IFSelect>(\r\n (\r\n {\r\n label,\r\n st,\r\n children,\r\n fullWidth,\r\n load = false,\r\n errText,\r\n helpText,\r\n height = \"auto\",\r\n width = \"fit-content\",\r\n id,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const baseStyle: React.CSSProperties = {\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n width: fullWidth ? '100%' : width || 'fit-content',\r\n height: height || 'auto',\r\n };\r\n\r\n const mergedStyle = Object.assign({}, baseStyle, st);\r\n\r\n const inputId = id || `input-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n return (\r\n <div\r\n className={`f-form-element ${styles[\"f-select\"]}`}\r\n style={mergedStyle}\r\n id={inputId + '-select-block'}\r\n role=\"group\"\r\n aria-labelledby={label ? inputId + '-label' : undefined}\r\n >\r\n {/* Label */}\r\n {label && (\r\n <label\r\n id={inputId + '-label'}\r\n htmlFor={inputId}\r\n className={`f-form-element__label ${errText ? 'error' : ''}`}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className={`f-form-element__control ${load ? 'is-loading' : ''}`}>\r\n <select\r\n ref={ref}\r\n aria-invalid={!!errText}\r\n aria-describedby={\r\n [helpText ? inputId + '-helptext' : null, errText?.length ? inputId + '-errortext' : null]\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n {...props}\r\n id={inputId}\r\n disabled={props.disabled || load}\r\n className={`f-form-element__control-element ${styles[\"f-select__control-element\"]} ${errText ? 'error' : ''} ${props.className || ''}`}\r\n >\r\n {!load && children}\r\n </select>\r\n\r\n {load && (\r\n <div className={`f-form-element__loader`}>\r\n <FLoadIcon size={10} />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Вспомогательный текст */}\r\n {helpText && (\r\n <p\r\n id={inputId + '-helptext'}\r\n className={`f-form-element__helptext`}\r\n >\r\n {helpText}\r\n </p>\r\n )}\r\n\r\n {/* Сообщения об ошибках */}\r\n {(typeof errText === 'string' && errText) && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n <p\r\n id={`${inputId}-errortext`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {errText}\r\n </p>\r\n </div>\r\n )}\r\n {errText && errText.length > 0 && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n {typeof errText !== 'string' && errText.map((error, index) => (\r\n <p\r\n key={index}\r\n id={`${inputId}-errortext-${index}`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {error}\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FSelect;","import React from \"react\";\r\n\r\n/**\r\n * Пропсы для компонента `FSelectItem` — обёртка над `<option>`.\r\n */\r\nexport interface IFSelectItem extends React.OptionHTMLAttributes<HTMLOptionElement> {\r\n /**\r\n * Инлайновые стили для элемента `<option>`.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Контент пункта выпадающего списка (отображается как текст внутри `<option>`).\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Компонент `FSelectItem` — обёртка над `<option>`.\r\n *\r\n * Используется внутри `FSelect` для создания пунктов выпадающего меню.\r\n *\r\n * @component\r\n * @example\r\n * <FSelect label=\"Выберите цвет\">\r\n * <FSelectItem value=\"red\">Красный</FSelectItem>\r\n * <FSelectItem value=\"blue\" disabled>Синий</FSelectItem>\r\n * </FSelect>\r\n *\r\n * @param {React.CSSProperties} [st] - Стили для пункта (редко используется, т.к. браузеры ограничивают стилизацию `<option>`).\r\n * @param {React.ReactNode} [children] - Отображаемый текст или JSX внутри `<option>`.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<option>` с заданными свойствами.\r\n */\r\n\r\nconst FSelectItem = React.forwardRef<HTMLOptionElement, IFSelectItem>((\r\n {\r\n st,\r\n children,\r\n ...props\r\n }, ref\r\n) => {\r\n return (\r\n <option\r\n ref={ref}\r\n style={st}\r\n {...props}\r\n >\r\n {children}\r\n </option>\r\n );\r\n});\r\n\r\nexport default FSelectItem;","import { forwardRef } from \"react\";\r\nimport FTextField from \"@material/FTextField\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FFullDateField.\r\n *\r\n * @interface IFFullDateField\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFFullDateField extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Текст метки (label), отображается над полем ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Дополнительные инлайновые стили для контейнера поля ввода.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Значение поля даты. Может быть строкой или числом.\r\n * @type {string | number | readonly string[] | undefined}\r\n */\r\n value?: string | number | readonly string[];\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю ширину родителя.\r\n * @type {boolean}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Флаг состояния загрузки — если true, показывает спиннер и блокирует ввод.\r\n * @type {boolean}\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст под полем даты.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Ширина поля ввода.\r\n * @type {string | number | undefined}\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Высота поля ввода.\r\n * @type {string | number | undefined}\r\n */\r\n height?: string | number;\r\n}\r\n\r\n/**\r\n * Компонент `FFullDateField` — универсальное поле ввода даты с поддержкой:\r\n * - метки (`label`)\r\n * - сообщений об ошибках (`errText`)\r\n * - вспомогательного текста (`helpText`)\r\n * - состояния загрузки (`load`)\r\n * - пользовательских стилей и классов\r\n *\r\n * Использует стандартный `<input type=\"date\">` с расширенным UI.\r\n *\r\n * @component\r\n * @example\r\n * // Пример базового использования\r\n * <FFullDateField\r\n * label=\"Выберите дату\"\r\n * value=\"2024-06-15\"\r\n * fullWidth\r\n * />\r\n *\r\n * @example\r\n * // С ошибкой и кастомной шириной\r\n * <FFullDateField\r\n * label=\"Дата рождения\"\r\n * errText={['Поле обязательное']}\r\n * width=\"300px\"\r\n * />\r\n *\r\n * @param {IFFullDateField} props - Пропсы компонента.\r\n * @param {React.Ref<HTMLInputElement>} ref - Референс на DOM-элемент `<input>`.\r\n * @returns {JSX.Element} — Рендерит поле ввода даты с меткой, стилями и иконкой загрузки.\r\n */\r\nconst FFullDateField = forwardRef<HTMLInputElement, IFFullDateField>(\r\n (\r\n {\r\n label,\r\n st,\r\n value,\r\n fullWidth,\r\n load = false,\r\n errText,\r\n helpText,\r\n width,\r\n height,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n\r\n return (\r\n <FTextField\r\n label={label}\r\n st={st}\r\n width={width}\r\n height={height}\r\n fullWidth={fullWidth}\r\n ref={ref}\r\n load={load}\r\n value={load ? '' : value}\r\n type={load ? 'text' : \"date\"}\r\n helpText={helpText}\r\n errText={typeof errText === 'string' ? [errText] : errText}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nexport default FFullDateField;","import { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport styles from './FSelectSearchDb.module.scss';\r\nimport FArrowIcon from \"@icons/FArrowIcon\";\r\nimport FTextField from \"@material/FTextField\";\r\n\r\n/**\r\n * Параметры для компонента FSelectSearchDb\r\n */\r\nexport interface IFSelectSearchDb<T> {\r\n /**\r\n * Функция, которая выполняет асинхронный запрос поиска.\r\n * Принимает строку и возвращает массив объектов типа T.\r\n */\r\n fetchingFunc: (text: string) => Promise<T[]>;\r\n\r\n /**\r\n * Callback, вызываемый при выборе элемента из списка.\r\n */\r\n selectedElement: (item: T | null | undefined) => void;\r\n\r\n /**\r\n * Функция, возвращающая строковое представление элемента (для отображения).\r\n */\r\n selectItem: (item: T) => string;\r\n\r\n /**\r\n * Callback, вызываемый при вводе данных в поле ввода.\r\n * @param {File[] | null} file - Массив выбранных файлов или `null`, если файлы удалены.\r\n */\r\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n\r\n /**\r\n * Текст метки поля ввода.\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Встроенные стили для корневого контейнера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * HTML id для поля ввода.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Если true — поле занимает всю ширину родителя.\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Кастомный CSS класс.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Блокирует редактирование поля.\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Поле только для чтения.\r\n */\r\n readOnly?: boolean;\r\n\r\n /**\r\n * Поле обязательное для заполнения.\r\n */\r\n required?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст под инпутом.\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Обработчик события onFocus.\r\n */\r\n onFocus?: React.FocusEventHandler<HTMLInputElement>;\r\n\r\n /**\r\n * Обработчик события onBlur.\r\n */\r\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\r\n\r\n /**\r\n * Минимальная длина текста для начала поиска.\r\n * @default 3\r\n */\r\n minLengthText?: number;\r\n\r\n /**\r\n * Начальное значение поля ввода.\r\n */\r\n defaultValue?: string;\r\n\r\n /**\r\n * Тип поля ввода.\r\n */\r\n type?: React.HTMLInputTypeAttribute;\r\n\r\n /**\r\n * Текст placeholder.\r\n */\r\n placeholder?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FSelectSearchDb` — кастомное поле ввода с автопоиском по базе данных.\r\n * Поддерживает:\r\n * - асинхронный поиск по API (`fetchingFunc`)\r\n * - дебаунс запросов\r\n * - отображение выпадающего списка результатов\r\n * - автоматическое позиционирование дропдауна (вверх/вниз)\r\n * - обработку ошибок и состояния загрузки\r\n * - работу с TypeScript-типами через `selectItem`\r\n * - портал для рендера дропдауна вне родителя со скроллом\r\n *\r\n * @component\r\n *\r\n * @example\r\n * <FSelectSearchDb<Employee>\r\n * label=\"Поиск сотрудника\"\r\n * fetchingFunc={async (text) => await fetch(`/api/employees?query=${text}`)}\r\n * selectedElement={(item) => setSelectedEmployee(item)}\r\n * selectItem={(item) => item.name}\r\n * />\r\n *\r\n * @example\r\n * // С начальным значением и пользовательским стилем\r\n * <FSelectSearchDb<City>\r\n * label=\"Город\"\r\n * defaultValue=\"Москва\"\r\n * fetchingFunc={async (text) => await fetch(`/api/cities?query=${text}`)}\r\n * selectItem={(item) => item.name}\r\n * selectedElement={(item) => setSelectedCity(item)}\r\n * st={{ maxWidth: '300px' }}\r\n * className={styles.customSelect}\r\n * />\r\n *\r\n * @param {Function} fetchingFunc - Асинхронная функция, которая принимает строку и возвращает массив объектов типа T.\r\n * @param {Function} selectedElement - Callback, вызываемый при выборе элемента из списка. Принимает выбранный объект типа T.\r\n * @param {Function} selectItem - Функция, возвращающая строковое представление элемента (для отображения в списке).\r\n * @param {string} [label] - Текст метки поля ввода.\r\n * @param {React.CSSProperties} [st] - Встроенные стили для корневого контейнера.\r\n * @param {string} [id] - HTML id для поля ввода.\r\n * @param {string} [className] - Кастомный CSS класс для переопределения стилей.\r\n * @param {boolean} [disabled=false] - Блокирует редактирование поля.\r\n * @param {boolean} [readOnly=false] - Поле только для чтения.\r\n * @param {boolean} [fullWidth=false] - Если true — поле занимает всю ширину родителя.\r\n * @param {React.FocusEventHandler<HTMLInputElement>} [onFocus] - Обработчик события focus.\r\n * @param {React.FocusEventHandler<HTMLInputElement>} [onBlur] - Обработчик события blur.\r\n * @param {string[] | string} [errText] - Массив текстовых ошибок для отображения под полем.\r\n * @param {string} [helpText] - Вспомогательный текст под инпутом.\r\n * @param {boolean} [required=false] - Определяет, является ли поле обязательным.\r\n * @param {string} [defaultValue] - Начальное значение поля ввода.\r\n * @param {React.HTMLInputTypeAttribute} [type=\"text\"] - Тип поля ввода (например, \"text\", \"search\").\r\n * @param {string} [placeholder] - Текст placeholder.\r\n *\r\n * @returns {JSX.Element} — Рендерит поле ввода с выпадающим списком результатов поиска.\r\n */\r\nconst FSelectSearchDb = <T,>({\r\n fetchingFunc,\r\n selectedElement,\r\n selectItem,\r\n onChange,\r\n st,\r\n id,\r\n className,\r\n disabled,\r\n readOnly,\r\n fullWidth,\r\n label,\r\n onBlur,\r\n onFocus,\r\n errText,\r\n helpText,\r\n required,\r\n defaultValue,\r\n type,\r\n placeholder,\r\n}: IFSelectSearchDb<T>) => {\r\n const [valueInput, setValueInput] = useState<string>(defaultValue || '');\r\n const [arrObject, setArrObject] = useState<T[]>([]);\r\n const timerDebounceRef = useRef<NodeJS.Timeout>();\r\n const [load, setLoad] = useState<boolean>(false);\r\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\r\n const [dropdownPosition, setDropdownPosition] = useState<'top' | 'bottom'>('bottom');\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const dropdownRef = useRef<HTMLDivElement>(null); // <-- реф для дропдауна\r\n const dropdownPortalRef = useRef<HTMLDivElement | null>(null); // <-- реф для portal контейнера\r\n const [textInput, setTextInput] = useState<boolean>(false);\r\n const [error, setError] = useState<string[] | undefined>(undefined);\r\n\r\n // Создаём div для portal и добавляем в body\r\n useEffect(() => {\r\n dropdownPortalRef.current = document.createElement('div');\r\n document.body.appendChild(dropdownPortalRef.current);\r\n\r\n return () => {\r\n const portalElement = dropdownPortalRef.current;\r\n if (portalElement && portalElement.parentNode === document.body) {\r\n document.body.removeChild(portalElement);\r\n }\r\n };\r\n }, []);\r\n\r\n // Рассчитываем позицию дропдауна и обновляем его стили\r\n const updateDropdownPosition = useCallback(() => {\r\n if (!containerRef.current || !dropdownRef.current || !dropdownPortalRef.current) return;\r\n\r\n const containerRect = containerRef.current.getBoundingClientRect();\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n\r\n const offset = 4; // <-- отступ в пикселях\r\n\r\n const top = containerRect.top + scrollTop + (dropdownPosition === 'bottom' ? containerRect.height - offset : -dropdownRef.current.offsetHeight - offset);\r\n const left = containerRect.left + scrollLeft;\r\n\r\n Object.assign(dropdownPortalRef.current.style, {\r\n position: 'absolute',\r\n top: `${top}px`,\r\n left: `${left}px`,\r\n width: `${containerRect.width}px`,\r\n zIndex: '9999',\r\n });\r\n }, [dropdownPosition]);\r\n\r\n // Обновляем позицию при открытии дропдауна и при изменении размеров окна\r\n useEffect(() => {\r\n if (isDropdownOpen) {\r\n updateDropdownPosition();\r\n window.addEventListener('resize', updateDropdownPosition);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateDropdownPosition);\r\n };\r\n }, [isDropdownOpen, updateDropdownPosition]);\r\n\r\n // Определяем положение дропдауна (вверх или вниз)\r\n const updateDropdownPositionBasedOnSpace = () => {\r\n if (!containerRef.current) return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n const dropdownHeight = 200;\r\n\r\n setDropdownPosition(spaceBelow >= dropdownHeight || spaceBelow >= spaceAbove ? 'bottom' : 'top');\r\n };\r\n\r\n // Следим за изменением размеров окна\r\n useEffect(() => {\r\n if (isDropdownOpen) {\r\n updateDropdownPositionBasedOnSpace();\r\n window.addEventListener('resize', updateDropdownPositionBasedOnSpace);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateDropdownPositionBasedOnSpace);\r\n };\r\n }, [isDropdownOpen]);\r\n\r\n // Обработка изменения текста\r\n const handlerOnChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const text = e.target.value;\r\n if (onChange) {\r\n onChange(e)\r\n }\r\n setValueInput(text);\r\n setIsDropdownOpen(false);\r\n setTextInput(true);\r\n\r\n if (timerDebounceRef.current) clearTimeout(timerDebounceRef.current);\r\n\r\n if (text.trim() !== '') {\r\n timerDebounceRef.current = setTimeout(async () => {\r\n try {\r\n setLoad(true);\r\n const result = await fetchingFunc(text);\r\n setArrObject(result);\r\n\r\n if (result.length === 0) {\r\n setError(['- Данные не найдены']);\r\n setTimeout(() => setError(undefined), 3000);\r\n } else {\r\n setIsDropdownOpen(true);\r\n }\r\n } catch {\r\n setError(['- Ошибка']);\r\n setTimeout(() => setError(undefined), 3000);\r\n } finally {\r\n setLoad(false);\r\n setTextInput(false);\r\n }\r\n }, 500);\r\n } else {\r\n selectedElement(null);\r\n setArrObject([]);\r\n setIsDropdownOpen(false);\r\n setTextInput(false);\r\n }\r\n };\r\n\r\n // Открытие/закрытие дропдауна\r\n const handleArrowClick = () => {\r\n if (disabled || readOnly || load) return;\r\n\r\n if (isDropdownOpen) {\r\n setIsDropdownOpen(false);\r\n } else if (arrObject.length > 0) {\r\n setIsDropdownOpen(true);\r\n } else if (valueInput.trim() !== '') {\r\n handleDefaultFetch(valueInput);\r\n }\r\n };\r\n\r\n // Выбор элемента из списка\r\n const handleItemClick = (opt: T) => {\r\n selectedElement(opt);\r\n setValueInput(selectItem(opt));\r\n setIsDropdownOpen(false);\r\n };\r\n\r\n // Закрытие дропдауна при клике вне области\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\r\n setIsDropdownOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, []);\r\n\r\n // Дефолтный запрос\r\n const handleDefaultFetch = (text: string) => {\r\n if (timerDebounceRef.current) clearTimeout(timerDebounceRef.current);\r\n\r\n if (text !== '') {\r\n timerDebounceRef.current = setTimeout(async () => {\r\n try {\r\n setLoad(true);\r\n const result = await fetchingFunc(text);\r\n setArrObject(result);\r\n\r\n if (result.length === 0) {\r\n setError(['- Данные не найдены']);\r\n setTimeout(() => setError(undefined), 3000);\r\n } else {\r\n setIsDropdownOpen(true);\r\n }\r\n } catch {\r\n setError(['- Ошибка']);\r\n setTimeout(() => setError(undefined), 3000);\r\n } finally {\r\n setLoad(false);\r\n }\r\n }, 3000);\r\n } else {\r\n setArrObject([]);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`${styles['f-select-search-db']} ${className || ''}`}\r\n style={st}\r\n id={id}\r\n data-position={dropdownPosition}\r\n >\r\n <div className={styles['f-select-search-db__input']}>\r\n <FTextField\r\n fullWidth={fullWidth}\r\n readOnly={readOnly || isDropdownOpen}\r\n disabled={disabled || load}\r\n required={required}\r\n label={label}\r\n type={type}\r\n placeholder={placeholder}\r\n className={styles['f-select-search-db__input_field']}\r\n value={valueInput}\r\n onChange={handlerOnChange}\r\n onFocus={onFocus}\r\n onBlur={() => {\r\n setTimeout(() => {\r\n onBlur?.(new Event('blur') as any);\r\n }, 100);\r\n }}\r\n load={load}\r\n helpText={load\r\n ? 'Загрузка...'\r\n : textInput\r\n ? 'После окончания ввода запрос отправится через 3 сек'\r\n : helpText}\r\n errText={typeof errText === 'string' ? [errText] : errText || error}\r\n />\r\n {!load && !disabled && arrObject.length > 0 && (\r\n <div\r\n className={styles['f-select-search-db__input_arrow']}\r\n style={{ marginTop: label ? '28px' : '7px' }}\r\n onClick={handleArrowClick}\r\n >\r\n <FArrowIcon direction={isDropdownOpen ? 'up' : 'down'} size={15} />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {isDropdownOpen && (arrObject.length > 0 || valueInput.trim() === '') && dropdownPortalRef.current && (\r\n createPortal(\r\n <div\r\n ref={dropdownRef}\r\n className={`${styles['f-select-search-db__dropdown']} ${isDropdownOpen ? styles.active : ''}`}\r\n >\r\n {arrObject.length === 0 && valueInput.trim() === '' ? (\r\n <li>Введите текст</li>\r\n ) : arrObject.length === 0 && valueInput.trim() !== '' && !load ? (\r\n <li>Ничего не найдено</li>\r\n ) : (\r\n <ul className={styles['f-select-search-db__dropdown_content']}>\r\n {arrObject.slice(0, 10).map((opt, index) => (\r\n <li key={index} onMouseDown={() => handleItemClick(opt)}>\r\n {selectItem(opt)}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>,\r\n dropdownPortalRef.current\r\n )\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FSelectSearchDb;","import React, { forwardRef } from \"react\";\r\nimport styles from \"./FTextArea.module.scss\";\r\nimport FLoadIcon from \"@icons/FLoadIcon\";\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FTextArea.\r\n *\r\n * @interface IFTextArea\r\n * @extends {React.TextareaHTMLAttributes<HTMLTextAreaElement>}\r\n */\r\nexport interface IFTextArea extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n /**\r\n * Текст метки (label), отображаемый над полем ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Дополнительные инлайновые стили для контейнера текстового поля.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Значение текстового поля. Может быть не определено, если используется как uncontrolled.\r\n * @type {string | undefined}\r\n */\r\n value?: string | undefined;\r\n\r\n /**\r\n * Флаг, указывающий, что поле заблокировано для редактирования.\r\n * @type {boolean | undefined}\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Дополнительный CSS-класс для стилизации.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю доступную ширину.\r\n * @type {boolean | undefined}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Массив сообщений об ошибках, связанных с этим полем.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст, отображается под текстовым полем.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Флаг, указывающий, находится ли поле в состоянии загрузки.\r\n * @type {boolean | undefined}\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Ширина контейнера компонента.\r\n * @type {string | number | undefined}\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Высота контейнера компонента.\r\n * @type {string | number | undefined}\r\n */\r\n height?: string | number;\r\n}\r\n\r\n/**\r\n * Компонент `FTextArea` — универсальное поле ввода типа `<textarea>` с дополнительными функциями:\r\n * - Поддержка метки (`label`)\r\n * - Сообщения об ошибках (`errText`)\r\n * - Вспомогательный текст (`helpText`)\r\n * - Индикатор загрузки (`load`)\r\n * - Поддержка стилей и размеров\r\n *\r\n * @component\r\n * @example\r\n * <FTextArea\r\n * label=\"Комментарий\"\r\n * value={text}\r\n * onChange={(e) => setText(e.target.value)}\r\n * fullWidth\r\n * errText={['Поле обязательное']}\r\n * />\r\n *\r\n * @param {IFTextField} props - Пропсы компонента.\r\n * @param {React.Ref<HTMLTextAreaElement>} ref - Референс на DOM-элемент textarea.\r\n * @returns {JSX.Element} - Рендерит текстовое поле с меткой, ошибками и возможностью загрузки.\r\n */\r\nconst FTextArea = forwardRef<HTMLTextAreaElement, IFTextArea>(\r\n (\r\n {\r\n label,\r\n fullWidth,\r\n errText,\r\n helpText,\r\n st,\r\n id,\r\n className,\r\n load = false,\r\n height = 'auto',\r\n width,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const baseStyle: React.CSSProperties = {\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n width: fullWidth ? '100%' : width || 'fit-content',\r\n height: height || 'auto',\r\n };\r\n const mergedStyle = { ...baseStyle, ...st };\r\n const areaId = id || `textarea-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n return (\r\n <div\r\n className={`f-form-element ${styles[\"f-text-area\"]} ${className || ''}`}\r\n style={mergedStyle}\r\n role=\"group\"\r\n id={areaId + '-text-area-block'}\r\n aria-labelledby={label ? areaId + '-label' : undefined}\r\n >\r\n {/* Label */}\r\n {label && (\r\n <label\r\n id={areaId + '-label'}\r\n htmlFor={areaId}\r\n className={`f-form-element__label ${errText ? 'error' : ''}`}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n {/* Textarea wrapper */}\r\n <div className={`f-form-element__control ${load ? 'is-loading' : ''}`}>\r\n <textarea\r\n ref={ref}\r\n id={areaId}\r\n className={`f-form-element__control-element ${errText ? 'error' : ''}`}\r\n aria-invalid={!!errText}\r\n aria-describedby={\r\n [helpText ? areaId + '-helptext' : null, errText?.length ? areaId + '-errortext' : null]\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n {...props}\r\n disabled={props.disabled || load}\r\n style={{ height: height || 'auto' }}\r\n />\r\n {load && (\r\n <span className={'f-form-element__loader'}>\r\n <FLoadIcon size={10} />\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Help Text */}\r\n {helpText && (\r\n <p\r\n id={areaId + '-helptext'}\r\n className={'f-form-element__helptext'}\r\n >\r\n {helpText}\r\n </p>\r\n )}\r\n\r\n {/* Error Messages */}\r\n {(typeof errText === 'string' && errText) && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n <p\r\n id={`${areaId}-errortext`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {errText}\r\n </p>\r\n </div>\r\n )}\r\n {errText && errText.length > 0 && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n {typeof errText !== 'string' && errText.map((error, index) => (\r\n <p\r\n key={index}\r\n id={`${areaId}-errortext-${index}`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {error}\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FTextArea;","/**\r\n * Генерирует уникальную строку на основе временной метки и случайного числа.\r\n *\r\n * @description\r\n * Функция объединяет текущее время в миллисекундах и случайное целое число\r\n * от 0 до 999 999 для создания псевдоуникального идентификатора.\r\n *\r\n * @returns {string} Уникальная строка, например: \"1717029203456789123\"\r\n *\r\n * @example\r\n * const id = fGenerateUniqueId();\r\n * console.log(id); // \"1717029203456789123\"\r\n */\r\nfunction fGenerateUniqueId(): string {\r\n const timestamp = Date.now(); // Более короткий и современный способ\r\n const randomPart = Math.floor(Math.random() * 1_000_000);\r\n return `${timestamp}${randomPart}`;\r\n}\r\n\r\nexport default fGenerateUniqueId;","import { FC, Fragment, useEffect, useRef, useState } from \"react\";\r\n\r\nimport FCloseIcon from \"@icons/FCloseIcon\";\r\n\r\nimport './FAlert.css'\r\n\r\nimport FStack from \"@material/FStack\";\r\n\r\nimport fGenerateUniqueId from \"@dop-function/fGenerateUniqueId\";\r\n\r\n\r\nexport interface IFAlert {\r\n title?: string,\r\n body?: string,\r\n variant: 'info' | 'error' | 'success' | 'warning',\r\n onClose?: (e: boolean) => void,\r\n st?: React.CSSProperties | undefined,\r\n open: boolean,\r\n vertical?: 'top' | 'bottom' | 'center',\r\n horizontal?: 'left' | 'center' | 'right',\r\n buttonClose?: boolean,\r\n className?: string,\r\n displayTime?: number,\r\n size?: string\r\n}\r\n\r\nconst FAlert: FC<IFAlert> = (\r\n {\r\n title,\r\n body,\r\n variant = 'info',\r\n displayTime,\r\n open,\r\n onClose,\r\n vertical = 'center',\r\n horizontal = 'center',\r\n buttonClose = false,\r\n size\r\n }\r\n) => {\r\n\r\n const visible = useRef<NodeJS.Timeout>();\r\n const hidden = useRef<NodeJS.Timeout>();\r\n const close = useRef<NodeJS.Timeout>();\r\n\r\n const [randomId] = useState<string>(fGenerateUniqueId())\r\n\r\n let newTime = displayTime\r\n\r\n useEffect(() => {\r\n\r\n const progress = document.getElementById(`f-alert-progress-value-${randomId}`)\r\n\r\n if (!open) {\r\n const el = document.querySelector(`#f-block-alert-${randomId}`)\r\n if (el !== null) {\r\n close.current = setTimeout(() => {\r\n if (onClose) {\r\n onClose(false)\r\n }\r\n el!.classList.remove('f-alert-hidden')\r\n el!.classList.remove('f-alert-visible')\r\n })\r\n }\r\n }\r\n\r\n visible.current = setTimeout(() => {\r\n if (open) {\r\n const el = document.querySelector(`#f-block-alert-${randomId}`)\r\n if (el !== null) {\r\n el!.classList.add('f-alert-visible')\r\n if (progress !== null) {\r\n progress!.style.width = '0'\r\n }\r\n }\r\n }\r\n if (newTime !== undefined && open && onClose !== undefined) {\r\n\r\n if (newTime < 1) newTime = 1\r\n\r\n const el = document.querySelector(`#f-block-alert-${randomId}`)\r\n\r\n if (el !== null) {\r\n progress!.style.transition = `${newTime}s linear`\r\n\r\n hidden.current = setTimeout(() => {\r\n el!.classList.remove('f-alert-visible')\r\n el!.classList.add('f-alert-hidden')\r\n }, (newTime - 1) * 1000)\r\n\r\n close.current = setTimeout(() => {\r\n onClose(false)\r\n el!.classList.remove('f-alert-hidden')\r\n el!.classList.remove('f-alert-visible')\r\n }, newTime * 1000)\r\n }\r\n }\r\n })\r\n }, [open]);\r\n\r\n const handlerIco = (): JSX.Element => {\r\n let ico: JSX.Element = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\" />\r\n </>\r\n\r\n switch (variant) {\r\n case 'info':\r\n ico = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\" />\r\n </>\r\n break\r\n case \"success\":\r\n ico = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"M10.97 4.97a.75.75 0 0 1 1.071 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.235.235 0 0 1 .02-.022z\" />\r\n </>\r\n break\r\n case 'error':\r\n ico = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\r\n </>\r\n break\r\n case 'warning':\r\n ico = <>\r\n <path\r\n d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\" />\r\n <path\r\n d=\"M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995z\" />\r\n </>\r\n break\r\n }\r\n return ico\r\n }\r\n\r\n const handlerPosition = () => {\r\n\r\n const styleVertical: {\r\n top?: string | number,\r\n bottom?: string | number,\r\n transform?: string\r\n } = {}\r\n\r\n const styleHorizontal: {\r\n left?: string | number,\r\n right?: string | number,\r\n transform?: string\r\n } = {}\r\n\r\n switch (vertical) {\r\n case 'top':\r\n styleVertical.top = 0\r\n break\r\n case 'bottom':\r\n styleVertical.bottom = 0\r\n break\r\n case 'center':\r\n if (vertical === 'center' && horizontal !== 'center') {\r\n styleVertical.transform = 'translateY(-50%)'\r\n }\r\n styleVertical.top = '50%'\r\n break\r\n }\r\n\r\n switch (horizontal) {\r\n case 'left':\r\n styleHorizontal.left = 0\r\n break\r\n case 'right':\r\n styleHorizontal.right = 0\r\n break\r\n case 'center':\r\n if (vertical === 'center' && horizontal === 'center') {\r\n styleHorizontal.transform = 'translate(-50%, -50%)'\r\n } else {\r\n styleHorizontal.transform = 'translateX(-50%)'\r\n }\r\n styleHorizontal.left = '50%'\r\n break\r\n }\r\n\r\n\r\n return Object.assign({}, styleHorizontal, styleVertical)\r\n }\r\n\r\n return (\r\n <Fragment>\r\n {open &&\r\n <div className='f-block-alert' id={`f-block-alert-${randomId}`}>\r\n <div className=\"f-alert-component\" style={handlerPosition()}>\r\n <div className='f-alert'>\r\n <div className={`f-alert-ico ${variant}`}>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n {handlerIco()}\r\n </svg>\r\n </div>\r\n <div className='f-alert-inside'\r\n style={{ width: size !== undefined ? `${size}` : \"fit-content\" }}>\r\n <div className='f-alert-header'>\r\n <h4>{title !== undefined ? title : ''}</h4>\r\n {(buttonClose && onClose) &&\r\n <FCloseIcon\r\n size={25}\r\n st={{\r\n cursor: 'pointer'\r\n }}\r\n handleClose={() => {\r\n const el = document.querySelector(`#f-block-alert-${randomId}`)\r\n el!.classList.remove('f-alert-visible')\r\n el!.classList.add('f-alert-hidden')\r\n onClose(false)\r\n el!.classList.remove('f-alert-visible')\r\n el!.classList.remove('f-alert-hidden')\r\n clearTimeout(visible.current)\r\n clearTimeout(hidden.current)\r\n clearTimeout(close.current)\r\n }} />\r\n }\r\n </div>\r\n <div className='f-alert-body'>\r\n <FStack direction={\"column\"} spacing={1}>\r\n {body !== undefined &&\r\n body.split('\\n').map((opt, index) => {\r\n return (\r\n <span key={index}>{opt}</span>\r\n )\r\n })\r\n }\r\n </FStack>\r\n </div>\r\n </div>\r\n {newTime !== undefined && newTime > 0 &&\r\n <div className={'f-alert-progress'}>\r\n <div className=\"f-alert-progress-bar\">\r\n <div className={`f-alert-progress-value ${variant}`}\r\n id={`f-alert-progress-value-${randomId}`} />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </Fragment>\r\n )\r\n};\r\n\r\nexport default FAlert;","import { FC } from \"react\"\r\n\r\nimport \"./FNative.css\"\r\n\r\nexport interface IFNative {\r\n label: string,\r\n id?: string,\r\n className?: string,\r\n st?: React.CSSProperties,\r\n children?: React.ReactElement | React.ReactNode,\r\n value?: string[] | number[],\r\n singleChoice?: (element: string[]) => void,\r\n multipleChoice?: (element: string[]) => void,\r\n disabled?: boolean,\r\n size?: number,\r\n overflowX?: boolean,\r\n width?: number | 'auto' | 'fit-content' | 'inherit' | 'initial' | 'max-content' | 'min-content' | 'revert' | 'unset' | '-webkit-fill-available'\r\n fullWidth?: boolean\r\n}\r\n\r\nconst FNative: FC<IFNative> = ({\r\n label,\r\n id,\r\n className,\r\n st,\r\n children,\r\n value,\r\n singleChoice,\r\n multipleChoice,\r\n disabled,\r\n size = 4,\r\n overflowX,\r\n width = '-webkit-fill-available',\r\n fullWidth\r\n}) => {\r\n\r\n const handleSingleChoice = (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n if (singleChoice) {\r\n const a = []\r\n a.push(event.target.value)\r\n singleChoice(a)\r\n }\r\n }\r\n\r\n const handlerMultipleChoice = (event: React.ChangeEvent<HTMLSelectElement>) => {\r\n const { options } = event.target;\r\n const value: string[] = [];\r\n for (let i = 0, l = options.length; i < l; i += 1) {\r\n if (options[i].selected) {\r\n value.push(options[i].value);\r\n }\r\n }\r\n if (multipleChoice) {\r\n multipleChoice(value)\r\n }\r\n }\r\n\r\n if (fullWidth) {\r\n if (st === undefined) {\r\n st = {\r\n width: '100%'\r\n }\r\n } else {\r\n st.width = '100%'\r\n }\r\n }\r\n\r\n return (\r\n <div className={`f-form-native ${className !== undefined ? className : ''}`} style={st} id={id}>\r\n <label className={'f-native-label'}>{label}</label>\r\n <select\r\n style={{\r\n overflowX: overflowX ? 'auto' : 'hidden',\r\n width: width\r\n }}\r\n size={size}\r\n disabled={disabled}\r\n //@ts-ignore\r\n value={value}\r\n multiple={true}\r\n className={'f-native'}\r\n onChange={(event) => {\r\n if (singleChoice) {\r\n handleSingleChoice(event)\r\n } else if (multipleChoice) {\r\n handlerMultipleChoice(event)\r\n }\r\n }}>\r\n {children}\r\n </select>\r\n </div>\r\n )\r\n\r\n}\r\n\r\nexport default FNative","import { FC } from \"react\";\r\nimport styles from '../styles/FTabs.module.scss';\r\n\r\n/**\r\n * Пропсы для компонента `FTabs` — обёртка для системы вкладок.\r\n */\r\nexport interface IFTabs {\r\n /**\r\n * Дочерние элементы, обычно список `<FTab>` компонентов.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * HTML ID контейнера.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Ориентация вкладок: горизонтальная или вертикальная.\r\n * @default 'horizontal'\r\n */\r\n orientation?: 'vertical' | 'horizontal';\r\n}\r\n\r\n/**\r\n * Компонент `FTabs` — контейнер для системы вкладок.\r\n *\r\n * Используется вместе с `FTab` и `FTabContent` для создания переключаемых вкладок.\r\n *\r\n * @component\r\n * @example\r\n * <FTabs orientation=\"vertical\">\r\n * <FTab>Вкладка 1</FTab>\r\n * <FTab>Вкладка 2</FTab>\r\n * </FTabs>\r\n *\r\n * @param {React.ReactNode} [children] - Список вкладок (`<FTab>`).\r\n * @param {string} [id] - HTML ID контейнера.\r\n * @param {string} [className] - Кастомный класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {'horizontal'|'vertical'} [orientation='horizontal'] - Ориентация табов.\r\n *\r\n * @returns {JSX.Element} — Рендерит контейнер с вкладками.\r\n */\r\nconst FTabs: FC<IFTabs> = ({\r\n children,\r\n id,\r\n className,\r\n st,\r\n orientation = 'horizontal'\r\n}) => {\r\n return (\r\n <div\r\n id={id}\r\n style={st}\r\n className={`${styles[\"f-tabs\"]} ${styles[orientation]} ${className || ''}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FTabs;","import { forwardRef } from \"react\";\r\nimport styles from '../styles/FTabs.module.scss';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента FTab.\r\n *\r\n * @interface IFButton\r\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\r\n */\r\nexport interface IFTab extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n /**\r\n * Контент вкладки — может быть текстом, иконкой или JSX.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для кнопки вкладки.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Если true — вкладка заблокирована и не реагирует на клик.\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Если true — вкладка активна (отображается как выбранная).\r\n */\r\n active?: boolean;\r\n\r\n /**\r\n * Callback, вызываемый при клике на вкладку.\r\n */\r\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\r\n}\r\n\r\n/**\r\n * Компонент `FTab` — отдельная вкладка в горизонтальной/вертикальной навигации.\r\n *\r\n * Используется внутри `FTabs` для отображения переключаемых вкладок.\r\n *\r\n * @component\r\n * @example\r\n * <FTab\r\n * active={true}\r\n * disabled={false}\r\n * onClick={() => setActiveTab('tab-1')}\r\n * >\r\n * Вкладка 1\r\n * </FTab>\r\n *\r\n * @param {React.ReactNode} [children] - Контент вкладки.\r\n * @param {string} [id] - HTML ID кнопки.\r\n * @param {string} [className] - Пользовательский класс.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {boolean} [disabled=false] - Блокировка вкладки.\r\n * @param {boolean} [active=false] - Активное состояние вкладки.\r\n * @param {Function} [onClick] - Callback при клике по вкладке.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<button>` с поддержкой состояния активности и дизейбла.\r\n */\r\nconst FTab = forwardRef<HTMLButtonElement, IFTab>(({\r\n children,\r\n st,\r\n active,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <button\r\n ref={ref}\r\n type={\"button\"}\r\n style={st}\r\n className={`${styles['f-tabs__tab']} ${active ? styles['active'] : ''} ${props.className || ''}`}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n );\r\n});\r\n\r\nFTab.displayName = 'FTab';\r\n\r\nexport default FTab;","import React, { useRef, useState, useEffect, cloneElement, isValidElement, forwardRef } from \"react\";\r\n\r\nimport styles from '../static/FDropdown.module.scss'\r\n\r\nimport FButton from \"@material/FButton\";\r\nimport FStack from \"@material/FStack\";\r\nimport FArrowIcon from \"@icons/FArrowIcon\";\r\n\r\n/**\r\n * Пропсы для компонента FDropdown.\r\n */\r\nexport interface IFDropdown {\r\n /**\r\n * Текст или элемент внутри кнопки дропдауна.\r\n */\r\n label?: React.ReactNode;\r\n\r\n /**\r\n * Контент, который будет отображён в выпадающем списке.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Вариант стиля кнопки: 'contained' или 'default'.\r\n * @default 'contained'\r\n */\r\n variant?: 'contained' | 'default';\r\n\r\n /**\r\n * Цветовая тема кнопки.\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер кнопки.\r\n * @default 'btn-sm'\r\n */\r\n size?: 'btn-lg' | 'btn-sm' | 'btn-xs';\r\n\r\n /**\r\n * Если true — кнопка заблокирована.\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Инлайновые стили для кнопки.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Пользовательский CSS класс.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * HTML ID кнопки.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FDropdown` — выпадающее меню с кастомной кнопкой и контентом.\r\n *\r\n * Отображает кнопку с иконкой стрелки, при клике показывает содержимое (`children`) как выпадающий список.\r\n *\r\n * @component\r\n * @example\r\n * <FDropdown label=\"Меню\" color=\"primary\" size=\"btn-sm\">\r\n * <div>Пункт 1</div>\r\n * <div>Пункт 2</div>\r\n * </FDropdown>\r\n *\r\n * @example\r\n * // Использование с FTooltip\r\n * <FTooltip title=\"Подсказка для дропдауна\">\r\n * <FDropdown label=\"Меню с подсказкой\">\r\n * <div>Пункт 1</div>\r\n * </FDropdown>\r\n * </FTooltip>\r\n *\r\n * @param {React.ReactNode} [label] - Текст или элемент внутри кнопки.\r\n * @param {React.ReactNode} [children] - Содержимое выпадающего списка.\r\n * @param {'contained'|'default'} [variant='contained'] - Вариант стиля кнопки.\r\n * @param {'primary'|'secondary'|...} [color='primary'] - Цвет кнопки.\r\n * @param {'btn-lg'|'btn-sm'|'btn-xs'} [size='btn-sm'] - Размер кнопки.\r\n * @param {boolean} [disabled=false] - Блокировка кнопки.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили кнопки.\r\n * @param {string} [className] - Кастомный класс для кнопки.\r\n * @param {string} [id] - HTML ID кнопки.\r\n *\r\n * @returns {JSX.Element} — Рендерит кнопку с выпадающим списком.\r\n */\r\nconst FDropdown = forwardRef<HTMLDivElement, IFDropdown>(({\r\n label,\r\n variant = 'contained',\r\n color = 'primary',\r\n size = 'btn-sm',\r\n disabled,\r\n st,\r\n className,\r\n id,\r\n children,\r\n ...props\r\n}, forwardedRef) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const internalRef = useRef<HTMLDivElement>(null);\r\n\r\n // Объединяем внутренний ref с переданным извне\r\n const ref = forwardedRef || internalRef;\r\n\r\n // Закрытие по клику вне\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleClick = (e: MouseEvent) => {\r\n const currentRef = typeof ref === 'function' ? null : ref?.current;\r\n if (currentRef && !currentRef.contains(e.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handleClick);\r\n return () => document.removeEventListener('mousedown', handleClick);\r\n }, [isOpen, ref]);\r\n\r\n // Закрытие по клику на пункт\r\n const handleItemClick = (child: React.ReactElement) => (e: React.MouseEvent) => {\r\n if (child.props && typeof child.props.onClick === 'function') {\r\n child.props.onClick(e);\r\n }\r\n setIsOpen(false);\r\n };\r\n\r\n // Оборачиваем FDropdownItem для автозакрытия\r\n const renderChildren = () => {\r\n return React.Children.map(children, (child) => {\r\n if (\r\n isValidElement(child) &&\r\n child.type &&\r\n (child.type as React.ComponentType).displayName === 'FDropdownItem'\r\n ) {\r\n return cloneElement(child as React.ReactElement, {\r\n onClick: handleItemClick(child as React.ReactElement)\r\n });\r\n }\r\n return child;\r\n });\r\n };\r\n\r\n return (\r\n <div className={styles[\"f-dropdown\"]} ref={ref} {...props}>\r\n <FButton\r\n variant={variant}\r\n color={color}\r\n size={size}\r\n disabled={disabled}\r\n st={st}\r\n className={`${styles[\"f-dropdown__button\"]} ${className || ''}`}\r\n id={id}\r\n onClick={() => setIsOpen((v) => !v)}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={isOpen}\r\n >\r\n <FStack direction=\"row\" spacing={2} justifyContent=\"center\" alignItems=\"center\">\r\n {label}\r\n <FArrowIcon className={styles[\"f-dropdown__arrow\"]} size={16} color={\"light\"} direction={isOpen ? 'up' : 'down'} />\r\n </FStack>\r\n </FButton>\r\n\r\n <div\r\n className={\r\n styles[\"f-dropdown__content\"] +\r\n (isOpen ? ' ' + styles[\"f-dropdown__content--open\"] : '')\r\n }\r\n role=\"menu\"\r\n >\r\n {renderChildren()}\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\n// Для корректного сравнения типа\r\nFDropdown.displayName = 'FDropdown';\r\n\r\nexport default FDropdown;","import { FC } from \"react\";\r\n\r\nimport styles from '../static/FDropdown.module.scss'\r\n\r\n/**\r\n * Пропсы для компонента FDropdownItem.\r\n */\r\nexport interface IFDropdownItem {\r\n /**\r\n * Если true — элемент неактивен, клики заблокированы.\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Инлайновые стили для элемента списка.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Контент внутри пункта меню (может быть текстом или JSX).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Callback, вызываемый при клике на элемент.\r\n */\r\n onClick?: React.MouseEventHandler<HTMLLIElement>;\r\n}\r\n\r\n/**\r\n * Компонент `FDropdownItem` — пункт выпадающего меню.\r\n *\r\n * Используется внутри `FDropdown` как отдельный элемент меню с поддержкой состояния `disabled`.\r\n *\r\n * @component\r\n * @example\r\n * <FDropdownItem\r\n * id=\"item-1\"\r\n * onClick={() => console.log('Клик по пункту')}\r\n * >\r\n * Пункт меню\r\n * </FDropdownItem>\r\n *\r\n * @param {boolean} [disabled] - Если true — элемент неактивен и не реагирует на клики.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [className] - Кастомный CSS класс.\r\n * @param {string} [id] - HTML ID элемента.\r\n * @param {React.ReactNode} [children] - Контент пункта меню.\r\n * @param {Function} [onClick] - Callback при клике на пункт.\r\n *\r\n * @returns {JSX.Element} — Рендерит пункт меню (`<li>`).\r\n */\r\nconst FDropdownItem: FC<IFDropdownItem> = ({\r\n disabled,\r\n st,\r\n className,\r\n id,\r\n children,\r\n onClick,\r\n}) => {\r\n return (\r\n <li\r\n id={id}\r\n style={st}\r\n className={`${styles[\"f-dropdown__content-link\"]} ${className || ''} ${disabled ? styles[\"disabled\"] : ''}`}\r\n onClick={disabled ? undefined : onClick}\r\n aria-disabled={disabled}\r\n role=\"menuitem\"\r\n >\r\n {children}\r\n </li>\r\n );\r\n};\r\n\r\nexport default FDropdownItem;","import { forwardRef } from \"react\";\r\nimport styles from './FSearchBox.module.scss';\r\nimport FButton from \"@material/FButton\";\r\nimport FTrashIcon from \"@icons/FTrashIcon\";\r\nimport FTextField from \"@material/FTextField\";\r\n\r\n/**\r\n * Тип цвета для кнопки.\r\n *\r\n * @typedef {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'} ButtonColorType\r\n */\r\ntype ButtonColorType =\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'danger'\r\n | 'warning'\r\n | 'info'\r\n | 'light'\r\n | 'dark'\r\n | 'link';\r\n\r\n/**\r\n * Тип варианта отображения кнопки.\r\n *\r\n * @typedef {'contained' | 'default'} ButtonVariantType\r\n */\r\ntype ButtonVariantType = 'contained' | 'default';\r\n\r\n/**\r\n * Интерфейс пропсов для компонента `FSearchBox`.\r\n *\r\n * @interface IFSearchBox\r\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\r\n */\r\nexport interface IFSearchBox extends React.InputHTMLAttributes<HTMLInputElement> {\r\n /**\r\n * Метка (label), отображаемая над полем ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера поля ввода.\r\n * @type {React.CSSProperties | undefined}\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Флаг, указывающий, должно ли поле занимать всю ширину родителя.\r\n * @type {boolean}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Флаг, блокирующий поле ввода.\r\n * @type {boolean}\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Флаг, устанавливающий поле ввода как только для чтения.\r\n * @type {boolean | undefined}\r\n */\r\n readOnly?: boolean;\r\n\r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст под полем ввода.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Флаг состояния загрузки — показывает спиннер рядом с полем ввода.\r\n * @type {boolean}\r\n */\r\n load?: boolean;\r\n\r\n /**\r\n * Дочерние элементы — например, иконка поиска.\r\n * @type {React.ReactElement | React.ReactNode}\r\n */\r\n children?: React.ReactElement | React.ReactNode;\r\n\r\n /**\r\n * Цвет кнопки справа.\r\n * @type {ButtonColorType}\r\n */\r\n color?: ButtonColorType;\r\n\r\n /**\r\n * Вариант кнопки: заполненная (`contained`) или контурная (`default`).\r\n * @type {ButtonVariantType}\r\n */\r\n variant?: ButtonVariantType;\r\n\r\n /**\r\n * Callback, вызываемый при клике на правую кнопку.\r\n * @type {React.MouseEventHandler<HTMLButtonElement> | undefined}\r\n */\r\n onClickButton?: React.MouseEventHandler<HTMLButtonElement>;\r\n\r\n /**\r\n * Callback, вызываемый при клике на кнопку очистки поля ввода.\r\n * @type {() => void | undefined}\r\n */\r\n clearDataFromInput?: () => void;\r\n}\r\n\r\n/**\r\n * Компонент `FSearchBox` — кастомное поле ввода с кнопкой справа и возможностью очистки.\r\n *\r\n * Поддерживает:\r\n * - метку (`label`)\r\n * - состояние загрузки (`load`)\r\n * - ошибки (`errText`)\r\n * - вспомогательный текст (`helpText`)\r\n * - пользовательские стили и классы\r\n *\r\n * @component\r\n * @example\r\n * <FSearchBox\r\n * label=\"Поиск\"\r\n * placeholder=\"Введите запрос\"\r\n * fullWidth\r\n * color=\"primary\"\r\n * variant=\"contained\"\r\n * onClickButton={() => alert('Искать')}\r\n * />\r\n *\r\n * @example\r\n * // С функцией очистки и ошибкой\r\n * <FSearchBox\r\n * label=\"Фильтр\"\r\n * value={searchValue}\r\n * onChange={(e) => setSearchValue(e.target.value)}\r\n * errText={['Поле обязательное']}\r\n * clearDataFromInput={() => setSearchValue('')}\r\n * />\r\n *\r\n * @param {string} [label] - Текст метки.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для контейнера.\r\n * @param {boolean} [fullWidth] - Если true, поле будет растянуто на 100% ширины.\r\n * @param {boolean} [disabled] - Блокировка ввода и кнопок.\r\n * @param {boolean} [readOnly] - Только для чтения.\r\n * @param {string[] | string} [errText] - Сообщения об ошибках.\r\n * @param {string} [helpText] - Вспомогательный текст.\r\n * @param {boolean} [load=false] - Показывает спиннер загрузки.\r\n * @param {React.ReactNode} [children] - Контент внутри кнопки справа.\r\n * @param {ButtonColorType} [color='primary'] - Цвет кнопки справа.\r\n * @param {ButtonVariantType} [variant='contained'] - Вариант кнопки: `contained` или `default`.\r\n * @param {Function} [onClickButton] - Обработчик клика по правой кнопке.\r\n * @param {Function} [clearDataFromInput] - Очистка данных из поля ввода.\r\n * @param {...React.InputHTMLAttributes<HTMLInputElement>} props - Атрибуты HTMLInputElement.\r\n *\r\n * @returns {JSX.Element} — Рендерит поле ввода с кнопками и дополнительными элементами.\r\n */\r\nconst FSearchBox = forwardRef<HTMLInputElement, IFSearchBox>(\r\n (\r\n {\r\n label,\r\n fullWidth,\r\n disabled,\r\n readOnly,\r\n errText,\r\n helpText,\r\n load = false,\r\n children,\r\n color = 'primary',\r\n variant = 'contained',\r\n onClickButton,\r\n clearDataFromInput,\r\n st,\r\n type,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n\r\n return (\r\n <div className={`${styles['f-search-box']} form-group`} style={st}>\r\n <FTextField\r\n fullWidth={fullWidth}\r\n label={label}\r\n ref={ref}\r\n disabled={disabled}\r\n readOnly={readOnly || load}\r\n type={type ?? 'text'}\r\n helpText={helpText}\r\n errText={typeof errText === 'string' ? [errText] : errText}\r\n load={load}\r\n {...props}\r\n className={`${styles['f-search-box__input']} ${props.className || ''}`}\r\n />\r\n <div className={styles['f-search-box__button']} style={{ marginTop: label ? \"21.8px\" : '0' }}>\r\n <FButton\r\n className={`${styles['f-search-box__button_search']} ${clearDataFromInput ? styles['clear-on'] : ''}`}\r\n type={'button'}\r\n disabled={disabled}\r\n onClick={onClickButton}\r\n color={color}\r\n variant={variant}\r\n >\r\n {children}\r\n </FButton>\r\n {clearDataFromInput && (\r\n <FButton\r\n className={`${styles['f-search-box__button_clear']}`}\r\n type={'button'}\r\n disabled={disabled}\r\n onClick={clearDataFromInput}\r\n color={'danger'}\r\n variant={variant}\r\n >\r\n <FTrashIcon color={\"light\"} size={20} />\r\n </FButton>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nexport default FSearchBox;","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iMTI4cHgiIGlkPSJMYXllcl8xIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMjggMTI4OyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48Zz48bGluZSBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMkYzNDM1O3N0cm9rZS13aWR0aDoxMjtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLW1pdGVybGltaXQ6MTA7IiB4MT0iODcuNSIgeDI9IjQwLjUiIHkxPSIxMTEiIHkyPSI2NCIvPjxsaW5lIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMyRjM0MzU7c3Ryb2tlLXdpZHRoOjEyO3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbWl0ZXJsaW1pdDoxMDsiIHgxPSI0MC41IiB4Mj0iODcuNSIgeTE9IjY0IiB5Mj0iMTciLz48L2c+PC9zdmc+\"","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iMTI4cHgiIGlkPSJMYXllcl8xIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMjggMTI4OyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgd2lkdGg9IjEyOHB4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48Zz48bGluZSBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMkYzNDM1O3N0cm9rZS13aWR0aDoxMjtzdHJva2UtbGluZWNhcDpzcXVhcmU7c3Ryb2tlLW1pdGVybGltaXQ6MTA7IiB4MT0iNDAuNSIgeDI9Ijg3LjUiIHkxPSIxNyIgeTI9IjY0Ii8+PGxpbmUgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzJGMzQzNTtzdHJva2Utd2lkdGg6MTI7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1taXRlcmxpbWl0OjEwOyIgeDE9Ijg3LjUiIHgyPSI0MC41IiB5MT0iNjQiIHkyPSIxMTEiLz48L2c+PC9zdmc+\"","import { FC, ReactNode, useRef, useState, useEffect } from 'react';\r\nimport styles from '../static/FCarouse.module.scss';\r\nimport arrowLeft from '../static/arrow-left.svg';\r\nimport arrowRight from '../static/arrow-right.svg';\r\n\r\n/**\r\n * Пропсы для компонента `FCarousel` — горизонтальная карусель с прокруткой.\r\n */\r\nexport interface IFCarousel {\r\n /**\r\n * Массив дочерних элементов (обычно слайды в виде JSX).\r\n */\r\n children: ReactNode[];\r\n\r\n /**\r\n * Количество одновременно отображаемых элементов.\r\n * @default 1\r\n */\r\n visibleCount?: number;\r\n\r\n /**\r\n * Отображение стрелок навигации (вкл/выкл).\r\n * @default true\r\n */\r\n showArrows?: boolean;\r\n\r\n /**\r\n * Включает цикличную прокрутку (зацикливание).\r\n * @default false\r\n */\r\n loop?: boolean;\r\n\r\n /**\r\n * Автоматическое переключение слайдов.\r\n * @default false\r\n */\r\n autoplay?: boolean;\r\n\r\n /**\r\n * Задержка автопрокрутки в миллисекундах.\r\n * @default 3000\r\n */\r\n autoplayInterval?: number;\r\n\r\n /**\r\n * Пользовательский CSS класс для контейнера карусели.\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Горизонтальный карусель с поддержкой:\r\n * - ручной и автоматической прокрутки\r\n * - свайпов на мобильных устройствах\r\n * - индикаторов текущего слайда\r\n * - циклической прокрутки\r\n *\r\n * @component\r\n * @example\r\n * <FCarousel\r\n * visibleCount={3}\r\n * showArrows={true}\r\n * loop={false}\r\n * autoplay={true}\r\n * autoplayInterval={4000}\r\n * >\r\n * <div>Слайд 1</div>\r\n * <div>Слайд 2</div>\r\n * <div>Слайд 3</div>\r\n * </FCarousel>\r\n *\r\n * @param {ReactNode[]} children - Список слайдов.\r\n * @param {number} [visibleCount=1] - Количество видимых слайдов одновременно.\r\n * @param {boolean} [showArrows=true] - Отображать ли стрелки навигации.\r\n * @param {boolean} [loop=false] - Включить зацикливание при достижении конца.\r\n * @param {boolean} [autoplay=false] - Автопрокрутка слайдов.\r\n * @param {number} [autoplayInterval=3000] - Интервал автопрокрутки в мс.\r\n * @param {string} [className] - Кастомный класс для внешнего контейнера.\r\n *\r\n * @returns {JSX.Element} — Рендерит карусель с кнопками и точками-индикаторами.\r\n */\r\nconst FCarousel: FC<IFCarousel> = ({\r\n children,\r\n visibleCount = 1,\r\n showArrows = true,\r\n loop = false,\r\n autoplay = false,\r\n autoplayInterval = 3000,\r\n className,\r\n}) => {\r\n const [current, setCurrent] = useState(0);\r\n const [isAnimating, setIsAnimating] = useState(false);\r\n const itemsCount = children.length;\r\n const trackRef = useRef<HTMLDivElement>(null);\r\n const autoplayRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n // Автопрокрутка\r\n useEffect(() => {\r\n if (autoplay) {\r\n autoplayRef.current = setInterval(() => {\r\n setIsAnimating(true);\r\n setCurrent((prev) => {\r\n if (prev >= itemsCount - visibleCount) return loop ? 0 : prev;\r\n return prev + 1;\r\n });\r\n }, autoplayInterval);\r\n\r\n return () => {\r\n if (autoplayRef.current) clearInterval(autoplayRef.current);\r\n };\r\n }\r\n }, [autoplay, autoplayInterval, itemsCount, visibleCount]);\r\n\r\n // Анимация перехода\r\n useEffect(() => {\r\n if (isAnimating) {\r\n const timeout = setTimeout(() => setIsAnimating(false), 500);\r\n return () => clearTimeout(timeout);\r\n }\r\n }, [isAnimating]);\r\n\r\n // Сброс позиции при изменении количества слайдов или видимых элементов\r\n useEffect(() => {\r\n setCurrent(0);\r\n }, [itemsCount, visibleCount]);\r\n\r\n // Обработчики навигации\r\n const handlePrev = () => {\r\n if (isAnimating) return;\r\n setIsAnimating(true);\r\n setCurrent((prev) =>\r\n prev === 0\r\n ? loop ? itemsCount - visibleCount : 0\r\n : prev - 1\r\n );\r\n };\r\n\r\n const handleNext = () => {\r\n if (isAnimating) return;\r\n setIsAnimating(true);\r\n setCurrent((prev) =>\r\n prev >= itemsCount - visibleCount\r\n ? loop ? 0 : prev\r\n : prev + 1\r\n );\r\n };\r\n\r\n // Обработка свайпов на мобильных\r\n const startX = useRef<number | null>(null);\r\n\r\n const handleTouchStart = (e: React.TouchEvent) => {\r\n startX.current = e.touches[0].clientX;\r\n };\r\n\r\n const handleTouchMove = (e: React.TouchEvent) => {\r\n if (startX.current === null) return;\r\n const diff = startX.current - e.touches[0].clientX;\r\n if (Math.abs(diff) > 50) {\r\n if (diff > 0) handleNext();\r\n else handlePrev();\r\n startX.current = null;\r\n }\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n startX.current = null;\r\n };\r\n\r\n // Классы\r\n const rootClass = [styles['f-carousel'], className]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const trackClass = [\r\n styles['f-carousel__track'],\r\n isAnimating ? styles['f-carousel__track--animating'] : ''\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const trackStyle = {\r\n transform: `translateX(-${(100 / itemsCount) * current}%)`,\r\n transition: isAnimating ? 'transform 0.6s cubic-bezier(.4,0,.2,1)' : 'none',\r\n width: `${(100 * itemsCount) / visibleCount}%`,\r\n };\r\n\r\n return (\r\n <div className={rootClass}>\r\n {showArrows && (\r\n <button\r\n className={`${styles['f-carousel__arrow']} ${styles['f-carousel__arrow--left']}`}\r\n onClick={handlePrev}\r\n disabled={!loop && current === 0}\r\n aria-label=\"Назад\"\r\n >\r\n <img src={arrowLeft} alt=\"Предыдущий слайд\" />\r\n </button>\r\n )}\r\n\r\n <div\r\n className={styles['f-carousel__viewport']}\r\n onTouchStart={handleTouchStart}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n >\r\n <div ref={trackRef} className={trackClass} style={trackStyle}>\r\n {children.map((child, idx) => (\r\n <div\r\n key={idx}\r\n className={styles['f-carousel__item']}\r\n style={{ width: `${100 / itemsCount}%` }}\r\n >\r\n {child}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {showArrows && (\r\n <button\r\n className={`${styles['f-carousel__arrow']} ${styles['f-carousel__arrow--right']}`}\r\n onClick={handleNext}\r\n disabled={!loop && current >= itemsCount - visibleCount}\r\n aria-label=\"Вперёд\"\r\n >\r\n <img src={arrowRight} alt=\"Следующий слайд\" />\r\n </button>\r\n )}\r\n\r\n <div className={styles['f-carousel__indicators']}>\r\n {Array.from({ length: itemsCount - visibleCount + 1 }).map((_, idx) => (\r\n <button\r\n key={idx}\r\n className={[\r\n styles['f-carousel__indicator'],\r\n idx === current ? styles['f-carousel__indicator--active'] : '',\r\n ].join(' ')}\r\n onClick={() => setCurrent(idx)}\r\n aria-label={`Перейти к слайду ${idx + 1}`}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FCarousel;","import { FC, ReactNode } from 'react';\r\nimport styles from '../static/FCarouse.module.scss';\r\n\r\n/**\r\n * Пропсы для компонента `FCarouselItem`.\r\n */\r\nexport interface FCarouselItemProps {\r\n /**\r\n * Контент слайда (обычно изображение или JSX).\r\n */\r\n children: ReactNode;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FCarouselItem` — отдельный элемент карусели.\r\n *\r\n * Используется внутри `FCarousel` как обёртка для каждого слайда.\r\n *\r\n * @component\r\n * @example\r\n * <FCarouselItem className=\"custom-slide\">\r\n * <img src=\"/slide1.jpg\" alt=\"Слайд 1\" />\r\n * </FCarouselItem>\r\n *\r\n * @param {React.ReactNode} children - Контент слайда.\r\n * @param {string} [className] - Пользовательский класс.\r\n * @param {string} [id] - HTML ID.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<div>` со стилями карусели и кастомным классом.\r\n */\r\nconst FCarouselItem: FC<FCarouselItemProps> = ({\r\n children,\r\n className,\r\n id,\r\n}) => {\r\n return (\r\n <div className={`${styles['f-carousel-item']} ${className || ''}`} id={id}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FCarouselItem;","import { FC, useEffect, useRef } from \"react\";\r\nimport styles from './FSkeleton.module.scss';\r\n\r\n/**\r\n * Параметры компонента FSkeleton.\r\n */\r\nexport interface IFSkeleton {\r\n /**\r\n * Дочерние элементы, которые будут заменены на скелетон.\r\n */\r\n children: React.ReactNode;\r\n\r\n /**\r\n * Флаг включения скелетона (показывает загрузку).\r\n */\r\n enable: boolean;\r\n\r\n /**\r\n * Кастомная ширина скелетона.\r\n * Если не указана — берётся из оригинального элемента.\r\n */\r\n width?: string;\r\n\r\n /**\r\n * Кастомная высота скелетона.\r\n * Если не указана — берётся из оригинального элемента.\r\n */\r\n height?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FSkeleton` — временная заглушка вместо контента во время загрузки.\r\n *\r\n * @component\r\n * @example\r\n * <FSkeleton enable={loading} width=\"100%\" height=\"20px\">\r\n * <div>Контент</div>\r\n * </FSkeleton>\r\n *\r\n * @param {ReactNode} children - Элементы, которые будут заменены на скелетон при `enable={true}`.\r\n * @param {boolean} enable - Включает режим скелетона.\r\n * @param {string} [width] - Кастомная ширина скелетона. По умолчанию — как у исходного элемента.\r\n * @param {string} [height] - Кастомная высота скелетона. По умолчанию — как у исходного элемента.\r\n *\r\n * @returns {JSX.Element} - Рендерит либо скелетон, либо оригинальный контент.\r\n */\r\nconst FSkeleton: FC<IFSkeleton> = ({ children, enable, width, height }) => {\r\n const elementRef = useRef<HTMLDivElement>(null);\r\n const originalElements = useRef<HTMLElement[]>([]);\r\n const skeletons = useRef<HTMLElement[]>([]);\r\n\r\n // Создание скелетона\r\n const createSkeleton = (element: Element): HTMLDivElement => {\r\n const skeleton = document.createElement('div');\r\n skeleton.className = styles.skeleton; // Используем класс из модульного CSS\r\n\r\n const computedStyle = window.getComputedStyle(element);\r\n\r\n skeleton.style.width = width ?? computedStyle.width;\r\n skeleton.style.height = height ?? computedStyle.height;\r\n skeleton.style.borderRadius = computedStyle.borderRadius === '0px' ? '10px' : computedStyle.borderRadius;\r\n skeleton.style.margin = computedStyle.margin;\r\n skeleton.style.display = computedStyle.display || 'block';\r\n skeleton.style.position = computedStyle.position || 'relative';\r\n\r\n return skeleton;\r\n };\r\n\r\n // Замена дочерних элементов на скелетоны\r\n const replaceWithSkeletons = () => {\r\n const container = elementRef.current;\r\n if (!container) return;\r\n\r\n const childrenArray = Array.from(container.children) as HTMLElement[];\r\n\r\n originalElements.current = [];\r\n skeletons.current = [];\r\n\r\n childrenArray.forEach((child) => {\r\n const skeleton = createSkeleton(child);\r\n originalElements.current.push(child);\r\n skeletons.current.push(skeleton);\r\n\r\n if (child.parentNode) {\r\n child.parentNode.replaceChild(skeleton, child);\r\n }\r\n });\r\n };\r\n\r\n // Восстановление оригинальных элементов\r\n const restoreOriginalElements = () => {\r\n const container = elementRef.current;\r\n if (!container) return;\r\n\r\n originalElements.current.forEach((original, index) => {\r\n const skeleton = skeletons.current[index];\r\n if (skeleton && original && skeleton.parentNode) {\r\n skeleton.parentNode.replaceChild(original, skeleton);\r\n }\r\n });\r\n\r\n skeletons.current = [];\r\n originalElements.current = [];\r\n };\r\n\r\n // Основной эффект\r\n useEffect(() => {\r\n if (enable) {\r\n replaceWithSkeletons();\r\n } else {\r\n restoreOriginalElements();\r\n }\r\n\r\n return () => {\r\n restoreOriginalElements(); // Чистка при размонтировании\r\n };\r\n }, [enable]);\r\n\r\n return (\r\n <div ref={elementRef} className={styles['skeleton-block']}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FSkeleton;","import FGrid from \"@material/GridComponents/FGrid\";\r\nimport FGridRow from \"@material/GridComponents/FGridRow\";\r\nimport { FC } from \"react\";\r\nimport styles from \"../static/FNavigateBar.module.scss\"\r\n\r\n/**\r\n * Пропсы для компонента `FNavigateBar` — обёртка для навигационной панели.\r\n */\r\nexport interface IFNavigateBar {\r\n /**\r\n * Инлайновые стили для элемента `<nav>`.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы, обычно пункты меню (`<li>`), оборачиваемые в `<ul>`.\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * HTML ID компонента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Кастомный CSS класс.\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FNavigateBar` — обёртка для навигационной панели.\r\n *\r\n * Содержит список пунктов меню в семантической обёртке `<nav>`.\r\n * Поддерживает адаптивность через сетку (`FGrid`, `FGridRow`, `FGridItem`).\r\n *\r\n * @component\r\n * @example\r\n * const getActiveClass = (route: string) => {\r\n * const pathMatch = matchPath({ path: route + '/*' }, location.pathname);\r\n * return pathMatch ? 'nav-rout active' : 'nav-rout';\r\n * };\r\n *\r\n * <FNavigateBar>\r\n * <Link to=\"/\">\r\n * <FNavigateBarItem getActiveClass={getActiveClass('/')} className=\"nav-link\">\r\n * Главная\r\n * </FNavigateBarItem>\r\n * </Link>\r\n * </FNavigateBar>\r\n *\r\n * @param {React.CSSProperties} [st] - Инлайновые стили для `<nav>`.\r\n * @param {React.ReactNode} [children] - Пункты меню (обычно `<li>`), оборачиваемые в `<ul>`.\r\n * @param {string} [id] - HTML ID для контейнера.\r\n * @param {string} [className] - Кастомный класс для контейнера.\r\n *\r\n * @returns {JSX.Element} — Рендерит панель навигации с адаптивным расположением.\r\n */\r\nconst FNavigateBar: FC<IFNavigateBar> = ({\r\n st,\r\n children,\r\n id,\r\n className,\r\n}) => {\r\n return (\r\n <FGrid obj={'container'} id={id} className={className}>\r\n <FGridRow>\r\n <FGrid obj=\"item\" sm={12}>\r\n <nav style={st} className={styles['f-nav-bar']}>\r\n <ul className={styles['f-nav-bar__menu']}>\r\n {children}\r\n </ul>\r\n </nav>\r\n </FGrid>\r\n </FGridRow>\r\n </FGrid>\r\n );\r\n};\r\n\r\nexport default FNavigateBar;","import { FC } from \"react\";\r\nimport styles from \"../static/FNavigateBar.module.scss\"\r\n\r\n/**\r\n * Пропсы для компонента `FNavigateBarItem`\r\n */\r\nexport interface IFNavigateBarItem {\r\n /**\r\n * Флаг, указывающий, является ли пункт меню активным.\r\n */\r\n activeClass: boolean;\r\n\r\n /**\r\n * Путь или имя маршрута для проверки активности (необязательный).\r\n * Может использоваться в будущем для расширения логики.\r\n */\r\n route?: string;\r\n\r\n /**\r\n * Контент пункта меню (например, текст или иконка).\r\n */\r\n children?: React.ReactNode;\r\n\r\n /**\r\n * Кастомный CSS класс для дополнительной стилизации.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для элемента `<li>`.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * HTML ID элемента.\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Компонент `FNavigateBarItem` — пункт горизонтального меню навигации.\r\n *\r\n * Отображает отдельный элемент меню (`<li>`), применяя стиль активности на основе переданного флага.\r\n *\r\n * @component\r\n * @example\r\n * <FNavigateBarItem activeClass={location.pathname === '/'}>\r\n * Главная\r\n * </FNavigateBarItem>\r\n *\r\n * @param {boolean} activeClass - Определяет, является ли пункт активным.\r\n * @param {string} [route] - Необязательный путь, может использоваться для динамической проверки.\r\n * @param {React.ReactNode} [children] - Контент пункта меню (текст, иконка и т.д.).\r\n * @param {string} [className] - Кастомный класс для дополнительной стилизации.\r\n * @param {React.CSSProperties} [st] - Инлайновые стили.\r\n * @param {string} [id] - HTML ID элемента.\r\n *\r\n * @returns {JSX.Element} — Рендерит `<li>` с возможностью активного состояния.\r\n */\r\nconst FNavigateBarItem: FC<IFNavigateBarItem> = ({\r\n st,\r\n children,\r\n id,\r\n className,\r\n activeClass,\r\n}) => {\r\n return (\r\n <li\r\n id={id}\r\n style={st}\r\n className={`${styles['f-nav-bar__menu-route']} ${activeClass ? styles.active : ''} ${className || ''}`}\r\n >\r\n {children}\r\n </li>\r\n );\r\n};\r\n\r\nexport default FNavigateBarItem;\r\n","import { FC } from \"react\";\r\nimport styles from \"../FMenuLinks.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FMenuBlockLinks — карточка-блок меню с заголовком и списком ссылок.\r\n *\r\n * @interface IFMenuBlockLinksProps\r\n */\r\ninterface IFMenuBlockLinksProps {\r\n /**\r\n * Содержимое блока. Компонент `<FMenuLinks>` с набором ссылок.\r\n */\r\n children: React.ReactNode;\r\n\r\n /**\r\n * Дополнительный CSS-класс для контейнера карточки.\r\n */\r\n className?: string;\r\n\r\n /**\r\n * Инлайновые стили для контейнера карточки.\r\n */\r\n st?: React.CSSProperties;\r\n\r\n /**\r\n * Уникальный идентификатор элемента.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Количество столбцов в контейнере Grid.\r\n */\r\n columns?: number;\r\n}\r\n\r\n/**\r\n * Компонент-карточка для группировки ссылок меню.\r\n * Используется вместе с `FMenuLinks` для создания блоков вида:\r\n *\r\n * ```\r\n * ┌─────────────────────┐\r\n * │ Заголовок │\r\n * ├─────────────────────┤\r\n * │ Ссылка 1 │\r\n * │ Ссылка 2 │\r\n * └─────────────────────┘\r\n * ```\r\n *\r\n * @component\r\n * @example\r\n * <FMenuBlockLinks columns={3}>\r\n * <FMenuLinks>\r\n * <Link to=\"/card\">Карточка учета</Link>\r\n * <Link to=\"/report\">Отчет</Link>\r\n * </FMenuLinks>\r\n * </FMenuBlockLinks>\r\n *\r\n * @param {IFMenuBlockLinksProps} props\r\n * @returns {JSX.Element}\r\n */\r\nconst FMenuBlockLinks: FC<IFMenuBlockLinksProps> = ({\r\n children,\r\n className,\r\n st,\r\n id,\r\n columns = 3\r\n}) => {\r\n\r\n const style = st !== undefined ? { ...st, columns } : { columns }\r\n\r\n return (\r\n <div\r\n className={`${styles[\"sections-routes\"]} ${className ?? \"\"}`.trim()}\r\n style={style}\r\n id={id}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FMenuBlockLinks;","import { FC } from \"react\";\r\nimport React from \"react\";\r\nimport styles from \"../FMenuLinks.module.scss\";\r\n\r\n/**\r\n * Пропсы для компонента FMenuLinks — список ссылок с единой стилистикой.\r\n *\r\n * @interface IFMenuLinksProps\r\n */\r\ninterface IFMenuLinksProps {\r\n /** Дочерние элементы (обычно <a>, <Link> или <button>). К каждому будет добавлен класс `link`. */\r\n children: React.ReactNode;\r\n\r\n /** Дополнительный класс для внешнего контейнера */\r\n className?: string;\r\n\r\n /** Инлайновые стили для внешнего контейнера */\r\n st?: React.CSSProperties;\r\n\r\n /** ID элемента */\r\n id?: string;\r\n\r\n /** Индексы дочерних элементов (начиная с 0), которые нужно отключить */\r\n disabled?: number[];\r\n\r\n /** Заголовок блока (отображается над списком ссылок) */\r\n title?: string;\r\n}\r\n\r\n/**\r\n * Компонент FMenuLinks — единый стилизованный список ссылок меню.\r\n * Автоматически добавляет класс `link` ко всем дочерним элементам,\r\n * поддерживает отключение отдельных пунктов и опциональный заголовок.\r\n *\r\n * Используется внутри `FMenuBlockLinks` или самостоятельно.\r\n *\r\n * @component\r\n * @example\r\n * <FMenuLinks title=\"Документы\">\r\n * <Link to=\"/cards\">Карточка учета</Link>\r\n * <Link to=\"/reports\">Сводная ведомость</Link>\r\n * </FMenuLinks>\r\n *\r\n * @example\r\n * // Отключение второй ссылки\r\n * <FMenuLinks disabled={[1]}>\r\n * <Link to=\"/profile\">Профиль</Link>\r\n * <Link to=\"/settings\">Настройки</Link>\r\n * </FMenuLinks>\r\n */\r\nconst FMenuLinks: FC<IFMenuLinksProps> = ({\r\n children,\r\n className,\r\n st,\r\n id,\r\n disabled = [],\r\n title,\r\n}) => {\r\n const enhancedChildren = React.Children.map(children, (child, index) => {\r\n if (!React.isValidElement(child)) return child;\r\n\r\n const isDisabled = disabled.includes(index);\r\n const childClass = [\r\n child.props.className,\r\n styles.link,\r\n isDisabled && styles.disabled,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return React.cloneElement(child as React.ReactElement<any>, {\r\n className: childClass,\r\n ...(isDisabled && { onClick: (e: React.MouseEvent) => e.preventDefault() }),\r\n });\r\n });\r\n\r\n return (\r\n <div\r\n className={`${styles[\"sections-routes_card\"]} ${className ?? \"\"}`.trim()}\r\n style={st}\r\n id={id}\r\n >\r\n {title && <div className={styles[\"sections-routes_card__title\"]}>{title}</div>}\r\n <div className={styles[\"sections-routes_card__links\"]}>{enhancedChildren}</div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FMenuLinks;","import React, {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useCallback,\r\n type ReactNode,\r\n cloneElement,\r\n type CSSProperties,\r\n ReactElement\r\n} from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport styles from './FTooltip.module.scss';\r\n\r\n/**\r\n * Интерфейс свойств компонента FTooltip\r\n * @interface FTooltipProps\r\n */\r\nexport interface FTooltipProps {\r\n /** \r\n * Текст или React-элемент, который будет отображаться в тултипе \r\n * @type {ReactNode}\r\n */\r\n title: ReactNode;\r\n\r\n /** \r\n * Дочерний элемент, к которому будет применен тултип. \r\n * Должен поддерживать передачу ref\r\n * @type {ReactElement}\r\n */\r\n children: ReactElement;\r\n\r\n /** \r\n * Расположение тултипа относительно дочернего элемента\r\n * @type {'top' | 'bottom' | 'left' | 'right'}\r\n * @default 'bottom'\r\n */\r\n placement?: 'top' | 'bottom' | 'left' | 'right';\r\n\r\n /** \r\n * Отображать ли стрелку у тултипа\r\n * @type {boolean}\r\n * @default false\r\n */\r\n arrow?: boolean;\r\n\r\n /** \r\n * Контролируемое состояние открытия тултипа. \r\n * Если не указано, компонент управляет состоянием самостоятельно\r\n * @type {boolean}\r\n */\r\n open?: boolean;\r\n\r\n /** \r\n * Callback, вызываемый при открытии тултипа\r\n * @type {Function}\r\n */\r\n onOpen?: () => void;\r\n\r\n /** \r\n * Callback, вызываемый при закрытии тултипа\r\n * @type {Function}\r\n */\r\n onClose?: () => void;\r\n\r\n /** \r\n * Отключает прослушивание событий наведения мыши\r\n * @type {boolean}\r\n * @default false\r\n */\r\n disableHoverListener?: boolean;\r\n\r\n /** \r\n * Отключает прослушивание событий фокуса\r\n * @type {boolean}\r\n * @default false\r\n */\r\n disableFocusListener?: boolean;\r\n\r\n /** \r\n * Отключает прослушивание touch-событий\r\n * @type {boolean}\r\n * @default false\r\n */\r\n disableTouchListener?: boolean;\r\n\r\n /** \r\n * Задержка перед открытием тултипа в миллисекундах\r\n * @type {number}\r\n * @default 0\r\n */\r\n enterDelay?: number;\r\n\r\n /** \r\n * Дополнительный CSS класс для тултипа\r\n * @type {string}\r\n */\r\n className?: string;\r\n\r\n /** \r\n * Inline стили для тултипа\r\n * @type {CSSProperties}\r\n */\r\n style?: CSSProperties;\r\n\r\n /**\r\n * Разрешает показывать тултип даже если элемент disabled\r\n * @type {boolean}\r\n * @default false\r\n */\r\n allowTooltipOnDisabled?: boolean;\r\n}\r\n\r\n/**\r\n * Компонент FTooltip - отображает всплывающую подсказку при взаимодействии с дочерним элементом\r\n */\r\nconst FTooltip: React.FC<FTooltipProps> = ({\r\n title,\r\n children,\r\n placement = 'bottom',\r\n arrow = false,\r\n open: openProp,\r\n onOpen,\r\n onClose,\r\n disableHoverListener = false,\r\n disableFocusListener = false,\r\n disableTouchListener = false,\r\n enterDelay = 0,\r\n className = '',\r\n style,\r\n allowTooltipOnDisabled = false\r\n}) => {\r\n /** Состояние открытия тултипа (uncontrolled) */\r\n const [open, setOpen] = useState(false);\r\n\r\n /** Состояние монтирования тултипа в DOM */\r\n const [mountTooltip, setMountTooltip] = useState(false);\r\n\r\n /** Состояние видимости тултипа (для анимации появления) */\r\n const [isVisible, setIsVisible] = useState(false);\r\n\r\n /** Состояние выхода тултипа (для анимации исчезновения) */\r\n const [isExiting, setIsExiting] = useState(false);\r\n\r\n /** Стили позиционирования тултипа */\r\n const [tooltipStyles, setTooltipStyles] = useState<CSSProperties>({});\r\n\r\n /** Ref для дочернего элемента */\r\n const childRef = useRef<HTMLElement>(null);\r\n\r\n /** Ref для элемента тултипа */\r\n const tooltipRef = useRef<HTMLDivElement>(null);\r\n\r\n /** Таймеры и анимации */\r\n const enterTimer = useRef<NodeJS.Timeout | null>(null);\r\n const leaveTimer = useRef<NodeJS.Timeout | null>(null);\r\n const animationFrame = useRef<number | null>(null);\r\n\r\n /** Определяет текущее состояние открытия (controlled или uncontrolled) */\r\n const isOpen = openProp !== undefined ? openProp : open;\r\n\r\n /** Открытие тултипа */\r\n const handleOpen = () => {\r\n if (enterTimer.current) clearTimeout(enterTimer.current);\r\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\r\n\r\n enterTimer.current = setTimeout(() => {\r\n if (openProp === undefined) {\r\n setOpen(true);\r\n }\r\n setMountTooltip(true);\r\n setIsExiting(false);\r\n\r\n if (animationFrame.current) {\r\n cancelAnimationFrame(animationFrame.current);\r\n }\r\n\r\n animationFrame.current = requestAnimationFrame(() => {\r\n setIsVisible(true);\r\n onOpen?.();\r\n updatePosition();\r\n });\r\n }, enterDelay);\r\n };\r\n\r\n /** Закрытие тултипа */\r\n const handleClose = () => {\r\n if (enterTimer.current) clearTimeout(enterTimer.current);\r\n if (leaveTimer.current) clearTimeout(leaveTimer.current);\r\n\r\n if (isOpen || isVisible) {\r\n if (openProp === undefined) {\r\n setOpen(false);\r\n }\r\n\r\n setIsVisible(false);\r\n setIsExiting(true);\r\n\r\n const tooltipNode = tooltipRef.current;\r\n if (tooltipNode) {\r\n const handleTransitionEnd = (event: TransitionEvent) => {\r\n if (event.propertyName === 'opacity') {\r\n setIsExiting(false);\r\n setMountTooltip(false);\r\n onClose?.();\r\n tooltipNode.removeEventListener('transitionend', handleTransitionEnd);\r\n }\r\n };\r\n tooltipNode.addEventListener('transitionend', handleTransitionEnd);\r\n } else {\r\n setIsExiting(false);\r\n setMountTooltip(false);\r\n onClose?.();\r\n }\r\n }\r\n };\r\n\r\n /** Обновляет позицию тултипа */\r\n const updatePosition = useCallback(() => {\r\n if (!childRef.current || !tooltipRef.current) return;\r\n\r\n const childRect = childRef.current.getBoundingClientRect();\r\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\r\n const scrollX = window.scrollX;\r\n const scrollY = window.scrollY;\r\n\r\n let top = 0;\r\n let left = 0;\r\n\r\n switch (placement) {\r\n case 'top':\r\n top = childRect.top + scrollY - tooltipRect.height - (arrow ? 8 : 0);\r\n left = childRect.left + scrollX + (childRect.width - tooltipRect.width) / 2;\r\n break;\r\n case 'bottom':\r\n top = childRect.bottom + scrollY + (arrow ? 8 : 0);\r\n left = childRect.left + scrollX + (childRect.width - tooltipRect.width) / 2;\r\n break;\r\n case 'left':\r\n top = childRect.top + scrollY + (childRect.height - tooltipRect.height) / 2;\r\n left = childRect.left + scrollX - tooltipRect.width - (arrow ? 8 : 0);\r\n break;\r\n case 'right':\r\n top = childRect.top + scrollY + (childRect.height - tooltipRect.height) / 2;\r\n left = childRect.right + scrollX + (arrow ? 8 : 0);\r\n break;\r\n }\r\n\r\n setTooltipStyles({ top: `${top}px`, left: `${left}px` });\r\n }, [placement, arrow]);\r\n\r\n /** Обновляем позицию при изменении видимости */\r\n useEffect(() => {\r\n if (isVisible) {\r\n updatePosition();\r\n }\r\n }, [isVisible, updatePosition]);\r\n\r\n /** Следим за ресайзом окна */\r\n useEffect(() => {\r\n const handleResize = () => {\r\n if (isVisible) updatePosition();\r\n };\r\n\r\n window.addEventListener('resize', handleResize);\r\n\r\n // Сохраняем текущие значения для cleanup\r\n const currentEnterTimer = enterTimer.current;\r\n const currentLeaveTimer = leaveTimer.current;\r\n const currentAnimationFrame = animationFrame.current;\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n if (currentEnterTimer) clearTimeout(currentEnterTimer);\r\n if (currentLeaveTimer) clearTimeout(currentLeaveTimer);\r\n if (currentAnimationFrame) cancelAnimationFrame(currentAnimationFrame);\r\n };\r\n }, [isVisible, updatePosition]);\r\n\r\n /** Подготавливает обработчики событий */\r\n const childProps: Record<string, React.EventHandler<React.SyntheticEvent> | React.Ref<HTMLElement>> = {\r\n ref: childRef\r\n };\r\n\r\n if (!disableHoverListener) {\r\n childProps.onMouseEnter = (e: React.MouseEvent) => {\r\n handleOpen();\r\n (children.props as Record<string, React.EventHandler<React.MouseEvent>>).onMouseEnter?.(e);\r\n };\r\n childProps.onMouseLeave = (e: React.MouseEvent) => {\r\n handleClose();\r\n (children.props as Record<string, React.EventHandler<React.MouseEvent>>).onMouseLeave?.(e);\r\n };\r\n }\r\n\r\n if (!disableFocusListener) {\r\n childProps.onFocus = (e: React.FocusEvent) => {\r\n handleOpen();\r\n (children.props as Record<string, React.EventHandler<React.FocusEvent>>).onFocus?.(e);\r\n };\r\n childProps.onBlur = (e: React.FocusEvent) => {\r\n handleClose();\r\n (children.props as Record<string, React.EventHandler<React.FocusEvent>>).onBlur?.(e);\r\n };\r\n }\r\n\r\n if (!disableTouchListener) {\r\n childProps.onTouchStart = (e: React.TouchEvent) => {\r\n handleOpen();\r\n (children.props as Record<string, React.EventHandler<React.TouchEvent>>).onTouchStart?.(e);\r\n };\r\n childProps.onTouchEnd = (e: React.TouchEvent) => {\r\n handleClose();\r\n (children.props as Record<string, React.EventHandler<React.TouchEvent>>).onTouchEnd?.(e);\r\n };\r\n }\r\n\r\n /** Оборачивание disabled элементов */\r\n let wrappedChild: ReactElement;\r\n const childPropsTyped = children.props as Record<string, unknown>;\r\n\r\n if (\r\n allowTooltipOnDisabled &&\r\n React.isValidElement(children) &&\r\n (childPropsTyped.disabled || childPropsTyped['aria-disabled'])\r\n ) {\r\n wrappedChild = (\r\n <span\r\n ref={childRef as React.Ref<HTMLSpanElement>}\r\n {...(childProps as Record<string, unknown>)}\r\n style={{ display: 'inline-block', cursor: 'not-allowed' }}\r\n >\r\n {children}\r\n </span>\r\n );\r\n } else {\r\n wrappedChild = cloneElement(children, childProps as Record<string, unknown>);\r\n }\r\n\r\n /** Классы тултипа */\r\n const tooltipClasses = [\r\n styles['f-tooltip'],\r\n styles[`f-tooltip--${placement}`],\r\n arrow ? styles['f-tooltip--with-arrow'] : '',\r\n isVisible ? styles['f-tooltip--open'] : '',\r\n isExiting ? styles['f-tooltip--exiting'] : '',\r\n className\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n /** JSX тултипа */\r\n const tooltipElement =\r\n mountTooltip && title ? (\r\n <div\r\n ref={tooltipRef}\r\n className={tooltipClasses}\r\n style={{ ...style, ...tooltipStyles }}\r\n role=\"tooltip\"\r\n >\r\n {arrow && <div className={styles['f-tooltip__arrow']} />}\r\n <div className={styles['f-tooltip__content']}>{title}</div>\r\n </div>\r\n ) : null;\r\n\r\n return (\r\n <>\r\n {wrappedChild}\r\n {tooltipElement && createPortal(tooltipElement, document.body)}\r\n </>\r\n );\r\n};\r\n\r\nexport default FTooltip;\r\n","import React, {\r\n forwardRef,\r\n useState,\r\n useMemo,\r\n useRef,\r\n useEffect,\r\n useDeferredValue,\r\n type ChangeEvent,\r\n type KeyboardEvent,\r\n type ReactNode,\r\n type CSSProperties,\r\n type ReactElement\r\n} from \"react\";\r\n\r\nimport styles from \"./FSearchableSelect.module.scss\";\r\nimport FLoadIcon from \"@icons/FLoadIcon\";\r\n\r\n// --- Иконки ---\r\nconst ChevronIcon = ({ className }: { className?: string }) => (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n);\r\nconst CloseIcon = () => (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n);\r\nconst PlusIcon = () => (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n);\r\n\r\n// --- Типы ---\r\ninterface IOptionData {\r\n value: string;\r\n label: string;\r\n isNew?: boolean;\r\n}\r\n\r\n/**\r\n * Интерфейс пропсов для компонента `FSearchableSelect`.\r\n *\r\n * @interface IFSearchableSelect\r\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'>}\r\n */\r\nexport interface IFSearchableSelect extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {\r\n /**\r\n * Метка (label), отображаемая над полем ввода.\r\n * @type {string | undefined}\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Инлайновые стили для внешнего контейнера компонента.\r\n * @type {CSSProperties | undefined}\r\n */\r\n st?: CSSProperties;\r\n\r\n /**\r\n * Дочерние элементы (обычно `<option>`), из которых формируется список выбора.\r\n * Значения извлекаются из пропсов `value` и `children` переданных элементов.\r\n * @type {ReactNode | undefined}\r\n */\r\n children?: ReactNode;\r\n\r\n /**\r\n * Флаг, указывающий, должен ли компонент занимать 100% ширины родителя.\r\n * @type {boolean | undefined}\r\n */\r\n fullWidth?: boolean;\r\n\r\n /**\r\n * Флаг состояния загрузки. Если true, отображается спиннер, а взаимодействие блокируется.\r\n * @type {boolean | undefined}\r\n */\r\n load?: boolean;\r\n \r\n /**\r\n * Массив текстов ошибок, связанных с полем ввода.\r\n * @type {string[] | string | undefined}\r\n */\r\n errText?: string[] | string | undefined;\r\n\r\n /**\r\n * Вспомогательный текст, отображаемый под полем ввода.\r\n * @type {string | undefined}\r\n */\r\n helpText?: string;\r\n\r\n /**\r\n * Явное указание ширины компонента.\r\n * @type {string | number | undefined}\r\n */\r\n width?: string | number;\r\n\r\n /**\r\n * Явное указание высоты компонента.\r\n * @type {string | number | undefined}\r\n */\r\n height?: string | number;\r\n\r\n /**\r\n * Разрешить создание новых элементов, отсутствующих в списке.\r\n * При вводе уникального текста появится опция \"Создать\".\r\n * @type {boolean | undefined}\r\n */\r\n allowCreate?: boolean;\r\n\r\n /**\r\n * Текущее значение поля (контролируемый компонент).\r\n * @type {string | number | readonly string[] | undefined}\r\n */\r\n value?: string | number | readonly string[];\r\n\r\n /**\r\n * Callback, вызываемый при изменении значения.\r\n * Возвращает синтетическое событие с объектом target, содержащим name и value.\r\n * @type {((event: { target: { name: string; value: string } } | ChangeEvent<HTMLInputElement>) => void) | undefined}\r\n */\r\n onChange?: (event: { target: { name: string; value: string } } | ChangeEvent<HTMLInputElement>) => void;\r\n}\r\n\r\n/**\r\n * Компонент подсветки найденного текста.\r\n * @ignore\r\n */\r\nconst HighlightedText = ({ text, highlight }: { text: string; highlight: string }) => {\r\n if (!highlight.trim()) return <span>{text}</span>;\r\n const escapeRegExp = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n const regex = new RegExp(`(${escapeRegExp(highlight)})`, \"gi\");\r\n const parts = text.split(regex);\r\n return (\r\n <span>\r\n {parts.map((part, i) =>\r\n regex.test(part) ? <span key={i} className={styles['f-select-highlight']}>{part}</span> : <span key={i}>{part}</span>\r\n )}\r\n </span>\r\n );\r\n};\r\n\r\n/**\r\n * Компонент `FSearchableSelect` — выпадающий список с возможностью поиска и фильтрации опций.\r\n *\r\n * Особенности:\r\n * - Поддерживает фильтрацию списка при вводе текста.\r\n * - Может работать как обычный Select или как Combobox (с `allowCreate`).\r\n * - Парсит опции из переданных `children` (например, `<option value=\"1\">One</option>`).\r\n * - Поддерживает навигацию с клавиатуры (стрелки, Enter, Escape).\r\n * - Имеет состояния: ошибка, загрузка, disabled.\r\n *\r\n * @component\r\n * @example\r\n * // Простой пример использования с опциями\r\n * <FSearchableSelect\r\n * label=\"Выберите город\"\r\n * value={city}\r\n * onChange={(e) => setCity(e.target.value)}\r\n * fullWidth\r\n * >\r\n * <option value=\"moscow\">Москва</option>\r\n * <option value=\"spb\">Санкт-Петербург</option>\r\n * </FSearchableSelect>\r\n *\r\n * @example\r\n * // Пример с созданием новых значений (allowCreate) и ошибкой\r\n * <FSearchableSelect\r\n * label=\"Теги\"\r\n * allowCreate\r\n * value={tag}\r\n * onChange={(e) => setTag(e.target.value)}\r\n * errText={hasError ? ['Некорректный тег'] : undefined}\r\n * >\r\n * {tagsList.map(t => <option key={t.id} value={t.name}>{t.name}</option>)}\r\n * </FSearchableSelect>\r\n *\r\n * @param {string} [label] - Метка поля.\r\n * @param {CSSProperties} [st] - Стили контейнера.\r\n * @param {ReactNode} [children] - Опции списка.\r\n * @param {boolean} [fullWidth=false] - Растянуть на 100%.\r\n * @param {boolean} [load=false] - Показать лоадер.\r\n * @param {string[] | string} [errText] - Текст ошибки.\r\n * @param {string} [helpText] - Подсказка.\r\n * @param {boolean} [allowCreate=false] - Разрешить ввод своих значений.\r\n * @param {string|number} [value] - Значение.\r\n * @param {Function} [onChange] - Обработчик изменений.\r\n *\r\n * @returns {JSX.Element} Рендерит кастомный Select с поиском.\r\n */\r\nconst FSearchableSelect = forwardRef<HTMLInputElement, IFSearchableSelect>(\r\n (\r\n {\r\n label,\r\n st,\r\n children,\r\n fullWidth,\r\n load = false,\r\n errText,\r\n helpText,\r\n height = \"auto\",\r\n width = \"fit-content\",\r\n allowCreate = false,\r\n disabled,\r\n onKeyDown: restOnKeyDown,\r\n onFocus: restOnFocus,\r\n ...restProps\r\n },\r\n ref\r\n ) => {\r\n // --- 1. Парсинг Children в массив данных ---\r\n const options = useMemo(() => {\r\n const results: IOptionData[] = [];\r\n React.Children.forEach(children, (child) => {\r\n if (React.isValidElement(child)) {\r\n const element = child as ReactElement<{ value?: string | number; children?: ReactNode }>;\r\n const { value: childValue, children: childLabel } = element.props;\r\n\r\n const valStr = childValue !== undefined ? String(childValue) : \"\";\r\n let labelStr = valStr;\r\n if (typeof childLabel === 'string' || typeof childLabel === 'number') {\r\n labelStr = String(childLabel);\r\n } else if (valStr) {\r\n labelStr = valStr;\r\n }\r\n\r\n if (valStr || labelStr) {\r\n results.push({ value: valStr, label: labelStr });\r\n }\r\n }\r\n });\r\n return results;\r\n }, [children]);\r\n\r\n // --- State ---\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [searchQuery, setSearchQuery] = useState(\"\");\r\n const [highlightedIndex, setHighlightedIndex] = useState(0);\r\n\r\n // --- Refs ---\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const visibleInputRef = useRef<HTMLInputElement>(null);\r\n const listRef = useRef<HTMLUListElement>(null);\r\n const lastValueRef = useRef<string>(restProps.value !== undefined ? String(restProps.value) : \"\");\r\n\r\n // --- 2. Синхронизация внешнего Value с внутренним ---\r\n useEffect(() => {\r\n if (restProps.value !== undefined) {\r\n const strValue = String(restProps.value);\r\n lastValueRef.current = strValue;\r\n const found = options.find(o => o.value === strValue);\r\n setSearchQuery(found ? found.label : strValue);\r\n }\r\n }, [restProps.value, options]);\r\n\r\n // --- Фильтрация ---\r\n const deferredQuery = useDeferredValue(searchQuery);\r\n\r\n const filteredOptions = useMemo(() => {\r\n if (!isOpen) return options;\r\n const lowerQuery = deferredQuery.toLowerCase();\r\n return options.filter(opt => opt.label.toLowerCase().includes(lowerQuery));\r\n }, [options, deferredQuery, isOpen]);\r\n\r\n const showCreateOption = useMemo(() => {\r\n if (!allowCreate) return false;\r\n if (!deferredQuery.trim()) return false;\r\n const exactMatch = filteredOptions.find(opt => opt.label.toLowerCase() === deferredQuery.toLowerCase());\r\n return !exactMatch;\r\n }, [deferredQuery, filteredOptions, allowCreate]);\r\n\r\n const renderList = useMemo(() => {\r\n const list = filteredOptions.slice(0, 100);\r\n if (showCreateOption) {\r\n list.push({ value: deferredQuery, label: deferredQuery, isNew: true });\r\n }\r\n return list;\r\n }, [filteredOptions, showCreateOption, deferredQuery]);\r\n\r\n // --- Обработчики ---\r\n const triggerChange = (newValue: string) => {\r\n lastValueRef.current = newValue;\r\n if (restProps.onChange) {\r\n const syntheticEvent = {\r\n target: { name: restProps.name || \"\", value: newValue },\r\n };\r\n restProps.onChange(syntheticEvent);\r\n }\r\n };\r\n\r\n const handleSelect = (option: IOptionData) => {\r\n triggerChange(option.value);\r\n setSearchQuery(option.label);\r\n setIsOpen(false);\r\n setHighlightedIndex(0);\r\n };\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n triggerChange(\"\");\r\n setSearchQuery(\"\");\r\n visibleInputRef.current?.focus();\r\n };\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n const effectiveValue = restProps.value !== undefined ? String(restProps.value) : lastValueRef.current;\r\n\r\n if (effectiveValue) {\r\n const found = options.find(o => o.value === effectiveValue);\r\n setSearchQuery(found ? found.label : effectiveValue);\r\n } else {\r\n setSearchQuery(\"\");\r\n }\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [restProps.value, options]);\r\n\r\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\r\n if (restOnKeyDown) restOnKeyDown(e);\r\n\r\n if (e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n if (!isOpen) setIsOpen(true);\r\n else setHighlightedIndex(prev => prev < renderList.length - 1 ? prev + 1 : prev);\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n setHighlightedIndex(prev => prev > 0 ? prev - 1 : prev);\r\n } else if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (isOpen && renderList[highlightedIndex]) {\r\n handleSelect(renderList[highlightedIndex]);\r\n } else {\r\n setIsOpen(true);\r\n }\r\n } else if (e.key === \"Escape\") {\r\n setIsOpen(false);\r\n visibleInputRef.current?.blur();\r\n }\r\n };\r\n\r\n // --- Стили и ID ---\r\n const baseStyle: CSSProperties = {\r\n width: fullWidth ? '100%' : width || 'fit-content',\r\n height: height || 'auto',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n };\r\n\r\n const mergedStyle = { ...baseStyle, ...st };\r\n const inputId = restProps.id || `search-select-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n const hasValue = restProps.value !== undefined ? !!String(restProps.value) : !!lastValueRef.current;\r\n const currentValStr = restProps.value !== undefined ? String(restProps.value) : lastValueRef.current;\r\n\r\n return (\r\n <div\r\n className={`f-form-element ${styles['f-search-select']} ${restProps.className || ''}`}\r\n style={mergedStyle}\r\n ref={containerRef}\r\n id={inputId + '-block'}\r\n >\r\n {label && (\r\n <label\r\n id={inputId + '-label'}\r\n htmlFor={inputId}\r\n className={`f-form-element__label ${errText ? 'error' : ''}`}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n name={restProps.name}\r\n value={restProps.value !== undefined ? String(restProps.value) : \"\"}\r\n onChange={() => { }}\r\n className={styles['f-select-native-hidden']}\r\n tabIndex={-1}\r\n disabled={disabled}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <div className={`f-form-element__control ${load ? 'is-loading' : ''}`}>\r\n <input\r\n ref={visibleInputRef}\r\n id={inputId}\r\n type=\"text\"\r\n autoComplete=\"off\"\r\n className={`f-form-element__control-element ${styles['has-icons']} ${errText ? 'error' : ''}`}\r\n\r\n {...restProps}\r\n\r\n disabled={disabled || load}\r\n value={searchQuery}\r\n\r\n onChange={(e) => {\r\n const val = e.target.value;\r\n setSearchQuery(val);\r\n if (!isOpen) setIsOpen(true);\r\n if (allowCreate) {\r\n triggerChange(val);\r\n } else if (val === \"\") {\r\n triggerChange(\"\");\r\n }\r\n }}\r\n\r\n onKeyDown={handleKeyDown}\r\n onFocus={(e) => {\r\n if (!disabled && !load) setIsOpen(true);\r\n if (restOnFocus) restOnFocus(e);\r\n }}\r\n />\r\n\r\n {load ?\r\n <span className={'f-form-element__loader'}>\r\n <FLoadIcon size={10} />\r\n </span>\r\n :\r\n <div className={styles['f-select-actions']}>\r\n {hasValue && !disabled && (\r\n <div\r\n onClick={handleClear}\r\n className={`${styles['f-select-icon']} close`}\r\n title=\"Очистить\"\r\n onMouseDown={(e) => e.preventDefault()}\r\n >\r\n <CloseIcon />\r\n </div>\r\n )}\r\n <div className={`${styles['f-select-icon']} ${isOpen ? styles['rotate'] : ''}`}>\r\n <ChevronIcon />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n {\r\n isOpen && !disabled && !load && (\r\n <div className={styles['f-select-dropdown']}>\r\n <ul ref={listRef} className={styles['f-select-list']}>\r\n {renderList.length === 0 ? (\r\n <li className={styles['f-select-no-results']}>\r\n {allowCreate ? 'Нет данных' : 'Совпадений не найдено'}\r\n </li>\r\n ) : (\r\n renderList.map((option, index) => (\r\n <li\r\n key={option.value + index}\r\n className={`\r\n ${styles['f-select-option']} \r\n ${option.isNew ? styles['f-select-create'] : ''} \r\n ${index === highlightedIndex ? styles['focused'] : ''} \r\n ${currentValStr === option.value ? styles['selected'] : ''}\r\n `}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleSelect(option);\r\n }}\r\n onMouseEnter={() => setHighlightedIndex(index)}\r\n >\r\n <div style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {option.isNew && <span style={{ marginRight: 4 }}><PlusIcon /></span>}\r\n <HighlightedText text={option.label} highlight={deferredQuery} />\r\n {option.isNew && <span style={{ opacity: 0.6, fontSize: '0.85em', marginLeft: 6 }}>(Создать)</span>}\r\n </div>\r\n </li>\r\n ))\r\n )}\r\n </ul>\r\n </div>\r\n )\r\n }\r\n\r\n {helpText && (\r\n <p\r\n id={inputId + '-helptext'}\r\n className={'f-form-element__helptext'}\r\n >\r\n {helpText}\r\n </p>\r\n )}\r\n {(typeof errText === 'string' && errText) && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n <p\r\n id={`${inputId}-errortext`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {errText}\r\n </p>\r\n </div>\r\n )}\r\n {errText && errText.length > 0 && (\r\n <div\r\n className={'f-form-element__errorblock'}\r\n >\r\n {typeof errText !== 'string' && errText.map((error, index) => (\r\n <p\r\n key={index}\r\n id={`${inputId}-errortext-${index}`}\r\n className={'f-form-element__errorblock_errortext'}\r\n >\r\n {error}\r\n </p>\r\n ))}\r\n </div>\r\n )}\r\n </div >\r\n );\r\n }\r\n);\r\n\r\nFSearchableSelect.displayName = \"FSearchableSelect\";\r\nexport default FSearchableSelect;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FPlusIcon.\r\n * @interface IFPlusIcon\r\n */\r\nexport interface IFPlusIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FPlusIcon представляет собой SVG иконку плюса с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FPlusIcon\r\n * @param {IFPlusIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FPlusIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FPlusIcon = React.forwardRef<SVGSVGElement, IFPlusIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n className,\r\n id,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n onClick={handleClick}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n id={id}\r\n width={size}\r\n style={st}\r\n focusable=\"false\"\r\n aria-hidden=\"true\"\r\n viewBox=\"0 0 24 24\"\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFPlusIcon.displayName = 'FPlusIcon';\r\n\r\nexport default FPlusIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FCheckIcon.\r\n * @interface IFCheckIcon\r\n */\r\nexport interface IFCheckIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FCheckIcon представляет собой SVG иконку галочки с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FCheckIcon\r\n * @param {IFCheckIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FCheckIcon\r\n * color=\"success\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FCheckIcon = React.forwardRef<SVGSVGElement, IFCheckIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n viewBox=\"0 0 16 16\"\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n id={id}\r\n onClick={handleClick}\r\n style={st}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path clipRule=\"evenodd\"\r\n d=\"M15.4142 4.41421L6 13.8284L0.585785 8.41421L3.41421 5.58578L6 8.17157L12.5858 1.58578L15.4142 4.41421Z\"\r\n fillRule=\"evenodd\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFCheckIcon.displayName = 'FCheckIcon';\r\n\r\nexport default FCheckIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FListIcon.\r\n * @interface IFListIcon\r\n */\r\nexport interface IFListIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties,\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string,\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string,\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void,\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FListIcon представляет собой SVG иконку списка с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FListIcon\r\n * @param {IFListIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FListIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FListIcon = React.forwardRef<SVGSVGElement, IFListIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n id={id}\r\n onClick={handleClick}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M14.5 3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-13a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h13zm-13-1A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2h-13z\" />\r\n <path\r\n d=\"M5 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 5 8zm0-2.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm0 5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm-1-5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zM4 8a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 2.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFListIcon.displayName = 'FListIcon';\r\n\r\nexport default FListIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FPenIcon.\r\n * @interface IFPenIcon\r\n*/\r\nexport interface IFPenIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FPenIcon представляет собой SVG иконку карандаша с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FPenIcon\r\n * @param {IFPenIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FPenIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n*/\r\nconst FPenIcon = React.forwardRef<SVGSVGElement, IFPenIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClick, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path\r\n d=\"M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0 0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168l10-10zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207 11.207 2.5zm1.586 3L10.5 3.207 4 9.707V10h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.293l6.5-6.5zm-9.761 5.175-.106.106-1.528 3.821 3.821-1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFPenIcon.displayName = 'FPenIcon';\r\n\r\nexport default FPenIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FDownloadIcon.\r\n * @interface IFDownloadIcon\r\n */\r\nexport interface IFDownloadIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FDownloadIcon представляет собой SVG иконку загрузки с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FDownloadIcon\r\n * @param {IFDownloadIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FDownloadIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FDownloadIcon = React.forwardRef<SVGSVGElement, IFDownloadIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n\r\n return (\r\n <svg\r\n ref={ref}\r\n style={st}\r\n id={id}\r\n width={size}\r\n onClick={handleClick}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z\" />\r\n <path d=\"M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFDownloadIcon.displayName = 'FDownloadIcon';\r\n\r\nexport default FDownloadIcon;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FCopyAddIcon.\r\n * @interface IFCopyAddIcon\r\n */\r\nexport interface IFCopyAddIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FCopyAddIcon представляет собой SVG иконку копирования с плюсом с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FCopyAddIcon\r\n * @param {IFCopyAddIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FCopyAddIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FCopyAddIcon = React.forwardRef<SVGSVGElement, IFCopyAddIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClick, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 32 32\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M27.2,8.22H23.78V5.42A3.42,3.42,0,0,0,20.36,2H5.42A3.42,3.42,0,0,0,2,5.42V20.36a3.42,3.42,0,0,0,3.42,3.42h2.8V27.2A2.81,2.81,0,0,0,11,30H27.2A2.81,2.81,0,0,0,30,27.2V11A2.81,2.81,0,0,0,27.2,8.22ZM5.42,21.91a1.55,1.55,0,0,1-1.55-1.55V5.42A1.54,1.54,0,0,1,5.42,3.87H20.36a1.55,1.55,0,0,1,1.55,1.55v2.8H11A2.81,2.81,0,0,0,8.22,11V21.91ZM28.13,27.2a.93.93,0,0,1-.93.93H11a.93.93,0,0,1-.93-.93V11a.93.93,0,0,1,.93-.93H27.2a.93.93,0,0,1,.93.93Z\" />\r\n <path d=\"M24.09,18.18H20v-4a.93.93,0,1,0-1.86,0v4h-4a.93.93,0,0,0,0,1.86h4v4.05a.93.93,0,1,0,1.86,0V20h4.05a.93.93,0,1,0,0-1.86Z\" />\r\n\r\n </svg>\r\n );\r\n});\r\n\r\nFCopyAddIcon.displayName = 'FCopyAddIcon';\r\n\r\nexport default FCopyAddIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FUnlinkIcon.\r\n * @interface IFUnlinkIcon\r\n */\r\nexport interface IFUnlinkIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: React.SVGAttributes<SVGSVGElement>['width'];\r\n\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.SVGAttributes<SVGSVGElement>['style'];\r\n\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: React.SVGAttributes<SVGSVGElement>['id'];\r\n\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: React.SVGAttributes<SVGSVGElement>['className'];\r\n\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: React.DOMAttributes<SVGSVGElement>['onClick'];\r\n\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FUnlinkIcon представляет собой SVG иконку разрыва связи с возможностью настройки цвета, размера и обработки кликов.\r\n * \r\n * @function FUnlinkIcon\r\n * @param {IFUnlinkIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n * \r\n * @example\r\n * <FUnlinkIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n *\r\n */\r\nconst FUnlinkIcon = React.forwardRef<SVGSVGElement, IFUnlinkIcon>((\r\n {\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n }, ref\r\n) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"-0.5 0 25 25\"\r\n onClick={handleClick}\r\n id={id}\r\n fill={'none'}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M9.23993 17.55L7.95993 18.84C7.33993 19.47 6.51992 19.79 5.69992 19.79C4.87992 19.79 4.05994 19.47 3.43994 18.84C2.18994 17.58 2.18994 15.54 3.43994 14.29L4.70993 13.02L6.11993 11.6L8.82993 8.86\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M8.82996 3.86V6.86\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M5.32996 5.22L6.82996 7.81\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M9.23993 17.55L7.95993 18.84C7.33993 19.47 6.51992 19.79 5.69992 19.79C4.87992 19.79 4.05994 19.47 3.43994 18.84C2.18994 17.58 2.18994 15.54 3.43994 14.29L4.70993 13.02L6.11993 11.6L8.82993 8.86\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M14.7599 7.45L16.0399 6.16C16.6599 5.53 17.4799 5.21 18.2999 5.21C19.1199 5.21 19.9399 5.53 20.5599 6.16C21.8099 7.42 21.8099 9.46 20.5599 10.71L19.2899 11.98L17.8799 13.4L15.1699 16.14\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M12.33 5.22L10.83 7.81\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M15.1699 21.14V18.14\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M18.6699 19.79L17.1699 17.19\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M11.6699 19.79L13.1699 17.19\" stroke=\"#0F0F0F\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFUnlinkIcon.displayName = 'FUnlinkIcon';\r\n\r\nexport default FUnlinkIcon;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FFilterIcon.\r\n * @interface IFFilterIcon\r\n */\r\nexport interface IFFilterIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FFilterIcon представляет собой SVG иконку фильтра с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FFilterIcon\r\n * @param {IFFilterIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FFilterIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FFilterIcon = React.forwardRef<SVGSVGElement, IFFilterIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClick, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n viewBox=\"0 0 24 24\"\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n id={id}\r\n onClick={handleClick}\r\n style={st}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\r\n <path fillRule=\"nonzero\" d=\"M14 14v6l-4 2v-8L4 5V3h16v2l-6 9zM6.404 5L12 13.394 17.596 5H6.404z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFFilterIcon.displayName = 'FFilterIcon';\r\n\r\nexport default FFilterIcon;","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FDocumentIcon.\r\n * @interface IFDocumentIcon\r\n */\r\nexport interface IFDocumentIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void\r\n /**\r\n * Тип файла для отображения соответствующего значка.\r\n * @type {('check' | 'download' | 'upload' | 'close' | 'excel' | 'doc' | 'docx' | 'pdf' | 'jpg' | 'png' | 'txt')}\r\n */\r\n file?: 'check' | 'download' | 'upload' | 'close' | 'excel' | 'doc' | 'docx' | 'pdf' | 'jpg' | 'png' | 'txt'\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FDocumentIcon представляет собой SVG иконку документа с возможностью настройки цвета, размера, типа файла и обработки кликов.\r\n *\r\n * @function FDocumentIcon\r\n * @param {IFDocumentIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {('check' | 'download' | 'upload' | 'close' | 'excel' | 'doc' | 'docx' | 'pdf' | 'jpg' | 'png' | 'txt')} [file] - Тип файла для отображения соответствующего значка.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FDocumentIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * file=\"pdf\"\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FDocumentIcon = React.forwardRef<SVGSVGElement, IFDocumentIcon>(({\r\n color = \"primary\",\r\n size = 30,\r\n st,\r\n id,\r\n file,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n onClick={handleClick}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n {!file && <path d=\"M14 4.5V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h5.5L14 4.5zm-3 0A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V4.5h-2z\" />}\r\n {file === 'check' && <>\r\n <path d=\"M10.854 7.854a.5.5 0 0 0-.708-.708L7.5 9.793 6.354 8.646a.5.5 0 1 0-.708.708l1.5 1.5a.5.5 0 0 0 .708 0l3-3z\" />\r\n <path d=\"M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z\" />\r\n </>}\r\n {file === 'close' && <>\r\n <path d=\"M6.854 7.146a.5.5 0 1 0-.708.708L7.293 9l-1.147 1.146a.5.5 0 0 0 .708.708L8 9.707l1.146 1.147a.5.5 0 0 0 .708-.708L8.707 9l1.147-1.146a.5.5 0 0 0-.708-.708L8 8.293 6.854 7.146z\" />\r\n <path d=\"M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z\" />\r\n </>}\r\n {file === 'download' && <>\r\n <path d=\"M8.5 6.5a.5.5 0 0 0-1 0v3.793L6.354 9.146a.5.5 0 1 0-.708.708l2 2a.5.5 0 0 0 .708 0l2-2a.5.5 0 0 0-.708-.708L8.5 10.293V6.5z\" />\r\n <path d=\"M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z\" />\r\n </>}\r\n {file === 'upload' && <>\r\n <path d=\"M8 11a.5.5 0 0 0 .5-.5V6.707l1.146 1.147a.5.5 0 0 0 .708-.708l-2-2a.5.5 0 0 0-.708 0l-2 2a.5.5 0 1 0 .708.708L7.5 6.707V10.5a.5.5 0 0 0 .5.5z\" />\r\n <path d=\"M4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H4zm0 1h8a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1z\" />\r\n </>}\r\n {file === 'excel' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V11h-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5ZM7.86 14.841a1.13 1.13 0 0 0 .401.823c.13.108.29.192.479.252.19.061.411.091.665.091.338 0 .624-.053.858-.158.237-.105.416-.252.54-.44a1.17 1.17 0 0 0 .187-.656c0-.224-.045-.41-.135-.56a1.002 1.002 0 0 0-.375-.357 2.028 2.028 0 0 0-.565-.21l-.621-.144a.97.97 0 0 1-.405-.176.37.37 0 0 1-.143-.299c0-.156.061-.284.184-.384.125-.101.296-.152.513-.152.143 0 .266.023.37.068a.624.624 0 0 1 .245.181.56.56 0 0 1 .12.258h.75a1.093 1.093 0 0 0-.199-.566 1.21 1.21 0 0 0-.5-.41 1.813 1.813 0 0 0-.78-.152c-.293 0-.552.05-.777.15-.224.099-.4.24-.527.421-.127.182-.19.395-.19.639 0 .201.04.376.123.524.082.149.199.27.351.367.153.095.332.167.54.213l.618.144c.207.049.36.113.462.193a.387.387 0 0 1 .153.326.512.512 0 0 1-.085.29.558.558 0 0 1-.255.193c-.111.047-.25.07-.413.07-.117 0-.224-.013-.32-.04a.837.837 0 0 1-.249-.115.578.578 0 0 1-.255-.384h-.764Zm-3.726-2.909h.893l-1.274 2.007 1.254 1.992h-.908l-.85-1.415h-.035l-.853 1.415H1.5l1.24-2.016-1.228-1.983h.931l.832 1.438h.036l.823-1.438Zm1.923 3.325h1.697v.674H5.266v-3.999h.791v3.325Zm7.636-3.325h.893l-1.274 2.007 1.254 1.992h-.908l-.85-1.415h-.035l-.853 1.415h-.861l1.24-2.016-1.228-1.983h.931l.832 1.438h.036l.823-1.438Z\" />\r\n </>}\r\n {file === 'doc' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2v-1a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5Zm-7.839 9.166v.522c0 .256-.039.47-.117.641a.861.861 0 0 1-.322.387.877.877 0 0 1-.469.126.883.883 0 0 1-.471-.126.868.868 0 0 1-.32-.386 1.55 1.55 0 0 1-.117-.642v-.522c0-.257.04-.471.117-.641a.868.868 0 0 1 .32-.387.868.868 0 0 1 .471-.129c.176 0 .332.043.469.13a.861.861 0 0 1 .322.386c.078.17.117.384.117.641Zm.803.519v-.513c0-.377-.068-.7-.205-.972a1.46 1.46 0 0 0-.589-.63c-.254-.147-.56-.22-.917-.22-.355 0-.662.073-.92.22a1.441 1.441 0 0 0-.589.627c-.136.271-.205.596-.205.975v.513c0 .375.069.7.205.973.137.271.333.48.59.627.257.144.564.216.92.216.357 0 .662-.072.916-.216.256-.147.452-.356.59-.627.136-.274.204-.598.204-.973ZM0 11.926v4h1.459c.402 0 .735-.08.999-.238a1.45 1.45 0 0 0 .595-.689c.13-.3.196-.662.196-1.084 0-.42-.065-.778-.196-1.075a1.426 1.426 0 0 0-.59-.68c-.263-.156-.598-.234-1.004-.234H0Zm.791.645h.563c.248 0 .45.05.609.152a.89.89 0 0 1 .354.454c.079.201.118.452.118.753a2.3 2.3 0 0 1-.068.592 1.141 1.141 0 0 1-.196.422.8.8 0 0 1-.334.252 1.298 1.298 0 0 1-.483.082H.79V12.57Zm7.422.483a1.732 1.732 0 0 0-.103.633v.495c0 .246.034.455.103.627a.834.834 0 0 0 .298.393.845.845 0 0 0 .478.131.868.868 0 0 0 .401-.088.699.699 0 0 0 .273-.248.8.8 0 0 0 .117-.364h.765v.076a1.268 1.268 0 0 1-.226.674c-.137.194-.32.345-.55.454a1.81 1.81 0 0 1-.786.164c-.36 0-.664-.072-.914-.216a1.424 1.424 0 0 1-.571-.627c-.13-.272-.194-.597-.194-.976v-.498c0-.379.066-.705.197-.978.13-.274.321-.485.571-.633.252-.149.556-.223.911-.223.219 0 .421.032.607.097.187.062.35.153.489.272a1.326 1.326 0 0 1 .466.964v.073H9.78a.85.85 0 0 0-.12-.38.7.7 0 0 0-.273-.261.802.802 0 0 0-.398-.097.814.814 0 0 0-.475.138.868.868 0 0 0-.301.398Z\" />\r\n </>}\r\n {file === 'docx' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V11h-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5Zm-6.839 9.688v-.522a1.54 1.54 0 0 0-.117-.641.861.861 0 0 0-.322-.387.862.862 0 0 0-.469-.129.868.868 0 0 0-.471.13.868.868 0 0 0-.32.386 1.54 1.54 0 0 0-.117.641v.522c0 .256.04.47.117.641a.868.868 0 0 0 .32.387.883.883 0 0 0 .471.126.877.877 0 0 0 .469-.126.861.861 0 0 0 .322-.386 1.55 1.55 0 0 0 .117-.642Zm.803-.516v.513c0 .375-.068.7-.205.973a1.47 1.47 0 0 1-.589.627c-.254.144-.56.216-.917.216a1.86 1.86 0 0 1-.92-.216 1.463 1.463 0 0 1-.589-.627 2.151 2.151 0 0 1-.205-.973v-.513c0-.379.069-.704.205-.975.137-.274.333-.483.59-.627.257-.147.564-.22.92-.22.357 0 .662.073.916.22.256.146.452.356.59.63.136.271.204.595.204.972ZM1 15.925v-3.999h1.459c.406 0 .741.078 1.005.235.264.156.46.382.589.68.13.296.196.655.196 1.074 0 .422-.065.784-.196 1.084-.131.301-.33.53-.595.689-.264.158-.597.237-.999.237H1Zm1.354-3.354H1.79v2.707h.563c.185 0 .346-.028.483-.082a.8.8 0 0 0 .334-.252c.088-.114.153-.254.196-.422a2.3 2.3 0 0 0 .068-.592c0-.3-.04-.552-.118-.753a.89.89 0 0 0-.354-.454c-.158-.102-.361-.152-.61-.152Zm6.756 1.116c0-.248.034-.46.103-.633a.868.868 0 0 1 .301-.398.814.814 0 0 1 .475-.138c.15 0 .283.032.398.097a.7.7 0 0 1 .273.26.85.85 0 0 1 .12.381h.765v-.073a1.33 1.33 0 0 0-.466-.964 1.44 1.44 0 0 0-.49-.272 1.836 1.836 0 0 0-.606-.097c-.355 0-.66.074-.911.223-.25.148-.44.359-.571.633-.131.273-.197.6-.197.978v.498c0 .379.065.704.194.976.13.271.321.48.571.627.25.144.555.216.914.216.293 0 .555-.054.785-.164.23-.11.414-.26.551-.454a1.27 1.27 0 0 0 .226-.674v-.076h-.765a.8.8 0 0 1-.117.364.699.699 0 0 1-.273.248.874.874 0 0 1-.401.088.845.845 0 0 1-.478-.131.834.834 0 0 1-.298-.393 1.7 1.7 0 0 1-.103-.627v-.495Zm5.092-1.76h.894l-1.275 2.006 1.254 1.992h-.908l-.85-1.415h-.035l-.852 1.415h-.862l1.24-2.015-1.228-1.984h.932l.832 1.439h.035l.823-1.439Z\" />\r\n </>}\r\n {file === 'pdf' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2h-1v-1h1a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5ZM1.6 11.85H0v3.999h.791v-1.342h.803c.287 0 .531-.057.732-.173.203-.117.358-.275.463-.474a1.42 1.42 0 0 0 .161-.677c0-.25-.053-.476-.158-.677a1.176 1.176 0 0 0-.46-.477c-.2-.12-.443-.179-.732-.179Zm.545 1.333a.795.795 0 0 1-.085.38.574.574 0 0 1-.238.241.794.794 0 0 1-.375.082H.788V12.48h.66c.218 0 .389.06.512.181.123.122.185.296.185.522Zm1.217-1.333v3.999h1.46c.401 0 .734-.08.998-.237a1.45 1.45 0 0 0 .595-.689c.13-.3.196-.662.196-1.084 0-.42-.065-.778-.196-1.075a1.426 1.426 0 0 0-.589-.68c-.264-.156-.599-.234-1.005-.234H3.362Zm.791.645h.563c.248 0 .45.05.609.152a.89.89 0 0 1 .354.454c.079.201.118.452.118.753a2.3 2.3 0 0 1-.068.592 1.14 1.14 0 0 1-.196.422.8.8 0 0 1-.334.252 1.298 1.298 0 0 1-.483.082h-.563v-2.707Zm3.743 1.763v1.591h-.79V11.85h2.548v.653H7.896v1.117h1.606v.638H7.896Z\" />\r\n </>}\r\n {file === 'jpg' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2h-1v-1h1a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5Zm-4.34 8.132c.076.153.123.317.14.492h-.776a.797.797 0 0 0-.097-.249.689.689 0 0 0-.17-.19.707.707 0 0 0-.237-.126.96.96 0 0 0-.299-.044c-.285 0-.507.1-.665.302-.156.201-.234.484-.234.85v.498c0 .234.032.439.097.615a.881.881 0 0 0 .304.413.87.87 0 0 0 .519.146.967.967 0 0 0 .457-.096.67.67 0 0 0 .272-.264c.06-.11.091-.23.091-.363v-.255H8.24v-.59h1.576v.798c0 .193-.032.377-.097.55a1.29 1.29 0 0 1-.293.458 1.37 1.37 0 0 1-.495.313c-.197.074-.43.111-.697.111a1.98 1.98 0 0 1-.753-.132 1.447 1.447 0 0 1-.533-.377 1.58 1.58 0 0 1-.32-.58 2.482 2.482 0 0 1-.105-.745v-.506c0-.362.066-.678.2-.95.134-.271.328-.482.582-.633.256-.152.565-.228.926-.228.238 0 .45.033.636.1.187.066.347.158.48.275.133.117.238.253.314.407ZM0 14.786c0 .164.027.319.082.465.055.147.136.277.243.39.11.113.245.202.407.267.164.062.354.093.569.093.42 0 .748-.115.984-.345.238-.23.358-.566.358-1.005v-2.725h-.791v2.745c0 .202-.046.357-.138.466-.092.11-.233.164-.422.164a.499.499 0 0 1-.454-.246.577.577 0 0 1-.073-.27H0Zm4.92-2.86H3.322v4h.791v-1.343h.803c.287 0 .531-.057.732-.172.203-.118.358-.276.463-.475.108-.201.161-.427.161-.677 0-.25-.052-.475-.158-.677a1.176 1.176 0 0 0-.46-.477c-.2-.12-.443-.179-.732-.179Zm.546 1.333a.795.795 0 0 1-.085.381.574.574 0 0 1-.238.24.794.794 0 0 1-.375.082H4.11v-1.406h.66c.218 0 .389.06.512.182.123.12.185.295.185.521Z\" />\r\n </>}\r\n {file === 'png' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2v-1a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5Zm-3.76 8.132c.076.153.123.317.14.492h-.776a.797.797 0 0 0-.097-.249.689.689 0 0 0-.17-.19.707.707 0 0 0-.237-.126.96.96 0 0 0-.299-.044c-.285 0-.506.1-.665.302-.156.201-.234.484-.234.85v.498c0 .234.032.439.097.615a.881.881 0 0 0 .304.413.87.87 0 0 0 .519.146.967.967 0 0 0 .457-.096.67.67 0 0 0 .272-.264c.06-.11.091-.23.091-.363v-.255H8.82v-.59h1.576v.798c0 .193-.032.377-.097.55a1.29 1.29 0 0 1-.293.458 1.37 1.37 0 0 1-.495.313c-.197.074-.43.111-.697.111a1.98 1.98 0 0 1-.753-.132 1.447 1.447 0 0 1-.533-.377 1.58 1.58 0 0 1-.32-.58 2.482 2.482 0 0 1-.105-.745v-.506c0-.362.067-.678.2-.95.134-.271.328-.482.582-.633.256-.152.565-.228.926-.228.238 0 .45.033.636.1.187.066.347.158.48.275.133.117.238.253.314.407Zm-8.64-.706H0v4h.791v-1.343h.803c.287 0 .531-.057.732-.172.203-.118.358-.276.463-.475a1.42 1.42 0 0 0 .161-.677c0-.25-.053-.475-.158-.677a1.176 1.176 0 0 0-.46-.477c-.2-.12-.443-.179-.732-.179Zm.545 1.333a.795.795 0 0 1-.085.381.574.574 0 0 1-.238.24.794.794 0 0 1-.375.082H.788v-1.406h.66c.218 0 .389.06.512.182.123.12.185.295.185.521Zm1.964 2.666V13.25h.032l1.761 2.675h.656v-3.999h-.75v2.66h-.032l-1.752-2.66h-.662v4h.747Z\" />\r\n </>}\r\n {file === 'txt' && <>\r\n <path fill-rule=\"evenodd\" d=\"M14 4.5V14a2 2 0 0 1-2 2h-2v-1h2a1 1 0 0 0 1-1V4.5h-2A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v9H2V2a2 2 0 0 1 2-2h5.5L14 4.5ZM1.928 15.849v-3.337h1.136v-.662H0v.662h1.134v3.337h.794Zm4.689-3.999h-.894L4.9 13.289h-.035l-.832-1.439h-.932l1.228 1.983-1.24 2.016h.862l.853-1.415h.035l.85 1.415h.907l-1.253-1.992 1.274-2.007Zm1.93.662v3.337h-.794v-3.337H6.619v-.662h3.064v.662H8.546Z\" />\r\n </>}\r\n </svg>\r\n );\r\n});\r\n\r\nFDocumentIcon.displayName = 'FDocumentIcon';\r\n\r\nexport default FDocumentIcon","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FReloadIcon.\r\n * @interface IFReloadIcon\r\n */\r\nexport interface IFReloadIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FReloadIcon представляет собой SVG иконку обновления с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FReloadIcon\r\n * @param {IFReloadIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FReloadIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FReloadIcon = React.forwardRef<SVGSVGElement, IFReloadIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n className,\r\n id,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2z\" />\r\n <path d=\"M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFReloadIcon.displayName = 'FReloadIcon';\r\n\r\nexport default FReloadIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FMinusIcon.\r\n * @interface IFMinusIcon\r\n */\r\nexport interface IFMinusIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FMinusIcon представляет собой SVG иконку минуса с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FMinusIcon\r\n * @param {IFMinusIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FMinusIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n*/\r\nconst FMinusIcon = React.forwardRef<SVGSVGElement, IFMinusIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n className,\r\n id,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\" />\r\n <path d=\"M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFMinusIcon.displayName = 'FMinusIcon';\r\n\r\nexport default FMinusIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FInfoCircleIcon.\r\n * @interface IFInfoCircleIcon\r\n*/\r\nexport interface IFInfoCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link'\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties,\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string,\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string,\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void,\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FInfoCircleIcon представляет собой SVG иконку информации с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FInfoCircleIcon\r\n * @param {IFInfoCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FInfoCircleIcon\r\n * color=\"dark\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n */\r\nconst FInfoCircleIcon = React.forwardRef<SVGSVGElement, IFInfoCircleIcon>(({ \r\n color = 'primary', \r\n size = 30, \r\n st, \r\n id, \r\n className, \r\n handleClick, \r\n ['data-testid']: dataTestId,\r\n ...props \r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\" />\r\n <path d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFInfoCircleIcon.displayName = 'FInfoCircleIcon';\r\n\r\nexport default FInfoCircleIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FSafeIcon.\r\n * @interface IFSafeIcon\r\n */\r\nexport interface IFSafeIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: React.SVGAttributes<SVGSVGElement>['width'];\r\n\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.SVGAttributes<SVGSVGElement>['style'];\r\n\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: React.SVGAttributes<SVGSVGElement>['id'];\r\n\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: React.SVGAttributes<SVGSVGElement>['className'];\r\n\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: React.DOMAttributes<SVGSVGElement>['onClick'];\r\n\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FSafeIcon представляет собой SVG иконку сейфа с возможностью настройки цвета, размера и обработки кликов.\r\n * \r\n * @function FSafeIcon\r\n * @param {IFSafeIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n * \r\n * @example\r\n * <FSafeIcon\r\n * color=\"primary\"\r\n * size={40}\r\n * handleClick={() => console.log('Icon clicked!')}\r\n * />\r\n *\r\n */\r\n\r\nconst FSafeIcon = React.forwardRef<SVGSVGElement, IFSafeIcon>((\r\n {\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n }, ref\r\n) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path d=\"M1 1.5A1.5 1.5 0 0 1 2.5 0h12A1.5 1.5 0 0 1 16 1.5v13a1.5 1.5 0 0 1-1.5 1.5h-12A1.5 1.5 0 0 1 1 14.5V13H.5a.5.5 0 0 1 0-1H1V8.5H.5a.5.5 0 0 1 0-1H1V4H.5a.5.5 0 0 1 0-1H1zM2.5 1a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5h12a.5.5 0 0 0 .5-.5v-13a.5.5 0 0 0-.5-.5z\" />\r\n <path d=\"M13.5 6a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-1 0v-3a.5.5 0 0 1 .5-.5M4.828 4.464a.5.5 0 0 1 .708 0l1.09 1.09a3 3 0 0 1 3.476 0l1.09-1.09a.5.5 0 1 1 .707.708l-1.09 1.09c.74 1.037.74 2.44 0 3.476l1.09 1.09a.5.5 0 1 1-.707.708l-1.09-1.09a3 3 0 0 1-3.476 0l-1.09 1.09a.5.5 0 1 1-.708-.708l1.09-1.09a3 3 0 0 1 0-3.476l-1.09-1.09a.5.5 0 0 1 0-.708M6.95 6.586a2 2 0 1 0 2.828 2.828A2 2 0 0 0 6.95 6.586\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFSafeIcon.displayName = 'FSafeIcon';\r\n\r\nexport default FSafeIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowRightCircleIcon.\r\n * @interface IFArrowRightCircleIcon\r\n */\r\nexport interface IFArrowRightCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowRightCircleIcon представляет собой SVG иконку стрелки вправо в круге с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FArrowRightCircleIcon\r\n * @param {IFArrowRightCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowRightCircleIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClick={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FArrowRightCircleIcon = React.forwardRef<SVGSVGElement, IFArrowRightCircleIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M4.5 7.5a.5.5 0 0 0 0 1h5.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowRightCircleIcon.displayName = 'FArrowRightCircleIcon';\r\n\r\nexport default FArrowRightCircleIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowLeftCircleIcon.\r\n * @interface IFArrowLeftCircleIcon\r\n */\r\nexport interface IFArrowLeftCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowLeftCircleIcon представляет собой SVG иконку стрелки влево в круге с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FArrowLeftCircleIcon\r\n * @param {IFArrowLeftCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowLeftCircleIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClick={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FArrowLeftCircleIcon = React.forwardRef<SVGSVGElement, IFArrowLeftCircleIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-4.5-.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowLeftCircleIcon.displayName = 'FArrowLeftCircleIcon';\r\n\r\nexport default FArrowLeftCircleIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowUpCircleIcon.\r\n * @interface IFArrowUpCircleIcon\r\n */\r\nexport interface IFArrowUpCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowUpCircleIcon представляет собой SVG иконку стрелки вверх в круге с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FArrowUpCircleIcon\r\n * @param {IFArrowUpCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowUpCircleIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClick={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FArrowUpCircleIcon = React.forwardRef<SVGSVGElement, IFArrowUpCircleIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-7.5 3.5a.5.5 0 0 1-1 0V5.707L5.354 7.854a.5.5 0 1 1-.708-.708l3-3a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708L8.5 5.707z\"/>\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowUpCircleIcon.displayName = 'FArrowUpCircleIcon';\r\n\r\nexport default FArrowUpCircleIcon;\r\n","import React from 'react';\r\n\r\n/**\r\n * Интерфейс для пропсов компонента FArrowDownCircleIcon.\r\n * @interface IFArrowDownCircleIcon\r\n */\r\nexport interface IFArrowDownCircleIcon {\r\n /**\r\n * Цвет иконки. Определяет цветовую схему иконки.\r\n * @type {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')}\r\n * @default 'primary'\r\n */\r\n color?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link';\r\n /**\r\n * Размер иконки.\r\n * @type {number}\r\n * @default 30\r\n */\r\n size?: number;\r\n /**\r\n * Дополнительные стили для SVG элемента.\r\n * @type {React.CSSProperties}\r\n */\r\n st?: React.CSSProperties;\r\n /**\r\n * Уникальный идентификатор для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n /**\r\n * Дополнительные CSS классы для SVG элемента.\r\n * @type {string | undefined}\r\n */\r\n className?: string;\r\n /**\r\n * Обработчик события клика по иконке.\r\n * @type {(() => void) | undefined}\r\n */\r\n handleClick?: () => void;\r\n /**\r\n * Data-testid для тестирования (опционально)\r\n */\r\n ['data-testid']?: string;\r\n}\r\n\r\n/**\r\n * Компонент FArrowDownCircleIcon представляет собой SVG иконку стрелки влево в круге с возможностью настройки цвета, размера и обработки кликов.\r\n *\r\n * @function FArrowDownCircleIcon\r\n * @param {IFArrowDownCircleIcon} props - Пропсы компонента.\r\n * @param {('primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'link')} [color='primary'] - Цвет иконки. По умолчанию 'primary'.\r\n * @param {number} [size=30] - Размер иконки в пикселях. По умолчанию 30.\r\n * @param {React.CSSProperties} [st] - Дополнительные стили для SVG элемента.\r\n * @param {string} [id] - Уникальный идентификатор для SVG элемента.\r\n * @param {string} [className] - Дополнительные CSS классы для SVG элемента.\r\n * @param {() => void} [handleClick] - Обработчик события клика по иконке.\r\n * @param {React.Ref<SVGSVGElement>} ref - Ref для SVG элемента.\r\n * @returns {JSX.Element} - Возвращает SVG элемент с заданными параметрами.\r\n *\r\n * @example\r\n * <FArrowDownCircleIcon\r\n * color=\"danger\"\r\n * size={32}\r\n * handleClick={() => console.log('Closed!')}\r\n * />\r\n */\r\nconst FArrowDownCircleIcon = React.forwardRef<SVGSVGElement, IFArrowDownCircleIcon>(({\r\n color = 'primary',\r\n size = 30,\r\n st,\r\n id,\r\n className,\r\n handleClick,\r\n ['data-testid']: dataTestId,\r\n ...props\r\n}, ref) => {\r\n return (\r\n <svg\r\n ref={ref}\r\n width={size}\r\n style={st}\r\n className={`f-icon ${handleClick ? ' clicking-icon' : ''} ${color} ${className || ''}`}\r\n viewBox=\"0 0 16 16\"\r\n onClick={handleClick}\r\n id={id}\r\n data-testid={dataTestId}\r\n {...props}\r\n >\r\n <path fill-rule=\"evenodd\" d=\"M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293z\" />\r\n </svg>\r\n );\r\n});\r\n\r\nFArrowDownCircleIcon.displayName = 'FArrowDownCircleIcon';\r\n\r\nexport default FArrowDownCircleIcon;\r\n","import styles from './fAlert.module.scss';\r\nimport stylesBtn from \"../../material/FButton/FButton.module.scss\"\r\n\r\n/**\r\n * Интерфейс для настройки отображения модального уведомления.\r\n * @interface IfAlert\r\n */\r\nexport interface IfAlert {\r\n /**\r\n * Заголовок уведомления. Необязательный параметр.\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Основной текст уведомления. Обязательное поле.\r\n * Может содержать переносы строк (`\\n`), которые будут преобразованы в отдельные `<span>`.\r\n * @type {string}\r\n */\r\n body: string;\r\n\r\n /**\r\n * Тип уведомления. Определяет цветовую схему и иконку.\r\n * @type {'info' | 'error' | 'success' | 'warning'}\r\n */\r\n variant: 'info' | 'error' | 'success' | 'warning';\r\n}\r\n\r\n/**\r\n * Отображает модальное окно уведомления поверх текущей страницы.\r\n *\r\n * Уведомление добавляется через `insertAdjacentHTML` в `<body>`, имеет анимацию появления,\r\n * и может быть закрыто нажатием на кнопку \"Закрыть\".\r\n *\r\n * @function fAlert\r\n * @param {string} [title] - Заголовок уведомления.\r\n * @param {string} [body] - Текст уведомления (поддерживает переносы строк через `\\n`).\r\n * @param {'info' | 'error' | 'success' | 'warning'} [variant='info'] - Тип уведомления.\r\n * \r\n * @example\r\n * fAlert({\r\n * title: 'Успех',\r\n * body: 'Данные успешно сохранены.',\r\n * variant: 'success'\r\n * });\r\n *\r\n * @example\r\n * fAlert({\r\n * body: 'Ошибка сети\\\\nПроверьте соединение',\r\n * variant: 'error'\r\n * });\r\n */\r\nconst fAlert = ({ title, body, variant = 'info' }: IfAlert) => {\r\n\r\n let ico = ''\r\n\r\n switch (variant) {\r\n case 'info':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\"/>'\r\n break\r\n case \"success\":\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M10.97 4.97a.75.75 0 0 1 1.071 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.235.235 0 0 1 .02-.022z\"/>'\r\n break\r\n case 'error':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\"/>'\r\n break\r\n case 'warning':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M5.255 5.786a.237.237 0 0 0 .241.247h.825c.138 0 .248-.113.266-.25.09-.656.54-1.134 1.342-1.134.686 0 1.314.343 1.314 1.168 0 .635-.374.927-.965 1.371-.673.489-1.206 1.06-1.168 1.987l.003.217a.25.25 0 0 0 .25.246h.811a.25.25 0 0 0 .25-.25v-.105c0-.718.273-.927 1.01-1.486.609-.463 1.244-.977 1.244-2.056 0-1.511-1.276-2.241-2.673-2.241-1.267 0-2.655.59-2.75 2.286zm1.557 5.763c0 .533.425.927 1.01.927.609 0 1.028-.394 1.028-.927 0-.552-.42-.94-1.029-.94-.584 0-1.009.388-1.009.94z\"/>'\r\n break\r\n }\r\n\r\n const arrBody: string[] = []\r\n body.split('\\n').forEach(opt => {\r\n arrBody.push(`<span>${opt}</span>`)\r\n })\r\n\r\n window.document.body.insertAdjacentHTML(\r\n 'afterbegin',\r\n `\r\n <div class='${styles['f-function-block-alert']}' id='f-function-block-alert'>\r\n <div class='${styles['f-function-alert']}'>\r\n <div class='${styles['f-function-alert-ico']} ${styles[`${variant}-alert`]}' style='color: inherit; fill: inherit'>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n ${ico}\r\n </svg>\r\n </div>\r\n <div class='${styles['f-function-alert-inside']}'>\r\n <div class='${styles['f-function-alert-header']}'>\r\n <h4>${title || ''}</h4>\r\n </div>\r\n <div class='${styles['f-function-alert-body']}'>\r\n ${arrBody.join('')}\r\n </div>\r\n <div class='${styles['f-function-alert-footer']}'>\r\n <FButton\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-primary']}'\r\n onclick='document.querySelector(\"#f-function-block-alert\").remove()'\r\n >\r\n Закрыть\r\n </FButton>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n );\r\n}\r\n\r\nexport default fAlert;","import styles from './fConfirm.module.scss';\r\nimport stylesBtn from \"../../material/FButton/FButton.module.scss\"\r\n\r\n/**\r\n * Интерфейс параметров модального окна подтверждения.\r\n * @interface IfConfirm\r\n */\r\nexport interface IfConfirm {\r\n /**\r\n * Заголовок модального окна. Необязательный параметр.\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Основной текст сообщения, отображаемый в теле модального окна.\r\n * @type {string}\r\n */\r\n body: string;\r\n}\r\n\r\n/**\r\n * Отображает модальное окно подтверждения поверх текущей страницы.\r\n *\r\n * Функция добавляет HTML-элемент в `<body>`, отображая диалоговое окно с вопросом,\r\n * двумя кнопками (`Ок` и `Отменить`) и возвращает промис, который разрешается\r\n * значением `true` (при нажатии \"Ок\" или клавиши Enter) или `false` (при нажатии \"Отменить\").\r\n *\r\n * @function fConfirm\r\n * @param {string} [title] - Заголовок окна подтверждения.\r\n * @param {string} [body] - Текст сообщения, который будет отображен в теле окна.\r\n * \r\n * @returns {Promise<boolean>} Промис, который возвращает:\r\n * - `true` — если пользователь нажал \"Ок\" или Enter.\r\n * - `false` — если пользователь нажал \"Отменить\".\r\n * \r\n * @example\r\n * const result = await fConfirm({\r\n * title: 'Подтвердите действие',\r\n * body: 'Вы действительно хотите удалить запись?'\r\n * });\r\n * if (result) {\r\n * console.log('Пользователь согласился');\r\n * } else {\r\n * console.log('Пользователь отменил действие');\r\n * }\r\n */\r\nconst fConfirm = ({ title, body }: IfConfirm): Promise<boolean> => {\r\n return new Promise((resolve) => {\r\n // Вставляем HTML. Обрати внимание: убраны inline onclick attributes, \r\n // управление закрытием перенесено полностью в JS.\r\n window.document.body.insertAdjacentHTML(\r\n 'afterbegin',\r\n `\r\n <div class='${styles['f-function-block-confirm']}' id='f-function-block-confirm'>\r\n <div class='${styles['f-function-confirm']}'>\r\n <div class='${styles['f-function-confirm-ico']} ${styles.warning}'>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n <path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/>\r\n <path d=\"M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995z\"/>\r\n </svg>\r\n </div>\r\n <div class='${styles['f-function-confirm-inside']}'>\r\n <div class='${styles['f-function-confirm-header']}'>\r\n <h4>${title || ''}</h4>\r\n </div>\r\n <div class='${styles['f-function-confirm-body']}'>\r\n <span>${body}</span>\r\n </div>\r\n <div class='${styles['f-function-confirm-footer']}'>\r\n <button\r\n id=\"f-function-confirm-ok\"\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-success']}'\r\n >\r\n Ок\r\n </button>\r\n <button\r\n id=\"f-function-confirm-cancellation\"\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-danger']}'\r\n >\r\n Отменить\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n );\r\n\r\n const modalBlock = document.getElementById('f-function-block-confirm');\r\n const okBtn = document.getElementById('f-function-confirm-ok');\r\n const cancelBtn = document.getElementById('f-function-confirm-cancellation');\r\n\r\n /**\r\n * Функция очистки DOM и слушателей событий.\r\n * Вызывается перед разрешением промиса.\r\n */\r\n const closeModal = () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n okBtn?.removeEventListener('click', handleOk);\r\n cancelBtn?.removeEventListener('click', handleCancel);\r\n modalBlock?.remove();\r\n };\r\n\r\n const handleOk = () => {\r\n closeModal();\r\n resolve(true);\r\n };\r\n\r\n const handleCancel = () => {\r\n closeModal();\r\n resolve(false);\r\n };\r\n\r\n /**\r\n * Обработчик нажатия клавиш.\r\n */\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault(); // Предотвращаем стандартное действие, если нужно\r\n handleOk();\r\n }\r\n // Закрытие по Escape\r\n if (e.key === 'Escape') {\r\n handleCancel();\r\n }\r\n };\r\n\r\n // Навешиваем слушатели\r\n okBtn?.addEventListener('click', handleOk);\r\n cancelBtn?.addEventListener('click', handleCancel);\r\n window.addEventListener('keydown', handleKeyDown);\r\n });\r\n};\r\n\r\nexport default fConfirm;","import styles from './fPrompt.module.scss';\r\nimport stylesBtn from \"../../material/FButton/FButton.module.scss\"\r\n\r\n/**\r\n * Интерфейс параметров модального окна ввода.\r\n * @interface IfPrompt\r\n */\r\nexport interface IfPrompt {\r\n /**\r\n * Заголовок модального окна. Необязательный параметр.\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Текст сообщения, отображаемый над полем ввода. Необязательный параметр.\r\n * @type {string | undefined}\r\n */\r\n body?: string;\r\n}\r\n\r\n/**\r\n * Вспомогательная функция для получения значения из поля ввода.\r\n *\r\n * Если элемент существует, возвращает его значение (`input.value`),\r\n * иначе — `null`.\r\n *\r\n * @function getValue\r\n * @param {HTMLInputElement | null} element - HTMLInputElement или null.\r\n * @returns {string | null} Значение поля ввода или null, если элемент не найден.\r\n */\r\nexport function getValue(element: HTMLInputElement | null): string | null {\r\n if (element) {\r\n return element.value;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Отображает модальное окно с полем ввода и кнопками \"Ок\" и \"Отменить\".\r\n *\r\n * Функция возвращает промис, который разрешается:\r\n * - строкой с введённым текстом (если пользователь нажал \"Ок\"),\r\n * - `null` (если пользователь нажал \"Отменить\").\r\n *\r\n * Уведомление добавляется через `insertAdjacentHTML` в `<body>`.\r\n *\r\n * @function fPrompt\r\n * @param {string} [title] - Заголовок окна.\r\n * @param {string} [body] - Текст подсказки над полем ввода.\r\n *\r\n * @returns {Promise<string | null>} Промис, который возвращает:\r\n * - Введённую строку при нажатии \"Ок\".\r\n * - `null` при нажатии \"Отменить\".\r\n *\r\n * @example\r\n * const result = await fPrompt({\r\n * title: 'Введите имя',\r\n * body: 'Как вас зовут?'\r\n * });\r\n *\r\n * if (result !== null) {\r\n * console.log('Пользователь ввёл:', result);\r\n * } else {\r\n * console.log('Пользователь отменил ввод');\r\n * }\r\n */\r\nconst fPrompt = ({ title, body }: IfPrompt): Promise<string | null> => {\r\n return new Promise((resolve) => {\r\n window.document.body.insertAdjacentHTML(\r\n 'afterbegin',\r\n `\r\n <div class='${styles['f-function-block-prompt']}' id='f-function-block-prompt'>\r\n <div class='${styles['f-function-prompt']}'>\r\n <div class='${styles['f-function-prompt-ico']} ${styles.warning}'>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n <path d=\"M14 1a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-2.5a2 2 0 0 0-1.6.8L8 14.333 6.1 11.8a2 2 0 0 0-1.6-.8H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2.5a1 1 0 0 1 .8.4l1.9 2.533a1 1 0 0 0 1.6 0l1.9-2.533a1 1 0 0 1 .8-.4H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/>\r\n <path d=\"M5 6a1 1 0 1 1-2 0 1 1 0 0 1 2 0zm4 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0zm4 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\"/>\r\n </svg>\r\n </div>\r\n <div class='${styles['f-function-prompt-inside']}'>\r\n <div class='${styles['f-function-prompt-header']}'>\r\n <h4>${title || ''}</h4>\r\n </div>\r\n <div class='${styles['f-function-prompt-body']}'>\r\n <span>${body || ''}</span>\r\n <input \r\n type=\"text\" \r\n id=\"f-function-prompt-input\"\r\n class=\"form-control ${styles['f-function-prompt-input']}\"\r\n />\r\n </div>\r\n <div class='${styles['f-function-prompt-footer']}'>\r\n <button\r\n id=\"f-function-prompt-ok\"\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-success']}'\r\n onclick='document.querySelector(\"#f-function-block-prompt\").remove()'\r\n >\r\n Ок\r\n </button>\r\n <button\r\n id=\"f-function-prompt-cancellation\"\r\n class='${stylesBtn['btn']} ${stylesBtn['btn-sm']} ${stylesBtn['btn-danger']}'\r\n onclick='document.querySelector(\"#f-function-block-prompt\").remove()'\r\n >\r\n Отменить\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n );\r\n\r\n const ok: HTMLButtonElement | null = document.querySelector('#f-function-prompt-ok')\r\n const cancellation: HTMLButtonElement | null = document.querySelector('#f-function-prompt-cancellation')\r\n const submit: HTMLInputElement | null = document.querySelector('#f-function-prompt-input')\r\n\r\n ok!.addEventListener('click', function () {\r\n resolve(getValue(submit));\r\n })\r\n cancellation!.addEventListener('click', function () {\r\n resolve(null);\r\n })\r\n\r\n });\r\n};\r\n\r\nexport default fPrompt;","// @ts-nocheck\r\nexport class TSZip{\r\n\tfiles: Array<ZipObject> = new Array();\r\n\troot: string = \"\";\r\n\tsignature = {\r\n\t LOCAL_FILE_HEADER : \"\\x50\\x4b\\x03\\x04\",\r\n\t CENTRAL_FILE_HEADER : \"\\x50\\x4b\\x01\\x02\",\r\n\t CENTRAL_DIRECTORY_END : \"\\x50\\x4b\\x05\\x06\",\r\n\t ZIP64_CENTRAL_DIRECTORY_LOCATOR : \"\\x50\\x4b\\x06\\x07\",\r\n\t ZIP64_CENTRAL_DIRECTORY_END : \"\\x50\\x4b\\x06\\x06\",\r\n\t DATA_DESCRIPTOR : \"\\x50\\x4b\\x07\\x08\"\r\n\t};\r\n\tcompressions: TSZipStore = new TSZipStore();\r\n\toptions = {\r\n base64: false,\r\n binary: false,\r\n dir: false,\r\n date: null\r\n };\r\n\r\n\r\n\tdefaults = {\r\n\t base64: false,\r\n\t binary: false,\r\n\t dir: false,\r\n\t date: null\r\n\t};\r\n\t\r\n\t// utils: TSZipUtils = new TSZipUtils();\r\n\t// support: TSZipSupport = new TSZipSupport();\r\n\t// Base64: TSZipBase64 = new TSZipBase64();\r\n\t\r\n\tconstructor(data:any = false, options:any = false) {\r\n\t\tif (data) {\r\n\t\t\tthis.load(data, options);\r\n\t\t}\r\n\t}\r\n\t\r\n\tstatic decToHex(dec, bytes) {\r\n\t\tlet hex = \"\", i;\r\n\t\tfor(i = 0; i < bytes; i++) {\r\n hex += String.fromCharCode(dec&0xff);\r\n dec=dec>>>8;\r\n\t\t}\r\n\t\treturn hex;\r\n\t}\r\n\t\r\n\textend(o0, o1: any = false) {\r\n let result = {}, i, attr;\r\n for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\r\n for (attr in arguments[i]) {\r\n if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\r\n result[attr] = arguments[i][attr];\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n \r\n\tprepareFileAttrs(o) {\r\n\t\to = o || {};\r\n\t\tif (o.base64 === true && o.binary == null) {\r\n\t\t\to.binary = true;\r\n\t\t}\r\n\t\to = this.extend(o, this.defaults);\r\n\t\to.date = o.date || new Date();\r\n\t\t\r\n\t\treturn o;\r\n\t}\r\n\t\r\n\tfileAdd(name, data, o) {\r\n\t\t// be sure sub folders exist\r\n\t\tlet parent = this.parentFolder(name);\r\n\t\tif (parent) {\r\n\t\t\tthis.folderAdd(parent);\r\n\t\t}\r\n\t\t\r\n\t\to = this.prepareFileAttrs(o);\r\n\t\t\r\n\t\tif (TSZipSupport.uint8array && data instanceof Uint8Array) {\r\n\t\t\to.base64 = false;\r\n\t\t\to.binary = true;\r\n\t\t\tdata = TSZipUtils.uint8Array2String(data);\r\n\t\t} else if (TSZipSupport.arraybuffer && data instanceof ArrayBuffer) {\r\n\t\t\to.base64 = false;\r\n\t\t\to.binary = true;\r\n\t\t\tlet bufferView = new Uint8Array(data);\r\n\t\t\tdata = TSZipUtils.uint8Array2String(bufferView);\r\n\t\t} else if (o.binary && !o.base64) {\r\n\t\t\t// optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask\r\n\t\t\tif (o.optimizedBinaryString !== true) {\r\n\t\t\t\t// this is a string, not in a base64 format.\r\n\t\t\t\t// Be sure that this is a correct \"binary string\"\r\n\t\t\t\tdata = TSZipUtils.string2binary(data);\r\n\t\t\t}\r\n\t\t\t// we remove this option since it's only relevant here\r\n\t\t\tdelete o.optimizedBinaryString;\r\n\t\t}\r\n\t\t\r\n\t\treturn this.files[name] = new ZipObject(name, data, o);\r\n\t}\r\n\t\r\n\tparentFolder(path) {\r\n\t\tif (path.slice(-1) == '/') {\r\n\t\t\tpath = path.substring(0, path.length - 1);\r\n\t\t}\r\n\t\tlet lastSlash = path.lastIndexOf('/');\r\n\t\treturn (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\r\n\t}\r\n\t\r\n\tfolderAdd (name) {\r\n\t\t// Check the name ends with a /\r\n\t\tif (name.slice(-1) != \"/\") {\r\n\t\t\tname += \"/\"; // IE doesn't like substr(-1)\r\n\t\t}\r\n\t\t\r\n\t\t// Does this folder already exist?\r\n\t\tif (!this.files[name]) {\r\n\t\t\t// be sure sub folders exist\r\n\t\t\tlet parent = this.parentFolder(name);\r\n\t\t\t//Вроде как для рекурсивной херни\r\n\t\t\tif (parent) {\r\n\t\t\t\tthis.folderAdd(parent);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.fileAdd(name, '', {dir:true});\r\n\t\t}\r\n\t\treturn this.files[name];\r\n }\r\n \r\n prepareLocalHeaderData(file, utfEncodedFileName, compressionType) {\r\n\t\tlet useUTF8 = utfEncodedFileName !== file.name,\r\n\t\t\tdata = file.asBinary(),\r\n\t\t\to = file.options,\r\n\t\t\tdosTime,\r\n\t\t\tdosDate;\r\n\t\r\n\t\t// date\r\n\t\t// @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\r\n\t\t// @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\r\n\t\t// @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\r\n\t\r\n\t\tdosTime = o.date.getHours();\r\n\t\tdosTime = dosTime << 6;\r\n\t\tdosTime = dosTime | o.date.getMinutes();\r\n\t\tdosTime = dosTime << 5;\r\n\t\tdosTime = dosTime | o.date.getSeconds() / 2;\r\n\t\r\n\t\tdosDate = o.date.getFullYear() - 1980;\r\n\t\tdosDate = dosDate << 4;\r\n\t\tdosDate = dosDate | (o.date.getMonth() + 1);\r\n\t\tdosDate = dosDate << 5;\r\n\t\tdosDate = dosDate | o.date.getDate();\r\n\t\r\n\t\tlet compressedData = this.compressions.compress(data);\r\n\t\r\n\t\tlet header = \"\";\r\n\t\r\n\t\t// version needed to extract\r\n\t\theader += \"\\x0A\\x00\";\r\n\t\t// general purpose bit flag\r\n\t\t// set bit 11 if utf8\r\n\t\theader += useUTF8 ? \"\\x00\\x08\" : \"\\x00\\x00\";\r\n\t\t// compression method\r\n\t\theader += this.compressions.magic;\r\n\t\t// last mod file time\r\n\t\theader += TSZip.decToHex(dosTime, 2);\r\n\t\t// last mod file date\r\n\t\theader += TSZip.decToHex(dosDate, 2);\r\n\t\t// crc-32\r\n\t\theader += TSZip.decToHex(TSZip.crc32(data), 4);\r\n\t\t// compressed size\r\n\t\theader += TSZip.decToHex(compressedData.length, 4);\r\n\t\t// uncompressed size\r\n\t\theader += TSZip.decToHex(data.length, 4);\r\n\t\t// file name length\r\n\t\theader += TSZip.decToHex(utfEncodedFileName.length, 2);\r\n\t\t// extra field length\r\n\t\theader += \"\\x00\\x00\";\r\n\t\r\n\t\treturn {\r\n\t\t\theader: header,\r\n\t\t\tcompressedData: compressedData\r\n\t\t};\r\n\t}\r\n\t\r\n\tload(stream, options) { // Пока этого нет\r\n\t\tthrow new Error(\"Load method is not defined.\");\r\n }\r\n\t\r\n\tfilter(search: Function) {\r\n\t\tlet result = [], filename, relativePath, file, fileClone;\r\n\t\tfor (filename in this.files) {\r\n //Нужно поискать как решить эту проблему\r\n\t\t\t//if ( !this.files.has(filename) ) { continue; }\r\n\t\t\tfile = this.files[filename];\r\n\t\t\t// return a new object, don't let the user mess with our internal objects :)\r\n\t\t\tfileClone = new ZipObject(file.name, file.data, this.extend(file.options));\r\n\t\t\trelativePath = filename.slice(this.root.length, filename.length);\r\n\t\t\tif (filename.slice(0, this.root.length) === this.root && // the file is in the current root\r\n\t\t\t\tsearch(relativePath, fileClone)) { // and the file matches the function\r\n\t\t\t\tresult.push(fileClone);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t\r\n\tfile(name, data = null, o = null) {\r\n\t\tif (arguments.length === 1) {\r\n\t\t\tif (name instanceof RegExp) {\r\n\t\t\t\tlet regexp = name;\r\n\t\t\t\treturn this.filter(function(relativePath, file) {\r\n\t\t\t\t\treturn !file.options.dir && regexp.test(relativePath);\r\n\t\t\t\t});\r\n\t\t\t} else { // text\r\n\t\t\t\treturn this.filter(function (relativePath, file) {\r\n\t\t\t\t\treturn !file.options.dir && relativePath === name;\r\n\t\t\t\t})[0]||null;\r\n\t\t\t}\r\n\t\t} else { // more than one argument : we have data !\r\n\t\t\tname = this.root+name;\r\n\t\t\tthis.fileAdd(name, data, o);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\t\r\n\t\r\n\t//! Нужно продумать создание папок\r\n\tfolder(arg: any = false) {\r\n\t\tif (!arg) {\r\n\t\t\tthrow new Error(\"folder : wrong argument\");\r\n\t\t}\r\n\t\t\r\n\t\tif (arg instanceof RegExp) {\r\n\t\t\treturn this.filter(function(relativePath, file) {\r\n\t\t\t\treturn file.options.dir && arg.test(relativePath);\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\t// else, name is a new folder\r\n\t\tlet name = this.root + arg;\r\n\t\tlet newFolder = this.folderAdd(name);\r\n\t\t\r\n return true;\r\n\t\t// Allow chaining by returning a new object with this folder as the root\r\n\t\t//let ret: TSZip = this.clone();\r\n\t\t//ret.root = newFolder.name;\r\n\t\t//return ret;\r\n\t}\r\n\t\r\n\tremove(name:string = \"\") {\r\n if(name != \"\"){\r\n return false;\r\n }\r\n\t\tname = this.root + name;\r\n\t\tlet file = this.files[name];\r\n\t\tif (!file) {\r\n\t\t\t// Look for any folders\r\n\t\t\tif (name.slice(-1) != \"/\") {\r\n\t\t\t\tname += \"/\";\r\n\t\t\t}\r\n\t\t\tfile = this.files[name];\r\n\t\t}\r\n\t\t\r\n\t\tif (file) {\r\n\t\t\tif (!file.options.dir) {\r\n\t\t\t\t// file\r\n\t\t\t\tdelete this.files[name];\r\n\t\t\t} else {\r\n\t\t\t\t// folder\r\n\t\t\t\tlet kids = this.filter(function (relativePath, file) {\r\n\t\t\t\t\treturn file.name.slice(0, name.length) === name;\r\n\t\t\t\t});\r\n\t\t\t\tfor (let i = 0; i < kids.length; i++) {\r\n\t\t\t\t\tdelete this.files[kids[i].name];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn this;\r\n\t}\r\n\t\r\n\tgenerate(options:any = false) {\r\n\t\toptions = this.extend(options || {}, {\r\n\t\t\tbase64 : true,\r\n\t\t\tcompression : \"STORE\",\r\n\t\t\ttype : \"base64\"\r\n\t\t});\r\n\t\tlet compression = options.compression.toUpperCase();\r\n\t\t\r\n\t\t// The central directory, and files data\r\n\t\tlet directory = [], files = [], fileOffset = 0;\r\n\t\t\r\n\t\t//У нас нет сжатия(\r\n\t\t//if (!Zip.compressions[compression]) {\r\n\t\t//\tthrow compression + \" is not a valid compression method !\";\r\n\t\t//}\r\n\t\t\r\n\t\tfor (let name in this.files) {\r\n\t\t\tif ( !this.files.hasOwnProperty(name) ) { continue; }\r\n\t\t\r\n\t\t\tlet file = this.files[name];\r\n\t\t\r\n\t\t\tlet utfEncodedFileName = TSZip.utf8encode(file.name);\r\n\t\t\r\n\t\t\tlet fileRecord = \"\",\r\n\t\t\tdirRecord = \"\",\r\n\t\t\tdata = this.prepareLocalHeaderData(file, utfEncodedFileName, compression);\r\n\t\t\tfileRecord = this.signature.LOCAL_FILE_HEADER + data.header + utfEncodedFileName + data.compressedData;\r\n\t\t\r\n\t\t\tdirRecord = this.signature.CENTRAL_FILE_HEADER +\r\n\t\t\t// version made by (00: DOS)\r\n\t\t\t\"\\x14\\x00\" +\r\n\t\t\t// file header (common to file and central directory)\r\n\t\t\tdata.header +\r\n\t\t\t// file comment length\r\n\t\t\t\"\\x00\\x00\" +\r\n\t\t\t// disk number start\r\n\t\t\t\"\\x00\\x00\" +\r\n\t\t\t// internal file attributes TODO\r\n\t\t\t\"\\x00\\x00\" +\r\n\t\t\t// external file attributes\r\n\t\t\t(file.options.dir===true?\"\\x10\\x00\\x00\\x00\":\"\\x00\\x00\\x00\\x00\")+\r\n\t\t\t// relative offset of local header\r\n\t\t\tTSZip.decToHex(fileOffset, 4) +\r\n\t\t\t// file name\r\n\t\t\tutfEncodedFileName;\r\n\t\t\r\n\t\t\tfileOffset += fileRecord.length;\r\n\t\t\r\n\t\t\tfiles.push(fileRecord);\r\n\t\t\tdirectory.push(dirRecord);\r\n\t\t}\r\n\t\t\r\n\t\tlet fileData = files.join(\"\");\r\n\t\tlet dirData = directory.join(\"\");\r\n\t\t\r\n\t\tlet dirEnd = \"\";\r\n\t\t\r\n\t\t// end of central dir signature\r\n\t\tdirEnd = this.signature.CENTRAL_DIRECTORY_END +\r\n\t\t// number of this disk\r\n\t\t\"\\x00\\x00\" +\r\n\t\t// number of the disk with the start of the central directory\r\n\t\t\"\\x00\\x00\" +\r\n\t\t// total number of entries in the central directory on this disk\r\n\t\tTSZip.decToHex(files.length, 2) +\r\n\t\t// total number of entries in the central directory\r\n\t\tTSZip.decToHex(files.length, 2) +\r\n\t\t// size of the central directory 4 bytes\r\n\t\tTSZip.decToHex(dirData.length, 4) +\r\n\t\t// offset of start of central directory with respect to the starting disk number\r\n\t\tTSZip.decToHex(fileData.length, 4) +\r\n\t\t// .ZIP file comment length\r\n\t\t\"\\x00\\x00\";\r\n\t\t\r\n\t\tlet zip = fileData + dirData + dirEnd;\r\n\t\t\r\n\t\t\r\n\t\tswitch(options.type.toLowerCase()) {\r\n\t\t\tcase \"uint8array\" :\r\n\t\t\t\treturn TSZipUtils.string2Uint8Array(zip);\r\n\t\t\tcase \"arraybuffer\" :\r\n\t\t\t\treturn TSZipUtils.getArrayBuffer(zip);\r\n\t\t\tcase \"blob\" :\r\n\t\t\t\treturn TSZipUtils.string2Blob(zip);\r\n\t\t\tcase \"base64\" :\r\n\t\t\t\treturn (options.base64) ? TSZipBase64.encode(zip) : zip;\r\n\t\t\tdefault : // case \"string\" :\r\n\t\t\t\treturn zip;\r\n\t\t}\r\n\t}\r\n\t\r\n\tstatic crc32(str, crc = 0) {\r\n\t\tif (str === \"\" || typeof str === \"undefined\") {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t\tlet table = [\r\n\t\t\t0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\r\n\t\t\t0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\r\n\t\t\t0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\r\n\t\t\t0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\r\n\t\t\t0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\r\n\t\t\t0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\r\n\t\t\t0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\r\n\t\t\t0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\r\n\t\t\t0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\r\n\t\t\t0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\r\n\t\t\t0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\r\n\t\t\t0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\r\n\t\t\t0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\r\n\t\t\t0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\r\n\t\t\t0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\r\n\t\t\t0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\r\n\t\t\t0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\r\n\t\t\t0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\r\n\t\t\t0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\r\n\t\t\t0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\r\n\t\t\t0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\r\n\t\t\t0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\r\n\t\t\t0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\r\n\t\t\t0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\r\n\t\t\t0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\r\n\t\t\t0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\r\n\t\t\t0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\r\n\t\t\t0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\r\n\t\t\t0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\r\n\t\t\t0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\r\n\t\t\t0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\r\n\t\t\t0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\r\n\t\t\t0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\r\n\t\t\t0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\r\n\t\t\t0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\r\n\t\t\t0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\r\n\t\t\t0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\r\n\t\t\t0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\r\n\t\t\t0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\r\n\t\t\t0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\r\n\t\t\t0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\r\n\t\t\t0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\r\n\t\t\t0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\r\n\t\t\t0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\r\n\t\t\t0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\r\n\t\t\t0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\r\n\t\t\t0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\r\n\t\t\t0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\r\n\t\t\t0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\r\n\t\t\t0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\r\n\t\t\t0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\r\n\t\t\t0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\r\n\t\t\t0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\r\n\t\t\t0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\r\n\t\t\t0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\r\n\t\t\t0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\r\n\t\t\t0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\r\n\t\t\t0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\r\n\t\t\t0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\r\n\t\t\t0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\r\n\t\t\t0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\r\n\t\t\t0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\r\n\t\t\t0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\r\n\t\t\t0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\r\n\t\t];\r\n\t\t\r\n\t\tif (typeof(crc) == \"undefined\") { crc = 0; }\r\n\t\tlet x = 0;\r\n\t\tlet y = 0;\r\n\t\t\r\n\t\tcrc = crc ^ (-1);\r\n\t\tfor( let i = 0, iTop = str.length; i < iTop; i++ ) {\r\n\t\t\ty = ( crc ^ str.charCodeAt( i ) ) & 0xFF;\r\n\t\t\tx = table[y];\r\n\t\t\tcrc = ( crc >>> 8 ) ^ x;\r\n\t\t}\r\n\t\t\r\n\t\treturn crc ^ (-1);\r\n\t}\r\n\t\r\n\t//Страшная штука, нужно лучше продумать и реализовать ее\r\n\t// clone() {\r\n\t// \tlet newObj = new TSZip();\r\n\t// \tfor (let i in this) {\r\n\t// \t\tif (typeof this[i] !== \"function\") {\r\n\t// \t\t\tnewObj[i] = this[i];\r\n\t// \t\t}\r\n\t// \t}\r\n\t// \treturn newObj;\r\n\t// }\r\n\t\r\n\tstatic utf8encode(str) {\r\n\t\tstr = str.replace(/\\r\\n/g,\"\\n\");\r\n\t\tlet utftext = \"\";\r\n\t\t\r\n\t\tfor (let n = 0; n < str.length; n++) {\r\n\t\t\r\n\t\t\tlet c = str.charCodeAt(n);\r\n\t\t\r\n\t\t\tif (c < 128) {\r\n\t\t\t\tutftext += String.fromCharCode(c);\r\n\t\t\t} else if ((c > 127) && (c < 2048)) {\r\n\t\t\t\tutftext += String.fromCharCode((c >> 6) | 192);\r\n\t\t\t\tutftext += String.fromCharCode((c & 63) | 128);\r\n\t\t\t} else {\r\n\t\t\t\tutftext += String.fromCharCode((c >> 12) | 224);\r\n\t\t\t\tutftext += String.fromCharCode(((c >> 6) & 63) | 128);\r\n\t\t\t\tutftext += String.fromCharCode((c & 63) | 128);\r\n\t\t\t}\r\n\t\t\r\n\t\t}\r\n\t\t\r\n\t\treturn utftext;\r\n\t}\r\n\t\r\n\tstatic utf8decode(utftext) {\r\n\t\tlet string = \"\";\r\n\t\tlet i = 0;\r\n\t\tlet c = 0, c1 = 0, c2 = 0, c3 = 0;\r\n\t\r\n\t\twhile (i < utftext.length) {\r\n\t\t\tc = utftext.charCodeAt(i);\r\n\t\r\n\t\t\tif (c < 128) {\r\n\t\t\t\tstring += String.fromCharCode(c);\r\n\t\t\t\ti++;\r\n\t\t\t} else if ((c > 191) && (c < 224)) {\r\n\t\t\t\tc2 = utftext.charCodeAt(i+1);\r\n\t\t\t\tstring += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\r\n\t\t\t\ti += 2;\r\n\t\t\t} else {\r\n\t\t\t\tc2 = utftext.charCodeAt(i+1);\r\n\t\t\t\tc3 = utftext.charCodeAt(i+2);\r\n\t\t\t\tstring += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n\t\t\t\ti += 3;\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\treturn string;\r\n\t}\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n}\r\n\r\nclass ZipObject {\r\n\tname: string = \"\";\r\n\tdata: string = \"\";\r\n\toptions = {\r\n\t\tbase64: false,\r\n\t\tbinary: false,\r\n\t\tdir: false,\r\n\t\tdate: null\r\n\t};\r\n\t\r\n\tconstructor(name, data, options) {\r\n\t\tthis.name = name;\r\n\t\tthis.data = data;\r\n\t\tthis.options = options;\r\n\t};\r\n\t\r\n\tasText() {\r\n let result = this.data;\r\n if (this.options.base64) {\r\n result = TSZipBase64.decode(result);\r\n }\r\n if (this.options.binary) {\r\n result = TSZip.utf8decode(result);\r\n }\r\n return result;\r\n }\r\n\t\r\n\tasBinary() {\r\n let result = this.data;\r\n if (this.options.base64) {\r\n result = TSZipBase64.decode(result);\r\n }\r\n if (!this.options.binary) {\r\n result = TSZip.utf8encode(result);\r\n }\r\n return result;\r\n }\r\n\t\r\n\tasUint8Array() {\r\n return TSZipUtils.string2Uint8Array(this.asBinary());\r\n }\r\n\t\r\n\tasArrayBuffer() {\r\n return TSZipUtils.getArrayBuffer(this.asBinary());\r\n }\r\n}\r\n\r\nclass TSZipStore{\r\n\tmagic: string = \"\\x00\\x00\";\r\n\tcompress(content) {\r\n\t\treturn content; // no compression\r\n\t}\r\n\tuncompress(content) {\r\n\t\treturn content; // no compression\r\n\t}\r\n}\r\n\r\nclass TSZipSupport {\r\n // contains true if Zip can read/generate ArrayBuffer, false otherwise.\r\n\tstatic arraybuffer(){\r\n\t\treturn typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\r\n\t}\r\n\t// contains true if Zip can read/generate Uint8Array, false otherwise.\r\n\tstatic uint8array(){\r\n\t\treturn typeof Uint8Array !== \"undefined\";\r\n\t}\r\n\t// contains true if Zip can read/generate Blob, false otherwise.\r\n\tstatic blob(){\r\n\t\t// the spec started with BlobBuilder then replaced it with a construtor for Blob.\r\n\t\t// Result : we have browsers that :\r\n\t\t// * know the BlobBuilder (but with prefix)\r\n\t\t// * know the Blob constructor\r\n\t\t// * know about Blob but not about how to build them\r\n\t\t// About the \"=== 0\" test : if given the wrong type, it may be converted to a string.\r\n\t\t// Instead of an empty content, we will get \"[object Uint8Array]\" for example.\r\n\t\tif (typeof ArrayBuffer === \"undefined\") {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlet buffer = new ArrayBuffer(0);\r\n\t\ttry {\r\n\t\t\treturn new Blob([buffer], { type: \"application/zip\" }).size === 0;\r\n\t\t}\r\n\t\tcatch(e) {}\r\n\t\t\r\n\t\t/*try {\r\n\t\t\tlet builder = new (window.BlobBuilder || window.WebKitBlobBuilder ||\r\n\t\t\t\t\t\t\t\twindow.MozBlobBuilder || window.MSBlobBuilder)();\r\n\t\t\tbuilder.append(buffer);\r\n\t\t\treturn builder.getBlob('application/zip').size === 0;\r\n\t\t}\r\n\t\tcatch(e) {}*/\r\n\t\t\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nclass TSZipUtils{\r\n\t/**\r\n\t* Convert a string to a \"binary string\" : a string containing only char codes between 0 and 255.\r\n\t* @param {string} str the string to transform.\r\n\t* @return {String} the binary string.\r\n\t*/\r\n\tstatic string2binary(str) {\r\n\t\tlet result = \"\";\r\n\t\tfor (let i = 0; i < str.length; i++) {\r\n\t\t\tresult += String.fromCharCode(str.charCodeAt(i) & 0xff);\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t/**\r\n\t* Create a Uint8Array from the string.\r\n\t* @param {string} str the string to transform.\r\n\t* @return {Uint8Array} the typed array.\r\n\t* @throws {Error} an Error if the browser doesn't support the requested feature.\r\n\t*/\r\n\tstatic string2Uint8Array(str) {\r\n\t\tif (!TSZipSupport.uint8array) {\r\n\t\t\tthrow new Error(\"Uint8Array is not supported by this browser\");\r\n\t\t}\r\n\t\tlet buffer = new ArrayBuffer(str.length);\r\n\t\tlet bufferView = new Uint8Array(buffer);\r\n\t\tfor(let i = 0; i < str.length; i++) {\r\n\t\t\tbufferView[i] = str.charCodeAt(i);\r\n\t\t}\r\n\t\t\r\n\t\treturn bufferView;\r\n\t}\r\n\t\r\n\tstatic getArrayBuffer(str){\r\n\t\treturn new ArrayBuffer(str.length);\r\n\t}\r\n\t\r\n\t/**\r\n\t* Create a string from the Uint8Array.\r\n\t* @param {Uint8Array} array the array to transform.\r\n\t* @return {string} the string.\r\n\t* @throws {Error} an Error if the browser doesn't support the requested feature.\r\n\t*/\r\n\tstatic uint8Array2String(array) {\r\n\t\tif (!TSZipSupport.uint8array) {\r\n\t\t\tthrow new Error(\"Uint8Array is not supported by this browser\");\r\n\t\t}\r\n\t\tlet result = \"\";\r\n\t\tfor(let i = 0; i < array.length; i++) {\r\n\t\t\tresult += String.fromCharCode(array[i]);\r\n\t\t}\r\n\t\t\r\n\t\treturn result;\r\n\t}\r\n\t/**\r\n\t* Create a blob from the given string.\r\n\t* @param {string} str the string to transform.\r\n\t* @return {Blob} the string.\r\n\t* @throws {Error} an Error if the browser doesn't support the requested feature.\r\n\t*/\r\n\tstatic string2Blob(str) {\r\n\t\tif (!TSZipSupport.blob) {\r\n\t\t\tthrow new Error(\"Blob is not supported by this browser\");\r\n\t\t}\r\n\t\t\r\n\t\tlet buffer = this.getArrayBuffer(str);\r\n\t\ttry {\r\n\t\t\t// Blob constructor\r\n\t\t\treturn new Blob([buffer], { type: \"application/zip\" });\r\n\t\t}\r\n\t\tcatch(e) {}\r\n\t\t\r\n\t\t/*try {\r\n\t\t\t// deprecated, browser only, old way\r\n\t\t\tlet builder = new (window.BlobBuilder || window.WebKitBlobBuilder ||\r\n\t\t\t\t\t\t\t\twindow.MozBlobBuilder || window.MSBlobBuilder)();\r\n\t\t\tbuilder.append(buffer);\r\n\t\t\treturn builder.getBlob('application/zip');\r\n\t\t}\r\n\t\tcatch(e) {}*/\r\n\t\t\r\n\t\t// well, fuck ?!\r\n\t\tthrow new Error(\"Bug : can't construct the Blob.\");\r\n\t}\r\n}\r\n\r\nclass TSZipBase64{\r\n\t// private property\r\n\tstatic _keyStr: string = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n\t\r\n\tstatic encode(input) {\r\n\t\tvar output = \"\";\r\n\t\tvar chr1, chr2, chr3, enc1, enc2, enc3, enc4;\r\n\t\tvar i = 0;\r\n\r\n\t\twhile (i < input.length) {\r\n\t\t\tchr1 = input.charCodeAt(i++);\r\n\t\t\tchr2 = input.charCodeAt(i++);\r\n\t\t\tchr3 = input.charCodeAt(i++);\r\n\t\t\t\r\n\t\t\tenc1 = chr1 >> 2;\r\n\t\t\tenc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\r\n\t\t\tenc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\r\n\t\t\tenc4 = chr3 & 63;\r\n\t\t\t\r\n\t\t\tif (isNaN(chr2)) {\r\n\t\t\t\tenc3 = enc4 = 64;\r\n\t\t\t} else if (isNaN(chr3)) {\r\n\t\t\t\tenc4 = 64;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\toutput = output +\r\n\t\t\t\tthis._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +\r\n\t\t\t\tthis._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);\r\n\t\t}\r\n\r\n\t\treturn output;\r\n\t}\r\n\r\n\tstatic decode(input) {\r\n\t\tvar output = \"\";\r\n\t\tvar chr1, chr2, chr3;\r\n\t\tvar enc1, enc2, enc3, enc4;\r\n\t\tvar i = 0;\r\n\t\t\r\n\t\tinput = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\r\n\t\t\r\n\t\twhile (i < input.length) {\r\n\t\t\tenc1 = this._keyStr.indexOf(input.charAt(i++));\r\n\t\t\tenc2 = this._keyStr.indexOf(input.charAt(i++));\r\n\t\t\tenc3 = this._keyStr.indexOf(input.charAt(i++));\r\n\t\t\tenc4 = this._keyStr.indexOf(input.charAt(i++));\r\n\t\t\r\n\t\t\tchr1 = (enc1 << 2) | (enc2 >> 4);\r\n\t\t\tchr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\r\n\t\t\tchr3 = ((enc3 & 3) << 6) | enc4;\r\n\t\t\r\n\t\t\toutput = output + String.fromCharCode(chr1);\r\n\t\t\r\n\t\t\tif (enc3 != 64) {\r\n\t\t\t\toutput = output + String.fromCharCode(chr2);\r\n\t\t\t}\r\n\t\t\tif (enc4 != 64) {\r\n\t\t\t\toutput = output + String.fromCharCode(chr3);\r\n\t\t\t}\r\n\t\t\r\n\t\t}\r\n\t\treturn output;\r\n\t}\r\n}\r\n","// @ts-nocheck\r\nimport {TSZip} from './tszip.min';\r\n\r\nexport class XLSXUni{\r\n\tpublic sheet: Sheet = null;\r\n\tpublic workBook: WorkBook = new WorkBook(\"Uni\");\r\n\tpublic cell: Cell = null;\r\n\tpublic style: XLSXStyle = null;\r\n\tpublic merge: SheetMerge = null;\r\n\r\n\tconstructor(){}\r\n\tngOnInit(author) {\r\n\t\tthis.workBook = new WorkBook(author);\r\n\t}\r\n\t\r\n\tgetWorkBook(author='Uni'){return new WorkBook(author)}\r\n\tgetSheet(name){return new Sheet(name)}\r\n\tgetCell(data = null, style = null){return new Cell(data, style)}\r\n\tgetStyle(number = 1, numFmtId = 0){return new XLSXStyle(number, numFmtId)}\r\n\tgetMerge(firstCol, firstRow, lastCol, lastRow){return new SheetMerge(firstCol, firstRow, lastCol, lastRow)}\r\n\t\r\n\tsave(name = 'file.xlsx'){return new RenderXLXS(this.workBook, name)}\r\n\t\r\n\tstatic exportDOMToXLSX(dom, name = 'export.xlsx'){\r\n\t\tlet getStTb = function(td, colI, rowI){\r\n\t\t\tif(td.rowSpan == 1){\r\n\t\t\t\tif(colI == 0){\r\n\t\t\t\t\treturn 9;\r\n\t\t\t\t}else if(colI != td.colSpan-1){\r\n\t\t\t\t\treturn 10;\r\n\t\t\t\t}else{\r\n\t\t\t\t\treturn 11;\r\n\t\t\t\t}\r\n\t\t\t}else if(td.colSpan == 1){\r\n\t\t\t\tif(rowI == 0){\r\n\t\t\t\t\treturn 12;\r\n\t\t\t\t}else if(rowI != td.rowSpan-1){\r\n\t\t\t\t\treturn 13;\r\n\t\t\t\t}else{\r\n\t\t\t\t\treturn 14;\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\tif(rowI == 0){\r\n\t\t\t\t\tif(colI == 0){\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}else if(colI != td.colSpan-1){\r\n\t\t\t\t\t\treturn 2;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\treturn 3;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else if(rowI != td.rowSpan-1){\r\n\t\t\t\t\tif(colI == 0){\r\n\t\t\t\t\t\treturn 4;\r\n\t\t\t\t\t}else if(colI != td.colSpan-1){\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\treturn 5;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(colI == 0){\r\n\t\t\t\t\t\treturn 6;\r\n\t\t\t\t\t}else if(colI != td.colSpan-1){\r\n\t\t\t\t\t\treturn 7;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\treturn 8;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\tlet getStartCol = function(arr){\r\n\t\t\tif(typeof arr === 'undefined') return 0;\r\n\t\t\tif(arr.length == 0) return 0;\r\n\t\t\tlet i;\r\n\t\t\tfor(i = 0; i < arr.length; i++){\r\n\t\t\t\tif(typeof arr[i] == 'undefined') return i;\r\n\t\t\t}\r\n\t\t\treturn i;\r\n\t\t};\r\n\t\tlet fixCell = function(x){\r\n\t\t\tlet a = x.trim()\r\n\t\t\tlet b = a.replace(',', '.');\r\n\t\t\tif(!Number.isNaN(Number.parseFloat(b)) && b == Number.parseFloat(b))\r\n\t\t\t\tif (Number.parseFloat(b) < 100000000000) return Number.parseFloat(b);\r\n\t\t\t\telse return a + ' ';\r\n\t\t\telse return a;\r\n\t\t}\r\n\t\tlet render = function(dom){\r\n\t\t\tlet items = [];\r\n\t\t\tdom.forEach( d => {\r\n\t\t\t\tif(d.tagName == 'TABLE') {\r\n\t\t\t\t\tlet table = {type: 'table', head: 0, merge: [], style: [], data: null, customWidth: {}}\r\n\t\t\t\t\tlet tb = [];\r\n\t\t\t\t\tlet row = 0;\r\n\t\t\t\t\tif(d.querySelector('thead') !== null)\r\n\t\t\t\t\td.querySelector('thead').querySelectorAll('tr').forEach(tr => {\r\n\t\t\t\t\t\ttable.head++;\r\n\t\t\t\t\t\tif(typeof tb[row] === 'undefined') tb[row] = [];\r\n\t\t\t\t\t\tif(typeof table.style[row] === 'undefined') table.style[row] = [];\r\n\t\t\t\t\t\ttr.querySelectorAll('th').forEach(th => {\r\n\t\t\t\t\t\t\tlet col = getStartCol(tb[row]);\r\n\t\t\t\t\t\t\ttb[row][col] = fixCell(th.innerText);\r\n\t\t\t\t\t\t\tif(th.colSpan == 1){\r\n\t\t\t\t\t\t\t\ttable.customWidth[col+1] = th.clientWidth / 9.;\r\n\t\t\t\t\t\t\t\tif(table.customWidth[col+1] < 3) table.customWidth[col+1] = 19;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(th.rowSpan > 1 || th.colSpan > 1){\r\n\t\t\t\t\t\t\t\ttable.merge.push([(col+1),(row+1),(col+th.colSpan),(row+th.rowSpan)]);\r\n\t\t\t\t\t\t\t\tfor(let rowI = 0; rowI < th.rowSpan; rowI++){\r\n\t\t\t\t\t\t\t\t\t//if(rowI>0) col = getStartCol(tb[row+rowI]);\r\n\t\t\t\t\t\t\t\t\tfor(let colI = 0; colI < th.colSpan; colI++){\r\n\t\t\t\t\t\t\t\t\t\tif(typeof table.style[row+rowI] === 'undefined') table.style[row+rowI] = Array();\r\n\t\t\t\t\t\t\t\t\t\ttable.style[row+rowI][col+colI] = getStTb(th, colI, rowI);\r\n\t\t\t\t\t\t\t\t\t\tif(rowI==0){\r\n\t\t\t\t\t\t\t\t\t\t\tif(colI == 0) continue;\r\n\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\tif(typeof tb[row+rowI] === 'undefined') tb[row+rowI] = Array();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\ttb[row+rowI][col+colI] = '';\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\ttable.style[row][col] = 0;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\trow++;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif(d.querySelector('tbody') !== null)\r\n\t\t\t\t\td.querySelector('tbody').querySelectorAll('tr').forEach(tr => {\r\n\t\t\t\t\t\tif(typeof tb[row] === 'undefined') tb[row] = [];\r\n\t\t\t\t\t\tif(typeof table.style[row] === 'undefined') table.style[row] = [];\r\n\t\t\t\t\t\ttr.querySelectorAll('td, th').forEach((td) => {\r\n\t\t\t\t\t\t\tlet col = getStartCol(tb[row]);\r\n\t\t\t\t\t\t\ttb[row][col] = fixCell(td.innerText);\r\n\t\t\t\t\t\t\tif(td.colSpan == 1){\r\n\t\t\t\t\t\t\t\ttable.customWidth[col+1] = td.clientWidth / 9.;\r\n\t\t\t\t\t\t\t\tif(table.customWidth[col+1] < 3) table.customWidth[col+1] = 20;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(td.rowSpan > 1 || td.colSpan > 1){\r\n\t\t\t\t\t\t\t\ttable.merge.push([(col+1),(row+1),(col+td.colSpan),(row+td.rowSpan)]);\r\n\t\t\t\t\t\t\t\tfor(let rowI = 0; rowI < td.rowSpan; rowI++){\r\n\t\t\t\t\t\t\t\t\t//if(rowI>0) col = getStartCol(tb[row+rowI]);\r\n\t\t\t\t\t\t\t\t\tfor(let colI = 0; colI < td.colSpan; colI++){\r\n\t\t\t\t\t\t\t\t\t\tif(typeof table.style[row+rowI] === 'undefined') table.style[row+rowI] = Array();\r\n\t\t\t\t\t\t\t\t\t\ttable.style[row+rowI][col+colI] = getStTb(td, colI, rowI);\r\n\t\t\t\t\t\t\t\t\t\tif(rowI==0){\r\n\t\t\t\t\t\t\t\t\t\t\tif(colI==0) continue;\r\n\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\tif(typeof tb[row+rowI] === 'undefined') tb[row+rowI] = Array();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\ttb[row+rowI][col+colI] = '';\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\ttable.style[row][col] = 0;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\trow++;\r\n\t\t\t\t\t});\r\n\t\t\t\t\ttable.data = tb;\r\n\t\t\t\t\titems.push(table);\r\n\t\t\t\t}else if (d.tagName == \"BR\") {\r\n\t\t\t\t\titems.push({type: 'text', data: '', tags: []});\r\n\t\t\t\t}else if(d.childNodes.length > 1){\r\n\t\t\t\t\trender(d.childNodes).forEach(i=>{items.push(i);});\r\n\t\t\t\t}\r\n\t\t\t\telse if(d.tagName != '#text' && d.innerText !== undefined){\r\n\t\t\t\t\tlet item = {type: 'text', data: d.innerText, tags: []};\r\n\t\t\t\t\t//if(window.getComputedStyle(d).fontWeight > 500) item.tags.push('b');\r\n\t\t\t\t\t//if (d.classList.contains('xlsx-filter')) item.filter = true;\r\n\t\t\t\t\t/*if(d.classList.contains('xlsx-right')){ \r\n\t\t\t\t\t\titem.row = ;\r\n\t\t\t\t\t\trightItems.push(item);\r\n\t\t\t\t\t}*/\r\n\t\t\t\t\t//else\r\n\t\t\t\t\titems.push(item);\r\n\t\t\t\t}else if(d.tagName == '#text'){\r\n\t\t\t\t\tlet item = {type: 'text', data: d.textContent, tags: []};\r\n\t\t\t\t\titems.push(item);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn items;\r\n\t\t};\r\n\r\n\t\tconst getNativeClass = function(obj:any) {\r\n\t\t\tif (typeof obj === \"undefined\") return \"undefined\";\r\n\t\t\tif (obj === null) return \"null\";\r\n\t\t\treturn Object.prototype.toString.call(obj).match(/^\\[object\\s(.*)\\]$/)[1];\r\n\t\t}\r\n\t\tlet items = [];\r\n\t\tlet rightItems = [];\r\n\t\tlet table = {};\r\n\t\tlet filter = [];\r\n\t\tif(getNativeClass(dom) == 'NodeList'){\r\n\t\t\titems = render(dom);\r\n\t\t}else{\r\n\t\t\titems = render(dom.childNodes);\r\n\t\t}\r\n\t\t\r\n\t\tlet exp: XLSXUni = new XLSXUni();\r\n\t\texp.workBook.createSheet('List 1');\r\n\t\tlet row = 1;\r\n\t\tlet tableSt = false;\r\n\t\tlet tableStyle = [];\r\n\t\titems.forEach( item => {\r\n\t\t\tif(item.type == 'text'){\r\n\t\t\t\titem.data.split('\\n').forEach(text => {\r\n\t\t\t\t\texp.workBook.addCell(0, row, text);\r\n\t\t\t\t\trow++;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif(item.type == 'table'){\r\n\t\t\t\tlet splap = exp.workBook.sheet[0].getMaxRow();\r\n\t\t\t\tif(!tableSt){\r\n\t\t\t\t\tXLSXUni.createStyleTable().forEach(st => {\r\n\t\t\t\t\t\ttableStyle.push(exp.workBook.addStyle(st));\r\n\t\t\t\t\t});\r\n\t\t\t\t\tXLSXUni.createStyleNumberTable().forEach(st => {\r\n\t\t\t\t\t\ttableStyle.push(exp.workBook.addStyle(st));\r\n\t\t\t\t\t});\r\n\t\t\t\t\ttableSt = true;\r\n\t\t\t\t}\r\n\t\t\t\titem.data.forEach((th, i) => {\r\n\t\t\t\t\tth.forEach((td, j) => {\r\n\t\t\t\t\t\tlet st = 0;\r\n\t\t\t\t\t\tif(typeof item.style[i][j] != undefined){\r\n\t\t\t\t\t\t\tif(typeof td === 'number') st = tableStyle[item.style[i][j] + 15];\r\n\t\t\t\t\t\t\telse st = tableStyle[item.style[i][j]];\r\n\t\t\t\t\t\t} else if(typeof td === 'number') st = 2;\r\n\t\t\t\t\t\texp.workBook.addCell(0, row, td, st);\r\n\t\t\t\t\t});\r\n\t\t\t\t\trow++;\r\n\t\t\t\t});\r\n\t\t\t\titem.merge.forEach( i => {\r\n\t\t\t\t\texp.workBook.sheet[0].addMerges(i[0], i[1] + splap, i[2], i[3] + splap);\r\n\t\t\t\t});\r\n\t\t\t\tObject.keys(item.customWidth).forEach(k => {\r\n\t\t\t\t\texp.workBook.sheet[0].setCustomWidth(item.customWidth[k], k);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn exp;\r\n\t}\r\n\t\r\n\tstatic createStyleTable(){\r\n\t\tlet st0 = new XLSXStyle();\r\n\t\tst0.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst0.alignment.wrapText = true;\r\n\t\tlet st1 = new XLSXStyle();\r\n\t\tst1.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst1.alignment.wrapText = true;\r\n\t\tlet st2 = new XLSXStyle();\r\n\t\tst2.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst2.alignment.wrapText = true;\r\n\t\tlet st3 = new XLSXStyle();\r\n\t\tst3.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst3.alignment.wrapText = true;\r\n\t\tlet st4 = new XLSXStyle();\r\n\t\tst4.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst4.alignment.wrapText = true;\r\n\t\tlet st5 = new XLSXStyle();\r\n\t\tst5.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst5.alignment.wrapText = true;\r\n\t\tlet st6 = new XLSXStyle();\r\n\t\tst6.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst6.alignment.wrapText = true;\r\n\t\tlet st7 = new XLSXStyle();\r\n\t\tst7.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst7.alignment.wrapText = true;\r\n\t\tlet st8 = new XLSXStyle();\r\n\t\tst8.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst8.alignment.wrapText = true;\r\n\t\tlet st9 = new XLSXStyle();\r\n\t\tst9.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst9.alignment.wrapText = true;\r\n\t\tlet st10 = new XLSXStyle();\r\n\t\tst10.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst10.alignment.wrapText = true;\r\n\t\tlet st11 = new XLSXStyle();\r\n\t\tst11.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tlet st12 = new XLSXStyle();\r\n\t\tst12.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tlet st13 = new XLSXStyle();\r\n\t\tst13.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tlet st14 = new XLSXStyle();\r\n\t\tst14.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst11.alignment.wrapText = true;\r\n\t\treturn [st0, st1, st2, st3, st4, st5, st6, st7, st8, st9, st10, st11, st12, st13, st14];\r\n\t}\r\n\r\n\tstatic createStyleNumberTable(){\r\n\t\tlet st0 = new XLSXStyle();\r\n\t\tst0.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst0.numFmtId = 164;\r\n\t\tst0.alignment.wrapText = true;\r\n\t\tlet st1 = new XLSXStyle();\r\n\t\tst1.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst1.alignment.wrapText = true;\r\n\t\tst1.numFmtId = 164;\r\n\t\tlet st2 = new XLSXStyle();\r\n\t\tst2.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst2.alignment.wrapText = true;\r\n\t\tst2.numFmtId = 164;\r\n\t\tlet st3 = new XLSXStyle();\r\n\t\tst3.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst3.alignment.wrapText = true;\r\n\t\tst3.numFmtId = 164;\r\n\t\tlet st4 = new XLSXStyle();\r\n\t\tst4.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst4.alignment.wrapText = true;\r\n\t\tst4.numFmtId = 164;\r\n\t\tlet st5 = new XLSXStyle();\r\n\t\tst5.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst5.alignment.wrapText = true;\r\n\t\tst5.numFmtId = 164;\r\n\t\tlet st6 = new XLSXStyle();\r\n\t\tst6.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst6.alignment.wrapText = true;\r\n\t\tst6.numFmtId = 164;\r\n\t\tlet st7 = new XLSXStyle();\r\n\t\tst7.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst7.alignment.wrapText = true;\r\n\t\tst7.numFmtId = 164;\r\n\t\tlet st8 = new XLSXStyle();\r\n\t\tst8.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst8.alignment.wrapText = true;\r\n\t\tst8.numFmtId = 164;\r\n\t\tlet st9 = new XLSXStyle();\r\n\t\tst9.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst9.alignment.wrapText = true;\r\n\t\tst9.numFmtId = 164;\r\n\t\tlet st10 = new XLSXStyle();\r\n\t\tst10.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: [],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst10.alignment.wrapText = true;\r\n\t\tst10.numFmtId = 164;\r\n\t\tlet st11 = new XLSXStyle();\r\n\t\tst11.border = {\r\n\t\t\tleft: [],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst11.numFmtId = 164;\r\n\t\tlet st12 = new XLSXStyle();\r\n\t\tst12.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst12.numFmtId = 164;\r\n\t\tlet st13 = new XLSXStyle();\r\n\t\tst13.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: [],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst13.numFmtId = 164;\r\n\t\tlet st14 = new XLSXStyle();\r\n\t\tst14.border = {\r\n\t\t\tleft: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tright: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\ttop: [],\r\n\t\t\tbottom: ['thin', 'rgb=\"FF000000\"'],\r\n\t\t\tdiagonal: []\r\n\t\t};\r\n\t\tst14.numFmtId = 164;\r\n\t\tst11.alignment.wrapText = true;\r\n\t\treturn [st0, st1, st2, st3, st4, st5, st6, st7, st8, st9, st10, st11, st12, st13, st14];\r\n\t}\r\n}\r\n\r\nclass XLSXStyle{\r\n\tfont = {\r\n\t\tsz: 11,\r\n\t\tcolor: 'FF000000',\r\n\t\tname: 'Calibri',\r\n\t\ttags: []\r\n\t}\r\n\tborder = {\r\n\t\tleft: [],\r\n\t\tright: [],\r\n\t\ttop: [],\r\n\t\tbottom: [],\r\n\t\tdiagonal: []\r\n\t}\r\n\tfill = {\r\n\t\tpatternType: 'none'\r\n\t}\r\n\talignment = {\r\n\t\thorizontal: null,\r\n\t\tvertical: null,\r\n\t\twrapText: null\r\n\t}\r\n\tnumber: Number;\r\n\tnumFmtId: Number;\r\n\tconstructor(number = 0, numFmtId = 0){\r\n\t\tthis.number = number;\r\n\t\tthis.numFmtId = numFmtId;\r\n\t}\r\n\t\r\n\tgetXMLFont(){\r\n\t\tlet xml = '<font>';\r\n\t\txml += '<sz val=\"'+this.font.sz+'\"/>';\r\n\t\txml += '<color rgb=\"'+this.font.color+'\"/>';\r\n\t\txml += '<name val=\"'+this.font.name+'\"/>';\r\n\t\txml += '<scheme val=\"minor\"/>';\r\n\t\tthis.font.tags.forEach(tag => {\r\n\t\t\txml += '<'+tag+' />';\r\n\t\t});\r\n\t\txml += '</font>';\r\n\t\treturn xml;\r\n\t}\r\n\t\r\n\tgetXMLBorder(){\r\n\t\tlet xml = '<border>';\r\n\t\tif(this.border.left.length == 0){\r\n\t\t\txml += '<left />';\r\n\t\t}else{\r\n\t\t\txml += '<left style=\"'+this.border.left[0]+'\">';\r\n\t\t\txml += '<color '+this.border.left[1]+'/>';\r\n\t\t\txml += '</left>';\r\n\t\t}\r\n\t\tif(this.border.right.length == 0){\r\n\t\t\txml += '<right />';\r\n\t\t}else{\r\n\t\t\txml += '<right style=\"'+this.border.right[0]+'\">';\r\n\t\t\txml += '<color '+this.border.right[1]+'/>';\r\n\t\t\txml += '</right>';\r\n\t\t}\r\n\t\tif(this.border.top.length == 0){\r\n\t\t\txml += '<top />';\r\n\t\t}else{\r\n\t\t\txml += '<top style=\"'+this.border.top[0]+'\">';\r\n\t\t\txml += '<color '+this.border.top[1]+'/>';\r\n\t\t\txml += '</top>';\r\n\t\t}\r\n\t\tif(this.border.bottom.length == 0){\r\n\t\t\txml += '<bottom />';\r\n\t\t}else{\r\n\t\t\txml += '<bottom style=\"'+this.border.bottom[0]+'\">';\r\n\t\t\txml += '<color '+this.border.bottom[1]+'/>';\r\n\t\t\txml += '</bottom>';\r\n\t\t}\r\n\t\tif(this.border.diagonal.length == 0){\r\n\t\t\txml += '<diagonal />';\r\n\t\t}else{\r\n\t\t\txml += '<diagonal style=\"'+this.border.diagonal[0]+'\">';\r\n\t\t\txml += '<color '+this.border.diagonal[1]+'/>';\r\n\t\t\txml += '</diagonal>';\r\n\t\t}\r\n\t\txml += '</border>';\r\n\t\treturn xml;\r\n\t}\r\n\t\r\n\tgetXMLFill(){\r\n\t\tlet xml = '';\r\n\t}\r\n\t\r\n\tgetNumber(){\r\n\t\treturn this.number;\r\n\t}\r\n\t\r\n\tisTrueAlignment(){\r\n\t\treturn this.alignment.horizontal !== null || this.alignment.vertical !== null || this.alignment.wrapText !== null;\r\n\t}\r\n\t\r\n\taddTag(tag){\r\n\t\tthis.font.tags.push(tag);\r\n\t}\r\n\r\n\tgetHashFont(){\r\n\t\tlet str = this.font.sz + 'px;';\r\n\t\tstr += this.font.color + 'rgb;';\r\n\t\tstr += this.font.name + 'fa;';\r\n\t\tthis.font.tags.forEach(tag => {str += tag + 'tag;'});\r\n\t\treturn cyrb53(str);\r\n\t}\r\n\r\n\tgetHashBorder(): number {\r\n\t\tlet str = this.border.top[0] + 'st;';\r\n\t\tstr += this.border.top[1] + 'color;';\r\n\t\tstr += this.border.left[0] + 'st;';\r\n\t\tstr += this.border.left[1] + 'color;';\r\n\t\tstr += this.border.right[0] + 'st;';\r\n\t\tstr += this.border.right[1] + 'color;';\r\n\t\tstr += this.border.bottom[0] + 'st;';\r\n\t\tstr += this.border.bottom[1] + 'color;';\r\n\t\tstr += this.border.diagonal[0] + 'st;';\r\n\t\tstr += this.border.diagonal[1] + 'color;';\r\n\t\treturn cyrb53(str);\r\n\t}\r\n\r\n\tgetHashFill(){\r\n\t\tlet str = this.fill.patternType + 'type;';\r\n\t\treturn cyrb53(str);\r\n\t}\r\n\r\n\tgetHash(){\r\n\t\tlet str = this.font.sz + 'px;';\r\n\t\tstr += this.font.color + 'rgb;';\r\n\t\tstr += this.font.name + 'fa;';\r\n\t\tthis.font.tags.forEach(tag => {str += tag + 'tag;'});\r\n\t\tstr += this.border.top[0] + 'st;';\r\n\t\tstr += this.border.top[1] + 'color;';\r\n\t\tstr += this.border.left[0] + 'st;';\r\n\t\tstr += this.border.left[1] + 'color;';\r\n\t\tstr += this.border.right[0] + 'st;';\r\n\t\tstr += this.border.right[1] + 'color;';\r\n\t\tstr += this.border.bottom[0] + 'st;';\r\n\t\tstr += this.border.bottom[1] + 'color;';\r\n\t\tstr += this.border.diagonal[0] + 'st;';\r\n\t\tstr += this.border.diagonal[1] + 'color;';\r\n\t\tstr += this.fill.patternType + 'type;';\r\n\t\tstr += this.numFmtId + 'num;';\r\n\t\tlet hor = this.alignment.horizontal !== null? this.alignment.horizontal : 'null';\r\n\t\tstr += hor + 'hor;';\r\n\t\tlet ver = this.alignment.vertical !== null? this.alignment.vertical : 'null';\r\n\t\tstr += ver + 'ver;';\r\n\t\tlet wra = this.alignment.wrapText !== null? this.alignment.wrapText : 'null';\r\n\t\tstr += wra + 'wra;';\r\n\t\treturn cyrb53(str);\r\n\t}\r\n}\r\n\r\nclass WorkBook{\r\n\tsheet: Array<Sheet> = [];\r\n\tnameSheet: Array<String> = [];\r\n\tstyleList: Array<XLSXStyle> = [new XLSXStyle(1), new XLSXStyle(1, 164)]\r\n\tnextStyle: number = 2;\r\n\tauthor: string = 'Uni';\r\n\tconstructor(author = 'Uni'){\r\n\t\tthis.author = author;\r\n\t}\r\n\t\r\n\tcreateSheet(name){\r\n\t\tthis.sheet.push(new Sheet(name));\r\n\t\tthis.nameSheet.push(name);\r\n\t\treturn this.sheet.length-1;\r\n\t}\r\n\t\r\n\tgetIndexSheet(name){\r\n\t\treturn name.indexOf(name);\r\n\t}\r\n\t\r\n\tgetNameSheet(){\r\n\t\treturn this.nameSheet;\r\n\t}\r\n\t\r\n\tgetSheet(){\r\n\t\treturn this.sheet;\r\n\t}\r\n\t\r\n\taddRow(indexSheet, row = null){\r\n\t\treturn this.sheet[indexSheet].addRow(row);\r\n\t}\r\n\t\r\n\taddCell(indexSheet, indexRow, data, style = null){\r\n\t\tif(Number.isInteger(style)) style = this.styleList[style];\r\n\t\tthis.sheet[indexSheet].addCell(indexRow, data, style);\r\n\t}\r\n\t\r\n\tgetStyleList(){\r\n\t\treturn this.styleList;\r\n\t}\r\n\t\r\n\tgetAuthor(){\r\n\t\treturn this.author;\r\n\t}\r\n\t\r\n\taddStyle(style){\r\n\t\tstyle.number = this.nextStyle;\r\n\t\tthis.nextStyle++;\r\n\t\tthis.styleList.push(style);\r\n\t\treturn style.number;\r\n\t}\r\n}\r\n\r\nclass Sheet{\r\n\trows = {};\r\n\tlastRow = 1;\r\n\tmaxCol = 1;\r\n\tmerges = [];\r\n\tautoFilter = [];\r\n\tname = \"\";\r\n\tcustomWidth: Array<number> = [];\r\n\r\n\tconstructor(name){\r\n\t\tthis.name = name;\r\n\t}\r\n\t\r\n\tgetName(){\r\n\t\treturn this.name;\r\n\t}\r\n\t\r\n\tgetRows(){\r\n\t\treturn this.rows;\r\n\t}\r\n\t\r\n\tgetMerges(){\r\n\t\treturn this.merges;\r\n\t}\r\n\t\r\n\tgetMaxCol(){\r\n\t\treturn this.maxCol;\r\n\t}\r\n\t\r\n\tgetMaxRow(){\r\n\t\treturn this.lastRow - 1;\r\n\t}\r\n\t\r\n\taddRow(row = null){\r\n\t\tif(row !== null) this.rows[this.lastRow] = row;\r\n\t\telse this.rows[this.lastRow] = new Row();\r\n\t\tthis.lastRow++;\r\n\t\treturn this.lastRow-1;\r\n\t}\r\n\t\r\n\taddCell(indexRow, data, style = null){\r\n\t\twhile(typeof this.rows[indexRow] == 'undefined') this.addRow();\r\n\t\tthis.rows[indexRow].push(new Cell(data, style));\r\n\t\tif(this.rows[indexRow].length > this.maxCol) this.maxCol = this.rows[indexRow].length;\r\n\t}\r\n\t\r\n\taddMerges(firstCol, firstRow, lastCol, lastRow){\r\n\t\tlet mer = new SheetMerge(firstCol, firstRow, lastCol, lastRow);\r\n\t\tthis.merges.push(mer);\r\n\t}\r\n\r\n\tsetCustomWidth(i, k){\r\n\t\tthis.customWidth[k] = i;\r\n\t}\r\n}\r\n\r\nclass Row{\r\n\tcells = {};\r\n\tlength = 0;\r\n\tlastCell = 1;\r\n\r\n\tconstructor(){\r\n\t}\r\n\t\r\n\tpush(cell){\r\n\t\tthis.cells[this.lastCell] = cell;\r\n\t\tthis.lastCell++;\r\n\t\tthis.length++;\r\n\t}\r\n\t\r\n\tgetSizeRow(){\r\n\t\treturn this.length;\r\n\t}\r\n\t\r\n\tgetCells(){\r\n\t\treturn this.cells;\r\n\t}\r\n}\r\n\r\nclass Cell{\r\n\tdata = null;\r\n\tstyle = null;\r\n\r\n\tconstructor(data = null, style = null){\r\n\t\tthis.data = data;\r\n\t\tthis.style = style;\r\n\t}\r\n\t\r\n\tisNumber(){\r\n\t\treturn +this.data == this.data && !this.haveWhitespace();\r\n\t}\r\n\t\r\n\thaveWhitespace(){\r\n\t\treturn typeof this.data === 'string' && this.data.substr(-1) != ' ';\r\n\t}\r\n\r\n\tisNull(){\r\n\t\treturn this.data == '' || this.data === null;\r\n\t}\r\n\t\r\n\tgetStyleNum(){\r\n\t\tif(this.style===null) return this.isNumber()? 1 : 0;\r\n\t\treturn this.style.getNumber();\r\n\t}\r\n\t\r\n\tgetData(){\r\n\t\treturn this.data;\r\n\t}\r\n\t\r\n\tsetData(data){\r\n\t\tif(+data == data){\r\n\t\t\tthis.data = +data;\r\n\t\t}else{\r\n\t\t\tthis.data = data;\r\n\t\t}\r\n\t}\r\n\t\r\n\tsetStyle(style){\r\n\t\tthis.style = style;\r\n\t}\r\n}\r\n\r\nclass SheetMerge{\r\n\tdata: Array<number>;\r\n\tconstructor(firstCol, firstRow, lastCol, lastRow){\r\n\t\tthis.data = [firstCol, firstRow, lastCol, lastRow];\r\n\t}\r\n\t\r\n\tgetFirst(){\r\n\t\treturn [this.data[0], this.data[1]];\r\n\t}\r\n\t\r\n\tgetLast(){\r\n\t\treturn [this.data[2], this.data[3]];\r\n\t}\r\n\t\r\n\tgetMerge(){\r\n\t\treturn numberToABC(this.data[0])+this.data[1]+':'+numberToABC(this.data[2])+this.data[3];\r\n\t}\r\n}\r\n\r\nclass RenderXLXS {\r\n\tsharedString: Array<string> = new Array();\r\n\tstyleHash: Array<number> = new Array();\r\n\tcreateXMLApp(nameSheet){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\"><Application>XLSX-Uni</Application><DocSecurity>0</DocSecurity>`;\r\n\t\t//<HeadingPairs>\r\n\t\tfile += `<HeadingPairs><vt:vector size=\"2\" baseType=\"variant\"><vt:variant><vt:lpstr>Лист</vt:lpstr></vt:variant><vt:variant><vt:i4>`+nameSheet.length+`</vt:i4></vt:variant></vt:vector></HeadingPairs>`;\r\n\t\t//<TitlesOfParts>\r\n\t\tfile += '<TitlesOfParts><vt:vector size=\"'+nameSheet.length+'\" baseType=\"lpstr\">';\r\n\t\tnameSheet.forEach(name => {\r\n\t\t\tfile += '<vt:lpstr>'+name+'</vt:lpstr>';\r\n\t\t});\r\n\t\tfile += `</vt:vector></TitlesOfParts>`;\r\n\t\t//End\r\n\t\tfile += '</Properties>';\r\n\t\t\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLCore(creator){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">`;\r\n\t\tfile += '<dc:creator>' + creator + '</dc:creator>';\r\n\t\tfile += '<dcterms:created xsi:type=\"dcterms:W3CDTF\">' + getDateW3CDTF() + '</dcterms:created>';\r\n\t\tfile += '</cp:coreProperties>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLShell(sheet: Sheet, styleList: Array<XLSXStyle>){\r\n\t\tlet rows = sheet.getRows();\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:etc=\"http://www.wps.cn/officeDocument/2017/etCustomData\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\" xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\">`;\r\n\t\tfile += '<dimension ref=\"A1:'+numberToABC(sheet.getMaxCol())+sheet.getMaxRow()+'\" />';\r\n\t\tfile += `<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"><selection activeCell=\"A1\" sqref=\"A1\" /></sheetView></sheetViews><sheetFormatPr defaultColWidth=\"9\" defaultRowHeight=\"20\" outlineLevelCol=\"6\" />`;\r\n\t\tif(sheet.customWidth.length > 0){\r\n\t\t\tfile += `<cols>`;\r\n\t\t\tsheet.customWidth.forEach((i, k) => {\r\n\t\t\t\tif(typeof i !== 'undefined') file += `<col min=\"` + (k) + `\" max=\"` + (k) + `\" width=\"` + i + `\" customWidth=\"1\" />`;\r\n\t\t\t});\r\n\t\t\tfile += `</cols>`;\r\n\t\t}\r\n\t\tfile += `<sheetData>`;\r\n\t\tlet numStr = 0;\r\n\t\tObject.keys(rows).forEach((i) => {\r\n\t\t\tlet row = rows[i];\r\n\t\t\tlet span = i+Number.parseInt(row.getSizeRow());\r\n\t\t\tfile += '<row r=\"'+i+'\" spans=\"'+i+':'+span+'\">';\r\n\t\t\tlet cells = row.getCells();\r\n\t\t\tObject.keys(cells).forEach((j0) => {\r\n\t\t\t\tlet j = Number.parseInt(j0);\r\n\t\t\t\tlet cell = cells[j];\r\n\t\t\t\tif(typeof cell.getData() === 'number'){\r\n\t\t\t\t\tfile += '<c r=\"'+numberToABC(j)+i+'\" s=\"'+this.styleHash.indexOf(styleList[cell.getStyleNum()].getHash())+'\"><v>'+cell.getData()+'</v></c>';\r\n\t\t\t\t}else if(cell.isNull()){\r\n\t\t\t\t\tfile += '<c r=\"'+numberToABC(j)+i+'\" s=\"'+this.styleHash.indexOf(styleList[cell.getStyleNum()].getHash())+'\" />';\r\n\t\t\t\t}else{\r\n\t\t\t\t\tfile += '<c r=\"'+numberToABC(j)+i+'\" s=\"'+this.styleHash.indexOf(styleList[cell.getStyleNum()].getHash())+'\" t=\"s\"><v>'+numStr+'</v></c>';\r\n\t\t\t\t\tthis.sharedString.push(cell.getData());\r\n\t\t\t\t\tnumStr++;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tfile += '</row>';\r\n\t\t});\r\n\t\tfile += '</sheetData>';\r\n\t\tlet merges = sheet.getMerges()\r\n\t\tif(merges.length > 0){\r\n\t\t\tfile += '<mergeCells count=\"'+merges.length+'\">';\r\n\t\t\tmerges.forEach( (merge) => {\r\n\t\t\t\tfile += '<mergeCell ref=\"'+merge.getMerge()+'\" />';\r\n\t\t\t});\r\n\t\t\tfile += '</mergeCells>';\r\n\t\t}\r\n\t\tfile += '<headerFooter /></worksheet>';\r\n\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLSharedStrings(){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"9\" uniqueCount=\"9\">`;\r\n\t\tthis.sharedString.forEach((str)=>{\r\n\t\t\tfile += '<si><t>'+str+'</t></si>';\r\n\t\t});\r\n\t\tfile += '</sst>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLWorkBook(nameSheet){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"><fileVersion appName=\"xl\" lastEdited=\"3\" lowestEdited=\"0\" rupBuild=\"9302\"/><workbookPr/>`;\r\n\t\tfile += '<bookViews><workbookView windowHeight=\"17715\" /></bookViews>';\r\n\t\tfile += '<sheets>';\r\n\t\tnameSheet.forEach((name, i) => {\r\n\t\t\tconst id = i+1;\r\n\t\t\tfile += '<sheet name=\"'+name+'\" sheetId=\"'+id+'\" r:id=\"rId'+id+'\"/>';\r\n\t\t});\r\n\t\tfile += '</sheets>';\r\n\t\tfile += '<calcPr calcId=\"0\" />';\r\n\t\tfile += '</workbook>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLContentTypes(countSheet){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/>`;\r\n\t\tfile += '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/xl/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>';\r\n\t\tfile += '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>';\r\n\t\tfor(let i=1;i<=countSheet;i++)\r\n\t\t\tfile += '<Override PartName=\"/xl/worksheets/sheet'+i+'.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>';\r\n\t\tfile += '</Types>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\tcreateXMLRelsWorkBook(countSheet){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/><Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/><Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/>`;\r\n\t\tfor(let i = 1;i<=countSheet;i++){\r\n\t\t\tfile+='<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet'+i+'.xml\"/>';\r\n\t\t}\r\n\t\tfile += '</Relationships>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\treturnRelsMain(){\r\n\t\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/><Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/></Relationships>`;\r\n\t}\r\n\t\r\n\tcreateStyle(styleList: Array<XLSXStyle>){\r\n\t\tlet file = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><numFmts count=\"1\"><numFmt numFmtId=\"180\" formatCode=\"0.000000\" /></numFmts>`;\r\n\t\tlet fontStr: string = '';\r\n\t\tlet fontLen: number = 0;\r\n\t\tlet fontHas: Array<number> = [];\r\n\t\tstyleList.forEach((item: XLSXStyle) => {\r\n\t\t\tif(fontHas.indexOf(item.getHashFont()) === -1){\r\n\t\t\t\tfontStr += item.getXMLFont();\r\n\t\t\t\tfontLen++;\r\n\t\t\t\tfontHas.push(item.getHashFont());\r\n\t\t\t}\r\n\t\t});\r\n\t\tfile += '<fonts count=\"'+fontLen+'\">' + fontStr + '</fonts>';\r\n\t\t//\r\n\t\tfile += '<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>';\r\n\t\t//\r\n\t\tlet borStr: string = '';\r\n\t\tlet borLen: number = 0;\r\n\t\tlet borHas: Array<number> = [];\r\n\t\tstyleList.forEach((item: XLSXStyle) => {\r\n\t\t\tif(borHas.indexOf(item.getHashBorder()) === -1){\r\n\t\t\t\tborStr += item.getXMLBorder();\r\n\t\t\t\tborLen++;\r\n\t\t\t\tborHas.push(item.getHashBorder());\r\n\t\t\t}\r\n\t\t});\r\n\t\tfile += '<borders count=\"'+borLen+'\">' + borStr + '</borders>';\r\n\t\tfile += '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" /></cellStyleXfs>';\r\n\r\n\t\tlet fontXfStr: string = '';\r\n\t\tlet fontXfLen: number = 0;\r\n\t\tlet fontXfHas: Array<number> = [];\r\n\t\tstyleList.forEach((item, i) => {\r\n\t\t\tif(fontXfHas.indexOf(item.getHash()) === -1){\r\n\t\t\t\t//let num = item.numFmtId == 164? 49 : 0;\r\n\t\t\t\tlet num = 0;\r\n\t\t\t\tfontXfStr += '<xf numFmtId=\"'+num+'\" fontId=\"'+(fontHas.indexOf(item.getHashFont()))+'\" fillId=\"0\" borderId=\"'+(borHas.indexOf(item.getHashBorder()))+'\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" ';\r\n\t\t\t\tif(item.isTrueAlignment()){\r\n\t\t\t\t\tfontXfStr += 'applyAlignment=\"1\"><alignment ';\r\n\t\t\t\t\tif(item.alignment.horizontal !== null) fontXfStr += 'horizontal=\"'+item.alignment.horizontal+'\" ';\r\n\t\t\t\t\tif(item.alignment.vertical !== null) fontXfStr += 'vertical=\"'+item.alignment.vertical+'\" ';\r\n\t\t\t\t\tif(item.alignment.wrapText !== null) fontXfStr += 'wrapText=\"1\" ';\r\n\t\t\t\t\tfontXfStr += '/>';\r\n\t\t\t\t}else{\r\n\t\t\t\t\tfontXfStr += '>';\r\n\t\t\t\t}\r\n\t\t\t\tfontXfStr += '</xf>';\r\n\t\t\t\tfontXfLen++;\r\n\t\t\t\tfontXfHas.push(item.getHash());\r\n\t\t\t}\r\n\t\t});\r\n\t\tfile += '<cellXfs count=\"'+fontXfLen+'\">' + fontXfStr + '</cellXfs>';\r\n\t\tthis.styleHash = fontXfHas;\r\n\t\tfile += '<cellStyles count=\"1\"><cellStyle name=\"Обычный\" xfId=\"0\" builtinId=\"0\" /></cellStyles><dxfs count=\"0\" />';\r\n\t\tfile += '</styleSheet>';\r\n\t\treturn file;\r\n\t}\r\n\t\r\n\treturnThemeOne(){\r\n\t\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"5B9BD5\"/></a:accent1><a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4><a:accent5><a:srgbClr val=\"4472C4\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink><a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Calibri Light\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"宋体\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Times New Roman\"/><a:font script=\"Hebr\" typeface=\"Times New Roman\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"MoolBoran\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Times New Roman\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"宋体\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Arial\"/><a:font script=\"Hebr\" typeface=\"Arial\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"DaunPenh\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Arial\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:satMod val=\"103000\"/><a:lumMod val=\"102000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"110000\"/><a:lumMod val=\"100000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\" algn=\"ctr\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"63000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"93000\"/><a:satMod val=\"150000\"/><a:shade val=\"98000\"/><a:lumMod val=\"102000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:tint val=\"98000\"/><a:satMod val=\"130000\"/><a:shade val=\"90000\"/><a:lumMod val=\"103000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"63000\"/><a:satMod val=\"120000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/></a:theme>`;\r\n\t}\r\n\r\n\tdownload(data, name){\r\n\t\tlet a = document.createElement(\"a\");\r\n\t\tvar byteCharacters = atob(data);\r\n\t\tvar byteArrays = [];\r\n\r\n\t\tfor (var offset = 0; offset < byteCharacters.length; offset += 512) {\r\n\t\t\tvar slice = byteCharacters.slice(offset, offset + 512);\r\n\r\n\t\t\tvar byteNumbers = new Array(slice.length);\r\n\t\t\tfor (var i = 0; i < slice.length; i++) {\r\n\t\t\t\tbyteNumbers[i] = slice.charCodeAt(i);\r\n\t\t\t}\r\n\t\t\r\n\t\t\tvar byteArray = new Uint8Array(byteNumbers);\r\n\t\t\r\n\t\t\tbyteArrays.push(byteArray);\r\n\t\t}\r\n\t\r\n\t\tvar file = new Blob(byteArrays, {type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"});\r\n\t\tlet url = URL.createObjectURL(file);\r\n\t\ta.href = url;\r\n\t\ta.download = name;\r\n\t\tdocument.body.appendChild(a);\r\n\t\ta.click();\r\n\t\tsetTimeout(function () {\r\n\t\t\tdocument.body.removeChild(a);\r\n\t\t\twindow.URL.revokeObjectURL(url);\r\n\t\t}, 0);\r\n\t}\r\n\t\r\n\tconstructor(workbook, name = \"file.xlsx\"){\r\n\t\tthis.sharedString = [];\r\n\r\n\t\tlet zip = new TSZip();\r\n\t\tzip.file(\"[Content_Types].xml\", this.createXMLContentTypes(workbook.getSheet().length));\r\n\t\tzip.folder(\"_rels\");\r\n\t\tzip.file(\"_rels/.rels\", this.returnRelsMain());\r\n\t\tzip.folder(\"docProps\");\r\n\t\tzip.file(\"docProps/app.xml\", this.createXMLApp(workbook.getNameSheet()));\r\n\t\tzip.file(\"docProps/core.xml\", this.createXMLCore(workbook.getAuthor()));\r\n\t\tzip.folder(\"xl\");\r\n\t\tzip.file(\"xl/workbook.xml\", this.createXMLWorkBook(workbook.getNameSheet()));\r\n\t\tzip.file(\"xl/styles.xml\", this.createStyle(workbook.getStyleList()));\r\n\t\tzip.folder(\"xl/worksheets\");\r\n\t\tworkbook.getSheet().forEach((sheet,i)=>{\r\n\t\t\tzip.file(\"xl/worksheets/sheet\"+(i+1)+\".xml\", this.createXMLShell(sheet, workbook.getStyleList()));\r\n\t\t});\r\n\t\tzip.file(\"xl/sharedStrings.xml\", this.createXMLSharedStrings());\r\n\t\tzip.folder(\"xl/_rels\");\r\n\t\tzip.file(\"xl/_rels/workbook.xml.rels\", this.createXMLRelsWorkBook(workbook.getSheet().length));\r\n\t\tzip.folder(\"xl/theme\");\r\n\t\tzip.file(\"xl/theme/theme1.xml\", this.returnThemeOne());\r\n\t\tvar content = zip.generate({type:\"base64\"});\r\n\t\tthis.download(content, name);\r\n\t}\r\n\r\n\t\r\n}\r\n\t\r\nfunction getDateW3CDTF(){\r\n\tconst d = new Date();\r\n\tconst year = d.getUTCFullYear();\r\n\tconst month = d.getUTCMonth() + 1;\r\n\tconst day = d.getUTCDate();\r\n\tconst hours = d.getUTCHours();\r\n\tconst minutes = d.getUTCMinutes();\r\n\tconst seconds = d.getUTCSeconds();\r\n\t\r\n\treturn year + '-' +\r\n\t\t\t(month > 9? month : '0' + month) + '-' +\r\n\t\t\t(day > 9? day : '0' + day) + 'T' +\r\n\t\t\t(hours > 9 ? hours : '0' + hours) + ':' +\r\n\t\t\t(minutes > 9? minutes : '0' + minutes) + ':' +\r\n\t\t\t(seconds > 9? seconds : '0' + seconds) + 'Z';\r\n}\r\n\r\nfunction numberToABC(number: number){\r\n\tconst abc = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];\r\n\tif (number <= 26) return abc[number-1];\r\n\tlet str = '';\r\n\twhile (number > 0){\r\n\t\tlet nppStr = (number%26) - 1;\r\n\t\tstr += abc[nppStr >= 0? nppStr : 25];\r\n\t\tnumber = Number.parseInt((number/26).toString());\r\n\t}\r\n\treturn str.split(\"\").reverse().join(\"\");\r\n}\r\n\r\nfunction cyrb53(str, seed = 0):number {\r\n\tlet h1 = 0xdeadbeef ^ seed,\r\n\t h2 = 0x41c6ce57 ^ seed;\r\n\tfor (let i = 0, ch; i < str.length; i++) {\r\n\t ch = str.charCodeAt(i);\r\n\t h1 = Math.imul(h1 ^ ch, 2654435761);\r\n\t h2 = Math.imul(h2 ^ ch, 1597334677);\r\n\t}\r\n\t\r\n\th1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\r\n\th2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\r\n\t\r\n\treturn 4294967296 * (2097151 & h2) + (h1 >>> 0);\r\n };\r\n","export function jsxToHtml(element: string): Promise<HTMLDivElement | null> {\r\n return new Promise((resolve) => {\r\n\r\n const container = document.createElement('div');\r\n\r\n container.innerHTML = element\r\n\r\n const allElements: HTMLElement[] = Array.from(container.querySelectorAll('table, span, br, p, h1, h2, h3, h4, h5'));\r\n\r\n if (allElements) {\r\n const divBlock = document.createElement('div')\r\n allElements.forEach(opt => {\r\n divBlock.appendChild(opt)\r\n })\r\n resolve(divBlock);\r\n } else {\r\n resolve(null);\r\n }\r\n\r\n\r\n // const container = document.createElement('div');\r\n // const root = ReactDOM.createRoot(container);\r\n // const observer = new MutationObserver((mutationsList) => {\r\n // for (const mutation of mutationsList) {\r\n // if (mutation.addedNodes.length) {\r\n // const allElements: HTMLElement[] = Array.from(container.querySelectorAll('table, span, br, p, h1, h2, h3, h4, h5'));\r\n // if (allElements) {\r\n // observer.disconnect(); // Отключаем наблюдателя\r\n //\r\n // const divBlock = document.createElement('div')\r\n // allElements.forEach(opt => {\r\n // divBlock.appendChild(opt)\r\n // })\r\n // resolve(divBlock);\r\n // }\r\n // }\r\n // }\r\n // });\r\n //\r\n // root.render(element);\r\n //\r\n // observer.observe(container, {childList: true, subtree: true});\r\n });\r\n}","import { XLSXUni } from \"./dop-function/export-excel/core\";\r\nimport { jsxToHtml } from \"./dop-function/jsxToHtml\";\r\n\r\nexport interface IfExportTableToExcel {\r\n tableId?: string,\r\n divId?: string,\r\n fileName: string,\r\n jsxElement?: string\r\n}\r\n\r\nconst fExportTableToExcel = async ({ tableId, fileName, jsxElement, divId }: IfExportTableToExcel) => {\r\n\r\n if (tableId !== undefined && jsxElement === undefined && divId === undefined) {\r\n\r\n const htmlTable = document.getElementById(tableId);\r\n if (htmlTable) {\r\n const container = document.createElement('div');\r\n const copiedElement = htmlTable.cloneNode(true); // Клонируем элемент\r\n container.appendChild(copiedElement); // Добавляем клонированный элемент в блок назначения\r\n\r\n const file: XLSXUni = XLSXUni.exportDOMToXLSX(container);\r\n file.save(`${fileName}.xlsx`);\r\n return true\r\n } else {\r\n return false\r\n }\r\n } else if (jsxElement !== undefined && divId === undefined && tableId === undefined) {\r\n\r\n let status: boolean = false\r\n\r\n await jsxToHtml(jsxElement).then((element) => {\r\n if (element !== null) {\r\n const file: XLSXUni = XLSXUni.exportDOMToXLSX(element);\r\n file.save(`${fileName}.xlsx`);\r\n status = true\r\n } else {\r\n status = false\r\n }\r\n });\r\n\r\n return status\r\n } else if (divId !== undefined && jsxElement === undefined && tableId === undefined) {\r\n\r\n const divBlock: HTMLElement | null = document.getElementById(divId);\r\n\r\n if (divBlock !== null) {\r\n\r\n const container = document.createElement('div');\r\n\r\n divBlock.querySelectorAll('span, p, br, table').forEach(opt => {\r\n const copiedElement = opt.cloneNode(true); // Клонируем элемент\r\n container.appendChild(copiedElement); // Добавляем клонированный элемент в блок назначения\r\n })\r\n\r\n const file: XLSXUni = XLSXUni.exportDOMToXLSX(container);\r\n\r\n file.save(`${fileName}.xlsx`);\r\n\r\n return true\r\n } else {\r\n return false\r\n }\r\n } else {\r\n return false\r\n }\r\n};\r\n\r\nexport default fExportTableToExcel\r\n","// Функция для получения значений и атрибутов ячеек\r\nexport function getCellData(cell: HTMLElement): { content: string, rowspan: number, colspan: number } {\r\n const content = cell.innerText.trim();\r\n const rowspan = cell.hasAttribute('rowspan') ? parseInt(cell.getAttribute('rowspan') || '1') : 1;\r\n const colspan = cell.hasAttribute('colspan') ? parseInt(cell.getAttribute('colspan') || '1') : 1;\r\n return {content, rowspan, colspan};\r\n}","export const createTagH1 = (text: string): string => {\r\n return `<w:p><w:pPr><w:pStyle w:val=\"a4\"/></w:pPr><w:r><w:t>${text}</w:t></w:r></w:p>`\r\n}\r\n\r\nexport const createTagH1ToH6 = (text: string): string => {\r\n return `<w:p><w:pPr><w:pStyle w:val=\"a6\"/></w:pPr><w:r><w:t>${text}</w:t></w:r></w:p>`\r\n}\r\n\r\nexport const createTagP = (text: string): string => {\r\n return `<w:p><w:pPr><w:ind w:firstLine=\"708\"/></w:pPr><w:r><w:t>${text}</w:t></w:r></w:p>`\r\n}\r\n\r\nexport const createStartSpan = (): string => {\r\n return `<w:p><w:pPr><w:ind w:firstLine=\"708\"/></w:pPr><w:r>`\r\n}\r\n\r\nexport const createEndSpan = () => {\r\n return `</w:r></w:p>`\r\n}\r\n\r\nexport const createTagSpan = (text: string) => {\r\n return `<w:t>${text}</w:t><w:t xml:space=\"preserve\"> </w:t>`\r\n}\r\n\r\nexport const createTagBr = () => {\r\n return `<w:p></w:p>`\r\n}\r\n\r\nexport const createTagTb = (table: string, rows: number, width: number): string => {\r\n\r\n const arr: string[] = ['<w:tblGrid>']\r\n\r\n for (let i = 0; i < rows; i++) {\r\n arr.push(`<w:gridCol w:w=\"${Math.floor(width/rows)}\"/>`)\r\n }\r\n\r\n arr.push('</w:tblGrid>')\r\n\r\n return `<w:tbl><w:tblPr><w:tblStyle w:val=\"a7\"/><w:tblW w:w=\"1\" w:type=\"auto\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"1\" w:lastRow=\"0\" w:firstColumn=\"1\" w:lastColumn=\"0\" w:noHBand=\"0\" w:noVBand=\"1\"/></w:tblPr>${arr.join('')}${table}</w:tbl>`\r\n}\r\n\r\nexport const createTagTbRow = (listCel: string) => {\r\n return `<w:tr>${listCel}</w:tr>`\r\n}\r\n\r\nconst addTextTbHead = (text: string | undefined,) => {\r\n let newText = ''\r\n\r\n if (text !== undefined) {\r\n newText = `<w:r><w:rPr><w:rFonts w:cs=\"Times New Roman\"/><w:b/><w:bCs/><w:color w:val=\"000000\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>${text}</w:t></w:r>`\r\n }\r\n\r\n return newText\r\n}\r\n\r\nconst addTextTbBody = (text: string | undefined,) => {\r\n let newText = ''\r\n\r\n if (text !== undefined) {\r\n newText = `<w:r><w:rPr><w:rFonts w:cs=\"Times New Roman\"/><w:color w:val=\"000000\"/><w:szCs w:val=\"28\"/></w:rPr><w:t>${text}</w:t></w:r>`\r\n }\r\n\r\n return newText\r\n}\r\n\r\nexport const createTagTbHeaderCell = (text?: string, rowSpan?: 'restart' | 'continue', colSpan?: number) => {\r\n return `<w:tc><w:tcPr><w:tcW w:w=\"1\" w:type=\"dxa\"/>${colSpan !== undefined ? `<w:gridSpan w:val=\"${colSpan}\"/>` : ''}${rowSpan !== undefined ? `<w:vMerge ${rowSpan === 'restart' ? 'w:val=\"restart\"' : 'w:val=\"continue\"'}/>` : ''}<w:vAlign w:val=\"center\"/></w:tcPr><w:p><w:pPr><w:ind w:firstLine=\"0\"/><w:jc w:val=\"center\"/><w:rPr><w:rFonts w:cs=\"Times New Roman\"/><w:b/><w:bCs/><w:color w:val=\"000000\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr>${addTextTbHead(text)}</w:p></w:tc>`\r\n}\r\n\r\nexport const createTagTbBodyCell = (text?: string, rowSpan?: 'restart' | 'continue', colSpan?: number) => {\r\n return `<w:tc><w:tcPr><w:tcW w:w=\"1\" w:type=\"dxa\"/>${colSpan !== undefined ? `<w:gridSpan w:val=\"${colSpan}\"/>` : ''}${rowSpan !== undefined ? `<w:vMerge ${rowSpan === 'restart' ? 'w:val=\"restart\"' : 'w:val=\"continue\"'}/>` : ''}<w:vAlign w:val=\"center\"/></w:tcPr><w:p><w:pPr><w:ind w:firstLine=\"0\"/><w:rPr><w:rFonts w:cs=\"Times New Roman\"/><w:color w:val=\"000000\"/><w:szCs w:val=\"28\"/></w:rPr></w:pPr>${addTextTbBody(text)}</w:p></w:tc>`\r\n}","import { getCellData } from \"../getCellData\";\r\nimport { createTagTbBodyCell, createTagTbHeaderCell, createTagTbRow } from \"../createXmlTags\";\r\n\r\nexport const createRow = (elTb: HTMLTableSectionElement): string => {\r\n\r\n const rows = Array.from(elTb.querySelectorAll('tr'));\r\n\r\n if (rows && rows.length > 0) {\r\n\r\n const listRow: { [key: number]: { [key: string]: string | null | undefined } } = {}\r\n\r\n let countCell = 0\r\n const defaultRow: { [key: number]: null } = {}\r\n\r\n const firstCell: HTMLTableCellElement[] = Array.from(rows[0].querySelectorAll('th, td'));\r\n\r\n if (firstCell && firstCell.length > 0) {\r\n\r\n firstCell.forEach((cell) => {\r\n const { colspan } = getCellData(cell);\r\n countCell += colspan\r\n })\r\n }\r\n\r\n for (let i = 0; i < countCell; i++) {\r\n defaultRow[i] = null\r\n }\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n listRow[i] = Object.assign({}, defaultRow)\r\n }\r\n\r\n const deleteCellFromRow: { [key: number]: number[] } = {}\r\n\r\n rows.forEach((row, iRow) => {\r\n\r\n const nullCell: number[] = []\r\n\r\n Object.values(listRow[iRow]).forEach((opt, index) => {\r\n if (opt === null) {\r\n nullCell.push(index)\r\n }\r\n })\r\n\r\n const cells: HTMLTableCellElement[] = Array.from(row.querySelectorAll('th, td'));\r\n\r\n let countEditCel = 0\r\n\r\n if (cells && cells.length > 0) {\r\n cells.forEach((cell) => {\r\n\r\n const { content, rowspan, colspan } = getCellData(cell);\r\n\r\n const listCellNull = nullCell.slice(countEditCel, countEditCel + colspan).reverse()\r\n let indexCellOnObj: number = 0\r\n\r\n listCellNull.map((nullCel, indexNullCel) => {\r\n if (indexNullCel === listCellNull.length - 1) {\r\n indexCellOnObj = nullCel\r\n } else {\r\n delete listRow[iRow][nullCel]\r\n }\r\n })\r\n\r\n if (rowspan > 1 && colspan < 2) {\r\n for (let i = 1; i < rowspan; i++) {\r\n if (cell.tagName === 'TH') {\r\n listRow[iRow + i][indexCellOnObj] = createTagTbHeaderCell(undefined, 'continue')\r\n } else if (cell.tagName === 'TD') {\r\n listRow[iRow + i][indexCellOnObj] = createTagTbBodyCell(undefined, 'continue')\r\n }\r\n\r\n }\r\n } else if (rowspan > 1 && colspan > 1) {\r\n for (let i = 1; i < rowspan; i++) {\r\n deleteCellFromRow[iRow + i] = []\r\n listCellNull.map((nullCel, indexNullCel) => {\r\n if (indexNullCel === listCellNull.length - 1) {\r\n if (cell.tagName === 'TH') {\r\n listRow[iRow + i][nullCel] = createTagTbHeaderCell(undefined, 'continue', colspan)\r\n } else if (cell.tagName === 'TD') {\r\n listRow[iRow + i][nullCel] = createTagTbBodyCell(undefined, 'continue', colspan)\r\n }\r\n } else {\r\n deleteCellFromRow[i].push(nullCel)\r\n listRow[iRow + i][nullCel] = undefined\r\n }\r\n })\r\n }\r\n }\r\n\r\n if (cell.tagName === 'TH') {\r\n listRow[iRow][indexCellOnObj] = createTagTbHeaderCell(content, rowspan > 1 ? 'restart' : undefined, colspan > 1 ? colspan : undefined)\r\n } else if (cell.tagName === 'TD') {\r\n listRow[iRow][indexCellOnObj] = createTagTbBodyCell(content, rowspan > 1 ? 'restart' : undefined, colspan > 1 ? colspan : undefined)\r\n }\r\n\r\n countEditCel += colspan\r\n })\r\n }\r\n })\r\n\r\n Object.entries(deleteCellFromRow).map(([key, value]) => {\r\n value.map(opt => {\r\n delete listRow[+key][opt]\r\n })\r\n })\r\n\r\n const render: string[] = []\r\n Object.values(listRow).forEach((opt) => {\r\n render.push(createTagTbRow(Object.values(opt).join('')))\r\n })\r\n\r\n return render.join('')\r\n } else {\r\n return ''\r\n }\r\n}","import { createRow } from \"./createRow\";\r\nimport { createTagTb } from \"../createXmlTags\";\r\nimport { getCellData } from \"../getCellData\";\r\n\r\nexport const convertHtmlTbToXml = (opt: Element, width: number) => {\r\n\r\n const thead = opt.querySelector('thead');\r\n const tbody = opt.querySelector('tbody');\r\n\r\n let theadXml = ''\r\n let tbodyXml = ''\r\n\r\n if (thead !== null) {\r\n theadXml = createRow(thead)\r\n }\r\n\r\n if (tbody !== null) {\r\n tbodyXml = createRow(tbody)\r\n }\r\n\r\n let countCell = 0\r\n\r\n if (thead !== null) {\r\n const rows = thead.querySelectorAll('tr')\r\n if (rows && rows.length > 0) {\r\n\r\n const listCell: any = rows[0].querySelectorAll('th, td')\r\n\r\n if (listCell && listCell.length > 0) {\r\n const firstCell: HTMLTableCellElement[] = Array.from(listCell);\r\n\r\n firstCell.forEach((cell) => {\r\n const { colspan } = getCellData(cell);\r\n countCell += colspan\r\n })\r\n }\r\n }\r\n } else if (tbody !== null) {\r\n const rows = tbody.querySelectorAll('tr')\r\n if (rows && rows.length > 0) {\r\n\r\n const listCell: any = rows[0].querySelectorAll('th, td')\r\n\r\n if (listCell && listCell.length > 0) {\r\n const firstCell: HTMLTableCellElement[] = Array.from(listCell);\r\n\r\n firstCell.forEach((cell) => {\r\n const { colspan } = getCellData(cell);\r\n countCell += colspan\r\n })\r\n }\r\n }\r\n }\r\n\r\n return createTagTb(theadXml + tbodyXml, countCell, width)\r\n\r\n}","export const contentTypes = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/><Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/><Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/><Override PartName=\"/word/webSettings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml\"/><Override PartName=\"/word/fontTable.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml\"/><Override PartName=\"/word/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/><Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/><Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/></Types>`\r\n}","export const rels = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/></Relationships>`\r\n}","export const app = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\"><Template>Normal.dotm</Template><TotalTime>2</TotalTime><Pages>1</Pages><Words>11</Words><Characters>66</Characters><Application>Microsoft Office Word</Application><DocSecurity>0</DocSecurity><Lines>1</Lines><Paragraphs>1</Paragraphs><ScaleCrop>false</ScaleCrop><Company></Company><LinksUpToDate>false</LinksUpToDate><CharactersWithSpaces>76</CharactersWithSpaces><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>16.0000</AppVersion></Properties>`\r\n}","export const documentXmlRels = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings\" Target=\"webSettings.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\"/><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/><Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/><Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\"/></Relationships>`\r\n}","export const fontTable = () => {\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:fonts xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\r\n xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\r\n xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\r\n xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\"\r\n xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"\r\n xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\"\r\n xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\"\r\n xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\"\r\n mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\">\r\n <w:font w:name=\"Times New Roman\">\r\n <w:panose1 w:val=\"02020603050405020304\"/>\r\n <w:charset w:val=\"CC\"/>\r\n <w:family w:val=\"roman\"/>\r\n <w:pitch w:val=\"variable\"/>\r\n <w:sig w:usb0=\"E0002EFF\" w:usb1=\"C000785B\" w:usb2=\"00000009\" w:usb3=\"00000000\" w:csb0=\"000001FF\"\r\n w:csb1=\"00000000\"/>\r\n </w:font>\r\n <w:font w:name=\"Calibri\">\r\n <w:panose1 w:val=\"020F0502020204030204\"/>\r\n <w:charset w:val=\"CC\"/>\r\n <w:family w:val=\"swiss\"/>\r\n <w:pitch w:val=\"variable\"/>\r\n <w:sig w:usb0=\"E4002EFF\" w:usb1=\"C000247B\" w:usb2=\"00000009\" w:usb3=\"00000000\" w:csb0=\"000001FF\"\r\n w:csb1=\"00000000\"/>\r\n </w:font>\r\n <w:font w:name=\"Times New Roman (Основной текст\">\r\n <w:altName w:val=\"Times New Roman\"/>\r\n <w:panose1 w:val=\"020B0604020202020204\"/>\r\n <w:charset w:val=\"00\"/>\r\n <w:family w:val=\"roman\"/>\r\n <w:notTrueType/>\r\n <w:pitch w:val=\"default\"/>\r\n </w:font>\r\n <w:font w:name=\"Calibri Light\">\r\n <w:panose1 w:val=\"020F0302020204030204\"/>\r\n <w:charset w:val=\"CC\"/>\r\n <w:family w:val=\"swiss\"/>\r\n <w:pitch w:val=\"variable\"/>\r\n <w:sig w:usb0=\"E4002EFF\" w:usb1=\"C000247B\" w:usb2=\"00000009\" w:usb3=\"00000000\" w:csb0=\"000001FF\"\r\n w:csb1=\"00000000\"/>\r\n </w:font>\r\n</w:fonts>`\r\n}","export const settings = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:settings xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\" xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\" xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\" xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\" xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\" xmlns:sl=\"http://schemas.openxmlformats.org/schemaLibrary/2006/main\" mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\"><w:zoom w:percent=\"160\"/><w:proofState w:spelling=\"clean\"/><w:defaultTabStop w:val=\"708\"/><w:drawingGridHorizontalSpacing w:val=\"120\"/><w:displayHorizontalDrawingGridEvery w:val=\"2\"/><w:displayVerticalDrawingGridEvery w:val=\"2\"/><w:characterSpacingControl w:val=\"doNotCompress\"/><w:compat><w:compatSetting w:name=\"compatibilityMode\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"15\"/><w:compatSetting w:name=\"overrideTableStyleFontSizeAndJustification\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"enableOpenTypeFeatures\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"doNotFlipMirrorIndents\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"differentiateMultirowTableHeaders\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"1\"/><w:compatSetting w:name=\"useWord2013TrackBottomHyphenation\" w:uri=\"http://schemas.microsoft.com/office/word\" w:val=\"0\"/></w:compat><w:rsids><w:rsidRoot w:val=\"0092750D\"/><w:rsid w:val=\"00180B28\"/><w:rsid w:val=\"00274130\"/><w:rsid w:val=\"002E4B92\"/><w:rsid w:val=\"005D448F\"/><w:rsid w:val=\"0064630D\"/><w:rsid w:val=\"0079781D\"/><w:rsid w:val=\"00843D5B\"/><w:rsid w:val=\"0092750D\"/><w:rsid w:val=\"00A35602\"/><w:rsid w:val=\"00A41BB6\"/><w:rsid w:val=\"00AB63E8\"/><w:rsid w:val=\"00B257F1\"/></w:rsids><m:mathPr><m:mathFont m:val=\"Cambria Math\"/><m:brkBin m:val=\"before\"/><m:brkBinSub m:val=\"--\"/><m:smallFrac m:val=\"0\"/><m:dispDef/><m:lMargin m:val=\"0\"/><m:rMargin m:val=\"0\"/><m:defJc m:val=\"centerGroup\"/><m:wrapIndent m:val=\"1440\"/><m:intLim m:val=\"subSup\"/><m:naryLim m:val=\"undOvr\"/></m:mathPr><w:themeFontLang w:val=\"ru-RU\"/><w:clrSchemeMapping w:bg1=\"light1\" w:t1=\"dark1\" w:bg2=\"light2\" w:t2=\"dark2\" w:accent1=\"accent1\" w:accent2=\"accent2\" w:accent3=\"accent3\" w:accent4=\"accent4\" w:accent5=\"accent5\" w:accent6=\"accent6\" w:hyperlink=\"hyperlink\" w:followedHyperlink=\"followedHyperlink\"/><w:decimalSymbol w:val=\",\"/><w:listSeparator w:val=\";\"/><w15:chartTrackingRefBased/><w15:docId w15:val=\"{8B742EB3-9A17-3442-B00E-554BC020C67C}\"/></w:settings>`\r\n}","export const document = (\r\n data: string,\r\n format: 'A4' | 'A3' | 'A2' | 'A1' = 'A4',\r\n orientation: 'landscape' | 'vertical' = 'vertical'\r\n) => {\r\n\r\n let width = 11906\r\n let height = 16838\r\n let top = 1134\r\n let right = 567\r\n let bottom = 1134\r\n let left = 1701\r\n const header = 709\r\n const footer = 709\r\n\r\n switch (format) {\r\n\r\n case \"A4\":\r\n width = orientation === 'landscape' ? 16838 : 11906\r\n height = orientation === 'landscape' ? 11906 : 16838\r\n top = orientation === 'landscape' ? 1134 : 1134\r\n right = orientation === 'landscape' ? 851 : 567\r\n bottom = orientation === 'landscape' ? 1418 : 1134\r\n left = orientation === 'landscape' ? 1701 : 1701\r\n break;\r\n case \"A3\":\r\n width = orientation === 'landscape' ? 23803 : 16817\r\n height = orientation === 'landscape' ? 16817 : 23803\r\n top = orientation === 'landscape' ? 1134 : 1134\r\n right = orientation === 'landscape' ? 851 : 851\r\n bottom = orientation === 'landscape' ? 1134 : 1134\r\n left = orientation === 'landscape' ? 1418 : 1418\r\n break;\r\n case \"A2\":\r\n width = orientation === 'landscape' ? 31678 : 23803\r\n height = orientation === 'landscape' ? 23803 : 31678\r\n top = orientation === 'landscape' ? 1418 : 1418\r\n right = orientation === 'landscape' ? 1134 : 1134\r\n bottom = orientation === 'landscape' ? 1418 : 1418\r\n left = orientation === 'landscape' ? 1701 : 1701\r\n break;\r\n case \"A1\":\r\n width = orientation === 'landscape' ? 31678 : 31678\r\n height = orientation === 'landscape' ? 31678 : 31678\r\n top = orientation === 'landscape' ? 1701 : 1701\r\n right = orientation === 'landscape' ? 1701 : 1701\r\n bottom = orientation === 'landscape' ? 1985 : 1985\r\n left = orientation === 'landscape' ? 2268 : 2268\r\n break;\r\n\r\n }\r\n\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:document xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:cx=\"http://schemas.microsoft.com/office/drawing/2014/chartex\" xmlns:cx1=\"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex\" xmlns:cx2=\"http://schemas.microsoft.com/office/drawing/2015/10/21/chartex\" xmlns:cx3=\"http://schemas.microsoft.com/office/drawing/2016/5/9/chartex\" xmlns:cx4=\"http://schemas.microsoft.com/office/drawing/2016/5/10/chartex\" xmlns:cx5=\"http://schemas.microsoft.com/office/drawing/2016/5/11/chartex\" xmlns:cx6=\"http://schemas.microsoft.com/office/drawing/2016/5/12/chartex\" xmlns:cx7=\"http://schemas.microsoft.com/office/drawing/2016/5/13/chartex\" xmlns:cx8=\"http://schemas.microsoft.com/office/drawing/2016/5/14/chartex\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:aink=\"http://schemas.microsoft.com/office/drawing/2016/ink\" xmlns:am3d=\"http://schemas.microsoft.com/office/drawing/2017/model3d\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:oel=\"http://schemas.microsoft.com/office/2019/extlst\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\" xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\" xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\" xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\" xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh wp14\"><w:body>${data}<w:sectPr><w:pgSz w:w=\"${width}\" w:h=\"${height}\" w:orient=\"${orientation}\"/><w:pgMar w:top=\"${top}\" w:right=\"${right}\" w:bottom=\"${bottom}\" w:left=\"${left}\" w:header=\"${header}\" w:footer=\"${footer}\" w:gutter=\"0\"/><w:cols w:space=\"708\"/><w:docGrid w:linePitch=\"360\"/></w:sectPr></w:body></w:document>`\r\n}","export const styles = () => {\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:styles xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\r\n xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\r\n xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\r\n xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\"\r\n xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"\r\n xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\"\r\n xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\"\r\n xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\"\r\n mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\">\r\n <w:docDefaults>\r\n <w:rPrDefault>\r\n <w:rPr>\r\n <w:rFonts w:ascii=\"Times New Roman\" w:eastAsiaTheme=\"minorHAnsi\" w:hAnsi=\"Times New Roman\"\r\n w:cs=\"Times New Roman (Основной текст\"/>\r\n <w:color w:val=\"000000\" w:themeColor=\"text1\"/>\r\n <w:kern w:val=\"2\"/>\r\n <w:sz w:val=\"28\"/>\r\n <w:szCs w:val=\"24\"/>\r\n <w:lang w:val=\"ru-RU\" w:eastAsia=\"en-US\" w:bidi=\"ar-SA\"/>\r\n <w14:ligatures w14:val=\"standardContextual\"/>\r\n </w:rPr>\r\n </w:rPrDefault>\r\n <w:pPrDefault>\r\n <w:pPr>\r\n <w:spacing w:line=\"360\" w:lineRule=\"auto\"/>\r\n <w:ind w:firstLine=\"709\"/>\r\n <w:jc w:val=\"both\"/>\r\n </w:pPr>\r\n </w:pPrDefault>\r\n </w:docDefaults>\r\n <w:latentStyles w:defLockedState=\"0\" w:defUIPriority=\"99\" w:defSemiHidden=\"0\" w:defUnhideWhenUsed=\"0\"\r\n w:defQFormat=\"0\" w:count=\"376\">\r\n <w:lsdException w:name=\"Normal\" w:uiPriority=\"0\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 1\" w:uiPriority=\"9\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 2\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 3\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 4\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 5\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 6\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 7\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 8\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"heading 9\" w:semiHidden=\"1\" w:uiPriority=\"9\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"index 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 6\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 7\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 8\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index 9\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 1\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 2\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 3\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 4\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 5\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 6\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 7\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 8\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toc 9\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Normal Indent\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"footnote text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"annotation text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"header\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"footer\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"index heading\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"caption\" w:semiHidden=\"1\" w:uiPriority=\"35\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"table of figures\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"envelope address\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"envelope return\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"footnote reference\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"annotation reference\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"line number\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"page number\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"endnote reference\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"endnote text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"table of authorities\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"macro\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"toa heading\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Bullet 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Number 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Title\" w:uiPriority=\"10\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Closing\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Signature\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Default Paragraph Font\" w:semiHidden=\"1\" w:uiPriority=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text Indent\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"List Continue 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Message Header\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Subtitle\" w:uiPriority=\"11\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Salutation\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Date\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text First Indent\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text First Indent 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Note Heading\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text Indent 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Body Text Indent 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Block Text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Hyperlink\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"FollowedHyperlink\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Strong\" w:uiPriority=\"22\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Emphasis\" w:uiPriority=\"20\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Document Map\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Plain Text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"E-mail Signature\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Top of Form\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Bottom of Form\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Normal (Web)\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Acronym\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Address\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Cite\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Code\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Definition\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Keyboard\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Preformatted\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Sample\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Typewriter\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"HTML Variable\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Normal Table\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"annotation subject\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"No List\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Outline List 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Outline List 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Outline List 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Simple 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Simple 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Simple 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Classic 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Classic 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Classic 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Classic 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Colorful 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Colorful 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Colorful 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Columns 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 6\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 7\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid 8\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 4\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 5\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 6\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 7\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table List 8\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table 3D effects 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table 3D effects 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table 3D effects 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Contemporary\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Elegant\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Professional\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Subtle 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Subtle 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Web 1\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Web 2\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Web 3\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Balloon Text\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Table Grid\" w:uiPriority=\"39\"/>\r\n <w:lsdException w:name=\"Table Theme\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Placeholder Text\" w:semiHidden=\"1\"/>\r\n <w:lsdException w:name=\"No Spacing\" w:uiPriority=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Light Shading\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 1\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 1\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 1\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 1\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 1\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 1\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Revision\" w:semiHidden=\"1\"/>\r\n <w:lsdException w:name=\"List Paragraph\" w:uiPriority=\"34\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Quote\" w:uiPriority=\"29\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Intense Quote\" w:uiPriority=\"30\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 1\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 1\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 1\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 1\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 1\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 1\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 1\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 1\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 2\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 2\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 2\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 2\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 2\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 2\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 2\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 2\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 2\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 2\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 2\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 2\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 2\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 2\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 3\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 3\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 3\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 3\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 3\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 3\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 3\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 3\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 3\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 3\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 3\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 3\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 3\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 3\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 4\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 4\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 4\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 4\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 4\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 4\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 4\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 4\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 4\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 4\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 4\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 4\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 4\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 4\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 5\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 5\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 5\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 5\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 5\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 5\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 5\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 5\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 5\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 5\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 5\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 5\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 5\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 5\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Light Shading Accent 6\" w:uiPriority=\"60\"/>\r\n <w:lsdException w:name=\"Light List Accent 6\" w:uiPriority=\"61\"/>\r\n <w:lsdException w:name=\"Light Grid Accent 6\" w:uiPriority=\"62\"/>\r\n <w:lsdException w:name=\"Medium Shading 1 Accent 6\" w:uiPriority=\"63\"/>\r\n <w:lsdException w:name=\"Medium Shading 2 Accent 6\" w:uiPriority=\"64\"/>\r\n <w:lsdException w:name=\"Medium List 1 Accent 6\" w:uiPriority=\"65\"/>\r\n <w:lsdException w:name=\"Medium List 2 Accent 6\" w:uiPriority=\"66\"/>\r\n <w:lsdException w:name=\"Medium Grid 1 Accent 6\" w:uiPriority=\"67\"/>\r\n <w:lsdException w:name=\"Medium Grid 2 Accent 6\" w:uiPriority=\"68\"/>\r\n <w:lsdException w:name=\"Medium Grid 3 Accent 6\" w:uiPriority=\"69\"/>\r\n <w:lsdException w:name=\"Dark List Accent 6\" w:uiPriority=\"70\"/>\r\n <w:lsdException w:name=\"Colorful Shading Accent 6\" w:uiPriority=\"71\"/>\r\n <w:lsdException w:name=\"Colorful List Accent 6\" w:uiPriority=\"72\"/>\r\n <w:lsdException w:name=\"Colorful Grid Accent 6\" w:uiPriority=\"73\"/>\r\n <w:lsdException w:name=\"Subtle Emphasis\" w:uiPriority=\"19\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Intense Emphasis\" w:uiPriority=\"21\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Subtle Reference\" w:uiPriority=\"31\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Intense Reference\" w:uiPriority=\"32\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Book Title\" w:uiPriority=\"33\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Bibliography\" w:semiHidden=\"1\" w:uiPriority=\"37\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"TOC Heading\" w:semiHidden=\"1\" w:uiPriority=\"39\" w:unhideWhenUsed=\"1\" w:qFormat=\"1\"/>\r\n <w:lsdException w:name=\"Plain Table 1\" w:uiPriority=\"41\"/>\r\n <w:lsdException w:name=\"Plain Table 2\" w:uiPriority=\"42\"/>\r\n <w:lsdException w:name=\"Plain Table 3\" w:uiPriority=\"43\"/>\r\n <w:lsdException w:name=\"Plain Table 4\" w:uiPriority=\"44\"/>\r\n <w:lsdException w:name=\"Plain Table 5\" w:uiPriority=\"45\"/>\r\n <w:lsdException w:name=\"Grid Table Light\" w:uiPriority=\"40\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 1\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 1\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 1\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 1\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 1\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 1\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 1\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 2\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 2\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 2\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 2\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 2\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 2\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 2\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 3\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 3\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 3\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 3\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 3\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 3\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 3\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 4\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 4\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 4\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 4\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 4\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 4\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 4\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 5\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 5\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 5\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 5\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 5\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 5\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 5\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Grid Table 1 Light Accent 6\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"Grid Table 2 Accent 6\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"Grid Table 3 Accent 6\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"Grid Table 4 Accent 6\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"Grid Table 5 Dark Accent 6\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"Grid Table 6 Colorful Accent 6\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"Grid Table 7 Colorful Accent 6\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 1\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 1\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 1\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 1\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 1\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 1\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 1\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 2\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 2\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 2\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 2\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 2\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 2\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 2\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 3\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 3\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 3\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 3\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 3\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 3\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 3\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 4\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 4\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 4\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 4\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 4\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 4\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 4\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 5\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 5\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 5\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 5\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 5\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 5\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 5\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"List Table 1 Light Accent 6\" w:uiPriority=\"46\"/>\r\n <w:lsdException w:name=\"List Table 2 Accent 6\" w:uiPriority=\"47\"/>\r\n <w:lsdException w:name=\"List Table 3 Accent 6\" w:uiPriority=\"48\"/>\r\n <w:lsdException w:name=\"List Table 4 Accent 6\" w:uiPriority=\"49\"/>\r\n <w:lsdException w:name=\"List Table 5 Dark Accent 6\" w:uiPriority=\"50\"/>\r\n <w:lsdException w:name=\"List Table 6 Colorful Accent 6\" w:uiPriority=\"51\"/>\r\n <w:lsdException w:name=\"List Table 7 Colorful Accent 6\" w:uiPriority=\"52\"/>\r\n <w:lsdException w:name=\"Mention\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Smart Hyperlink\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Hashtag\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Unresolved Mention\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n <w:lsdException w:name=\"Smart Link\" w:semiHidden=\"1\" w:unhideWhenUsed=\"1\"/>\r\n </w:latentStyles>\r\n <w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"a\">\r\n <w:name w:val=\"Normal\"/>\r\n <w:qFormat/>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"1\">\r\n <w:name w:val=\"heading 1\"/>\r\n <w:aliases w:val=\"Заголовок 1 ГОСТ\"/>\r\n <w:basedOn w:val=\"a\"/>\r\n <w:next w:val=\"a\"/>\r\n <w:link w:val=\"10\"/>\r\n <w:autoRedefine/>\r\n <w:uiPriority w:val=\"9\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"002E4B92\"/>\r\n <w:pPr>\r\n <w:keepNext/>\r\n <w:keepLines/>\r\n <w:spacing w:before=\"240\" w:after=\"240\"/>\r\n <w:jc w:val=\"center\"/>\r\n <w:outlineLvl w:val=\"0\"/>\r\n </w:pPr>\r\n <w:rPr>\r\n <w:rFonts w:eastAsiaTheme=\"majorEastAsia\" w:cstheme=\"majorBidi\"/>\r\n <w:b/>\r\n <w:szCs w:val=\"32\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"character\" w:default=\"1\" w:styleId=\"a0\">\r\n <w:name w:val=\"Default Paragraph Font\"/>\r\n <w:uiPriority w:val=\"1\"/>\r\n <w:semiHidden/>\r\n <w:unhideWhenUsed/>\r\n </w:style>\r\n <w:style w:type=\"table\" w:default=\"1\" w:styleId=\"a1\">\r\n <w:name w:val=\"Normal Table\"/>\r\n <w:uiPriority w:val=\"99\"/>\r\n <w:semiHidden/>\r\n <w:unhideWhenUsed/>\r\n <w:tblPr>\r\n <w:tblInd w:w=\"0\" w:type=\"dxa\"/>\r\n <w:tblCellMar>\r\n <w:top w:w=\"0\" w:type=\"dxa\"/>\r\n <w:left w:w=\"108\" w:type=\"dxa\"/>\r\n <w:bottom w:w=\"0\" w:type=\"dxa\"/>\r\n <w:right w:w=\"108\" w:type=\"dxa\"/>\r\n </w:tblCellMar>\r\n </w:tblPr>\r\n </w:style>\r\n <w:style w:type=\"numbering\" w:default=\"1\" w:styleId=\"a2\">\r\n <w:name w:val=\"No List\"/>\r\n <w:uiPriority w:val=\"99\"/>\r\n <w:semiHidden/>\r\n <w:unhideWhenUsed/>\r\n </w:style>\r\n <w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"10\">\r\n <w:name w:val=\"Заголовок 1 Знак\"/>\r\n <w:aliases w:val=\"Заголовок 1 ГОСТ Знак\"/>\r\n <w:basedOn w:val=\"a0\"/>\r\n <w:link w:val=\"1\"/>\r\n <w:uiPriority w:val=\"9\"/>\r\n <w:rsid w:val=\"002E4B92\"/>\r\n <w:rPr>\r\n <w:rFonts w:eastAsiaTheme=\"majorEastAsia\" w:cstheme=\"majorBidi\"/>\r\n <w:b/>\r\n <w:szCs w:val=\"32\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"a3\">\r\n <w:name w:val=\"ГОСТ\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"00A41BB6\"/>\r\n <w:pPr>\r\n <w:spacing w:before=\"240\" w:after=\"240\"/>\r\n <w:ind w:firstLine=\"0\"/>\r\n <w:jc w:val=\"center\"/>\r\n </w:pPr>\r\n <w:rPr>\r\n <w:rFonts w:cs=\"Times New Roman\"/>\r\n <w:b/>\r\n <w:bCs/>\r\n <w:color w:val=\"auto\"/>\r\n <w:kern w:val=\"0\"/>\r\n <w:szCs w:val=\"28\"/>\r\n <w14:ligatures w14:val=\"none\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"a4\">\r\n <w:name w:val=\"ГОСТ Заголовок или подзаголовок\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"00A41BB6\"/>\r\n <w:pPr>\r\n <w:spacing w:before=\"240\" w:after=\"400\"/>\r\n <w:ind w:firstLine=\"0\"/>\r\n <w:jc w:val=\"center\"/>\r\n </w:pPr>\r\n <w:rPr>\r\n <w:rFonts w:cs=\"Times New Roman\"/>\r\n <w:b/>\r\n <w:bCs/>\r\n <w:kern w:val=\"0\"/>\r\n <w:szCs w:val=\"28\"/>\r\n <w14:ligatures w14:val=\"none\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"a5\">\r\n <w:name w:val=\"ГОСТ Заголовок\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"00A41BB6\"/>\r\n <w:pPr>\r\n <w:spacing w:before=\"240\" w:after=\"400\"/>\r\n <w:ind w:firstLine=\"0\"/>\r\n <w:jc w:val=\"center\"/>\r\n </w:pPr>\r\n <w:rPr>\r\n <w:rFonts w:cs=\"Times New Roman\"/>\r\n <w:b/>\r\n <w:bCs/>\r\n <w:kern w:val=\"0\"/>\r\n <w:szCs w:val=\"28\"/>\r\n <w14:ligatures w14:val=\"none\"/>\r\n </w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:customStyle=\"1\" w:styleId=\"a6\">\r\n <w:name w:val=\"ГОСТ Подзаголовок\"/>\r\n <w:basedOn w:val=\"a5\"/>\r\n <w:qFormat/>\r\n <w:rsid w:val=\"00A41BB6\"/>\r\n <w:pPr>\r\n <w:spacing w:after=\"240\"/>\r\n <w:ind w:firstLine=\"709\"/>\r\n <w:jc w:val=\"both\"/>\r\n </w:pPr>\r\n </w:style>\r\n <w:style w:type=\"table\" w:styleId=\"a7\">\r\n <w:name w:val=\"Table Grid\"/>\r\n <w:basedOn w:val=\"a1\"/>\r\n <w:uiPriority w:val=\"39\"/>\r\n <w:rsid w:val=\"0092750D\"/>\r\n <w:pPr>\r\n <w:spacing w:line=\"240\" w:lineRule=\"auto\"/>\r\n </w:pPr>\r\n <w:tblPr>\r\n <w:tblBorders>\r\n <w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n </w:tblBorders>\r\n </w:tblPr>\r\n </w:style>\r\n</w:styles>`\r\n}","export const theme1 = () => {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Тема Office\"><a:themeElements><a:clrScheme name=\"Стандартная\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"4472C4\"/></a:accent1><a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4><a:accent5><a:srgbClr val=\"5B9BD5\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink><a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Стандартная\"><a:majorFont><a:latin typeface=\"Calibri Light\" panose=\"020F0302020204030204\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"游ゴシック Light\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"等线 Light\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Times New Roman\"/><a:font script=\"Hebr\" typeface=\"Times New Roman\"/><a:font script=\"Thai\" typeface=\"Angsana New\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"MoolBoran\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Times New Roman\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/><a:font script=\"Armn\" typeface=\"Arial\"/><a:font script=\"Bugi\" typeface=\"Leelawadee UI\"/><a:font script=\"Bopo\" typeface=\"Microsoft JhengHei\"/><a:font script=\"Java\" typeface=\"Javanese Text\"/><a:font script=\"Lisu\" typeface=\"Segoe UI\"/><a:font script=\"Mymr\" typeface=\"Myanmar Text\"/><a:font script=\"Nkoo\" typeface=\"Ebrima\"/><a:font script=\"Olck\" typeface=\"Nirmala UI\"/><a:font script=\"Osma\" typeface=\"Ebrima\"/><a:font script=\"Phag\" typeface=\"Phagspa\"/><a:font script=\"Syrn\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syrj\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syre\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Sora\" typeface=\"Nirmala UI\"/><a:font script=\"Tale\" typeface=\"Microsoft Tai Le\"/><a:font script=\"Talu\" typeface=\"Microsoft New Tai Lue\"/><a:font script=\"Tfng\" typeface=\"Ebrima\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\" panose=\"020F0502020204030204\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"游明朝\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"等线\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Arial\"/><a:font script=\"Hebr\" typeface=\"Arial\"/><a:font script=\"Thai\" typeface=\"Cordia New\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"DaunPenh\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Arial\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/><a:font script=\"Armn\" typeface=\"Arial\"/><a:font script=\"Bugi\" typeface=\"Leelawadee UI\"/><a:font script=\"Bopo\" typeface=\"Microsoft JhengHei\"/><a:font script=\"Java\" typeface=\"Javanese Text\"/><a:font script=\"Lisu\" typeface=\"Segoe UI\"/><a:font script=\"Mymr\" typeface=\"Myanmar Text\"/><a:font script=\"Nkoo\" typeface=\"Ebrima\"/><a:font script=\"Olck\" typeface=\"Nirmala UI\"/><a:font script=\"Osma\" typeface=\"Ebrima\"/><a:font script=\"Phag\" typeface=\"Phagspa\"/><a:font script=\"Syrn\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syrj\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syre\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Sora\" typeface=\"Nirmala UI\"/><a:font script=\"Tale\" typeface=\"Microsoft Tai Le\"/><a:font script=\"Talu\" typeface=\"Microsoft New Tai Lue\"/><a:font script=\"Tfng\" typeface=\"Ebrima\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Стандартная\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:satMod val=\"103000\"/><a:lumMod val=\"102000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"110000\"/><a:lumMod val=\"100000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\" algn=\"ctr\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"63000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"93000\"/><a:satMod val=\"150000\"/><a:shade val=\"98000\"/><a:lumMod val=\"102000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:tint val=\"98000\"/><a:satMod val=\"130000\"/><a:shade val=\"90000\"/><a:lumMod val=\"103000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"63000\"/><a:satMod val=\"120000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/><a:extLst><a:ext uri=\"{05A4C25C-085E-4340-85A3-A5531E510DB2}\"><thm15:themeFamily xmlns:thm15=\"http://schemas.microsoft.com/office/thememl/2012/main\" name=\"Office Theme\" id=\"{62F939B6-93AF-4DB8-9C6B-D6C7DFDC589F}\" vid=\"{4A3C46E8-61CC-4603-A589-7422A47A8E4A}\"/></a:ext></a:extLst></a:theme>`\r\n}","export const webSettings = () => {\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:webSettings xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\r\n xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\r\n xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\r\n xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\"\r\n xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"\r\n xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\"\r\n xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\"\r\n xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\"\r\n mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\">\r\n <w:optimizeForBrowser/>\r\n <w:allowPNG/>\r\n</w:webSettings>`\r\n}","import {contentTypes} from \"../xml-confs/contentTypes\";\r\nimport {rels} from \"../xml-confs/_rels/rels\";\r\nimport {app} from \"../xml-confs/docProps/app\";\r\nimport {documentXmlRels} from \"../xml-confs/word/_rels/documentXmlRels\";\r\nimport {fontTable} from \"../xml-confs/word/fontTable\";\r\nimport {settings} from \"../xml-confs/word/settings\";\r\nimport {document as createDocumentFile} from \"../xml-confs/word/document\";\r\nimport {styles} from \"../xml-confs/word/styles\";\r\nimport {theme1} from \"../xml-confs/word/theme/theme1\";\r\nimport {webSettings} from \"../xml-confs/word/webSettings\";\r\nimport JSZip from \"jszip\";\r\n\r\n\r\ninterface IProps {\r\n data: string,\r\n format?: 'A4' | 'A3' | 'A2' | 'A1',\r\n orientation?: 'landscape' | 'vertical',\r\n fileName: string\r\n}\r\n\r\nexport async function generateDocx({data, format, orientation, fileName}: IProps) {\r\n\r\n const zip = new JSZip();\r\n\r\n // [Content_Types].xml\r\n zip.file('[Content_Types].xml', contentTypes());\r\n\r\n // _rels/.rels\r\n zip.file('_rels/.rels', rels());\r\n\r\n // docProps/app.xml\r\n zip.file('docProps/app.xml', app());\r\n\r\n // word/_rels/document.xml.rels\r\n zip.file('word/_rels/document.xml.rels', documentXmlRels());\r\n\r\n // word/document.xml\r\n zip.file('word/document.xml', createDocumentFile(data, format, orientation))\r\n\r\n // word/fontTable.xml\r\n zip.file('word/fontTable.xml', fontTable())\r\n\r\n // word/settings.xml\r\n zip.file('word/settings.xml', settings());\r\n\r\n // word/styles.xml\r\n zip.file('word/styles.xml', styles());\r\n\r\n // word/theme/theme1.xml\r\n zip.file('word/theme/theme1.xml', theme1());\r\n\r\n // word/webSettings.xml\r\n zip.file('word/webSettings.xml', webSettings());\r\n\r\n // Создаем архив\r\n const content = await zip.generateAsync({type: 'blob'});\r\n\r\n const downloadUrl = window.URL.createObjectURL(new Blob([content]));\r\n const link = document.createElement('a');\r\n link.href = downloadUrl;\r\n link.setAttribute('download', fileName + '.docx'); // Установка имени файла\r\n\r\n // Эмуляция клика на ссылку\r\n document.body.appendChild(link);\r\n link.click();\r\n\r\n // Удаление ссылки после скачивания файла\r\n document.body.removeChild(link);\r\n}","import {\r\n createEndSpan,\r\n createStartSpan,\r\n createTagBr,\r\n createTagH1,\r\n createTagH1ToH6,\r\n createTagP,\r\n createTagSpan\r\n} from \"../createXmlTags\";\r\nimport { convertHtmlTbToXml } from \"./convertHtmlTbToXml\";\r\n\r\nexport const convertJsxElementToXml = (el: HTMLDivElement | HTMLElement, width: number) => {\r\n\r\n let listXmlStr: string[] = []\r\n\r\n const arr = el.querySelectorAll('h1, h2, h3, h4, h5, h6, p, span, br, table')\r\n\r\n if (arr && arr.length > 0) {\r\n let span = ''\r\n arr.forEach((opt, index) => {\r\n if (opt.textContent !== null) {\r\n if (opt.tagName === 'H1') {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(createTagH1(opt.textContent))\r\n } else {\r\n listXmlStr.push(createTagH1(opt.textContent))\r\n }\r\n } else if (opt.tagName === 'H2' || opt.tagName === 'H3' || opt.tagName === 'H4' || opt.tagName === 'H5' || opt.tagName === 'H6') {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(createTagH1ToH6(opt.textContent))\r\n } else {\r\n listXmlStr.push(createTagH1ToH6(opt.textContent))\r\n }\r\n } else if (opt.tagName === 'P') {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(createTagP(opt.textContent))\r\n } else {\r\n listXmlStr.push(createTagP(opt.textContent))\r\n }\r\n } else if (opt.tagName === 'SPAN') {\r\n if (span === '') {\r\n span = createStartSpan()\r\n span += createTagSpan(opt.textContent)\r\n } else {\r\n span += createTagSpan(opt.textContent)\r\n }\r\n if (arr.length === index + 1) {\r\n listXmlStr.push(span += createEndSpan())\r\n }\r\n } else if (opt.tagName === 'BR') {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(createTagBr())\r\n } else {\r\n listXmlStr.push(createTagBr())\r\n }\r\n } else if (opt.tagName === \"TABLE\") {\r\n if (span !== '') {\r\n listXmlStr.push(span += createEndSpan())\r\n span = ''\r\n listXmlStr.push(convertHtmlTbToXml(opt, width))\r\n } else {\r\n listXmlStr.push(convertHtmlTbToXml(opt, width))\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n return listXmlStr.join('')\r\n}","export function jsxToHtml(element: string): Promise<HTMLDivElement | null> {\r\n return new Promise((resolve) => {\r\n\r\n const container = document.createElement('div');\r\n\r\n container.innerHTML = element\r\n\r\n const allElements: HTMLElement[] = Array.from(container.querySelectorAll('h1, h2, h3, h4, h5, h6, p, span, br, table'));\r\n\r\n if (allElements && allElements.length > 0) {\r\n const divBlock = document.createElement('div')\r\n allElements.forEach(opt => {\r\n divBlock.appendChild(opt)\r\n })\r\n resolve(divBlock);\r\n } else {\r\n resolve(null);\r\n }\r\n\r\n\r\n // const container = document.createElement('div');\r\n // const root = ReactDOM.createRoot(container);\r\n // const observer = new MutationObserver((mutationsList) => {\r\n // for (const mutation of mutationsList) {\r\n // if (mutation.addedNodes.length) {\r\n // const allElements: HTMLElement[] = Array.from(container.querySelectorAll('h1, h2, h3, h4, h5, h6, p, span, br, table'));\r\n // if (allElements) {\r\n // observer.disconnect(); // Отключаем наблюдателя\r\n //\r\n // const divBlock = document.createElement('div')\r\n // allElements.forEach(opt => {\r\n // divBlock.appendChild(opt)\r\n // })\r\n // resolve(divBlock);\r\n // }\r\n // }\r\n // }\r\n // });\r\n //\r\n // root.render(element);\r\n //\r\n // observer.observe(container, {childList: true, subtree: true});\r\n });\r\n}","import { convertHtmlTbToXml } from \"./functions/convertHtmlToXml/convertHtmlTbToXml\";\r\nimport { generateDocx } from \"./functions/generateDocx\";\r\nimport { convertJsxElementToXml } from \"./functions/convertHtmlToXml/convertJsxElementToXml\";\r\nimport { jsxToHtml } from \"./functions/jsxToHtml\";\r\n\r\nexport interface IfExportHtmlOrJsxToWord {\r\n tableId?: string,\r\n divId?: string,\r\n fileName: string,\r\n jsxElement?: string,\r\n format?: 'A4' | 'A3' | 'A2' | 'A1',\r\n orientation?: 'landscape' | 'vertical'\r\n}\r\n\r\nexport const fExportHtmlOrJsxToWord = async ({\r\n tableId,\r\n fileName,\r\n jsxElement,\r\n format = \"A4\",\r\n orientation = 'vertical',\r\n divId\r\n}: IfExportHtmlOrJsxToWord) => {\r\n\r\n let width = 0\r\n\r\n switch (format) {\r\n\r\n case \"A4\":\r\n width = (orientation === 'landscape' ? 16838 : 11906) - (orientation === 'landscape' ? 851 : 567) - (orientation === 'landscape' ? 1701 : 1701)\r\n break;\r\n case \"A3\":\r\n width = (orientation === 'landscape' ? 23803 : 16817) - (orientation === 'landscape' ? 851 : 851) - (orientation === 'landscape' ? 1418 : 1418)\r\n break;\r\n case \"A2\":\r\n width = (orientation === 'landscape' ? 31678 : 23803) - (orientation === 'landscape' ? 1134 : 1134) - (orientation === 'landscape' ? 1701 : 1701)\r\n break;\r\n case \"A1\":\r\n width = (orientation === 'landscape' ? 31678 : 31678) - (orientation === 'landscape' ? 1701 : 1701) - (orientation === 'landscape' ? 2268 : 2268)\r\n break;\r\n }\r\n\r\n if (tableId !== undefined && jsxElement === undefined && divId === undefined) {\r\n const htmlTable = document.getElementById(tableId);\r\n if (htmlTable) {\r\n const stringTb = convertHtmlTbToXml(htmlTable, width)\r\n await generateDocx({ data: stringTb, format: format, orientation: orientation, fileName: fileName })\r\n return true\r\n } else {\r\n return false\r\n }\r\n } else if (jsxElement !== undefined && divId === undefined && tableId === undefined) {\r\n\r\n let status: boolean = false\r\n\r\n await jsxToHtml(jsxElement).then(async (element) => {\r\n if (element !== null) {\r\n await generateDocx({\r\n data: convertJsxElementToXml(element, width),\r\n format: format,\r\n orientation: orientation,\r\n fileName: fileName\r\n })\r\n status = true\r\n } else {\r\n status = false\r\n }\r\n });\r\n\r\n return status\r\n } else if (divId !== undefined && jsxElement === undefined && tableId === undefined) {\r\n\r\n const divBlock: HTMLElement | null = document.getElementById(divId);\r\n\r\n if (divBlock !== null) {\r\n await generateDocx({\r\n data: convertJsxElementToXml(divBlock, width),\r\n format: format,\r\n orientation: orientation,\r\n fileName: fileName\r\n })\r\n return true\r\n } else {\r\n return false\r\n }\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default fExportHtmlOrJsxToWord\r\n","/**\r\n * Модуль для экспорта HTML-содержимого в формате JSX или строки в .docx файл.\r\n * @module fExportingHtmlToDocx\r\n */\r\n\r\nimport initializeModule from \"allorion-exporting-html-to-docx\";\r\nimport { IExportingHtmlToDocx } from \"allorion-exporting-html-to-docx/dist/exportingHtmlToDocx\";\r\nimport { renderToStaticMarkup } from \"react-dom/server\";\r\n\r\n/**\r\n * Объект с лицензией, необходимой для инициализации модуля экспорта.\r\n *\r\n * @constant\r\n * @type {{ licenseKey: string; signature: string }}\r\n */\r\nconst license = {\r\n licenseKey: 'fui',\r\n signature: 'ae3cbfc5f7847676551a091fabbe9e6fcda7cf028c64b32b918d2206c877cfc979535e9bc9a27bba4e25891f9e8a16d9c99a789669d8f764e7d3633e7a5c286dd9e1fb8dd3253b9389bc98558cd37cf34a76342e1b8ec329895766a0815aa0153ef06589d644d42b666995b6c833130606812bb7a4a8f52710f503664af5751b3d2da5856343eb136b194a9c5cf0b1337e7cbce459a1955ac41f5d6ba4e981b9b4b7ab740a8e415e2277d41f0f362adaf5cccf2be70334a2c25c2dd91f9801228c25234675e9917b94605e5462315ec7c9ef2a4156ff1a3c3a9d732198b43651a57c61640ee057972b95a8feace736379c95b9a1f4ab684c6ada4d266b92f667',\r\n};\r\n\r\n/**\r\n * Расширенный интерфейс параметров для настройки экспорта HTML в DOCX.\r\n *\r\n * @interface IProps\r\n * @extends {Omit<IExportingHtmlToDocx, 'jsxElement'>}\r\n */\r\nexport interface IProps extends Omit<IExportingHtmlToDocx, 'jsxElement'> {\r\n /**\r\n * JSX-элемент или строка HTML, которую нужно экспортировать.\r\n * Если передано как JSX, будет автоматически преобразовано в статическую разметку.\r\n * @type {string | JSX.Element | undefined}\r\n */\r\n jsxElement?: string | JSX.Element;\r\n}\r\n\r\n/**\r\n * Асинхронная функция, которая инициализирует модуль экспорта в формат .docx и запускает его.\r\n *\r\n * Если лицензия не прошла проверку, возвращает пустую функцию и выводит ошибку.\r\n *\r\n * @function fExportingHtmlToDocx\r\n * \r\n * @param {string | JSX.Element | undefined} [jsxElement] - HTML/JSX содержимое для экспорта. Если JSX — конвертируется в строку через `renderToStaticMarkup`.\r\n * @param {string | undefined} [divId] - ID div-блока на странице, содержимое которого будет использовано для экспорта.\r\n * @param {string | undefined} [fileName='export.docx'] - Имя файла, под которым будет сохранён `.docx` документ.\r\n * @param {'A4' | 'A3' | 'A2' | 'A1'} [format='A4'] - Формат листа документа.\r\n * @param {'landscape' | 'vertical'} [orientation='landscape'] - Ориентация страниц (`landscape` — горизонтальная, `vertical` — вертикальная).\r\n * \r\n * @returns {Promise<Function>} Возвращает промис, который резолвится:\r\n * - Функцией для начала загрузки файла `.docx`, если всё прошло успешно.\r\n * - Пустой функцией, если лицензия недействительна.\r\n *\r\n * @example\r\n * // Экспорт из JSX\r\n * const MyComponent = () => <div><h1>Отчет</h1><p>Текст отчета</p></div>;\r\n * fExportingHtmlToDocx({\r\n * fileName: 'report.docx',\r\n * jsxElement: <MyComponent />,\r\n * }).then(downloadFn => downloadFn());\r\n *\r\n * @example\r\n * // Экспорт из строки HTML\r\n * fExportingHtmlToDocx({\r\n * fileName: 'document.docx',\r\n * jsxElement: '<h1>Заголовок</h1><p>Параграф текста</p>',\r\n * }).then(downloadFn => downloadFn());\r\n *\r\n * @example\r\n * // Экспорт из див блока по ID\r\n * fExportingHtmlToDocx({\r\n * fileName: 'report.docx',\r\n * divId: 'export-data',\r\n * }).then(downloadFn => downloadFn());\r\n */\r\nconst fExportingHtmlToDocx = async (data: IProps) => {\r\n const licenseFlag = await initializeModule(license);\r\n if (licenseFlag === null) {\r\n console.error('Лицензия для модуля allorion-exporting-html-to-docx устарела');\r\n return () => { };\r\n } else {\r\n if (data.jsxElement !== undefined) {\r\n if (typeof data.jsxElement !== 'string') {\r\n data.jsxElement = renderToStaticMarkup(data.jsxElement);\r\n }\r\n }\r\n return licenseFlag(data as IExportingHtmlToDocx);\r\n }\r\n};\r\n\r\nexport default fExportingHtmlToDocx;","/**\r\n * Модуль для экспорта HTML-содержимого в формате JSX или строки в .xlsx файл.\r\n * @module fExportingHtmlToXlsx\r\n */\r\n\r\nimport { initializeModule } from \"allorion-exporting-html-to-xlsx\";\r\nimport { IExportingHtmlToXlsx } from \"allorion-exporting-html-to-xlsx/dist/exportingHtmlToXlsx\";\r\nimport { renderToStaticMarkup } from \"react-dom/server\";\r\n\r\n/**\r\n * Объект с лицензией, необходимой для инициализации модуля экспорта.\r\n *\r\n * @constant\r\n * @type {{ licenseKey: string; signature: string }}\r\n */\r\nconst license = {\r\n licenseKey: 'fui',\r\n signature: '99626fe6091102cfb69544832775098aa38f28e76d771f928b8e12138688588537bc89f7dd8a3e73188d8ce58d11f4bdf26e6febf88021786f38f2c4440cdec6fb262ae2d1fa32d0b59068b8923b712bf0310501ab76b31fcc31b0a43073509a3bdc235fe7e3ed49506c1e086444af0c2fc8dff79cf23f417119d96ac4b4eb1588a56dc657db64f782012468ce03fd134c9245cd3f2464d920a30a4c4af831b0f4868f738b815855d846eaa992e55cb73d2aa0bc4e24aa5992751b9721d241f0aa8b0d080359bd19ab74d738dd69bc9f22de22aa888023b4e7d3154a9dc76beb277a3fa3dec115fa591a8d16593d4fae9e604fcf0fc9965e3799145b64cccc0d',\r\n};\r\n\r\n/**\r\n * Расширенный интерфейс параметров для настройки экспорта HTML в XLSX.\r\n *\r\n * @interface IProps\r\n * @extends {Omit<IExportingHtmlToXlsx, 'jsxElement'>}\r\n */\r\ninterface IProps extends Omit<IExportingHtmlToXlsx, 'jsxElement'> {\r\n jsxElement?: string | JSX.Element;\r\n}\r\n\r\n/**\r\n * Асинхронная функция, которая инициализирует модуль экспорта HTML в формат XLSX (Excel) и запускает экспорт.\r\n *\r\n * Если лицензия не прошла проверку, возвращает пустую функцию и выводит ошибку.\r\n *\r\n * @function fExportingHtmlToXlsx\r\n *\r\n * @param {string | JSX.Element | undefined} [jsxElement] - JSX-элемент или строка HTML, которую нужно экспортировать.\r\n * Если передан как JSX — автоматически преобразуется в статическую разметку через `renderToStaticMarkup`.\r\n *\r\n * @param {string | undefined} [divId] - ID DOM-элемента на странице, содержимое которого будет использовано для экспорта.\r\n * Используется вместо `jsxElement`.\r\n *\r\n * @param {string} [fileName='export.xlsx'] - Название файла, под которым будет сохранён `.xlsx` документ.\r\n *\r\n * @param {'base64' | 'string' | 'text' | 'binarystring' | 'array' | 'uint8array' | 'arraybuffer' | 'blob' | 'nodebuffer'} [getFile] - Тип выходных данных:\r\n *\r\n * @returns {Promise<Function>} Возвращает промис, который резолвится:\r\n * - Функцией, начинающей загрузку файла `.xlsx` (или возвращающей данные, в зависимости от `getFile`),\r\n * - Пустой функцией, если лицензия недействительна.\r\n *\r\n * @example\r\n * // Экспорт из JSX\r\n * const MyTable = () => (\r\n * <table>\r\n * <tr><th>Имя</th><th>Возраст</th></tr>\r\n * <tr><td>Анна</td><td>25</td></tr>\r\n * </table>\r\n * );\r\n *\r\n * fExportingHtmlToXlsx({\r\n * fileName: 'report.xlsx',\r\n * jsxElement: <MyTable />,\r\n * }).then(downloadFn => downloadFn());\r\n *\r\n * @example\r\n * // Экспорт по ID элемента\r\n * fExportingHtmlToXlsx({\r\n * fileName: 'document.xlsx',\r\n * divId: 'my-table-id'\r\n * }).then(downloadFn => downloadFn());\r\n *\r\n * @example\r\n * // Получение файла в формате Base64\r\n * fExportingHtmlToXlsx({\r\n * fileName: 'data.xlsx',\r\n * jsxElement: '<table><tr><td>Пример</td></tr></table>',\r\n * getFile: 'base64'\r\n * }).then((getFileFn) => {\r\n * getFileFn().then(base64 => {\r\n * console.log('Base64:', base64);\r\n * });\r\n * });\r\n */\r\nconst fExportingHtmlToXlsx = async (data: IProps) => {\r\n\r\n const licenseFlag = await initializeModule(license)\r\n if (licenseFlag === null) {\r\n console.error('Лицензия для модуля allorion-exporting-html-to-xlsx устарела');\r\n return () => { }\r\n } else {\r\n console.log('Лицензия для модуля allorion-exporting-html-to-xlsx установлена');\r\n if (data.jsxElement !== undefined) {\r\n if (typeof data.jsxElement !== 'string') {\r\n data.jsxElement = renderToStaticMarkup(data.jsxElement)\r\n }\r\n }\r\n return licenseFlag(data as IExportingHtmlToXlsx)\r\n }\r\n}\r\n\r\nexport default fExportingHtmlToXlsx","/**\r\n * Интерфейс, описывающий формат настройки ячейки Excel.\r\n *\r\n * @property {number} [numFmtId] - Идентификатор стандартного формата Excel (например, 9 — это числовой формат).\r\n * @property {{ code: string; type?: ITypeCell }} [formatCode] - Пользовательский формат:\r\n * - `code` — строка формата (например `'0.00%'` или `'yyyy-mm-dd'`),\r\n * - `type` — тип данных (опционально, может быть `'date'`, `'text'`, `'number'` и т.д.).\r\n */\r\n\r\n/**\r\n * Перечисление допустимых типов данных ячейки.\r\n *\r\n * @typedef {'date' | 'text' | 'number' | 'string'} ITypeCell\r\n * @see ICellFormat\r\n */\r\n\r\n/**\r\n * Устанавливает формат ячейки в XLSX-документе.\r\n *\r\n * Функция принимает либо готовый идентификатор стандартного формата (`numFmtId`), либо пользовательский (`formatCode`).\r\n *\r\n * ⚠️ **Ошибка**, если указаны оба параметра или ни один не указан.\r\n *\r\n * @function fInstallFormatCodeXlsx\r\n * @param {ICellFormat} data - Объект с одним из параметров:\r\n * - `numFmtId` — стандартный ID формата Excel,\r\n * - `formatCode` — пользовательский формат:\r\n * - `code` — строка формата (например `'0.00%'`),\r\n * - `type` — тип данных (например `'number'`, `'date'`)\r\n *\r\n * @returns {string} JSON-строка с указанным форматом:\r\n * - `{ \"numFmtId\": 9 }`\r\n * - `{ \"formatCode\": { \"code\": \"0.00%\", \"type\": \"number\" } }`\r\n *\r\n * @throws {Error} Если указаны оба параметра или ни один не указан.\r\n *\r\n * @example\r\n * // Пример использования с numFmtId\r\n * const format = fInstallFormatCodeXlsx({ numFmtId: 9 });\r\n * console.log(format); // {\"numFmtId\":9}\r\n *\r\n * @example\r\n * // Пример использования с пользовательским форматом\r\n * const format = fInstallFormatCodeXlsx({\r\n * formatCode: {\r\n * code: '0.00%',\r\n * type: 'number'\r\n * }\r\n * });\r\n * console.log(format); // {\"formatCode\":{\"code\":\"0.00%\",\"type\":\"number\"}}\r\n *\r\n * @example\r\n * // Ошибка: указаны оба параметра\r\n * try {\r\n * fInstallFormatCodeXlsx({\r\n * numFmtId: 1,\r\n * formatCode: { code: '0.00%' }\r\n * });\r\n * } catch (e) {\r\n * console.error(e.message); // \"Можно указать только один из параметров: numFmtId или formatCode.\"\r\n * }\r\n *\r\n * @example\r\n * // Ошибка: не указано ничего\r\n * try {\r\n * fInstallFormatCodeXlsx({});\r\n * } catch (e) {\r\n * console.error(e.message); // \"Необходимо указать либо numFmtId, либо formatCode.\"\r\n * }\r\n */\r\nimport { installFormatCode } from \"allorion-exporting-html-to-xlsx\";\r\nimport type { ICellFormat } from \"allorion-exporting-html-to-xlsx/dist/type\";\r\n\r\nconst fInstallFormatCodeXlsx = (data: ICellFormat) => installFormatCode(data);\r\n\r\nexport default fInstallFormatCodeXlsx;","import fGenerateUniqueId from '@dop-function/fGenerateUniqueId';\r\nimport styles from './fNotification.module.scss';\r\n\r\n/**\r\n * Интерфейс, описывающий параметры модального уведомления.\r\n * @interface IfNotification\r\n */\r\nexport interface IfNotification {\r\n /**\r\n * Заголовок уведомления (необязательный).\r\n * @type {string | undefined}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Основной текст уведомления. Обязательное поле.\r\n * Может содержать переносы строк (`\\n`), которые будут преобразованы в отдельные `<span>`.\r\n * @type {string}\r\n */\r\n body: string;\r\n\r\n /**\r\n * Тип уведомления. Определяет цветовую схему и иконку.\r\n * @type {'info' | 'error' | 'success' | 'warning'}\r\n */\r\n variant: 'info' | 'error' | 'success' | 'warning';\r\n\r\n /**\r\n * Время автозакрытия уведомления в секундах.\r\n * Если не указано — уведомление закрывается только по клику на кнопку \"Закрыть\".\r\n * @type {number | undefined}\r\n */\r\n timeSecClose?: number;\r\n\r\n /**\r\n * Показывать ли кнопку закрытия уведомления.\r\n * По умолчанию: `false`.\r\n * @type {boolean | undefined}\r\n */\r\n buttonClose?: boolean;\r\n\r\n /**\r\n * Уникальный идентификатор уведомления.\r\n * Если не указан, генерируется автоматически.\r\n * @type {string | undefined}\r\n */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Отображает модальное уведомление в правом верхнем углу экрана.\r\n *\r\n * Уведомление имеет поддержку:\r\n * - различных типов (info, error, success, warning),\r\n * - кнопки закрытия,\r\n * - автоматического закрытия через заданное время,\r\n * - прогресс-бара при наличии `timeSecClose`.\r\n *\r\n * @function fNotification\r\n * @param {string} [title] - Заголовок уведомления.\r\n * @param {string} body - Текст уведомления (поддерживает переносы строк через `\\n`).\r\n * @param {'info' | 'error' | 'success' | 'warning'} [variant='info'] - Тип уведомления.\r\n * @param {number} [timeSecClose] - Время автозакрытия уведомления в секундах.\r\n * @param {boolean} [buttonClose=false] - Флаг, показывающий кнопку закрытия.\r\n * @param {string} [id] - Уникальный идентификатор уведомления.\r\n *\r\n * @returns {Promise<string>} Промис, возвращающий CSS-селектор созданного уведомления.\r\n * Например: `\"#f-function-block-notification-abc123\"`.\r\n *\r\n * @example\r\n * // Пример простого уведомления\r\n * fNotification({\r\n * title: 'Успех',\r\n * body: 'Данные успешно сохранены.',\r\n * variant: 'success'\r\n * });\r\n *\r\n * @example\r\n * // Уведомление с автозакрытием и кнопкой закрытия\r\n * fNotification({\r\n * title: 'Ошибка',\r\n * body: 'Проверьте соединение\\\\nНе удалось загрузить данные',\r\n * variant: 'error',\r\n * timeSecClose: 5,\r\n * buttonClose: true\r\n * }).then((id) => {\r\n * console.log('Уведомление показано:', id);\r\n * });\r\n */\r\nconst fNotification = (\r\n {\r\n title,\r\n body,\r\n variant = 'info',\r\n timeSecClose,\r\n buttonClose = false,\r\n id,\r\n }: IfNotification\r\n): Promise<string> => {\r\n return new Promise((resolve) => {\r\n let ico = ''\r\n\r\n switch (variant) {\r\n case 'info':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\"/>'\r\n break\r\n case \"success\":\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M10.97 4.97a.75.75 0 0 1 1.071 1.05l-3.992 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.235.235 0 0 1 .02-.022z\"/>'\r\n break\r\n case 'error':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\"/>'\r\n break\r\n case 'warning':\r\n ico = '<path d=\"M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z\"/><path d=\"M5.255 5.786a.237.237 0 0 0 .241.247h.825c.138 0 .248-.113.266-.25.09-.656.54-1.134 1.342-1.134.686 0 1.314.343 1.314 1.168 0 .635-.374.927-.965 1.371-.673.489-1.206 1.06-1.168 1.987l.003.217a.25.25 0 0 0 .25.246h.811a.25.25 0 0 0 .25-.25v-.105c0-.718.273-.927 1.01-1.486.609-.463 1.244-.977 1.244-2.056 0-1.511-1.276-2.241-2.673-2.241-1.267 0-2.655.59-2.75 2.286zm1.557 5.763c0 .533.425.927 1.01.927.609 0 1.028-.394 1.028-.927 0-.552-.42-.94-1.029-.94-.584 0-1.009.388-1.009.94z\"/>'\r\n break\r\n }\r\n\r\n const arrBody: string[] = []\r\n body.split('\\n').map(opt => {\r\n arrBody.push(\r\n `<span>${opt}</span>`\r\n )\r\n })\r\n\r\n const randId = fGenerateUniqueId()\r\n const idFuncBlockNot = 'f-function-block-notification-' + randId\r\n\r\n const not = `\r\n <div class='${styles['f-function-block-notification']}' id=\"${id === undefined ? idFuncBlockNot : id}\">\r\n <div class='${styles['f-function-notification']}'>\r\n <div class='${styles['f-function-notification-ico']} ${styles[variant + '-notification']}'>\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\">\r\n ${ico}\r\n </svg>\r\n </div>\r\n <div class='${styles['f-function-notification-inside']}'>\r\n <div class='${styles['f-function-notification-header']}'>\r\n <h4>${title !== undefined ? title : ''}</h4>\r\n ${buttonClose ? `<svg\r\n width=\"25\"\r\n class=\"bi bi-x-lg primary ${styles['close-not']}\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\r\n </svg>` : ''}\r\n </div>\r\n <div class='${styles['f-function-notification-body']}'>\r\n ${arrBody.join('')}\r\n </div>\r\n </div>\r\n ${timeSecClose ? `<div class=\"${styles['f-notification-progress']}\">\r\n <div class=\"${styles['f-notification-progress-bar']}\">\r\n <div class=\"${styles['f-notification-progress-value']} ${styles[variant]}\" id=\"f-notification-progress-value-${randId}\" style=\"animation: notification-progress-animated ${timeSecClose}s linear;\"/>\r\n </div>\r\n </div>` : ''}\r\n </div>\r\n </div>\r\n `\r\n\r\n // Функция для создания или получения блока уведомлений\r\n const getOrCreateNotificationBlock = (): HTMLDivElement => {\r\n let blockNotification: HTMLDivElement | null = document.querySelector('#block-notification');\r\n\r\n if (blockNotification === null) {\r\n blockNotification = document.createElement('div');\r\n blockNotification.id = 'block-notification';\r\n document.body.appendChild(blockNotification);\r\n }\r\n\r\n return blockNotification;\r\n }\r\n\r\n // Функция для удаления пустого блока уведомлений\r\n const removeEmptyNotificationBlock = () => {\r\n const blockNotification = document.querySelector('#block-notification');\r\n if (blockNotification && blockNotification.children.length === 0) {\r\n blockNotification.parentNode?.removeChild(blockNotification);\r\n }\r\n }\r\n\r\n // Создаем блок уведомлений и добавляем новое уведомление\r\n const blockNotification = getOrCreateNotificationBlock();\r\n blockNotification.insertAdjacentHTML('afterbegin', not);\r\n\r\n // Плавная прокрутка к верху\r\n blockNotification.scrollTo({ top: 0, behavior: 'smooth' });\r\n\r\n if (buttonClose) {\r\n const el = window.document.querySelector(`#${idFuncBlockNot}`);\r\n if (el !== null) {\r\n const svgElement = el.querySelector(`.${styles['close-not']}`);\r\n if (svgElement !== null) {\r\n svgElement.addEventListener('click', () => {\r\n el.classList.remove(styles['f-function-notification-visible']);\r\n el.classList.add(styles['f-function-notification-hidden']);\r\n setTimeout(() => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n // Проверяем и удаляем пустой блок\r\n removeEmptyNotificationBlock();\r\n }, 1000);\r\n });\r\n }\r\n }\r\n }\r\n\r\n setTimeout(() => {\r\n const el = window.document.querySelector(`#${idFuncBlockNot}`);\r\n if (el !== null && el !== undefined) {\r\n el.className += \" \" + styles['f-function-notification-visible'];\r\n }\r\n });\r\n\r\n if (timeSecClose !== undefined) {\r\n const el = window.document.querySelector(`#${idFuncBlockNot}`);\r\n if (el !== null) {\r\n setTimeout(() => {\r\n el.className = styles['f-function-notification-hidden'];\r\n }, (timeSecClose - 1) * 1000);\r\n setTimeout(() => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n // Проверяем и удаляем пустой блок\r\n removeEmptyNotificationBlock();\r\n }, timeSecClose * 1000);\r\n }\r\n }\r\n\r\n resolve(`#${idFuncBlockNot}`)\r\n })\r\n}\r\n\r\nexport default fNotification\r\n","import styles from '../fNotification/fNotification.module.scss';\r\n\r\n/**\r\n * Удаляет уведомление из DOM с анимацией скрытия.\r\n * После удаления проверяет контейнер #block-notification и удаляет его, если он пуст.\r\n *\r\n * @param {string} id - CSS-селектор уведомления (например, `\"#notification-123\"`)\r\n * @returns {void}\r\n */\r\nconst fNotificationDelete = (id: string): void => {\r\n const el = window.document.querySelector(id);\r\n if (!el) return;\r\n\r\n const container = document.getElementById('block-notification');\r\n if (!container) return;\r\n\r\n el.className = styles['f-function-notification-hidden'];\r\n\r\n setTimeout(() => {\r\n el.classList.remove(styles['f-function-notification-visible']);\r\n }, 1000);\r\n\r\n setTimeout(() => {\r\n if (el.parentNode) el.parentNode.removeChild(el);\r\n if (container.children.length === 0) container.remove();\r\n }, 2000);\r\n};\r\n\r\nexport default fNotificationDelete;","/**\r\n * Преобразует файл в строку формата Base64.\r\n *\r\n * @param {File} file - Файл, который нужно преобразовать в Base64.\r\n * @param {boolean} [deletePrefix=false] - Если `true`, удаляет префикс `data:base64,`.\r\n * @returns {Promise<string>} Возвращает промис, который резолвится строкой:\r\n * - Полной строкой Base64 (например, `data:image/png;base64,iVBORw0KG...`) — если `deletePrefix = false`\r\n * - Только данными Base64 (например, `iVBORw0KG...`) — если `deletePrefix = true`\r\n *\r\n * @throws {Error} Возникает при ошибке чтения файла.\r\n *\r\n * @example\r\n * const file = new File([blob], 'test.jpg');\r\n * fConvertFileToBase64(file)\r\n * .then(base64 => console.log(base64))\r\n * .catch(error => console.error('Ошибка:', error));\r\n *\r\n * // Пример вывода (без deletePrefix):\r\n * // \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAgMEBQgFQQMDBQQF\r\n *\r\n * // Пример вывода (с deletePrefix):\r\n * // fConvertFileToBase64(file, true).then(data => console.log(data));\r\n * // > \"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAgMEBQgFQQMDBQQF...\"\r\n */\r\nconst fConvertFileToBase64 = (file: File, deletePrefix: boolean = false): Promise<string> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n const result = reader.result as string; // Результат в формате Base64\r\n resolve(deletePrefix ? result.split(',')[1] : result);\r\n };\r\n\r\n reader.onerror = (error) => {\r\n reject(error);\r\n };\r\n\r\n reader.readAsDataURL(file); // Преобразуем файл в Base64\r\n });\r\n};\r\n\r\nexport default fConvertFileToBase64;","/**\r\n * Скачивает файл, созданный из строки Base64.\r\n *\r\n * Функция:\r\n * - принимает строку Base64 и имя файла,\r\n * - определяет MIME-тип (из строки или по расширению файла),\r\n * - преобразует данные в `Blob`,\r\n * - создаёт ссылку для скачивания,\r\n * - программно кликает по ней и удаляет после скачивания.\r\n *\r\n * @function fDownloadFileFromBase64\r\n * @param {string} base64String - Строка в формате Base64. Может содержать Data URI (`data:image/png;base64,...`) или быть чистыми данными.\r\n * @param {string} fileName - Имя файла, под которым будет сохранён файл.\r\n *\r\n * @returns {void}\r\n *\r\n * @example\r\n * // Base64 со стандартным Data URI\r\n * fDownloadFileFromBase64('data:image/png;base64,iVBORw0KG...', 'image.png');\r\n *\r\n * @example\r\n * // Чистая Base64 строка + имя файла\r\n * fDownloadFileFromBase64('iVBORw0KG...', 'document.pdf');\r\n *\r\n * @example\r\n * // Скачивание Excel файла\r\n * fDownloadFileFromBase64(base64Data, 'report.xlsx');\r\n */\r\nconst fDownloadFileFromBase64 = (base64String: string, fileName: string): void => {\r\n if (!base64String) {\r\n console.error('Invalid Base64 string');\r\n return;\r\n }\r\n\r\n let mimeType: string;\r\n let base64Data: string;\r\n\r\n if (base64String.startsWith('data:')) {\r\n const dataUriMatch = base64String.match(/^data:([^;]+);base64,/);\r\n if (dataUriMatch && dataUriMatch[1]) {\r\n mimeType = dataUriMatch[1];\r\n } else {\r\n mimeType = 'application/octet-stream';\r\n }\r\n base64Data = base64String.split(',')[1] || '';\r\n } else {\r\n mimeType = getMimeTypeFromFileName(fileName) || 'application/octet-stream';\r\n base64Data = base64String;\r\n }\r\n\r\n try {\r\n const byteCharacters = atob(base64Data);\r\n const byteNumbers = new Array(byteCharacters.length);\r\n for (let i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n const byteArray = new Uint8Array(byteNumbers);\r\n const blob = new Blob([byteArray], { type: mimeType });\r\n\r\n const url = window.URL.createObjectURL(blob);\r\n\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n } catch (error) {\r\n console.error('Ошибка при обработке Base64:', error);\r\n }\r\n};\r\n\r\n/**\r\n * Вспомогательная функция для определения MIME-типа по расширению файла.\r\n *\r\n * Если расширение неизвестно — возвращает `undefined`.\r\n *\r\n * @function getMimeTypeFromFileName\r\n * @param {string} fileName - Имя файла, на основе которого определяется MIME-тип.\r\n * @returns {string | undefined} MIME-тип или `undefined`, если расширение не распознано.\r\n *\r\n * @example\r\n * getMimeTypeFromFileName('report.pdf'); // \"application/pdf\"\r\n * getMimeTypeFromFileName('image.png'); // \"image/png\"\r\n * getMimeTypeFromFileName('unknown.xyz'); // undefined\r\n */\r\nconst getMimeTypeFromFileName = (fileName: string): string | undefined => {\r\n const extension = fileName.split('.').pop()?.toLowerCase();\r\n if (!extension) return undefined;\r\n\r\n const mimeTypes: { [key: string]: string } = {\r\n txt: 'text/plain',\r\n pdf: 'application/pdf',\r\n png: 'image/png',\r\n jpg: 'image/jpeg',\r\n jpeg: 'image/jpeg',\r\n gif: 'image/gif',\r\n svg: 'image/svg+xml',\r\n doc: 'application/msword',\r\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n xls: 'application/vnd.ms-excel',\r\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n ppt: 'application/vnd.ms-powerpoint',\r\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n json: 'application/json',\r\n zip: 'application/zip',\r\n mp3: 'audio/mpeg',\r\n mp4: 'video/mp4'\r\n };\r\n\r\n return mimeTypes[extension];\r\n};\r\n\r\nexport default fDownloadFileFromBase64;","/**\r\n * Загружает файл на устройство пользователя, создавая временный объект URL из Blob или строки.\r\n *\r\n * @param {Blob | string} blob - Данные для скачивания. Может быть Blob-объектом или строкой (например, JSON, текст).\r\n * @param {string} fileName - Имя файла, под которым он будет сохранён на устройстве пользователя.\r\n * @throws {Error} Если blob пустой или не может быть обработан.\r\n *\r\n * @example\r\n * // Скачать текстовый файл\r\n * downloadBlobFile(\"Привет, мир!\", \"hello.txt\");\r\n *\r\n * @example\r\n * // Скачать Blob (например, после fetch)\r\n * const blob = await response.blob();\r\n * downloadBlobFile(blob, \"image.png\");\r\n */\r\nfunction fDownloadBlobFile(blob: Blob | string, fileName: string): void {\r\n if (!blob) {\r\n throw new Error('Blob or string content must not be empty');\r\n }\r\n\r\n // Преобразуем строку в Blob, если необходимо\r\n const blobObject = typeof blob === 'string' ? new Blob([blob], { type: 'text/plain;charset=utf-8' }) : blob;\r\n\r\n // Создаём ссылку для скачивания\r\n const link = document.createElement('a');\r\n const url = window.URL.createObjectURL(blobObject);\r\n\r\n link.href = url;\r\n link.download = fileName;\r\n\r\n // Добавляем ссылку в DOM, чтобы гарантировать корректный вызов click()\r\n link.style.display = 'none';\r\n document.body.appendChild(link);\r\n\r\n // Имитируем клик\r\n link.click();\r\n\r\n // Очищаем ресурсы\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport default fDownloadBlobFile;","/**\r\n * Выполняет банковское округление числа (по ГОСТ Р 8.736-2011) с учётом практических особенностей,\r\n * используемых в финансовых калькуляторах.\r\n *\r\n * ### Математика банковского округления\r\n *\r\n * Банковское округление (англ. *bankers' rounding*, *round-to-even*) — метод, минимизирующий накопление ошибок\r\n * при многократных операциях. Отличается от стандартного округления только при **ровно 5**:\r\n *\r\n * | Условие | Действие |\r\n * |--------|---------|\r\n * | `roundingDigit > 5` | Округление вверх |\r\n * | `roundingDigit < 5` | Округление вниз |\r\n * | `roundingDigit = 5` и **есть ненулевые цифры после** (`hasTail`) | Округление вверх |\r\n * | `roundingDigit = 5` и **все нули после** | Округляем так, чтобы **последняя сохраняемая цифра была чётной** |\r\n *\r\n * **НО:** в банковских системах и калькуляторах **для отрицательных чисел** при `=5` — **всегда вверх**,\r\n * чтобы избежать \"потери копейки\" в пользу клиента.\r\n *\r\n * ---\r\n *\r\n * ### Примеры\r\n * - `1.2345` → `1.234` (до 3 знаков): `lastKept = 4` (чёт) → вниз\r\n * - `1.2355` → `1.236` (до 3 знаков): `lastKept = 5` (нечёт) → вверх → `6` (чёт)\r\n * - `-1.225` → `-1.23` (до 2 знаков): отрицательное + `=5` → вверх\r\n * - `2.5` → `2` (до 0): `lastKept = 2` (чёт) → вниз\r\n * - `-2.5` → `-3` (до 0): отрицательное + `=5` → вверх\r\n *\r\n * @param value - Число или строка, которую нужно округлить.\r\n * @param decimals - Количество знаков после запятой (по умолчанию 2).\r\n * @returns Округлённое число или `NaN`, если вход некорректен.\r\n *\r\n * @example\r\n * fBankRound(1.225, 2); // → 1.22\r\n * fBankRound(-1.225, 2); // → -1.23\r\n * fBankRound(2.5, 0); // → 2\r\n * fBankRound(-2.5, 0); // → -3\r\n */\r\nfunction fBankRound(value: number | string, decimals: number = 2): number {\r\n const str = String(value).trim();\r\n if (!/^[-+]?\\d+(\\.\\d+)?$/.test(str)) return NaN;\r\n if (decimals < 0) return NaN;\r\n\r\n const sign = str.startsWith('-') ? -1 : 1;\r\n const abs = str.replace(/^[-+]/, '');\r\n const [intPart, fracPart = ''] = abs.split('.');\r\n\r\n if (fracPart.length <= decimals) return Number(str);\r\n\r\n const roundPos = decimals;\r\n const roundingDigit = Number(fracPart[roundPos]);\r\n const tail = fracPart.slice(roundPos + 1);\r\n const hasTail = tail.length > 0 && /[1-9]/.test(tail);\r\n\r\n // Последняя сохраняемая цифра перед roundingDigit\r\n let lastKept: number;\r\n if (roundPos > 0) {\r\n lastKept = Number(fracPart[roundPos - 1]);\r\n } else {\r\n lastKept = intPart.length > 0 ? Number(intPart[intPart.length - 1]) : 0;\r\n }\r\n\r\n const isNegative = sign < 0;\r\n let carry = 0;\r\n\r\n // Основная логика округления\r\n if (roundingDigit > 5) {\r\n carry = 1;\r\n } else if (roundingDigit === 5) {\r\n if (hasTail || isNegative || lastKept % 2 === 1) {\r\n carry = 1;\r\n }\r\n // иначе carry = 0 → к чётному (вниз, если lastKept чёт)\r\n }\r\n\r\n let frac = fracPart.slice(0, roundPos).padEnd(decimals, '0');\r\n let int = intPart || '0';\r\n\r\n if (carry) {\r\n if (decimals === 0) {\r\n // Округление до целого — просто увеличиваем int\r\n int = (Number(int) + 1).toString();\r\n } else {\r\n // Прибавляем 1 к дробной части\r\n let i = decimals - 1;\r\n while (i >= 0) {\r\n if (frac[i] !== '9') {\r\n frac = frac.slice(0, i) + (Number(frac[i]) + 1) + frac.slice(i + 1);\r\n break;\r\n }\r\n frac = frac.slice(0, i) + '0' + frac.slice(i + 1);\r\n i--;\r\n }\r\n if (i < 0) {\r\n // Перенос в целую часть\r\n int = (Number(int) + 1).toString();\r\n frac = '0'.repeat(decimals);\r\n }\r\n }\r\n }\r\n\r\n const resultStr = int + (decimals > 0 ? '.' + frac : '');\r\n return sign * Number(resultStr);\r\n}\r\n\r\nexport default fBankRound;","import fBankRound from \"../fBankRound\";\r\n\r\n/**\r\n * Форматирует число в строку с русской локализацией (разделение тысяч, дробная часть и т.д.)\r\n * Может использовать банковское округление перед форматированием.\r\n * По флагу может вернуть число вместо строки.\r\n *\r\n * @param {number} a - Число для форматирования\r\n * @param {Object} [options] - Опциональные параметры\r\n * @param {number} [options.maximumFractionDigits] - Максимальное количество знаков после запятой\r\n * @param {number} [options.minimumFractionDigits] - Минимальное количество знаков после запятой\r\n * @param {boolean} [options.useBankRound=false] - Использовать ли банковское округление\r\n * @param {number} [options.bankRoundDecimalPlaces=2] - Количество знаков после запятой для банковского округления\r\n * @param {boolean} [options.returnNumber=false] - Вернуть ли число вместо строки\r\n * @returns {string|number} Отформатированная строка числа или число\r\n * \r\n * @example\r\n * fFormatRuNumber(1234.567); // \"1 234,567\"\r\n * fFormatRuNumber(1234.567, { useBankRound: true }); // \"1 234,57\"\r\n * fFormatRuNumber(1234.567, { maximumFractionDigits: 2 }); // \"1 234,57\"\r\n * fFormatRuNumber(1234.567, { useBankRound: true, returnNumber: true }); // 1234.57\r\n */\r\nconst fFormatRuNumber = (\r\n a: number,\r\n options?: {\r\n maximumFractionDigits?: number;\r\n minimumFractionDigits?: number;\r\n useBankRound?: boolean;\r\n bankRoundDecimalPlaces?: number;\r\n returnNumber?: boolean;\r\n }\r\n): string | number => {\r\n if (typeof a !== \"number\" || isNaN(a)) return options?.returnNumber ? NaN : \"\";\r\n\r\n let processedValue = a;\r\n\r\n if (options?.useBankRound) {\r\n const decimalPlaces = options.bankRoundDecimalPlaces ?? 2;\r\n processedValue = fBankRound(processedValue, decimalPlaces);\r\n }\r\n\r\n // 🔹 Если нужен результат числом — просто возвращаем округлённое значение\r\n if (options?.returnNumber) {\r\n // Если указаны ограничения по знакам, приведём число к нужному виду\r\n if (\r\n options.maximumFractionDigits !== undefined ||\r\n options.minimumFractionDigits !== undefined\r\n ) {\r\n const min = options.minimumFractionDigits ?? 0;\r\n const max = options.maximumFractionDigits ?? 20;\r\n\r\n processedValue = Number(processedValue.toLocaleString(\"en-US\", {\r\n minimumFractionDigits: min,\r\n maximumFractionDigits: max,\r\n useGrouping: false\r\n }));\r\n }\r\n return processedValue;\r\n }\r\n\r\n // 🔹 Вариант по умолчанию — строка с локализацией\r\n const formatOptions: Intl.NumberFormatOptions = {};\r\n if (options?.maximumFractionDigits !== undefined) {\r\n formatOptions.maximumFractionDigits = options.maximumFractionDigits;\r\n }\r\n if (options?.minimumFractionDigits !== undefined) {\r\n formatOptions.minimumFractionDigits = options.minimumFractionDigits;\r\n }\r\n\r\n return new Intl.NumberFormat(\"ru-RU\", formatOptions).format(processedValue);\r\n};\r\n\r\nexport default fFormatRuNumber;","type FormatOption = \"iso\" | \"ru\" | \"ru-datetime\" | \"date\" | \"time\" | \"custom\";\r\n\r\n/**\r\n * Настройки форматирования даты, generic по формату F\r\n */\r\ntype ConvertDateOptions<F extends FormatOption = FormatOption> = {\r\n /**\r\n * Стандартные форматы:\r\n * - \"iso\" → YYYY-MM-DD\r\n * - \"ru\" → DD.MM.YYYY\r\n * - \"ru-datetime\" → DD.MM.YYYY HH:MM:SS\r\n * - \"time\" → HH:MM:SS\r\n * - \"date\" → объект Date\r\n * - \"custom\" → использовать `customOptions`\r\n */\r\n format?: F;\r\n /** Локаль для кастомного формата (по умолчанию \"ru-RU\") */\r\n locale?: string;\r\n /** Опции для Intl.DateTimeFormat при `format: \"custom\"` */\r\n customOptions?: Intl.DateTimeFormatOptions;\r\n};\r\n\r\n/**\r\n * Тип возвращаемого значения в зависимости от выбранного формата\r\n */\r\ntype ConvertDateReturnType<F extends FormatOption | undefined> =\r\n F extends \"date\" ? Date | undefined : string;\r\n\r\n/**\r\n * Универсальный конвертер даты и времени.\r\n *\r\n * Поддерживает строки, числа (timestamp), Date, null и undefined.\r\n * Может возвращать дату в ISO, русскую дату, русскую дату с временем,\r\n * только время, объект Date или кастомный формат через Intl.DateTimeFormat.\r\n *\r\n * @param input - Дата в виде строки, числа, Date, null или undefined\r\n * @param options - Настройки форматирования\r\n *\r\n * @returns Отформатированная дата/время или '' / undefined для пустых значений\r\n *\r\n * @example\r\n * convertDate(\"2025-10-02T15:30:45\", { format: \"iso\" }); // \"2025-10-02\"\r\n * convertDate(\"2025-10-02T15:30:45\", { format: \"ru\" }); // \"02.10.2025\"\r\n * convertDate(\"2025-10-02T15:30:45\", { format: \"ru-datetime\" }); // \"02.10.2025 15:30:45\"\r\n * convertDate(new Date(), { format: \"time\" }); // \"14:30:05\"\r\n * convertDate(1696262400000, { format: \"date\" }); // Date object\r\n * convertDate(new Date(), { format: \"custom\", locale: \"en-US\", customOptions: { weekday: \"long\" } });\r\n * // \"Thursday, October 2, 2025\"\r\n */\r\nfunction fConvertDate<F extends FormatOption = \"iso\">(\r\n input: string | number | Date | null | undefined,\r\n options?: ConvertDateOptions<F>\r\n): ConvertDateReturnType<F> {\r\n const format = options?.format ?? \"iso\";\r\n const locale = options?.locale ?? \"ru-RU\";\r\n\r\n if (input === null || input === undefined || input === \"\") {\r\n return (format === \"date\" ? undefined : \"\") as ConvertDateReturnType<F>;\r\n }\r\n\r\n const date = input instanceof Date ? input : new Date(input);\r\n\r\n if (isNaN(date.getTime())) {\r\n return (format === \"date\" ? undefined : \"\") as ConvertDateReturnType<F>;\r\n }\r\n\r\n const pad = (num: number) => String(num).padStart(2, \"0\");\r\n\r\n switch (format) {\r\n case \"iso\":\r\n return date.toISOString().slice(0, 10) as ConvertDateReturnType<F>;\r\n case \"ru\":\r\n return date.toLocaleDateString(\"ru-RU\") as ConvertDateReturnType<F>;\r\n case \"ru-datetime\": {\r\n const dateStr = date.toLocaleDateString(\"ru-RU\");\r\n const timeStr = `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\r\n return `${dateStr} ${timeStr}` as ConvertDateReturnType<F>;\r\n }\r\n case \"time\":\r\n return `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}` as ConvertDateReturnType<F>;\r\n case \"date\":\r\n return date as ConvertDateReturnType<F>;\r\n case \"custom\":\r\n return new Intl.DateTimeFormat(locale, options?.customOptions).format(date) as ConvertDateReturnType<F>;\r\n default:\r\n return \"\" as ConvertDateReturnType<F>;\r\n }\r\n}\r\n\r\nexport default fConvertDate;\r\n","import { useState } from 'react';\r\nimport axios, { AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';\r\nimport { fNotification } from '../../function-elements';\r\n\r\n/**\r\n * Тип возвращаемого значения хука `useFApi`.\r\n *\r\n * @template T - Основной тип данных, который будет получен через API.\r\n */\r\nexport type IUseFApi<T> = {\r\n /**\r\n * Данные, полученные из API. Может быть `null`, если данные ещё не загружены или произошла ошибка.\r\n */\r\n data: T | null;\r\n\r\n /**\r\n * Флаг, указывающий на состояние загрузки.\r\n */\r\n loading: boolean;\r\n\r\n /**\r\n * Сообщение об ошибке, если запрос завершился неудачей. `null`, если ошибки нет.\r\n */\r\n error: string | null;\r\n\r\n /**\r\n * Асинхронная функция, отправляющая HTTP-запрос.\r\n *\r\n * @param {AxiosRequestConfig} config - Конфигурация для запроса (метод, URL, параметры и т.д.)\r\n * @returns {Promise<T | null>} — возвращает данные из ответа или `null` при ошибке.\r\n */\r\n execute: (config: AxiosRequestConfig) => Promise<T | null>;\r\n\r\n /**\r\n * Сбрасывает текущие данные на новое значение.\r\n *\r\n * @param {T | null} newData - Новые данные, которые будут установлены в состояние.\r\n */\r\n reset: (newData: T | null) => void;\r\n};\r\n\r\n/**\r\n * Интерфейс для ответа от API в случае ошибки.\r\n */\r\ninterface ApiErrorResponse {\r\n message: string;\r\n}\r\n\r\n/**\r\n * Рекурсивный тип для извлечения значения по строковому пути (например `'user.address.city'`)\r\n *\r\n * @template T - Базовый тип, из которого извлекается значение.\r\n * @template P - Строка, представляющая путь к значению (например `'user.address.city'`)\r\n */\r\ntype GetValueByPath<T, P extends string> = P extends `${infer Key}.${infer Rest}`\r\n ? Key extends keyof T\r\n ? GetValueByPath<T[Key], Rest>\r\n : never\r\n : P extends keyof T\r\n ? T[P]\r\n : never;\r\n\r\n/**\r\n * Конфигурационные параметры для хука `useFApi`.\r\n *\r\n * @template T - Тип данных, используемых по умолчанию.\r\n */\r\ntype IProps<T> = {\r\n /**\r\n * Если `true`, то хук не будет использовать внутреннее состояние (`useState`).\r\n * @default false\r\n */\r\n doNotUseState?: boolean;\r\n\r\n /**\r\n * Значение по умолчанию для состояния `data`.\r\n * @default null\r\n */\r\n defaultState?: T | null;\r\n\r\n /**\r\n * Путь к полю в ответе API, которое нужно вернуть вместо всего объекта.\r\n * Например: `'data.items'`\r\n */\r\n getValueByPath?: string;\r\n};\r\n\r\n/**\r\n * Хук `useFApi` предоставляет удобную обёртку над `axios` с поддержкой:\r\n * - управления состоянием (`data`, `loading`, `error`),\r\n * - автоматического вывода ошибок через `fNotification`,\r\n * - извлечения конкретного поля из ответа по пути (`getValueByPath`),\r\n * - возможности отключения внутреннего состояния (`doNotUseState`).\r\n *\r\n * @template T - Тип данных, возвращаемых API.\r\n * @param {boolean} [doNotUseState=false] - Отключение внутреннего состояния.\r\n * @param {T | null} [defaultState=null] - Начальное значение `data`.\r\n * @param {string} [getValueByPath=undefined] - Путь к данным в ответе (например `'data.items'`).\r\n *\r\n * @returns {IUseFApi<T>} — объект с данными, статусами и методами.\r\n *\r\n * @example\r\n * const MyComponent = () => {\r\n * const { data, loading, error, execute } = useFApi<{ name: string }>();\r\n *\r\n * useEffect(() => {\r\n * execute({ url: '/api/user/1' });\r\n * }, []);\r\n *\r\n * if (loading) return <div>Загрузка...</div>;\r\n * if (error) return <div>Ошибка: {error}</div>;\r\n *\r\n * return <div>Имя: {data?.name}</div>;\r\n * };\r\n *\r\n * @example\r\n * // Использование с getValueByPath\r\n * const { execute } = useFApi<{ data: { items: string[] } }>({\r\n * getValueByPath: 'data.items'\r\n * });\r\n *\r\n * const result = await execute({ url: '/api/data' });\r\n * // result будет массивом `string[]`, а не полным объектом\r\n *\r\n * @example\r\n * // Отключение внутреннего состояния\r\n * const { execute } = useFApi({ doNotUseState: true });\r\n *\r\n * const fetchData = async () => {\r\n * const data = await execute({ url: '/api/data' });\r\n * console.log(data);\r\n * };\r\n */\r\nconst useFApi = <T>({ doNotUseState = false, defaultState = null, getValueByPath = undefined }: IProps<T> = {}) => {\r\n const [data, setData] = useState<T | null>(defaultState === undefined ? null : defaultState);\r\n const [loading, setLoading] = useState<boolean>(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const execute = async (config: AxiosRequestConfig): Promise<\r\n typeof getValueByPath extends string ? GetValueByPath<T, typeof getValueByPath> : T | null\r\n > => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const response: AxiosResponse<T> = await axios(config);\r\n\r\n if (getValueByPath) {\r\n let returnValue: any = response.data;\r\n const pathParts = getValueByPath.split('.');\r\n for (const part of pathParts) {\r\n returnValue = returnValue?.[part];\r\n if (returnValue === undefined) break;\r\n }\r\n if (!doNotUseState) {\r\n setData(returnValue ?? null);\r\n }\r\n return returnValue ?? null;\r\n } else {\r\n if (!doNotUseState) {\r\n setData(response.data);\r\n }\r\n return response.data;\r\n }\r\n } catch (error) {\r\n const err = error as AxiosError<ApiErrorResponse>;\r\n const errorMessage = err.response?.data?.message || err.message || 'Неизвестная ошибка';\r\n fNotification({\r\n variant: 'error',\r\n title: 'Ошибка',\r\n body: `- Произошла ошибка ${err.response?.status}\\n- ${errorMessage}`,\r\n timeSecClose: 5,\r\n });\r\n setError(errorMessage);\r\n return null;\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const reset = (newData: T | null) => {\r\n if (!doNotUseState) {\r\n setData(newData);\r\n }\r\n };\r\n\r\n return { data, loading, error, execute, reset };\r\n};\r\n\r\nexport default useFApi;","import { FC } from 'react';\r\nimport styles from './WaterErrorBoundary.module.scss';\r\n\r\nconst FWaterErrorBoundaryPage: FC = () => {\r\n return (\r\n <div className={styles.waterError}>\r\n <div className={styles.scene}>\r\n <div className={styles.waves}>\r\n <div className={styles.wave1}></div>\r\n <div className={styles.wave2}></div>\r\n <div className={styles.wave3}></div>\r\n </div>\r\n\r\n <div className={styles.bubbles}>\r\n {[...Array(15)].map((_, i) => (\r\n <div\r\n key={i}\r\n className={styles.bubble}\r\n style={{\r\n left: `${Math.random() * 100}%`,\r\n animationDelay: `${Math.random() * 8}s`,\r\n animationDuration: `${10 + Math.random() * 10}s`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <div className={styles.container}>\r\n <div className={styles.card}>\r\n <div className={styles.drop}>\r\n <svg viewBox=\"0 0 100 120\" className={styles.dropSvg}>\r\n <defs>\r\n <linearGradient id=\"blueGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n <stop offset=\"0%\" stopColor=\"#00d4ff\" />\r\n <stop offset=\"100%\" stopColor=\"#0066ff\" />\r\n </linearGradient>\r\n </defs>\r\n <path d=\"M50 15 C25 55, 25 90, 50 115 C75 90, 75 55, 50 15\" fill=\"url(#blueGradient)\" />\r\n </svg>\r\n </div>\r\n\r\n <h1 className={styles.title}>Поток прерван</h1>\r\n <p className={styles.subtitle}>\r\n Произошла ошибка в системе водоучёта.<br />\r\n Мы уже направляем бригаду гидротехников.<br />\r\n Идёт восстановление данных…\r\n </p>\r\n\r\n <div className={styles.actions}>\r\n <button\r\n className={styles.btnPrimary}\r\n onClick={() => {\r\n const btn = document.querySelector(`.${styles.btnPrimary}`) as HTMLElement;\r\n const ripple = document.createElement('div');\r\n ripple.className = styles.ripple;\r\n btn.appendChild(ripple);\r\n setTimeout(() => ripple.remove(), 700);\r\n window.location.reload();\r\n }}\r\n >\r\n Обновить страницу\r\n </button>\r\n\r\n <button className={styles.btnSecondary} onClick={() => window.location.href = '/'}>\r\n На главную\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default FWaterErrorBoundaryPage;"],"names":["styles","progress","disabled","error","_a","FTableBody","hide","title","left","vertical","horizontal","Fragment","value","active","skeleton","container","arrow","file","dom","items","table","row","jsxToHtml","document","right","createDocumentFile","link","license","initializeModule","blockNotification","btn","ripple"],"mappings":"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A,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
|