@transferwise/components 0.0.0-experimental-57e70f3 → 0.0.0-experimental-09066ec

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 (563) hide show
  1. package/build/dateInput/DateInput.js +12 -5
  2. package/build/dateInput/DateInput.js.map +1 -1
  3. package/build/dateInput/DateInput.mjs +11 -4
  4. package/build/dateInput/DateInput.mjs.map +1 -1
  5. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js +16 -8
  6. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js.map +1 -1
  7. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs +14 -6
  8. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs.map +1 -1
  9. package/build/index.js +12 -7
  10. package/build/index.js.map +1 -1
  11. package/build/index.mjs +9 -3
  12. package/build/index.mjs.map +1 -1
  13. package/build/inputs/{_BottomSheet.js → SelectInput/BottomSheet/SelectInputBottomSheet.js} +7 -7
  14. package/build/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.js.map +1 -0
  15. package/build/inputs/{_BottomSheet.mjs → SelectInput/BottomSheet/SelectInputBottomSheet.mjs} +7 -7
  16. package/build/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.mjs.map +1 -0
  17. package/build/inputs/{_ButtonInput.js → SelectInput/ButtonInput/SelectInputButtonInput.js} +5 -5
  18. package/build/inputs/SelectInput/ButtonInput/SelectInputButtonInput.js.map +1 -0
  19. package/build/inputs/{_ButtonInput.mjs → SelectInput/ButtonInput/SelectInputButtonInput.mjs} +5 -5
  20. package/build/inputs/SelectInput/ButtonInput/SelectInputButtonInput.mjs.map +1 -0
  21. package/build/inputs/SelectInput/ClearButton/SelectInputClearButton.js +26 -0
  22. package/build/inputs/SelectInput/ClearButton/SelectInputClearButton.js.map +1 -0
  23. package/build/inputs/SelectInput/ClearButton/SelectInputClearButton.mjs +24 -0
  24. package/build/inputs/SelectInput/ClearButton/SelectInputClearButton.mjs.map +1 -0
  25. package/build/inputs/SelectInput/DefaultRenderTrigger/SelectInputDefaultRenderTrigger.js +59 -0
  26. package/build/inputs/SelectInput/DefaultRenderTrigger/SelectInputDefaultRenderTrigger.js.map +1 -0
  27. package/build/inputs/SelectInput/DefaultRenderTrigger/SelectInputDefaultRenderTrigger.mjs +56 -0
  28. package/build/inputs/SelectInput/DefaultRenderTrigger/SelectInputDefaultRenderTrigger.mjs.map +1 -0
  29. package/build/inputs/SelectInput/ItemView/GroupItemView/SelectInputGroupItemView.js +50 -0
  30. package/build/inputs/SelectInput/ItemView/GroupItemView/SelectInputGroupItemView.js.map +1 -0
  31. package/build/inputs/SelectInput/ItemView/GroupItemView/SelectInputGroupItemView.mjs +48 -0
  32. package/build/inputs/SelectInput/ItemView/GroupItemView/SelectInputGroupItemView.mjs.map +1 -0
  33. package/build/inputs/SelectInput/ItemView/SelectInputItemView.js +47 -0
  34. package/build/inputs/SelectInput/ItemView/SelectInputItemView.js.map +1 -0
  35. package/build/inputs/SelectInput/ItemView/SelectInputItemView.mjs +45 -0
  36. package/build/inputs/SelectInput/ItemView/SelectInputItemView.mjs.map +1 -0
  37. package/build/inputs/SelectInput/Option/SelectInputOption.js +42 -0
  38. package/build/inputs/SelectInput/Option/SelectInputOption.js.map +1 -0
  39. package/build/inputs/SelectInput/Option/SelectInputOption.mjs +40 -0
  40. package/build/inputs/SelectInput/Option/SelectInputOption.mjs.map +1 -0
  41. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.js +40 -0
  42. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.js.map +1 -0
  43. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs +38 -0
  44. package/build/inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs.map +1 -0
  45. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.js +48 -0
  46. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.js.map +1 -0
  47. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.mjs +46 -0
  48. package/build/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.mjs.map +1 -0
  49. package/build/inputs/SelectInput/Options/SelectInputOptions.js +300 -0
  50. package/build/inputs/SelectInput/Options/SelectInputOptions.js.map +1 -0
  51. package/build/inputs/SelectInput/Options/SelectInputOptions.mjs +298 -0
  52. package/build/inputs/SelectInput/Options/SelectInputOptions.mjs.map +1 -0
  53. package/build/inputs/{_Popover.js → SelectInput/Popover/SelectInputPopover.js} +7 -7
  54. package/build/inputs/SelectInput/Popover/SelectInputPopover.js.map +1 -0
  55. package/build/inputs/{_Popover.mjs → SelectInput/Popover/SelectInputPopover.mjs} +7 -7
  56. package/build/inputs/SelectInput/Popover/SelectInputPopover.mjs.map +1 -0
  57. package/build/inputs/SelectInput/SelectInput.contexts.js +29 -0
  58. package/build/inputs/SelectInput/SelectInput.contexts.js.map +1 -0
  59. package/build/inputs/SelectInput/SelectInput.contexts.mjs +24 -0
  60. package/build/inputs/SelectInput/SelectInput.contexts.mjs.map +1 -0
  61. package/build/inputs/SelectInput/SelectInput.js +222 -0
  62. package/build/inputs/SelectInput/SelectInput.js.map +1 -0
  63. package/build/inputs/SelectInput/SelectInput.messages.js.map +1 -0
  64. package/build/inputs/SelectInput/SelectInput.messages.mjs.map +1 -0
  65. package/build/inputs/SelectInput/SelectInput.mjs +216 -0
  66. package/build/inputs/SelectInput/SelectInput.mjs.map +1 -0
  67. package/build/inputs/SelectInput/SelectInput.utils.js +164 -0
  68. package/build/inputs/SelectInput/SelectInput.utils.js.map +1 -0
  69. package/build/inputs/SelectInput/SelectInput.utils.mjs +154 -0
  70. package/build/inputs/SelectInput/SelectInput.utils.mjs.map +1 -0
  71. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js +42 -0
  72. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js.map +1 -0
  73. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs +36 -0
  74. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs.map +1 -0
  75. package/build/main.css +97 -27094
  76. package/build/moneyInput/MoneyInput.js +9 -2
  77. package/build/moneyInput/MoneyInput.js.map +1 -1
  78. package/build/moneyInput/MoneyInput.mjs +8 -1
  79. package/build/moneyInput/MoneyInput.mjs.map +1 -1
  80. package/build/phoneNumberInput/PhoneNumberInput.js +10 -3
  81. package/build/phoneNumberInput/PhoneNumberInput.js.map +1 -1
  82. package/build/phoneNumberInput/PhoneNumberInput.mjs +9 -2
  83. package/build/phoneNumberInput/PhoneNumberInput.mjs.map +1 -1
  84. package/build/styles/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.css +96 -0
  85. package/build/styles/inputs/SelectInput/ButtonInput/SelectInputButtonInput.css +16 -0
  86. package/build/styles/inputs/SelectInput/ClearButton/SelectInputClearButton.css +46 -0
  87. package/build/styles/inputs/SelectInput/ItemView/SelectInputItemView.css +16 -0
  88. package/build/styles/inputs/SelectInput/Option/SelectInputOption.css +33 -0
  89. package/build/styles/inputs/SelectInput/OptionContent/SelectInputOptionContent.css +37 -0
  90. package/build/styles/inputs/SelectInput/Options/SelectInputOptions.css +81 -0
  91. package/build/styles/inputs/SelectInput/Popover/SelectInputPopover.css +46 -0
  92. package/build/styles/main.css +97 -27094
  93. package/build/types/index.d.ts +1 -1
  94. package/build/types/index.d.ts.map +1 -1
  95. package/build/types/inputs/{_BottomSheet.d.ts → SelectInput/BottomSheet/SelectInputBottomSheet.d.ts} +3 -3
  96. package/build/types/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.d.ts.map +1 -0
  97. package/build/types/inputs/SelectInput/BottomSheet/index.d.ts +3 -0
  98. package/build/types/inputs/SelectInput/BottomSheet/index.d.ts.map +1 -0
  99. package/build/types/inputs/SelectInput/ButtonInput/SelectInputButtonInput.d.ts +5 -0
  100. package/build/types/inputs/SelectInput/ButtonInput/SelectInputButtonInput.d.ts.map +1 -0
  101. package/build/types/inputs/SelectInput/ButtonInput/index.d.ts +3 -0
  102. package/build/types/inputs/SelectInput/ButtonInput/index.d.ts.map +1 -0
  103. package/build/types/inputs/SelectInput/ClearButton/SelectInputClearButton.d.ts +7 -0
  104. package/build/types/inputs/SelectInput/ClearButton/SelectInputClearButton.d.ts.map +1 -0
  105. package/build/types/inputs/SelectInput/ClearButton/index.d.ts +3 -0
  106. package/build/types/inputs/SelectInput/ClearButton/index.d.ts.map +1 -0
  107. package/build/types/inputs/SelectInput/DefaultRenderTrigger/SelectInputDefaultRenderTrigger.d.ts +16 -0
  108. package/build/types/inputs/SelectInput/DefaultRenderTrigger/SelectInputDefaultRenderTrigger.d.ts.map +1 -0
  109. package/build/types/inputs/SelectInput/DefaultRenderTrigger/index.d.ts +2 -0
  110. package/build/types/inputs/SelectInput/DefaultRenderTrigger/index.d.ts.map +1 -0
  111. package/build/types/inputs/SelectInput/ItemView/GroupItemView/SelectInputGroupItemView.d.ts +9 -0
  112. package/build/types/inputs/SelectInput/ItemView/GroupItemView/SelectInputGroupItemView.d.ts.map +1 -0
  113. package/build/types/inputs/SelectInput/ItemView/GroupItemView/index.d.ts +3 -0
  114. package/build/types/inputs/SelectInput/ItemView/GroupItemView/index.d.ts.map +1 -0
  115. package/build/types/inputs/SelectInput/ItemView/SelectInputItemView.d.ts +11 -0
  116. package/build/types/inputs/SelectInput/ItemView/SelectInputItemView.d.ts.map +1 -0
  117. package/build/types/inputs/SelectInput/ItemView/index.d.ts +4 -0
  118. package/build/types/inputs/SelectInput/ItemView/index.d.ts.map +1 -0
  119. package/build/types/inputs/SelectInput/Option/SelectInputOption.d.ts +11 -0
  120. package/build/types/inputs/SelectInput/Option/SelectInputOption.d.ts.map +1 -0
  121. package/build/types/inputs/SelectInput/Option/index.d.ts +3 -0
  122. package/build/types/inputs/SelectInput/Option/index.d.ts.map +1 -0
  123. package/build/types/inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts +13 -0
  124. package/build/types/inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts.map +1 -0
  125. package/build/types/inputs/SelectInput/OptionContent/index.d.ts +3 -0
  126. package/build/types/inputs/SelectInput/OptionContent/index.d.ts.map +1 -0
  127. package/build/types/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.d.ts +9 -0
  128. package/build/types/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.d.ts.map +1 -0
  129. package/build/types/inputs/SelectInput/Options/OptionsContainer/index.d.ts +3 -0
  130. package/build/types/inputs/SelectInput/Options/OptionsContainer/index.d.ts.map +1 -0
  131. package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts +21 -0
  132. package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts.map +1 -0
  133. package/build/types/inputs/SelectInput/Options/index.d.ts +4 -0
  134. package/build/types/inputs/SelectInput/Options/index.d.ts.map +1 -0
  135. package/build/types/inputs/{_Popover.d.ts → SelectInput/Popover/SelectInputPopover.d.ts} +3 -3
  136. package/build/types/inputs/SelectInput/Popover/SelectInputPopover.d.ts.map +1 -0
  137. package/build/types/inputs/SelectInput/Popover/index.d.ts +3 -0
  138. package/build/types/inputs/SelectInput/Popover/index.d.ts.map +1 -0
  139. package/build/types/inputs/SelectInput/SelectInput.contexts.d.ts +33 -0
  140. package/build/types/inputs/SelectInput/SelectInput.contexts.d.ts.map +1 -0
  141. package/build/types/inputs/SelectInput/SelectInput.d.ts +10 -0
  142. package/build/types/inputs/SelectInput/SelectInput.d.ts.map +1 -0
  143. package/build/types/inputs/SelectInput/SelectInput.messages.d.ts.map +1 -0
  144. package/build/types/inputs/{SelectInput.d.ts → SelectInput/SelectInput.types.d.ts} +12 -38
  145. package/build/types/inputs/SelectInput/SelectInput.types.d.ts.map +1 -0
  146. package/build/types/inputs/SelectInput/SelectInput.utils.d.ts +60 -0
  147. package/build/types/inputs/SelectInput/SelectInput.utils.d.ts.map +1 -0
  148. package/build/types/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.d.ts +12 -0
  149. package/build/types/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.d.ts.map +1 -0
  150. package/build/types/inputs/SelectInput/TriggerButton/index.d.ts +3 -0
  151. package/build/types/inputs/SelectInput/TriggerButton/index.d.ts.map +1 -0
  152. package/build/types/inputs/SelectInput/components.d.ts +10 -0
  153. package/build/types/inputs/SelectInput/components.d.ts.map +1 -0
  154. package/build/types/inputs/SelectInput/index.d.ts +10 -0
  155. package/build/types/inputs/SelectInput/index.d.ts.map +1 -0
  156. package/package.json +4 -8
  157. package/src/accordion/Accordion.css +74 -0
  158. package/src/accordion/Accordion.less +3 -3
  159. package/src/actionButton/ActionButton.css +64 -0
  160. package/src/actionButton/ActionButton.less +1 -1
  161. package/src/actionOption/ActionOption.css +4 -0
  162. package/src/alert/Alert.css +7 -0
  163. package/src/avatar/Avatar.css +250 -0
  164. package/src/avatar/Avatar.less +3 -3
  165. package/src/avatarLayout/AvatarLayout.css +42 -0
  166. package/src/avatarView/AvatarView.css +44 -0
  167. package/src/avatarView/Dot.css +26 -0
  168. package/src/badge/Badge.css +65 -0
  169. package/src/badge/Badge.less +1 -1
  170. package/src/body/Body.css +3 -0
  171. package/src/button/Button.css +246 -0
  172. package/src/button/Button.vars.css +46 -0
  173. package/src/button/LegacyButton.css +23 -0
  174. package/src/button/LegacyButton.less +1 -1
  175. package/src/card/Card.css +100 -0
  176. package/src/card/Card.less +3 -3
  177. package/src/carousel/Carousel.css +134 -0
  178. package/src/checkboxButton/CheckboxButton.css +43 -0
  179. package/src/checkboxButton/CheckboxButton.less +2 -2
  180. package/src/chips/Chip.css +190 -0
  181. package/src/chips/Chip.less +3 -3
  182. package/src/circularButton/CircularButton.css +34 -0
  183. package/src/common/Option/Option.css +122 -0
  184. package/src/common/Option/Option.less +2 -2
  185. package/src/common/RadioButton/RadioButton.css +4 -0
  186. package/src/common/baseCard/BaseCard.css +49 -0
  187. package/src/common/bottomSheet/BottomSheet.css +53 -0
  188. package/src/common/bottomSheet/BottomSheet.less +1 -1
  189. package/src/common/circle/Circle.css +43 -0
  190. package/src/common/closeButton/CloseButton.css +94 -0
  191. package/src/common/closeButton/CloseButton.less +1 -1
  192. package/src/common/panel/Panel.css +73 -0
  193. package/src/common/panel/Panel.less +1 -1
  194. package/src/criticalBanner/CriticalCommsBanner.css +63 -0
  195. package/src/dateInput/DateInput.css +16 -0
  196. package/src/dateLookup/DateLookup.css +93 -0
  197. package/src/dateLookup/DateLookup.less +1 -1
  198. package/src/dateLookup/dateTrigger/DateTrigger.css +29 -0
  199. package/src/dateLookup/dateTrigger/DateTrigger.less +2 -2
  200. package/src/decision/Decision.css +17 -0
  201. package/src/decision/Decision.less +1 -1
  202. package/src/definitionList/DefinitionList.css +53 -0
  203. package/src/definitionList/DefinitionList.less +1 -1
  204. package/src/dimmer/Dimmer.css +70 -0
  205. package/src/dimmer/Dimmer.less +2 -2
  206. package/src/divider/Divider.css +24 -0
  207. package/src/drawer/Drawer.css +56 -0
  208. package/src/dropFade/DropFade.css +19 -0
  209. package/src/emphasis/Emphasis.css +31 -0
  210. package/src/expressiveMoneyInput/ExpressiveMoneyInput.css +58 -0
  211. package/src/expressiveMoneyInput/amountInput/AmountInput.css +32 -0
  212. package/src/expressiveMoneyInput/chevron/Chevron.css +12 -0
  213. package/src/expressiveMoneyInput/currencySelector/CurrencySelector.css +6 -0
  214. package/src/field/Field.css +13 -0
  215. package/src/flowNavigation/FlowNavigation.css +76 -0
  216. package/src/flowNavigation/FlowNavigation.less +1 -1
  217. package/src/flowNavigation/animatedLabel/AnimatedLabel.css +30 -0
  218. package/src/flowNavigation/animatedLabel/AnimatedLabel.less +2 -2
  219. package/src/header/Header.css +33 -0
  220. package/src/iconButton/IconButton.css +82 -0
  221. package/src/image/Image.css +13 -0
  222. package/src/index.ts +0 -1
  223. package/src/info/Info.css +9 -0
  224. package/src/info/Info.less +1 -1
  225. package/src/inputs/Input.css +158 -0
  226. package/src/inputs/InputGroup.css +63 -0
  227. package/src/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.css +96 -0
  228. package/src/inputs/{_BottomSheet.tsx → SelectInput/BottomSheet/SelectInputBottomSheet.tsx} +7 -7
  229. package/src/inputs/SelectInput/BottomSheet/index.ts +2 -0
  230. package/src/inputs/SelectInput/ButtonInput/SelectInputButtonInput.css +16 -0
  231. package/src/inputs/{_ButtonInput.tsx → SelectInput/ButtonInput/SelectInputButtonInput.tsx} +5 -5
  232. package/src/inputs/SelectInput/ButtonInput/index.ts +2 -0
  233. package/src/inputs/SelectInput/ClearButton/SelectInputClearButton.css +46 -0
  234. package/src/inputs/SelectInput/ClearButton/SelectInputClearButton.less +39 -0
  235. package/src/inputs/SelectInput/ClearButton/SelectInputClearButton.tsx +27 -0
  236. package/src/inputs/SelectInput/ClearButton/index.ts +2 -0
  237. package/src/inputs/SelectInput/DefaultRenderTrigger/SelectInputDefaultRenderTrigger.tsx +74 -0
  238. package/src/inputs/SelectInput/DefaultRenderTrigger/index.ts +5 -0
  239. package/src/inputs/SelectInput/ItemView/GroupItemView/SelectInputGroupItemView.tsx +61 -0
  240. package/src/inputs/SelectInput/ItemView/GroupItemView/index.ts +2 -0
  241. package/src/inputs/SelectInput/ItemView/SelectInputItemView.css +16 -0
  242. package/src/inputs/SelectInput/ItemView/SelectInputItemView.less +17 -0
  243. package/src/inputs/SelectInput/ItemView/SelectInputItemView.tsx +48 -0
  244. package/src/inputs/SelectInput/ItemView/index.ts +3 -0
  245. package/src/inputs/SelectInput/Option/SelectInputOption.css +33 -0
  246. package/src/inputs/SelectInput/Option/SelectInputOption.less +32 -0
  247. package/src/inputs/SelectInput/Option/SelectInputOption.tsx +57 -0
  248. package/src/inputs/SelectInput/Option/index.ts +2 -0
  249. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.css +37 -0
  250. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.less +38 -0
  251. package/src/inputs/SelectInput/OptionContent/SelectInputOptionContent.tsx +72 -0
  252. package/src/inputs/SelectInput/OptionContent/index.ts +2 -0
  253. package/src/inputs/SelectInput/Options/OptionsContainer/SelectInputOptionsContainer.tsx +59 -0
  254. package/src/inputs/SelectInput/Options/OptionsContainer/index.ts +2 -0
  255. package/src/inputs/SelectInput/Options/SelectInputOptions.css +81 -0
  256. package/src/inputs/SelectInput/Options/SelectInputOptions.less +77 -0
  257. package/src/inputs/SelectInput/Options/SelectInputOptions.tsx +411 -0
  258. package/src/inputs/SelectInput/Options/index.ts +3 -0
  259. package/src/inputs/SelectInput/Popover/SelectInputPopover.css +46 -0
  260. package/src/inputs/{_Popover.tsx → SelectInput/Popover/SelectInputPopover.tsx} +7 -7
  261. package/src/inputs/SelectInput/Popover/index.ts +2 -0
  262. package/src/inputs/SelectInput/SelectInput.contexts.tsx +40 -0
  263. package/src/inputs/SelectInput/SelectInput.css +380 -0
  264. package/src/inputs/SelectInput/SelectInput.less +22 -0
  265. package/src/inputs/{SelectInput.test.tsx → SelectInput/SelectInput.test.tsx} +9 -11
  266. package/src/inputs/SelectInput/SelectInput.tsx +257 -0
  267. package/src/inputs/SelectInput/SelectInput.types.ts +113 -0
  268. package/src/inputs/SelectInput/SelectInput.utils.ts +205 -0
  269. package/src/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.tsx +36 -0
  270. package/src/inputs/SelectInput/TriggerButton/index.ts +5 -0
  271. package/src/inputs/{SelectInput.docs.mdx → SelectInput/_stories/SelectInput.docs.mdx} +0 -1
  272. package/src/inputs/{SelectInput.story.tsx → SelectInput/_stories/SelectInput.story.tsx} +11 -8
  273. package/src/inputs/{SelectInput.test.story.tsx → SelectInput/_stories/SelectInput.test.story.tsx} +6 -10
  274. package/src/inputs/SelectInput/components.ts +10 -0
  275. package/src/inputs/SelectInput/index.ts +12 -0
  276. package/src/inputs/TextArea.css +161 -0
  277. package/src/inputs/_common.less +1 -1
  278. package/src/instructionsList/InstructionsList.css +26 -0
  279. package/src/legacylistItem/LegacyListItem.css +6 -0
  280. package/src/link/Link.css +24 -0
  281. package/src/link/Link.less +2 -2
  282. package/src/listItem/ListItem.css +659 -0
  283. package/src/listItem/ListItem.grid.css +384 -0
  284. package/src/listItem/ListItem.less +1 -1
  285. package/src/listItem/Prompt/ListItemPrompt.css +4 -0
  286. package/src/loader/Loader.css +227 -0
  287. package/src/logo/Logo.css +26 -0
  288. package/src/main.css +7529 -0
  289. package/src/main.less +1 -3
  290. package/src/modal/Modal.css +95 -0
  291. package/src/moneyInput/MoneyInput.css +74 -0
  292. package/src/moneyInput/MoneyInput.less +2 -2
  293. package/src/navigationOption/NavigationOption.css +69 -0
  294. package/src/navigationOption/NavigationOption.less +3 -3
  295. package/src/navigationOptionsList/NavigationOptionsList.css +13 -0
  296. package/src/navigationOptionsList/NavigationOptionsList.less +1 -1
  297. package/src/nudge/Nudge.css +206 -0
  298. package/src/overlayHeader/OverlayHeader.css +15 -0
  299. package/src/overlayHeader/OverlayHeader.less +1 -1
  300. package/src/phoneNumberInput/PhoneNumberInput.css +23 -0
  301. package/src/phoneNumberInput/PhoneNumberInput.less +1 -1
  302. package/src/popover/Popover.css +76 -0
  303. package/src/popover/Popover.less +1 -1
  304. package/src/progress/Progress.css +43 -0
  305. package/src/progressBar/ProgressBar.css +14 -0
  306. package/src/promoCard/PromoCard.css +186 -0
  307. package/src/prompt/ActionPrompt/ActionPrompt.css +25 -0
  308. package/src/prompt/InfoPrompt/InfoPrompt.css +33 -0
  309. package/src/prompt/InlinePrompt/InlinePrompt.css +57 -0
  310. package/src/prompt/PrimitivePrompt/PrimitivePrompt.css +51 -0
  311. package/src/radioGroup/RadioGroup.css +3 -0
  312. package/src/section/Section.css +10 -0
  313. package/src/segmentedControl/SegmentedControl.css +101 -0
  314. package/src/select/Select.css +368 -0
  315. package/src/select/Select.less +5 -5
  316. package/src/sentimentSurface/SentimentSurface.css +487 -0
  317. package/src/slidingPanel/SlidingPanel.css +105 -0
  318. package/src/slidingPanel/SlidingPanel.less +2 -2
  319. package/src/snackbar/Snackbar.css +93 -0
  320. package/src/snackbar/Snackbar.less +3 -3
  321. package/src/statusIcon/StatusIcon.css +6 -0
  322. package/src/stepper/Stepper.css +77 -0
  323. package/src/stepper/Stepper.less +3 -3
  324. package/src/summary/Summary.css +81 -0
  325. package/src/summary/Summary.less +1 -1
  326. package/src/switch/Switch.css +63 -0
  327. package/src/switch/Switch.less +4 -4
  328. package/src/switchOption/SwitchOption.css +4 -0
  329. package/src/table/Table.css +274 -0
  330. package/src/table/Table.less +1 -1
  331. package/src/tabs/Tabs.css +121 -0
  332. package/src/tabs/Tabs.less +4 -4
  333. package/src/tile/Tile.css +68 -0
  334. package/src/tile/Tile.less +1 -1
  335. package/src/tooltip/Tooltip.css +50 -0
  336. package/src/tooltip/Tooltip.less +1 -1
  337. package/src/typeahead/Typeahead.css +187 -0
  338. package/src/typeahead/Typeahead.less +2 -2
  339. package/src/typeahead/typeaheadOption/TypeaheadOption.css +9 -0
  340. package/src/typeahead/typeaheadOption/TypeaheadOption.less +1 -1
  341. package/src/upload/Upload.css +34 -0
  342. package/src/upload/Upload.less +1 -1
  343. package/src/uploadInput/UploadInput.css +18 -0
  344. package/src/uploadInput/UploadInput.less +2 -2
  345. package/src/uploadInput/uploadButton/UploadButton.css +90 -0
  346. package/src/uploadInput/uploadItem/UploadItem.css +166 -0
  347. package/src/uploadInput/uploadItem/UploadItem.less +1 -1
  348. package/build/inputs/SelectInput.js +0 -890
  349. package/build/inputs/SelectInput.js.map +0 -1
  350. package/build/inputs/SelectInput.messages.js.map +0 -1
  351. package/build/inputs/SelectInput.messages.mjs.map +0 -1
  352. package/build/inputs/SelectInput.mjs +0 -881
  353. package/build/inputs/SelectInput.mjs.map +0 -1
  354. package/build/inputs/_BottomSheet.js.map +0 -1
  355. package/build/inputs/_BottomSheet.mjs.map +0 -1
  356. package/build/inputs/_ButtonInput.js.map +0 -1
  357. package/build/inputs/_ButtonInput.mjs.map +0 -1
  358. package/build/inputs/_Popover.js.map +0 -1
  359. package/build/inputs/_Popover.mjs.map +0 -1
  360. package/build/neptune-css/fonts/TW-Averta-Bold.woff +0 -0
  361. package/build/neptune-css/fonts/TW-Averta-Bold.woff2 +0 -0
  362. package/build/neptune-css/fonts/TW-Averta-Regular.woff +0 -0
  363. package/build/neptune-css/fonts/TW-Averta-Regular.woff2 +0 -0
  364. package/build/neptune-css/fonts/TW-Averta-Semibold.woff +0 -0
  365. package/build/neptune-css/fonts/TW-Averta-Semibold.woff2 +0 -0
  366. package/build/neptune-css/fonts/TransferWise-IconFont.svg +0 -81
  367. package/build/neptune-css/fonts/TransferWise-IconFont.woff +0 -0
  368. package/build/neptune-css/fonts/WiseSans-Heavy.woff2 +0 -0
  369. package/build/neptune-css/fonts/inter-cyrillic-ext-variable-wghtOnly-normal.woff2 +0 -0
  370. package/build/neptune-css/fonts/inter-cyrillic-variable-wghtOnly-normal.woff2 +0 -0
  371. package/build/neptune-css/fonts/inter-greek-ext-variable-wghtOnly-normal.woff2 +0 -0
  372. package/build/neptune-css/fonts/inter-greek-variable-wghtOnly-normal.woff2 +0 -0
  373. package/build/neptune-css/fonts/inter-latin-ext-variable-wghtOnly-normal.woff2 +0 -0
  374. package/build/neptune-css/fonts/inter-latin-variable-wghtOnly-normal.woff2 +0 -0
  375. package/build/neptune-css/fonts/inter-vietnamese-variable-wghtOnly-normal.woff2 +0 -0
  376. package/build/neptune-css/img/bg-dark.svg +0 -31
  377. package/build/neptune-css/img/bg-light.svg +0 -26
  378. package/build/neptune-css/less/legacy-variables.less +0 -1299
  379. package/build/neptune-css/less/neptune-tokens.css +0 -0
  380. package/build/neptune-css/less/neptune-tokens.less +0 -275
  381. package/build/neptune-css/less/zindex.css +0 -0
  382. package/build/neptune-css/less/zindex.less +0 -17
  383. package/build/neptune-css/props/custom-media.css +0 -11
  384. package/build/neptune-css/props/legacy-custom-props.css +0 -69
  385. package/build/neptune-css/props/neptune-tokens.css +0 -152
  386. package/build/neptune.css +0 -25724
  387. package/build/styles/neptune-css/less/accordion.css +0 -255
  388. package/build/styles/neptune-css/less/alerts.css +0 -751
  389. package/build/styles/neptune-css/less/background.css +0 -20
  390. package/build/styles/neptune-css/less/badge.css +0 -90
  391. package/build/styles/neptune-css/less/border-radius.css +0 -3
  392. package/build/styles/neptune-css/less/breadcrumbs.css +0 -20
  393. package/build/styles/neptune-css/less/button-groups.css +0 -495
  394. package/build/styles/neptune-css/less/buttons.css +0 -1390
  395. package/build/styles/neptune-css/less/chevron.css +0 -35
  396. package/build/styles/neptune-css/less/circles.css +0 -248
  397. package/build/styles/neptune-css/less/close.css +0 -47
  398. package/build/styles/neptune-css/less/column-layout.css +0 -164
  399. package/build/styles/neptune-css/less/core/viewport-themes.css +0 -59
  400. package/build/styles/neptune-css/less/currency-flags.css +0 -46
  401. package/build/styles/neptune-css/less/decision.css +0 -136
  402. package/build/styles/neptune-css/less/dropdowns.css +0 -472
  403. package/build/styles/neptune-css/less/droppable.css +0 -221
  404. package/build/styles/neptune-css/less/flex.css +0 -598
  405. package/build/styles/neptune-css/less/footer.css +0 -129
  406. package/build/styles/neptune-css/less/forms/bootstrap-forms.css +0 -2277
  407. package/build/styles/neptune-css/less/forms/checkbox-radio.css +0 -367
  408. package/build/styles/neptune-css/less/grid.css +0 -2369
  409. package/build/styles/neptune-css/less/input-groups.css +0 -2740
  410. package/build/styles/neptune-css/less/link-callout.css +0 -20
  411. package/build/styles/neptune-css/less/list-group.css +0 -350
  412. package/build/styles/neptune-css/less/loaders.css +0 -76
  413. package/build/styles/neptune-css/less/media.css +0 -74
  414. package/build/styles/neptune-css/less/modals.css +0 -185
  415. package/build/styles/neptune-css/less/navbar.css +0 -2406
  416. package/build/styles/neptune-css/less/navs.css +0 -296
  417. package/build/styles/neptune-css/less/neptune-addons.css +0 -1857
  418. package/build/styles/neptune-css/less/neptune-core.css +0 -2049
  419. package/build/styles/neptune-css/less/neptune-social-media.css +0 -144
  420. package/build/styles/neptune-css/less/neptune.css +0 -25724
  421. package/build/styles/neptune-css/less/panels.css +0 -528
  422. package/build/styles/neptune-css/less/popovers.css +0 -661
  423. package/build/styles/neptune-css/less/process.css +0 -483
  424. package/build/styles/neptune-css/less/progress-bars.css +0 -64
  425. package/build/styles/neptune-css/less/ring.css +0 -55
  426. package/build/styles/neptune-css/less/select.css +0 -99
  427. package/build/styles/neptune-css/less/sequences.css +0 -855
  428. package/build/styles/neptune-css/less/table.css +0 -446
  429. package/build/styles/neptune-css/less/tick.css +0 -32
  430. package/build/styles/neptune-css/less/tooltip.css +0 -160
  431. package/build/styles/neptune-css/less/utilities.css +0 -145
  432. package/build/styles/neptune-css/less/wells.css +0 -74
  433. package/build/styles/neptune-css/props/custom-media.css +0 -11
  434. package/build/styles/neptune-css/props/legacy-custom-props.css +0 -69
  435. package/build/styles/neptune-css/props/neptune-tokens.css +0 -11
  436. package/build/styles/neptune-css/variables/legacy-variables.css +0 -0
  437. package/build/styles/neptune-css/variables/neptune-tokens.css +0 -0
  438. package/build/styles/neptune-css/variables/zindex.css +0 -0
  439. package/build/types/inputs/SelectInput.d.ts.map +0 -1
  440. package/build/types/inputs/SelectInput.messages.d.ts.map +0 -1
  441. package/build/types/inputs/_BottomSheet.d.ts.map +0 -1
  442. package/build/types/inputs/_ButtonInput.d.ts +0 -5
  443. package/build/types/inputs/_ButtonInput.d.ts.map +0 -1
  444. package/build/types/inputs/_Popover.d.ts.map +0 -1
  445. package/src/inputs/SelectInput.less +0 -219
  446. package/src/inputs/SelectInput.tsx +0 -1269
  447. package/src/neptune-css/fonts/TW-Averta-Bold.woff +0 -0
  448. package/src/neptune-css/fonts/TW-Averta-Bold.woff2 +0 -0
  449. package/src/neptune-css/fonts/TW-Averta-Regular.woff +0 -0
  450. package/src/neptune-css/fonts/TW-Averta-Regular.woff2 +0 -0
  451. package/src/neptune-css/fonts/TW-Averta-Semibold.woff +0 -0
  452. package/src/neptune-css/fonts/TW-Averta-Semibold.woff2 +0 -0
  453. package/src/neptune-css/fonts/TransferWise-IconFont.svg +0 -81
  454. package/src/neptune-css/fonts/TransferWise-IconFont.woff +0 -0
  455. package/src/neptune-css/fonts/WiseSans-Heavy.woff2 +0 -0
  456. package/src/neptune-css/fonts/inter-cyrillic-ext-variable-wghtOnly-normal.woff2 +0 -0
  457. package/src/neptune-css/fonts/inter-cyrillic-variable-wghtOnly-normal.woff2 +0 -0
  458. package/src/neptune-css/fonts/inter-greek-ext-variable-wghtOnly-normal.woff2 +0 -0
  459. package/src/neptune-css/fonts/inter-greek-variable-wghtOnly-normal.woff2 +0 -0
  460. package/src/neptune-css/fonts/inter-latin-ext-variable-wghtOnly-normal.woff2 +0 -0
  461. package/src/neptune-css/fonts/inter-latin-variable-wghtOnly-normal.woff2 +0 -0
  462. package/src/neptune-css/fonts/inter-vietnamese-variable-wghtOnly-normal.woff2 +0 -0
  463. package/src/neptune-css/img/bg-dark.svg +0 -31
  464. package/src/neptune-css/img/bg-light.svg +0 -26
  465. package/src/neptune-css/less/accordion.less +0 -15
  466. package/src/neptune-css/less/addons/_background-utilities.less +0 -82
  467. package/src/neptune-css/less/addons/_border.less +0 -3
  468. package/src/neptune-css/less/addons/_display-utilities.less +0 -159
  469. package/src/neptune-css/less/addons/_spacing-utilities.less +0 -73
  470. package/src/neptune-css/less/addons/_utilities.less +0 -147
  471. package/src/neptune-css/less/alerts.less +0 -252
  472. package/src/neptune-css/less/background.less +0 -24
  473. package/src/neptune-css/less/badge.less +0 -85
  474. package/src/neptune-css/less/border-radius.less +0 -3
  475. package/src/neptune-css/less/breadcrumbs.less +0 -27
  476. package/src/neptune-css/less/button-groups.less +0 -424
  477. package/src/neptune-css/less/buttons.less +0 -738
  478. package/src/neptune-css/less/chevron.less +0 -39
  479. package/src/neptune-css/less/circles.less +0 -233
  480. package/src/neptune-css/less/close.less +0 -48
  481. package/src/neptune-css/less/column-layout.less +0 -167
  482. package/src/neptune-css/less/components/_component-animations.less +0 -43
  483. package/src/neptune-css/less/core/_fonts.less +0 -97
  484. package/src/neptune-css/less/core/_scaffolding.less +0 -380
  485. package/src/neptune-css/less/core/_typography-utilities.less +0 -255
  486. package/src/neptune-css/less/core/_typography.less +0 -575
  487. package/src/neptune-css/less/core/viewport-themes.less +0 -65
  488. package/src/neptune-css/less/currency-flags.less +0 -42
  489. package/src/neptune-css/less/decision.less +0 -98
  490. package/src/neptune-css/less/dropdowns.less +0 -365
  491. package/src/neptune-css/less/droppable.less +0 -213
  492. package/src/neptune-css/less/flex.less +0 -113
  493. package/src/neptune-css/less/footer.less +0 -113
  494. package/src/neptune-css/less/forms/bootstrap-forms.less +0 -1218
  495. package/src/neptune-css/less/forms/checkbox-radio.less +0 -330
  496. package/src/neptune-css/less/grid.less +0 -187
  497. package/src/neptune-css/less/input-groups.less +0 -298
  498. package/src/neptune-css/less/link-callout.less +0 -17
  499. package/src/neptune-css/less/list-group.less +0 -260
  500. package/src/neptune-css/less/loaders.less +0 -91
  501. package/src/neptune-css/less/media.less +0 -68
  502. package/src/neptune-css/less/mixins/_alerts.less +0 -39
  503. package/src/neptune-css/less/mixins/_arrows.less +0 -52
  504. package/src/neptune-css/less/mixins/_border-radius.less +0 -11
  505. package/src/neptune-css/less/mixins/_buttons.less +0 -82
  506. package/src/neptune-css/less/mixins/_center-block.less +0 -7
  507. package/src/neptune-css/less/mixins/_clearfix.less +0 -23
  508. package/src/neptune-css/less/mixins/_flex.less +0 -105
  509. package/src/neptune-css/less/mixins/_forms.less +0 -130
  510. package/src/neptune-css/less/mixins/_grid-framework.less +0 -104
  511. package/src/neptune-css/less/mixins/_grid.less +0 -158
  512. package/src/neptune-css/less/mixins/_hide-text.less +0 -20
  513. package/src/neptune-css/less/mixins/_links.less +0 -7
  514. package/src/neptune-css/less/mixins/_list-group.less +0 -23
  515. package/src/neptune-css/less/mixins/_logical-properties-IE-friendly.less +0 -381
  516. package/src/neptune-css/less/mixins/_logical-properties-modern-browsers.less +0 -226
  517. package/src/neptune-css/less/mixins/_logical-properties.less +0 -5
  518. package/src/neptune-css/less/mixins/_nav-divider.less +0 -10
  519. package/src/neptune-css/less/mixins/_nav-vertical-align.less +0 -10
  520. package/src/neptune-css/less/mixins/_panels.less +0 -23
  521. package/src/neptune-css/less/mixins/_physical-properties.less +0 -110
  522. package/src/neptune-css/less/mixins/_reset-text.less +0 -22
  523. package/src/neptune-css/less/mixins/_sequence.less +0 -203
  524. package/src/neptune-css/less/mixins/_spacing.less +0 -122
  525. package/src/neptune-css/less/mixins/_tab-focus.less +0 -5
  526. package/src/neptune-css/less/mixins/_table-row.less +0 -47
  527. package/src/neptune-css/less/mixins/_text-emphasis.less +0 -39
  528. package/src/neptune-css/less/mixins/_text-overflow.less +0 -8
  529. package/src/neptune-css/less/mixins/_theming.less +0 -7
  530. package/src/neptune-css/less/modals.less +0 -239
  531. package/src/neptune-css/less/navbar.less +0 -1442
  532. package/src/neptune-css/less/navs.less +0 -339
  533. package/src/neptune-css/less/neptune-addons.less +0 -4
  534. package/src/neptune-css/less/neptune-core.less +0 -4
  535. package/src/neptune-css/less/neptune-social-media.less +0 -84
  536. package/src/neptune-css/less/neptune.bundle.less +0 -65
  537. package/src/neptune-css/less/panels.less +0 -410
  538. package/src/neptune-css/less/popovers.less +0 -379
  539. package/src/neptune-css/less/process.less +0 -426
  540. package/src/neptune-css/less/progress-bars.less +0 -55
  541. package/src/neptune-css/less/ring.less +0 -51
  542. package/src/neptune-css/less/select.less +0 -88
  543. package/src/neptune-css/less/sequences.less +0 -511
  544. package/src/neptune-css/less/table.less +0 -385
  545. package/src/neptune-css/less/tick.less +0 -37
  546. package/src/neptune-css/less/tooltip.less +0 -130
  547. package/src/neptune-css/less/utilities.less +0 -153
  548. package/src/neptune-css/less/wells.less +0 -37
  549. package/src/neptune-css/props/custom-media.css +0 -11
  550. package/src/neptune-css/props/legacy-custom-props.css +0 -69
  551. package/src/neptune-css/props/neptune-tokens.css +0 -11
  552. package/src/neptune-css/variables/legacy-variables.less +0 -1299
  553. package/src/neptune-css/variables/neptune-tokens.less +0 -12
  554. package/src/neptune-css/variables/zindex.less +0 -17
  555. package/build/inputs/{SelectInput.messages.js → SelectInput/SelectInput.messages.js} +0 -0
  556. package/build/inputs/{SelectInput.messages.mjs → SelectInput/SelectInput.messages.mjs} +0 -0
  557. package/build/styles/inputs/{SelectInput.css → SelectInput/SelectInput.css} +90 -90
  558. /package/build/types/inputs/{SelectInput.messages.d.ts → SelectInput/SelectInput.messages.d.ts} +0 -0
  559. /package/src/inputs/{_BottomSheet.less → SelectInput/BottomSheet/SelectInputBottomSheet.less} +0 -0
  560. /package/src/inputs/{_ButtonInput.less → SelectInput/ButtonInput/SelectInputButtonInput.less} +0 -0
  561. /package/src/inputs/{_Popover.less → SelectInput/Popover/SelectInputPopover.less} +0 -0
  562. /package/src/inputs/{SelectInput.messages.ts → SelectInput/SelectInput.messages.ts} +0 -0
  563. /package/{build/neptune-css/less/legacy-variables.css → src/listItem/ListItem.vars.css} +0 -0
