@yahoo/uds-mobile 2.23.3 → 2.24.0-beta.10

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 (298) hide show
  1. package/README.md +41 -13
  2. package/dist/bin/automated-config/dist/generated/generatedConfigs.mjs +92 -46
  3. package/dist/components/Avatar/AvatarIcon.cjs +8 -2
  4. package/dist/components/Avatar/AvatarIcon.d.cts.map +1 -1
  5. package/dist/components/Avatar/AvatarIcon.d.ts.map +1 -1
  6. package/dist/components/Avatar/AvatarIcon.js +9 -3
  7. package/dist/components/Avatar/AvatarIcon.js.map +1 -1
  8. package/dist/components/Avatar/AvatarImage.cjs +9 -2
  9. package/dist/components/Avatar/AvatarImage.d.cts.map +1 -1
  10. package/dist/components/Avatar/AvatarImage.d.ts.map +1 -1
  11. package/dist/components/Avatar/AvatarImage.js +10 -3
  12. package/dist/components/Avatar/AvatarImage.js.map +1 -1
  13. package/dist/components/Avatar/AvatarText.cjs +8 -2
  14. package/dist/components/Avatar/AvatarText.d.cts.map +1 -1
  15. package/dist/components/Avatar/AvatarText.d.ts.map +1 -1
  16. package/dist/components/Avatar/AvatarText.js +9 -3
  17. package/dist/components/Avatar/AvatarText.js.map +1 -1
  18. package/dist/components/Avatar/types.d.cts +7 -3
  19. package/dist/components/Avatar/types.d.cts.map +1 -1
  20. package/dist/components/Avatar/types.d.ts +7 -3
  21. package/dist/components/Avatar/types.d.ts.map +1 -1
  22. package/dist/components/Avatar/useAvatarFontScale.cjs +16 -0
  23. package/dist/components/Avatar/useAvatarFontScale.d.cts +7 -0
  24. package/dist/components/Avatar/useAvatarFontScale.d.cts.map +1 -0
  25. package/dist/components/Avatar/useAvatarFontScale.d.ts +7 -0
  26. package/dist/components/Avatar/useAvatarFontScale.d.ts.map +1 -0
  27. package/dist/components/Avatar/useAvatarFontScale.js +16 -0
  28. package/dist/components/Avatar/useAvatarFontScale.js.map +1 -0
  29. package/dist/components/Avatar/utils.cjs +9 -6
  30. package/dist/components/Avatar/utils.d.cts +2 -2
  31. package/dist/components/Avatar/utils.d.cts.map +1 -1
  32. package/dist/components/Avatar/utils.d.ts +2 -2
  33. package/dist/components/Avatar/utils.d.ts.map +1 -1
  34. package/dist/components/Avatar/utils.js +9 -6
  35. package/dist/components/Avatar/utils.js.map +1 -1
  36. package/dist/components/BottomSheet/BottomSheet.cjs +1 -1
  37. package/dist/components/BottomSheet/BottomSheet.js +1 -1
  38. package/dist/components/Button/buttonTheme.cjs +31 -9
  39. package/dist/components/Button/buttonTheme.d.cts +24 -5
  40. package/dist/components/Button/buttonTheme.d.cts.map +1 -1
  41. package/dist/components/Button/buttonTheme.d.ts +24 -5
  42. package/dist/components/Button/buttonTheme.d.ts.map +1 -1
  43. package/dist/components/Button/buttonTheme.js +31 -10
  44. package/dist/components/Button/buttonTheme.js.map +1 -1
  45. package/dist/components/Button.cjs +35 -8
  46. package/dist/components/Button.d.cts +7 -0
  47. package/dist/components/Button.d.cts.map +1 -1
  48. package/dist/components/Button.d.ts +7 -0
  49. package/dist/components/Button.d.ts.map +1 -1
  50. package/dist/components/Button.js +35 -8
  51. package/dist/components/Button.js.map +1 -1
  52. package/dist/components/Checkbox.cjs +42 -9
  53. package/dist/components/Checkbox.d.cts +7 -0
  54. package/dist/components/Checkbox.d.cts.map +1 -1
  55. package/dist/components/Checkbox.d.ts +7 -0
  56. package/dist/components/Checkbox.d.ts.map +1 -1
  57. package/dist/components/Checkbox.js +42 -9
  58. package/dist/components/Checkbox.js.map +1 -1
  59. package/dist/components/Chip/ChipBase.cjs +31 -14
  60. package/dist/components/Chip/ChipBase.d.cts.map +1 -1
  61. package/dist/components/Chip/ChipBase.d.ts.map +1 -1
  62. package/dist/components/Chip/ChipBase.js +31 -14
  63. package/dist/components/Chip/ChipBase.js.map +1 -1
  64. package/dist/components/Chip/ChipDismissible.cjs +3 -1
  65. package/dist/components/Chip/ChipDismissible.js +3 -1
  66. package/dist/components/Chip/ChipDismissible.js.map +1 -1
  67. package/dist/components/Chip/types.d.cts +7 -0
  68. package/dist/components/Chip/types.d.cts.map +1 -1
  69. package/dist/components/Chip/types.d.ts +7 -0
  70. package/dist/components/Chip/types.d.ts.map +1 -1
  71. package/dist/components/Icon.cjs +24 -5
  72. package/dist/components/Icon.d.cts +11 -2
  73. package/dist/components/Icon.d.cts.map +1 -1
  74. package/dist/components/Icon.d.ts +11 -2
  75. package/dist/components/Icon.d.ts.map +1 -1
  76. package/dist/components/Icon.js +24 -5
  77. package/dist/components/Icon.js.map +1 -1
  78. package/dist/components/IconButton.cjs +17 -6
  79. package/dist/components/IconButton.d.cts +6 -0
  80. package/dist/components/IconButton.d.cts.map +1 -1
  81. package/dist/components/IconButton.d.ts +6 -0
  82. package/dist/components/IconButton.d.ts.map +1 -1
  83. package/dist/components/IconButton.js +18 -7
  84. package/dist/components/IconButton.js.map +1 -1
  85. package/dist/components/Input.cjs +56 -18
  86. package/dist/components/Input.d.cts +5 -0
  87. package/dist/components/Input.d.cts.map +1 -1
  88. package/dist/components/Input.d.ts +5 -0
  89. package/dist/components/Input.d.ts.map +1 -1
  90. package/dist/components/Input.js +56 -18
  91. package/dist/components/Input.js.map +1 -1
  92. package/dist/components/InputHelpText.cjs +7 -1
  93. package/dist/components/InputHelpText.d.cts +2 -0
  94. package/dist/components/InputHelpText.d.cts.map +1 -1
  95. package/dist/components/InputHelpText.d.ts +2 -0
  96. package/dist/components/InputHelpText.d.ts.map +1 -1
  97. package/dist/components/InputHelpText.js +7 -1
  98. package/dist/components/InputHelpText.js.map +1 -1
  99. package/dist/components/Link.cjs +13 -1
  100. package/dist/components/Link.d.cts +7 -0
  101. package/dist/components/Link.d.cts.map +1 -1
  102. package/dist/components/Link.d.ts +7 -0
  103. package/dist/components/Link.d.ts.map +1 -1
  104. package/dist/components/Link.js +13 -1
  105. package/dist/components/Link.js.map +1 -1
  106. package/dist/components/Pagination/Pagination.cjs +18 -10
  107. package/dist/components/Pagination/Pagination.d.cts +2 -0
  108. package/dist/components/Pagination/Pagination.d.cts.map +1 -1
  109. package/dist/components/Pagination/Pagination.d.ts +2 -0
  110. package/dist/components/Pagination/Pagination.d.ts.map +1 -1
  111. package/dist/components/Pagination/Pagination.js +18 -10
  112. package/dist/components/Pagination/Pagination.js.map +1 -1
  113. package/dist/components/Pagination/PaginationEllipsis.cjs +8 -2
  114. package/dist/components/Pagination/PaginationEllipsis.d.cts.map +1 -1
  115. package/dist/components/Pagination/PaginationEllipsis.d.ts.map +1 -1
  116. package/dist/components/Pagination/PaginationEllipsis.js +9 -3
  117. package/dist/components/Pagination/PaginationEllipsis.js.map +1 -1
  118. package/dist/components/Pagination/PaginationItem.cjs +2 -1
  119. package/dist/components/Pagination/PaginationItem.js +2 -1
  120. package/dist/components/Pagination/PaginationItem.js.map +1 -1
  121. package/dist/components/Pagination/PaginationLink.cjs +2 -1
  122. package/dist/components/Pagination/PaginationLink.js +2 -1
  123. package/dist/components/Pagination/PaginationLink.js.map +1 -1
  124. package/dist/components/Pagination/PaginationNext.cjs +3 -1
  125. package/dist/components/Pagination/PaginationNext.js +3 -1
  126. package/dist/components/Pagination/PaginationNext.js.map +1 -1
  127. package/dist/components/Pagination/PaginationPrev.cjs +3 -1
  128. package/dist/components/Pagination/PaginationPrev.js +3 -1
  129. package/dist/components/Pagination/PaginationPrev.js.map +1 -1
  130. package/dist/components/Pagination/paginationContext.d.cts +2 -0
  131. package/dist/components/Pagination/paginationContext.d.cts.map +1 -1
  132. package/dist/components/Pagination/paginationContext.d.ts +2 -0
  133. package/dist/components/Pagination/paginationContext.d.ts.map +1 -1
  134. package/dist/components/Pagination/paginationContext.js.map +1 -1
  135. package/dist/components/Pagination/usePaginationControlStyles.cjs +8 -1
  136. package/dist/components/Pagination/usePaginationControlStyles.d.cts.map +1 -1
  137. package/dist/components/Pagination/usePaginationControlStyles.d.ts.map +1 -1
  138. package/dist/components/Pagination/usePaginationControlStyles.js +9 -2
  139. package/dist/components/Pagination/usePaginationControlStyles.js.map +1 -1
  140. package/dist/components/Radio/Radio.cjs +30 -11
  141. package/dist/components/Radio/Radio.d.cts +7 -0
  142. package/dist/components/Radio/Radio.d.cts.map +1 -1
  143. package/dist/components/Radio/Radio.d.ts +7 -0
  144. package/dist/components/Radio/Radio.d.ts.map +1 -1
  145. package/dist/components/Radio/Radio.js +30 -11
  146. package/dist/components/Radio/Radio.js.map +1 -1
  147. package/dist/components/Select/Select.cjs +29 -6
  148. package/dist/components/Select/Select.d.cts +2 -0
  149. package/dist/components/Select/Select.d.cts.map +1 -1
  150. package/dist/components/Select/Select.d.ts +2 -0
  151. package/dist/components/Select/Select.d.ts.map +1 -1
  152. package/dist/components/Select/Select.js +29 -6
  153. package/dist/components/Select/Select.js.map +1 -1
  154. package/dist/components/Select/SelectContent.cjs +31 -23
  155. package/dist/components/Select/SelectContent.d.cts.map +1 -1
  156. package/dist/components/Select/SelectContent.d.ts.map +1 -1
  157. package/dist/components/Select/SelectContent.js +32 -24
  158. package/dist/components/Select/SelectContent.js.map +1 -1
  159. package/dist/components/Select/SelectItem.cjs +25 -15
  160. package/dist/components/Select/SelectItem.d.cts.map +1 -1
  161. package/dist/components/Select/SelectItem.d.ts.map +1 -1
  162. package/dist/components/Select/SelectItem.js +25 -15
  163. package/dist/components/Select/SelectItem.js.map +1 -1
  164. package/dist/components/Select/SelectTrigger.cjs +27 -13
  165. package/dist/components/Select/SelectTrigger.d.cts.map +1 -1
  166. package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
  167. package/dist/components/Select/SelectTrigger.js +27 -13
  168. package/dist/components/Select/SelectTrigger.js.map +1 -1
  169. package/dist/components/Select/types.d.cts +2 -0
  170. package/dist/components/Select/types.d.cts.map +1 -1
  171. package/dist/components/Select/types.d.ts +2 -0
  172. package/dist/components/Select/types.d.ts.map +1 -1
  173. package/dist/components/Switch.cjs +48 -8
  174. package/dist/components/Switch.d.cts +7 -0
  175. package/dist/components/Switch.d.cts.map +1 -1
  176. package/dist/components/Switch.d.ts +7 -0
  177. package/dist/components/Switch.d.ts.map +1 -1
  178. package/dist/components/Switch.js +48 -8
  179. package/dist/components/Switch.js.map +1 -1
  180. package/dist/components/Tabs/Tab.cjs +17 -3
  181. package/dist/components/Tabs/Tab.d.cts.map +1 -1
  182. package/dist/components/Tabs/Tab.d.ts.map +1 -1
  183. package/dist/components/Tabs/Tab.js +17 -3
  184. package/dist/components/Tabs/Tab.js.map +1 -1
  185. package/dist/components/Tabs/Tabs.cjs +8 -3
  186. package/dist/components/Tabs/Tabs.d.cts +9 -1
  187. package/dist/components/Tabs/Tabs.d.cts.map +1 -1
  188. package/dist/components/Tabs/Tabs.d.ts +9 -1
  189. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  190. package/dist/components/Tabs/Tabs.js +8 -3
  191. package/dist/components/Tabs/Tabs.js.map +1 -1
  192. package/dist/components/Tabs/tabsContexts.d.cts +2 -0
  193. package/dist/components/Tabs/tabsContexts.d.cts.map +1 -1
  194. package/dist/components/Tabs/tabsContexts.d.ts +2 -0
  195. package/dist/components/Tabs/tabsContexts.d.ts.map +1 -1
  196. package/dist/components/Tabs/tabsContexts.js.map +1 -1
  197. package/dist/components/Text.cjs +9 -1
  198. package/dist/components/Text.d.cts +11 -2
  199. package/dist/components/Text.d.cts.map +1 -1
  200. package/dist/components/Text.d.ts +11 -2
  201. package/dist/components/Text.d.ts.map +1 -1
  202. package/dist/components/Text.js +9 -1
  203. package/dist/components/Text.js.map +1 -1
  204. package/dist/components/UDSProvider.cjs +6 -2
  205. package/dist/components/UDSProvider.d.cts +9 -0
  206. package/dist/components/UDSProvider.d.cts.map +1 -1
  207. package/dist/components/UDSProvider.d.ts +9 -0
  208. package/dist/components/UDSProvider.d.ts.map +1 -1
  209. package/dist/components/UDSProvider.js +6 -2
  210. package/dist/components/UDSProvider.js.map +1 -1
  211. package/dist/components/internal/Overlay/index.cjs +1 -1
  212. package/dist/components/internal/Overlay/index.js +1 -1
  213. package/dist/fontScaling/FontScalingContext.cjs +67 -0
  214. package/dist/fontScaling/FontScalingContext.d.cts +53 -0
  215. package/dist/fontScaling/FontScalingContext.d.cts.map +1 -0
  216. package/dist/fontScaling/FontScalingContext.d.ts +53 -0
  217. package/dist/fontScaling/FontScalingContext.d.ts.map +1 -0
  218. package/dist/fontScaling/FontScalingContext.js +63 -0
  219. package/dist/fontScaling/FontScalingContext.js.map +1 -0
  220. package/dist/fontScaling/androidNonlinearFontScaling.cjs +250 -0
  221. package/dist/fontScaling/androidNonlinearFontScaling.d.cts +7 -0
  222. package/dist/fontScaling/androidNonlinearFontScaling.d.cts.map +1 -0
  223. package/dist/fontScaling/androidNonlinearFontScaling.d.ts +7 -0
  224. package/dist/fontScaling/androidNonlinearFontScaling.d.ts.map +1 -0
  225. package/dist/fontScaling/androidNonlinearFontScaling.js +251 -0
  226. package/dist/fontScaling/androidNonlinearFontScaling.js.map +1 -0
  227. package/dist/fontScaling/constants.cjs +106 -0
  228. package/dist/fontScaling/constants.d.cts +60 -0
  229. package/dist/fontScaling/constants.d.cts.map +1 -0
  230. package/dist/fontScaling/constants.d.ts +60 -0
  231. package/dist/fontScaling/constants.d.ts.map +1 -0
  232. package/dist/fontScaling/constants.js +103 -0
  233. package/dist/fontScaling/constants.js.map +1 -0
  234. package/dist/fontScaling/index.cjs +14 -0
  235. package/dist/fontScaling/index.d.cts +8 -0
  236. package/dist/fontScaling/index.d.ts +8 -0
  237. package/dist/fontScaling/index.js +6 -0
  238. package/dist/fontScaling/resolveMaxFontSizeMultiplier.cjs +37 -0
  239. package/dist/fontScaling/resolveMaxFontSizeMultiplier.d.cts +35 -0
  240. package/dist/fontScaling/resolveMaxFontSizeMultiplier.d.cts.map +1 -0
  241. package/dist/fontScaling/resolveMaxFontSizeMultiplier.d.ts +35 -0
  242. package/dist/fontScaling/resolveMaxFontSizeMultiplier.d.ts.map +1 -0
  243. package/dist/fontScaling/resolveMaxFontSizeMultiplier.js +38 -0
  244. package/dist/fontScaling/resolveMaxFontSizeMultiplier.js.map +1 -0
  245. package/dist/fontScaling/types.cjs +1 -0
  246. package/dist/fontScaling/types.d.cts +54 -0
  247. package/dist/fontScaling/types.d.cts.map +1 -0
  248. package/dist/fontScaling/types.d.ts +54 -0
  249. package/dist/fontScaling/types.d.ts.map +1 -0
  250. package/dist/fontScaling/types.js +1 -0
  251. package/dist/fontScaling/useFontScale.cjs +58 -0
  252. package/dist/fontScaling/useFontScale.d.cts +12 -0
  253. package/dist/fontScaling/useFontScale.d.cts.map +1 -0
  254. package/dist/fontScaling/useFontScale.d.ts +12 -0
  255. package/dist/fontScaling/useFontScale.d.ts.map +1 -0
  256. package/dist/fontScaling/useFontScale.js +57 -0
  257. package/dist/fontScaling/useFontScale.js.map +1 -0
  258. package/dist/fontScaling/useMaxFontSizeMultiplier.cjs +24 -0
  259. package/dist/fontScaling/useMaxFontSizeMultiplier.d.cts +16 -0
  260. package/dist/fontScaling/useMaxFontSizeMultiplier.d.cts.map +1 -0
  261. package/dist/fontScaling/useMaxFontSizeMultiplier.d.ts +16 -0
  262. package/dist/fontScaling/useMaxFontSizeMultiplier.d.ts.map +1 -0
  263. package/dist/fontScaling/useMaxFontSizeMultiplier.js +24 -0
  264. package/dist/fontScaling/useMaxFontSizeMultiplier.js.map +1 -0
  265. package/dist/jest/mocks/react-native.cjs +19 -4
  266. package/dist/jest/mocks/react-native.d.cts +8 -5
  267. package/dist/jest/mocks/react-native.d.cts.map +1 -1
  268. package/dist/jest/mocks/react-native.d.ts +8 -5
  269. package/dist/jest/mocks/react-native.d.ts.map +1 -1
  270. package/dist/jest/mocks/react-native.js +18 -5
  271. package/dist/jest/mocks/react-native.js.map +1 -1
  272. package/dist/jest/mocks/styles.cjs +28 -1
  273. package/dist/jest/mocks/styles.d.cts.map +1 -1
  274. package/dist/jest/mocks/styles.d.ts.map +1 -1
  275. package/dist/jest/mocks/styles.js +28 -1
  276. package/dist/jest/mocks/styles.js.map +1 -1
  277. package/dist/jest/setup.cjs +4 -0
  278. package/dist/jest/setup.d.cts.map +1 -1
  279. package/dist/jest/setup.d.ts.map +1 -1
  280. package/dist/jest/setup.js +4 -0
  281. package/dist/jest/setup.js.map +1 -1
  282. package/dist/mobile/generated/fontMetrics.cjs +530 -530
  283. package/dist/mobile/generated/fontMetrics.js +530 -530
  284. package/dist/mobile/generated/fontMetrics.js.map +1 -1
  285. package/dist/portal.cjs +8 -2
  286. package/dist/portal.d.cts.map +1 -1
  287. package/dist/portal.d.ts.map +1 -1
  288. package/dist/portal.js +8 -2
  289. package/dist/portal.js.map +1 -1
  290. package/dist/types/dist/index.d.cts.map +1 -1
  291. package/dist/types/dist/index.d.ts.map +1 -1
  292. package/fonts/index.cjs +214 -214
  293. package/fonts/index.mjs +214 -214
  294. package/fonts/uds-icons.ttf +0 -0
  295. package/generated/fontMetrics.ts +530 -530
  296. package/generated/styles.d.ts +5 -28
  297. package/generated/unistyles.d.ts +0 -27
  298. package/package.json +11 -1
