@the-story/standard-core 1.0.3 → 1.0.5

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
@@ -12,13 +12,13 @@ During development, we use yalc for local linking (a lightweight alternative to
12
12
  - In PyCharm, use the already added Run configurations: "build", "yalc:publish" (optionally also "yalc:push").
13
13
  - Run "yalc:publish".
14
14
  2. In the consuming application:
15
- - Use the existing project configuration that adds the package via yalc (e.g., "yalc:add" or a "Shell Script" configuration with: yalc add @thestory/standard-core).
15
+ - Use the existing project configuration that adds the package via yalc (e.g., "yalc:add" or a "Shell Script" configuration with: yalc add @the-story/standard-core).
16
16
  - Run the prepared configuration that installs dependencies (e.g., NPM "install"/"yarn install").
17
17
  - Start the application using its dedicated Run configuration and verify it works.
18
18
  3. Updating when the library changes:
19
19
  - In the library: run "yalc:publish" to push the update to all consumers.
20
20
  - In the app: run the "yalc:update" configuration to update the package; optionally restart the dev server.
21
- 4. Removing the yalc package in the app: run the existing configuration that removes the package (e.g., a "Shell Script" with: yalc remove @thestory/standard-core).
21
+ 4. Removing the yalc package in the app: run the existing configuration that removes the package (e.g., a "Shell Script" with: yalc remove @the-story/standard-core).
22
22
 
23
23
  Note: Eventually the package may be published to an npm registry (public or private). yalc is intended only for local development.
24
24
 
@@ -28,6 +28,7 @@ We use Storybook to build and preview components. Every component MUST have at l
28
28
 
29
29
  - Launching Storybook: in PyCharm run the existing NPM configuration "storybook" from the Run toolbar.
30
30
  - Building a static version: in PyCharm run the existing NPM configuration "build-storybook".
31
+ - Hosted Storybook: https://standard-core.storyline.cloud
31
32
 
32
33
  Guidelines:
33
34
  - In this project, stories live in the `src/stories` directory, grouped into categories (e.g., `Atoms`, `Molecules`) and mirroring component structure, e.g., `src/stories/Atoms/Button/Button.stories.tsx`.
@@ -1,21 +1,7 @@
1
- import type { ButtonOwnProps } from "@mui/material/Button";
2
- import type { SxProps, Theme } from "@mui/material/styles";
3
- import type { APIString } from "@the-story/standard-core/types";
4
- import type { ButtonHTMLAttributes, ElementType, ReactNode } from "react";
5
- declare const Button: ({ type, href, target, children, variant, color, size, disabled, onClick, onMouseEnter, component, endIcon, startIcon, sx, }: {
6
- type?: ButtonHTMLAttributes<HTMLButtonElement>["type"];
7
- href?: APIString;
8
- target?: string;
9
- children?: ReactNode;
10
- variant?: ButtonOwnProps["variant"];
11
- color?: ButtonOwnProps["color"];
12
- size?: ButtonOwnProps["size"];
13
- disabled?: boolean;
14
- onClick?: (e: any) => void;
15
- onMouseEnter?: (e: any) => void;
16
- component?: ElementType;
17
- endIcon?: ReactNode;
18
- startIcon?: ReactNode;
19
- sx?: SxProps<Theme>;
20
- }) => import("react/jsx-runtime").JSX.Element;
1
+ import type { ButtonProps as MuiButtonProps } from "@mui/material/Button";
2
+ import type { HTMLAttributeAnchorTarget } from "react";
3
+ type ButtonProps = MuiButtonProps & {
4
+ target?: HTMLAttributeAnchorTarget;
5
+ };
6
+ declare const Button: ({ type, href, target, children, variant, color, size, disabled, onClick, onMouseEnter, component, endIcon, startIcon, sx, }: ButtonProps) => import("react/jsx-runtime").JSX.Element;
21
7
  export default Button;
@@ -3,7 +3,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import MuiButton from "@mui/material/Button";
4
4
  import { LocalizedLink } from "@the-story/standard-core/config/navigation";
5
5
  var Button = function (_a) {
6
- var _b = _a.type, type = _b === void 0 ? "button" : _b, href = _a.href, target = _a.target, children = _a.children, _c = _a.variant, variant = _c === void 0 ? "contained" : _c, _d = _a.color, color = _d === void 0 ? "primary" : _d, _e = _a.size, size = _e === void 0 ? "large" : _e, _f = _a.disabled, disabled = _f === void 0 ? false : _f, _g = _a.onClick, onClick = _g === void 0 ? function (e) { } : _g, _h = _a.onMouseEnter, onMouseEnter = _h === void 0 ? function (e) { } : _h, _j = _a.component, component = _j === void 0 ? LocalizedLink : _j, _k = _a.endIcon, endIcon = _k === void 0 ? null : _k, _l = _a.startIcon, startIcon = _l === void 0 ? null : _l, sx = _a.sx;
6
+ var _b = _a.type, type = _b === void 0 ? "button" : _b, href = _a.href, target = _a.target, children = _a.children, _c = _a.variant, variant = _c === void 0 ? "contained" : _c, _d = _a.color, color = _d === void 0 ? "primary" : _d, _e = _a.size, size = _e === void 0 ? "large" : _e, _f = _a.disabled, disabled = _f === void 0 ? false : _f, onClick = _a.onClick, onMouseEnter = _a.onMouseEnter, _g = _a.component, component = _g === void 0 ? LocalizedLink : _g, _h = _a.endIcon, endIcon = _h === void 0 ? null : _h, _j = _a.startIcon, startIcon = _j === void 0 ? null : _j, sx = _a.sx;
7
7
  return (_jsx(MuiButton, { type: type, href: href || undefined, component: href ? component : "button", target: target, variant: variant, color: color, size: size, disabled: disabled, onClick: onClick, onMouseEnter: onMouseEnter, sx: sx, endIcon: endIcon, startIcon: startIcon, children: children }));
8
8
  };
9
9
  export default Button;
@@ -8,5 +8,5 @@ export interface CtaButtonProps {
8
8
  sx?: SxProps;
9
9
  } | APINullable;
10
10
  }
