@open-mercato/ui 0.6.7-develop.6660.1.90e1e2eef6 → 0.6.7-develop.6669.1.40b669666b

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,3 +1,3 @@
1
1
  Generated lucide registry with 141 icons -> /home/runner/work/open-mercato/open-mercato/packages/ui/src/backend/icons/lucideRegistry.generated.tsx
2
- [build:ui] found 392 entry points
2
+ [build:ui] found 393 entry points
3
3
  [build:ui] built successfully
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { FieldRegistry } from "./registry.js";
4
+ import { PhoneNumberField, PHONE_COUNTRIES } from "../inputs/PhoneNumberField.js";
5
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
6
+ import {
7
+ Select,
8
+ SelectContent,
9
+ SelectItem,
10
+ SelectItemLeading,
11
+ SelectTrigger,
12
+ SelectValue
13
+ } from "../../primitives/select.js";
14
+ const AUTO_COUNTRY_VALUE = "__om_phone_auto__";
15
+ function PhoneFieldInput({ id, value, setValue, disabled, error, def }) {
16
+ const stringValue = typeof value === "string" ? value : value == null ? "" : String(value);
17
+ return /* @__PURE__ */ jsx(
18
+ PhoneNumberField,
19
+ {
20
+ id,
21
+ value: stringValue,
22
+ onValueChange: (next) => setValue(next ?? void 0),
23
+ disabled,
24
+ externalError: error ?? null,
25
+ defaultCountryIso2: def?.defaultCountryIso2
26
+ }
27
+ );
28
+ }
29
+ function PhoneFieldDefEditor({
30
+ def,
31
+ onChange
32
+ }) {
33
+ const t = useT();
34
+ const selected = typeof def?.configJson?.defaultCountryIso2 === "string" ? def.configJson.defaultCountryIso2 : "";
35
+ return /* @__PURE__ */ jsx("div", { className: "mt-3 space-y-3 rounded border border-dashed border-muted-foreground/40 bg-muted/30 p-3", children: /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
36
+ /* @__PURE__ */ jsx("label", { className: "text-xs font-medium text-muted-foreground", children: t("ui.customFields.phone.defaultCountry", "Default country") }),
37
+ /* @__PURE__ */ jsxs(
38
+ Select,
39
+ {
40
+ value: selected || AUTO_COUNTRY_VALUE,
41
+ onValueChange: (next) => onChange({ defaultCountryIso2: next === AUTO_COUNTRY_VALUE ? void 0 : next }),
42
+ children: [
43
+ /* @__PURE__ */ jsx(SelectTrigger, { size: "sm", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
44
+ /* @__PURE__ */ jsxs(SelectContent, { align: "start", children: [
45
+ /* @__PURE__ */ jsx(SelectItem, { value: AUTO_COUNTRY_VALUE, children: t("ui.customFields.phone.defaultCountryAuto", "Auto-detect from value") }),
46
+ PHONE_COUNTRIES.map((country) => /* @__PURE__ */ jsxs(SelectItem, { value: country.iso2, children: [
47
+ /* @__PURE__ */ jsx(SelectItemLeading, { children: /* @__PURE__ */ jsx("span", { className: "text-base leading-none", children: country.flag }) }),
48
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children: country.label }),
49
+ /* @__PURE__ */ jsx("span", { className: "ml-2 text-xs text-muted-foreground tabular-nums", children: country.dialCode })
50
+ ] }, `${country.iso2}-${country.dialCode}`))
51
+ ] })
52
+ ]
53
+ }
54
+ ),
55
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t(
56
+ "ui.customFields.phone.defaultCountryHint",
57
+ "Pre-selects a country in the phone editor when the field is empty."
58
+ ) })
59
+ ] }) });
60
+ }
61
+ FieldRegistry.register("phone", {
62
+ input: (props) => /* @__PURE__ */ jsx(PhoneFieldInput, { ...props }),
63
+ defEditor: (props) => /* @__PURE__ */ jsx(PhoneFieldDefEditor, { ...props })
64
+ });
65
+ //# sourceMappingURL=phone.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/backend/fields/phone.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport type { CrudCustomFieldRenderProps } from '../CrudForm'\nimport { FieldRegistry } from './registry'\nimport { PhoneNumberField, PHONE_COUNTRIES } from '../inputs/PhoneNumberField'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectItemLeading,\n SelectTrigger,\n SelectValue,\n} from '../../primitives/select'\n\ntype PhoneFieldConfig = {\n defaultCountryIso2?: string\n}\n\ntype PhoneFieldDef = PhoneFieldConfig & {\n configJson?: PhoneFieldConfig\n}\n\ntype PhoneFieldInputProps = CrudCustomFieldRenderProps & { def?: PhoneFieldDef }\n\n// Sentinel used by the definition editor to represent \"no fixed default\"\n// because Radix Select cannot use an empty string as an item value.\nconst AUTO_COUNTRY_VALUE = '__om_phone_auto__'\n\nfunction PhoneFieldInput({ id, value, setValue, disabled, error, def }: PhoneFieldInputProps) {\n const stringValue = typeof value === 'string' ? value : value == null ? '' : String(value)\n return (\n <PhoneNumberField\n id={id}\n value={stringValue}\n onValueChange={(next) => setValue(next ?? undefined)}\n disabled={disabled}\n externalError={error ?? null}\n defaultCountryIso2={def?.defaultCountryIso2}\n />\n )\n}\n\nfunction PhoneFieldDefEditor({\n def,\n onChange,\n}: {\n def: { configJson?: PhoneFieldConfig } | undefined\n onChange: (patch: Partial<PhoneFieldConfig>) => void\n}) {\n const t = useT()\n const selected = typeof def?.configJson?.defaultCountryIso2 === 'string' ? def.configJson.defaultCountryIso2 : ''\n return (\n <div className=\"mt-3 space-y-3 rounded border border-dashed border-muted-foreground/40 bg-muted/30 p-3\">\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n {t('ui.customFields.phone.defaultCountry', 'Default country')}\n </label>\n <Select\n value={selected || AUTO_COUNTRY_VALUE}\n onValueChange={(next) => onChange({ defaultCountryIso2: next === AUTO_COUNTRY_VALUE ? undefined : next })}\n >\n <SelectTrigger size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"start\">\n <SelectItem value={AUTO_COUNTRY_VALUE}>\n {t('ui.customFields.phone.defaultCountryAuto', 'Auto-detect from value')}\n </SelectItem>\n {PHONE_COUNTRIES.map((country) => (\n <SelectItem key={`${country.iso2}-${country.dialCode}`} value={country.iso2}>\n <SelectItemLeading>\n <span className=\"text-base leading-none\">{country.flag}</span>\n </SelectItemLeading>\n <span className=\"flex-1 truncate\">{country.label}</span>\n <span className=\"ml-2 text-xs text-muted-foreground tabular-nums\">{country.dialCode}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'ui.customFields.phone.defaultCountryHint',\n 'Pre-selects a country in the phone editor when the field is empty.',\n )}\n </p>\n </div>\n </div>\n )\n}\n\nFieldRegistry.register('phone', {\n input: (props) => <PhoneFieldInput {...props} />,\n defEditor: (props) => <PhoneFieldDefEditor {...props} />,\n})\n\nexport {}\n"],
5
+ "mappings": ";AAiCI,cAsCU,YAtCV;AA7BJ,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB,uBAAuB;AAClD,SAAS,YAAY;AACrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAcP,MAAM,qBAAqB;AAE3B,SAAS,gBAAgB,EAAE,IAAI,OAAO,UAAU,UAAU,OAAO,IAAI,GAAyB;AAC5F,QAAM,cAAc,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,OAAO,KAAK;AACzF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP,eAAe,CAAC,SAAS,SAAS,QAAQ,MAAS;AAAA,MACnD;AAAA,MACA,eAAe,SAAS;AAAA,MACxB,oBAAoB,KAAK;AAAA;AAAA,EAC3B;AAEJ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AACF,GAGG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,WAAW,OAAO,KAAK,YAAY,uBAAuB,WAAW,IAAI,WAAW,qBAAqB;AAC/G,SACE,oBAAC,SAAI,WAAU,0FACb,+BAAC,SAAI,WAAU,aACb;AAAA,wBAAC,WAAM,WAAU,6CACd,YAAE,wCAAwC,iBAAiB,GAC9D;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,YAAY;AAAA,QACnB,eAAe,CAAC,SAAS,SAAS,EAAE,oBAAoB,SAAS,qBAAqB,SAAY,KAAK,CAAC;AAAA,QAExG;AAAA,8BAAC,iBAAc,MAAK,MAClB,8BAAC,eAAY,GACf;AAAA,UACA,qBAAC,iBAAc,OAAM,SACnB;AAAA,gCAAC,cAAW,OAAO,oBAChB,YAAE,4CAA4C,wBAAwB,GACzE;AAAA,YACC,gBAAgB,IAAI,CAAC,YACpB,qBAAC,cAAuD,OAAO,QAAQ,MACrE;AAAA,kCAAC,qBACC,8BAAC,UAAK,WAAU,0BAA0B,kBAAQ,MAAK,GACzD;AAAA,cACA,oBAAC,UAAK,WAAU,mBAAmB,kBAAQ,OAAM;AAAA,cACjD,oBAAC,UAAK,WAAU,mDAAmD,kBAAQ,UAAS;AAAA,iBALrE,GAAG,QAAQ,IAAI,IAAI,QAAQ,QAAQ,EAMpD,CACD;AAAA,aACH;AAAA;AAAA;AAAA,IACF;AAAA,IACA,oBAAC,OAAE,WAAU,iCACV;AAAA,MACC;AAAA,MACA;AAAA,IACF,GACF;AAAA,KACF,GACF;AAEJ;AAEA,cAAc,SAAS,SAAS;AAAA,EAC9B,OAAO,CAAC,UAAU,oBAAC,mBAAiB,GAAG,OAAO;AAAA,EAC9C,WAAW,CAAC,UAAU,oBAAC,uBAAqB,GAAG,OAAO;AACxD,CAAC;",
6
+ "names": []
7
+ }
@@ -1,5 +1,6 @@
1
1
  import "@open-mercato/core/modules/attachments/fields/attachment";
2
2
  import "@open-mercato/core/modules/dictionaries/fields/dictionary";
3
+ import "./phone.js";
3
4
  function loadAll() {
4
5
  }
