@giddaa-housing/ui 0.1.0 → 1.0.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/README.md +18 -6
- package/css/base.css +37 -0
- package/css/components.css +135 -0
- package/css/generated/shared.css +1 -0
- package/css/giddaa.css +402 -0
- package/css/preset.css +77 -0
- package/css/styles.css +2 -0
- package/css/theme.css +255 -0
- package/dist/accordion.js +5 -35
- package/dist/accordion.js.map +1 -1
- package/dist/activity-timeline.d.ts +33 -0
- package/dist/activity-timeline.js +212 -0
- package/dist/activity-timeline.js.map +1 -0
- package/dist/alert.js +5 -35
- package/dist/alert.js.map +1 -1
- package/dist/auth-layout.d.ts +23 -0
- package/dist/auth-layout.js +304 -0
- package/dist/auth-layout.js.map +1 -0
- package/dist/avatar.js +10 -142
- package/dist/avatar.js.map +1 -1
- package/dist/badge.d.ts +3 -2
- package/dist/badge.js +6 -114
- package/dist/badge.js.map +1 -1
- package/dist/bar-chart.d.ts +101 -77
- package/dist/bar-chart.js +142 -220
- package/dist/bar-chart.js.map +1 -1
- package/dist/breadcrumb.js +5 -35
- package/dist/breadcrumb.js.map +1 -1
- package/dist/bullet-chart.js +15 -48
- package/dist/bullet-chart.js.map +1 -1
- package/dist/button-group.js +14 -90
- package/dist/button-group.js.map +1 -1
- package/dist/button.d.ts +5 -5
- package/dist/button.js +7 -140
- package/dist/button.js.map +1 -1
- package/dist/calendar.js +12 -287
- package/dist/calendar.js.map +1 -1
- package/dist/card.js +5 -35
- package/dist/card.js.map +1 -1
- package/dist/carousel.js +12 -386
- package/dist/carousel.js.map +1 -1
- package/dist/chart.js +16 -480
- package/dist/chart.js.map +1 -1
- package/dist/checkbox.d.ts +1 -1
- package/dist/checkbox.js +13 -48
- package/dist/checkbox.js.map +1 -1
- package/dist/chunk-322YCNVL.js +278 -0
- package/dist/chunk-322YCNVL.js.map +1 -0
- package/dist/chunk-3ACQVT7A.js +25 -0
- package/dist/chunk-3ACQVT7A.js.map +1 -0
- package/dist/chunk-3T65TLJX.js +334 -0
- package/dist/chunk-3T65TLJX.js.map +1 -0
- package/dist/chunk-6ZSGQHH2.js +192 -0
- package/dist/chunk-6ZSGQHH2.js.map +1 -0
- package/dist/chunk-7TBMLFGW.js +41 -0
- package/dist/chunk-7TBMLFGW.js.map +1 -0
- package/dist/chunk-B4H6RNDH.js +135 -0
- package/dist/chunk-B4H6RNDH.js.map +1 -0
- package/dist/chunk-BUXCGZ6X.js +219 -0
- package/dist/chunk-BUXCGZ6X.js.map +1 -0
- package/dist/chunk-CHII2QHH.js +58 -0
- package/dist/chunk-CHII2QHH.js.map +1 -0
- package/dist/chunk-DMNOXRRW.js +147 -0
- package/dist/chunk-DMNOXRRW.js.map +1 -0
- package/dist/chunk-EFSOSSIC.js +130 -0
- package/dist/chunk-EFSOSSIC.js.map +1 -0
- package/dist/chunk-FZDSVMKY.js +363 -0
- package/dist/chunk-FZDSVMKY.js.map +1 -0
- package/dist/chunk-GJOFIJS3.js +246 -0
- package/dist/chunk-GJOFIJS3.js.map +1 -0
- package/dist/chunk-HL3ZSYES.js +23 -0
- package/dist/chunk-HL3ZSYES.js.map +1 -0
- package/dist/chunk-JVLUBAPB.js +129 -0
- package/dist/chunk-JVLUBAPB.js.map +1 -0
- package/dist/chunk-KDPYSOYZ.js +64 -0
- package/dist/chunk-KDPYSOYZ.js.map +1 -0
- package/dist/chunk-KSMDANKI.js +43 -0
- package/dist/chunk-KSMDANKI.js.map +1 -0
- package/dist/chunk-MEKCCOP5.js +46 -0
- package/dist/chunk-MEKCCOP5.js.map +1 -0
- package/dist/chunk-NOFXVRWL.js +451 -0
- package/dist/chunk-NOFXVRWL.js.map +1 -0
- package/dist/chunk-PC5MHNVA.js +171 -0
- package/dist/chunk-PC5MHNVA.js.map +1 -0
- package/dist/chunk-QKAQZ2GU.js +122 -0
- package/dist/chunk-QKAQZ2GU.js.map +1 -0
- package/dist/chunk-QZHSHSVV.js +26 -0
- package/dist/chunk-QZHSHSVV.js.map +1 -0
- package/dist/chunk-RBMK26XD.js +19 -0
- package/dist/chunk-RBMK26XD.js.map +1 -0
- package/dist/chunk-SFNJGF6M.js +262 -0
- package/dist/chunk-SFNJGF6M.js.map +1 -0
- package/dist/chunk-UJJNLGTM.js +112 -0
- package/dist/chunk-UJJNLGTM.js.map +1 -0
- package/dist/chunk-VGR4ZWJ3.js +418 -0
- package/dist/chunk-VGR4ZWJ3.js.map +1 -0
- package/dist/chunk-XG47P6D4.js +99 -0
- package/dist/chunk-XG47P6D4.js.map +1 -0
- package/dist/chunk-XZZAHNVM.js +21 -0
- package/dist/chunk-XZZAHNVM.js.map +1 -0
- package/dist/chunk-Y4TTYVNE.js +36 -0
- package/dist/chunk-Y4TTYVNE.js.map +1 -0
- package/dist/chunk-YDWIHW6Q.js +69 -0
- package/dist/chunk-YDWIHW6Q.js.map +1 -0
- package/dist/collapsible.js +6 -35
- package/dist/collapsible.js.map +1 -1
- package/dist/combobox.js +26 -694
- package/dist/combobox.js.map +1 -1
- package/dist/cta.d.ts +66 -0
- package/dist/cta.js +358 -0
- package/dist/cta.js.map +1 -0
- package/dist/currency-selector.d.ts +42 -0
- package/dist/currency-selector.js +192 -0
- package/dist/currency-selector.js.map +1 -0
- package/dist/date-picker.d.ts +18 -10
- package/dist/date-picker.js +105 -430
- package/dist/date-picker.js.map +1 -1
- package/dist/details-card.d.ts +19 -0
- package/dist/details-card.js +267 -0
- package/dist/details-card.js.map +1 -0
- package/dist/dialog.js +36 -146
- package/dist/dialog.js.map +1 -1
- package/dist/dropdown-menu.d.ts +1 -1
- package/dist/dropdown-menu.js +20 -358
- package/dist/dropdown-menu.js.map +1 -1
- package/dist/dropzone.js +13 -40
- package/dist/dropzone.js.map +1 -1
- package/dist/editorial-card.d.ts +29 -0
- package/dist/editorial-card.js +311 -0
- package/dist/editorial-card.js.map +1 -0
- package/dist/empty-state.js +5 -35
- package/dist/empty-state.js.map +1 -1
- package/dist/field.js +30 -135
- package/dist/field.js.map +1 -1
- package/dist/footer.d.ts +47 -0
- package/dist/footer.js +430 -0
- package/dist/footer.js.map +1 -0
- package/dist/funnel-chart.js +42 -415
- package/dist/funnel-chart.js.map +1 -1
- package/dist/gallery-indicator.d.ts +18 -0
- package/dist/gallery-indicator.js +12 -0
- package/dist/gallery-indicator.js.map +1 -0
- package/dist/heatmap-chart.d.ts +98 -0
- package/dist/heatmap-chart.js +248 -0
- package/dist/heatmap-chart.js.map +1 -0
- package/dist/infotip.d.ts +11 -0
- package/dist/infotip.js +66 -0
- package/dist/infotip.js.map +1 -0
- package/dist/input-group.d.ts +2 -1
- package/dist/input-group.js +15 -371
- package/dist/input-group.js.map +1 -1
- package/dist/input-size-context.js +5 -19
- package/dist/input-size-context.js.map +1 -1
- package/dist/input.js +6 -78
- package/dist/input.js.map +1 -1
- package/dist/item.js +5 -35
- package/dist/item.js.map +1 -1
- package/dist/kpi-card.js +12 -52
- package/dist/kpi-card.js.map +1 -1
- package/dist/label.js +5 -64
- package/dist/label.js.map +1 -1
- package/dist/line-chart.js +9 -166
- package/dist/line-chart.js.map +1 -1
- package/dist/logo.js +4 -141
- package/dist/logo.js.map +1 -1
- package/dist/map-indicator.d.ts +13 -0
- package/dist/map-indicator.js +109 -0
- package/dist/map-indicator.js.map +1 -0
- package/dist/match.d.ts +16 -0
- package/dist/match.js +113 -0
- package/dist/match.js.map +1 -0
- package/dist/media-gallery-hero.d.ts +60 -0
- package/dist/media-gallery-hero.js +362 -0
- package/dist/media-gallery-hero.js.map +1 -0
- package/dist/media-player.d.ts +60 -0
- package/dist/media-player.js +1394 -0
- package/dist/media-player.js.map +1 -0
- package/dist/number-input.js +30 -325
- package/dist/number-input.js.map +1 -1
- package/dist/page-header.js +4 -32
- package/dist/page-header.js.map +1 -1
- package/dist/pagination.d.ts +1 -0
- package/dist/pagination.js +27 -161
- package/dist/pagination.js.map +1 -1
- package/dist/password-input.d.ts +1 -0
- package/dist/password-input.js +21 -319
- package/dist/password-input.js.map +1 -1
- package/dist/phone-input.d.ts +2 -1
- package/dist/phone-input.js +148 -359
- package/dist/phone-input.js.map +1 -1
- package/dist/photo-gallery.d.ts +1 -1
- package/dist/photo-gallery.js +97 -393
- package/dist/photo-gallery.js.map +1 -1
- package/dist/pie-chart.js +17 -52
- package/dist/pie-chart.js.map +1 -1
- package/dist/popover.js +13 -158
- package/dist/popover.js.map +1 -1
- package/dist/price-tag.d.ts +35 -0
- package/dist/price-tag.js +178 -0
- package/dist/price-tag.js.map +1 -0
- package/dist/progress.d.ts +5 -2
- package/dist/progress.js +14 -303
- package/dist/progress.js.map +1 -1
- package/dist/property-listing-card.d.ts +32 -0
- package/dist/property-listing-card.js +235 -0
- package/dist/property-listing-card.js.map +1 -0
- package/dist/radar-chart.d.ts +110 -0
- package/dist/radar-chart.js +147 -0
- package/dist/radar-chart.js.map +1 -0
- package/dist/radio-group.js +15 -50
- package/dist/radio-group.js.map +1 -1
- package/dist/review-block.d.ts +20 -0
- package/dist/review-block.js +10 -0
- package/dist/review-block.js.map +1 -0
- package/dist/rich-text-editor.js +172 -433
- package/dist/rich-text-editor.js.map +1 -1
- package/dist/scatter-chart.d.ts +142 -0
- package/dist/scatter-chart.js +252 -0
- package/dist/scatter-chart.js.map +1 -0
- package/dist/search-input.d.ts +1 -0
- package/dist/search-input.js +22 -320
- package/dist/search-input.js.map +1 -1
- package/dist/select.js +15 -292
- package/dist/select.js.map +1 -1
- package/dist/separator.js +5 -68
- package/dist/separator.js.map +1 -1
- package/dist/sheet.js +14 -271
- package/dist/sheet.js.map +1 -1
- package/dist/sidebar.d.ts +1 -1
- package/dist/sidebar.js +89 -494
- package/dist/sidebar.js.map +1 -1
- package/dist/size-context.js +5 -17
- package/dist/size-context.js.map +1 -1
- package/dist/skeleton.js +4 -44
- package/dist/skeleton.js.map +1 -1
- package/dist/slider.d.ts +28 -0
- package/dist/slider.js +152 -0
- package/dist/slider.js.map +1 -0
- package/dist/sparkline.js +33 -341
- package/dist/sparkline.js.map +1 -1
- package/dist/stepper.js +5 -35
- package/dist/stepper.js.map +1 -1
- package/dist/styles.css +9593 -2
- package/dist/switch.js +13 -48
- package/dist/switch.js.map +1 -1
- package/dist/tab-list.js +35 -306
- package/dist/tab-list.js.map +1 -1
- package/dist/table.js +5 -32
- package/dist/table.js.map +1 -1
- package/dist/tabs.js +10 -150
- package/dist/tabs.js.map +1 -1
- package/dist/tag.d.ts +7 -6
- package/dist/tag.js +101 -97
- package/dist/tag.js.map +1 -1
- package/dist/testimonial-block.d.ts +34 -0
- package/dist/testimonial-block.js +377 -0
- package/dist/testimonial-block.js.map +1 -0
- package/dist/textarea.js +6 -73
- package/dist/textarea.js.map +1 -1
- package/dist/time-picker.js +119 -279
- package/dist/time-picker.js.map +1 -1
- package/dist/toast.js +27 -132
- package/dist/toast.js.map +1 -1
- package/dist/tooltip.d.ts +5 -5
- package/dist/tooltip.js +7 -90
- package/dist/tooltip.js.map +1 -1
- package/dist/tree-map.js +41 -414
- package/dist/tree-map.js.map +1 -1
- package/dist/waterfall-chart.d.ts +129 -0
- package/dist/waterfall-chart.js +577 -0
- package/dist/waterfall-chart.js.map +1 -0
- package/package.json +98 -28
- package/dist/base.css +0 -32
- package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
- package/dist/index.d.ts +0 -87
- package/dist/index.js +0 -10448
- package/dist/index.js.map +0 -1
- package/dist/red-hat-display.css +0 -2
- package/dist/theme/giddaa.css +0 -2
package/dist/phone-input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ui/phone-input.tsx","../src/lib/cn.ts","../src/components/ui/input-group.tsx","../src/components/ui/size-context.tsx","../src/components/ui/input.tsx","../src/components/ui/input-size-context.tsx","../src/components/ui/popover.tsx","../src/components/ui/separator.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n\tAsYouType,\n\ttype CountryCode,\n\tgetCountries,\n\tgetCountryCallingCode,\n\tparsePhoneNumber,\n} from \"libphonenumber-js\";\nimport { CheckIcon, ChevronDownIcon, SearchIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport flags from \"react-phone-number-input/flags\";\n\nimport { cn } from \"../../lib/cn\";\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"./input-group\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { Separator } from \"./separator\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n// ─── Country data ─────────────────────────────────────────────────────────────\n\nconst regionNames =\n\ttypeof Intl !== \"undefined\" && \"DisplayNames\" in Intl\n\t\t? new Intl.DisplayNames([\"en\"], { type: \"region\" })\n\t\t: undefined;\n\ninterface CountryEntry {\n\tcode: CountryCode;\n\tname: string;\n\tcalling: string;\n}\n\nconst COUNTRIES: CountryEntry[] = getCountries()\n\t.map((code) => ({\n\t\tcode,\n\t\tname: regionNames?.of(code) ?? code,\n\t\tcalling: getCountryCallingCode(code),\n\t}))\n\t.sort((a, b) => a.name.localeCompare(b.name));\n\nfunction getNationalDigits(value: string): string {\n\treturn value.replace(/\\D/g, \"\");\n}\n\nfunction formatNational(digits: string, country: CountryCode): string {\n\tif (!digits) return \"\";\n\treturn new AsYouType(country).input(digits);\n}\n\nfunction toE164(digits: string, country: CountryCode): string | undefined {\n\tif (!digits) return undefined;\n\treturn `+${getCountryCallingCode(country)}${digits}`;\n}\n\nfunction parseValue(value: string | undefined): {\n\tcountry?: CountryCode;\n\tdigits: string;\n} {\n\tif (!value) return { digits: \"\" };\n\ttry {\n\t\tconst parsed = parsePhoneNumber(value);\n\t\tif (parsed?.nationalNumber) {\n\t\t\treturn { country: parsed.country, digits: parsed.nationalNumber };\n\t\t}\n\t} catch {\n\t\t// fall through to empty\n\t}\n\treturn { digits: \"\" };\n}\n\n// ─── Flag ─────────────────────────────────────────────────────────────────────\n\nconst flagSizeVariants: Record<ComponentSize, string> = {\n\tsm: \"h-3 w-[18px]\",\n\tmd: \"h-3.5 w-5\",\n\tlg: \"h-4 w-6\",\n};\n\nfunction CountryFlag({\n\tcountry,\n\tsize,\n\tclassName,\n}: {\n\tcountry: CountryCode;\n\tsize: ComponentSize;\n\tclassName?: string;\n}) {\n\tconst Flag = flags[country];\n\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex shrink-0 items-center justify-center overflow-hidden rounded-[3px] bg-surface-raised [&>svg]:h-full [&>svg]:w-full [&>svg]:object-cover\",\n\t\t\t\tflagSizeVariants[size],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{Flag ? (\n\t\t\t\t<Flag title={country} />\n\t\t\t) : (\n\t\t\t\t<span className=\"text-gdt-xs text-fg-secondary\">{country}</span>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n\n// ─── Country selector ─────────────────────────────────────────────────────────\n\nfunction CountrySelect({\n\tcountry,\n\tsize,\n\tdisabled,\n\tonSelect,\n}: {\n\tcountry: CountryCode;\n\tsize: ComponentSize;\n\tdisabled?: boolean;\n\tonSelect: (country: CountryCode) => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [query, setQuery] = React.useState(\"\");\n\tconst searchRef = React.useRef<HTMLInputElement>(null);\n\n\t// Move focus to the search field once the list has opened.\n\tReact.useEffect(() => {\n\t\tif (!open) return;\n\t\tconst frame = requestAnimationFrame(() => searchRef.current?.focus());\n\t\treturn () => cancelAnimationFrame(frame);\n\t}, [open]);\n\n\tconst filtered = React.useMemo(() => {\n\t\tconst q = query.trim().toLowerCase();\n\t\tif (!q) return COUNTRIES;\n\t\tconst normalized = q.replace(/^\\+/, \"\");\n\t\treturn COUNTRIES.filter(\n\t\t\t(entry) =>\n\t\t\t\tentry.name.toLowerCase().includes(q) ||\n\t\t\t\tentry.calling.includes(normalized) ||\n\t\t\t\tentry.code.toLowerCase().includes(q),\n\t\t);\n\t}, [query]);\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tsetOpen(next);\n\t\tif (!next) setQuery(\"\");\n\t}\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tdata-slot=\"phone-country-trigger\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center gap-1.5 rounded-full font-normal text-fg-primary outline-none transition-colors select-none\",\n\t\t\t\t\t\"focus-visible:text-fg-brand disabled:cursor-not-allowed disabled:text-fg-caption-placeholder\",\n\t\t\t\t\tsize === \"sm\" && \"text-gdt-xs\",\n\t\t\t\t\tsize === \"md\" && \"text-gdt-sm\",\n\t\t\t\t\tsize === \"lg\" && \"text-gdt-md\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<CountryFlag country={country} size={size} />\n\t\t\t\t<span>+{getCountryCallingCode(country)}</span>\n\t\t\t\t<ChevronDownIcon\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-fg-secondary transition-transform\",\n\t\t\t\t\t\topen && \"rotate-180\",\n\t\t\t\t\t\tsize === \"lg\" ? \"size-4\" : \"size-3.5\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\talignOffset={0}\n\t\t\t\tsideOffset={10}\n\t\t\t\tclassName=\"w-72 gap-0 overflow-hidden p-0\"\n\t\t\t>\n\t\t\t\t<div className=\"flex items-center gap-2 border-b border-line-subtle px-3.5 py-2.5\">\n\t\t\t\t\t<SearchIcon className=\"size-4 shrink-0 text-fg-secondary\" />\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={searchRef}\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tonChange={(event) => setQuery(event.target.value)}\n\t\t\t\t\t\tplaceholder=\"Search country\"\n\t\t\t\t\t\tclassName=\"w-full bg-transparent text-gdt-sm text-fg-primary outline-none placeholder:text-fg-caption-placeholder\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"no-scrollbar max-h-64 overflow-y-auto py-1.5\">\n\t\t\t\t\t{filtered.length === 0 ? (\n\t\t\t\t\t\t<p className=\"px-3.5 py-6 text-center text-gdt-sm text-fg-secondary\">\n\t\t\t\t\t\t\tNo country found\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tfiltered.map((entry) => {\n\t\t\t\t\t\t\tconst selected = entry.code === country;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={entry.code}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tonSelect(entry.code);\n\t\t\t\t\t\t\t\t\t\thandleOpenChange(false);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex w-full items-center gap-2.5 px-3.5 py-2 text-left text-gdt-sm outline-none transition-colors hover:bg-surface focus-visible:bg-surface\",\n\t\t\t\t\t\t\t\t\t\tselected ? \"font-medium text-fg-brand\" : \"text-fg-primary\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CountryFlag country={entry.code} size=\"md\" />\n\t\t\t\t\t\t\t\t\t<span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n\t\t\t\t\t\t\t\t\t<span className=\"shrink-0 text-fg-secondary\">\n\t\t\t\t\t\t\t\t\t\t+{entry.calling}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t{selected && (\n\t\t\t\t\t\t\t\t\t\t<CheckIcon className=\"size-4 shrink-0 text-fg-brand\" />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── PhoneInput ───────────────────────────────────────────────────────────────\n\ninterface PhoneInputProps {\n\tvalue?: string;\n\tonChange?: (value: string | undefined) => void;\n\tdefaultCountry?: CountryCode;\n\tsize?: ComponentSize;\n\tdisabled?: boolean;\n\treadOnly?: boolean;\n\tplaceholder?: string;\n\tclassName?: string;\n\tid?: string;\n\tname?: string;\n\t\"aria-invalid\"?: boolean;\n}\n\nfunction PhoneInput({\n\tvalue,\n\tonChange,\n\tdefaultCountry = \"NG\",\n\tsize,\n\tdisabled = false,\n\treadOnly = false,\n\tplaceholder = \"(0000) 000-0000\",\n\tclassName,\n\tid,\n\tname,\n\t\"aria-invalid\": ariaInvalid,\n}: PhoneInputProps) {\n\tconst resolvedSize = useComponentSize(size);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: seed once from the initial value; later updates flow through the sync effect below.\n\tconst initial = React.useMemo(() => parseValue(value), []);\n\tconst [country, setCountry] = React.useState<CountryCode>(\n\t\tinitial.country ?? defaultCountry,\n\t);\n\tconst [national, setNational] = React.useState(() =>\n\t\tformatNational(initial.digits, initial.country ?? defaultCountry),\n\t);\n\n\t// Keep internal state in sync when `value` is changed from outside.\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: only re-sync when the external `value` changes, not on internal edits.\n\tReact.useEffect(() => {\n\t\tconst currentDigits = getNationalDigits(national);\n\t\tif (toE164(currentDigits, country) === value) return;\n\n\t\tconst next = parseValue(value);\n\t\tconst nextCountry = next.country ?? country;\n\t\tsetCountry(nextCountry);\n\t\tsetNational(formatNational(next.digits, nextCountry));\n\t}, [value]);\n\n\tfunction emit(digits: string, nextCountry: CountryCode) {\n\t\tonChange?.(toE164(digits, nextCountry));\n\t}\n\n\tfunction handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n\t\tconst digits = getNationalDigits(event.target.value);\n\t\tsetNational(formatNational(digits, country));\n\t\temit(digits, country);\n\t}\n\n\tfunction handleCountrySelect(nextCountry: CountryCode) {\n\t\tconst digits = getNationalDigits(national);\n\t\tsetCountry(nextCountry);\n\t\tsetNational(formatNational(digits, nextCountry));\n\t\temit(digits, nextCountry);\n\t}\n\n\tconst dividerStateClasses = cn(\n\t\t\"group-hover/input-group:bg-line-strong\",\n\t\t\"group-focus-within/input-group:bg-line-focus\",\n\t\t\"group-has-[[aria-invalid=true]]/input-group:bg-line-danger\",\n\t\t\"group-has-disabled/input-group:bg-line-subtle\",\n\t);\n\n\treturn (\n\t\t<InputGroup size={resolvedSize} className={className}>\n\t\t\t<InputGroupAddon align=\"inline-start\" className=\"gap-2\">\n\t\t\t\t<CountrySelect\n\t\t\t\t\tcountry={country}\n\t\t\t\t\tsize={resolvedSize}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonSelect={handleCountrySelect}\n\t\t\t\t/>\n\t\t\t\t<Separator\n\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\tshade=\"deep\"\n\t\t\t\t\tclassName={cn(\"self-stretch transition-colors\", dividerStateClasses)}\n\t\t\t\t/>\n\t\t\t</InputGroupAddon>\n\t\t\t<InputGroupInput\n\t\t\t\tid={id}\n\t\t\t\tname={name}\n\t\t\t\ttype=\"tel\"\n\t\t\t\tinputMode=\"tel\"\n\t\t\t\tautoComplete=\"tel\"\n\t\t\t\tvalue={national}\n\t\t\t\tonChange={handleInputChange}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\taria-invalid={ariaInvalid || undefined}\n\t\t\t\tclassName=\"pl-0\"\n\t\t\t/>\n\t\t</InputGroup>\n\t);\n}\n\nexport { PhoneInput };\nexport type { PhoneInputProps, CountryCode };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [\n\t\t\t\t{\n\t\t\t\t\ttext: [\n\t\t\t\t\t\t\"gdt-display\",\n\t\t\t\t\t\t\"gdt-h1\",\n\t\t\t\t\t\t\"gdt-h2\",\n\t\t\t\t\t\t\"gdt-h3\",\n\t\t\t\t\t\t\"gdt-h4\",\n\t\t\t\t\t\t\"gdt-h5\",\n\t\t\t\t\t\t\"gdt-xl\",\n\t\t\t\t\t\t\"gdt-lg\",\n\t\t\t\t\t\t\"gdt-md\",\n\t\t\t\t\t\t\"gdt-sm\",\n\t\t\t\t\t\t\"gdt-xs\",\n\t\t\t\t\t\t\"gdt-subtext\",\n\t\t\t\t\t\t\"gdt-capitalized\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n});\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button } from \"./button\";\nimport { Input, type InputSize } from \"./input\";\nimport { InputSizeProvider } from \"./input-size-context\";\nimport {\n\ttype ComponentSize,\n\tSizeProvider,\n\tuseComponentSize,\n} from \"./size-context\";\nimport { Textarea, type TextareaSize } from \"./textarea\";\n\nconst inputGroupVariants = cva(\n\t\"group/input-group relative flex w-full min-w-0 items-center rounded-full has-[textarea]:rounded-xl has-data-[align=block-end]:rounded-xl has-data-[align=block-start]:rounded-xl border border-line bg-canvas transition-[background-color,border-color,box-shadow,color] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:border-line-subtle has-disabled:bg-surface has-disabled:text-fg-muted focus-within:border-line-focus focus-within:inset-ring-1 inset-ring-line-focus has-[[data-slot][aria-invalid=true]]:border-line-danger has-[[data-slot][aria-invalid=true]]:inset-shadow-none has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:group-data-[size=sm]/input-group:pl-2 has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:group-data-[size=md]/input-group:pl-2.5 has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:group-data-[size=lg]/input-group:pl-3 has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:group-data-[size=xl]/input-group:pl-3 has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:group-data-[size=sm]/input-group:pr-2 has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:group-data-[size=md]/input-group:pr-2.5 has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:group-data-[size=lg]/input-group:pr-3 has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:group-data-[size=xl]/input-group:pr-3\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"h-8\",\n\t\t\t\tmd: \"h-10\",\n\t\t\t\tlg: \"h-12\",\n\t\t\t\txl: \"h-14\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\nfunction InputGroup({\n\tclassName,\n\tsize,\n\t...props\n}: React.ComponentProps<\"div\"> & { size?: InputSize }) {\n\tconst inheritedSize = useComponentSize();\n\tconst resolvedSize = size ?? inheritedSize;\n\tconst componentSize: ComponentSize | undefined =\n\t\tresolvedSize === \"xl\" ? undefined : resolvedSize;\n\n\treturn (\n\t\t<SizeProvider size={componentSize}>\n\t\t\t<InputSizeProvider size={resolvedSize}>\n\t\t\t\t{/* biome-ignore lint/a11y/useSemanticElements: this primitive groups composite controls without forcing fieldset semantics. */}\n\t\t\t\t<div\n\t\t\t\t\tdata-slot=\"input-group\"\n\t\t\t\t\tdata-size={resolvedSize}\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\tclassName={cn(inputGroupVariants({ size: resolvedSize }), className)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</InputSizeProvider>\n\t\t</SizeProvider>\n\t);\n}\n\nconst inputGroupAddonVariants = cva(\n\t\"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-gdt-sm font-normal text-fg-secondary select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[size=lg]/input-group:[&>svg:not([class*='size-'])]:size-4.5 group-data-[size=xl]/input-group:[&>svg:not([class*='size-'])]:size-5 [&>svg:not([class*='size-'])]:size-4\",\n\t{\n\t\tvariants: {\n\t\t\talign: {\n\t\t\t\t\"inline-start\":\n\t\t\t\t\t\"order-first group-data-[size=sm]/input-group:pl-3 group-data-[size=md]/input-group:pl-3.5 group-data-[size=lg]/input-group:pl-4 group-data-[size=xl]/input-group:pl-4.5 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n\t\t\t\t\"inline-end\":\n\t\t\t\t\t\"order-last group-data-[size=sm]/input-group:pr-3 group-data-[size=md]/input-group:pr-3.5 group-data-[size=lg]/input-group:pr-4 group-data-[size=xl]/input-group:pr-4.5 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n\t\t\t\t\"block-start\":\n\t\t\t\t\t\"order-first w-full justify-start px-3 group-data-[size=md]/input-group:px-3.5 group-data-[size=lg]/input-group:px-4 group-data-[size=xl]/input-group:px-4.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n\t\t\t\t\"block-end\":\n\t\t\t\t\t\"order-last w-full justify-start px-3 group-data-[size=md]/input-group:px-3.5 group-data-[size=lg]/input-group:px-4 group-data-[size=xl]/input-group:px-4.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\talign: \"inline-start\",\n\t\t},\n\t},\n);\n\nfunction InputGroupAddon({\n\tclassName,\n\talign = \"inline-start\",\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n\treturn (\n\t\t// biome-ignore lint/a11y/useSemanticElements: addon is a structural wrapper for grouped input affordances.\n\t\t// biome-ignore lint/a11y/useKeyWithClickEvents: click only forwards focus to the sibling input and is not a standalone action target.\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\tdata-slot=\"input-group-addon\"\n\t\t\tdata-align={align}\n\t\t\tclassName={cn(inputGroupAddonVariants({ align }), className)}\n\t\t\tonClick={(e) => {\n\t\t\t\tif ((e.target as HTMLElement).closest(\"button\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\te.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst inputGroupButtonVariants = cva(\n\t\"flex items-center gap-2 text-sm shadow-none rounded-full\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\txs: \"h-6 gap-1 px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n\t\t\t\tsm: \"\",\n\t\t\t\t\"icon-xs\": \"size-6 p-0 has-[>svg]:p-0\",\n\t\t\t\t\"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"xs\",\n\t\t},\n\t},\n);\n\nfunction InputGroupButton({\n\tclassName,\n\ttype = \"button\",\n\tvariant = \"ghost\",\n\tsize = \"xs\",\n\t...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n\tVariantProps<typeof inputGroupButtonVariants> & {\n\t\ttype?: \"button\" | \"submit\" | \"reset\";\n\t}) {\n\treturn (\n\t\t<Button\n\t\t\ttype={type}\n\t\t\tdata-size={size}\n\t\t\tvariant={variant}\n\t\t\tclassName={cn(inputGroupButtonVariants({ size }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-2 text-gdt-sm text-fg-secondary [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction InputGroupInput({\n\tclassName,\n\tsize,\n\t...props\n}: Omit<React.ComponentProps<\"input\">, \"size\"> & { size?: InputSize }) {\n\treturn (\n\t\t<Input\n\t\t\tdata-slot=\"input-group-control\"\n\t\t\tsize={size}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex-1 rounded-none border-0 bg-transparent shadow-none inset-shadow-none inset-ring-0 focus:border-transparent focus:shadow-none focus:inset-shadow-none focus-visible:border-transparent focus-visible:shadow-none focus-visible:ring-0 focus-visible:inset-ring-0 focus-visible:inset-shadow-none disabled:bg-transparent aria-invalid:ring-0 aria-invalid:inset-ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction InputGroupTextarea({\n\tclassName,\n\tsize,\n\t...props\n}: Omit<React.ComponentProps<\"textarea\">, \"size\"> & { size?: TextareaSize }) {\n\treturn (\n\t\t<Textarea\n\t\t\tdata-slot=\"input-group-control\"\n\t\t\tsize={size}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex-1 resize-none rounded-none border-0 bg-transparent shadow-none inset-shadow-none inset-ring-0 focus:border-transparent focus:shadow-none focus:inset-shadow-none focus-visible:border-transparent focus-visible:shadow-none focus-visible:ring-0 focus-visible:inset-ring-0 focus-visible:inset-shadow-none disabled:bg-transparent aria-invalid:ring-0 aria-invalid:inset-ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tInputGroup,\n\tInputGroupAddon,\n\tInputGroupButton,\n\tInputGroupText,\n\tInputGroupInput,\n\tInputGroupTextarea,\n};\n","\"use client\";\n\nimport { createContext, type ReactNode, useContext } from \"react\";\n\ntype ComponentSize = \"sm\" | \"md\" | \"lg\";\n\nconst SizeContext = createContext<ComponentSize | undefined>(undefined);\n\nfunction SizeProvider({\n\tchildren,\n\tsize,\n}: {\n\tchildren: ReactNode;\n\tsize?: ComponentSize | null;\n}) {\n\tif (!size) {\n\t\treturn <>{children}</>;\n\t}\n\n\treturn <SizeContext.Provider value={size}>{children}</SizeContext.Provider>;\n}\n\nfunction useComponentSize(\n\tsize?: ComponentSize | null,\n\tfallback: ComponentSize = \"md\",\n) {\n\tconst inheritedSize = useContext(SizeContext);\n\treturn size ?? inheritedSize ?? fallback;\n}\n\nexport { SizeProvider, useComponentSize, type ComponentSize };\n","import { Input as InputPrimitive } from \"@base-ui/react/input\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport {\n\ttype InputComponentSize,\n\tuseInputComponentSize,\n} from \"./input-size-context\";\n\nconst inputVariants = cva(\n\t\"flex w-full min-w-0 rounded-full border border-line bg-canvas text-fg-primary transition-[background-color,border-color,box-shadow,color] outline-none file:inline-flex file:border-0 file:bg-transparent file:font-normal file:text-fg-primary placeholder:text-fg-muted hover:border-line-strong focus-visible:border-line-focus focus-visible:inset-ring-1 inset-ring-line-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:border-line-subtle disabled:bg-surface disabled:text-fg-muted disabled:placeholder:text-fg-muted aria-invalid:border-line-danger aria-invalid:text-fg-danger aria-invalid:placeholder:text-fg-danger aria-invalid:shadow-none\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"h-8 px-3 text-gdt-xs font-normal file:text-gdt-xs\",\n\t\t\t\tmd: \"h-10 px-3.5 text-gdt-sm font-normal file:text-gdt-sm\",\n\t\t\t\tlg: \"h-12 px-4 text-gdt-md font-normal file:text-gdt-md\",\n\t\t\t\txl: \"h-14 px-4.5 text-gdt-lg font-normal file:text-gdt-lg\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\ntype InputProps = Omit<React.ComponentProps<\"input\">, \"size\"> &\n\tVariantProps<typeof inputVariants>;\n\ntype InputSize = InputComponentSize;\n\nfunction Input({ className, size, type, ...props }: InputProps) {\n\tconst resolvedSize = useInputComponentSize(size);\n\n\treturn (\n\t\t<InputPrimitive\n\t\t\ttype={type}\n\t\t\tdata-slot=\"input\"\n\t\t\tdata-size={resolvedSize}\n\t\t\tclassName={cn(inputVariants({ size: resolvedSize }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Input, inputVariants, type InputSize };\n","\"use client\";\n\nimport { createContext, type ReactNode, useContext } from \"react\";\n\ntype InputComponentSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst InputSizeContext = createContext<InputComponentSize | undefined>(\n\tundefined,\n);\n\nfunction InputSizeProvider({\n\tchildren,\n\tsize,\n}: {\n\tchildren: ReactNode;\n\tsize?: InputComponentSize | null;\n}) {\n\tif (!size) {\n\t\treturn <>{children}</>;\n\t}\n\n\treturn (\n\t\t<InputSizeContext.Provider value={size}>\n\t\t\t{children}\n\t\t</InputSizeContext.Provider>\n\t);\n}\n\nfunction useInputComponentSize(\n\tsize?: InputComponentSize | null,\n\tfallback: InputComponentSize = \"md\",\n) {\n\tconst inheritedSize = useContext(InputSizeContext);\n\treturn size ?? inheritedSize ?? fallback;\n}\n\nexport { InputSizeProvider, useInputComponentSize, type InputComponentSize };\n","\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { type ComponentSize, SizeProvider } from \"./size-context\";\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n\treturn <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n\treturn <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\ntype PopoverContentProps = PopoverPrimitive.Popup.Props &\n\tPick<\n\t\tPopoverPrimitive.Positioner.Props,\n\t\t\"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n\t> & {\n\t\tshowArrow?: boolean;\n\t\tsize?: ComponentSize;\n\t};\n\nfunction PopoverContent({\n\tclassName,\n\talign = \"center\",\n\talignOffset = 0,\n\tside = \"bottom\",\n\tsideOffset = 6,\n\tshowArrow = true,\n\tsize = \"md\",\n\tchildren,\n\t...props\n}: PopoverContentProps) {\n\treturn (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Positioner\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName=\"isolate z-50\"\n\t\t\t>\n\t\t\t\t<PopoverPrimitive.Popup\n\t\t\t\t\tdata-slot=\"popover-content\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"z-50 relative flex w-72 max-w-[calc(100vw-2rem)] origin-(--transform-origin) flex-col rounded-lg border-0 bg-surface-overlay py-4 text-gdt-sm text-fg-primary shadow-2 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 has-[&_[data-slot=popover-footer]]:pb-0\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<SizeProvider size={size}>{children}</SizeProvider>\n\t\t\t\t\t{showArrow ? (\n\t\t\t\t\t\t<PopoverPrimitive.Arrow className=\"relative block w-3 h-1.5 overflow-clip data-[side=bottom]:top-[-6px] data-[side=left]:right-[-9px] data-[side=left]:rotate-90 data-[side=right]:left-[-9px] data-[side=right]:-rotate-90 data-[side=top]:bottom-[-6px] data-[side=top]:rotate-180 before:content-[''] before:absolute before:bottom-0 before:left-1/2 before:w-[calc(6px*sqrt(2))] before:h-[calc(6px*sqrt(2))] before:bg-surface-overlay before:border before:border-line before:[transform:translate(-50%,50%)_rotate(45deg)]\" />\n\t\t\t\t\t) : null}\n\t\t\t\t</PopoverPrimitive.Popup>\n\t\t\t</PopoverPrimitive.Positioner>\n\t\t</PopoverPrimitive.Portal>\n\t);\n}\n\nfunction PopoverHeader({\n\tclassName,\n\tborder,\n\t...props\n}: React.ComponentProps<\"div\"> & { border?: boolean }) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-0.5 px-4\",\n\t\t\t\tborder && \"border-b border-line-subtle pb-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverBody({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-body\"\n\t\t\tclassName={cn(\"px-4 py-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-row items-center gap-2 px-4 border-t border-line-subtle pt-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n\treturn (\n\t\t<PopoverPrimitive.Title\n\t\t\tdata-slot=\"popover-title\"\n\t\t\tclassName={cn(\"text-gdt-sm font-semibold text-fg-primary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverDescription({\n\tclassName,\n\t...props\n}: PopoverPrimitive.Description.Props) {\n\treturn (\n\t\t<PopoverPrimitive.Description\n\t\t\tdata-slot=\"popover-description\"\n\t\t\tclassName={cn(\"text-gdt-xs font-normal text-fg-secondary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tPopover,\n\tPopoverContent,\n\tPopoverDescription,\n\tPopoverHeader,\n\tPopoverTitle,\n\tPopoverTrigger,\n\tPopoverBody,\n\tPopoverFooter,\n};\n","\"use client\";\n\nimport { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\";\nimport { cn } from \"../../lib/cn\";\n\nfunction Separator({\n\tclassName,\n\torientation = \"horizontal\",\n\tdashed = false,\n\tshade = \"feint\",\n\tthickness = \"default\",\n\t...props\n}: SeparatorPrimitive.Props & {\n\tdashed?: boolean;\n\tshade?: \"feint\" | \"deep\";\n\tthickness?: \"hairline\" | \"default\" | \"thick\" | \"extra-thick\";\n}) {\n\treturn (\n\t\t<SeparatorPrimitive\n\t\t\tdata-slot=\"separator\"\n\t\t\torientation={orientation}\n\t\t\tclassName={cn(\n\t\t\t\t\"shrink-0 data-horizontal:h-0 data-horizontal:w-full data-vertical:w-0 data-vertical:self-stretch\",\n\t\t\t\t// style\n\t\t\t\tdashed ? \"border-dashed\" : \"border-solid\",\n\t\t\t\t// shade\n\t\t\t\tshade === \"feint\" && \"border-line-subtle\",\n\t\t\t\tshade === \"deep\" && \"border-line\",\n\t\t\t\t// thickness\n\t\t\t\tthickness === \"hairline\" &&\n\t\t\t\t\t\"data-horizontal:border-t-[0.5px] data-vertical:border-l-[0.5px]\",\n\t\t\t\tthickness === \"default\" &&\n\t\t\t\t\t\"data-horizontal:border-t data-vertical:border-l\",\n\t\t\t\tthickness === \"thick\" &&\n\t\t\t\t\t\"data-horizontal:border-t-2 data-vertical:border-l-2\",\n\t\t\t\tthickness === \"extra-thick\" &&\n\t\t\t\t\t\"data-horizontal:border-t-[3px] data-vertical:border-l-[3px]\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Separator };\n"],"mappings":"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","names":["cva","createContext","useContext","Fragment","jsx","jsx","jsx","cva","jsx","jsx","jsx","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/phone-input.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n\tAsYouType,\n\ttype CountryCode,\n\tgetCountries,\n\tgetCountryCallingCode,\n\tparsePhoneNumber,\n} from \"libphonenumber-js\";\nimport { CheckIcon, ChevronDownIcon, SearchIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport flags from \"react-phone-number-input/flags\";\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"./input-group\";\nimport { cn } from \"./lib/cn\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { Separator } from \"./separator\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n// ─── Country data ─────────────────────────────────────────────────────────────\n\nconst regionNames =\n\ttypeof Intl !== \"undefined\" && \"DisplayNames\" in Intl\n\t\t? new Intl.DisplayNames([\"en\"], { type: \"region\" })\n\t\t: undefined;\n\ninterface CountryEntry {\n\tcode: CountryCode;\n\tname: string;\n\tcalling: string;\n}\n\nconst COUNTRIES: CountryEntry[] = getCountries()\n\t.map((code) => ({\n\t\tcode,\n\t\tname: regionNames?.of(code) ?? code,\n\t\tcalling: getCountryCallingCode(code),\n\t}))\n\t.sort((a, b) => a.name.localeCompare(b.name));\n\nfunction getNationalDigits(value: string): string {\n\treturn value.replace(/\\D/g, \"\");\n}\n\nfunction formatNational(digits: string, country: CountryCode): string {\n\tif (!digits) return \"\";\n\treturn new AsYouType(country).input(digits);\n}\n\nfunction toE164(digits: string, country: CountryCode): string | undefined {\n\tif (!digits) return undefined;\n\treturn `+${getCountryCallingCode(country)}${digits}`;\n}\n\nfunction parseValue(value: string | undefined): {\n\tcountry?: CountryCode;\n\tdigits: string;\n} {\n\tif (!value) return { digits: \"\" };\n\ttry {\n\t\tconst parsed = parsePhoneNumber(value);\n\t\tif (parsed?.nationalNumber) {\n\t\t\treturn { country: parsed.country, digits: parsed.nationalNumber };\n\t\t}\n\t} catch {\n\t\t// fall through to empty\n\t}\n\treturn { digits: \"\" };\n}\n\n// ─── Flag ─────────────────────────────────────────────────────────────────────\n\nconst flagSizeVariants: Record<ComponentSize, string> = {\n\tsm: \"h-3 w-[18px]\",\n\tmd: \"h-3.5 w-5\",\n\tlg: \"h-4 w-6\",\n};\n\nfunction CountryFlag({\n\tcountry,\n\tsize,\n\tclassName,\n}: {\n\tcountry: CountryCode;\n\tsize: ComponentSize;\n\tclassName?: string;\n}) {\n\tconst Flag = flags[country];\n\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex shrink-0 items-center justify-center overflow-hidden rounded-[3px] bg-surface-raised [&>svg]:h-full [&>svg]:w-full [&>svg]:object-cover\",\n\t\t\t\tflagSizeVariants[size],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{Flag ? (\n\t\t\t\t<Flag title={country} />\n\t\t\t) : (\n\t\t\t\t<span className=\"text-gdt-xs text-fg-secondary\">{country}</span>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n\n// ─── Country selector ─────────────────────────────────────────────────────────\n\n// Fixed row height so the list can be windowed. Matches `py-2` (16px) plus the\n// gdt-sm line-height (24px). Rows are pinned to this height to keep the math exact.\nconst ROW_HEIGHT = 40;\n// Vertical breathing room around the list, kept out of the row math via a spacer.\nconst LIST_PADDING = 6;\n// Extra rows rendered above/below the viewport to avoid blank edges while scrolling.\nconst OVERSCAN = 6;\n\n// Virtualized country list: only the rows near the viewport are mounted, so opening\n// the popover paints a handful of flag SVGs instead of ~250 at once.\nfunction CountryList({\n\titems,\n\tcountry,\n\tonSelect,\n}: {\n\titems: CountryEntry[];\n\tcountry: CountryCode;\n\tonSelect: (country: CountryCode) => void;\n}) {\n\tconst scrollRef = React.useRef<HTMLDivElement>(null);\n\tconst [viewport, setViewport] = React.useState(256);\n\tconst [scrollTop, setScrollTop] = React.useState(() => {\n\t\tconst index = items.findIndex((entry) => entry.code === country);\n\t\treturn index > 0 ? index * ROW_HEIGHT : 0;\n\t});\n\n\t// On mount, measure the real viewport height and scroll the selected row in.\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: run once on mount to seed measurements.\n\tReact.useLayoutEffect(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tsetViewport(el.clientHeight);\n\t\tel.scrollTop = scrollTop;\n\t}, []);\n\n\tif (items.length === 0) {\n\t\treturn (\n\t\t\t<p className=\"px-3.5 py-6 text-center text-gdt-sm text-fg-secondary\">\n\t\t\t\tNo country found\n\t\t\t</p>\n\t\t);\n\t}\n\n\tconst total = items.length;\n\tconst first = Math.max(0, Math.floor(scrollTop / ROW_HEIGHT) - OVERSCAN);\n\tconst last = Math.min(\n\t\ttotal,\n\t\tMath.ceil((scrollTop + viewport) / ROW_HEIGHT) + OVERSCAN,\n\t);\n\tconst visible = items.slice(first, last);\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollRef}\n\t\t\tonScroll={(event) => setScrollTop(event.currentTarget.scrollTop)}\n\t\t\tclassName=\"no-scrollbar max-h-64 overflow-y-auto\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"relative w-full\"\n\t\t\t\tstyle={{ height: total * ROW_HEIGHT + LIST_PADDING * 2 }}\n\t\t\t>\n\t\t\t\t{visible.map((entry, i) => {\n\t\t\t\t\tconst index = first + i;\n\t\t\t\t\tconst selected = entry.code === country;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={entry.code}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\ttop: index * ROW_HEIGHT + LIST_PADDING,\n\t\t\t\t\t\t\t\theight: ROW_HEIGHT,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={() => onSelect(entry.code)}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex w-full items-center gap-2.5 px-3.5 text-left text-gdt-sm outline-none transition-colors hover:bg-surface focus-visible:bg-surface\",\n\t\t\t\t\t\t\t\tselected ? \"font-medium text-fg-brand\" : \"text-fg-primary\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<CountryFlag country={entry.code} size=\"md\" />\n\t\t\t\t\t\t\t<span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n\t\t\t\t\t\t\t<span className=\"shrink-0 text-fg-secondary\">\n\t\t\t\t\t\t\t\t+{entry.calling}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{selected && (\n\t\t\t\t\t\t\t\t<CheckIcon className=\"size-4 shrink-0 text-fg-brand\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction CountrySelect({\n\tcountry,\n\tsize,\n\tdisabled,\n\tonSelect,\n\tfinalFocusRef,\n}: {\n\tcountry: CountryCode;\n\tsize: ComponentSize;\n\tdisabled?: boolean;\n\tonSelect: (country: CountryCode) => void;\n\tfinalFocusRef: React.RefObject<HTMLInputElement | null>;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [query, setQuery] = React.useState(\"\");\n\tconst searchRef = React.useRef<HTMLInputElement>(null);\n\n\tconst filtered = React.useMemo(() => {\n\t\tconst q = query.trim().toLowerCase();\n\t\tif (!q) return COUNTRIES;\n\t\tconst normalized = q.replace(/^\\+/, \"\");\n\t\treturn COUNTRIES.filter(\n\t\t\t(entry) =>\n\t\t\t\tentry.name.toLowerCase().includes(q) ||\n\t\t\t\tentry.calling.includes(normalized) ||\n\t\t\t\tentry.code.toLowerCase().includes(q),\n\t\t);\n\t}, [query]);\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tsetOpen(next);\n\t\tif (!next) setQuery(\"\");\n\t}\n\n\tfunction handleSelect(next: CountryCode) {\n\t\tonSelect(next);\n\t\thandleOpenChange(false);\n\t}\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tdata-slot=\"phone-country-trigger\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center gap-1.5 rounded-full font-normal text-fg-primary outline-none transition-colors select-none\",\n\t\t\t\t\t\"focus-visible:text-fg-brand disabled:cursor-not-allowed disabled:text-fg-caption-placeholder\",\n\t\t\t\t\tsize === \"sm\" && \"text-gdt-xs\",\n\t\t\t\t\tsize === \"md\" && \"text-gdt-sm\",\n\t\t\t\t\tsize === \"lg\" && \"text-gdt-md\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<CountryFlag country={country} size={size} />\n\t\t\t\t<span>+{getCountryCallingCode(country)}</span>\n\t\t\t\t<ChevronDownIcon\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-fg-secondary transition-transform\",\n\t\t\t\t\t\topen && \"rotate-180\",\n\t\t\t\t\t\tsize === \"lg\" ? \"size-4\" : \"size-3.5\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\talignOffset={0}\n\t\t\t\tsideOffset={10}\n\t\t\t\t// Send focus to the phone field on every close — selection, Escape, or\n\t\t\t\t// outside click — instead of Base UI's default return-to-trigger.\n\t\t\t\tfinalFocus={finalFocusRef}\n\t\t\t\tclassName=\"w-72 gap-0 overflow-hidden p-0\"\n\t\t\t>\n\t\t\t\t<div className=\"flex items-center gap-2 border-b border-line-subtle px-3.5 py-2.5\">\n\t\t\t\t\t<SearchIcon className=\"size-4 shrink-0 text-fg-secondary\" />\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={searchRef}\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tonChange={(event) => setQuery(event.target.value)}\n\t\t\t\t\t\tplaceholder=\"Search country\"\n\t\t\t\t\t\tclassName=\"w-full bg-transparent text-gdt-sm text-fg-primary outline-none placeholder:text-fg-caption-placeholder\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<CountryList\n\t\t\t\t\tkey={query}\n\t\t\t\t\titems={filtered}\n\t\t\t\t\tcountry={country}\n\t\t\t\t\tonSelect={handleSelect}\n\t\t\t\t/>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── PhoneInput ───────────────────────────────────────────────────────────────\n\ninterface PhoneInputProps {\n\tvalue?: string;\n\tonChange?: (value: string | undefined) => void;\n\tdefaultCountry?: CountryCode;\n\tsize?: ComponentSize;\n\tdisabled?: boolean;\n\treadOnly?: boolean;\n\tplaceholder?: string;\n\tclassName?: string;\n\tid?: string;\n\tname?: string;\n\tref?: React.Ref<HTMLInputElement>;\n\t\"aria-invalid\"?: boolean;\n}\n\nfunction PhoneInput({\n\tvalue,\n\tonChange,\n\tdefaultCountry = \"NG\",\n\tsize,\n\tdisabled = false,\n\treadOnly = false,\n\tplaceholder = \"(0000) 000-0000\",\n\tclassName,\n\tid,\n\tname,\n\tref,\n\t\"aria-invalid\": ariaInvalid,\n}: PhoneInputProps) {\n\tconst resolvedSize = useComponentSize(size);\n\n\t// Track the underlying input so the country selector can return focus to it\n\t// on close, while still forwarding it to a caller-supplied `ref`.\n\tconst inputRef = React.useRef<HTMLInputElement | null>(null);\n\tconst setInputRef = React.useCallback(\n\t\t(node: HTMLInputElement | null) => {\n\t\t\tinputRef.current = node;\n\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\telse if (ref) ref.current = node;\n\t\t},\n\t\t[ref],\n\t);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: seed once from the initial value; later updates flow through the sync effect below.\n\tconst initial = React.useMemo(() => parseValue(value), []);\n\tconst [country, setCountry] = React.useState<CountryCode>(\n\t\tinitial.country ?? defaultCountry,\n\t);\n\tconst [national, setNational] = React.useState(() =>\n\t\tformatNational(initial.digits, initial.country ?? defaultCountry),\n\t);\n\n\t// Keep internal state in sync when `value` is changed from outside.\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: only re-sync when the external `value` changes, not on internal edits.\n\tReact.useEffect(() => {\n\t\tconst currentDigits = getNationalDigits(national);\n\t\tif (toE164(currentDigits, country) === value) return;\n\n\t\tconst next = parseValue(value);\n\t\tconst nextCountry = next.country ?? country;\n\t\tsetCountry(nextCountry);\n\t\tsetNational(formatNational(next.digits, nextCountry));\n\t}, [value]);\n\n\tfunction emit(digits: string, nextCountry: CountryCode) {\n\t\tonChange?.(toE164(digits, nextCountry));\n\t}\n\n\tfunction handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n\t\tconst digits = getNationalDigits(event.target.value);\n\t\tsetNational(formatNational(digits, country));\n\t\temit(digits, country);\n\t}\n\n\tfunction handleCountrySelect(nextCountry: CountryCode) {\n\t\tconst digits = getNationalDigits(national);\n\t\tsetCountry(nextCountry);\n\t\tsetNational(formatNational(digits, nextCountry));\n\t\temit(digits, nextCountry);\n\t}\n\n\tconst dividerStateClasses = cn(\n\t\t\"group-hover/input-group:bg-line-strong\",\n\t\t\"group-focus-within/input-group:bg-line-focus\",\n\t\t\"group-has-[[aria-invalid=true]]/input-group:bg-line-danger\",\n\t\t\"group-has-disabled/input-group:bg-line-subtle\",\n\t);\n\n\treturn (\n\t\t<InputGroup size={resolvedSize} className={className}>\n\t\t\t<InputGroupAddon align=\"inline-start\" className=\"gap-2 self-stretch py-0\">\n\t\t\t\t<CountrySelect\n\t\t\t\t\tcountry={country}\n\t\t\t\t\tsize={resolvedSize}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonSelect={handleCountrySelect}\n\t\t\t\t\tfinalFocusRef={inputRef}\n\t\t\t\t/>\n\t\t\t\t<Separator\n\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\tshade=\"deep\"\n\t\t\t\t\tclassName={cn(\"self-stretch transition-colors\", dividerStateClasses)}\n\t\t\t\t/>\n\t\t\t</InputGroupAddon>\n\t\t\t<InputGroupInput\n\t\t\t\tref={setInputRef}\n\t\t\t\tid={id}\n\t\t\t\tname={name}\n\t\t\t\ttype=\"tel\"\n\t\t\t\tinputMode=\"tel\"\n\t\t\t\tautoComplete=\"tel\"\n\t\t\t\tvalue={national}\n\t\t\t\tonChange={handleInputChange}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\taria-invalid={ariaInvalid || undefined}\n\t\t\t\tclassName=\"pl-0\"\n\t\t\t/>\n\t\t</InputGroup>\n\t);\n}\n\nexport { PhoneInput };\nexport type { PhoneInputProps, CountryCode };\n"],"mappings":"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","names":[]}
|
package/dist/photo-gallery.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ type PhotoGalleryFullscreenProps = {
|
|
|
32
32
|
onIndexChange?: (index: number) => void;
|
|
33
33
|
};
|
|
34
34
|
/**
|
|
35
|
-
* Fullscreen lightbox: takes over the viewport over a
|
|
35
|
+
* Fullscreen lightbox: takes over the viewport over a dimmed backdrop for
|
|
36
36
|
* distraction-free browsing. Swipeable (drag / touch) with ← → key navigation
|
|
37
37
|
* and ESC to close. Built on {@link Carousel}; controlled via `open` /
|
|
38
38
|
* `onOpenChange` and usable without the inline gallery.
|