@glob-ui/phone-input 0.0.0-stage โ†’ 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kevin Martรญnez E
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,17 @@
1
- # Temporary Holding Version
1
+ # @glob-ui/phone-input
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ A telephone field with a country picker. The picker searches by country name, dial code and ISO code.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @glob-ui/phone-input
9
+ ```
10
+
11
+ ## Documentation
12
+
13
+ Full docs, examples and the accessibility table: [Phone input](https://github.com/kevin-martineze/GlobUI/tree/main/apps/docs/content/docs/components/phone-input.mdx).
14
+
15
+ ## License
16
+
17
+ MIT. See [LICENSE](./LICENSE).
@@ -0,0 +1,14 @@
1
+ import * as react from 'react';
2
+ import * as class_variance_authority_types from 'class-variance-authority/types';
3
+ import { VariantProps } from 'class-variance-authority';
4
+
5
+ declare const phoneInputVariants: (props?: ({
6
+ size?: "sm" | "md" | "lg" | null | undefined;
7
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
8
+ interface PhoneInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size">, VariantProps<typeof phoneInputVariants> {
9
+ country?: string;
10
+ onCountryChange?: (iso: string) => void;
11
+ }
12
+ declare const PhoneInput: react.ForwardRefExoticComponent<PhoneInputProps & react.RefAttributes<HTMLInputElement>>;
13
+
14
+ export { PhoneInput, type PhoneInputProps, phoneInputVariants };
@@ -0,0 +1,14 @@
1
+ import * as react from 'react';
2
+ import * as class_variance_authority_types from 'class-variance-authority/types';
3
+ import { VariantProps } from 'class-variance-authority';
4
+
5
+ declare const phoneInputVariants: (props?: ({
6
+ size?: "sm" | "md" | "lg" | null | undefined;
7
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
8
+ interface PhoneInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size">, VariantProps<typeof phoneInputVariants> {
9
+ country?: string;
10
+ onCountryChange?: (iso: string) => void;
11
+ }
12
+ declare const PhoneInput: react.ForwardRefExoticComponent<PhoneInputProps & react.RefAttributes<HTMLInputElement>>;
13
+
14
+ export { PhoneInput, type PhoneInputProps, phoneInputVariants };
package/dist/index.js ADDED
@@ -0,0 +1,389 @@
1
+ "use client"
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
21
+ var __objRest = (source, exclude) => {
22
+ var target = {};
23
+ for (var prop in source)
24
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
25
+ target[prop] = source[prop];
26
+ if (source != null && __getOwnPropSymbols)
27
+ for (var prop of __getOwnPropSymbols(source)) {
28
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
29
+ target[prop] = source[prop];
30
+ }
31
+ return target;
32
+ };
33
+ var __export = (target, all) => {
34
+ for (var name in all)
35
+ __defProp(target, name, { get: all[name], enumerable: true });
36
+ };
37
+ var __copyProps = (to, from, except, desc) => {
38
+ if (from && typeof from === "object" || typeof from === "function") {
39
+ for (let key of __getOwnPropNames(from))
40
+ if (!__hasOwnProp.call(to, key) && key !== except)
41
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
42
+ }
43
+ return to;
44
+ };
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+
47
+ // src/index.ts
48
+ var index_exports = {};
49
+ __export(index_exports, {
50
+ PhoneInput: () => PhoneInput,
51
+ phoneInputVariants: () => phoneInputVariants
52
+ });
53
+ module.exports = __toCommonJS(index_exports);
54
+
55
+ // src/phone-input.tsx
56
+ var import_react2 = require("react");
57
+ var import_class_variance_authority = require("class-variance-authority");
58
+ var import_utils2 = require("@glob-ui/utils");
59
+
60
+ // src/country-select.tsx
61
+ var import_react = require("react");
62
+ var import_utils = require("@glob-ui/utils");
63
+ var import_hooks = require("@glob-ui/hooks");
64
+
65
+ // src/country-data.ts
66
+ var countries = [
67
+ { iso: "US", name: "United States", code: "+1", flag: "\u{1F1FA}\u{1F1F8}" },
68
+ { iso: "GB", name: "United Kingdom", code: "+44", flag: "\u{1F1EC}\u{1F1E7}" },
69
+ { iso: "CA", name: "Canada", code: "+1", flag: "\u{1F1E8}\u{1F1E6}" },
70
+ { iso: "MX", name: "Mexico", code: "+52", flag: "\u{1F1F2}\u{1F1FD}" },
71
+ { iso: "AR", name: "Argentina", code: "+54", flag: "\u{1F1E6}\u{1F1F7}" },
72
+ { iso: "BR", name: "Brazil", code: "+55", flag: "\u{1F1E7}\u{1F1F7}" },
73
+ { iso: "CL", name: "Chile", code: "+56", flag: "\u{1F1E8}\u{1F1F1}" },
74
+ { iso: "CO", name: "Colombia", code: "+57", flag: "\u{1F1E8}\u{1F1F4}" },
75
+ { iso: "PE", name: "Peru", code: "+51", flag: "\u{1F1F5}\u{1F1EA}" },
76
+ { iso: "ES", name: "Spain", code: "+34", flag: "\u{1F1EA}\u{1F1F8}" },
77
+ { iso: "FR", name: "France", code: "+33", flag: "\u{1F1EB}\u{1F1F7}" },
78
+ { iso: "DE", name: "Germany", code: "+49", flag: "\u{1F1E9}\u{1F1EA}" },
79
+ { iso: "IT", name: "Italy", code: "+39", flag: "\u{1F1EE}\u{1F1F9}" },
80
+ { iso: "PT", name: "Portugal", code: "+351", flag: "\u{1F1F5}\u{1F1F9}" },
81
+ { iso: "NL", name: "Netherlands", code: "+31", flag: "\u{1F1F3}\u{1F1F1}" },
82
+ { iso: "BE", name: "Belgium", code: "+32", flag: "\u{1F1E7}\u{1F1EA}" },
83
+ { iso: "CH", name: "Switzerland", code: "+41", flag: "\u{1F1E8}\u{1F1ED}" },
84
+ { iso: "SE", name: "Sweden", code: "+46", flag: "\u{1F1F8}\u{1F1EA}" },
85
+ { iso: "NO", name: "Norway", code: "+47", flag: "\u{1F1F3}\u{1F1F4}" },
86
+ { iso: "DK", name: "Denmark", code: "+45", flag: "\u{1F1E9}\u{1F1F0}" },
87
+ { iso: "FI", name: "Finland", code: "+358", flag: "\u{1F1EB}\u{1F1EE}" },
88
+ { iso: "IE", name: "Ireland", code: "+353", flag: "\u{1F1EE}\u{1F1EA}" },
89
+ { iso: "AT", name: "Austria", code: "+43", flag: "\u{1F1E6}\u{1F1F9}" },
90
+ { iso: "PL", name: "Poland", code: "+48", flag: "\u{1F1F5}\u{1F1F1}" },
91
+ { iso: "RU", name: "Russia", code: "+7", flag: "\u{1F1F7}\u{1F1FA}" },
92
+ { iso: "TR", name: "Turkey", code: "+90", flag: "\u{1F1F9}\u{1F1F7}" },
93
+ { iso: "IN", name: "India", code: "+91", flag: "\u{1F1EE}\u{1F1F3}" },
94
+ { iso: "CN", name: "China", code: "+86", flag: "\u{1F1E8}\u{1F1F3}" },
95
+ { iso: "JP", name: "Japan", code: "+81", flag: "\u{1F1EF}\u{1F1F5}" },
96
+ { iso: "KR", name: "South Korea", code: "+82", flag: "\u{1F1F0}\u{1F1F7}" },
97
+ { iso: "AU", name: "Australia", code: "+61", flag: "\u{1F1E6}\u{1F1FA}" },
98
+ { iso: "NZ", name: "New Zealand", code: "+64", flag: "\u{1F1F3}\u{1F1FF}" },
99
+ { iso: "ZA", name: "South Africa", code: "+27", flag: "\u{1F1FF}\u{1F1E6}" },
100
+ { iso: "NG", name: "Nigeria", code: "+234", flag: "\u{1F1F3}\u{1F1EC}" },
101
+ { iso: "EG", name: "Egypt", code: "+20", flag: "\u{1F1EA}\u{1F1EC}" },
102
+ { iso: "MA", name: "Morocco", code: "+212", flag: "\u{1F1F2}\u{1F1E6}" },
103
+ { iso: "IL", name: "Israel", code: "+972", flag: "\u{1F1EE}\u{1F1F1}" },
104
+ { iso: "SA", name: "Saudi Arabia", code: "+966", flag: "\u{1F1F8}\u{1F1E6}" },
105
+ { iso: "AE", name: "United Arab Emirates", code: "+971", flag: "\u{1F1E6}\u{1F1EA}" },
106
+ { iso: "SG", name: "Singapore", code: "+65", flag: "\u{1F1F8}\u{1F1EC}" },
107
+ { iso: "HK", name: "Hong Kong", code: "+852", flag: "\u{1F1ED}\u{1F1F0}" },
108
+ { iso: "MY", name: "Malaysia", code: "+60", flag: "\u{1F1F2}\u{1F1FE}" },
109
+ { iso: "PH", name: "Philippines", code: "+63", flag: "\u{1F1F5}\u{1F1ED}" },
110
+ { iso: "TH", name: "Thailand", code: "+66", flag: "\u{1F1F9}\u{1F1ED}" },
111
+ { iso: "VN", name: "Vietnam", code: "+84", flag: "\u{1F1FB}\u{1F1F3}" },
112
+ { iso: "ID", name: "Indonesia", code: "+62", flag: "\u{1F1EE}\u{1F1E9}" },
113
+ { iso: "PK", name: "Pakistan", code: "+92", flag: "\u{1F1F5}\u{1F1F0}" },
114
+ { iso: "BD", name: "Bangladesh", code: "+880", flag: "\u{1F1E7}\u{1F1E9}" },
115
+ { iso: "UA", name: "Ukraine", code: "+380", flag: "\u{1F1FA}\u{1F1E6}" },
116
+ { iso: "RO", name: "Romania", code: "+40", flag: "\u{1F1F7}\u{1F1F4}" },
117
+ { iso: "CZ", name: "Czech Republic", code: "+420", flag: "\u{1F1E8}\u{1F1FF}" },
118
+ { iso: "GR", name: "Greece", code: "+30", flag: "\u{1F1EC}\u{1F1F7}" },
119
+ { iso: "HU", name: "Hungary", code: "+36", flag: "\u{1F1ED}\u{1F1FA}" },
120
+ { iso: "SK", name: "Slovakia", code: "+421", flag: "\u{1F1F8}\u{1F1F0}" },
121
+ { iso: "HR", name: "Croatia", code: "+385", flag: "\u{1F1ED}\u{1F1F7}" },
122
+ { iso: "CR", name: "Costa Rica", code: "+506", flag: "\u{1F1E8}\u{1F1F7}" },
123
+ { iso: "PA", name: "Panama", code: "+507", flag: "\u{1F1F5}\u{1F1E6}" },
124
+ { iso: "DO", name: "Dominican Republic", code: "+1", flag: "\u{1F1E9}\u{1F1F4}" },
125
+ { iso: "PR", name: "Puerto Rico", code: "+1", flag: "\u{1F1F5}\u{1F1F7}" },
126
+ { iso: "EC", name: "Ecuador", code: "+593", flag: "\u{1F1EA}\u{1F1E8}" },
127
+ { iso: "VE", name: "Venezuela", code: "+58", flag: "\u{1F1FB}\u{1F1EA}" },
128
+ { iso: "UY", name: "Uruguay", code: "+598", flag: "\u{1F1FA}\u{1F1FE}" },
129
+ { iso: "PY", name: "Paraguay", code: "+595", flag: "\u{1F1F5}\u{1F1FE}" },
130
+ { iso: "BO", name: "Bolivia", code: "+591", flag: "\u{1F1E7}\u{1F1F4}" },
131
+ { iso: "CU", name: "Cuba", code: "+53", flag: "\u{1F1E8}\u{1F1FA}" },
132
+ { iso: "KE", name: "Kenya", code: "+254", flag: "\u{1F1F0}\u{1F1EA}" },
133
+ { iso: "GH", name: "Ghana", code: "+233", flag: "\u{1F1EC}\u{1F1ED}" },
134
+ { iso: "TZ", name: "Tanzania", code: "+255", flag: "\u{1F1F9}\u{1F1FF}" },
135
+ { iso: "ET", name: "Ethiopia", code: "+251", flag: "\u{1F1EA}\u{1F1F9}" },
136
+ { iso: "DZ", name: "Algeria", code: "+213", flag: "\u{1F1E9}\u{1F1FF}" },
137
+ { iso: "TN", name: "Tunisia", code: "+216", flag: "\u{1F1F9}\u{1F1F3}" }
138
+ ];
139
+
140
+ // src/country-select.tsx
141
+ var import_jsx_runtime = require("react/jsx-runtime");
142
+ var sizeStyles = {
143
+ sm: "h-8 text-xs",
144
+ md: "h-10 text-sm",
145
+ lg: "h-12 text-base"
146
+ };
147
+ function CountrySelect({ value, onChange, size = "md", disabled }) {
148
+ var _a;
149
+ const baseId = (0, import_react.useId)();
150
+ const listId = `${baseId}-listbox`;
151
+ const [open, setOpen] = (0, import_react.useState)(false);
152
+ const [search, setSearch] = (0, import_react.useState)("");
153
+ const searchRef = (0, import_react.useRef)(null);
154
+ const selected = (_a = countries.find((c) => c.iso === value)) != null ? _a : countries[0];
155
+ const filtered = (0, import_react.useMemo)(() => {
156
+ if (!search) return countries;
157
+ const q = search.toLowerCase();
158
+ return countries.filter(
159
+ (c) => c.name.toLowerCase().includes(q) || c.code.includes(q) || c.iso.toLowerCase().includes(q)
160
+ );
161
+ }, [search]);
162
+ const listbox = (0, import_hooks.useListbox)({
163
+ id: baseId,
164
+ items: filtered,
165
+ getKey: (c) => c.iso,
166
+ getText: (c) => c.name,
167
+ open
168
+ });
169
+ const { setTrigger, setPanel, floatingStyles, triggerHandlers } = (0, import_hooks.useFloatingPanel)({
170
+ open,
171
+ onOpenChange: (next) => {
172
+ setOpen(next);
173
+ if (!next) setSearch("");
174
+ },
175
+ placement: "bottom-start",
176
+ offset: 4,
177
+ onShow: () => {
178
+ var _a2;
179
+ return (_a2 = searchRef.current) == null ? void 0 : _a2.focus({ preventScroll: true });
180
+ }
181
+ });
182
+ function closeList() {
183
+ setOpen(false);
184
+ setSearch("");
185
+ }
186
+ function openList() {
187
+ if (disabled) return;
188
+ listbox.setActiveKey(value);
189
+ setOpen(true);
190
+ }
191
+ function commit(iso) {
192
+ onChange(iso);
193
+ closeList();
194
+ }
195
+ function onTriggerKeyDown(e) {
196
+ if (disabled || open) return;
197
+ if (e.key === "ArrowDown" || e.key === "ArrowUp" || e.key === "Enter" || e.key === " ") {
198
+ e.preventDefault();
199
+ openList();
200
+ }
201
+ }
202
+ function onSearchKeyDown(e) {
203
+ if (listbox.navigate(e, { homeEnd: false })) return;
204
+ if (e.key === "Enter") {
205
+ e.preventDefault();
206
+ if (listbox.activeItem) commit(listbox.activeItem.iso);
207
+ } else if (e.key === "Escape") {
208
+ e.preventDefault();
209
+ closeList();
210
+ } else if (e.key === "Tab") {
211
+ if (listbox.activeItem) onChange(listbox.activeItem.iso);
212
+ closeList();
213
+ }
214
+ }
215
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative", children: [
216
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
217
+ "div",
218
+ {
219
+ ref: setTrigger,
220
+ role: "combobox",
221
+ "aria-label": "Country code",
222
+ "aria-haspopup": "listbox",
223
+ "aria-expanded": open,
224
+ "aria-controls": listId,
225
+ tabIndex: disabled ? -1 : 0,
226
+ "aria-disabled": disabled || void 0,
227
+ onPointerDown: () => {
228
+ if (!disabled) triggerHandlers.onPointerDown();
229
+ },
230
+ onClick: () => {
231
+ if (disabled) return;
232
+ if (!open) listbox.setActiveKey(value);
233
+ triggerHandlers.onClick();
234
+ },
235
+ onKeyDown: onTriggerKeyDown,
236
+ className: (0, import_utils.cn)(
237
+ "flex cursor-pointer items-center gap-1 rounded-l-glob-md border border-r-0 border-glob-border bg-glob-surface px-2 text-glob-text transition-colors hover:bg-glob-surface-hover outline-none focus-visible:ring-2 focus-visible:ring-glob-ring aria-disabled:cursor-not-allowed aria-disabled:opacity-50",
238
+ sizeStyles[size]
239
+ ),
240
+ children: [
241
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-base leading-none", "aria-hidden": "true", children: selected.flag }),
242
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-glob-text-secondary", children: selected.code }),
243
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
244
+ "svg",
245
+ {
246
+ className: (0, import_utils.cn)("h-3 w-3 text-glob-text-secondary transition-transform", open && "rotate-180"),
247
+ viewBox: "0 0 24 24",
248
+ fill: "none",
249
+ stroke: "currentColor",
250
+ strokeWidth: "2",
251
+ "aria-hidden": "true",
252
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M6 9l6 6 6-6" })
253
+ }
254
+ )
255
+ ]
256
+ }
257
+ ),
258
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
259
+ "div",
260
+ {
261
+ ref: setPanel,
262
+ popover: "auto",
263
+ style: floatingStyles,
264
+ className: (0, import_utils.cn)(
265
+ "m-0 w-72 overflow-visible rounded-glob-md border border-glob-border bg-glob-surface text-sm text-glob-text shadow-glob-md outline-none",
266
+ "opacity-0 transition-[opacity,overlay,display] transition-discrete duration-150 open:opacity-100 starting:open:opacity-0 motion-reduce:transition-none"
267
+ ),
268
+ children: [
269
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "border-b border-glob-border p-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
270
+ "input",
271
+ {
272
+ ref: searchRef,
273
+ type: "text",
274
+ value: search,
275
+ onChange: (e) => setSearch(e.target.value),
276
+ onKeyDown: onSearchKeyDown,
277
+ placeholder: "Search country...",
278
+ "aria-label": "Search countries",
279
+ "aria-controls": listId,
280
+ "aria-autocomplete": "list",
281
+ "aria-activedescendant": listbox.activeDescendant,
282
+ autoComplete: "off",
283
+ className: "w-full rounded-glob-sm border border-glob-border bg-glob-surface-secondary px-2 py-1.5 text-sm text-glob-text placeholder:text-glob-text-secondary outline-none focus:ring-1 focus:ring-glob-ring"
284
+ }
285
+ ) }),
286
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { id: listId, role: "listbox", "aria-label": "Countries", className: "relative max-h-60 overflow-y-auto p-1", children: filtered.map((country) => {
287
+ const isSelected = country.iso === selected.iso;
288
+ const isActive = listbox.activeKey === country.iso;
289
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
290
+ "div",
291
+ {
292
+ id: listbox.optionId(country.iso),
293
+ role: "option",
294
+ "aria-selected": isSelected,
295
+ onMouseDown: (e) => e.preventDefault(),
296
+ onPointerMove: () => listbox.setActiveKey(country.iso),
297
+ onClick: () => commit(country.iso),
298
+ className: (0, import_utils.cn)(
299
+ "flex w-full cursor-pointer items-center gap-3 rounded-glob-sm px-2 py-2 text-left text-sm select-none",
300
+ isActive && "bg-glob-surface-hover",
301
+ // The selected row is marked by font weight; orange text on white fails contrast.
302
+ isSelected && "font-medium"
303
+ ),
304
+ children: [
305
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-base leading-none", "aria-hidden": "true", children: country.flag }),
306
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "flex-1", children: country.name }),
307
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-glob-text", children: country.code })
308
+ ]
309
+ },
310
+ country.iso
311
+ );
312
+ }) }),
313
+ filtered.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "status", className: "px-3 py-4 text-center text-sm text-glob-text-secondary", children: "No countries found" })
314
+ ]
315
+ }
316
+ )
317
+ ] });
318
+ }
319
+
320
+ // src/phone-input.tsx
321
+ var import_jsx_runtime2 = require("react/jsx-runtime");
322
+ var phoneInputVariants = (0, import_class_variance_authority.cva)(
323
+ "flex items-center rounded-glob-md border border-glob-border bg-glob-surface transition-colors has-[input:focus-visible]:ring-2 has-[input:focus-visible]:ring-glob-ring has-[input:focus-visible]:ring-offset-0 has-[[aria-disabled=true]]:opacity-50 has-[[aria-disabled=true]]:cursor-not-allowed has-[input[aria-invalid=true]]:border-glob-danger has-[input[aria-invalid=true]]:has-[input:focus-visible]:ring-glob-danger",
324
+ {
325
+ variants: {
326
+ size: {
327
+ sm: "h-8",
328
+ md: "h-10",
329
+ lg: "h-12"
330
+ }
331
+ },
332
+ defaultVariants: {
333
+ size: "md"
334
+ }
335
+ }
336
+ );
337
+ var inputSizeStyles = {
338
+ sm: "text-xs",
339
+ md: "text-sm",
340
+ lg: "text-base"
341
+ };
342
+ var PhoneInput = (0, import_react2.forwardRef)(
343
+ (_a, ref) => {
344
+ var _b = _a, { className, size = "md", country, onCountryChange, value, onChange, placeholder, disabled } = _b, props = __objRest(_b, ["className", "size", "country", "onCountryChange", "value", "onChange", "placeholder", "disabled"]);
345
+ const [internalCountry, setInternalCountry] = (0, import_react2.useState)("US");
346
+ const selectedIso = country != null ? country : internalCountry;
347
+ const handleCountryChange = (0, import_react2.useCallback)(
348
+ (iso) => {
349
+ setInternalCountry(iso);
350
+ onCountryChange == null ? void 0 : onCountryChange(iso);
351
+ },
352
+ [onCountryChange]
353
+ );
354
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: (0, import_utils2.cn)(phoneInputVariants({ size, className })), children: [
355
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
356
+ CountrySelect,
357
+ {
358
+ value: selectedIso,
359
+ onChange: handleCountryChange,
360
+ size: size != null ? size : "md",
361
+ disabled
362
+ }
363
+ ),
364
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "h-5 w-px bg-glob-border" }),
365
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex flex-1 items-center pl-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
366
+ "input",
367
+ __spreadValues({
368
+ ref,
369
+ type: "tel",
370
+ value,
371
+ onChange,
372
+ disabled,
373
+ placeholder: placeholder != null ? placeholder : "555 000 0000",
374
+ className: (0, import_utils2.cn)(
375
+ "h-full flex-1 bg-transparent text-glob-text outline-none placeholder:text-glob-text-secondary",
376
+ inputSizeStyles[size != null ? size : "md"]
377
+ )
378
+ }, props)
379
+ ) })
380
+ ] });
381
+ }
382
+ );
383
+ PhoneInput.displayName = "PhoneInput";
384
+ // Annotate the CommonJS export names for ESM import in node:
385
+ 0 && (module.exports = {
386
+ PhoneInput,
387
+ phoneInputVariants
388
+ });
389
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/phone-input.tsx","../src/country-select.tsx","../src/country-data.ts"],"sourcesContent":["export { PhoneInput, phoneInputVariants } from \"./phone-input\"\nexport type { PhoneInputProps } from \"./phone-input\"\n","\"use client\"\n\nimport { forwardRef, useState, useCallback } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"@glob-ui/utils\"\nimport { CountrySelect } from \"./country-select\"\n\nconst phoneInputVariants = cva(\n \"flex items-center rounded-glob-md border border-glob-border bg-glob-surface transition-colors has-[input:focus-visible]:ring-2 has-[input:focus-visible]:ring-glob-ring has-[input:focus-visible]:ring-offset-0 has-[[aria-disabled=true]]:opacity-50 has-[[aria-disabled=true]]:cursor-not-allowed has-[input[aria-invalid=true]]:border-glob-danger has-[input[aria-invalid=true]]:has-[input:focus-visible]:ring-glob-danger\",\n {\n variants: {\n size: {\n sm: \"h-8\",\n md: \"h-10\",\n lg: \"h-12\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nconst inputSizeStyles = {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n}\n\nexport interface PhoneInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof phoneInputVariants> {\n country?: string\n onCountryChange?: (iso: string) => void\n}\n\nconst PhoneInput = forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ className, size = \"md\", country, onCountryChange, value, onChange, placeholder, disabled, ...props }, ref) => {\n const [internalCountry, setInternalCountry] = useState(\"US\")\n const selectedIso = country ?? internalCountry\n\n const handleCountryChange = useCallback(\n (iso: string) => {\n setInternalCountry(iso)\n onCountryChange?.(iso)\n },\n [onCountryChange]\n )\n\n return (\n <div className={cn(phoneInputVariants({ size, className }))}>\n <CountrySelect\n value={selectedIso}\n onChange={handleCountryChange}\n size={size ?? \"md\"}\n disabled={disabled}\n />\n\n <div className=\"h-5 w-px bg-glob-border\" />\n\n <div className=\"flex flex-1 items-center pl-2\">\n <input\n ref={ref}\n type=\"tel\"\n value={value}\n onChange={onChange}\n disabled={disabled}\n placeholder={placeholder ?? \"555 000 0000\"}\n className={cn(\n \"h-full flex-1 bg-transparent text-glob-text outline-none placeholder:text-glob-text-secondary\",\n inputSizeStyles[size ?? \"md\"]\n )}\n {...props}\n />\n </div>\n </div>\n )\n }\n)\nPhoneInput.displayName = \"PhoneInput\"\n\nexport { PhoneInput, phoneInputVariants }\n","\"use client\"\n\nimport { useId, useMemo, useRef, useState } from \"react\"\nimport { cn } from \"@glob-ui/utils\"\nimport { useFloatingPanel, useListbox } from \"@glob-ui/hooks\"\nimport { countries } from \"./country-data\"\n\ninterface CountrySelectProps {\n value: string\n onChange: (iso: string) => void\n size?: \"sm\" | \"md\" | \"lg\"\n disabled?: boolean\n}\n\nconst sizeStyles = {\n sm: \"h-8 text-xs\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n}\n\nexport function CountrySelect({ value, onChange, size = \"md\", disabled }: CountrySelectProps) {\n const baseId = useId()\n const listId = `${baseId}-listbox`\n const [open, setOpen] = useState(false)\n const [search, setSearch] = useState(\"\")\n const searchRef = useRef<HTMLInputElement>(null)\n\n const selected = countries.find((c) => c.iso === value) ?? countries[0]\n\n // Matches name, dial code and ISO code.\n const filtered = useMemo(() => {\n if (!search) return countries\n const q = search.toLowerCase()\n return countries.filter(\n (c) => c.name.toLowerCase().includes(q) || c.code.includes(q) || c.iso.toLowerCase().includes(q)\n )\n }, [search])\n\n const listbox = useListbox({\n id: baseId,\n items: filtered,\n getKey: (c) => c.iso,\n getText: (c) => c.name,\n open,\n })\n\n const { setTrigger, setPanel, floatingStyles, triggerHandlers } = useFloatingPanel({\n open,\n onOpenChange: (next) => {\n setOpen(next)\n if (!next) setSearch(\"\")\n },\n placement: \"bottom-start\",\n offset: 4,\n onShow: () => searchRef.current?.focus({ preventScroll: true }),\n })\n\n /** Closes the list and clears the search, so the next open starts from the full list. */\n function closeList() {\n setOpen(false)\n setSearch(\"\")\n }\n\n function openList() {\n if (disabled) return\n listbox.setActiveKey(value)\n setOpen(true)\n }\n\n function commit(iso: string) {\n onChange(iso)\n closeList()\n }\n\n function onTriggerKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (disabled || open) return\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n openList()\n }\n }\n\n function onSearchKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (listbox.navigate(e, { homeEnd: false })) return\n if (e.key === \"Enter\") {\n e.preventDefault()\n if (listbox.activeItem) commit(listbox.activeItem.iso)\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n closeList()\n } else if (e.key === \"Tab\") {\n if (listbox.activeItem) onChange(listbox.activeItem.iso)\n closeList()\n }\n }\n\n return (\n <div className=\"relative\">\n <div\n ref={setTrigger}\n role=\"combobox\"\n aria-label=\"Country code\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n onPointerDown={() => {\n if (!disabled) triggerHandlers.onPointerDown()\n }}\n onClick={() => {\n if (disabled) return\n if (!open) listbox.setActiveKey(value)\n triggerHandlers.onClick()\n }}\n onKeyDown={onTriggerKeyDown}\n className={cn(\n \"flex cursor-pointer items-center gap-1 rounded-l-glob-md border border-r-0 border-glob-border bg-glob-surface px-2 text-glob-text transition-colors hover:bg-glob-surface-hover outline-none focus-visible:ring-2 focus-visible:ring-glob-ring aria-disabled:cursor-not-allowed aria-disabled:opacity-50\",\n sizeStyles[size]\n )}\n >\n <span className=\"text-base leading-none\" aria-hidden=\"true\">{selected.flag}</span>\n <span className=\"text-glob-text-secondary\">{selected.code}</span>\n <svg\n className={cn(\"h-3 w-3 text-glob-text-secondary transition-transform\", open && \"rotate-180\")}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </div>\n\n <div\n ref={setPanel}\n popover=\"auto\"\n style={floatingStyles}\n className={cn(\n \"m-0 w-72 overflow-visible rounded-glob-md border border-glob-border bg-glob-surface text-sm text-glob-text shadow-glob-md outline-none\",\n \"opacity-0 transition-[opacity,overlay,display] transition-discrete duration-150 open:opacity-100 starting:open:opacity-0 motion-reduce:transition-none\"\n )}\n >\n <div className=\"border-b border-glob-border p-2\">\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder=\"Search country...\"\n aria-label=\"Search countries\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={listbox.activeDescendant}\n autoComplete=\"off\"\n className=\"w-full rounded-glob-sm border border-glob-border bg-glob-surface-secondary px-2 py-1.5 text-sm text-glob-text placeholder:text-glob-text-secondary outline-none focus:ring-1 focus:ring-glob-ring\"\n />\n </div>\n <div id={listId} role=\"listbox\" aria-label=\"Countries\" className=\"relative max-h-60 overflow-y-auto p-1\">\n {filtered.map((country) => {\n const isSelected = country.iso === selected.iso\n const isActive = listbox.activeKey === country.iso\n return (\n <div\n key={country.iso}\n id={listbox.optionId(country.iso)}\n role=\"option\"\n aria-selected={isSelected}\n onMouseDown={(e) => e.preventDefault()}\n onPointerMove={() => listbox.setActiveKey(country.iso)}\n onClick={() => commit(country.iso)}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-3 rounded-glob-sm px-2 py-2 text-left text-sm select-none\",\n isActive && \"bg-glob-surface-hover\",\n // The selected row is marked by font weight; orange text on white fails contrast.\n isSelected && \"font-medium\"\n )}\n >\n <span className=\"text-base leading-none\" aria-hidden=\"true\">{country.flag}</span>\n <span className=\"flex-1\">{country.name}</span>\n <span className=\"text-glob-text\">{country.code}</span>\n </div>\n )\n })}\n </div>\n {filtered.length === 0 && (\n <div role=\"status\" className=\"px-3 py-4 text-center text-sm text-glob-text-secondary\">\n No countries found\n </div>\n )}\n </div>\n </div>\n )\n}\n","export interface Country {\n iso: string\n name: string\n code: string\n flag: string\n}\n\nexport const countries: Country[] = [\n { iso: \"US\", name: \"United States\", code: \"+1\", flag: \"๐Ÿ‡บ๐Ÿ‡ธ\" },\n { iso: \"GB\", name: \"United Kingdom\", code: \"+44\", flag: \"๐Ÿ‡ฌ๐Ÿ‡ง\" },\n { iso: \"CA\", name: \"Canada\", code: \"+1\", flag: \"๐Ÿ‡จ๐Ÿ‡ฆ\" },\n { iso: \"MX\", name: \"Mexico\", code: \"+52\", flag: \"๐Ÿ‡ฒ๐Ÿ‡ฝ\" },\n { iso: \"AR\", name: \"Argentina\", code: \"+54\", flag: \"๐Ÿ‡ฆ๐Ÿ‡ท\" },\n { iso: \"BR\", name: \"Brazil\", code: \"+55\", flag: \"๐Ÿ‡ง๐Ÿ‡ท\" },\n { iso: \"CL\", name: \"Chile\", code: \"+56\", flag: \"๐Ÿ‡จ๐Ÿ‡ฑ\" },\n { iso: \"CO\", name: \"Colombia\", code: \"+57\", flag: \"๐Ÿ‡จ๐Ÿ‡ด\" },\n { iso: \"PE\", name: \"Peru\", code: \"+51\", flag: \"๐Ÿ‡ต๐Ÿ‡ช\" },\n { iso: \"ES\", name: \"Spain\", code: \"+34\", flag: \"๐Ÿ‡ช๐Ÿ‡ธ\" },\n { iso: \"FR\", name: \"France\", code: \"+33\", flag: \"๐Ÿ‡ซ๐Ÿ‡ท\" },\n { iso: \"DE\", name: \"Germany\", code: \"+49\", flag: \"๐Ÿ‡ฉ๐Ÿ‡ช\" },\n { iso: \"IT\", name: \"Italy\", code: \"+39\", flag: \"๐Ÿ‡ฎ๐Ÿ‡น\" },\n { iso: \"PT\", name: \"Portugal\", code: \"+351\", flag: \"๐Ÿ‡ต๐Ÿ‡น\" },\n { iso: \"NL\", name: \"Netherlands\", code: \"+31\", flag: \"๐Ÿ‡ณ๐Ÿ‡ฑ\" },\n { iso: \"BE\", name: \"Belgium\", code: \"+32\", flag: \"๐Ÿ‡ง๐Ÿ‡ช\" },\n { iso: \"CH\", name: \"Switzerland\", code: \"+41\", flag: \"๐Ÿ‡จ๐Ÿ‡ญ\" },\n { iso: \"SE\", name: \"Sweden\", code: \"+46\", flag: \"๐Ÿ‡ธ๐Ÿ‡ช\" },\n { iso: \"NO\", name: \"Norway\", code: \"+47\", flag: \"๐Ÿ‡ณ๐Ÿ‡ด\" },\n { iso: \"DK\", name: \"Denmark\", code: \"+45\", flag: \"๐Ÿ‡ฉ๐Ÿ‡ฐ\" },\n { iso: \"FI\", name: \"Finland\", code: \"+358\", flag: \"๐Ÿ‡ซ๐Ÿ‡ฎ\" },\n { iso: \"IE\", name: \"Ireland\", code: \"+353\", flag: \"๐Ÿ‡ฎ๐Ÿ‡ช\" },\n { iso: \"AT\", name: \"Austria\", code: \"+43\", flag: \"๐Ÿ‡ฆ๐Ÿ‡น\" },\n { iso: \"PL\", name: \"Poland\", code: \"+48\", flag: \"๐Ÿ‡ต๐Ÿ‡ฑ\" },\n { iso: \"RU\", name: \"Russia\", code: \"+7\", flag: \"๐Ÿ‡ท๐Ÿ‡บ\" },\n { iso: \"TR\", name: \"Turkey\", code: \"+90\", flag: \"๐Ÿ‡น๐Ÿ‡ท\" },\n { iso: \"IN\", name: \"India\", code: \"+91\", flag: \"๐Ÿ‡ฎ๐Ÿ‡ณ\" },\n { iso: \"CN\", name: \"China\", code: \"+86\", flag: \"๐Ÿ‡จ๐Ÿ‡ณ\" },\n { iso: \"JP\", name: \"Japan\", code: \"+81\", flag: \"๐Ÿ‡ฏ๐Ÿ‡ต\" },\n { iso: \"KR\", name: \"South Korea\", code: \"+82\", flag: \"๐Ÿ‡ฐ๐Ÿ‡ท\" },\n { iso: \"AU\", name: \"Australia\", code: \"+61\", flag: \"๐Ÿ‡ฆ๐Ÿ‡บ\" },\n { iso: \"NZ\", name: \"New Zealand\", code: \"+64\", flag: \"๐Ÿ‡ณ๐Ÿ‡ฟ\" },\n { iso: \"ZA\", name: \"South Africa\", code: \"+27\", flag: \"๐Ÿ‡ฟ๐Ÿ‡ฆ\" },\n { iso: \"NG\", name: \"Nigeria\", code: \"+234\", flag: \"๐Ÿ‡ณ๐Ÿ‡ฌ\" },\n { iso: \"EG\", name: \"Egypt\", code: \"+20\", flag: \"๐Ÿ‡ช๐Ÿ‡ฌ\" },\n { iso: \"MA\", name: \"Morocco\", code: \"+212\", flag: \"๐Ÿ‡ฒ๐Ÿ‡ฆ\" },\n { iso: \"IL\", name: \"Israel\", code: \"+972\", flag: \"๐Ÿ‡ฎ๐Ÿ‡ฑ\" },\n { iso: \"SA\", name: \"Saudi Arabia\", code: \"+966\", flag: \"๐Ÿ‡ธ๐Ÿ‡ฆ\" },\n { iso: \"AE\", name: \"United Arab Emirates\", code: \"+971\", flag: \"๐Ÿ‡ฆ๐Ÿ‡ช\" },\n { iso: \"SG\", name: \"Singapore\", code: \"+65\", flag: \"๐Ÿ‡ธ๐Ÿ‡ฌ\" },\n { iso: \"HK\", name: \"Hong Kong\", code: \"+852\", flag: \"๐Ÿ‡ญ๐Ÿ‡ฐ\" },\n { iso: \"MY\", name: \"Malaysia\", code: \"+60\", flag: \"๐Ÿ‡ฒ๐Ÿ‡พ\" },\n { iso: \"PH\", name: \"Philippines\", code: \"+63\", flag: \"๐Ÿ‡ต๐Ÿ‡ญ\" },\n { iso: \"TH\", name: \"Thailand\", code: \"+66\", flag: \"๐Ÿ‡น๐Ÿ‡ญ\" },\n { iso: \"VN\", name: \"Vietnam\", code: \"+84\", flag: \"๐Ÿ‡ป๐Ÿ‡ณ\" },\n { iso: \"ID\", name: \"Indonesia\", code: \"+62\", flag: \"๐Ÿ‡ฎ๐Ÿ‡ฉ\" },\n { iso: \"PK\", name: \"Pakistan\", code: \"+92\", flag: \"๐Ÿ‡ต๐Ÿ‡ฐ\" },\n { iso: \"BD\", name: \"Bangladesh\", code: \"+880\", flag: \"๐Ÿ‡ง๐Ÿ‡ฉ\" },\n { iso: \"UA\", name: \"Ukraine\", code: \"+380\", flag: \"๐Ÿ‡บ๐Ÿ‡ฆ\" },\n { iso: \"RO\", name: \"Romania\", code: \"+40\", flag: \"๐Ÿ‡ท๐Ÿ‡ด\" },\n { iso: \"CZ\", name: \"Czech Republic\", code: \"+420\", flag: \"๐Ÿ‡จ๐Ÿ‡ฟ\" },\n { iso: \"GR\", name: \"Greece\", code: \"+30\", flag: \"๐Ÿ‡ฌ๐Ÿ‡ท\" },\n { iso: \"HU\", name: \"Hungary\", code: \"+36\", flag: \"๐Ÿ‡ญ๐Ÿ‡บ\" },\n { iso: \"SK\", name: \"Slovakia\", code: \"+421\", flag: \"๐Ÿ‡ธ๐Ÿ‡ฐ\" },\n { iso: \"HR\", name: \"Croatia\", code: \"+385\", flag: \"๐Ÿ‡ญ๐Ÿ‡ท\" },\n { iso: \"CR\", name: \"Costa Rica\", code: \"+506\", flag: \"๐Ÿ‡จ๐Ÿ‡ท\" },\n { iso: \"PA\", name: \"Panama\", code: \"+507\", flag: \"๐Ÿ‡ต๐Ÿ‡ฆ\" },\n { iso: \"DO\", name: \"Dominican Republic\", code: \"+1\", flag: \"๐Ÿ‡ฉ๐Ÿ‡ด\" },\n { iso: \"PR\", name: \"Puerto Rico\", code: \"+1\", flag: \"๐Ÿ‡ต๐Ÿ‡ท\" },\n { iso: \"EC\", name: \"Ecuador\", code: \"+593\", flag: \"๐Ÿ‡ช๐Ÿ‡จ\" },\n { iso: \"VE\", name: \"Venezuela\", code: \"+58\", flag: \"๐Ÿ‡ป๐Ÿ‡ช\" },\n { iso: \"UY\", name: \"Uruguay\", code: \"+598\", flag: \"๐Ÿ‡บ๐Ÿ‡พ\" },\n { iso: \"PY\", name: \"Paraguay\", code: \"+595\", flag: \"๐Ÿ‡ต๐Ÿ‡พ\" },\n { iso: \"BO\", name: \"Bolivia\", code: \"+591\", flag: \"๐Ÿ‡ง๐Ÿ‡ด\" },\n { iso: \"CU\", name: \"Cuba\", code: \"+53\", flag: \"๐Ÿ‡จ๐Ÿ‡บ\" },\n { iso: \"KE\", name: \"Kenya\", code: \"+254\", flag: \"๐Ÿ‡ฐ๐Ÿ‡ช\" },\n { iso: \"GH\", name: \"Ghana\", code: \"+233\", flag: \"๐Ÿ‡ฌ๐Ÿ‡ญ\" },\n { iso: \"TZ\", name: \"Tanzania\", code: \"+255\", flag: \"๐Ÿ‡น๐Ÿ‡ฟ\" },\n { iso: \"ET\", name: \"Ethiopia\", code: \"+251\", flag: \"๐Ÿ‡ช๐Ÿ‡น\" },\n { iso: \"DZ\", name: \"Algeria\", code: \"+213\", flag: \"๐Ÿ‡ฉ๐Ÿ‡ฟ\" },\n { iso: \"TN\", name: \"Tunisia\", code: \"+216\", flag: \"๐Ÿ‡น๐Ÿ‡ณ\" },\n]\n\nexport function getCountryByIso(iso: string): Country | undefined {\n return countries.find((c) => c.iso === iso)\n}\n"],"mappings":"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","names":["import_react","import_utils","_a","import_jsx_runtime"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,364 @@
1
+ "use client"
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __spreadValues = (a, b) => {
8
+ for (var prop in b || (b = {}))
9
+ if (__hasOwnProp.call(b, prop))
10
+ __defNormalProp(a, prop, b[prop]);
11
+ if (__getOwnPropSymbols)
12
+ for (var prop of __getOwnPropSymbols(b)) {
13
+ if (__propIsEnum.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ }
16
+ return a;
17
+ };
18
+ var __objRest = (source, exclude) => {
19
+ var target = {};
20
+ for (var prop in source)
21
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
22
+ target[prop] = source[prop];
23
+ if (source != null && __getOwnPropSymbols)
24
+ for (var prop of __getOwnPropSymbols(source)) {
25
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
26
+ target[prop] = source[prop];
27
+ }
28
+ return target;
29
+ };
30
+
31
+ // src/phone-input.tsx
32
+ import { forwardRef, useState as useState2, useCallback } from "react";
33
+ import { cva } from "class-variance-authority";
34
+ import { cn as cn2 } from "@glob-ui/utils";
35
+
36
+ // src/country-select.tsx
37
+ import { useId, useMemo, useRef, useState } from "react";
38
+ import { cn } from "@glob-ui/utils";
39
+ import { useFloatingPanel, useListbox } from "@glob-ui/hooks";
40
+
41
+ // src/country-data.ts
42
+ var countries = [
43
+ { iso: "US", name: "United States", code: "+1", flag: "\u{1F1FA}\u{1F1F8}" },
44
+ { iso: "GB", name: "United Kingdom", code: "+44", flag: "\u{1F1EC}\u{1F1E7}" },
45
+ { iso: "CA", name: "Canada", code: "+1", flag: "\u{1F1E8}\u{1F1E6}" },
46
+ { iso: "MX", name: "Mexico", code: "+52", flag: "\u{1F1F2}\u{1F1FD}" },
47
+ { iso: "AR", name: "Argentina", code: "+54", flag: "\u{1F1E6}\u{1F1F7}" },
48
+ { iso: "BR", name: "Brazil", code: "+55", flag: "\u{1F1E7}\u{1F1F7}" },
49
+ { iso: "CL", name: "Chile", code: "+56", flag: "\u{1F1E8}\u{1F1F1}" },
50
+ { iso: "CO", name: "Colombia", code: "+57", flag: "\u{1F1E8}\u{1F1F4}" },
51
+ { iso: "PE", name: "Peru", code: "+51", flag: "\u{1F1F5}\u{1F1EA}" },
52
+ { iso: "ES", name: "Spain", code: "+34", flag: "\u{1F1EA}\u{1F1F8}" },
53
+ { iso: "FR", name: "France", code: "+33", flag: "\u{1F1EB}\u{1F1F7}" },
54
+ { iso: "DE", name: "Germany", code: "+49", flag: "\u{1F1E9}\u{1F1EA}" },
55
+ { iso: "IT", name: "Italy", code: "+39", flag: "\u{1F1EE}\u{1F1F9}" },
56
+ { iso: "PT", name: "Portugal", code: "+351", flag: "\u{1F1F5}\u{1F1F9}" },
57
+ { iso: "NL", name: "Netherlands", code: "+31", flag: "\u{1F1F3}\u{1F1F1}" },
58
+ { iso: "BE", name: "Belgium", code: "+32", flag: "\u{1F1E7}\u{1F1EA}" },
59
+ { iso: "CH", name: "Switzerland", code: "+41", flag: "\u{1F1E8}\u{1F1ED}" },
60
+ { iso: "SE", name: "Sweden", code: "+46", flag: "\u{1F1F8}\u{1F1EA}" },
61
+ { iso: "NO", name: "Norway", code: "+47", flag: "\u{1F1F3}\u{1F1F4}" },
62
+ { iso: "DK", name: "Denmark", code: "+45", flag: "\u{1F1E9}\u{1F1F0}" },
63
+ { iso: "FI", name: "Finland", code: "+358", flag: "\u{1F1EB}\u{1F1EE}" },
64
+ { iso: "IE", name: "Ireland", code: "+353", flag: "\u{1F1EE}\u{1F1EA}" },
65
+ { iso: "AT", name: "Austria", code: "+43", flag: "\u{1F1E6}\u{1F1F9}" },
66
+ { iso: "PL", name: "Poland", code: "+48", flag: "\u{1F1F5}\u{1F1F1}" },
67
+ { iso: "RU", name: "Russia", code: "+7", flag: "\u{1F1F7}\u{1F1FA}" },
68
+ { iso: "TR", name: "Turkey", code: "+90", flag: "\u{1F1F9}\u{1F1F7}" },
69
+ { iso: "IN", name: "India", code: "+91", flag: "\u{1F1EE}\u{1F1F3}" },
70
+ { iso: "CN", name: "China", code: "+86", flag: "\u{1F1E8}\u{1F1F3}" },
71
+ { iso: "JP", name: "Japan", code: "+81", flag: "\u{1F1EF}\u{1F1F5}" },
72
+ { iso: "KR", name: "South Korea", code: "+82", flag: "\u{1F1F0}\u{1F1F7}" },
73
+ { iso: "AU", name: "Australia", code: "+61", flag: "\u{1F1E6}\u{1F1FA}" },
74
+ { iso: "NZ", name: "New Zealand", code: "+64", flag: "\u{1F1F3}\u{1F1FF}" },
75
+ { iso: "ZA", name: "South Africa", code: "+27", flag: "\u{1F1FF}\u{1F1E6}" },
76
+ { iso: "NG", name: "Nigeria", code: "+234", flag: "\u{1F1F3}\u{1F1EC}" },
77
+ { iso: "EG", name: "Egypt", code: "+20", flag: "\u{1F1EA}\u{1F1EC}" },
78
+ { iso: "MA", name: "Morocco", code: "+212", flag: "\u{1F1F2}\u{1F1E6}" },
79
+ { iso: "IL", name: "Israel", code: "+972", flag: "\u{1F1EE}\u{1F1F1}" },
80
+ { iso: "SA", name: "Saudi Arabia", code: "+966", flag: "\u{1F1F8}\u{1F1E6}" },
81
+ { iso: "AE", name: "United Arab Emirates", code: "+971", flag: "\u{1F1E6}\u{1F1EA}" },
82
+ { iso: "SG", name: "Singapore", code: "+65", flag: "\u{1F1F8}\u{1F1EC}" },
83
+ { iso: "HK", name: "Hong Kong", code: "+852", flag: "\u{1F1ED}\u{1F1F0}" },
84
+ { iso: "MY", name: "Malaysia", code: "+60", flag: "\u{1F1F2}\u{1F1FE}" },
85
+ { iso: "PH", name: "Philippines", code: "+63", flag: "\u{1F1F5}\u{1F1ED}" },
86
+ { iso: "TH", name: "Thailand", code: "+66", flag: "\u{1F1F9}\u{1F1ED}" },
87
+ { iso: "VN", name: "Vietnam", code: "+84", flag: "\u{1F1FB}\u{1F1F3}" },
88
+ { iso: "ID", name: "Indonesia", code: "+62", flag: "\u{1F1EE}\u{1F1E9}" },
89
+ { iso: "PK", name: "Pakistan", code: "+92", flag: "\u{1F1F5}\u{1F1F0}" },
90
+ { iso: "BD", name: "Bangladesh", code: "+880", flag: "\u{1F1E7}\u{1F1E9}" },
91
+ { iso: "UA", name: "Ukraine", code: "+380", flag: "\u{1F1FA}\u{1F1E6}" },
92
+ { iso: "RO", name: "Romania", code: "+40", flag: "\u{1F1F7}\u{1F1F4}" },
93
+ { iso: "CZ", name: "Czech Republic", code: "+420", flag: "\u{1F1E8}\u{1F1FF}" },
94
+ { iso: "GR", name: "Greece", code: "+30", flag: "\u{1F1EC}\u{1F1F7}" },
95
+ { iso: "HU", name: "Hungary", code: "+36", flag: "\u{1F1ED}\u{1F1FA}" },
96
+ { iso: "SK", name: "Slovakia", code: "+421", flag: "\u{1F1F8}\u{1F1F0}" },
97
+ { iso: "HR", name: "Croatia", code: "+385", flag: "\u{1F1ED}\u{1F1F7}" },
98
+ { iso: "CR", name: "Costa Rica", code: "+506", flag: "\u{1F1E8}\u{1F1F7}" },
99
+ { iso: "PA", name: "Panama", code: "+507", flag: "\u{1F1F5}\u{1F1E6}" },
100
+ { iso: "DO", name: "Dominican Republic", code: "+1", flag: "\u{1F1E9}\u{1F1F4}" },
101
+ { iso: "PR", name: "Puerto Rico", code: "+1", flag: "\u{1F1F5}\u{1F1F7}" },
102
+ { iso: "EC", name: "Ecuador", code: "+593", flag: "\u{1F1EA}\u{1F1E8}" },
103
+ { iso: "VE", name: "Venezuela", code: "+58", flag: "\u{1F1FB}\u{1F1EA}" },
104
+ { iso: "UY", name: "Uruguay", code: "+598", flag: "\u{1F1FA}\u{1F1FE}" },
105
+ { iso: "PY", name: "Paraguay", code: "+595", flag: "\u{1F1F5}\u{1F1FE}" },
106
+ { iso: "BO", name: "Bolivia", code: "+591", flag: "\u{1F1E7}\u{1F1F4}" },
107
+ { iso: "CU", name: "Cuba", code: "+53", flag: "\u{1F1E8}\u{1F1FA}" },
108
+ { iso: "KE", name: "Kenya", code: "+254", flag: "\u{1F1F0}\u{1F1EA}" },
109
+ { iso: "GH", name: "Ghana", code: "+233", flag: "\u{1F1EC}\u{1F1ED}" },
110
+ { iso: "TZ", name: "Tanzania", code: "+255", flag: "\u{1F1F9}\u{1F1FF}" },
111
+ { iso: "ET", name: "Ethiopia", code: "+251", flag: "\u{1F1EA}\u{1F1F9}" },
112
+ { iso: "DZ", name: "Algeria", code: "+213", flag: "\u{1F1E9}\u{1F1FF}" },
113
+ { iso: "TN", name: "Tunisia", code: "+216", flag: "\u{1F1F9}\u{1F1F3}" }
114
+ ];
115
+
116
+ // src/country-select.tsx
117
+ import { jsx, jsxs } from "react/jsx-runtime";
118
+ var sizeStyles = {
119
+ sm: "h-8 text-xs",
120
+ md: "h-10 text-sm",
121
+ lg: "h-12 text-base"
122
+ };
123
+ function CountrySelect({ value, onChange, size = "md", disabled }) {
124
+ var _a;
125
+ const baseId = useId();
126
+ const listId = `${baseId}-listbox`;
127
+ const [open, setOpen] = useState(false);
128
+ const [search, setSearch] = useState("");
129
+ const searchRef = useRef(null);
130
+ const selected = (_a = countries.find((c) => c.iso === value)) != null ? _a : countries[0];
131
+ const filtered = useMemo(() => {
132
+ if (!search) return countries;
133
+ const q = search.toLowerCase();
134
+ return countries.filter(
135
+ (c) => c.name.toLowerCase().includes(q) || c.code.includes(q) || c.iso.toLowerCase().includes(q)
136
+ );
137
+ }, [search]);
138
+ const listbox = useListbox({
139
+ id: baseId,
140
+ items: filtered,
141
+ getKey: (c) => c.iso,
142
+ getText: (c) => c.name,
143
+ open
144
+ });
145
+ const { setTrigger, setPanel, floatingStyles, triggerHandlers } = useFloatingPanel({
146
+ open,
147
+ onOpenChange: (next) => {
148
+ setOpen(next);
149
+ if (!next) setSearch("");
150
+ },
151
+ placement: "bottom-start",
152
+ offset: 4,
153
+ onShow: () => {
154
+ var _a2;
155
+ return (_a2 = searchRef.current) == null ? void 0 : _a2.focus({ preventScroll: true });
156
+ }
157
+ });
158
+ function closeList() {
159
+ setOpen(false);
160
+ setSearch("");
161
+ }
162
+ function openList() {
163
+ if (disabled) return;
164
+ listbox.setActiveKey(value);
165
+ setOpen(true);
166
+ }
167
+ function commit(iso) {
168
+ onChange(iso);
169
+ closeList();
170
+ }
171
+ function onTriggerKeyDown(e) {
172
+ if (disabled || open) return;
173
+ if (e.key === "ArrowDown" || e.key === "ArrowUp" || e.key === "Enter" || e.key === " ") {
174
+ e.preventDefault();
175
+ openList();
176
+ }
177
+ }
178
+ function onSearchKeyDown(e) {
179
+ if (listbox.navigate(e, { homeEnd: false })) return;
180
+ if (e.key === "Enter") {
181
+ e.preventDefault();
182
+ if (listbox.activeItem) commit(listbox.activeItem.iso);
183
+ } else if (e.key === "Escape") {
184
+ e.preventDefault();
185
+ closeList();
186
+ } else if (e.key === "Tab") {
187
+ if (listbox.activeItem) onChange(listbox.activeItem.iso);
188
+ closeList();
189
+ }
190
+ }
191
+ return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
192
+ /* @__PURE__ */ jsxs(
193
+ "div",
194
+ {
195
+ ref: setTrigger,
196
+ role: "combobox",
197
+ "aria-label": "Country code",
198
+ "aria-haspopup": "listbox",
199
+ "aria-expanded": open,
200
+ "aria-controls": listId,
201
+ tabIndex: disabled ? -1 : 0,
202
+ "aria-disabled": disabled || void 0,
203
+ onPointerDown: () => {
204
+ if (!disabled) triggerHandlers.onPointerDown();
205
+ },
206
+ onClick: () => {
207
+ if (disabled) return;
208
+ if (!open) listbox.setActiveKey(value);
209
+ triggerHandlers.onClick();
210
+ },
211
+ onKeyDown: onTriggerKeyDown,
212
+ className: cn(
213
+ "flex cursor-pointer items-center gap-1 rounded-l-glob-md border border-r-0 border-glob-border bg-glob-surface px-2 text-glob-text transition-colors hover:bg-glob-surface-hover outline-none focus-visible:ring-2 focus-visible:ring-glob-ring aria-disabled:cursor-not-allowed aria-disabled:opacity-50",
214
+ sizeStyles[size]
215
+ ),
216
+ children: [
217
+ /* @__PURE__ */ jsx("span", { className: "text-base leading-none", "aria-hidden": "true", children: selected.flag }),
218
+ /* @__PURE__ */ jsx("span", { className: "text-glob-text-secondary", children: selected.code }),
219
+ /* @__PURE__ */ jsx(
220
+ "svg",
221
+ {
222
+ className: cn("h-3 w-3 text-glob-text-secondary transition-transform", open && "rotate-180"),
223
+ viewBox: "0 0 24 24",
224
+ fill: "none",
225
+ stroke: "currentColor",
226
+ strokeWidth: "2",
227
+ "aria-hidden": "true",
228
+ children: /* @__PURE__ */ jsx("path", { d: "M6 9l6 6 6-6" })
229
+ }
230
+ )
231
+ ]
232
+ }
233
+ ),
234
+ /* @__PURE__ */ jsxs(
235
+ "div",
236
+ {
237
+ ref: setPanel,
238
+ popover: "auto",
239
+ style: floatingStyles,
240
+ className: cn(
241
+ "m-0 w-72 overflow-visible rounded-glob-md border border-glob-border bg-glob-surface text-sm text-glob-text shadow-glob-md outline-none",
242
+ "opacity-0 transition-[opacity,overlay,display] transition-discrete duration-150 open:opacity-100 starting:open:opacity-0 motion-reduce:transition-none"
243
+ ),
244
+ children: [
245
+ /* @__PURE__ */ jsx("div", { className: "border-b border-glob-border p-2", children: /* @__PURE__ */ jsx(
246
+ "input",
247
+ {
248
+ ref: searchRef,
249
+ type: "text",
250
+ value: search,
251
+ onChange: (e) => setSearch(e.target.value),
252
+ onKeyDown: onSearchKeyDown,
253
+ placeholder: "Search country...",
254
+ "aria-label": "Search countries",
255
+ "aria-controls": listId,
256
+ "aria-autocomplete": "list",
257
+ "aria-activedescendant": listbox.activeDescendant,
258
+ autoComplete: "off",
259
+ className: "w-full rounded-glob-sm border border-glob-border bg-glob-surface-secondary px-2 py-1.5 text-sm text-glob-text placeholder:text-glob-text-secondary outline-none focus:ring-1 focus:ring-glob-ring"
260
+ }
261
+ ) }),
262
+ /* @__PURE__ */ jsx("div", { id: listId, role: "listbox", "aria-label": "Countries", className: "relative max-h-60 overflow-y-auto p-1", children: filtered.map((country) => {
263
+ const isSelected = country.iso === selected.iso;
264
+ const isActive = listbox.activeKey === country.iso;
265
+ return /* @__PURE__ */ jsxs(
266
+ "div",
267
+ {
268
+ id: listbox.optionId(country.iso),
269
+ role: "option",
270
+ "aria-selected": isSelected,
271
+ onMouseDown: (e) => e.preventDefault(),
272
+ onPointerMove: () => listbox.setActiveKey(country.iso),
273
+ onClick: () => commit(country.iso),
274
+ className: cn(
275
+ "flex w-full cursor-pointer items-center gap-3 rounded-glob-sm px-2 py-2 text-left text-sm select-none",
276
+ isActive && "bg-glob-surface-hover",
277
+ // The selected row is marked by font weight; orange text on white fails contrast.
278
+ isSelected && "font-medium"
279
+ ),
280
+ children: [
281
+ /* @__PURE__ */ jsx("span", { className: "text-base leading-none", "aria-hidden": "true", children: country.flag }),
282
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: country.name }),
283
+ /* @__PURE__ */ jsx("span", { className: "text-glob-text", children: country.code })
284
+ ]
285
+ },
286
+ country.iso
287
+ );
288
+ }) }),
289
+ filtered.length === 0 && /* @__PURE__ */ jsx("div", { role: "status", className: "px-3 py-4 text-center text-sm text-glob-text-secondary", children: "No countries found" })
290
+ ]
291
+ }
292
+ )
293
+ ] });
294
+ }
295
+
296
+ // src/phone-input.tsx
297
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
298
+ var phoneInputVariants = cva(
299
+ "flex items-center rounded-glob-md border border-glob-border bg-glob-surface transition-colors has-[input:focus-visible]:ring-2 has-[input:focus-visible]:ring-glob-ring has-[input:focus-visible]:ring-offset-0 has-[[aria-disabled=true]]:opacity-50 has-[[aria-disabled=true]]:cursor-not-allowed has-[input[aria-invalid=true]]:border-glob-danger has-[input[aria-invalid=true]]:has-[input:focus-visible]:ring-glob-danger",
300
+ {
301
+ variants: {
302
+ size: {
303
+ sm: "h-8",
304
+ md: "h-10",
305
+ lg: "h-12"
306
+ }
307
+ },
308
+ defaultVariants: {
309
+ size: "md"
310
+ }
311
+ }
312
+ );
313
+ var inputSizeStyles = {
314
+ sm: "text-xs",
315
+ md: "text-sm",
316
+ lg: "text-base"
317
+ };
318
+ var PhoneInput = forwardRef(
319
+ (_a, ref) => {
320
+ var _b = _a, { className, size = "md", country, onCountryChange, value, onChange, placeholder, disabled } = _b, props = __objRest(_b, ["className", "size", "country", "onCountryChange", "value", "onChange", "placeholder", "disabled"]);
321
+ const [internalCountry, setInternalCountry] = useState2("US");
322
+ const selectedIso = country != null ? country : internalCountry;
323
+ const handleCountryChange = useCallback(
324
+ (iso) => {
325
+ setInternalCountry(iso);
326
+ onCountryChange == null ? void 0 : onCountryChange(iso);
327
+ },
328
+ [onCountryChange]
329
+ );
330
+ return /* @__PURE__ */ jsxs2("div", { className: cn2(phoneInputVariants({ size, className })), children: [
331
+ /* @__PURE__ */ jsx2(
332
+ CountrySelect,
333
+ {
334
+ value: selectedIso,
335
+ onChange: handleCountryChange,
336
+ size: size != null ? size : "md",
337
+ disabled
338
+ }
339
+ ),
340
+ /* @__PURE__ */ jsx2("div", { className: "h-5 w-px bg-glob-border" }),
341
+ /* @__PURE__ */ jsx2("div", { className: "flex flex-1 items-center pl-2", children: /* @__PURE__ */ jsx2(
342
+ "input",
343
+ __spreadValues({
344
+ ref,
345
+ type: "tel",
346
+ value,
347
+ onChange,
348
+ disabled,
349
+ placeholder: placeholder != null ? placeholder : "555 000 0000",
350
+ className: cn2(
351
+ "h-full flex-1 bg-transparent text-glob-text outline-none placeholder:text-glob-text-secondary",
352
+ inputSizeStyles[size != null ? size : "md"]
353
+ )
354
+ }, props)
355
+ ) })
356
+ ] });
357
+ }
358
+ );
359
+ PhoneInput.displayName = "PhoneInput";
360
+ export {
361
+ PhoneInput,
362
+ phoneInputVariants
363
+ };
364
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/phone-input.tsx","../src/country-select.tsx","../src/country-data.ts"],"sourcesContent":["\"use client\"\n\nimport { forwardRef, useState, useCallback } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"@glob-ui/utils\"\nimport { CountrySelect } from \"./country-select\"\n\nconst phoneInputVariants = cva(\n \"flex items-center rounded-glob-md border border-glob-border bg-glob-surface transition-colors has-[input:focus-visible]:ring-2 has-[input:focus-visible]:ring-glob-ring has-[input:focus-visible]:ring-offset-0 has-[[aria-disabled=true]]:opacity-50 has-[[aria-disabled=true]]:cursor-not-allowed has-[input[aria-invalid=true]]:border-glob-danger has-[input[aria-invalid=true]]:has-[input:focus-visible]:ring-glob-danger\",\n {\n variants: {\n size: {\n sm: \"h-8\",\n md: \"h-10\",\n lg: \"h-12\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nconst inputSizeStyles = {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n}\n\nexport interface PhoneInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof phoneInputVariants> {\n country?: string\n onCountryChange?: (iso: string) => void\n}\n\nconst PhoneInput = forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ className, size = \"md\", country, onCountryChange, value, onChange, placeholder, disabled, ...props }, ref) => {\n const [internalCountry, setInternalCountry] = useState(\"US\")\n const selectedIso = country ?? internalCountry\n\n const handleCountryChange = useCallback(\n (iso: string) => {\n setInternalCountry(iso)\n onCountryChange?.(iso)\n },\n [onCountryChange]\n )\n\n return (\n <div className={cn(phoneInputVariants({ size, className }))}>\n <CountrySelect\n value={selectedIso}\n onChange={handleCountryChange}\n size={size ?? \"md\"}\n disabled={disabled}\n />\n\n <div className=\"h-5 w-px bg-glob-border\" />\n\n <div className=\"flex flex-1 items-center pl-2\">\n <input\n ref={ref}\n type=\"tel\"\n value={value}\n onChange={onChange}\n disabled={disabled}\n placeholder={placeholder ?? \"555 000 0000\"}\n className={cn(\n \"h-full flex-1 bg-transparent text-glob-text outline-none placeholder:text-glob-text-secondary\",\n inputSizeStyles[size ?? \"md\"]\n )}\n {...props}\n />\n </div>\n </div>\n )\n }\n)\nPhoneInput.displayName = \"PhoneInput\"\n\nexport { PhoneInput, phoneInputVariants }\n","\"use client\"\n\nimport { useId, useMemo, useRef, useState } from \"react\"\nimport { cn } from \"@glob-ui/utils\"\nimport { useFloatingPanel, useListbox } from \"@glob-ui/hooks\"\nimport { countries } from \"./country-data\"\n\ninterface CountrySelectProps {\n value: string\n onChange: (iso: string) => void\n size?: \"sm\" | \"md\" | \"lg\"\n disabled?: boolean\n}\n\nconst sizeStyles = {\n sm: \"h-8 text-xs\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n}\n\nexport function CountrySelect({ value, onChange, size = \"md\", disabled }: CountrySelectProps) {\n const baseId = useId()\n const listId = `${baseId}-listbox`\n const [open, setOpen] = useState(false)\n const [search, setSearch] = useState(\"\")\n const searchRef = useRef<HTMLInputElement>(null)\n\n const selected = countries.find((c) => c.iso === value) ?? countries[0]\n\n // Matches name, dial code and ISO code.\n const filtered = useMemo(() => {\n if (!search) return countries\n const q = search.toLowerCase()\n return countries.filter(\n (c) => c.name.toLowerCase().includes(q) || c.code.includes(q) || c.iso.toLowerCase().includes(q)\n )\n }, [search])\n\n const listbox = useListbox({\n id: baseId,\n items: filtered,\n getKey: (c) => c.iso,\n getText: (c) => c.name,\n open,\n })\n\n const { setTrigger, setPanel, floatingStyles, triggerHandlers } = useFloatingPanel({\n open,\n onOpenChange: (next) => {\n setOpen(next)\n if (!next) setSearch(\"\")\n },\n placement: \"bottom-start\",\n offset: 4,\n onShow: () => searchRef.current?.focus({ preventScroll: true }),\n })\n\n /** Closes the list and clears the search, so the next open starts from the full list. */\n function closeList() {\n setOpen(false)\n setSearch(\"\")\n }\n\n function openList() {\n if (disabled) return\n listbox.setActiveKey(value)\n setOpen(true)\n }\n\n function commit(iso: string) {\n onChange(iso)\n closeList()\n }\n\n function onTriggerKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (disabled || open) return\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n openList()\n }\n }\n\n function onSearchKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (listbox.navigate(e, { homeEnd: false })) return\n if (e.key === \"Enter\") {\n e.preventDefault()\n if (listbox.activeItem) commit(listbox.activeItem.iso)\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n closeList()\n } else if (e.key === \"Tab\") {\n if (listbox.activeItem) onChange(listbox.activeItem.iso)\n closeList()\n }\n }\n\n return (\n <div className=\"relative\">\n <div\n ref={setTrigger}\n role=\"combobox\"\n aria-label=\"Country code\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n onPointerDown={() => {\n if (!disabled) triggerHandlers.onPointerDown()\n }}\n onClick={() => {\n if (disabled) return\n if (!open) listbox.setActiveKey(value)\n triggerHandlers.onClick()\n }}\n onKeyDown={onTriggerKeyDown}\n className={cn(\n \"flex cursor-pointer items-center gap-1 rounded-l-glob-md border border-r-0 border-glob-border bg-glob-surface px-2 text-glob-text transition-colors hover:bg-glob-surface-hover outline-none focus-visible:ring-2 focus-visible:ring-glob-ring aria-disabled:cursor-not-allowed aria-disabled:opacity-50\",\n sizeStyles[size]\n )}\n >\n <span className=\"text-base leading-none\" aria-hidden=\"true\">{selected.flag}</span>\n <span className=\"text-glob-text-secondary\">{selected.code}</span>\n <svg\n className={cn(\"h-3 w-3 text-glob-text-secondary transition-transform\", open && \"rotate-180\")}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </div>\n\n <div\n ref={setPanel}\n popover=\"auto\"\n style={floatingStyles}\n className={cn(\n \"m-0 w-72 overflow-visible rounded-glob-md border border-glob-border bg-glob-surface text-sm text-glob-text shadow-glob-md outline-none\",\n \"opacity-0 transition-[opacity,overlay,display] transition-discrete duration-150 open:opacity-100 starting:open:opacity-0 motion-reduce:transition-none\"\n )}\n >\n <div className=\"border-b border-glob-border p-2\">\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder=\"Search country...\"\n aria-label=\"Search countries\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={listbox.activeDescendant}\n autoComplete=\"off\"\n className=\"w-full rounded-glob-sm border border-glob-border bg-glob-surface-secondary px-2 py-1.5 text-sm text-glob-text placeholder:text-glob-text-secondary outline-none focus:ring-1 focus:ring-glob-ring\"\n />\n </div>\n <div id={listId} role=\"listbox\" aria-label=\"Countries\" className=\"relative max-h-60 overflow-y-auto p-1\">\n {filtered.map((country) => {\n const isSelected = country.iso === selected.iso\n const isActive = listbox.activeKey === country.iso\n return (\n <div\n key={country.iso}\n id={listbox.optionId(country.iso)}\n role=\"option\"\n aria-selected={isSelected}\n onMouseDown={(e) => e.preventDefault()}\n onPointerMove={() => listbox.setActiveKey(country.iso)}\n onClick={() => commit(country.iso)}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-3 rounded-glob-sm px-2 py-2 text-left text-sm select-none\",\n isActive && \"bg-glob-surface-hover\",\n // The selected row is marked by font weight; orange text on white fails contrast.\n isSelected && \"font-medium\"\n )}\n >\n <span className=\"text-base leading-none\" aria-hidden=\"true\">{country.flag}</span>\n <span className=\"flex-1\">{country.name}</span>\n <span className=\"text-glob-text\">{country.code}</span>\n </div>\n )\n })}\n </div>\n {filtered.length === 0 && (\n <div role=\"status\" className=\"px-3 py-4 text-center text-sm text-glob-text-secondary\">\n No countries found\n </div>\n )}\n </div>\n </div>\n )\n}\n","export interface Country {\n iso: string\n name: string\n code: string\n flag: string\n}\n\nexport const countries: Country[] = [\n { iso: \"US\", name: \"United States\", code: \"+1\", flag: \"๐Ÿ‡บ๐Ÿ‡ธ\" },\n { iso: \"GB\", name: \"United Kingdom\", code: \"+44\", flag: \"๐Ÿ‡ฌ๐Ÿ‡ง\" },\n { iso: \"CA\", name: \"Canada\", code: \"+1\", flag: \"๐Ÿ‡จ๐Ÿ‡ฆ\" },\n { iso: \"MX\", name: \"Mexico\", code: \"+52\", flag: \"๐Ÿ‡ฒ๐Ÿ‡ฝ\" },\n { iso: \"AR\", name: \"Argentina\", code: \"+54\", flag: \"๐Ÿ‡ฆ๐Ÿ‡ท\" },\n { iso: \"BR\", name: \"Brazil\", code: \"+55\", flag: \"๐Ÿ‡ง๐Ÿ‡ท\" },\n { iso: \"CL\", name: \"Chile\", code: \"+56\", flag: \"๐Ÿ‡จ๐Ÿ‡ฑ\" },\n { iso: \"CO\", name: \"Colombia\", code: \"+57\", flag: \"๐Ÿ‡จ๐Ÿ‡ด\" },\n { iso: \"PE\", name: \"Peru\", code: \"+51\", flag: \"๐Ÿ‡ต๐Ÿ‡ช\" },\n { iso: \"ES\", name: \"Spain\", code: \"+34\", flag: \"๐Ÿ‡ช๐Ÿ‡ธ\" },\n { iso: \"FR\", name: \"France\", code: \"+33\", flag: \"๐Ÿ‡ซ๐Ÿ‡ท\" },\n { iso: \"DE\", name: \"Germany\", code: \"+49\", flag: \"๐Ÿ‡ฉ๐Ÿ‡ช\" },\n { iso: \"IT\", name: \"Italy\", code: \"+39\", flag: \"๐Ÿ‡ฎ๐Ÿ‡น\" },\n { iso: \"PT\", name: \"Portugal\", code: \"+351\", flag: \"๐Ÿ‡ต๐Ÿ‡น\" },\n { iso: \"NL\", name: \"Netherlands\", code: \"+31\", flag: \"๐Ÿ‡ณ๐Ÿ‡ฑ\" },\n { iso: \"BE\", name: \"Belgium\", code: \"+32\", flag: \"๐Ÿ‡ง๐Ÿ‡ช\" },\n { iso: \"CH\", name: \"Switzerland\", code: \"+41\", flag: \"๐Ÿ‡จ๐Ÿ‡ญ\" },\n { iso: \"SE\", name: \"Sweden\", code: \"+46\", flag: \"๐Ÿ‡ธ๐Ÿ‡ช\" },\n { iso: \"NO\", name: \"Norway\", code: \"+47\", flag: \"๐Ÿ‡ณ๐Ÿ‡ด\" },\n { iso: \"DK\", name: \"Denmark\", code: \"+45\", flag: \"๐Ÿ‡ฉ๐Ÿ‡ฐ\" },\n { iso: \"FI\", name: \"Finland\", code: \"+358\", flag: \"๐Ÿ‡ซ๐Ÿ‡ฎ\" },\n { iso: \"IE\", name: \"Ireland\", code: \"+353\", flag: \"๐Ÿ‡ฎ๐Ÿ‡ช\" },\n { iso: \"AT\", name: \"Austria\", code: \"+43\", flag: \"๐Ÿ‡ฆ๐Ÿ‡น\" },\n { iso: \"PL\", name: \"Poland\", code: \"+48\", flag: \"๐Ÿ‡ต๐Ÿ‡ฑ\" },\n { iso: \"RU\", name: \"Russia\", code: \"+7\", flag: \"๐Ÿ‡ท๐Ÿ‡บ\" },\n { iso: \"TR\", name: \"Turkey\", code: \"+90\", flag: \"๐Ÿ‡น๐Ÿ‡ท\" },\n { iso: \"IN\", name: \"India\", code: \"+91\", flag: \"๐Ÿ‡ฎ๐Ÿ‡ณ\" },\n { iso: \"CN\", name: \"China\", code: \"+86\", flag: \"๐Ÿ‡จ๐Ÿ‡ณ\" },\n { iso: \"JP\", name: \"Japan\", code: \"+81\", flag: \"๐Ÿ‡ฏ๐Ÿ‡ต\" },\n { iso: \"KR\", name: \"South Korea\", code: \"+82\", flag: \"๐Ÿ‡ฐ๐Ÿ‡ท\" },\n { iso: \"AU\", name: \"Australia\", code: \"+61\", flag: \"๐Ÿ‡ฆ๐Ÿ‡บ\" },\n { iso: \"NZ\", name: \"New Zealand\", code: \"+64\", flag: \"๐Ÿ‡ณ๐Ÿ‡ฟ\" },\n { iso: \"ZA\", name: \"South Africa\", code: \"+27\", flag: \"๐Ÿ‡ฟ๐Ÿ‡ฆ\" },\n { iso: \"NG\", name: \"Nigeria\", code: \"+234\", flag: \"๐Ÿ‡ณ๐Ÿ‡ฌ\" },\n { iso: \"EG\", name: \"Egypt\", code: \"+20\", flag: \"๐Ÿ‡ช๐Ÿ‡ฌ\" },\n { iso: \"MA\", name: \"Morocco\", code: \"+212\", flag: \"๐Ÿ‡ฒ๐Ÿ‡ฆ\" },\n { iso: \"IL\", name: \"Israel\", code: \"+972\", flag: \"๐Ÿ‡ฎ๐Ÿ‡ฑ\" },\n { iso: \"SA\", name: \"Saudi Arabia\", code: \"+966\", flag: \"๐Ÿ‡ธ๐Ÿ‡ฆ\" },\n { iso: \"AE\", name: \"United Arab Emirates\", code: \"+971\", flag: \"๐Ÿ‡ฆ๐Ÿ‡ช\" },\n { iso: \"SG\", name: \"Singapore\", code: \"+65\", flag: \"๐Ÿ‡ธ๐Ÿ‡ฌ\" },\n { iso: \"HK\", name: \"Hong Kong\", code: \"+852\", flag: \"๐Ÿ‡ญ๐Ÿ‡ฐ\" },\n { iso: \"MY\", name: \"Malaysia\", code: \"+60\", flag: \"๐Ÿ‡ฒ๐Ÿ‡พ\" },\n { iso: \"PH\", name: \"Philippines\", code: \"+63\", flag: \"๐Ÿ‡ต๐Ÿ‡ญ\" },\n { iso: \"TH\", name: \"Thailand\", code: \"+66\", flag: \"๐Ÿ‡น๐Ÿ‡ญ\" },\n { iso: \"VN\", name: \"Vietnam\", code: \"+84\", flag: \"๐Ÿ‡ป๐Ÿ‡ณ\" },\n { iso: \"ID\", name: \"Indonesia\", code: \"+62\", flag: \"๐Ÿ‡ฎ๐Ÿ‡ฉ\" },\n { iso: \"PK\", name: \"Pakistan\", code: \"+92\", flag: \"๐Ÿ‡ต๐Ÿ‡ฐ\" },\n { iso: \"BD\", name: \"Bangladesh\", code: \"+880\", flag: \"๐Ÿ‡ง๐Ÿ‡ฉ\" },\n { iso: \"UA\", name: \"Ukraine\", code: \"+380\", flag: \"๐Ÿ‡บ๐Ÿ‡ฆ\" },\n { iso: \"RO\", name: \"Romania\", code: \"+40\", flag: \"๐Ÿ‡ท๐Ÿ‡ด\" },\n { iso: \"CZ\", name: \"Czech Republic\", code: \"+420\", flag: \"๐Ÿ‡จ๐Ÿ‡ฟ\" },\n { iso: \"GR\", name: \"Greece\", code: \"+30\", flag: \"๐Ÿ‡ฌ๐Ÿ‡ท\" },\n { iso: \"HU\", name: \"Hungary\", code: \"+36\", flag: \"๐Ÿ‡ญ๐Ÿ‡บ\" },\n { iso: \"SK\", name: \"Slovakia\", code: \"+421\", flag: \"๐Ÿ‡ธ๐Ÿ‡ฐ\" },\n { iso: \"HR\", name: \"Croatia\", code: \"+385\", flag: \"๐Ÿ‡ญ๐Ÿ‡ท\" },\n { iso: \"CR\", name: \"Costa Rica\", code: \"+506\", flag: \"๐Ÿ‡จ๐Ÿ‡ท\" },\n { iso: \"PA\", name: \"Panama\", code: \"+507\", flag: \"๐Ÿ‡ต๐Ÿ‡ฆ\" },\n { iso: \"DO\", name: \"Dominican Republic\", code: \"+1\", flag: \"๐Ÿ‡ฉ๐Ÿ‡ด\" },\n { iso: \"PR\", name: \"Puerto Rico\", code: \"+1\", flag: \"๐Ÿ‡ต๐Ÿ‡ท\" },\n { iso: \"EC\", name: \"Ecuador\", code: \"+593\", flag: \"๐Ÿ‡ช๐Ÿ‡จ\" },\n { iso: \"VE\", name: \"Venezuela\", code: \"+58\", flag: \"๐Ÿ‡ป๐Ÿ‡ช\" },\n { iso: \"UY\", name: \"Uruguay\", code: \"+598\", flag: \"๐Ÿ‡บ๐Ÿ‡พ\" },\n { iso: \"PY\", name: \"Paraguay\", code: \"+595\", flag: \"๐Ÿ‡ต๐Ÿ‡พ\" },\n { iso: \"BO\", name: \"Bolivia\", code: \"+591\", flag: \"๐Ÿ‡ง๐Ÿ‡ด\" },\n { iso: \"CU\", name: \"Cuba\", code: \"+53\", flag: \"๐Ÿ‡จ๐Ÿ‡บ\" },\n { iso: \"KE\", name: \"Kenya\", code: \"+254\", flag: \"๐Ÿ‡ฐ๐Ÿ‡ช\" },\n { iso: \"GH\", name: \"Ghana\", code: \"+233\", flag: \"๐Ÿ‡ฌ๐Ÿ‡ญ\" },\n { iso: \"TZ\", name: \"Tanzania\", code: \"+255\", flag: \"๐Ÿ‡น๐Ÿ‡ฟ\" },\n { iso: \"ET\", name: \"Ethiopia\", code: \"+251\", flag: \"๐Ÿ‡ช๐Ÿ‡น\" },\n { iso: \"DZ\", name: \"Algeria\", code: \"+213\", flag: \"๐Ÿ‡ฉ๐Ÿ‡ฟ\" },\n { iso: \"TN\", name: \"Tunisia\", code: \"+216\", flag: \"๐Ÿ‡น๐Ÿ‡ณ\" },\n]\n\nexport function getCountryByIso(iso: string): Country | undefined {\n return countries.find((c) => c.iso === iso)\n}\n"],"mappings":"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","names":["useState","cn","_a","jsx","jsxs","useState","cn"]}
package/package.json CHANGED
@@ -1,6 +1,70 @@
1
1
  {
2
2
  "name": "@glob-ui/phone-input",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "main": "./dist/index.js",
5
+ "module": "./dist/index.mjs",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": {
10
+ "types": "./dist/index.d.mts",
11
+ "default": "./dist/index.mjs"
12
+ },
13
+ "require": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "./package.json": "./package.json"
19
+ },
20
+ "files": [
21
+ "dist/",
22
+ "LICENSE",
23
+ "README.md"
24
+ ],
25
+ "peerDependencies": {
26
+ "react": "^19",
27
+ "react-dom": "^19"
28
+ },
29
+ "dependencies": {
30
+ "@glob-ui/hooks": "0.1.0",
31
+ "@glob-ui/utils": "0.1.0",
32
+ "class-variance-authority": "^0.7.1"
33
+ },
34
+ "devDependencies": {
35
+ "tsup": "^8.5.1"
36
+ },
37
+ "description": "A telephone field with a country picker. The picker searches by country name, dial code and ISO code.",
38
+ "keywords": [
39
+ "react",
40
+ "glob-ui",
41
+ "components",
42
+ "accessible",
43
+ "tailwind",
44
+ "phone-input"
45
+ ],
46
+ "license": "MIT",
47
+ "author": "Kevin Martรญnez E",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/kevin-martineze/GlobUI.git",
51
+ "directory": "packages/phone-input"
52
+ },
53
+ "homepage": "https://github.com/kevin-martineze/GlobUI#readme",
54
+ "bugs": {
55
+ "url": "https://github.com/kevin-martineze/GlobUI/issues"
56
+ },
57
+ "publishConfig": {
58
+ "access": "public",
59
+ "provenance": true
60
+ },
61
+ "sideEffects": false,
62
+ "type": "commonjs",
63
+ "engines": {
64
+ "node": ">=18.18"
65
+ },
66
+ "scripts": {
67
+ "build": "tsup",
68
+ "dev": "tsup --watch --no-clean"
69
+ }
6
70
  }