+ );
+}
diff --git a/src/components/Overlay/README.md b/src/components/Overlay/README.md
new file mode 100644
index 0000000000..b45a32f03c
--- /dev/null
+++ b/src/components/Overlay/README.md
@@ -0,0 +1,48 @@
+
+
+# Overlay
+
+
+
+```tsx
+import {Overlay} from '@gravity-ui/uikit';
+```
+
+The `Overlay` component renders an overlay over the parent element with relative position,
+i.e. parent element must have `position` set to `relative`.
+For example, it can be used to preserve the desired layout while loading data.
+
+```jsx
+import {Box, Overlay, Loader} from '@gravity-ui/uikit';
+
+
+
Some content to hide under overlay
+
+
+
+;
+```
+
+## Appearance
+
+### Background
+
+You can use `base` or `float` background colors.
+
+
+
+```tsx
+
+
+```
+
+
+
+## Properties
+
+| Name | Description | Type | Default |
+| :--------- | :---------------------------------- | :----------------: | :-----: |
+| className | CSS class name of the root element | `string` | |
+| visible | Overlay visibility state | `boolean` | `false` |
+| background | Overlay background style | `"base"` `"float"` | `base` |
+| children | Content, usually a Loader component | `React.ReactNode` | |
diff --git a/src/components/Overlay/__stories__/Docs.mdx b/src/components/Overlay/__stories__/Docs.mdx
new file mode 100644
index 0000000000..a099505e89
--- /dev/null
+++ b/src/components/Overlay/__stories__/Docs.mdx
@@ -0,0 +1,7 @@
+import {Meta, Markdown} from '@storybook/addon-docs';
+import * as Stories from './Overlay.stories';
+import Readme from '../README.md?raw';
+
+
+
+{Readme}
diff --git a/src/components/Overlay/__stories__/Overlay.stories.scss b/src/components/Overlay/__stories__/Overlay.stories.scss
new file mode 100644
index 0000000000..93faf42c44
--- /dev/null
+++ b/src/components/Overlay/__stories__/Overlay.stories.scss
@@ -0,0 +1,22 @@
+@use '../../variables';
+
+$block: '.#{variables.$ns}overlay-stories';
+
+#{$block} {
+ &__content {
+ width: fit-content;
+ padding: var(--g-spacing-1);
+ }
+
+ &__table table {
+ min-width: 763px;
+ }
+
+ &__button {
+ margin-block-start: var(--g-spacing-1);
+
+ & + & {
+ margin-inline-start: var(--g-spacing-1);
+ }
+ }
+}
diff --git a/src/components/Overlay/__stories__/Overlay.stories.tsx b/src/components/Overlay/__stories__/Overlay.stories.tsx
new file mode 100644
index 0000000000..edfefbe88d
--- /dev/null
+++ b/src/components/Overlay/__stories__/Overlay.stories.tsx
@@ -0,0 +1,128 @@
+import React from 'react';
+
+import {ArrowsRotateRight} from '@gravity-ui/icons';
+import type {Meta, StoryObj} from '@storybook/react';
+
+import {Showcase} from '../../../demo/Showcase';
+import {ShowcaseItem} from '../../../demo/ShowcaseItem';
+import {Button} from '../../Button';
+import {Icon} from '../../Icon';
+import {Loader} from '../../Loader';
+import {Table as TableComponent} from '../../Table';
+import {Box} from '../../layout';
+import {block} from '../../utils/cn';
+import {Overlay} from '../Overlay';
+import type {OverlayProps} from '../Overlay';
+
+import {columns, data} from './data';
+import type {DataItem} from './data';
+
+import './Overlay.stories.scss';
+
+const b = block('overlay-stories');
+
+type Story = StoryObj;
+
+export default {
+ title: 'Components/Utils/Overlay',
+ component: Overlay,
+} as Meta;
+
+export const Default: Story = {
+ args: {
+ visible: true,
+ },
+ render: (args) => {
+ return (
+
+
+