UNPKG

compote-ui

Version:

An opinionated UI component library for Svelte, built on top of [Ark UI](https://ark-ui.com) with additional components and features not available in the core Ark UI library.

243 lines (242 loc) 3.71 kB
// E.164 country calling codes (digits only, no leading '+'). Sourced once from // svelte-tel-input's country list — kept as a plain literal so the data-table // subpath never imports svelte-tel-input (and its libphonenumber-js dependency) // at runtime. const CALLING_CODES = new Set([ '1', '7', '20', '27', '30', '31', '32', '33', '34', '36', '39', '40', '41', '43', '44', '45', '46', '47', '48', '49', '51', '52', '53', '54', '55', '56', '57', '58', '60', '61', '62', '63', '64', '65', '66', '81', '82', '84', '86', '90', '91', '92', '93', '94', '95', '98', '211', '212', '213', '216', '218', '220', '221', '222', '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237', '238', '239', '240', '241', '242', '243', '244', '245', '246', '247', '248', '249', '250', '251', '252', '253', '254', '255', '256', '257', '258', '260', '261', '262', '263', '264', '265', '266', '267', '268', '269', '290', '291', '297', '298', '299', '350', '351', '352', '353', '354', '355', '356', '357', '358', '359', '370', '371', '372', '373', '374', '375', '376', '377', '378', '380', '381', '382', '383', '385', '386', '387', '389', '420', '421', '423', '500', '501', '502', '503', '504', '505', '506', '507', '508', '509', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '670', '672', '673', '674', '675', '676', '677', '678', '679', '680', '681', '682', '683', '685', '686', '687', '688', '689', '690', '691', '692', '850', '852', '853', '855', '856', '880', '886', '960', '961', '962', '963', '964', '965', '966', '967', '968', '970', '971', '972', '973', '974', '975', '976', '977', '992', '993', '994', '995', '996', '998' ]); function matchCallingCode(digits) { for (const len of [3, 2, 1]) { const candidate = digits.slice(0, len); if (candidate.length === len && CALLING_CODES.has(candidate)) return candidate; } return undefined; } /** * Generic, country-agnostic readability formatter for E.164-ish phone strings * (e.g. `+381601234567` -> `+381 601234567`). Splits off the country calling * code using a static ITU code table and adds a single space after it; the * subscriber number itself is left ungrouped, since grouping it correctly * requires per-country number-plan knowledge (trunk codes, area codes, etc.) * that doesn't belong in a generic default — apply a `cell` callback for * locale-accurate national formatting. Values that don't start with `+` are * returned unchanged. */ export function formatPhoneCellValue(value) { if (!value.startsWith('+')) return value; const digits = value.slice(1).replace(/\D/g, ''); if (digits === '') return value; const code = matchCallingCode(digits); if (!code) return `+${digits}`; const rest = digits.slice(code.length); return rest ? `+${code} ${rest}` : `+${code}`; }