11
- declare const CtaButton: ({ button }: CtaButtonProps) => APINullable | import("react/jsx-runtime").JSX.Element;
11
+ declare const CtaButton: ({ button }: CtaButtonProps) => import("react/jsx-runtime").JSX.Element | APINullable;
12
12
  export default CtaButton;
@@ -87,7 +87,7 @@ export declare const LocalizedLink: import("react").ForwardRefExoticComponent<Om
87
87
  results?: number | undefined;
88
88
  security?: string | undefined;
89
89
  unselectable?: "off" | "on" | undefined;
90
- inputMode?: "none" | "search" | "decimal" | "email" | "text" | "tel" | "url" | "numeric" | undefined;
90
+ inputMode?: "none" | "search" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
91
91
  is?: string | undefined;
92
92
  popover?: "" | "auto" | "manual" | undefined;
93
93
  popoverTargetAction?: "toggle" | "show" | "hide" | undefined;
@@ -108,7 +108,7 @@ export declare const LocalizedLink: import("react").ForwardRefExoticComponent<Om
108
108
  "aria-colindextext"?: string | undefined;
109
109
  "aria-colspan"?: number | undefined;
110
110
  "aria-controls"?: string | undefined;
111
- "aria-current"?: boolean | "date" | "time" | "page" | "step" | "true" | "false" | "location" | undefined;
111
+ "aria-current"?: boolean | "page" | "time" | "step" | "true" | "false" | "location" | "date" | undefined;
112
112
  "aria-describedby"?: string | undefined;
113
113
  "aria-description"?: string | undefined;
114
114
  "aria-details"?: string | undefined;
@@ -135,7 +135,7 @@ export declare const LocalizedLink: import("react").ForwardRefExoticComponent<Om
135
135
  "aria-posinset"?: number | undefined;
136
136
  "aria-pressed"?: boolean | "true" | "false" | "mixed" | undefined;
137
137
  "aria-readonly"?: boolean | "true" | "false" | undefined;
138
- "aria-relevant"?: "text" | "all" | "additions" | "additions removals" | "additions text" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | undefined;
138
+ "aria-relevant"?: "all" | "text" | "additions" | "additions removals" | "additions text" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | undefined;
139
139
  "aria-required"?: boolean | "true" | "false" | undefined;
140
140
  "aria-roledescription"?: string | undefined;
141
141
  "aria-rowcount"?: number | undefined;
package/dist/exports.d.ts CHANGED
@@ -4,3 +4,4 @@ export * from "./utils/exports";
4
4
  export * from "./config";
5
5
  export * from "./ThemeInheritor";