@@ -0,0 +1,216 @@
1
+ import mergeProps from 'merge-props';
2
+ import { useState, useRef, useEffect, useDeferredValue } from 'react';
3
+ import { Listbox } from '@headlessui/react';
4
+ import { useScreenSize } from '../../common/hooks/useScreenSize.mjs';
5
+ import { Breakpoint } from '../../common/propsValues/breakpoint.mjs';
6
+ import { useEffectEvent } from '../../common/hooks/useEffectEvent.mjs';
7
+ import { useInputAttributes } from '../contexts.mjs';
8
+ import { SelectInputBottomSheet } from './BottomSheet/SelectInputBottomSheet.mjs';
9
+ import { SelectInputPopover } from './Popover/SelectInputPopover.mjs';
10
+ import { SelectInputOptions } from './Options/SelectInputOptions.mjs';
11
+ import { jsx } from 'react/jsx-runtime';
12
+ import { DefaultRenderTrigger } from './DefaultRenderTrigger/SelectInputDefaultRenderTrigger.mjs';
13
+ import { SelectInputTriggerButtonPropsContext, SelectInputOptionContentWithinTriggerContext } from './SelectInput.contexts.mjs';
14
+ import { searchableString, sortByRelevance } from './SelectInput.utils.mjs';
15
+
16
+ const noop = () => {};
17
+ /**
18
+ * SelectInput component allows users to select an option from a dropdown list.
19
+ * Supports filtering, multiple selection, and customization.
20
+ */
21
+ function SelectInput({
22
+ id: idProp,
23
+ parentId,
24
+ name,
25
+ multiple,
26
+ placeholder,
27
+ autocomplete,
28
+ items,
29
+ defaultValue,
30
+ value: controlledValue,
31
+ compareValues,
32
+ renderValue = String,
33
+ renderFooter,
34
+ renderTrigger = DefaultRenderTrigger,
35
+ filterable,
36
+ filterPlaceholder,
37
+ sortFilteredOptions,
38
+ disabled,
39
+ size = 'md',
40
+ className,
41
+ UNSAFE_triggerButtonProps,
42
+ triggerRef: externalTriggerRef,
43
+ onFilterChange = noop,
44
+ onChange,
45
+ onOpen,
46
+ onClose,
47
+ onClear
48
+ }) {
49
+ const inputAttributes = useInputAttributes({
50
+ nonLabelable: true
51
+ });
52
+ const id = idProp ?? inputAttributes.id;
53
+ const [open, setOpen] = useState(false);
54
+ const initialized = useRef(false);
55
+ const handleClose = useEffectEvent(onClose ?? (() => {}));
56
+ const handleOpen = useEffectEvent(onOpen ?? (() => {}));
57
+ useEffect(() => {
58
+ if (initialized.current) {
59
+ if (open) {
60
+ handleOpen?.();
61
+ } else {
62
+ handleClose?.();
63
+ }
64
+ } else {
65
+ initialized.current = true;
66
+ }
67
+ }, [handleClose, handleOpen, open]);
68
+ const [filterQuery, _setFilterQuery] = useState('');
69
+ const deferredFilterQuery = useDeferredValue(filterQuery);
70
+ const setFilterQuery = useEffectEvent(query => {
71
+ _setFilterQuery(query);
72
+ if (query !== filterQuery) {
73
+ onFilterChange({
74
+ query,
75
+ queryNormalized: query ? searchableString(query) : null
76
+ });
77
+ }
78
+ });
79
+ const internalTriggerRef = useRef(null);
80
+ const screenSm = useScreenSize(Breakpoint.SMALL);
81
+ const OptionsOverlay = screenSm ? SelectInputPopover : SelectInputBottomSheet;
82
+ const searchInputRef = useRef(null);
83
+ const listboxRef = useRef(null);
84
+ const controllerRef = filterable ? searchInputRef : listboxRef;
85
+ /**
86
+ * Attempts to resolve the `listbox` label
87
+ * @see https://storybook.wise.design/?path=/docs/forms-selectinput-accessibility--docs#labelling
88
+ */
89
+ const getListBoxLabelProps = () => {
90
+ if (UNSAFE_triggerButtonProps?.['aria-label']) {
91
+ return {
92
+ listBoxLabel: UNSAFE_triggerButtonProps['aria-label']
93
+ };
94
+ }
95
+ if (UNSAFE_triggerButtonProps?.['aria-labelledby']) {
96
+ return {
97
+ listBoxLabelledBy: UNSAFE_triggerButtonProps['aria-labelledby']
98
+ };
99
+ }
100
+ if (inputAttributes['aria-labelledby']) {
101
+ return {
102
+ listBoxLabelledBy: inputAttributes['aria-labelledby']
103
+ };
104
+ }
105
+ return {};
106
+ };
107
+ return /*#__PURE__*/jsx(Listbox, {
108
+ name: name,
109
+ multiple: multiple,
110
+ defaultValue: defaultValue,
111
+ value: controlledValue,
112
+ by: compareValues,
113
+ disabled: disabled,
114
+ onChange: value => {
115
+ if (!multiple) {
116
+ setOpen(false);
117
+ }
118
+ onChange?.(value);
119
+ },
120
+ children: ({
121
+ disabled: uiDisabled,
122
+ value
123
+ }) => {
124
+ const placeholderShown = multiple && Array.isArray(value) ? value.length === 0 : value == null;
125
+ return /*#__PURE__*/jsx(OptionsOverlay, {
126
+ placement: "bottom-start",
127
+ open: open,
128
+ renderTrigger: ({
129
+ ref,
130
+ getInteractionProps
131
+ }) => /*#__PURE__*/jsx(SelectInputTriggerButtonPropsContext.Provider, {
132
+ // eslint-disable-next-line react/jsx-no-constructed-context-values
133
+ value: {
134
+ ref: node => {
135
+ ref(node);
136
+ if (externalTriggerRef) {
137
+ // eslint-disable-next-line no-param-reassign
138
+ externalTriggerRef.current = node;
139
+ } else {
140
+ internalTriggerRef.current = node;
141
+ }
142
+ },
143
+ size,
144
+ ...inputAttributes,
145
+ ...UNSAFE_triggerButtonProps,
146
+ id,
147
+ ...mergeProps({
148
+ onClick: () => {
149
+ setOpen(prev => !prev);
150
+ },
151
+ onKeyDown: event => {
152
+ if (event.key === ' ' || event.key === 'Enter' || event.key === 'ArrowDown' || event.key === 'ArrowUp') {
153
+ setOpen(prev => !prev);
154
+ }
155
+ }
156
+ }, getInteractionProps())
157
+ },
158
+ children: renderTrigger({
159
+ content: !placeholderShown ? /*#__PURE__*/jsx(SelectInputOptionContentWithinTriggerContext.Provider, {
160
+ value: true,
161
+ children: multiple && Array.isArray(value) ? value.map(option => renderValue(option, true)).filter(node => node != null).join(', ') : renderValue(value, true)
162
+ }) : placeholder,
163
+ placeholderShown,
164
+ clear: onClear != null ? () => {
165
+ onClear();
166
+ (externalTriggerRef?.current ?? internalTriggerRef.current)?.focus({
167
+ preventScroll: true
168
+ });
169
+ } : undefined,
170
+ disabled: uiDisabled,
171
+ size,
172
+ className
173
+ })
174
+ }),
175
+ initialFocusRef: controllerRef,
176
+ size: filterable ? 'lg' : 'md',
177
+ padding: "none",
178
+ onClose: () => {
179
+ setOpen(false);
180
+ },
181
+ onCloseEnd: () => {
182
+ setFilterQuery('');
183
+ },
184
+ children: /*#__PURE__*/jsx(SelectInputOptions, {
185
+ id: id ? `${id}Search` : undefined,
186
+ parentId: parentId,
187
+ items: items,
188
+ compareValues: compareValues,
189
+ renderValue: renderValue,
190
+ renderFooter: renderFooter,
191
+ filterable: filterable,
192
+ filterPlaceholder: filterPlaceholder,
193
+ sortFilteredOptions: sortFilteredOptions,
194
+ searchInputRef: searchInputRef,
195
+ listboxRef: listboxRef,
196
+ filterQuery: deferredFilterQuery,
197
+ autocomplete: autocomplete,
198
+ name: name,
199
+ onFilterChange: setFilterQuery,
200
+ onAutocompleteSelect: matchedValue => {
201
+ onChange?.(matchedValue);
202
+ if (!multiple) {
203
+ setOpen(false);
204
+ }
205
+ },
206
+ ...getListBoxLabelProps()
207
+ })
208
+ });
209
+ }
210
+ });
211
+ }
212
+ // Attach sortByRelevance to the component for convenience
213
+ SelectInput.sortByRelevance = sortByRelevance;
214
+
215
+ export { SelectInput };
216
+ //# sourceMappingURL=SelectInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectInput.mjs","sources":["../../../src/inputs/SelectInput/SelectInput.tsx"],"sourcesContent":["import mergeProps from 'merge-props';\nimport { useEffect, useRef, useState, useDeferredValue } from 'react';\nimport { Listbox as ListboxBase } from '@headlessui/react';\nimport { useScreenSize } from '../../common/hooks/useScreenSize';\nimport { Breakpoint } from '../../common/propsValues/breakpoint';\nimport { useEffectEvent } from '../../common/hooks/useEffectEvent';\nimport { useInputAttributes } from '../contexts';\n\nimport { SelectInputBottomSheet } from './BottomSheet';\nimport { SelectInputPopover } from './Popover';\nimport { SelectInputOptions } from './Options';\nimport { DefaultRenderTrigger } from './DefaultRenderTrigger';\n\nimport {\n SelectInputOptionContentWithinTriggerContext,\n SelectInputTriggerButtonPropsContext,\n} from './SelectInput.contexts';\nimport { searchableString, sortByRelevance } from './SelectInput.utils';\nimport { SelectInputProps } from './SelectInput.types';\n\nconst noop = () => {};\n\n/**\n * SelectInput component allows users to select an option from a dropdown list.\n * Supports filtering, multiple selection, and customization.\n */\nexport function SelectInput<T = string, M extends boolean = false>({\n id: idProp,\n parentId,\n name,\n multiple,\n placeholder,\n autocomplete,\n items,\n defaultValue,\n value: controlledValue,\n compareValues,\n renderValue = String,\n renderFooter,\n renderTrigger = DefaultRenderTrigger,\n filterable,\n filterPlaceholder,\n sortFilteredOptions,\n disabled,\n size = 'md',\n className,\n UNSAFE_triggerButtonProps,\n triggerRef: externalTriggerRef,\n onFilterChange = noop,\n onChange,\n onOpen,\n onClose,\n onClear,\n}: SelectInputProps<T, M>) {\n const inputAttributes = useInputAttributes({ nonLabelable: true });\n const id = idProp ?? inputAttributes.id;\n\n const [open, setOpen] = useState(false);\n\n const initialized = useRef(false);\n const handleClose = useEffectEvent(onClose ?? (() => {}));\n const handleOpen = useEffectEvent(onOpen ?? (() => {}));\n useEffect(() => {\n if (initialized.current) {\n if (open) {\n handleOpen?.();\n } else {\n handleClose?.();\n }\n } else {\n initialized.current = true;\n }\n }, [handleClose, handleOpen, open]);\n\n const [filterQuery, _setFilterQuery] = useState('');\n const deferredFilterQuery = useDeferredValue(filterQuery);\n const setFilterQuery = useEffectEvent((query: string) => {\n _setFilterQuery(query);\n if (query !== filterQuery) {\n onFilterChange({\n query,\n queryNormalized: query ? searchableString(query) : null,\n });\n }\n });\n\n const internalTriggerRef = useRef<HTMLButtonElement | null>(null);\n\n const screenSm = useScreenSize(Breakpoint.SMALL);\n const OptionsOverlay = screenSm ? SelectInputPopover : SelectInputBottomSheet;\n\n const searchInputRef = useRef<HTMLInputElement>(null);\n const listboxRef = useRef<HTMLDivElement>(null);\n const controllerRef = filterable ? searchInputRef : listboxRef;\n\n /**\n * Attempts to resolve the `listbox` label\n * @see https://storybook.wise.design/?path=/docs/forms-selectinput-accessibility--docs#labelling\n */\n const getListBoxLabelProps = (): {\n listBoxLabel?: string;\n listBoxLabelledBy?: string;\n } => {\n if (UNSAFE_triggerButtonProps?.['aria-label']) {\n return {\n listBoxLabel: UNSAFE_triggerButtonProps['aria-label'],\n };\n }\n\n if (UNSAFE_triggerButtonProps?.['aria-labelledby']) {\n return {\n listBoxLabelledBy: UNSAFE_triggerButtonProps['aria-labelledby'],\n };\n }\n\n if (inputAttributes['aria-labelledby']) {\n return {\n listBoxLabelledBy: inputAttributes['aria-labelledby'],\n };\n }\n\n return {};\n };\n\n return (\n <ListboxBase\n name={name}\n multiple={multiple}\n defaultValue={defaultValue as M extends true ? T[] : T}\n value={controlledValue as M extends true ? T[] : T}\n by={compareValues}\n disabled={disabled}\n onChange={\n ((value) => {\n if (!multiple) {\n setOpen(false);\n }\n onChange?.(value);\n }) satisfies SelectInputProps<T, M>['onChange']\n }\n >\n {({ disabled: uiDisabled, value }) => {\n const placeholderShown =\n multiple && Array.isArray(value) ? value.length === 0 : value == null;\n return (\n <OptionsOverlay\n placement=\"bottom-start\"\n open={open}\n renderTrigger={({ ref, getInteractionProps }) => (\n <SelectInputTriggerButtonPropsContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n ref: (node) => {\n ref(node);\n if (externalTriggerRef) {\n // eslint-disable-next-line no-param-reassign\n externalTriggerRef.current = node;\n } else {\n internalTriggerRef.current = node;\n }\n },\n size,\n ...inputAttributes,\n ...UNSAFE_triggerButtonProps,\n id,\n ...mergeProps(\n {\n onClick: () => {\n setOpen((prev) => !prev);\n },\n onKeyDown: (event: React.KeyboardEvent) => {\n if (\n event.key === ' ' ||\n event.key === 'Enter' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp'\n ) {\n setOpen((prev) => !prev);\n }\n },\n },\n getInteractionProps(),\n ),\n }}\n >\n {renderTrigger({\n content: !placeholderShown ? (\n <SelectInputOptionContentWithinTriggerContext.Provider value>\n {multiple && Array.isArray(value)\n ? (value as readonly NonNullable<T>[])\n .map((option) => renderValue(option, true))\n .filter((node) => node != null)\n .join(', ')\n : renderValue(value as NonNullable<T>, true)}\n </SelectInputOptionContentWithinTriggerContext.Provider>\n ) : (\n placeholder\n ),\n placeholderShown,\n clear:\n onClear != null\n ? () => {\n onClear();\n (externalTriggerRef?.current ?? internalTriggerRef.current)?.focus({\n preventScroll: true,\n });\n }\n : undefined,\n disabled: uiDisabled,\n size,\n className,\n })}\n </SelectInputTriggerButtonPropsContext.Provider>\n )}\n initialFocusRef={controllerRef}\n size={filterable ? 'lg' : 'md'}\n padding=\"none\"\n onClose={() => {\n setOpen(false);\n }}\n onCloseEnd={() => {\n setFilterQuery('');\n }}\n >\n <SelectInputOptions\n id={id ? `${id}Search` : undefined}\n parentId={parentId}\n items={items}\n compareValues={compareValues}\n renderValue={renderValue}\n renderFooter={renderFooter}\n filterable={filterable}\n filterPlaceholder={filterPlaceholder}\n sortFilteredOptions={sortFilteredOptions}\n searchInputRef={searchInputRef}\n listboxRef={listboxRef}\n filterQuery={deferredFilterQuery}\n autocomplete={autocomplete}\n name={name}\n onFilterChange={setFilterQuery}\n onAutocompleteSelect={(matchedValue) => {\n onChange?.(matchedValue as M extends true ? T[] : T);\n if (!multiple) {\n setOpen(false);\n }\n }}\n {...getListBoxLabelProps()}\n />\n </OptionsOverlay>\n );\n }}\n </ListboxBase>\n );\n}\n\n// Attach sortByRelevance to the component for convenience\nSelectInput.sortByRelevance = sortByRelevance;\n"],"names":["noop","SelectInput","id","idProp","parentId","name","multiple","placeholder","autocomplete","items","defaultValue","value","controlledValue","compareValues","renderValue","String","renderFooter","renderTrigger","DefaultRenderTrigger","filterable","filterPlaceholder","sortFilteredOptions","disabled","size","className","UNSAFE_triggerButtonProps","triggerRef","externalTriggerRef","onFilterChange","onChange","onOpen","onClose","onClear","inputAttributes","useInputAttributes","nonLabelable","open","setOpen","useState","initialized","useRef","handleClose","useEffectEvent","handleOpen","useEffect","current","filterQuery","_setFilterQuery","deferredFilterQuery","useDeferredValue","setFilterQuery","query","queryNormalized","searchableString","internalTriggerRef","screenSm","useScreenSize","Breakpoint","SMALL","OptionsOverlay","SelectInputPopover","SelectInputBottomSheet","searchInputRef","listboxRef","controllerRef","getListBoxLabelProps","listBoxLabel","listBoxLabelledBy","_jsx","ListboxBase","by","children","uiDisabled","placeholderShown","Array","isArray","length","placement","ref","getInteractionProps","SelectInputTriggerButtonPropsContext","Provider","node","mergeProps","onClick","prev","onKeyDown","event","key","content","SelectInputOptionContentWithinTriggerContext","map","option","filter","join","clear","focus","preventScroll","undefined","initialFocusRef","padding","onCloseEnd","SelectInputOptions","onAutocompleteSelect","matchedValue","sortByRelevance"],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ 'use strict';
2
+
3
+ const MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;
4
+ /**
5
+ * Converts a string to a normalized, searchable format by:
6
+ * - Trimming whitespace
7
+ * - Normalizing whitespace (convert multiple spaces to single space)
8
+ * - Converting to NFD normalization form to handle diacritics
9
+ * - Removing combining diacritical marks
10
+ * - Converting to lowercase
11
+ */
12
+ function searchableString(value) {
13
+ return value.trim().replace(/\s+/gu, ' ')
14
+ // NFD converts an Å to A + ̊ (and other special characters)
15
+ .normalize('NFD')
16
+ // and then this replaces the ̊ with nothing (and other special characters)
17
+ .replace(/[\u0300-\u036f]/g, '').toLowerCase();
18
+ }
19
+ /**
20
+ * Extracts searchable strings from a value.
21
+ * - If the value is a string, returns a normalized version.
22
+ * - If the value is an object, extracts all string values and normalizes them.
23
+ * - Otherwise returns an empty array.
24
+ */
25
+ function inferSearchableStrings(value) {
26
+ if (typeof value === 'string') {
27
+ return [searchableString(value)];
28
+ }
29
+ if (typeof value === 'object' && value != null) {
30
+ return Object.values(value).filter(innerValue => typeof innerValue === 'string').map(innerValue => searchableString(innerValue));
31
+ }
32
+ return [];
33
+ }
34
+ /**
35
+ * Sets the value of a duplicate option item to undefined, effectively hiding it when rendered.
36
+ */
37
+ function dedupeSelectInputOptionItem(item, existingValues, compareValues) {
38
+ const isDuplicate = compareValues ? Array.from(existingValues).some(existingValue => compareValues(item.value, existingValue)) : existingValues.has(item.value);
39
+ if (!isDuplicate) {
40
+ existingValues.add(item.value);
41
+ return item;
42
+ }
43
+ return {
44
+ ...item,
45
+ value: undefined
46
+ };
47
+ }
48
+ /**
49
+ * Sets the `value` of duplicate option items to `undefined`, hiding them when
50
+ * rendered. Indexes are kept intact within groups to preserve the active item
51
+ * between filter changes when possible.
52
+ */
53
+ function dedupeSelectInputItems(items, compareValues) {
54
+ const existingValues = new Set();
55
+ return items.map(item => {
56
+ switch (item.type) {
57
+ case 'option':
58
+ {
59
+ return dedupeSelectInputOptionItem(item, existingValues, compareValues);
60
+ }
61
+ case 'group':
62
+ {
63
+ return {
64
+ ...item,
65
+ options: item.options.map(option => dedupeSelectInputOptionItem(option, existingValues, compareValues))
66
+ };
67
+ }
68
+ }
69
+ return item;
70
+ });
71
+ }
72
+ /**
73
+ * Checks if a SelectInputOptionItem matches the search needle.
74
+ */
75
+ function selectInputOptionItemIncludesNeedle(item, needle) {
76
+ return inferSearchableStrings(item.filterMatchers ?? item.value).some(haystack => haystack.includes(needle));
77
+ }
78
+ /**
79
+ * Filters SelectInputItems based on the provided predicate function.
80
+ * For group items, it checks if any of their options match the predicate.
81
+ */
82
+ function filterSelectInputItems(items, predicate) {
83
+ return items.filter(item => {
84
+ switch (item.type) {
85
+ case 'option':
86
+ {
87
+ return predicate(item);
88
+ }
89
+ case 'group':
90
+ {
91
+ return item.options.some(option => predicate(option));
92
+ }
93
+ }
94
+ return false;
95
+ });
96
+ }
97
+ /**
98
+ * Flattens and sorts filtered options using the provided comparator.
99
+ * Extracts all options from groups, filters out undefined values (deduplicated items),
100
+ * sorts them, and returns as a flat list of option items.
101
+ */
102
+ function sortSelectInputItems(items, compareFn, searchQuery) {
103
+ const flattenedOption = items.flatMap(item => {
104
+ if (item.type === 'option') {
105
+ return item.value !== undefined ? [item] : [];
106
+ }
107
+ if (item.type === 'group') {
108
+ return item.options.filter(option => option.value !== undefined);
109
+ }
110
+ return [];
111
+ });
112
+ // eslint-disable-next-line functional/immutable-data
113
+ return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));
114
+ }
115
+ /**
116
+ * A prebuilt sort function for `sortFilteredOptions` that sorts options by relevance to the search query.
117
+ * Prioritizes: exact matches > starts with > contains > alphabetical.
118
+ *
119
+ * @param getLabel - Function to extract the label string from the option value. Defaults to using `title` property.
120
+ *
121
+ * @example
122
+ * ```tsx
123
+ * <SelectInput
124
+ * filterable
125
+ * sortFilteredOptions={sortByRelevance((value) => value.name)}
126
+ * // ...
127
+ * />
128
+ * ```
129
+ */
130
+ function sortByRelevance(getLabel = value => value.title) {
131
+ return (a, b, searchQuery) => {
132
+ const normalizedQuery = searchQuery.toLowerCase();
133
+ const labelA = getLabel(a.value).toLowerCase();
134
+ const labelB = getLabel(b.value).toLowerCase();
135
+ // Prioritize exact matches
136
+ const aExactMatch = labelA === normalizedQuery;
137
+ const bExactMatch = labelB === normalizedQuery;
138
+ if (aExactMatch && !bExactMatch) return -1;
139
+ if (!aExactMatch && bExactMatch) return 1;
140
+ // Then prioritize options where label starts with the search query
141
+ const aStartsWith = labelA.startsWith(normalizedQuery);
142
+ const bStartsWith = labelB.startsWith(normalizedQuery);
143
+ if (aStartsWith && !bStartsWith) return -1;
144
+ if (!aStartsWith && bStartsWith) return 1;
145
+ // Then prioritize options where label contains the search query
146
+ const aContains = labelA.includes(normalizedQuery);
147
+ const bContains = labelB.includes(normalizedQuery);
148
+ if (aContains && !bContains) return -1;
149
+ if (!aContains && bContains) return 1;
150
+ // Finally sort alphabetically
151
+ return labelA.localeCompare(labelB);
152
+ };
153
+ }
154
+
155
+ exports.MAX_ITEMS_WITHOUT_VIRTUALIZATION = MAX_ITEMS_WITHOUT_VIRTUALIZATION;
156
+ exports.dedupeSelectInputItems = dedupeSelectInputItems;
157
+ exports.dedupeSelectInputOptionItem = dedupeSelectInputOptionItem;
158
+ exports.filterSelectInputItems = filterSelectInputItems;
159
+ exports.inferSearchableStrings = inferSearchableStrings;
160
+ exports.searchableString = searchableString;
161
+ exports.selectInputOptionItemIncludesNeedle = selectInputOptionItemIncludesNeedle;
162
+ exports.sortByRelevance = sortByRelevance;
163
+ exports.sortSelectInputItems = sortSelectInputItems;
164
+ //# sourceMappingURL=SelectInput.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectInput.utils.js","sources":["../../../src/inputs/SelectInput/SelectInput.utils.ts"],"sourcesContent":["import { SelectInputItem, SelectInputOptionItem } from './SelectInput.types';\n\nexport const MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;\n\n/**\n * Converts a string to a normalized, searchable format by:\n * - Trimming whitespace\n * - Normalizing whitespace (convert multiple spaces to single space)\n * - Converting to NFD normalization form to handle diacritics\n * - Removing combining diacritical marks\n * - Converting to lowercase\n */\nexport function searchableString(value: string) {\n return (\n value\n .trim()\n .replace(/\\s+/gu, ' ')\n // NFD converts an Å to A + ̊ (and other special characters)\n .normalize('NFD')\n // and then this replaces the ̊ with nothing (and other special characters)\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n );\n}\n\n/**\n * Extracts searchable strings from a value.\n * - If the value is a string, returns a normalized version.\n * - If the value is an object, extracts all string values and normalizes them.\n * - Otherwise returns an empty array.\n */\nexport function inferSearchableStrings(value: unknown) {\n if (typeof value === 'string') {\n return [searchableString(value)];\n }\n\n if (typeof value === 'object' && value != null) {\n return Object.values(value)\n .filter((innerValue) => typeof innerValue === 'string')\n .map((innerValue) => searchableString(innerValue));\n }\n\n return [];\n}\n\n/**\n * Sets the value of a duplicate option item to undefined, effectively hiding it when rendered.\n */\nexport function dedupeSelectInputOptionItem<T>(\n item: SelectInputOptionItem<T>,\n existingValues: Set<T>,\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputOptionItem<T | undefined> {\n const isDuplicate = compareValues\n ? Array.from(existingValues).some((existingValue) => compareValues(item.value, existingValue))\n : existingValues.has(item.value);\n\n if (!isDuplicate) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\n/**\n * Sets the `value` of duplicate option items to `undefined`, hiding them when\n * rendered. Indexes are kept intact within groups to preserve the active item\n * between filter changes when possible.\n */\nexport function dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues, compareValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues, compareValues),\n ),\n };\n }\n default:\n }\n return item;\n });\n}\n\n/**\n * Checks if a SelectInputOptionItem matches the search needle.\n */\nexport function selectInputOptionItemIncludesNeedle<T>(\n item: SelectInputOptionItem<T>,\n needle: string,\n) {\n return inferSearchableStrings(item.filterMatchers ?? item.value).some((haystack) =>\n haystack.includes(needle),\n );\n}\n\n/**\n * Filters SelectInputItems based on the provided predicate function.\n * For group items, it checks if any of their options match the predicate.\n */\nexport function filterSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n predicate: (item: SelectInputOptionItem<T>) => boolean,\n) {\n return items.filter((item) => {\n switch (item.type) {\n case 'option': {\n return predicate(item);\n }\n case 'group': {\n return item.options.some((option) => predicate(option));\n }\n default:\n }\n return false;\n });\n}\n\n/**\n * Flattens and sorts filtered options using the provided comparator.\n * Extracts all options from groups, filters out undefined values (deduplicated items),\n * sorts them, and returns as a flat list of option items.\n */\nexport function sortSelectInputItems<T>(\n items: readonly SelectInputItem<T | undefined>[],\n compareFn: (\n a: SelectInputOptionItem<NonNullable<T>>,\n b: SelectInputOptionItem<NonNullable<T>>,\n searchQuery: string,\n ) => number,\n searchQuery: string,\n): SelectInputItem<NonNullable<T>>[] {\n const flattenedOption = items.flatMap((item) => {\n if (item.type === 'option') {\n return item.value !== undefined ? [item as SelectInputOptionItem<NonNullable<T>>] : [];\n }\n\n if (item.type === 'group') {\n return item.options.filter(\n (option): option is SelectInputOptionItem<NonNullable<T>> => option.value !== undefined,\n );\n }\n\n return [];\n });\n\n // eslint-disable-next-line functional/immutable-data\n return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));\n}\n\n/**\n * A prebuilt sort function for `sortFilteredOptions` that sorts options by relevance to the search query.\n * Prioritizes: exact matches > starts with > contains > alphabetical.\n *\n * @param getLabel - Function to extract the label string from the option value. Defaults to using `title` property.\n *\n * @example\n * ```tsx\n * <SelectInput\n * filterable\n * sortFilteredOptions={sortByRelevance((value) => value.name)}\n * // ...\n * />\n * ```\n */\nexport function sortByRelevance<T>(\n getLabel: (value: T) => string = (value) => (value as { title: string }).title,\n): (a: SelectInputOptionItem<T>, b: SelectInputOptionItem<T>, searchQuery: string) => number {\n return (a, b, searchQuery) => {\n const normalizedQuery = searchQuery.toLowerCase();\n const labelA = getLabel(a.value).toLowerCase();\n const labelB = getLabel(b.value).toLowerCase();\n\n // Prioritize exact matches\n const aExactMatch = labelA === normalizedQuery;\n const bExactMatch = labelB === normalizedQuery;\n if (aExactMatch && !bExactMatch) return -1;\n if (!aExactMatch && bExactMatch) return 1;\n\n // Then prioritize options where label starts with the search query\n const aStartsWith = labelA.startsWith(normalizedQuery);\n const bStartsWith = labelB.startsWith(normalizedQuery);\n if (aStartsWith && !bStartsWith) return -1;\n if (!aStartsWith && bStartsWith) return 1;\n\n // Then prioritize options where label contains the search query\n const aContains = labelA.includes(normalizedQuery);\n const bContains = labelB.includes(normalizedQuery);\n if (aContains && !bContains) return -1;\n if (!aContains && bContains) return 1;\n\n // Finally sort alphabetically\n return labelA.localeCompare(labelB);\n };\n}\n"],"names":["MAX_ITEMS_WITHOUT_VIRTUALIZATION","searchableString","value","trim","replace","normalize","toLowerCase","inferSearchableStrings","Object","values","filter","innerValue","map","dedupeSelectInputOptionItem","item","existingValues","compareValues","isDuplicate","Array","from","some","existingValue","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","selectInputOptionItemIncludesNeedle","needle","filterMatchers","haystack","includes","filterSelectInputItems","predicate","sortSelectInputItems","compareFn","searchQuery","flattenedOption","flatMap","sort","a","b","sortByRelevance","getLabel","title","normalizedQuery","labelA","labelB","aExactMatch","bExactMatch","aStartsWith","startsWith","bStartsWith","aContains","bContains","localeCompare"],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ const MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;
2
+ /**
3
+ * Converts a string to a normalized, searchable format by:
4
+ * - Trimming whitespace
5
+ * - Normalizing whitespace (convert multiple spaces to single space)
6
+ * - Converting to NFD normalization form to handle diacritics
7
+ * - Removing combining diacritical marks
8
+ * - Converting to lowercase
9
+ */
10
+ function searchableString(value) {
11
+ return value.trim().replace(/\s+/gu, ' ')
12
+ // NFD converts an Å to A + ̊ (and other special characters)
13
+ .normalize('NFD')
14
+ // and then this replaces the ̊ with nothing (and other special characters)
15
+ .replace(/[\u0300-\u036f]/g, '').toLowerCase();
16
+ }
17
+ /**
18
+ * Extracts searchable strings from a value.
19
+ * - If the value is a string, returns a normalized version.
20
+ * - If the value is an object, extracts all string values and normalizes them.
21
+ * - Otherwise returns an empty array.
22
+ */
23
+ function inferSearchableStrings(value) {
24
+ if (typeof value === 'string') {
25
+ return [searchableString(value)];
26
+ }
27
+ if (typeof value === 'object' && value != null) {
28
+ return Object.values(value).filter(innerValue => typeof innerValue === 'string').map(innerValue => searchableString(innerValue));
29
+ }
30
+ return [];
31
+ }
32
+ /**
33
+ * Sets the value of a duplicate option item to undefined, effectively hiding it when rendered.
34
+ */
35
+ function dedupeSelectInputOptionItem(item, existingValues, compareValues) {
36
+ const isDuplicate = compareValues ? Array.from(existingValues).some(existingValue => compareValues(item.value, existingValue)) : existingValues.has(item.value);
37
+ if (!isDuplicate) {
38
+ existingValues.add(item.value);
39
+ return item;
40
+ }
41
+ return {
42
+ ...item,
43
+ value: undefined
44
+ };
45
+ }
46
+ /**
47
+ * Sets the `value` of duplicate option items to `undefined`, hiding them when
48
+ * rendered. Indexes are kept intact within groups to preserve the active item
49
+ * between filter changes when possible.
50
+ */
51
+ function dedupeSelectInputItems(items, compareValues) {
52
+ const existingValues = new Set();
53
+ return items.map(item => {
54
+ switch (item.type) {
55
+ case 'option':
56
+ {
57
+ return dedupeSelectInputOptionItem(item, existingValues, compareValues);
58
+ }
59
+ case 'group':
60
+ {
61
+ return {
62
+ ...item,
63
+ options: item.options.map(option => dedupeSelectInputOptionItem(option, existingValues, compareValues))
64
+ };
65
+ }
66
+ }
67
+ return item;
68
+ });
69
+ }
70
+ /**
71
+ * Checks if a SelectInputOptionItem matches the search needle.
72
+ */
73
+ function selectInputOptionItemIncludesNeedle(item, needle) {
74
+ return inferSearchableStrings(item.filterMatchers ?? item.value).some(haystack => haystack.includes(needle));
75
+ }
76
+ /**
77
+ * Filters SelectInputItems based on the provided predicate function.
78
+ * For group items, it checks if any of their options match the predicate.
79
+ */
80
+ function filterSelectInputItems(items, predicate) {
81
+ return items.filter(item => {
82
+ switch (item.type) {
83
+ case 'option':
84
+ {
85
+ return predicate(item);
86
+ }
87
+ case 'group':
88
+ {
89
+ return item.options.some(option => predicate(option));
90
+ }
91
+ }
92
+ return false;
93
+ });
94
+ }
95
+ /**
96
+ * Flattens and sorts filtered options using the provided comparator.
97
+ * Extracts all options from groups, filters out undefined values (deduplicated items),
98
+ * sorts them, and returns as a flat list of option items.
99
+ */
100
+ function sortSelectInputItems(items, compareFn, searchQuery) {
101
+ const flattenedOption = items.flatMap(item => {
102
+ if (item.type === 'option') {
103
+ return item.value !== undefined ? [item] : [];
104
+ }
105
+ if (item.type === 'group') {
106
+ return item.options.filter(option => option.value !== undefined);
107
+ }
108
+ return [];
109
+ });
110
+ // eslint-disable-next-line functional/immutable-data
111
+ return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));
112
+ }
113
+ /**
114
+ * A prebuilt sort function for `sortFilteredOptions` that sorts options by relevance to the search query.
115
+ * Prioritizes: exact matches > starts with > contains > alphabetical.
116
+ *
117
+ * @param getLabel - Function to extract the label string from the option value. Defaults to using `title` property.
118
+ *
119
+ * @example
120
+ * ```tsx
121
+ * <SelectInput
122
+ * filterable
123
+ * sortFilteredOptions={sortByRelevance((value) => value.name)}
124
+ * // ...
125
+ * />
126
+ * ```
127
+ */
128
+ function sortByRelevance(getLabel = value => value.title) {
129
+ return (a, b, searchQuery) => {
130
+ const normalizedQuery = searchQuery.toLowerCase();
131
+ const labelA = getLabel(a.value).toLowerCase();
132
+ const labelB = getLabel(b.value).toLowerCase();
133
+ // Prioritize exact matches
134
+ const aExactMatch = labelA === normalizedQuery;
135
+ const bExactMatch = labelB === normalizedQuery;
136
+ if (aExactMatch && !bExactMatch) return -1;
137
+ if (!aExactMatch && bExactMatch) return 1;
138
+ // Then prioritize options where label starts with the search query
139
+ const aStartsWith = labelA.startsWith(normalizedQuery);
140
+ const bStartsWith = labelB.startsWith(normalizedQuery);
141
+ if (aStartsWith && !bStartsWith) return -1;
142
+ if (!aStartsWith && bStartsWith) return 1;
143
+ // Then prioritize options where label contains the search query
144
+ const aContains = labelA.includes(normalizedQuery);
145
+ const bContains = labelB.includes(normalizedQuery);
146
+ if (aContains && !bContains) return -1;
147
+ if (!aContains && bContains) return 1;
148
+ // Finally sort alphabetically
149
+ return labelA.localeCompare(labelB);
150
+ };
151
+ }
152
+
153
+ export { MAX_ITEMS_WITHOUT_VIRTUALIZATION, dedupeSelectInputItems, dedupeSelectInputOptionItem, filterSelectInputItems, inferSearchableStrings, searchableString, selectInputOptionItemIncludesNeedle, sortByRelevance, sortSelectInputItems };
154
+ //# sourceMappingURL=SelectInput.utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectInput.utils.mjs","sources":["../../../src/inputs/SelectInput/SelectInput.utils.ts"],"sourcesContent":["import { SelectInputItem, SelectInputOptionItem } from './SelectInput.types';\n\nexport const MAX_ITEMS_WITHOUT_VIRTUALIZATION = 50;\n\n/**\n * Converts a string to a normalized, searchable format by:\n * - Trimming whitespace\n * - Normalizing whitespace (convert multiple spaces to single space)\n * - Converting to NFD normalization form to handle diacritics\n * - Removing combining diacritical marks\n * - Converting to lowercase\n */\nexport function searchableString(value: string) {\n return (\n value\n .trim()\n .replace(/\\s+/gu, ' ')\n // NFD converts an Å to A + ̊ (and other special characters)\n .normalize('NFD')\n // and then this replaces the ̊ with nothing (and other special characters)\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n );\n}\n\n/**\n * Extracts searchable strings from a value.\n * - If the value is a string, returns a normalized version.\n * - If the value is an object, extracts all string values and normalizes them.\n * - Otherwise returns an empty array.\n */\nexport function inferSearchableStrings(value: unknown) {\n if (typeof value === 'string') {\n return [searchableString(value)];\n }\n\n if (typeof value === 'object' && value != null) {\n return Object.values(value)\n .filter((innerValue) => typeof innerValue === 'string')\n .map((innerValue) => searchableString(innerValue));\n }\n\n return [];\n}\n\n/**\n * Sets the value of a duplicate option item to undefined, effectively hiding it when rendered.\n */\nexport function dedupeSelectInputOptionItem<T>(\n item: SelectInputOptionItem<T>,\n existingValues: Set<T>,\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputOptionItem<T | undefined> {\n const isDuplicate = compareValues\n ? Array.from(existingValues).some((existingValue) => compareValues(item.value, existingValue))\n : existingValues.has(item.value);\n\n if (!isDuplicate) {\n existingValues.add(item.value);\n return item;\n }\n return { ...item, value: undefined };\n}\n\n/**\n * Sets the `value` of duplicate option items to `undefined`, hiding them when\n * rendered. Indexes are kept intact within groups to preserve the active item\n * between filter changes when possible.\n */\nexport function dedupeSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n compareValues?: (a: T, b: T) => boolean,\n): SelectInputItem<T | undefined>[] {\n const existingValues = new Set<T>();\n\n return items.map((item) => {\n switch (item.type) {\n case 'option': {\n return dedupeSelectInputOptionItem(item, existingValues, compareValues);\n }\n case 'group': {\n return {\n ...item,\n options: item.options.map((option) =>\n dedupeSelectInputOptionItem(option, existingValues, compareValues),\n ),\n };\n }\n default:\n }\n return item;\n });\n}\n\n/**\n * Checks if a SelectInputOptionItem matches the search needle.\n */\nexport function selectInputOptionItemIncludesNeedle<T>(\n item: SelectInputOptionItem<T>,\n needle: string,\n) {\n return inferSearchableStrings(item.filterMatchers ?? item.value).some((haystack) =>\n haystack.includes(needle),\n );\n}\n\n/**\n * Filters SelectInputItems based on the provided predicate function.\n * For group items, it checks if any of their options match the predicate.\n */\nexport function filterSelectInputItems<T>(\n items: readonly SelectInputItem<T>[],\n predicate: (item: SelectInputOptionItem<T>) => boolean,\n) {\n return items.filter((item) => {\n switch (item.type) {\n case 'option': {\n return predicate(item);\n }\n case 'group': {\n return item.options.some((option) => predicate(option));\n }\n default:\n }\n return false;\n });\n}\n\n/**\n * Flattens and sorts filtered options using the provided comparator.\n * Extracts all options from groups, filters out undefined values (deduplicated items),\n * sorts them, and returns as a flat list of option items.\n */\nexport function sortSelectInputItems<T>(\n items: readonly SelectInputItem<T | undefined>[],\n compareFn: (\n a: SelectInputOptionItem<NonNullable<T>>,\n b: SelectInputOptionItem<NonNullable<T>>,\n searchQuery: string,\n ) => number,\n searchQuery: string,\n): SelectInputItem<NonNullable<T>>[] {\n const flattenedOption = items.flatMap((item) => {\n if (item.type === 'option') {\n return item.value !== undefined ? [item as SelectInputOptionItem<NonNullable<T>>] : [];\n }\n\n if (item.type === 'group') {\n return item.options.filter(\n (option): option is SelectInputOptionItem<NonNullable<T>> => option.value !== undefined,\n );\n }\n\n return [];\n });\n\n // eslint-disable-next-line functional/immutable-data\n return flattenedOption.sort((a, b) => compareFn(a, b, searchQuery));\n}\n\n/**\n * A prebuilt sort function for `sortFilteredOptions` that sorts options by relevance to the search query.\n * Prioritizes: exact matches > starts with > contains > alphabetical.\n *\n * @param getLabel - Function to extract the label string from the option value. Defaults to using `title` property.\n *\n * @example\n * ```tsx\n * <SelectInput\n * filterable\n * sortFilteredOptions={sortByRelevance((value) => value.name)}\n * // ...\n * />\n * ```\n */\nexport function sortByRelevance<T>(\n getLabel: (value: T) => string = (value) => (value as { title: string }).title,\n): (a: SelectInputOptionItem<T>, b: SelectInputOptionItem<T>, searchQuery: string) => number {\n return (a, b, searchQuery) => {\n const normalizedQuery = searchQuery.toLowerCase();\n const labelA = getLabel(a.value).toLowerCase();\n const labelB = getLabel(b.value).toLowerCase();\n\n // Prioritize exact matches\n const aExactMatch = labelA === normalizedQuery;\n const bExactMatch = labelB === normalizedQuery;\n if (aExactMatch && !bExactMatch) return -1;\n if (!aExactMatch && bExactMatch) return 1;\n\n // Then prioritize options where label starts with the search query\n const aStartsWith = labelA.startsWith(normalizedQuery);\n const bStartsWith = labelB.startsWith(normalizedQuery);\n if (aStartsWith && !bStartsWith) return -1;\n if (!aStartsWith && bStartsWith) return 1;\n\n // Then prioritize options where label contains the search query\n const aContains = labelA.includes(normalizedQuery);\n const bContains = labelB.includes(normalizedQuery);\n if (aContains && !bContains) return -1;\n if (!aContains && bContains) return 1;\n\n // Finally sort alphabetically\n return labelA.localeCompare(labelB);\n };\n}\n"],"names":["MAX_ITEMS_WITHOUT_VIRTUALIZATION","searchableString","value","trim","replace","normalize","toLowerCase","inferSearchableStrings","Object","values","filter","innerValue","map","dedupeSelectInputOptionItem","item","existingValues","compareValues","isDuplicate","Array","from","some","existingValue","has","add","undefined","dedupeSelectInputItems","items","Set","type","options","option","selectInputOptionItemIncludesNeedle","needle","filterMatchers","haystack","includes","filterSelectInputItems","predicate","sortSelectInputItems","compareFn","searchQuery","flattenedOption","flatMap","sort","a","b","sortByRelevance","getLabel","title","normalizedQuery","labelA","labelB","aExactMatch","bExactMatch","aStartsWith","startsWith","bStartsWith","aContains","bContains","localeCompare"],"mappings":"AAEO,MAAMA,gCAAgC,GAAG;AAEhD;;;;;;;AAOG;AACG,SAAUC,gBAAgBA,CAACC,KAAa,EAAA;EAC5C,OACEA,KAAK,CACFC,IAAI,EAAE,CACNC,OAAO,CAAC,OAAO,EAAE,GAAG;AACrB;GACCC,SAAS,CAAC,KAAK;AAChB;GACCD,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAC/BE,WAAW,EAAE;AAEpB;AAEA;;;;;AAKG;AACG,SAAUC,sBAAsBA,CAACL,KAAc,EAAA;AACnD,EAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;AAC7B,IAAA,OAAO,CAACD,gBAAgB,CAACC,KAAK,CAAC,CAAC;AAClC,EAAA;EAEA,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,IAAI,IAAI,EAAE;IAC9C,OAAOM,MAAM,CAACC,MAAM,CAACP,KAAK,CAAC,CACxBQ,MAAM,CAAEC,UAAU,IAAK,OAAOA,UAAU,KAAK,QAAQ,CAAC,CACtDC,GAAG,CAAED,UAAU,IAAKV,gBAAgB,CAACU,UAAU,CAAC,CAAC;AACtD,EAAA;AAEA,EAAA,OAAO,EAAE;AACX;AAEA;;AAEG;SACaE,2BAA2BA,CACzCC,IAA8B,EAC9BC,cAAsB,EACtBC,aAAuC,EAAA;AAEvC,EAAA,MAAMC,WAAW,GAAGD,aAAa,GAC7BE,KAAK,CAACC,IAAI,CAACJ,cAAc,CAAC,CAACK,IAAI,CAAEC,aAAa,IAAKL,aAAa,CAACF,IAAI,CAACZ,KAAK,EAAEmB,aAAa,CAAC,CAAC,GAC5FN,cAAc,CAACO,GAAG,CAACR,IAAI,CAACZ,KAAK,CAAC;EAElC,IAAI,CAACe,WAAW,EAAE;AAChBF,IAAAA,cAAc,CAACQ,GAAG,CAACT,IAAI,CAACZ,KAAK,CAAC;AAC9B,IAAA,OAAOY,IAAI;AACb,EAAA;EACA,OAAO;AAAE,IAAA,GAAGA,IAAI;AAAEZ,IAAAA,KAAK,EAAEsB;GAAW;AACtC;AAEA;;;;AAIG;AACG,SAAUC,sBAAsBA,CACpCC,KAAoC,EACpCV,aAAuC,EAAA;AAEvC,EAAA,MAAMD,cAAc,GAAG,IAAIY,GAAG,EAAK;AAEnC,EAAA,OAAOD,KAAK,CAACd,GAAG,CAAEE,IAAI,IAAI;IACxB,QAAQA,IAAI,CAACc,IAAI;AACf,MAAA,KAAK,QAAQ;AAAE,QAAA;AACb,UAAA,OAAOf,2BAA2B,CAACC,IAAI,EAAEC,cAAc,EAAEC,aAAa,CAAC;AACzE,QAAA;AACA,MAAA,KAAK,OAAO;AAAE,QAAA;UACZ,OAAO;AACL,YAAA,GAAGF,IAAI;AACPe,YAAAA,OAAO,EAAEf,IAAI,CAACe,OAAO,CAACjB,GAAG,CAAEkB,MAAM,IAC/BjB,2BAA2B,CAACiB,MAAM,EAAEf,cAAc,EAAEC,aAAa,CAAC;WAErE;AACH,QAAA;AAEF;AACA,IAAA,OAAOF,IAAI;AACb,EAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACG,SAAUiB,mCAAmCA,CACjDjB,IAA8B,EAC9BkB,MAAc,EAAA;EAEd,OAAOzB,sBAAsB,CAACO,IAAI,CAACmB,cAAc,IAAInB,IAAI,CAACZ,KAAK,CAAC,CAACkB,IAAI,CAAEc,QAAQ,IAC7EA,QAAQ,CAACC,QAAQ,CAACH,MAAM,CAAC,CAC1B;AACH;AAEA;;;AAGG;AACG,SAAUI,sBAAsBA,CACpCV,KAAoC,EACpCW,SAAsD,EAAA;AAEtD,EAAA,OAAOX,KAAK,CAAChB,MAAM,CAAEI,IAAI,IAAI;IAC3B,QAAQA,IAAI,CAACc,IAAI;AACf,MAAA,KAAK,QAAQ;AAAE,QAAA;UACb,OAAOS,SAAS,CAACvB,IAAI,CAAC;AACxB,QAAA;AACA,MAAA,KAAK,OAAO;AAAE,QAAA;AACZ,UAAA,OAAOA,IAAI,CAACe,OAAO,CAACT,IAAI,CAAEU,MAAM,IAAKO,SAAS,CAACP,MAAM,CAAC,CAAC;AACzD,QAAA;AAEF;AACA,IAAA,OAAO,KAAK;AACd,EAAA,CAAC,CAAC;AACJ;AAEA;;;;AAIG;SACaQ,oBAAoBA,CAClCZ,KAAgD,EAChDa,SAIW,EACXC,WAAmB,EAAA;AAEnB,EAAA,MAAMC,eAAe,GAAGf,KAAK,CAACgB,OAAO,CAAE5B,IAAI,IAAI;AAC7C,IAAA,IAAIA,IAAI,CAACc,IAAI,KAAK,QAAQ,EAAE;MAC1B,OAAOd,IAAI,CAACZ,KAAK,KAAKsB,SAAS,GAAG,CAACV,IAA6C,CAAC,GAAG,EAAE;AACxF,IAAA;AAEA,IAAA,IAAIA,IAAI,CAACc,IAAI,KAAK,OAAO,EAAE;AACzB,MAAA,OAAOd,IAAI,CAACe,OAAO,CAACnB,MAAM,CACvBoB,MAAM,IAAsDA,MAAM,CAAC5B,KAAK,KAAKsB,SAAS,CACxF;AACH,IAAA;AAEA,IAAA,OAAO,EAAE;AACX,EAAA,CAAC,CAAC;AAEF;AACA,EAAA,OAAOiB,eAAe,CAACE,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKN,SAAS,CAACK,CAAC,EAAEC,CAAC,EAAEL,WAAW,CAAC,CAAC;AACrE;AAEA;;;;;;;;;;;;;;AAcG;AACG,SAAUM,eAAeA,CAC7BC,QAAA,GAAkC7C,KAAK,IAAMA,KAA2B,CAAC8C,KAAK,EAAA;AAE9E,EAAA,OAAO,CAACJ,CAAC,EAAEC,CAAC,EAAEL,WAAW,KAAI;AAC3B,IAAA,MAAMS,eAAe,GAAGT,WAAW,CAAClC,WAAW,EAAE;IACjD,MAAM4C,MAAM,GAAGH,QAAQ,CAACH,CAAC,CAAC1C,KAAK,CAAC,CAACI,WAAW,EAAE;IAC9C,MAAM6C,MAAM,GAAGJ,QAAQ,CAACF,CAAC,CAAC3C,KAAK,CAAC,CAACI,WAAW,EAAE;AAE9C;AACA,IAAA,MAAM8C,WAAW,GAAGF,MAAM,KAAKD,eAAe;AAC9C,IAAA,MAAMI,WAAW,GAAGF,MAAM,KAAKF,eAAe;AAC9C,IAAA,IAAIG,WAAW,IAAI,CAACC,WAAW,EAAE,OAAO,EAAE;AAC1C,IAAA,IAAI,CAACD,WAAW,IAAIC,WAAW,EAAE,OAAO,CAAC;AAEzC;AACA,IAAA,MAAMC,WAAW,GAAGJ,MAAM,CAACK,UAAU,CAACN,eAAe,CAAC;AACtD,IAAA,MAAMO,WAAW,GAAGL,MAAM,CAACI,UAAU,CAACN,eAAe,CAAC;AACtD,IAAA,IAAIK,WAAW,IAAI,CAACE,WAAW,EAAE,OAAO,EAAE;AAC1C,IAAA,IAAI,CAACF,WAAW,IAAIE,WAAW,EAAE,OAAO,CAAC;AAEzC;AACA,IAAA,MAAMC,SAAS,GAAGP,MAAM,CAACf,QAAQ,CAACc,eAAe,CAAC;AAClD,IAAA,MAAMS,SAAS,GAAGP,MAAM,CAAChB,QAAQ,CAACc,eAAe,CAAC;AAClD,IAAA,IAAIQ,SAAS,IAAI,CAACC,SAAS,EAAE,OAAO,EAAE;AACtC,IAAA,IAAI,CAACD,SAAS,IAAIC,SAAS,EAAE,OAAO,CAAC;AAErC;AACA,IAAA,OAAOR,MAAM,CAACS,aAAa,CAACR,MAAM,CAAC;EACrC,CAAC;AACH;;;;"}