5
6
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/backend/fields/registry.generated.ts"],
4
- "sourcesContent": ["// Auto-registered field components loaded at runtime.\n// This file can be regenerated by module generators. Keep imports side-effectful.\nimport '@open-mercato/core/modules/attachments/fields/attachment'\nimport '@open-mercato/core/modules/dictionaries/fields/dictionary'\n\nexport function loadAll() {\n // No-op: imports above perform registration via side effects\n}\n"],
5
- "mappings": "AAEA,OAAO;AACP,OAAO;AAEA,SAAS,UAAU;AAE1B;",
4
+ "sourcesContent": ["// Auto-registered field components loaded at runtime.\n// This file can be regenerated by module generators. Keep imports side-effectful.\nimport '@open-mercato/core/modules/attachments/fields/attachment'\nimport '@open-mercato/core/modules/dictionaries/fields/dictionary'\nimport './phone'\n\nexport function loadAll() {\n // No-op: imports above perform registration via side effects\n}\n"],
5
+ "mappings": "AAEA,OAAO;AACP,OAAO;AACP,OAAO;AAEA,SAAS,UAAU;AAE1B;",
6
6
  "names": []
7
7
  }
@@ -11,28 +11,280 @@ import {
11
11
  SelectItemLeading,
12
12
  SelectTrigger
13
13
  } from "../../primitives/select.js";
