@janbox/storefront-ui 2.0.10 → 2.0.12

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.
Files changed (40) hide show
  1. package/dist/constants/index.d.ts +0 -4
  2. package/dist/constants/index.d.ts.map +1 -1
  3. package/dist/constants/index.js +0 -7
  4. package/dist/hooks/use-formatter/index.d.ts.map +1 -1
  5. package/dist/hooks/use-formatter/index.js +8 -8
  6. package/dist/i18n/index.d.ts +8 -0
  7. package/dist/i18n/index.d.ts.map +1 -0
  8. package/dist/i18n/index.js +26 -0
  9. package/dist/i18n/locales/en.json.d.ts +6 -0
  10. package/dist/i18n/locales/en.json.js +8 -0
  11. package/dist/i18n/locales/vi.json.d.ts +5 -0
  12. package/dist/i18n/locales/vi.json.js +8 -0
  13. package/dist/index.js +2 -0
  14. package/dist/lib/avatar/avatar.d.ts +3 -0
  15. package/dist/lib/avatar/avatar.d.ts.map +1 -0
  16. package/dist/lib/avatar/avatar.js +124 -0
  17. package/dist/lib/avatar/helpers.d.ts +6 -0
  18. package/dist/lib/avatar/helpers.d.ts.map +1 -0
  19. package/dist/lib/avatar/helpers.js +37 -0
  20. package/dist/lib/avatar/index.d.ts +3 -0
  21. package/dist/lib/avatar/index.d.ts.map +1 -0
  22. package/dist/lib/avatar/types.d.ts +19 -0
  23. package/dist/lib/avatar/types.d.ts.map +1 -0
  24. package/dist/lib/count-up/count-up.d.ts.map +1 -1
  25. package/dist/lib/count-up/count-up.js +3 -3
  26. package/dist/lib/index.d.ts +1 -0
  27. package/dist/lib/index.d.ts.map +1 -1
  28. package/dist/lib/link/link.d.ts +1 -1
  29. package/dist/lib/link/link.d.ts.map +1 -1
  30. package/dist/lib/link/link.js +1 -1
  31. package/dist/lib/price-label/price-label.d.ts.map +1 -1
  32. package/dist/lib/price-label/price-label.js +28 -10
  33. package/dist/lib/price-label/types.d.ts +2 -0
  34. package/dist/lib/price-label/types.d.ts.map +1 -1
  35. package/dist/locales/en/ui__translation.json +2 -1
  36. package/dist/locales/vi/ui__translation.json +2 -1
  37. package/dist/theme/provider.d.ts +2 -1
  38. package/dist/theme/provider.d.ts.map +1 -1
  39. package/dist/theme/provider.js +3 -2
  40. package/package.json +1 -3
@@ -1,5 +1,4 @@
1
1
  import { default as IMAGE_PLACEHOLDER } from '../assets/svg/image-placeholder.svg?url';