6
6
  export * from "./NextIntlClientInheritor";
7
+ export * from "./hooks";
package/dist/exports.js CHANGED
@@ -4,3 +4,4 @@ export * from "./utils/exports";
4
4
  export * from "./config";
5
5
  export * from "./ThemeInheritor";
6
6
  export * from "./NextIntlClientInheritor";
7
+ export * from "./hooks";
@@ -0,0 +1,2 @@
1
+ export * from "./useMaskedPhoneReveal";
2
+ export * from "./useInfiniteSlides";
@@ -0,0 +1,2 @@
1
+ export * from "./useMaskedPhoneReveal";
2
+ export * from "./useInfiniteSlides";
@@ -0,0 +1,4 @@
1
+ export declare function useInfiniteSlides<T>(slideWidth: number, slideMargin: number, items?: any[] | null | undefined): {
2
+ slides: T[];
3
+ slideTotalWidth: number;
4
+ };
@@ -0,0 +1,19 @@
1
+ import { useMemo } from "react";
2
+ export function useInfiniteSlides(slideWidth, slideMargin, items) {
3
+ if (items === void 0) { items = []; }
4
+ var slideTotalWidth = useMemo(function () { return slideWidth + slideMargin; }, [slideWidth, slideMargin]);
5
+ // SSR-safe viewport width
6
+ var viewportWidth = typeof window !== "undefined" ? window.innerWidth : 1440;
7
+ var MIN_SLIDES = useMemo(function () {
8
+ // Ensure a large pool to keep loop smooth
9
+ var perView = Math.ceil(viewportWidth / slideTotalWidth);
10
+ return Math.max(perView, 12);
11
+ }, [viewportWidth, slideTotalWidth]);
12
+ var slides = useMemo(function () {
13
+ if (!items || items.length === 0)
14
+ return [];
15
+ var duplicationsNeeded = Math.ceil((MIN_SLIDES * 3) / items.length);
16
+ return Array.from({ length: duplicationsNeeded }, function () { return items; }).flat();
17
+ }, [items, MIN_SLIDES]);
18
+ return { slides: slides, slideTotalWidth: slideTotalWidth };
19
+ }
@@ -0,0 +1,20 @@
1
+ import type { APIString } from "@the-story/standard-core/types";
2
+ export type UseMaskedPhoneRevealOptions = {
3
+ maskDigits?: number;
4
+ maskChar?: string;
5
+ };
6
+ export type UseMaskedPhoneRevealReturn = {
7
+ revealed: boolean;
8
+ masked: APIString;
9
+ reveal: () => void;
10
+ };
11
+ /**
12
+ * Masks the last N numeric digits of a phone-like string, preserving
13
+ * spacing and non-digit symbols. Only digits are replaced by maskChar.
14
+ */
15
+ export declare const maskLastDigits: (phone: APIString, { maskDigits, maskChar }?: UseMaskedPhoneRevealOptions) => APIString;
16
+ /**
17
+ * Reusable hook providing masked phone text and a handler to reveal it.
18
+ * Useful anywhere you want to hide part of the phone number until user action.
19
+ */
20
+ export declare const useMaskedPhoneReveal: (phone: APIString, options?: UseMaskedPhoneRevealOptions) => UseMaskedPhoneRevealReturn;
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import { useCallback, useMemo, useState } from "react";
3
+ /**
4
+ * Masks the last N numeric digits of a phone-like string, preserving
5
+ * spacing and non-digit symbols. Only digits are replaced by maskChar.
6
+ */
7
+ export var maskLastDigits = function (phone, _a) {
8
+ var _b = _a === void 0 ? {} : _a, _c = _b.maskDigits, maskDigits = _c === void 0 ? 6 : _c, _d = _b.maskChar, maskChar = _d === void 0 ? "*" : _d;
9
+ if (!phone)
10
+ return phone;
11
+ var toMask = Math.max(0, maskDigits);
12
+ var chars = String(phone).split("");
13
+ for (var i = chars.length - 1; i >= 0 && toMask > 0; i--) {
14
+ var ch = chars[i];
15
+ if (/\d/.test(ch)) {
16
+ chars[i] = maskChar;
17
+ toMask--;
18
+ }
19
+ }
20
+ return chars.join("");
21
+ };
22
+ /**
23
+ * Reusable hook providing masked phone text and a handler to reveal it.
24
+ * Useful anywhere you want to hide part of the phone number until user action.
25
+ */
26
+ export var useMaskedPhoneReveal = function (phone, options) {
27
+ if (options === void 0) { options = {}; }
28
+ var _a = useState(false), revealed = _a[0], setRevealed = _a[1];
29
+ var masked = useMemo(function () { return maskLastDigits(phone, options); }, [phone, options]);
30
+ var reveal = useCallback(function () { return setRevealed(true); }, []);
31
+ return { revealed: revealed, masked: masked, reveal: reveal };
32
+ };
@@ -3,11 +3,10 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
3
3
  import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown";
