@dnax/ui 0.0.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 (150) hide show
  1. package/README.md +15 -0
  2. package/components/QAccordion.vue +68 -0
  3. package/components/QAccordionContent.vue +62 -0
  4. package/components/QAccordionItem.vue +24 -0
  5. package/components/QAccordionTrigger.vue +51 -0
  6. package/components/QActionSheet.vue +159 -0
  7. package/components/QApp.vue +8 -0
  8. package/components/QAutocomplete.vue +316 -0
  9. package/components/QAvatar.vue +92 -0
  10. package/components/QBackHeader.vue +69 -0
  11. package/components/QBackTop.vue +125 -0
  12. package/components/QBadge.vue +55 -0
  13. package/components/QBottomSheet.vue +177 -0
  14. package/components/QBottomSheetFooter.vue +9 -0
  15. package/components/QBottomSheetHeader.vue +35 -0
  16. package/components/QBottomSheetProvider.vue +62 -0
  17. package/components/QBottomSheetTrigger.vue +18 -0
  18. package/components/QBtn.vue +144 -0
  19. package/components/QBtnGroup.vue +31 -0
  20. package/components/QBubble.vue +36 -0
  21. package/components/QBubbleContent.vue +28 -0
  22. package/components/QBubbleGroup.vue +25 -0
  23. package/components/QBubbleReactions.vue +40 -0
  24. package/components/QCard.vue +63 -0
  25. package/components/QCardActions.vue +27 -0
  26. package/components/QCardContent.vue +29 -0
  27. package/components/QCarousel.vue +115 -0
  28. package/components/QCarouselContent.vue +23 -0
  29. package/components/QCarouselItem.vue +20 -0
  30. package/components/QCarouselNav.vue +51 -0
  31. package/components/QCheckbox.vue +146 -0
  32. package/components/QChip.vue +91 -0
  33. package/components/QCircularProgress.vue +122 -0
  34. package/components/QCol.vue +52 -0
  35. package/components/QCollapse.vue +141 -0
  36. package/components/QConfigProvider.vue +164 -0
  37. package/components/QContainer.vue +201 -0
  38. package/components/QCountDown.vue +164 -0
  39. package/components/QCountryPicker.vue +593 -0
  40. package/components/QDataGrid.vue +491 -0
  41. package/components/QDatePicker.vue +250 -0
  42. package/components/QDialog.vue +163 -0
  43. package/components/QDialogFooter.vue +9 -0
  44. package/components/QDialogHeader.vue +41 -0
  45. package/components/QDialogProvider.vue +65 -0
  46. package/components/QDialogTrigger.vue +18 -0
  47. package/components/QFab.vue +80 -0
  48. package/components/QFabAction.vue +48 -0
  49. package/components/QFilePicker.vue +294 -0
  50. package/components/QFooter.vue +72 -0
  51. package/components/QGallery.vue +280 -0
  52. package/components/QGrid.vue +54 -0
  53. package/components/QHeader.vue +38 -0
  54. package/components/QIcon.vue +53 -0
  55. package/components/QImagePicker.vue +248 -0
  56. package/components/QImagePreview.vue +225 -0
  57. package/components/QImagePreviewProvider.vue +35 -0
  58. package/components/QImg.vue +142 -0
  59. package/components/QInfiniteScroll.vue +109 -0
  60. package/components/QInnerLoading.vue +67 -0
  61. package/components/QInput.vue +289 -0
  62. package/components/QInputOtp.vue +238 -0
  63. package/components/QInputPassword.vue +67 -0
  64. package/components/QInputTag.vue +281 -0
  65. package/components/QIntersection.vue +119 -0
  66. package/components/QItem.vue +60 -0
  67. package/components/QItemSection.vue +47 -0
  68. package/components/QLinearProgress.vue +94 -0
  69. package/components/QList.vue +39 -0
  70. package/components/QLoading.vue +77 -0
  71. package/components/QLoadingProvider.vue +41 -0
  72. package/components/QMarquee.vue +56 -0
  73. package/components/QMessageScroller.vue +10 -0
  74. package/components/QMessageScrollerButton.vue +48 -0
  75. package/components/QMessageScrollerContent.vue +31 -0
  76. package/components/QMessageScrollerItem.vue +49 -0
  77. package/components/QMessageScrollerProvider.vue +198 -0
  78. package/components/QMessageScrollerViewport.vue +109 -0
  79. package/components/QNavMenu.vue +75 -0
  80. package/components/QNavMenuContent.vue +10 -0
  81. package/components/QNavMenuItem.vue +60 -0
  82. package/components/QNavMenuTrigger.vue +96 -0
  83. package/components/QNotifyProvider.vue +33 -0
  84. package/components/QNotifyToast.vue +60 -0
  85. package/components/QPage.vue +56 -0
  86. package/components/QPagination.vue +195 -0
  87. package/components/QParallax.vue +124 -0
  88. package/components/QPullToRefresh.vue +138 -0
  89. package/components/QRadio.vue +99 -0
  90. package/components/QRating.vue +105 -0
  91. package/components/QReorder.vue +191 -0
  92. package/components/QRollingText.vue +225 -0
  93. package/components/QRow.vue +23 -0
  94. package/components/QSafeArea.vue +39 -0
  95. package/components/QScrollArea.vue +118 -0
  96. package/components/QSelect.vue +698 -0
  97. package/components/QSeparator.vue +39 -0
  98. package/components/QSidebar.vue +153 -0
  99. package/components/QSidebarContent.vue +14 -0
  100. package/components/QSidebarFooter.vue +14 -0
  101. package/components/QSidebarHeader.vue +14 -0
  102. package/components/QSidebarMenu.vue +9 -0
  103. package/components/QSidebarMenuButton.vue +59 -0
  104. package/components/QSidebarMenuItem.vue +9 -0
  105. package/components/QSidebarTrigger.vue +32 -0
  106. package/components/QSkeleton.vue +95 -0
  107. package/components/QSlider.vue +205 -0
  108. package/components/QSpace.vue +10 -0
  109. package/components/QSpinner.vue +172 -0
  110. package/components/QSplitter.vue +145 -0
  111. package/components/QSticky.vue +181 -0
  112. package/components/QSwipeCell.vue +217 -0
  113. package/components/QSwiper.vue +102 -0
  114. package/components/QSwiperSlide.vue +19 -0
  115. package/components/QSyntax.vue +171 -0
  116. package/components/QTab.vue +175 -0
  117. package/components/QTabPanel.vue +50 -0
  118. package/components/QTabPanels.vue +106 -0
  119. package/components/QTable.vue +575 -0
  120. package/components/QTabs.vue +188 -0
  121. package/components/QText.vue +316 -0
  122. package/components/QTextCaption.vue +122 -0
  123. package/components/QToolbar.vue +28 -0
  124. package/components/QTooltip.vue +313 -0
  125. package/components/QUploader.vue +473 -0
  126. package/components/QVideo.vue +289 -0
  127. package/components/QVirtualScroll.vue +190 -0
  128. package/components/internal/QDateCalendar.vue +153 -0
  129. package/index.ts +151 -0
  130. package/lib/breakpoints.ts +44 -0
  131. package/lib/colors.ts +24 -0
  132. package/lib/config.ts +34 -0
  133. package/lib/countries.ts +261 -0
  134. package/lib/formula.ts +630 -0
  135. package/lib/icons.ts +38 -0
  136. package/lib/loading.ts +75 -0
  137. package/lib/overlayBack.ts +124 -0
  138. package/lib/platform.ts +146 -0
  139. package/lib/primitive.ts +25 -0
  140. package/lib/q.ts +287 -0
  141. package/lib/screen.ts +105 -0
  142. package/lib/search.ts +35 -0
  143. package/lib/themeVars.ts +22 -0
  144. package/lib/useComponentProps.ts +54 -0
  145. package/lib/utils.ts +7 -0
  146. package/module.ts +89 -0
  147. package/package.json +41 -0
  148. package/scripts/generate-exports.ts +56 -0
  149. package/styles/main.css +7627 -0
  150. package/tsconfig.json +33 -0
