@bigbinary/neeto-atoms 1.0.111 → 1.0.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/{MultiEmailInput-Bzd2dPFC.js → MultiEmailInput-DFWfld8K.js} +58 -26
  2. package/dist/MultiEmailInput-DFWfld8K.js.map +1 -0
  3. package/dist/{TranslationProvider-CtJI6HJ4.js → TranslationProvider-Dd0ITHC0.js} +11 -1
  4. package/dist/{TranslationProvider-CtJI6HJ4.js.map → TranslationProvider-Dd0ITHC0.js.map} +1 -1
  5. package/dist/cjs/{MultiEmailInput-FNRR9b74.js → MultiEmailInput-CW0TQEU2.js} +58 -26
  6. package/dist/cjs/MultiEmailInput-CW0TQEU2.js.map +1 -0
  7. package/dist/cjs/{TranslationProvider-BgCNBYs8.js → TranslationProvider-DOeyGtbV.js} +11 -1
  8. package/dist/cjs/{TranslationProvider-BgCNBYs8.js.map → TranslationProvider-DOeyGtbV.js.map} +1 -1
  9. package/dist/cjs/components/MultiEmailInput.js +2 -2
  10. package/dist/cjs/components/TranslationProvider.js +1 -1
  11. package/dist/cjs/components/index.js +2 -2
  12. package/dist/cjs/formik/MultiEmailInput.js +2 -2
  13. package/dist/cjs/formik/index.js +1 -1
  14. package/dist/cjs/index.js +2 -2
  15. package/dist/cjs/primitives/DropdownMenu.js +1 -0
  16. package/dist/cjs/primitives/DropdownMenu.js.map +1 -1
  17. package/dist/components/MultiEmailInput/constants.d.ts +16 -1
  18. package/dist/components/MultiEmailInput/index.d.ts +1 -1
  19. package/dist/components/MultiEmailInput/types.d.ts +13 -7
  20. package/dist/components/MultiEmailInput/utils.d.ts +5 -5
  21. package/dist/components/MultiEmailInput.js +2 -2
  22. package/dist/components/TranslationProvider.js +1 -1
  23. package/dist/components/index.js +2 -2
  24. package/dist/formik/MultiEmailInput.js +2 -2
  25. package/dist/formik/index.js +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +2 -2
  28. package/dist/primitives/DropdownMenu.js +1 -0
  29. package/dist/primitives/DropdownMenu.js.map +1 -1
  30. package/dist/translations/index.d.ts +10 -0
  31. package/package.json +1 -1
  32. package/dist/MultiEmailInput-Bzd2dPFC.js.map +0 -1
  33. package/dist/cjs/MultiEmailInput-FNRR9b74.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useState, useCallback, useMemo, forwardRef, useId } from 'react';
3
+ import { useTranslation } from 'react-i18next';
3
4
  import { c as cn } from './utils-BJnb9o5c.js';
4
5
  import { Field, FieldLabel, FieldContent } from './primitives/Field.js';
5
6
  import { b as buildTestIdPrefix } from './fieldIds-VpluAAMl.js';
@@ -9,14 +10,23 @@ import { X } from './x-_o2T3n6D.js';
9
10
 
10
11
  const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\.[A-Z0-9-]+)*\.[A-Z]{2,}$/i;
11
12
  const UNSTRICT_EMAIL_REGEX = /(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/g;
12
- const EMAIL_SEPARATION_REGEX = /[^\s,]+/g;
13
+ const DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]{1,63}\.)+[a-zA-Z0-9-]{2,63}$/;
14
+ const SEPARATION_REGEX = /[^\s,]+/g;
15
+ const VALIDATION_REGEX = {
16
+ email: EMAIL_REGEX,
17
+ domain: DOMAIN_REGEX
18
+ };
19
+ const ENTITY_FALLBACK = {
20
+ email: { one: "email", other: "emails" },
21
+ domain: { one: "domain", other: "domains" }
22
+ };
13
23
 