4
4
  import ArrowDropUpIcon from "@mui/icons-material/ArrowDropUp";
5
5
  import Button from "@mui/material/Button";
6
- import Link from "@mui/material/Link";
7
6
  import Menu from "@mui/material/Menu";
8
7
  import MenuItem from "@mui/material/MenuItem";
8
+ import { Link } from "@the-story/standard-core/atoms/Link";
9
9
  import { locales } from "@the-story/standard-core/config/i18n";
10
- import { LocalizedLink } from "@the-story/standard-core/config/navigation";
11
10
  import { useLocale } from "next-intl";
12
11
  import { usePathname, useSearchParams } from "next/navigation";
13
12
  import { useEffect, useMemo, useState } from "react";
@@ -24,9 +23,10 @@ var getAlternateLanguages = function () {
24
23
  return alternateLanguages;
25
24
  };
26
25
  var LanguageSelector = function (_a) {
26
+ var _b;
27
27
  var color = _a.color;
28
28
  var lang = useLocale();
29
- var _b = useState(null), anchorEl = _b[0], setAnchorEl = _b[1];
29
+ var _c = useState(null), anchorEl = _c[0], setAnchorEl = _c[1];
30
30
  var open = Boolean(anchorEl);
31
31
  var handleClick = function (event) {
32
32
  setAnchorEl(event.currentTarget);
@@ -34,24 +34,43 @@ var LanguageSelector = function (_a) {
34
34
  var handleClose = function () {
35
35
  setAnchorEl(null);
36
36
  };
37
- var _c = useState([]), alternateLanguages = _c[0], setAlternateLanguages = _c[1];
37
+ var _d = useState([]), alternateLanguages = _d[0], setAlternateLanguages = _d[1];
38
38
  var pathname = usePathname();
39
39
  useEffect(function () {
40
40
  var alternateLanguagesData = getAlternateLanguages();
41
41
  setAlternateLanguages(alternateLanguagesData);
42
42
  }, [pathname]);
43
- var getHrefForLocale = useMemo(function () { return function (l) {
44
- var _a;
45
- if (alternateLanguages) {
46
- var href = (_a = alternateLanguages === null || alternateLanguages === void 0 ? void 0 : alternateLanguages.find(function (lang) { return lang.hreflang === l; })) === null || _a === void 0 ? void 0 : _a.href;
47
- if (href)
48
- return href;
49
- }
50
- return "/";
51
- }; }, [alternateLanguages]);
52
43
  var searchParams = useSearchParams();
53
- var pathnameWithoutLang = pathname === null || pathname === void 0 ? void 0 : pathname.replace(/^\/[a-z]{2}(?=\/|$)/, "");
54
- var currentUrl = pathnameWithoutLang + "?" + (searchParams === null || searchParams === void 0 ? void 0 : searchParams.toString());
44
+ var pathnameWithoutLang = (_b = pathname === null || pathname === void 0 ? void 0 : pathname.replace(/^\/[a-z]{2}(?=\/|$)/, "")) !== null && _b !== void 0 ? _b : "/";
45
+ var queryString = searchParams === null || searchParams === void 0 ? void 0 : searchParams.toString();
46
+ var currentUrl = pathnameWithoutLang;
47
+ if (queryString)
48
+ currentUrl += "?".concat(queryString);
49
+ var getHrefForLocale = useMemo(function () {
50
+ var normalizeHref = function (href) {
51
+ try {
52
+ var url = new URL(href, window.location.origin);
53
+ var path = url.pathname.replace(/^\/[a-z]{2}(?=\/|$)/, "");
54
+ if (path === "")
55
+ path = "/";
56
+ return url.search ? "".concat(path).concat(url.search) : path;
57
+ }
58
+ catch (_a) {
59
+ // If it's not a valid URL, fallback to currentUrl which is already normalized
60
+ return currentUrl;
61
+ }
62
+ };
63
+ return function (l) {
64
+ var _a;
65
+ if (alternateLanguages && alternateLanguages.length > 0) {
66
+ var href = (_a = alternateLanguages.find(function (lang) { return lang.hreflang === l; })) === null || _a === void 0 ? void 0 : _a.href;
67
+ if (href)
68
+ return normalizeHref(href);
69
+ }
70
+ // Fallback to current page path/query without any locale prefix
71
+ return currentUrl;
72
+ };
73
+ }, [alternateLanguages, currentUrl]);
55
74
  if (locales.length <= 1)
56
75
  return null;
57
76
  return (_jsxs(_Fragment, { children: [_jsx(Button, { id: "language-selector-button", "aria-controls": open ? "language-menu" : undefined, "aria-haspopup": "true", "aria-expanded": open ? "true" : undefined, onClick: handleClick, size: "small", endIcon: open ? _jsx(ArrowDropUpIcon, {}) : _jsx(ArrowDropDownIcon, {}), sx: {
@@ -76,7 +95,7 @@ var LanguageSelector = function (_a) {
76
95
  : getHrefForLocale
77
96
  ? getHrefForLocale(l)
78
97
  : "/";
79
- return (_jsx(MenuItem, { selected: lang === l, children: _jsx(Link, { component: LocalizedLink, underline: "none", href: href, locale: l, onClick: handleClose, px: "4px", children: l.toUpperCase() }) }, "lang-".concat(l)));
98
+ return (_jsx(MenuItem, { selected: lang === l, children: _jsx(Link, { underline: "none", href: href, locale: l, onClick: handleClose, px: "4px", children: l.toUpperCase() }) }, "lang-".concat(l)));
80
99
  }) })] }));
81
100
  };
82
101
  export default LanguageSelector;
@@ -0,0 +1,9 @@
1
+ import type { APIString } from "@the-story/standard-core/types";
2
+ export interface MaskedPhoneNumberProps {
3
+ officePhoneNumber: APIString;
4
+ showPhoneButtonLabelTranslations?: string;
5
+ maskDigits?: number;
6
+ maskChar?: string;
7
+ }
8
+ declare const MaskedPhoneNumber: ({ officePhoneNumber, showPhoneButtonLabelTranslations, maskDigits, maskChar, }: MaskedPhoneNumberProps) => import("react/jsx-runtime").JSX.Element | null;
9
+ export default MaskedPhoneNumber;
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Box from "@mui/material/Box";
4
+ import Link from "@mui/material/Link";
5
+ import Typography from "@mui/material/Typography";
6
+ import { useMaskedPhoneReveal } from "@the-story/standard-core/hooks";
7
+ var MaskedPhoneNumber = function (_a) {
8
+ var officePhoneNumber = _a.officePhoneNumber, showPhoneButtonLabelTranslations = _a.showPhoneButtonLabelTranslations, _b = _a.maskDigits, maskDigits = _b === void 0 ? 6 : _b, _c = _a.maskChar, maskChar = _c === void 0 ? "*" : _c;
9
+ var _d = useMaskedPhoneReveal(officePhoneNumber, { maskDigits: maskDigits, maskChar: maskChar }), showFullPhone = _d.revealed, maskedPhone = _d.masked, reveal = _d.reveal;
10
+ if (!officePhoneNumber)
11
+ return null;
12
+ return (_jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [showFullPhone ? (_jsx(Link, { href: "tel:".concat(officePhoneNumber), children: officePhoneNumber })) : (_jsx(Typography, { variant: "body1", children: maskedPhone })), !showFullPhone && (_jsx(Link, { onClick: function (e) {
13
+ e.preventDefault();
14
+ reveal();
15
+ }, sx: { cursor: "pointer" }, children: showPhoneButtonLabelTranslations || "show" }))] }));
16
+ };
17
+ export default MaskedPhoneNumber;
@@ -0,0 +1,2 @@
1
+ export { default as MaskedPhoneNumber } from "./MaskedPhoneNumber";
2
+ export type { MaskedPhoneNumberProps } from "./MaskedPhoneNumber";
@@ -0,0 +1 @@
1
+ export { default as MaskedPhoneNumber } from "./MaskedPhoneNumber";
@@ -1,2 +1,3 @@
1
1
  export * from "./Crumbs";
