@ledgerhq/lumen-ui-rnative 0.1.47 → 0.1.49

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 (362) hide show
  1. package/dist/module/i18n/locales/de.json +1 -3
  2. package/dist/module/i18n/locales/en.json +1 -3
  3. package/dist/module/i18n/locales/es.json +1 -3
  4. package/dist/module/i18n/locales/fr.json +1 -3
  5. package/dist/module/i18n/locales/ja.json +1 -3
  6. package/dist/module/i18n/locales/ko.json +1 -3
  7. package/dist/module/i18n/locales/pt.json +1 -3
  8. package/dist/module/i18n/locales/ru.json +1 -3
  9. package/dist/module/i18n/locales/th.json +1 -3
  10. package/dist/module/i18n/locales/tr.json +1 -3
  11. package/dist/module/i18n/locales/zh.json +1 -3
  12. package/dist/module/lib/Animations/Pulse/Pulse.js +3 -3
  13. package/dist/module/lib/Animations/Pulse/Pulse.js.map +1 -1
  14. package/dist/module/lib/Animations/Pulse/Pulse.mdx +0 -1
  15. package/dist/module/lib/Animations/Spin/Spin.js +3 -3
  16. package/dist/module/lib/Animations/Spin/Spin.js.map +1 -1
  17. package/dist/module/lib/Animations/Spin/Spin.mdx +0 -1
  18. package/dist/module/lib/Components/AddressInput/AddressInput.figma.js +36 -0
  19. package/dist/module/lib/Components/AddressInput/AddressInput.figma.js.map +1 -0
  20. package/dist/module/lib/Components/AddressInput/AddressInput.mdx +0 -183
  21. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.figma.js +31 -0
  22. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.figma.js.map +1 -0
  23. package/dist/module/lib/Components/AmountDisplay/AmountDisplay.mdx +0 -90
  24. package/dist/module/lib/Components/AmountInput/AmountInput.figma.js +70 -0
  25. package/dist/module/lib/Components/AmountInput/AmountInput.figma.js.map +1 -0
  26. package/dist/module/lib/Components/AmountInput/AmountInput.js +3 -1
  27. package/dist/module/lib/Components/AmountInput/AmountInput.js.map +1 -1
  28. package/dist/module/lib/Components/AmountInput/AmountInput.mdx +0 -190
  29. package/dist/module/lib/Components/AmountInput/AmountInput.stories.js +15 -0
  30. package/dist/module/lib/Components/AmountInput/AmountInput.stories.js.map +1 -1
  31. package/dist/module/lib/Components/AmountInput/useAmountInputFormatting/useAmountInputFormatting.js +1 -1
  32. package/dist/module/lib/Components/AmountInput/useAmountInputFormatting/useAmountInputFormatting.js.map +1 -1
  33. package/dist/module/lib/Components/AmountInput/useAmountInputFormatting/useAmountInputFormatting.test.js +20 -1
  34. package/dist/module/lib/Components/AmountInput/useAmountInputFormatting/useAmountInputFormatting.test.js.map +1 -1
  35. package/dist/module/lib/Components/Avatar/Avatar.figma.js +15 -12
  36. package/dist/module/lib/Components/Avatar/Avatar.figma.js.map +1 -1
  37. package/dist/module/lib/Components/Avatar/Avatar.js +4 -27
  38. package/dist/module/lib/Components/Avatar/Avatar.js.map +1 -1
  39. package/dist/module/lib/Components/Avatar/Avatar.mdx +53 -69
  40. package/dist/module/lib/Components/Avatar/Avatar.stories.js +27 -33
  41. package/dist/module/lib/Components/Avatar/Avatar.stories.js.map +1 -1
  42. package/dist/module/lib/Components/Avatar/Avatar.test.js +21 -39
  43. package/dist/module/lib/Components/Avatar/Avatar.test.js.map +1 -1
  44. package/dist/module/lib/Components/Banner/Banner.figma.js +107 -0
  45. package/dist/module/lib/Components/Banner/Banner.figma.js.map +1 -0
  46. package/dist/module/lib/Components/Banner/Banner.mdx +0 -86
  47. package/dist/module/lib/Components/BottomSheet/BottomSheet.figma.js +49 -0
  48. package/dist/module/lib/Components/BottomSheet/BottomSheet.figma.js.map +1 -0
  49. package/dist/module/lib/Components/BottomSheet/BottomSheet.mdx +0 -119
  50. package/dist/module/lib/Components/Button/Button.figma.js +45 -0
  51. package/dist/module/lib/Components/Button/Button.figma.js.map +1 -0
  52. package/dist/module/lib/Components/Button/Button.mdx +25 -224
  53. package/dist/module/lib/Components/Button/Button.stories.js +4 -36
  54. package/dist/module/lib/Components/Button/Button.stories.js.map +1 -1
  55. package/dist/module/lib/Components/Card/Card.figma.js +143 -0
  56. package/dist/module/lib/Components/Card/Card.figma.js.map +1 -0
  57. package/dist/module/lib/Components/Card/Card.mdx +0 -160
  58. package/dist/module/lib/Components/CardButton/CardButton.figma.js +38 -0
  59. package/dist/module/lib/Components/CardButton/CardButton.figma.js.map +1 -0
  60. package/dist/module/lib/Components/CardButton/CardButton.mdx +0 -48
  61. package/dist/module/lib/Components/Checkbox/Checkbox.figma.js +48 -0
  62. package/dist/module/lib/Components/Checkbox/Checkbox.figma.js.map +1 -0
  63. package/dist/module/lib/Components/Checkbox/Checkbox.mdx +0 -73
  64. package/dist/module/lib/Components/ContentBanner/ContentBanner.figma.js +91 -0
  65. package/dist/module/lib/Components/ContentBanner/ContentBanner.figma.js.map +1 -0
  66. package/dist/module/lib/Components/ContentBanner/ContentBanner.mdx +0 -2
  67. package/dist/module/lib/Components/CryptoIcon/CryptoIcon.figma.js +17 -0
  68. package/dist/module/lib/Components/CryptoIcon/CryptoIcon.figma.js.map +1 -0
  69. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.figma.js +29 -0
  70. package/dist/module/lib/Components/DescriptionItem/DescriptionItem.figma.js.map +1 -0
  71. package/dist/module/lib/Components/Divider/Divider.figma.js +10 -0
  72. package/dist/module/lib/Components/Divider/Divider.figma.js.map +1 -0
  73. package/dist/module/lib/Components/Divider/Divider.mdx +0 -2
  74. package/dist/module/lib/Components/DotCount/DotCount.figma.js +29 -0
  75. package/dist/module/lib/Components/DotCount/DotCount.figma.js.map +1 -0
  76. package/dist/module/lib/Components/DotIndicator/DotIndicator.figma.js +29 -0
  77. package/dist/module/lib/Components/DotIndicator/DotIndicator.figma.js.map +1 -0
  78. package/dist/module/lib/Components/DotIndicator/DotIndicator.stories.js +6 -3
  79. package/dist/module/lib/Components/DotIndicator/DotIndicator.stories.js.map +1 -1
  80. package/dist/module/lib/Components/DotIndicator/getDotIndicatorProps.js +17 -0
  81. package/dist/module/lib/Components/DotIndicator/getDotIndicatorProps.js.map +1 -0
  82. package/dist/module/lib/Components/DotIndicator/getDotIndicatorProps.test.js +17 -0
  83. package/dist/module/lib/Components/DotIndicator/getDotIndicatorProps.test.js.map +1 -0
  84. package/dist/module/lib/Components/DotIndicator/index.js +1 -0
  85. package/dist/module/lib/Components/DotIndicator/index.js.map +1 -1
  86. package/dist/module/lib/Components/Icon/Icon.figma.js +1840 -0
  87. package/dist/module/lib/Components/Icon/Icon.figma.js.map +1 -0
  88. package/dist/module/lib/Components/Icon/Icon.mdx +0 -62
  89. package/dist/module/lib/Components/IconButton/IconButton.figma.js +42 -0
  90. package/dist/module/lib/Components/IconButton/IconButton.figma.js.map +1 -0
  91. package/dist/module/lib/Components/IconButton/IconButton.mdx +0 -68
  92. package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.figma.js +51 -0
  93. package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.figma.js.map +1 -0
  94. package/dist/module/lib/Components/InteractiveIcon/InteractiveIcon.mdx +0 -107
  95. package/dist/module/lib/Components/Link/Link.figma.js +41 -0
  96. package/dist/module/lib/Components/Link/Link.figma.js.map +1 -0
  97. package/dist/module/lib/Components/Link/Link.mdx +0 -102
  98. package/dist/module/lib/Components/ListItem/ListItem.figma.js +416 -0
  99. package/dist/module/lib/Components/ListItem/ListItem.figma.js.map +1 -0
  100. package/dist/module/lib/Components/ListItem/ListItem.mdx +0 -129
  101. package/dist/module/lib/Components/MediaBanner/MediaBanner.figma.js +25 -0
  102. package/dist/module/lib/Components/MediaBanner/MediaBanner.figma.js.map +1 -0
  103. package/dist/module/lib/Components/MediaBanner/MediaBanner.mdx +0 -3
  104. package/dist/module/lib/Components/MediaButton/MediaButton.figma.js +72 -0
  105. package/dist/module/lib/Components/MediaButton/MediaButton.figma.js.map +1 -0
  106. package/dist/module/lib/Components/MediaCard/MediaCard.figma.js +28 -0
  107. package/dist/module/lib/Components/MediaCard/MediaCard.figma.js.map +1 -0
  108. package/dist/module/lib/Components/MediaCard/MediaCard.mdx +0 -2
  109. package/dist/module/lib/Components/MediaImage/MediaImage.mdx +0 -1
  110. package/dist/module/lib/Components/MediaTag/MediaTag.figma.js +100 -0
  111. package/dist/module/lib/Components/MediaTag/MediaTag.figma.js.map +1 -0
  112. package/dist/module/lib/Components/MediaTag/MediaTag.mdx +0 -2
  113. package/dist/module/lib/Components/NavBar/NavBar.figma.js +79 -0
  114. package/dist/module/lib/Components/NavBar/NavBar.figma.js.map +1 -0
  115. package/dist/module/lib/Components/NavBar/NavBar.mdx +0 -2
  116. package/dist/module/lib/Components/OptionList/OptionList.js +16 -1
  117. package/dist/module/lib/Components/OptionList/OptionList.js.map +1 -1
  118. package/dist/module/lib/Components/OptionList/OptionList.mdx +45 -90
  119. package/dist/module/lib/Components/OptionList/OptionList.stories.js +61 -1
  120. package/dist/module/lib/Components/OptionList/OptionList.stories.js.map +1 -1
  121. package/dist/module/lib/Components/OptionList/OptionList.test.js +43 -1
  122. package/dist/module/lib/Components/OptionList/OptionList.test.js.map +1 -1
  123. package/dist/module/lib/Components/OptionList/useOptionList/useOptionListItems.js.map +1 -1
  124. package/dist/module/lib/Components/PageIndicator/PageIndicator.figma.js +13 -0
  125. package/dist/module/lib/Components/PageIndicator/PageIndicator.figma.js.map +1 -0
  126. package/dist/module/lib/Components/PageIndicator/PageIndicator.mdx +0 -2
  127. package/dist/module/lib/Components/SearchInput/SearchInput.figma.js +31 -0
  128. package/dist/module/lib/Components/SearchInput/SearchInput.figma.js.map +1 -0
  129. package/dist/module/lib/Components/SearchInput/SearchInput.mdx +0 -199
  130. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.figma.js +35 -0
  131. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.figma.js.map +1 -0
  132. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.js +7 -1
  133. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.js.map +1 -1
  134. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.mdx +28 -1
  135. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.stories.js +24 -1
  136. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.stories.js.map +1 -1
  137. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.test.js +28 -1
  138. package/dist/module/lib/Components/SegmentedControl/SegmentedControl.test.js.map +1 -1
  139. package/dist/module/lib/Components/Skeleton/Skeleton.figma.js +18 -0
  140. package/dist/module/lib/Components/Skeleton/Skeleton.figma.js.map +1 -0
  141. package/dist/module/lib/Components/Skeleton/Skeleton.mdx +0 -71
  142. package/dist/module/lib/Components/Spinner/Spinner.figma.js +13 -0
  143. package/dist/module/lib/Components/Spinner/Spinner.figma.js.map +1 -0
  144. package/dist/module/lib/Components/Spinner/Spinner.mdx +0 -100
  145. package/dist/module/lib/Components/Spot/Spot.figma.js +37 -0
  146. package/dist/module/lib/Components/Spot/Spot.figma.js.map +1 -0
  147. package/dist/module/lib/Components/Spot/Spot.mdx +0 -94
  148. package/dist/module/lib/Components/Stepper/Stepper.figma.js +13 -0
  149. package/dist/module/lib/Components/Stepper/Stepper.figma.js.map +1 -0
  150. package/dist/module/lib/Components/Stepper/Stepper.mdx +0 -67
  151. package/dist/module/lib/Components/Subheader/Subheader.figma.js +67 -0
  152. package/dist/module/lib/Components/Subheader/Subheader.figma.js.map +1 -0
  153. package/dist/module/lib/Components/Subheader/Subheader.mdx +0 -116
  154. package/dist/module/lib/Components/Switch/Switch.figma.js +58 -0
  155. package/dist/module/lib/Components/Switch/Switch.figma.js.map +1 -0
  156. package/dist/module/lib/Components/Switch/Switch.mdx +0 -39
  157. package/dist/module/lib/Components/TabBar/TabBar.figma.js +98 -0
  158. package/dist/module/lib/Components/TabBar/TabBar.figma.js.map +1 -0
  159. package/dist/module/lib/Components/TabBar/TabBar.js +7 -4
  160. package/dist/module/lib/Components/TabBar/TabBar.js.map +1 -1
  161. package/dist/module/lib/Components/TabBar/TabBar.mdx +29 -5
  162. package/dist/module/lib/Components/TabBar/TabBar.stories.js +35 -1
  163. package/dist/module/lib/Components/TabBar/TabBar.stories.js.map +1 -1
  164. package/dist/module/lib/Components/TabBar/TabBar.test.js +28 -1
  165. package/dist/module/lib/Components/TabBar/TabBar.test.js.map +1 -1
  166. package/dist/module/lib/Components/TabBar/index.js +2 -1
  167. package/dist/module/lib/Components/TabBar/index.js.map +1 -1
  168. package/dist/module/lib/Components/Tag/Tag.figma.js +41 -0
  169. package/dist/module/lib/Components/Tag/Tag.figma.js.map +1 -0
  170. package/dist/module/lib/Components/Tag/Tag.mdx +0 -2
  171. package/dist/module/lib/Components/TextInput/TextInput.figma.js +37 -0
  172. package/dist/module/lib/Components/TextInput/TextInput.figma.js.map +1 -0
  173. package/dist/module/lib/Components/TextInput/TextInput.mdx +0 -178
  174. package/dist/module/lib/Components/Tile/Tile.figma.js +111 -0
  175. package/dist/module/lib/Components/Tile/Tile.figma.js.map +1 -0
  176. package/dist/module/lib/Components/Tile/Tile.mdx +0 -53
  177. package/dist/module/lib/Components/TileButton/TileButton.figma.js +23 -0
  178. package/dist/module/lib/Components/TileButton/TileButton.figma.js.map +1 -0
  179. package/dist/module/lib/Components/TileButton/TileButton.mdx +0 -40
  180. package/dist/module/lib/Components/Tooltip/Tooltip.figma.js +26 -0
  181. package/dist/module/lib/Components/Tooltip/Tooltip.figma.js.map +1 -0
  182. package/dist/module/lib/Components/Tooltip/Tooltip.mdx +0 -183
  183. package/dist/module/lib/Components/Trend/Trend.figma.js +29 -0
  184. package/dist/module/lib/Components/Trend/Trend.figma.js.map +1 -0
  185. package/dist/module/lib/Components/Trend/Trend.mdx +0 -2
  186. package/dist/module/lib/Components/Utility/Text/Text.mdx +0 -1
  187. package/dist/module/lib/Symbols/Icons/ChevronAscending.js +1 -1
  188. package/dist/module/lib/Symbols/Icons/ChevronDescending.js +1 -1
  189. package/dist/module/lib/Symbols/Icons/Contact.js +50 -0
  190. package/dist/module/lib/Symbols/Icons/Contact.js.map +1 -0
  191. package/dist/module/lib/Symbols/index.js +1 -0
  192. package/dist/module/lib/Symbols/index.js.map +1 -1
  193. package/dist/typescript/src/lib/Animations/Pulse/Pulse.d.ts.map +1 -1
  194. package/dist/typescript/src/lib/Animations/Spin/Spin.d.ts.map +1 -1
  195. package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts +1 -1
  196. package/dist/typescript/src/lib/Components/AmountInput/AmountInput.d.ts.map +1 -1
  197. package/dist/typescript/src/lib/Components/AmountInput/types.d.ts +8 -0
  198. package/dist/typescript/src/lib/Components/AmountInput/types.d.ts.map +1 -1
  199. package/dist/typescript/src/lib/Components/AmountInput/useAmountInputFormatting/useAmountInputFormatting.d.ts +1 -0
  200. package/dist/typescript/src/lib/Components/AmountInput/useAmountInputFormatting/useAmountInputFormatting.d.ts.map +1 -1
  201. package/dist/typescript/src/lib/Components/Avatar/Avatar.d.ts +1 -4
  202. package/dist/typescript/src/lib/Components/Avatar/Avatar.d.ts.map +1 -1
  203. package/dist/typescript/src/lib/Components/Avatar/types.d.ts +0 -6
  204. package/dist/typescript/src/lib/Components/Avatar/types.d.ts.map +1 -1
  205. package/dist/typescript/src/lib/Components/DotIndicator/getDotIndicatorProps.d.ts +24 -0
  206. package/dist/typescript/src/lib/Components/DotIndicator/getDotIndicatorProps.d.ts.map +1 -0
  207. package/dist/typescript/src/lib/Components/DotIndicator/index.d.ts +1 -0
  208. package/dist/typescript/src/lib/Components/DotIndicator/index.d.ts.map +1 -1
  209. package/dist/typescript/src/lib/Components/OptionList/OptionList.d.ts +18 -4
  210. package/dist/typescript/src/lib/Components/OptionList/OptionList.d.ts.map +1 -1
  211. package/dist/typescript/src/lib/Components/OptionList/types.d.ts +16 -15
  212. package/dist/typescript/src/lib/Components/OptionList/types.d.ts.map +1 -1
  213. package/dist/typescript/src/lib/Components/OptionList/useOptionList/useOptionListItems.d.ts +9 -9
  214. package/dist/typescript/src/lib/Components/OptionList/useOptionList/useOptionListItems.d.ts.map +1 -1
  215. package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControl.d.ts +8 -3
  216. package/dist/typescript/src/lib/Components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  217. package/dist/typescript/src/lib/Components/SegmentedControl/types.d.ts +6 -5
  218. package/dist/typescript/src/lib/Components/SegmentedControl/types.d.ts.map +1 -1
  219. package/dist/typescript/src/lib/Components/TabBar/TabBar.d.ts +7 -2
  220. package/dist/typescript/src/lib/Components/TabBar/TabBar.d.ts.map +1 -1
  221. package/dist/typescript/src/lib/Components/TabBar/index.d.ts +2 -2
  222. package/dist/typescript/src/lib/Components/TabBar/index.d.ts.map +1 -1
  223. package/dist/typescript/src/lib/Components/TabBar/types.d.ts +17 -16
  224. package/dist/typescript/src/lib/Components/TabBar/types.d.ts.map +1 -1
  225. package/dist/typescript/src/lib/Symbols/Icons/Contact.d.ts +35 -0
  226. package/dist/typescript/src/lib/Symbols/Icons/Contact.d.ts.map +1 -0
  227. package/dist/typescript/src/lib/Symbols/index.d.ts +1 -0
  228. package/dist/typescript/src/lib/Symbols/index.d.ts.map +1 -1
  229. package/package.json +3 -3
  230. package/src/i18n/locales/de.json +1 -3
  231. package/src/i18n/locales/en.json +1 -3
  232. package/src/i18n/locales/es.json +1 -3
  233. package/src/i18n/locales/fr.json +1 -3
  234. package/src/i18n/locales/ja.json +1 -3
  235. package/src/i18n/locales/ko.json +1 -3
  236. package/src/i18n/locales/pt.json +1 -3
  237. package/src/i18n/locales/ru.json +1 -3
  238. package/src/i18n/locales/th.json +1 -3
  239. package/src/i18n/locales/tr.json +1 -3
  240. package/src/i18n/locales/zh.json +1 -3
  241. package/src/lib/Animations/Pulse/Pulse.mdx +0 -1
  242. package/src/lib/Animations/Pulse/Pulse.tsx +8 -1
  243. package/src/lib/Animations/Spin/Spin.mdx +0 -1
  244. package/src/lib/Animations/Spin/Spin.tsx +8 -1
  245. package/src/lib/Components/AddressInput/AddressInput.figma.tsx +39 -0
  246. package/src/lib/Components/AddressInput/AddressInput.mdx +0 -183
  247. package/src/lib/Components/AmountDisplay/AmountDisplay.figma.tsx +37 -0
  248. package/src/lib/Components/AmountDisplay/AmountDisplay.mdx +0 -90
  249. package/src/lib/Components/AmountInput/AmountInput.figma.tsx +78 -0
  250. package/src/lib/Components/AmountInput/AmountInput.mdx +0 -190
  251. package/src/lib/Components/AmountInput/AmountInput.stories.tsx +14 -0
  252. package/src/lib/Components/AmountInput/AmountInput.tsx +2 -0
  253. package/src/lib/Components/AmountInput/types.ts +8 -0
  254. package/src/lib/Components/AmountInput/useAmountInputFormatting/useAmountInputFormatting.test.ts +20 -0
  255. package/src/lib/Components/AmountInput/useAmountInputFormatting/useAmountInputFormatting.ts +2 -0
  256. package/src/lib/Components/Avatar/Avatar.figma.tsx +24 -14
  257. package/src/lib/Components/Avatar/Avatar.mdx +53 -69
  258. package/src/lib/Components/Avatar/Avatar.stories.tsx +16 -50
  259. package/src/lib/Components/Avatar/Avatar.test.tsx +12 -32
  260. package/src/lib/Components/Avatar/Avatar.tsx +4 -34
  261. package/src/lib/Components/Avatar/types.ts +0 -6
  262. package/src/lib/Components/Banner/Banner.figma.tsx +115 -0
  263. package/src/lib/Components/Banner/Banner.mdx +0 -86
  264. package/src/lib/Components/BottomSheet/BottomSheet.figma.tsx +52 -0
  265. package/src/lib/Components/BottomSheet/BottomSheet.mdx +0 -119
  266. package/src/lib/Components/Button/Button.figma.tsx +57 -0
  267. package/src/lib/Components/Button/Button.mdx +25 -224
  268. package/src/lib/Components/Button/Button.stories.tsx +3 -35
  269. package/src/lib/Components/Card/Card.figma.tsx +149 -0
  270. package/src/lib/Components/Card/Card.mdx +0 -160
  271. package/src/lib/Components/CardButton/CardButton.figma.tsx +49 -0
  272. package/src/lib/Components/CardButton/CardButton.mdx +0 -48
  273. package/src/lib/Components/Checkbox/Checkbox.figma.tsx +54 -0
  274. package/src/lib/Components/Checkbox/Checkbox.mdx +0 -73
  275. package/src/lib/Components/ContentBanner/ContentBanner.figma.tsx +108 -0
  276. package/src/lib/Components/ContentBanner/ContentBanner.mdx +0 -2
  277. package/src/lib/Components/CryptoIcon/CryptoIcon.figma.tsx +20 -0
  278. package/src/lib/Components/DescriptionItem/DescriptionItem.figma.tsx +36 -0
  279. package/src/lib/Components/Divider/Divider.figma.tsx +11 -0
  280. package/src/lib/Components/Divider/Divider.mdx +0 -2
  281. package/src/lib/Components/DotCount/DotCount.figma.tsx +32 -0
  282. package/src/lib/Components/DotIndicator/DotIndicator.figma.tsx +32 -0
  283. package/src/lib/Components/DotIndicator/DotIndicator.stories.tsx +4 -1
  284. package/src/lib/Components/DotIndicator/getDotIndicatorProps.test.ts +15 -0
  285. package/src/lib/Components/DotIndicator/getDotIndicatorProps.ts +10 -0
  286. package/src/lib/Components/DotIndicator/index.ts +1 -0
  287. package/src/lib/Components/Icon/Icon.figma.tsx +3085 -0
  288. package/src/lib/Components/Icon/Icon.mdx +0 -62
  289. package/src/lib/Components/IconButton/IconButton.figma.tsx +53 -0
  290. package/src/lib/Components/IconButton/IconButton.mdx +0 -68
  291. package/src/lib/Components/InteractiveIcon/InteractiveIcon.figma.tsx +52 -0
  292. package/src/lib/Components/InteractiveIcon/InteractiveIcon.mdx +0 -107
  293. package/src/lib/Components/Link/Link.figma.tsx +53 -0
  294. package/src/lib/Components/Link/Link.mdx +0 -102
  295. package/src/lib/Components/ListItem/ListItem.figma.tsx +431 -0
  296. package/src/lib/Components/ListItem/ListItem.mdx +0 -129
  297. package/src/lib/Components/MediaBanner/MediaBanner.figma.tsx +32 -0
  298. package/src/lib/Components/MediaBanner/MediaBanner.mdx +0 -3
  299. package/src/lib/Components/MediaButton/MediaButton.figma.tsx +60 -0
  300. package/src/lib/Components/MediaCard/MediaCard.figma.tsx +27 -0
  301. package/src/lib/Components/MediaCard/MediaCard.mdx +0 -2
  302. package/src/lib/Components/MediaImage/MediaImage.mdx +0 -1
  303. package/src/lib/Components/MediaTag/MediaTag.figma.tsx +116 -0
  304. package/src/lib/Components/MediaTag/MediaTag.mdx +0 -2
  305. package/src/lib/Components/NavBar/NavBar.figma.tsx +84 -0
  306. package/src/lib/Components/NavBar/NavBar.mdx +0 -2
  307. package/src/lib/Components/OptionList/OptionList.mdx +45 -90
  308. package/src/lib/Components/OptionList/OptionList.stories.tsx +63 -0
  309. package/src/lib/Components/OptionList/OptionList.test.tsx +40 -0
  310. package/src/lib/Components/OptionList/OptionList.tsx +57 -10
  311. package/src/lib/Components/OptionList/types.ts +34 -15
  312. package/src/lib/Components/OptionList/useOptionList/useOptionListItems.ts +28 -13
  313. package/src/lib/Components/PageIndicator/PageIndicator.figma.tsx +11 -0
  314. package/src/lib/Components/PageIndicator/PageIndicator.mdx +0 -2
  315. package/src/lib/Components/SearchInput/SearchInput.figma.tsx +34 -0
  316. package/src/lib/Components/SearchInput/SearchInput.mdx +0 -199
  317. package/src/lib/Components/SegmentedControl/SegmentedControl.figma.tsx +34 -0
  318. package/src/lib/Components/SegmentedControl/SegmentedControl.mdx +28 -1
  319. package/src/lib/Components/SegmentedControl/SegmentedControl.stories.tsx +34 -1
  320. package/src/lib/Components/SegmentedControl/SegmentedControl.test.tsx +32 -1
  321. package/src/lib/Components/SegmentedControl/SegmentedControl.tsx +22 -5
  322. package/src/lib/Components/SegmentedControl/types.ts +11 -5
  323. package/src/lib/Components/Skeleton/Skeleton.figma.tsx +17 -0
  324. package/src/lib/Components/Skeleton/Skeleton.mdx +0 -71
  325. package/src/lib/Components/Spinner/Spinner.figma.tsx +12 -0
  326. package/src/lib/Components/Spinner/Spinner.mdx +0 -100
  327. package/src/lib/Components/Spot/Spot.figma.tsx +50 -0
  328. package/src/lib/Components/Spot/Spot.mdx +0 -94
  329. package/src/lib/Components/Stepper/Stepper.figma.tsx +11 -0
  330. package/src/lib/Components/Stepper/Stepper.mdx +0 -67
  331. package/src/lib/Components/Subheader/Subheader.figma.tsx +72 -0
  332. package/src/lib/Components/Subheader/Subheader.mdx +0 -116
  333. package/src/lib/Components/Switch/Switch.figma.tsx +66 -0
  334. package/src/lib/Components/Switch/Switch.mdx +0 -39
  335. package/src/lib/Components/TabBar/TabBar.figma.tsx +70 -0
  336. package/src/lib/Components/TabBar/TabBar.mdx +29 -5
  337. package/src/lib/Components/TabBar/TabBar.stories.tsx +34 -1
  338. package/src/lib/Components/TabBar/TabBar.test.tsx +23 -1
  339. package/src/lib/Components/TabBar/TabBar.tsx +17 -9
  340. package/src/lib/Components/TabBar/index.ts +2 -2
  341. package/src/lib/Components/TabBar/types.ts +19 -17
  342. package/src/lib/Components/Tag/Tag.figma.tsx +52 -0
  343. package/src/lib/Components/Tag/Tag.mdx +0 -2
  344. package/src/lib/Components/TextInput/TextInput.figma.tsx +40 -0
  345. package/src/lib/Components/TextInput/TextInput.mdx +0 -178
  346. package/src/lib/Components/Tile/Tile.figma.tsx +113 -0
  347. package/src/lib/Components/Tile/Tile.mdx +0 -53
  348. package/src/lib/Components/TileButton/TileButton.figma.tsx +35 -0
  349. package/src/lib/Components/TileButton/TileButton.mdx +0 -40
  350. package/src/lib/Components/Tooltip/Tooltip.figma.tsx +30 -0
  351. package/src/lib/Components/Tooltip/Tooltip.mdx +0 -183
  352. package/src/lib/Components/Trend/Trend.figma.tsx +28 -0
  353. package/src/lib/Components/Trend/Trend.mdx +0 -2
  354. package/src/lib/Components/Utility/Text/Text.mdx +0 -1
  355. package/src/lib/Symbols/Icons/ChevronAscending.tsx +1 -1
  356. package/src/lib/Symbols/Icons/ChevronDescending.tsx +1 -1
  357. package/src/lib/Symbols/Icons/Contact.tsx +45 -0
  358. package/src/lib/Symbols/index.ts +1 -0
  359. package/dist/typescript/src/lib/Components/Avatar/Avatar.figma.d.ts +0 -2
  360. package/dist/typescript/src/lib/Components/Avatar/Avatar.figma.d.ts.map +0 -1
  361. package/dist/typescript/src/lib/Components/OptionList/OptionList.figma.d.ts +0 -2
  362. package/dist/typescript/src/lib/Components/OptionList/OptionList.figma.d.ts.map +0 -1