2
- export declare const USER_COMPONENT_LOCALE_NAMESPACE = "user-component";
3
2
  export declare enum HTMLDatasetAttributes {
4
3
  DATA_TEST_ID = "data-testid",
5
4
  ARIA_DISABLED = "aria-disabled",
@@ -18,7 +17,4 @@ export declare enum Booleanish {
18
17
  True = "true",
19
18
  False = "false"
20
19
  }
21
- export declare enum LocaleNamespaces {
22
- Translation = "ui__translation"
23
- }
24
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,yCAAyC,CAAC;AAExE,eAAO,MAAM,+BAA+B,mBAAmB,CAAC;AAEhE,oBAAY,qBAAqB;IAC/B,YAAY,gBAAgB;IAC5B,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;CAClC;AAED,oBAAY,WAAW;IACrB,aAAa,kBAAkB;CAChC;AAED,eAAO,MAAM,YAAY,oHAA0G,CAAC;AAIpI,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,eAAO,MAAM,KAAK,SAAgC,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,oBAAY,gBAAgB;IAC1B,WAAW,oBAAoB;CAChC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,yCAAyC,CAAC;AAExE,oBAAY,qBAAqB;IAC/B,YAAY,gBAAgB;IAC5B,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;CAClC;AAED,oBAAY,WAAW;IACrB,aAAa,kBAAkB;CAChC;AAED,eAAO,MAAM,YAAY,oHAA0G,CAAC;AAIpI,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,eAAO,MAAM,KAAK,SAAgC,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,oBAAY,UAAU;IACpB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB"}
@@ -1,5 +1,4 @@
1
1
  import { default as default2 } from "../assets/svg/image-placeholder.svg.js";
2
- const USER_COMPONENT_LOCALE_NAMESPACE = "user-component";
3
2
  var HTMLDatasetAttributes = /* @__PURE__ */ ((HTMLDatasetAttributes2) => {
4
3
  HTMLDatasetAttributes2["DATA_TEST_ID"] = "data-testid";
5
4
  HTMLDatasetAttributes2["ARIA_DISABLED"] = "aria-disabled";
@@ -20,18 +19,12 @@ var Booleanish = /* @__PURE__ */ ((Booleanish2) => {
20
19
  Booleanish2["False"] = "false";
21
20
  return Booleanish2;
22
21
  })(Booleanish || {});
23
- var LocaleNamespaces = /* @__PURE__ */ ((LocaleNamespaces2) => {
24
- LocaleNamespaces2["Translation"] = "ui__translation";
25
- return LocaleNamespaces2;
26
- })(LocaleNamespaces || {});
27
22
  export {
28
23
  Booleanish,
29
24
  FALLBACK_SVG,
30
25
  HTMLClasses,
31
26
  HTMLDatasetAttributes,
32
27
  default2 as IMAGE_PLACEHOLDER,
33
- LocaleNamespaces,
34
28
  TYPING_DEBOUNCE,
35
- USER_COMPONENT_LOCALE_NAMESPACE,
36
29
  isSSR
37
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-formatter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAElB,qBAAqB,EAErB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAIjB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,eAAO,MAAM,YAAY;0BAIb,MAAM,YAAY,OAAO,CAAC,mBAAmB,CAAC;4BAO9C,IAAI,GAAG,MAAM,GAAG,MAAM,WAAW,WAAW,CAAC,qBAAqB,EAAE,KAAK,CAAC;yBAU1E,MAAM,WAAW,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC;CAclE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-formatter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAElB,qBAAqB,EAErB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,eAAO,MAAM,YAAY;0BAIb,MAAM,YAAY,OAAO,CAAC,mBAAmB,CAAC;4BAO9C,IAAI,GAAG,MAAM,GAAG,MAAM,WAAW,WAAW,CAAC,qBAAqB,EAAE,KAAK,CAAC;yBAU1E,MAAM,WAAW,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC;CAclE,CAAC"}
@@ -1,28 +1,28 @@
1
1
  import { formatNumber, formatDateTime, formatPrice } from "../../utils/index.js";
2
2
  import { useCallback, useMemo } from "react";
3
- import { useTranslation } from "react-i18next";
3
+ import { useTranslation } from "../../i18n/index.js";
4
4
  const useFormatter = () => {
5
- const { i18n } = useTranslation();
5
+ const { locale } = useTranslation();
6
6
  const formatNumberFn = useCallback(
7
7
  (value, options) => {
8
- return formatNumber(value, { lng: i18n.language, ...options });
8
+ return formatNumber(value, { lng: locale, ...options });
9
9
  },
10
- [i18n.language]
10
+ [locale]
11
11
  );
12
12
  const formatDateTimeFn = useCallback(
13
13
  (value, options) => {
14
14
  return formatDateTime(value, {
15
15
  ...options,
16
- lng: options.lng ?? i18n.language
16
+ lng: options.lng ?? locale
17
17
  });
18
18
  },
19
- [i18n.language]
19
+ [locale]
20
20
  );
21
21
  const formatPriceFn = useCallback(
22
22
  (value, options) => {
23
- return formatPrice(value, { ...options, lng: options.lng ?? i18n.language });
23
+ return formatPrice(value, { ...options, lng: options.lng ?? locale });
24
24
  },
25
- [i18n.language]
25
+ [locale]
26
26
  );
27
27
  return useMemo(
28
28
  () => ({
@@ -0,0 +1,8 @@
1
+ import { default as en } from './locales/en.json';
2
+ export declare const FALLBACK_LOCALE = "en";
3
+ export declare const LocaleContext: import('react').Context<string>;
4
+ export declare const useTranslation: () => {
5
+ t: (key: keyof typeof en) => string;
6
+ locale: string;
7
+ };
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQnC,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,eAAO,MAAM,aAAa,iCAAiC,CAAC;AAE5D,eAAO,MAAM,cAAc;aAKZ,MAAM,OAAO,EAAE;;CAI7B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { useContext, useMemo, createContext } from "react";
2
+ import en from "./locales/en.json.js";
3
+ import vi from "./locales/vi.json.js";
4
+ const translations = {
5
+ en,
6
+ vi
7
+ };
8
+ const FALLBACK_LOCALE = "en";
9
+ const LocaleContext = createContext(FALLBACK_LOCALE);
10
+ const useTranslation = () => {
11
+ const locale = useContext(LocaleContext);
12
+ return useMemo(() => {
13
+ return {
14
+ t: (key) => {
15
+ var _a, _b;
16
+ return ((_a = translations[locale]) == null ? void 0 : _a[key]) ?? ((_b = translations.en) == null ? void 0 : _b[key]) ?? key;
17
+ },
18
+ locale
19
+ };
20
+ }, [locale]);
21
+ };
22
+ export {
23
+ FALLBACK_LOCALE,
24
+ LocaleContext,
25
+ useTranslation
26
+ };
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ "updating": "Updating"
3
+ }
4
+ ;
5
+
6
+ export default _default;
@@ -0,0 +1,8 @@
1
+ const updating = "Updating";
2
+ const en = {
3
+ updating
4
+ };
5
+ export {
6
+ en as default,
7
+ updating
8
+ };
@@ -0,0 +1,5 @@
1
+ declare const _default: {
2
+ "updating": "Đang cập nhật"
3
+ };
4
+
5
+ export default _default;
@@ -0,0 +1,8 @@
1
+ const updating = "Đang cập nhật";
2
+ const vi = {
3
+ updating
4
+ };
5
+ export {
6
+ vi as default,
7
+ updating
8
+ };
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import { AccordionGroupContext, getAccordionGroupDataAttributes, getAccordionGro
7
7
  import { AccordionGroupDataAttributes } from "./lib/accordion/accordion-group/types.js";
8
8
  import { AccordionSummary } from "./lib/accordion/accordion-summary/accordion-summary.js";
9
9
  import { AccordionSummaryVariant } from "./lib/accordion/accordion-summary/types.js";
10
+ import { Avatar } from "./lib/avatar/avatar.js";
10
11
  import { Badge } from "./lib/badge/badge.js";
11
12
  import { BlockSkeleton } from "./lib/loading/block-skeleton/block-skeleton.js";
12
13
  import { Box } from "./lib/box/box.js";
@@ -150,6 +151,7 @@ export {
150
151
  AccordionGroupDataAttributes,
151
152
  AccordionSummary,
152
153
  AccordionSummaryVariant,
154
+ Avatar,
153
155
  Badge,
154
156
  BlockSkeleton,
155
157
  Box,
@@ -0,0 +1,3 @@
1
+ import { AvatarProps } from './types';
2
+ export declare const Avatar: ({ ref, ..._props }: AvatarProps) => import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/lib/avatar/avatar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAyB,MAAM,SAAS,CAAC;AAQ7D,eAAO,MAAM,MAAM,uBAAwB,WAAW,4CAwFrD,CAAC"}
@@ -0,0 +1,124 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { getAvatarProps, getInitials, getAvatarStatusColor } from "./helpers.js";
4
+ import { isNil } from "lodash-es";
5
+ import { getColorVar } from "../../theme/palette.js";
6
+ import { useUpdateEffect } from "../../hooks/use-update-effect/index.js";
7
+ import { Primitive } from "../primitive/primitive.js";
8
+ const Avatar = ({ ref, ..._props }) => {
9
+ var _a, _b, _c;
10
+ const { src, name, color = "primary", size = 40, status, sm, md, lg, ...rest } = getAvatarProps(_props);
11
+ const [avatarSrc, setAvatarSrc] = useState(src);
12
+ useUpdateEffect(() => {
13
+ setAvatarSrc(src);
14
+ }, [src]);
15
+ return /* @__PURE__ */ jsxs(
16
+ Primitive,
17
+ {
18
+ ref,
19
+ ...rest,
20
+ sx: {
21
+ position: "relative",
22
+ ...createStyle({ size }),
23
+ ...rest.sx,
24
+ sm: {
25
+ ...createStyle(sm),
26
+ ...(_a = rest.sx) == null ? void 0 : _a.sm
27
+ },
28
+ md: {
29
+ ...createStyle(md),
30
+ ...(_b = rest.sx) == null ? void 0 : _b.md
31
+ },
32
+ lg: {
33
+ ...createStyle(lg),
34
+ ...(_c = rest.sx) == null ? void 0 : _c.lg
35
+ }
36
+ },
37
+ children: [
38
+ avatarSrc ? /* @__PURE__ */ jsx(
39
+ Primitive,
40
+ {
41
+ src,
42
+ alt: name ?? "",
43
+ onError: () => setAvatarSrc(void 0),
44
+ sx: {
45
+ position: "absolute",
46
+ width: "100%",
47
+ height: "100%",
48
+ display: "block",
49
+ objectFit: "inherit",
50
+ borderRadius: "inherit"
51
+ },
52
+ as: "img"
53
+ }
54
+ ) : /* @__PURE__ */ jsx(
55
+ Primitive,
56
+ {
57
+ sx: {
58
+ position: "absolute",
59
+ width: "100%",
60
+ height: "100%",
61
+ display: "flex",
62
+ alignItems: "center",
63
+ justifyContent: "center",
64
+ backgroundColor: getColorVar(`${color}.600`),
65
+ color: getColorVar("white"),
66
+ fontWeight: 600,
67
+ lineHeight: 1,
68
+ borderRadius: "inherit",
69
+ ...createInitialsStyle({ size }),
70
+ sm: createInitialsStyle(sm),
71
+ md: createInitialsStyle(md),
72
+ lg: createInitialsStyle(lg)
73
+ },
74
+ children: getInitials(name)
75
+ }
76
+ ),
77
+ status && /* @__PURE__ */ jsx(
78
+ Primitive,
79
+ {
80
+ as: "span",
81
+ sx: {
82
+ position: "absolute",
83
+ bottom: 0,
84
+ right: 0,
85
+ borderRadius: "50%",
86
+ backgroundColor: getAvatarStatusColor(status),
87
+ borderWidth: 2,
88
+ borderColor: getColorVar("white"),
89
+ ...createStatusStyle({ size }),
90
+ sm: createStatusStyle(sm),
91
+ md: createStatusStyle(md),
92
+ lg: createStatusStyle(lg)
93
+ }
94
+ }
95
+ )
96
+ ]
97
+ }
98
+ );
99
+ };
100
+ const createStyle = ({ size } = {}) => {
101
+ return {
102
+ width: size,
103
+ height: size,
104
+ minWidth: size,
105
+ minHeight: size
106
+ };
107
+ };
108
+ const createStatusStyle = ({ size } = {}) => {
109
+ if (isNil(size)) return {};
110
+ const dotSize = Math.round(size * 0.28);
111
+ return {
112
+ width: dotSize,
113
+ height: dotSize
114
+ };
115
+ };
116
+ const createInitialsStyle = ({ size } = {}) => {
117
+ if (isNil(size)) return {};
118
+ return {
119
+ fontSize: Math.round(size * 0.4)
120
+ };
121
+ };
122
+ export {
123
+ Avatar
124
+ };
@@ -0,0 +1,6 @@
1
+ import { AvatarProps, AvatarStatus } from './types';
2
+ export declare const getAvatarProps: (props: AvatarProps) => AvatarProps;
3
+ /** Resolve dimension from named size or custom number */
4
+ export declare const getInitials: (name?: string) => string;
5
+ export declare const getAvatarStatusColor: (status: AvatarStatus) => string | undefined;
6
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/avatar/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAapD,eAAO,MAAM,cAAc,UAAW,WAAW,KAAG,WAEnD,CAAC;AAEF,yDAAyD;AAEzD,eAAO,MAAM,WAAW,2BAIvB,CAAC;AAEF,eAAO,MAAM,oBAAoB,WAAY,YAAY,uBAaxD,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { mergeComponentProps } from "../../utils/index.js";
2
+ import "lodash-es";
3
+ import { getColorVar } from "../../theme/palette.js";
4
+ const defaultProps = {
5
+ size: 40,
6
+ sx: {
7
+ borderRadius: "50%",
8
+ objectFit: "cover"
9
+ }
10
+ };
11
+ const getAvatarProps = (props) => {
12
+ return mergeComponentProps(defaultProps, props);
13
+ };
14
+ const getInitials = (name = "") => {
15
+ const parts = name.trim().split(/\s+/);
16
+ if (parts.length === 1) return parts[0].charAt(0).toUpperCase();
17
+ return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();
18
+ };
19
+ const getAvatarStatusColor = (status) => {
20
+ switch (status) {
21
+ case "online":
22
+ return getColorVar("green.600");
23
+ case "offline":
24
+ return getColorVar("neutral.600");
25
+ case "busy":
26
+ return getColorVar("red.600");
27
+ case "away":
28
+ return getColorVar("orange.600");
29
+ default:
30
+ return;
31
+ }
32
+ };
33
+ export {
34
+ getAvatarProps,
35
+ getAvatarStatusColor,
36
+ getInitials
37
+ };
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './avatar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/avatar/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { JSX } from 'react';
2
+ import { ColorVariant, PropsWithSx, ShallowMerge, ToResponsiveProps } from '../../types';
3
+ export type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';
4
+ export type AvatarResponsiveProps = {
5
+ size?: number;
6
+ };
7
+ type AvatarHTMLProps = JSX.IntrinsicElements['div'];
8
+ export type AvatarProps = PropsWithSx<ShallowMerge<AvatarHTMLProps, ToResponsiveProps<AvatarResponsiveProps> & {
9
+ /** URL of the avatar image */
10
+ src?: string;
11
+ /** User's name — used for initials fallback and alt/aria-label */
12
+ name?: string;
13
+ /** Shape of the avatar */
14
+ /** Online status indicator */
15
+ status?: AvatarStatus;
16
+ color?: ColorVariant;
17
+ }>>;
18
+ export {};
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/avatar/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAErF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,eAAe,GAAG,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG,WAAW,CACnC,YAAY,CACV,eAAe,EACf,iBAAiB,CAAC,qBAAqB,CAAC,GAAG;IACzC,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CACF,CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"count-up.d.ts","sourceRoot":"","sources":["../../../src/lib/count-up/count-up.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,eAAO,MAAM,OAAO,+DAAwE,YAAY,4CAiCvG,CAAC"}
1
+ {"version":3,"file":"count-up.d.ts","sourceRoot":"","sources":["../../../src/lib/count-up/count-up.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAKvC,eAAO,MAAM,OAAO,+DAAwE,YAAY,4CAiCvG,CAAC"}
@@ -2,12 +2,12 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { useRef, useEffect } from "react";
3
3
  import { useMergeRefs } from "@floating-ui/react";
4
4
  import { useMotionValue, useInView, useTransform, animate, motion } from "motion/react";
5
- import { useTranslation } from "react-i18next";
6
5
  import { formatNumber } from "../../utils/index.js";
6
+ import { useTranslation } from "../../i18n/index.js";
7
7
  import { getDecimalDigits } from "../../utils/common.js";
8
8
  const CountUp = ({ from = 0, to, duration = 2, formatNumberOptions, ref, ...props }) => {
9
9
  const rootRef = useRef(null);
10
- const { i18n } = useTranslation();
10
+ const { locale } = useTranslation();
11
11
  const mergedRef = useMergeRefs([ref, rootRef]);
12
12
  const maximumFractionDigits = Math.max(getDecimalDigits(from), getDecimalDigits(to));
13
13
  const count = useMotionValue(from);
@@ -15,7 +15,7 @@ const CountUp = ({ from = 0, to, duration = 2, formatNumberOptions, ref, ...prop
15
15
  const rounded = useTransform(
16
16
  count,
17
17
  (latest) => formatNumber(latest, {
18
- lng: i18n.language,
18
+ lng: locale,
19
19
  ...formatNumberOptions,
20
20
  maximumFractionDigits
21
21
  })
@@ -58,4 +58,5 @@ export * from './lightbox';
58
58
  export * from './cascader';
59
59
  export * from './primitive';
60
60
  export * from './price-label';
61
+ export * from './avatar';
61
62
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { LinkProps } from './types';
2
- export declare const Link: ({ children, ref, ..._props }: LinkProps) => import("@emotion/react/jsx-runtime").JSX.Element;
2
+ export declare const Link: ({ children, ref, ..._props }: LinkProps) => import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/lib/link/link.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAuB,MAAM,SAAS,CAAC;AAOzD,eAAO,MAAM,IAAI,iCAAkC,SAAS,qDAoD3D,CAAC"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/lib/link/link.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAuB,MAAM,SAAS,CAAC;AAOzD,eAAO,MAAM,IAAI,iCAAkC,SAAS,4CAoD3D,CAAC"}
@@ -1,4 +1,4 @@
1
- import { jsx } from "@emotion/react/jsx-runtime";
1
+ import { jsx } from "react/jsx-runtime";
2
2
  import { ClassNames } from "@emotion/react";
3
3
  import { isNil } from "lodash-es";
4
4
  import { Link as Link$1 } from "react-router";
@@ -1 +1 @@
1
- {"version":3,"file":"price-label.d.ts","sourceRoot":"","sources":["../../../src/lib/price-label/price-label.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA8C,eAAe,EAAE,MAAM,SAAS,CAAC;AAQtF,eAAO,MAAM,UAAU,WAAY,eAAe,4CAoFjD,CAAC"}
1
+ {"version":3,"file":"price-label.d.ts","sourceRoot":"","sources":["../../../src/lib/price-label/price-label.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA8C,eAAe,EAAE,MAAM,SAAS,CAAC;AAOtF,eAAO,MAAM,UAAU,WAAY,eAAe,4CAsGjD,CAAC"}
@@ -1,14 +1,14 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { getPriceLabelProps } from "./helpers.js";
3
3
  import { isNumber, isNil } from "lodash-es";
4
- import { useTranslation } from "react-i18next";
5
- import { LocaleNamespaces } from "../../constants/index.js";
4
+ import { useTranslation } from "../../i18n/index.js";
6
5
  import { useFormatter } from "../../hooks/use-formatter/index.js";
7
6
  import { getColorVar } from "../../theme/palette.js";
8
7
  import { getSmallerTypographyVariants, getTypographyVar } from "../../theme/typography.js";
9
8
  import { Primitive } from "../primitive/primitive.js";
10
9
  import { TextSkeleton } from "../loading/text-skeleton/text-skeleton.js";
11
10
  const PriceLabel = (_props) => {
11
+ var _a, _b, _c, _d, _e, _f;
12
12
  const {
13
13
  price,
14
14
  exchangePrice,
@@ -19,6 +19,8 @@ const PriceLabel = (_props) => {
19
19
  md,
20
20
  lg,
21
21
  showEqual = false,
22
+ priceProps,
23
+ exchangePriceProps,
22
24
  ...rest
23
25
  } = getPriceLabelProps(_props);
24
26
  const isPriceEqual = price.currency && price.currency === (exchangePrice == null ? void 0 : exchangePrice.currency) && isNumber(price.value) && price.value === (exchangePrice == null ? void 0 : exchangePrice.value);
@@ -40,14 +42,25 @@ const PriceLabel = (_props) => {
40
42
  /* @__PURE__ */ jsx(
41
43
  Primitive,
42
44
  {
43
- as: "span",
45
+ ...priceProps,
44
46
  sx: {
45
47
  color: getColorVar(`${color}.600`),
46
48
  ...createStyle({ size }),
47
- sm: createStyle(sm),
48
- md: createStyle(md),
49
- lg: createStyle(lg)
49
+ ...priceProps == null ? void 0 : priceProps.sx,
50
+ sm: {
51
+ ...createStyle(sm),
52
+ ...(_a = priceProps == null ? void 0 : priceProps.sx) == null ? void 0 : _a.sm
53
+ },
54
+ md: {
55
+ ...createStyle(md),
56
+ ...(_b = priceProps == null ? void 0 : priceProps.sx) == null ? void 0 : _b.md
57
+ },
58
+ lg: {
59
+ ...createStyle(lg),
60
+ ...(_c = priceProps == null ? void 0 : priceProps.sx) == null ? void 0 : _c.lg
61
+ }
50
62
  },
63
+ as: "span",
51
64
  children: /* @__PURE__ */ jsx(
52
65
  PriceRenderer,
53
66
  {
@@ -64,17 +77,22 @@ const PriceLabel = (_props) => {
64
77
  /* @__PURE__ */ jsx(
65
78
  Primitive,
66
79
  {
80
+ ...exchangePriceProps,
67
81
  sx: {
68
82
  color: getColorVar(`${color}.500`),
69
83
  ...createStyle({ size: getSmallerTypographyVariants(size).at(0) }),
84
+ ...exchangePriceProps == null ? void 0 : exchangePriceProps.sx,
70
85
  sm: {
71
- ...createStyle({ size: getSmallerTypographyVariants(sm == null ? void 0 : sm.size).at(0) })
86
+ ...createStyle({ size: getSmallerTypographyVariants(sm == null ? void 0 : sm.size).at(0) }),
87
+ ...(_d = exchangePriceProps == null ? void 0 : exchangePriceProps.sx) == null ? void 0 : _d.sm
72
88
  },
73
89
  md: {
74
- ...createStyle({ size: getSmallerTypographyVariants(md == null ? void 0 : md.size).at(0) })
90
+ ...createStyle({ size: getSmallerTypographyVariants(md == null ? void 0 : md.size).at(0) }),
91
+ ...(_e = exchangePriceProps == null ? void 0 : exchangePriceProps.sx) == null ? void 0 : _e.md
75
92
  },
76
93
  lg: {
77
- ...createStyle({ size: getSmallerTypographyVariants(lg == null ? void 0 : lg.size).at(0) })
94
+ ...createStyle({ size: getSmallerTypographyVariants(lg == null ? void 0 : lg.size).at(0) }),
95
+ ...(_f = exchangePriceProps == null ? void 0 : exchangePriceProps.sx) == null ? void 0 : _f.lg
78
96
  }
79
97
  },
80
98
  as: "span",
@@ -97,7 +115,7 @@ const PriceLabel = (_props) => {
97
115
  );
98
116
  };
99
117
  const PriceRenderer = ({ price }) => {
100
- const { t } = useTranslation(LocaleNamespaces.Translation);
118
+ const { t } = useTranslation();
101
119
  const { formatPrice, formatNumber } = useFormatter();
102
120
  const { currency, value, isPending, prefix = "", suffix = "", placeholder } = price;
103
121
  if (currency && isNumber(value)) {
@@ -15,7 +15,9 @@ export interface PriceLabelResponsiveProps {
15
15
  }
16
16
  type PriceLabelExtendedProps = ToResponsiveProps<PriceLabelResponsiveProps> & {
17
17
  price: PriceLabelEntry;
18
+ priceProps?: PrimitiveProps<JSX.IntrinsicElements['span']>;
18
19
  exchangePrice?: PriceLabelEntry;
20
+ exchangePriceProps?: PrimitiveProps<JSX.IntrinsicElements['span']>;
19
21
  color?: ColorVariant;
20
22
  orientation?: 'horizontal' | 'vertical';
21
23
  showEqual?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/price-label/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B;AAED,KAAK,uBAAuB,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,GAAG;IAC5E,KAAK,EAAE,eAAe,CAAC;IACvB,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/price-label/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B;AAED,KAAK,uBAAuB,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,GAAG;IAC5E,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,kBAAkB,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC"}
@@ -1,3 +1,4 @@
1
1
  {
2
- "apply": "Apply"
2
+ "apply": "Apply",
3
+ "updating": "Updating"
3
4
  }
@@ -1,3 +1,4 @@
1
1
  {
2
- "apply": "Áp dụng"
2
+ "apply": "Áp dụng",
3
+ "updating": "Đang cập nhật"
3
4
  }
@@ -2,6 +2,7 @@ import { Theme } from '@emotion/react';
2
2
  import { PropsWithChildren } from 'react';
3
3
  export type ThemeProviderProps = PropsWithChildren<{
4
4
  theme: Theme;
5
+ locale?: string;
5
6
  }>;
6
- export declare const ThemeProvider: ({ theme, children }: ThemeProviderProps) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const ThemeProvider: ({ theme, locale, children }: ThemeProviderProps) => import("react/jsx-runtime").JSX.Element;
7
8
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/theme/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAwD,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAO1C,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;IACjD,KAAK,EAAE,KAAK,CAAC;CACd,CAAC,CAAC;AAEH,eAAO,MAAM,aAAa,wBAAyB,kBAAkB,4CAOpE,CAAC"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/theme/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAwD,MAAM,gBAAgB,CAAC;AACrG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAQ/C,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;IACjD,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAEH,eAAO,MAAM,aAAa,gCAAmD,kBAAkB,4CAO9F,CAAC"}
@@ -4,10 +4,11 @@ import { getColorVar } from "./palette.js";
4
4
  import { flatten } from "flat";
5
5
  import { flatMap } from "lodash-es";
6
6
  import { getTypographyVar } from "./typography.js";
7
- const ThemeProvider = ({ theme, children }) => {
7
+ import { LocaleContext, FALLBACK_LOCALE } from "../i18n/index.js";
8
+ const ThemeProvider = ({ theme, locale = FALLBACK_LOCALE, children }) => {
8
9
  return /* @__PURE__ */ jsxs(ThemeProvider$1, { theme, children: [
9
10
  /* @__PURE__ */ jsx(Global, { styles: createGlobalStyle(theme) }),
10
- children
11
+ /* @__PURE__ */ jsx(LocaleContext.Provider, { value: locale, children })
11
12
  ] });
12
13
  };
13
14
  const createGlobalStyle = ({ palette, typography }) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@janbox/storefront-ui",
3
- "version": "2.0.10",
3
+ "version": "2.0.12",
4
4
  "description": "Storefront UI component library for Janbox",
5
5
  "author": "Janbox",
6
6
  "keywords": [
@@ -56,7 +56,6 @@
56
56
  "@emotion/react": "*",
57
57
  "react": ">=19.0.0",
58
58
  "react-dom": ">=19.0.0",
59
- "react-i18next": "*",
60
59
  "react-router": ">=7.0.0"
61
60
  },
62
61
  "dependencies": {
@@ -99,7 +98,6 @@
99
98
  "eslint-plugin-react-hooks": "^7.0.1",
100
99
  "eslint-plugin-unused-imports": "^4.4.1",
101
100
  "globals": "^17.4.0",
102
- "i18next": "^25.8.13",
103
101
  "prettier": "^3.8.1",
104
102
  "sass-embedded": "^1.97.3",
105
103
  "storybook": "^10.2.14",