@voyantjs/notifications-ui 0.35.0 → 0.37.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.
@@ -1 +1 @@
1
- {"version":3,"file":"notification-settings-form.d.ts","sourceRoot":"","sources":["../../src/components/notification-settings-form.tsx"],"names":[],"mappings":"AA0DA,wBAAgB,wBAAwB,4CAgNvC"}
1
+ {"version":3,"file":"notification-settings-form.d.ts","sourceRoot":"","sources":["../../src/components/notification-settings-form.tsx"],"names":[],"mappings":"AA0DA,wBAAgB,wBAAwB,4CAqNvC"}
@@ -14,7 +14,7 @@ const nextBlackoutKey = () => `bo-${++blackoutSeq}`;
14
14
  const emptyForm = {
15
15
  quietHoursStart: "",
16
16
  quietHoursEnd: "",
17
- quietHoursTz: "UTC",
17
+ quietHoursTz: "UTC", // i18n-literal-ok IANA timezone default
18
18
  blackoutDates: [],
19
19
  skipWeekends: false,
20
20
  recipientRateLimitPerDay: "",
@@ -31,7 +31,7 @@ export function NotificationSettingsForm() {
31
31
  setForm({
32
32
  quietHoursStart: settings.quietHoursLocal?.start ?? "",
33
33
  quietHoursEnd: settings.quietHoursLocal?.end ?? "",
34
- quietHoursTz: settings.quietHoursLocal?.tz ?? "UTC",
34
+ quietHoursTz: settings.quietHoursLocal?.tz ?? "UTC", // i18n-literal-ok IANA timezone default
35
35
  blackoutDates: (settings.blackoutDates ?? []).map((date) => ({
36
36
  rowKey: nextBlackoutKey(),
37
37
  date,
@@ -50,7 +50,7 @@ export function NotificationSettingsForm() {
50
50
  .map((row) => row.date)
51
51
  .filter((d) => Boolean(d && /^\d{4}-\d{2}-\d{2}$/.test(d)));
52
52
  const quiet = form.quietHoursStart && form.quietHoursEnd
53
- ? { start: form.quietHoursStart, end: form.quietHoursEnd, tz: form.quietHoursTz || "UTC" }
53
+ ? { start: form.quietHoursStart, end: form.quietHoursEnd, tz: form.quietHoursTz || "UTC" } // i18n-literal-ok IANA timezone default
54
54
  : null;
55
55
  await mutation.mutateAsync({
56
56
  quietHoursLocal: quiet,
@@ -62,5 +62,5 @@ export function NotificationSettingsForm() {
62
62
  suppressionWindowHours: form.suppressionWindowHours,
63
63
  });
64
64
  };
65
- return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: messages.settings.heading }), _jsx(CardDescription, { children: messages.settings.description })] }), _jsxs(CardContent, { children: [isLoading && _jsx("p", { className: "text-sm text-muted-foreground", children: messages.common.loading }), _jsxs(FieldGroup, { children: [_jsxs(FieldSet, { children: [_jsx(FieldLegend, { children: messages.settings.sections.quietHours }), _jsx(FieldDescription, { children: messages.settings.sections.quietHoursDesc }), _jsxs(FieldGroup, { className: "gap-4", children: [_jsxs(Field, { orientation: "horizontal", children: [_jsx(Switch, { id: "skipWeekends", checked: form.skipWeekends, onCheckedChange: (value) => setField("skipWeekends", value) }), _jsxs(FieldLabel, { htmlFor: "skipWeekends", className: "!w-auto !flex-row", children: [_jsx(FieldTitle, { children: messages.settings.fields.skipWeekends }), _jsx(FieldDescription, { children: messages.settings.fields.skipWeekendsDesc })] })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-3", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "quietHoursStart", children: messages.settings.fields.quietHoursStart }), _jsx(Input, { id: "quietHoursStart", type: "time", value: form.quietHoursStart, onChange: (e) => setField("quietHoursStart", e.target.value) })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "quietHoursEnd", children: messages.settings.fields.quietHoursEnd }), _jsx(Input, { id: "quietHoursEnd", type: "time", value: form.quietHoursEnd, onChange: (e) => setField("quietHoursEnd", e.target.value) })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { children: messages.settings.fields.quietHoursTz }), _jsx(TimezoneCombobox, { value: form.quietHoursTz, onChange: (value) => setField("quietHoursTz", value ?? "UTC"), placeholder: messages.settings.placeholders.tz })] })] })] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { children: messages.settings.sections.blackouts }), _jsx(FieldDescription, { children: messages.settings.sections.blackoutsDesc }), _jsxs("div", { className: "space-y-2", children: [form.blackoutDates.length === 0 && (_jsx("p", { className: "text-sm text-muted-foreground", children: messages.settings.placeholders.noBlackouts })), form.blackoutDates.map((row) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "flex-1", children: _jsx(DatePicker, { value: row.date, onChange: (value) => updateBlackout(row.rowKey, value) }) }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => removeBlackout(row.rowKey), "aria-label": messages.settings.actions.removeBlackoutDate, children: _jsx(Trash2, { className: "size-4" }) })] }, row.rowKey))), _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: addBlackout, children: [_jsx(Plus, { className: "size-4" }), " ", messages.settings.actions.addBlackoutDate] })] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { children: messages.settings.sections.rateLimits }), _jsx(FieldDescription, { children: messages.settings.sections.rateLimitsDesc }), _jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "recipientRateLimitPerDay", children: messages.settings.fields.recipientRateLimitPerDay }), _jsx(Input, { id: "recipientRateLimitPerDay", type: "number", min: 1, value: form.recipientRateLimitPerDay, onChange: (e) => setField("recipientRateLimitPerDay", e.target.value), placeholder: messages.common.optionalPlaceholder }), _jsx(FieldDescription, { children: messages.settings.helpers.recipientRateLimitPerDay })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "suppressionWindowHours", children: messages.settings.fields.suppressionWindowHours }), _jsx(Input, { id: "suppressionWindowHours", type: "number", min: 0, value: form.suppressionWindowHours, onChange: (e) => setField("suppressionWindowHours", Number(e.target.value)) }), _jsx(FieldDescription, { children: messages.settings.helpers.suppressionWindowHours })] })] })] })] })] }), _jsx(CardFooter, { className: "justify-end", children: _jsxs(Button, { onClick: handleSubmit, disabled: mutation.isPending, children: [mutation.isPending ? _jsx(Loader2, { className: "size-4 animate-spin" }) : null, messages.common.save] }) })] }));
65
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: messages.settings.heading }), _jsx(CardDescription, { children: messages.settings.description })] }), _jsxs(CardContent, { children: [isLoading && _jsx("p", { className: "text-sm text-muted-foreground", children: messages.common.loading }), _jsxs(FieldGroup, { children: [_jsxs(FieldSet, { children: [_jsx(FieldLegend, { children: messages.settings.sections.quietHours }), _jsx(FieldDescription, { children: messages.settings.sections.quietHoursDesc }), _jsxs(FieldGroup, { className: "gap-4", children: [_jsxs(Field, { orientation: "horizontal", children: [_jsx(Switch, { id: "skipWeekends", checked: form.skipWeekends, onCheckedChange: (value) => setField("skipWeekends", value) }), _jsxs(FieldLabel, { htmlFor: "skipWeekends", className: "!w-auto !flex-row", children: [_jsx(FieldTitle, { children: messages.settings.fields.skipWeekends }), _jsx(FieldDescription, { children: messages.settings.fields.skipWeekendsDesc })] })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-3", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "quietHoursStart", children: messages.settings.fields.quietHoursStart }), _jsx(Input, { id: "quietHoursStart", type: "time", value: form.quietHoursStart, onChange: (e) => setField("quietHoursStart", e.target.value) })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "quietHoursEnd", children: messages.settings.fields.quietHoursEnd }), _jsx(Input, { id: "quietHoursEnd", type: "time", value: form.quietHoursEnd, onChange: (e) => setField("quietHoursEnd", e.target.value) })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { children: messages.settings.fields.quietHoursTz }), _jsx(TimezoneCombobox, { value: form.quietHoursTz, onChange: (value) => setField("quietHoursTz", value ?? "UTC" /* i18n-literal-ok IANA timezone default */), placeholder: messages.settings.placeholders.tz })] })] })] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { children: messages.settings.sections.blackouts }), _jsx(FieldDescription, { children: messages.settings.sections.blackoutsDesc }), _jsxs("div", { className: "space-y-2", children: [form.blackoutDates.length === 0 && (_jsx("p", { className: "text-sm text-muted-foreground", children: messages.settings.placeholders.noBlackouts })), form.blackoutDates.map((row) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "flex-1", children: _jsx(DatePicker, { value: row.date, onChange: (value) => updateBlackout(row.rowKey, value) }) }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => removeBlackout(row.rowKey), "aria-label": messages.settings.actions.removeBlackoutDate, children: _jsx(Trash2, { className: "size-4" }) })] }, row.rowKey))), _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: addBlackout, children: [_jsx(Plus, { className: "size-4" }), " ", messages.settings.actions.addBlackoutDate] })] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { children: messages.settings.sections.rateLimits }), _jsx(FieldDescription, { children: messages.settings.sections.rateLimitsDesc }), _jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "recipientRateLimitPerDay", children: messages.settings.fields.recipientRateLimitPerDay }), _jsx(Input, { id: "recipientRateLimitPerDay", type: "number", min: 1, value: form.recipientRateLimitPerDay, onChange: (e) => setField("recipientRateLimitPerDay", e.target.value), placeholder: messages.common.optionalPlaceholder }), _jsx(FieldDescription, { children: messages.settings.helpers.recipientRateLimitPerDay })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "suppressionWindowHours", children: messages.settings.fields.suppressionWindowHours }), _jsx(Input, { id: "suppressionWindowHours", type: "number", min: 0, value: form.suppressionWindowHours, onChange: (e) => setField("suppressionWindowHours", Number(e.target.value)) }), _jsx(FieldDescription, { children: messages.settings.helpers.suppressionWindowHours })] })] })] })] })] }), _jsx(CardFooter, { className: "justify-end", children: _jsxs(Button, { onClick: handleSubmit, disabled: mutation.isPending, children: [mutation.isPending ? _jsx(Loader2, { className: "size-4 animate-spin" }) : null, messages.common.save] }) })] }));
66
66
  }
@@ -73,5 +73,5 @@ export function StageChannelEditorDialog({ reminderRuleId, stageId, channel, def
73
73
  if (!v)
74
74
  return;
75
75
  setField("provider", v);
76
- }, children: [_jsx(SelectTrigger, { id: "channel-provider", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "automatic", children: messages.channel.providers.automatic }), _jsx(SelectItem, { value: "resend", children: messages.channel.providers.resend }), _jsx(SelectItem, { value: "twilio", children: messages.channel.providers.twilio })] })] }), _jsx(FieldDescription, { children: "Use Automatic to fall back to the deployment default for this channel." })] })] })] }) }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: isPending, children: messages.common.cancel }), _jsxs(Button, { onClick: handleSubmit, disabled: isPending, children: [isPending ? _jsx(Loader2, { className: "size-4 animate-spin" }) : null, isEdit ? messages.common.save : messages.common.create] })] })] }) }));
76
+ }, children: [_jsx(SelectTrigger, { id: "channel-provider", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "automatic", children: messages.channel.providers.automatic }), _jsx(SelectItem, { value: "resend", children: messages.channel.providers.resend }), _jsx(SelectItem, { value: "twilio", children: messages.channel.providers.twilio })] })] }), _jsx(FieldDescription, { children: messages.channel.descriptions.automaticProvider })] })] })] }) }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: isPending, children: messages.common.cancel }), _jsxs(Button, { onClick: handleSubmit, disabled: isPending, children: [isPending ? _jsx(Loader2, { className: "size-4 animate-spin" }) : null, isEdit ? messages.common.save : messages.common.create] })] })] }) }));
77
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stage-editor-dialog.d.ts","sourceRoot":"","sources":["../../src/components/stage-editor-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,+BAA+B,CAAA;AAoGtC,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACtC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,KAAK,EACL,iBAAqB,EACrB,IAAI,EACJ,YAAY,GACb,EAAE,sBAAsB,2CAuTxB"}
1
+ {"version":3,"file":"stage-editor-dialog.d.ts","sourceRoot":"","sources":["../../src/components/stage-editor-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,+BAA+B,CAAA;AAoGtC,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACtC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,KAAK,EACL,iBAAqB,EACrB,IAAI,EACJ,YAAY,GACb,EAAE,sBAAsB,2CAkTxB"}
@@ -91,7 +91,7 @@ export function StageEditorDialog({ reminderRuleId, stage, defaultOrderIndex = 0
91
91
  }
92
92
  onOpenChange(false);
93
93
  };
94
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-2xl", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEdit ? messages.stage.titles.edit : messages.stage.titles.create }) }), _jsx(DialogBody, { children: _jsxs(FieldGroup, { children: [_jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-[1fr_8rem]", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "stage-name", children: messages.stage.fields.name }), _jsx(Input, { id: "stage-name", value: form.name, onChange: (e) => setField("name", e.target.value), placeholder: messages.stage.placeholders.name })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "stage-order", children: messages.stage.fields.orderIndex }), _jsx(Input, { id: "stage-order", type: "number", value: form.orderIndex, onChange: (e) => setField("orderIndex", Number(e.target.value)) })] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { variant: "label", children: messages.stage.fields.anchor }), _jsx(FieldDescription, { children: "When the eligibility window opens, relative to the chosen anchor." }), _jsxs(FieldGroup, { className: "gap-4", children: [_jsx(Field, { children: _jsxs(Select, { value: form.anchor, onValueChange: (v) => setField("anchor", v), children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: ANCHORS.map((a) => (_jsx(SelectItem, { value: a, children: messages.stage.anchors[a] }, a))) })] }) }), _jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "window-start", children: messages.stage.fields.windowStartDays }), _jsx(Input, { id: "window-start", type: "number", value: form.windowStartDays, onChange: (e) => setField("windowStartDays", Number(e.target.value)) })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "window-end", children: messages.stage.fields.windowEndDays }), _jsx(Input, { id: "window-end", type: "number", value: form.windowEndDays, onChange: (e) => setField("windowEndDays", Number(e.target.value)) })] })] })] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { variant: "label", children: messages.stage.fields.cadenceKind }), _jsx(FieldDescription, { children: "How often this stage may fire while inside the window." }), _jsxs(FieldGroup, { className: "gap-4", children: [_jsx(Field, { children: _jsxs(Select, { value: form.cadenceKind, onValueChange: (v) => setField("cadenceKind", v), children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: CADENCES.map((c) => (_jsx(SelectItem, { value: c, children: messages.stage.cadences[c] }, c))) })] }) }), form.cadenceKind === "every_n_days" && (_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "cadence-every", children: messages.stage.fields.cadenceEveryDays }), _jsx(Input, { id: "cadence-every", type: "number", min: 1, value: form.cadenceEveryDays ?? "", onChange: (e) => setField("cadenceEveryDays", e.target.value ? Number(e.target.value) : null) })] })), form.cadenceKind === "escalating" && (_jsxs(Field, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(FieldLabel, { children: messages.stage.fields.cadenceIntervals }), _jsxs(Button, { type: "button", size: "sm", variant: "outline", onClick: addInterval, children: [_jsx(Plus, { className: "size-4" }), messages.stage.intervalRow.addInterval] })] }), form.cadenceIntervals.length === 0 ? (_jsx(FieldDescription, { children: "Add buckets keyed on days-until-due to scale cadence as the deadline approaches." })) : null, _jsx("div", { className: "space-y-2", children: form.cadenceIntervals.map((interval) => (_jsxs("div", { className: "grid grid-cols-[1fr_1fr_auto] items-end gap-2", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { className: "text-xs", children: messages.stage.intervalRow.whenDaysUntilDueGT }), _jsx(Input, { type: "number", value: interval.whenDaysUntilDueGT ?? "", onChange: (e) => setField("cadenceIntervals", form.cadenceIntervals.map((row) => row.rowKey === interval.rowKey
94
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-2xl", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEdit ? messages.stage.titles.edit : messages.stage.titles.create }) }), _jsx(DialogBody, { children: _jsxs(FieldGroup, { children: [_jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-[1fr_8rem]", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "stage-name", children: messages.stage.fields.name }), _jsx(Input, { id: "stage-name", value: form.name, onChange: (e) => setField("name", e.target.value), placeholder: messages.stage.placeholders.name })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "stage-order", children: messages.stage.fields.orderIndex }), _jsx(Input, { id: "stage-order", type: "number", value: form.orderIndex, onChange: (e) => setField("orderIndex", Number(e.target.value)) })] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { variant: "label", children: messages.stage.fields.anchor }), _jsx(FieldDescription, { children: messages.stage.descriptions.window }), _jsxs(FieldGroup, { className: "gap-4", children: [_jsx(Field, { children: _jsxs(Select, { value: form.anchor, onValueChange: (v) => setField("anchor", v), children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: ANCHORS.map((a) => (_jsx(SelectItem, { value: a, children: messages.stage.anchors[a] }, a))) })] }) }), _jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "window-start", children: messages.stage.fields.windowStartDays }), _jsx(Input, { id: "window-start", type: "number", value: form.windowStartDays, onChange: (e) => setField("windowStartDays", Number(e.target.value)) })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "window-end", children: messages.stage.fields.windowEndDays }), _jsx(Input, { id: "window-end", type: "number", value: form.windowEndDays, onChange: (e) => setField("windowEndDays", Number(e.target.value)) })] })] })] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { variant: "label", children: messages.stage.fields.cadenceKind }), _jsx(FieldDescription, { children: messages.stage.descriptions.cadence }), _jsxs(FieldGroup, { className: "gap-4", children: [_jsx(Field, { children: _jsxs(Select, { value: form.cadenceKind, onValueChange: (v) => setField("cadenceKind", v), children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: CADENCES.map((c) => (_jsx(SelectItem, { value: c, children: messages.stage.cadences[c] }, c))) })] }) }), form.cadenceKind === "every_n_days" && (_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "cadence-every", children: messages.stage.fields.cadenceEveryDays }), _jsx(Input, { id: "cadence-every", type: "number", min: 1, value: form.cadenceEveryDays ?? "", onChange: (e) => setField("cadenceEveryDays", e.target.value ? Number(e.target.value) : null) })] })), form.cadenceKind === "escalating" && (_jsxs(Field, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(FieldLabel, { children: messages.stage.fields.cadenceIntervals }), _jsxs(Button, { type: "button", size: "sm", variant: "outline", onClick: addInterval, children: [_jsx(Plus, { className: "size-4" }), messages.stage.intervalRow.addInterval] })] }), form.cadenceIntervals.length === 0 ? (_jsx(FieldDescription, { children: messages.stage.descriptions.emptyIntervals })) : null, _jsx("div", { className: "space-y-2", children: form.cadenceIntervals.map((interval) => (_jsxs("div", { className: "grid grid-cols-[1fr_1fr_auto] items-end gap-2", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { className: "text-xs", children: messages.stage.intervalRow.whenDaysUntilDueGT }), _jsx(Input, { type: "number", value: interval.whenDaysUntilDueGT ?? "", onChange: (e) => setField("cadenceIntervals", form.cadenceIntervals.map((row) => row.rowKey === interval.rowKey
95
95
  ? {
96
96
  ...row,
97
97
  whenDaysUntilDueGT: e.target.value
@@ -100,5 +100,5 @@ export function StageEditorDialog({ reminderRuleId, stage, defaultOrderIndex = 0
100
100
  }
101
101
  : row)) })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { className: "text-xs", children: messages.stage.intervalRow.repeatEveryDays }), _jsx(Input, { type: "number", min: 1, value: interval.repeatEveryDays, onChange: (e) => setField("cadenceIntervals", form.cadenceIntervals.map((row) => row.rowKey === interval.rowKey
102
102
  ? { ...row, repeatEveryDays: Number(e.target.value) }
103
- : row)) })] }), _jsx(Button, { type: "button", size: "icon", variant: "ghost", onClick: () => removeInterval(interval.rowKey), "aria-label": messages.stage.intervalRow.removeInterval, children: _jsx(Trash2, { className: "size-4" }) })] }, interval.rowKey))) })] }))] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { variant: "label", children: "Stop conditions" }), _jsxs(FieldGroup, { className: "gap-4", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "max-sends", children: messages.stage.fields.maxSendsInStage }), _jsx(Input, { id: "max-sends", type: "number", min: 1, value: form.maxSendsInStage ?? "", onChange: (e) => setField("maxSendsInStage", e.target.value ? Number(e.target.value) : null), placeholder: messages.common.optionalPlaceholder }), _jsx(FieldDescription, { children: "Leave blank for no limit. When reached, the next stage takes over." })] }), _jsxs(Field, { orientation: "horizontal", children: [_jsx(Switch, { id: "respect-quiet-hours", checked: form.respectQuietHours, onCheckedChange: (v) => setField("respectQuietHours", Boolean(v)) }), _jsxs(FieldLabel, { htmlFor: "respect-quiet-hours", className: "!w-auto !flex-row", children: [_jsx(FieldTitle, { children: messages.stage.fields.respectQuietHours }), _jsx(FieldDescription, { children: "Defer fires that would land inside the tenant's quiet-hours window." })] })] })] })] })] }) }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: isPending, children: messages.common.cancel }), _jsxs(Button, { onClick: handleSubmit, disabled: isPending, children: [isPending ? _jsx(Loader2, { className: "size-4 animate-spin" }) : null, isEdit ? messages.common.save : messages.common.create] })] })] }) }));
103
+ : row)) })] }), _jsx(Button, { type: "button", size: "icon", variant: "ghost", onClick: () => removeInterval(interval.rowKey), "aria-label": messages.stage.intervalRow.removeInterval, children: _jsx(Trash2, { className: "size-4" }) })] }, interval.rowKey))) })] }))] })] }), _jsxs(FieldSet, { children: [_jsx(FieldLegend, { variant: "label", children: messages.stage.descriptions.stopConditions }), _jsxs(FieldGroup, { className: "gap-4", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "max-sends", children: messages.stage.fields.maxSendsInStage }), _jsx(Input, { id: "max-sends", type: "number", min: 1, value: form.maxSendsInStage ?? "", onChange: (e) => setField("maxSendsInStage", e.target.value ? Number(e.target.value) : null), placeholder: messages.common.optionalPlaceholder }), _jsx(FieldDescription, { children: messages.stage.descriptions.maxSendsInStage })] }), _jsxs(Field, { orientation: "horizontal", children: [_jsx(Switch, { id: "respect-quiet-hours", checked: form.respectQuietHours, onCheckedChange: (v) => setField("respectQuietHours", Boolean(v)) }), _jsxs(FieldLabel, { htmlFor: "respect-quiet-hours", className: "!w-auto !flex-row", children: [_jsx(FieldTitle, { children: messages.stage.fields.respectQuietHours }), _jsx(FieldDescription, { children: messages.stage.descriptions.respectQuietHours })] })] })] })] })] }) }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: isPending, children: messages.common.cancel }), _jsxs(Button, { onClick: handleSubmit, disabled: isPending, children: [isPending ? _jsx(Loader2, { className: "size-4 animate-spin" }) : null, isEdit ? messages.common.save : messages.common.create] })] })] }) }));
104
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"template-picker.d.ts","sourceRoot":"","sources":["../../src/components/template-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,+BAA+B,CAAA;AAItC,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,iEAAiE;IACjE,OAAO,CAAC,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAA;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAiC,EACjC,SAAiC,EACjC,QAAQ,GACT,EAAE,mBAAmB,2CA6BrB"}
1
+ {"version":3,"file":"template-picker.d.ts","sourceRoot":"","sources":["../../src/components/template-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,+BAA+B,CAAA;AAMtC,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,iEAAiE;IACjE,OAAO,CAAC,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAA;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,GACT,EAAE,mBAAmB,2CA8BrB"}
@@ -3,13 +3,15 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useNotificationTemplate, useNotificationTemplates, } from "@voyantjs/notifications-react";
4
4
  import { AsyncCombobox } from "@voyantjs/ui/components/async-combobox";
