@korsolutions/ui 0.0.53 → 0.0.55

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 (260) hide show
  1. package/babel.config.js +1 -11
  2. package/dist/module/components/alert/components/alert-body.js.map +1 -1
  3. package/dist/module/components/alert/components/alert-description.js.map +1 -1
  4. package/dist/module/components/alert/components/alert-icon.js.map +1 -1
  5. package/dist/module/components/alert/components/alert-root.js.map +1 -1
  6. package/dist/module/components/alert/components/alert-title.js.map +1 -1
  7. package/dist/module/components/alert/index.js.map +1 -1
  8. package/dist/module/components/alert/variants/default.js.map +1 -1
  9. package/dist/module/components/alert/variants/destructive.js.map +1 -1
  10. package/dist/module/components/alert/variants/index.js.map +1 -1
  11. package/dist/module/components/alert-dialog/async-alert-dialog.js.map +1 -1
  12. package/dist/module/components/alert-dialog/components/alert-dialog-action.js.map +1 -1
  13. package/dist/module/components/alert-dialog/components/alert-dialog-cancel.js.map +1 -1
  14. package/dist/module/components/alert-dialog/components/alert-dialog-content.js.map +1 -1
  15. package/dist/module/components/alert-dialog/components/alert-dialog-description.js.map +1 -1
  16. package/dist/module/components/alert-dialog/components/alert-dialog-footer.js.map +1 -1
  17. package/dist/module/components/alert-dialog/components/alert-dialog-overlay.js.map +1 -1
  18. package/dist/module/components/alert-dialog/components/alert-dialog-portal.js.map +1 -1
  19. package/dist/module/components/alert-dialog/components/alert-dialog-root.js.map +1 -1
  20. package/dist/module/components/alert-dialog/components/alert-dialog-title.js.map +1 -1
  21. package/dist/module/components/alert-dialog/components/alert-dialog-trigger.js.map +1 -1
  22. package/dist/module/components/alert-dialog/index.js.map +1 -1
  23. package/dist/module/components/alert-dialog/variants/default.js.map +1 -1
  24. package/dist/module/components/alert-dialog/variants/index.js.map +1 -1
  25. package/dist/module/components/avatar/components/avatar-fallback.js.map +1 -1
  26. package/dist/module/components/avatar/components/avatar-image.js.map +1 -1
  27. package/dist/module/components/avatar/components/avatar-root.js.map +1 -1
  28. package/dist/module/components/avatar/index.js.map +1 -1
  29. package/dist/module/components/avatar/variants/default.js.map +1 -1
  30. package/dist/module/components/avatar/variants/index.js.map +1 -1
  31. package/dist/module/components/badge/components/badge-label.js.map +1 -1
  32. package/dist/module/components/badge/components/badge-root.js.map +1 -1
  33. package/dist/module/components/badge/index.js.map +1 -1
  34. package/dist/module/components/badge/variants/default.js.map +1 -1
  35. package/dist/module/components/badge/variants/index.js.map +1 -1
  36. package/dist/module/components/badge/variants/secondary.js.map +1 -1
  37. package/dist/module/components/button/components/button-label.js.map +1 -1
  38. package/dist/module/components/button/components/button-root.js.map +1 -1
  39. package/dist/module/components/button/components/button-spinner.js.map +1 -1
  40. package/dist/module/components/button/index.js.map +1 -1
  41. package/dist/module/components/button/variants/default.js.map +1 -1
  42. package/dist/module/components/button/variants/index.js.map +1 -1
  43. package/dist/module/components/button/variants/secondary.js.map +1 -1
  44. package/dist/module/components/calendar/components/calendar-day.js.map +1 -1
  45. package/dist/module/components/calendar/components/calendar-header.js.map +1 -1
  46. package/dist/module/components/calendar/components/calendar-nav-button.js.map +1 -1
  47. package/dist/module/components/calendar/components/calendar-root.js.map +1 -1
  48. package/dist/module/components/calendar/components/calendar-title.js.map +1 -1
  49. package/dist/module/components/calendar/components/calendar-week-labels.js.map +1 -1
  50. package/dist/module/components/calendar/components/calendar-weeks.js.map +1 -1
  51. package/dist/module/components/calendar/index.js.map +1 -1
  52. package/dist/module/components/calendar/variants/default.js.map +1 -1
  53. package/dist/module/components/calendar/variants/index.js.map +1 -1
  54. package/dist/module/components/card/card-body.js.map +1 -1
  55. package/dist/module/components/card/card-footer.js.map +1 -1
  56. package/dist/module/components/card/card-header.js.map +1 -1
  57. package/dist/module/components/card/card-root.js.map +1 -1
  58. package/dist/module/components/card/card-title.js.map +1 -1
  59. package/dist/module/components/card/index.js.map +1 -1
  60. package/dist/module/components/card/variants/default.js.map +1 -1
  61. package/dist/module/components/card/variants/index.js.map +1 -1
  62. package/dist/module/components/checkbox/components/checkbox-content.js.map +1 -1
  63. package/dist/module/components/checkbox/components/checkbox-description.js.map +1 -1
  64. package/dist/module/components/checkbox/components/checkbox-indicator.js.map +1 -1
  65. package/dist/module/components/checkbox/components/checkbox-root.js.map +1 -1
  66. package/dist/module/components/checkbox/components/checkbox-title.js.map +1 -1
  67. package/dist/module/components/checkbox/index.js.map +1 -1
  68. package/dist/module/components/checkbox/variants/default.js.map +1 -1
  69. package/dist/module/components/checkbox/variants/index.js.map +1 -1
  70. package/dist/module/components/checkbox/variants/outlined.js.map +1 -1
  71. package/dist/module/components/empty/components/empty-description.js.map +1 -1
  72. package/dist/module/components/empty/components/empty-media.js.map +1 -1
  73. package/dist/module/components/empty/components/empty-root.js.map +1 -1
  74. package/dist/module/components/empty/components/empty-title.js.map +1 -1
  75. package/dist/module/components/empty/index.js.map +1 -1
  76. package/dist/module/components/empty/variants/default.js.map +1 -1
  77. package/dist/module/components/empty/variants/index.js.map +1 -1
  78. package/dist/module/components/field/components/field-description.js.map +1 -1
  79. package/dist/module/components/field/components/field-error.js.map +1 -1
  80. package/dist/module/components/field/components/field-label.js.map +1 -1
  81. package/dist/module/components/field/components/field-root.js.map +1 -1
  82. package/dist/module/components/field/index.js.map +1 -1
  83. package/dist/module/components/field/variants/default.js.map +1 -1
  84. package/dist/module/components/field/variants/index.js.map +1 -1
  85. package/dist/module/components/icon/icon.js.map +1 -1
  86. package/dist/module/components/icon/index.js.map +1 -1
  87. package/dist/module/components/icon/variants/default.js.map +1 -1
  88. package/dist/module/components/icon/variants/index.js.map +1 -1
  89. package/dist/module/components/index.js.map +1 -1
  90. package/dist/module/components/input/index.js.map +1 -1
  91. package/dist/module/components/input/input.js.map +1 -1
  92. package/dist/module/components/input/numeric-input.js.map +1 -1
  93. package/dist/module/components/input/variants/default.js.map +1 -1
  94. package/dist/module/components/input/variants/index.js.map +1 -1
  95. package/dist/module/components/input/variants/secondary.js.map +1 -1
  96. package/dist/module/components/link/index.js.map +1 -1
  97. package/dist/module/components/link/link.js.map +1 -1
  98. package/dist/module/components/link/variants/default.js.map +1 -1
  99. package/dist/module/components/link/variants/index.js.map +1 -1
  100. package/dist/module/components/list/index.js.map +1 -1
  101. package/dist/module/components/menu/components/menu-content.js.map +1 -1
  102. package/dist/module/components/menu/components/menu-item.js.map +1 -1
  103. package/dist/module/components/menu/components/menu-overlay.js.map +1 -1
  104. package/dist/module/components/menu/components/menu-portal.js.map +1 -1
  105. package/dist/module/components/menu/components/menu-root.js.map +1 -1
  106. package/dist/module/components/menu/components/menu-trigger.js.map +1 -1
  107. package/dist/module/components/menu/index.js.map +1 -1
  108. package/dist/module/components/menu/variants/default.js.map +1 -1
  109. package/dist/module/components/menu/variants/index.js.map +1 -1
  110. package/dist/module/components/phone-input/components/country-picker.js +101 -0
  111. package/dist/module/components/phone-input/components/country-picker.js.map +1 -0
  112. package/dist/module/components/phone-input/components/phone-input-root.js +57 -0
  113. package/dist/module/components/phone-input/components/phone-input-root.js.map +1 -0
  114. package/dist/module/components/phone-input/components/phone-input.js +31 -0
  115. package/dist/module/components/phone-input/components/phone-input.js.map +1 -0
  116. package/dist/module/components/phone-input/context.js +12 -0
  117. package/dist/module/components/phone-input/context.js.map +1 -0
  118. package/dist/module/components/phone-input/index.js +8 -1
  119. package/dist/module/components/phone-input/index.js.map +1 -1
  120. package/dist/module/components/phone-input/variants/default.js +1 -1
  121. package/dist/module/components/phone-input/variants/default.js.map +1 -1
  122. package/dist/module/components/phone-input/variants/index.js.map +1 -1
  123. package/dist/module/components/popover/components/popover-close.js.map +1 -1
  124. package/dist/module/components/popover/components/popover-content.js.map +1 -1
  125. package/dist/module/components/popover/components/popover-overlay.js.map +1 -1
  126. package/dist/module/components/popover/components/popover-portal.js.map +1 -1
  127. package/dist/module/components/popover/components/popover-root.js.map +1 -1
  128. package/dist/module/components/popover/components/popover-trigger.js.map +1 -1
  129. package/dist/module/components/popover/index.js.map +1 -1
  130. package/dist/module/components/popover/variants/default.js.map +1 -1
  131. package/dist/module/components/popover/variants/index.js.map +1 -1
  132. package/dist/module/components/popover/variants/unstyled.js.map +1 -1
  133. package/dist/module/components/portal/index.js.map +1 -1
  134. package/dist/module/components/portal/portal.js.map +1 -1
  135. package/dist/module/components/portal/portal.web.js.map +1 -1
  136. package/dist/module/components/progress/components/progress-indicator.js.map +1 -1
  137. package/dist/module/components/progress/components/progress-root.js.map +1 -1
  138. package/dist/module/components/progress/index.js.map +1 -1
  139. package/dist/module/components/progress/variants/default.js.map +1 -1
  140. package/dist/module/components/progress/variants/index.js.map +1 -1
  141. package/dist/module/components/scroll-bar/index.js.map +1 -1
  142. package/dist/module/components/scroll-bar/scroll-bar.js.map +1 -1
  143. package/dist/module/components/select/components/select-content.js.map +1 -1
  144. package/dist/module/components/select/components/select-option.js.map +1 -1
  145. package/dist/module/components/select/components/select-overlay.js.map +1 -1
  146. package/dist/module/components/select/components/select-portal.js +10 -1
  147. package/dist/module/components/select/components/select-portal.js.map +1 -1
  148. package/dist/module/components/select/components/select-root.js.map +1 -1
  149. package/dist/module/components/select/components/select-trigger.js +5 -4
  150. package/dist/module/components/select/components/select-trigger.js.map +1 -1
  151. package/dist/module/components/select/index.js.map +1 -1
  152. package/dist/module/components/select/variants/default.js.map +1 -1
  153. package/dist/module/components/select/variants/index.js.map +1 -1
  154. package/dist/module/components/tabs/components/tabs-list.js.map +1 -1
  155. package/dist/module/components/tabs/components/tabs-root.js.map +1 -1
  156. package/dist/module/components/tabs/components/tabs-trigger-text.js.map +1 -1
  157. package/dist/module/components/tabs/components/tabs-trigger.js.map +1 -1
  158. package/dist/module/components/tabs/index.js.map +1 -1
  159. package/dist/module/components/tabs/variants/default.js.map +1 -1
  160. package/dist/module/components/tabs/variants/index.js.map +1 -1
  161. package/dist/module/components/tabs/variants/line.js.map +1 -1
  162. package/dist/module/components/textarea/index.js.map +1 -1
  163. package/dist/module/components/textarea/textarea.js.map +1 -1
  164. package/dist/module/components/textarea/variants/default.js.map +1 -1
  165. package/dist/module/components/textarea/variants/index.js.map +1 -1
  166. package/dist/module/components/toast/components/toast-body.js +16 -0
  167. package/dist/module/components/toast/components/toast-body.js.map +1 -0
  168. package/dist/module/components/toast/components/toast-description.js.map +1 -1
  169. package/dist/module/components/toast/components/toast-icon.js.map +1 -1
  170. package/dist/module/components/toast/components/toast-root.js.map +1 -1
  171. package/dist/module/components/toast/components/toast-title.js.map +1 -1
  172. package/dist/module/components/toast/index.js.map +1 -1
  173. package/dist/module/components/toast/manager.js +15 -5
  174. package/dist/module/components/toast/manager.js.map +1 -1
  175. package/dist/module/components/toast/variants/danger.js +6 -2
  176. package/dist/module/components/toast/variants/danger.js.map +1 -1
  177. package/dist/module/components/toast/variants/default.js +6 -2
  178. package/dist/module/components/toast/variants/default.js.map +1 -1
  179. package/dist/module/components/toast/variants/index.js.map +1 -1
  180. package/dist/module/components/toast/variants/success.js +6 -2
  181. package/dist/module/components/toast/variants/success.js.map +1 -1
  182. package/dist/module/components/typography/index.js.map +1 -1
  183. package/dist/module/components/typography/typography.js.map +1 -1
  184. package/dist/module/components/typography/variants/body-lg.js.map +1 -1
  185. package/dist/module/components/typography/variants/body-md.js.map +1 -1
  186. package/dist/module/components/typography/variants/body-sm.js.map +1 -1
  187. package/dist/module/components/typography/variants/heading-lg.js.map +1 -1
  188. package/dist/module/components/typography/variants/heading-md.js.map +1 -1
  189. package/dist/module/components/typography/variants/heading-sm.js.map +1 -1
  190. package/dist/module/components/typography/variants/index.js.map +1 -1
  191. package/dist/module/data/countries.js.map +1 -1
  192. package/dist/module/hooks/index.js.map +1 -1
  193. package/dist/module/hooks/use-phone-mask.js.map +1 -1
  194. package/dist/module/index.js +3 -1
  195. package/dist/module/index.js.map +1 -1
  196. package/dist/module/safe-area/index.js.map +1 -1
  197. package/dist/module/safe-area/provider.js.map +1 -1
  198. package/dist/module/themes/adapters/index.js.map +1 -1
  199. package/dist/module/themes/adapters/react-navigation.js.map +1 -1
  200. package/dist/module/themes/default/index.js.map +1 -1
  201. package/dist/module/themes/index.js.map +1 -1
  202. package/dist/module/themes/provider.js +11 -2
  203. package/dist/module/themes/provider.js.map +1 -1
  204. package/dist/module/utils/use-themed-styles.js.map +1 -1
  205. package/dist/typescript/babel.config.d.ts +1 -6
  206. package/dist/typescript/babel.config.d.ts.map +1 -1
  207. package/dist/typescript/src/components/phone-input/components/country-picker.d.ts +3 -0
  208. package/dist/typescript/src/components/phone-input/components/country-picker.d.ts.map +1 -0
  209. package/dist/typescript/src/components/phone-input/components/phone-input-root.d.ts +17 -0
  210. package/dist/typescript/src/components/phone-input/components/phone-input-root.d.ts.map +1 -0
  211. package/dist/typescript/src/components/phone-input/components/phone-input.d.ts +8 -0
  212. package/dist/typescript/src/components/phone-input/components/phone-input.d.ts.map +1 -0
  213. package/dist/typescript/src/components/phone-input/context.d.ts +17 -0
  214. package/dist/typescript/src/components/phone-input/context.d.ts.map +1 -0
  215. package/dist/typescript/src/components/phone-input/index.d.ts +8 -1
  216. package/dist/typescript/src/components/phone-input/index.d.ts.map +1 -1
  217. package/dist/typescript/src/components/select/components/select-portal.d.ts +1 -1
  218. package/dist/typescript/src/components/select/components/select-portal.d.ts.map +1 -1
  219. package/dist/typescript/src/components/select/components/select-trigger.d.ts.map +1 -1
  220. package/dist/typescript/src/components/toast/components/toast-body.d.ts +9 -0
  221. package/dist/typescript/src/components/toast/components/toast-body.d.ts.map +1 -0
  222. package/dist/typescript/src/components/toast/manager.d.ts.map +1 -1
  223. package/dist/typescript/src/components/toast/types.d.ts +2 -0
  224. package/dist/typescript/src/components/toast/types.d.ts.map +1 -1
  225. package/dist/typescript/src/components/toast/variants/danger.d.ts.map +1 -1
  226. package/dist/typescript/src/components/toast/variants/default.d.ts.map +1 -1
  227. package/dist/typescript/src/components/toast/variants/success.d.ts.map +1 -1
  228. package/dist/typescript/src/data/countries.d.ts +2 -1
  229. package/dist/typescript/src/data/countries.d.ts.map +1 -1
  230. package/dist/typescript/src/hooks/use-phone-mask.d.ts +2 -2
  231. package/dist/typescript/src/hooks/use-phone-mask.d.ts.map +1 -1
  232. package/dist/typescript/src/index.d.ts +4 -3
  233. package/dist/typescript/src/index.d.ts.map +1 -1
  234. package/dist/typescript/src/themes/provider.d.ts +10 -0
  235. package/dist/typescript/src/themes/provider.d.ts.map +1 -1
  236. package/package.json +2 -7
  237. package/src/components/phone-input/components/country-picker.tsx +155 -0
  238. package/src/components/phone-input/components/phone-input-root.tsx +85 -0
  239. package/src/components/phone-input/components/phone-input.tsx +43 -0
  240. package/src/components/phone-input/context.ts +32 -0
  241. package/src/components/phone-input/index.ts +10 -1
  242. package/src/components/phone-input/variants/default.tsx +1 -1
  243. package/src/components/select/components/select-portal.tsx +14 -2
  244. package/src/components/select/components/select-trigger.tsx +5 -6
  245. package/src/components/toast/components/toast-body.tsx +19 -0
  246. package/src/components/toast/manager.tsx +15 -5
  247. package/src/components/toast/types.ts +2 -0
  248. package/src/components/toast/variants/danger.tsx +6 -2
  249. package/src/components/toast/variants/default.tsx +6 -2
  250. package/src/components/toast/variants/success.tsx +6 -2
  251. package/src/data/countries.ts +606 -68
  252. package/src/hooks/use-phone-mask.ts +2 -2
  253. package/src/index.tsx +9 -3
  254. package/src/themes/provider.tsx +22 -1
  255. package/dist/module/components/phone-input/phone-input.js +0 -165
  256. package/dist/module/components/phone-input/phone-input.js.map +0 -1
  257. package/dist/typescript/src/components/phone-input/phone-input.d.ts +0 -16
  258. package/dist/typescript/src/components/phone-input/phone-input.d.ts.map +0 -1
  259. package/scripts/build.sh +0 -2
  260. package/src/components/phone-input/phone-input.tsx +0 -220
