@uxf/cms 12.7.2 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,7 +16,7 @@ It is not a general UI kit (`@uxf/ui`), a form library (`@uxf/form`), or a data
16
16
  yarn add @uxf/cms
17
17
  ```
18
18
 
19
- Peer dependencies: `@uxf/core`, `@uxf/core-react`, `@uxf/data-grid`, `@uxf/form`, `@uxf/router`, `@uxf/styles`, `@uxf/ui`, `@uxf/wysiwyg`, `@dnd-kit/core`, `@dnd-kit/sortable`, `@dnd-kit/utilities`, `@floating-ui/react`, `axios`, `axios-hooks`, `swr`, `react-hook-form`, `next` (>= 13.2.0), `react` (>= 18.2.0), `react-dom` (>= 18.2.0).
19
+ Peer dependencies: `@uxf/core`, `@uxf/core-react`, `@uxf/data-grid`, `@uxf/form`, `@uxf/router`, `@uxf/styles`, `@uxf/ui`, `@uxf/wysiwyg`, `@dnd-kit/core`, `@dnd-kit/sortable`, `@dnd-kit/utilities`, `@floating-ui/react`, `axios`, `axios-hooks`, `swr`, `react-hook-form`, `next` (>=15.0.4), `react` (^19.3.0), `react-dom` (^19.3.0).
20
20
 
21
21
  Because it builds on `@uxf/ui`, `@uxf/form` and `@uxf/data-grid`, complete their setup as well (see [`@uxf/ui`](../ui/README.md) and [`@uxf/form`](../form/README.md)) — the `UiContextProvider`, the token layer, and the component CSS they require.
22
22
 
@@ -40,7 +40,7 @@ exports.withAuthenticate = void 0;
40
40
  const react_1 = __importStar(require("react"));
41
41
  const api_1 = require("../../api");
42
42
  const config_1 = require("../../config");
43
- const UnauthorizedError_1 = require("../../errors/UnauthorizedError");
43
+ const unauthorized_error_1 = require("../../errors/unauthorized-error");
44
44
  const cms_authorizator_1 = __importDefault(require("../security/cms-authorizator"));
45
45
  /**
46
46
  * @deprecated use restrictedPage instead
@@ -53,7 +53,7 @@ const withAuthenticate = (config) => (Component) => {
53
53
  ? await config_1.container.get("api.getLoggedUser")(ctx)
54
54
  : await (0, api_1.getLoggedUser)(ctx);
55
55
  if (config.allowedRoles && !cms_authorizator_1.default.isGranted(config.allowedRoles, user.roles)) {
56
- throw new UnauthorizedError_1.UnauthorizedError();
56
+ throw new unauthorized_error_1.UnauthorizedError();
57
57
  }
58
58
  return typeof Component.getInitialProps === "function" ? await Component.getInitialProps(ctx) : {};
59
59
  }
@@ -101,5 +101,5 @@ function WysiwygInput(props) {
101
101
  placeholder: props.placeholder,
102
102
  readOnly: props.isReadOnly,
103
103
  required: props.isRequired,
104
- }, editorRef: editorRef, id: id, initialValue: field.value, onChange: field.onChange, plugins: plugins, ...props.editorProps })));
104
+ }, id: id, initialValue: field.value, onChange: field.onChange, plugins: plugins, ref: editorRef, ...props.editorProps })));
105
105
  }
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createAxiosRequest = void 0;
4
4
  const qs_1 = require("@uxf/core/utils/qs");
5
- const BadRequestError_1 = require("../../errors/BadRequestError");
6
- const ForbiddenError_1 = require("../../errors/ForbiddenError");
7
- const NetworkError_1 = require("../../errors/NetworkError");
8
- const UnauthorizedError_1 = require("../../errors/UnauthorizedError");
5
+ const bad_request_error_1 = require("../../errors/bad-request-error");
6
+ const forbidden_error_1 = require("../../errors/forbidden-error");
7
+ const network_error_1 = require("../../errors/network-error");
8
+ const unauthorized_error_1 = require("../../errors/unauthorized-error");
9
9
  /** @deprecated use swr */
10
10
  const createAxiosRequest = (baseURL, axiosInstance, requestConfig) => (ctx, url, method, body, query) => {
11
11
  var _a;
@@ -21,17 +21,17 @@ const createAxiosRequest = (baseURL, axiosInstance, requestConfig) => (ctx, url,
21
21
  .catch((error) => {
22
22
  if (error.response) {
23
23
  if (error.response.status === 400) {
24
- throw new BadRequestError_1.BadRequestError(error.response.data);
24
+ throw new bad_request_error_1.BadRequestError(error.response.data);
25
25
  }
26
26
  else if (error.response.status === 401) {
27
- throw new UnauthorizedError_1.UnauthorizedError();
27
+ throw new unauthorized_error_1.UnauthorizedError();
28
28
  }
29
29
  else if (error.response.status === 403) {
30
- throw new ForbiddenError_1.ForbiddenError();
30
+ throw new forbidden_error_1.ForbiddenError();
31
31
  }
32
32
  }
33
33
  else if (error.request) {
34
- throw new NetworkError_1.NetworkError();
34
+ throw new network_error_1.NetworkError();
35
35
  }
36
36
  throw error;
37
37
  });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const react_1 = require("@testing-library/react");
37
+ const react_2 = __importStar(require("react"));
38
+ const sub_menu_1 = require("./sub-menu");
39
+ const sub_menu_mobile_1 = require("./sub-menu-mobile");
40
+ const VARIANTS = [
41
+ ["SubMenu", sub_menu_1.SubMenu],
42
+ ["SubMenuMobile", sub_menu_mobile_1.SubMenuMobile],
43
+ ];
44
+ VARIANTS.forEach(([name, Component]) => {
45
+ test(`${name} passes the node to both its own ref and the trigger's, without reading element.ref`, () => {
46
+ const consoleError = jest.spyOn(console, "error").mockImplementation(() => undefined);
47
+ const triggerRef = (0, react_2.createRef)();
48
+ const componentRef = (0, react_2.createRef)();
49
+ (0, react_1.render)(react_2.default.createElement(Component, { content: [], ref: componentRef, title: "Menu" },
50
+ react_2.default.createElement("button", { ref: triggerRef, type: "button" }, "Trigger")));
51
+ expect(triggerRef.current).toBeInstanceOf(HTMLButtonElement);
52
+ expect(componentRef.current).toBe(triggerRef.current);
53
+ expect(consoleError).not.toHaveBeenCalledWith(expect.stringContaining("element.ref"));
54
+ consoleError.mockRestore();
55
+ });
56
+ });
@@ -1,8 +1,11 @@
1
- import React, { ReactElement } from "react";
1
+ import React, { ReactElement, RefAttributes } from "react";
2
2
  import { MenuItem as Model } from "../../model";