5
5
  import * as React from "react";
6
+ import { useNotificationsUiMessagesOrDefault } from "../i18n/index.js";
6
7
  /**
7
8
  * Async-friendly template picker. Searches active templates by name / slug
8
9
  * filtered by the chosen channel and resolves to the template id. The
9
10
  * currently selected template is fetched separately so its label keeps
10
11
  * rendering even after the search list filters it out.
11
12
  */
12
- export function TemplatePicker({ value, onChange, channel, placeholder = "Search templates…", emptyText = "No templates found.", disabled, }) {
13
+ export function TemplatePicker({ value, onChange, channel, placeholder, emptyText, disabled, }) {
14
+ const messages = useNotificationsUiMessagesOrDefault().pickers.templates;
13
15
  const [search, setSearch] = React.useState("");
14
16
  const { data } = useNotificationTemplates({
15
17
  channel,
@@ -20,5 +22,5 @@ export function TemplatePicker({ value, onChange, channel, placeholder = "Search
20
22
  });
21
23
  const { data: selected } = useNotificationTemplate(value ?? "", { enabled: Boolean(value) });
22
24
  const items = data?.data ?? [];
23
- return (_jsx(AsyncCombobox, { value: value, onChange: onChange, items: items, selectedItem: selected ?? null, getKey: (template) => template.id, getLabel: (template) => template.name, getSecondary: (template) => template.slug, onSearchChange: setSearch, placeholder: placeholder, emptyText: emptyText, disabled: disabled, clearable: true }));
25
+ return (_jsx(AsyncCombobox, { value: value, onChange: onChange, items: items, selectedItem: selected ?? null, getKey: (template) => template.id, getLabel: (template) => template.name, getSecondary: (template) => template.slug, onSearchChange: setSearch, placeholder: placeholder ?? messages.placeholder, emptyText: emptyText ?? messages.empty, disabled: disabled, clearable: true }));
24
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"timezone-combobox.d.ts","sourceRoot":"","sources":["../../src/components/timezone-combobox.tsx"],"names":[],"mappings":"AA6DA,MAAM,WAAW,qBAAqB;IACpC,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,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,WAAiC,EACjC,SAAiC,EACjC,QAAQ,GACT,EAAE,qBAAqB,2CAwCvB"}
1
+ {"version":3,"file":"timezone-combobox.d.ts","sourceRoot":"","sources":["../../src/components/timezone-combobox.tsx"],"names":[],"mappings":"AA+DA,MAAM,WAAW,qBAAqB;IACpC,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,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,GACT,EAAE,qBAAqB,2CAyCvB"}
@@ -2,6 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Combobox, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList, } from "@voyantjs/ui/components/combobox";
4
4
  import * as React from "react";
5
+ import { useNotificationsUiMessagesOrDefault } from "../i18n/index.js";
5
6
  const TIMEZONES = (() => {
6
7
  const intl = Intl;
7
8
  if (typeof intl.supportedValuesOf === "function") {
@@ -48,7 +49,8 @@ const TIMEZONES = (() => {
48
49
  "Pacific/Auckland",
49
50
  ];
50
51
  })();
51
- export function TimezoneCombobox({ value, onChange, placeholder = "Search timezones…", emptyText = "No timezones found.", disabled, }) {
52
+ export function TimezoneCombobox({ value, onChange, placeholder, emptyText, disabled, }) {
53
+ const messages = useNotificationsUiMessagesOrDefault().pickers.timezones;
52
54
  const [inputValue, setInputValue] = React.useState(value ?? "");
53
55
  React.useEffect(() => {
54
56
  setInputValue(value ?? "");
@@ -61,5 +63,5 @@ export function TimezoneCombobox({ value, onChange, placeholder = "Search timezo
61
63
  const tz = next ?? null;
62
64
  onChange(tz);
63
65
  setInputValue(tz ?? "");
64
- }, children: [_jsx(ComboboxInput, { placeholder: placeholder, showClear: Boolean(value) }), _jsxs(ComboboxContent, { children: [_jsx(ComboboxEmpty, { children: emptyText }), _jsx(ComboboxList, { children: _jsx(ComboboxCollection, { children: (tz) => (_jsx(ComboboxItem, { value: tz, children: tz }, tz)) }) })] })] }));
66
+ }, children: [_jsx(ComboboxInput, { placeholder: placeholder ?? messages.placeholder, showClear: Boolean(value) }), _jsxs(ComboboxContent, { children: [_jsx(ComboboxEmpty, { children: emptyText ?? messages.empty }), _jsx(ComboboxList, { children: _jsx(ComboboxCollection, { children: (tz) => (_jsx(ComboboxItem, { value: tz, children: tz }, tz)) }) })] })] }));
65
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAE5D,eAAO,MAAM,iBAAiB,EAAE,uBA0I/B,CAAA"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAE5D,eAAO,MAAM,iBAAiB,EAAE,uBAgK/B,CAAA"}
package/dist/i18n/en.js CHANGED
@@ -27,6 +27,14 @@ export const notificationsUiEn = {
27
27
  maxSendsInStage: "Max sends in stage",
28
28
  respectQuietHours: "Respect quiet hours",
29
29
  },
30
+ descriptions: {
31
+ window: "When the eligibility window opens, relative to the chosen anchor.",
32
+ cadence: "How often this stage may fire while inside the window.",
33
+ emptyIntervals: "Add buckets keyed on days-until-due to scale cadence as the deadline approaches.",
34
+ stopConditions: "Stop conditions",
35
+ maxSendsInStage: "Leave blank for no limit. When reached, the next stage takes over.",
36
+ respectQuietHours: "Defer fires that would land inside the tenant's quiet-hours window.",
37
+ },
30
38
  placeholders: {
31
39
  name: "First reminder",
32
40
  },
@@ -87,6 +95,9 @@ export const notificationsUiEn = {
87
95
  placeholders: {
88
96
  template: "Search templates…",
89
97
  },
98
+ descriptions: {
99
+ automaticProvider: "Use Automatic to fall back to the deployment default for this channel.",
100
+ },
90
101
  },
91
102
  settings: {
92
103
  heading: "Notification settings",
@@ -123,6 +134,16 @@ export const notificationsUiEn = {
123
134
  removeBlackoutDate: "Remove",
124
135
  },
125
136
  },
137
+ pickers: {
138
+ templates: {
139
+ placeholder: "Search templates…",
140
+ empty: "No templates found.",
141
+ },
142
+ timezones: {
143
+ placeholder: "Search timezones…",
144
+ empty: "No timezones found.",
145
+ },
146
+ },
126
147
  preview: {
127
148
  dateLabel: "Date",
128
149
  empty: "Nothing would fire on this date.",
@@ -27,6 +27,14 @@ export type NotificationsUiMessages = {
27
27
  maxSendsInStage: string;
28
28
  respectQuietHours: string;
29
29
  };
30
+ descriptions: {
31
+ window: string;
32
+ cadence: string;
33
+ emptyIntervals: string;
34
+ stopConditions: string;
35
+ maxSendsInStage: string;
36
+ respectQuietHours: string;
37
+ };
30
38
  placeholders: {
31
39
  name: string;
32
40
  };
@@ -87,6 +95,9 @@ export type NotificationsUiMessages = {
87
95
  placeholders: {
88
96
  template: string;
89
97
  };
98
+ descriptions: {
99
+ automaticProvider: string;
100
+ };
90
101
  };
91
102
  settings: {
92
103
  heading: string;
@@ -123,6 +134,16 @@ export type NotificationsUiMessages = {
123
134
  removeBlackoutDate: string;
124
135
  };
125
136
  };
137
+ pickers: {
138
+ templates: {
139
+ placeholder: string;
140
+ empty: string;
141
+ };
142
+ timezones: {
143
+ placeholder: string;
144
+ empty: string;
145
+ };
146
+ };
126
147
  preview: {
127
148
  dateLabel: string;
128
149
  empty: string;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ro.d.ts","sourceRoot":"","sources":["../../src/i18n/ro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAE5D,eAAO,MAAM,iBAAiB,EAAE,uBA2I/B,CAAA"}
1
+ {"version":3,"file":"ro.d.ts","sourceRoot":"","sources":["../../src/i18n/ro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAE5D,eAAO,MAAM,iBAAiB,EAAE,uBAmK/B,CAAA"}
package/dist/i18n/ro.js CHANGED
@@ -27,6 +27,14 @@ export const notificationsUiRo = {
27
27
  maxSendsInStage: "Trimiteri maxime per etapă",
28
28
  respectQuietHours: "Respectă orele de liniște",
29
29
  },
30
+ descriptions: {
31
+ window: "Când se deschide fereastra de eligibilitate, relativ la reperul ales.",
32
+ cadence: "Cât de des se poate declanșa etapa în interiorul ferestrei.",
33
+ emptyIntervals: "Adaugă praguri bazate pe zile-până-la-scadență pentru a ajusta cadența pe măsură ce se apropie termenul.",
34
+ stopConditions: "Condiții de oprire",
35
+ maxSendsInStage: "Lasă gol pentru fără limită. Când se atinge limita, preia etapa următoare.",
36
+ respectQuietHours: "Amână declanșările care ar cădea în intervalul de ore de liniște al tenantului.",
37
+ },
30
38
  placeholders: {
31
39
  name: "Prima reamintire",
32
40
  },
@@ -87,6 +95,9 @@ export const notificationsUiRo = {
87
95
  placeholders: {
88
96
  template: "Caută șabloane…",
89
97
  },
98
+ descriptions: {
99
+ automaticProvider: "Folosește Automat pentru a utiliza valoarea implicită a deploymentului pentru acest canal.",
100
+ },
90
101
  },
91
102
  settings: {
92
103
  heading: "Setări notificări",
@@ -123,6 +134,16 @@ export const notificationsUiRo = {
123
134
  removeBlackoutDate: "Șterge",
124
135
  },
125
136
  },
137
+ pickers: {
138
+ templates: {
139
+ placeholder: "Caută șabloane…",
140
+ empty: "Nu s-a găsit niciun șablon.",
141
+ },
142
+ timezones: {
143
+ placeholder: "Caută fusuri orare…",
144
+ empty: "Nu s-a găsit niciun fus orar.",
145
+ },
146
+ },
126
147
  preview: {
127
148
  dateLabel: "Dată",
128
149
  empty: "Nimic nu s-ar declanșa la această dată.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/notifications-ui",
3
- "version": "0.35.0",
3
+ "version": "0.37.0",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -44,11 +44,11 @@
44
44
  "react": "^19.0.0",
45
45
  "react-dom": "^19.0.0",
46
46
  "zod": "^4.3.6",
47
- "@voyantjs/notifications-react": "0.35.0",
48
- "@voyantjs/ui": "0.35.0"
47
+ "@voyantjs/notifications-react": "0.37.0",
48
+ "@voyantjs/ui": "0.37.0"
49
49
  },
50
50
  "dependencies": {
51
- "@voyantjs/i18n": "0.35.0"
51
+ "@voyantjs/i18n": "0.37.0"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@tanstack/react-query": "^5.96.2",
@@ -60,10 +60,10 @@
60
60
  "typescript": "^6.0.2",
61
61
  "vitest": "^4.1.2",
62
62
  "zod": "^4.3.6",
63
- "@voyantjs/i18n": "0.35.0",
64
- "@voyantjs/notifications-react": "0.35.0",
63
+ "@voyantjs/i18n": "0.37.0",
64
+ "@voyantjs/notifications-react": "0.37.0",
65
65
  "@voyantjs/voyant-typescript-config": "0.1.0",
66
- "@voyantjs/ui": "0.35.0"
66
+ "@voyantjs/ui": "0.37.0"
67
67
  },
68
68
  "files": [
69
69
  "dist",