@janbox/storefront-ui 2.0.10 → 2.0.11

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 (38) 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 +121 -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 +36 -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 +2 -3
  33. package/dist/locales/en/ui__translation.json +2 -1
  34. package/dist/locales/vi/ui__translation.json +2 -1
  35. package/dist/theme/provider.d.ts +2 -1
  36. package/dist/theme/provider.d.ts.map +1 -1
  37. package/dist/theme/provider.js +3 -2
  38. 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,4CAqFrD,CAAC"}
@@ -0,0 +1,121 @@
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
+ inset: 0,
47
+ objectFit: "inherit",
48
+ borderRadius: "inherit"
49
+ },
50
+ as: "img"
51
+ }
52
+ ) : /* @__PURE__ */ jsx(
53
+ Primitive,
54
+ {
55
+ sx: {
56
+ position: "absolute",
57
+ inset: 0,
58
+ display: "flex",
59
+ alignItems: "center",
60
+ justifyContent: "center",
61
+ backgroundColor: getColorVar(`${color}.600`),
62
+ color: getColorVar("white"),
63
+ fontWeight: 600,
64
+ lineHeight: 1,
65
+ borderRadius: "inherit",
66
+ ...createInitialsStyle({ size }),
67
+ sm: createInitialsStyle(sm),
68
+ md: createInitialsStyle(md),
69
+ lg: createInitialsStyle(lg)
70
+ },
71
+ children: getInitials(name)
72
+ }
73
+ ),
74
+ status && /* @__PURE__ */ jsx(
75
+ Primitive,
76
+ {
77
+ as: "span",
78
+ sx: {
79
+ position: "absolute",
80
+ bottom: 0,
81
+ right: 0,
82
+ borderRadius: "50%",
83
+ backgroundColor: getAvatarStatusColor(status),
84
+ borderWidth: 2,
85
+ borderColor: getColorVar("white"),
86
+ ...createStatusStyle({ size }),
87
+ sm: createStatusStyle(sm),
88
+ md: createStatusStyle(md),
89
+ lg: createStatusStyle(lg)
90
+ }
91
+ }
92
+ )
93
+ ]
94
+ }
95
+ );
96
+ };
97
+ const createStyle = ({ size } = {}) => {
98
+ return {
99
+ width: size,
100
+ height: size,
101
+ minWidth: size,
102
+ minHeight: size
103
+ };
104
+ };
105
+ const createStatusStyle = ({ size } = {}) => {
106
+ if (isNil(size)) return {};
107
+ const dotSize = Math.round(size * 0.28);
108
+ return {
109
+ width: dotSize,
110
+ height: dotSize
111
+ };
112
+ };
113
+ const createInitialsStyle = ({ size } = {}) => {
114
+ if (isNil(size)) return {};
115
+ return {
116
+ fontSize: Math.round(size * 0.4)
117
+ };
118
+ };
119
+ export {
120
+ Avatar
121
+ };
@@ -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;AAYpD,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,36 @@
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
+ }
9
+ };
10
+ const getAvatarProps = (props) => {
11
+ return mergeComponentProps(defaultProps, props);
12
+ };
13
+ const getInitials = (name = "") => {
14
+ const parts = name.trim().split(/\s+/);
15
+ if (parts.length === 1) return parts[0].charAt(0).toUpperCase();
16
+ return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();
17
+ };
18
+ const getAvatarStatusColor = (status) => {
19
+ switch (status) {
20
+ case "online":
21
+ return getColorVar("green.600");
22
+ case "offline":
23
+ return getColorVar("neutral.600");
24
+ case "busy":
25
+ return getColorVar("red.600");
26
+ case "away":
27
+ return getColorVar("orange.600");
28
+ default:
29
+ return;
30
+ }
31
+ };
32
+ export {
33
+ getAvatarProps,
34
+ getAvatarStatusColor,
35
+ getInitials
36
+ };
@@ -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,4CAoFjD,CAAC"}
@@ -1,8 +1,7 @@
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";
@@ -97,7 +96,7 @@ const PriceLabel = (_props) => {
97
96
  );
98
97
  };
99
98
  const PriceRenderer = ({ price }) => {
100
- const { t } = useTranslation(LocaleNamespaces.Translation);
99
+ const { t } = useTranslation();
101
100
  const { formatPrice, formatNumber } = useFormatter();
102
101
  const { currency, value, isPending, prefix = "", suffix = "", placeholder } = price;
103
102
  if (currency && isNumber(value)) {
@@ -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.11",
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",