3
3
  export interface SubMenuProps {
4
4
  children: ReactElement;
5
5
  content: Model[];
6
6
  title: string;
7
7
  }
8
- export declare const SubMenuMobile: React.ForwardRefExoticComponent<SubMenuProps & React.RefAttributes<HTMLElement>>;
8
+ export declare function SubMenuMobile(props: SubMenuProps & RefAttributes<HTMLElement>): React.JSX.Element;
9
+ export declare namespace SubMenuMobile {
10
+ var displayName: string;
11
+ }
@@ -33,26 +33,30 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.SubMenuMobile = void 0;
37
- const compose_refs_1 = require("@uxf/core-react/utils/compose-refs");
36
+ exports.SubMenuMobile = SubMenuMobile;
37
+ const use_composed_refs_1 = require("@uxf/core-react/hooks/use-composed-refs");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const sub_menu_item_1 = require("./sub-menu-item");
40
40
  const use_sub_menu_1 = require("./use-sub-menu");
41
- exports.SubMenuMobile = (0, react_1.forwardRef)(({ children, content, title }, ref) => {
41
+ function SubMenuMobile(props) {
42
42
  const subMenu = (0, use_sub_menu_1.useSubMenu)({ isMobile: true });
43
- const stableRef = (0, react_1.useMemo)(() => (0, compose_refs_1.composeRefs)(ref, subMenu.refs.setReference, children.ref), [ref, subMenu.refs.setReference, children]);
43
+ // Any element can be the trigger; its props are only passed through.
44
+ const trigger = props.children;
45
+ const stableRef = (0, use_composed_refs_1.useComposedRefs)(props.ref, subMenu.refs.setReference, trigger.props.ref);
46
+ // `ref` goes after the spread: since React 19 the trigger's props carry its own ref.
47
+ const referenceProps = {
48
+ ...trigger.props,
49
+ ref: stableRef,
50
+ "data-state": subMenu.open ? "open" : "closed",
51
+ };
44
52
  return (react_1.default.createElement(react_1.default.Fragment, null,
45
- (0, react_1.cloneElement)(children, subMenu.getReferenceProps({
46
- ref: stableRef,
47
- ...children.props,
48
- "data-state": subMenu.open ? "open" : "closed",
49
- })),
53
+ (0, react_1.cloneElement)(trigger, subMenu.getReferenceProps(referenceProps)),
50
54
  subMenu.open && (react_1.default.createElement("div", { ...subMenu.getFloatingProps({
51
55
  className: "uxf-cms-sidebar__scrollbar uxf-cms-sub-menu__wrapper-mobile",
52
56
  ref: subMenu.refs.setFloating,
53
57
  style: subMenu.floatingStyles,
54
58
  }) },
55
- react_1.default.createElement("div", { className: "uxf-cms-sub-menu__title" }, title),
56
- content.map((item, index) => (react_1.default.createElement(sub_menu_item_1.SubMenuItem, { item: item, key: index })))))));
57
- });
58
- exports.SubMenuMobile.displayName = "SubMenuMobile";
59
+ react_1.default.createElement("div", { className: "uxf-cms-sub-menu__title" }, props.title),
60
+ props.content.map((item, index) => (react_1.default.createElement(sub_menu_item_1.SubMenuItem, { item: item, key: index })))))));
61
+ }
62
+ SubMenuMobile.displayName = "SubMenuMobile";
@@ -1,7 +1,10 @@
1
- import React, { ReactElement } from "react";
1
+ import React, { ReactElement, RefAttributes } from "react";
2
2
  import { MenuItem as Model } from "../../model";
