@terreno/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 (446) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +160 -0
  3. package/dist/Accordion.d.ts +3 -0
  4. package/dist/Accordion.js +30 -0
  5. package/dist/Accordion.js.map +1 -0
  6. package/dist/ActionSheet.d.ts +169 -0
  7. package/dist/ActionSheet.js +637 -0
  8. package/dist/ActionSheet.js.map +1 -0
  9. package/dist/AddressField.d.ts +3 -0
  10. package/dist/AddressField.js +18 -0
  11. package/dist/AddressField.js.map +1 -0
  12. package/dist/Avatar.d.ts +3 -0
  13. package/dist/Avatar.js +189 -0
  14. package/dist/Avatar.js.map +1 -0
  15. package/dist/Badge.d.ts +3 -0
  16. package/dist/Badge.js +100 -0
  17. package/dist/Badge.js.map +1 -0
  18. package/dist/Banner.d.ts +4 -0
  19. package/dist/Banner.js +103 -0
  20. package/dist/Banner.js.map +1 -0
  21. package/dist/Body.d.ts +3 -0
  22. package/dist/Body.js +17 -0
  23. package/dist/Body.js.map +1 -0
  24. package/dist/BooleanField.d.ts +3 -0
  25. package/dist/BooleanField.js +89 -0
  26. package/dist/BooleanField.js.map +1 -0
  27. package/dist/Box.d.ts +3 -0
  28. package/dist/Box.js +289 -0
  29. package/dist/Box.js.map +1 -0
  30. package/dist/Button.d.ts +3 -0
  31. package/dist/Button.js +105 -0
  32. package/dist/Button.js.map +1 -0
  33. package/dist/Card.d.ts +2 -0
  34. package/dist/Card.js +18 -0
  35. package/dist/Card.js.map +1 -0
  36. package/dist/CheckBox.d.ts +3 -0
  37. package/dist/CheckBox.js +28 -0
  38. package/dist/CheckBox.js.map +1 -0
  39. package/dist/Common.d.ts +2325 -0
  40. package/dist/Common.js +47 -0
  41. package/dist/Common.js.map +1 -0
  42. package/dist/CommonIconTypes.d.ts +3 -0
  43. package/dist/CommonIconTypes.js +2 -0
  44. package/dist/CommonIconTypes.js.map +1 -0
  45. package/dist/Constants.d.ts +12685 -0
  46. package/dist/Constants.js +3310 -0
  47. package/dist/Constants.js.map +1 -0
  48. package/dist/CustomSelectField.d.ts +3 -0
  49. package/dist/CustomSelectField.js +59 -0
  50. package/dist/CustomSelectField.js.map +1 -0
  51. package/dist/DataTable.d.ts +3 -0
  52. package/dist/DataTable.js +190 -0
  53. package/dist/DataTable.js.map +1 -0
  54. package/dist/DateTimeActionSheet.d.ts +2 -0
  55. package/dist/DateTimeActionSheet.js +270 -0
  56. package/dist/DateTimeActionSheet.js.map +1 -0
  57. package/dist/DateTimeField.d.ts +3 -0
  58. package/dist/DateTimeField.js +514 -0
  59. package/dist/DateTimeField.js.map +1 -0
  60. package/dist/DateUtilities.d.ts +57 -0
  61. package/dist/DateUtilities.js +308 -0
  62. package/dist/DateUtilities.js.map +1 -0
  63. package/dist/DecimalRangeActionSheet.d.ts +6 -0
  64. package/dist/DecimalRangeActionSheet.js +45 -0
  65. package/dist/DecimalRangeActionSheet.js.map +1 -0
  66. package/dist/DismissButton.d.ts +3 -0
  67. package/dist/DismissButton.js +12 -0
  68. package/dist/DismissButton.js.map +1 -0
  69. package/dist/EmailField.d.ts +3 -0
  70. package/dist/EmailField.js +48 -0
  71. package/dist/EmailField.js.map +1 -0
  72. package/dist/EmojiSelector.d.ts +113 -0
  73. package/dist/EmojiSelector.js +322 -0
  74. package/dist/EmojiSelector.js.map +1 -0
  75. package/dist/ErrorBoundary.d.ts +19 -0
  76. package/dist/ErrorBoundary.js +30 -0
  77. package/dist/ErrorBoundary.js.map +1 -0
  78. package/dist/ErrorPage.d.ts +6 -0
  79. package/dist/ErrorPage.js +15 -0
  80. package/dist/ErrorPage.js.map +1 -0
  81. package/dist/Field.d.ts +3 -0
  82. package/dist/Field.js +80 -0
  83. package/dist/Field.js.map +1 -0
  84. package/dist/FlatList.d.ts +2 -0
  85. package/dist/FlatList.js +3 -0
  86. package/dist/FlatList.js.map +1 -0
  87. package/dist/Heading.d.ts +3 -0
  88. package/dist/Heading.js +43 -0
  89. package/dist/Heading.js.map +1 -0
  90. package/dist/HeightActionSheet.d.ts +11 -0
  91. package/dist/HeightActionSheet.js +46 -0
  92. package/dist/HeightActionSheet.js.map +1 -0
  93. package/dist/Hyperlink.d.ts +30 -0
  94. package/dist/Hyperlink.js +144 -0
  95. package/dist/Hyperlink.js.map +1 -0
  96. package/dist/Icon.d.ts +3 -0
  97. package/dist/Icon.js +15 -0
  98. package/dist/Icon.js.map +1 -0
  99. package/dist/IconButton.d.ts +3 -0
  100. package/dist/IconButton.js +111 -0
  101. package/dist/IconButton.js.map +1 -0
  102. package/dist/Image.d.ts +8 -0
  103. package/dist/Image.js +37 -0
  104. package/dist/Image.js.map +1 -0
  105. package/dist/ImageBackground.d.ts +10 -0
  106. package/dist/ImageBackground.js +9 -0
  107. package/dist/ImageBackground.js.map +1 -0
  108. package/dist/InfoModalIcon.d.ts +3 -0
  109. package/dist/InfoModalIcon.js +10 -0
  110. package/dist/InfoModalIcon.js.map +1 -0
  111. package/dist/InfoTooltipButton.d.ts +3 -0
  112. package/dist/InfoTooltipButton.js +6 -0
  113. package/dist/InfoTooltipButton.js.map +1 -0
  114. package/dist/Link.d.ts +3 -0
  115. package/dist/Link.js +10 -0
  116. package/dist/Link.js.map +1 -0
  117. package/dist/MarkdownView.d.ts +5 -0
  118. package/dist/MarkdownView.js +44 -0
  119. package/dist/MarkdownView.js.map +1 -0
  120. package/dist/MediaQuery.d.ts +4 -0
  121. package/dist/MediaQuery.js +52 -0
  122. package/dist/MediaQuery.js.map +1 -0
  123. package/dist/MobileAddressAutoComplete.d.ts +2 -0
  124. package/dist/MobileAddressAutoComplete.js +54 -0
  125. package/dist/MobileAddressAutoComplete.js.map +1 -0
  126. package/dist/Modal.d.ts +3 -0
  127. package/dist/Modal.js +127 -0
  128. package/dist/Modal.js.map +1 -0
  129. package/dist/ModalSheet.d.ts +6 -0
  130. package/dist/ModalSheet.js +42 -0
  131. package/dist/ModalSheet.js.map +1 -0
  132. package/dist/MultiselectField.d.ts +3 -0
  133. package/dist/MultiselectField.js +45 -0
  134. package/dist/MultiselectField.js.map +1 -0
  135. package/dist/NumberField.d.ts +3 -0
  136. package/dist/NumberField.js +60 -0
  137. package/dist/NumberField.js.map +1 -0
  138. package/dist/NumberPickerActionSheet.d.ts +7 -0
  139. package/dist/NumberPickerActionSheet.js +22 -0
  140. package/dist/NumberPickerActionSheet.js.map +1 -0
  141. package/dist/OpenAPIContext.d.ts +4 -0
  142. package/dist/OpenAPIContext.js +53 -0
  143. package/dist/OpenAPIContext.js.map +1 -0
  144. package/dist/Page.d.ts +7 -0
  145. package/dist/Page.js +24 -0
  146. package/dist/Page.js.map +1 -0
  147. package/dist/Pagination.d.ts +3 -0
  148. package/dist/Pagination.js +106 -0
  149. package/dist/Pagination.js.map +1 -0
  150. package/dist/PasswordField.d.ts +2 -0
  151. package/dist/PasswordField.js +6 -0
  152. package/dist/PasswordField.js.map +1 -0
  153. package/dist/Permissions.d.ts +2 -0
  154. package/dist/Permissions.js +35 -0
  155. package/dist/Permissions.js.map +1 -0
  156. package/dist/PhoneNumberField.d.ts +3 -0
  157. package/dist/PhoneNumberField.js +83 -0
  158. package/dist/PhoneNumberField.js.map +1 -0
  159. package/dist/PickerSelect.d.ts +46 -0
  160. package/dist/PickerSelect.js +306 -0
  161. package/dist/PickerSelect.js.map +1 -0
  162. package/dist/Radio.d.ts +3 -0
  163. package/dist/Radio.js +21 -0
  164. package/dist/Radio.js.map +1 -0
  165. package/dist/RadioField.d.ts +3 -0
  166. package/dist/RadioField.js +16 -0
  167. package/dist/RadioField.js.map +1 -0
  168. package/dist/ScrollView.d.ts +2 -0
  169. package/dist/ScrollView.js +3 -0
  170. package/dist/ScrollView.js.map +1 -0
  171. package/dist/SectionDivider.d.ts +2 -0
  172. package/dist/SectionDivider.js +12 -0
  173. package/dist/SectionDivider.js.map +1 -0
  174. package/dist/SegmentedControl.d.ts +3 -0
  175. package/dist/SegmentedControl.js +65 -0
  176. package/dist/SegmentedControl.js.map +1 -0
  177. package/dist/SelectBadge.d.ts +3 -0
  178. package/dist/SelectBadge.js +166 -0
  179. package/dist/SelectBadge.js.map +1 -0
  180. package/dist/SelectField.d.ts +3 -0
  181. package/dist/SelectField.js +16 -0
  182. package/dist/SelectField.js.map +1 -0
  183. package/dist/SideDrawer.d.ts +3 -0
  184. package/dist/SideDrawer.js +32 -0
  185. package/dist/SideDrawer.js.map +1 -0
  186. package/dist/Signature.d.ts +8 -0
  187. package/dist/Signature.js +21 -0
  188. package/dist/Signature.js.map +1 -0
  189. package/dist/Signature.native.d.ts +8 -0
  190. package/dist/Signature.native.js +26 -0
  191. package/dist/Signature.native.js.map +1 -0
  192. package/dist/SignatureField.d.ts +3 -0
  193. package/dist/SignatureField.js +42 -0
  194. package/dist/SignatureField.js.map +1 -0
  195. package/dist/Slider.d.ts +3 -0
  196. package/dist/Slider.js +78 -0
  197. package/dist/Slider.js.map +1 -0
  198. package/dist/Spinner.d.ts +3 -0
  199. package/dist/Spinner.js +33 -0
  200. package/dist/Spinner.js.map +1 -0
  201. package/dist/SplitPage.d.ts +2 -0
  202. package/dist/SplitPage.js +139 -0
  203. package/dist/SplitPage.js.map +1 -0
  204. package/dist/SplitPage.native.d.ts +2 -0
  205. package/dist/SplitPage.native.js +75 -0
  206. package/dist/SplitPage.native.js.map +1 -0
  207. package/dist/TapToEdit.d.ts +4 -0
  208. package/dist/TapToEdit.js +170 -0
  209. package/dist/TapToEdit.js.map +1 -0
  210. package/dist/TerrenoProvider.d.ts +6 -0
  211. package/dist/TerrenoProvider.js +10 -0
  212. package/dist/TerrenoProvider.js.map +1 -0
  213. package/dist/Text.d.ts +3 -0
  214. package/dist/Text.js +95 -0
  215. package/dist/Text.js.map +1 -0
  216. package/dist/TextArea.d.ts +3 -0
  217. package/dist/TextArea.js +6 -0
  218. package/dist/TextArea.js.map +1 -0
  219. package/dist/TextField.d.ts +3 -0
  220. package/dist/TextField.js +144 -0
  221. package/dist/TextField.js.map +1 -0
  222. package/dist/TextFieldNumberActionSheet.d.ts +7 -0
  223. package/dist/TextFieldNumberActionSheet.js +20 -0
  224. package/dist/TextFieldNumberActionSheet.js.map +1 -0
  225. package/dist/Theme.d.ts +96 -0
  226. package/dist/Theme.js +213 -0
  227. package/dist/Theme.js.map +1 -0
  228. package/dist/TimezonePicker.d.ts +11 -0
  229. package/dist/TimezonePicker.js +27 -0
  230. package/dist/TimezonePicker.js.map +1 -0
  231. package/dist/Toast.d.ts +23 -0
  232. package/dist/Toast.js +157 -0
  233. package/dist/Toast.js.map +1 -0
  234. package/dist/Tooltip.d.ts +3 -0
  235. package/dist/Tooltip.js +289 -0
  236. package/dist/Tooltip.js.map +1 -0
  237. package/dist/UnifiedAddressAutoComplete.d.ts +2 -0
  238. package/dist/UnifiedAddressAutoComplete.js +23 -0
  239. package/dist/UnifiedAddressAutoComplete.js.map +1 -0
  240. package/dist/Unifier.d.ts +43 -0
  241. package/dist/Unifier.js +154 -0
  242. package/dist/Unifier.js.map +1 -0
  243. package/dist/Utilities.d.ts +56 -0
  244. package/dist/Utilities.js +193 -0
  245. package/dist/Utilities.js.map +1 -0
  246. package/dist/WebAddressAutocomplete.d.ts +3 -0
  247. package/dist/WebAddressAutocomplete.js +61 -0
  248. package/dist/WebAddressAutocomplete.js.map +1 -0
  249. package/dist/fieldElements/FieldError.d.ts +6 -0
  250. package/dist/fieldElements/FieldError.js +9 -0
  251. package/dist/fieldElements/FieldError.js.map +1 -0
  252. package/dist/fieldElements/FieldHelperText.d.ts +6 -0
  253. package/dist/fieldElements/FieldHelperText.js +8 -0
  254. package/dist/fieldElements/FieldHelperText.js.map +1 -0
  255. package/dist/fieldElements/FieldTitle.d.ts +6 -0
  256. package/dist/fieldElements/FieldTitle.js +16 -0
  257. package/dist/fieldElements/FieldTitle.js.map +1 -0
  258. package/dist/fieldElements/index.d.ts +3 -0
  259. package/dist/fieldElements/index.js +4 -0
  260. package/dist/fieldElements/index.js.map +1 -0
  261. package/dist/icons/MobileIcon.d.ts +2 -0
  262. package/dist/icons/MobileIcon.js +18 -0
  263. package/dist/icons/MobileIcon.js.map +1 -0
  264. package/dist/icons/OfflineIcon.d.ts +2 -0
  265. package/dist/icons/OfflineIcon.js +18 -0
  266. package/dist/icons/OfflineIcon.js.map +1 -0
  267. package/dist/icons/OnlineIcon.d.ts +2 -0
  268. package/dist/icons/OnlineIcon.js +19 -0
  269. package/dist/icons/OnlineIcon.js.map +1 -0
  270. package/dist/icons/OutOfficeIcon.d.ts +2 -0
  271. package/dist/icons/OutOfficeIcon.js +18 -0
  272. package/dist/icons/OutOfficeIcon.js.map +1 -0
  273. package/dist/icons/index.d.ts +4 -0
  274. package/dist/icons/index.js +5 -0
  275. package/dist/icons/index.js.map +1 -0
  276. package/dist/index.d.ts +1328 -0
  277. package/dist/index.js +89 -0
  278. package/dist/index.js.map +1 -0
  279. package/dist/table/Table.d.ts +3 -0
  280. package/dist/table/Table.js +53 -0
  281. package/dist/table/Table.js.map +1 -0
  282. package/dist/table/TableBadge.d.ts +6 -0
  283. package/dist/table/TableBadge.js +23 -0
  284. package/dist/table/TableBadge.js.map +1 -0
  285. package/dist/table/TableBoolean.d.ts +6 -0
  286. package/dist/table/TableBoolean.js +37 -0
  287. package/dist/table/TableBoolean.js.map +1 -0
  288. package/dist/table/TableDate.d.ts +3 -0
  289. package/dist/table/TableDate.js +27 -0
  290. package/dist/table/TableDate.js.map +1 -0
  291. package/dist/table/TableHeader.d.ts +6 -0
  292. package/dist/table/TableHeader.js +10 -0
  293. package/dist/table/TableHeader.js.map +1 -0
  294. package/dist/table/TableHeaderCell.d.ts +6 -0
  295. package/dist/table/TableHeaderCell.js +54 -0
  296. package/dist/table/TableHeaderCell.js.map +1 -0
  297. package/dist/table/TableIconButton.d.ts +3 -0
  298. package/dist/table/TableIconButton.js +39 -0
  299. package/dist/table/TableIconButton.js.map +1 -0
  300. package/dist/table/TableNumber.d.ts +3 -0
  301. package/dist/table/TableNumber.js +18 -0
  302. package/dist/table/TableNumber.js.map +1 -0
  303. package/dist/table/TableRow.d.ts +6 -0
  304. package/dist/table/TableRow.js +22 -0
  305. package/dist/table/TableRow.js.map +1 -0
  306. package/dist/table/TableText.d.ts +3 -0
  307. package/dist/table/TableText.js +18 -0
  308. package/dist/table/TableText.js.map +1 -0
  309. package/dist/table/TableTitle.d.ts +3 -0
  310. package/dist/table/TableTitle.js +21 -0
  311. package/dist/table/TableTitle.js.map +1 -0
  312. package/dist/table/tableContext.d.ts +5 -0
  313. package/dist/table/tableContext.js +38 -0
  314. package/dist/table/tableContext.js.map +1 -0
  315. package/dist/useStoredState.d.ts +1 -0
  316. package/dist/useStoredState.js +49 -0
  317. package/dist/useStoredState.js.map +1 -0
  318. package/package.json +123 -0
  319. package/src/Accordion.test.tsx +104 -0
  320. package/src/Accordion.tsx +81 -0
  321. package/src/ActionSheet.tsx +881 -0
  322. package/src/AddressField.test.tsx +120 -0
  323. package/src/AddressField.tsx +122 -0
  324. package/src/Avatar.test.tsx +163 -0
  325. package/src/Avatar.tsx +298 -0
  326. package/src/Badge.test.tsx +116 -0
  327. package/src/Badge.tsx +136 -0
  328. package/src/Banner.tsx +200 -0
  329. package/src/Body.tsx +34 -0
  330. package/src/BooleanField.tsx +141 -0
  331. package/src/Box.test.tsx +662 -0
  332. package/src/Box.tsx +368 -0
  333. package/src/Button.tsx +196 -0
  334. package/src/Card.tsx +19 -0
  335. package/src/CheckBox.tsx +45 -0
  336. package/src/Common.ts +2787 -0
  337. package/src/CommonIconTypes.ts +2030 -0
  338. package/src/Constants.ts +3311 -0
  339. package/src/CustomSelectField.tsx +115 -0
  340. package/src/DataTable.tsx +674 -0
  341. package/src/DateTimeActionSheet.tsx +559 -0
  342. package/src/DateTimeField.test.tsx +393 -0
  343. package/src/DateTimeField.tsx +777 -0
  344. package/src/DateUtilities.test.ts +440 -0
  345. package/src/DateUtilities.tsx +370 -0
  346. package/src/DecimalRangeActionSheet.tsx +85 -0
  347. package/src/DismissButton.tsx +31 -0
  348. package/src/EmailField.tsx +66 -0
  349. package/src/EmojiSelector.test.tsx +61 -0
  350. package/src/EmojiSelector.tsx +510 -0
  351. package/src/ErrorBoundary.tsx +37 -0
  352. package/src/ErrorPage.tsx +41 -0
  353. package/src/Field.tsx +101 -0
  354. package/src/FlatList.tsx +2 -0
  355. package/src/Heading.tsx +66 -0
  356. package/src/HeightActionSheet.tsx +91 -0
  357. package/src/Hyperlink.tsx +179 -0
  358. package/src/Icon.tsx +36 -0
  359. package/src/IconButton.tsx +217 -0
  360. package/src/Image.tsx +51 -0
  361. package/src/ImageBackground.tsx +14 -0
  362. package/src/InfoModalIcon.tsx +42 -0
  363. package/src/InfoTooltipButton.tsx +16 -0
  364. package/src/Link.tsx +22 -0
  365. package/src/MarkdownView.tsx +67 -0
  366. package/src/MediaQuery.ts +46 -0
  367. package/src/MobileAddressAutoComplete.tsx +126 -0
  368. package/src/Modal.tsx +300 -0
  369. package/src/ModalSheet.tsx +58 -0
  370. package/src/MultiselectField.tsx +112 -0
  371. package/src/NumberField.tsx +67 -0
  372. package/src/NumberPickerActionSheet.tsx +51 -0
  373. package/src/OpenAPIContext.tsx +74 -0
  374. package/src/Page.tsx +105 -0
  375. package/src/Pagination.tsx +169 -0
  376. package/src/PasswordField.tsx +7 -0
  377. package/src/Permissions.ts +43 -0
  378. package/src/PhoneNumberField.tsx +109 -0
  379. package/src/PickerSelect.tsx +571 -0
  380. package/src/Radio.tsx +33 -0
  381. package/src/RadioField.tsx +43 -0
  382. package/src/ScrollView.tsx +2 -0
  383. package/src/SectionDivider.tsx +18 -0
  384. package/src/SegmentedControl.tsx +126 -0
  385. package/src/SelectBadge.tsx +280 -0
  386. package/src/SelectField.tsx +41 -0
  387. package/src/SideDrawer.tsx +56 -0
  388. package/src/Signature.native.tsx +57 -0
  389. package/src/Signature.tsx +44 -0
  390. package/src/SignatureField.tsx +92 -0
  391. package/src/Slider.tsx +199 -0
  392. package/src/Spinner.tsx +35 -0
  393. package/src/SplitPage.native.tsx +163 -0
  394. package/src/SplitPage.tsx +304 -0
  395. package/src/TapToEdit.tsx +292 -0
  396. package/src/TerrenoProvider.tsx +31 -0
  397. package/src/Text.tsx +123 -0
  398. package/src/TextArea.test.tsx +255 -0
  399. package/src/TextArea.tsx +8 -0
  400. package/src/TextField.test.tsx +487 -0
  401. package/src/TextField.tsx +260 -0
  402. package/src/TextFieldNumberActionSheet.tsx +46 -0
  403. package/src/Theme.tsx +248 -0
  404. package/src/TimezonePicker.tsx +45 -0
  405. package/src/Toast.tsx +234 -0
  406. package/src/Tooltip.tsx +407 -0
  407. package/src/UnifiedAddressAutoComplete.tsx +66 -0
  408. package/src/Unifier.ts +172 -0
  409. package/src/Utilities.tsx +329 -0
  410. package/src/WebAddressAutocomplete.tsx +84 -0
  411. package/src/__snapshots__/Accordion.test.tsx.snap +126 -0
  412. package/src/__snapshots__/AddressField.test.tsx.snap +1197 -0
  413. package/src/__snapshots__/Avatar.test.tsx.snap +57 -0
  414. package/src/__snapshots__/Badge.test.tsx.snap +55 -0
  415. package/src/__snapshots__/Box.test.tsx.snap +162 -0
  416. package/src/__snapshots__/EmojiSelector.test.tsx.snap +422 -0
  417. package/src/__snapshots__/TextArea.test.tsx.snap +521 -0
  418. package/src/__snapshots__/TextField.test.tsx.snap +569 -0
  419. package/src/bunSetup.ts +1235 -0
  420. package/src/fieldElements/FieldError.tsx +24 -0
  421. package/src/fieldElements/FieldHelperText.tsx +20 -0
  422. package/src/fieldElements/FieldTitle.tsx +31 -0
  423. package/src/fieldElements/index.tsx +3 -0
  424. package/src/icons/MobileIcon.tsx +40 -0
  425. package/src/icons/OfflineIcon.tsx +37 -0
  426. package/src/icons/OnlineIcon.tsx +39 -0
  427. package/src/icons/OutOfficeIcon.tsx +36 -0
  428. package/src/icons/index.ts +4 -0
  429. package/src/index.tsx +1375 -0
  430. package/src/polyfill.d.ts +11 -0
  431. package/src/table/Table.tsx +109 -0
  432. package/src/table/TableBadge.tsx +46 -0
  433. package/src/table/TableBoolean.tsx +70 -0
  434. package/src/table/TableDate.tsx +38 -0
  435. package/src/table/TableHeader.tsx +20 -0
  436. package/src/table/TableHeaderCell.tsx +94 -0
  437. package/src/table/TableIconButton.tsx +61 -0
  438. package/src/table/TableNumber.tsx +29 -0
  439. package/src/table/TableRow.tsx +67 -0
  440. package/src/table/TableText.tsx +29 -0
  441. package/src/table/TableTitle.tsx +31 -0
  442. package/src/table/tableContext.tsx +67 -0
  443. package/src/test-utils.tsx +27 -0
  444. package/src/types/react-native-swiper-flatlist.d.ts +56 -0
  445. package/src/useStoredState.test.tsx +143 -0
  446. package/src/useStoredState.ts +56 -0