package/index.ts ADDED
@@ -0,0 +1,151 @@
1
+ export { default as QAccordion } from "./components/QAccordion.vue"
2
+ export { default as QAccordionContent } from "./components/QAccordionContent.vue"
3
+ export { default as QAccordionItem } from "./components/QAccordionItem.vue"
4
+ export { default as QAccordionTrigger } from "./components/QAccordionTrigger.vue"
5
+ export { default as QActionSheet } from "./components/QActionSheet.vue"
6
+ export { default as QApp } from "./components/QApp.vue"
7
+ export { default as QAutocomplete } from "./components/QAutocomplete.vue"
8
+ export { default as QAvatar } from "./components/QAvatar.vue"
9
+ export { default as QBackHeader } from "./components/QBackHeader.vue"
10
+ export { default as QBackTop } from "./components/QBackTop.vue"
11
+ export { default as QBadge } from "./components/QBadge.vue"
12
+ export { default as QBottomSheet } from "./components/QBottomSheet.vue"
13
+ export { default as QBottomSheetFooter } from "./components/QBottomSheetFooter.vue"
14
+ export { default as QBottomSheetHeader } from "./components/QBottomSheetHeader.vue"
15
+ export { default as QBottomSheetProvider } from "./components/QBottomSheetProvider.vue"
16
+ export { default as QBottomSheetTrigger } from "./components/QBottomSheetTrigger.vue"
17
+ export { default as QBtn } from "./components/QBtn.vue"
18
+ export { default as QBtnGroup } from "./components/QBtnGroup.vue"
19
+ export { default as QBubble } from "./components/QBubble.vue"
20
+ export { default as QBubbleContent } from "./components/QBubbleContent.vue"
21
+ export { default as QBubbleGroup } from "./components/QBubbleGroup.vue"
22
+ export { default as QBubbleReactions } from "./components/QBubbleReactions.vue"
23
+ export { default as QCard } from "./components/QCard.vue"
24
+ export { default as QCardActions } from "./components/QCardActions.vue"
25
+ export { default as QCardContent } from "./components/QCardContent.vue"
26
+ export { default as QCarousel } from "./components/QCarousel.vue"
27
+ export { default as QCarouselContent } from "./components/QCarouselContent.vue"
28
+ export { default as QCarouselItem } from "./components/QCarouselItem.vue"
29
+ export { default as QCarouselNav } from "./components/QCarouselNav.vue"
30
+ export { default as QCheckbox } from "./components/QCheckbox.vue"
31
+ export { default as QChip } from "./components/QChip.vue"
32
+ export { default as QCircularProgress } from "./components/QCircularProgress.vue"
33
+ export { default as QCol } from "./components/QCol.vue"
34
+ export { default as QCollapse } from "./components/QCollapse.vue"
35
+ export { default as QConfigProvider } from "./components/QConfigProvider.vue"
36
+ export { default as QContainer } from "./components/QContainer.vue"
37
+ export { default as QCountDown } from "./components/QCountDown.vue"
38
+ export { default as QCountryPicker } from "./components/QCountryPicker.vue"
39
+ export { default as QDataGrid } from "./components/QDataGrid.vue"
40
+ export { default as QDatePicker } from "./components/QDatePicker.vue"
41
+ export { default as QDialog } from "./components/QDialog.vue"
42
+ export { default as QDialogFooter } from "./components/QDialogFooter.vue"
43
+ export { default as QDialogHeader } from "./components/QDialogHeader.vue"
44
+ export { default as QDialogProvider } from "./components/QDialogProvider.vue"
45
+ export { default as QDialogTrigger } from "./components/QDialogTrigger.vue"
46
+ export { default as QFab } from "./components/QFab.vue"
47
+ export { default as QFabAction } from "./components/QFabAction.vue"
48
+ export { default as QFilePicker } from "./components/QFilePicker.vue"
49
+ export { default as QFooter } from "./components/QFooter.vue"
50
+ export { default as QGallery } from "./components/QGallery.vue"
51
+ export { default as QGrid } from "./components/QGrid.vue"
52
+ export { default as QHeader } from "./components/QHeader.vue"
53
+ export { default as QIcon } from "./components/QIcon.vue"
54
+ export { default as QImagePicker } from "./components/QImagePicker.vue"
55
+ export { default as QImagePreview } from "./components/QImagePreview.vue"
56
+ export { default as QImagePreviewProvider } from "./components/QImagePreviewProvider.vue"
57
+ export { default as QImg } from "./components/QImg.vue"
58
+ export { default as QInfiniteScroll } from "./components/QInfiniteScroll.vue"
59
+ export { default as QInnerLoading } from "./components/QInnerLoading.vue"
60
+ export { default as QInput } from "./components/QInput.vue"
61
+ export { default as QInputOtp } from "./components/QInputOtp.vue"
62
+ export { default as QInputPassword } from "./components/QInputPassword.vue"
63
+ export { default as QInputTag } from "./components/QInputTag.vue"
64
+ export { default as QIntersection } from "./components/QIntersection.vue"
65
+ export { default as QItem } from "./components/QItem.vue"
66
+ export { default as QItemSection } from "./components/QItemSection.vue"
67
+ export { default as QLinearProgress } from "./components/QLinearProgress.vue"
68
+ export { default as QList } from "./components/QList.vue"
69
+ export { default as QLoading } from "./components/QLoading.vue"
70
+ export { default as QLoadingProvider } from "./components/QLoadingProvider.vue"
71
+ export { default as QMarquee } from "./components/QMarquee.vue"
72
+ export { default as QMessageScroller } from "./components/QMessageScroller.vue"
73
+ export { default as QMessageScrollerButton } from "./components/QMessageScrollerButton.vue"
74
+ export { default as QMessageScrollerContent } from "./components/QMessageScrollerContent.vue"
75
+ export { default as QMessageScrollerItem } from "./components/QMessageScrollerItem.vue"
76
+ export { default as QMessageScrollerProvider } from "./components/QMessageScrollerProvider.vue"
77
+ export { default as QMessageScrollerViewport } from "./components/QMessageScrollerViewport.vue"
78
+ export { default as QNavMenu } from "./components/QNavMenu.vue"
79
+ export { default as QNavMenuContent } from "./components/QNavMenuContent.vue"
80
+ export { default as QNavMenuItem } from "./components/QNavMenuItem.vue"
81
+ export { default as QNavMenuTrigger } from "./components/QNavMenuTrigger.vue"
82
+ export { default as QNotifyProvider } from "./components/QNotifyProvider.vue"
83
+ export { default as QNotifyToast } from "./components/QNotifyToast.vue"
84
+ export { default as QPage } from "./components/QPage.vue"
85
+ export { default as QPagination } from "./components/QPagination.vue"
86
+ export { default as QParallax } from "./components/QParallax.vue"
87
+ export { default as QPullToRefresh } from "./components/QPullToRefresh.vue"
88
+ export { default as QRadio } from "./components/QRadio.vue"
89
+ export { default as QRating } from "./components/QRating.vue"
90
+ export { default as QReorder } from "./components/QReorder.vue"
91
+ export { default as QRollingText } from "./components/QRollingText.vue"
92
+ export { default as QRow } from "./components/QRow.vue"
93
+ export { default as QSafeArea } from "./components/QSafeArea.vue"
94
+ export { default as QScrollArea } from "./components/QScrollArea.vue"
95
+ export { default as QSelect } from "./components/QSelect.vue"
96
+ export { default as QSeparator } from "./components/QSeparator.vue"
97
+ export { default as QSidebar } from "./components/QSidebar.vue"
98
+ export { default as QSidebarContent } from "./components/QSidebarContent.vue"
99
+ export { default as QSidebarFooter } from "./components/QSidebarFooter.vue"
100
+ export { default as QSidebarHeader } from "./components/QSidebarHeader.vue"
101
+ export { default as QSidebarMenu } from "./components/QSidebarMenu.vue"
102
+ export { default as QSidebarMenuButton } from "./components/QSidebarMenuButton.vue"
103
+ export { default as QSidebarMenuItem } from "./components/QSidebarMenuItem.vue"
104
+ export { default as QSidebarTrigger } from "./components/QSidebarTrigger.vue"
105
+ export { default as QSkeleton } from "./components/QSkeleton.vue"
106
+ export { default as QSlider } from "./components/QSlider.vue"
107
+ export { default as QSpace } from "./components/QSpace.vue"
108
+ export { default as QSpinner } from "./components/QSpinner.vue"
109
+ export { default as QSplitter } from "./components/QSplitter.vue"
110
+ export { default as QSticky } from "./components/QSticky.vue"
111
+ export { default as QSwipeCell } from "./components/QSwipeCell.vue"
112
+ export { default as QSwiper } from "./components/QSwiper.vue"
113
+ export { default as QSwiperSlide } from "./components/QSwiperSlide.vue"
114
+ export { default as QSyntax } from "./components/QSyntax.vue"
115
+ export { default as QTab } from "./components/QTab.vue"
116
+ export { default as QTabPanel } from "./components/QTabPanel.vue"
117
+ export { default as QTabPanels } from "./components/QTabPanels.vue"
118
+ export { default as QTable } from "./components/QTable.vue"
119
+ export { default as QTabs } from "./components/QTabs.vue"
120
+ export { default as QText } from "./components/QText.vue"
121
+ export { default as QTextCaption } from "./components/QTextCaption.vue"
122
+ export { default as QToolbar } from "./components/QToolbar.vue"
123
+ export { default as QTooltip } from "./components/QTooltip.vue"
124
+ export { default as QUploader } from "./components/QUploader.vue"
125
+ export { default as QVideo } from "./components/QVideo.vue"
126
+ export { default as QVirtualScroll } from "./components/QVirtualScroll.vue"
127
+
128
+ export { $q, usePlugin, useQ, QPlugin, dialogStack, closeDialog, bottomSheetStack, closeBottomSheet } from "./lib/q"
129
+ export type {
130
+ DialogOptions,
131
+ DialogController,
132
+ BottomSheetOptions,
133
+ BottomSheetController,
134
+ NotifyOptions,
135
+ NotifyController,
136
+ } from "./lib/q"
137
+ export { platform, qBreakpoints } from "./lib/platform"
138
+ export type { QPlatform } from "./lib/platform"
139
+ export { screen } from "./lib/screen"
140
+ export type { QScreen } from "./lib/screen"
141
+ export { loading } from "./lib/loading"
142
+ export type { LoadingOptions, QLoadingPlugin } from "./lib/loading"
143
+ export {
144
+ registerOverlay,
145
+ unregisterOverlay,
146
+ hasOpenOverlays,
147
+ closeTopmostOverlay,
148
+ useOverlayBack,
149
+ installOverlayBackHandler,
150
+ } from "./lib/overlayBack"
151
+ export type { OverlayHandle } from "./lib/overlayBack"
@@ -0,0 +1,44 @@
1
+ // Grid breakpoints — configurables via les CSS vars --q-grid-bp-* (:root par défaut).
2
+ // Lues au runtime et converties en matchMedia (pas de var() dans @media → compatible lightningcss).
3
+ import { onBeforeUnmount, ref } from "vue"
4
+ import type { Ref } from "vue"
5
+
6
+ const DEFAULTS: Record<string, number> = { sm: 600, md: 1024, lg: 1440, xl: 1920 }
7
+
8
+ const readBreakpoint = (name: string): number => {
9
+ if (typeof window === "undefined" || typeof getComputedStyle === "undefined")
10
+ return DEFAULTS[name] ?? 0
11
+ const v = getComputedStyle(document.documentElement)
12
+ .getPropertyValue(`--q-grid-bp-${name}`)
13
+ .trim()
14
+ const n = parseFloat(v)
15
+ return Number.isFinite(n) ? n : (DEFAULTS[name] ?? 0)
16
+ }
17
+
18
+ export interface QBreakpointState {
19
+ sm: boolean
20
+ md: boolean
21
+ lg: boolean
22
+ xl: boolean
23
+ }
24
+
25
+ /** Breakpoints actifs (matchMedia) — valeurs lues des CSS vars --q-grid-bp-* */
26
+ export function useGridBreakpoints(): Ref<QBreakpointState> {
27
+ const state = ref<QBreakpointState>({ sm: false, md: false, lg: false, xl: false })
28
+ const handlers: [MediaQueryList, () => void][] = []
29
+ if (typeof window !== "undefined" && typeof matchMedia !== "undefined") {
30
+ for (const name of ["sm", "md", "lg", "xl"] as const) {
31
+ const mq = window.matchMedia(`(min-width: ${readBreakpoint(name)}px)`)
32
+ const apply = () => {
33
+ state.value = { ...state.value, [name]: mq.matches }
34
+ }
35
+ mq.addEventListener("change", apply)
36
+ apply()
37
+ handlers.push([mq, apply])
38
+ }
39
+ }
40
+ onBeforeUnmount(() => {
41
+ for (const [mq, apply] of handlers) mq.removeEventListener("change", apply)
42
+ })
43
+ return state
44
+ }
package/lib/colors.ts ADDED
@@ -0,0 +1,24 @@
1
+ /** Tokens de couleur du design system (définis en :root dans styles/main.css) */
2
+ export const TOKEN_COLORS = ["primary", "secondary", "accent", "dark", "positive", "negative", "info", "warning"] as const
3
+
4
+ export const isTokenColor = (c?: string): c is string =>
5
+ !!c && (TOKEN_COLORS as readonly string[]).includes(c)
6
+
7
+ /** Token → var(--token), sinon valeur directe (hex, rgb(), nom CSS) */
8
+ export const colorValue = (c: string): string => (isTokenColor(c) ? `var(--${c})` : c)
9
+
10
+ /** Couleur de texte lisible (blanc ou sombre) pour un fond donné */
11
+ export const contrastText = (bg: string): string => {
12
+ let hex = bg.trim().replace(/^#/, "")
13
+ if (hex.length === 3) hex = hex.split("").map((c) => c + c).join("")
14
+ if (!/^[0-9a-f]{6}$/i.test(hex)) return "#ffffff"
15
+ const r = parseInt(hex.slice(0, 2), 16)
16
+ const g = parseInt(hex.slice(2, 4), 16)
17
+ const b = parseInt(hex.slice(4, 6), 16)
18
+ const luminance = 0.299 * r + 0.587 * g + 0.114 * b
19
+ return luminance > 150 ? "#1d1d1d" : "#ffffff"
20
+ }
21
+
22
+ /** Foreground associé : var(--token-foreground) pour un token, contraste calculé pour une couleur libre */
23
+ export const foregroundFor = (color: string): string =>
24
+ isTokenColor(color) ? `var(--${color}-foreground)` : contrastText(color)
package/lib/config.ts ADDED
@@ -0,0 +1,34 @@
1
+ import type { InjectionKey, Ref } from "vue"
2
+
3
+ /** Mode clair/sombre du thème */
4
+ export type ThemeMode = "light" | "dark" | "system"
5
+
6
+ export interface QThemeColors {
7
+ primary?: string
8
+ secondary?: string
9
+ accent?: string
10
+ dark?: string
11
+ positive?: string
12
+ negative?: string
13
+ info?: string
14
+ warning?: string
15
+ }
16
+
17
+ export interface QTheme {
18
+ /** Mode clair/sombre : light | dark | system (défaut : system = préférence OS) */
19
+ mode?: ThemeMode
20
+ colors?: QThemeColors
21
+ /** Props par défaut par composant (clé = nom du composant, ex. "QBtn") */
22
+ componentProps?: Record<string, Record<string, unknown>>
23
+ }
24
+
25
+ export interface QConfigContext {
26
+ theme: Ref<QTheme>
27
+ /** true si le mode effectif est sombre (résout "system") */
28
+ isDark: Readonly<Ref<boolean>>
29
+ }
30
+
31
+ export const qConfigKey: InjectionKey<QConfigContext> = Symbol("q-config")
32
+
33
+ /** True si les providers intégrés (dialog stack, notify) sont déjà rendus par un QConfigProvider ancêtre. */
34
+ export const qProvidersKey: InjectionKey<boolean> = Symbol("q-providers")
@@ -0,0 +1,261 @@
1
+ // Données pays pour QCountryPicker : liste ISO 3166-1 alpha-2 avec indicatif
2
+ // téléphonique et nom en anglais (name) + français (nameFr).
3
+ export interface Country {
4
+ /** Code ISO 3166-1 alpha-2 (ex. "FR") */
5
+ code: string
6
+ /** Nom anglais */
7
+ name: string
8
+ /** Nom français (fallback : name) */
9
+ nameFr?: string
10
+ /** Indicatif téléphonique international (ex. "+33") */
11
+ dial: string
12
+ }
13
+
14
+ /** Drapeau emoji d'un code pays ISO (🇫🇷…) — aucun asset requis */
15
+ export const flagOf = (code: string): string =>
16
+ code
17
+ .toUpperCase()
18
+ .replace(/./g, (c) => String.fromCodePoint(127397 + c.charCodeAt(0)))
19
+
20
+ export const COUNTRIES: Country[] = [
21
+ { code: "AF", name: "Afghanistan", nameFr: "Afghanistan", dial: "+93" },
22
+ { code: "AL", name: "Albania", nameFr: "Albanie", dial: "+355" },
23
+ { code: "DZ", name: "Algeria", nameFr: "Algérie", dial: "+213" },
24
+ { code: "AS", name: "American Samoa", nameFr: "Samoa américaines", dial: "+1-684" },
25
+ { code: "AD", name: "Andorra", nameFr: "Andorre", dial: "+376" },
26
+ { code: "AO", name: "Angola", nameFr: "Angola", dial: "+244" },
27
+ { code: "AI", name: "Anguilla", nameFr: "Anguilla", dial: "+1-264" },
28
+ { code: "AQ", name: "Antarctica", nameFr: "Antarctique", dial: "+672" },
29
+ { code: "AG", name: "Antigua and Barbuda", nameFr: "Antigua-et-Barbuda", dial: "+1-268" },
30
+ { code: "AR", name: "Argentina", nameFr: "Argentine", dial: "+54" },
31
+ { code: "AM", name: "Armenia", nameFr: "Arménie", dial: "+374" },
32
+ { code: "AW", name: "Aruba", nameFr: "Aruba", dial: "+297" },
33
+ { code: "AU", name: "Australia", nameFr: "Australie", dial: "+61" },
34
+ { code: "AT", name: "Austria", nameFr: "Autriche", dial: "+43" },
35
+ { code: "AZ", name: "Azerbaijan", nameFr: "Azerbaïdjan", dial: "+994" },
36
+ { code: "BS", name: "Bahamas", nameFr: "Bahamas", dial: "+1-242" },
37
+ { code: "BH", name: "Bahrain", nameFr: "Bahreïn", dial: "+973" },
38
+ { code: "BD", name: "Bangladesh", nameFr: "Bangladesh", dial: "+880" },
39
+ { code: "BB", name: "Barbados", nameFr: "Barbade", dial: "+1-246" },
40
+ { code: "BY", name: "Belarus", nameFr: "Biélorussie", dial: "+375" },
41
+ { code: "BE", name: "Belgium", nameFr: "Belgique", dial: "+32" },
42
+ { code: "BZ", name: "Belize", nameFr: "Belize", dial: "+501" },
43
+ { code: "BJ", name: "Benin", nameFr: "Bénin", dial: "+229" },
44
+ { code: "BM", name: "Bermuda", nameFr: "Bermudes", dial: "+1-441" },
45
+ { code: "BT", name: "Bhutan", nameFr: "Bhoutan", dial: "+975" },
46
+ { code: "BO", name: "Bolivia", nameFr: "Bolivie", dial: "+591" },
47
+ { code: "BA", name: "Bosnia and Herzegovina", nameFr: "Bosnie-Herzégovine", dial: "+387" },
48
+ { code: "BW", name: "Botswana", nameFr: "Botswana", dial: "+267" },
49
+ { code: "BV", name: "Bouvet Island", nameFr: "Île Bouvet", dial: "+47" },
50
+ { code: "BR", name: "Brazil", nameFr: "Brésil", dial: "+55" },
51
+ { code: "IO", name: "British Indian Ocean Territory", nameFr: "Territoire britannique de l'océan Indien", dial: "+246" },
52
+ { code: "BN", name: "Brunei Darussalam", nameFr: "Brunei Darussalam", dial: "+673" },
53
+ { code: "BG", name: "Bulgaria", nameFr: "Bulgarie", dial: "+359" },
54
+ { code: "BF", name: "Burkina Faso", nameFr: "Burkina Faso", dial: "+226" },
55
+ { code: "BI", name: "Burundi", nameFr: "Burundi", dial: "+257" },
56
+ { code: "KH", name: "Cambodia", nameFr: "Cambodge", dial: "+855" },
57
+ { code: "CM", name: "Cameroon", nameFr: "Cameroun", dial: "+237" },
58
+ { code: "CA", name: "Canada", nameFr: "Canada", dial: "+1" },
59
+ { code: "CV", name: "Cape Verde", nameFr: "Cap-Vert", dial: "+238" },
60
+ { code: "KY", name: "Cayman Islands", nameFr: "Îles Caïmans", dial: "+1-345" },
61
+ { code: "CF", name: "Central African Republic", nameFr: "République centrafricaine", dial: "+236" },
62
+ { code: "TD", name: "Chad", nameFr: "Tchad", dial: "+235" },
63
+ { code: "CL", name: "Chile", nameFr: "Chili", dial: "+56" },
64
+ { code: "CN", name: "China", nameFr: "Chine", dial: "+86" },
65
+ { code: "CX", name: "Christmas Island", nameFr: "Île Christmas", dial: "+61" },
66
+ { code: "CC", name: "Cocos (Keeling) Islands", nameFr: "Îles Cocos (Keeling)", dial: "+61" },
67
+ { code: "CO", name: "Colombia", nameFr: "Colombie", dial: "+57" },
68
+ { code: "KM", name: "Comoros", nameFr: "Comores", dial: "+269" },
69
+ { code: "CG", name: "Congo", nameFr: "Congo", dial: "+242" },
70
+ { code: "CD", name: "Congo, the Democratic Republic of the", nameFr: "Congo (République démocratique du)", dial: "+243" },
71
+ { code: "CK", name: "Cook Islands", nameFr: "Îles Cook", dial: "+682" },
72
+ { code: "CR", name: "Costa Rica", nameFr: "Costa Rica", dial: "+506" },
73
+ { code: "CI", name: "Côte d'Ivoire", nameFr: "Côte d'Ivoire", dial: "+225" },
74
+ { code: "HR", name: "Croatia", nameFr: "Croatie", dial: "+385" },
75
+ { code: "CU", name: "Cuba", nameFr: "Cuba", dial: "+53" },
76
+ { code: "CY", name: "Cyprus", nameFr: "Chypre", dial: "+357" },
77
+ { code: "CZ", name: "Czech Republic", nameFr: "République tchèque", dial: "+420" },
78
+ { code: "DK", name: "Denmark", nameFr: "Danemark", dial: "+45" },
79
+ { code: "DJ", name: "Djibouti", nameFr: "Djibouti", dial: "+253" },
80
+ { code: "DM", name: "Dominica", nameFr: "Dominique", dial: "+1-767" },
81
+ { code: "DO", name: "Dominican Republic", nameFr: "République dominicaine", dial: "+1-809" },
82
+ { code: "EC", name: "Ecuador", nameFr: "Équateur", dial: "+593" },
83
+ { code: "EG", name: "Egypt", nameFr: "Égypte", dial: "+20" },
84
+ { code: "SV", name: "El Salvador", nameFr: "Salvador", dial: "+503" },
85
+ { code: "GQ", name: "Equatorial Guinea", nameFr: "Guinée équatoriale", dial: "+240" },
86
+ { code: "ER", name: "Eritrea", nameFr: "Érythrée", dial: "+291" },
87
+ { code: "EE", name: "Estonia", nameFr: "Estonie", dial: "+372" },
88
+ { code: "ET", name: "Ethiopia", nameFr: "Éthiopie", dial: "+251" },
89
+ { code: "FK", name: "Falkland Islands (Malvinas)", nameFr: "Îles Malouines (Falkland)", dial: "+500" },
90
+ { code: "FO", name: "Faroe Islands", nameFr: "Îles Féroé", dial: "+298" },
91
+ { code: "FJ", name: "Fiji", nameFr: "Fidji", dial: "+679" },
92
+ { code: "FI", name: "Finland", nameFr: "Finlande", dial: "+358" },
93
+ { code: "FR", name: "France", nameFr: "France", dial: "+33" },
94
+ { code: "GF", name: "French Guiana", nameFr: "Guyane française", dial: "+594" },
95
+ { code: "PF", name: "French Polynesia", nameFr: "Polynésie française", dial: "+689" },
96
+ { code: "TF", name: "French Southern Territories", nameFr: "Terres australes françaises", dial: "+262" },
97
+ { code: "GA", name: "Gabon", nameFr: "Gabon", dial: "+241" },
98
+ { code: "GM", name: "Gambia", nameFr: "Gambie", dial: "+220" },
99
+ { code: "GE", name: "Georgia", nameFr: "Géorgie", dial: "+995" },
100
+ { code: "DE", name: "Germany", nameFr: "Allemagne", dial: "+49" },
101
+ { code: "GH", name: "Ghana", nameFr: "Ghana", dial: "+233" },
102
+ { code: "GI", name: "Gibraltar", nameFr: "Gibraltar", dial: "+350" },
103
+ { code: "GR", name: "Greece", nameFr: "Grèce", dial: "+30" },
104
+ { code: "GL", name: "Greenland", nameFr: "Groenland", dial: "+299" },
105
+ { code: "GD", name: "Grenada", nameFr: "Grenade", dial: "+1-473" },
106
+ { code: "GP", name: "Guadeloupe", nameFr: "Guadeloupe", dial: "+590" },
107
+ { code: "GU", name: "Guam", nameFr: "Guam", dial: "+1-671" },
108
+ { code: "GT", name: "Guatemala", nameFr: "Guatemala", dial: "+502" },
109
+ { code: "GN", name: "Guinea", nameFr: "Guinée", dial: "+224" },
110
+ { code: "GW", name: "Guinea-Bissau", nameFr: "Guinée-Bissau", dial: "+245" },
111
+ { code: "GY", name: "Guyana", nameFr: "Guyana", dial: "+592" },
112
+ { code: "HT", name: "Haiti", nameFr: "Haïti", dial: "+509" },
113
+ { code: "HM", name: "Heard Island and McDonald Islands", nameFr: "Îles Heard-et-MacDonald", dial: "+672" },
114
+ { code: "VA", name: "Holy See (Vatican City State)", nameFr: "Saint-Siège (État de la Cité du Vatican)", dial: "+379" },
115
+ { code: "HN", name: "Honduras", nameFr: "Honduras", dial: "+504" },
116
+ { code: "HK", name: "Hong Kong", nameFr: "Hong Kong", dial: "+852" },
117
+ { code: "HU", name: "Hungary", nameFr: "Hongrie", dial: "+36" },
118
+ { code: "IS", name: "Iceland", nameFr: "Islande", dial: "+354" },
119
+ { code: "IN", name: "India", nameFr: "Inde", dial: "+91" },
120
+ { code: "ID", name: "Indonesia", nameFr: "Indonésie", dial: "+62" },
121
+ { code: "IR", name: "Iran, Islamic Republic of", nameFr: "Iran (République islamique d')", dial: "+98" },
122
+ { code: "IQ", name: "Iraq", nameFr: "Irak", dial: "+964" },
123
+ { code: "IE", name: "Ireland", nameFr: "Irlande", dial: "+353" },
124
+ { code: "IL", name: "Israel", nameFr: "Israël", dial: "+972" },
125
+ { code: "IT", name: "Italy", nameFr: "Italie", dial: "+39" },
126
+ { code: "JM", name: "Jamaica", nameFr: "Jamaïque", dial: "+1-876" },
127
+ { code: "JP", name: "Japan", nameFr: "Japon", dial: "+81" },
128
+ { code: "JO", name: "Jordan", nameFr: "Jordanie", dial: "+962" },
129
+ { code: "KZ", name: "Kazakhstan", nameFr: "Kazakhstan", dial: "+7" },
130
+ { code: "KE", name: "Kenya", nameFr: "Kenya", dial: "+254" },
131
+ { code: "KI", name: "Kiribati", nameFr: "Kiribati", dial: "+686" },
132
+ { code: "KP", name: "Korea, Democratic People's Republic of", nameFr: "Corée (République populaire démocratique de)", dial: "+850" },
133
+ { code: "KR", name: "Korea, Republic of", nameFr: "Corée (République de)", dial: "+82" },
134
+ { code: "KW", name: "Kuwait", nameFr: "Koweït", dial: "+965" },
135
+ { code: "KG", name: "Kyrgyzstan", nameFr: "Kirghizistan", dial: "+996" },
136
+ { code: "LA", name: "Lao People's Democratic Republic", nameFr: "Laos (République démocratique populaire)", dial: "+856" },
137
+ { code: "LV", name: "Latvia", nameFr: "Lettonie", dial: "+371" },
138
+ { code: "LB", name: "Lebanon", nameFr: "Liban", dial: "+961" },
139
+ { code: "LS", name: "Lesotho", nameFr: "Lesotho", dial: "+266" },
140
+ { code: "LR", name: "Liberia", nameFr: "Libéria", dial: "+231" },
141
+ { code: "LY", name: "Libyan Arab Jamahiriya", nameFr: "Jamahiriya arabe libyenne", dial: "+218" },
142
+ { code: "LI", name: "Liechtenstein", nameFr: "Liechtenstein", dial: "+423" },
143
+ { code: "LT", name: "Lithuania", nameFr: "Lituanie", dial: "+370" },
144
+ { code: "LU", name: "Luxembourg", nameFr: "Luxembourg", dial: "+352" },
145
+ { code: "MO", name: "Macao", nameFr: "Macao", dial: "+853" },
146
+ { code: "MK", name: "Macedonia, the Former Yugoslav Republic of", nameFr: "Macédoine (ex-République yougoslave de)", dial: "+389" },
147
+ { code: "MG", name: "Madagascar", nameFr: "Madagascar", dial: "+261" },
148
+ { code: "MW", name: "Malawi", nameFr: "Malawi", dial: "+265" },
149
+ { code: "MY", name: "Malaysia", nameFr: "Malaisie", dial: "+60" },
150
+ { code: "MV", name: "Maldives", nameFr: "Maldives", dial: "+960" },
151
+ { code: "ML", name: "Mali", nameFr: "Mali", dial: "+223" },
152
+ { code: "MT", name: "Malta", nameFr: "Malte", dial: "+356" },
153
+ { code: "MH", name: "Marshall Islands", nameFr: "Îles Marshall", dial: "+692" },
154
+ { code: "MQ", name: "Martinique", nameFr: "Martinique", dial: "+596" },
155
+ { code: "MR", name: "Mauritania", nameFr: "Mauritanie", dial: "+222" },
156
+ { code: "MU", name: "Mauritius", nameFr: "Maurice", dial: "+230" },
157
+ { code: "YT", name: "Mayotte", nameFr: "Mayotte", dial: "+262" },
158
+ { code: "MX", name: "Mexico", nameFr: "Mexique", dial: "+52" },
159
+ { code: "FM", name: "Micronesia, Federated States of", nameFr: "Micronésie (États fédérés de)", dial: "+691" },
160
+ { code: "MD", name: "Moldova, Republic of", nameFr: "Moldavie (République de)", dial: "+373" },
161
+ { code: "MC", name: "Monaco", nameFr: "Monaco", dial: "+377" },
162
+ { code: "MN", name: "Mongolia", nameFr: "Mongolie", dial: "+976" },
163
+ { code: "ME", name: "Montenegro", nameFr: "Monténégro", dial: "+382" },
164
+ { code: "MS", name: "Montserrat", nameFr: "Montserrat", dial: "+1-664" },
165
+ { code: "MA", name: "Morocco", nameFr: "Maroc", dial: "+212" },
166
+ { code: "MZ", name: "Mozambique", nameFr: "Mozambique", dial: "+258" },
167
+ { code: "MM", name: "Myanmar", nameFr: "Myanmar", dial: "+95" },
168
+ { code: "NA", name: "Namibia", nameFr: "Namibie", dial: "+264" },
169
+ { code: "NR", name: "Nauru", nameFr: "Nauru", dial: "+674" },
170
+ { code: "NP", name: "Nepal", nameFr: "Népal", dial: "+977" },
171
+ { code: "NL", name: "Netherlands", nameFr: "Pays-Bas", dial: "+31" },
172
+ { code: "AN", name: "Netherlands Antilles", nameFr: "Antilles néerlandaises", dial: "+599" },
173
+ { code: "NC", name: "New Caledonia", nameFr: "Nouvelle-Calédonie", dial: "+687" },
174
+ { code: "NZ", name: "New Zealand", nameFr: "Nouvelle-Zélande", dial: "+64" },
175
+ { code: "NI", name: "Nicaragua", nameFr: "Nicaragua", dial: "+505" },
176
+ { code: "NE", name: "Niger", nameFr: "Niger", dial: "+227" },
177
+ { code: "NG", name: "Nigeria", nameFr: "Nigéria", dial: "+234" },
178
+ { code: "NU", name: "Niue", nameFr: "Niue", dial: "+683" },
179
+ { code: "NF", name: "Norfolk Island", nameFr: "Île Norfolk", dial: "+672" },
180
+ { code: "MP", name: "Northern Mariana Islands", nameFr: "Îles Mariannes du Nord", dial: "+1-670" },
181
+ { code: "NO", name: "Norway", nameFr: "Norvège", dial: "+47" },
182
+ { code: "OM", name: "Oman", nameFr: "Oman", dial: "+968" },
183
+ { code: "PK", name: "Pakistan", nameFr: "Pakistan", dial: "+92" },
184
+ { code: "PW", name: "Palau", nameFr: "Palaos", dial: "+680" },
185
+ { code: "PS", name: "Palestinian Territory, Occupied", nameFr: "Territoire palestinien (occupé)", dial: "+970" },
186
+ { code: "PA", name: "Panama", nameFr: "Panama", dial: "+507" },
187
+ { code: "PG", name: "Papua New Guinea", nameFr: "Papouasie-Nouvelle-Guinée", dial: "+675" },
188
+ { code: "PY", name: "Paraguay", nameFr: "Paraguay", dial: "+595" },
189
+ { code: "PE", name: "Peru", nameFr: "Pérou", dial: "+51" },
190
+ { code: "PH", name: "Philippines", nameFr: "Philippines", dial: "+63" },
191
+ { code: "PN", name: "Pitcairn", nameFr: "Pitcairn", dial: "+64" },
192
+ { code: "PL", name: "Poland", nameFr: "Pologne", dial: "+48" },
193
+ { code: "PT", name: "Portugal", nameFr: "Portugal", dial: "+351" },
194
+ { code: "PR", name: "Puerto Rico", nameFr: "Porto Rico", dial: "+1-787" },
195
+ { code: "QA", name: "Qatar", nameFr: "Qatar", dial: "+974" },
196
+ { code: "RE", name: "Réunion", nameFr: "Réunion", dial: "+262" },
197
+ { code: "RO", name: "Romania", nameFr: "Roumanie", dial: "+40" },
198
+ { code: "RU", name: "Russian Federation", nameFr: "Russie (Fédération de)", dial: "+7" },
199
+ { code: "RW", name: "Rwanda", nameFr: "Rwanda", dial: "+250" },
200
+ { code: "SH", name: "Saint Helena", nameFr: "Sainte-Hélène", dial: "+290" },
201
+ { code: "KN", name: "Saint Kitts and Nevis", nameFr: "Saint-Kitts-et-Nevis", dial: "+1-869" },
202
+ { code: "LC", name: "Saint Lucia", nameFr: "Sainte-Lucie", dial: "+1-758" },
203
+ { code: "PM", name: "Saint Pierre and Miquelon", nameFr: "Saint-Pierre-et-Miquelon", dial: "+508" },
204
+ { code: "VC", name: "Saint Vincent and the Grenadines", nameFr: "Saint-Vincent-et-les-Grenadines", dial: "+1-784" },
205
+ { code: "WS", name: "Samoa", nameFr: "Samoa", dial: "+685" },
206
+ { code: "SM", name: "San Marino", nameFr: "Saint-Marin", dial: "+378" },
207
+ { code: "ST", name: "Sao Tome and Principe", nameFr: "Sao Tomé-et-Principe", dial: "+239" },
208
+ { code: "SA", name: "Saudi Arabia", nameFr: "Arabie saoudite", dial: "+966" },
209
+ { code: "SN", name: "Senegal", nameFr: "Sénégal", dial: "+221" },
210
+ { code: "RS", name: "Serbia", nameFr: "Serbie", dial: "+381" },
211
+ { code: "SC", name: "Seychelles", nameFr: "Seychelles", dial: "+248" },
212
+ { code: "SL", name: "Sierra Leone", nameFr: "Sierra Leone", dial: "+232" },
213
+ { code: "SG", name: "Singapore", nameFr: "Singapour", dial: "+65" },
214
+ { code: "SK", name: "Slovakia", nameFr: "Slovaquie", dial: "+421" },
215
+ { code: "SI", name: "Slovenia", nameFr: "Slovénie", dial: "+386" },
216
+ { code: "SB", name: "Solomon Islands", nameFr: "Îles Salomon", dial: "+677" },
217
+ { code: "SO", name: "Somalia", nameFr: "Somalie", dial: "+252" },
218
+ { code: "ZA", name: "South Africa", nameFr: "Afrique du Sud", dial: "+27" },
219
+ { code: "GS", name: "South Georgia and the South Sandwich Islands", nameFr: "Géorgie du Sud et les Îles Sandwich du Sud", dial: "+500" },
220
+ { code: "ES", name: "Spain", nameFr: "Espagne", dial: "+34" },
221
+ { code: "LK", name: "Sri Lanka", nameFr: "Sri Lanka", dial: "+94" },
222
+ { code: "SD", name: "Sudan", nameFr: "Soudan", dial: "+249" },
223
+ { code: "SR", name: "Suriname", nameFr: "Suriname", dial: "+597" },
224
+ { code: "SJ", name: "Svalbard and Jan Mayen", nameFr: "Svalbard et Jan Mayen", dial: "+47" },
225
+ { code: "SZ", name: "Swaziland", nameFr: "Swaziland", dial: "+268" },
226
+ { code: "SE", name: "Sweden", nameFr: "Suède", dial: "+46" },
227
+ { code: "CH", name: "Switzerland", nameFr: "Suisse", dial: "+41" },
228
+ { code: "SY", name: "Syrian Arab Republic", nameFr: "République arabe syrienne", dial: "+963" },
229
+ { code: "TW", name: "Taiwan, Province of China", nameFr: "Taïwan (Province de Chine)", dial: "+886" },
230
+ { code: "TJ", name: "Tajikistan", nameFr: "Tadjikistan", dial: "+992" },
231
+ { code: "TZ", name: "Tanzania, United Republic of", nameFr: "Tanzanie (République-Unie de)", dial: "+255" },
232
+ { code: "TH", name: "Thailand", nameFr: "Thaïlande", dial: "+66" },
233
+ { code: "TL", name: "Timor-Leste", nameFr: "Timor-Leste", dial: "+670" },
234
+ { code: "TG", name: "Togo", nameFr: "Togo", dial: "+228" },
235
+ { code: "TK", name: "Tokelau", nameFr: "Tokelau", dial: "+690" },
236
+ { code: "TO", name: "Tonga", nameFr: "Tonga", dial: "+676" },
237
+ { code: "TT", name: "Trinidad and Tobago", nameFr: "Trinité-et-Tobago", dial: "+1-868" },
238
+ { code: "TN", name: "Tunisia", nameFr: "Tunisie", dial: "+216" },
239
+ { code: "TR", name: "Turkey", nameFr: "Turquie", dial: "+90" },
240
+ { code: "TM", name: "Turkmenistan", nameFr: "Turkménistan", dial: "+993" },
241
+ { code: "TC", name: "Turks and Caicos Islands", nameFr: "Îles Turques-et-Caïques", dial: "+1-649" },
242
+ { code: "TV", name: "Tuvalu", nameFr: "Tuvalu", dial: "+688" },
243
+ { code: "UG", name: "Uganda", nameFr: "Ouganda", dial: "+256" },
244
+ { code: "UA", name: "Ukraine", nameFr: "Ukraine", dial: "+380" },
245
+ { code: "AE", name: "United Arab Emirates", nameFr: "Émirats arabes unis", dial: "+971" },
246
+ { code: "GB", name: "United Kingdom", nameFr: "Royaume-Uni", dial: "+44" },
247
+ { code: "US", name: "United States", nameFr: "États-Unis", dial: "+1" },
248
+ { code: "UM", name: "United States Minor Outlying Islands", nameFr: "Îles mineures éloignées des États-Unis", dial: "+1" },
249
+ { code: "UY", name: "Uruguay", nameFr: "Uruguay", dial: "+598" },
250
+ { code: "UZ", name: "Uzbekistan", nameFr: "Ouzbékistan", dial: "+998" },
251
+ { code: "VU", name: "Vanuatu", nameFr: "Vanuatu", dial: "+678" },
252
+ { code: "VE", name: "Venezuela", nameFr: "Venezuela", dial: "+58" },
253
+ { code: "VN", name: "Viet Nam", nameFr: "Viet Nam", dial: "+84" },
254
+ { code: "VG", name: "Virgin Islands, British", nameFr: "Îles Vierges britanniques", dial: "+1-284" },
255
+ { code: "VI", name: "Virgin Islands, U.S.", nameFr: "Îles Vierges des États-Unis", dial: "+1-340" },
256
+ { code: "WF", name: "Wallis and Futuna", nameFr: "Wallis-et-Futuna", dial: "+681" },
257
+ { code: "EH", name: "Western Sahara", nameFr: "Sahara occidental", dial: "+212" },
258
+ { code: "YE", name: "Yemen", nameFr: "Yémen", dial: "+967" },
259
+ { code: "ZM", name: "Zambia", nameFr: "Zambie", dial: "+260" },
260
+ { code: "ZW", name: "Zimbabwe", nameFr: "Zimbabwe", dial: "+263" },
261
+ ]