3
3
  export interface SubMenuProps {
4
4
  children: ReactElement;
5
5
  content: Model[];
6
6
  }
7
- export declare const SubMenu: React.ForwardRefExoticComponent<SubMenuProps & React.RefAttributes<HTMLElement>>;
7
+ export declare function SubMenu(props: SubMenuProps & RefAttributes<HTMLElement>): React.JSX.Element;
8
+ export declare namespace SubMenu {
9
+ var displayName: string;
10
+ }
@@ -33,24 +33,28 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.SubMenu = void 0;
37
- const compose_refs_1 = require("@uxf/core-react/utils/compose-refs");
36
+ exports.SubMenu = SubMenu;
37
+ const use_composed_refs_1 = require("@uxf/core-react/hooks/use-composed-refs");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const sub_menu_item_1 = require("./sub-menu-item");
40
40
  const use_sub_menu_1 = require("./use-sub-menu");
41
- exports.SubMenu = (0, react_1.forwardRef)(({ children, content }, ref) => {
41
+ function SubMenu(props) {
42
42
  const subMenu = (0, use_sub_menu_1.useSubMenu)({ isMobile: false });
43
- const stableRef = (0, react_1.useMemo)(() => (0, compose_refs_1.composeRefs)(ref, subMenu.refs.setReference, children.ref), [ref, subMenu.refs.setReference, children]);
43
+ // Any element can be the trigger; its props are only passed through.
44
+ const trigger = props.children;
45
+ const stableRef = (0, use_composed_refs_1.useComposedRefs)(props.ref, subMenu.refs.setReference, trigger.props.ref);
46
+ // `ref` goes after the spread: since React 19 the trigger's props carry its own ref.
47
+ const referenceProps = {
48
+ ...trigger.props,
49
+ ref: stableRef,
50
+ "data-state": subMenu.open ? "open" : "closed",
51
+ };
44
52
  return (react_1.default.createElement("div", { className: "uxf-cms-sub-menu" },
45
- (0, react_1.cloneElement)(children, subMenu.getReferenceProps({
46
- ref: stableRef,
47
- ...children.props,
48
- "data-state": subMenu.open ? "open" : "closed",
49
- })),
53
+ (0, react_1.cloneElement)(trigger, subMenu.getReferenceProps(referenceProps)),
50
54
  subMenu.open && (react_1.default.createElement("div", { ...subMenu.getFloatingProps({
51
55
  ref: subMenu.refs.setFloating,
52
56
  style: subMenu.floatingStyles,
53
57
  className: "uxf-cms-sidebar__scrollbar uxf-cms-sub-menu__wrapper",
54
- }) }, content.map((item, index) => (react_1.default.createElement(sub_menu_item_1.SubMenuItem, { item: item, key: index })))))));
55
- });
56
- exports.SubMenu.displayName = "SubMenu";
58
+ }) }, props.content.map((item, index) => (react_1.default.createElement(sub_menu_item_1.SubMenuItem, { item: item, key: index })))))));
59
+ }
60
+ SubMenu.displayName = "SubMenu";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxf/cms",
3
- "version": "12.7.2",
3
+ "version": "13.0.0",
4
4
  "description": "UXF Cms",