@@ -13,7 +13,7 @@ export interface UsePhoneMaskOptions {
13
13
  countries?: CountryData[];
14
14
  }
15
15
 
16
- export interface UsePhoneMaskReturn {
16
+ export interface PhoneMask {
17
17
  displayValue: string;
18
18
  e164Value: string;
19
19
  country: CountryData;
@@ -78,7 +78,7 @@ export function usePhoneMask({
78
78
  onChange,
79
79
  onCountryChange,
80
80
  countries: customCountries,
81
- }: UsePhoneMaskOptions = {}): UsePhoneMaskReturn {
81
+ }: UsePhoneMaskOptions = {}): PhoneMask {
82
82
  const availableCountries = customCountries ?? COUNTRIES;
83
83
  const isInternalChange = useRef(false);
84
84
 
package/src/index.tsx CHANGED
@@ -3,13 +3,18 @@ import { PortalHost } from "./components/portal";
3
3
  import { type PortalHostProps } from "./components/portal/portal.constants";
4
4
  import { ToastContainer } from "./components/toast/manager";
5
5
  import { SafeAreaProvider, type SafeAreaInsets } from "./safe-area";
6
- import { ThemeProvider, type ThemeProviderProps } from "./themes";
6
+ import {
7
+ ThemeProvider,
8
+ type ComponentsConfig,
9
+ type ThemeProviderProps,
10
+ } from "./themes";
7
11
 
8
12
  export interface ProviderProps {
9
13
  children: React.ReactNode;
10
14
  portalContainer?: PortalHostProps["container"];
11
15
  theme?: ThemeProviderProps["theme"];
12
16
  safeAreaInsets?: SafeAreaInsets;
17
+ components?: ComponentsConfig;
13
18
  }
14
19
 
15
20
  export const UIProvider = ({
@@ -17,10 +22,11 @@ export const UIProvider = ({
17
22
  portalContainer,
18
23
  theme,
19
24
  safeAreaInsets,
25
+ components,
20
26
  }: ProviderProps) => {
21
27
  return (
22
28
  <SafeAreaProvider insets={safeAreaInsets}>
23
- <ThemeProvider theme={theme}>
29
+ <ThemeProvider theme={theme} components={components}>
24
30
  <ToastContainer />
25
31
  {children}
26
32
  <PortalHost container={portalContainer} />
@@ -34,7 +40,7 @@ export * from "./hooks/use-screen-size";
34
40
 
35
41
  export * from "./themes/adapters";
36
42
  export * from "./themes/default";
37
- export { useTheme } from "./themes/provider";
43
+ export { useTheme, type ComponentsConfig } from "./themes/provider";
38
44
  export * from "./themes/types";
39
45
 
40
46
  export * from "./components";
@@ -6,6 +6,8 @@ import {
6
6
  useState,
7
7
  } from "react";
8
8
  import { useColorScheme } from "react-native";
9
+ import type { ToastVariants } from "../components/toast/variants";
10
+ import type { SvgProps } from "../types/props.types";
9
11
  import type { DeepPartial } from "../types/util.types";
10
12
  import { defaultThemeAssets } from "./default";
11
13
  import type {
@@ -27,16 +29,26 @@ interface ThemeContext {
27
29
  letterSpacing: LetterSpacing;
28
30
  fontSize: FontSize;
29
31
  setColorScheme: (scheme: ColorScheme) => void;
32
+ components?: ComponentsConfig;
33
+ }
34
+
35
+ export interface ComponentsConfig {
36
+ toast?: {
37
+ icons?: Partial<
38
+ Record<keyof typeof ToastVariants, (props: SvgProps) => React.ReactNode>
39
+ >;
40
+ };
30
41
  }
31
42
 
32
43
  const ThemeContext = createContext<ThemeContext | null>(null);
33
44
 
34
45
  export interface ThemeProviderProps extends PropsWithChildren {
35
46
  theme?: DeepPartial<ThemeAssets>;
47
+ components?: ComponentsConfig;
36
48
  }
37
49
 
38
50
  export const ThemeProvider = (props: ThemeProviderProps) => {
39
- const { children, theme } = props;
51
+ const { children, theme, components } = props;
40
52
 
41
53
  const systemColorScheme = useColorScheme();
42
54
  const [colorScheme, setColorScheme] = useState<ColorScheme>(
@@ -65,6 +77,7 @@ export const ThemeProvider = (props: ThemeProviderProps) => {
65
77
  fontFamily: themeAssets.fontFamily,
66
78
  letterSpacing: themeAssets.letterSpacing,
67
79
  fontSize: themeAssets.fontSize,
80
+ components,
68
81
  }}
69
82
  >
70
83
  {children}
@@ -79,3 +92,11 @@ export const useTheme = () => {
79
92
  }
80
93
  return context;
81
94
  };
95
+
96
+ export const useComponentsConfig = () => {
97
+ const context = useContext(ThemeContext);
98
+ if (!context) {
99
+ throw new Error("useComponentsConfig must be used within a ThemeProvider");
100
+ }
101
+ return context.components;
102
+ };
@@ -1,165 +0,0 @@
1
- "use strict";
2
-
3
- import { usePhoneMask } from "../../hooks/use-phone-mask.js";
4
- import { DEFAULT_LAYOUT, DEFAULT_POSITION, useRelativePosition } from "../../hooks/use-relative-position.js";
5
- import { measureLayoutPosition } from "../../utils/normalize-layout.js";
6
- import React, { useRef, useState } from "react";
7
- import { Keyboard, Platform, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from "react-native";
8
- import { Portal } from "../portal/index.js";
9
- import { PhoneInputVariants } from "./variants/index.js";
10
- import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
11
- const calculateState = (isDisabled, isFocused) => {
12
- if (isDisabled) return "disabled";
13
- if (isFocused) return "focused";
14
- return "default";
15
- };
16
- export function PhoneInput({
17
- value,
18
- onChange,
19
- defaultCountry = "US",
20
- countries,
21
- placeholder,
22
- isDisabled = false,
23
- variant = "default",
24
- style
25
- }) {
26
- const variantStyles = PhoneInputVariants[variant]();
27
- const [isFocused, setIsFocused] = useState(false);
28
- const [isPickerOpen, setIsPickerOpen] = useState(false);
29
- const [searchQuery, setSearchQuery] = useState("");
30
- const [triggerPosition, setTriggerPosition] = useState(DEFAULT_POSITION);
31
- const [contentLayout, setContentLayout] = useState(DEFAULT_LAYOUT);
32
- const triggerRef = useRef(null);
33
- const state = calculateState(isDisabled, isFocused);
34
- const phoneMask = usePhoneMask({
35
- value,
36
- defaultCountry,
37
- onChange,
38
- countries
39
- });
40
- const rootStyles = StyleSheet.flatten([variantStyles.root?.default, variantStyles.root?.[state], style]);
41
- const countryButtonStyles = StyleSheet.flatten([variantStyles.countryButton?.default, variantStyles.countryButton?.[state]]);
42
- const countryButtonTextStyles = StyleSheet.flatten([variantStyles.countryButtonText?.default, variantStyles.countryButtonText?.[state]]);
43
- const separatorStyles = StyleSheet.flatten([variantStyles.separator?.default, variantStyles.separator?.[state]]);
44
- const inputStyles = StyleSheet.flatten([variantStyles.input?.default, variantStyles.input?.[state]]);
45
- const openPicker = () => {
46
- if (isDisabled) return;
47
- if (Platform.OS !== "web") {
48
- Keyboard.dismiss();
49
- }
50
- measureLayoutPosition(triggerRef.current, layout => {
51
- setTriggerPosition(layout);
52
- setSearchQuery("");
53
- setIsPickerOpen(true);
54
- });
55
- };
56
- const closePicker = () => {
57
- setIsPickerOpen(false);
58
- setSearchQuery("");
59
- };
60
- const selectCountry = country => {
61
- phoneMask.setCountry(country.code);
62
- closePicker();
63
- };
64
- const filteredCountries = searchQuery ? phoneMask.countries.filter(c => c.name.toLowerCase().includes(searchQuery.toLowerCase())) : phoneMask.countries;
65
- return /*#__PURE__*/_jsxs(_Fragment, {
66
- children: [/*#__PURE__*/_jsxs(View, {
67
- ref: triggerRef,
68
- style: rootStyles,
69
- children: [/*#__PURE__*/_jsx(Pressable, {
70
- onPress: openPicker,
71
- disabled: isDisabled,
72
- style: countryButtonStyles,
73
- children: /*#__PURE__*/_jsxs(Text, {
74
- style: countryButtonTextStyles,
75
- children: [phoneMask.country.flag, " +", phoneMask.country.dialCode]
76
- })
77
- }), /*#__PURE__*/_jsx(View, {
78
- style: separatorStyles
79
- }), /*#__PURE__*/_jsx(TextInput, {
80
- value: phoneMask.displayValue,
81
- onChangeText: phoneMask.onChangeText,
82
- keyboardType: phoneMask.keyboardType,
83
- placeholder: placeholder,
84
- placeholderTextColor: StyleSheet.flatten(variantStyles.countryButtonText?.disabled)?.color,
85
- readOnly: isDisabled,
86
- onFocus: () => setIsFocused(true),
87
- onBlur: () => setIsFocused(false),
88
- style: inputStyles
89
- })]
90
- }), isPickerOpen && /*#__PURE__*/_jsx(CountryPicker, {
91
- countries: filteredCountries,
92
- selectedCode: phoneMask.country.code,
93
- searchQuery: searchQuery,
94
- onSearchChange: setSearchQuery,
95
- onSelect: selectCountry,
96
- onClose: closePicker,
97
- triggerPosition: triggerPosition,
98
- contentLayout: contentLayout,
99
- onContentLayout: setContentLayout,
100
- variantStyles: variantStyles,
101
- state: state
102
- })]
103
- });
104
- }
105
- function CountryPicker({
106
- countries,
107
- selectedCode,
108
- searchQuery,
109
- onSearchChange,
110
- onSelect,
111
- onClose,
112
- triggerPosition,
113
- contentLayout,
114
- onContentLayout,
115
- variantStyles,
116
- state
117
- }) {
118
- const positionStyle = useRelativePosition({
119
- align: "start",
120
- triggerPosition,
121
- contentLayout,
122
- alignOffset: 0,
123
- preferredSide: "bottom",
124
- sideOffset: 4
125
- });
126
- const overlayStyles = StyleSheet.flatten([variantStyles.pickerOverlay?.default, variantStyles.pickerOverlay?.[state]]);
127
- const contentStyles = StyleSheet.flatten([variantStyles.pickerContent?.default, variantStyles.pickerContent?.[state]]);
128
- const searchStyles = StyleSheet.flatten([variantStyles.pickerSearch?.default, variantStyles.pickerSearch?.[state]]);
129
- return /*#__PURE__*/_jsxs(Portal, {
130
- name: "phone-input-country-picker",
131
- children: [/*#__PURE__*/_jsx(Pressable, {
132
- onPress: onClose,
133
- style: [StyleSheet.absoluteFill, overlayStyles]
134
- }), /*#__PURE__*/_jsxs(View, {
135
- style: [positionStyle, contentStyles, {
136
- width: triggerPosition.width
137
- }],
138
- onLayout: e => onContentLayout(e.nativeEvent.layout),
139
- pointerEvents: "box-none",
140
- children: [/*#__PURE__*/_jsx(TextInput, {
141
- value: searchQuery,
142
- onChangeText: onSearchChange,
143
- placeholder: "Search countries...",
144
- autoFocus: true,
145
- style: searchStyles
146
- }), /*#__PURE__*/_jsx(ScrollView, {
147
- keyboardShouldPersistTaps: "handled",
148
- children: countries.map(country => {
149
- const isSelected = country.code === selectedCode;
150
- const optionStyles = StyleSheet.flatten([variantStyles.pickerOption?.default, isSelected && variantStyles.pickerOption?.selected]);
151
- const optionTextStyles = StyleSheet.flatten([variantStyles.pickerOptionText?.default, isSelected && variantStyles.pickerOptionText?.selected]);
152
- return /*#__PURE__*/_jsx(Pressable, {
153
- onPress: () => onSelect(country),
154
- style: optionStyles,
155
- children: /*#__PURE__*/_jsxs(Text, {
156
- style: optionTextStyles,
157
- children: [country.flag, " ", country.name, " +", country.dialCode]
158
- })
159
- }, country.code);
160
- })
161
- })]
162
- })]
163
- });
164
- }
165
- //# sourceMappingURL=phone-input.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["usePhoneMask","DEFAULT_LAYOUT","DEFAULT_POSITION","useRelativePosition","measureLayoutPosition","React","useRef","useState","Keyboard","Platform","Pressable","ScrollView","StyleSheet","Text","TextInput","View","Portal","PhoneInputVariants","jsxs","_jsxs","jsx","_jsx","Fragment","_Fragment","calculateState","isDisabled","isFocused","PhoneInput","value","onChange","defaultCountry","countries","placeholder","variant","style","variantStyles","setIsFocused","isPickerOpen","setIsPickerOpen","searchQuery","setSearchQuery","triggerPosition","setTriggerPosition","contentLayout","setContentLayout","triggerRef","state","phoneMask","rootStyles","flatten","root","default","countryButtonStyles","countryButton","countryButtonTextStyles","countryButtonText","separatorStyles","separator","inputStyles","input","openPicker","OS","dismiss","current","layout","closePicker","selectCountry","country","setCountry","code","filteredCountries","filter","c","name","toLowerCase","includes","children","ref","onPress","disabled","flag","dialCode","displayValue","onChangeText","keyboardType","placeholderTextColor","color","readOnly","onFocus","onBlur","CountryPicker","selectedCode","onSearchChange","onSelect","onClose","onContentLayout","positionStyle","align","alignOffset","preferredSide","sideOffset","overlayStyles","pickerOverlay","contentStyles","pickerContent","searchStyles","pickerSearch","absoluteFill","width","onLayout","e","nativeEvent","pointerEvents","autoFocus","keyboardShouldPersistTaps","map","isSelected","optionStyles","pickerOption","selected","optionTextStyles","pickerOptionText"],"sourceRoot":"../../../../src","sources":["components/phone-input/phone-input.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,16 +0,0 @@
1
- import type { CountryData } from "../../data/countries";
2
- import React from "react";
3
- import { type StyleProp, type ViewStyle } from "react-native";
4
- import { PhoneInputVariants } from "./variants";
5
- export interface PhoneInputProps {
6
- value?: string;
7
- onChange?: (value: string) => void;
8
- defaultCountry?: string;
9
- countries?: CountryData[];
10
- placeholder?: string;
11
- isDisabled?: boolean;
12
- variant?: keyof typeof PhoneInputVariants;
13
- style?: StyleProp<ViewStyle>;
14
- }
15
- export declare function PhoneInput({ value, onChange, defaultCountry, countries, placeholder, isDisabled, variant, style, }: PhoneInputProps): React.JSX.Element;
16
- //# sourceMappingURL=phone-input.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"phone-input.d.ts","sourceRoot":"","sources":["../../../../../src/components/phone-input/phone-input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKxD,OAAO,KAA2B,MAAM,OAAO,CAAC;AAChD,OAAO,EAML,KAAK,SAAS,EAKd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,kBAAkB,CAAC;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAQD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,cAAqB,EACrB,SAAS,EACT,WAAW,EACX,UAAkB,EAClB,OAAmB,EACnB,KAAK,GACN,EAAE,eAAe,qBAyFjB"}
package/scripts/build.sh DELETED
@@ -1,2 +0,0 @@
1
- bob build
2
- tsc-alias -p tsconfig.json --outDir dist/typescript
@@ -1,220 +0,0 @@
1
- import type { CountryData } from "../../data/countries";
2
- import { usePhoneMask } from "../../hooks/use-phone-mask";
3
- import { DEFAULT_LAYOUT, DEFAULT_POSITION, type LayoutPosition, useRelativePosition } from "../../hooks/use-relative-position";
4
- import type { ViewRef } from "../../types/element.types";
5
- import { measureLayoutPosition } from "../../utils/normalize-layout";
6
- import React, { useRef, useState } from "react";
7
- import {
8
- Keyboard,
9
- type LayoutRectangle,
10
- Platform,
11
- Pressable,
12
- ScrollView,
13
- type StyleProp,
14
- StyleSheet,
15
- Text,
16
- TextInput,
17
- View,
18
- type ViewStyle,
19
- } from "react-native";
20
- import { Portal } from "../portal";
21
- import type { PhoneInputState } from "./types";
22
- import { PhoneInputVariants } from "./variants";
23
-
24
- export interface PhoneInputProps {
25
- value?: string;
26
- onChange?: (value: string) => void;
27
- defaultCountry?: string;
28
- countries?: CountryData[];
29
- placeholder?: string;
30
- isDisabled?: boolean;
31
- variant?: keyof typeof PhoneInputVariants;
32
- style?: StyleProp<ViewStyle>;
33
- }
34
-
35
- const calculateState = (isDisabled: boolean, isFocused: boolean): PhoneInputState => {
36
- if (isDisabled) return "disabled";
37
- if (isFocused) return "focused";
38
- return "default";
39
- };
40
-
41
- export function PhoneInput({
42
- value,
43
- onChange,
44
- defaultCountry = "US",
45
- countries,
46
- placeholder,
47
- isDisabled = false,
48
- variant = "default",
49
- style,
50
- }: PhoneInputProps) {
51
- const variantStyles = PhoneInputVariants[variant]();
52
- const [isFocused, setIsFocused] = useState(false);
53
- const [isPickerOpen, setIsPickerOpen] = useState(false);
54
- const [searchQuery, setSearchQuery] = useState("");
55
- const [triggerPosition, setTriggerPosition] = useState<LayoutPosition>(DEFAULT_POSITION);
56
- const [contentLayout, setContentLayout] = useState<LayoutRectangle>(DEFAULT_LAYOUT);
57
- const triggerRef = useRef<ViewRef>(null);
58
-
59
- const state = calculateState(isDisabled, isFocused);
60
-
61
- const phoneMask = usePhoneMask({
62
- value,
63
- defaultCountry,
64
- onChange,
65
- countries,
66
- });
67
-
68
- const rootStyles = StyleSheet.flatten([variantStyles.root?.default, variantStyles.root?.[state], style]);
69
- const countryButtonStyles = StyleSheet.flatten([variantStyles.countryButton?.default, variantStyles.countryButton?.[state]]);
70
- const countryButtonTextStyles = StyleSheet.flatten([variantStyles.countryButtonText?.default, variantStyles.countryButtonText?.[state]]);
71
- const separatorStyles = StyleSheet.flatten([variantStyles.separator?.default, variantStyles.separator?.[state]]);
72
- const inputStyles = StyleSheet.flatten([variantStyles.input?.default, variantStyles.input?.[state]]);
73
-
74
- const openPicker = () => {
75
- if (isDisabled) return;
76
- if (Platform.OS !== "web") {
77
- Keyboard.dismiss();
78
- }
79
- measureLayoutPosition(triggerRef.current, (layout) => {
80
- setTriggerPosition(layout);
81
- setSearchQuery("");
82
- setIsPickerOpen(true);
83
- });
84
- };
85
-
86
- const closePicker = () => {
87
- setIsPickerOpen(false);
88
- setSearchQuery("");
89
- };
90
-
91
- const selectCountry = (country: CountryData) => {
92
- phoneMask.setCountry(country.code);
93
- closePicker();
94
- };
95
-
96
- const filteredCountries = searchQuery
97
- ? phoneMask.countries.filter((c) => c.name.toLowerCase().includes(searchQuery.toLowerCase()))
98
- : phoneMask.countries;
99
-
100
- return (
101
- <>
102
- <View ref={triggerRef} style={rootStyles}>
103
- <Pressable onPress={openPicker} disabled={isDisabled} style={countryButtonStyles}>
104
- <Text style={countryButtonTextStyles}>
105
- {phoneMask.country.flag} +{phoneMask.country.dialCode}
106
- </Text>
107
- </Pressable>
108
- <View style={separatorStyles} />
109
- <TextInput
110
- value={phoneMask.displayValue}
111
- onChangeText={phoneMask.onChangeText}
112
- keyboardType={phoneMask.keyboardType}
113
- placeholder={placeholder}
114
- placeholderTextColor={StyleSheet.flatten(variantStyles.countryButtonText?.disabled)?.color}
115
- readOnly={isDisabled}
116
- onFocus={() => setIsFocused(true)}
117
- onBlur={() => setIsFocused(false)}
118
- style={inputStyles}
119
- />
120
- </View>
121
-
122
- {isPickerOpen && (
123
- <CountryPicker
124
- countries={filteredCountries}
125
- selectedCode={phoneMask.country.code}
126
- searchQuery={searchQuery}
127
- onSearchChange={setSearchQuery}
128
- onSelect={selectCountry}
129
- onClose={closePicker}
130
- triggerPosition={triggerPosition}
131
- contentLayout={contentLayout}
132
- onContentLayout={setContentLayout}
133
- variantStyles={variantStyles}
134
- state={state}
135
- />
136
- )}
137
- </>
138
- );
139
- }
140
-
141
- interface CountryPickerProps {
142
- countries: CountryData[];
143
- selectedCode: string;
144
- searchQuery: string;
145
- onSearchChange: (query: string) => void;
146
- onSelect: (country: CountryData) => void;
147
- onClose: () => void;
148
- triggerPosition: LayoutPosition;
149
- contentLayout: LayoutRectangle;
150
- onContentLayout: (layout: LayoutRectangle) => void;
151
- variantStyles: ReturnType<(typeof PhoneInputVariants)["default"]>;
152
- state: PhoneInputState;
153
- }
154
-
155
- function CountryPicker({
156
- countries,
157
- selectedCode,
158
- searchQuery,
159
- onSearchChange,
160
- onSelect,
161
- onClose,
162
- triggerPosition,
163
- contentLayout,
164
- onContentLayout,
165
- variantStyles,
166
- state,
167
- }: CountryPickerProps) {
168
- const positionStyle = useRelativePosition({
169
- align: "start",
170
- triggerPosition,
171
- contentLayout,
172
- alignOffset: 0,
173
- preferredSide: "bottom",
174
- sideOffset: 4,
175
- });
176
-
177
- const overlayStyles = StyleSheet.flatten([variantStyles.pickerOverlay?.default, variantStyles.pickerOverlay?.[state]]);
178
- const contentStyles = StyleSheet.flatten([variantStyles.pickerContent?.default, variantStyles.pickerContent?.[state]]);
179
- const searchStyles = StyleSheet.flatten([variantStyles.pickerSearch?.default, variantStyles.pickerSearch?.[state]]);
180
-
181
- return (
182
- <Portal name="phone-input-country-picker">
183
- <Pressable onPress={onClose} style={[StyleSheet.absoluteFill, overlayStyles]} />
184
- <View
185
- style={[positionStyle, contentStyles, { width: triggerPosition.width }]}
186
- onLayout={(e) => onContentLayout(e.nativeEvent.layout)}
187
- pointerEvents="box-none"
188
- >
189
- <TextInput
190
- value={searchQuery}
191
- onChangeText={onSearchChange}
192
- placeholder="Search countries..."
193
- autoFocus
194
- style={searchStyles}
195
- />
196
- <ScrollView keyboardShouldPersistTaps="handled">
197
- {countries.map((country) => {
198
- const isSelected = country.code === selectedCode;
199
- const optionStyles = StyleSheet.flatten([
200
- variantStyles.pickerOption?.default,
201
- isSelected && variantStyles.pickerOption?.selected,
202
- ]);
203
- const optionTextStyles = StyleSheet.flatten([
204
- variantStyles.pickerOptionText?.default,
205
- isSelected && variantStyles.pickerOptionText?.selected,
206
- ]);
207
-
208
- return (
209
- <Pressable key={country.code} onPress={() => onSelect(country)} style={optionStyles}>
210
- <Text style={optionTextStyles}>
211
- {country.flag} {country.name} +{country.dialCode}
212
- </Text>
213
- </Pressable>
214
- );
215
- })}
216
- </ScrollView>
217
- </View>
218
- </Portal>
219
- );
220
- }