@@ -0,0 +1,63 @@
1
+ /*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
2
+ import { createContext, memo, useContext, useMemo } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/fontScaling/FontScalingContext.tsx
5
+ const FontScalingContext = createContext(void 0);
6
+ /** Whether UDS-added caps, ramps, and scale-aware geometry are enabled. */
7
+ function useFontScalingEnabled() {
8
+ return useContext(FontScalingContext)?.enabled !== false;
9
+ }
10
+ /** Whether Text should supply its variant's default iOS Dynamic Type ramp. */
11
+ function useDynamicTypeRampEnabled() {
12
+ const config = useContext(FontScalingContext);
13
+ return config?.enabled !== false && config?.disableDynamicTypeRamp !== true;
14
+ }
15
+ /**
16
+ * **🔠 Overrides UDS font-scaling caps for a subtree**
17
+ *
18
+ * @description
19
+ * Configures how UDS text and controls respond to the OS text-size setting.
20
+ * Without a provider, built-in defaults apply (every text style is capped at
21
+ * 2x or below, with the largest display/title tiers tapered further, and
22
+ * control internals capped at 2x). Most apps set this once at the root via the
23
+ * `fontScaling` prop on `UDSGestureProvider`.
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * const FONT_SCALING = { default: 2, variants: { display1: 1.75 } };
28
+ *
29
+ * <UDSFontScalingProvider config={FONT_SCALING}>
30
+ * <App />
31
+ * </UDSFontScalingProvider>
32
+ * ```
33
+ */
34
+ const UDSFontScalingProvider = memo(function UDSFontScalingProvider({ config, children }) {
35
+ return /* @__PURE__ */ jsx(FontScalingContext.Provider, {
36
+ value: config,
37
+ children
38
+ });
39
+ });
40
+ UDSFontScalingProvider.displayName = "UDSFontScalingProvider";
41
+ /** Keeps custom UDS content inside a control on the control's resolved cap. */
42
+ const ResolvedControlFontScalingProvider = memo(function ResolvedControlFontScalingProvider({ maxFontSizeMultiplier, children }) {
43
+ const parentConfig = useContext(FontScalingContext);
44
+ const cap = maxFontSizeMultiplier === 0 ? null : maxFontSizeMultiplier;
45
+ const config = useMemo(() => parentConfig?.enabled === false && maxFontSizeMultiplier === void 0 ? { enabled: false } : {
46
+ default: cap,
47
+ control: cap,
48
+ disableDynamicTypeRamp: true
49
+ }, [
50
+ cap,
51
+ maxFontSizeMultiplier,
52
+ parentConfig?.enabled
53
+ ]);
54
+ return /* @__PURE__ */ jsx(FontScalingContext.Provider, {
55
+ value: config,
56
+ children
57
+ });
58
+ });
59
+ ResolvedControlFontScalingProvider.displayName = "ResolvedControlFontScalingProvider";
60
+ //#endregion
61
+ export { FontScalingContext, ResolvedControlFontScalingProvider, UDSFontScalingProvider, useDynamicTypeRampEnabled, useFontScalingEnabled };
62
+
63
+ //# sourceMappingURL=FontScalingContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontScalingContext.js","names":[],"sources":["../../src/fontScaling/FontScalingContext.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { createContext, memo, useContext, useMemo } from 'react';\n\nimport type { FontScalingConfig } from './types';\n\ninterface FontScalingContextValue extends FontScalingConfig {\n /** Internal: bounded controls use the global curve for text, icons, and geometry. */\n disableDynamicTypeRamp?: boolean;\n}\n\n// undefined = no provider mounted; built-in defaults apply.\nconst FontScalingContext = createContext<FontScalingContextValue | undefined>(undefined);\n\n/** Whether UDS-added caps, ramps, and scale-aware geometry are enabled. */\nfunction useFontScalingEnabled(): boolean {\n return useContext(FontScalingContext)?.enabled !== false;\n}\n\n/** Whether Text should supply its variant's default iOS Dynamic Type ramp. */\nfunction useDynamicTypeRampEnabled(): boolean {\n const config = useContext(FontScalingContext);\n return config?.enabled !== false && config?.disableDynamicTypeRamp !== true;\n}\n\ninterface UDSFontScalingProviderProps {\n /**\n * Font-scaling caps for the subtree. Should be identity-stable (a module\n * constant or memoized) — every UDS text element reads it from context.\n * The nearest provider wins wholesale; configs are not merged.\n */\n config: FontScalingConfig;\n children: ReactNode;\n}\n\n/**\n * **🔠 Overrides UDS font-scaling caps for a subtree**\n *\n * @description\n * Configures how UDS text and controls respond to the OS text-size setting.\n * Without a provider, built-in defaults apply (every text style is capped at\n * 2x or below, with the largest display/title tiers tapered further, and\n * control internals capped at 2x). Most apps set this once at the root via the\n * `fontScaling` prop on `UDSGestureProvider`.\n *\n * @example\n * ```tsx\n * const FONT_SCALING = { default: 2, variants: { display1: 1.75 } };\n *\n * <UDSFontScalingProvider config={FONT_SCALING}>\n * <App />\n * </UDSFontScalingProvider>\n * ```\n */\nconst UDSFontScalingProvider = memo(function UDSFontScalingProvider({\n config,\n children,\n}: UDSFontScalingProviderProps) {\n return <FontScalingContext.Provider value={config}>{children}</FontScalingContext.Provider>;\n});\n\nUDSFontScalingProvider.displayName = 'UDSFontScalingProvider';\n\ninterface ResolvedControlFontScalingProviderProps {\n maxFontSizeMultiplier?: number;\n children: ReactNode;\n}\n\n/** Keeps custom UDS content inside a control on the control's resolved cap. */\nconst ResolvedControlFontScalingProvider = memo(function ResolvedControlFontScalingProvider({\n maxFontSizeMultiplier,\n children,\n}: ResolvedControlFontScalingProviderProps) {\n const parentConfig = useContext(FontScalingContext);\n const cap = maxFontSizeMultiplier === 0 ? null : maxFontSizeMultiplier;\n const config = useMemo<FontScalingContextValue>(\n () =>\n parentConfig?.enabled === false && maxFontSizeMultiplier === undefined\n ? { enabled: false }\n : { default: cap, control: cap, disableDynamicTypeRamp: true },\n [cap, maxFontSizeMultiplier, parentConfig?.enabled],\n );\n\n return <FontScalingContext.Provider value={config}>{children}</FontScalingContext.Provider>;\n});\n\nResolvedControlFontScalingProvider.displayName = 'ResolvedControlFontScalingProvider';\n\nexport {\n FontScalingContext,\n ResolvedControlFontScalingProvider,\n UDSFontScalingProvider,\n useDynamicTypeRampEnabled,\n useFontScalingEnabled,\n};\nexport type { UDSFontScalingProviderProps };\n"],"mappings":";;;;AAWA,MAAM,qBAAqB,cAAmD,KAAA,EAAU;;AAGxF,SAAS,wBAAiC;CACxC,OAAO,WAAW,mBAAmB,EAAE,YAAY;;;AAIrD,SAAS,4BAAqC;CAC5C,MAAM,SAAS,WAAW,mBAAmB;CAC7C,OAAO,QAAQ,YAAY,SAAS,QAAQ,2BAA2B;;;;;;;;;;;;;;;;;;;;;AAgCzE,MAAM,yBAAyB,KAAK,SAAS,uBAAuB,EAClE,QACA,YAC8B;CAC9B,OAAO,oBAAC,mBAAmB,UAApB;EAA6B,OAAO;EAAS;EAAuC,CAAA;EAC3F;AAEF,uBAAuB,cAAc;;AAQrC,MAAM,qCAAqC,KAAK,SAAS,mCAAmC,EAC1F,uBACA,YAC0C;CAC1C,MAAM,eAAe,WAAW,mBAAmB;CACnD,MAAM,MAAM,0BAA0B,IAAI,OAAO;CACjD,MAAM,SAAS,cAEX,cAAc,YAAY,SAAS,0BAA0B,KAAA,IACzD,EAAE,SAAS,OAAO,GAClB;EAAE,SAAS;EAAK,SAAS;EAAK,wBAAwB;EAAM,EAClE;EAAC;EAAK;EAAuB,cAAc;EAAQ,CACpD;CAED,OAAO,oBAAC,mBAAmB,UAApB;EAA6B,OAAO;EAAS;EAAuC,CAAA;EAC3F;AAEF,mCAAmC,cAAc"}
@@ -0,0 +1,250 @@
1
+ /*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ //#region src/fontScaling/androidNonlinearFontScaling.ts
4
+ /**
5
+ * Android 14+ converts SP through a size-dependent curve. `Configuration.fontScale`
6
+ * is only the user's preference; multiplying by it directly does not reproduce the
7
+ * size that native Text renders.
8
+ *
9
+ * These lookup tables mirror Android's `FontScaleConverterFactory`. Android 14
10
+ * shipped fewer preference curves than Android 15+, so callers must provide the
11
+ * platform version to select the same table native Text uses. Values between
12
+ * table entries are linearly interpolated, as they are in the platform implementation.
13
+ *
14
+ * @see https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/content/res/FontScaleConverterFactory.java
15
+ * @see https://android.googlesource.com/platform/prebuilts/fullsdk/sources/+/refs/heads/androidx-compose-integration-release/android-34/android/content/res/FontScaleConverterFactory.java
16
+ */
17
+ const COMMON_SP_SIZES = [
18
+ 8,
19
+ 10,
20
+ 12,
21
+ 14,
22
+ 18,
23
+ 20,
24
+ 24,
25
+ 30,
26
+ 100
27
+ ];
28
+ const ANDROID_14_FONT_SCALE_CURVES = [
29
+ {
30
+ scale: 1.15,
31
+ dp: [
32
+ 9.2,
33
+ 11.5,
34
+ 13.8,
35
+ 16.4,
36
+ 19.8,
37
+ 21.8,
38
+ 25.2,
39
+ 30,
40
+ 100
41
+ ]
42
+ },
43
+ {
44
+ scale: 1.3,
45
+ dp: [
46
+ 10.4,
47
+ 13,
48
+ 15.6,
49
+ 18.8,
50
+ 21.6,
51
+ 23.6,
52
+ 26.4,
53
+ 30,
54
+ 100
55
+ ]
56
+ },
57
+ {
58
+ scale: 1.5,
59
+ dp: [
60
+ 12,
61
+ 15,
62
+ 18,
63
+ 22,
64
+ 24,
65
+ 26,
66
+ 28,
67
+ 30,
68
+ 100
69
+ ]
70
+ },
71
+ {
72
+ scale: 1.8,
73
+ dp: [
74
+ 14.4,
75
+ 18,
76
+ 21.6,
77
+ 24.4,
78
+ 27.6,
79
+ 30.8,
80
+ 32.8,
81
+ 34.8,
82
+ 100
83
+ ]
84
+ },
85
+ {
86
+ scale: 2,
87
+ dp: [
88
+ 16,
89
+ 20,
90
+ 24,
91
+ 26,
92
+ 30,
93
+ 34,
94
+ 36,
95
+ 38,
96
+ 100
97
+ ]
98
+ }
99
+ ];
100
+ const ANDROID_15_FONT_SCALE_CURVES = [
101
+ {
102
+ scale: 1.05,
103
+ dp: [
104
+ 8.4,
105
+ 10.5,
106
+ 12.6,
107
+ 14.8,
108
+ 18.6,
109
+ 20.6,
110
+ 24.4,
111
+ 30,
112
+ 100
113
+ ]
114
+ },
115
+ {
116
+ scale: 1.1,
117
+ dp: [
118
+ 8.8,
119
+ 11,
120
+ 13.2,
121
+ 15.6,
122
+ 19.2,
123
+ 21.2,
124
+ 24.8,
125
+ 30,
126
+ 100
127
+ ]
128
+ },
129
+ {
130
+ scale: 1.15,
131
+ dp: [
132
+ 9.2,
133
+ 11.5,
134
+ 13.8,
135
+ 16.4,
136
+ 19.8,
137
+ 21.8,
138
+ 25.2,
139
+ 30,
140
+ 100
141
+ ]
142
+ },
143
+ {
144
+ scale: 1.2,
145
+ dp: [
146
+ 9.6,
147
+ 12,
148
+ 14.4,
149
+ 17.2,
150
+ 20.4,
151
+ 22.4,
152
+ 25.6,
153
+ 30,
154
+ 100
155
+ ]
156
+ },
157
+ {
158
+ scale: 1.3,
159
+ dp: [
160
+ 10.4,
161
+ 13,
162
+ 15.6,
163
+ 18.8,
164
+ 21.6,
165
+ 23.6,
166
+ 26.4,
167
+ 30,
168
+ 100
169
+ ]
170
+ },
171
+ {
172
+ scale: 1.5,
173
+ dp: [
174
+ 12,
175
+ 15,
176
+ 18,
177
+ 22,
178
+ 24,
179
+ 26,
180
+ 28,
181
+ 30,
182
+ 100
183
+ ]
184
+ },
185
+ {
186
+ scale: 1.8,
187
+ dp: [
188
+ 14.4,
189
+ 18,
190
+ 21.6,
191
+ 24.4,
192
+ 27.6,
193
+ 30.8,
194
+ 32.8,
195
+ 34.8,
196
+ 100
197
+ ]
198
+ },
199
+ {
200
+ scale: 2,
201
+ dp: [
202
+ 16,
203
+ 20,
204
+ 24,
205
+ 26,
206
+ 30,
207
+ 34,
208
+ 36,
209
+ 38,
210
+ 100
211
+ ]
212
+ }
213
+ ];
214
+ function lerp(start, end, amount) {
215
+ return start + (end - start) * amount;
216
+ }
217
+ function interpolateSize(fontSize, dpValues) {
218
+ if (fontSize <= 0) return fontSize;
219
+ for (let index = 0; index < COMMON_SP_SIZES.length; index += 1) {
220
+ const currentSp = COMMON_SP_SIZES[index];
221
+ if (fontSize === currentSp) return dpValues[index];
222
+ if (fontSize < currentSp) {
223
+ const previousSp = index === 0 ? 0 : COMMON_SP_SIZES[index - 1];
224
+ const previousDp = index === 0 ? 0 : dpValues[index - 1];
225
+ const amount = (fontSize - previousSp) / (currentSp - previousSp);
226
+ return lerp(previousDp, dpValues[index], amount);
227
+ }
228
+ }
229
+ const lastIndex = COMMON_SP_SIZES.length - 1;
230
+ return fontSize * (dpValues[lastIndex] / COMMON_SP_SIZES[lastIndex]);
231
+ }
232
+ /** Converts an SP value to the nonlinear DP size used by this Android API level. */
233
+ function convertAndroidSpToDp(fontSize, fontScale, platformVersion = 35) {
234
+ const curves = platformVersion === 34 ? ANDROID_14_FONT_SCALE_CURVES : ANDROID_15_FONT_SCALE_CURVES;
235
+ const firstCurve = curves[0];
236
+ const lastCurve = curves[curves.length - 1];
237
+ if (fontScale < firstCurve.scale || fontScale > lastCurve.scale) return fontSize * fontScale;
238
+ for (let index = 0; index < curves.length; index += 1) {
239
+ const curve = curves[index];
240
+ if (fontScale === curve.scale) return interpolateSize(fontSize, curve.dp);
241
+ if (fontScale < curve.scale) {
242
+ const previousCurve = curves[index - 1];
243
+ const amount = (fontScale - previousCurve.scale) / (curve.scale - previousCurve.scale);
244
+ return lerp(interpolateSize(fontSize, previousCurve.dp), interpolateSize(fontSize, curve.dp), amount);
245
+ }
246
+ }
247
+ return fontSize * fontScale;
248
+ }
249
+ //#endregion
250
+ exports.convertAndroidSpToDp = convertAndroidSpToDp;
@@ -0,0 +1,7 @@
1
+
2
+ //#region src/fontScaling/androidNonlinearFontScaling.d.ts
3
+ /** Converts an SP value to the nonlinear DP size used by this Android API level. */
4
+ declare function convertAndroidSpToDp(fontSize: number, fontScale: number, platformVersion?: number): number;
5
+ //#endregion
6
+ export { convertAndroidSpToDp };
7
+ //# sourceMappingURL=androidNonlinearFontScaling.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"androidNonlinearFontScaling.d.cts","names":[],"sources":["../../src/fontScaling/androidNonlinearFontScaling.ts"],"mappings":";;;iBA8DS,oBAAA,CACP,QAAA,UACA,SAAA,UACA,eAAA"}
@@ -0,0 +1,7 @@
1
+
2
+ //#region src/fontScaling/androidNonlinearFontScaling.d.ts
3
+ /** Converts an SP value to the nonlinear DP size used by this Android API level. */
4
+ declare function convertAndroidSpToDp(fontSize: number, fontScale: number, platformVersion?: number): number;
5
+ //#endregion
6
+ export { convertAndroidSpToDp };
7
+ //# sourceMappingURL=androidNonlinearFontScaling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"androidNonlinearFontScaling.d.ts","names":[],"sources":["../../src/fontScaling/androidNonlinearFontScaling.ts"],"mappings":";;;iBA8DS,oBAAA,CACP,QAAA,UACA,SAAA,UACA,eAAA"}
@@ -0,0 +1,251 @@
1
+ /*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
2
+ //#region src/fontScaling/androidNonlinearFontScaling.ts
3
+ /**
4
+ * Android 14+ converts SP through a size-dependent curve. `Configuration.fontScale`
5
+ * is only the user's preference; multiplying by it directly does not reproduce the
6
+ * size that native Text renders.
7
+ *
8
+ * These lookup tables mirror Android's `FontScaleConverterFactory`. Android 14
9
+ * shipped fewer preference curves than Android 15+, so callers must provide the
10
+ * platform version to select the same table native Text uses. Values between
11
+ * table entries are linearly interpolated, as they are in the platform implementation.
12
+ *
13
+ * @see https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/content/res/FontScaleConverterFactory.java
14
+ * @see https://android.googlesource.com/platform/prebuilts/fullsdk/sources/+/refs/heads/androidx-compose-integration-release/android-34/android/content/res/FontScaleConverterFactory.java
15
+ */
16
+ const COMMON_SP_SIZES = [
17
+ 8,
18
+ 10,
19
+ 12,
20
+ 14,
21
+ 18,
22
+ 20,
23
+ 24,
24
+ 30,
25
+ 100
26
+ ];
27
+ const ANDROID_14_FONT_SCALE_CURVES = [
28
+ {
29
+ scale: 1.15,
30
+ dp: [
31
+ 9.2,
32
+ 11.5,
33
+ 13.8,
34
+ 16.4,
35
+ 19.8,
36
+ 21.8,
37
+ 25.2,
38
+ 30,
39
+ 100
40
+ ]
41
+ },
42
+ {
43
+ scale: 1.3,
44
+ dp: [
45
+ 10.4,
46
+ 13,
47
+ 15.6,
48
+ 18.8,
49
+ 21.6,
50
+ 23.6,
51
+ 26.4,
52
+ 30,
53
+ 100
54
+ ]
55
+ },
56
+ {
57
+ scale: 1.5,
58
+ dp: [
59
+ 12,
60
+ 15,
61
+ 18,
62
+ 22,
63
+ 24,
64
+ 26,
65
+ 28,
66
+ 30,
67
+ 100
68
+ ]
69
+ },
70
+ {
71
+ scale: 1.8,
72
+ dp: [
73
+ 14.4,
74
+ 18,
75
+ 21.6,
76
+ 24.4,
77
+ 27.6,
78
+ 30.8,
79
+ 32.8,
80
+ 34.8,
81
+ 100
82
+ ]
83
+ },
84
+ {
85
+ scale: 2,
86
+ dp: [
87
+ 16,
88
+ 20,
89
+ 24,
90
+ 26,
91
+ 30,
92
+ 34,
93
+ 36,
94
+ 38,
95
+ 100
96
+ ]
97
+ }
98
+ ];
99
+ const ANDROID_15_FONT_SCALE_CURVES = [
100
+ {
101
+ scale: 1.05,
102
+ dp: [
103
+ 8.4,
104
+ 10.5,
105
+ 12.6,
106
+ 14.8,
107
+ 18.6,
108
+ 20.6,
109
+ 24.4,
110
+ 30,
111
+ 100
112
+ ]
113
+ },
114
+ {
115
+ scale: 1.1,
116
+ dp: [
117
+ 8.8,
118
+ 11,
119
+ 13.2,
120
+ 15.6,
121
+ 19.2,
122
+ 21.2,
123
+ 24.8,
124
+ 30,
125
+ 100
126
+ ]
127
+ },
128
+ {
129
+ scale: 1.15,
130
+ dp: [
131
+ 9.2,
132
+ 11.5,
133
+ 13.8,
134
+ 16.4,
135
+ 19.8,
136
+ 21.8,
137
+ 25.2,
138
+ 30,
139
+ 100
140
+ ]
141
+ },
142
+ {
143
+ scale: 1.2,
144
+ dp: [
145
+ 9.6,
146
+ 12,
147
+ 14.4,
148
+ 17.2,
149
+ 20.4,
150
+ 22.4,
151
+ 25.6,
152
+ 30,
153
+ 100
154
+ ]
155
+ },
156
+ {
157
+ scale: 1.3,
158
+ dp: [
159
+ 10.4,
160
+ 13,
161
+ 15.6,
162
+ 18.8,
163
+ 21.6,
164
+ 23.6,
165
+ 26.4,
166
+ 30,
167
+ 100
168
+ ]
169
+ },
170
+ {
171
+ scale: 1.5,
172
+ dp: [
173
+ 12,
174
+ 15,
175
+ 18,
176
+ 22,
177
+ 24,
178
+ 26,
179
+ 28,
180
+ 30,
181
+ 100
182
+ ]
183
+ },
184
+ {
185
+ scale: 1.8,
186
+ dp: [
187
+ 14.4,
188
+ 18,
189
+ 21.6,
190
+ 24.4,
191
+ 27.6,
192
+ 30.8,
193
+ 32.8,
194
+ 34.8,
195
+ 100
196
+ ]
197
+ },
198
+ {
199
+ scale: 2,
200
+ dp: [
201
+ 16,
202
+ 20,
203
+ 24,
204
+ 26,
205
+ 30,
206
+ 34,
207
+ 36,
208
+ 38,
209
+ 100
210
+ ]
211
+ }
212
+ ];
213
+ function lerp(start, end, amount) {
214
+ return start + (end - start) * amount;
215
+ }
216
+ function interpolateSize(fontSize, dpValues) {
217
+ if (fontSize <= 0) return fontSize;
218
+ for (let index = 0; index < COMMON_SP_SIZES.length; index += 1) {
219
+ const currentSp = COMMON_SP_SIZES[index];
220
+ if (fontSize === currentSp) return dpValues[index];
221
+ if (fontSize < currentSp) {
222
+ const previousSp = index === 0 ? 0 : COMMON_SP_SIZES[index - 1];
223
+ const previousDp = index === 0 ? 0 : dpValues[index - 1];
224
+ const amount = (fontSize - previousSp) / (currentSp - previousSp);
225
+ return lerp(previousDp, dpValues[index], amount);
226
+ }
227
+ }
228
+ const lastIndex = COMMON_SP_SIZES.length - 1;
229
+ return fontSize * (dpValues[lastIndex] / COMMON_SP_SIZES[lastIndex]);
230
+ }
231
+ /** Converts an SP value to the nonlinear DP size used by this Android API level. */
232
+ function convertAndroidSpToDp(fontSize, fontScale, platformVersion = 35) {
233
+ const curves = platformVersion === 34 ? ANDROID_14_FONT_SCALE_CURVES : ANDROID_15_FONT_SCALE_CURVES;
234
+ const firstCurve = curves[0];
235
+ const lastCurve = curves[curves.length - 1];
236
+ if (fontScale < firstCurve.scale || fontScale > lastCurve.scale) return fontSize * fontScale;
237
+ for (let index = 0; index < curves.length; index += 1) {
238
+ const curve = curves[index];
239
+ if (fontScale === curve.scale) return interpolateSize(fontSize, curve.dp);
240
+ if (fontScale < curve.scale) {
241
+ const previousCurve = curves[index - 1];
242
+ const amount = (fontScale - previousCurve.scale) / (curve.scale - previousCurve.scale);
243
+ return lerp(interpolateSize(fontSize, previousCurve.dp), interpolateSize(fontSize, curve.dp), amount);
244
+ }
245
+ }
246
+ return fontSize * fontScale;
247
+ }
248
+ //#endregion
249
+ export { convertAndroidSpToDp };
250
+
251
+ //# sourceMappingURL=androidNonlinearFontScaling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"androidNonlinearFontScaling.js","names":[],"sources":["../../src/fontScaling/androidNonlinearFontScaling.ts"],"sourcesContent":["/**\n * Android 14+ converts SP through a size-dependent curve. `Configuration.fontScale`\n * is only the user's preference; multiplying by it directly does not reproduce the\n * size that native Text renders.\n *\n * These lookup tables mirror Android's `FontScaleConverterFactory`. Android 14\n * shipped fewer preference curves than Android 15+, so callers must provide the\n * platform version to select the same table native Text uses. Values between\n * table entries are linearly interpolated, as they are in the platform implementation.\n *\n * @see https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/content/res/FontScaleConverterFactory.java\n * @see https://android.googlesource.com/platform/prebuilts/fullsdk/sources/+/refs/heads/androidx-compose-integration-release/android-34/android/content/res/FontScaleConverterFactory.java\n */\nconst COMMON_SP_SIZES = [8, 10, 12, 14, 18, 20, 24, 30, 100] as const;\n\nconst ANDROID_14_FONT_SCALE_CURVES = [\n { scale: 1.15, dp: [9.2, 11.5, 13.8, 16.4, 19.8, 21.8, 25.2, 30, 100] },\n { scale: 1.3, dp: [10.4, 13, 15.6, 18.8, 21.6, 23.6, 26.4, 30, 100] },\n { scale: 1.5, dp: [12, 15, 18, 22, 24, 26, 28, 30, 100] },\n { scale: 1.8, dp: [14.4, 18, 21.6, 24.4, 27.6, 30.8, 32.8, 34.8, 100] },\n { scale: 2, dp: [16, 20, 24, 26, 30, 34, 36, 38, 100] },\n] as const;\n\nconst ANDROID_15_FONT_SCALE_CURVES = [\n { scale: 1.05, dp: [8.4, 10.5, 12.6, 14.8, 18.6, 20.6, 24.4, 30, 100] },\n { scale: 1.1, dp: [8.8, 11, 13.2, 15.6, 19.2, 21.2, 24.8, 30, 100] },\n { scale: 1.15, dp: [9.2, 11.5, 13.8, 16.4, 19.8, 21.8, 25.2, 30, 100] },\n { scale: 1.2, dp: [9.6, 12, 14.4, 17.2, 20.4, 22.4, 25.6, 30, 100] },\n { scale: 1.3, dp: [10.4, 13, 15.6, 18.8, 21.6, 23.6, 26.4, 30, 100] },\n { scale: 1.5, dp: [12, 15, 18, 22, 24, 26, 28, 30, 100] },\n { scale: 1.8, dp: [14.4, 18, 21.6, 24.4, 27.6, 30.8, 32.8, 34.8, 100] },\n { scale: 2, dp: [16, 20, 24, 26, 30, 34, 36, 38, 100] },\n] as const;\n\nfunction lerp(start: number, end: number, amount: number): number {\n return start + (end - start) * amount;\n}\n\nfunction interpolateSize(fontSize: number, dpValues: readonly number[]): number {\n if (fontSize <= 0) {\n return fontSize;\n }\n\n for (let index = 0; index < COMMON_SP_SIZES.length; index += 1) {\n const currentSp = COMMON_SP_SIZES[index];\n if (fontSize === currentSp) {\n return dpValues[index] as number;\n }\n if (fontSize < currentSp) {\n const previousSp = index === 0 ? 0 : COMMON_SP_SIZES[index - 1];\n const previousDp = index === 0 ? 0 : (dpValues[index - 1] as number);\n const amount = (fontSize - previousSp) / (currentSp - previousSp);\n return lerp(previousDp, dpValues[index] as number, amount);\n }\n }\n\n // Android extrapolates beyond the table with the last entry's ratio.\n const lastIndex = COMMON_SP_SIZES.length - 1;\n return fontSize * ((dpValues[lastIndex] as number) / COMMON_SP_SIZES[lastIndex]);\n}\n\n/** Converts an SP value to the nonlinear DP size used by this Android API level. */\nfunction convertAndroidSpToDp(\n fontSize: number,\n fontScale: number,\n platformVersion: number = 35,\n): number {\n const curves =\n platformVersion === 34 ? ANDROID_14_FONT_SCALE_CURVES : ANDROID_15_FONT_SCALE_CURVES;\n const firstCurve = curves[0];\n const lastCurve = curves[curves.length - 1];\n\n // Outside Android's curve range, the platform falls back to a linear table.\n if (fontScale < firstCurve.scale || fontScale > lastCurve.scale) {\n return fontSize * fontScale;\n }\n\n for (let index = 0; index < curves.length; index += 1) {\n const curve = curves[index];\n if (fontScale === curve.scale) {\n return interpolateSize(fontSize, curve.dp);\n }\n if (fontScale < curve.scale) {\n const previousCurve = curves[index - 1];\n const amount = (fontScale - previousCurve.scale) / (curve.scale - previousCurve.scale);\n return lerp(\n interpolateSize(fontSize, previousCurve.dp),\n interpolateSize(fontSize, curve.dp),\n amount,\n );\n }\n }\n\n return fontSize * fontScale;\n}\n\nexport { convertAndroidSpToDp };\n"],"mappings":"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"}