5
5
  "author": "UXFans <dev@uxf.cz>",
6
6
  "homepage": "https://gitlab.com/uxf-npm/cms#readme",
@@ -29,42 +29,42 @@
29
29
  },
30
30
  "peerDependencies": {
31
31
  "@floating-ui/react": "^0.27.20",
32
- "@uxf/core": "12.7.0",
33
- "@uxf/core-react": "12.7.1",
34
- "@uxf/data-grid": "12.7.2",
35
- "@uxf/dnd": "12.0.0",
36
- "@uxf/form": "12.7.1",
37
- "@uxf/router": "12.7.0",
38
- "@uxf/styles": "12.7.0",
39
- "@uxf/ui": "12.7.1",
40
- "@uxf/wysiwyg": "12.7.1",
32
+ "@uxf/core": "13.0.0",
33
+ "@uxf/core-react": "13.0.0",
34
+ "@uxf/data-grid": "13.0.0",
35
+ "@uxf/dnd": "13.0.0",
36
+ "@uxf/form": "13.0.0",
37
+ "@uxf/router": "13.0.0",
38
+ "@uxf/styles": "13.0.0",
39
+ "@uxf/ui": "13.0.0",
40
+ "@uxf/wysiwyg": "13.0.0",
41
41
  "axios": "^1.20.0",
42
42
  "axios-hooks": "^5.1.1",
43
- "next": ">=13.2.0",
44
- "react": ">=18.2.0",
45
- "react-dom": ">=18.2.0",
43
+ "next": ">=15.0.4",
44
+ "react": "^19.3.0",
45
+ "react-dom": "^19.3.0",
46
46
  "react-hook-form": "^7.89.0",
47
47
  "swr": "^2.5.1"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@floating-ui/react": "^0.27.20",
51
51
  "@types/node": "24",
52
- "@types/react": "18.3.31",
53
- "@types/react-dom": "18.3.7",
54
- "@uxf/core": "12.7.0",
55
- "@uxf/core-react": "12.7.1",
56
- "@uxf/data-grid": "12.7.2",
57
- "@uxf/dnd": "12.0.0",
58
- "@uxf/form": "12.7.1",
59
- "@uxf/router": "12.7.0",
60
- "@uxf/styles": "12.7.0",
61
- "@uxf/ui": "12.7.1",
62
- "@uxf/wysiwyg": "12.7.1",
52
+ "@types/react": "19.3.0",
53
+ "@types/react-dom": "19.3.0",
54
+ "@uxf/core": "13.0.0",
55
+ "@uxf/core-react": "13.0.0",
56
+ "@uxf/data-grid": "13.0.0",
57
+ "@uxf/dnd": "13.0.0",
58
+ "@uxf/form": "13.0.0",
59
+ "@uxf/router": "13.0.0",
60
+ "@uxf/styles": "13.0.0",
61
+ "@uxf/ui": "13.0.0",
62
+ "@uxf/wysiwyg": "13.0.0",
63
63
  "axios": "^1.20.0",
64
64
  "axios-hooks": "^5.1.1",
65
65
  "next": "16.3.8",
66
- "react": "18.3.1",
67
- "react-dom": "18.3.1",
66
+ "react": "19.3.0",
67
+ "react-dom": "19.3.0",
68
68
  "react-hook-form": "^7.89.0",
69
69
  "swr": "^2.5.1",
70
70
  "tsx": "4.23.15"
@@ -1,5 +1,5 @@
1
1
  import { ImageSource } from "@uxf/core/utils/resizer";
2
- import React, { HTMLAttributes } from "react";
2
+ import React, { HTMLAttributes, RefAttributes } from "react";
3
3
  import { AvatarSize, AvatarVariant } from "./theme";
4
4
  export interface AvatarProps extends Omit<HTMLAttributes<HTMLDivElement>, "src"> {
5
5
  alt?: string;
@@ -8,4 +8,7 @@ export interface AvatarProps extends Omit<HTMLAttributes<HTMLDivElement>, "src">
8
8
  letters?: string;
9
9
  variant?: AvatarVariant;
10
10
  }
11
- export declare const Avatar: React.MemoExoticComponent<React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLDivElement>>>;
11
+ export declare function Avatar(props: AvatarProps & RefAttributes<HTMLDivElement>): React.JSX.Element;
12
+ export declare namespace Avatar {
13
+ var displayName: string;
14
+ }
@@ -1,57 +1,27 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
35
5
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.Avatar = void 0;
6
+ exports.Avatar = Avatar;
37
7
  const cx_1 = require("@uxf/core/utils/cx");
8
+ const omit_1 = require("@uxf/core/utils/omit");
38
9
  const raster_image_1 = require("@uxf/ui/raster-image");
39
- const react_1 = __importStar(require("react"));
10
+ const react_1 = __importDefault(require("react"));
40
11
  const AVATAR_SIZES = {
41
12
  sm: 40,
42
13
  default: 88,
43
14
  lg: 120,
44
15
  };
45
- const Component = (props, ref) => {
46
- // eslint-disable-next-line react/destructuring-assignment
47
- const { alt, className, size = "default", src, letters, variant = "default", ...restProps } = props;
48
- const avatarClassName = (0, cx_1.cx)("cms-avatar", `cms-avatar--size-${size}`, `cms-avatar--variant-${variant}`, className);
49
- const imgAlt = alt !== null && alt !== void 0 ? alt : "";
50
- if (src) {
51
- return (react_1.default.createElement("span", { className: avatarClassName, ref: ref, ...restProps },
52
- react_1.default.createElement(raster_image_1.RasterImage, { alt: imgAlt, className: "cms-avatar__image", height: AVATAR_SIZES[size], loading: "lazy", mode: "cover", src: src, width: AVATAR_SIZES[size] })));
16
+ function Avatar(props) {
17
+ var _a, _b, _c;
18
+ const size = (_a = props.size) !== null && _a !== void 0 ? _a : "default";
19
+ const avatarClassName = (0, cx_1.cx)("cms-avatar", `cms-avatar--size-${size}`, `cms-avatar--variant-${(_b = props.variant) !== null && _b !== void 0 ? _b : "default"}`, props.className);
20
+ const restProps = (0, omit_1.omit)(props, ["ref", "alt", "className", "size", "src", "letters", "variant"]);
21
+ if (props.src) {
22
+ return (react_1.default.createElement("span", { className: avatarClassName, ref: props.ref, ...restProps },
23
+ react_1.default.createElement(raster_image_1.RasterImage, { alt: (_c = props.alt) !== null && _c !== void 0 ? _c : "", className: "cms-avatar__image", height: AVATAR_SIZES[size], loading: "lazy", mode: "cover", src: props.src, width: AVATAR_SIZES[size] })));
53
24
  }
54
- return (react_1.default.createElement("div", { className: avatarClassName, ...restProps }, letters));
55
- };
56
- exports.Avatar = (0, react_1.memo)((0, react_1.forwardRef)(Component));
57
- exports.Avatar.displayName = "CmsAvatar";
25
+ return (react_1.default.createElement("div", { className: avatarClassName, ref: props.ref, ...restProps }, props.letters));
26
+ }
27
+ Avatar.displayName = "CmsAvatar";
File without changes