@alikhalilll/ui 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +155 -187
  2. package/dist/chunks/ADrawerContent.vue_vue_type_script_setup_true_lang-BivIZvV1.mjs +108 -0
  3. package/dist/chunks/ADrawerContent.vue_vue_type_script_setup_true_lang-BivIZvV1.mjs.map +1 -0
  4. package/dist/chunks/AInput.vue_vue_type_script_setup_true_lang-BJUP7ePq.mjs +81 -0
  5. package/dist/chunks/AInput.vue_vue_type_script_setup_true_lang-BJUP7ePq.mjs.map +1 -0
  6. package/dist/chunks/APopoverContent.vue_vue_type_script_setup_true_lang-o1XhV9DM.mjs +132 -0
  7. package/dist/chunks/APopoverContent.vue_vue_type_script_setup_true_lang-o1XhV9DM.mjs.map +1 -0
  8. package/dist/chunks/AResponsivePopoverContent.vue_vue_type_script_setup_true_lang-BYEb5UBL.mjs +92 -0
  9. package/dist/chunks/AResponsivePopoverContent.vue_vue_type_script_setup_true_lang-BYEb5UBL.mjs.map +1 -0
  10. package/dist/chunks/ATellInput.vue_vue_type_script_setup_true_lang-Clc-B8SW.mjs +1353 -0
  11. package/dist/chunks/ATellInput.vue_vue_type_script_setup_true_lang-Clc-B8SW.mjs.map +1 -0
  12. package/dist/chunks/cn-B6yFEsav.mjs +9 -0
  13. package/dist/chunks/cn-B6yFEsav.mjs.map +1 -0
  14. package/dist/chunks/sizes-B_9MfLkz.mjs +34 -0
  15. package/dist/chunks/sizes-B_9MfLkz.mjs.map +1 -0
  16. package/dist/drawer.d.ts +116 -0
  17. package/dist/drawer.mjs +8 -0
  18. package/dist/drawer.mjs.map +1 -0
  19. package/dist/index.d.ts +84 -57
  20. package/dist/index.mjs +35 -1516
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/input.d.ts +65 -0
  23. package/dist/input.mjs +5 -0
  24. package/dist/input.mjs.map +1 -0
  25. package/dist/popover.d.ts +117 -0
  26. package/dist/popover.mjs +8 -0
  27. package/dist/popover.mjs.map +1 -0
  28. package/dist/responsive-popover.d.ts +124 -0
  29. package/dist/responsive-popover.mjs +7 -0
  30. package/dist/responsive-popover.mjs.map +1 -0
  31. package/dist/tell-input.d.ts +637 -0
  32. package/dist/tell-input.mjs +13 -0
  33. package/dist/tell-input.mjs.map +1 -0
  34. package/dist/utils.d.ts +29 -0
  35. package/dist/utils.mjs +12 -0
  36. package/dist/utils.mjs.map +1 -0
  37. package/entries/drawer/README.md +39 -0
  38. package/entries/input/README.md +42 -0
  39. package/entries/popover/README.md +37 -0
  40. package/entries/responsive-popover/README.md +47 -0
  41. package/entries/tell-input/README.md +52 -0
  42. package/package.json +30 -4
  43. /package/dist/{styles.css → assets/styles.css} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/lib/utils.ts","../src/lib/sizes.ts","../src/components/input/AInput.vue","../src/components/popover/APopover.vue","../src/components/popover/APopoverTrigger.vue","../src/components/popover/APopoverContent.vue","../src/components/drawer/ADrawer.vue","../src/components/drawer/ADrawerTrigger.vue","../src/components/drawer/ADrawerOverlay.vue","../src/components/drawer/ADrawerContent.vue","../src/components/responsive-popover/AResponsivePopover.vue","../src/components/responsive-popover/AResponsivePopoverTrigger.vue","../src/components/responsive-popover/AResponsivePopoverContent.vue","../src/composables/usePhoneValidation.ts","../src/composables/useCountryDetection.ts","../src/components/tell-input/types.ts","../src/components/tell-input/flag-url.ts","../src/components/tell-input/ACountryFlag.vue","../src/components/tell-input/ACountrySelect.vue","../src/components/tell-input/ATellInput.vue"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * Shared size scale for every interactive UI component in @alikhalilll/ui.\n *\n * xs = 28px · sm = 36px · md = 43px (default) · lg = 52px · xl = 60px\n *\n * Use the {@link controlHeight}, {@link controlPaddingX}, {@link controlTextSize}\n * maps when building a CVA variant so every component stays in lockstep.\n */\n\nexport type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport const SIZES: readonly Size[] = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\n\nexport const DEFAULT_SIZE: Size = 'md';\n\n/** Tailwind height utility per size. md uses an arbitrary value because 43px isn't on the spacing scale. */\nexport const controlHeight: Record<Size, string> = {\n xs: 'h-7',\n sm: 'h-9',\n md: 'h-[43px]',\n lg: 'h-[52px]',\n xl: 'h-[60px]',\n};\n\nexport const controlPaddingX: Record<Size, string> = {\n xs: 'px-2',\n sm: 'px-2.5',\n md: 'px-3',\n lg: 'px-3.5',\n xl: 'px-4',\n};\n\nexport const controlTextSize: Record<Size, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n};\n\n/** Pixel values exposed so non-template code (icons, ResizeObserver, etc.) can read the height. */\nexport const controlHeightPx: Record<Size, number> = {\n xs: 28,\n sm: 36,\n md: 43,\n lg: 52,\n xl: 60,\n};\n","<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue';\nimport { computed, useSlots } from 'vue';\nimport { useVModel } from '@vueuse/core';\nimport { cn } from '../../lib/utils';\nimport {\n controlHeight,\n controlPaddingX,\n controlTextSize,\n DEFAULT_SIZE,\n type Size,\n} from '../../lib/sizes';\n\nconst props = withDefaults(\n defineProps<{\n defaultValue?: string | number;\n modelValue?: string | number;\n class?: HTMLAttributes['class'];\n /** Classes for the inner &lt;input&gt; element (useful when prefix/suffix are present). */\n inputClass?: HTMLAttributes['class'];\n /** Classes for the prefix wrapper. */\n prefixClass?: HTMLAttributes['class'];\n /** Classes for the suffix wrapper. */\n suffixClass?: HTMLAttributes['class'];\n size?: Size;\n }>(),\n { size: DEFAULT_SIZE }\n);\n\nconst emits = defineEmits<{\n (e: 'update:modelValue', payload: string | number): void;\n}>();\n\ndefineSlots<{\n /** Content rendered inside the input's border, left of the field. */\n prefix?: () => unknown;\n /** Content rendered inside the input's border, right of the field. */\n suffix?: () => unknown;\n}>();\n\nconst slots = useSlots();\nconst hasPrefix = computed(() => !!slots.prefix);\nconst hasSuffix = computed(() => !!slots.suffix);\nconst hasAdornment = computed(() => hasPrefix.value || hasSuffix.value);\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n passive: true,\n defaultValue: props.defaultValue,\n});\n\nconst sizeHeight = computed(() => controlHeight[props.size]);\nconst sizePaddingX = computed(() => controlPaddingX[props.size]);\nconst sizeText = computed(() => controlTextSize[props.size]);\n</script>\n\n<template>\n <!--\n When prefix or suffix slots are filled we render a wrapper that owns the border,\n background and focus ring — so the visible \"input\" is the whole bar, not just the\n native element. Otherwise we render the plain native input directly so consumers\n can use AInput as a drop-in for <input>.\n -->\n <div\n v-if=\"hasAdornment\"\n :data-size=\"props.size\"\n :class=\"\n cn(\n 'border-input bg-background ring-offset-background focus-within:ring-ring inline-flex w-full items-center rounded-md border shadow-sm transition-colors focus-within:ring-1',\n sizeHeight,\n sizePaddingX,\n sizeText,\n props.class\n )\n \"\n >\n <span\n v-if=\"hasPrefix\"\n :class=\"cn('text-muted-foreground flex shrink-0 items-center pr-2', props.prefixClass)\"\n >\n <slot name=\"prefix\" />\n </span>\n\n <input\n v-model=\"modelValue\"\n data-slot=\"input\"\n :class=\"\n cn(\n 'placeholder:text-muted-foreground h-full min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed disabled:opacity-50',\n props.inputClass\n )\n \"\n />\n\n <span\n v-if=\"hasSuffix\"\n :class=\"cn('text-muted-foreground flex shrink-0 items-center pl-2', props.suffixClass)\"\n >\n <slot name=\"suffix\" />\n </span>\n </div>\n\n <input\n v-else\n v-model=\"modelValue\"\n data-slot=\"input\"\n :data-size=\"props.size\"\n :class=\"\n cn(\n 'border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring flex w-full rounded-md border py-1 shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-1 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n sizeHeight,\n sizePaddingX,\n sizeText,\n props.class\n )\n \"\n />\n</template>\n","<script setup lang=\"ts\">\nimport type { PopoverRootEmits, PopoverRootProps } from 'reka-ui';\nimport { PopoverRoot, useForwardPropsEmits } from 'reka-ui';\n\n/**\n * Defaults `modal` to `true` so the popover locks page scroll, traps focus, and an overlay\n * (rendered by APopoverContent when `overlay` is set) actually dims the page.\n * Pass `:modal=\"false\"` for tooltip-style non-modal popovers.\n */\nconst props = withDefaults(defineProps<PopoverRootProps>(), { modal: true });\nconst emits = defineEmits<PopoverRootEmits>();\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n <PopoverRoot v-slot=\"slotProps\" data-slot=\"popover\" v-bind=\"forwarded\">\n <slot v-bind=\"slotProps\" />\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\nimport type { PopoverTriggerProps } from 'reka-ui';\nimport { PopoverTrigger, useForwardProps } from 'reka-ui';\n\nconst props = defineProps<PopoverTriggerProps>();\nconst forwarded = useForwardProps(props);\n</script>\n\n<template>\n <PopoverTrigger data-slot=\"popover-trigger\" v-bind=\"forwarded\">\n <slot />\n </PopoverTrigger>\n</template>\n","<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue';\nimport { reactiveOmit } from '@vueuse/core';\nimport {\n PopoverContent,\n type PopoverContentEmits,\n type PopoverContentProps,\n PopoverPortal,\n useForwardPropsEmits,\n} from 'reka-ui';\nimport { cn } from '../../lib/utils';\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<\n PopoverContentProps & {\n class?: HTMLAttributes['class'];\n /** Render a dimmed, clickable backdrop behind the popover. Pair with `<APopover modal>`. */\n overlay?: boolean;\n overlayClass?: HTMLAttributes['class'];\n }\n >(),\n { align: 'center', sideOffset: 4, overlay: false }\n);\nconst emits = defineEmits<PopoverContentEmits>();\nconst delegated = reactiveOmit(props, 'class', 'overlay', 'overlayClass');\nconst forwarded = useForwardPropsEmits(delegated, emits);\n</script>\n\n<template>\n <PopoverPortal>\n <!--\n Overlay is a sibling of PopoverContent inside the same portal. Reka-ui's\n DismissableLayer treats any pointer-down outside the content as a dismiss,\n so clicking the overlay closes the popover for free. We still mark it\n pointer-events:auto explicitly to be safe.\n -->\n <div\n v-if=\"props.overlay\"\n data-slot=\"popover-overlay\"\n :class=\"\n cn(\n 'fixed inset-0 z-40 bg-black/60 backdrop-blur-sm pointer-events-auto data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n props.overlayClass\n )\n \"\n />\n <PopoverContent\n data-slot=\"popover-content\"\n v-bind=\"{ ...$attrs, ...forwarded }\"\n :class=\"\n cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-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 z-50 w-72 rounded-md border p-4 shadow-md outline-none',\n props.class\n )\n \"\n >\n <slot />\n </PopoverContent>\n </PopoverPortal>\n</template>\n","<script setup lang=\"ts\">\nimport { DrawerRoot, type DrawerRootEmits, type DrawerRootProps } from 'vaul-vue';\nimport { useForwardPropsEmits } from 'reka-ui';\n\nconst props = withDefaults(defineProps<DrawerRootProps>(), {\n shouldScaleBackground: true,\n});\nconst emits = defineEmits<DrawerRootEmits>();\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n <DrawerRoot data-slot=\"drawer\" v-bind=\"forwarded\">\n <slot />\n </DrawerRoot>\n</template>\n","<script setup lang=\"ts\">\nimport { DrawerTrigger, type DrawerTriggerProps } from 'vaul-vue';\nimport { useForwardProps } from 'reka-ui';\n\nconst props = defineProps<DrawerTriggerProps>();\nconst forwarded = useForwardProps(props);\n</script>\n\n<template>\n <DrawerTrigger data-slot=\"drawer-trigger\" v-bind=\"forwarded\">\n <slot />\n </DrawerTrigger>\n</template>\n","<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue';\nimport { DrawerOverlay } from 'vaul-vue';\nimport type { DialogOverlayProps } from 'reka-ui';\nimport { reactiveOmit } from '@vueuse/core';\nimport { useForwardProps } from 'reka-ui';\nimport { cn } from '../../lib/utils';\n\nconst props = defineProps<DialogOverlayProps & { class?: HTMLAttributes['class'] }>();\nconst delegated = reactiveOmit(props, 'class');\nconst forwarded = useForwardProps(delegated);\n</script>\n\n<template>\n <DrawerOverlay\n data-slot=\"drawer-overlay\"\n v-bind=\"forwarded\"\n :class=\"\n cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-40 bg-black/60 backdrop-blur-sm',\n props.class\n )\n \"\n />\n</template>\n","<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue';\nimport { DrawerContent, DrawerPortal } from 'vaul-vue';\nimport type { DialogContentEmits, DialogContentProps } from 'reka-ui';\nimport { reactiveOmit } from '@vueuse/core';\nimport { useForwardPropsEmits } from 'reka-ui';\nimport { cn } from '../../lib/utils';\nimport ADrawerOverlay from './ADrawerOverlay.vue';\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = defineProps<DialogContentProps & { class?: HTMLAttributes['class'] }>();\nconst emits = defineEmits<DialogContentEmits>();\nconst delegated = reactiveOmit(props, 'class');\nconst forwarded = useForwardPropsEmits(delegated, emits);\n</script>\n\n<template>\n <DrawerPortal>\n <ADrawerOverlay />\n <DrawerContent\n data-slot=\"drawer-content\"\n v-bind=\"{ ...$attrs, ...forwarded }\"\n :class=\"\n cn(\n 'bg-background fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border outline-none',\n props.class\n )\n \"\n >\n <div class=\"bg-muted mx-auto mt-4 h-2 w-[100px] rounded-full\" />\n <slot />\n </DrawerContent>\n </DrawerPortal>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useMediaQuery } from '@vueuse/core';\nimport { APopover } from '../popover';\nimport { ADrawer } from '../drawer';\n\nconst props = withDefaults(\n defineProps<{\n /** CSS media query for the desktop break. Below this width we render a vaul drawer. */\n breakpoint?: string;\n /**\n * When true, the popover (desktop) locks page scroll, traps focus, and renders an overlay.\n * The drawer (mobile) is always modal-like (vaul-vue ships its own overlay + scroll-lock).\n */\n modal?: boolean;\n }>(),\n { breakpoint: '(min-width: 768px)', modal: true }\n);\n\nconst open = defineModel<boolean>('open');\n\nconst isDesktop = useMediaQuery(() => props.breakpoint);\n\n/**\n * Pre-imported on both branches — do NOT lazy-load. Switching the component identity at runtime\n * means we still hydrate the right tree client-side.\n */\nconst Root = computed(() => (isDesktop.value ? APopover : ADrawer));\n</script>\n\n<template>\n <component :is=\"Root\" v-model:open=\"open\" :modal=\"props.modal\" data-slot=\"responsive-popover\">\n <slot :is-desktop=\"isDesktop\" />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useMediaQuery } from '@vueuse/core';\nimport { APopoverTrigger } from '../popover';\nimport { ADrawerTrigger } from '../drawer';\n\nconst props = withDefaults(\n defineProps<{\n breakpoint?: string;\n asChild?: boolean;\n }>(),\n { breakpoint: '(min-width: 768px)' }\n);\n\nconst isDesktop = useMediaQuery(() => props.breakpoint);\nconst Trigger = computed(() => (isDesktop.value ? APopoverTrigger : ADrawerTrigger));\n</script>\n\n<template>\n <component :is=\"Trigger\" :as-child=\"props.asChild\" data-slot=\"responsive-popover-trigger\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue';\nimport { computed } from 'vue';\nimport { useMediaQuery } from '@vueuse/core';\nimport { APopoverContent } from '../popover';\nimport { ADrawerContent } from '../drawer';\n\nconst props = withDefaults(\n defineProps<{\n breakpoint?: string;\n /** Classes applied on both branches. Avoid width / inset classes here. */\n class?: HTMLAttributes['class'];\n /** Classes applied only when the popover (desktop) branch is rendered. */\n popoverClass?: HTMLAttributes['class'];\n /** Classes applied only when the drawer (mobile) branch is rendered. */\n drawerClass?: HTMLAttributes['class'];\n /**\n * Render the dimmed overlay on the desktop popover branch. Defaults to `false` — popovers\n * on desktop are non-modal-looking by convention. The mobile drawer always has its own\n * overlay (vaul-vue's `DrawerOverlay`) regardless of this prop.\n */\n overlay?: boolean;\n align?: 'start' | 'center' | 'end';\n sideOffset?: number;\n }>(),\n {\n breakpoint: '(min-width: 768px)',\n align: 'start',\n sideOffset: 4,\n overlay: false,\n }\n);\n\nconst isDesktop = useMediaQuery(() => props.breakpoint);\n\nconst mergedClass = computed(() => [\n props.class,\n isDesktop.value ? props.popoverClass : props.drawerClass,\n]);\n</script>\n\n<template>\n <APopoverContent\n v-if=\"isDesktop\"\n :overlay=\"props.overlay\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n :class=\"mergedClass\"\n data-slot=\"responsive-popover-content\"\n >\n <slot />\n </APopoverContent>\n <ADrawerContent v-else :class=\"mergedClass\" data-slot=\"responsive-popover-content\">\n <slot />\n </ADrawerContent>\n</template>\n","/**\n * Country list + phone validation, framework-agnostic.\n *\n * Ported from the reference @pkgs/ui ATellInput composable with these cleanups:\n * - Drop Nuxt-only `process.client` checks → use plain `typeof window !== 'undefined'`.\n * - Drop Arabic default placeholder; let consumers pass their own.\n * - Expand the offline fallback list from 2 → ~20 of the most-populated countries.\n * - Keep REST Countries fetch + localStorage cache + libphonenumber-js examples + fast `search_key`.\n */\n\nimport { ref, type Ref } from 'vue';\nimport {\n type CountryCode,\n type Examples,\n getExampleNumber,\n isValidPhoneNumber,\n parsePhoneNumberFromString,\n} from 'libphonenumber-js';\nimport examples from 'libphonenumber-js/examples.mobile.json';\n\n/* -----------------------------------------------------------------------------\n * Public types\n * -------------------------------------------------------------------------- */\nexport interface RestCountry {\n name?: { common?: string };\n cca2?: string;\n idd?: { root?: string; suffixes?: string[] };\n flags?: { png?: string; svg?: string };\n}\n\nexport interface CountryOption<T = RestCountry> {\n /** Display label, e.g. \"Egypt (+20)\". */\n label: string;\n /** Stable unique ID — the ISO 3166-1 alpha-2 code, e.g. \"EG\". */\n value: string;\n /** Precomputed normalized string for fast substring search. */\n search_key: string;\n raw_data: {\n iso2: string;\n dial_code: string;\n dial_digits: string;\n name: string;\n flag: string | null;\n source: 'restcountries' | 'fallback';\n original: T;\n };\n}\n\nexport interface PhoneRequiredInfo {\n iso2: string;\n dial_code: string;\n /** Empty by default — consumer passes a placeholder via the component prop. */\n placeholder: string;\n example_national: string;\n example_e164: string;\n national_number_length: { min: number | null; max: number | null };\n format_hint: string;\n}\n\nexport type PhoneValidationReason =\n | 'missing_country'\n | 'country_not_supported'\n | 'phone_has_non_digits'\n | 'too_short'\n | 'too_long'\n | 'invalid_phone'\n | 'parse_failed';\n\nexport interface PhoneValidationResult {\n ok: boolean;\n reason: PhoneValidationReason | null;\n country: { iso2: string; dial_code: string } | null;\n phone: { raw: string | null; digits: string };\n full_phone: string | null;\n required: PhoneRequiredInfo | null;\n details?: Record<string, unknown>;\n}\n\nexport type ValidateArgs =\n | { country: { iso2: string; dial_code?: string } | null | undefined; phone?: undefined }\n | { country: { iso2: string; dial_code?: string } | null | undefined; phone: string | null };\n\nconst STORAGE_KEY = 'ali_ui_phone_countries_v1';\nconst REST_COUNTRIES_URL = 'https://restcountries.com/v3.1/all?fields=name,cca2,idd,flags';\n\nconst EX = examples as unknown as Examples;\n\nconst isBrowser = () => typeof window !== 'undefined';\n\nfunction toDigits(v: unknown) {\n return String(v ?? '').replace(/\\D/g, '');\n}\n\nfunction ensurePlusDial(dial: unknown) {\n const d = toDigits(dial);\n return d ? `+${d}` : '';\n}\n\nfunction normalizeIso2(iso2: unknown) {\n return String(iso2 ?? '')\n .trim()\n .toUpperCase();\n}\n\nfunction dropLeadingZeros(digits: string) {\n return String(digits ?? '').replace(/^0+/, '');\n}\n\nfunction buildFullE164(dial: string, digits: string) {\n const dialClean = ensurePlusDial(dial);\n const nsn = dropLeadingZeros(toDigits(digits));\n return dialClean && nsn ? `${dialClean}${nsn}` : null;\n}\n\nfunction inferLengthFromExample(national: string) {\n const d = toDigits(national);\n if (!d) return { min: null, max: null };\n const n = d.length;\n return { min: Math.max(4, n - 2), max: n + 2 };\n}\n\nfunction buildDialCode(idd?: RestCountry['idd']): string | null {\n const root = idd?.root?.trim();\n if (!root || !root.startsWith('+')) return null;\n const suffix = idd?.suffixes?.[0]?.trim() ?? '';\n const out = `${root}${suffix}`;\n return out.startsWith('+') ? out : null;\n}\n\nfunction normalizeSearchKey(input: string) {\n return String(input ?? '')\n .toLowerCase()\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/[^\\da-z+ ]/g, '');\n}\n\n/* -----------------------------------------------------------------------------\n * Offline fallback — used when the REST Countries fetch fails. ~20 most-populated\n * countries so the picker is still useful when offline.\n * -------------------------------------------------------------------------- */\nfunction makeFallback(iso2: string, name: string, dial: string): CountryOption {\n const dialDigits = toDigits(dial);\n return {\n label: `${name} (+${dialDigits})`,\n value: iso2,\n search_key: normalizeSearchKey(`${name} +${dialDigits} ${iso2}`),\n raw_data: {\n iso2,\n dial_code: `+${dialDigits}`,\n dial_digits: dialDigits,\n name,\n flag: `https://flagcdn.com/w40/${iso2.toLowerCase()}.png`,\n source: 'fallback',\n original: {},\n },\n };\n}\n\nconst FALLBACK_COUNTRIES: CountryOption[] = [\n makeFallback('SA', 'Saudi Arabia', '+966'),\n makeFallback('EG', 'Egypt', '+20'),\n makeFallback('AE', 'United Arab Emirates', '+971'),\n makeFallback('US', 'United States', '+1'),\n makeFallback('GB', 'United Kingdom', '+44'),\n makeFallback('DE', 'Germany', '+49'),\n makeFallback('FR', 'France', '+33'),\n makeFallback('ES', 'Spain', '+34'),\n makeFallback('IT', 'Italy', '+39'),\n makeFallback('TR', 'Turkey', '+90'),\n makeFallback('RU', 'Russia', '+7'),\n makeFallback('CN', 'China', '+86'),\n makeFallback('IN', 'India', '+91'),\n makeFallback('JP', 'Japan', '+81'),\n makeFallback('KR', 'South Korea', '+82'),\n makeFallback('BR', 'Brazil', '+55'),\n makeFallback('MX', 'Mexico', '+52'),\n makeFallback('CA', 'Canada', '+1'),\n makeFallback('AU', 'Australia', '+61'),\n makeFallback('NG', 'Nigeria', '+234'),\n makeFallback('PK', 'Pakistan', '+92'),\n makeFallback('ID', 'Indonesia', '+62'),\n];\n\n/* -----------------------------------------------------------------------------\n * Composable\n * -------------------------------------------------------------------------- */\nexport interface UsePhoneValidationReturn {\n countries: Ref<CountryOption[]>;\n isCountriesLoading: Ref<boolean>;\n getCountries(options?: { force?: boolean }): Promise<CountryOption[]>;\n searchCountries(keyword: string, limit?: number): CountryOption[];\n getCountryByValue(value: string): CountryOption | null;\n getCountriesByDial(dial: string): CountryOption[];\n getRequiredInfo(country: { iso2: string; dial_code?: string }): PhoneRequiredInfo | null;\n validate(input: ValidateArgs): PhoneValidationResult;\n}\n\nexport function usePhoneValidation(): UsePhoneValidationReturn {\n const countries = ref<CountryOption[]>([]);\n const isCountriesLoading = ref(false);\n\n const byValue = ref<Map<string, CountryOption>>(new Map());\n const byDialDigits = ref<Map<string, CountryOption[]>>(new Map());\n\n function rebuildIndexes(list: CountryOption[]) {\n const valueMap = new Map<string, CountryOption>();\n const dialMap = new Map<string, CountryOption[]>();\n for (const item of list) {\n valueMap.set(item.value, item);\n const dial = item.raw_data.dial_digits;\n if (dial) {\n const bucket = dialMap.get(dial) ?? [];\n bucket.push(item);\n dialMap.set(dial, bucket);\n }\n }\n byValue.value = valueMap;\n byDialDigits.value = dialMap;\n }\n\n function upsertCountries(list: CountryOption[]) {\n countries.value = list;\n rebuildIndexes(list);\n }\n\n function normalizeRestCountries(list: RestCountry[]): CountryOption[] {\n const out: CountryOption[] = [];\n for (const c of list) {\n const name = c?.name?.common?.trim();\n const iso2 = normalizeIso2(c?.cca2);\n const dial = buildDialCode(c?.idd);\n const flag = c?.flags?.png?.trim() || c?.flags?.svg?.trim() || null;\n if (!name || !iso2 || !dial) continue;\n const dialDigits = toDigits(dial);\n const search_key = normalizeSearchKey(`${name} ${dial} ${iso2} ${dialDigits}`);\n out.push({\n label: `${name} (${dial})`,\n value: iso2,\n search_key,\n raw_data: {\n iso2,\n dial_code: dial,\n dial_digits: dialDigits,\n name,\n flag,\n source: 'restcountries',\n original: c,\n },\n });\n }\n\n const map = new Map<string, CountryOption>();\n for (const item of out) {\n const prev = map.get(item.value);\n if (!prev) {\n map.set(item.value, item);\n continue;\n }\n const prevScore = (prev.raw_data.flag ? 1 : 0) + (prev.raw_data.dial_code ? 1 : 0);\n const nextScore = (item.raw_data.flag ? 1 : 0) + (item.raw_data.dial_code ? 1 : 0);\n if (nextScore > prevScore) map.set(item.value, item);\n }\n return Array.from(map.values()).sort((a, b) => a.raw_data.name.localeCompare(b.raw_data.name));\n }\n\n async function getCountries(options?: { force?: boolean }) {\n const force = Boolean(options?.force);\n if (!force && countries.value.length) return countries.value;\n\n if (!force && isBrowser()) {\n try {\n const cached = localStorage.getItem(STORAGE_KEY);\n if (cached) {\n const parsed = JSON.parse(cached) as CountryOption[];\n if (Array.isArray(parsed) && parsed.length) {\n upsertCountries(parsed);\n return countries.value;\n }\n }\n } catch {\n /* ignore parse errors */\n }\n }\n\n isCountriesLoading.value = true;\n try {\n const res = await fetch(REST_COUNTRIES_URL);\n if (!res.ok) throw new Error(`Failed to fetch countries: ${res.status}`);\n const data = (await res.json()) as RestCountry[];\n const normalized = normalizeRestCountries(data);\n upsertCountries(normalized.length ? normalized : FALLBACK_COUNTRIES);\n if (isBrowser()) {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(countries.value));\n } catch {\n /* storage full or disabled */\n }\n }\n return countries.value;\n } catch {\n upsertCountries(FALLBACK_COUNTRIES);\n return countries.value;\n } finally {\n isCountriesLoading.value = false;\n }\n }\n\n function searchCountries(keyword: string, limit = 50) {\n const q = normalizeSearchKey(keyword);\n if (!q) return countries.value.slice(0, limit);\n const res: CountryOption[] = [];\n for (const item of countries.value) {\n if (item.search_key.includes(q)) {\n res.push(item);\n if (res.length >= limit) break;\n }\n }\n return res;\n }\n\n function getCountryByValue(value: string) {\n return byValue.value.get(normalizeIso2(value)) ?? null;\n }\n\n function getCountriesByDial(dial: string) {\n return byDialDigits.value.get(toDigits(dial)) ?? [];\n }\n\n function getRequiredInfo(country: {\n iso2: string;\n dial_code?: string;\n }): PhoneRequiredInfo | null {\n const iso2 = normalizeIso2(country.iso2);\n if (!iso2) return null;\n try {\n const example = getExampleNumber(iso2 as CountryCode, EX);\n const exampleNational = example?.formatNational?.() ?? '';\n const exampleE164 = example?.format?.('E.164') ?? '';\n const inferred = inferLengthFromExample(exampleNational);\n const dial_code = country.dial_code\n ? ensurePlusDial(country.dial_code)\n : exampleE164\n ? `+${example?.countryCallingCode}`\n : '';\n const digitsExample = toDigits(exampleNational);\n return {\n iso2,\n dial_code,\n placeholder: '',\n example_national: exampleNational,\n example_e164: exampleE164,\n national_number_length: inferred,\n format_hint: digitsExample ? `e.g. ${digitsExample}` : '',\n };\n } catch {\n return null;\n }\n }\n\n function validate(input: ValidateArgs): PhoneValidationResult {\n const country = input.country ?? null;\n if (!country?.iso2) {\n return {\n ok: false,\n reason: 'missing_country',\n country: null,\n phone: { raw: ('phone' in input ? input.phone : null) ?? null, digits: '' },\n full_phone: null,\n required: null,\n };\n }\n\n const iso2 = normalizeIso2(country.iso2);\n const required = getRequiredInfo({ iso2, dial_code: country.dial_code });\n if (!required) {\n return {\n ok: false,\n reason: 'country_not_supported',\n country: { iso2, dial_code: ensurePlusDial(country.dial_code) },\n phone: { raw: ('phone' in input ? input.phone : null) ?? null, digits: '' },\n full_phone: null,\n required: null,\n };\n }\n\n if (!('phone' in input)) {\n return {\n ok: true,\n reason: null,\n country: { iso2: required.iso2, dial_code: required.dial_code },\n phone: { raw: null, digits: '' },\n full_phone: null,\n required,\n };\n }\n\n const raw = input.phone;\n const digits = toDigits(raw);\n\n if (!raw || !String(raw).trim()) {\n return {\n ok: true,\n reason: null,\n country: { iso2: required.iso2, dial_code: required.dial_code },\n phone: { raw: raw ?? null, digits: '' },\n full_phone: null,\n required,\n };\n }\n\n if (\n String(raw)\n .replace(/\\s+/g, '')\n .match(/[^\\d+]/)\n ) {\n return {\n ok: false,\n reason: 'phone_has_non_digits',\n country: { iso2: required.iso2, dial_code: required.dial_code },\n phone: { raw, digits },\n full_phone: buildFullE164(required.dial_code, digits),\n required,\n };\n }\n\n const nsn = dropLeadingZeros(digits);\n const { min, max } = required.national_number_length;\n\n if (min !== null && nsn.length < min) {\n return {\n ok: false,\n reason: 'too_short',\n country: { iso2: required.iso2, dial_code: required.dial_code },\n phone: { raw, digits },\n full_phone: buildFullE164(required.dial_code, digits),\n required,\n details: { min, actual: nsn.length },\n };\n }\n\n if (max !== null && nsn.length > max) {\n return {\n ok: false,\n reason: 'too_long',\n country: { iso2: required.iso2, dial_code: required.dial_code },\n phone: { raw, digits },\n full_phone: buildFullE164(required.dial_code, digits),\n required,\n details: { max, actual: nsn.length },\n };\n }\n\n const full = buildFullE164(required.dial_code, digits) ?? String(raw);\n\n try {\n const ok = isValidPhoneNumber(full, iso2 as CountryCode);\n if (!ok) {\n const parsed = parsePhoneNumberFromString(full, iso2 as CountryCode);\n return {\n ok: false,\n reason: 'invalid_phone',\n country: { iso2: required.iso2, dial_code: required.dial_code },\n phone: { raw, digits },\n full_phone: parsed?.number ?? null,\n required,\n details: {\n type: parsed?.getType?.() ?? null,\n possible: parsed?.isPossible?.() ?? null,\n country: parsed?.country ?? null,\n },\n };\n }\n const parsed = parsePhoneNumberFromString(full, iso2 as CountryCode);\n return {\n ok: true,\n reason: null,\n country: { iso2: required.iso2, dial_code: required.dial_code },\n phone: { raw, digits },\n full_phone: parsed?.number ?? full,\n required,\n };\n } catch (e) {\n return {\n ok: false,\n reason: 'parse_failed',\n country: { iso2: required.iso2, dial_code: required.dial_code },\n phone: { raw, digits },\n full_phone: buildFullE164(required.dial_code, digits),\n required,\n details: { error: (e as Error)?.message ?? String(e) },\n };\n }\n }\n\n return {\n countries,\n isCountriesLoading,\n getCountries,\n searchCountries,\n getCountryByValue,\n getCountriesByDial,\n getRequiredInfo,\n validate,\n };\n}\n","/**\n * Best-effort country detection chain: IP geolocation → timezone → navigator.language → fallback.\n * Every step is independent and degrades gracefully; the final fallback is always returned.\n *\n * The composable returns reactive state so consumers can swap in the detected ISO2 the moment it\n * resolves, while still rendering an input immediately on mount.\n */\n\nimport { onMounted, ref, type Ref } from 'vue';\n\nexport type DetectionStrategy = 'auto' | 'locale' | 'none';\n\nexport interface DetectCountryOptions {\n /**\n * - `'auto'` — try IP geolocation first, then timezone, then `navigator.language`, then default.\n * - `'locale'` — skip the network call, use timezone + locale only.\n * - `'none'` — return `defaultCountry` immediately.\n */\n strategy?: DetectionStrategy;\n /** Endpoint returning a JSON body with a `country_code` (or `country`) field. */\n ipEndpoint?: string;\n /** Fallback ISO2 used when every step fails. */\n defaultCountry?: string;\n /** Abort the IP request after this many ms. */\n timeoutMs?: number;\n /** Persist the resolved country in sessionStorage so re-mounts within the session skip detection. */\n cache?: boolean;\n}\n\nconst SESSION_CACHE_KEY = 'ali_ui_country_detected';\n\nconst isBrowser = () => typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/** Hand-rolled IANA timezone → ISO2 map. Covers the most-populated zones; falls through on miss. */\nconst TIMEZONE_TO_ISO2: Record<string, string> = {\n // Africa\n 'Africa/Cairo': 'EG',\n 'Africa/Johannesburg': 'ZA',\n 'Africa/Lagos': 'NG',\n 'Africa/Casablanca': 'MA',\n 'Africa/Algiers': 'DZ',\n 'Africa/Nairobi': 'KE',\n 'Africa/Accra': 'GH',\n 'Africa/Tunis': 'TN',\n // Americas\n 'America/Argentina/Buenos_Aires': 'AR',\n 'America/Bogota': 'CO',\n 'America/Caracas': 'VE',\n 'America/Chicago': 'US',\n 'America/Denver': 'US',\n 'America/Halifax': 'CA',\n 'America/Lima': 'PE',\n 'America/Los_Angeles': 'US',\n 'America/Mexico_City': 'MX',\n 'America/New_York': 'US',\n 'America/Phoenix': 'US',\n 'America/Sao_Paulo': 'BR',\n 'America/Santiago': 'CL',\n 'America/Toronto': 'CA',\n 'America/Vancouver': 'CA',\n // Asia\n 'Asia/Baghdad': 'IQ',\n 'Asia/Bahrain': 'BH',\n 'Asia/Bangkok': 'TH',\n 'Asia/Beirut': 'LB',\n 'Asia/Damascus': 'SY',\n 'Asia/Dhaka': 'BD',\n 'Asia/Dubai': 'AE',\n 'Asia/Hong_Kong': 'HK',\n 'Asia/Jakarta': 'ID',\n 'Asia/Jerusalem': 'IL',\n 'Asia/Karachi': 'PK',\n 'Asia/Kolkata': 'IN',\n 'Asia/Kuala_Lumpur': 'MY',\n 'Asia/Kuwait': 'KW',\n 'Asia/Manila': 'PH',\n 'Asia/Muscat': 'OM',\n 'Asia/Qatar': 'QA',\n 'Asia/Riyadh': 'SA',\n 'Asia/Seoul': 'KR',\n 'Asia/Shanghai': 'CN',\n 'Asia/Singapore': 'SG',\n 'Asia/Taipei': 'TW',\n 'Asia/Tehran': 'IR',\n 'Asia/Tokyo': 'JP',\n 'Asia/Yangon': 'MM',\n // Europe\n 'Europe/Amsterdam': 'NL',\n 'Europe/Athens': 'GR',\n 'Europe/Belgrade': 'RS',\n 'Europe/Berlin': 'DE',\n 'Europe/Brussels': 'BE',\n 'Europe/Bucharest': 'RO',\n 'Europe/Budapest': 'HU',\n 'Europe/Copenhagen': 'DK',\n 'Europe/Dublin': 'IE',\n 'Europe/Helsinki': 'FI',\n 'Europe/Istanbul': 'TR',\n 'Europe/Kyiv': 'UA',\n 'Europe/Lisbon': 'PT',\n 'Europe/London': 'GB',\n 'Europe/Madrid': 'ES',\n 'Europe/Moscow': 'RU',\n 'Europe/Oslo': 'NO',\n 'Europe/Paris': 'FR',\n 'Europe/Prague': 'CZ',\n 'Europe/Rome': 'IT',\n 'Europe/Sofia': 'BG',\n 'Europe/Stockholm': 'SE',\n 'Europe/Vienna': 'AT',\n 'Europe/Warsaw': 'PL',\n 'Europe/Zurich': 'CH',\n // Oceania\n 'Australia/Brisbane': 'AU',\n 'Australia/Melbourne': 'AU',\n 'Australia/Perth': 'AU',\n 'Australia/Sydney': 'AU',\n 'Pacific/Auckland': 'NZ',\n 'Pacific/Honolulu': 'US',\n};\n\nfunction tryTimezone(): string | null {\n if (!isBrowser()) return null;\n try {\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n return TIMEZONE_TO_ISO2[tz] ?? null;\n } catch {\n return null;\n }\n}\n\nfunction tryLocale(): string | null {\n if (!isBrowser()) return null;\n try {\n const lang = navigator.language ?? '';\n const m = lang.match(/^[a-z]{2,3}-([A-Z]{2})/);\n return m ? m[1] : null;\n } catch {\n return null;\n }\n}\n\nasync function tryIp(endpoint: string, timeoutMs: number): Promise<string | null> {\n if (!isBrowser() || typeof fetch !== 'function') return null;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(endpoint, { signal: controller.signal, credentials: 'omit' });\n if (!res.ok) return null;\n const data = (await res.json()) as { country_code?: string; country?: string };\n const code = (data.country_code ?? data.country ?? '').toString().toUpperCase();\n return /^[A-Z]{2}$/.test(code) ? code : null;\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction readCache(): string | null {\n if (!isBrowser()) return null;\n try {\n const v = sessionStorage.getItem(SESSION_CACHE_KEY);\n return v && /^[A-Z]{2}$/.test(v) ? v : null;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(iso2: string) {\n if (!isBrowser()) return;\n try {\n sessionStorage.setItem(SESSION_CACHE_KEY, iso2);\n } catch {\n /* quota or storage disabled — silently ignore */\n }\n}\n\n/**\n * Imperative API. Use this when you want to call detection from outside Vue (e.g. inside a\n * non-component composable, server middleware, or unit test).\n */\nexport async function detectCountry(opts: DetectCountryOptions = {}): Promise<string> {\n const {\n strategy = 'auto',\n ipEndpoint = 'https://ipapi.co/json/',\n defaultCountry = 'US',\n timeoutMs = 2000,\n cache = true,\n } = opts;\n\n if (cache) {\n const cached = readCache();\n if (cached) return cached;\n }\n\n if (strategy === 'none') {\n return defaultCountry.toUpperCase();\n }\n\n if (strategy === 'auto') {\n const ipResult = await tryIp(ipEndpoint, timeoutMs);\n if (ipResult) {\n if (cache) writeCache(ipResult);\n return ipResult;\n }\n }\n\n const localResult = tryTimezone() ?? tryLocale();\n const final = (localResult ?? defaultCountry).toUpperCase();\n if (cache) writeCache(final);\n return final;\n}\n\nexport interface UseCountryDetectionReturn {\n /** Resolved ISO2 code. Initially `null` until detection completes. */\n country: Ref<string | null>;\n /** True while detection is in flight. */\n isLoading: Ref<boolean>;\n /** Manually re-run detection (e.g. after the user changes their VPN). */\n refresh: () => Promise<string>;\n}\n\n/**\n * Reactive wrapper. Kicks off detection in `onMounted` so SSR renders an empty value and the\n * client patches in the real country once resolved.\n */\nexport function useCountryDetection(opts: DetectCountryOptions = {}): UseCountryDetectionReturn {\n const country = ref<string | null>(null);\n const isLoading = ref(false);\n\n async function run() {\n isLoading.value = true;\n try {\n country.value = await detectCountry(opts);\n } finally {\n isLoading.value = false;\n }\n return country.value!;\n }\n\n onMounted(() => {\n void run();\n });\n\n return { country, isLoading, refresh: run };\n}\n","import type { HTMLAttributes } from 'vue';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type { DetectionStrategy } from '../../composables/useCountryDetection';\nimport type { PhoneValidationReason } from '../../composables/usePhoneValidation';\nimport { controlHeight, controlTextSize, type Size } from '../../lib/sizes';\n\n/** Alias for the shared `Size` scale — kept for backwards-friendly naming. */\nexport type ATellInputSize = Size;\n\nexport const aTellInputVariants = cva(\n // items-center (not items-stretch) so #prefix/#suffix icons centre vertically without distortion.\n // The country trigger button and the input element both carry `h-full`, so they still fill the\n // field height regardless of this setting.\n 'border-input bg-background ring-offset-background focus-within:ring-ring flex w-full items-center overflow-hidden rounded-md border shadow-sm transition-colors focus-within:ring-1 has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50',\n {\n variants: {\n size: {\n xs: `${controlHeight.xs} ${controlTextSize.xs}`,\n sm: `${controlHeight.sm} ${controlTextSize.sm}`,\n md: `${controlHeight.md} ${controlTextSize.md}`,\n lg: `${controlHeight.lg} ${controlTextSize.lg}`,\n xl: `${controlHeight.xl} ${controlTextSize.xl}`,\n },\n },\n defaultVariants: { size: 'md' },\n }\n);\n\nexport type ATellInputVariants = VariantProps<typeof aTellInputVariants>;\n\nexport interface ATellInputProps {\n class?: HTMLAttributes['class'];\n placeholder?: string;\n disabled?: boolean;\n loading?: boolean;\n size?: ATellInputSize;\n /**\n * Whitelist of allowed dial-digit codes (no `+`), e.g. `['20', '966']`.\n * Countries outside this list are still shown in the picker but rendered as disabled.\n */\n allowedDialCodes?: string[];\n /** Show validation error text beneath the input when invalid. */\n showValidation?: boolean;\n /**\n * Country auto-detect strategy. Defaults to `'auto'` — try IP geolocation first, then\n * timezone, then `navigator.language`, finally `defaultCountry`.\n */\n detectCountry?: DetectionStrategy;\n /** Fallback ISO2 when detection fails or is disabled. */\n defaultCountry?: string;\n /** Override the IP geolocation endpoint. Must return JSON with `country_code` or `country`. */\n ipEndpoint?: string;\n /** Localized strings for the country picker UI. */\n searchPlaceholder?: string;\n emptyText?: string;\n loadingText?: string;\n /** Error labels keyed by reason. Each gets a sensible English default. */\n errorMessages?: Partial<Record<PhoneValidationReason, string>>;\n}\n\nexport const DEFAULT_ERROR_MESSAGES: Record<PhoneValidationReason, string> = {\n missing_country: 'Please select a country.',\n country_not_supported: 'This country is not supported.',\n phone_has_non_digits: 'Phone number can only contain digits.',\n too_short: 'Phone number is too short.',\n too_long: 'Phone number is too long.',\n invalid_phone: 'Phone number is invalid.',\n parse_failed: 'Could not parse phone number.',\n};\n","/**\n * Default flag URL builder — flagcdn.com hosts PNG flags at multiple widths and is\n * generous with caching + no API key required. Swap via the `flagUrl` prop on\n * ATellInput / ACountrySelect / ACountryFlag to use any other source.\n */\nexport function defaultFlagUrl(iso2: string, width = 40): string {\n return `https://flagcdn.com/w${width}/${iso2.toLowerCase()}.png`;\n}\n\nexport type FlagUrlBuilder = (iso2: string, width: number) => string;\n","<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue';\nimport { computed } from 'vue';\nimport { cn } from '../../lib/utils';\nimport { defaultFlagUrl, type FlagUrlBuilder } from './flag-url';\n\nconst props = withDefaults(\n defineProps<{\n /** ISO 3166-1 alpha-2 country code, case-insensitive. */\n iso2: string;\n /** Pixel width served by flagcdn. 40 is crisp at retina up to ~24px wide. */\n width?: number;\n /** Optional explicit URL override. When set, `iso2` / `width` / `flagUrl` are ignored. */\n src?: string | null;\n /** Function `(iso2, width) => string` — fully replace the URL builder. */\n flagUrl?: FlagUrlBuilder;\n alt?: string;\n class?: HTMLAttributes['class'];\n }>(),\n { width: 40 }\n);\n\nconst url = computed(() => {\n if (props.src) return props.src;\n if (!props.iso2) return null;\n return (props.flagUrl ?? defaultFlagUrl)(props.iso2, props.width);\n});\n</script>\n\n<template>\n <img\n v-if=\"url\"\n :src=\"url\"\n :alt=\"props.alt ?? `${props.iso2} flag`\"\n loading=\"lazy\"\n data-slot=\"country-flag\"\n :class=\"cn('ring-border/40 inline-block h-4 w-6 rounded-sm object-cover ring-1', props.class)\"\n />\n <slot v-else name=\"empty\">\n <span\n data-slot=\"country-flag-empty\"\n :class=\"cn('bg-muted inline-block h-4 w-6 rounded-sm', props.class)\"\n />\n </slot>\n</template>\n","<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { Check, ChevronDown, Search } from 'lucide-vue-next';\nimport { cn } from '../../lib/utils';\nimport {\n AResponsivePopover,\n AResponsivePopoverContent,\n AResponsivePopoverTrigger,\n} from '../responsive-popover';\nimport { usePhoneValidation, type CountryOption } from '../../composables/usePhoneValidation';\nimport { controlPaddingX, controlTextSize, DEFAULT_SIZE, type Size } from '../../lib/sizes';\nimport ACountryFlag from './ACountryFlag.vue';\n\nconst props = withDefaults(\n defineProps<{\n class?: HTMLAttributes['class'];\n triggerClass?: HTMLAttributes['class'];\n contentClass?: HTMLAttributes['class'];\n popoverClass?: HTMLAttributes['class'];\n drawerClass?: HTMLAttributes['class'];\n searchPlaceholder?: string;\n emptyText?: string;\n loadingText?: string;\n suggestedLabel?: string;\n allCountriesLabel?: string;\n /** ISO2 codes that are selectable. Others are listed but disabled. */\n allowedDialCodes?: string[];\n disabled?: boolean;\n /** Drives the trigger button padding + text size. Matches ATellInput's `size`. */\n size?: Size;\n /** Max items rendered under the \"Suggested\" header (current + recents, deduped). */\n suggestedLimit?: number;\n /** Cap the number of matching countries shown in search results. */\n maxResults?: number;\n /** Override the flag URL builder, e.g. `(iso, w) => \\`/flags/${iso}.svg\\``. */\n flagUrl?: (iso2: string, width: number) => string;\n /**\n * Custom search predicate. Default: substring match on the precomputed `search_key`.\n * Return `true` to keep the country in results.\n */\n searcher?: (query: string, country: CountryOption) => boolean;\n /**\n * Provide your own country list (bypasses the REST Countries fetch). Useful when you\n * already have a curated subset, an i18n'd list, or want to avoid the network call.\n */\n countries?: CountryOption[];\n /** Override the right-side kbd hints. Pass `null` to hide. */\n kbdOpen?: string | null;\n kbdClose?: string | null;\n }>(),\n {\n searchPlaceholder: 'Search country or +code…',\n emptyText: 'No countries found.',\n loadingText: 'Loading countries…',\n suggestedLabel: 'Suggested',\n allCountriesLabel: 'All countries',\n size: DEFAULT_SIZE,\n suggestedLimit: 4,\n maxResults: 80,\n kbdOpen: '⌘K',\n kbdClose: 'Esc',\n }\n);\n\ndefineSlots<{\n /** Replace the entire country picker trigger button. */\n trigger?: (props: {\n selectedCountry: CountryOption | null;\n open: boolean;\n sizeClasses: string;\n }) => unknown;\n /** Replace the chevron icon. */\n chevron?: (props: { open: boolean }) => unknown;\n /** Replace just the flag rendered in the trigger and items. */\n flag?: (props: { country: CountryOption; context: 'trigger' | 'item' }) => unknown;\n /** Replace the entire search bar (input + icon + kbd). */\n search?: (props: {\n value: string;\n setValue: (v: string) => void;\n isSearching: boolean;\n }) => unknown;\n /** Replace the search-bar leading icon. */\n 'search-icon'?: () => unknown;\n /** Replace the loading state. */\n loading?: () => unknown;\n /** Replace the empty/no-results state. */\n empty?: (props: { query: string }) => unknown;\n /** Replace a section header. */\n 'group-header'?: (props: { label: string; group: 'suggested' | 'all' }) => unknown;\n /** Replace each country list row. Default render still available via &lt;ACountrySelectItem /&gt;. */\n item?: (props: {\n country: CountryOption;\n selected: boolean;\n disabled: boolean;\n select: () => void;\n }) => unknown;\n /** Replace just the right-side check icon for the selected row. */\n 'item-check'?: (props: { country: CountryOption }) => unknown;\n}>();\n\nconst triggerSizeClasses = computed(\n () => `${controlPaddingX[props.size]} ${controlTextSize[props.size]}`\n);\n\nconst selected = defineModel<string>('selected', { default: '' });\n\nconst {\n countries: internalCountries,\n isCountriesLoading,\n getCountries,\n searchCountries: defaultSearch,\n getCountryByValue: lookupInternal,\n} = usePhoneValidation();\n\nconst open = ref(false);\nconst search = ref('');\n\nvoid getCountries();\n\n/* ---------------------------------------------------------------\n * Country source — either the user-supplied list (props.countries)\n * or the internal REST Countries + localStorage cache.\n * ------------------------------------------------------------- */\nconst effectiveCountries = computed<CountryOption[]>(() =>\n props.countries && props.countries.length ? props.countries : internalCountries.value\n);\n\nconst customByValue = computed<Map<string, CountryOption>>(() => {\n if (!props.countries || !props.countries.length) return new Map();\n return new Map(props.countries.map((c) => [c.value, c]));\n});\n\nfunction lookup(iso2: string): CountryOption | null {\n if (!iso2) return null;\n return customByValue.value.get(iso2) ?? lookupInternal(iso2);\n}\n\n/* ---------------------------------------------------------------\n * Recent picks — persisted so subsequent visits surface the user's\n * actual countries above the long alphabetical list.\n * ------------------------------------------------------------- */\nconst RECENTS_KEY = 'ali_ui_country_recents_v1';\nconst recents = ref<string[]>([]);\n\nfunction loadRecents() {\n if (typeof window === 'undefined') return;\n try {\n const raw = localStorage.getItem(RECENTS_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return;\n recents.value = parsed.filter((v): v is string => typeof v === 'string').slice(0, 8);\n } catch {\n /* ignore corrupt cache */\n }\n}\n\nfunction pushRecent(iso2: string) {\n if (typeof window === 'undefined' || !iso2) return;\n const next = [iso2, ...recents.value.filter((x) => x !== iso2)].slice(0, 8);\n recents.value = next;\n try {\n localStorage.setItem(RECENTS_KEY, JSON.stringify(next));\n } catch {\n /* quota or storage disabled */\n }\n}\n\nonMounted(loadRecents);\n\n/* ---------------------------------------------------------------\n * Section state\n * ------------------------------------------------------------- */\nconst isSearching = computed(() => search.value.trim().length > 0);\n\nfunction defaultSearcher(q: string, c: CountryOption): boolean {\n return c.search_key.includes(q.toLowerCase());\n}\n\nconst filtered = computed<CountryOption[]>(() => {\n if (!isSearching.value) return [];\n // When the caller didn't override the country source, the internal `searchCountries`\n // is already optimal (uses the precomputed search_key + early break). Only fall back\n // to a manual filter when we need to honor a custom `searcher` or `countries` source.\n if (!props.countries && !props.searcher) {\n return defaultSearch(search.value, props.maxResults);\n }\n const q = search.value.trim();\n const matcher = props.searcher ?? defaultSearcher;\n const out: CountryOption[] = [];\n for (const c of effectiveCountries.value) {\n if (matcher(q, c)) {\n out.push(c);\n if (out.length >= props.maxResults) break;\n }\n }\n return out;\n});\n\nconst suggested = computed<CountryOption[]>(() => {\n if (isSearching.value) return [];\n const seen = new Set<string>();\n const out: CountryOption[] = [];\n const candidate = (iso: string) => {\n if (!iso || seen.has(iso)) return;\n const c = lookup(iso);\n if (!c) return;\n seen.add(iso);\n out.push(c);\n };\n candidate(selected.value);\n for (const r of recents.value) {\n candidate(r);\n if (out.length >= props.suggestedLimit) break;\n }\n return out.slice(0, props.suggestedLimit);\n});\n\nconst allCountries = computed<CountryOption[]>(() => {\n if (isSearching.value) return [];\n return effectiveCountries.value;\n});\n\nconst selectedCountry = computed<CountryOption | null>(() => lookup(selected.value));\n\nfunction isAllowed(option: CountryOption) {\n const allowed = props.allowedDialCodes;\n if (!allowed || allowed.length === 0) return true;\n return allowed.includes(option.raw_data.dial_digits);\n}\n\nfunction selectCountry(option: CountryOption) {\n if (!isAllowed(option)) return;\n selected.value = option.value;\n pushRecent(option.value);\n open.value = false;\n}\n\nwatch(open, (isOpen) => {\n if (!isOpen) search.value = '';\n});\n\ndefineExpose({\n open,\n setOpen: (v: boolean) => (open.value = v),\n search,\n setSearch: (v: string) => (search.value = v),\n selectedCountry,\n selectCountry,\n countries: effectiveCountries,\n recents,\n});\n</script>\n\n<template>\n <AResponsivePopover v-model:open=\"open\">\n <AResponsivePopoverTrigger as-child>\n <slot\n name=\"trigger\"\n :selected-country=\"selectedCountry\"\n :open=\"open\"\n :size-classes=\"triggerSizeClasses\"\n >\n <button\n type=\"button\"\n :disabled=\"props.disabled\"\n data-slot=\"country-select-trigger\"\n :data-state=\"open ? 'open' : 'closed'\"\n :class=\"\n cn(\n 'bg-muted/50 hover:bg-muted focus-visible:bg-muted data-[state=open]:bg-muted focus-visible:ring-ring border-input inline-flex h-full shrink-0 items-center gap-2 border-r transition-colors focus-visible:ring-1 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n triggerSizeClasses,\n props.triggerClass\n )\n \"\n :aria-label=\"\n selectedCountry ? `Country: ${selectedCountry.raw_data.name}` : 'Select country'\n \"\n >\n <slot v-if=\"selectedCountry\" name=\"flag\" :country=\"selectedCountry\" context=\"trigger\">\n <ACountryFlag\n :iso2=\"selectedCountry.raw_data.iso2\"\n :src=\"selectedCountry.raw_data.flag\"\n :flag-url=\"props.flagUrl\"\n />\n </slot>\n <span class=\"text-foreground font-medium tabular-nums\">\n {{ selectedCountry ? selectedCountry.raw_data.dial_code : '+?' }}\n </span>\n <slot name=\"chevron\" :open=\"open\">\n <ChevronDown\n class=\"text-muted-foreground size-3.5 shrink-0 transition-transform duration-200\"\n :class=\"open && 'rotate-180'\"\n />\n </slot>\n </button>\n </slot>\n </AResponsivePopoverTrigger>\n\n <AResponsivePopoverContent\n align=\"start\"\n :side-offset=\"6\"\n :class=\"cn('flex flex-col overflow-hidden p-0', props.contentClass)\"\n :popover-class=\"\n cn(\n 'w-[min(20rem,calc(100vw-2rem))] max-h-[min(22rem,var(--reka-popover-content-available-height))]',\n props.popoverClass\n )\n \"\n :drawer-class=\"cn('max-h-[80vh] pb-4', props.drawerClass)\"\n >\n <!-- Search header -->\n <slot\n name=\"search\"\n :value=\"search\"\n :set-value=\"(v: string) => (search = v)\"\n :is-searching=\"isSearching\"\n >\n <div class=\"border-b p-1.5\">\n <div\n class=\"bg-muted/40 ring-border focus-within:ring-ring relative flex items-center rounded-md ring-1 transition-shadow focus-within:ring-2\"\n >\n <slot name=\"search-icon\">\n <Search\n class=\"text-muted-foreground absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2\"\n />\n </slot>\n <input\n v-model=\"search\"\n type=\"text\"\n data-slot=\"country-select-search\"\n :placeholder=\"props.searchPlaceholder\"\n class=\"placeholder:text-muted-foreground h-8 w-full bg-transparent pr-14 pl-8 text-sm outline-none\"\n />\n <kbd\n v-if=\"!isSearching && props.kbdOpen\"\n class=\"bg-background text-muted-foreground border-border absolute top-1/2 right-2 hidden -translate-y-1/2 items-center gap-0.5 rounded border px-1.5 py-0.5 font-mono text-[10px] tracking-tight md:inline-flex\"\n >\n {{ props.kbdOpen }}\n </kbd>\n <kbd\n v-else-if=\"isSearching && props.kbdClose\"\n class=\"bg-background text-muted-foreground border-border absolute top-1/2 right-2 hidden -translate-y-1/2 rounded border px-1.5 py-0.5 font-mono text-[10px] tracking-tight md:inline-block\"\n >\n {{ props.kbdClose }}\n </kbd>\n </div>\n </div>\n </slot>\n\n <!-- List -->\n <div class=\"flex-1 overflow-y-auto\">\n <slot v-if=\"isCountriesLoading && effectiveCountries.length === 0\" name=\"loading\">\n <div class=\"text-muted-foreground p-4 text-center text-sm\">\n {{ props.loadingText }}\n </div>\n </slot>\n\n <slot v-else-if=\"isSearching && filtered.length === 0\" name=\"empty\" :query=\"search\">\n <div class=\"text-muted-foreground p-4 text-center text-sm\">\n {{ props.emptyText }}\n </div>\n </slot>\n\n <template v-else>\n <!-- Suggested group -->\n <section\n v-if=\"suggested.length > 0\"\n data-slot=\"country-select-group\"\n data-group=\"suggested\"\n >\n <slot name=\"group-header\" :label=\"props.suggestedLabel\" group=\"suggested\">\n <header\n class=\"text-muted-foreground bg-popover sticky top-0 z-10 px-3 py-1.5 text-[10px] font-medium tracking-wider uppercase\"\n >\n {{ props.suggestedLabel }}\n </header>\n </slot>\n <ul role=\"listbox\" :aria-label=\"props.suggestedLabel\" class=\"pb-1\">\n <li\n v-for=\"option in suggested\"\n :key=\"`s-${option.value}`\"\n role=\"option\"\n :aria-selected=\"option.value === selected\"\n :aria-disabled=\"!isAllowed(option)\"\n >\n <slot\n name=\"item\"\n :country=\"option\"\n :selected=\"option.value === selected\"\n :disabled=\"!isAllowed(option)\"\n :select=\"() => selectCountry(option)\"\n >\n <button\n type=\"button\"\n :disabled=\"!isAllowed(option)\"\n data-slot=\"country-select-item\"\n :data-selected=\"option.value === selected ? '' : undefined\"\n class=\"hover:bg-muted/60 focus-visible:bg-muted/60 data-[selected]:bg-muted flex w-full items-center gap-3 px-3 py-2 text-left text-sm transition-colors focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent\"\n @click=\"selectCountry(option)\"\n >\n <slot name=\"flag\" :country=\"option\" context=\"item\">\n <ACountryFlag\n :iso2=\"option.raw_data.iso2\"\n :src=\"option.raw_data.flag\"\n :flag-url=\"props.flagUrl\"\n />\n </slot>\n <span class=\"flex-1 truncate\">{{ option.raw_data.name }}</span>\n <span class=\"text-muted-foreground tabular-nums\">{{\n option.raw_data.dial_code\n }}</span>\n <slot v-if=\"option.value === selected\" name=\"item-check\" :country=\"option\">\n <Check class=\"text-foreground size-3.5 shrink-0\" />\n </slot>\n </button>\n </slot>\n </li>\n </ul>\n </section>\n\n <!-- All countries / search results -->\n <section data-slot=\"country-select-group\" data-group=\"all\">\n <slot\n v-if=\"!isSearching && allCountries.length > 0\"\n name=\"group-header\"\n :label=\"props.allCountriesLabel\"\n group=\"all\"\n >\n <header\n class=\"text-muted-foreground bg-popover sticky top-0 z-10 px-3 py-1.5 text-[10px] font-medium tracking-wider uppercase\"\n >\n {{ props.allCountriesLabel }}\n </header>\n </slot>\n <ul\n role=\"listbox\"\n :aria-label=\"isSearching ? props.searchPlaceholder : props.allCountriesLabel\"\n class=\"pb-1\"\n >\n <li\n v-for=\"option in isSearching ? filtered : allCountries\"\n :key=\"option.value\"\n role=\"option\"\n :aria-selected=\"option.value === selected\"\n :aria-disabled=\"!isAllowed(option)\"\n >\n <slot\n name=\"item\"\n :country=\"option\"\n :selected=\"option.value === selected\"\n :disabled=\"!isAllowed(option)\"\n :select=\"() => selectCountry(option)\"\n >\n <button\n type=\"button\"\n :disabled=\"!isAllowed(option)\"\n data-slot=\"country-select-item\"\n :data-selected=\"option.value === selected ? '' : undefined\"\n class=\"hover:bg-muted/60 focus-visible:bg-muted/60 data-[selected]:bg-muted flex w-full items-center gap-3 px-3 py-2 text-left text-sm transition-colors focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent\"\n @click=\"selectCountry(option)\"\n >\n <slot name=\"flag\" :country=\"option\" context=\"item\">\n <ACountryFlag\n :iso2=\"option.raw_data.iso2\"\n :src=\"option.raw_data.flag\"\n :flag-url=\"props.flagUrl\"\n />\n </slot>\n <span class=\"flex-1 truncate\">{{ option.raw_data.name }}</span>\n <span class=\"text-muted-foreground tabular-nums\">{{\n option.raw_data.dial_code\n }}</span>\n <slot v-if=\"option.value === selected\" name=\"item-check\" :country=\"option\">\n <Check class=\"text-foreground size-3.5 shrink-0\" />\n </slot>\n </button>\n </slot>\n </li>\n </ul>\n </section>\n </template>\n </div>\n </AResponsivePopoverContent>\n </AResponsivePopover>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, watch } from 'vue';\nimport { CheckCircle2, AlertCircle } from 'lucide-vue-next';\nimport { cn } from '../../lib/utils';\nimport {\n usePhoneValidation,\n type CountryOption,\n type PhoneValidationResult,\n} from '../../composables/usePhoneValidation';\nimport { detectCountry, type DetectCountryOptions } from '../../composables/useCountryDetection';\nimport { controlPaddingX, controlTextSize, DEFAULT_SIZE } from '../../lib/sizes';\nimport { aTellInputVariants, DEFAULT_ERROR_MESSAGES, type ATellInputProps } from './types';\nimport ACountrySelect from './ACountrySelect.vue';\n\ninterface ExtendedProps extends ATellInputProps {\n /** Override the flag URL builder, forwarded to ACountrySelect. */\n flagUrl?: (iso2: string, width: number) => string;\n /** Custom search predicate, forwarded to ACountrySelect. */\n searcher?: (query: string, country: CountryOption) => boolean;\n /** Provide your own country list, forwarded to ACountrySelect. */\n countries?: CountryOption[];\n /**\n * Fully custom country detection. When provided, this function runs in place of the\n * built-in chain — `detectCountry`-style options are still honored but the function\n * receives them and is free to ignore them.\n */\n detector?: (options: DetectCountryOptions) => Promise<string | null | undefined>;\n /** Forwarded to ACountrySelect: classes for the popover content surface. */\n contentClass?: string;\n popoverClass?: string;\n drawerClass?: string;\n /** Classes for the inner phone field input element. */\n inputClass?: string;\n /** Classes for the outer wrapper that holds country select + input. */\n fieldClass?: string;\n /** Classes for the helper hint line. */\n hintClass?: string;\n /** Classes for the error message line. */\n errorClass?: string;\n}\n\nconst props = withDefaults(defineProps<ExtendedProps>(), {\n placeholder: 'Phone number',\n size: DEFAULT_SIZE,\n detectCountry: 'auto',\n defaultCountry: 'US',\n ipEndpoint: 'https://ipapi.co/json/',\n});\n\ndefineSlots<{\n /** Content before the country select trigger (e.g. an icon). */\n prefix?: () => unknown;\n /** Content between the input and the validation icons. */\n suffix?: (props: {\n validationState: 'idle' | 'valid' | 'error';\n validation: PhoneValidationResult;\n }) => unknown;\n /** Replace the green check shown when the number validates. */\n 'valid-icon'?: () => unknown;\n /** Replace the warning icon shown when the number fails validation. */\n 'error-icon'?: (props: { reason: string }) => unknown;\n /** Replace the dim helper line shown below the input when empty. */\n hint?: (props: { country: string; formatHint: string; example: string | null }) => unknown;\n /** Replace the error message rendered when invalid. */\n error?: (props: {\n message: string;\n reason: string;\n validation: PhoneValidationResult;\n }) => unknown;\n /** Forwarded to ACountrySelect — replace the trigger button. */\n trigger?: (props: {\n selectedCountry: CountryOption | null;\n open: boolean;\n sizeClasses: string;\n }) => unknown;\n /** Forwarded to ACountrySelect — replace the chevron. */\n chevron?: (props: { open: boolean }) => unknown;\n /** Forwarded — replace any flag rendering. */\n flag?: (props: { country: CountryOption; context: 'trigger' | 'item' }) => unknown;\n /** Forwarded — replace each country list row. */\n item?: (props: {\n country: CountryOption;\n selected: boolean;\n disabled: boolean;\n select: () => void;\n }) => unknown;\n /** Forwarded — section header. */\n 'group-header'?: (props: { label: string; group: 'suggested' | 'all' }) => unknown;\n /** Forwarded — search bar. */\n search?: (props: {\n value: string;\n setValue: (v: string) => void;\n isSearching: boolean;\n }) => unknown;\n loading?: () => unknown;\n empty?: (props: { query: string }) => unknown;\n}>();\n\nconst phone = defineModel<string>('phone', { default: '' });\nconst country = defineModel<string>('country', { default: '' });\n\nconst { getCountries, validate, getRequiredInfo, getCountryByValue } = usePhoneValidation();\n\nvoid getCountries();\n\nonMounted(async () => {\n if (country.value) return;\n const detectOpts: DetectCountryOptions = {\n strategy: props.detectCountry,\n ipEndpoint: props.ipEndpoint,\n defaultCountry: props.defaultCountry,\n };\n let detected: string | null | undefined;\n if (props.detector) {\n try {\n detected = await props.detector(detectOpts);\n } catch {\n detected = null;\n }\n }\n if (!detected) {\n detected = await detectCountry(detectOpts);\n }\n if (!country.value && detected) country.value = detected.toUpperCase();\n});\n\nwatch(\n () => phone.value,\n (next, prev) => {\n const cleaned = String(next ?? '').replace(/\\D/g, '');\n if (cleaned !== next && cleaned !== prev) phone.value = cleaned;\n },\n { flush: 'post' }\n);\n\nconst required = computed(() => (country.value ? getRequiredInfo({ iso2: country.value }) : null));\n\nconst validation = computed<PhoneValidationResult>(() =>\n validate({\n country: country.value ? { iso2: country.value } : null,\n phone: phone.value ?? '',\n })\n);\n\nconst effectivePlaceholder = computed(\n () => props.placeholder || required.value?.format_hint || 'Phone number'\n);\n\nconst errorMessage = computed(() => {\n const v = validation.value;\n if (v.ok || !v.reason) return null;\n if (!phone.value) return null;\n return props.errorMessages?.[v.reason] ?? DEFAULT_ERROR_MESSAGES[v.reason];\n});\n\nconst selectedDialCode = computed(() => {\n if (!country.value) return null;\n return getCountryByValue(country.value)?.raw_data.dial_code ?? null;\n});\n\nconst inputSizeClasses = computed(\n () => `${controlPaddingX[props.size]} ${controlTextSize[props.size]}`\n);\n\nconst validationState = computed<'idle' | 'valid' | 'error'>(() => {\n if (!phone.value) return 'idle';\n return validation.value.ok ? 'valid' : 'error';\n});\n\ndefineExpose({ validation, required, selectedDialCode, validationState });\n</script>\n\n<template>\n <div :class=\"cn('flex w-full flex-col gap-1.5', $attrs.class as string)\" data-slot=\"tell-input\">\n <div class=\"flex items-center gap-2\">\n <div\n :class=\"\n cn(\n aTellInputVariants({ size: props.size }),\n 'focus-within:ring-2 focus-within:ring-offset-0',\n validationState === 'idle' && 'focus-within:ring-ring/40',\n validationState === 'valid' &&\n 'border-emerald-500/60 ring-1 ring-emerald-500/20 focus-within:ring-emerald-500/40',\n validationState === 'error' &&\n 'border-destructive/80 ring-1 ring-destructive/20 focus-within:ring-destructive/40',\n props.class,\n props.fieldClass\n )\n \"\n :data-state=\"validationState\"\n dir=\"ltr\"\n >\n <slot name=\"prefix\" />\n\n <ACountrySelect\n v-model:selected=\"country\"\n :allowed-dial-codes=\"props.allowedDialCodes\"\n :disabled=\"props.disabled || props.loading\"\n :size=\"props.size\"\n :search-placeholder=\"props.searchPlaceholder\"\n :empty-text=\"props.emptyText\"\n :loading-text=\"props.loadingText\"\n :flag-url=\"props.flagUrl\"\n :searcher=\"props.searcher\"\n :countries=\"props.countries\"\n :content-class=\"props.contentClass\"\n :popover-class=\"props.popoverClass\"\n :drawer-class=\"props.drawerClass\"\n >\n <template v-if=\"$slots.trigger\" #trigger=\"slotProps\">\n <slot name=\"trigger\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots.chevron\" #chevron=\"slotProps\">\n <slot name=\"chevron\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots.flag\" #flag=\"slotProps\">\n <slot name=\"flag\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots.item\" #item=\"slotProps\">\n <slot name=\"item\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots['group-header']\" #group-header=\"slotProps\">\n <slot name=\"group-header\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots.search\" #search=\"slotProps\">\n <slot name=\"search\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots.loading\" #loading>\n <slot name=\"loading\" />\n </template>\n <template v-if=\"$slots.empty\" #empty=\"slotProps\">\n <slot name=\"empty\" v-bind=\"slotProps\" />\n </template>\n </ACountrySelect>\n\n <input\n v-model=\"phone\"\n type=\"tel\"\n inputmode=\"numeric\"\n autocomplete=\"tel\"\n data-slot=\"tell-input-field\"\n :disabled=\"props.disabled || props.loading\"\n :placeholder=\"effectivePlaceholder\"\n :aria-invalid=\"validationState === 'error' || undefined\"\n :class=\"\n cn(\n 'placeholder:text-muted-foreground h-full w-full min-w-0 flex-1 bg-transparent tabular-nums outline-none disabled:cursor-not-allowed',\n inputSizeClasses,\n props.inputClass\n )\n \"\n @input=\"\n (e) => {\n const target = e.target as HTMLInputElement;\n const cleaned = target.value.replace(/\\D/g, '');\n if (cleaned !== target.value) target.value = cleaned;\n phone = cleaned;\n }\n \"\n />\n\n <slot name=\"suffix\" :validation-state=\"validationState\" :validation=\"validation\" />\n </div>\n\n <Transition\n enter-active-class=\"transition duration-150 ease-out\"\n leave-active-class=\"transition duration-100 ease-in\"\n enter-from-class=\"opacity-0 scale-90\"\n leave-to-class=\"opacity-0 scale-90\"\n >\n <slot v-if=\"validationState === 'valid'\" name=\"valid-icon\">\n <CheckCircle2 class=\"size-5 shrink-0 text-emerald-500\" aria-hidden=\"true\" />\n </slot>\n <slot\n v-else-if=\"validationState === 'error'\"\n name=\"error-icon\"\n :reason=\"validation.reason ?? ''\"\n >\n <AlertCircle class=\"text-destructive size-5 shrink-0\" aria-hidden=\"true\" />\n </slot>\n </Transition>\n </div>\n\n <slot\n v-if=\"props.showValidation && errorMessage\"\n name=\"error\"\n :message=\"errorMessage\"\n :reason=\"validation.reason ?? ''\"\n :validation=\"validation\"\n >\n <p\n data-slot=\"tell-input-error\"\n :class=\"cn('text-destructive text-xs', props.errorClass)\"\n role=\"alert\"\n >\n {{ errorMessage }}\n </p>\n </slot>\n <slot\n v-else-if=\"!phone && required?.format_hint\"\n name=\"hint\"\n :country=\"country\"\n :format-hint=\"required.format_hint\"\n :example=\"required.example_e164\"\n >\n <p\n data-slot=\"tell-input-hint\"\n :class=\"cn('text-muted-foreground text-xs tabular-nums', props.hintClass)\"\n >\n {{ required.format_hint }}\n </p>\n </slot>\n </div>\n</template>\n"],"names":["cn","inputs","twMerge","clsx","SIZES","DEFAULT_SIZE","controlHeight","controlPaddingX","controlTextSize","controlHeightPx","props","__props","emits","__emit","slots","useSlots","hasPrefix","computed","hasSuffix","hasAdornment","modelValue","useVModel","sizeHeight","sizePaddingX","sizeText","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","_createElementVNode","$event","forwarded","useForwardPropsEmits","_openBlock","_createBlock","_mergeProps","_withCtx","slotProps","useForwardProps","delegated","reactiveOmit","PopoverPortal","_createVNode","PopoverContent","$attrs","DrawerPortal","ADrawerOverlay","DrawerContent","open","_useModel","isDesktop","useMediaQuery","Root","APopover","ADrawer","_resolveDynamicComponent","Trigger","APopoverTrigger","ADrawerTrigger","mergedClass","APopoverContent","ADrawerContent","STORAGE_KEY","REST_COUNTRIES_URL","EX","examples","isBrowser","toDigits","v","ensurePlusDial","dial","d","normalizeIso2","iso2","dropLeadingZeros","digits","buildFullE164","dialClean","nsn","inferLengthFromExample","national","n","buildDialCode","idd","root","suffix","out","normalizeSearchKey","input","makeFallback","name","dialDigits","FALLBACK_COUNTRIES","usePhoneValidation","countries","ref","isCountriesLoading","byValue","byDialDigits","rebuildIndexes","list","valueMap","dialMap","item","bucket","upsertCountries","normalizeRestCountries","c","flag","search_key","map","prev","prevScore","a","b","getCountries","options","force","cached","parsed","res","data","normalized","searchCountries","keyword","limit","q","getCountryByValue","value","getCountriesByDial","getRequiredInfo","country","example","getExampleNumber","exampleNational","exampleE164","inferred","dial_code","digitsExample","validate","required","raw","min","max","full","isValidPhoneNumber","parsePhoneNumberFromString","e","SESSION_CACHE_KEY","TIMEZONE_TO_ISO2","tryTimezone","tz","tryLocale","m","tryIp","endpoint","timeoutMs","controller","timer","code","readCache","writeCache","detectCountry","opts","strategy","ipEndpoint","defaultCountry","cache","ipResult","final","useCountryDetection","isLoading","run","onMounted","aTellInputVariants","cva","DEFAULT_ERROR_MESSAGES","defaultFlagUrl","width","url","RECENTS_KEY","triggerSizeClasses","selected","internalCountries","defaultSearch","lookupInternal","search","effectiveCountries","customByValue","lookup","recents","loadRecents","pushRecent","next","x","isSearching","defaultSearcher","filtered","matcher","suggested","seen","candidate","iso","r","allCountries","selectedCountry","isAllowed","option","allowed","selectCountry","watch","isOpen","__expose","AResponsivePopover","AResponsivePopoverTrigger","ACountryFlag","_hoisted_2","_toDisplayString","ChevronDown","AResponsivePopoverContent","_hoisted_3","_hoisted_4","Search","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_Fragment","_hoisted_11","_hoisted_12","_renderList","_hoisted_16","_hoisted_17","Check","_hoisted_18","_hoisted_19","_hoisted_23","_hoisted_24","phone","detectOpts","detected","cleaned","validation","effectivePlaceholder","errorMessage","selectedDialCode","inputSizeClasses","validationState","_hoisted_1","ACountrySelect","$slots","_cache","target","_Transition","CheckCircle2","AlertCircle"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,65 @@
1
+ import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
3
+ import { DefineComponent } from 'vue';
4
+ import { HTMLAttributes } from 'vue';
5
+ import { PublicProps } from 'vue';
6
+
7
+ declare const __VLS_component: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
8
+ "update:modelValue": (payload: string | number) => any;
9
+ }, string, PublicProps, Readonly<__VLS_Props> & Readonly<{
10
+ "onUpdate:modelValue"?: ((payload: string | number) => any) | undefined;
11
+ }>, {
12
+ size: Size;
13
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
14
+
15
+ declare type __VLS_Props = {
16
+ defaultValue?: string | number;
17
+ modelValue?: string | number;
18
+ class?: HTMLAttributes['class'];
19
+ /** Classes for the inner &lt;input&gt; element (useful when prefix/suffix are present). */
20
+ inputClass?: HTMLAttributes['class'];
21
+ /** Classes for the prefix wrapper. */
22
+ prefixClass?: HTMLAttributes['class'];
23
+ /** Classes for the suffix wrapper. */
24
+ suffixClass?: HTMLAttributes['class'];
25
+ size?: Size;
26
+ };
27
+
28
+ declare function __VLS_template(): {
29
+ attrs: Partial<{}>;
30
+ slots: Readonly<{
31
+ /** Content rendered inside the input's border, left of the field. */
32
+ prefix?: () => unknown;
33
+ /** Content rendered inside the input's border, right of the field. */
34
+ suffix?: () => unknown;
35
+ }> & {
36
+ /** Content rendered inside the input's border, left of the field. */
37
+ prefix?: () => unknown;
38
+ /** Content rendered inside the input's border, right of the field. */
39
+ suffix?: () => unknown;
40
+ };
41
+ refs: {};
42
+ rootEl: any;
43
+ };
44
+
45
+ declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
46
+
47
+ declare type __VLS_WithTemplateSlots<T, S> = T & {
48
+ new (): {
49
+ $slots: S;
50
+ };
51
+ };
52
+
53
+ export declare const AInput: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
54
+
55
+ /**
56
+ * Shared size scale for every interactive UI component in @alikhalilll/ui.
57
+ *
58
+ * xs = 28px · sm = 36px · md = 43px (default) · lg = 52px · xl = 60px
59
+ *
60
+ * Use the {@link controlHeight}, {@link controlPaddingX}, {@link controlTextSize}
61
+ * maps when building a CVA variant so every component stays in lockstep.
62
+ */
63
+ declare type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
64
+
65
+ export { }
package/dist/input.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import { _ as r } from "./chunks/AInput.vue_vue_type_script_setup_true_lang-BJUP7ePq.mjs";
2
+ export {
3
+ r as AInput
4
+ };
5
+ //# sourceMappingURL=input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,117 @@
1
+ import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
3
+ import { DefineComponent } from 'vue';
4
+ import { FocusOutsideEvent } from 'reka-ui';
5
+ import { HTMLAttributes } from 'vue';
6
+ import { PointerDownOutsideEvent } from 'reka-ui';
7
+ import { PopoverContentProps } from 'reka-ui';
8
+ import { PopoverRootProps } from 'reka-ui';
9
+ import { PopoverTriggerProps } from 'reka-ui';
10
+ import { PublicProps } from 'vue';
11
+
12
+ declare const __VLS_component: DefineComponent<PopoverRootProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
13
+ "update:open": (value: boolean) => any;
14
+ }, string, PublicProps, Readonly<PopoverRootProps> & Readonly<{
15
+ "onUpdate:open"?: ((value: boolean) => any) | undefined;
16
+ }>, {
17
+ modal: boolean;
18
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
19
+
20
+ declare const __VLS_component_2: DefineComponent<PopoverTriggerProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<PopoverTriggerProps> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
21
+
22
+ declare const __VLS_component_3: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
23
+ escapeKeyDown: (event: KeyboardEvent) => any;
24
+ pointerDownOutside: (event: PointerDownOutsideEvent) => any;
25
+ focusOutside: (event: FocusOutsideEvent) => any;
26
+ interactOutside: (event: PointerDownOutsideEvent | FocusOutsideEvent) => any;
27
+ openAutoFocus: (event: Event) => any;
28
+ closeAutoFocus: (event: Event) => any;
29
+ }, string, PublicProps, Readonly<__VLS_Props> & Readonly<{
30
+ onEscapeKeyDown?: ((event: KeyboardEvent) => any) | undefined;
31
+ onPointerDownOutside?: ((event: PointerDownOutsideEvent) => any) | undefined;
32
+ onFocusOutside?: ((event: FocusOutsideEvent) => any) | undefined;
33
+ onInteractOutside?: ((event: PointerDownOutsideEvent | FocusOutsideEvent) => any) | undefined;
34
+ onOpenAutoFocus?: ((event: Event) => any) | undefined;
35
+ onCloseAutoFocus?: ((event: Event) => any) | undefined;
36
+ }>, {
37
+ sideOffset: number;
38
+ align: "start" | "center" | "end";
39
+ overlay: boolean;
40
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
41
+
42
+ declare type __VLS_Props = PopoverContentProps & {
43
+ class?: HTMLAttributes['class'];
44
+ /** Dim the entire viewport behind the popover and block all interaction with the
45
+ * page (clicks are captured by the overlay; body scroll is locked while open).
46
+ * Pair with `<APopover :modal="true">` (the default) for the full modal behaviour. */
47
+ overlay?: boolean;
48
+ overlayClass?: HTMLAttributes['class'];
49
+ };
50
+
51
+ declare type __VLS_Props_2 = {
52
+ class?: HTMLAttributes['class'];
53
+ };
54
+
55
+ declare function __VLS_template(): {
56
+ attrs: Partial<{}>;
57
+ slots: {
58
+ default?(_: {
59
+ open: boolean;
60
+ close: () => void;
61
+ }): any;
62
+ };
63
+ refs: {};
64
+ rootEl: any;
65
+ };
66
+
67
+ declare function __VLS_template_2(): {
68
+ attrs: Partial<{}>;
69
+ slots: {
70
+ default?(_: {}): any;
71
+ };
72
+ refs: {};
73
+ rootEl: any;
74
+ };
75
+
76
+ declare function __VLS_template_3(): {
77
+ attrs: Partial<{}>;
78
+ slots: {
79
+ default?(_: {}): any;
80
+ };
81
+ refs: {};
82
+ rootEl: any;
83
+ };
84
+
85
+ declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
86
+
87
+ declare type __VLS_TemplateResult_2 = ReturnType<typeof __VLS_template_2>;
88
+
89
+ declare type __VLS_TemplateResult_3 = ReturnType<typeof __VLS_template_3>;
90
+
91
+ declare type __VLS_WithTemplateSlots<T, S> = T & {
92
+ new (): {
93
+ $slots: S;
94
+ };
95
+ };
96
+
97
+ declare type __VLS_WithTemplateSlots_2<T, S> = T & {
98
+ new (): {
99
+ $slots: S;
100
+ };
101
+ };
102
+
103
+ declare type __VLS_WithTemplateSlots_3<T, S> = T & {
104
+ new (): {
105
+ $slots: S;
106
+ };
107
+ };
108
+
109
+ export declare const APopover: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
110
+
111
+ export declare const APopoverContent: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
112
+
113
+ export declare const APopoverOverlay: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
114
+
115
+ export declare const APopoverTrigger: __VLS_WithTemplateSlots_2<typeof __VLS_component_2, __VLS_TemplateResult_2["slots"]>;
116
+
117
+ export { }
@@ -0,0 +1,8 @@
1
+ import { _ as e, a, b as p, c as v } from "./chunks/APopoverContent.vue_vue_type_script_setup_true_lang-o1XhV9DM.mjs";
2
+ export {
3
+ e as APopover,
4
+ a as APopoverContent,
5
+ p as APopoverOverlay,
6
+ v as APopoverTrigger
7
+ };
8
+ //# sourceMappingURL=popover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,124 @@
1
+ import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
3
+ import { DefineComponent } from 'vue';
4
+ import { HTMLAttributes } from 'vue';
5
+ import { PublicProps } from 'vue';
6
+
7
+ declare const __VLS_component: DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
8
+ "update:open": (value: boolean) => any;
9
+ }, string, PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
10
+ "onUpdate:open"?: ((value: boolean) => any) | undefined;
11
+ }>, {
12
+ modal: boolean;
13
+ breakpoint: string;
14
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
15
+
16
+ declare const __VLS_component_2: DefineComponent<__VLS_Props_2, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{}>, {
17
+ breakpoint: string;
18
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
19
+
20
+ declare const __VLS_component_3: DefineComponent<__VLS_Props_3, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_3> & Readonly<{}>, {
21
+ sideOffset: number;
22
+ align: "start" | "center" | "end";
23
+ overlay: boolean;
24
+ breakpoint: string;
25
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
26
+
27
+ declare type __VLS_Props = {
28
+ /** CSS media query for the desktop break. Below this width we render a vaul drawer. */
29
+ breakpoint?: string;
30
+ /**
31
+ * When true, the popover (desktop) locks page scroll, traps focus, and renders an overlay.
32
+ * The drawer (mobile) is always modal-like (vaul-vue ships its own overlay + scroll-lock).
33
+ */
34
+ modal?: boolean;
35
+ };
36
+
37
+ declare type __VLS_Props_2 = {
38
+ breakpoint?: string;
39
+ asChild?: boolean;
40
+ };
41
+
42
+ declare type __VLS_Props_3 = {
43
+ breakpoint?: string;
44
+ /** Classes applied on both branches. Avoid width / inset classes here. */
45
+ class?: HTMLAttributes['class'];
46
+ /** Classes applied only when the popover (desktop) branch is rendered. */
47
+ popoverClass?: HTMLAttributes['class'];
48
+ /** Classes applied only when the drawer (mobile) branch is rendered. */
49
+ drawerClass?: HTMLAttributes['class'];
50
+ /**
51
+ * Render the dimmed overlay on the desktop popover branch. Defaults to `false` — popovers
52
+ * on desktop are non-modal-looking by convention. The mobile drawer always has its own
53
+ * overlay (vaul-vue's `DrawerOverlay`) regardless of this prop.
54
+ */
55
+ overlay?: boolean;
56
+ align?: 'start' | 'center' | 'end';
57
+ sideOffset?: number;
58
+ };
59
+
60
+ declare type __VLS_PublicProps = {
61
+ 'open'?: boolean;
62
+ } & __VLS_Props;
63
+
64
+ declare function __VLS_template(): {
65
+ attrs: Partial<{}>;
66
+ slots: {
67
+ default?(_: {
68
+ isDesktop: boolean;
69
+ }): any;
70
+ };
71
+ refs: {};
72
+ rootEl: any;
73
+ };
74
+
75
+ declare function __VLS_template_2(): {
76
+ attrs: Partial<{}>;
77
+ slots: {
78
+ default?(_: {}): any;
79
+ };
80
+ refs: {};
81
+ rootEl: any;
82
+ };
83
+
84
+ declare function __VLS_template_3(): {
85
+ attrs: Partial<{}>;
86
+ slots: {
87
+ default?(_: {}): any;
88
+ default?(_: {}): any;
89
+ };
90
+ refs: {};
91
+ rootEl: any;
92
+ };
93
+
94
+ declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
95
+
96
+ declare type __VLS_TemplateResult_2 = ReturnType<typeof __VLS_template_2>;
97
+
98
+ declare type __VLS_TemplateResult_3 = ReturnType<typeof __VLS_template_3>;
99
+
100
+ declare type __VLS_WithTemplateSlots<T, S> = T & {
101
+ new (): {
102
+ $slots: S;
103
+ };
104
+ };
105
+
106
+ declare type __VLS_WithTemplateSlots_2<T, S> = T & {
107
+ new (): {
108
+ $slots: S;
109
+ };
110
+ };
111
+
112
+ declare type __VLS_WithTemplateSlots_3<T, S> = T & {
113
+ new (): {
114
+ $slots: S;
115
+ };
116
+ };
117
+
118
+ export declare const AResponsivePopover: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
119
+
120
+ export declare const AResponsivePopoverContent: __VLS_WithTemplateSlots_3<typeof __VLS_component_3, __VLS_TemplateResult_3["slots"]>;
121
+
122
+ export declare const AResponsivePopoverTrigger: __VLS_WithTemplateSlots_2<typeof __VLS_component_2, __VLS_TemplateResult_2["slots"]>;
123
+
124
+ export { }
@@ -0,0 +1,7 @@
1
+ import { _ as s, a as p, b as r } from "./chunks/AResponsivePopoverContent.vue_vue_type_script_setup_true_lang-BYEb5UBL.mjs";
2
+ export {
3
+ s as AResponsivePopover,
4
+ p as AResponsivePopoverContent,
5
+ r as AResponsivePopoverTrigger
6
+ };
7
+ //# sourceMappingURL=responsive-popover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsive-popover.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}