@skbkontur/react-ui 4.25.2 → 4.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +41 -13
  3. package/cjs/components/Autocomplete/Autocomplete.md +76 -3
  4. package/cjs/components/Button/Button.md +38 -11
  5. package/cjs/components/Calendar/Calendar.md +40 -0
  6. package/cjs/components/DropdownMenu/DropdownMenu.md +39 -0
  7. package/cjs/components/FileUploader/FileUploader.d.ts +2 -0
  8. package/cjs/components/FileUploader/FileUploader.js +32 -9
  9. package/cjs/components/FileUploader/FileUploader.js.map +1 -1
  10. package/cjs/components/FileUploader/FileUploader.md +29 -0
  11. package/cjs/components/ScrollContainer/ScrollContainer.d.ts +1 -0
  12. package/cjs/components/ScrollContainer/ScrollContainer.js +6 -0
  13. package/cjs/components/ScrollContainer/ScrollContainer.js.map +1 -1
  14. package/cjs/hooks/useDrop.d.ts +1 -1
  15. package/cjs/hooks/useDrop.js.map +1 -1
  16. package/cjs/internal/FileUploaderControl/FileUploaderControlProvider.d.ts +5 -2
  17. package/cjs/internal/FileUploaderControl/FileUploaderControlProvider.js +16 -3
  18. package/cjs/internal/FileUploaderControl/FileUploaderControlProvider.js.map +1 -1
  19. package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.d.ts +1 -0
  20. package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.js +4 -2
  21. package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.js.map +1 -1
  22. package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.d.ts +1 -0
  23. package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.js +3 -2
  24. package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.js.map +1 -1
  25. package/cjs/internal/RenderContainer/RenderContainer.d.ts +2 -0
  26. package/cjs/internal/RenderContainer/RenderContainer.js +6 -3
  27. package/cjs/internal/RenderContainer/RenderContainer.js.map +1 -1
  28. package/cjs/internal/RenderContainer/RenderInnerContainer.js +3 -2
  29. package/cjs/internal/RenderContainer/RenderInnerContainer.js.map +1 -1
  30. package/cjs/internal/ZIndex/ZIndex.d.ts +7 -3
  31. package/cjs/internal/ZIndex/ZIndex.js +41 -3
  32. package/cjs/internal/ZIndex/ZIndex.js.map +1 -1
  33. package/cjs/lib/listenFocusOutside.js +4 -2
  34. package/cjs/lib/listenFocusOutside.js.map +1 -1
  35. package/components/Autocomplete/Autocomplete.md +76 -3
  36. package/components/Button/Button.md +38 -11
  37. package/components/Calendar/Calendar.md +40 -0
  38. package/components/DropdownMenu/DropdownMenu.md +39 -0
  39. package/components/FileUploader/FileUploader/FileUploader.js +30 -8
  40. package/components/FileUploader/FileUploader/FileUploader.js.map +1 -1
  41. package/components/FileUploader/FileUploader.d.ts +2 -0
  42. package/components/FileUploader/FileUploader.md +29 -0
  43. package/components/ScrollContainer/ScrollContainer/ScrollContainer.js +5 -0
  44. package/components/ScrollContainer/ScrollContainer/ScrollContainer.js.map +1 -1
  45. package/components/ScrollContainer/ScrollContainer.d.ts +1 -0
  46. package/hooks/useDrop/useDrop.js.map +1 -1
  47. package/hooks/useDrop.d.ts +1 -1
  48. package/internal/FileUploaderControl/FileUploaderControlProvider/FileUploaderControlProvider.js +12 -3
  49. package/internal/FileUploaderControl/FileUploaderControlProvider/FileUploaderControlProvider.js.map +1 -1
  50. package/internal/FileUploaderControl/FileUploaderControlProvider.d.ts +5 -2
  51. package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile/FileUploaderFile.js +4 -2
  52. package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile/FileUploaderFile.js.map +1 -1
  53. package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.d.ts +1 -0
  54. package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList/FileUploaderFileList.js +4 -2
  55. package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList/FileUploaderFileList.js.map +1 -1
  56. package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.d.ts +1 -0
  57. package/internal/RenderContainer/RenderContainer/RenderContainer.js +3 -1
  58. package/internal/RenderContainer/RenderContainer/RenderContainer.js.map +1 -1
  59. package/internal/RenderContainer/RenderContainer.d.ts +2 -0
  60. package/internal/RenderContainer/RenderInnerContainer/RenderInnerContainer.js +5 -4
  61. package/internal/RenderContainer/RenderInnerContainer/RenderInnerContainer.js.map +1 -1
  62. package/internal/ZIndex/ZIndex/ZIndex.js +55 -7
  63. package/internal/ZIndex/ZIndex/ZIndex.js.map +1 -1
  64. package/internal/ZIndex/ZIndex.d.ts +7 -3
  65. package/lib/listenFocusOutside/listenFocusOutside.js +3 -2
  66. package/lib/listenFocusOutside/listenFocusOutside.js.map +1 -1
  67. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["FileUploaderControlProvider.tsx"],"names":["React","useCallback","useState","useMemoObject","useEffectWithoutInitCall","FileUploaderFileStatus","FileUploaderControlContext","useControlLocale","FileUploaderFileValidationResult","updateFile","files","fileId","getFileUpdatedProps","fileIndex","findIndex","file","id","newFiles","updatedProps","FileUploaderControlProvider","props","children","onValueChange","onRemove","onAttach","setFiles","isMinLengthReached","setIsMinLengthReached","locale","setFileStatus","status","validationResult","Error","error","requestErrorText","handleExternalSetFiles","state","removeFile","filter","setFileValidationResult","reset","displayName"],"mappings":"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","sourcesContent":["import React, { PropsWithChildren, useCallback, useState } from 'react';\n\nimport { useMemoObject } from '../../hooks/useMemoObject';\nimport { useEffectWithoutInitCall } from '../../hooks/useEffectWithoutInitCall';\n\nimport { FileUploaderAttachedFile, FileUploaderFileStatus } from './fileUtils';\nimport { FileUploaderControlContext } from './FileUploaderControlContext';\nimport { useControlLocale } from './hooks/useControlLocale';\nimport { FileUploaderFileValidationResult } from './FileUploaderFileValidationResult';\n\nexport interface FileUploaderControlProviderProps {\n /** Срабатывает при выборе файлов */\n onAttach?: (files: FileUploaderAttachedFile[]) => void;\n /** Срабатывает при удалении файла из контрола */\n onRemove?: (fileId: string) => void;\n /** Срабатывает при onAttach, onRemove и других изменениях файлов. В files передает текущее состояние всего списка файлов */\n onValueChange?: (files: FileUploaderAttachedFile[]) => void;\n}\n\nconst updateFile = (\n files: FileUploaderAttachedFile[],\n fileId: string,\n getFileUpdatedProps: (file: FileUploaderAttachedFile) => Partial<FileUploaderAttachedFile>,\n): FileUploaderAttachedFile[] => {\n const fileIndex = files.findIndex((file) => file.id === fileId);\n if (fileIndex === -1) {\n return files;\n }\n\n const newFiles = [...files];\n const file = files[fileIndex];\n\n const updatedProps = getFileUpdatedProps(file);\n\n newFiles[fileIndex] = {\n ...file,\n ...updatedProps,\n };\n\n return newFiles;\n};\n\nexport const FileUploaderControlProvider = (props: PropsWithChildren<FileUploaderControlProviderProps>) => {\n const { children, onValueChange, onRemove, onAttach } = props;\n\n const [files, setFiles] = useState<FileUploaderAttachedFile[]>([]);\n const [isMinLengthReached, setIsMinLengthReached] = useState<boolean>(false);\n const locale = useControlLocale();\n\n useEffectWithoutInitCall(() => {\n onValueChange?.(files);\n }, [files]);\n\n const setFileStatus = useCallback(\n (fileId: string, status: FileUploaderFileStatus) => {\n setFiles((files) =>\n updateFile(files, fileId, (file) => ({\n status,\n validationResult:\n status === FileUploaderFileStatus.Error\n ? FileUploaderFileValidationResult.error(locale.requestErrorText)\n : file.validationResult,\n })),\n );\n },\n [locale],\n );\n\n const handleExternalSetFiles = useCallback(\n (files: FileUploaderAttachedFile[]) => {\n onAttach?.(files);\n setFiles((state) => [...state, ...files]);\n },\n [onAttach],\n );\n\n const removeFile = useCallback(\n (fileId: string) => {\n onRemove?.(fileId);\n setFiles((state) => state.filter((file) => file.id !== fileId));\n },\n [onRemove],\n );\n\n const setFileValidationResult = useCallback((fileId: string, validationResult: FileUploaderFileValidationResult) => {\n setFiles((files) => updateFile(files, fileId, () => ({ validationResult })));\n }, []);\n\n const reset = React.useCallback(() => {\n setFiles(() => [] as FileUploaderAttachedFile[]);\n }, []);\n\n return (\n <FileUploaderControlContext.Provider\n value={useMemoObject({\n setFileStatus,\n files,\n setFiles: handleExternalSetFiles,\n removeFile,\n setFileValidationResult,\n reset,\n isMinLengthReached,\n setIsMinLengthReached,\n })}\n >\n {children}\n </FileUploaderControlContext.Provider>\n );\n};\n\nFileUploaderControlProvider.displayName = 'FileUploaderControlProvider';\n"]}
1
+ {"version":3,"sources":["FileUploaderControlProvider.tsx"],"names":["React","useCallback","useState","useMemoObject","useEffectWithoutInitCall","FileUploaderFileStatus","getAttachedFile","FileUploaderControlContext","useControlLocale","FileUploaderFileValidationResult","updateFile","files","fileId","getFileUpdatedProps","fileIndex","findIndex","file","id","newFiles","updatedProps","FileUploaderControlProvider","props","initialFiles","multiple","children","onValueChange","onRemove","onAttach","length","attachedFiles","map","setFiles","isMinLengthReached","setIsMinLengthReached","locale","setFileStatus","status","validationResult","Error","error","requestErrorText","handleExternalSetFiles","state","removeFile","filter","setFileValidationResult","reset","displayName"],"mappings":"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","sourcesContent":["import React, { PropsWithChildren, useCallback, useState } from 'react';\n\nimport { useMemoObject } from '../../hooks/useMemoObject';\nimport { useEffectWithoutInitCall } from '../../hooks/useEffectWithoutInitCall';\n\nimport { FileUploaderAttachedFile, FileUploaderFileStatus, getAttachedFile } from './fileUtils';\nimport { FileUploaderControlContext } from './FileUploaderControlContext';\nimport { useControlLocale } from './hooks/useControlLocale';\nimport { FileUploaderFileValidationResult } from './FileUploaderFileValidationResult';\n\nexport interface FileUploaderControlProviderProps {\n /** Срабатывает при выборе файлов */\n onAttach?: (files: FileUploaderAttachedFile[]) => void;\n /** Срабатывает при удалении файла из контрола */\n onRemove?: (fileId: string) => void;\n /** Срабатывает при onAttach, onRemove и других изменениях файлов. В files передает текущее состояние всего списка файлов */\n onValueChange?: (files: FileUploaderAttachedFile[]) => void;\n}\n\nconst updateFile = (\n files: FileUploaderAttachedFile[],\n fileId: string,\n getFileUpdatedProps: (file: FileUploaderAttachedFile) => Partial<FileUploaderAttachedFile>,\n): FileUploaderAttachedFile[] => {\n const fileIndex = files.findIndex((file) => file.id === fileId);\n if (fileIndex === -1) {\n return files;\n }\n\n const newFiles = [...files];\n const file = files[fileIndex];\n\n const updatedProps = getFileUpdatedProps(file);\n\n newFiles[fileIndex] = {\n ...file,\n ...updatedProps,\n };\n\n return newFiles;\n};\n\nexport const FileUploaderControlProvider = (\n props: PropsWithChildren<\n FileUploaderControlProviderProps & {\n initialFiles?: File[];\n multiple?: boolean;\n }\n >,\n) => {\n const { initialFiles, multiple, children, onValueChange, onRemove, onAttach } = props;\n\n const [files, setFiles] = useState<FileUploaderAttachedFile[]>(() => {\n if (initialFiles && initialFiles.length > 0) {\n const attachedFiles = initialFiles.map(getAttachedFile);\n return multiple ? attachedFiles : [attachedFiles[0]];\n }\n return [];\n });\n const [isMinLengthReached, setIsMinLengthReached] = useState<boolean>(false);\n const locale = useControlLocale();\n\n useEffectWithoutInitCall(() => {\n onValueChange?.(files);\n }, [files]);\n\n const setFileStatus = useCallback(\n (fileId: string, status: FileUploaderFileStatus) => {\n setFiles((files) =>\n updateFile(files, fileId, (file) => ({\n status,\n validationResult:\n status === FileUploaderFileStatus.Error\n ? FileUploaderFileValidationResult.error(locale.requestErrorText)\n : file.validationResult,\n })),\n );\n },\n [locale],\n );\n\n const handleExternalSetFiles = useCallback(\n (files: FileUploaderAttachedFile[]) => {\n onAttach?.(files);\n setFiles((state) => [...state, ...files]);\n },\n [onAttach],\n );\n\n const removeFile = useCallback(\n (fileId: string) => {\n onRemove?.(fileId);\n setFiles((state) => state.filter((file) => file.id !== fileId));\n },\n [onRemove],\n );\n\n const setFileValidationResult = useCallback((fileId: string, validationResult: FileUploaderFileValidationResult) => {\n setFiles((files) => updateFile(files, fileId, () => ({ validationResult })));\n }, []);\n\n const reset = React.useCallback(() => {\n setFiles(() => [] as FileUploaderAttachedFile[]);\n }, []);\n\n return (\n <FileUploaderControlContext.Provider\n value={useMemoObject({\n setFileStatus,\n files,\n setFiles: handleExternalSetFiles,\n removeFile,\n setFileValidationResult,\n reset,\n isMinLengthReached,\n setIsMinLengthReached,\n })}\n >\n {children}\n </FileUploaderControlContext.Provider>\n );\n};\n\nFileUploaderControlProvider.displayName = 'FileUploaderControlProvider';\n"]}
@@ -1,4 +1,4 @@
1
- import { PropsWithChildren } from 'react';
1
+ import React, { PropsWithChildren } from 'react';
2
2
  import { FileUploaderAttachedFile } from './fileUtils';