2
2
  export * from "./LanguageSelector";
3
+ export * from "./MaskedPhoneNumber";
@@ -1,2 +1,3 @@
1
1
  export * from "./Crumbs";
2
2
  export * from "./LanguageSelector";
3
+ export * from "./MaskedPhoneNumber";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@the-story/standard-core",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Standard landing boilerplate",
5
5
  "main": "./dist/exports.js",
6
6
  "module": "./dist/exports.js",
@@ -250,6 +250,18 @@
250
250
  "import": "./dist/exports.js",
251
251
  "require": "./dist/exports.js"
252
252
  },
253
+ "./hooks": {
254
+ "import": "./dist/hooks/index.js",
255
+ "require": "./dist/hooks/index.js"
256
+ },
257
+ "./hooks/useInfiniteSlides": {
258
+ "import": "./dist/hooks/useInfiniteSlides.js",
259
+ "require": "./dist/hooks/useInfiniteSlides.js"
260
+ },
261
+ "./hooks/useMaskedPhoneReveal": {
262
+ "import": "./dist/hooks/useMaskedPhoneReveal.js",
263
+ "require": "./dist/hooks/useMaskedPhoneReveal.js"
264
+ },
253
265
  "./molecules/Crumbs/Crumbs": {
254
266
  "import": "./dist/molecules/Crumbs/Crumbs.js",
255
267
  "require": "./dist/molecules/Crumbs/Crumbs.js"
@@ -266,6 +278,14 @@
266
278
  "import": "./dist/molecules/LanguageSelector/index.js",
267
279
  "require": "./dist/molecules/LanguageSelector/index.js"
268
280
  },