14
- const formatEmailInputOption = (email) => ({
24
+ const formatEmailInputOption = (email, entryType = "email") => ({
15
25
  label: email,
16
26
  value: email,
17
- valid: EMAIL_REGEX.test(email)
27
+ valid: VALIDATION_REGEX[entryType].test(email)
18
28
  });
19
- const pruneDuplicates = (existing, newEmailStrings) => {
29
+ const pruneDuplicates = (existing, newEmailStrings, entryType = "email") => {
20
30
  const seen = new Set(existing.map((e) => e.value.toLowerCase()));
21
31
  const duplicates = [];
22
32
  const added = [];
@@ -26,20 +36,21 @@ const pruneDuplicates = (existing, newEmailStrings) => {
26
36
  duplicates.push(emailStr);
27
37
  } else {
28
38
  seen.add(lower);
29
- added.push(formatEmailInputOption(emailStr));
39
+ added.push(formatEmailInputOption(emailStr, entryType));
30
40
  }
31
41
  }
32
42
  return { uniqueEmails: [...existing, ...added], duplicates };
33
43
  };
34
44
  const filterValidEmails = (emails) => emails.filter((email) => email.valid);
35
- const pluralizeEmail = (count) => count === 1 ? "email" : "emails";
36
- const formatDuplicateWarning = (duplicates) => {
37
- const count = duplicates.length;
38
- return `Removed ${count} duplicate ${pluralizeEmail(count)} from the list: ${duplicates.join(", ")}`;
39
- };
45
+ const getEntityLabel = (t, entryType, count) => t(
46
+ `neetoatoms.multiEmailInput.${entryType}`,
47
+ ENTITY_FALLBACK[entryType][count === 1 ? "one" : "other"],
48
+ { count }
49
+ );
40
50
 
41
51
  function useMultiEmailState(props) {
42
52
  const {
53
+ entryType = "email",
43
54
  value = [],
44
55
  onChange,
45
56
  onBlur,
@@ -55,16 +66,19 @@ function useMultiEmailState(props) {
55
66
  (input) => {
56
67
  const trimmed = input.trim();
57
68
  if (!trimmed) return;
58
- UNSTRICT_EMAIL_REGEX.lastIndex = 0;
59
- EMAIL_SEPARATION_REGEX.lastIndex = 0;
60
- const emailMatches = trimmed.match(UNSTRICT_EMAIL_REGEX) || trimmed.match(EMAIL_SEPARATION_REGEX) || [];
61
- if (emailMatches.length === 0) return;
62
- const { uniqueEmails, duplicates } = pruneDuplicates(value, emailMatches);
69
+ const separated = trimmed.match(SEPARATION_REGEX) || [];
70
+ const matches = entryType === "email" ? trimmed.match(UNSTRICT_EMAIL_REGEX) || separated : separated;
71
+ if (matches.length === 0) return;
72
+ const { uniqueEmails, duplicates } = pruneDuplicates(
73
+ value,
74
+ matches,
75
+ entryType
76
+ );
63
77
  onChange?.(uniqueEmails);
64
78
  setDuplicateEmails(duplicates);
65
79
  setInputValue("");
66
80
  },
67
- [value, onChange]
81
+ [value, onChange, entryType]
68
82
  );
69
83
  const handleKeyDown = useCallback(
70
84
  (event) => {
@@ -139,6 +153,7 @@ const CHIPS_CONTAINER = "flex min-h-8 flex-wrap items-center gap-1 rounded-lg bo
139
153
  const CHIPS_ERROR = "border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40";
140
154
  const MultiEmailInput = forwardRef((props, ref) => {
141
155
  const {
156
+ entryType = "email",
142
157
  label,
143
158
  placeholder = "",
144
159
  helpText,
@@ -155,6 +170,7 @@ const MultiEmailInput = forwardRef((props, ref) => {
155
170
  dataTestId
156
171
  } = props;
157
172
  const id = useId();
173
+ const { t } = useTranslation();
158
174
  const testIdPrefix = buildTestIdPrefix(dataTestId, label);
159
175
  const {
160
176
  isCounterVisible,
@@ -199,7 +215,7 @@ const MultiEmailInput = forwardRef((props, ref) => {
199
215
  children: [
200
216
  validCount,
201
217
  " ",
202
- typeof counter === "object" && counter?.label ? counter.label : pluralizeEmail(validCount)
218
+ typeof counter === "object" && counter?.label ? counter.label : getEntityLabel(t, entryType, validCount)
203
219
  ]
204
220
  }
205
221
  )
@@ -231,7 +247,13 @@ const MultiEmailInput = forwardRef((props, ref) => {
231
247
  className: "-ms-0.5 rounded-xs opacity-50 hover:opacity-100",
232
248
  onMouseDown: (e) => e.preventDefault(),
233
249
  onClick: () => handleChipRemove(email.value),
234
- "aria-label": `Remove ${email.label}`,
250
+ "aria-label": t(
251
+ "neetoatoms.multiEmailInput.remove",
252
+ "Remove {{label}}",
253
+ {
254
+ label: email.label
255
+ }
256
+ ),
235
257
  children: /* @__PURE__ */ jsx(X, { className: "size-3 pointer-events-none" })
236
258
  }
237
259
  )
@@ -239,11 +261,9 @@ const MultiEmailInput = forwardRef((props, ref) => {
239
261
  },
240
262
  email.value
241
263
  )),
242
- hiddenCount > 0 && /* @__PURE__ */ jsxs("span", { className: "flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground", children: [
243
- "+",
244
- hiddenCount,
245
- " more"
246
- ] }),
264
+ hiddenCount > 0 && /* @__PURE__ */ jsx("span", { className: "flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground", children: t("neetoatoms.multiEmailInput.hiddenCount", "+{{total}} more", {
265
+ total: hiddenCount
266
+ }) }),
247
267
  /* @__PURE__ */ jsx(
248
268
  "input",
249
269
  {
@@ -280,7 +300,11 @@ const MultiEmailInput = forwardRef((props, ref) => {
280
300
  type: "button",
281
301
  className: "ml-1 cursor-pointer font-semibold underline",
282
302
  onClick: handleFilterInvalidEmails,
283
- children: filterInvalidEmails?.label ?? "Click here to remove invalid emails."
303
+ children: filterInvalidEmails?.label ?? t(
304
+ "neetoatoms.multiEmailInput.removeInvalid",
305
+ "Click here to remove invalid {{entity}}.",
306
+ { entity: getEntityLabel(t, entryType, 0) }
307
+ )
284
308
  }
285
309
  )
286
310
  ]
@@ -299,7 +323,15 @@ const MultiEmailInput = forwardRef((props, ref) => {
299
323
  {
300
324
  className: "text-[0.8rem] text-amber-600 dark:text-amber-400",
301
325
  "data-testid": `${testIdPrefix}-duplicate-emails-warning`,
302
- children: formatDuplicateWarning(duplicateEmails)
326
+ children: t(
327
+ "neetoatoms.multiEmailInput.duplicateWarning",
328
+ "Removed {{total}} duplicate {{entity}} from the list: {{items}}",
329
+ {
330
+ total: duplicateEmails.length,
331
+ entity: getEntityLabel(t, entryType, duplicateEmails.length),
332
+ items: duplicateEmails.join(", ")
333
+ }
334
+ )
303
335
  }
304
336
  )
305
337
  ] })
@@ -310,4 +342,4 @@ const MultiEmailInput = forwardRef((props, ref) => {
310
342
  MultiEmailInput.displayName = "MultiEmailInput";
311
343
 
312
344
  export { MultiEmailInput as M };
313
- //# sourceMappingURL=MultiEmailInput-Bzd2dPFC.js.map
345
+ //# sourceMappingURL=MultiEmailInput-DFWfld8K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiEmailInput-DFWfld8K.js","sources":["../src/components/MultiEmailInput/constants.ts","../src/components/MultiEmailInput/utils.ts","../src/components/MultiEmailInput/useMultiEmailState.ts","../src/components/MultiEmailInput/MultiEmailInput.tsx"],"sourcesContent":["export const EMAIL_REGEX =\n /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*\\.[A-Z]{2,}$/i;\n\nexport const UNSTRICT_EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/g;\n\nexport const DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z0-9-]{2,63}$/;\n\nexport const SEPARATION_REGEX = /[^\\s,]+/g;\n\nexport const VALIDATION_REGEX = {\n email: EMAIL_REGEX,\n domain: DOMAIN_REGEX,\n} as const;\n\nexport const ENTITY_FALLBACK = {\n email: { one: \"email\", other: \"emails\" },\n domain: { one: \"domain\", other: \"domains\" },\n} as const;\n","import type { TFunction } from \"i18next\";\n\nimport { ENTITY_FALLBACK, VALIDATION_REGEX } from \"./constants\";\nimport type { EmailValue, EntryType } from \"./types\";\n\nexport const formatEmailInputOption = (\n email: string,\n entryType: EntryType = \"email\"\n): EmailValue => ({\n label: email,\n value: email,\n valid: VALIDATION_REGEX[entryType].test(email),\n});\n\nexport const pruneDuplicates = (\n existing: EmailValue[],\n newEmailStrings: string[],\n entryType: EntryType = \"email\"\n): { uniqueEmails: EmailValue[]; duplicates: string[] } => {\n const seen = new Set(existing.map(e => e.value.toLowerCase()));\n const duplicates: string[] = [];\n const added: EmailValue[] = [];\n\n for (const emailStr of newEmailStrings) {\n const lower = emailStr.toLowerCase();\n if (seen.has(lower)) {\n duplicates.push(emailStr);\n } else {\n seen.add(lower);\n added.push(formatEmailInputOption(emailStr, entryType));\n }\n }\n\n return { uniqueEmails: [...existing, ...added], duplicates };\n};\n\nexport const filterValidEmails = (emails: EmailValue[]): EmailValue[] =>\n emails.filter(email => email.valid);\n\nexport const getEntityLabel = (\n t: TFunction,\n entryType: EntryType,\n count: number\n): string =>\n t(\n `neetoatoms.multiEmailInput.${entryType}`,\n ENTITY_FALLBACK[entryType][count === 1 ? \"one\" : \"other\"],\n { count }\n );\n","import { useState, useCallback, useMemo } from \"react\";\n\nimport { UNSTRICT_EMAIL_REGEX, SEPARATION_REGEX } from \"./constants\";\nimport { pruneDuplicates, filterValidEmails } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nexport function useMultiEmailState(props: MultiEmailInputProps) {\n const {\n entryType = \"email\",\n value = [],\n onChange,\n onBlur,\n visibleEmailsCount = 3,\n isAlwaysExpanded = false,\n counter,\n filterInvalidEmails,\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [duplicateEmails, setDuplicateEmails] = useState<string[]>([]);\n\n const addEmails = useCallback(\n (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) return;\n const separated = trimmed.match(SEPARATION_REGEX) || [];\n const matches =\n entryType === \"email\"\n ? trimmed.match(UNSTRICT_EMAIL_REGEX) || separated\n : separated;\n if (matches.length === 0) return;\n const { uniqueEmails, duplicates } = pruneDuplicates(\n value,\n matches,\n entryType\n );\n onChange?.(uniqueEmails);\n setDuplicateEmails(duplicates);\n setInputValue(\"\");\n },\n [value, onChange, entryType]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!inputValue && event.key === \"Backspace\" && value.length > 0) {\n onChange?.(value.slice(0, -1));\n return;\n }\n if (!inputValue) return;\n if ([\"Enter\", \"Tab\", \",\", \" \"].includes(event.key)) {\n addEmails(inputValue);\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [inputValue, value, onChange, addEmails]\n );\n\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLInputElement>) => {\n const text = event.clipboardData.getData(\"text\");\n if (!text) return;\n event.preventDefault();\n addEmails(text);\n },\n [addEmails]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addEmails(inputValue);\n } else {\n onBlur?.();\n }\n setIsFocused(false);\n setDuplicateEmails([]);\n }, [inputValue, addEmails, onBlur]);\n\n const handleFocus = useCallback(() => setIsFocused(true), []);\n\n const handleChipRemove = useCallback(\n (emailValue: string) =>\n onChange?.(value.filter(e => e.value !== emailValue)),\n [value, onChange]\n );\n\n const handleFilterInvalidEmails = useCallback(\n () => onChange?.(filterValidEmails(value)),\n [value, onChange]\n );\n\n const validCount = useMemo(() => value.filter(e => e.valid).length, [value]);\n const isCounterVisible =\n !!counter &&\n (typeof counter === \"boolean\" ||\n !counter.startsFrom ||\n validCount >= counter.startsFrom);\n const shouldCollapse =\n !isAlwaysExpanded && !isFocused && value.length > visibleEmailsCount;\n const visibleEmails = shouldCollapse\n ? value.slice(0, visibleEmailsCount)\n : value;\n const hiddenCount = shouldCollapse ? value.length - visibleEmailsCount : 0;\n const isFilterLinkVisible =\n !!filterInvalidEmails && value.length > validCount;\n\n return {\n inputValue,\n setInputValue,\n isFocused,\n duplicateEmails,\n handleKeyDown,\n handlePaste,\n handleBlur,\n handleFocus,\n handleChipRemove,\n handleFilterInvalidEmails,\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n isFilterLinkVisible,\n };\n}\n","import { forwardRef, useId } from \"react\";\nimport { XIcon } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { Field, FieldLabel, FieldContent } from \"src/primitives/Field\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { hyphenize } from \"src/utils/hyphenize\";\nimport { withIconSize } from \"src/utils/withIconSize\";\nimport { useMultiEmailState } from \"./useMultiEmailState\";\nimport { getEntityLabel } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nconst CHIP_BASE =\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground\";\nconst CHIP_INVALID =\n \"border border-destructive text-destructive bg-destructive/10\";\nconst CHIPS_CONTAINER =\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-base md:text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\";\nconst CHIPS_ERROR =\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\";\n\nexport const MultiEmailInput = forwardRef<\n HTMLInputElement,\n MultiEmailInputProps\n>((props, ref) => {\n const {\n entryType = \"email\",\n label,\n placeholder = \"\",\n helpText,\n error,\n disabled = false,\n required = false,\n maxHeight = 200,\n counter,\n filterInvalidEmails,\n prefix,\n suffix,\n labelProps,\n className,\n dataTestId,\n } = props;\n const id = useId();\n const { t } = useTranslation();\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n const {\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n inputValue,\n setInputValue,\n handleKeyDown,\n handlePaste,\n handleFocus,\n handleBlur,\n handleChipRemove,\n isFilterLinkVisible,\n handleFilterInvalidEmails,\n duplicateEmails,\n } = useMultiEmailState(props);\n\n return (\n <Field\n className={cn(\"flex flex-col gap-1.5\", className)}\n data-testid=\"email-input-wrapper\"\n >\n {(label || isCounterVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel\n htmlFor={id}\n data-testid={`${testIdPrefix}-input-label`}\n {...labelProps}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n {\" *\"}\n </span>\n )}\n </FieldLabel>\n )}\n {isCounterVisible && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-email-counter`}\n >\n {validCount}{\" \"}\n {typeof counter === \"object\" && counter?.label\n ? counter.label\n : getEntityLabel(t, entryType, validCount)}\n </span>\n )}\n </div>\n )}\n <div\n data-testid=\"multi-email-select-container\"\n className={cn(\n CHIPS_CONTAINER,\n !!error && CHIPS_ERROR,\n disabled && \"pointer-events-none opacity-50\"\n )}\n style={{ maxHeight: `${maxHeight}px`, overflowY: \"auto\" }}\n >\n {prefix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(prefix, \"size-4\")}\n </div>\n )}\n {visibleEmails.map(email => (\n <span\n key={email.value}\n className={cn(CHIP_BASE, !email.valid && CHIP_INVALID)}\n >\n {email.label}\n {!disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n data-testid={`${hyphenize(email.label)}-remove-icon`}\n className=\"-ms-0.5 rounded-xs opacity-50 hover:opacity-100\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => handleChipRemove(email.value)}\n aria-label={t(\n \"neetoatoms.multiEmailInput.remove\",\n \"Remove {{label}}\",\n {\n label: email.label,\n }\n )}\n >\n <XIcon className=\"size-3 pointer-events-none\" />\n </button>\n )}\n </span>\n ))}\n {hiddenCount > 0 && (\n <span className=\"flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground\">\n {t(\"neetoatoms.multiEmailInput.hiddenCount\", \"+{{total}} more\", {\n total: hiddenCount,\n })}\n </span>\n )}\n <input\n ref={ref}\n id={id}\n type=\"text\"\n data-testid=\"email-select-input-field\"\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={props.value?.length ? \"\" : placeholder}\n disabled={disabled}\n className=\"min-w-16 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n />\n {suffix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(suffix, \"size-4\")}\n </div>\n )}\n </div>\n <FieldContent>\n {!!error && (\n <p\n className=\"text-[0.8rem] text-destructive\"\n data-testid={`${testIdPrefix}-input-error`}\n >\n {error}\n {isFilterLinkVisible && (\n <button\n type=\"button\"\n className=\"ml-1 cursor-pointer font-semibold underline\"\n onClick={handleFilterInvalidEmails}\n >\n {filterInvalidEmails?.label ??\n t(\n \"neetoatoms.multiEmailInput.removeInvalid\",\n \"Click here to remove invalid {{entity}}.\",\n { entity: getEntityLabel(t, entryType, 0) }\n )}\n </button>\n )}\n </p>\n )}\n {!!helpText && (\n <p\n className=\"text-[0.8rem] text-muted-foreground\"\n data-testid={`${testIdPrefix}-input-help`}\n >\n {helpText}\n </p>\n )}\n {duplicateEmails.length > 0 && (\n <p\n className=\"text-[0.8rem] text-amber-600 dark:text-amber-400\"\n data-testid={`${testIdPrefix}-duplicate-emails-warning`}\n >\n {t(\n \"neetoatoms.multiEmailInput.duplicateWarning\",\n \"Removed {{total}} duplicate {{entity}} from the list: {{items}}\",\n {\n total: duplicateEmails.length,\n entity: getEntityLabel(t, entryType, duplicateEmails.length),\n items: duplicateEmails.join(\", \"),\n }\n )}\n </p>\n )}\n </FieldContent>\n </Field>\n );\n});\nMultiEmailInput.displayName = \"MultiEmailInput\";\n"],"names":["XIcon"],"mappings":"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"}
@@ -65,6 +65,16 @@ var neetoatoms = {
65
65
  toastr: {
66
66
  copyMessage: "Copy this error message",
67
67
  copied: "Copied!"
68
+ },
69
+ multiEmailInput: {
70
+ email_one: "email",
71
+ email_other: "emails",
72
+ domain_one: "domain",
73
+ domain_other: "domains",
74
+ hiddenCount: "+{{total}} more",
75
+ remove: "Remove {{label}}",
76
+ removeInvalid: "Click here to remove invalid {{entity}}.",
77
+ duplicateWarning: "Removed {{total}} duplicate {{entity}} from the list: {{items}}"
68
78
  }
69
79
  };
70
80
  var enTranslations = {
@@ -100,4 +110,4 @@ const TranslationProvider = ({
100
110
  TranslationProvider.displayName = "TranslationProvider";
101
111
 
102
112
  export { TranslationProvider as T, resources as r };
103
- //# sourceMappingURL=TranslationProvider-CtJI6HJ4.js.map
113
+ //# sourceMappingURL=TranslationProvider-Dd0ITHC0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TranslationProvider-CtJI6HJ4.js","sources":["../src/translations/index.ts","../src/components/TranslationProvider/i18n.ts","../src/components/TranslationProvider/TranslationProvider.tsx"],"sourcesContent":["import enTranslations from \"./en.json\";\n\nexport const resources = {\n en: { translation: enTranslations },\n};\n","import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport { resources } from \"src/translations\";\n\nexport const initializeI18n = (language = \"en\") => {\n i18n.use(initReactI18next).init({\n resources,\n lng: language,\n fallbackLng: \"en\",\n interpolation: { escapeValue: false },\n });\n\n return i18n;\n};\n","import { useEffect } from \"react\";\n\nimport { I18nextProvider } from \"react-i18next\";\n\nimport { initializeI18n } from \"./i18n\";\nimport type { TranslationProviderProps } from \"./types\";\n\nconst TranslationProvider = ({\n children,\n language = \"en\",\n}: TranslationProviderProps) => {\n const i18n = initializeI18n(language);\n\n useEffect(() => {\n if (i18n.language !== language) {\n i18n.changeLanguage(language);\n }\n }, [language, i18n]);\n\n return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;\n};\n\nTranslationProvider.displayName = \"TranslationProvider\";\n\nexport { TranslationProvider };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,SAAA,GAAY;AAAA,EACvB,EAAA,EAAI,EAAE,WAAA,EAAa,cAAA;AACrB;;ACCO,MAAM,cAAA,GAAiB,CAAC,QAAA,GAAW,IAAA,KAAS;AACjD,EAAA,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA,CAAE,IAAA,CAAK;AAAA,IAC9B,SAAA;AAAA,IACA,GAAA,EAAK,QAAA;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe,EAAE,WAAA,EAAa,KAAA;AAAM,GACrC,CAAA;AAED,EAAA,OAAO,IAAA;AACT,CAAA;;ACPA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAgC;AAC9B,EAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAa,QAAA,EAAS,CAAA;AAChD;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;;;;"}
1
+ {"version":3,"file":"TranslationProvider-Dd0ITHC0.js","sources":["../src/translations/index.ts","../src/components/TranslationProvider/i18n.ts","../src/components/TranslationProvider/TranslationProvider.tsx"],"sourcesContent":["import enTranslations from \"./en.json\";\n\nexport const resources = {\n en: { translation: enTranslations },\n};\n","import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport { resources } from \"src/translations\";\n\nexport const initializeI18n = (language = \"en\") => {\n i18n.use(initReactI18next).init({\n resources,\n lng: language,\n fallbackLng: \"en\",\n interpolation: { escapeValue: false },\n });\n\n return i18n;\n};\n","import { useEffect } from \"react\";\n\nimport { I18nextProvider } from \"react-i18next\";\n\nimport { initializeI18n } from \"./i18n\";\nimport type { TranslationProviderProps } from \"./types\";\n\nconst TranslationProvider = ({\n children,\n language = \"en\",\n}: TranslationProviderProps) => {\n const i18n = initializeI18n(language);\n\n useEffect(() => {\n if (i18n.language !== language) {\n i18n.changeLanguage(language);\n }\n }, [language, i18n]);\n\n return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;\n};\n\nTranslationProvider.displayName = \"TranslationProvider\";\n\nexport { TranslationProvider };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,SAAA,GAAY;AAAA,EACvB,EAAA,EAAI,EAAE,WAAA,EAAa,cAAA;AACrB;;ACCO,MAAM,cAAA,GAAiB,CAAC,QAAA,GAAW,IAAA,KAAS;AACjD,EAAA,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA,CAAE,IAAA,CAAK;AAAA,IAC9B,SAAA;AAAA,IACA,GAAA,EAAK,QAAA;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe,EAAE,WAAA,EAAa,KAAA;AAAM,GACrC,CAAA;AAED,EAAA,OAAO,IAAA;AACT,CAAA;;ACPA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAgC;AAC9B,EAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAa,QAAA,EAAS,CAAA;AAChD;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;;;;"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
+ var reactI18next = require('react-i18next');
5
6
  var utils = require('./utils-BhM0B89p.js');
6
7
  var primitives_Field = require('./primitives/Field.js');
7
8
  var fieldIds = require('./fieldIds-DiVU6GVS.js');
@@ -11,14 +12,23 @@ var x = require('./x-Brw3FJst.js');
11
12
 
12
13
  const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\.[A-Z0-9-]+)*\.[A-Z]{2,}$/i;
13
14
  const UNSTRICT_EMAIL_REGEX = /(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/g;
14
- const EMAIL_SEPARATION_REGEX = /[^\s,]+/g;
15
+ const DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]{1,63}\.)+[a-zA-Z0-9-]{2,63}$/;
16
+ const SEPARATION_REGEX = /[^\s,]+/g;
17
+ const VALIDATION_REGEX = {
18
+ email: EMAIL_REGEX,
19
+ domain: DOMAIN_REGEX
20
+ };
21
+ const ENTITY_FALLBACK = {
22
+ email: { one: "email", other: "emails" },
23
+ domain: { one: "domain", other: "domains" }
24
+ };
15
25
 
16
- const formatEmailInputOption = (email) => ({
26
+ const formatEmailInputOption = (email, entryType = "email") => ({
17
27
  label: email,
18
28
  value: email,
19
- valid: EMAIL_REGEX.test(email)
29
+ valid: VALIDATION_REGEX[entryType].test(email)
20
30
  });
21
- const pruneDuplicates = (existing, newEmailStrings) => {
31
+ const pruneDuplicates = (existing, newEmailStrings, entryType = "email") => {
22
32
  const seen = new Set(existing.map((e) => e.value.toLowerCase()));
23
33
  const duplicates = [];
24
34
  const added = [];
@@ -28,20 +38,21 @@ const pruneDuplicates = (existing, newEmailStrings) => {
28
38
  duplicates.push(emailStr);
29
39
  } else {
30
40
  seen.add(lower);
31
- added.push(formatEmailInputOption(emailStr));
41
+ added.push(formatEmailInputOption(emailStr, entryType));
32
42
  }
33
43
  }
34
44
  return { uniqueEmails: [...existing, ...added], duplicates };
35
45
  };
36
46
  const filterValidEmails = (emails) => emails.filter((email) => email.valid);
37
- const pluralizeEmail = (count) => count === 1 ? "email" : "emails";
38
- const formatDuplicateWarning = (duplicates) => {
39
- const count = duplicates.length;
40
- return `Removed ${count} duplicate ${pluralizeEmail(count)} from the list: ${duplicates.join(", ")}`;
41
- };
47
+ const getEntityLabel = (t, entryType, count) => t(
48
+ `neetoatoms.multiEmailInput.${entryType}`,
49
+ ENTITY_FALLBACK[entryType][count === 1 ? "one" : "other"],
50
+ { count }
51
+ );
42
52
 
43
53
  function useMultiEmailState(props) {
44
54
  const {
55
+ entryType = "email",
45
56
  value = [],
46
57
  onChange,
47
58
  onBlur,
@@ -57,16 +68,19 @@ function useMultiEmailState(props) {
57
68
  (input) => {
58
69
  const trimmed = input.trim();
59
70
  if (!trimmed) return;
60
- UNSTRICT_EMAIL_REGEX.lastIndex = 0;
61
- EMAIL_SEPARATION_REGEX.lastIndex = 0;
62
- const emailMatches = trimmed.match(UNSTRICT_EMAIL_REGEX) || trimmed.match(EMAIL_SEPARATION_REGEX) || [];
63
- if (emailMatches.length === 0) return;
64
- const { uniqueEmails, duplicates } = pruneDuplicates(value, emailMatches);
71
+ const separated = trimmed.match(SEPARATION_REGEX) || [];
72
+ const matches = entryType === "email" ? trimmed.match(UNSTRICT_EMAIL_REGEX) || separated : separated;
73
+ if (matches.length === 0) return;
74
+ const { uniqueEmails, duplicates } = pruneDuplicates(
75
+ value,
76
+ matches,
77
+ entryType
78
+ );
65
79
  onChange?.(uniqueEmails);
66
80
  setDuplicateEmails(duplicates);
67
81
  setInputValue("");
68
82
  },
69
- [value, onChange]
83
+ [value, onChange, entryType]
70
84
  );
71
85
  const handleKeyDown = React.useCallback(
72
86
  (event) => {
@@ -141,6 +155,7 @@ const CHIPS_CONTAINER = "flex min-h-8 flex-wrap items-center gap-1 rounded-lg bo
141
155
  const CHIPS_ERROR = "border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40";
142
156
  const MultiEmailInput = React.forwardRef((props, ref) => {
143
157
  const {
158
+ entryType = "email",
144
159
  label,
145
160
  placeholder = "",
146
161
  helpText,
@@ -157,6 +172,7 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
157
172
  dataTestId
158
173
  } = props;
159
174
  const id = React.useId();
175
+ const { t } = reactI18next.useTranslation();
160
176
  const testIdPrefix = fieldIds.buildTestIdPrefix(dataTestId, label);
161
177
  const {
162
178
  isCounterVisible,
@@ -201,7 +217,7 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
201
217
  children: [
202
218
  validCount,
203
219
  " ",
204
- typeof counter === "object" && counter?.label ? counter.label : pluralizeEmail(validCount)
220
+ typeof counter === "object" && counter?.label ? counter.label : getEntityLabel(t, entryType, validCount)
205
221
  ]
206
222
  }
207
223
  )
@@ -233,7 +249,13 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
233
249
  className: "-ms-0.5 rounded-xs opacity-50 hover:opacity-100",
234
250
  onMouseDown: (e) => e.preventDefault(),
235
251
  onClick: () => handleChipRemove(email.value),
236
- "aria-label": `Remove ${email.label}`,
252
+ "aria-label": t(
253
+ "neetoatoms.multiEmailInput.remove",
254
+ "Remove {{label}}",
255
+ {
256
+ label: email.label
257
+ }
258
+ ),
237
259
  children: /* @__PURE__ */ jsxRuntime.jsx(x.X, { className: "size-3 pointer-events-none" })
238
260
  }
239
261
  )
@@ -241,11 +263,9 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
241
263
  },
242
264
  email.value
243
265
  )),
244
- hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground", children: [
245
- "+",
246
- hiddenCount,
247
- " more"
248
- ] }),
266
+ hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground", children: t("neetoatoms.multiEmailInput.hiddenCount", "+{{total}} more", {
267
+ total: hiddenCount
268
+ }) }),
249
269
  /* @__PURE__ */ jsxRuntime.jsx(
250
270
  "input",
251
271
  {
@@ -282,7 +302,11 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
282
302
  type: "button",
283
303
  className: "ml-1 cursor-pointer font-semibold underline",
284
304
  onClick: handleFilterInvalidEmails,
285
- children: filterInvalidEmails?.label ?? "Click here to remove invalid emails."
305
+ children: filterInvalidEmails?.label ?? t(
306
+ "neetoatoms.multiEmailInput.removeInvalid",
307
+ "Click here to remove invalid {{entity}}.",
308
+ { entity: getEntityLabel(t, entryType, 0) }
309
+ )
286
310
  }
287
311
  )
288
312
  ]
@@ -301,7 +325,15 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
301
325
  {
302
326
  className: "text-[0.8rem] text-amber-600 dark:text-amber-400",
303
327
  "data-testid": `${testIdPrefix}-duplicate-emails-warning`,
304
- children: formatDuplicateWarning(duplicateEmails)
328
+ children: t(
329
+ "neetoatoms.multiEmailInput.duplicateWarning",
330
+ "Removed {{total}} duplicate {{entity}} from the list: {{items}}",
331
+ {
332
+ total: duplicateEmails.length,
333
+ entity: getEntityLabel(t, entryType, duplicateEmails.length),
334
+ items: duplicateEmails.join(", ")
335
+ }
336
+ )
305
337
  }
306
338
  )
307
339
  ] })
@@ -312,4 +344,4 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
312
344
  MultiEmailInput.displayName = "MultiEmailInput";
313
345
 
314
346
  exports.MultiEmailInput = MultiEmailInput;
315
- //# sourceMappingURL=MultiEmailInput-FNRR9b74.js.map
347
+ //# sourceMappingURL=MultiEmailInput-CW0TQEU2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiEmailInput-CW0TQEU2.js","sources":["../../src/components/MultiEmailInput/constants.ts","../../src/components/MultiEmailInput/utils.ts","../../src/components/MultiEmailInput/useMultiEmailState.ts","../../src/components/MultiEmailInput/MultiEmailInput.tsx"],"sourcesContent":["export const EMAIL_REGEX =\n /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*\\.[A-Z]{2,}$/i;\n\nexport const UNSTRICT_EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/g;\n\nexport const DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z0-9-]{2,63}$/;\n\nexport const SEPARATION_REGEX = /[^\\s,]+/g;\n\nexport const VALIDATION_REGEX = {\n email: EMAIL_REGEX,\n domain: DOMAIN_REGEX,\n} as const;\n\nexport const ENTITY_FALLBACK = {\n email: { one: \"email\", other: \"emails\" },\n domain: { one: \"domain\", other: \"domains\" },\n} as const;\n","import type { TFunction } from \"i18next\";\n\nimport { ENTITY_FALLBACK, VALIDATION_REGEX } from \"./constants\";\nimport type { EmailValue, EntryType } from \"./types\";\n\nexport const formatEmailInputOption = (\n email: string,\n entryType: EntryType = \"email\"\n): EmailValue => ({\n label: email,\n value: email,\n valid: VALIDATION_REGEX[entryType].test(email),\n});\n\nexport const pruneDuplicates = (\n existing: EmailValue[],\n newEmailStrings: string[],\n entryType: EntryType = \"email\"\n): { uniqueEmails: EmailValue[]; duplicates: string[] } => {\n const seen = new Set(existing.map(e => e.value.toLowerCase()));\n const duplicates: string[] = [];\n const added: EmailValue[] = [];\n\n for (const emailStr of newEmailStrings) {\n const lower = emailStr.toLowerCase();\n if (seen.has(lower)) {\n duplicates.push(emailStr);\n } else {\n seen.add(lower);\n added.push(formatEmailInputOption(emailStr, entryType));\n }\n }\n\n return { uniqueEmails: [...existing, ...added], duplicates };\n};\n\nexport const filterValidEmails = (emails: EmailValue[]): EmailValue[] =>\n emails.filter(email => email.valid);\n\nexport const getEntityLabel = (\n t: TFunction,\n entryType: EntryType,\n count: number\n): string =>\n t(\n `neetoatoms.multiEmailInput.${entryType}`,\n ENTITY_FALLBACK[entryType][count === 1 ? \"one\" : \"other\"],\n { count }\n );\n","import { useState, useCallback, useMemo } from \"react\";\n\nimport { UNSTRICT_EMAIL_REGEX, SEPARATION_REGEX } from \"./constants\";\nimport { pruneDuplicates, filterValidEmails } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nexport function useMultiEmailState(props: MultiEmailInputProps) {\n const {\n entryType = \"email\",\n value = [],\n onChange,\n onBlur,\n visibleEmailsCount = 3,\n isAlwaysExpanded = false,\n counter,\n filterInvalidEmails,\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [duplicateEmails, setDuplicateEmails] = useState<string[]>([]);\n\n const addEmails = useCallback(\n (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) return;\n const separated = trimmed.match(SEPARATION_REGEX) || [];\n const matches =\n entryType === \"email\"\n ? trimmed.match(UNSTRICT_EMAIL_REGEX) || separated\n : separated;\n if (matches.length === 0) return;\n const { uniqueEmails, duplicates } = pruneDuplicates(\n value,\n matches,\n entryType\n );\n onChange?.(uniqueEmails);\n setDuplicateEmails(duplicates);\n setInputValue(\"\");\n },\n [value, onChange, entryType]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!inputValue && event.key === \"Backspace\" && value.length > 0) {\n onChange?.(value.slice(0, -1));\n return;\n }\n if (!inputValue) return;\n if ([\"Enter\", \"Tab\", \",\", \" \"].includes(event.key)) {\n addEmails(inputValue);\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [inputValue, value, onChange, addEmails]\n );\n\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLInputElement>) => {\n const text = event.clipboardData.getData(\"text\");\n if (!text) return;\n event.preventDefault();\n addEmails(text);\n },\n [addEmails]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addEmails(inputValue);\n } else {\n onBlur?.();\n }\n setIsFocused(false);\n setDuplicateEmails([]);\n }, [inputValue, addEmails, onBlur]);\n\n const handleFocus = useCallback(() => setIsFocused(true), []);\n\n const handleChipRemove = useCallback(\n (emailValue: string) =>\n onChange?.(value.filter(e => e.value !== emailValue)),\n [value, onChange]\n );\n\n const handleFilterInvalidEmails = useCallback(\n () => onChange?.(filterValidEmails(value)),\n [value, onChange]\n );\n\n const validCount = useMemo(() => value.filter(e => e.valid).length, [value]);\n const isCounterVisible =\n !!counter &&\n (typeof counter === \"boolean\" ||\n !counter.startsFrom ||\n validCount >= counter.startsFrom);\n const shouldCollapse =\n !isAlwaysExpanded && !isFocused && value.length > visibleEmailsCount;\n const visibleEmails = shouldCollapse\n ? value.slice(0, visibleEmailsCount)\n : value;\n const hiddenCount = shouldCollapse ? value.length - visibleEmailsCount : 0;\n const isFilterLinkVisible =\n !!filterInvalidEmails && value.length > validCount;\n\n return {\n inputValue,\n setInputValue,\n isFocused,\n duplicateEmails,\n handleKeyDown,\n handlePaste,\n handleBlur,\n handleFocus,\n handleChipRemove,\n handleFilterInvalidEmails,\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n isFilterLinkVisible,\n };\n}\n","import { forwardRef, useId } from \"react\";\nimport { XIcon } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { Field, FieldLabel, FieldContent } from \"src/primitives/Field\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { hyphenize } from \"src/utils/hyphenize\";\nimport { withIconSize } from \"src/utils/withIconSize\";\nimport { useMultiEmailState } from \"./useMultiEmailState\";\nimport { getEntityLabel } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nconst CHIP_BASE =\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground\";\nconst CHIP_INVALID =\n \"border border-destructive text-destructive bg-destructive/10\";\nconst CHIPS_CONTAINER =\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-base md:text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\";\nconst CHIPS_ERROR =\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\";\n\nexport const MultiEmailInput = forwardRef<\n HTMLInputElement,\n MultiEmailInputProps\n>((props, ref) => {\n const {\n entryType = \"email\",\n label,\n placeholder = \"\",\n helpText,\n error,\n disabled = false,\n required = false,\n maxHeight = 200,\n counter,\n filterInvalidEmails,\n prefix,\n suffix,\n labelProps,\n className,\n dataTestId,\n } = props;\n const id = useId();\n const { t } = useTranslation();\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n const {\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n inputValue,\n setInputValue,\n handleKeyDown,\n handlePaste,\n handleFocus,\n handleBlur,\n handleChipRemove,\n isFilterLinkVisible,\n handleFilterInvalidEmails,\n duplicateEmails,\n } = useMultiEmailState(props);\n\n return (\n <Field\n className={cn(\"flex flex-col gap-1.5\", className)}\n data-testid=\"email-input-wrapper\"\n >\n {(label || isCounterVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel\n htmlFor={id}\n data-testid={`${testIdPrefix}-input-label`}\n {...labelProps}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n {\" *\"}\n </span>\n )}\n </FieldLabel>\n )}\n {isCounterVisible && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-email-counter`}\n >\n {validCount}{\" \"}\n {typeof counter === \"object\" && counter?.label\n ? counter.label\n : getEntityLabel(t, entryType, validCount)}\n </span>\n )}\n </div>\n )}\n <div\n data-testid=\"multi-email-select-container\"\n className={cn(\n CHIPS_CONTAINER,\n !!error && CHIPS_ERROR,\n disabled && \"pointer-events-none opacity-50\"\n )}\n style={{ maxHeight: `${maxHeight}px`, overflowY: \"auto\" }}\n >\n {prefix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(prefix, \"size-4\")}\n </div>\n )}\n {visibleEmails.map(email => (\n <span\n key={email.value}\n className={cn(CHIP_BASE, !email.valid && CHIP_INVALID)}\n >\n {email.label}\n {!disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n data-testid={`${hyphenize(email.label)}-remove-icon`}\n className=\"-ms-0.5 rounded-xs opacity-50 hover:opacity-100\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => handleChipRemove(email.value)}\n aria-label={t(\n \"neetoatoms.multiEmailInput.remove\",\n \"Remove {{label}}\",\n {\n label: email.label,\n }\n )}\n >\n <XIcon className=\"size-3 pointer-events-none\" />\n </button>\n )}\n </span>\n ))}\n {hiddenCount > 0 && (\n <span className=\"flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground\">\n {t(\"neetoatoms.multiEmailInput.hiddenCount\", \"+{{total}} more\", {\n total: hiddenCount,\n })}\n </span>\n )}\n <input\n ref={ref}\n id={id}\n type=\"text\"\n data-testid=\"email-select-input-field\"\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={props.value?.length ? \"\" : placeholder}\n disabled={disabled}\n className=\"min-w-16 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n />\n {suffix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(suffix, \"size-4\")}\n </div>\n )}\n </div>\n <FieldContent>\n {!!error && (\n <p\n className=\"text-[0.8rem] text-destructive\"\n data-testid={`${testIdPrefix}-input-error`}\n >\n {error}\n {isFilterLinkVisible && (\n <button\n type=\"button\"\n className=\"ml-1 cursor-pointer font-semibold underline\"\n onClick={handleFilterInvalidEmails}\n >\n {filterInvalidEmails?.label ??\n t(\n \"neetoatoms.multiEmailInput.removeInvalid\",\n \"Click here to remove invalid {{entity}}.\",\n { entity: getEntityLabel(t, entryType, 0) }\n )}\n </button>\n )}\n </p>\n )}\n {!!helpText && (\n <p\n className=\"text-[0.8rem] text-muted-foreground\"\n data-testid={`${testIdPrefix}-input-help`}\n >\n {helpText}\n </p>\n )}\n {duplicateEmails.length > 0 && (\n <p\n className=\"text-[0.8rem] text-amber-600 dark:text-amber-400\"\n data-testid={`${testIdPrefix}-duplicate-emails-warning`}\n >\n {t(\n \"neetoatoms.multiEmailInput.duplicateWarning\",\n \"Removed {{total}} duplicate {{entity}} from the list: {{items}}\",\n {\n total: duplicateEmails.length,\n entity: getEntityLabel(t, entryType, duplicateEmails.length),\n items: duplicateEmails.join(\", \"),\n }\n )}\n </p>\n )}\n </FieldContent>\n </Field>\n );\n});\nMultiEmailInput.displayName = \"MultiEmailInput\";\n"],"names":["useState","useCallback","useMemo","forwardRef","useId","useTranslation","buildTestIdPrefix","jsxs","Field","cn","FieldLabel","jsx","withIconSize","hyphenize","XIcon","FieldContent"],"mappings":"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"}
@@ -71,6 +71,16 @@ var neetoatoms = {
71
71
  toastr: {
72
72
  copyMessage: "Copy this error message",
73
73
  copied: "Copied!"
74
+ },
75
+ multiEmailInput: {
76
+ email_one: "email",
77
+ email_other: "emails",
78
+ domain_one: "domain",
79
+ domain_other: "domains",
80
+ hiddenCount: "+{{total}} more",
81
+ remove: "Remove {{label}}",
82
+ removeInvalid: "Click here to remove invalid {{entity}}.",
83
+ duplicateWarning: "Removed {{total}} duplicate {{entity}} from the list: {{items}}"
74
84
  }
75
85
  };
76
86
  var enTranslations = {
@@ -107,4 +117,4 @@ TranslationProvider.displayName = "TranslationProvider";
107
117
 
108
118
  exports.TranslationProvider = TranslationProvider;
109
119
  exports.resources = resources;
110
- //# sourceMappingURL=TranslationProvider-BgCNBYs8.js.map
120
+ //# sourceMappingURL=TranslationProvider-DOeyGtbV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TranslationProvider-BgCNBYs8.js","sources":["../../src/translations/index.ts","../../src/components/TranslationProvider/i18n.ts","../../src/components/TranslationProvider/TranslationProvider.tsx"],"sourcesContent":["import enTranslations from \"./en.json\";\n\nexport const resources = {\n en: { translation: enTranslations },\n};\n","import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport { resources } from \"src/translations\";\n\nexport const initializeI18n = (language = \"en\") => {\n i18n.use(initReactI18next).init({\n resources,\n lng: language,\n fallbackLng: \"en\",\n interpolation: { escapeValue: false },\n });\n\n return i18n;\n};\n","import { useEffect } from \"react\";\n\nimport { I18nextProvider } from \"react-i18next\";\n\nimport { initializeI18n } from \"./i18n\";\nimport type { TranslationProviderProps } from \"./types\";\n\nconst TranslationProvider = ({\n children,\n language = \"en\",\n}: TranslationProviderProps) => {\n const i18n = initializeI18n(language);\n\n useEffect(() => {\n if (i18n.language !== language) {\n i18n.changeLanguage(language);\n }\n }, [language, i18n]);\n\n return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;\n};\n\nTranslationProvider.displayName = \"TranslationProvider\";\n\nexport { TranslationProvider };\n"],"names":["i18n","initReactI18next","useEffect","jsx","I18nextProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,SAAA,GAAY;AAAA,EACvB,EAAA,EAAI,EAAE,WAAA,EAAa,cAAA;AACrB;;ACCO,MAAM,cAAA,GAAiB,CAAC,QAAA,GAAW,IAAA,KAAS;AACjD,EAAAA,qBAAA,CAAK,GAAA,CAAIC,6BAAgB,CAAA,CAAE,IAAA,CAAK;AAAA,IAC9B,SAAA;AAAA,IACA,GAAA,EAAK,QAAA;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe,EAAE,WAAA,EAAa,KAAA;AAAM,GACrC,CAAA;AAED,EAAA,OAAOD,qBAAA;AACT,CAAA;;ACPA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAgC;AAC9B,EAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AAEpC,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBAAOC,cAAA,CAACC,4BAAA,EAAA,EAAgB,IAAA,EAAa,QAAA,EAAS,CAAA;AAChD;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;;;;;"}
1
+ {"version":3,"file":"TranslationProvider-DOeyGtbV.js","sources":["../../src/translations/index.ts","../../src/components/TranslationProvider/i18n.ts","../../src/components/TranslationProvider/TranslationProvider.tsx"],"sourcesContent":["import enTranslations from \"./en.json\";\n\nexport const resources = {\n en: { translation: enTranslations },\n};\n","import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport { resources } from \"src/translations\";\n\nexport const initializeI18n = (language = \"en\") => {\n i18n.use(initReactI18next).init({\n resources,\n lng: language,\n fallbackLng: \"en\",\n interpolation: { escapeValue: false },\n });\n\n return i18n;\n};\n","import { useEffect } from \"react\";\n\nimport { I18nextProvider } from \"react-i18next\";\n\nimport { initializeI18n } from \"./i18n\";\nimport type { TranslationProviderProps } from \"./types\";\n\nconst TranslationProvider = ({\n children,\n language = \"en\",\n}: TranslationProviderProps) => {\n const i18n = initializeI18n(language);\n\n useEffect(() => {\n if (i18n.language !== language) {\n i18n.changeLanguage(language);\n }\n }, [language, i18n]);\n\n return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;\n};\n\nTranslationProvider.displayName = \"TranslationProvider\";\n\nexport { TranslationProvider };\n"],"names":["i18n","initReactI18next","useEffect","jsx","I18nextProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,SAAA,GAAY;AAAA,EACvB,EAAA,EAAI,EAAE,WAAA,EAAa,cAAA;AACrB;;ACCO,MAAM,cAAA,GAAiB,CAAC,QAAA,GAAW,IAAA,KAAS;AACjD,EAAAA,qBAAA,CAAK,GAAA,CAAIC,6BAAgB,CAAA,CAAE,IAAA,CAAK;AAAA,IAC9B,SAAA;AAAA,IACA,GAAA,EAAK,QAAA;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe,EAAE,WAAA,EAAa,KAAA;AAAM,GACrC,CAAA;AAED,EAAA,OAAOD,qBAAA;AACT,CAAA;;ACPA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAgC;AAC9B,EAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AAEpC,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBAAOC,cAAA,CAACC,4BAAA,EAAA,EAAgB,IAAA,EAAa,QAAA,EAAS,CAAA;AAChD;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;;;;;"}
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var MultiEmailInput = require('../MultiEmailInput-FNRR9b74.js');
3
+ var MultiEmailInput = require('../MultiEmailInput-CW0TQEU2.js');
4
4
  require('react/jsx-runtime');
5
5
  require('react');
6
+ require('react-i18next');
6
7
  require('../utils-BhM0B89p.js');
7
8
  require('../primitives/Field.js');
8
9
  require('../HelpIcon-BF1ePUQf.js');
@@ -37,7 +38,6 @@ require('react-router-dom');
37
38
  require('../primitives/Button.js');
38
39
  require('../button-CSBhDSDJ.js');
39
40
  require('../primitives/Spinner.js');
40
- require('react-i18next');
41
41
  require('../loader-circle-Bw7zP2Gn.js');
42
42
  require('../label-BdcX4_ud.js');
43
43
  require('../separator-DSL-aG1J.js');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var TranslationProvider = require('../TranslationProvider-BgCNBYs8.js');
3
+ var TranslationProvider = require('../TranslationProvider-DOeyGtbV.js');
4
4
  require('react/jsx-runtime');
5
5
  require('react');
6
6
  require('react-i18next');
@@ -16,7 +16,7 @@ var Empty = require('../Empty-Bqt-TucD.js');
16
16
  var Input = require('../Input-DIq7T9D0.js');
17
17
  var Kbd = require('../Kbd--A8Gl8TV.js');
18
18
  var Label = require('../Label-CpsdGBV8.js');
19
- var MultiEmailInput = require('../MultiEmailInput-FNRR9b74.js');
19
+ var MultiEmailInput = require('../MultiEmailInput-CW0TQEU2.js');
20
20
  var Pagination = require('../Pagination-WyQlBpvK.js');
21
21
  var Popover = require('../Popover-5BUgIW60.js');
22
22
  var Progress = require('../Progress-n_VwK9_E.js');
@@ -33,7 +33,7 @@ var TimePicker = require('../TimePicker-lJ2985nh.js');
33
33
  var TimePickerPanel = require('../TimePickerPanel-DX6cjrSN.js');
34
34
  var Toastr = require('../Toastr-9DXjD-Mq.js');
35
35
  var Tooltip = require('../Tooltip-B6uv_2Jz.js');
36
- var TranslationProvider = require('../TranslationProvider-BgCNBYs8.js');
36
+ var TranslationProvider = require('../TranslationProvider-DOeyGtbV.js');
37
37
  var Tree = require('../Tree-Y0ulyxew.js');
38
38
  var TreeSelect = require('../TreeSelect-DDQx8FPS.js');
39
39
  var Typography = require('../Typography-BW6xEk10.js');
@@ -4,7 +4,8 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var formik = require('formik');
6
6
  var ramda = require('ramda');
7
- var MultiEmailInput = require('../MultiEmailInput-FNRR9b74.js');
7
+ var MultiEmailInput = require('../MultiEmailInput-CW0TQEU2.js');
8
+ require('react-i18next');
8
9
  require('../utils-BhM0B89p.js');
9
10
  require('../primitives/Field.js');
10
11
  require('../HelpIcon-BF1ePUQf.js');
@@ -39,7 +40,6 @@ require('react-router-dom');
39
40
  require('../primitives/Button.js');
40
41
  require('../button-CSBhDSDJ.js');
41
42
  require('../primitives/Spinner.js');
42
- require('react-i18next');
43
43
  require('../loader-circle-Bw7zP2Gn.js');
44
44
  require('../label-BdcX4_ud.js');
45
45
  require('../separator-DSL-aG1J.js');
@@ -95,7 +95,7 @@ require('../index-CS_WSHYi.js');
95
95
  require('../Tree-Y0ulyxew.js');
96
96
  require('../chevron-right-0jNdwX2Q.js');
97
97
  require('../redux-DEF7lAd1.js');
98
- require('../MultiEmailInput-FNRR9b74.js');
98
+ require('../MultiEmailInput-CW0TQEU2.js');
99
99
  require('../Dialog-ZUHGaoAE.js');
100
100
  require('../primitives/Dialog.js');
101
101
  require('../dialog-CGblgaX5.js');