3
3
  export interface FileUploaderControlProviderProps {
4
4
  /** Срабатывает при выборе файлов */
@@ -9,6 +9,9 @@ export interface FileUploaderControlProviderProps {
9
9
  onValueChange?: (files: FileUploaderAttachedFile[]) => void;
10
10
  }
11
11
  export declare const FileUploaderControlProvider: {
12
- (props: PropsWithChildren<FileUploaderControlProviderProps>): JSX.Element;
12
+ (props: React.PropsWithChildren<FileUploaderControlProviderProps & {
13
+ initialFiles?: File[] | undefined;
14
+ multiple?: boolean | undefined;
15
+ }>): JSX.Element;
13
16
  displayName: string;
14
17
  };
@@ -53,7 +53,8 @@ export var FileUploaderFile = forwardRefAndName('FileUploaderFile', function (pr
53
53
  showSize = props.showSize,
54
54
  error = props.error,
55
55
  multiple = props.multiple,
56
- size = props.size;
56
+ size = props.size,
57
+ onRemove = props.onRemove;
57
58
  var id = file.id,
58
59
  originalFile = file.originalFile,
59
60
  status = file.status,
@@ -99,7 +100,8 @@ export var FileUploaderFile = forwardRefAndName('FileUploaderFile', function (pr
99
100
  });
100
101
  var removeUploadFile = useCallback(function () {
101
102
  removeFile(id);
102
- }, [removeFile, id]);
103
+ onRemove(id);
104
+ }, [removeFile, id, onRemove]);
103
105
  var handleRemove = useCallback(function (event) {
104
106
  event.preventDefault();
105
107
  event.stopPropagation();
@@ -1 +1 @@
1
- {"version":3,"sources":["FileUploaderFile.tsx"],"names":["React","useCallback","useContext","useEffect","useMemo","useRef","useState","globalObject","forwardRefAndName","formatBytes","TextWidthHelper","truncate","FileUploaderControlContext","cx","ThemeContext","keyListener","isKeyEnter","Hint","Tooltip","getDOMRect","useFileUploaderSize","jsStyles","FileUploaderFileStatusIcon","getTruncatedName","fileNameWidth","fileNameElementWidth","name","charWidth","Math","ceil","length","maxCharsCountInSpan","calcTruncatedName","textHelperRef","fileNameElementRef","current","getTextWidth","width","MIN_CHARS_LENGTH","FileUploaderFileDataTids","file","fileTooltip","fileName","fileSize","fileIcon","FileUploaderFile","props","ref","showSize","error","multiple","size","id","originalFile","status","validationResult","hovered","setHovered","focusedByTab","setFocusedByTab","truncatedFileName","setTruncatedFileName","removeFile","setIsMinLengthReached","isMinLengthReached","theme","formattedSize","truncatedName","removeUploadFile","handleRemove","event","preventDefault","stopPropagation","isValid","message","isInvalid","sizeIconClass","small","iconSmall","medium","iconMedium","large","iconLarge","renderTooltipContent","sizeContentClass","contentSmall","contentMedium","contentLarge","contentClassNames","content","handleMouseEnter","handleMouseLeave","handleFocus","requestAnimationFrame","isTabPressed","handleBlur","handleIconKeyDown","e","iconClassNames","icon","focusedIcon","iconMultiple","isTruncated","root"],"mappings":"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","sourcesContent":["import React, { ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { globalObject } from '@skbkontur/global-object';\n\nimport { forwardRefAndName } from '../../../lib/forwardRefAndName';\nimport { FileUploaderAttachedFile } from '../fileUtils';\nimport { formatBytes } from '../../../lib/utils';\nimport { TextWidthHelper } from '../../TextWidthHelper/TextWidthHelper';\nimport { truncate } from '../../../lib/stringUtils';\nimport { FileUploaderControlContext } from '../FileUploaderControlContext';\nimport { cx } from '../../../lib/theming/Emotion';\nimport { ThemeContext } from '../../../lib/theming/ThemeContext';\nimport { keyListener } from '../../../lib/events/keyListener';\nimport { isKeyEnter } from '../../../lib/events/keyboard/identifiers';\nimport { Nullable } from '../../../typings/utility-types';\nimport { Hint } from '../../../components/Hint';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { getDOMRect } from '../../../lib/dom/getDOMRect';\nimport { useFileUploaderSize } from '../hooks/useFileUploaderSize';\nimport { SizeProp } from '../../../lib/types/props';\n\nimport { jsStyles } from './FileUploaderFile.styles';\nimport { FileUploaderFileStatusIcon } from './FileUploaderFileStatusIcon';\n\ninterface FileUploaderFileProps {\n file: FileUploaderAttachedFile;\n showSize?: boolean;\n multiple?: boolean;\n size: SizeProp;\n /** Состояние ошибки контрола файла */\n error?: boolean;\n}\n\nconst getTruncatedName = (fileNameWidth: number, fileNameElementWidth: number, name: string) => {\n if (!fileNameWidth && !fileNameElementWidth) {\n return null;\n }\n\n if (fileNameWidth <= fileNameElementWidth) {\n return name;\n }\n\n const charWidth = Math.ceil(fileNameWidth / name.length);\n const maxCharsCountInSpan = Math.ceil(fileNameElementWidth / charWidth);\n\n return truncate(name, maxCharsCountInSpan);\n};\n\nconst calcTruncatedName = (\n textHelperRef: React.RefObject<TextWidthHelper>,\n fileNameElementRef: React.RefObject<HTMLSpanElement>,\n name: string,\n) => {\n const fileNameWidth = textHelperRef.current?.getTextWidth() || 0;\n const fileNameElementWidth = getDOMRect(fileNameElementRef.current).width;\n\n return getTruncatedName(fileNameWidth, fileNameElementWidth, name);\n};\n\nconst MIN_CHARS_LENGTH = 3;\n\nexport const FileUploaderFileDataTids = {\n file: 'FileUploader__file',\n fileTooltip: 'FileUploader__fileTooltip',\n fileName: 'FileUploader__fileName',\n fileSize: 'FileUploader__fileSize',\n fileIcon: 'FileUploader__fileIcon',\n} as const;\n\nexport const FileUploaderFile = forwardRefAndName<HTMLDivElement, FileUploaderFileProps>(\n 'FileUploaderFile',\n (props, ref) => {\n const { file, showSize, error, multiple, size } = props;\n const { id, originalFile, status, validationResult } = file;\n const { name, size: fileSize } = originalFile;\n\n const [hovered, setHovered] = useState<boolean>(false);\n const [focusedByTab, setFocusedByTab] = useState(false);\n const [truncatedFileName, setTruncatedFileName] = useState<Nullable<string>>(null);\n\n const textHelperRef = useRef<TextWidthHelper>(null);\n const fileNameElementRef = useRef<HTMLSpanElement>(null);\n\n const { removeFile, setIsMinLengthReached, isMinLengthReached } = useContext(FileUploaderControlContext);\n const theme = useContext(ThemeContext);\n\n const formattedSize = useMemo(() => formatBytes(fileSize, 1), [fileSize]);\n\n useEffect(() => {\n if (setIsMinLengthReached) {\n const truncatedName = calcTruncatedName(textHelperRef, fileNameElementRef, name);\n\n setIsMinLengthReached((truncatedName?.length ?? 0) <= MIN_CHARS_LENGTH);\n }\n }, [name, isMinLengthReached]);\n\n useEffect(() => {\n const truncatedName = calcTruncatedName(textHelperRef, fileNameElementRef, name);\n\n setTruncatedFileName(truncatedName);\n });\n\n const removeUploadFile = useCallback(() => {\n removeFile(id);\n }, [removeFile, id]);\n\n const handleRemove = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n removeUploadFile();\n },\n [removeUploadFile],\n );\n\n const { isValid, message } = validationResult;\n\n const isInvalid = error || !isValid;\n\n const sizeIconClass = useFileUploaderSize(size, {\n small: jsStyles.iconSmall(),\n medium: jsStyles.iconMedium(),\n large: jsStyles.iconLarge(),\n });\n\n const renderTooltipContent = useCallback((): ReactNode => {\n return !isValid && !error && message ? message : null;\n }, [isValid, error, message]);\n\n const sizeContentClass = useFileUploaderSize(size, {\n small: jsStyles.contentSmall(theme),\n medium: jsStyles.contentMedium(theme),\n large: jsStyles.contentLarge(theme),\n });\n\n const contentClassNames = cx(jsStyles.content(), {\n [sizeContentClass]: true,\n [jsStyles.error(theme)]: isInvalid,\n });\n\n const handleMouseEnter = useCallback(() => {\n setHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHovered(false);\n }, []);\n\n const handleFocus = useCallback(() => {\n // focus event fires before keyDown eventlistener\n // so we should check tabPressed in async way\n globalObject.requestAnimationFrame?.(() => {\n if (keyListener.isTabPressed) {\n setFocusedByTab(true);\n }\n });\n }, []);\n\n const handleBlur = useCallback(() => {\n setFocusedByTab(false);\n }, []);\n\n const handleIconKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLElement>) => {\n if (isKeyEnter(e)) {\n removeUploadFile();\n }\n },\n [removeUploadFile],\n );\n\n const iconClassNames = cx(jsStyles.icon(theme), {\n [jsStyles.focusedIcon(theme)]: focusedByTab,\n [sizeIconClass]: true,\n [jsStyles.iconMultiple()]: multiple,\n });\n\n const isTruncated = truncatedFileName !== name;\n\n return (\n <div\n data-tid={FileUploaderFileDataTids.file}\n className={jsStyles.root()}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n ref={ref}\n >\n <Tooltip data-tid={FileUploaderFileDataTids.fileTooltip} pos=\"right middle\" render={renderTooltipContent}>\n <div className={contentClassNames}>\n <TextWidthHelper ref={textHelperRef} text={name} />\n <Hint maxWidth={'100%'} text={isTruncated ? name : null}>\n <span data-tid={FileUploaderFileDataTids.fileName} ref={fileNameElementRef} className={jsStyles.name()}>\n {truncatedFileName}\n </span>\n </Hint>\n {!!showSize && formattedSize && (\n <span data-tid={FileUploaderFileDataTids.fileSize} className={jsStyles.size()}>\n {formattedSize}\n </span>\n )}\n <div\n className={iconClassNames}\n data-tid={FileUploaderFileDataTids.fileIcon}\n tabIndex={0}\n onClick={handleRemove}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleIconKeyDown}\n >\n <FileUploaderFileStatusIcon\n status={status}\n hovered={hovered}\n focusedByTab={focusedByTab}\n isInvalid={isInvalid}\n size={size}\n />\n </div>\n </div>\n </Tooltip>\n </div>\n );\n },\n);\n"]}
1
+ {"version":3,"sources":["FileUploaderFile.tsx"],"names":["React","useCallback","useContext","useEffect","useMemo","useRef","useState","globalObject","forwardRefAndName","formatBytes","TextWidthHelper","truncate","FileUploaderControlContext","cx","ThemeContext","keyListener","isKeyEnter","Hint","Tooltip","getDOMRect","useFileUploaderSize","jsStyles","FileUploaderFileStatusIcon","getTruncatedName","fileNameWidth","fileNameElementWidth","name","charWidth","Math","ceil","length","maxCharsCountInSpan","calcTruncatedName","textHelperRef","fileNameElementRef","current","getTextWidth","width","MIN_CHARS_LENGTH","FileUploaderFileDataTids","file","fileTooltip","fileName","fileSize","fileIcon","FileUploaderFile","props","ref","showSize","error","multiple","size","onRemove","id","originalFile","status","validationResult","hovered","setHovered","focusedByTab","setFocusedByTab","truncatedFileName","setTruncatedFileName","removeFile","setIsMinLengthReached","isMinLengthReached","theme","formattedSize","truncatedName","removeUploadFile","handleRemove","event","preventDefault","stopPropagation","isValid","message","isInvalid","sizeIconClass","small","iconSmall","medium","iconMedium","large","iconLarge","renderTooltipContent","sizeContentClass","contentSmall","contentMedium","contentLarge","contentClassNames","content","handleMouseEnter","handleMouseLeave","handleFocus","requestAnimationFrame","isTabPressed","handleBlur","handleIconKeyDown","e","iconClassNames","icon","focusedIcon","iconMultiple","isTruncated","root"],"mappings":"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","sourcesContent":["import React, { ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { globalObject } from '@skbkontur/global-object';\n\nimport { forwardRefAndName } from '../../../lib/forwardRefAndName';\nimport { FileUploaderAttachedFile } from '../fileUtils';\nimport { formatBytes } from '../../../lib/utils';\nimport { TextWidthHelper } from '../../TextWidthHelper/TextWidthHelper';\nimport { truncate } from '../../../lib/stringUtils';\nimport { FileUploaderControlContext } from '../FileUploaderControlContext';\nimport { cx } from '../../../lib/theming/Emotion';\nimport { ThemeContext } from '../../../lib/theming/ThemeContext';\nimport { keyListener } from '../../../lib/events/keyListener';\nimport { isKeyEnter } from '../../../lib/events/keyboard/identifiers';\nimport { Nullable } from '../../../typings/utility-types';\nimport { Hint } from '../../../components/Hint';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { getDOMRect } from '../../../lib/dom/getDOMRect';\nimport { useFileUploaderSize } from '../hooks/useFileUploaderSize';\nimport { SizeProp } from '../../../lib/types/props';\n\nimport { jsStyles } from './FileUploaderFile.styles';\nimport { FileUploaderFileStatusIcon } from './FileUploaderFileStatusIcon';\n\ninterface FileUploaderFileProps {\n file: FileUploaderAttachedFile;\n showSize?: boolean;\n multiple?: boolean;\n size: SizeProp;\n /** Состояние ошибки контрола файла */\n error?: boolean;\n onRemove(id: string): void;\n}\n\nconst getTruncatedName = (fileNameWidth: number, fileNameElementWidth: number, name: string) => {\n if (!fileNameWidth && !fileNameElementWidth) {\n return null;\n }\n\n if (fileNameWidth <= fileNameElementWidth) {\n return name;\n }\n\n const charWidth = Math.ceil(fileNameWidth / name.length);\n const maxCharsCountInSpan = Math.ceil(fileNameElementWidth / charWidth);\n\n return truncate(name, maxCharsCountInSpan);\n};\n\nconst calcTruncatedName = (\n textHelperRef: React.RefObject<TextWidthHelper>,\n fileNameElementRef: React.RefObject<HTMLSpanElement>,\n name: string,\n) => {\n const fileNameWidth = textHelperRef.current?.getTextWidth() || 0;\n const fileNameElementWidth = getDOMRect(fileNameElementRef.current).width;\n\n return getTruncatedName(fileNameWidth, fileNameElementWidth, name);\n};\n\nconst MIN_CHARS_LENGTH = 3;\n\nexport const FileUploaderFileDataTids = {\n file: 'FileUploader__file',\n fileTooltip: 'FileUploader__fileTooltip',\n fileName: 'FileUploader__fileName',\n fileSize: 'FileUploader__fileSize',\n fileIcon: 'FileUploader__fileIcon',\n} as const;\n\nexport const FileUploaderFile = forwardRefAndName<HTMLDivElement, FileUploaderFileProps>(\n 'FileUploaderFile',\n (props, ref) => {\n const { file, showSize, error, multiple, size, onRemove } = props;\n const { id, originalFile, status, validationResult } = file;\n const { name, size: fileSize } = originalFile;\n\n const [hovered, setHovered] = useState<boolean>(false);\n const [focusedByTab, setFocusedByTab] = useState(false);\n const [truncatedFileName, setTruncatedFileName] = useState<Nullable<string>>(null);\n\n const textHelperRef = useRef<TextWidthHelper>(null);\n const fileNameElementRef = useRef<HTMLSpanElement>(null);\n\n const { removeFile, setIsMinLengthReached, isMinLengthReached } = useContext(FileUploaderControlContext);\n const theme = useContext(ThemeContext);\n\n const formattedSize = useMemo(() => formatBytes(fileSize, 1), [fileSize]);\n\n useEffect(() => {\n if (setIsMinLengthReached) {\n const truncatedName = calcTruncatedName(textHelperRef, fileNameElementRef, name);\n\n setIsMinLengthReached((truncatedName?.length ?? 0) <= MIN_CHARS_LENGTH);\n }\n }, [name, isMinLengthReached]);\n\n useEffect(() => {\n const truncatedName = calcTruncatedName(textHelperRef, fileNameElementRef, name);\n\n setTruncatedFileName(truncatedName);\n });\n\n const removeUploadFile = useCallback(() => {\n removeFile(id);\n onRemove(id);\n }, [removeFile, id, onRemove]);\n\n const handleRemove = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n removeUploadFile();\n },\n [removeUploadFile],\n );\n\n const { isValid, message } = validationResult;\n\n const isInvalid = error || !isValid;\n\n const sizeIconClass = useFileUploaderSize(size, {\n small: jsStyles.iconSmall(),\n medium: jsStyles.iconMedium(),\n large: jsStyles.iconLarge(),\n });\n\n const renderTooltipContent = useCallback((): ReactNode => {\n return !isValid && !error && message ? message : null;\n }, [isValid, error, message]);\n\n const sizeContentClass = useFileUploaderSize(size, {\n small: jsStyles.contentSmall(theme),\n medium: jsStyles.contentMedium(theme),\n large: jsStyles.contentLarge(theme),\n });\n\n const contentClassNames = cx(jsStyles.content(), {\n [sizeContentClass]: true,\n [jsStyles.error(theme)]: isInvalid,\n });\n\n const handleMouseEnter = useCallback(() => {\n setHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHovered(false);\n }, []);\n\n const handleFocus = useCallback(() => {\n // focus event fires before keyDown eventlistener\n // so we should check tabPressed in async way\n globalObject.requestAnimationFrame?.(() => {\n if (keyListener.isTabPressed) {\n setFocusedByTab(true);\n }\n });\n }, []);\n\n const handleBlur = useCallback(() => {\n setFocusedByTab(false);\n }, []);\n\n const handleIconKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLElement>) => {\n if (isKeyEnter(e)) {\n removeUploadFile();\n }\n },\n [removeUploadFile],\n );\n\n const iconClassNames = cx(jsStyles.icon(theme), {\n [jsStyles.focusedIcon(theme)]: focusedByTab,\n [sizeIconClass]: true,\n [jsStyles.iconMultiple()]: multiple,\n });\n\n const isTruncated = truncatedFileName !== name;\n\n return (\n <div\n data-tid={FileUploaderFileDataTids.file}\n className={jsStyles.root()}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n ref={ref}\n >\n <Tooltip data-tid={FileUploaderFileDataTids.fileTooltip} pos=\"right middle\" render={renderTooltipContent}>\n <div className={contentClassNames}>\n <TextWidthHelper ref={textHelperRef} text={name} />\n <Hint maxWidth={'100%'} text={isTruncated ? name : null}>\n <span data-tid={FileUploaderFileDataTids.fileName} ref={fileNameElementRef} className={jsStyles.name()}>\n {truncatedFileName}\n </span>\n </Hint>\n {!!showSize && formattedSize && (\n <span data-tid={FileUploaderFileDataTids.fileSize} className={jsStyles.size()}>\n {formattedSize}\n </span>\n )}\n <div\n className={iconClassNames}\n data-tid={FileUploaderFileDataTids.fileIcon}\n tabIndex={0}\n onClick={handleRemove}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleIconKeyDown}\n >\n <FileUploaderFileStatusIcon\n status={status}\n hovered={hovered}\n focusedByTab={focusedByTab}\n isInvalid={isInvalid}\n size={size}\n />\n </div>\n </div>\n </Tooltip>\n </div>\n );\n },\n);\n"]}
@@ -7,6 +7,7 @@ interface FileUploaderFileProps {
7
7
  size: SizeProp;
8
8
  /** Состояние ошибки контрола файла */
9
9
  error?: boolean;
10
+ onRemove(id: string): void;
10
11
  }
11
12
  export declare const FileUploaderFileDataTids: {
12
13
  readonly file: "FileUploader__file";
@@ -10,7 +10,8 @@ export var FileUploaderFileDataTids = {
10
10
  };
11
11
  export var FileUploaderFileList = function FileUploaderFileList(props) {
12
12
  var renderFile = props.renderFile,
13
- size = props.size;
13
+ size = props.size,
14
+ onRemove = props.onRemove;
14
15
 
15
16
  var _useContext = useContext(FileUploaderControlContext),
16
17
  files = _useContext.files;
@@ -33,7 +34,8 @@ export var FileUploaderFileList = function FileUploaderFileList(props) {
33
34
  file: file,
34
35
  showSize: true,
35
36
  multiple: true,
36
- size: size
37
+ size: size,
38
+ onRemove: onRemove
37
39
  }))));
38
40
  }));
