@krrli/cm-designsystem 1.35.1 → 1.35.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -99,7 +99,7 @@ interface AvatarProps extends AvatarVariants {
99
99
  * Click handler for the entire avatar.
100
100
  * Makes the outer wrapper clickable.
101
101
  */
102
- onAvatarClick?: () => void;
102
+ onAvatarClick?: (e: React.MouseEvent) => void;
103
103
  /**
104
104
  * Optional click handler for the action button.
105
105
  * Only visible when:
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAK1D,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAwDhB,CAAC;AAEH,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C;;GAEG;AACH,UAAU,WAAY,SAAQ,cAAc;IAC1C;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,IAAI,EAAE,UAAU,CAAC;IAEjB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAE3B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAgCxC,CAAC"}
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAK1D,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAwDhB,CAAC;AAEH,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,KAAK,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C;;GAEG;AACH,UAAU,WAAY,SAAQ,cAAc;IAC1C;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,IAAI,EAAE,UAAU,CAAC;IAEjB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAE9C;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAgCxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Toggle.d.ts","sourceRoot":"","sources":["../../../src/components/toggle/Toggle.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI1D,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA4DhB,CAAC;AACH,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,UAAU,WAAY,SAAQ,cAAc;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,MAAM,GAAI,wDAMpB,WAAW,4CAyBb,CAAC"}
1
+ {"version":3,"file":"Toggle.d.ts","sourceRoot":"","sources":["../../../src/components/toggle/Toggle.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI1D,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA4DhB,CAAC;AACH,KAAK,cAAc,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,UAAU,WAAY,SAAQ,cAAc;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,MAAM,GAAI,wDAMpB,WAAW,4CA0Bb,CAAC"}
@@ -81,6 +81,7 @@ const Toggle = ({
81
81
  className: base(),
82
82
  pressed,
83
83
  onPressedChange: onToggle,
84
+ onClick: (e) => e.stopPropagation(),
84
85
  disabled,
85
86
  children: [
86
87
  /* @__PURE__ */ jsx(
@@ -72,8 +72,8 @@ interface PostProps extends PostVariants {
72
72
  onLikeClick: () => void;
73
73
  /** Callback fired when the share button is clicked. */
74
74
  onShareClick: () => void;
75
- /** Link to Detail Post */
76
- detailLink?: string;
75
+ /** Callback fired when the post itself is clicked. */
76
+ onPostClick: () => void;
77
77
  }
78
78
  /**
79
79
  * Detailed post component displaying user info, text content,
@@ -1 +1 @@
1
- {"version":3,"file":"Post.d.ts","sourceRoot":"","sources":["../../../src/compositions/post/Post.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAc1D,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA4Bd,CAAC;AAEH,KAAK,YAAY,GAAG,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5B,UAAU,SAAU,SAAQ,YAAY;IACtC,sDAAsD;IACtD,IAAI,EAAE,QAAQ,CAAC;IAEf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,mDAAmD;IACnD,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAExB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE7B,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,IAAI,CAAC;IAE1B,yDAAyD;IACzD,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,sDAAsD;IACtD,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,uDAAuD;IACvD,YAAY,EAAE,MAAM,IAAI,CAAC;IAEzB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAiFpC,CAAC"}
1
+ {"version":3,"file":"Post.d.ts","sourceRoot":"","sources":["../../../src/compositions/post/Post.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAc1D,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA4Bd,CAAC;AAEH,KAAK,YAAY,GAAG,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5B,UAAU,SAAU,SAAQ,YAAY;IACtC,sDAAsD;IACtD,IAAI,EAAE,QAAQ,CAAC;IAEf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,mDAAmD;IACnD,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAExB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE7B,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,IAAI,CAAC;IAE1B,yDAAyD;IACzD,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,sDAAsD;IACtD,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,uDAAuD;IACvD,YAAY,EAAE,MAAM,IAAI,CAAC;IAEzB,sDAAsD;IACtD,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CA8EpC,CAAC"}
@@ -15,7 +15,7 @@ const PostStyles = tv({
15
15
  slots: {
16
16
  base: ["flex", "flex-col", "gap-4", "md:gap-6", "md:relative"],
17
17
  header: ["flex", "gap-3", "items-start", "md:gap-0"],
18
- avatar: ["flex-shrink-0", "md:absolute", "md:-left-8", "md:top-6"],
18
+ avatar: ["shrink-0", "md:absolute", "md:-left-8", "md:top-6"],
19
19
  userInfoWrapper: ["flex-1", "min-w-0"],
20
20
  content: ["flex", "flex-col", "gap-4", "md:gap-6"],
21
21
  text: [
@@ -46,81 +46,76 @@ const Post = ({
46
46
  ...props
47
47
  }) => {
48
48
  const { base, header, avatar, userInfoWrapper, content, text, action } = PostStyles(props);
49
- const handlePostClick = () => {
50
- if (!props.detailLink) return;
51
- window.location.href = props.detailLink;
52
- };
53
- return /* @__PURE__ */ jsxs(
54
- PostBase,
55
- {
56
- className: base(),
57
- onClick: props.detailLink ? handlePostClick : void 0,
58
- children: [
59
- /* @__PURE__ */ jsxs("div", { className: header(), children: [
60
- /* @__PURE__ */ jsx("div", { className: avatar(), children: /* @__PURE__ */ jsx(
61
- Avatar,
62
- {
63
- alt: "Profile",
64
- size: "md",
65
- src: props.avatarSrc,
66
- onAvatarClick: props.onAvatarClick
67
- }
68
- ) }),
69
- /* @__PURE__ */ jsx("div", { className: userInfoWrapper(), children: /* @__PURE__ */ jsx(
70
- UserInfo,
71
- {
72
- size: props.size,
73
- displayName: props.displayName,
74
- userName: props.userName,
75
- timestamp: props.timestamp,
76
- onClick: props.onAvatarClick,
77
- src: null
78
- }
79
- ) })
80
- ] }),
81
- /* @__PURE__ */ jsxs("div", { className: content(), children: [
82
- /* @__PURE__ */ jsx(Paragraph, { size: props.size, className: text(), children: renderWithHashtags(props.text) }),
83
- props.imageSrc && /* @__PURE__ */ jsx(
84
- ImageBanner,
85
- {
86
- src: props.imageSrc,
87
- alt: props.imageAlt ?? "",
88
- onClick: () => {
89
- }
90
- }
91
- ),
92
- /* @__PURE__ */ jsxs("div", { className: action(), children: [
93
- /* @__PURE__ */ jsx(
94
- Toggle,
95
- {
96
- ariaLabel: "Comment",
97
- labelText: nbrOfComments === 0 ? "Comment" : nbrOfComments === 1 ? "1 Comment" : `${nbrOfComments} Comments`,
98
- pressed: nbrOfComments !== 0,
99
- onToggle: props.onCommentClick
100
- }
101
- ),
102
- /* @__PURE__ */ jsx(
103
- LikeToggle,
104
- {
105
- pressed: props.likedBySelf ?? false,
106
- likes: nbrOfLikes,
107
- onLikeChange: props.onLikeClick
108
- }
109
- ),
110
- /* @__PURE__ */ jsx(
111
- TimedButton,
112
- {
113
- icon: Share,
114
- label: "Copy Link",
115
- labelActive: "Link copied",
116
- onClick: props.onShareClick
117
- }
118
- )
119
- ] })
120
- ] })
121
- ]
122
- }
123
- );
49
+ return /* @__PURE__ */ jsxs(PostBase, { className: base(), onClick: props.onPostClick, children: [
50
+ /* @__PURE__ */ jsxs("div", { className: header(), children: [
51
+ /* @__PURE__ */ jsx("div", { className: avatar(), children: /* @__PURE__ */ jsx(
52
+ Avatar,
53
+ {
54
+ alt: "Profile",
55
+ size: "md",
56
+ src: props.avatarSrc,
57
+ onAvatarClick: (e) => {
58
+ props.onAvatarClick?.();
59
+ e.stopPropagation();
60
+ }
61
+ }
62
+ ) }),
63
+ /* @__PURE__ */ jsx("div", { className: userInfoWrapper(), children: /* @__PURE__ */ jsx(
64
+ UserInfo,
65
+ {
66
+ size: props.size,
67
+ displayName: props.displayName,
68
+ userName: props.userName,
69
+ timestamp: props.timestamp,
70
+ onClick: (e) => {
71
+ props.onAvatarClick?.();
72
+ e.stopPropagation();
73
+ },
74
+ src: null
75
+ }
76
+ ) })
77
+ ] }),
78
+ /* @__PURE__ */ jsxs("div", { className: content(), children: [
79
+ /* @__PURE__ */ jsx(Paragraph, { size: props.size, className: text(), children: renderWithHashtags(props.text) }),
80
+ props.imageSrc && /* @__PURE__ */ jsx(
81
+ ImageBanner,
82
+ {
83
+ src: props.imageSrc,
84
+ alt: props.imageAlt ?? "",
85
+ onClick: () => {
86
+ }
87
+ }
88
+ ),
89
+ /* @__PURE__ */ jsxs("div", { className: action(), children: [
90
+ /* @__PURE__ */ jsx(
91
+ Toggle,
92
+ {
93
+ ariaLabel: "Comment",
94
+ labelText: nbrOfComments === 0 ? "Comment" : nbrOfComments === 1 ? "1 Comment" : `${nbrOfComments} Comments`,
95
+ pressed: nbrOfComments !== 0,
96
+ onToggle: props.onCommentClick
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsx(
100
+ LikeToggle,
101
+ {
102
+ pressed: props.likedBySelf ?? false,
103
+ likes: nbrOfLikes,
104
+ onLikeChange: props.onLikeClick
105
+ }
106
+ ),
107
+ /* @__PURE__ */ jsx(
108
+ TimedButton,
109
+ {
110
+ icon: Share,
111
+ label: "Copy Link",
112
+ labelActive: "Link copied",
113
+ onClick: props.onShareClick
114
+ }
115
+ )
116
+ ] })
117
+ ] })
118
+ ] });
124
119
  };
125
120
  export {
126
121
  Post
@@ -62,7 +62,7 @@ interface UserInfoProps extends UserInfoVariants {
62
62
  /** Timestamp for the user activity */
63
63
  timestamp?: Date | null;
64
64
  /** Click handler for the whole UserInfo component */
65
- onClick: () => void;
65
+ onClick: (e: React.MouseEvent) => void;
66
66
  }
67
67
  /**
68
68
  * UserInfo Component
@@ -1 +1 @@
1
- {"version":3,"file":"UserInfo.d.ts","sourceRoot":"","sources":["../../../src/compositions/user-info/UserInfo.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAU1D,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAclB,CAAC;AAEH,KAAK,gBAAgB,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,KAAK,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,UAAU,aAAc,SAAQ,gBAAgB;IAC9C,uBAAuB;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oCAAoC;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sCAAsC;IACtC,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,qDAAqD;IACrD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAoCD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAuC5C,CAAC"}
1
+ {"version":3,"file":"UserInfo.d.ts","sourceRoot":"","sources":["../../../src/compositions/user-info/UserInfo.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAU1D,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAclB,CAAC;AAEH,KAAK,gBAAgB,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAC5D,KAAK,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,UAAU,aAAc,SAAQ,gBAAgB;IAC9C,uBAAuB;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oCAAoC;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sCAAsC;IACtC,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,qDAAqD;IACrD,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CACxC;AAoCD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAuC5C,CAAC"}
package/dist/styles.css CHANGED
@@ -620,7 +620,7 @@
620
620
  flex: 1;
621
621
  }
622
622
 
623
- .flex-shrink-0 {
623
+ .shrink-0 {
624
624
  flex-shrink: 0;
625
625
  }
626
626
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@krrli/cm-designsystem",
3
3
  "repository": "https://github.com/ost-cas-fea-25-26/cm-designsystem",
4
- "version": "1.35.1",
4
+ "version": "1.35.2",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -96,9 +96,9 @@
96
96
  "eslint-plugin-react-refresh": "0.4.26",
97
97
  "eslint-plugin-storybook": "10.1.11",
98
98
  "eslint-plugin-unused-imports": "4.3.0",
99
- "globals": "16.5.0",
99
+ "globals": "17.0.0",
100
100
  "jsdom": "27.4.0",
101
- "knip": "5.78.0",
101
+ "knip": "5.80.0",
102
102
  "playwright": "1.57.0",
103
103
  "prettier": "3.7.4",
104
104
  "prettier-plugin-tailwindcss": "0.7.2",
@@ -108,7 +108,7 @@
108
108
  "tailwind-merge": "3.4.0",
109
109
  "tailwindcss": "4.1.18",
110
110
  "typescript": "5.9.3",
111
- "typescript-eslint": "8.51.0",
111
+ "typescript-eslint": "8.52.0",
112
112
  "vite": "7.3.0",
113
113
  "vite-plugin-dts": "4.5.4",
114
114
  "vite-plugin-svgr": "^4.5.0",