package/src/Unifier.ts ADDED
@@ -0,0 +1,172 @@
1
+ import AsyncStorage from "@react-native-async-storage/async-storage";
2
+ import * as Clipboard from "expo-clipboard";
3
+ import * as Haptics from "expo-haptics";
4
+ import {Dimensions, Keyboard, Linking, Platform, Vibration} from "react-native";
5
+
6
+ import type {PermissionKind} from "./Common";
7
+ import {requestPermissions} from "./Permissions";
8
+
9
+ declare global {
10
+ interface Window {
11
+ google: any;
12
+ }
13
+ }
14
+
15
+ export type PlatformOS = "ios" | "android" | "web";
16
+
17
+ type Luminance = "light" | "lighter" | "dark" | "darker";
18
+
19
+ // Changes a color luminance
20
+ export function changeColorLuminance(hex: string, luminanceChange: Luminance) {
21
+ // Validate hex string, strip "#" if present.
22
+ hex = String(hex).replace(/[^0-9a-f]/gi, "");
23
+ if (hex.length === 3) {
24
+ hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
25
+ } else if (hex.length !== 6) {
26
+ throw new Error(`Invalid color hex: ${hex}`);
27
+ }
28
+ let luminance;
29
+ switch (luminanceChange) {
30
+ case "light":
31
+ luminance = -0.2;
32
+ break;
33
+ case "lighter":
34
+ luminance = -0.33;
35
+ break;
36
+ case "dark":
37
+ luminance = 0.2;
38
+ break;
39
+ case "darker":
40
+ luminance = 0.33;
41
+ break;
42
+ default:
43
+ throw new Error(`Cannot change luminance to ${luminanceChange}`);
44
+ }
45
+
46
+ // Convert to decimal and change luminosity
47
+ let rgb = "#";
48
+ for (let i = 0; i < 3; i++) {
49
+ const decimal = parseInt(hex.substr(i * 2, 2), 16);
50
+ const appliedLuminance = Math.round(
51
+ Math.min(Math.max(0, decimal + decimal * luminance), 255)
52
+ ).toString(16);
53
+ // 0 pad, if necessary.
54
+ rgb += `00${appliedLuminance}`.substr(appliedLuminance.length);
55
+ }
56
+
57
+ return rgb;
58
+ }
59
+
60
+ class UnifierClass {
61
+ private _web = false;
62
+
63
+ private _dev = false;
64
+
65
+ get web(): boolean {
66
+ return this._web;
67
+ }
68
+
69
+ get dev(): boolean {
70
+ return this._dev;
71
+ }
72
+
73
+ navigation = {
74
+ dismissOverlay: () => {
75
+ console.warn("Dismiss overlay not supported.");
76
+ },
77
+ };
78
+
79
+ // tracking: Tracking,
80
+ utils = {
81
+ copyToClipboard: (text: string) => {
82
+ Clipboard.setString(text);
83
+ },
84
+ dimensions: () => ({
85
+ height: Dimensions.get("window").height,
86
+ width: Dimensions.get("window").width,
87
+ }),
88
+ dismissKeyboard: () => {
89
+ Keyboard.dismiss();
90
+ },
91
+ haptic: () => {
92
+ if (Platform.OS !== "web") {
93
+ return Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
94
+ }
95
+ return;
96
+ },
97
+ makePurchase: () => {
98
+ console.warn("Make purchase not supported yet.");
99
+ },
100
+ openUrl: async (url: string) => {
101
+ return Linking.openURL(url);
102
+ },
103
+ orientationChange: (callback: (orientation: "portrait" | "landscape") => void) => {
104
+ Dimensions.addEventListener("change", () => {
105
+ const screen = Dimensions.get("screen");
106
+ const isPortrait = screen.width < screen.height;
107
+ callback(isPortrait ? "portrait" : "landscape");
108
+ });
109
+ },
110
+ PaymentService: () => {
111
+ console.warn("Make purchase not supported yet.");
112
+ },
113
+ requestPermissions: async (_perm: PermissionKind) => {
114
+ return requestPermissions(_perm);
115
+ // return requestPermissions(perm);
116
+ },
117
+ vibrate: (pattern?: number[]) => {
118
+ Vibration.vibrate(pattern || [100], false);
119
+ },
120
+ // keepAwake: (activate: boolean) => {
121
+ // if (activate) {
122
+ // activateKeepAwake();
123
+ // } else {
124
+ // deactivateKeepAwake();
125
+ // }
126
+ // },
127
+ };
128
+
129
+ storage = {
130
+ getItem: async (key: string, defaultValue?: any) => {
131
+ try {
132
+ const jsonValue = await AsyncStorage.getItem(key);
133
+ if (jsonValue) {
134
+ const value = JSON.parse(jsonValue);
135
+ if (value === null || value === undefined) {
136
+ return defaultValue;
137
+ } else {
138
+ return value;
139
+ }
140
+ } else if (defaultValue !== undefined) {
141
+ return defaultValue;
142
+ } else {
143
+ return null;
144
+ }
145
+ } catch (error) {
146
+ console.error(`[storage] Error reading ${key}`, error);
147
+ return defaultValue || null;
148
+ }
149
+ },
150
+ setItem: async (key: string, item: any) => {
151
+ try {
152
+ const jsonValue = JSON.stringify(item);
153
+ await AsyncStorage.setItem(key, jsonValue);
154
+ } catch (error: any) {
155
+ console.error(`[storage] Error storing ${key}`, item, error);
156
+ throw new Error(error);
157
+ }
158
+ },
159
+ };
160
+
161
+ tracking = {
162
+ log: (message: string) => {
163
+ console.info(message);
164
+ },
165
+ };
166
+
167
+ initIcons = () => {
168
+ console.debug("[unifier] Initializing icons");
169
+ };
170
+ }
171
+
172
+ export const Unifier = new UnifierClass();
@@ -0,0 +1,329 @@
1
+ // Originally based on https://github.com/pinterest/gestalt
2
+ // Forked, updated to Typescript, and added features.
3
+ import get from "lodash/get";
4
+ import {Platform} from "react-native";
5
+
6
+ import type {APIError, BaseProfile, IconSize} from "./Common";
7
+ import {COUNTY_AND_COUNTY_EQUIVALENT_ENTITIES} from "./Constants";
8
+
9
+ export function mergeInlineStyles(inlineStyle?: any, newStyle?: any) {
10
+ const inline = get(inlineStyle, "__style");
11
+ return {
12
+ __style: {
13
+ ...inline,
14
+ ...newStyle,
15
+ },
16
+ };
17
+ }
18
+
19
+ export function isTestUser(profile?: BaseProfile) {
20
+ return (
21
+ profile?.email &&
22
+ (profile.email.indexOf("nang.io") > -1 || profile.email.indexOf("example.com") > -1)
23
+ );
24
+ }
25
+
26
+ export const iconNumberToSize = (size = 16): IconSize => {
27
+ let iconSize: IconSize;
28
+ if (size < 8) {
29
+ iconSize = "xs";
30
+ } else if (size < 12) {
31
+ iconSize = "sm";
32
+ } else if (size < 14) {
33
+ iconSize = "md";
34
+ } else if (size < 20) {
35
+ iconSize = "lg";
36
+ } else {
37
+ iconSize = "xl";
38
+ }
39
+ return iconSize;
40
+ };
41
+
42
+ /*
43
+
44
+ Style is a monoid that capture the "to-be-applied" styles (inline and classes)
45
+ for a Box. It's basically set that is closed under an associative binary
46
+ operation and has an identity element such that for all HA HA HA. Yes, it's a
47
+ monoid, which sounds scary but it's not really and actually super useful. All
48
+ that means is that basically you can do two things with it:
49
+
50
+ 1. concat(concat(a, b), c) === concat(a, concat(b, c));
51
+ 2. concat(identity(), a) === concat(a, identity()) === a;
52
+
53
+ What that means is that it's really easy to compose styles together and the
54
+ order in which you do so doesn't really matter.
55
+
56
+ */
57
+
58
+ interface InlineStyle {
59
+ [key: string]: string | number | undefined;
60
+ }
61
+
62
+ // TODO: This type should be opaque, however the Babel parser doesn't support
63
+ // the opaque syntax yet.
64
+ export interface Style {
65
+ className: Set<string>;
66
+ inlineStyle: InlineStyle;
67
+ }
68
+
69
+ export const identity = (): Style => ({
70
+ className: new Set(),
71
+ inlineStyle: {},
72
+ });
73
+
74
+ export const fromClassName = (...classNames: string[]): Style => ({
75
+ className: new Set(classNames),
76
+ inlineStyle: {},
77
+ });
78
+
79
+ export const fromInlineStyle = (inlineStyle: InlineStyle): Style => ({
80
+ className: new Set(),
81
+ inlineStyle,
82
+ });
83
+
84
+ export const concat = (styles: Style[]): Style =>
85
+ styles.reduce(
86
+ (
87
+ {className: classNameA, inlineStyle: inlineStyleA},
88
+ {className: classNameB, inlineStyle: inlineStyleB}
89
+ ) => ({
90
+ className: new Set([...classNameA, ...classNameB]),
91
+ inlineStyle: {...inlineStyleA, ...inlineStyleB},
92
+ }),
93
+ identity()
94
+ );
95
+
96
+ export const mapClassName =
97
+ (fn: (x: string) => string) =>
98
+ ({className, inlineStyle}: Style): Style => ({
99
+ className: new Set(Array.from(className).map(fn)),
100
+ inlineStyle,
101
+ });
102
+
103
+ export const toProps = ({
104
+ className,
105
+ inlineStyle,
106
+ }: Style): {className: string; style: InlineStyle} => {
107
+ const props: any = {};
108
+
109
+ if (className.size > 0) {
110
+ // Sorting here ensures that classNames are always stable, reducing diff
111
+ // churn. Box usually has a small number of properties so it's not a perf
112
+ // concern.
113
+ props.className = Array.from(className).sort().join(" ");
114
+ }
115
+
116
+ if (Object.keys(inlineStyle).length > 0) {
117
+ props.style = inlineStyle;
118
+ }
119
+
120
+ return props;
121
+ };
122
+
123
+ /*
124
+
125
+ Transforms
126
+
127
+ These are a collection of a few functors that take values and returns Style's. OMG,
128
+ I used the word functor - it's really just a fancy word for function.
129
+
130
+ */
131
+ type Functor<T> = (n: T) => Style;
132
+
133
+ // Adds a classname when a property is present.
134
+ //
135
+ // <Box top />
136
+ //
137
+ export const toggle =
138
+ (...classNames: string[]) =>
139
+ (val?: boolean) =>
140
+ val ? fromClassName(...classNames) : identity();
141
+
142
+ // Maps string values to classes
143
+ //
144
+ // <Box alignItems="center" />
145
+ //
146
+ export const mapping = (map: {[key: string]: string}) => (val: string) =>
147
+ Object.hasOwn(map, val) ? fromClassName(map[val]) : identity();
148
+
149
+ // Maps a range of integers to a range of classnames
150
+ //
151
+ // <Box padding={1} />
152
+ //
153
+ export const range =
154
+ (scale: string) =>
155
+ (n: number): Style =>
156
+ fromClassName(`${scale}${n < 0 ? `N${Math.abs(n)}` : n}`);
157
+
158
+ // Like `range`, maps a range of integers to a range of classnames, excluding
159
+ // zero values.
160
+ //
161
+ // <Box padding={0} />
162
+ export const rangeWithoutZero =
163
+ (scale: string) =>
164
+ (n: number): Style =>
165
+ n === 0 ? identity() : range(scale)(n);
166
+
167
+ // Binds a string classname to the value in an object. Useful when interacting
168
+ // with ranges that need to come dynamically from a style object. This is
169
+ // similar to the NPM package 'classnames/bind'.
170
+ export function bind<T>(
171
+ fn: Functor<T>,
172
+ scope:
173
+ | {
174
+ readonly [key: string]: string;
175
+ }
176
+ | any
177
+ ): (val: T) => Style {
178
+ const map = mapClassName((name) => scope[name]);
179
+ return (val: T): Style => map(fn(val));
180
+ }
181
+
182
+ // This takes a series of the previously defined functors, runs them all
183
+ // against a value and returns the set of their classnames.
184
+ export const union =
185
+ <T,>(...fns: Functor<T>[]) =>
186
+ (val: T) =>
187
+ concat(fns.map((fn) => fn(val)));
188
+
189
+ export const isNative = (): boolean => {
190
+ return ["android", "ios"].includes(Platform.OS);
191
+ };
192
+
193
+ // Find more information about the address component types here: https://developers.google.com/maps/documentation/javascript/place-autocomplete
194
+ export type AddressComponentType = {
195
+ long_name: string;
196
+ short_name: string;
197
+ types: string[];
198
+ };
199
+
200
+ export const findAddressComponent = (components: AddressComponentType[], type: string): string => {
201
+ return (
202
+ components.find((component: AddressComponentType) => component.types.includes(type))
203
+ ?.long_name ?? ""
204
+ );
205
+ };
206
+
207
+ interface ProcessAddressComponentOptions {
208
+ includeCounty?: boolean;
209
+ }
210
+
211
+ export const processAddressComponents = (
212
+ addressComponents: AddressComponentType[] | undefined,
213
+ options?: ProcessAddressComponentOptions
214
+ ) => {
215
+ let processedAddressComponents: {
216
+ address1: string;
217
+ city: string;
218
+ state: string;
219
+ zipcode: string;
220
+ countyName?: string;
221
+ countyCode?: string;
222
+ } = {
223
+ address1: "",
224
+ city: "",
225
+ state: "",
226
+ zipcode: "",
227
+ };
228
+
229
+ if (!addressComponents || addressComponents.length === 0) {
230
+ console.warn("Invalid address components");
231
+ if (options?.includeCounty) {
232
+ return {
233
+ ...processedAddressComponents,
234
+ countyCode: "",
235
+ countyName: "",
236
+ };
237
+ } else {
238
+ return processedAddressComponents;
239
+ }
240
+ }
241
+
242
+ const streetNumber = findAddressComponent(addressComponents, "street_number");
243
+ const streetName = findAddressComponent(addressComponents, "route");
244
+ const city = findAddressComponent(addressComponents, "locality");
245
+ const state = findAddressComponent(addressComponents, "administrative_area_level_1");
246
+ const zipcode = findAddressComponent(addressComponents, "postal_code");
247
+
248
+ processedAddressComponents = {
249
+ address1: `${streetNumber} ${streetName}`.trim(),
250
+ city,
251
+ state,
252
+ zipcode,
253
+ };
254
+
255
+ if (options?.includeCounty) {
256
+ const countyName = findAddressComponent(addressComponents, "administrative_area_level_2");
257
+ if (state && countyName) {
258
+ const countyCode = formattedCountyCode(state, countyName);
259
+ processedAddressComponents = {
260
+ ...processedAddressComponents,
261
+ countyCode,
262
+ countyName,
263
+ };
264
+ } else {
265
+ processedAddressComponents = {
266
+ ...processedAddressComponents,
267
+ countyName,
268
+ };
269
+ }
270
+ }
271
+ return processedAddressComponents;
272
+ };
273
+
274
+ // Google does not provide a way to validate API keys, so we have to do it ourselves
275
+ export const isValidGoogleApiKey = (apiKey: string): boolean => {
276
+ if (typeof apiKey !== "string" || apiKey.trim().length === 0) {
277
+ console.warn("Google API key validation failed: key is not a string or is empty");
278
+ return false;
279
+ }
280
+ // Typical Google API keys are around 39 characters
281
+ if (apiKey.length < 30 || apiKey.length > 50) {
282
+ console.warn("Google API key validation failed: key is invalid length");
283
+ return false;
284
+ }
285
+ // Check the presence of alphanumeric characters and dashes
286
+ const apiKeyRegex = /^[A-Za-z0-9-_]+$/;
287
+ if (!apiKeyRegex.test(apiKey)) {
288
+ console.warn("Google API key validation failed: key contains invalid characters");
289
+ return false;
290
+ }
291
+ return true;
292
+ };
293
+
294
+ export function formattedCountyCode(state: string, countyName: string): string {
295
+ // Remove whitespace and convert to lowercase for comparison
296
+ const stateKey = state
297
+ .replace(/\s+/g, "")
298
+ .toLowerCase() as keyof typeof COUNTY_AND_COUNTY_EQUIVALENT_ENTITIES;
299
+
300
+ const stateData = COUNTY_AND_COUNTY_EQUIVALENT_ENTITIES[stateKey];
301
+
302
+ // Remove whitespace, periods, apostrophes, and dashes for comparison
303
+ const countyKey = countyName
304
+ .trim()
305
+ .toLowerCase()
306
+ .replace(/[\s.'-]/g, "") as keyof typeof stateData;
307
+
308
+ const countyData: {
309
+ stateFP: string;
310
+ countyFP: string;
311
+ } = stateData?.[countyKey];
312
+ if (!countyData) {
313
+ return "";
314
+ }
315
+
316
+ return `${countyData.stateFP}${countyData.countyFP}`;
317
+ }
318
+
319
+ export function isAPIError(error: any): error is APIError {
320
+ return error?.data?.title;
321
+ }
322
+
323
+ export function printAPIError(error: APIError, details = true): string {
324
+ let message = error.data?.title;
325
+ if (error.data?.detail && details) {
326
+ message = `${message}: ${error.data?.detail}`;
327
+ }
328
+ return message;
329
+ }
@@ -0,0 +1,84 @@
1
+ import {type ReactElement, useEffect, useRef, useState} from "react";
2
+
3
+ import type {AddressAutocompleteProps} from "./Common";
4
+ import {GOOGLE_PLACES_API_RESTRICTIONS} from "./Constants";
5
+ import {TextField} from "./TextField";
6
+ import {processAddressComponents} from "./Utilities";
7
+
8
+ const loadGooglePlacesScript = (googleMapsApiKey: string, callbackName: any): Promise<void> => {
9
+ return new Promise<void>((resolve, reject): undefined => {
10
+ if (window.google?.maps?.places) {
11
+ resolve();
12
+ return;
13
+ }
14
+ (window as any)[callbackName] = (): void => resolve();
15
+ const script: HTMLScriptElement = document.createElement("script");
16
+
17
+ script.src = `https://maps.googleapis.com/maps/api/js?key=${googleMapsApiKey}&libraries=places&callback=${callbackName}`;
18
+ script.async = true;
19
+ script.defer = true;
20
+ script.onerror = (): any => reject(new Error("Google Maps script failed to load"));
21
+ document.head.appendChild(script);
22
+ return;
23
+ });
24
+ };
25
+
26
+ export const WebAddressAutocomplete = ({
27
+ disabled,
28
+ googleMapsApiKey,
29
+ includeCounty,
30
+ inputValue,
31
+ handleAddressChange,
32
+ handleAutoCompleteChange,
33
+ }: AddressAutocompleteProps): ReactElement => {
34
+ const [scriptLoaded, setScriptLoaded] = useState(true);
35
+ const autocompleteInputRef = useRef(null);
36
+
37
+ // Load the Google Maps script and initialize the autocomplete.
38
+ useEffect(() => {
39
+ const callbackName = "initAutocomplete";
40
+ if (!googleMapsApiKey) {
41
+ setScriptLoaded(false);
42
+ return;
43
+ }
44
+ loadGooglePlacesScript(googleMapsApiKey, callbackName)
45
+ .then(() => {
46
+ const autocomplete = new window.google.maps.places.Autocomplete(
47
+ autocompleteInputRef.current,
48
+ {
49
+ componentRestrictions: {country: GOOGLE_PLACES_API_RESTRICTIONS.components.country},
50
+ fields: Object.values(GOOGLE_PLACES_API_RESTRICTIONS.fields),
51
+ }
52
+ );
53
+ autocomplete.addListener("place_changed", () => {
54
+ const place = autocomplete.getPlace();
55
+ const addressComponents = place?.address_components;
56
+ const formattedAddressObject = processAddressComponents(addressComponents, {
57
+ includeCounty,
58
+ });
59
+ handleAutoCompleteChange(formattedAddressObject);
60
+ });
61
+ })
62
+ .catch((error) => {
63
+ console.warn(error);
64
+ setScriptLoaded(false);
65
+ });
66
+ // Cleanup
67
+ return () => {
68
+ (window as any)[callbackName] = null;
69
+ };
70
+ }, [googleMapsApiKey, includeCounty, handleAutoCompleteChange]);
71
+
72
+ return (
73
+ <TextField
74
+ disabled={disabled}
75
+ inputRef={scriptLoaded ? (ref: any): void => (autocompleteInputRef.current = ref) : undefined}
76
+ onChange={(value): void => {
77
+ handleAddressChange(value);
78
+ }}
79
+ placeholder="Enter an address"
80
+ type="text"
81
+ value={inputValue}
82
+ />
83
+ );
84
+ };
@@ -0,0 +1,126 @@
1
+ // Bun Snapshot v1, https://bun.sh/docs/test/snapshots
2
+
3
+ exports[`Accordion renders correctly with default props 1`] = `
4
+ {
5
+ "$$typeof": Symbol(react.test.json),
6
+ "children": [
7
+ {
8
+ "$$typeof": Symbol(react.test.json),
9
+ "children": [
10
+ {
11
+ "$$typeof": Symbol(react.test.json),
12
+ "children": [
13
+ {
14
+ "$$typeof": Symbol(react.test.json),
15
+ "children": [
16
+ {
17
+ "$$typeof": Symbol(react.test.json),
18
+ "children": [
19
+ "Test Title",
20
+ ],
21
+ "props": {
22
+ "numberOfLines": 0,
23
+ "style": {
24
+ "color": "#1C1C1C",
25
+ "fontFamily": "heading-bold",
26
+ "fontSize": 16,
27
+ },
28
+ "testID": undefined,
29
+ },
30
+ "type": "Text",
31
+ },
32
+ ],
33
+ "props": {
34
+ "style": {
35
+ "alignItems": "center",
36
+ "flexDirection": "row",
37
+ },
38
+ "testID": undefined,
39
+ },
40
+ "type": "View",
41
+ },
42
+ ],
43
+ "props": {
44
+ "style": {
45
+ "flexDirection": "column",
46
+ "gap": 4,
47
+ },
48
+ "testID": undefined,
49
+ },
50
+ "type": "View",
51
+ },
52
+ {
53
+ "$$typeof": Symbol(react.test.json),
54
+ "children": [
55
+ {
56
+ "$$typeof": Symbol(react.test.json),
57
+ "children": null,
58
+ "props": {
59
+ "aria-role": "button",
60
+ "hitSlop": {
61
+ "bottom": 20,
62
+ "left": 20,
63
+ "right": 20,
64
+ "top": 20,
65
+ },
66
+ "onPress": [Function],
67
+ "testID": "accordion-toggle",
68
+ },
69
+ "type": "Pressable",
70
+ },
71
+ ],
72
+ "props": {
73
+ "style": undefined,
74
+ "testID": undefined,
75
+ },
76
+ "type": "View",
77
+ },
78
+ ],
79
+ "props": {
80
+ "style": {
81
+ "alignItems": "center",
82
+ "flexDirection": "row",
83
+ "justifyContent": "space-between",
84
+ },
85
+ "testID": undefined,
86
+ },
87
+ "type": "View",
88
+ },
89
+ {
90
+ "$$typeof": Symbol(react.test.json),
91
+ "children": [
92
+ {
93
+ "$$typeof": Symbol(react.test.json),
94
+ "children": [
95
+ "Test Content",
96
+ ],
97
+ "props": {
98
+ "style": undefined,
99
+ "testID": "test-content",
100
+ },
101
+ "type": "Text",
102
+ },
103
+ ],
104
+ "props": {
105
+ "style": {
106
+ "marginTop": 8,
107
+ },
108
+ "testID": undefined,
109
+ },
110
+ "type": "View",
111
+ },
112
+ ],
113
+ "props": {
114
+ "style": {
115
+ "borderBottomColor": "#CDCDCD",
116
+ "borderBottomWidth": 2,
117
+ "borderTopColor": "#CDCDCD",
118
+ "borderTopWidth": 2,
119
+ "padding": 16,
120
+ "width": "100%",
121
+ },
122
+ "testID": undefined,
123
+ },
124
+ "type": "View",
125
+ }
126
+ `;