39
41
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["FileUploaderFileList.tsx"],"names":["React","useContext","FileUploaderControlContext","ThemeContext","FileUploaderFile","cx","useFileUploaderSize","jsStyles","FileUploaderFileDataTids","fileList","FileUploaderFileList","props","renderFile","size","files","theme","fileWrapperClass","small","fileWrapperSmall","medium","fileWrapperMedium","large","fileWrapperLarge","map","file","id","fileWrapper","__KONTUR_REACT_UI__","displayName"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,UAAhB,QAAkC,OAAlC;;AAEA,SAASC,0BAAT,QAA2C,+BAA3C;AACA,SAASC,YAAT,QAA6B,mCAA7B;AACA,SAASC,gBAAT,QAAiC,sCAAjC;;AAEA,SAASC,EAAT,QAAmB,8BAAnB;AACA,SAASC,mBAAT,QAAoC,8BAApC;;;AAGA,SAASC,QAAT,QAAyB,+BAAzB;;;;;;;AAOA,OAAO,IAAMC,wBAAwB,GAAG;AACtCC,EAAAA,QAAQ,EAAE,wBAD4B,EAAjC;;;AAIP,OAAO,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,CAACC,KAAD,EAAsC;AACxE,MAAQC,UAAR,GAA6BD,KAA7B,CAAQC,UAAR,CAAoBC,IAApB,GAA6BF,KAA7B,CAAoBE,IAApB;AACA,oBAAkBZ,UAAU,CAACC,0BAAD,CAA5B,CAAQY,KAAR,eAAQA,KAAR;AACA,MAAMC,KAAK,GAAGd,UAAU,CAACE,YAAD,CAAxB;;AAEA,MAAMa,gBAAgB,GAAGV,mBAAmB,CAACO,IAAD,EAAO;AACjDI,IAAAA,KAAK,EAAEV,QAAQ,CAACW,gBAAT,CAA0BH,KAA1B,CAD0C;AAEjDI,IAAAA,MAAM,EAAEZ,QAAQ,CAACa,iBAAT,CAA2BL,KAA3B,CAFyC;AAGjDM,IAAAA,KAAK,EAAEd,QAAQ,CAACe,gBAAT,CAA0BP,KAA1B,CAH0C,EAAP,CAA5C;;;AAMA;AACE,iCAAK,YAAUP,wBAAwB,CAACC,QAAxC;AACGK,IAAAA,KAAK,CAACS,GAAN,CAAU,UAACC,IAAD;AACT,qCAAK,GAAG,EAAEA,IAAI,CAACC,EAAf,EAAmB,SAAS,EAAEpB,EAAE,CAACE,QAAQ,CAACmB,WAAT,CAAqBX,KAArB,CAAD,EAA8BC,gBAA9B,CAAhC;AACE,qCAAK,SAAS,EAAET,QAAQ,CAACiB,IAAT,EAAhB;AACGZ,QAAAA,UAAU,CAACY,IAAD,eAAO,oBAAC,gBAAD,IAAkB,IAAI,EAAEA,IAAxB,EAA8B,QAAQ,MAAtC,EAAuC,QAAQ,MAA/C,EAAgD,IAAI,EAAEX,IAAtD,GAAP,CADb,CADF,CADS,GAAV,CADH,CADF;;;;;;AAWD,CAtBM;;AAwBPH,oBAAoB,CAACiB,mBAArB,GAA2C,sBAA3C;AACAjB,oBAAoB,CAACkB,WAArB,GAAmC,sBAAnC","sourcesContent":["import React, { useContext } from 'react';\n\nimport { FileUploaderControlContext } from '../FileUploaderControlContext';\nimport { ThemeContext } from '../../../lib/theming/ThemeContext';\nimport { FileUploaderFile } from '../FileUploaderFile/FileUploaderFile';\nimport { FileUploaderAttachedFile } from '../fileUtils';\nimport { cx } from '../../../lib/theming/Emotion';\nimport { useFileUploaderSize } from '../hooks/useFileUploaderSize';\nimport { SizeProp } from '../../../lib/types/props';\n\nimport { jsStyles } from './FileUploaderFileList.styles';\n\ninterface FileUploaderFileListProps {\n renderFile: (file: FileUploaderAttachedFile, fileNode: React.ReactElement) => React.ReactNode;\n size: SizeProp;\n}\n\nexport const FileUploaderFileDataTids = {\n fileList: 'FileUploader__fileList',\n} as const;\n\nexport const FileUploaderFileList = (props: FileUploaderFileListProps) => {\n const { renderFile, size } = props;\n const { files } = useContext(FileUploaderControlContext);\n const theme = useContext(ThemeContext);\n\n const fileWrapperClass = useFileUploaderSize(size, {\n small: jsStyles.fileWrapperSmall(theme),\n medium: jsStyles.fileWrapperMedium(theme),\n large: jsStyles.fileWrapperLarge(theme),\n });\n\n return (\n <div data-tid={FileUploaderFileDataTids.fileList}>\n {files.map((file) => (\n <div key={file.id} className={cx(jsStyles.fileWrapper(theme), fileWrapperClass)}>\n <div className={jsStyles.file()}>\n {renderFile(file, <FileUploaderFile file={file} showSize multiple size={size} />)}\n </div>\n </div>\n ))}\n </div>\n );\n};\n\nFileUploaderFileList.__KONTUR_REACT_UI__ = 'FileUploaderFileList';\nFileUploaderFileList.displayName = 'FileUploaderFileList';\n"]}
1
+ {"version":3,"sources":["FileUploaderFileList.tsx"],"names":["React","useContext","FileUploaderControlContext","ThemeContext","FileUploaderFile","cx","useFileUploaderSize","jsStyles","FileUploaderFileDataTids","fileList","FileUploaderFileList","props","renderFile","size","onRemove","files","theme","fileWrapperClass","small","fileWrapperSmall","medium","fileWrapperMedium","large","fileWrapperLarge","map","file","id","fileWrapper","__KONTUR_REACT_UI__","displayName"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,UAAhB,QAAkC,OAAlC;;AAEA,SAASC,0BAAT,QAA2C,+BAA3C;AACA,SAASC,YAAT,QAA6B,mCAA7B;AACA,SAASC,gBAAT,QAAiC,sCAAjC;;AAEA,SAASC,EAAT,QAAmB,8BAAnB;AACA,SAASC,mBAAT,QAAoC,8BAApC;;;AAGA,SAASC,QAAT,QAAyB,+BAAzB;;;;;;;;AAQA,OAAO,IAAMC,wBAAwB,GAAG;AACtCC,EAAAA,QAAQ,EAAE,wBAD4B,EAAjC;;;AAIP,OAAO,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,CAACC,KAAD,EAAsC;AACxE,MAAQC,UAAR,GAAuCD,KAAvC,CAAQC,UAAR,CAAoBC,IAApB,GAAuCF,KAAvC,CAAoBE,IAApB,CAA0BC,QAA1B,GAAuCH,KAAvC,CAA0BG,QAA1B;AACA,oBAAkBb,UAAU,CAACC,0BAAD,CAA5B,CAAQa,KAAR,eAAQA,KAAR;AACA,MAAMC,KAAK,GAAGf,UAAU,CAACE,YAAD,CAAxB;;AAEA,MAAMc,gBAAgB,GAAGX,mBAAmB,CAACO,IAAD,EAAO;AACjDK,IAAAA,KAAK,EAAEX,QAAQ,CAACY,gBAAT,CAA0BH,KAA1B,CAD0C;AAEjDI,IAAAA,MAAM,EAAEb,QAAQ,CAACc,iBAAT,CAA2BL,KAA3B,CAFyC;AAGjDM,IAAAA,KAAK,EAAEf,QAAQ,CAACgB,gBAAT,CAA0BP,KAA1B,CAH0C,EAAP,CAA5C;;;AAMA;AACE,iCAAK,YAAUR,wBAAwB,CAACC,QAAxC;AACGM,IAAAA,KAAK,CAACS,GAAN,CAAU,UAACC,IAAD;AACT,qCAAK,GAAG,EAAEA,IAAI,CAACC,EAAf,EAAmB,SAAS,EAAErB,EAAE,CAACE,QAAQ,CAACoB,WAAT,CAAqBX,KAArB,CAAD,EAA8BC,gBAA9B,CAAhC;AACE,qCAAK,SAAS,EAAEV,QAAQ,CAACkB,IAAT,EAAhB;AACGb,QAAAA,UAAU,CAACa,IAAD,eAAO,oBAAC,gBAAD,IAAkB,IAAI,EAAEA,IAAxB,EAA8B,QAAQ,MAAtC,EAAuC,QAAQ,MAA/C,EAAgD,IAAI,EAAEZ,IAAtD,EAA4D,QAAQ,EAAEC,QAAtE,GAAP,CADb,CADF,CADS,GAAV,CADH,CADF;;;;;;AAWD,CAtBM;;AAwBPJ,oBAAoB,CAACkB,mBAArB,GAA2C,sBAA3C;AACAlB,oBAAoB,CAACmB,WAArB,GAAmC,sBAAnC","sourcesContent":["import React, { useContext } from 'react';\n\nimport { FileUploaderControlContext } from '../FileUploaderControlContext';\nimport { ThemeContext } from '../../../lib/theming/ThemeContext';\nimport { FileUploaderFile } from '../FileUploaderFile/FileUploaderFile';\nimport { FileUploaderAttachedFile } from '../fileUtils';\nimport { cx } from '../../../lib/theming/Emotion';\nimport { useFileUploaderSize } from '../hooks/useFileUploaderSize';\nimport { SizeProp } from '../../../lib/types/props';\n\nimport { jsStyles } from './FileUploaderFileList.styles';\n\ninterface FileUploaderFileListProps {\n renderFile: (file: FileUploaderAttachedFile, fileNode: React.ReactElement) => React.ReactNode;\n size: SizeProp;\n onRemove(fileId: string): void;\n}\n\nexport const FileUploaderFileDataTids = {\n fileList: 'FileUploader__fileList',\n} as const;\n\nexport const FileUploaderFileList = (props: FileUploaderFileListProps) => {\n const { renderFile, size, onRemove } = props;\n const { files } = useContext(FileUploaderControlContext);\n const theme = useContext(ThemeContext);\n\n const fileWrapperClass = useFileUploaderSize(size, {\n small: jsStyles.fileWrapperSmall(theme),\n medium: jsStyles.fileWrapperMedium(theme),\n large: jsStyles.fileWrapperLarge(theme),\n });\n\n return (\n <div data-tid={FileUploaderFileDataTids.fileList}>\n {files.map((file) => (\n <div key={file.id} className={cx(jsStyles.fileWrapper(theme), fileWrapperClass)}>\n <div className={jsStyles.file()}>\n {renderFile(file, <FileUploaderFile file={file} showSize multiple size={size} onRemove={onRemove} />)}\n </div>\n </div>\n ))}\n </div>\n );\n};\n\nFileUploaderFileList.__KONTUR_REACT_UI__ = 'FileUploaderFileList';\nFileUploaderFileList.displayName = 'FileUploaderFileList';\n"]}
@@ -4,6 +4,7 @@ import { SizeProp } from '../../../lib/types/props';
4
4
  interface FileUploaderFileListProps {
5
5
  renderFile: (file: FileUploaderAttachedFile, fileNode: React.ReactElement) => React.ReactNode;
6
6
  size: SizeProp;
7
+ onRemove(fileId: string): void;
7
8
  }
8
9
  export declare const FileUploaderFileDataTids: {
9
10
  readonly fileList: "FileUploader__fileList";
@@ -6,6 +6,8 @@ import { getRandomID } from "../../../lib/utils";
6
6
  import { Upgrade } from "../../../lib/Upgrades";
7
7
  import { callChildRef } from "../../../lib/callChildRef/callChildRef";
8
8
  import { RenderInnerContainer } from "../RenderInnerContainer";
9
+ export var PORTAL_INLET_ATTR = 'data-render-container-id';
10
+ export var PORTAL_OUTLET_ATTR = 'data-rendered-container-id';
9
11
  export var RenderContainer = /*#__PURE__*/function (_React$Component) {
10
12
  _inheritsLoose(RenderContainer, _React$Component);
11
13
 
@@ -58,7 +60,7 @@ export var RenderContainer = /*#__PURE__*/function (_React$Component) {
58
60
 
59
61
  if (domContainer) {
60
62
  domContainer.setAttribute('class', Upgrade.getSpecificityClassName());
61
- domContainer.setAttribute('data-rendered-container-id', "" + this.rootId);
63
+ domContainer.setAttribute(PORTAL_OUTLET_ATTR, "" + this.rootId);
62
64
  this.domContainer = domContainer;
63
65
  }
64
66
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["RenderContainer.tsx"],"names":["React","globalObject","getRandomID","Upgrade","callChildRef","RenderInnerContainer","RenderContainer","domContainer","rootId","getRootId","shouldComponentUpdate","nextProps","props","children","mountContainer","unmountContainer","componentWillUnmount","destroyContainer","render","createContainer","document","createElement","setAttribute","getSpecificityClassName","parentNode","body","appendChild","containerRef","ReactTesting","addRenderContainer","removeChild","removeRenderContainer","Component","__KONTUR_REACT_UI__","displayName"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { globalObject } from '@skbkontur/global-object';\n\nimport { Nullable } from '../../typings/utility-types';\nimport { getRandomID } from '../../lib/utils';\nimport { Upgrade } from '../../lib/Upgrades';\nimport { callChildRef } from '../../lib/callChildRef/callChildRef';\n\nimport { RenderInnerContainer } from './RenderInnerContainer';\nimport { RenderContainerProps } from './RenderContainerTypes';\n\nexport class RenderContainer extends React.Component<RenderContainerProps> {\n public static __KONTUR_REACT_UI__ = 'RenderContainer';\n public static displayName = 'RenderContainer';\n\n private static getRootId = () => getRandomID();\n private domContainer: Nullable<HTMLElement> = null;\n\n private readonly rootId: string = RenderContainer.getRootId();\n\n public shouldComponentUpdate(nextProps: RenderContainerProps) {\n if (!this.props.children && nextProps.children) {\n this.mountContainer();\n }\n if (this.props.children && !nextProps.children) {\n this.unmountContainer();\n }\n return true;\n }\n\n public componentWillUnmount() {\n this.destroyContainer();\n }\n\n public render() {\n if (this.props.children) {\n this.mountContainer();\n }\n\n return <RenderInnerContainer {...this.props} domContainer={this.domContainer} rootId={this.rootId} />;\n }\n\n private createContainer() {\n const domContainer = globalObject.document?.createElement('div');\n if (domContainer) {\n domContainer.setAttribute('class', Upgrade.getSpecificityClassName());\n domContainer.setAttribute('data-rendered-container-id', `${this.rootId}`);\n this.domContainer = domContainer;\n }\n }\n\n private mountContainer() {\n if (!this.domContainer) {\n this.createContainer();\n }\n if (this.domContainer && this.domContainer.parentNode !== globalObject.document?.body) {\n globalObject.document?.body.appendChild(this.domContainer);\n\n if (this.props.containerRef) {\n callChildRef(this.props.containerRef, this.domContainer);\n }\n if (globalObject.ReactTesting) {\n globalObject.ReactTesting.addRenderContainer(this.rootId, this);\n }\n }\n }\n\n private destroyContainer() {\n if (this.domContainer) {\n this.unmountContainer();\n this.domContainer = null;\n }\n }\n\n private unmountContainer() {\n if (this.domContainer && this.domContainer.parentNode) {\n this.domContainer.parentNode.removeChild(this.domContainer);\n\n if (this.props.containerRef) {\n callChildRef(this.props.containerRef, null);\n }\n\n if (globalObject.ReactTesting) {\n globalObject.ReactTesting.removeRenderContainer(this.rootId);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["RenderContainer.tsx"],"names":["React","globalObject","getRandomID","Upgrade","callChildRef","RenderInnerContainer","PORTAL_INLET_ATTR","PORTAL_OUTLET_ATTR","RenderContainer","domContainer","rootId","getRootId","shouldComponentUpdate","nextProps","props","children","mountContainer","unmountContainer","componentWillUnmount","destroyContainer","render","createContainer","document","createElement","setAttribute","getSpecificityClassName","parentNode","body","appendChild","containerRef","ReactTesting","addRenderContainer","removeChild","removeRenderContainer","Component","__KONTUR_REACT_UI__","displayName"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { globalObject } from '@skbkontur/global-object';\n\nimport { Nullable } from '../../typings/utility-types';\nimport { getRandomID } from '../../lib/utils';\nimport { Upgrade } from '../../lib/Upgrades';\nimport { callChildRef } from '../../lib/callChildRef/callChildRef';\n\nimport { RenderInnerContainer } from './RenderInnerContainer';\nimport { RenderContainerProps } from './RenderContainerTypes';\n\nexport const PORTAL_INLET_ATTR = 'data-render-container-id';\nexport const PORTAL_OUTLET_ATTR = 'data-rendered-container-id';\n\nexport class RenderContainer extends React.Component<RenderContainerProps> {\n public static __KONTUR_REACT_UI__ = 'RenderContainer';\n public static displayName = 'RenderContainer';\n\n private static getRootId = () => getRandomID();\n private domContainer: Nullable<HTMLElement> = null;\n\n private readonly rootId: string = RenderContainer.getRootId();\n\n public shouldComponentUpdate(nextProps: RenderContainerProps) {\n if (!this.props.children && nextProps.children) {\n this.mountContainer();\n }\n if (this.props.children && !nextProps.children) {\n this.unmountContainer();\n }\n return true;\n }\n\n public componentWillUnmount() {\n this.destroyContainer();\n }\n\n public render() {\n if (this.props.children) {\n this.mountContainer();\n }\n\n return <RenderInnerContainer {...this.props} domContainer={this.domContainer} rootId={this.rootId} />;\n }\n\n private createContainer() {\n const domContainer = globalObject.document?.createElement('div');\n if (domContainer) {\n domContainer.setAttribute('class', Upgrade.getSpecificityClassName());\n domContainer.setAttribute(PORTAL_OUTLET_ATTR, `${this.rootId}`);\n this.domContainer = domContainer;\n }\n }\n\n private mountContainer() {\n if (!this.domContainer) {\n this.createContainer();\n }\n if (this.domContainer && this.domContainer.parentNode !== globalObject.document?.body) {\n globalObject.document?.body.appendChild(this.domContainer);\n\n if (this.props.containerRef) {\n callChildRef(this.props.containerRef, this.domContainer);\n }\n if (globalObject.ReactTesting) {\n globalObject.ReactTesting.addRenderContainer(this.rootId, this);\n }\n }\n }\n\n private destroyContainer() {\n if (this.domContainer) {\n this.unmountContainer();\n this.domContainer = null;\n }\n }\n\n private unmountContainer() {\n if (this.domContainer && this.domContainer.parentNode) {\n this.domContainer.parentNode.removeChild(this.domContainer);\n\n if (this.props.containerRef) {\n callChildRef(this.props.containerRef, null);\n }\n\n if (globalObject.ReactTesting) {\n globalObject.ReactTesting.removeRenderContainer(this.rootId);\n }\n }\n }\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
2
  import { RenderContainerProps } from './RenderContainerTypes';
3
+ export declare const PORTAL_INLET_ATTR = "data-render-container-id";
4
+ export declare const PORTAL_OUTLET_ATTR = "data-rendered-container-id";
3
5
  export declare class RenderContainer extends React.Component<RenderContainerProps> {
4
6
  static __KONTUR_REACT_UI__: string;
5
7
  static displayName: string;
@@ -3,7 +3,8 @@ import React from 'react';
3
3
  import ReactDOM from 'react-dom';
4
4
  import propTypes from 'prop-types';
5
5
  import { globalObject } from '@skbkontur/global-object';
6
- import { safePropTypesInstanceOf } from "../../../lib/SSRSafe"; // Заглушка нужна для корректной гидрации порталов после SSR,
6
+ import { safePropTypesInstanceOf } from "../../../lib/SSRSafe";
7
+ import { PORTAL_INLET_ATTR } from "../RenderContainer"; // Заглушка нужна для корректной гидрации порталов после SSR,
7
8
  // которую реакт сам пока не поддерживает.
8
9
  // @see https://github.com/facebook/react/issues/13097
9
10
  // А также для вставки актуального render-container-id на клиенте.
@@ -28,13 +29,13 @@ var SSRPlaceholder = function SSRPlaceholder() {
28
29
  };
29
30
 
30
31
  export var Portal = function Portal(_ref) {
32
+ var _ref2;
33
+
31
34
  var container = _ref.container,
32
35
  rt_rootID = _ref.rt_rootID,
33
36
  children = _ref.children; // container exists only in browser
34
37
 
35
- return /*#__PURE__*/React.createElement(React.Fragment, null, container ? /*#__PURE__*/ReactDOM.createPortal(children, container) : /*#__PURE__*/React.createElement(SSRPlaceholder, null), container ? /*#__PURE__*/React.createElement("noscript", {
36
- "data-render-container-id": rt_rootID
37
- }) : /*#__PURE__*/React.createElement(SSRPlaceholder, null));
38
+ return /*#__PURE__*/React.createElement(React.Fragment, null, container ? /*#__PURE__*/ReactDOM.createPortal(children, container) : /*#__PURE__*/React.createElement(SSRPlaceholder, null), container ? /*#__PURE__*/React.createElement("noscript", (_ref2 = {}, _ref2[PORTAL_INLET_ATTR] = rt_rootID, _ref2)) : /*#__PURE__*/React.createElement(SSRPlaceholder, null));
38
39
  };
39
40
  export var RenderInnerContainer = /*#__PURE__*/function (_React$Component) {
40
41
  _inheritsLoose(RenderInnerContainer, _React$Component);
@@ -1 +1 @@
1
- {"version":3,"sources":["RenderInnerContainer.tsx"],"names":["React","ReactDOM","propTypes","globalObject","safePropTypesInstanceOf","SSRPlaceholder","Portal","container","rt_rootID","children","createPortal","RenderInnerContainer","render","props","anchor","domContainer","rootId","inner","Component","__KONTUR_REACT_UI__","displayName","HTMLElement","string","isRequired","node"],"mappings":"sEAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,QAAP,MAAqB,WAArB;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,SAASC,YAAT,QAA6B,0BAA7B;;;AAGA,SAASC,uBAAT,QAAwC,mBAAxC;;;;;;;;;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,wBAAM,gCAAQ,WAAQ,iBAAhB,GAAN,EAAvB;;AAEA,OAAO,IAAMC,MAAM,GAAG,SAATA,MAAS,OAAqD,KAAlDC,SAAkD,QAAlDA,SAAkD,CAAvCC,SAAuC,QAAvCA,SAAuC,CAA5BC,QAA4B,QAA5BA,QAA4B;AACzE;AACA;AACE,wBAAC,KAAD,CAAO,QAAP;AACGF,IAAAA,SAAS,gBAAGN,QAAQ,CAACS,YAAT,CAAsBD,QAAtB,EAAgCF,SAAhC,CAAH,gBAAgD,oBAAC,cAAD,OAD5D;AAEGA,IAAAA,SAAS,gBAAG,kCAAU,4BAA0BC,SAApC,GAAH,gBAAuD,oBAAC,cAAD,OAFnE,CADF;;;AAMD,CARM;;AAUP,WAAaG,oBAAb;;;;AAISC,EAAAA,MAJT,GAIE,kBAAgB;AACd,sBAAmD,KAAKC,KAAxD,CAAQC,MAAR,eAAQA,MAAR,CAAgBL,QAAhB,eAAgBA,QAAhB,CAA0BM,YAA1B,eAA0BA,YAA1B,CAAwCC,MAAxC,eAAwCA,MAAxC;AACA,QAAIC,KAAK,GAAGH,MAAZ;;AAEA,QAAIL,QAAJ,EAAc;AACZQ,MAAAA,KAAK;AACH,0BAAC,KAAD,CAAO,QAAP;AACGH,MAAAA,MADH;AAEE,0BAAC,MAAD,IAAQ,GAAG,EAAC,YAAZ,EAAyB,SAAS,EAAEE,MAApC,EAA4C,SAAS,EAAED,YAAvD;AACGN,MAAAA,QADH,CAFF,CADF;;;;AAQD;;AAED,WAAOQ,KAAP;AACD,GApBH,+BAA0CjB,KAAK,CAACkB,SAAhD,EAAaP,oB,CACGQ,mB,GAAsB,sB,CADzBR,oB,CAEGS,W,GAAc,sB;;;AAqB9Bd,MAAM,CAACJ,SAAP,GAAmB;AACjBK,EAAAA,SAAS,EAAEH,uBAAuB,CAACD,YAAY,CAACkB,WAAd,CADjB;AAEjBb,EAAAA,SAAS,EAAEN,SAAS,CAACoB,MAAV,CAAiBC,UAFX;AAGjBd,EAAAA,QAAQ,EAAEP,SAAS,CAACsB,IAAV,CAAeD,UAHR,EAAnB;;;AAMAjB,MAAM,CAACa,mBAAP,GAA6B,QAA7B;AACAb,MAAM,CAACc,WAAP,GAAqB,QAArB","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport propTypes from 'prop-types';\nimport { globalObject } from '@skbkontur/global-object';\n\nimport { Nullable } from '../../typings/utility-types';\nimport { safePropTypesInstanceOf } from '../../lib/SSRSafe';\n\nimport { PortalProps, RenderContainerProps } from './RenderContainerTypes';\n\ninterface RenderInnerContainerProps extends RenderContainerProps {\n domContainer: Nullable<HTMLElement>;\n rootId: string;\n}\n\n// Заглушка нужна для корректной гидрации порталов после SSR,\n// которую реакт сам пока не поддерживает.\n// @see https://github.com/facebook/react/issues/13097\n// А также для вставки актуального render-container-id на клиенте.\n//\n// Дело в том, что во время гидрации, структура HTML на сервере\n// и на клиенте должна совпадать, иначе возможны артефакты.\n// Алгоритм там примерно такой. Клиент во время гидрации идет\n// по этим двум деревьям и сравнивает узлы. Элементы разных типов\n// он подменяет на свои. А те, что совпадают, он оставляет как есть\n// вместе со всеми атрибутами, навесив только обработчики событий.\n//\n// Поэтому, для портала, который рендерится только на клиенте,\n// нужно использовать серверную заглушку, чтобы при гидрации\n// он не испортил какой-то другой элемент. Null не подходит,\n// т.к. на сервере он тоже не рендерится.\n// А элемент с render-container-id нужно отрендерить с нуля.\n\nconst SSRPlaceholder = () => <script data-id=\"ssr-placeholder\" />;\n\nexport const Portal = ({ container, rt_rootID, children }: PortalProps) => {\n // container exists only in browser\n return (\n <React.Fragment>\n {container ? ReactDOM.createPortal(children, container) : <SSRPlaceholder />}\n {container ? <noscript data-render-container-id={rt_rootID} /> : <SSRPlaceholder />}\n </React.Fragment>\n );\n};\n\nexport class RenderInnerContainer extends React.Component<RenderInnerContainerProps> {\n public static __KONTUR_REACT_UI__ = 'RenderInnerContainer';\n public static displayName = 'RenderInnerContainer';\n\n public render() {\n const { anchor, children, domContainer, rootId } = this.props;\n let inner = anchor;\n\n if (children) {\n inner = (\n <React.Fragment>\n {anchor}\n <Portal key=\"portal-ref\" rt_rootID={rootId} container={domContainer}>\n {children}\n </Portal>\n </React.Fragment>\n );\n }\n\n return inner;\n }\n}\n\nPortal.propTypes = {\n container: safePropTypesInstanceOf(globalObject.HTMLElement),\n rt_rootID: propTypes.string.isRequired,\n children: propTypes.node.isRequired,\n};\n\nPortal.__KONTUR_REACT_UI__ = 'Portal';\nPortal.displayName = 'Portal';\n"]}
1
+ {"version":3,"sources":["RenderInnerContainer.tsx"],"names":["React","ReactDOM","propTypes","globalObject","safePropTypesInstanceOf","PORTAL_INLET_ATTR","SSRPlaceholder","Portal","container","rt_rootID","children","createPortal","RenderInnerContainer","render","props","anchor","domContainer","rootId","inner","Component","__KONTUR_REACT_UI__","displayName","HTMLElement","string","isRequired","node"],"mappings":"sEAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,QAAP,MAAqB,WAArB;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,SAASC,YAAT,QAA6B,0BAA7B;;;AAGA,SAASC,uBAAT,QAAwC,mBAAxC;;;AAGA,SAASC,iBAAT,QAAkC,mBAAlC;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,wBAAM,gCAAQ,WAAQ,iBAAhB,GAAN,EAAvB;;AAEA,OAAO,IAAMC,MAAM,GAAG,SAATA,MAAS,OAAqD,eAAlDC,SAAkD,QAAlDA,SAAkD,CAAvCC,SAAuC,QAAvCA,SAAuC,CAA5BC,QAA4B,QAA5BA,QAA4B;AACzE;AACA;AACE,wBAAC,KAAD,CAAO,QAAP;AACGF,IAAAA,SAAS,gBAAGP,QAAQ,CAACU,YAAT,CAAsBD,QAAtB,EAAgCF,SAAhC,CAAH,gBAAgD,oBAAC,cAAD,OAD5D;AAEGA,IAAAA,SAAS,gBAAG,mDAAiBH,iBAAjB,IAAqCI,SAArC,SAAH,gBAA0D,oBAAC,cAAD,OAFtE,CADF;;;AAMD,CARM;;AAUP,WAAaG,oBAAb;;;;AAISC,EAAAA,MAJT,GAIE,kBAAgB;AACd,sBAAmD,KAAKC,KAAxD,CAAQC,MAAR,eAAQA,MAAR,CAAgBL,QAAhB,eAAgBA,QAAhB,CAA0BM,YAA1B,eAA0BA,YAA1B,CAAwCC,MAAxC,eAAwCA,MAAxC;AACA,QAAIC,KAAK,GAAGH,MAAZ;;AAEA,QAAIL,QAAJ,EAAc;AACZQ,MAAAA,KAAK;AACH,0BAAC,KAAD,CAAO,QAAP;AACGH,MAAAA,MADH;AAEE,0BAAC,MAAD,IAAQ,GAAG,EAAC,YAAZ,EAAyB,SAAS,EAAEE,MAApC,EAA4C,SAAS,EAAED,YAAvD;AACGN,MAAAA,QADH,CAFF,CADF;;;;AAQD;;AAED,WAAOQ,KAAP;AACD,GApBH,+BAA0ClB,KAAK,CAACmB,SAAhD,EAAaP,oB,CACGQ,mB,GAAsB,sB,CADzBR,oB,CAEGS,W,GAAc,sB;;;AAqB9Bd,MAAM,CAACL,SAAP,GAAmB;AACjBM,EAAAA,SAAS,EAAEJ,uBAAuB,CAACD,YAAY,CAACmB,WAAd,CADjB;AAEjBb,EAAAA,SAAS,EAAEP,SAAS,CAACqB,MAAV,CAAiBC,UAFX;AAGjBd,EAAAA,QAAQ,EAAER,SAAS,CAACuB,IAAV,CAAeD,UAHR,EAAnB;;;AAMAjB,MAAM,CAACa,mBAAP,GAA6B,QAA7B;AACAb,MAAM,CAACc,WAAP,GAAqB,QAArB","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport propTypes from 'prop-types';\nimport { globalObject } from '@skbkontur/global-object';\n\nimport { Nullable } from '../../typings/utility-types';\nimport { safePropTypesInstanceOf } from '../../lib/SSRSafe';\n\nimport { PortalProps, RenderContainerProps } from './RenderContainerTypes';\nimport { PORTAL_INLET_ATTR } from './RenderContainer';\n\ninterface RenderInnerContainerProps extends RenderContainerProps {\n domContainer: Nullable<HTMLElement>;\n rootId: string;\n}\n\n// Заглушка нужна для корректной гидрации порталов после SSR,\n// которую реакт сам пока не поддерживает.\n// @see https://github.com/facebook/react/issues/13097\n// А также для вставки актуального render-container-id на клиенте.\n//\n// Дело в том, что во время гидрации, структура HTML на сервере\n// и на клиенте должна совпадать, иначе возможны артефакты.\n// Алгоритм там примерно такой. Клиент во время гидрации идет\n// по этим двум деревьям и сравнивает узлы. Элементы разных типов\n// он подменяет на свои. А те, что совпадают, он оставляет как есть\n// вместе со всеми атрибутами, навесив только обработчики событий.\n//\n// Поэтому, для портала, который рендерится только на клиенте,\n// нужно использовать серверную заглушку, чтобы при гидрации\n// он не испортил какой-то другой элемент. Null не подходит,\n// т.к. на сервере он тоже не рендерится.\n// А элемент с render-container-id нужно отрендерить с нуля.\n\nconst SSRPlaceholder = () => <script data-id=\"ssr-placeholder\" />;\n\nexport const Portal = ({ container, rt_rootID, children }: PortalProps) => {\n // container exists only in browser\n return (\n <React.Fragment>\n {container ? ReactDOM.createPortal(children, container) : <SSRPlaceholder />}\n {container ? <noscript {...{ [PORTAL_INLET_ATTR]: rt_rootID }} /> : <SSRPlaceholder />}\n </React.Fragment>\n );\n};\n\nexport class RenderInnerContainer extends React.Component<RenderInnerContainerProps> {\n public static __KONTUR_REACT_UI__ = 'RenderInnerContainer';\n public static displayName = 'RenderInnerContainer';\n\n public render() {\n const { anchor, children, domContainer, rootId } = this.props;\n let inner = anchor;\n\n if (children) {\n inner = (\n <React.Fragment>\n {anchor}\n <Portal key=\"portal-ref\" rt_rootID={rootId} container={domContainer}>\n {children}\n </Portal>\n </React.Fragment>\n );\n }\n\n return inner;\n }\n}\n\nPortal.propTypes = {\n container: safePropTypesInstanceOf(globalObject.HTMLElement),\n rt_rootID: propTypes.string.isRequired,\n children: propTypes.node.isRequired,\n};\n\nPortal.__KONTUR_REACT_UI__ = 'Portal';\nPortal.displayName = 'Portal';\n"]}
@@ -10,11 +10,15 @@ import { globalObject, isBrowser } from '@skbkontur/global-object';
10
10
  import { callChildRef } from "../../../lib/callChildRef/callChildRef";
11
11
  import { rootNode } from "../../../lib/rootNode";
12
12
  import { createPropsGetter } from "../../../lib/createPropsGetter";
13
+ import { isInstanceOf } from "../../../lib/isInstanceOf";
14
+ import { LoaderDataTids } from "../../../components/Loader";
15
+ import { PORTAL_INLET_ATTR, PORTAL_OUTLET_ATTR } from "../../RenderContainer";
13
16
  import { incrementZIndex, removeZIndex, upperBorder } from "../ZIndexStorage";
14
- var ZIndexContext = /*#__PURE__*/React.createContext({
17
+ var DEFAULT_ZINDEX_CONTEXT = {
15
18
  parentLayerZIndex: 0,
16
19
  maxZIndex: Infinity
17
- });
20
+ };
21
+ var ZIndexContext = /*#__PURE__*/React.createContext(DEFAULT_ZINDEX_CONTEXT);
18
22
  ZIndexContext.displayName = 'ZIndexContext';
19
23
  export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (_React$Component) {
20
24
  _inheritsLoose(ZIndex, _React$Component);
@@ -24,9 +28,11 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
24
28
 
25
29
  _this = _React$Component.call(this, props) || this;
26
30
  _this.state = {
27
- zIndex: 0
31
+ zIndex: 0,
32
+ savedZIndexContext: null
28
33
  };
29
34
  _this.getProps = createPropsGetter(ZIndex.defaultProps);
35
+ _this.zIndexContext = null;
30
36
 
31
37
  _this.wrapperRef = function (element) {
32
38
  var wrapperRef = _this.props.wrapperRef;
@@ -34,6 +40,7 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
34
40
  _this.setRootNode(element);
35
41
 
36
42
  wrapperRef && callChildRef(wrapperRef, element);
43
+ element && _this.tryGetContextByDOM(element);
37
44
  };
38
45
 
39
46
  _this.increment = function () {
@@ -44,6 +51,43 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
44
51
  return incrementZIndex(priority, delta);
45
52
  };
46
53
 
54
+ _this.tryGetContextByDOM = function (element) {
55
+ if (DEFAULT_ZINDEX_CONTEXT === _this.zIndexContext && _this.state.savedZIndexContext === null) {
56
+ var _element$parentElemen;
57
+
58
+ var savedZIndexContext = DEFAULT_ZINDEX_CONTEXT;
59
+ var portal = (_element$parentElemen = element.parentElement) == null ? void 0 : _element$parentElemen.closest("[" + PORTAL_OUTLET_ATTR + "]");
60
+
61
+ if (isInstanceOf(portal, globalObject.HTMLElement)) {
62
+ var _noscript$parentEleme;
63
+
64
+ var portalID = portal.getAttribute(PORTAL_OUTLET_ATTR);
65
+ var noscript = document.querySelector("noscript[" + PORTAL_INLET_ATTR + "=\"" + portalID + "\"]");
66
+ var parent = noscript == null ? void 0 : (_noscript$parentEleme = noscript.parentElement) == null ? void 0 : _noscript$parentEleme.closest('[style*=z-index]');
67
+
68
+ if (isInstanceOf(parent, globalObject.HTMLElement)) {
69
+ var _parent$parentElement;
70
+
71
+ var newZIndex = Number(parent.style.zIndex || 0);
72
+ var maxZIndex = Infinity;
73
+
74
+ if (((_parent$parentElement = parent.parentElement) == null ? void 0 : _parent$parentElement.dataset.tid) === LoaderDataTids.veil) {
75
+ maxZIndex = _this.calcZIndex(newZIndex, maxZIndex);
76
+ }
77
+
78
+ savedZIndexContext = {
79
+ maxZIndex: maxZIndex,
80
+ parentLayerZIndex: newZIndex
81
+ };
82
+ }
83
+ }
84
+
85
+ _this.setState({
86
+ savedZIndexContext: savedZIndexContext
87
+ });
88
+ }
89
+ };
90
+
47
91
  _this.state.zIndex = _this.increment();
48
92
  return _this;
49
93
  }
@@ -79,17 +123,21 @@ export var ZIndex = rootNode(_class = (_temp = _class2 = /*#__PURE__*/function (
79
123
  rest = _objectWithoutPropertiesLoose(_this$getProps2, _excluded);
80
124
 
81
125
  var wrapperStyle = {};
82
- return /*#__PURE__*/React.createElement(ZIndexContext.Consumer, null, function (_ref) {
83
- var parentLayerZIndex = _ref.parentLayerZIndex,
126
+ return /*#__PURE__*/React.createElement(ZIndexContext.Consumer, null, function (context) {
127
+ _this2.zIndexContext = context;
128
+
129
+ var _ref = _this2.state.savedZIndexContext || context,
130
+ parentLayerZIndex = _ref.parentLayerZIndex,
84
131
  maxZIndex = _ref.maxZIndex;
132
+
85
133
  var zIndexContextValue = {
86
134
  parentLayerZIndex: parentLayerZIndex,
87
135
  maxZIndex: maxZIndex
88
136
  };
137
+ var newZIndex = 0;
89
138
 
90
139
  if (applyZIndex) {
91
- var newZIndex = _this2.calcZIndex(parentLayerZIndex, maxZIndex);
92
-
140
+ newZIndex = _this2.calcZIndex(parentLayerZIndex, maxZIndex);
93
141
  wrapperStyle.zIndex = newZIndex;
94
142
  zIndexContextValue = coverChildren ? {
95
143
  parentLayerZIndex: parentLayerZIndex,
@@ -1 +1 @@
1
- {"version":3,"sources":["ZIndex.tsx"],"names":["React","globalObject","isBrowser","callChildRef","rootNode","createPropsGetter","incrementZIndex","removeZIndex","upperBorder","ZIndexContext","createContext","parentLayerZIndex","maxZIndex","Infinity","displayName","ZIndex","props","state","zIndex","getProps","defaultProps","wrapperRef","element","setRootNode","increment","priority","delta","componentDidUpdate","prevProps","setState","componentWillUnmount","render","style","children","applyZIndex","coverChildren","createStackingContext","useWrapper","rest","wrapperStyle","zIndexContextValue","newZIndex","calcZIndex","Number","isFinite","document","body","isolation","transform","child","allowedValuesIntervalLength","scale","Math","ceil","Component","__KONTUR_REACT_UI__","propTypes","Error","trunc"],"mappings":"+YAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,YAAT,EAAuBC,SAAvB,QAAwC,0BAAxC;;AAEA,SAASC,YAAT,QAA6B,qCAA7B;AACA,SAASC,QAAT,QAAuC,oBAAvC;AACA,SAASC,iBAAT,QAAkC,6BAAlC;;AAEA,SAASC,eAAT,EAA0BC,YAA1B,EAAwCC,WAAxC,QAA+E,iBAA/E;;AAEA,IAAMC,aAAa,gBAAGT,KAAK,CAACU,aAAN,CAAoB,EAAEC,iBAAiB,EAAE,CAArB,EAAwBC,SAAS,EAAEC,QAAnC,EAApB,CAAtB;;AAEAJ,aAAa,CAACK,WAAd,GAA4B,eAA5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,WAAaC,MAAb,GADCX,QACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCE,kBAAYY,KAAZ,EAAgC;AAC9B,wCAAMA,KAAN,UAD8B,MAnBzBC,KAmByB,GAnBjB,EACbC,MAAM,EAAE,CADK,EAmBiB,OAfxBC,QAewB,GAfbd,iBAAiB,CAACU,MAAM,CAACK,YAAR,CAeJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkExBC,IAAAA,UAlEwB,GAkEX,UAACC,OAAD,EAAoC;AACvD,UAAQD,UAAR,GAAuB,MAAKL,KAA5B,CAAQK,UAAR;AACA,YAAKE,WAAL,CAAiBD,OAAjB;AACAD,MAAAA,UAAU,IAAIlB,YAAY,CAACkB,UAAD,EAAaC,OAAb,CAA1B;AACD,KAtE+B;;;;;;;;;;;;;;;;AAsFxBE,IAAAA,SAtFwB,GAsFZ,YAAM;AACxB,2BAA4B,MAAKL,QAAL,EAA5B,CAAQM,QAAR,kBAAQA,QAAR,CAAkBC,KAAlB,kBAAkBA,KAAlB;;AAEA,aAAOpB,eAAe,CAACmB,QAAD,EAAWC,KAAX,CAAtB;AACD,KA1F+B,CAE9B,MAAKT,KAAL,CAAWC,MAAX,GAAoB,MAAKM,SAAL,EAApB,CAF8B,aAG/B,CApCH,qCAsCSG,kBAtCT,GAsCE,4BAA0BC,SAA1B,EAA4D,CAC1D,IAAIA,SAAS,CAACH,QAAV,KAAuB,KAAKT,KAAL,CAAWS,QAAlC,IAA8CG,SAAS,CAACF,KAAV,KAAoB,KAAKV,KAAL,CAAWU,KAAjF,EAAwF,CACtFnB,YAAY,CAAC,KAAKU,KAAL,CAAWC,MAAZ,CAAZ,CACA,KAAKW,QAAL,CAAc,EAAEX,MAAM,EAAE,KAAKM,SAAL,EAAV,EAAd,EACD,CACF,CA3CH,QA6CSM,oBA7CT,GA6CE,gCAA8B,CAC5BvB,YAAY,CAAC,KAAKU,KAAL,CAAWC,MAAZ,CAAZ,CACD,CA/CH,QAiDSa,MAjDT,GAiDE,kBAAgB,mBACd,sBAWI,KAAKZ,QAAL,EAXJ,CACEa,KADF,mBACEA,KADF,CAEEC,QAFF,mBAEEA,QAFF,CAGEP,KAHF,mBAGEA,KAHF,CAIED,QAJF,mBAIEA,QAJF,CAKES,WALF,mBAKEA,WALF,CAMEC,aANF,mBAMEA,aANF,CAOEC,qBAPF,mBAOEA,qBAPF,CAQEf,UARF,mBAQEA,UARF,CASEgB,UATF,mBASEA,UATF,CAUKC,IAVL,6DAaA,IAAMC,YAAiC,GAAG,EAA1C,CAEA,oBACE,oBAAC,aAAD,CAAe,QAAf,QACG,gBAAsC,KAAnC5B,iBAAmC,QAAnCA,iBAAmC,CAAhBC,SAAgB,QAAhBA,SAAgB,CACrC,IAAI4B,kBAAkB,GAAG,EAAE7B,iBAAiB,EAAjBA,iBAAF,EAAqBC,SAAS,EAATA,SAArB,EAAzB,CAEA,IAAIsB,WAAJ,EAAiB,CACf,IAAMO,SAAS,GAAG,MAAI,CAACC,UAAL,CAAgB/B,iBAAhB,EAAmCC,SAAnC,CAAlB,CACA2B,YAAY,CAACrB,MAAb,GAAsBuB,SAAtB,CAEAD,kBAAkB,GAAGL,aAAa,GAC9B,EAAExB,iBAAiB,EAAjBA,iBAAF,EAAqBC,SAAS,EAAE6B,SAAhC,EAD8B,GAE9B,EAAE9B,iBAAiB,EAAE8B,SAArB,EAAgC7B,SAAS,EAAE+B,MAAM,CAACC,QAAP,CAAgBhC,SAAhB,IAA6B6B,SAA7B,GAAyC5B,QAApF,EAFJ,CAIA,IAAIuB,qBAAJ,EAA2B,CACzBlC,SAAS,CAACD,YAAD,CAAT,IAA2B,eAAeA,YAAY,CAAC4C,QAAb,CAAsBC,IAAtB,CAA2Bd,KAArE,GACKO,YAAY,CAACQ,SAAb,GAAyB,SAD9B,GAEKR,YAAY,CAACS,SAAb,GAAyB,WAF9B,CAGD,CACF,CAED,IAAMC,KAAK,GAAG,CAACZ,UAAD,GACZJ,QADY,gBAGZ,sCAAK,KAAK,eAAOD,KAAP,EAAiBO,YAAjB,CAAV,EAA2C,GAAG,EAAE,MAAI,CAAClB,UAArD,IAAqEiB,IAArE,GACGL,QADH,CAHF,CAQA,oBAAO,oBAAC,aAAD,CAAe,QAAf,IAAwB,KAAK,EAAEO,kBAA/B,IAAoDS,KAApD,CAAP,CACD,CA5BH,CADF,CAgCD,CAjGH,QAyGUP,UAzGV,GAyGE,oBAAmB/B,iBAAnB,EAA8CC,SAA9C,EAAiE,CAC/D,IAAI6B,SAAS,GAAG,KAAKxB,KAAL,CAAWC,MAA3B,CAEA,IAAIyB,MAAM,CAACC,QAAP,CAAgBhC,SAAhB,CAAJ,EAAgC,CAC9B,IAAMsC,2BAA2B,GAAGtC,SAAS,GAAGD,iBAAhD,CACA,IAAMwC,KAAK,GAAG3C,WAAW,GAAG0C,2BAA5B,CACAT,SAAS,GAAGW,IAAI,CAACC,IAAL,CAAUZ,SAAS,GAAGU,KAAtB,CAAZ,CACD,CAEDV,SAAS,IAAI9B,iBAAb,CAEA,OAAO8B,SAAP,CACD,CArHH,iBAA4BzC,KAAK,CAACsD,SAAlC,WACgBC,mBADhB,GACsC,QADtC,UAEgBzC,WAFhB,GAE8B,QAF9B,UAIgBM,YAJhB,GAI6C,EACzCM,KAAK,EAAE,EADkC,EAEzCD,QAAQ,EAAE,CAF+B,EAGzCO,KAAK,EAAE,EAHkC,EAIzCE,WAAW,EAAE,IAJ4B,EAKzCC,aAAa,EAAE,KAL0B,EAMzCC,qBAAqB,EAAE,KANkB,EAOzCC,UAAU,EAAE,IAP6B,EAJ7C,UAoBgBmB,SApBhB,GAoB4B,EACxB9B,KADwB,iBAClBV,KADkB,EACE,CACxB,IAAI,CAACA,KAAK,CAACU,KAAN,IAAeX,OAAM,CAACK,YAAP,CAAoBM,KAApC,KAA8C,CAAlD,EAAqD,CACnD,OAAO,IAAI+B,KAAJ,8DAAqEzC,KAAK,CAACU,KAA3E,CAAP,CACD,CACD,IAAI0B,IAAI,CAACM,KAAL,CAAW1C,KAAK,CAACU,KAAN,IAAeX,OAAM,CAACK,YAAP,CAAoBM,KAA9C,MAAyDV,KAAK,CAACU,KAAnE,EAA0E,CACxE,OAAO,IAAI+B,KAAJ,uDAA8DzC,KAAK,CAACU,KAApE,CAAP,CACD,CACF,CARuB,EApB5B","sourcesContent":["import React from 'react';\nimport { globalObject, isBrowser } from '@skbkontur/global-object';\n\nimport { callChildRef } from '../../lib/callChildRef/callChildRef';\nimport { rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\n\nimport { incrementZIndex, removeZIndex, upperBorder, LayerComponentName } from './ZIndexStorage';\n\nconst ZIndexContext = React.createContext({ parentLayerZIndex: 0, maxZIndex: Infinity });\n\nZIndexContext.displayName = 'ZIndexContext';\n\nexport interface ZIndexProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Приращение к z-index\n */\n delta?: number;\n priority?: number | LayerComponentName;\n style?: React.CSSProperties;\n createStackingContext?: boolean;\n coverChildren?: boolean;\n applyZIndex?: boolean;\n className?: string;\n wrapperRef?: React.Ref<HTMLDivElement> | undefined | null;\n\n /**\n * Явно указывает, что вложенные элементы должны быть обёрнуты в `<div/>`.\n * Для случаев, когда необходимо задать **только** контекст для области.\n *\n * @default true\n */\n useWrapper?: boolean;\n}\n\ntype DefaultProps = Required<\n Pick<\n ZIndexProps,\n 'delta' | 'priority' | 'style' | 'applyZIndex' | 'coverChildren' | 'createStackingContext' | 'useWrapper'\n >\n>;\n\ninterface ZIndexState {\n zIndex: number;\n}\n\n@rootNode\nexport class ZIndex extends React.Component<ZIndexProps, ZIndexState> {\n public static __KONTUR_REACT_UI__ = 'ZIndex';\n public static displayName = 'ZIndex';\n\n public static defaultProps: DefaultProps = {\n delta: 10,\n priority: 0,\n style: {},\n applyZIndex: true,\n coverChildren: false,\n createStackingContext: false,\n useWrapper: true,\n };\n\n public state = {\n zIndex: 0,\n };\n\n private getProps = createPropsGetter(ZIndex.defaultProps);\n\n public static propTypes = {\n delta(props: ZIndexProps) {\n if ((props.delta || ZIndex.defaultProps.delta) <= 0) {\n return new Error(`[ZIndex]: Prop 'delta' must be greater than 0, received ${props.delta}`);\n }\n if (Math.trunc(props.delta || ZIndex.defaultProps.delta) !== props.delta) {\n return new Error(`[ZIndex]: Prop 'delta' must be integer, received ${props.delta}`);\n }\n },\n };\n\n private setRootNode!: TSetRootNode;\n\n constructor(props: ZIndexProps) {\n super(props);\n this.state.zIndex = this.increment();\n }\n\n public componentDidUpdate(prevProps: Readonly<ZIndexProps>) {\n if (prevProps.priority !== this.props.priority || prevProps.delta !== this.props.delta) {\n removeZIndex(this.state.zIndex);\n this.setState({ zIndex: this.increment() });\n }\n }\n\n public componentWillUnmount() {\n removeZIndex(this.state.zIndex);\n }\n\n public render() {\n const {\n style,\n children,\n delta,\n priority,\n applyZIndex,\n coverChildren,\n createStackingContext,\n wrapperRef,\n useWrapper,\n ...rest\n } = this.getProps();\n\n const wrapperStyle: React.CSSProperties = {};\n\n return (\n <ZIndexContext.Consumer>\n {({ parentLayerZIndex, maxZIndex }) => {\n let zIndexContextValue = { parentLayerZIndex, maxZIndex };\n\n if (applyZIndex) {\n const newZIndex = this.calcZIndex(parentLayerZIndex, maxZIndex);\n wrapperStyle.zIndex = newZIndex;\n\n zIndexContextValue = coverChildren\n ? { parentLayerZIndex, maxZIndex: newZIndex }\n : { parentLayerZIndex: newZIndex, maxZIndex: Number.isFinite(maxZIndex) ? newZIndex : Infinity };\n\n if (createStackingContext) {\n isBrowser(globalObject) && 'isolation' in globalObject.document.body.style\n ? (wrapperStyle.isolation = 'isolate')\n : (wrapperStyle.transform = 'rotate(0)');\n }\n }\n\n const child = !useWrapper ? (\n children\n ) : (\n <div style={{ ...style, ...wrapperStyle }} ref={this.wrapperRef} {...rest}>\n {children}\n </div>\n );\n\n return <ZIndexContext.Provider value={zIndexContextValue}>{child}</ZIndexContext.Provider>;\n }}\n </ZIndexContext.Consumer>\n );\n }\n\n private wrapperRef = (element: HTMLDivElement | null) => {\n const { wrapperRef } = this.props;\n this.setRootNode(element);\n wrapperRef && callChildRef(wrapperRef, element);\n };\n\n private calcZIndex(parentLayerZIndex: number, maxZIndex: number) {\n let newZIndex = this.state.zIndex;\n\n if (Number.isFinite(maxZIndex)) {\n const allowedValuesIntervalLength = maxZIndex - parentLayerZIndex;\n const scale = upperBorder / allowedValuesIntervalLength;\n newZIndex = Math.ceil(newZIndex / scale);\n }\n\n newZIndex += parentLayerZIndex;\n\n return newZIndex;\n }\n\n private increment = () => {\n const { priority, delta } = this.getProps();\n\n return incrementZIndex(priority, delta);\n };\n}\n"]}
1
+ {"version":3,"sources":["ZIndex.tsx"],"names":["React","globalObject","isBrowser","callChildRef","rootNode","createPropsGetter","isInstanceOf","LoaderDataTids","PORTAL_INLET_ATTR","PORTAL_OUTLET_ATTR","incrementZIndex","removeZIndex","upperBorder","DEFAULT_ZINDEX_CONTEXT","parentLayerZIndex","maxZIndex","Infinity","ZIndexContext","createContext","displayName","ZIndex","props","state","zIndex","savedZIndexContext","getProps","defaultProps","zIndexContext","wrapperRef","element","setRootNode","tryGetContextByDOM","increment","priority","delta","portal","parentElement","closest","HTMLElement","portalID","getAttribute","noscript","document","querySelector","parent","newZIndex","Number","style","dataset","tid","veil","calcZIndex","setState","componentDidUpdate","prevProps","componentWillUnmount","render","children","applyZIndex","coverChildren","createStackingContext","useWrapper","rest","wrapperStyle","context","zIndexContextValue","isFinite","body","isolation","transform","child","allowedValuesIntervalLength","scale","Math","ceil","Component","__KONTUR_REACT_UI__","propTypes","Error","trunc"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { globalObject, isBrowser } from '@skbkontur/global-object';\n\nimport { callChildRef } from '../../lib/callChildRef/callChildRef';\nimport { rootNode, TSetRootNode } from '../../lib/rootNode';\nimport { createPropsGetter } from '../../lib/createPropsGetter';\nimport { isInstanceOf } from '../../lib/isInstanceOf';\nimport { LoaderDataTids } from '../../components/Loader';\nimport { PORTAL_INLET_ATTR, PORTAL_OUTLET_ATTR } from '../RenderContainer';\n\nimport { incrementZIndex, removeZIndex, upperBorder, LayerComponentName } from './ZIndexStorage';\n\nconst DEFAULT_ZINDEX_CONTEXT = { parentLayerZIndex: 0, maxZIndex: Infinity };\n\nconst ZIndexContext = React.createContext(DEFAULT_ZINDEX_CONTEXT);\n\nZIndexContext.displayName = 'ZIndexContext';\n\nexport interface ZIndexProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Приращение к z-index\n */\n delta?: number;\n priority?: number | LayerComponentName;\n style?: React.CSSProperties;\n createStackingContext?: boolean;\n coverChildren?: boolean;\n applyZIndex?: boolean;\n className?: string;\n wrapperRef?: React.Ref<HTMLDivElement> | undefined | null;\n\n /**\n * Явно указывает, что вложенные элементы должны быть обёрнуты в `<div/>`.\n * Для случаев, когда необходимо задать **только** контекст для области.\n *\n * @default true\n */\n useWrapper?: boolean;\n}\n\ntype DefaultProps = Required<\n Pick<\n ZIndexProps,\n 'delta' | 'priority' | 'style' | 'applyZIndex' | 'coverChildren' | 'createStackingContext' | 'useWrapper'\n >\n>;\n\ninterface ZIndexState {\n zIndex: number;\n savedZIndexContext: { parentLayerZIndex: number; maxZIndex: number } | null;\n}\n\n@rootNode\nexport class ZIndex extends React.Component<ZIndexProps, ZIndexState> {\n public static __KONTUR_REACT_UI__ = 'ZIndex';\n public static displayName = 'ZIndex';\n\n public static defaultProps: DefaultProps = {\n delta: 10,\n priority: 0,\n style: {},\n applyZIndex: true,\n coverChildren: false,\n createStackingContext: false,\n useWrapper: true,\n };\n\n public state: ZIndexState = {\n zIndex: 0,\n savedZIndexContext: null,\n };\n\n private getProps = createPropsGetter(ZIndex.defaultProps);\n\n public static propTypes = {\n delta(props: ZIndexProps) {\n if ((props.delta || ZIndex.defaultProps.delta) <= 0) {\n return new Error(`[ZIndex]: Prop 'delta' must be greater than 0, received ${props.delta}`);\n }\n if (Math.trunc(props.delta || ZIndex.defaultProps.delta) !== props.delta) {\n return new Error(`[ZIndex]: Prop 'delta' must be integer, received ${props.delta}`);\n }\n },\n };\n\n private setRootNode!: TSetRootNode;\n private zIndexContext: { parentLayerZIndex: number; maxZIndex: number } | null = null;\n\n constructor(props: ZIndexProps) {\n super(props);\n this.state.zIndex = this.increment();\n }\n\n public componentDidUpdate(prevProps: Readonly<ZIndexProps>) {\n if (prevProps.priority !== this.props.priority || prevProps.delta !== this.props.delta) {\n removeZIndex(this.state.zIndex);\n this.setState({ zIndex: this.increment() });\n }\n }\n\n public componentWillUnmount() {\n removeZIndex(this.state.zIndex);\n }\n\n public render() {\n const {\n style,\n children,\n delta,\n priority,\n applyZIndex,\n coverChildren,\n createStackingContext,\n wrapperRef,\n useWrapper,\n ...rest\n } = this.getProps();\n\n const wrapperStyle: React.CSSProperties = {};\n\n return (\n <ZIndexContext.Consumer>\n {(context) => {\n this.zIndexContext = context;\n const { parentLayerZIndex, maxZIndex } = this.state.savedZIndexContext || context;\n let zIndexContextValue = { parentLayerZIndex, maxZIndex };\n let newZIndex = 0;\n if (applyZIndex) {\n newZIndex = this.calcZIndex(parentLayerZIndex, maxZIndex);\n wrapperStyle.zIndex = newZIndex;\n\n zIndexContextValue = coverChildren\n ? { parentLayerZIndex, maxZIndex: newZIndex }\n : { parentLayerZIndex: newZIndex, maxZIndex: Number.isFinite(maxZIndex) ? newZIndex : Infinity };\n\n if (createStackingContext) {\n isBrowser(globalObject) && 'isolation' in globalObject.document.body.style\n ? (wrapperStyle.isolation = 'isolate')\n : (wrapperStyle.transform = 'rotate(0)');\n }\n }\n\n const child = !useWrapper ? (\n children\n ) : (\n <div style={{ ...style, ...wrapperStyle }} ref={this.wrapperRef} {...rest}>\n {children}\n </div>\n );\n\n return <ZIndexContext.Provider value={zIndexContextValue}>{child}</ZIndexContext.Provider>;\n }}\n </ZIndexContext.Consumer>\n );\n }\n\n private wrapperRef = (element: HTMLDivElement | null) => {\n const { wrapperRef } = this.props;\n this.setRootNode(element);\n wrapperRef && callChildRef(wrapperRef, element);\n element && this.tryGetContextByDOM(element);\n };\n\n private calcZIndex(parentLayerZIndex: number, maxZIndex: number) {\n let newZIndex = this.state.zIndex;\n\n if (Number.isFinite(maxZIndex)) {\n const allowedValuesIntervalLength = maxZIndex - parentLayerZIndex;\n const scale = upperBorder / allowedValuesIntervalLength;\n newZIndex = Math.ceil(newZIndex / scale);\n }\n\n newZIndex += parentLayerZIndex;\n\n return newZIndex;\n }\n\n private increment = () => {\n const { priority, delta } = this.getProps();\n\n return incrementZIndex(priority, delta);\n };\n\n private tryGetContextByDOM = (element: HTMLDivElement) => {\n if (DEFAULT_ZINDEX_CONTEXT === this.zIndexContext && this.state.savedZIndexContext === null) {\n let savedZIndexContext = DEFAULT_ZINDEX_CONTEXT;\n const portal = element.parentElement?.closest(`[${PORTAL_OUTLET_ATTR}]`);\n\n if (isInstanceOf(portal, globalObject.HTMLElement)) {\n const portalID = portal.getAttribute(PORTAL_OUTLET_ATTR);\n const noscript = document.querySelector(`noscript[${PORTAL_INLET_ATTR}=\"${portalID}\"]`);\n const parent = noscript?.parentElement?.closest('[style*=z-index]');\n\n if (isInstanceOf(parent, globalObject.HTMLElement)) {\n const newZIndex = Number(parent.style.zIndex || 0);\n\n let maxZIndex = Infinity;\n\n if (parent.parentElement?.dataset.tid === LoaderDataTids.veil) {\n maxZIndex = this.calcZIndex(newZIndex, maxZIndex);\n }\n\n savedZIndexContext = { maxZIndex, parentLayerZIndex: newZIndex };\n }\n }\n\n this.setState({ savedZIndexContext });\n }\n };\n}\n"]}
@@ -23,19 +23,22 @@ export interface ZIndexProps extends React.HTMLAttributes<HTMLDivElement> {
23
23
  declare type DefaultProps = Required<Pick<ZIndexProps, 'delta' | 'priority' | 'style' | 'applyZIndex' | 'coverChildren' | 'createStackingContext' | 'useWrapper'>>;
24
24
  interface ZIndexState {
25
25
  zIndex: number;
26
+ savedZIndexContext: {
27
+ parentLayerZIndex: number;
28
+ maxZIndex: number;
29
+ } | null;
26
30
  }
27
31
  export declare class ZIndex extends React.Component<ZIndexProps, ZIndexState> {
28
32
  static __KONTUR_REACT_UI__: string;
29
33
  static displayName: string;
30
34
  static defaultProps: DefaultProps;
31
- state: {
32
- zIndex: number;
33
- };
35
+ state: ZIndexState;
34
36
  private getProps;
35
37
  static propTypes: {
36
38
  delta(props: ZIndexProps): Error | undefined;
37
39
  };
38
40
  private setRootNode;
41
+ private zIndexContext;
39
42
  constructor(props: ZIndexProps);
40
43
  componentDidUpdate(prevProps: Readonly<ZIndexProps>): void;
41
44
  componentWillUnmount(): void;
@@ -43,5 +46,6 @@ export declare class ZIndex extends React.Component<ZIndexProps, ZIndexState> {
43
46
  private wrapperRef;
44
47
  private calcZIndex;
45
48
  private increment;
49
+ private tryGetContextByDOM;
46
50
  }
47
51
  export {};
@@ -3,6 +3,7 @@ var _globalObject$documen2;
3
3
  import ReactDOM from 'react-dom';
4
4
  import debounce from 'lodash.debounce';
5
5
  import { globalObject } from '@skbkontur/global-object';
6
+ import { PORTAL_INLET_ATTR, PORTAL_OUTLET_ATTR } from "../../internal/RenderContainer";
6
7
  import { isInstanceOf } from "../isInstanceOf";
7
8
  import { isFirefox } from "../client";
8
9
  var handlers = [];
@@ -80,12 +81,12 @@ export function findRenderContainer(node, rootNode, container) {
80
81
  return container ? container : null;
81
82
  }
82
83
 
83
- var newContainerId = currentNode.getAttribute('data-rendered-container-id');
84
+ var newContainerId = currentNode.getAttribute(PORTAL_OUTLET_ATTR);
84
85
 
85
86
  if (newContainerId) {
86
87
  var _globalObject$documen5;
87
88
 
88
- var nextNode = (_globalObject$documen5 = globalObject.document) == null ? void 0 : _globalObject$documen5.querySelector("[data-render-container-id~=\"" + newContainerId + "\"]");
89
+ var nextNode = (_globalObject$documen5 = globalObject.document) == null ? void 0 : _globalObject$documen5.querySelector("[" + PORTAL_INLET_ATTR + "~=\"" + newContainerId + "\"]");
89
90
 
90
91
  if (!nextNode) {
91
92
  throw Error("Origin node for render container was not found");