281
+ "./molecules/MaskedPhoneNumber/MaskedPhoneNumber": {
282
+ "import": "./dist/molecules/MaskedPhoneNumber/MaskedPhoneNumber.js",
283
+ "require": "./dist/molecules/MaskedPhoneNumber/MaskedPhoneNumber.js"
284
+ },
285
+ "./molecules/MaskedPhoneNumber": {
286
+ "import": "./dist/molecules/MaskedPhoneNumber/index.js",
287
+ "require": "./dist/molecules/MaskedPhoneNumber/index.js"
288
+ },
269
289
  "./molecules": {
270
290
  "import": "./dist/molecules/exports.js",
271
291
  "require": "./dist/molecules/exports.js"
@@ -318,16 +338,16 @@
318
338
  "zod": "^3.22.4"
319
339
  },
320
340
  "devDependencies": {
321
- "@chromatic-com/storybook": "4.1.1",
341
+ "@chromatic-com/storybook": "4.1.3",
322
342
  "@emotion/react": "^11.14.0",
323
343
  "@emotion/styled": "^11.14.0",
324
344
  "@hookform/resolvers": "^3.3.4",
325
345
  "@imgproxy/imgproxy-node": "^1.0.6",
326
346
  "@mui/icons-material": "^6.4.1",
327
347
  "@mui/material": "^6.4.1",
328
- "@storybook/addon-docs": "9.1.10",
329
- "@storybook/addon-onboarding": "9.1.10",
330
- "@storybook/nextjs": "9.1.10",
348
+ "@storybook/addon-docs": "10.1.4",
349
+ "@storybook/addon-onboarding": "10.1.4",
350
+ "@storybook/nextjs": "10.1.4",
331
351
  "@strapi/blocks-react-renderer": "^1.0.0",
332
352
  "@strapi/strapi": "5.27.0",
333
353
  "@trivago/prettier-plugin-sort-imports": "^5.2.1",
@@ -340,7 +360,7 @@
340
360
  "eslint-config-next": "14.2.5",
341
361
  "eslint-config-prettier": "^10.0.1",
342
362
  "eslint-plugin-prettier": "^5.2.3",
343
- "eslint-plugin-storybook": "^9.1.10",
363
+ "eslint-plugin-storybook": "^10.1.4",
344
364
  "motion": "^12.0.0",
345
365
  "next": "14.2.33",
346
366
  "next-intl": "^3.10.0",
@@ -351,7 +371,7 @@
351
371
  "rimraf": "^6.0.1",
352
372
  "schema-dts": "^1.1.2",
353
373
  "slugify": "^1.6.6",
354
- "storybook": "9.1.10",
374
+ "storybook": "10.1.4",
355
375
  "typescript": "^5.4.5",
356
376
  "zod": "^3.22.4"
357
377
  },