@open-mercato/ui 0.6.7-develop.6661.1.0043ed1d03 → 0.6.7-develop.6670.1.4efa7961c6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -2
- package/dist/backend/DataTable.js +9 -7
- package/dist/backend/DataTable.js.map +2 -2
- package/dist/backend/fields/phone.js +65 -0
- package/dist/backend/fields/phone.js.map +7 -0
- package/dist/backend/fields/registry.generated.js +1 -0
- package/dist/backend/fields/registry.generated.js.map +2 -2
- package/dist/backend/icons/lucideRegistry.generated.js +8 -0
- package/dist/backend/icons/lucideRegistry.generated.js.map +2 -2
- package/dist/backend/inputs/PhoneNumberField.js +273 -21
- package/dist/backend/inputs/PhoneNumberField.js.map +2 -2
- package/dist/backend/utils/api.js +4 -2
- package/dist/backend/utils/api.js.map +2 -2
- package/dist/backend/utils/customFieldDefs.js.map +2 -2
- package/package.json +3 -3
- package/src/backend/DataTable.tsx +18 -12
- package/src/backend/__tests__/custom-field-columns.test.ts +28 -0
- package/src/backend/__tests__/custom-field-filters.test.ts +3 -0
- package/src/backend/__tests__/custom-field-forms.test.ts +4 -0
- package/src/backend/fields/__tests__/phone.test.tsx +99 -0
- package/src/backend/fields/phone.tsx +98 -0
- package/src/backend/fields/registry.generated.ts +1 -0
- package/src/backend/icons/lucideRegistry.generated.tsx +8 -0
- package/src/backend/inputs/PhoneNumberField.tsx +307 -26
- package/src/backend/inputs/__tests__/PhoneNumberField.test.tsx +71 -1
- package/src/backend/utils/__tests__/api.test.ts +14 -0
- package/src/backend/utils/api.ts +12 -2
- package/src/backend/utils/customFieldDefs.ts +2 -0
|
@@ -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,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
|
}
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
Book,
|
|
17
17
|
Bookmark,
|
|
18
18
|
Box,
|
|
19
|
+
Boxes,
|
|
19
20
|
Briefcase,
|
|
20
21
|
BriefcaseBusiness,
|
|
21
22
|
Building,
|
|
@@ -79,12 +80,14 @@ import {
|
|
|
79
80
|
Mail,
|
|
80
81
|
MailOpen,
|
|
81
82
|
MapPin,
|
|
83
|
+
MapPinned,
|
|
82
84
|
MessageCircle,
|
|
83
85
|
MinusCircle,
|
|
84
86
|
Notebook,
|
|
85
87
|
Package,
|
|
86
88
|
PackageCheck,
|
|
87
89
|
PackagePlus,
|
|
90
|
+
PackageSearch,
|
|
88
91
|
PackageX,
|
|
89
92
|
PauseCircle,
|
|
90
93
|
Percent,
|
|
@@ -136,6 +139,7 @@ import {
|
|
|
136
139
|
Users,
|
|
137
140
|
UserX,
|
|
138
141
|
Wallet,
|
|
142
|
+
Warehouse,
|
|
139
143
|
Webhook,
|
|
140
144
|
Workflow,
|
|
141
145
|
Wrench,
|
|
@@ -159,6 +163,7 @@ const LUCIDE_ICON_REGISTRY = {
|
|
|
159
163
|
"book": Book,
|
|
160
164
|
"bookmark": Bookmark,
|
|
161
165
|
"box": Box,
|
|
166
|
+
"boxes": Boxes,
|
|
162
167
|
"briefcase": Briefcase,
|
|
163
168
|
"briefcase-business": BriefcaseBusiness,
|
|
164
169
|
"building": Building,
|
|
@@ -222,12 +227,14 @@ const LUCIDE_ICON_REGISTRY = {
|
|
|
222
227
|
"mail": Mail,
|
|
223
228
|
"mail-open": MailOpen,
|
|
224
229
|
"map-pin": MapPin,
|
|
230
|
+
"map-pinned": MapPinned,
|
|
225
231
|
"message-circle": MessageCircle,
|
|
226
232
|
"minus-circle": MinusCircle,
|
|
227
233
|
"notebook": Notebook,
|
|
228
234
|
"package": Package,
|
|
229
235
|
"package-check": PackageCheck,
|
|
230
236
|
"package-plus": PackagePlus,
|
|
237
|
+
"package-search": PackageSearch,
|
|
231
238
|
"package-x": PackageX,
|
|
232
239
|
"pause-circle": PauseCircle,
|
|
233
240
|
"percent": Percent,
|
|
@@ -279,6 +286,7 @@ const LUCIDE_ICON_REGISTRY = {
|
|
|
279
286
|
"user-x": UserX,
|
|
280
287
|
"users": Users,
|
|
281
288
|
"wallet": Wallet,
|
|
289
|
+
"warehouse": Warehouse,
|
|
282
290
|
"webhook": Webhook,
|
|
283
291
|
"workflow": Workflow,
|
|
284
292
|
"wrench": Wrench,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/backend/icons/lucideRegistry.generated.tsx"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n// AUTO-GENERATED by @open-mercato/ui build. Do not edit by hand.\n// Generated from discovered icon string usages across the repo.\n\nimport type * as React from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Activity,\n AlertCircle,\n AlertOctagon,\n AlertTriangle,\n Archive,\n Award,\n BadgeCheck,\n Ban,\n Banknote,\n BarChart2,\n BarChart3,\n Bell,\n Bolt,\n Book,\n Bookmark,\n Box,\n Briefcase,\n BriefcaseBusiness,\n Building,\n Building2,\n Calendar,\n CalendarCheck,\n CalendarClock,\n CalendarCog,\n CalendarMinus,\n CalendarOff,\n CalendarX,\n Check,\n CheckCircle,\n CheckCircle2,\n CheckSquare,\n Circle,\n ClipboardCheck,\n ClipboardList,\n Clock,\n Clock3,\n Coins,\n Copy,\n CreditCard,\n Crown,\n Database,\n DollarSign,\n Download,\n ExternalLink,\n Eye,\n FileMinus,\n FilePenLine,\n FileSpreadsheet,\n FileText,\n FilterX,\n Flag,\n Flame,\n FolderTree,\n Gauge,\n GitBranch,\n GitCompareArrows,\n GitPullRequestArrow,\n Globe,\n GraduationCap,\n Hand,\n Handshake,\n Headphones,\n Heart,\n HelpCircle,\n Hourglass,\n Inbox,\n Key,\n KeyRound,\n Layers,\n Lightbulb,\n LineChart,\n Link,\n List,\n Loader,\n Loader2,\n Lock,\n Mail,\n MailOpen,\n MapPin,\n MessageCircle,\n MinusCircle,\n Notebook,\n Package,\n PackageCheck,\n PackagePlus,\n PackageX,\n PauseCircle,\n Percent,\n Phone,\n PhoneCall,\n PieChart,\n PlusSquare,\n Receipt,\n ReceiptText,\n RefreshCcw,\n RefreshCw,\n Reply,\n RotateCcw,\n Ruler,\n Send,\n Settings,\n Shapes,\n Share2,\n Shield,\n ShieldAlert,\n ShieldCheck,\n ShoppingBag,\n ShoppingCart,\n Shuffle,\n Sliders,\n Smartphone,\n Snowflake,\n Sparkles,\n Star,\n StickyNote,\n Store,\n Tag,\n Target,\n ThumbsUp,\n Ticket,\n Timer,\n Trash2,\n TrendingUp,\n TriangleAlert,\n Trophy,\n Truck,\n Undo2,\n Unlock,\n User,\n UserCheck,\n UserMinus,\n UserPlus,\n UserRound,\n Users,\n UserX,\n Wallet,\n Webhook,\n Workflow,\n Wrench,\n X,\n XCircle,\n} from 'lucide-react'\n\nexport const LUCIDE_ICON_REGISTRY: Record<string, LucideIcon> = {\n 'activity': Activity,\n 'alert-circle': AlertCircle,\n 'alert-octagon': AlertOctagon,\n 'alert-triangle': AlertTriangle,\n 'archive': Archive,\n 'award': Award,\n 'badge-check': BadgeCheck,\n 'ban': Ban,\n 'banknote': Banknote,\n 'bar-chart-2': BarChart2,\n 'bar-chart-3': BarChart3,\n 'bell': Bell,\n 'bolt': Bolt,\n 'book': Book,\n 'bookmark': Bookmark,\n 'box': Box,\n 'briefcase': Briefcase,\n 'briefcase-business': BriefcaseBusiness,\n 'building': Building,\n 'building2': Building2,\n 'calendar': Calendar,\n 'calendar-check': CalendarCheck,\n 'calendar-clock': CalendarClock,\n 'calendar-cog': CalendarCog,\n 'calendar-minus': CalendarMinus,\n 'calendar-off': CalendarOff,\n 'calendar-x': CalendarX,\n 'check': Check,\n 'check-circle': CheckCircle,\n 'check-circle-2': CheckCircle2,\n 'check-square': CheckSquare,\n 'circle': Circle,\n 'clipboard-check': ClipboardCheck,\n 'clipboard-list': ClipboardList,\n 'clock': Clock,\n 'clock-3': Clock3,\n 'coins': Coins,\n 'copy': Copy,\n 'credit-card': CreditCard,\n 'crown': Crown,\n 'database': Database,\n 'dollar-sign': DollarSign,\n 'download': Download,\n 'external-link': ExternalLink,\n 'eye': Eye,\n 'file-minus': FileMinus,\n 'file-pen-line': FilePenLine,\n 'file-spreadsheet': FileSpreadsheet,\n 'file-text': FileText,\n 'filter-x': FilterX,\n 'flag': Flag,\n 'flame': Flame,\n 'folder-tree': FolderTree,\n 'gauge': Gauge,\n 'git-branch': GitBranch,\n 'git-compare-arrows': GitCompareArrows,\n 'git-pull-request-arrow': GitPullRequestArrow,\n 'globe': Globe,\n 'graduation-cap': GraduationCap,\n 'hand': Hand,\n 'handshake': Handshake,\n 'headphones': Headphones,\n 'heart': Heart,\n 'help-circle': HelpCircle,\n 'hourglass': Hourglass,\n 'inbox': Inbox,\n 'key': Key,\n 'key-round': KeyRound,\n 'layers': Layers,\n 'lightbulb': Lightbulb,\n 'line-chart': LineChart,\n 'link': Link,\n 'list': List,\n 'loader': Loader,\n 'loader-2': Loader2,\n 'lock': Lock,\n 'mail': Mail,\n 'mail-open': MailOpen,\n 'map-pin': MapPin,\n 'message-circle': MessageCircle,\n 'minus-circle': MinusCircle,\n 'notebook': Notebook,\n 'package': Package,\n 'package-check': PackageCheck,\n 'package-plus': PackagePlus,\n 'package-x': PackageX,\n 'pause-circle': PauseCircle,\n 'percent': Percent,\n 'phone': Phone,\n 'phone-call': PhoneCall,\n 'pie-chart': PieChart,\n 'plus-square': PlusSquare,\n 'receipt': Receipt,\n 'receipt-text': ReceiptText,\n 'refresh-ccw': RefreshCcw,\n 'refresh-cw': RefreshCw,\n 'reply': Reply,\n 'rotate-ccw': RotateCcw,\n 'ruler': Ruler,\n 'send': Send,\n 'settings': Settings,\n 'shapes': Shapes,\n 'share-2': Share2,\n 'shield': Shield,\n 'shield-alert': ShieldAlert,\n 'shield-check': ShieldCheck,\n 'shopping-bag': ShoppingBag,\n 'shopping-cart': ShoppingCart,\n 'shuffle': Shuffle,\n 'sliders': Sliders,\n 'smartphone': Smartphone,\n 'snowflake': Snowflake,\n 'sparkles': Sparkles,\n 'star': Star,\n 'sticky-note': StickyNote,\n 'store': Store,\n 'tag': Tag,\n 'target': Target,\n 'thumbs-up': ThumbsUp,\n 'ticket': Ticket,\n 'timer': Timer,\n 'trash-2': Trash2,\n 'trending-up': TrendingUp,\n 'triangle-alert': TriangleAlert,\n 'trophy': Trophy,\n 'truck': Truck,\n 'undo-2': Undo2,\n 'unlock': Unlock,\n 'user': User,\n 'user-check': UserCheck,\n 'user-minus': UserMinus,\n 'user-plus': UserPlus,\n 'user-round': UserRound,\n 'user-x': UserX,\n 'users': Users,\n 'wallet': Wallet,\n 'webhook': Webhook,\n 'workflow': Workflow,\n 'wrench': Wrench,\n 'x': X,\n 'x-circle': XCircle,\n}\n\nfunction normalizeKebabIconName(input: string): string {\n const trimmed = input.trim()\n if (!trimmed) return ''\n const withoutPrefix = trimmed.startsWith('lucide:') ? trimmed.slice('lucide:'.length) : trimmed\n if (!withoutPrefix) return ''\n if (!withoutPrefix.includes('-') && !withoutPrefix.includes('_') && !withoutPrefix.includes(' ') && /[A-Z]/.test(withoutPrefix)) {\n return withoutPrefix\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n }\n return withoutPrefix\n .replace(/[_\\s]+/g, '-')\n .replace(/-+/g, '-')\n .toLowerCase()\n}\n\nexport function resolveRegisteredLucideIcon(name: string | undefined): LucideIcon | null {\n if (!name) return null\n const normalized = normalizeKebabIconName(name)\n if (!normalized) return null\n return (LUCIDE_ICON_REGISTRY as Record<string, LucideIcon | undefined>)[normalized] ?? null\n}\n\nexport function resolveRegisteredLucideIconNode(\n name: string | undefined,\n className: string\n): React.ReactNode | null {\n const Icon = resolveRegisteredLucideIcon(name)\n if (!Icon) return null\n return <Icon className={className} />\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable */\n// AUTO-GENERATED by @open-mercato/ui build. Do not edit by hand.\n// Generated from discovered icon string usages across the repo.\n\nimport type * as React from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Activity,\n AlertCircle,\n AlertOctagon,\n AlertTriangle,\n Archive,\n Award,\n BadgeCheck,\n Ban,\n Banknote,\n BarChart2,\n BarChart3,\n Bell,\n Bolt,\n Book,\n Bookmark,\n Box,\n Boxes,\n Briefcase,\n BriefcaseBusiness,\n Building,\n Building2,\n Calendar,\n CalendarCheck,\n CalendarClock,\n CalendarCog,\n CalendarMinus,\n CalendarOff,\n CalendarX,\n Check,\n CheckCircle,\n CheckCircle2,\n CheckSquare,\n Circle,\n ClipboardCheck,\n ClipboardList,\n Clock,\n Clock3,\n Coins,\n Copy,\n CreditCard,\n Crown,\n Database,\n DollarSign,\n Download,\n ExternalLink,\n Eye,\n FileMinus,\n FilePenLine,\n FileSpreadsheet,\n FileText,\n FilterX,\n Flag,\n Flame,\n FolderTree,\n Gauge,\n GitBranch,\n GitCompareArrows,\n GitPullRequestArrow,\n Globe,\n GraduationCap,\n Hand,\n Handshake,\n Headphones,\n Heart,\n HelpCircle,\n Hourglass,\n Inbox,\n Key,\n KeyRound,\n Layers,\n Lightbulb,\n LineChart,\n Link,\n List,\n Loader,\n Loader2,\n Lock,\n Mail,\n MailOpen,\n MapPin,\n MapPinned,\n MessageCircle,\n MinusCircle,\n Notebook,\n Package,\n PackageCheck,\n PackagePlus,\n PackageSearch,\n PackageX,\n PauseCircle,\n Percent,\n Phone,\n PhoneCall,\n PieChart,\n PlusSquare,\n Receipt,\n ReceiptText,\n RefreshCcw,\n RefreshCw,\n Reply,\n RotateCcw,\n Ruler,\n Send,\n Settings,\n Shapes,\n Share2,\n Shield,\n ShieldAlert,\n ShieldCheck,\n ShoppingBag,\n ShoppingCart,\n Shuffle,\n Sliders,\n Smartphone,\n Snowflake,\n Sparkles,\n Star,\n StickyNote,\n Store,\n Tag,\n Target,\n ThumbsUp,\n Ticket,\n Timer,\n Trash2,\n TrendingUp,\n TriangleAlert,\n Trophy,\n Truck,\n Undo2,\n Unlock,\n User,\n UserCheck,\n UserMinus,\n UserPlus,\n UserRound,\n Users,\n UserX,\n Wallet,\n Warehouse,\n Webhook,\n Workflow,\n Wrench,\n X,\n XCircle,\n} from 'lucide-react'\n\nexport const LUCIDE_ICON_REGISTRY: Record<string, LucideIcon> = {\n 'activity': Activity,\n 'alert-circle': AlertCircle,\n 'alert-octagon': AlertOctagon,\n 'alert-triangle': AlertTriangle,\n 'archive': Archive,\n 'award': Award,\n 'badge-check': BadgeCheck,\n 'ban': Ban,\n 'banknote': Banknote,\n 'bar-chart-2': BarChart2,\n 'bar-chart-3': BarChart3,\n 'bell': Bell,\n 'bolt': Bolt,\n 'book': Book,\n 'bookmark': Bookmark,\n 'box': Box,\n 'boxes': Boxes,\n 'briefcase': Briefcase,\n 'briefcase-business': BriefcaseBusiness,\n 'building': Building,\n 'building2': Building2,\n 'calendar': Calendar,\n 'calendar-check': CalendarCheck,\n 'calendar-clock': CalendarClock,\n 'calendar-cog': CalendarCog,\n 'calendar-minus': CalendarMinus,\n 'calendar-off': CalendarOff,\n 'calendar-x': CalendarX,\n 'check': Check,\n 'check-circle': CheckCircle,\n 'check-circle-2': CheckCircle2,\n 'check-square': CheckSquare,\n 'circle': Circle,\n 'clipboard-check': ClipboardCheck,\n 'clipboard-list': ClipboardList,\n 'clock': Clock,\n 'clock-3': Clock3,\n 'coins': Coins,\n 'copy': Copy,\n 'credit-card': CreditCard,\n 'crown': Crown,\n 'database': Database,\n 'dollar-sign': DollarSign,\n 'download': Download,\n 'external-link': ExternalLink,\n 'eye': Eye,\n 'file-minus': FileMinus,\n 'file-pen-line': FilePenLine,\n 'file-spreadsheet': FileSpreadsheet,\n 'file-text': FileText,\n 'filter-x': FilterX,\n 'flag': Flag,\n 'flame': Flame,\n 'folder-tree': FolderTree,\n 'gauge': Gauge,\n 'git-branch': GitBranch,\n 'git-compare-arrows': GitCompareArrows,\n 'git-pull-request-arrow': GitPullRequestArrow,\n 'globe': Globe,\n 'graduation-cap': GraduationCap,\n 'hand': Hand,\n 'handshake': Handshake,\n 'headphones': Headphones,\n 'heart': Heart,\n 'help-circle': HelpCircle,\n 'hourglass': Hourglass,\n 'inbox': Inbox,\n 'key': Key,\n 'key-round': KeyRound,\n 'layers': Layers,\n 'lightbulb': Lightbulb,\n 'line-chart': LineChart,\n 'link': Link,\n 'list': List,\n 'loader': Loader,\n 'loader-2': Loader2,\n 'lock': Lock,\n 'mail': Mail,\n 'mail-open': MailOpen,\n 'map-pin': MapPin,\n 'map-pinned': MapPinned,\n 'message-circle': MessageCircle,\n 'minus-circle': MinusCircle,\n 'notebook': Notebook,\n 'package': Package,\n 'package-check': PackageCheck,\n 'package-plus': PackagePlus,\n 'package-search': PackageSearch,\n 'package-x': PackageX,\n 'pause-circle': PauseCircle,\n 'percent': Percent,\n 'phone': Phone,\n 'phone-call': PhoneCall,\n 'pie-chart': PieChart,\n 'plus-square': PlusSquare,\n 'receipt': Receipt,\n 'receipt-text': ReceiptText,\n 'refresh-ccw': RefreshCcw,\n 'refresh-cw': RefreshCw,\n 'reply': Reply,\n 'rotate-ccw': RotateCcw,\n 'ruler': Ruler,\n 'send': Send,\n 'settings': Settings,\n 'shapes': Shapes,\n 'share-2': Share2,\n 'shield': Shield,\n 'shield-alert': ShieldAlert,\n 'shield-check': ShieldCheck,\n 'shopping-bag': ShoppingBag,\n 'shopping-cart': ShoppingCart,\n 'shuffle': Shuffle,\n 'sliders': Sliders,\n 'smartphone': Smartphone,\n 'snowflake': Snowflake,\n 'sparkles': Sparkles,\n 'star': Star,\n 'sticky-note': StickyNote,\n 'store': Store,\n 'tag': Tag,\n 'target': Target,\n 'thumbs-up': ThumbsUp,\n 'ticket': Ticket,\n 'timer': Timer,\n 'trash-2': Trash2,\n 'trending-up': TrendingUp,\n 'triangle-alert': TriangleAlert,\n 'trophy': Trophy,\n 'truck': Truck,\n 'undo-2': Undo2,\n 'unlock': Unlock,\n 'user': User,\n 'user-check': UserCheck,\n 'user-minus': UserMinus,\n 'user-plus': UserPlus,\n 'user-round': UserRound,\n 'user-x': UserX,\n 'users': Users,\n 'wallet': Wallet,\n 'warehouse': Warehouse,\n 'webhook': Webhook,\n 'workflow': Workflow,\n 'wrench': Wrench,\n 'x': X,\n 'x-circle': XCircle,\n}\n\nfunction normalizeKebabIconName(input: string): string {\n const trimmed = input.trim()\n if (!trimmed) return ''\n const withoutPrefix = trimmed.startsWith('lucide:') ? trimmed.slice('lucide:'.length) : trimmed\n if (!withoutPrefix) return ''\n if (!withoutPrefix.includes('-') && !withoutPrefix.includes('_') && !withoutPrefix.includes(' ') && /[A-Z]/.test(withoutPrefix)) {\n return withoutPrefix\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n }\n return withoutPrefix\n .replace(/[_\\s]+/g, '-')\n .replace(/-+/g, '-')\n .toLowerCase()\n}\n\nexport function resolveRegisteredLucideIcon(name: string | undefined): LucideIcon | null {\n if (!name) return null\n const normalized = normalizeKebabIconName(name)\n if (!normalized) return null\n return (LUCIDE_ICON_REGISTRY as Record<string, LucideIcon | undefined>)[normalized] ?? null\n}\n\nexport function resolveRegisteredLucideIconNode(\n name: string | undefined,\n className: string\n): React.ReactNode | null {\n const Icon = resolveRegisteredLucideIcon(name)\n if (!Icon) return null\n return <Icon className={className} />\n}\n"],
|
|
5
|
+
"mappings": "AA4US;AAtUT;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAC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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -11,28 +11,280 @@ import {
|
|
|
11
11
|
SelectItemLeading,
|
|
12
12
|
SelectTrigger
|
|
13
13
|
} from "../../primitives/select.js";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
{ iso2: "
|
|
25
|
-
{ iso2: "
|
|
26
|
-
{ iso2: "
|
|
27
|
-
{ iso2: "
|
|
28
|
-
{ iso2: "
|
|
29
|
-
{ iso2: "
|
|
30
|
-
{ iso2: "
|
|
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
|
|
33
|
-
const
|
|
34
|
-
|
|
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
|
}
|