@voyantjs/extras-ui 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,3 +11,17 @@ pnpm add @voyantjs/extras-ui @voyantjs/extras-react @voyantjs/ui @tanstack/react
11
11
  `@voyantjs/ui` provides the design-system primitives. `@voyantjs/extras-react` provides the data-layer hooks. Both are required peers.
12
12
 
13
13
  All components accept a `className` prop and merge it with `cn()`. Wrap or compose to extend; use the registry copy-paste path (`npx shadcn add @voyant/...`) for components you want to fork outright.
14
+
15
+ ## I18n
16
+
17
+ Components render English by default. To localize them, wrap your UI in
18
+ `ExtrasUiMessagesProvider` and import only the locales your app supports.
19
+
20
+ ```tsx
21
+ import { ExtrasUiMessagesProvider } from "@voyantjs/extras-ui"
22
+ import { extrasUiEn } from "@voyantjs/extras-ui/i18n/en"
23
+ import { extrasUiRo } from "@voyantjs/extras-ui/i18n/ro"
24
+ ```
25
+
26
+ English-only apps should import only `./i18n/en`. Bilingual apps can import
27
+ `./i18n/en` and `./i18n/ro`.
@@ -4,6 +4,6 @@ type Props = {
4
4
  placeholder?: string;
5
5
  disabled?: boolean;
6
6
  };
7
- export declare function ProductCombobox({ value, onChange, placeholder, disabled, }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export declare function ProductCombobox({ value, onChange, placeholder, disabled }: Props): import("react/jsx-runtime").JSX.Element;
8
8
  export {};
9
9
  //# sourceMappingURL=product-combobox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"product-combobox.d.ts","sourceRoot":"","sources":["../../src/components/product-combobox.tsx"],"names":[],"mappings":"AAcA,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAID,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,WAAgC,EAChC,QAAQ,GACT,EAAE,KAAK,2CAkEP"}
1
+ {"version":3,"file":"product-combobox.d.ts","sourceRoot":"","sources":["../../src/components/product-combobox.tsx"],"names":[],"mappings":"AAgBA,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAID,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAyEhF"}
@@ -3,8 +3,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useProduct, useProducts } from "@voyantjs/products-react";
4
4
  import { Combobox, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList, } from "@voyantjs/ui/components/combobox";
5
5
  import * as React from "react";
6
+ import { useExtrasUiMessagesOrDefault } from "../i18n";
6
7
  const PAGE_SIZE = 25;
7
- export function ProductCombobox({ value, onChange, placeholder = "Search products…", disabled, }) {
8
+ export function ProductCombobox({ value, onChange, placeholder, disabled }) {
9
+ const messages = useExtrasUiMessagesOrDefault();
8
10
  const [search, setSearch] = React.useState("");
9
11
  const listQuery = useProducts({ search: search || undefined, limit: PAGE_SIZE });
10
12
  const selectedQuery = useProduct(value ?? undefined, { enabled: !!value });
@@ -33,10 +35,12 @@ export function ProductCombobox({ value, onChange, placeholder = "Search product
33
35
  const id = next ?? null;
34
36
  onChange(id);
35
37
  setInputValue(id ? (itemMap.get(id)?.name ?? "") : "");
36
- }, children: [_jsx(ComboboxInput, { placeholder: placeholder, showClear: !!value }), _jsxs(ComboboxContent, { children: [_jsx(ComboboxEmpty, { children: listQuery.isPending || selectedQuery.isPending ? "Loading…" : "No products found." }), _jsx(ComboboxList, { children: _jsx(ComboboxCollection, { children: (id) => {
38
+ }, children: [_jsx(ComboboxInput, { placeholder: placeholder ?? messages.productCombobox.placeholder, showClear: !!value }), _jsxs(ComboboxContent, { children: [_jsx(ComboboxEmpty, { children: listQuery.isPending || selectedQuery.isPending
39
+ ? messages.productCombobox.loading
40
+ : messages.productCombobox.empty }), _jsx(ComboboxList, { children: _jsx(ComboboxCollection, { children: (id) => {
37
41
  const item = itemMap.get(id);
38
42
  if (!item)
39
43
  return null;
40
- return (_jsx(ComboboxItem, { value: item.id, children: _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate font-medium", children: item.name }), _jsxs("span", { className: "truncate text-xs text-muted-foreground", children: [item.status, " \u00B7 ", item.bookingMode] })] }) }, item.id));
44
+ return (_jsx(ComboboxItem, { value: item.id, children: _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate font-medium", children: item.name }), _jsxs("span", { className: "truncate text-xs text-muted-foreground", children: [messages.productCombobox.statusLabels[item.status], " \u00B7", " ", messages.productCombobox.bookingModeLabels[item.bookingMode]] })] }) }, item.id));
41
45
  } }) })] })] }));
42
46
  }
@@ -0,0 +1,22 @@
1
+ export declare const extrasUiEn: {
2
+ productCombobox: {
3
+ placeholder: string;
4
+ loading: string;
5
+ empty: string;
6
+ statusLabels: {
7
+ draft: string;
8
+ active: string;
9
+ archived: string;
10
+ };
11
+ bookingModeLabels: {
12
+ date: string;
13
+ date_time: string;
14
+ open: string;
15
+ stay: string;
16
+ transfer: string;
17
+ itinerary: string;
18
+ other: string;
19
+ };
20
+ };
21
+ };
22
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;CAoBK,CAAA"}
@@ -0,0 +1,21 @@
1
+ export const extrasUiEn = {
2
+ productCombobox: {
3
+ placeholder: "Search products...",
4
+ loading: "Loading...",
5
+ empty: "No products found.",
6
+ statusLabels: {
7
+ draft: "Draft",
8
+ active: "Active",
9
+ archived: "Archived",
10
+ },
11
+ bookingModeLabels: {
12
+ date: "Date",
13
+ date_time: "Date and time",
14
+ open: "Open",
15
+ stay: "Stay",
16
+ transfer: "Transfer",
17
+ itinerary: "Itinerary",
18
+ other: "Other",
19
+ },
20
+ },
21
+ };
@@ -0,0 +1,5 @@
1
+ export { extrasUiEn } from "./en";
2
+ export type { ExtrasUiMessages, ProductBookingMode, ProductStatus } from "./messages";
3
+ export { type ExtrasUiMessageOverrides, ExtrasUiMessagesProvider, extrasUiMessageDefinitions, getExtrasUiI18n, resolveExtrasUiMessages, useExtrasUiI18n, useExtrasUiI18nOrDefault, useExtrasUiMessages, useExtrasUiMessagesOrDefault, } from "./provider";
4
+ export { extrasUiRo } from "./ro";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACjC,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,EACL,KAAK,wBAAwB,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { extrasUiEn } from "./en";
2
+ export { ExtrasUiMessagesProvider, extrasUiMessageDefinitions, getExtrasUiI18n, resolveExtrasUiMessages, useExtrasUiI18n, useExtrasUiI18nOrDefault, useExtrasUiMessages, useExtrasUiMessagesOrDefault, } from "./provider";
3
+ export { extrasUiRo } from "./ro";
@@ -0,0 +1,13 @@
1
+ import type { ProductRecord } from "@voyantjs/products-react";
2
+ export type ProductStatus = ProductRecord["status"];
3
+ export type ProductBookingMode = ProductRecord["bookingMode"];
4
+ export type ExtrasUiMessages = {
5
+ productCombobox: {
6
+ placeholder: string;
7
+ loading: string;
8
+ empty: string;
9
+ statusLabels: Record<ProductStatus, string>;
10
+ bookingModeLabels: Record<ProductBookingMode, string>;
11
+ };
12
+ };
13
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAE7D,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;AACnD,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC,aAAa,CAAC,CAAA;AAE7D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,EAAE;QACf,WAAW,EAAE,MAAM,CAAA;QACnB,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QAC3C,iBAAiB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;KACtD,CAAA;CACF,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,66 @@
1
+ import { type LocaleMessageOverrides, type PackageI18nValue } from "@voyantjs/i18n";
2
+ import type { ReactNode } from "react";
3
+ import type { ExtrasUiMessages } from "./messages";
4
+ export declare const extrasUiMessageDefinitions: {
5
+ en: {
6
+ productCombobox: {
7
+ placeholder: string;
8
+ loading: string;
9
+ empty: string;
10
+ statusLabels: {
11
+ draft: string;
12
+ active: string;
13
+ archived: string;
14
+ };
15
+ bookingModeLabels: {
16
+ date: string;
17
+ date_time: string;
18
+ open: string;
19
+ stay: string;
20
+ transfer: string;
21
+ itinerary: string;
22
+ other: string;
23
+ };
24
+ };
25
+ };
26
+ ro: {
27
+ productCombobox: {
28
+ placeholder: string;
29
+ loading: string;
30
+ empty: string;
31
+ statusLabels: {
32
+ draft: string;
33
+ active: string;
34
+ archived: string;
35
+ };
36
+ bookingModeLabels: {
37
+ date: string;
38
+ date_time: string;
39
+ open: string;
40
+ stay: string;
41
+ transfer: string;
42
+ itinerary: string;
43
+ other: string;
44
+ };
45
+ };
46
+ };
47
+ };
48
+ export type ExtrasUiMessageOverrides = LocaleMessageOverrides<ExtrasUiMessages>;
49
+ export declare function resolveExtrasUiMessages({ locale, overrides, }: {
50
+ locale: string | null | undefined;
51
+ overrides?: ExtrasUiMessageOverrides | null;
52
+ }): ExtrasUiMessages;
53
+ export declare function getExtrasUiI18n({ locale, overrides, }: {
54
+ locale?: string | null | undefined;
55
+ overrides?: ExtrasUiMessageOverrides | null;
56
+ }): PackageI18nValue<ExtrasUiMessages>;
57
+ export declare function ExtrasUiMessagesProvider({ children, locale, overrides, }: {
58
+ children: ReactNode;
59
+ locale: string | null | undefined;
60
+ overrides?: ExtrasUiMessageOverrides | null;
61
+ }): import("react/jsx-runtime").JSX.Element;
62
+ export declare const useExtrasUiI18n: () => PackageI18nValue<ExtrasUiMessages>;
63
+ export declare const useExtrasUiMessages: () => ExtrasUiMessages;
64
+ export declare function useExtrasUiI18nOrDefault(): PackageI18nValue<ExtrasUiMessages>;
65
+ export declare function useExtrasUiMessagesOrDefault(): ExtrasUiMessages;
66
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/i18n/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAEtB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAKlD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGe,CAAA;AAEtD,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;AAS/E,wBAAgB,uBAAuB,CAAC,EACtC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAA;CAC5C,oBAOA;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAClC,SAAS,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAA;CAC5C,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CASrC;AAED,wBAAgB,wBAAwB,CAAC,EACvC,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAA;CAC5C,2CAWA;AAED,eAAO,MAAM,eAAe,0CAA0B,CAAA;AACtD,eAAO,MAAM,mBAAmB,wBAA8B,CAAA;AAE9D,wBAAgB,wBAAwB,uCAEvC;AAED,wBAAgB,4BAA4B,qBAE3C"}
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createLocaleFormatters, createPackageMessagesContext, resolvePackageMessages, } from "@voyantjs/i18n";
4
+ import { extrasUiEn } from "./en";
5
+ import { extrasUiRo } from "./ro";
6
+ const fallbackLocale = "en";
7
+ export const extrasUiMessageDefinitions = {
8
+ en: extrasUiEn,
9
+ ro: extrasUiRo,
10
+ };
11
+ const extrasUiContext = createPackageMessagesContext("ExtrasUiMessages");
12
+ const defaultExtrasUiI18n = {
13
+ messages: extrasUiEn,
14
+ ...createLocaleFormatters(fallbackLocale),
15
+ };
16
+ export function resolveExtrasUiMessages({ locale, overrides, }) {
17
+ return resolvePackageMessages({
18
+ definitions: extrasUiMessageDefinitions,
19
+ fallbackLocale,
20
+ locale,
21
+ overrides,
22
+ });
23
+ }
24
+ export function getExtrasUiI18n({ locale, overrides, }) {
25
+ const resolvedLocale = locale ?? fallbackLocale;
26
+ return {
27
+ messages: resolveExtrasUiMessages({
28
+ locale: resolvedLocale,
29
+ overrides,
30
+ }),
31
+ ...createLocaleFormatters(resolvedLocale),
32
+ };
33
+ }
34
+ export function ExtrasUiMessagesProvider({ children, locale, overrides, }) {
35
+ return (_jsx(extrasUiContext.ResolvedMessagesProvider, { definitions: extrasUiMessageDefinitions, fallbackLocale: fallbackLocale, locale: locale, overrides: overrides, children: children }));
36
+ }
37
+ export const useExtrasUiI18n = extrasUiContext.useI18n;
38
+ export const useExtrasUiMessages = extrasUiContext.useMessages;
39
+ export function useExtrasUiI18nOrDefault() {
40
+ return extrasUiContext.useOptionalI18n() ?? defaultExtrasUiI18n;
41
+ }
42
+ export function useExtrasUiMessagesOrDefault() {
43
+ return useExtrasUiI18nOrDefault().messages;
44
+ }
@@ -0,0 +1,22 @@
1
+ export declare const extrasUiRo: {
2
+ productCombobox: {
3
+ placeholder: string;
4
+ loading: string;
5
+ empty: string;
6
+ statusLabels: {
7
+ draft: string;
8
+ active: string;
9
+ archived: string;
10
+ };
11
+ bookingModeLabels: {
12
+ date: string;
13
+ date_time: string;
14
+ open: string;
15
+ stay: string;
16
+ transfer: string;
17
+ itinerary: string;
18
+ other: string;
19
+ };
20
+ };
21
+ };
22
+ //# sourceMappingURL=ro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ro.d.ts","sourceRoot":"","sources":["../../src/i18n/ro.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;CAoBK,CAAA"}
@@ -0,0 +1,21 @@
1
+ export const extrasUiRo = {
2
+ productCombobox: {
3
+ placeholder: "Cauta produse...",
4
+ loading: "Se incarca...",
5
+ empty: "Nu s-au gasit produse.",
6
+ statusLabels: {
7
+ draft: "Ciorna",
8
+ active: "Activ",
9
+ archived: "Arhivat",
10
+ },
11
+ bookingModeLabels: {
12
+ date: "Data",
13
+ date_time: "Data si ora",
14
+ open: "Deschis",
15
+ stay: "Sejur",
16
+ transfer: "Transfer",
17
+ itinerary: "Itinerar",
18
+ other: "Altul",
19
+ },
20
+ },
21
+ };
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { ProductCombobox } from "./components/product-combobox";
2
+ export { type ExtrasUiMessageOverrides, type ExtrasUiMessages, ExtrasUiMessagesProvider, extrasUiEn, extrasUiMessageDefinitions, extrasUiRo, getExtrasUiI18n, resolveExtrasUiMessages, useExtrasUiI18n, useExtrasUiI18nOrDefault, useExtrasUiMessages, useExtrasUiMessagesOrDefault, } from "./i18n";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,wBAAwB,EACxB,UAAU,EACV,0BAA0B,EAC1B,UAAU,EACV,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,QAAQ,CAAA"}
package/dist/index.js CHANGED
@@ -1 +1,2 @@
1
1
  export { ProductCombobox } from "./components/product-combobox";
2
+ export { ExtrasUiMessagesProvider, extrasUiEn, extrasUiMessageDefinitions, extrasUiRo, getExtrasUiI18n, resolveExtrasUiMessages, useExtrasUiI18n, useExtrasUiI18nOrDefault, useExtrasUiMessages, useExtrasUiMessagesOrDefault, } from "./i18n";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/extras-ui",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "license": "FSL-1.1-Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,6 +14,18 @@
14
14
  "types": "./dist/index.d.ts",
15
15
  "import": "./dist/index.js"
16
16
  },
17
+ "./i18n": {
18
+ "types": "./dist/i18n/index.d.ts",
19
+ "import": "./dist/i18n/index.js"
20
+ },
21
+ "./i18n/en": {
22
+ "types": "./dist/i18n/en.d.ts",
23
+ "import": "./dist/i18n/en.js"
24
+ },
25
+ "./i18n/ro": {
26
+ "types": "./dist/i18n/ro.d.ts",
27
+ "import": "./dist/i18n/ro.js"
28
+ },
17
29
  "./components/*": {
18
30
  "types": "./dist/components/*.d.ts",
19
31
  "import": "./dist/components/*.js"
@@ -25,10 +37,13 @@
25
37
  "react": "^19.0.0",
26
38
  "react-dom": "^19.0.0",
27
39
  "react-hook-form": "^7.60.0",
28
- "zod": "^3.25.76",
29
- "@voyantjs/extras-react": "0.16.0",
30
- "@voyantjs/products-react": "0.16.0",
31
- "@voyantjs/ui": "0.16.0"
40
+ "zod": "^4.3.6",
41
+ "@voyantjs/extras-react": "0.17.0",
42
+ "@voyantjs/products-react": "0.17.0",
43
+ "@voyantjs/ui": "0.17.0"
44
+ },
45
+ "dependencies": {
46
+ "@voyantjs/i18n": "0.17.0"
32
47
  },
33
48
  "devDependencies": {
34
49
  "@tanstack/react-query": "^5.96.2",
@@ -41,11 +56,12 @@
41
56
  "react-hook-form": "^7.60.0",
42
57
  "typescript": "^6.0.2",
43
58
  "vitest": "^4.1.2",
44
- "zod": "^3.25.76",
45
- "@voyantjs/extras-react": "0.16.0",
46
- "@voyantjs/products-react": "0.16.0",
59
+ "zod": "^4.3.6",
60
+ "@voyantjs/extras-react": "0.17.0",
61
+ "@voyantjs/i18n": "0.17.0",
62
+ "@voyantjs/products-react": "0.17.0",
47
63
  "@voyantjs/voyant-typescript-config": "0.1.0",
48
- "@voyantjs/ui": "0.16.0"
64
+ "@voyantjs/ui": "0.17.0"
49
65
  },
50
66
  "files": [
51
67
  "dist"