@@ -3,7 +3,7 @@ import {
3
3
  useDisabledContext,
4
4
  DisabledProvider,
5
5
  } from '@ledgerhq/lumen-utils-shared';
6
- import { Fragment, type ReactNode } from 'react';
6
+ import { Fragment, type ReactElement, type ReactNode } from 'react';
7
7
  import { StyleSheet, View } from 'react-native';
8
8
  import { useStyleSheet } from '../../../styles';
9
9
  import { Check, ChevronDown } from '../../Symbols';
@@ -27,13 +27,17 @@ import type {
27
27
  OptionListSearchProps,
28
28
  OptionListTriggerProps,
29
29
  OptionListLabelProps,
30
+ OptionListValue,
30
31
  } from './types';
31
32
  import { useOptionListItems } from './useOptionList/useOptionListItems';
32
33
 
33
34
  const [OptionListProvider, useOptionListContext] =
34
35
  createSafeContext<OptionListContextValue>('OptionList');
35
36
 
36
- export const OptionList = <TMeta extends MetaShape = MetaShape>({
37
+ export const OptionList = <
38
+ T extends OptionListValue = OptionListValue,
39
+ TMeta extends MetaShape = MetaShape,
40
+ >({
37
41
  items,
38
42
  value,
39
43
  defaultValue,
@@ -45,7 +49,7 @@ export const OptionList = <TMeta extends MetaShape = MetaShape>({
45
49
  defaultSearchValue,
46
50
  onSearchValueChange,
47
51
  children,
48
- }: OptionListProps<TMeta>) => {
52
+ }: OptionListProps<T, TMeta>) => {
49
53
  const disabled = useDisabledContext({
50
54
  consumerName: 'OptionList',
51
55
  mergeWith: { disabled: disabledProp },
@@ -55,7 +59,7 @@ export const OptionList = <TMeta extends MetaShape = MetaShape>({
55
59
  {
56
60
  prop: value,
57
61
  defaultProp: defaultValue ?? null,
58
- onChange: onValueChange,
62
+ onChange: (next: string | null) => onValueChange?.(next as T | null),
59
63
  },
60
64
  );
61
65
 
@@ -65,7 +69,7 @@ export const OptionList = <TMeta extends MetaShape = MetaShape>({
65
69
  flatItems,
66
70
  resolvedSearchValue,
67
71
  handleSearchValueChange,
68
- } = useOptionListItems<TMeta>({
72
+ } = useOptionListItems<T, TMeta>({
69
73
  items,
70
74
  filter,
71
75
  filteredItems,
@@ -93,20 +97,26 @@ export const OptionList = <TMeta extends MetaShape = MetaShape>({
93
97
  );
94
98
  };
95
99
 
96
- export const OptionListContent = <TMeta extends MetaShape = MetaShape>({
100
+ export const OptionListContent = <
101
+ T extends OptionListValue = OptionListValue,
102
+ TMeta extends MetaShape = MetaShape,
103
+ >({
97
104
  renderItem,
98
105
  lx,
99
106
  style,
100
107
  ref,
101
108
  ...props
102
- }: OptionListContentProps<TMeta>) => {
109
+ }: OptionListContentProps<T, TMeta>) => {
103
110
  const { selectedValue, isGrouped, groups, flatItems } = useOptionListContext({
104
111
  consumerName: 'OptionListContent',
105
112
  contextRequired: true,
106
113
  });
107
114
 
108
115
  const renderItemWithState = (item: OptionListItemData) =>
109
- renderItem(item as OptionListItemData<TMeta>, selectedValue === item.value);
116
+ renderItem(
117
+ item as OptionListItemData<T, TMeta>,
118
+ selectedValue === item.value,
119
+ );
110
120
 
111
121
  if (isGrouped) {
112
122
  return (
@@ -161,7 +171,7 @@ const useItemStyles = ({
161
171
  );
162
172
  };
163
173
 
164
- export const OptionListItem = ({
174
+ export const OptionListItem = <T extends OptionListValue = OptionListValue>({
165
175
  value,
166
176
  disabled: disabledProp = false,
167
177
  children,
@@ -169,7 +179,7 @@ export const OptionListItem = ({
169
179
  style,
170
180
  ref,
171
181
  ...props
172
- }: OptionListItemProps) => {
182
+ }: OptionListItemProps<T>) => {
173
183
  const { selectedValue, onValueChange } = useOptionListContext({
174
184
  consumerName: 'OptionListItem',
175
185
  contextRequired: true,
@@ -576,3 +586,40 @@ export const OptionListTrigger = ({
576
586
  </Pressable>
577
587
  );
578
588
  };
589
+
590
+ export function createOptionList<
591
+ T extends OptionListValue = never,
592
+ TMeta extends MetaShape = MetaShape,
593
+ >(): {
594
+ OptionList: (props: OptionListProps<T, TMeta>) => ReactElement;
595
+ OptionListContent: (props: OptionListContentProps<T, TMeta>) => ReactElement;
596
+ OptionListItem: (props: OptionListItemProps<T>) => ReactElement;
597
+ OptionListItemText: (props: OptionListItemTextProps) => ReactElement;
598
+ OptionListItemDescription: (
599
+ props: OptionListItemDescriptionProps,
600
+ ) => ReactElement;
601
+ OptionListItemContent: (props: OptionListItemContentProps) => ReactElement;
602
+ OptionListItemContentRow: (
603
+ props: OptionListItemContentRowProps,
604
+ ) => ReactElement;
605
+ OptionListItemLeading: (props: OptionListItemLeadingProps) => ReactElement;
606
+ OptionListSearch: (props: OptionListSearchProps) => ReactElement;
607
+ OptionListEmptyState: (
608
+ props: OptionListEmptyStateProps,
609
+ ) => ReactElement | null;
610
+ OptionListTrigger: (props: OptionListTriggerProps) => ReactElement;
611
+ } {
612
+ return {
613
+ OptionList,
614
+ OptionListContent,
615
+ OptionListItem,
616
+ OptionListItemText,
617
+ OptionListItemDescription,
618
+ OptionListItemContent,
619
+ OptionListItemContentRow,
620
+ OptionListItemLeading,
621
+ OptionListSearch,
622
+ OptionListEmptyState,
623
+ OptionListTrigger,
624
+ };
625
+ }
@@ -8,9 +8,14 @@ import type { SearchInputProps } from '../SearchInput';
8
8
 
9
9
  export type MetaShape = Record<string, unknown>;
10
10
 
11
- export type OptionListItemData<TMeta extends MetaShape = MetaShape> = {
11
+ export type OptionListValue = string;
12
+
13
+ export type OptionListItemData<
14
+ T extends OptionListValue = OptionListValue,
15
+ TMeta extends MetaShape = MetaShape,
16
+ > = {
12
17
  /** Unique string identifier for this item, used for selection tracking. */
13
- value: string;
18
+ value: T;
14
19
  /** Display text. */
15
20
  label: string;
16
21
  /** Secondary text displayed below the label inside the item. */
@@ -43,29 +48,35 @@ export type OptionListContextValue = {
43
48
  };
44
49
 
45
50
  /** Internal type -- consumers never construct this directly. */
46
- export type OptionListItemGroup<TMeta extends MetaShape = MetaShape> = {
51
+ export type OptionListItemGroup<
52
+ T extends OptionListValue = OptionListValue,
53
+ TMeta extends MetaShape = MetaShape,
54
+ > = {
47
55
  label: string;
48
- items: OptionListItemData<TMeta>[];
56
+ items: OptionListItemData<T, TMeta>[];
49
57
  };
50
58
 
51
- export type OptionListProps<TMeta extends MetaShape = MetaShape> = {
59
+ export type OptionListProps<
60
+ T extends OptionListValue = OptionListValue,
61
+ TMeta extends MetaShape = MetaShape,
62
+ > = {
52
63
  /**
53
64
  * Flat array of items.
54
65
  * Use the `group` field on each item for automatic grouping.
55
66
  */
56
- items: OptionListItemData<TMeta>[];
67
+ items: OptionListItemData<T, TMeta>[];
57
68
  /**
58
69
  * The controlled selected value.
59
70
  */
60
- value?: string | null;
71
+ value?: T | null;
61
72
  /**
62
73
  * The default selected value (uncontrolled)
63
74
  */
64
- defaultValue?: string | null;
75
+ defaultValue?: T | null;
65
76
  /**
66
77
  * Called when the selected value changes.
67
78
  */
68
- onValueChange?: (value: string | null) => void;
79
+ onValueChange?: (value: T | null) => void;
69
80
  /**
70
81
  * When true, prevents interaction with the entire list.
71
82
  */
@@ -74,12 +85,14 @@ export type OptionListProps<TMeta extends MetaShape = MetaShape> = {
74
85
  * Custom item/query matcher.
75
86
  * Defaults to case-insensitive label match; `null` disables filtering.
76
87
  */
77
- filter?: null | ((item: OptionListItemData<TMeta>, query: string) => boolean);
88
+ filter?:
89
+ | null
90
+ | ((item: OptionListItemData<T, TMeta>, query: string) => boolean);
78
91
  /**
79
92
  * Pre-filtered items for async/remote search.
80
93
  * Bypasses internal filtering.
81
94
  */
82
- filteredItems?: OptionListItemData<TMeta>[];
95
+ filteredItems?: OptionListItemData<T, TMeta>[];
83
96
  /**
84
97
  * Controlled search input value.
85
98
  */
@@ -95,14 +108,20 @@ export type OptionListProps<TMeta extends MetaShape = MetaShape> = {
95
108
  children: ReactNode;
96
109
  };
97
110
 
98
- export type OptionListContentProps<TMeta extends MetaShape = MetaShape> = {
111
+ export type OptionListContentProps<
112
+ T extends OptionListValue = OptionListValue,
113
+ TMeta extends MetaShape = MetaShape,
114
+ > = {
99
115
  /** Render function called for each item. Receives the item data and selection/disabled state. */
100
- renderItem: (item: OptionListItemData<TMeta>, selected: boolean) => ReactNode;
116
+ renderItem: (
117
+ item: OptionListItemData<T, TMeta>,
118
+ selected: boolean,
119
+ ) => ReactNode;
101
120
  } & Omit<StyledViewProps, 'children'>;
102
121
 
103
- export type OptionListItemProps = {
122
+ export type OptionListItemProps<T extends OptionListValue = OptionListValue> = {
104
123
  /** The value associated with this item, used for selection matching. */
105
- value: string;
124
+ value: T;
106
125
  /** Whether the item is disabled. */
107
126
  disabled?: boolean;
108
127
  children: ReactNode;
@@ -4,13 +4,17 @@ import type {
4
4
  MetaShape,
5
5
  OptionListItemData,
6
6
  OptionListItemGroup,
7
+ OptionListValue,
7
8
  } from '../types';
8
9
 
9
- const groupByField = <TMeta extends MetaShape = MetaShape>(
10
- items: OptionListItemData<TMeta>[],
11
- ): OptionListItemGroup<TMeta>[] => {
10
+ const groupByField = <
11
+ T extends OptionListValue = OptionListValue,
12
+ TMeta extends MetaShape = MetaShape,
13
+ >(
14
+ items: OptionListItemData<T, TMeta>[],
15
+ ): OptionListItemGroup<T, TMeta>[] => {
12
16
  const order: string[] = [];
13
- const map: Record<string, OptionListItemData<TMeta>[]> = {};
17
+ const map: Record<string, OptionListItemData<T, TMeta>[]> = {};
14
18
  for (const item of items) {
15
19
  const key = item.group ?? '';
16
20
  if (!map[key]) {
@@ -30,31 +34,42 @@ export const defaultLabelFilter = (
30
34
  query: string,
31
35
  ): boolean => item.label.toLowerCase().includes(query.toLowerCase());
32
36
 
33
- type UseOptionListItemsParams<TMeta extends MetaShape = MetaShape> = {
34
- items: OptionListItemData<TMeta>[];
35
- filter?: null | ((item: OptionListItemData<TMeta>, query: string) => boolean);
36
- filteredItems?: OptionListItemData<TMeta>[];
37
+ type UseOptionListItemsParams<
38
+ T extends OptionListValue = OptionListValue,
39
+ TMeta extends MetaShape = MetaShape,
40
+ > = {
41
+ items: OptionListItemData<T, TMeta>[];
42
+ filter?:
43
+ | null
44
+ | ((item: OptionListItemData<T, TMeta>, query: string) => boolean);
45
+ filteredItems?: OptionListItemData<T, TMeta>[];
37
46
  searchValue?: string;
38
47
  defaultSearchValue?: string;
39
48
  onSearchValueChange?: (value: string) => void;
40
49
  };
41
50
 
42
- type UseOptionListItemsResult<TMeta extends MetaShape = MetaShape> = {
51
+ type UseOptionListItemsResult<
52
+ T extends OptionListValue = OptionListValue,
53
+ TMeta extends MetaShape = MetaShape,
54
+ > = {
43
55
  isGrouped: boolean;
44
- groups: OptionListItemGroup<TMeta>[];
45
- flatItems: OptionListItemData<TMeta>[];
56
+ groups: OptionListItemGroup<T, TMeta>[];
57
+ flatItems: OptionListItemData<T, TMeta>[];
46
58
  resolvedSearchValue: string;
47
59
  handleSearchValueChange: (val: string) => void;
48
60
  };
49
61
 
50
- export const useOptionListItems = <TMeta extends MetaShape = MetaShape>({
62
+ export const useOptionListItems = <
63
+ T extends OptionListValue = OptionListValue,
64
+ TMeta extends MetaShape = MetaShape,
65
+ >({
51
66
  items,
52
67
  filter,
53
68
  filteredItems,
54
69
  searchValue: searchValueProp,
55
70
  defaultSearchValue,
56
71
  onSearchValueChange,
57
- }: UseOptionListItemsParams<TMeta>): UseOptionListItemsResult<TMeta> => {
72
+ }: UseOptionListItemsParams<T, TMeta>): UseOptionListItemsResult<T, TMeta> => {
58
73
  const [searchValue, handleSearchValueChange] = useControllableState<string>({
59
74
  prop: searchValueProp,
60
75
  defaultProp: defaultSearchValue ?? '',
@@ -0,0 +1,11 @@
1
+ import figma from '@figma/code-connect';
2
+ import { PageIndicator } from './PageIndicator';
3
+
4
+ figma.connect(
5
+ PageIndicator,
6
+ 'https://www.figma.com/design/JxaLVMTWirCpU0rsbZ30k7?node-id=11768-12849',
7
+ {
8
+ imports: ["import { PageIndicator } from '@ledgerhq/lumen-ui-rnative'"],
9
+ example: () => <PageIndicator currentPage={2} totalPages={5} />,
10
+ },
11
+ );
@@ -2,7 +2,6 @@ import { Meta, Canvas, Controls } from '@storybook/addon-docs/blocks';
2
2
  import * as PageIndicatorStories from './PageIndicator.stories';
3
3
  import { PageIndicator } from './PageIndicator';
4
4
  import { CustomTabs, Tab } from '../../../../.storybook/components';
5
- import CommonRulesDoAndDont from '../../../../.storybook/components/DoVsDont/CommonRulesDoAndDont.mdx';
6
5
 
7
6
  <Meta title='Core/PageIndicator' of={PageIndicatorStories} />
8
7
 
@@ -118,7 +117,6 @@ function MyComponent() {
118
117
  }
119
118
  ```
120
119
 
121
- <CommonRulesDoAndDont />
122
120
 
123
121
  </Tab>
124
122
  </CustomTabs>
@@ -0,0 +1,34 @@
1
+ import figma from '@figma/code-connect';
2
+ import { SearchInput } from './SearchInput';
3
+
4
+ figma.connect(
5
+ SearchInput,
6
+ 'https://www.figma.com/design/JxaLVMTWirCpU0rsbZ30k7?node-id=2248%3A3468',
7
+ {
8
+ imports: ["import { SearchInput } from '@ledgerhq/lumen-ui-rnative'"],
9
+ props: {
10
+ appearance: figma.enum('appearance', {
11
+ plain: 'plain',
12
+ transparent: 'transparent',
13
+ }),
14
+ placeholder: figma.enum('search-state', {
15
+ placeholder: figma.string('placeholder'),
16
+ }),
17
+ value: figma.enum('search-state', {
18
+ typing: figma.string('value'),
19
+ }),
20
+ disabled: figma.enum('state', {
21
+ disabled: true,
22
+ }),
23
+ },
24
+ example: (props) => (
25
+ <SearchInput
26
+ appearance={props.appearance}
27
+ placeholder={props.placeholder}
28
+ value={props.value}
29
+ disabled={props.disabled}
30
+ onChangeText={() => {}}
31
+ />
32
+ ),
33
+ },
34
+ );
@@ -2,8 +2,6 @@ import { Meta, Canvas, Controls } from '@storybook/addon-docs/blocks';
2
2
  import * as SearchInputStories from './SearchInput.stories';
3
3
  import { SearchInput } from './SearchInput';
4
4
  import { CustomTabs, Tab } from '../../../../.storybook/components';
5
- import { DoVsDontRow, DoBlockItem, DontBlockItem } from '../../../../.storybook/components/DoVsDont';
6
- import CommonRulesDoAndDont from '../../../../.storybook/components/DoVsDont/CommonRulesDoAndDont.mdx';
7
5
 
8
6
  <Meta title='Core/SearchInput' of={SearchInputStories} />
9
7
 
@@ -326,203 +324,6 @@ function MyComponent() {
326
324
  }
327
325
  ```
328
326
 
329
- ## Do's and Don'ts
330
-
331
- The following guidelines ensure consistent usage of the SearchInput component and maintain design system principles.
332
-
333
- <div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>
334
- <DoVsDontRow>
335
- <DoBlockItem
336
- title='Use placeholder text'
337
- description='SearchInput uses placeholder text instead of labels for optimal search UX'
338
- >
339
-
340
- {/* prettier-ignore */}
341
- ```tsx
342
- <SearchInput
343
- placeholder='Search by name or email'
344
- value={query}
345
- onChangeText={setQuery}
346
- />
347
- ```
348
-
349
- </DoBlockItem>
350
- <DontBlockItem
351
- title="Don't use label prop"
352
- description='SearchInput component does not support labels as they are not suitable for search UX patterns'
353
- >
354
-
355
- {/* prettier-ignore */}
356
- ```tsx
357
- <SearchInput
358
- label='Search' // Not supported, will cause error
359
- placeholder='Search by name or email'
360
- value={query}
361
- />
362
- ```
363
-
364
- </DontBlockItem>
365
-
366
- </DoVsDontRow>
367
-
368
- <DoVsDontRow>
369
- <DoBlockItem
370
- title='Use the built-in search icon'
371
- description='The search icon is automatically included and cannot be changed'
372
- >
373
-
374
- {/* prettier-ignore */}
375
- ```tsx
376
- <SearchInput
377
- placeholder='Search products'
378
- value={query}
379
- onChangeText={handleChange}
380
- />
381
- ```
382
-
383
- </DoBlockItem>
384
- <DontBlockItem
385
- title="Don't override the search icon"
386
- description='The prefix prop is not available on SearchInput component'
387
- >
388
-
389
- {/* prettier-ignore */}
390
- ```tsx
391
- <SearchInput
392
- prefix={<CustomIcon />} // Not supported, will cause error
393
- placeholder='Search products'
394
- />
395
- ```
396
-
397
- </DontBlockItem>
398
-
399
- </DoVsDontRow>
400
-
401
- <DoVsDontRow>
402
- <DoBlockItem
403
- title='Use onClear for custom logic only'
404
- description='Let the component handle clearing automatically, add onClear only for additional logic'
405
- >
406
-
407
- {/* prettier-ignore */}
408
- ```tsx
409
- <SearchInput
410
- placeholder='Search'
411
- value={query}
412
- onChangeText={setQuery}
413
- onClear={() => {
414
- // Default clearing happens automatically
415
- analytics.track('search_cleared');
416
- }}
417
- />
418
- ```
419
-
420
- </DoBlockItem>
421
- <DontBlockItem
422
- title="Don't manually clear in onClear"
423
- description='Value clearing happens automatically - no need to call setQuery'
424
- >
425
-
426
- {/* prettier-ignore */}
427
- ```tsx
428
- <SearchInput
429
- placeholder='Search'
430
- value={query}
431
- onChangeText={setQuery}
432
- onClear={() => setQuery('')}
433
- />
434
- ```
435
-
436
- </DontBlockItem>
437
-
438
- </DoVsDontRow>
439
-
440
- <DoVsDontRow>
441
- <DoBlockItem
442
- title='Debounce expensive search operations'
443
- description='Use debouncing for API calls or expensive filtering to improve performance'
444
- >
445
-
446
- {/* prettier-ignore */}
447
- ```tsx
448
- const debouncedSearch = useCallback(
449
- debounce((text: string) => performSearch(text), 500),
450
- []
451
- );
452
-
453
- <SearchInput
454
- placeholder='Search'
455
- value={query}
456
- onChangeText={(text) => {
457
- setQuery(text);
458
- debouncedSearch(text);
459
- }}
460
- />
461
- ```
462
-
463
- </DoBlockItem>
464
- <DontBlockItem
465
- title="Don't perform expensive operations on every keystroke"
466
- description='Avoid running expensive operations on every input change without debouncing'
467
- >
468
-
469
- {/* prettier-ignore */}
470
- ```tsx
471
- const debouncedSearch = useCallback(
472
- debounce((text: string) => performSearch(text), 500),
473
- []
474
- );
475
-
476
- <SearchInput
477
- placeholder='Search'
478
- value={query}
479
- onChangeText={(text) => {
480
- setQuery(text);
481
- performExpensiveAPICall(text); // Should be debounced
482
- }}
483
- />
484
- ```
485
-
486
- </DontBlockItem>
487
-
488
- </DoVsDontRow>
489
-
490
- <DoVsDontRow>
491
- <DoBlockItem
492
- title='Provide descriptive placeholder text'
493
- description='Use clear, specific placeholder text that describes what users can search for'
494
- >
495
-
496
- {/* prettier-ignore */}
497
- ```tsx
498
- <SearchInput
499
- placeholder='Search by name or email'
500
- value={query}
501
- onChangeText={setQuery}
502
- />
503
- ```
504
-
505
- </DoBlockItem>
506
- <DontBlockItem
507
- title="Don't use vague placeholder text"
508
- description='Avoid generic or unclear placeholder text that does not help users'
509
- >
510
-
511
- {/* prettier-ignore */}
512
- ```tsx
513
- <SearchInput
514
- placeholder='Type here'
515
- value={query}
516
- onChangeText={setQuery}
517
- />
518
- ```
519
-
520
- </DontBlockItem>
521
-
522
- </DoVsDontRow>
523
-
524
- <CommonRulesDoAndDont />
525
- </div>
526
327
 
527
328
  ## Platform Considerations
528
329
 
@@ -0,0 +1,34 @@
1
+ import figma from '@figma/code-connect';
2
+ import { SegmentedControl, SegmentedControlButton } from './SegmentedControl';
3
+
4
+ figma.connect(
5
+ SegmentedControl,
6
+ 'https://www.figma.com/design/JxaLVMTWirCpU0rsbZ30k7?node-id=1170-2345',
7
+ {
8
+ imports: [
9
+ "import { SegmentedControl, SegmentedControlButton } from '@ledgerhq/lumen-ui-rnative'",
10
+ ],
11
+ props: {
12
+ appearance: figma.enum('appearance', {
13
+ background: 'background',
14
+ 'no-background': 'no-background',
15
+ }),
16
+ tabLayout: figma.enum('tab-width', {
17
+ fixed: 'fixed',
18
+ hug: 'fit',
19
+ }),
20
+ },
21
+ example: (props) => (
22
+ <SegmentedControl
23
+ selectedValue='tab1'
24
+ onSelectedChange={() => {}}
25
+ appearance={props.appearance}
26
+ tabLayout={props.tabLayout}
27
+ >
28
+ <SegmentedControlButton value='tab1'>Tab 1</SegmentedControlButton>
29
+ <SegmentedControlButton value='tab2'>Tab 2</SegmentedControlButton>
30
+ <SegmentedControlButton value='tab3'>Tab 3</SegmentedControlButton>
31
+ </SegmentedControl>
32
+ ),
33
+ },
34
+ );
@@ -2,7 +2,6 @@ import { Meta, Canvas, Controls } from '@storybook/addon-docs/blocks';
2
2
  import * as SegmentedControlStories from './SegmentedControl.stories';
3
3
  import { SegmentedControl } from './SegmentedControl';
4
4
  import { CustomTabs, Tab } from '../../../../.storybook/components';
5
- import CommonRulesDoAndDont from '../../../../.storybook/components/DoVsDont/CommonRulesDoAndDont.mdx';
6
5
  import { Box } from '../Utility';
7
6
 
8
7
  <Meta title='Core/SegmentedControl' of={SegmentedControlStories} />
@@ -67,6 +66,8 @@ Use the library as part of `@ledgerhq/lumen-ui-rnative`. See the [Setup Guide
67
66
 
68
67
  Control selected value in state at the top level and pass it to SegmentedControl. Buttons use value to identify themselves; selected state is derived from context.
69
68
 
69
+ > **Recommended:** prefer the [type-safe variant](#type-safe-variant) below. It shares a single literal union across the root and every button.
70
+
70
71
  ```tsx
71
72
  import { SegmentedControl, SegmentedControlButton } from '@ledgerhq/lumen-ui-rnative';
72
73
 
@@ -87,6 +88,32 @@ export default function Example() {
87
88
  }
88
89
  ```
89
90
 
91
+ ## Type-safe variant
92
+
93
+ `SegmentedControl` and `SegmentedControlButton` communicate via context, so TypeScript cannot connect the root's `selectedValue` to each button's `value` on its own. A typo compiles, and the pill silently never moves to that segment.
94
+
95
+ `createSegmentedControl<T>()` ties both components to one literal union. Call it once at module scope; the returned pair are typed against your `T`.
96
+
97
+ ```tsx
98
+ import { createSegmentedControl } from '@ledgerhq/lumen-ui-rnative';
99
+
100
+ type View = 'preview' | 'raw' | 'blame';
101
+
102
+ const { SegmentedControl, SegmentedControlButton } = createSegmentedControl<View>();
103
+
104
+ function Example() {
105
+ const [view, setView] = React.useState<View>('preview');
106
+
107
+ return (
108
+ <SegmentedControl selectedValue={view} onSelectedChange={setView}>
109
+ <SegmentedControlButton value='preview'>Preview</SegmentedControlButton>
110
+ <SegmentedControlButton value='raw'>Raw</SegmentedControlButton>
111
+ <SegmentedControlButton value='blame'>Blame</SegmentedControlButton>
112
+ </SegmentedControl>
113
+ );
114
+ }
115
+ ```
116
+
90
117
  ## With trailing content
91
118
 
92
119
  Pass any node via `trailingContent` to render it to the right of the label. Use it for badges like `DotCount` to surface counts per segment.