14
- const PHONE_COUNTRIES = [
15
- { iso2: "US", dialCode: "+1", label: "United States", flag: "\u{1F1FA}\u{1F1F8}" },
16
- { iso2: "CA", dialCode: "+1", label: "Canada", flag: "\u{1F1E8}\u{1F1E6}" },
17
- { iso2: "GB", dialCode: "+44", label: "United Kingdom", flag: "\u{1F1EC}\u{1F1E7}" },
18
- { iso2: "PL", dialCode: "+48", label: "Poland", flag: "\u{1F1F5}\u{1F1F1}" },
19
- { iso2: "DE", dialCode: "+49", label: "Germany", flag: "\u{1F1E9}\u{1F1EA}" },
20
- { iso2: "FR", dialCode: "+33", label: "France", flag: "\u{1F1EB}\u{1F1F7}" },
21
- { iso2: "ES", dialCode: "+34", label: "Spain", flag: "\u{1F1EA}\u{1F1F8}" },
22
- { iso2: "IT", dialCode: "+39", label: "Italy", flag: "\u{1F1EE}\u{1F1F9}" },
23
- { iso2: "NL", dialCode: "+31", label: "Netherlands", flag: "\u{1F1F3}\u{1F1F1}" },
24
- { iso2: "SE", dialCode: "+46", label: "Sweden", flag: "\u{1F1F8}\u{1F1EA}" },
25
- { iso2: "AT", dialCode: "+43", label: "Austria", flag: "\u{1F1E6}\u{1F1F9}" },
26
- { iso2: "CH", dialCode: "+41", label: "Switzerland", flag: "\u{1F1E8}\u{1F1ED}" },
27
- { iso2: "PT", dialCode: "+351", label: "Portugal", flag: "\u{1F1F5}\u{1F1F9}" },
28
- { iso2: "CZ", dialCode: "+420", label: "Czechia", flag: "\u{1F1E8}\u{1F1FF}" },
29
- { iso2: "RO", dialCode: "+40", label: "Romania", flag: "\u{1F1F7}\u{1F1F4}" },
30
- { iso2: "UA", dialCode: "+380", label: "Ukraine", flag: "\u{1F1FA}\u{1F1E6}" }
14
+ function iso2ToFlagEmoji(iso2) {
15
+ const letters = iso2.toUpperCase().replace(/[^A-Z]/g, "");
16
+ if (letters.length !== 2) return "";
17
+ const base = 127462;
18
+ return String.fromCodePoint(
19
+ base + letters.charCodeAt(0) - 65,
20
+ base + letters.charCodeAt(1) - 65
21
+ );
22
+ }
23
+ const RAW_PHONE_COUNTRIES = [
24
+ { iso2: "US", dialCode: "+1", label: "United States" },
25
+ { iso2: "CA", dialCode: "+1", label: "Canada" },
26
+ { iso2: "AG", dialCode: "+1268", label: "Antigua and Barbuda" },
27
+ { iso2: "AI", dialCode: "+1264", label: "Anguilla" },
28
+ { iso2: "AS", dialCode: "+1684", label: "American Samoa" },
29
+ { iso2: "BB", dialCode: "+1246", label: "Barbados" },
30
+ { iso2: "BM", dialCode: "+1441", label: "Bermuda" },
31
+ { iso2: "BS", dialCode: "+1242", label: "Bahamas" },
32
+ { iso2: "DM", dialCode: "+1767", label: "Dominica" },
33
+ { iso2: "DO", dialCode: "+1809", label: "Dominican Republic" },
34
+ { iso2: "GD", dialCode: "+1473", label: "Grenada" },
35
+ { iso2: "GU", dialCode: "+1671", label: "Guam" },
36
+ { iso2: "JM", dialCode: "+1876", label: "Jamaica" },
37
+ { iso2: "KN", dialCode: "+1869", label: "Saint Kitts and Nevis" },
38
+ { iso2: "KY", dialCode: "+1345", label: "Cayman Islands" },
39
+ { iso2: "LC", dialCode: "+1758", label: "Saint Lucia" },
40
+ { iso2: "MP", dialCode: "+1670", label: "Northern Mariana Islands" },
41
+ { iso2: "MS", dialCode: "+1664", label: "Montserrat" },
42
+ { iso2: "PR", dialCode: "+1787", label: "Puerto Rico" },
43
+ { iso2: "SX", dialCode: "+1721", label: "Sint Maarten" },
44
+ { iso2: "TC", dialCode: "+1649", label: "Turks and Caicos Islands" },
45
+ { iso2: "TT", dialCode: "+1868", label: "Trinidad and Tobago" },
46
+ { iso2: "VC", dialCode: "+1784", label: "Saint Vincent and the Grenadines" },
47
+ { iso2: "VG", dialCode: "+1284", label: "British Virgin Islands" },
48
+ { iso2: "VI", dialCode: "+1340", label: "U.S. Virgin Islands" },
49
+ { iso2: "EG", dialCode: "+20", label: "Egypt" },
50
+ { iso2: "SS", dialCode: "+211", label: "South Sudan" },
51
+ { iso2: "MA", dialCode: "+212", label: "Morocco" },
52
+ { iso2: "EH", dialCode: "+212", label: "Western Sahara" },
53
+ { iso2: "DZ", dialCode: "+213", label: "Algeria" },
54
+ { iso2: "TN", dialCode: "+216", label: "Tunisia" },
55
+ { iso2: "LY", dialCode: "+218", label: "Libya" },
56
+ { iso2: "GM", dialCode: "+220", label: "Gambia" },
57
+ { iso2: "SN", dialCode: "+221", label: "Senegal" },
58
+ { iso2: "MR", dialCode: "+222", label: "Mauritania" },
59
+ { iso2: "ML", dialCode: "+223", label: "Mali" },
60
+ { iso2: "GN", dialCode: "+224", label: "Guinea" },
61
+ { iso2: "CI", dialCode: "+225", label: "C\xF4te d'Ivoire" },
62
+ { iso2: "BF", dialCode: "+226", label: "Burkina Faso" },
63
+ { iso2: "NE", dialCode: "+227", label: "Niger" },
64
+ { iso2: "TG", dialCode: "+228", label: "Togo" },
65
+ { iso2: "BJ", dialCode: "+229", label: "Benin" },
66
+ { iso2: "MU", dialCode: "+230", label: "Mauritius" },
67
+ { iso2: "LR", dialCode: "+231", label: "Liberia" },
68
+ { iso2: "SL", dialCode: "+232", label: "Sierra Leone" },
69
+ { iso2: "GH", dialCode: "+233", label: "Ghana" },
70
+ { iso2: "NG", dialCode: "+234", label: "Nigeria" },
71
+ { iso2: "TD", dialCode: "+235", label: "Chad" },
72
+ { iso2: "CF", dialCode: "+236", label: "Central African Republic" },
73
+ { iso2: "CM", dialCode: "+237", label: "Cameroon" },
74
+ { iso2: "CV", dialCode: "+238", label: "Cape Verde" },
75
+ { iso2: "ST", dialCode: "+239", label: "S\xE3o Tom\xE9 and Pr\xEDncipe" },
76
+ { iso2: "GQ", dialCode: "+240", label: "Equatorial Guinea" },
77
+ { iso2: "GA", dialCode: "+241", label: "Gabon" },
78
+ { iso2: "CG", dialCode: "+242", label: "Republic of the Congo" },
79
+ { iso2: "CD", dialCode: "+243", label: "DR Congo" },
80
+ { iso2: "AO", dialCode: "+244", label: "Angola" },
81
+ { iso2: "GW", dialCode: "+245", label: "Guinea-Bissau" },
82
+ { iso2: "IO", dialCode: "+246", label: "British Indian Ocean Territory" },
83
+ { iso2: "SC", dialCode: "+248", label: "Seychelles" },
84
+ { iso2: "SD", dialCode: "+249", label: "Sudan" },
85
+ { iso2: "RW", dialCode: "+250", label: "Rwanda" },
86
+ { iso2: "ET", dialCode: "+251", label: "Ethiopia" },
87
+ { iso2: "SO", dialCode: "+252", label: "Somalia" },
88
+ { iso2: "DJ", dialCode: "+253", label: "Djibouti" },
89
+ { iso2: "KE", dialCode: "+254", label: "Kenya" },
90
+ { iso2: "TZ", dialCode: "+255", label: "Tanzania" },
91
+ { iso2: "UG", dialCode: "+256", label: "Uganda" },
92
+ { iso2: "BI", dialCode: "+257", label: "Burundi" },
93
+ { iso2: "MZ", dialCode: "+258", label: "Mozambique" },
94
+ { iso2: "ZM", dialCode: "+260", label: "Zambia" },
95
+ { iso2: "MG", dialCode: "+261", label: "Madagascar" },
96
+ { iso2: "RE", dialCode: "+262", label: "R\xE9union" },
97
+ { iso2: "YT", dialCode: "+262", label: "Mayotte" },
98
+ { iso2: "ZW", dialCode: "+263", label: "Zimbabwe" },
99
+ { iso2: "NA", dialCode: "+264", label: "Namibia" },
100
+ { iso2: "MW", dialCode: "+265", label: "Malawi" },
101
+ { iso2: "LS", dialCode: "+266", label: "Lesotho" },
102
+ { iso2: "BW", dialCode: "+267", label: "Botswana" },
103
+ { iso2: "SZ", dialCode: "+268", label: "Eswatini" },
104
+ { iso2: "KM", dialCode: "+269", label: "Comoros" },
105
+ { iso2: "ZA", dialCode: "+27", label: "South Africa" },
106
+ { iso2: "SH", dialCode: "+290", label: "Saint Helena" },
107
+ { iso2: "ER", dialCode: "+291", label: "Eritrea" },
108
+ { iso2: "AW", dialCode: "+297", label: "Aruba" },
109
+ { iso2: "FO", dialCode: "+298", label: "Faroe Islands" },
110
+ { iso2: "GL", dialCode: "+299", label: "Greenland" },
111
+ { iso2: "GR", dialCode: "+30", label: "Greece" },
112
+ { iso2: "NL", dialCode: "+31", label: "Netherlands" },
113
+ { iso2: "BE", dialCode: "+32", label: "Belgium" },
114
+ { iso2: "FR", dialCode: "+33", label: "France" },
115
+ { iso2: "ES", dialCode: "+34", label: "Spain" },
116
+ { iso2: "GI", dialCode: "+350", label: "Gibraltar" },
117
+ { iso2: "PT", dialCode: "+351", label: "Portugal" },
118
+ { iso2: "LU", dialCode: "+352", label: "Luxembourg" },
119
+ { iso2: "IE", dialCode: "+353", label: "Ireland" },
120
+ { iso2: "IS", dialCode: "+354", label: "Iceland" },
121
+ { iso2: "AL", dialCode: "+355", label: "Albania" },
122
+ { iso2: "MT", dialCode: "+356", label: "Malta" },
123
+ { iso2: "CY", dialCode: "+357", label: "Cyprus" },
124
+ { iso2: "FI", dialCode: "+358", label: "Finland" },
125
+ { iso2: "AX", dialCode: "+358", label: "\xC5land Islands" },
126
+ { iso2: "BG", dialCode: "+359", label: "Bulgaria" },
127
+ { iso2: "HU", dialCode: "+36", label: "Hungary" },
128
+ { iso2: "LT", dialCode: "+370", label: "Lithuania" },
129
+ { iso2: "LV", dialCode: "+371", label: "Latvia" },
130
+ { iso2: "EE", dialCode: "+372", label: "Estonia" },
131
+ { iso2: "MD", dialCode: "+373", label: "Moldova" },
132
+ { iso2: "AM", dialCode: "+374", label: "Armenia" },
133
+ { iso2: "BY", dialCode: "+375", label: "Belarus" },
134
+ { iso2: "AD", dialCode: "+376", label: "Andorra" },
135
+ { iso2: "MC", dialCode: "+377", label: "Monaco" },
136
+ { iso2: "SM", dialCode: "+378", label: "San Marino" },
137
+ { iso2: "VA", dialCode: "+379", label: "Vatican City" },
138
+ { iso2: "UA", dialCode: "+380", label: "Ukraine" },
139
+ { iso2: "RS", dialCode: "+381", label: "Serbia" },
140
+ { iso2: "ME", dialCode: "+382", label: "Montenegro" },
141
+ { iso2: "XK", dialCode: "+383", label: "Kosovo" },
142
+ { iso2: "HR", dialCode: "+385", label: "Croatia" },
143
+ { iso2: "SI", dialCode: "+386", label: "Slovenia" },
144
+ { iso2: "BA", dialCode: "+387", label: "Bosnia and Herzegovina" },
145
+ { iso2: "MK", dialCode: "+389", label: "North Macedonia" },
146
+ { iso2: "IT", dialCode: "+39", label: "Italy" },
147
+ { iso2: "RO", dialCode: "+40", label: "Romania" },
148
+ { iso2: "CH", dialCode: "+41", label: "Switzerland" },
149
+ { iso2: "CZ", dialCode: "+420", label: "Czechia" },
150
+ { iso2: "SK", dialCode: "+421", label: "Slovakia" },
151
+ { iso2: "LI", dialCode: "+423", label: "Liechtenstein" },
152
+ { iso2: "AT", dialCode: "+43", label: "Austria" },
153
+ { iso2: "GB", dialCode: "+44", label: "United Kingdom" },
154
+ { iso2: "GG", dialCode: "+44", label: "Guernsey" },
155
+ { iso2: "JE", dialCode: "+44", label: "Jersey" },
156
+ { iso2: "IM", dialCode: "+44", label: "Isle of Man" },
157
+ { iso2: "DK", dialCode: "+45", label: "Denmark" },
158
+ { iso2: "SE", dialCode: "+46", label: "Sweden" },
159
+ { iso2: "NO", dialCode: "+47", label: "Norway" },
160
+ { iso2: "SJ", dialCode: "+47", label: "Svalbard and Jan Mayen" },
161
+ { iso2: "PL", dialCode: "+48", label: "Poland" },
162
+ { iso2: "DE", dialCode: "+49", label: "Germany" },
163
+ { iso2: "FK", dialCode: "+500", label: "Falkland Islands" },
164
+ { iso2: "BZ", dialCode: "+501", label: "Belize" },
165
+ { iso2: "GT", dialCode: "+502", label: "Guatemala" },
166
+ { iso2: "SV", dialCode: "+503", label: "El Salvador" },
167
+ { iso2: "HN", dialCode: "+504", label: "Honduras" },
168
+ { iso2: "NI", dialCode: "+505", label: "Nicaragua" },
169
+ { iso2: "CR", dialCode: "+506", label: "Costa Rica" },
170
+ { iso2: "PA", dialCode: "+507", label: "Panama" },
171
+ { iso2: "PM", dialCode: "+508", label: "Saint Pierre and Miquelon" },
172
+ { iso2: "HT", dialCode: "+509", label: "Haiti" },
173
+ { iso2: "PE", dialCode: "+51", label: "Peru" },
174
+ { iso2: "MX", dialCode: "+52", label: "Mexico" },
175
+ { iso2: "CU", dialCode: "+53", label: "Cuba" },
176
+ { iso2: "AR", dialCode: "+54", label: "Argentina" },
177
+ { iso2: "BR", dialCode: "+55", label: "Brazil" },
178
+ { iso2: "CL", dialCode: "+56", label: "Chile" },
179
+ { iso2: "CO", dialCode: "+57", label: "Colombia" },
180
+ { iso2: "VE", dialCode: "+58", label: "Venezuela" },
181
+ { iso2: "GP", dialCode: "+590", label: "Guadeloupe" },
182
+ { iso2: "BL", dialCode: "+590", label: "Saint Barth\xE9lemy" },
183
+ { iso2: "MF", dialCode: "+590", label: "Saint Martin" },
184
+ { iso2: "BO", dialCode: "+591", label: "Bolivia" },
185
+ { iso2: "GY", dialCode: "+592", label: "Guyana" },
186
+ { iso2: "EC", dialCode: "+593", label: "Ecuador" },
187
+ { iso2: "GF", dialCode: "+594", label: "French Guiana" },
188
+ { iso2: "PY", dialCode: "+595", label: "Paraguay" },
189
+ { iso2: "MQ", dialCode: "+596", label: "Martinique" },
190
+ { iso2: "SR", dialCode: "+597", label: "Suriname" },
191
+ { iso2: "UY", dialCode: "+598", label: "Uruguay" },
192
+ { iso2: "CW", dialCode: "+599", label: "Cura\xE7ao" },
193
+ { iso2: "BQ", dialCode: "+599", label: "Caribbean Netherlands" },
194
+ { iso2: "MY", dialCode: "+60", label: "Malaysia" },
195
+ { iso2: "AU", dialCode: "+61", label: "Australia" },
196
+ { iso2: "CX", dialCode: "+61", label: "Christmas Island" },
197
+ { iso2: "CC", dialCode: "+61", label: "Cocos (Keeling) Islands" },
198
+ { iso2: "ID", dialCode: "+62", label: "Indonesia" },
199
+ { iso2: "PH", dialCode: "+63", label: "Philippines" },
200
+ { iso2: "NZ", dialCode: "+64", label: "New Zealand" },
201
+ { iso2: "SG", dialCode: "+65", label: "Singapore" },
202
+ { iso2: "TH", dialCode: "+66", label: "Thailand" },
203
+ { iso2: "TL", dialCode: "+670", label: "Timor-Leste" },
204
+ { iso2: "NF", dialCode: "+672", label: "Norfolk Island" },
205
+ { iso2: "BN", dialCode: "+673", label: "Brunei" },
206
+ { iso2: "NR", dialCode: "+674", label: "Nauru" },
207
+ { iso2: "PG", dialCode: "+675", label: "Papua New Guinea" },
208
+ { iso2: "TO", dialCode: "+676", label: "Tonga" },
209
+ { iso2: "SB", dialCode: "+677", label: "Solomon Islands" },
210
+ { iso2: "VU", dialCode: "+678", label: "Vanuatu" },
211
+ { iso2: "FJ", dialCode: "+679", label: "Fiji" },
212
+ { iso2: "PW", dialCode: "+680", label: "Palau" },
213
+ { iso2: "WF", dialCode: "+681", label: "Wallis and Futuna" },
214
+ { iso2: "CK", dialCode: "+682", label: "Cook Islands" },
215
+ { iso2: "NU", dialCode: "+683", label: "Niue" },
216
+ { iso2: "WS", dialCode: "+685", label: "Samoa" },
217
+ { iso2: "KI", dialCode: "+686", label: "Kiribati" },
218
+ { iso2: "NC", dialCode: "+687", label: "New Caledonia" },
219
+ { iso2: "TV", dialCode: "+688", label: "Tuvalu" },
220
+ { iso2: "PF", dialCode: "+689", label: "French Polynesia" },
221
+ { iso2: "TK", dialCode: "+690", label: "Tokelau" },
222
+ { iso2: "FM", dialCode: "+691", label: "Micronesia" },
223
+ { iso2: "MH", dialCode: "+692", label: "Marshall Islands" },
224
+ { iso2: "RU", dialCode: "+7", label: "Russia" },
225
+ { iso2: "KZ", dialCode: "+7", label: "Kazakhstan" },
226
+ { iso2: "JP", dialCode: "+81", label: "Japan" },
227
+ { iso2: "KR", dialCode: "+82", label: "South Korea" },
228
+ { iso2: "VN", dialCode: "+84", label: "Vietnam" },
229
+ { iso2: "KP", dialCode: "+850", label: "North Korea" },
230
+ { iso2: "HK", dialCode: "+852", label: "Hong Kong" },
231
+ { iso2: "MO", dialCode: "+853", label: "Macau" },
232
+ { iso2: "KH", dialCode: "+855", label: "Cambodia" },
233
+ { iso2: "LA", dialCode: "+856", label: "Laos" },
234
+ { iso2: "CN", dialCode: "+86", label: "China" },
235
+ { iso2: "BD", dialCode: "+880", label: "Bangladesh" },
236
+ { iso2: "TW", dialCode: "+886", label: "Taiwan" },
237
+ { iso2: "TR", dialCode: "+90", label: "Turkey" },
238
+ { iso2: "IN", dialCode: "+91", label: "India" },
239
+ { iso2: "PK", dialCode: "+92", label: "Pakistan" },
240
+ { iso2: "AF", dialCode: "+93", label: "Afghanistan" },
241
+ { iso2: "LK", dialCode: "+94", label: "Sri Lanka" },
242
+ { iso2: "MM", dialCode: "+95", label: "Myanmar" },
243
+ { iso2: "MV", dialCode: "+960", label: "Maldives" },
244
+ { iso2: "LB", dialCode: "+961", label: "Lebanon" },
245
+ { iso2: "JO", dialCode: "+962", label: "Jordan" },
246
+ { iso2: "SY", dialCode: "+963", label: "Syria" },
247
+ { iso2: "IQ", dialCode: "+964", label: "Iraq" },
248
+ { iso2: "KW", dialCode: "+965", label: "Kuwait" },
249
+ { iso2: "SA", dialCode: "+966", label: "Saudi Arabia" },
250
+ { iso2: "YE", dialCode: "+967", label: "Yemen" },
251
+ { iso2: "OM", dialCode: "+968", label: "Oman" },
252
+ { iso2: "PS", dialCode: "+970", label: "Palestine" },
253
+ { iso2: "AE", dialCode: "+971", label: "United Arab Emirates" },
254
+ { iso2: "IL", dialCode: "+972", label: "Israel" },
255
+ { iso2: "BH", dialCode: "+973", label: "Bahrain" },
256
+ { iso2: "QA", dialCode: "+974", label: "Qatar" },
257
+ { iso2: "BT", dialCode: "+975", label: "Bhutan" },
258
+ { iso2: "MN", dialCode: "+976", label: "Mongolia" },
259
+ { iso2: "NP", dialCode: "+977", label: "Nepal" },
260
+ { iso2: "TJ", dialCode: "+992", label: "Tajikistan" },
261
+ { iso2: "TM", dialCode: "+993", label: "Turkmenistan" },
262
+ { iso2: "AZ", dialCode: "+994", label: "Azerbaijan" },
263
+ { iso2: "GE", dialCode: "+995", label: "Georgia" },
264
+ { iso2: "KG", dialCode: "+996", label: "Kyrgyzstan" },
265
+ { iso2: "UZ", dialCode: "+998", label: "Uzbekistan" },
266
+ { iso2: "IR", dialCode: "+98", label: "Iran" }
31
267
  ];
32
- const DEFAULT_COUNTRY = PHONE_COUNTRIES[0];
33
- const COUNTRIES_BY_DIAL_LENGTH = [...PHONE_COUNTRIES].sort(
34
- (a, b) => b.dialCode.length - a.dialCode.length
35
- );
268
+ const PHONE_COUNTRIES = RAW_PHONE_COUNTRIES.map((country) => ({ ...country, flag: iso2ToFlagEmoji(country.iso2) })).sort((a, b) => a.label.localeCompare(b.label, "en", { sensitivity: "base" }));
269
+ const PRIMARY_DIAL_OWNERS = {
270
+ "+1": "US",
271
+ "+7": "RU",
272
+ "+44": "GB",
273
+ "+47": "NO",
274
+ "+61": "AU",
275
+ "+212": "MA",
276
+ "+262": "RE",
277
+ "+358": "FI",
278
+ "+590": "GP",
279
+ "+599": "CW"
280
+ };
281
+ const DEFAULT_COUNTRY = PHONE_COUNTRIES.find((country) => country.iso2 === "US") ?? PHONE_COUNTRIES[0];
282
+ const COUNTRIES_BY_DIAL_LENGTH = [...PHONE_COUNTRIES].sort((a, b) => {
283
+ if (b.dialCode.length !== a.dialCode.length) return b.dialCode.length - a.dialCode.length;
284
+ const aPrimary = PRIMARY_DIAL_OWNERS[a.dialCode] === a.iso2 ? 0 : 1;
285
+ const bPrimary = PRIMARY_DIAL_OWNERS[b.dialCode] === b.iso2 ? 0 : 1;
286
+ return aPrimary - bPrimary;
287
+ });
36
288
  function findCountryByIso(iso2) {
37
289
  return PHONE_COUNTRIES.find((c) => c.iso2 === iso2);
38
290
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/backend/inputs/PhoneNumberField.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { extractPhoneDigits, validatePhoneNumber } from '@open-mercato/shared/lib/phone'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectItemLeading,\n SelectTrigger,\n} from '../../primitives/select'\n\nexport type PhoneDuplicateMatch = {\n id: string\n label: string\n href: string\n}\n\nexport type PhoneCountry = {\n /** ISO 3166-1 alpha-2 code. */\n iso2: string\n /** International dial code (with `+`). */\n dialCode: string\n /** Human-readable country name (English). Override per surface for i18n. */\n label: string\n /** Emoji flag (no asset dependency). */\n flag: string\n}\n\n/**\n * Static country list \u2014 focused on EU + Americas markets where Open Mercato\n * currently operates. Extend as needed; longest dial codes MUST appear before\n * their shorter ancestors (e.g. `+380` before `+38`) to keep prefix matching\n * deterministic. The default fallback is the first entry.\n */\nexport const PHONE_COUNTRIES: PhoneCountry[] = [\n { iso2: 'US', dialCode: '+1', label: 'United States', flag: '\uD83C\uDDFA\uD83C\uDDF8' },\n { iso2: 'CA', dialCode: '+1', label: 'Canada', flag: '\uD83C\uDDE8\uD83C\uDDE6' },\n { iso2: 'GB', dialCode: '+44', label: 'United Kingdom', flag: '\uD83C\uDDEC\uD83C\uDDE7' },\n { iso2: 'PL', dialCode: '+48', label: 'Poland', flag: '\uD83C\uDDF5\uD83C\uDDF1' },\n { iso2: 'DE', dialCode: '+49', label: 'Germany', flag: '\uD83C\uDDE9\uD83C\uDDEA' },\n { iso2: 'FR', dialCode: '+33', label: 'France', flag: '\uD83C\uDDEB\uD83C\uDDF7' },\n { iso2: 'ES', dialCode: '+34', label: 'Spain', flag: '\uD83C\uDDEA\uD83C\uDDF8' },\n { iso2: 'IT', dialCode: '+39', label: 'Italy', flag: '\uD83C\uDDEE\uD83C\uDDF9' },\n { iso2: 'NL', dialCode: '+31', label: 'Netherlands', flag: '\uD83C\uDDF3\uD83C\uDDF1' },\n { iso2: 'SE', dialCode: '+46', label: 'Sweden', flag: '\uD83C\uDDF8\uD83C\uDDEA' },\n { iso2: 'AT', dialCode: '+43', label: 'Austria', flag: '\uD83C\uDDE6\uD83C\uDDF9' },\n { iso2: 'CH', dialCode: '+41', label: 'Switzerland', flag: '\uD83C\uDDE8\uD83C\uDDED' },\n { iso2: 'PT', dialCode: '+351', label: 'Portugal', flag: '\uD83C\uDDF5\uD83C\uDDF9' },\n { iso2: 'CZ', dialCode: '+420', label: 'Czechia', flag: '\uD83C\uDDE8\uD83C\uDDFF' },\n { iso2: 'RO', dialCode: '+40', label: 'Romania', flag: '\uD83C\uDDF7\uD83C\uDDF4' },\n { iso2: 'UA', dialCode: '+380', label: 'Ukraine', flag: '\uD83C\uDDFA\uD83C\uDDE6' },\n]\n\nconst DEFAULT_COUNTRY = PHONE_COUNTRIES[0]\n// Match longer prefixes first to avoid e.g. `+1` shadowing `+1234` if any.\nconst COUNTRIES_BY_DIAL_LENGTH = [...PHONE_COUNTRIES].sort(\n (a, b) => b.dialCode.length - a.dialCode.length,\n)\n\nfunction findCountryByIso(iso2: string): PhoneCountry | undefined {\n return PHONE_COUNTRIES.find((c) => c.iso2 === iso2)\n}\n\nfunction parseCountryFromValue(value: string | null | undefined): PhoneCountry | null {\n if (!value) return null\n const trimmed = value.trim()\n if (!trimmed.startsWith('+')) return null\n for (const country of COUNTRIES_BY_DIAL_LENGTH) {\n if (trimmed.startsWith(country.dialCode)) return country\n }\n return null\n}\n\nfunction extractLocalNumber(value: string | null | undefined, dialCode: string): string {\n if (!value) return ''\n const trimmed = value.trim()\n if (!trimmed.startsWith(dialCode)) return trimmed\n return trimmed.slice(dialCode.length).trim()\n}\n\nfunction composeValue(country: PhoneCountry, localNumber: string): string {\n const trimmed = localNumber.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('+')) return trimmed\n return `${country.dialCode} ${trimmed}`\n}\n\nexport type PhoneNumberFieldProps = {\n id?: string\n value?: string | null\n onValueChange: (next: string | undefined) => void\n onDigitsChange?: (digits: string | null) => void\n externalError?: string | null\n disabled?: boolean\n autoFocus?: boolean\n ariaLabel?: string\n ariaDescribedBy?: string\n placeholder?: string\n minDigits?: number\n checkingLabel?: string\n duplicateLabel?: (match: PhoneDuplicateMatch) => string\n duplicateLinkLabel?: string\n invalidLabel?: string\n onDuplicateLookup?: (normalizedValue: string) => Promise<PhoneDuplicateMatch | null>\n /** Override the static country list (e.g. limit to specific markets). */\n countries?: PhoneCountry[]\n /** Initial country shown when `value` is empty / unparseable. Defaults to US. */\n defaultCountryIso2?: string\n}\n\nconst DEFAULT_MIN_DIGITS = 6\nconst DEFAULT_PLACEHOLDER = '(555) 000-0000'\n\nexport function PhoneNumberField({\n id,\n value,\n onValueChange,\n onDigitsChange,\n externalError,\n disabled = false,\n autoFocus,\n ariaLabel,\n ariaDescribedBy,\n placeholder,\n minDigits = DEFAULT_MIN_DIGITS,\n checkingLabel,\n duplicateLabel,\n duplicateLinkLabel,\n invalidLabel,\n onDuplicateLookup,\n countries: countriesProp,\n defaultCountryIso2,\n}: PhoneNumberFieldProps) {\n const t = useT()\n const resolvedInvalidLabel = invalidLabel ?? t(\n 'ui.inputs.phoneNumberField.invalid',\n 'Enter a valid phone number with country code (e.g. +1 212 555 1234)'\n )\n const resolvedCheckingLabel = checkingLabel ?? t(\n 'ui.inputs.phoneNumberField.checking',\n 'Checking for duplicates\u2026'\n )\n const resolvedDuplicateLinkLabel = duplicateLinkLabel ?? t(\n 'ui.inputs.phoneNumberField.duplicateLink',\n 'Open record'\n )\n const resolvedPlaceholder = placeholder ?? DEFAULT_PLACEHOLDER\n const countries = countriesProp ?? PHONE_COUNTRIES\n const fallbackCountry = React.useMemo(\n () => (defaultCountryIso2 && findCountryByIso(defaultCountryIso2)) || DEFAULT_COUNTRY,\n [defaultCountryIso2],\n )\n\n const initialCountry = React.useMemo(\n () => parseCountryFromValue(value) ?? fallbackCountry,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n )\n const [country, setCountry] = React.useState<PhoneCountry>(initialCountry)\n const [localNumber, setLocalNumber] = React.useState<string>(() =>\n extractLocalNumber(value, initialCountry.dialCode),\n )\n const [duplicate, setDuplicate] = React.useState<PhoneDuplicateMatch | null>(null)\n const [checking, setChecking] = React.useState(false)\n const [validationHint, setValidationHint] = React.useState<string | null>(null)\n const [focused, setFocused] = React.useState(false)\n const userEditingRef = React.useRef(false)\n\n const externalFieldError = externalError && externalError.trim().length > 0 ? externalError : null\n const errorMessage = externalFieldError ?? validationHint\n const errorId = errorMessage && id ? `${id}-error` : undefined\n const describedBy = [ariaDescribedBy, errorId].filter((part): part is string => Boolean(part)).join(' ') || undefined\n const composedValue = composeValue(country, localNumber)\n\n // Sync local state when `value` updates externally and the user is not editing.\n React.useEffect(() => {\n if (userEditingRef.current) return\n if (value == null || value === '') {\n setLocalNumber('')\n onDigitsChange?.(null)\n return\n }\n const parsed = parseCountryFromValue(value)\n if (parsed) setCountry(parsed)\n const next = extractLocalNumber(value, parsed?.dialCode ?? country.dialCode)\n setLocalNumber(next)\n onDigitsChange?.(extractPhoneDigits(String(value)) || null)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value])\n\n // Debounced duplicate lookup.\n React.useEffect(() => {\n if (!onDuplicateLookup || disabled) {\n setDuplicate(null)\n setChecking(false)\n return\n }\n const digits = extractPhoneDigits(composedValue)\n if (!digits || digits.length < minDigits) {\n setDuplicate(null)\n setChecking(false)\n return\n }\n\n let cancelled = false\n setChecking(true)\n const handle = window.setTimeout(async () => {\n try {\n const match = await onDuplicateLookup(digits)\n if (!cancelled) setDuplicate(match)\n } catch {\n if (!cancelled) setDuplicate(null)\n } finally {\n if (!cancelled) setChecking(false)\n }\n }, 350)\n\n return () => {\n cancelled = true\n window.clearTimeout(handle)\n }\n }, [composedValue, disabled, minDigits, onDuplicateLookup])\n\n const emit = React.useCallback(\n (nextCountry: PhoneCountry, nextLocal: string) => {\n const composed = composeValue(nextCountry, nextLocal)\n onValueChange(composed.length ? composed : undefined)\n onDigitsChange?.(extractPhoneDigits(composed) || null)\n },\n [onDigitsChange, onValueChange],\n )\n\n const handleCountryChange = React.useCallback(\n (iso2: string) => {\n const next = findCountryByIso(iso2)\n if (!next) return\n userEditingRef.current = true\n setCountry(next)\n setValidationHint(null)\n emit(next, localNumber)\n },\n [emit, localNumber],\n )\n\n const handleLocalChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const next = event.target.value\n userEditingRef.current = true\n setLocalNumber(next)\n setValidationHint(null)\n emit(country, next)\n },\n [country, emit],\n )\n\n const handleBlur = React.useCallback(() => {\n userEditingRef.current = false\n setFocused(false)\n const trimmed = localNumber.trim()\n if (!trimmed) {\n setLocalNumber('')\n setValidationHint(null)\n onValueChange(undefined)\n onDigitsChange?.(null)\n return\n }\n const composed = composeValue(country, trimmed)\n const result = validatePhoneNumber(composed)\n if (result.valid) {\n const normalizedLocal = extractLocalNumber(result.normalized ?? composed, country.dialCode)\n setLocalNumber(normalizedLocal)\n setValidationHint(null)\n onValueChange(result.normalized || undefined)\n onDigitsChange?.(result.digits || null)\n } else {\n setValidationHint(resolvedInvalidLabel)\n onValueChange(composed)\n onDigitsChange?.(result.digits || null)\n }\n }, [country, localNumber, onDigitsChange, onValueChange, resolvedInvalidLabel])\n\n const containerErrorBorder = errorMessage ? 'border-status-error-icon' : 'border-input'\n const containerFocusBorder = errorMessage\n ? 'border-status-error-icon shadow-focus'\n : 'border-brand-violet shadow-focus'\n\n return (\n <div className=\"space-y-2\">\n <div\n className={cn(\n 'flex items-stretch w-full rounded-md border bg-background shadow-xs transition-colors',\n disabled\n ? 'bg-bg-disabled border-border-disabled cursor-not-allowed'\n : focused\n ? containerFocusBorder\n : `${containerErrorBorder} hover:border-foreground/30`,\n )}\n aria-invalid={errorMessage ? 'true' : undefined}\n >\n <Select value={country.iso2} onValueChange={handleCountryChange} disabled={disabled}>\n <SelectTrigger\n aria-label={ariaLabel ? `${ariaLabel} country` : 'Country code'}\n className={cn(\n 'h-auto w-auto shrink-0 gap-1.5 rounded-none rounded-l-md border-0 bg-transparent px-2.5 py-2 shadow-none',\n 'hover:bg-muted/40 focus:bg-muted/40 focus-visible:shadow-none focus-visible:border-0',\n 'disabled:bg-transparent disabled:hover:bg-transparent',\n )}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n <span className=\"text-base leading-none\" aria-hidden=\"true\">{country.flag}</span>\n <span className=\"text-sm text-foreground tabular-nums\">{country.dialCode}</span>\n </SelectTrigger>\n <SelectContent align=\"start\">\n {countries.map((c) => (\n <SelectItem key={`${c.iso2}-${c.dialCode}`} value={c.iso2}>\n <SelectItemLeading>\n <span className=\"text-base leading-none\">{c.flag}</span>\n </SelectItemLeading>\n <span className=\"flex-1 truncate\">{c.label}</span>\n <span className=\"ml-2 text-xs text-muted-foreground tabular-nums\">{c.dialCode}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div aria-hidden=\"true\" className=\"w-px self-stretch bg-input\" />\n <input\n type=\"tel\"\n inputMode=\"tel\"\n autoComplete=\"tel-national\"\n value={localNumber}\n onChange={handleLocalChange}\n onBlur={handleBlur}\n onFocus={() => setFocused(true)}\n placeholder={resolvedPlaceholder}\n autoFocus={autoFocus}\n disabled={disabled}\n id={id}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={errorMessage ? 'true' : undefined}\n data-crud-focus-target=\"\"\n className={cn(\n 'flex-1 min-w-0 bg-transparent px-3 py-2 text-sm leading-5 outline-none',\n 'placeholder:text-muted-foreground',\n 'disabled:cursor-not-allowed disabled:text-muted-foreground',\n )}\n />\n </div>\n {errorMessage ? (\n <p id={errorId} role=\"alert\" className=\"text-xs text-status-error-text\">{errorMessage}</p>\n ) : null}\n {!disabled && duplicate && duplicateLabel ? (\n <p className=\"text-xs text-status-warning-text\">\n {duplicateLabel(duplicate)}{' '}\n <a className=\"font-medium text-brand-violet underline underline-offset-2\" href={duplicate.href}>\n {resolvedDuplicateLinkLabel}\n </a>\n </p>\n ) : null}\n {!disabled && !duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{resolvedCheckingLabel}</p>\n ) : null}\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { extractPhoneDigits, validatePhoneNumber } from '@open-mercato/shared/lib/phone'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectItemLeading,\n SelectTrigger,\n} from '../../primitives/select'\n\nexport type PhoneDuplicateMatch = {\n id: string\n label: string\n href: string\n}\n\nexport type PhoneCountry = {\n /** ISO 3166-1 alpha-2 code. */\n iso2: string\n /** International dial code (with `+`). */\n dialCode: string\n /** Human-readable country name (English). Override per surface for i18n. */\n label: string\n /** Emoji flag (no asset dependency). */\n flag: string\n}\n\n/**\n * Emoji flag for an ISO 3166-1 alpha-2 code, assembled from the two regional\n * indicator symbols. Deriving it keeps the (large) dictionary free of hand-typed\n * emoji and guarantees the flag always matches the code.\n */\nfunction iso2ToFlagEmoji(iso2: string): string {\n const letters = iso2.toUpperCase().replace(/[^A-Z]/g, '')\n if (letters.length !== 2) return ''\n const base = 0x1f1e6\n return String.fromCodePoint(\n base + letters.charCodeAt(0) - 65,\n base + letters.charCodeAt(1) - 65,\n )\n}\n\n/**\n * Complete static dictionary of geographic countries and territories that have\n * an ISO 3166-1 alpha-2 code and an international calling code, based on the\n * ITU / Wikipedia list of telephone country codes.\n *\n * Rules baked into this data:\n * - Labels are English; flags are derived from the ISO code (`iso2ToFlagEmoji`).\n * - Non-geographic / international service codes (`+800`, `+808`, `+870`,\n * `+881`, `+882`, \u2026) are intentionally excluded.\n * - North American Numbering Plan territories carry their full `+1<NPA>` dial\n * code (e.g. Bahamas `+1242`) so longest-prefix matching resolves them before\n * the generic `+1`. The US and Canada BOTH use a bare `+1` and cannot be told\n * apart from the prefix alone \u2014 auto-detection favours the US.\n * - Several sovereign countries share a calling code with dependent territories\n * (e.g. `+44` UK/Guernsey/Jersey/Isle of Man); `PRIMARY_DIAL_OWNERS` records\n * the country that wins auto-detection for those shared codes.\n */\nconst RAW_PHONE_COUNTRIES: Array<Omit<PhoneCountry, 'flag'>> = [\n { iso2: 'US', dialCode: '+1', label: 'United States' },\n { iso2: 'CA', dialCode: '+1', label: 'Canada' },\n { iso2: 'AG', dialCode: '+1268', label: 'Antigua and Barbuda' },\n { iso2: 'AI', dialCode: '+1264', label: 'Anguilla' },\n { iso2: 'AS', dialCode: '+1684', label: 'American Samoa' },\n { iso2: 'BB', dialCode: '+1246', label: 'Barbados' },\n { iso2: 'BM', dialCode: '+1441', label: 'Bermuda' },\n { iso2: 'BS', dialCode: '+1242', label: 'Bahamas' },\n { iso2: 'DM', dialCode: '+1767', label: 'Dominica' },\n { iso2: 'DO', dialCode: '+1809', label: 'Dominican Republic' },\n { iso2: 'GD', dialCode: '+1473', label: 'Grenada' },\n { iso2: 'GU', dialCode: '+1671', label: 'Guam' },\n { iso2: 'JM', dialCode: '+1876', label: 'Jamaica' },\n { iso2: 'KN', dialCode: '+1869', label: 'Saint Kitts and Nevis' },\n { iso2: 'KY', dialCode: '+1345', label: 'Cayman Islands' },\n { iso2: 'LC', dialCode: '+1758', label: 'Saint Lucia' },\n { iso2: 'MP', dialCode: '+1670', label: 'Northern Mariana Islands' },\n { iso2: 'MS', dialCode: '+1664', label: 'Montserrat' },\n { iso2: 'PR', dialCode: '+1787', label: 'Puerto Rico' },\n { iso2: 'SX', dialCode: '+1721', label: 'Sint Maarten' },\n { iso2: 'TC', dialCode: '+1649', label: 'Turks and Caicos Islands' },\n { iso2: 'TT', dialCode: '+1868', label: 'Trinidad and Tobago' },\n { iso2: 'VC', dialCode: '+1784', label: 'Saint Vincent and the Grenadines' },\n { iso2: 'VG', dialCode: '+1284', label: 'British Virgin Islands' },\n { iso2: 'VI', dialCode: '+1340', label: 'U.S. Virgin Islands' },\n { iso2: 'EG', dialCode: '+20', label: 'Egypt' },\n { iso2: 'SS', dialCode: '+211', label: 'South Sudan' },\n { iso2: 'MA', dialCode: '+212', label: 'Morocco' },\n { iso2: 'EH', dialCode: '+212', label: 'Western Sahara' },\n { iso2: 'DZ', dialCode: '+213', label: 'Algeria' },\n { iso2: 'TN', dialCode: '+216', label: 'Tunisia' },\n { iso2: 'LY', dialCode: '+218', label: 'Libya' },\n { iso2: 'GM', dialCode: '+220', label: 'Gambia' },\n { iso2: 'SN', dialCode: '+221', label: 'Senegal' },\n { iso2: 'MR', dialCode: '+222', label: 'Mauritania' },\n { iso2: 'ML', dialCode: '+223', label: 'Mali' },\n { iso2: 'GN', dialCode: '+224', label: 'Guinea' },\n { iso2: 'CI', dialCode: '+225', label: \"C\u00F4te d'Ivoire\" },\n { iso2: 'BF', dialCode: '+226', label: 'Burkina Faso' },\n { iso2: 'NE', dialCode: '+227', label: 'Niger' },\n { iso2: 'TG', dialCode: '+228', label: 'Togo' },\n { iso2: 'BJ', dialCode: '+229', label: 'Benin' },\n { iso2: 'MU', dialCode: '+230', label: 'Mauritius' },\n { iso2: 'LR', dialCode: '+231', label: 'Liberia' },\n { iso2: 'SL', dialCode: '+232', label: 'Sierra Leone' },\n { iso2: 'GH', dialCode: '+233', label: 'Ghana' },\n { iso2: 'NG', dialCode: '+234', label: 'Nigeria' },\n { iso2: 'TD', dialCode: '+235', label: 'Chad' },\n { iso2: 'CF', dialCode: '+236', label: 'Central African Republic' },\n { iso2: 'CM', dialCode: '+237', label: 'Cameroon' },\n { iso2: 'CV', dialCode: '+238', label: 'Cape Verde' },\n { iso2: 'ST', dialCode: '+239', label: 'S\u00E3o Tom\u00E9 and Pr\u00EDncipe' },\n { iso2: 'GQ', dialCode: '+240', label: 'Equatorial Guinea' },\n { iso2: 'GA', dialCode: '+241', label: 'Gabon' },\n { iso2: 'CG', dialCode: '+242', label: 'Republic of the Congo' },\n { iso2: 'CD', dialCode: '+243', label: 'DR Congo' },\n { iso2: 'AO', dialCode: '+244', label: 'Angola' },\n { iso2: 'GW', dialCode: '+245', label: 'Guinea-Bissau' },\n { iso2: 'IO', dialCode: '+246', label: 'British Indian Ocean Territory' },\n { iso2: 'SC', dialCode: '+248', label: 'Seychelles' },\n { iso2: 'SD', dialCode: '+249', label: 'Sudan' },\n { iso2: 'RW', dialCode: '+250', label: 'Rwanda' },\n { iso2: 'ET', dialCode: '+251', label: 'Ethiopia' },\n { iso2: 'SO', dialCode: '+252', label: 'Somalia' },\n { iso2: 'DJ', dialCode: '+253', label: 'Djibouti' },\n { iso2: 'KE', dialCode: '+254', label: 'Kenya' },\n { iso2: 'TZ', dialCode: '+255', label: 'Tanzania' },\n { iso2: 'UG', dialCode: '+256', label: 'Uganda' },\n { iso2: 'BI', dialCode: '+257', label: 'Burundi' },\n { iso2: 'MZ', dialCode: '+258', label: 'Mozambique' },\n { iso2: 'ZM', dialCode: '+260', label: 'Zambia' },\n { iso2: 'MG', dialCode: '+261', label: 'Madagascar' },\n { iso2: 'RE', dialCode: '+262', label: 'R\u00E9union' },\n { iso2: 'YT', dialCode: '+262', label: 'Mayotte' },\n { iso2: 'ZW', dialCode: '+263', label: 'Zimbabwe' },\n { iso2: 'NA', dialCode: '+264', label: 'Namibia' },\n { iso2: 'MW', dialCode: '+265', label: 'Malawi' },\n { iso2: 'LS', dialCode: '+266', label: 'Lesotho' },\n { iso2: 'BW', dialCode: '+267', label: 'Botswana' },\n { iso2: 'SZ', dialCode: '+268', label: 'Eswatini' },\n { iso2: 'KM', dialCode: '+269', label: 'Comoros' },\n { iso2: 'ZA', dialCode: '+27', label: 'South Africa' },\n { iso2: 'SH', dialCode: '+290', label: 'Saint Helena' },\n { iso2: 'ER', dialCode: '+291', label: 'Eritrea' },\n { iso2: 'AW', dialCode: '+297', label: 'Aruba' },\n { iso2: 'FO', dialCode: '+298', label: 'Faroe Islands' },\n { iso2: 'GL', dialCode: '+299', label: 'Greenland' },\n { iso2: 'GR', dialCode: '+30', label: 'Greece' },\n { iso2: 'NL', dialCode: '+31', label: 'Netherlands' },\n { iso2: 'BE', dialCode: '+32', label: 'Belgium' },\n { iso2: 'FR', dialCode: '+33', label: 'France' },\n { iso2: 'ES', dialCode: '+34', label: 'Spain' },\n { iso2: 'GI', dialCode: '+350', label: 'Gibraltar' },\n { iso2: 'PT', dialCode: '+351', label: 'Portugal' },\n { iso2: 'LU', dialCode: '+352', label: 'Luxembourg' },\n { iso2: 'IE', dialCode: '+353', label: 'Ireland' },\n { iso2: 'IS', dialCode: '+354', label: 'Iceland' },\n { iso2: 'AL', dialCode: '+355', label: 'Albania' },\n { iso2: 'MT', dialCode: '+356', label: 'Malta' },\n { iso2: 'CY', dialCode: '+357', label: 'Cyprus' },\n { iso2: 'FI', dialCode: '+358', label: 'Finland' },\n { iso2: 'AX', dialCode: '+358', label: '\u00C5land Islands' },\n { iso2: 'BG', dialCode: '+359', label: 'Bulgaria' },\n { iso2: 'HU', dialCode: '+36', label: 'Hungary' },\n { iso2: 'LT', dialCode: '+370', label: 'Lithuania' },\n { iso2: 'LV', dialCode: '+371', label: 'Latvia' },\n { iso2: 'EE', dialCode: '+372', label: 'Estonia' },\n { iso2: 'MD', dialCode: '+373', label: 'Moldova' },\n { iso2: 'AM', dialCode: '+374', label: 'Armenia' },\n { iso2: 'BY', dialCode: '+375', label: 'Belarus' },\n { iso2: 'AD', dialCode: '+376', label: 'Andorra' },\n { iso2: 'MC', dialCode: '+377', label: 'Monaco' },\n { iso2: 'SM', dialCode: '+378', label: 'San Marino' },\n { iso2: 'VA', dialCode: '+379', label: 'Vatican City' },\n { iso2: 'UA', dialCode: '+380', label: 'Ukraine' },\n { iso2: 'RS', dialCode: '+381', label: 'Serbia' },\n { iso2: 'ME', dialCode: '+382', label: 'Montenegro' },\n { iso2: 'XK', dialCode: '+383', label: 'Kosovo' },\n { iso2: 'HR', dialCode: '+385', label: 'Croatia' },\n { iso2: 'SI', dialCode: '+386', label: 'Slovenia' },\n { iso2: 'BA', dialCode: '+387', label: 'Bosnia and Herzegovina' },\n { iso2: 'MK', dialCode: '+389', label: 'North Macedonia' },\n { iso2: 'IT', dialCode: '+39', label: 'Italy' },\n { iso2: 'RO', dialCode: '+40', label: 'Romania' },\n { iso2: 'CH', dialCode: '+41', label: 'Switzerland' },\n { iso2: 'CZ', dialCode: '+420', label: 'Czechia' },\n { iso2: 'SK', dialCode: '+421', label: 'Slovakia' },\n { iso2: 'LI', dialCode: '+423', label: 'Liechtenstein' },\n { iso2: 'AT', dialCode: '+43', label: 'Austria' },\n { iso2: 'GB', dialCode: '+44', label: 'United Kingdom' },\n { iso2: 'GG', dialCode: '+44', label: 'Guernsey' },\n { iso2: 'JE', dialCode: '+44', label: 'Jersey' },\n { iso2: 'IM', dialCode: '+44', label: 'Isle of Man' },\n { iso2: 'DK', dialCode: '+45', label: 'Denmark' },\n { iso2: 'SE', dialCode: '+46', label: 'Sweden' },\n { iso2: 'NO', dialCode: '+47', label: 'Norway' },\n { iso2: 'SJ', dialCode: '+47', label: 'Svalbard and Jan Mayen' },\n { iso2: 'PL', dialCode: '+48', label: 'Poland' },\n { iso2: 'DE', dialCode: '+49', label: 'Germany' },\n { iso2: 'FK', dialCode: '+500', label: 'Falkland Islands' },\n { iso2: 'BZ', dialCode: '+501', label: 'Belize' },\n { iso2: 'GT', dialCode: '+502', label: 'Guatemala' },\n { iso2: 'SV', dialCode: '+503', label: 'El Salvador' },\n { iso2: 'HN', dialCode: '+504', label: 'Honduras' },\n { iso2: 'NI', dialCode: '+505', label: 'Nicaragua' },\n { iso2: 'CR', dialCode: '+506', label: 'Costa Rica' },\n { iso2: 'PA', dialCode: '+507', label: 'Panama' },\n { iso2: 'PM', dialCode: '+508', label: 'Saint Pierre and Miquelon' },\n { iso2: 'HT', dialCode: '+509', label: 'Haiti' },\n { iso2: 'PE', dialCode: '+51', label: 'Peru' },\n { iso2: 'MX', dialCode: '+52', label: 'Mexico' },\n { iso2: 'CU', dialCode: '+53', label: 'Cuba' },\n { iso2: 'AR', dialCode: '+54', label: 'Argentina' },\n { iso2: 'BR', dialCode: '+55', label: 'Brazil' },\n { iso2: 'CL', dialCode: '+56', label: 'Chile' },\n { iso2: 'CO', dialCode: '+57', label: 'Colombia' },\n { iso2: 'VE', dialCode: '+58', label: 'Venezuela' },\n { iso2: 'GP', dialCode: '+590', label: 'Guadeloupe' },\n { iso2: 'BL', dialCode: '+590', label: 'Saint Barth\u00E9lemy' },\n { iso2: 'MF', dialCode: '+590', label: 'Saint Martin' },\n { iso2: 'BO', dialCode: '+591', label: 'Bolivia' },\n { iso2: 'GY', dialCode: '+592', label: 'Guyana' },\n { iso2: 'EC', dialCode: '+593', label: 'Ecuador' },\n { iso2: 'GF', dialCode: '+594', label: 'French Guiana' },\n { iso2: 'PY', dialCode: '+595', label: 'Paraguay' },\n { iso2: 'MQ', dialCode: '+596', label: 'Martinique' },\n { iso2: 'SR', dialCode: '+597', label: 'Suriname' },\n { iso2: 'UY', dialCode: '+598', label: 'Uruguay' },\n { iso2: 'CW', dialCode: '+599', label: 'Cura\u00E7ao' },\n { iso2: 'BQ', dialCode: '+599', label: 'Caribbean Netherlands' },\n { iso2: 'MY', dialCode: '+60', label: 'Malaysia' },\n { iso2: 'AU', dialCode: '+61', label: 'Australia' },\n { iso2: 'CX', dialCode: '+61', label: 'Christmas Island' },\n { iso2: 'CC', dialCode: '+61', label: 'Cocos (Keeling) Islands' },\n { iso2: 'ID', dialCode: '+62', label: 'Indonesia' },\n { iso2: 'PH', dialCode: '+63', label: 'Philippines' },\n { iso2: 'NZ', dialCode: '+64', label: 'New Zealand' },\n { iso2: 'SG', dialCode: '+65', label: 'Singapore' },\n { iso2: 'TH', dialCode: '+66', label: 'Thailand' },\n { iso2: 'TL', dialCode: '+670', label: 'Timor-Leste' },\n { iso2: 'NF', dialCode: '+672', label: 'Norfolk Island' },\n { iso2: 'BN', dialCode: '+673', label: 'Brunei' },\n { iso2: 'NR', dialCode: '+674', label: 'Nauru' },\n { iso2: 'PG', dialCode: '+675', label: 'Papua New Guinea' },\n { iso2: 'TO', dialCode: '+676', label: 'Tonga' },\n { iso2: 'SB', dialCode: '+677', label: 'Solomon Islands' },\n { iso2: 'VU', dialCode: '+678', label: 'Vanuatu' },\n { iso2: 'FJ', dialCode: '+679', label: 'Fiji' },\n { iso2: 'PW', dialCode: '+680', label: 'Palau' },\n { iso2: 'WF', dialCode: '+681', label: 'Wallis and Futuna' },\n { iso2: 'CK', dialCode: '+682', label: 'Cook Islands' },\n { iso2: 'NU', dialCode: '+683', label: 'Niue' },\n { iso2: 'WS', dialCode: '+685', label: 'Samoa' },\n { iso2: 'KI', dialCode: '+686', label: 'Kiribati' },\n { iso2: 'NC', dialCode: '+687', label: 'New Caledonia' },\n { iso2: 'TV', dialCode: '+688', label: 'Tuvalu' },\n { iso2: 'PF', dialCode: '+689', label: 'French Polynesia' },\n { iso2: 'TK', dialCode: '+690', label: 'Tokelau' },\n { iso2: 'FM', dialCode: '+691', label: 'Micronesia' },\n { iso2: 'MH', dialCode: '+692', label: 'Marshall Islands' },\n { iso2: 'RU', dialCode: '+7', label: 'Russia' },\n { iso2: 'KZ', dialCode: '+7', label: 'Kazakhstan' },\n { iso2: 'JP', dialCode: '+81', label: 'Japan' },\n { iso2: 'KR', dialCode: '+82', label: 'South Korea' },\n { iso2: 'VN', dialCode: '+84', label: 'Vietnam' },\n { iso2: 'KP', dialCode: '+850', label: 'North Korea' },\n { iso2: 'HK', dialCode: '+852', label: 'Hong Kong' },\n { iso2: 'MO', dialCode: '+853', label: 'Macau' },\n { iso2: 'KH', dialCode: '+855', label: 'Cambodia' },\n { iso2: 'LA', dialCode: '+856', label: 'Laos' },\n { iso2: 'CN', dialCode: '+86', label: 'China' },\n { iso2: 'BD', dialCode: '+880', label: 'Bangladesh' },\n { iso2: 'TW', dialCode: '+886', label: 'Taiwan' },\n { iso2: 'TR', dialCode: '+90', label: 'Turkey' },\n { iso2: 'IN', dialCode: '+91', label: 'India' },\n { iso2: 'PK', dialCode: '+92', label: 'Pakistan' },\n { iso2: 'AF', dialCode: '+93', label: 'Afghanistan' },\n { iso2: 'LK', dialCode: '+94', label: 'Sri Lanka' },\n { iso2: 'MM', dialCode: '+95', label: 'Myanmar' },\n { iso2: 'MV', dialCode: '+960', label: 'Maldives' },\n { iso2: 'LB', dialCode: '+961', label: 'Lebanon' },\n { iso2: 'JO', dialCode: '+962', label: 'Jordan' },\n { iso2: 'SY', dialCode: '+963', label: 'Syria' },\n { iso2: 'IQ', dialCode: '+964', label: 'Iraq' },\n { iso2: 'KW', dialCode: '+965', label: 'Kuwait' },\n { iso2: 'SA', dialCode: '+966', label: 'Saudi Arabia' },\n { iso2: 'YE', dialCode: '+967', label: 'Yemen' },\n { iso2: 'OM', dialCode: '+968', label: 'Oman' },\n { iso2: 'PS', dialCode: '+970', label: 'Palestine' },\n { iso2: 'AE', dialCode: '+971', label: 'United Arab Emirates' },\n { iso2: 'IL', dialCode: '+972', label: 'Israel' },\n { iso2: 'BH', dialCode: '+973', label: 'Bahrain' },\n { iso2: 'QA', dialCode: '+974', label: 'Qatar' },\n { iso2: 'BT', dialCode: '+975', label: 'Bhutan' },\n { iso2: 'MN', dialCode: '+976', label: 'Mongolia' },\n { iso2: 'NP', dialCode: '+977', label: 'Nepal' },\n { iso2: 'TJ', dialCode: '+992', label: 'Tajikistan' },\n { iso2: 'TM', dialCode: '+993', label: 'Turkmenistan' },\n { iso2: 'AZ', dialCode: '+994', label: 'Azerbaijan' },\n { iso2: 'GE', dialCode: '+995', label: 'Georgia' },\n { iso2: 'KG', dialCode: '+996', label: 'Kyrgyzstan' },\n { iso2: 'UZ', dialCode: '+998', label: 'Uzbekistan' },\n { iso2: 'IR', dialCode: '+98', label: 'Iran' },\n]\n\nexport const PHONE_COUNTRIES: PhoneCountry[] = RAW_PHONE_COUNTRIES\n .map((country) => ({ ...country, flag: iso2ToFlagEmoji(country.iso2) }))\n .sort((a, b) => a.label.localeCompare(b.label, 'en', { sensitivity: 'base' }))\n\n/**\n * Sovereign/primary country that wins auto-detection for a calling code shared\n * by several territories. US vs. Canada is the one irreducible ambiguity \u2014 both\n * are `+1` \u2014 and it resolves to the US.\n */\nconst PRIMARY_DIAL_OWNERS: Record<string, string> = {\n '+1': 'US',\n '+7': 'RU',\n '+44': 'GB',\n '+47': 'NO',\n '+61': 'AU',\n '+212': 'MA',\n '+262': 'RE',\n '+358': 'FI',\n '+590': 'GP',\n '+599': 'CW',\n}\n\nconst DEFAULT_COUNTRY =\n PHONE_COUNTRIES.find((country) => country.iso2 === 'US') ?? PHONE_COUNTRIES[0]\n\n// Match longer prefixes first (e.g. `+1242` before `+1`); for equal-length codes\n// shared by several territories, prefer the sovereign in `PRIMARY_DIAL_OWNERS`.\nconst COUNTRIES_BY_DIAL_LENGTH = [...PHONE_COUNTRIES].sort((a, b) => {\n if (b.dialCode.length !== a.dialCode.length) return b.dialCode.length - a.dialCode.length\n const aPrimary = PRIMARY_DIAL_OWNERS[a.dialCode] === a.iso2 ? 0 : 1\n const bPrimary = PRIMARY_DIAL_OWNERS[b.dialCode] === b.iso2 ? 0 : 1\n return aPrimary - bPrimary\n})\n\nfunction findCountryByIso(iso2: string): PhoneCountry | undefined {\n return PHONE_COUNTRIES.find((c) => c.iso2 === iso2)\n}\n\nfunction parseCountryFromValue(value: string | null | undefined): PhoneCountry | null {\n if (!value) return null\n const trimmed = value.trim()\n if (!trimmed.startsWith('+')) return null\n for (const country of COUNTRIES_BY_DIAL_LENGTH) {\n if (trimmed.startsWith(country.dialCode)) return country\n }\n return null\n}\n\nfunction extractLocalNumber(value: string | null | undefined, dialCode: string): string {\n if (!value) return ''\n const trimmed = value.trim()\n if (!trimmed.startsWith(dialCode)) return trimmed\n return trimmed.slice(dialCode.length).trim()\n}\n\nfunction composeValue(country: PhoneCountry, localNumber: string): string {\n const trimmed = localNumber.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('+')) return trimmed\n return `${country.dialCode} ${trimmed}`\n}\n\nexport type PhoneNumberFieldProps = {\n id?: string\n value?: string | null\n onValueChange: (next: string | undefined) => void\n onDigitsChange?: (digits: string | null) => void\n externalError?: string | null\n disabled?: boolean\n autoFocus?: boolean\n ariaLabel?: string\n ariaDescribedBy?: string\n placeholder?: string\n minDigits?: number\n checkingLabel?: string\n duplicateLabel?: (match: PhoneDuplicateMatch) => string\n duplicateLinkLabel?: string\n invalidLabel?: string\n onDuplicateLookup?: (normalizedValue: string) => Promise<PhoneDuplicateMatch | null>\n /** Override the static country list (e.g. limit to specific markets). */\n countries?: PhoneCountry[]\n /** Initial country shown when `value` is empty / unparseable. Defaults to US. */\n defaultCountryIso2?: string\n}\n\nconst DEFAULT_MIN_DIGITS = 6\nconst DEFAULT_PLACEHOLDER = '(555) 000-0000'\n\nexport function PhoneNumberField({\n id,\n value,\n onValueChange,\n onDigitsChange,\n externalError,\n disabled = false,\n autoFocus,\n ariaLabel,\n ariaDescribedBy,\n placeholder,\n minDigits = DEFAULT_MIN_DIGITS,\n checkingLabel,\n duplicateLabel,\n duplicateLinkLabel,\n invalidLabel,\n onDuplicateLookup,\n countries: countriesProp,\n defaultCountryIso2,\n}: PhoneNumberFieldProps) {\n const t = useT()\n const resolvedInvalidLabel = invalidLabel ?? t(\n 'ui.inputs.phoneNumberField.invalid',\n 'Enter a valid phone number with country code (e.g. +1 212 555 1234)'\n )\n const resolvedCheckingLabel = checkingLabel ?? t(\n 'ui.inputs.phoneNumberField.checking',\n 'Checking for duplicates\u2026'\n )\n const resolvedDuplicateLinkLabel = duplicateLinkLabel ?? t(\n 'ui.inputs.phoneNumberField.duplicateLink',\n 'Open record'\n )\n const resolvedPlaceholder = placeholder ?? DEFAULT_PLACEHOLDER\n const countries = countriesProp ?? PHONE_COUNTRIES\n const fallbackCountry = React.useMemo(\n () => (defaultCountryIso2 && findCountryByIso(defaultCountryIso2)) || DEFAULT_COUNTRY,\n [defaultCountryIso2],\n )\n\n const initialCountry = React.useMemo(\n () => parseCountryFromValue(value) ?? fallbackCountry,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n )\n const [country, setCountry] = React.useState<PhoneCountry>(initialCountry)\n const [localNumber, setLocalNumber] = React.useState<string>(() =>\n extractLocalNumber(value, initialCountry.dialCode),\n )\n const [duplicate, setDuplicate] = React.useState<PhoneDuplicateMatch | null>(null)\n const [checking, setChecking] = React.useState(false)\n const [validationHint, setValidationHint] = React.useState<string | null>(null)\n const [focused, setFocused] = React.useState(false)\n const userEditingRef = React.useRef(false)\n\n const externalFieldError = externalError && externalError.trim().length > 0 ? externalError : null\n const errorMessage = externalFieldError ?? validationHint\n const errorId = errorMessage && id ? `${id}-error` : undefined\n const describedBy = [ariaDescribedBy, errorId].filter((part): part is string => Boolean(part)).join(' ') || undefined\n const composedValue = composeValue(country, localNumber)\n\n // Sync local state when `value` updates externally and the user is not editing.\n React.useEffect(() => {\n if (userEditingRef.current) return\n if (value == null || value === '') {\n setLocalNumber('')\n onDigitsChange?.(null)\n return\n }\n const parsed = parseCountryFromValue(value)\n if (parsed) setCountry(parsed)\n const next = extractLocalNumber(value, parsed?.dialCode ?? country.dialCode)\n setLocalNumber(next)\n onDigitsChange?.(extractPhoneDigits(String(value)) || null)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value])\n\n // Debounced duplicate lookup.\n React.useEffect(() => {\n if (!onDuplicateLookup || disabled) {\n setDuplicate(null)\n setChecking(false)\n return\n }\n const digits = extractPhoneDigits(composedValue)\n if (!digits || digits.length < minDigits) {\n setDuplicate(null)\n setChecking(false)\n return\n }\n\n let cancelled = false\n setChecking(true)\n const handle = window.setTimeout(async () => {\n try {\n const match = await onDuplicateLookup(digits)\n if (!cancelled) setDuplicate(match)\n } catch {\n if (!cancelled) setDuplicate(null)\n } finally {\n if (!cancelled) setChecking(false)\n }\n }, 350)\n\n return () => {\n cancelled = true\n window.clearTimeout(handle)\n }\n }, [composedValue, disabled, minDigits, onDuplicateLookup])\n\n const emit = React.useCallback(\n (nextCountry: PhoneCountry, nextLocal: string) => {\n const composed = composeValue(nextCountry, nextLocal)\n onValueChange(composed.length ? composed : undefined)\n onDigitsChange?.(extractPhoneDigits(composed) || null)\n },\n [onDigitsChange, onValueChange],\n )\n\n const handleCountryChange = React.useCallback(\n (iso2: string) => {\n const next = findCountryByIso(iso2)\n if (!next) return\n userEditingRef.current = true\n setCountry(next)\n setValidationHint(null)\n emit(next, localNumber)\n },\n [emit, localNumber],\n )\n\n const handleLocalChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const next = event.target.value\n userEditingRef.current = true\n setLocalNumber(next)\n setValidationHint(null)\n emit(country, next)\n },\n [country, emit],\n )\n\n const handleBlur = React.useCallback(() => {\n userEditingRef.current = false\n setFocused(false)\n const trimmed = localNumber.trim()\n if (!trimmed) {\n setLocalNumber('')\n setValidationHint(null)\n onValueChange(undefined)\n onDigitsChange?.(null)\n return\n }\n const composed = composeValue(country, trimmed)\n const result = validatePhoneNumber(composed)\n if (result.valid) {\n const normalizedLocal = extractLocalNumber(result.normalized ?? composed, country.dialCode)\n setLocalNumber(normalizedLocal)\n setValidationHint(null)\n onValueChange(result.normalized || undefined)\n onDigitsChange?.(result.digits || null)\n } else {\n setValidationHint(resolvedInvalidLabel)\n onValueChange(composed)\n onDigitsChange?.(result.digits || null)\n }\n }, [country, localNumber, onDigitsChange, onValueChange, resolvedInvalidLabel])\n\n const containerErrorBorder = errorMessage ? 'border-status-error-icon' : 'border-input'\n const containerFocusBorder = errorMessage\n ? 'border-status-error-icon shadow-focus'\n : 'border-brand-violet shadow-focus'\n\n return (\n <div className=\"space-y-2\">\n <div\n className={cn(\n 'flex items-stretch w-full rounded-md border bg-background shadow-xs transition-colors',\n disabled\n ? 'bg-bg-disabled border-border-disabled cursor-not-allowed'\n : focused\n ? containerFocusBorder\n : `${containerErrorBorder} hover:border-foreground/30`,\n )}\n aria-invalid={errorMessage ? 'true' : undefined}\n >\n <Select value={country.iso2} onValueChange={handleCountryChange} disabled={disabled}>\n <SelectTrigger\n aria-label={ariaLabel ? `${ariaLabel} country` : 'Country code'}\n className={cn(\n 'h-auto w-auto shrink-0 gap-1.5 rounded-none rounded-l-md border-0 bg-transparent px-2.5 py-2 shadow-none',\n 'hover:bg-muted/40 focus:bg-muted/40 focus-visible:shadow-none focus-visible:border-0',\n 'disabled:bg-transparent disabled:hover:bg-transparent',\n )}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n <span className=\"text-base leading-none\" aria-hidden=\"true\">{country.flag}</span>\n <span className=\"text-sm text-foreground tabular-nums\">{country.dialCode}</span>\n </SelectTrigger>\n <SelectContent align=\"start\">\n {countries.map((c) => (\n <SelectItem key={`${c.iso2}-${c.dialCode}`} value={c.iso2}>\n <SelectItemLeading>\n <span className=\"text-base leading-none\">{c.flag}</span>\n </SelectItemLeading>\n <span className=\"flex-1 truncate\">{c.label}</span>\n <span className=\"ml-2 text-xs text-muted-foreground tabular-nums\">{c.dialCode}</span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div aria-hidden=\"true\" className=\"w-px self-stretch bg-input\" />\n <input\n type=\"tel\"\n inputMode=\"tel\"\n autoComplete=\"tel-national\"\n value={localNumber}\n onChange={handleLocalChange}\n onBlur={handleBlur}\n onFocus={() => setFocused(true)}\n placeholder={resolvedPlaceholder}\n autoFocus={autoFocus}\n disabled={disabled}\n id={id}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={errorMessage ? 'true' : undefined}\n data-crud-focus-target=\"\"\n className={cn(\n 'flex-1 min-w-0 bg-transparent px-3 py-2 text-sm leading-5 outline-none',\n 'placeholder:text-muted-foreground',\n 'disabled:cursor-not-allowed disabled:text-muted-foreground',\n )}\n />\n </div>\n {errorMessage ? (\n <p id={errorId} role=\"alert\" className=\"text-xs text-status-error-text\">{errorMessage}</p>\n ) : null}\n {!disabled && duplicate && duplicateLabel ? (\n <p className=\"text-xs text-status-warning-text\">\n {duplicateLabel(duplicate)}{' '}\n <a className=\"font-medium text-brand-violet underline underline-offset-2\" href={duplicate.href}>\n {resolvedDuplicateLinkLabel}\n </a>\n </p>\n ) : null}\n {!disabled && !duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{resolvedCheckingLabel}</p>\n ) : null}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }