@voyantjs/markets-ui 0.15.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/markets-ui @voyantjs/markets-react @voyantjs/ui @tanstack/rea
11
11
  `@voyantjs/ui` provides the design-system primitives. `@voyantjs/markets-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
+ `MarketsUiMessagesProvider` and import only the locales your app supports.
19
+
20
+ ```tsx
21
+ import { MarketsUiMessagesProvider } from "@voyantjs/markets-ui"
22
+ import { marketsUiEn } from "@voyantjs/markets-ui/i18n/en"
23
+ import { marketsUiRo } from "@voyantjs/markets-ui/i18n/ro"
24
+ ```
25
+
26
+ English-only apps should import only `./i18n/en`. Bilingual apps can import
27
+ `./i18n/en` and `./i18n/ro`.
@@ -1 +1 @@
1
- {"version":3,"file":"market-currency-dialog.d.ts","sourceRoot":"","sources":["../../src/components/market-currency-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,yBAAyB,CAAA;AAgChC,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAA;CACrD;AAED,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE,yBAAyB,2CAmI3B"}
1
+ {"version":3,"file":"market-currency-dialog.d.ts","sourceRoot":"","sources":["../../src/components/market-currency-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,yBAAyB,CAAA;AAqChC,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAA;CACrD;AAED,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE,yBAAyB,2CA+I3B"}
@@ -8,21 +8,26 @@ import { Loader2 } from "lucide-react";
8
8
  import { useEffect } from "react";
9
9
  import { useForm } from "react-hook-form";
10
10
  import { z } from "zod/v4";
11
- const formSchema = z.object({
12
- currencyCode: z.string().length(3, "Currency must be 3 chars"),
13
- isDefault: z.boolean(),
14
- isSettlement: z.boolean(),
15
- isReporting: z.boolean(),
16
- sortOrder: z.coerce.number().int().min(0),
17
- active: z.boolean(),
18
- });
11
+ import { useMarketsUiMessagesOrDefault } from "../i18n";
12
+ function createFormSchema(messages) {
13
+ return z.object({
14
+ currencyCode: z.string().length(3, messages.marketCurrencyDialog.validation.currencyThreeChars),
15
+ isDefault: z.boolean(),
16
+ isSettlement: z.boolean(),
17
+ isReporting: z.boolean(),
18
+ sortOrder: z.coerce.number().int().min(0),
19
+ active: z.boolean(),
20
+ });
21
+ }
19
22
  export function MarketCurrencyDialog({ open, onOpenChange, marketId, currency, onSuccess, }) {
20
23
  const isEditing = Boolean(currency);
21
24
  const { create, update } = useMarketCurrencyMutation();
25
+ const messages = useMarketsUiMessagesOrDefault();
26
+ const formSchema = createFormSchema(messages);
22
27
  const form = useForm({
23
28
  resolver: zodResolver(formSchema),
24
29
  defaultValues: {
25
- currencyCode: "EUR",
30
+ currencyCode: "EUR" /* i18n-literal-ok domain default currency */,
26
31
  isDefault: false,
27
32
  isSettlement: false,
28
33
  isReporting: false,
@@ -44,7 +49,7 @@ export function MarketCurrencyDialog({ open, onOpenChange, marketId, currency, o
44
49
  }
45
50
  if (open) {
46
51
  form.reset({
47
- currencyCode: "EUR",
52
+ currencyCode: "EUR" /* i18n-literal-ok domain default currency */,
48
53
  isDefault: false,
49
54
  isSettlement: false,
50
55
  isReporting: false,
@@ -69,8 +74,12 @@ export function MarketCurrencyDialog({ open, onOpenChange, marketId, currency, o
69
74
  onSuccess?.(saved);
70
75
  };
71
76
  const isSubmitting = form.formState.isSubmitting || create.isPending || update.isPending;
72
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing ? "Edit Currency" : "Add Currency" }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Currency code" }), _jsx(CurrencyCombobox, { value: form.watch("currencyCode") || null, onChange: (next) => form.setValue("currencyCode", next ?? "EUR", {
77
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing
78
+ ? messages.marketCurrencyDialog.titles.edit
79
+ : messages.marketCurrencyDialog.titles.create }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketCurrencyDialog.fields.currencyCode }), _jsx(CurrencyCombobox, { value: form.watch("currencyCode") || null, onChange: (next) => form.setValue("currencyCode", next ?? "EUR" /* i18n-literal-ok domain default currency */, {
73
80
  shouldValidate: true,
74
81
  shouldDirty: true,
75
- }) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Sort order" }), _jsx(Input, { ...form.register("sortOrder"), type: "number", min: "0" })] })] }), _jsxs("div", { className: "flex flex-wrap gap-6", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("isDefault"), onCheckedChange: (value) => form.setValue("isDefault", value) }), _jsx(Label, { children: "Default" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("isSettlement"), onCheckedChange: (value) => form.setValue("isSettlement", value) }), _jsx(Label, { children: "Settlement" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("isReporting"), onCheckedChange: (value) => form.setValue("isReporting", value) }), _jsx(Label, { children: "Reporting" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("active"), onCheckedChange: (value) => form.setValue("active", value) }), _jsx(Label, { children: "Active" })] })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: "Cancel" }), _jsxs(Button, { type: "submit", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing ? "Save Changes" : "Add Currency"] })] })] })] }) }));
82
+ }) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketCurrencyDialog.fields.sortOrder }), _jsx(Input, { ...form.register("sortOrder"), type: "number", min: "0" })] })] }), _jsxs("div", { className: "flex flex-wrap gap-6", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("isDefault"), onCheckedChange: (value) => form.setValue("isDefault", value) }), _jsx(Label, { children: messages.marketCurrencyDialog.fields.isDefault })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("isSettlement"), onCheckedChange: (value) => form.setValue("isSettlement", value) }), _jsx(Label, { children: messages.marketCurrencyDialog.fields.isSettlement })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("isReporting"), onCheckedChange: (value) => form.setValue("isReporting", value) }), _jsx(Label, { children: messages.marketCurrencyDialog.fields.isReporting })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("active"), onCheckedChange: (value) => form.setValue("active", value) }), _jsx(Label, { children: messages.marketCurrencyDialog.fields.active })] })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: messages.common.cancel }), _jsxs(Button, { type: "submit", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing
83
+ ? messages.common.saveChanges
84
+ : messages.marketCurrencyDialog.actions.create] })] })] })] }) }));
76
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"market-dialog.d.ts","sourceRoot":"","sources":["../../src/components/market-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,yBAAyB,CAAA;AA4ChC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;CAC3C;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAqKxF"}
1
+ {"version":3,"file":"market-dialog.d.ts","sourceRoot":"","sources":["../../src/components/market-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,yBAAyB,CAAA;AAiDhC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;CAC3C;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAkMxF"}
@@ -9,21 +9,26 @@ import { Loader2 } from "lucide-react";
9
9
  import { useEffect } from "react";
10
10
  import { useForm } from "react-hook-form";
11
11
  import { z } from "zod/v4";
12
+ import { useMarketsUiMessagesOrDefault } from "../i18n";
12
13
  const MARKET_STATUSES = ["active", "inactive", "archived"];
13
- const formSchema = z.object({
14
- code: z.string().min(1, "Code is required").max(50),
15
- name: z.string().min(1, "Name is required").max(255),
16
- status: z.enum(MARKET_STATUSES),
17
- regionCode: z.string().optional().nullable(),
18
- countryCode: z.string().optional().nullable(),
19
- defaultLanguageTag: z.string().min(2).max(35),
20
- defaultCurrency: z.string().length(3, "Currency must be 3 chars"),
21
- timezone: z.string().optional().nullable(),
22
- taxContext: z.string().optional().nullable(),
23
- });
14
+ function createFormSchema(messages) {
15
+ return z.object({
16
+ code: z.string().min(1, messages.marketDialog.validation.codeRequired).max(50),
17
+ name: z.string().min(1, messages.marketDialog.validation.nameRequired).max(255),
18
+ status: z.enum(MARKET_STATUSES),
19
+ regionCode: z.string().optional().nullable(),
20
+ countryCode: z.string().optional().nullable(),
21
+ defaultLanguageTag: z.string().min(2).max(35),
22
+ defaultCurrency: z.string().length(3, messages.marketDialog.validation.currencyThreeChars),
23
+ timezone: z.string().optional().nullable(),
24
+ taxContext: z.string().optional().nullable(),
25
+ });
26
+ }
24
27
  export function MarketDialog({ open, onOpenChange, market, onSuccess }) {
25
28
  const isEditing = Boolean(market);
26
29
  const { create, update } = useMarketMutation();
30
+ const messages = useMarketsUiMessagesOrDefault();
31
+ const formSchema = createFormSchema(messages);
27
32
  const form = useForm({
28
33
  resolver: zodResolver(formSchema),
29
34
  defaultValues: {
@@ -33,7 +38,7 @@ export function MarketDialog({ open, onOpenChange, market, onSuccess }) {
33
38
  regionCode: "",
34
39
  countryCode: "",
35
40
  defaultLanguageTag: "en",
36
- defaultCurrency: "EUR",
41
+ defaultCurrency: "EUR" /* i18n-literal-ok domain default currency */,
37
42
  timezone: "",
38
43
  taxContext: "",
39
44
  },
@@ -61,7 +66,7 @@ export function MarketDialog({ open, onOpenChange, market, onSuccess }) {
61
66
  regionCode: "",
62
67
  countryCode: "",
63
68
  defaultLanguageTag: "en",
64
- defaultCurrency: "EUR",
69
+ defaultCurrency: "EUR" /* i18n-literal-ok domain default currency */,
65
70
  timezone: "",
66
71
  taxContext: "",
67
72
  });
@@ -86,8 +91,11 @@ export function MarketDialog({ open, onOpenChange, market, onSuccess }) {
86
91
  onSuccess?.(saved);
87
92
  };
88
93
  const isSubmitting = form.formState.isSubmitting || create.isPending || update.isPending;
89
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing ? "Edit Market" : "Add Market" }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Code" }), _jsx(Input, { ...form.register("code"), placeholder: "EU-DE" })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Name" }), _jsx(Input, { ...form.register("name"), placeholder: "Germany" })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-3", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Status" }), _jsxs(Select, { items: MARKET_STATUSES.map((x) => ({ label: x.replace(/_/g, " "), value: x })), value: form.watch("status"), onValueChange: (value) => form.setValue("status", value), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: MARKET_STATUSES.map((status) => (_jsx(SelectItem, { value: status, className: "capitalize", children: status }, status))) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Region code" }), _jsx(Input, { ...form.register("regionCode"), placeholder: "EU, APAC..." })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Country" }), _jsx(CountryCombobox, { value: form.watch("countryCode") ?? null, onChange: (code) => form.setValue("countryCode", code) })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-3", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Language tag" }), _jsx(Input, { ...form.register("defaultLanguageTag"), placeholder: "en, de-DE..." })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Default currency" }), _jsx(CurrencyCombobox, { value: form.watch("defaultCurrency") || null, onChange: (next) => form.setValue("defaultCurrency", next ?? "EUR", {
94
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing ? messages.marketDialog.titles.edit : messages.marketDialog.titles.create }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.code }), _jsx(Input, { ...form.register("code"), placeholder: messages.marketDialog.placeholders.code })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.name }), _jsx(Input, { ...form.register("name"), placeholder: messages.marketDialog.placeholders.name })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-3", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.status }), _jsxs(Select, { items: MARKET_STATUSES.map((x) => ({
95
+ label: messages.common.marketStatusLabels[x],
96
+ value: x,
97
+ })), value: form.watch("status"), onValueChange: (value) => form.setValue("status", value), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: MARKET_STATUSES.map((status) => (_jsx(SelectItem, { value: status, children: messages.common.marketStatusLabels[status] }, status))) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.regionCode }), _jsx(Input, { ...form.register("regionCode"), placeholder: messages.marketDialog.placeholders.regionCode })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.country }), _jsx(CountryCombobox, { value: form.watch("countryCode") ?? null, onChange: (code) => form.setValue("countryCode", code) })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-3", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.languageTag }), _jsx(Input, { ...form.register("defaultLanguageTag"), placeholder: messages.marketDialog.placeholders.languageTag })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.defaultCurrency }), _jsx(CurrencyCombobox, { value: form.watch("defaultCurrency") || null, onChange: (next) => form.setValue("defaultCurrency", next ?? "EUR" /* i18n-literal-ok domain default currency */, {
90
98
  shouldValidate: true,
91
99
  shouldDirty: true,
92
- }) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Timezone" }), _jsx(Input, { ...form.register("timezone"), placeholder: "Europe/Berlin" })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Tax context" }), _jsx(Input, { ...form.register("taxContext"), placeholder: "EU-VAT, US-Sales-Tax..." })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: "Cancel" }), _jsxs(Button, { type: "submit", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing ? "Save Changes" : "Add Market"] })] })] })] }) }));
100
+ }) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.timezone }), _jsx(Input, { ...form.register("timezone"), placeholder: messages.marketDialog.placeholders.timezone })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketDialog.fields.taxContext }), _jsx(Input, { ...form.register("taxContext"), placeholder: messages.marketDialog.placeholders.taxContext })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: messages.common.cancel }), _jsxs(Button, { type: "submit", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing ? messages.common.saveChanges : messages.marketDialog.actions.create] })] })] })] }) }));
93
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"market-locale-dialog.d.ts","sourceRoot":"","sources":["../../src/components/market-locale-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,kBAAkB,EAGxB,MAAM,yBAAyB,CAAA;AA6BhC,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAA;CACjD;AAED,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE,uBAAuB,2CAqGzB"}
1
+ {"version":3,"file":"market-locale-dialog.d.ts","sourceRoot":"","sources":["../../src/components/market-locale-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,kBAAkB,EAGxB,MAAM,yBAAyB,CAAA;AAqChC,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAA;CACjD;AAED,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE,uBAAuB,2CA8GzB"}
@@ -7,15 +7,23 @@ import { Loader2 } from "lucide-react";
7
7
  import { useEffect } from "react";
8
8
  import { useForm } from "react-hook-form";
9
9
  import { z } from "zod/v4";
10
- const formSchema = z.object({
11
- languageTag: z.string().min(2, "Language tag is required").max(35),
12
- isDefault: z.boolean(),
13
- sortOrder: z.coerce.number().int().min(0),
14
- active: z.boolean(),
15
- });
10
+ import { useMarketsUiMessagesOrDefault } from "../i18n";
11
+ function createFormSchema(messages) {
12
+ return z.object({
13
+ languageTag: z
14
+ .string()
15
+ .min(2, messages.marketLocaleDialog.validation.languageTagRequired)
16
+ .max(35),
17
+ isDefault: z.boolean(),
18
+ sortOrder: z.coerce.number().int().min(0),
19
+ active: z.boolean(),
20
+ });
21
+ }
16
22
  export function MarketLocaleDialog({ open, onOpenChange, marketId, locale, onSuccess, }) {
17
23
  const isEditing = Boolean(locale);
18
24
  const { create, update } = useMarketLocaleMutation();
25
+ const messages = useMarketsUiMessagesOrDefault();
26
+ const formSchema = createFormSchema(messages);
19
27
  const form = useForm({
20
28
  resolver: zodResolver(formSchema),
21
29
  defaultValues: {
@@ -58,5 +66,7 @@ export function MarketLocaleDialog({ open, onOpenChange, marketId, locale, onSuc
58
66
  onSuccess?.(saved);
59
67
  };
60
68
  const isSubmitting = form.formState.isSubmitting || create.isPending || update.isPending;
61
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing ? "Edit Locale" : "Add Locale" }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Language tag" }), _jsx(Input, { ...form.register("languageTag"), placeholder: "en-GB, de-DE..." })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Sort order" }), _jsx(Input, { ...form.register("sortOrder"), type: "number", min: "0" })] })] }), _jsxs("div", { className: "flex gap-6", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("isDefault"), onCheckedChange: (value) => form.setValue("isDefault", value) }), _jsx(Label, { children: "Default" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("active"), onCheckedChange: (value) => form.setValue("active", value) }), _jsx(Label, { children: "Active" })] })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: "Cancel" }), _jsxs(Button, { type: "submit", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing ? "Save Changes" : "Add Locale"] })] })] })] }) }));
69
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing
70
+ ? messages.marketLocaleDialog.titles.edit
71
+ : messages.marketLocaleDialog.titles.create }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketLocaleDialog.fields.languageTag }), _jsx(Input, { ...form.register("languageTag"), placeholder: messages.marketLocaleDialog.placeholders.languageTag })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: messages.marketLocaleDialog.fields.sortOrder }), _jsx(Input, { ...form.register("sortOrder"), type: "number", min: "0" })] })] }), _jsxs("div", { className: "flex gap-6", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("isDefault"), onCheckedChange: (value) => form.setValue("isDefault", value) }), _jsx(Label, { children: messages.marketLocaleDialog.fields.isDefault })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.watch("active"), onCheckedChange: (value) => form.setValue("active", value) }), _jsx(Label, { children: messages.marketLocaleDialog.fields.active })] })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: messages.common.cancel }), _jsxs(Button, { type: "submit", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing ? messages.common.saveChanges : messages.marketLocaleDialog.actions.create] })] })] })] }) }));
62
72
  }
@@ -0,0 +1,88 @@
1
+ export declare const marketsUiEn: {
2
+ common: {
3
+ cancel: string;
4
+ saveChanges: string;
5
+ active: string;
6
+ default: string;
7
+ marketStatusLabels: {
8
+ active: string;
9
+ inactive: string;
10
+ archived: string;
11
+ };
12
+ };
13
+ marketDialog: {
14
+ titles: {
15
+ create: string;
16
+ edit: string;
17
+ };
18
+ fields: {
19
+ code: string;
20
+ name: string;
21
+ status: string;
22
+ regionCode: string;
23
+ country: string;
24
+ languageTag: string;
25
+ defaultCurrency: string;
26
+ timezone: string;
27
+ taxContext: string;
28
+ };
29
+ placeholders: {
30
+ code: string;
31
+ name: string;
32
+ regionCode: string;
33
+ languageTag: string;
34
+ timezone: string;
35
+ taxContext: string;
36
+ };
37
+ actions: {
38
+ create: string;
39
+ };
40
+ validation: {
41
+ codeRequired: string;
42
+ nameRequired: string;
43
+ currencyThreeChars: string;
44
+ };
45
+ };
46
+ marketCurrencyDialog: {
47
+ titles: {
48
+ create: string;
49
+ edit: string;
50
+ };
51
+ fields: {
52
+ currencyCode: string;
53
+ sortOrder: string;
54
+ isDefault: string;
55
+ isSettlement: string;
56
+ isReporting: string;
57
+ active: string;
58
+ };
59
+ actions: {
60
+ create: string;
61
+ };
62
+ validation: {
63
+ currencyThreeChars: string;
64
+ };
65
+ };
66
+ marketLocaleDialog: {
67
+ titles: {
68
+ create: string;
69
+ edit: string;
70
+ };
71
+ fields: {
72
+ languageTag: string;
73
+ sortOrder: string;
74
+ isDefault: string;
75
+ active: string;
76
+ };
77
+ placeholders: {
78
+ languageTag: string;
79
+ };
80
+ actions: {
81
+ create: string;
82
+ };
83
+ validation: {
84
+ languageTagRequired: string;
85
+ };
86
+ };
87
+ };
88
+ //# 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,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFK,CAAA"}
@@ -0,0 +1,87 @@
1
+ export const marketsUiEn = {
2
+ common: {
3
+ cancel: "Cancel",
4
+ saveChanges: "Save Changes",
5
+ active: "Active",
6
+ default: "Default",
7
+ marketStatusLabels: {
8
+ active: "Active",
9
+ inactive: "Inactive",
10
+ archived: "Archived",
11
+ },
12
+ },
13
+ marketDialog: {
14
+ titles: {
15
+ create: "Add Market",
16
+ edit: "Edit Market",
17
+ },
18
+ fields: {
19
+ code: "Code",
20
+ name: "Name",
21
+ status: "Status",
22
+ regionCode: "Region code",
23
+ country: "Country",
24
+ languageTag: "Language tag",
25
+ defaultCurrency: "Default currency",
26
+ timezone: "Timezone",
27
+ taxContext: "Tax context",
28
+ },
29
+ placeholders: {
30
+ code: "EU-DE",
31
+ name: "Germany",
32
+ regionCode: "EU, APAC...",
33
+ languageTag: "en, de-DE...",
34
+ timezone: "Europe/Berlin",
35
+ taxContext: "EU-VAT, US-Sales-Tax...",
36
+ },
37
+ actions: {
38
+ create: "Add Market",
39
+ },
40
+ validation: {
41
+ codeRequired: "Code is required",
42
+ nameRequired: "Name is required",
43
+ currencyThreeChars: "Currency must be 3 chars",
44
+ },
45
+ },
46
+ marketCurrencyDialog: {
47
+ titles: {
48
+ create: "Add Currency",
49
+ edit: "Edit Currency",
50
+ },
51
+ fields: {
52
+ currencyCode: "Currency code",
53
+ sortOrder: "Sort order",
54
+ isDefault: "Default",
55
+ isSettlement: "Settlement",
56
+ isReporting: "Reporting",
57
+ active: "Active",
58
+ },
59
+ actions: {
60
+ create: "Add Currency",
61
+ },
62
+ validation: {
63
+ currencyThreeChars: "Currency must be 3 chars",
64
+ },
65
+ },
66
+ marketLocaleDialog: {
67
+ titles: {
68
+ create: "Add Locale",
69
+ edit: "Edit Locale",
70
+ },
71
+ fields: {
72
+ languageTag: "Language tag",
73
+ sortOrder: "Sort order",
74
+ isDefault: "Default",
75
+ active: "Active",
76
+ },
77
+ placeholders: {
78
+ languageTag: "en-GB, de-DE...",
79
+ },
80
+ actions: {
81
+ create: "Add Locale",
82
+ },
83
+ validation: {
84
+ languageTagRequired: "Language tag is required",
85
+ },
86
+ },
87
+ };
@@ -0,0 +1,5 @@
1
+ export { marketsUiEn } from "./en";
2
+ export type { MarketStatus, MarketsUiMessages } from "./messages";
3
+ export { getMarketsUiI18n, type MarketsUiMessageOverrides, MarketsUiMessagesProvider, marketsUiMessageDefinitions, resolveMarketsUiMessages, useMarketsUiI18n, useMarketsUiI18nOrDefault, useMarketsUiMessages, useMarketsUiMessagesOrDefault, } from "./provider";
4
+ export { marketsUiRo } 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,WAAW,EAAE,MAAM,MAAM,CAAA;AAClC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EACL,gBAAgB,EAChB,KAAK,yBAAyB,EAC9B,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { marketsUiEn } from "./en";
2
+ export { getMarketsUiI18n, MarketsUiMessagesProvider, marketsUiMessageDefinitions, resolveMarketsUiMessages, useMarketsUiI18n, useMarketsUiI18nOrDefault, useMarketsUiMessages, useMarketsUiMessagesOrDefault, } from "./provider";
3
+ export { marketsUiRo } from "./ro";
@@ -0,0 +1,90 @@
1
+ import type { CreateMarketInput, MarketCurrencyRecord, MarketLocaleRecord, MarketRecord } from "@voyantjs/markets-react";
2
+ export type MarketStatus = NonNullable<CreateMarketInput["status"]>;
3
+ export type MarketLocaleLanguageTag = MarketLocaleRecord["languageTag"];
4
+ export type MarketCurrencyCode = MarketCurrencyRecord["currencyCode"];
5
+ export type MarketRegionCode = MarketRecord["regionCode"];
6
+ export type MarketCountryCode = MarketRecord["countryCode"];
7
+ export type MarketsUiMessages = {
8
+ common: {
9
+ cancel: string;
10
+ saveChanges: string;
11
+ active: string;
12
+ default: string;
13
+ marketStatusLabels: Record<MarketStatus, string>;
14
+ };
15
+ marketDialog: {
16
+ titles: {
17
+ create: string;
18
+ edit: string;
19
+ };
20
+ fields: {
21
+ code: string;
22
+ name: string;
23
+ status: string;
24
+ regionCode: string;
25
+ country: string;
26
+ languageTag: string;
27
+ defaultCurrency: string;
28
+ timezone: string;
29
+ taxContext: string;
30
+ };
31
+ placeholders: {
32
+ code: string;
33
+ name: string;
34
+ regionCode: string;
35
+ languageTag: string;
36
+ timezone: string;
37
+ taxContext: string;
38
+ };
39
+ actions: {
40
+ create: string;
41
+ };
42
+ validation: {
43
+ codeRequired: string;
44
+ nameRequired: string;
45
+ currencyThreeChars: string;
46
+ };
47
+ };
48
+ marketCurrencyDialog: {
49
+ titles: {
50
+ create: string;
51
+ edit: string;
52
+ };
53
+ fields: {
54
+ currencyCode: string;
55
+ sortOrder: string;
56
+ isDefault: string;
57
+ isSettlement: string;
58
+ isReporting: string;
59
+ active: string;
60
+ };
61
+ actions: {
62
+ create: string;
63
+ };
64
+ validation: {
65
+ currencyThreeChars: string;
66
+ };
67
+ };
68
+ marketLocaleDialog: {
69
+ titles: {
70
+ create: string;
71
+ edit: string;
72
+ };
73
+ fields: {
74
+ languageTag: string;
75
+ sortOrder: string;
76
+ isDefault: string;
77
+ active: string;
78
+ };
79
+ placeholders: {
80
+ languageTag: string;
81
+ };
82
+ actions: {
83
+ create: string;
84
+ };
85
+ validation: {
86
+ languageTagRequired: string;
87
+ };
88
+ };
89
+ };
90
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,198 @@
1
+ import { type LocaleMessageOverrides, type PackageI18nValue } from "@voyantjs/i18n";
2
+ import type { ReactNode } from "react";
3
+ import type { MarketsUiMessages } from "./messages";
4
+ export declare const marketsUiMessageDefinitions: {
5
+ en: {
6
+ common: {
7
+ cancel: string;
8
+ saveChanges: string;
9
+ active: string;
10
+ default: string;
11
+ marketStatusLabels: {
12
+ active: string;
13
+ inactive: string;
14
+ archived: string;
15
+ };
16
+ };
17
+ marketDialog: {
18
+ titles: {
19
+ create: string;
20
+ edit: string;
21
+ };
22
+ fields: {
23
+ code: string;
24
+ name: string;
25
+ status: string;
26
+ regionCode: string;
27
+ country: string;
28
+ languageTag: string;
29
+ defaultCurrency: string;
30
+ timezone: string;
31
+ taxContext: string;
32
+ };
33
+ placeholders: {
34
+ code: string;
35
+ name: string;
36
+ regionCode: string;
37
+ languageTag: string;
38
+ timezone: string;
39
+ taxContext: string;
40
+ };
41
+ actions: {
42
+ create: string;
43
+ };
44
+ validation: {
45
+ codeRequired: string;
46
+ nameRequired: string;
47
+ currencyThreeChars: string;
48
+ };
49
+ };
50
+ marketCurrencyDialog: {
51
+ titles: {
52
+ create: string;
53
+ edit: string;
54
+ };
55
+ fields: {
56
+ currencyCode: string;
57
+ sortOrder: string;
58
+ isDefault: string;
59
+ isSettlement: string;
60
+ isReporting: string;
61
+ active: string;
62
+ };
63
+ actions: {
64
+ create: string;
65
+ };
66
+ validation: {
67
+ currencyThreeChars: string;
68
+ };
69
+ };
70
+ marketLocaleDialog: {
71
+ titles: {
72
+ create: string;
73
+ edit: string;
74
+ };
75
+ fields: {
76
+ languageTag: string;
77
+ sortOrder: string;
78
+ isDefault: string;
79
+ active: string;
80
+ };
81
+ placeholders: {
82
+ languageTag: string;
83
+ };
84
+ actions: {
85
+ create: string;
86
+ };
87
+ validation: {
88
+ languageTagRequired: string;
89
+ };
90
+ };
91
+ };
92
+ ro: {
93
+ common: {
94
+ cancel: string;
95
+ saveChanges: string;
96
+ active: string;
97
+ default: string;
98
+ marketStatusLabels: {
99
+ active: string;
100
+ inactive: string;
101
+ archived: string;
102
+ };
103
+ };
104
+ marketDialog: {
105
+ titles: {
106
+ create: string;
107
+ edit: string;
108
+ };
109
+ fields: {
110
+ code: string;
111
+ name: string;
112
+ status: string;
113
+ regionCode: string;
114
+ country: string;
115
+ languageTag: string;
116
+ defaultCurrency: string;
117
+ timezone: string;
118
+ taxContext: string;
119
+ };
120
+ placeholders: {
121
+ code: string;
122
+ name: string;
123
+ regionCode: string;
124
+ languageTag: string;
125
+ timezone: string;
126
+ taxContext: string;
127
+ };
128
+ actions: {
129
+ create: string;
130
+ };
131
+ validation: {
132
+ codeRequired: string;
133
+ nameRequired: string;
134
+ currencyThreeChars: string;
135
+ };
136
+ };
137
+ marketCurrencyDialog: {
138
+ titles: {
139
+ create: string;
140
+ edit: string;
141
+ };
142
+ fields: {
143
+ currencyCode: string;
144
+ sortOrder: string;
145
+ isDefault: string;
146
+ isSettlement: string;
147
+ isReporting: string;
148
+ active: string;
149
+ };
150
+ actions: {
151
+ create: string;
152
+ };
153
+ validation: {
154
+ currencyThreeChars: string;
155
+ };
156
+ };
157
+ marketLocaleDialog: {
158
+ titles: {
159
+ create: string;
160
+ edit: string;
161
+ };
162
+ fields: {
163
+ languageTag: string;
164
+ sortOrder: string;
165
+ isDefault: string;
166
+ active: string;
167
+ };
168
+ placeholders: {
169
+ languageTag: string;
170
+ };
171
+ actions: {
172
+ create: string;
173
+ };
174
+ validation: {
175
+ languageTagRequired: string;
176
+ };
177
+ };
178
+ };
179
+ };
180
+ export type MarketsUiMessageOverrides = LocaleMessageOverrides<MarketsUiMessages>;
181
+ export declare function resolveMarketsUiMessages({ locale, overrides, }: {
182
+ locale: string | null | undefined;
183
+ overrides?: MarketsUiMessageOverrides | null;
184
+ }): MarketsUiMessages;
185
+ export declare function getMarketsUiI18n({ locale, overrides, }: {
186
+ locale?: string | null | undefined;
187
+ overrides?: MarketsUiMessageOverrides | null;
188
+ }): PackageI18nValue<MarketsUiMessages>;
189
+ export declare function MarketsUiMessagesProvider({ children, locale, overrides, }: {
190
+ children: ReactNode;
191
+ locale: string | null | undefined;
192
+ overrides?: MarketsUiMessageOverrides | null;
193
+ }): import("react/jsx-runtime").JSX.Element;
194
+ export declare const useMarketsUiI18n: () => PackageI18nValue<MarketsUiMessages>;
195
+ export declare const useMarketsUiMessages: () => MarketsUiMessages;
196
+ export declare function useMarketsUiI18nOrDefault(): PackageI18nValue<MarketsUiMessages>;
197
+ export declare function useMarketsUiMessagesOrDefault(): MarketsUiMessages;
198
+ //# 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,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAKnD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGe,CAAA;AAEvD,MAAM,MAAM,yBAAyB,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,CAAA;AASjF,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAA;CAC7C,qBAOA;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAClC,SAAS,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAA;CAC7C,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAStC;AAED,wBAAgB,yBAAyB,CAAC,EACxC,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,yBAAyB,GAAG,IAAI,CAAA;CAC7C,2CAWA;AAED,eAAO,MAAM,gBAAgB,2CAA2B,CAAA;AACxD,eAAO,MAAM,oBAAoB,yBAA+B,CAAA;AAEhE,wBAAgB,yBAAyB,wCAExC;AAED,wBAAgB,6BAA6B,sBAE5C"}
@@ -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 { marketsUiEn } from "./en";
5
+ import { marketsUiRo } from "./ro";
6
+ const fallbackLocale = "en";
7
+ export const marketsUiMessageDefinitions = {
8
+ en: marketsUiEn,
9
+ ro: marketsUiRo,
10
+ };
11
+ const marketsUiContext = createPackageMessagesContext("MarketsUiMessages");
12
+ const defaultMarketsUiI18n = {
13
+ messages: marketsUiEn,
14
+ ...createLocaleFormatters(fallbackLocale),
15
+ };
16
+ export function resolveMarketsUiMessages({ locale, overrides, }) {
17
+ return resolvePackageMessages({
18
+ definitions: marketsUiMessageDefinitions,
19
+ fallbackLocale,
20
+ locale,
21
+ overrides,
22
+ });
23
+ }
24
+ export function getMarketsUiI18n({ locale, overrides, }) {
25
+ const resolvedLocale = locale ?? fallbackLocale;
26
+ return {
27
+ messages: resolveMarketsUiMessages({
28
+ locale: resolvedLocale,
29
+ overrides,
30
+ }),
31
+ ...createLocaleFormatters(resolvedLocale),
32
+ };
33
+ }
34
+ export function MarketsUiMessagesProvider({ children, locale, overrides, }) {
35
+ return (_jsx(marketsUiContext.ResolvedMessagesProvider, { definitions: marketsUiMessageDefinitions, fallbackLocale: fallbackLocale, locale: locale, overrides: overrides, children: children }));
36
+ }
37
+ export const useMarketsUiI18n = marketsUiContext.useI18n;
38
+ export const useMarketsUiMessages = marketsUiContext.useMessages;
39
+ export function useMarketsUiI18nOrDefault() {
40
+ return marketsUiContext.useOptionalI18n() ?? defaultMarketsUiI18n;
41
+ }
42
+ export function useMarketsUiMessagesOrDefault() {
43
+ return useMarketsUiI18nOrDefault().messages;
44
+ }
@@ -0,0 +1,88 @@
1
+ export declare const marketsUiRo: {
2
+ common: {
3
+ cancel: string;
4
+ saveChanges: string;
5
+ active: string;
6
+ default: string;
7
+ marketStatusLabels: {
8
+ active: string;
9
+ inactive: string;
10
+ archived: string;
11
+ };
12
+ };
13
+ marketDialog: {
14
+ titles: {
15
+ create: string;
16
+ edit: string;
17
+ };
18
+ fields: {
19
+ code: string;
20
+ name: string;
21
+ status: string;
22
+ regionCode: string;
23
+ country: string;
24
+ languageTag: string;
25
+ defaultCurrency: string;
26
+ timezone: string;
27
+ taxContext: string;
28
+ };
29
+ placeholders: {
30
+ code: string;
31
+ name: string;
32
+ regionCode: string;
33
+ languageTag: string;
34
+ timezone: string;
35
+ taxContext: string;
36
+ };
37
+ actions: {
38
+ create: string;
39
+ };
40
+ validation: {
41
+ codeRequired: string;
42
+ nameRequired: string;
43
+ currencyThreeChars: string;
44
+ };
45
+ };
46
+ marketCurrencyDialog: {
47
+ titles: {
48
+ create: string;
49
+ edit: string;
50
+ };
51
+ fields: {
52
+ currencyCode: string;
53
+ sortOrder: string;
54
+ isDefault: string;
55
+ isSettlement: string;
56
+ isReporting: string;
57
+ active: string;
58
+ };
59
+ actions: {
60
+ create: string;
61
+ };
62
+ validation: {
63
+ currencyThreeChars: string;
64
+ };
65
+ };
66
+ marketLocaleDialog: {
67
+ titles: {
68
+ create: string;
69
+ edit: string;
70
+ };
71
+ fields: {
72
+ languageTag: string;
73
+ sortOrder: string;
74
+ isDefault: string;
75
+ active: string;
76
+ };
77
+ placeholders: {
78
+ languageTag: string;
79
+ };
80
+ actions: {
81
+ create: string;
82
+ };
83
+ validation: {
84
+ languageTagRequired: string;
85
+ };
86
+ };
87
+ };
88
+ //# 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,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFK,CAAA"}
@@ -0,0 +1,87 @@
1
+ export const marketsUiRo = {
2
+ common: {
3
+ cancel: "Anuleaza",
4
+ saveChanges: "Salveaza Modificarile",
5
+ active: "Activ",
6
+ default: "Implicit",
7
+ marketStatusLabels: {
8
+ active: "Activ",
9
+ inactive: "Inactiv",
10
+ archived: "Arhivat",
11
+ },
12
+ },
13
+ marketDialog: {
14
+ titles: {
15
+ create: "Adauga Piata",
16
+ edit: "Editeaza Piata",
17
+ },
18
+ fields: {
19
+ code: "Cod",
20
+ name: "Nume",
21
+ status: "Status",
22
+ regionCode: "Cod regiune",
23
+ country: "Tara",
24
+ languageTag: "Eticheta limba",
25
+ defaultCurrency: "Moneda implicita",
26
+ timezone: "Fus orar",
27
+ taxContext: "Context fiscal",
28
+ },
29
+ placeholders: {
30
+ code: "EU-DE",
31
+ name: "Germania",
32
+ regionCode: "EU, APAC...",
33
+ languageTag: "en, de-DE...",
34
+ timezone: "Europe/Berlin",
35
+ taxContext: "EU-VAT, US-Sales-Tax...",
36
+ },
37
+ actions: {
38
+ create: "Adauga Piata",
39
+ },
40
+ validation: {
41
+ codeRequired: "Codul este obligatoriu",
42
+ nameRequired: "Numele este obligatoriu",
43
+ currencyThreeChars: "Moneda trebuie sa aiba 3 caractere",
44
+ },
45
+ },
46
+ marketCurrencyDialog: {
47
+ titles: {
48
+ create: "Adauga Moneda",
49
+ edit: "Editeaza Moneda",
50
+ },
51
+ fields: {
52
+ currencyCode: "Cod moneda",
53
+ sortOrder: "Ordine",
54
+ isDefault: "Implicit",
55
+ isSettlement: "Decontare",
56
+ isReporting: "Raportare",
57
+ active: "Activ",
58
+ },
59
+ actions: {
60
+ create: "Adauga Moneda",
61
+ },
62
+ validation: {
63
+ currencyThreeChars: "Moneda trebuie sa aiba 3 caractere",
64
+ },
65
+ },
66
+ marketLocaleDialog: {
67
+ titles: {
68
+ create: "Adauga Limba",
69
+ edit: "Editeaza Limba",
70
+ },
71
+ fields: {
72
+ languageTag: "Eticheta limba",
73
+ sortOrder: "Ordine",
74
+ isDefault: "Implicit",
75
+ active: "Activ",
76
+ },
77
+ placeholders: {
78
+ languageTag: "en-GB, de-DE...",
79
+ },
80
+ actions: {
81
+ create: "Adauga Limba",
82
+ },
83
+ validation: {
84
+ languageTagRequired: "Eticheta limbii este obligatorie",
85
+ },
86
+ },
87
+ };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { MarketCurrencyDialog, type MarketCurrencyDialogProps, } from "./components/market-currency-dialog";
2
2
  export { MarketDialog, type MarketDialogProps } from "./components/market-dialog";
3
3
  export { MarketLocaleDialog, type MarketLocaleDialogProps } from "./components/market-locale-dialog";
4
+ export { getMarketsUiI18n, type MarketsUiMessageOverrides, type MarketsUiMessages, MarketsUiMessagesProvider, marketsUiEn, marketsUiMessageDefinitions, marketsUiRo, resolveMarketsUiMessages, useMarketsUiI18n, useMarketsUiI18nOrDefault, useMarketsUiMessages, useMarketsUiMessagesOrDefault, } from "./i18n";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,GAC/B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACjF,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mCAAmC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,GAC/B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACjF,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AACpG,OAAO,EACL,gBAAgB,EAChB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,yBAAyB,EACzB,WAAW,EACX,2BAA2B,EAC3B,WAAW,EACX,wBAAwB,EACxB,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,QAAQ,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { MarketCurrencyDialog, } from "./components/market-currency-dialog";
2
2
  export { MarketDialog } from "./components/market-dialog";
3
3
  export { MarketLocaleDialog } from "./components/market-locale-dialog";
4
+ export { getMarketsUiI18n, MarketsUiMessagesProvider, marketsUiEn, marketsUiMessageDefinitions, marketsUiRo, resolveMarketsUiMessages, useMarketsUiI18n, useMarketsUiI18nOrDefault, useMarketsUiMessages, useMarketsUiMessagesOrDefault, } from "./i18n";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/markets-ui",
3
- "version": "0.15.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,9 +37,12 @@
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/markets-react": "0.15.0",
30
- "@voyantjs/ui": "0.15.0"
40
+ "zod": "^4.3.6",
41
+ "@voyantjs/markets-react": "0.17.0",
42
+ "@voyantjs/ui": "0.17.0"
43
+ },
44
+ "dependencies": {
45
+ "@voyantjs/i18n": "0.17.0"
31
46
  },
32
47
  "devDependencies": {
33
48
  "@tanstack/react-query": "^5.96.2",
@@ -40,10 +55,11 @@
40
55
  "react-hook-form": "^7.60.0",
41
56
  "typescript": "^6.0.2",
42
57
  "vitest": "^4.1.2",
43
- "zod": "^3.25.76",
44
- "@voyantjs/markets-react": "0.15.0",
58
+ "zod": "^4.3.6",
59
+ "@voyantjs/i18n": "0.17.0",
60
+ "@voyantjs/markets-react": "0.17.0",
45
61
  "@voyantjs/voyant-typescript-config": "0.1.0",
46
- "@voyantjs/ui": "0.15.0"
62
+ "@voyantjs/ui": "0.17.0"
47
63
  },
48
64
  "files": [
49
65
  "dist"