}
+/>
+```
+
+#### Fallback src images
+
+```jsx
+
+```
+
+#### Custom class names
+
+
+The `rootFallbackClassName` parameter adds a class to the root element that displays the `fallback` content,
+while the `rootErrorFallbackClassName` parameter adds a class to the root element that displays the `errorFallback` content.
+
+```jsx
+ Loading...}
+ errorFallback={
Error loading image
}
+/>
+```
+
+#### Lazy loading
+
+By default, `lazy` is set to `false`, which means the image will be loaded immediately. If `lazy` is set to `true`,
+the image will only be loaded when it enters the viewport. This is achieved using the Intersection Observer pattern.
+For correct lazy loading, it is also necessary to pass the `fallback` attribute, which will be placeholder as a placeholder until the image is loaded.
+
+By default, `lazy` is set to `false`, which means the image will be loaded immediately. If `lazy` is set to `true`,
+the image will only be loaded when it enters the viewport. This is achieved using the Intersection Observer pattern.
+For correct lazy loading, it is also necessary to pass the `fallback` attribute, which will serve as a placeholder until the image is loaded.
+
+```jsx
+Loading...}
+ lazy
+/>
+```
+
+#### Settings Intersection Observer
+
+You can customize the options for the Intersection Observer using the `intersectionObserverSettings` attribute.
+
+```jsx
+
+```
+
+> Modify the `intersectionObserverSettings` attribute with caution, as incorrect settings can disrupt the lazy loading
+> mechanism and potentially lead to unexpected behavior.
diff --git a/components/image/package.json b/components/image/package.json
new file mode 100644
index 00000000..6eac0f4d
--- /dev/null
+++ b/components/image/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@byndyusoft-ui/image",
+ "version": "0.0.2",
+ "description": "Byndyusoft UI Image React Component",
+ "keywords": [
+ "byndyusoft",
+ "byndyusoft-ui",
+ "react",
+ "component",
+ "image"
+ ],
+ "author": "Gleb Fomin ",
+ "homepage": "https://github.com/Byndyusoft/ui/tree/master/components/image#readme",
+ "license": "Apache-2.0",
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Byndyusoft/ui.git"
+ },
+ "scripts": {
+ "build": "tsc --project tsconfig.build.json",
+ "clean": "rimraf dist",
+ "lint": "eslint src --config ../../eslint.config.js",
+ "test": "jest --config ../../jest.config.js --roots components/image/src"
+ },
+ "bugs": {
+ "url": "https://github.com/Byndyusoft/ui/issues"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "@byndyusoft-ui/use-intersection-observer": "^0.0.1"
+ }
+}
diff --git a/components/image/src/Image.tsx b/components/image/src/Image.tsx
new file mode 100644
index 00000000..0f03000a
--- /dev/null
+++ b/components/image/src/Image.tsx
@@ -0,0 +1,63 @@
+import React, { forwardRef, ReactElement, useImperativeHandle, useRef } from 'react';
+import { useImage } from './useImage';
+import type { IImageProps } from './Image.types';
+
+const Image = forwardRef((props, forwardedRef) => {
+ const {
+ src,
+ alt = '',
+ lazy = false,
+ fallback,
+ fallbackSrc,
+ errorFallback,
+ errorFallbackSrc,
+ className,
+ rootFallbackClassName,
+ rootErrorFallbackClassName,
+ intersectionObserverSettings,
+ ...otherProps
+ } = props;
+
+ const internalRef = useRef(null);
+
+ const { isLoading, isError, setObserverTargetRef } = useImage({
+ src,
+ lazy,
+ intersectionObserverSettings
+ });
+
+ const setRefs = (node: HTMLImageElement | null): void => {
+ internalRef.current = node;
+ setObserverTargetRef(node);
+ };
+
+ const renderImage = (imageSrc: string): JSX.Element => (
+
+ );
+
+ const renderFallback = (content: ReactElement, rootClassName?: string): JSX.Element => (
+