@payfit/unity-components 2.0.0 → 2.2.0

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 (374) hide show
  1. package/dist/esm/components/alert/Alert.js +41 -29
  2. package/dist/esm/components/alert/parts/AlertTitle.js +8 -8
  3. package/dist/esm/components/app-layout/AppLayout.d.ts +2 -0
  4. package/dist/esm/components/app-menu/parts/AppMenuFooter.js +23 -23
  5. package/dist/esm/components/app-menu/parts/AppMenuHeader.d.ts +1 -1
  6. package/dist/esm/components/app-menu/parts/AppMenuHeader.js +9 -9
  7. package/dist/esm/components/autocomplete/Autocomplete.d.ts +0 -9
  8. package/dist/esm/components/autocomplete/Autocomplete.js +54 -57
  9. package/dist/esm/components/autocomplete/parts/AutocompleteItem.js +8 -8
  10. package/dist/esm/components/avatar/Avatar.context.d.ts +2 -1
  11. package/dist/esm/components/avatar/Avatar.context.js +13 -11
  12. package/dist/esm/components/avatar/Avatar.d.ts +126 -0
  13. package/dist/esm/components/avatar/Avatar.js +34 -20
  14. package/dist/esm/components/avatar/Avatar.variants.d.ts +39 -0
  15. package/dist/esm/components/avatar/Avatar.variants.js +23 -5
  16. package/dist/esm/components/avatar/parts/AvatarFallback.d.ts +52 -0
  17. package/dist/esm/components/avatar/parts/AvatarFallback.js +26 -27
  18. package/dist/esm/components/avatar/parts/AvatarIcon.d.ts +31 -0
  19. package/dist/esm/components/avatar/parts/AvatarIcon.js +40 -0
  20. package/dist/esm/components/badge/Badge.js +1 -1
  21. package/dist/esm/components/breadcrumbs/Breadcrumbs.variant.js +1 -1
  22. package/dist/esm/components/button/Button.js +12 -11
  23. package/dist/esm/components/button/Button.variants.d.ts +1 -0
  24. package/dist/esm/components/button/Button.variants.js +22 -15
  25. package/dist/esm/components/card/Card.context.d.ts +5 -0
  26. package/dist/esm/components/card/Card.context.js +14 -0
  27. package/dist/esm/components/card/Card.d.ts +210 -0
  28. package/dist/esm/components/card/Card.js +93 -0
  29. package/dist/esm/components/card/parts/CardContent.d.ts +37 -0
  30. package/dist/esm/components/card/parts/CardContent.js +8 -0
  31. package/dist/esm/components/card/parts/CardTitle.d.ts +55 -0
  32. package/dist/esm/components/card/parts/CardTitle.js +33 -0
  33. package/dist/esm/components/checkbox/Checkbox.js +38 -30
  34. package/dist/esm/components/checkbox/Checkbox.variants.d.ts +9 -9
  35. package/dist/esm/components/checkbox/Checkbox.variants.js +23 -7
  36. package/dist/esm/components/checkbox/TanstackCheckbox.d.ts +28 -0
  37. package/dist/esm/components/checkbox/TanstackCheckbox.js +51 -0
  38. package/dist/esm/components/checkbox/parts/CheckboxIndicator.js +7 -7
  39. package/dist/esm/components/checkbox-field/CheckboxField.d.ts +2 -0
  40. package/dist/esm/components/checkbox-field/TanstackCheckboxField.d.ts +14 -0
  41. package/dist/esm/components/checkbox-field/TanstackCheckboxField.js +40 -0
  42. package/dist/esm/components/checkbox-group/TanstackCheckboxGroup.d.ts +4 -0
  43. package/dist/esm/components/checkbox-group/TanstackCheckboxGroup.js +37 -0
  44. package/dist/esm/components/checkbox-group-field/CheckboxGroupField.d.ts +2 -0
  45. package/dist/esm/components/checkbox-group-field/TanstackCheckGroupField.d.ts +72 -0
  46. package/dist/esm/components/checkbox-group-field/TanstackCheckGroupField.js +40 -0
  47. package/dist/esm/components/client-side-pagination/parts/PaginationNavButton.js +1 -1
  48. package/dist/esm/components/client-side-pagination/parts/RawPaginationLink.js +10 -10
  49. package/dist/esm/components/collapsible/parts/CollapsibleContent.js +5 -5
  50. package/dist/esm/components/collapsible/parts/CollapsibleTitle.js +8 -8
  51. package/dist/esm/components/data-table/DataTable.d.ts +109 -16
  52. package/dist/esm/components/data-table/DataTable.js +107 -93
  53. package/dist/esm/components/data-table/mocks/employee-data.d.ts +1 -0
  54. package/dist/esm/components/date-calendar/DateCalendar.js +1 -1
  55. package/dist/esm/components/date-calendar/parts/DateSegmentSelect.js +1 -1
  56. package/dist/esm/components/date-picker/DatePicker.d.ts +1 -1
  57. package/dist/esm/components/date-picker/DatePicker.js +59 -50
  58. package/dist/esm/components/date-picker/TanstackDatePicker.d.ts +22 -0
  59. package/dist/esm/components/date-picker/TanstackDatePicker.js +53 -0
  60. package/dist/esm/components/date-picker/parts/DateInput.js +4 -4
  61. package/dist/esm/components/date-picker-field/DatePickerField.d.ts +2 -0
  62. package/dist/esm/components/date-picker-field/TanstackDatePickerField.d.ts +71 -0
  63. package/dist/esm/components/date-picker-field/TanstackDatePickerField.js +41 -0
  64. package/dist/esm/components/definition-list/DefinitionList.context.d.ts +19 -0
  65. package/dist/esm/components/definition-list/DefinitionList.d.ts +24 -0
  66. package/dist/esm/components/definition-list/parts/DefinitionItem.d.ts +25 -0
  67. package/dist/esm/components/dialog/Dialog.d.ts +34 -22
  68. package/dist/esm/components/dialog/Dialog.js +90 -52
  69. package/dist/esm/components/dialog/parts/DialogActions.js +6 -6
  70. package/dist/esm/components/dialog/parts/DialogTitle.js +7 -4
  71. package/dist/esm/components/dialog/test-utils.d.ts +28 -0
  72. package/dist/esm/components/dialog/test-utils.js +78 -0
  73. package/dist/esm/components/error-state/ErrorState.js +7 -7
  74. package/dist/esm/components/filter/Filter.controls.d.ts +192 -0
  75. package/dist/esm/components/filter/Filter.controls.js +45 -0
  76. package/dist/esm/components/filter/Filter.d.ts +189 -0
  77. package/dist/esm/components/filter/Filter.js +147 -0
  78. package/dist/esm/components/filter/Filter.types.d.ts +121 -0
  79. package/dist/esm/components/filter/hooks/useFilterIds.d.ts +49 -0
  80. package/dist/esm/components/filter/hooks/useFilterIds.js +13 -0
  81. package/dist/esm/components/filter/hooks/useFilterState.d.ts +74 -0
  82. package/dist/esm/components/filter/hooks/useFilterState.js +23 -0
  83. package/dist/esm/components/filter/hooks/useFilterValue.d.ts +61 -0
  84. package/dist/esm/components/filter/hooks/useFilterValue.js +31 -0
  85. package/dist/esm/components/filter/parts/FilterButton.d.ts +75 -0
  86. package/dist/esm/components/filter/parts/FilterButton.js +55 -0
  87. package/dist/esm/components/filter/parts/FilterLabel.d.ts +96 -0
  88. package/dist/esm/components/filter/parts/FilterLabel.js +57 -0
  89. package/dist/esm/components/filter/parts/FilterPopover.d.ts +95 -0
  90. package/dist/esm/components/filter/parts/FilterPopover.js +79 -0
  91. package/dist/esm/components/filter/utils/value-formatters.d.ts +62 -0
  92. package/dist/esm/components/filter/utils/value-formatters.js +14 -0
  93. package/dist/esm/components/filter-toolbar/FilterToolbar.d.ts +110 -0
  94. package/dist/esm/components/filter-toolbar/FilterToolbar.js +172 -0
  95. package/dist/esm/components/filter-toolbar/FilterToolbar.types.d.ts +119 -0
  96. package/dist/esm/components/filter-toolbar/hooks/use-filter-toolbar-state.d.ts +96 -0
  97. package/dist/esm/components/filter-toolbar/hooks/use-filter-toolbar-state.js +132 -0
  98. package/dist/esm/components/filter-toolbar/parts/AddFilter.d.ts +63 -0
  99. package/dist/esm/components/filter-toolbar/parts/AddFilter.js +107 -0
  100. package/dist/esm/components/filter-toolbar/parts/AddFilterItem.d.ts +18 -0
  101. package/dist/esm/components/filter-toolbar/parts/AddFilterItem.js +18 -0
  102. package/dist/esm/components/filter-toolbar/utils/filter-adapters.d.ts +93 -0
  103. package/dist/esm/components/filter-toolbar/utils/filter-adapters.js +88 -0
  104. package/dist/esm/components/filter-toolbar/utils/normalize-filter-value.d.ts +24 -0
  105. package/dist/esm/components/filter-toolbar/utils/normalize-filter-value.js +19 -0
  106. package/dist/esm/components/form/Form.d.ts +2 -0
  107. package/dist/esm/components/form/TanstackForm.d.ts +24 -0
  108. package/dist/esm/components/form/TanstackForm.js +29 -0
  109. package/dist/esm/components/form-field/FormField.d.ts +2 -0
  110. package/dist/esm/components/form-field/TanstackFormField.context.d.ts +10 -0
  111. package/dist/esm/components/form-field/TanstackFormField.context.js +14 -0
  112. package/dist/esm/components/form-field/TanstackFormField.d.ts +49 -0
  113. package/dist/esm/components/form-field/TanstackFormField.js +46 -0
  114. package/dist/esm/components/form-field/parts/FormControl.d.ts +2 -0
  115. package/dist/esm/components/form-field/parts/FormFeedbackText.d.ts +2 -0
  116. package/dist/esm/components/form-field/parts/FormHelperText.d.ts +2 -0
  117. package/dist/esm/components/form-field/parts/FormLabel.d.ts +2 -0
  118. package/dist/esm/components/form-field/parts/RawFormContextualLink.d.ts +2 -0
  119. package/dist/esm/components/form-field/parts/TanstackFormFeedbackText.d.ts +12 -0
  120. package/dist/esm/components/form-field/parts/TanstackFormFeedbackText.js +32 -0
  121. package/dist/esm/components/form-field/parts/TanstackFormHelperText.d.ts +11 -0
  122. package/dist/esm/components/form-field/parts/TanstackFormHelperText.js +25 -0
  123. package/dist/esm/components/form-field/parts/TanstackFormLabel.d.ts +8 -0
  124. package/dist/esm/components/form-field/parts/TanstackFormLabel.js +26 -0
  125. package/dist/esm/components/form-field/parts/TanstackRawFormContextualLink.d.ts +26 -0
  126. package/dist/esm/components/form-field/parts/TanstackRawFormContextualLink.js +45 -0
  127. package/dist/esm/components/icon-button/CircularIconButton.d.ts +9 -9
  128. package/dist/esm/components/icon-button/CircularIconButton.js +53 -36
  129. package/dist/esm/components/icon-button/IconButton.variants.d.ts +1 -0
  130. package/dist/esm/components/icon-button/IconButton.variants.js +44 -28
  131. package/dist/esm/components/inline-field-group/InlineFieldGroup.context.d.ts +23 -0
  132. package/dist/esm/components/inline-field-group/InlineFieldGroup.context.js +6 -0
  133. package/dist/esm/components/inline-field-group/InlineFieldGroup.d.ts +119 -0
  134. package/dist/esm/components/inline-field-group/InlineFieldGroup.js +185 -0
  135. package/dist/esm/components/inline-field-group/hooks/useInlineFieldGroupMode.d.ts +46 -0
  136. package/dist/esm/components/inline-field-group/hooks/useInlineFieldGroupMode.js +27 -0
  137. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupEditView.d.ts +64 -0
  138. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupEditView.js +56 -0
  139. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupHeader.d.ts +95 -0
  140. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupHeader.js +106 -0
  141. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupReadView.d.ts +56 -0
  142. package/dist/esm/components/inline-field-group/parts/InlineFieldGroupReadView.js +28 -0
  143. package/dist/esm/components/input/Input.js +36 -35
  144. package/dist/esm/components/input/TanstackInput.d.ts +22 -0
  145. package/dist/esm/components/input/TanstackInput.js +38 -0
  146. package/dist/esm/components/label/Label.js +12 -12
  147. package/dist/esm/components/link/RawLink.js +38 -31
  148. package/dist/esm/components/list-view/ListView.d.ts +56 -0
  149. package/dist/esm/components/list-view/ListView.fixtures.d.ts +20 -0
  150. package/dist/esm/components/list-view/ListView.js +44 -0
  151. package/dist/esm/components/list-view/parts/ListViewItemLabel.d.ts +34 -0
  152. package/dist/esm/components/list-view/parts/ListViewItemLabel.js +22 -0
  153. package/dist/esm/components/list-view/parts/ListViewItemText.d.ts +33 -0
  154. package/dist/esm/components/list-view/parts/ListViewItemText.js +22 -0
  155. package/dist/esm/components/list-view/parts/ListViewSection.d.ts +14 -0
  156. package/dist/esm/components/list-view/parts/ListViewSection.js +21 -0
  157. package/dist/esm/components/list-view/parts/RawListViewItem.d.ts +102 -0
  158. package/dist/esm/components/list-view/parts/RawListViewItem.js +80 -0
  159. package/dist/esm/components/multi-select/MultiSelect.d.ts +5 -7
  160. package/dist/esm/components/multi-select/MultiSelect.js +199 -176
  161. package/dist/esm/components/multi-select/MultiselectTypes.d.ts +114 -0
  162. package/dist/esm/components/multi-select/TanstackMultiSelect.d.ts +7 -0
  163. package/dist/esm/components/multi-select/TanstackMultiSelect.js +41 -0
  164. package/dist/esm/components/multi-select/parts/MultiSelectButton.d.ts +2 -0
  165. package/dist/esm/components/multi-select/parts/MultiSelectButton.js +62 -46
  166. package/dist/esm/components/multi-select/parts/MultiSelectPopover.js +15 -15
  167. package/dist/esm/components/multi-select-field/MultiSelectField.d.ts +45 -12
  168. package/dist/esm/components/multi-select-field/MultiSelectField.js +56 -66
  169. package/dist/esm/components/multi-select-field/TanstackMultiSelectField.d.ts +92 -0
  170. package/dist/esm/components/multi-select-field/TanstackMultiSelectField.js +48 -0
  171. package/dist/esm/components/multi-select-field/test-utils.d.ts +17 -0
  172. package/dist/esm/components/multi-select-field/test-utils.js +45 -0
  173. package/dist/esm/components/nav/parts/RawNavItem.js +6 -6
  174. package/dist/esm/components/navigation-card/NavigationCard.context.d.ts +31 -0
  175. package/dist/esm/components/navigation-card/NavigationCard.context.js +13 -0
  176. package/dist/esm/components/navigation-card/NavigationCard.d.ts +46 -0
  177. package/dist/esm/components/navigation-card/NavigationCard.js +62 -0
  178. package/dist/esm/components/navigation-card/NavigationCard.types.d.ts +37 -0
  179. package/dist/esm/components/navigation-card/NavigationCard.variants.d.ts +1147 -0
  180. package/dist/esm/components/navigation-card/NavigationCard.variants.js +164 -0
  181. package/dist/esm/components/navigation-card/parts/NavigationCardDescription.d.ts +39 -0
  182. package/dist/esm/components/navigation-card/parts/NavigationCardDescription.js +22 -0
  183. package/dist/esm/components/navigation-card/parts/NavigationCardGroup.d.ts +146 -0
  184. package/dist/esm/components/navigation-card/parts/NavigationCardGroup.js +93 -0
  185. package/dist/esm/components/navigation-card/parts/NavigationCardLabel.d.ts +32 -0
  186. package/dist/esm/components/navigation-card/parts/NavigationCardLabel.js +24 -0
  187. package/dist/esm/components/number-field/NumberField.d.ts +2 -0
  188. package/dist/esm/components/number-field/TanstackNumberField.d.ts +74 -0
  189. package/dist/esm/components/number-field/TanstackNumberField.js +44 -0
  190. package/dist/esm/components/number-input/NumberInput.js +31 -29
  191. package/dist/esm/components/number-input/TanstackNumberInput.d.ts +58 -0
  192. package/dist/esm/components/number-input/TanstackNumberInput.js +38 -0
  193. package/dist/esm/components/page/Page.js +12 -11
  194. package/dist/esm/components/pagination/parts/RawPaginationLink.js +22 -22
  195. package/dist/esm/components/pagination/parts/RawPaginationNext.js +13 -13
  196. package/dist/esm/components/pagination/parts/RawPaginationPrevious.js +10 -10
  197. package/dist/esm/components/payfit-brand/PayFitBrand.d.ts +4 -0
  198. package/dist/esm/components/payfit-brand/PayFitBrand.js +30 -22
  199. package/dist/esm/components/payfit-brand/PayFitPreprod.js +25 -25
  200. package/dist/esm/components/phone-number/PhoneNumberInput.d.ts +67 -0
  201. package/dist/esm/components/phone-number/PhoneNumberInput.js +322 -0
  202. package/dist/esm/components/phone-number/TanstackPhoneNumberInput.d.ts +64 -0
  203. package/dist/esm/components/phone-number/TanstackPhoneNumberInput.js +33 -0
  204. package/dist/esm/components/phone-number/parts/PhoneNumberItem.d.ts +42 -0
  205. package/dist/esm/components/phone-number/parts/PhoneNumberItem.js +68 -0
  206. package/dist/esm/components/phone-number/unknownFlag.svg.js +4 -0
  207. package/dist/esm/components/phone-number-field/TanstackPhoneNumberField.d.ts +15 -0
  208. package/dist/esm/components/phone-number-field/TanstackPhoneNumberField.js +32 -0
  209. package/dist/esm/components/pill/Pill.d.ts +2 -2
  210. package/dist/esm/components/pill/Pill.js +8 -8
  211. package/dist/esm/components/popover/Popover.js +6 -6
  212. package/dist/esm/components/promo-dialog/PromoDialog.d.ts +149 -0
  213. package/dist/esm/components/promo-dialog/PromoDialog.js +219 -0
  214. package/dist/esm/components/promo-dialog/parts/PromoDialogActions.d.ts +44 -0
  215. package/dist/esm/components/promo-dialog/parts/PromoDialogActions.js +29 -0
  216. package/dist/esm/components/promo-dialog/parts/PromoDialogContent.d.ts +43 -0
  217. package/dist/esm/components/promo-dialog/parts/PromoDialogContent.js +20 -0
  218. package/dist/esm/components/promo-dialog/parts/PromoDialogHero.d.ts +47 -0
  219. package/dist/esm/components/promo-dialog/parts/PromoDialogHero.js +25 -0
  220. package/dist/esm/components/promo-dialog/parts/PromoDialogSubtitle.d.ts +53 -0
  221. package/dist/esm/components/promo-dialog/parts/PromoDialogSubtitle.js +21 -0
  222. package/dist/esm/components/promo-dialog/parts/PromoDialogTitle.d.ts +6 -0
  223. package/dist/esm/components/promo-dialog/parts/PromoDialogTitle.js +18 -0
  224. package/dist/esm/components/radio-button-group/TanstackRadioButtonGroup.d.ts +13 -0
  225. package/dist/esm/components/radio-button-group/TanstackRadioButtonGroup.js +43 -0
  226. package/dist/esm/components/radio-button-group/parts/RadioButton.d.ts +29 -11
  227. package/dist/esm/components/radio-button-group/parts/RadioButton.js +53 -51
  228. package/dist/esm/components/radio-button-group-field/RadioButtonGroupField.d.ts +2 -0
  229. package/dist/esm/components/radio-button-group-field/TanstackRadioButtonGroupField.d.ts +13 -0
  230. package/dist/esm/components/radio-button-group-field/TanstackRadioButtonGroupField.js +38 -0
  231. package/dist/esm/components/search/Search.js +46 -46
  232. package/dist/esm/components/segmented-button-group/parts/ToggleButton.js +5 -5
  233. package/dist/esm/components/select/Select.d.ts +5 -4
  234. package/dist/esm/components/select/Select.js +53 -45
  235. package/dist/esm/components/select/TanstackSelect.d.ts +80 -0
  236. package/dist/esm/components/select/TanstackSelect.js +34 -0
  237. package/dist/esm/components/select/parts/SearchInput.d.ts +4 -1
  238. package/dist/esm/components/select/parts/SearchInput.js +49 -31
  239. package/dist/esm/components/select/parts/SelectButton.js +19 -17
  240. package/dist/esm/components/select-field/SelectField.d.ts +2 -0
  241. package/dist/esm/components/select-field/SelectField.js +8 -9
  242. package/dist/esm/components/select-field/TanstackSelectField.d.ts +124 -0
  243. package/dist/esm/components/select-field/TanstackSelectField.js +44 -0
  244. package/dist/esm/components/select-list/SelectList.d.ts +95 -0
  245. package/dist/esm/components/select-list/SelectList.js +79 -0
  246. package/dist/esm/components/select-list/SelectList.types.d.ts +29 -0
  247. package/dist/esm/components/select-list/constants.d.ts +36 -0
  248. package/dist/esm/components/select-list/constants.js +29 -0
  249. package/dist/esm/components/select-list/helpers.d.ts +42 -0
  250. package/dist/esm/components/select-list/helpers.js +48 -0
  251. package/dist/esm/components/select-list/hooks/useControlledSelection.d.ts +23 -0
  252. package/dist/esm/components/select-list/hooks/useControlledSelection.js +16 -0
  253. package/dist/esm/components/select-list/hooks/useSelectedFirstSorting.d.ts +23 -0
  254. package/dist/esm/components/select-list/hooks/useSelectedFirstSorting.js +31 -0
  255. package/dist/esm/components/select-list/parts/SelectListEmptyState.d.ts +8 -0
  256. package/dist/esm/components/select-list/parts/SelectListEmptyState.js +25 -0
  257. package/dist/esm/components/select-list/parts/SelectListOptGroup.d.ts +118 -0
  258. package/dist/esm/components/select-list/parts/SelectListOptGroup.js +28 -0
  259. package/dist/esm/components/select-list/parts/SelectListOption.d.ts +24 -0
  260. package/dist/esm/components/select-list/parts/SelectListOption.js +72 -0
  261. package/dist/esm/components/select-list/parts/SelectListSearchInput.d.ts +2 -0
  262. package/dist/esm/components/select-list/parts/SelectListSearchInput.js +43 -0
  263. package/dist/esm/components/select-list/parts/SelectedItemsSection.d.ts +54 -0
  264. package/dist/esm/components/select-list/parts/SelectedItemsSection.js +35 -0
  265. package/dist/esm/components/select-list/utils/partition.d.ts +13 -0
  266. package/dist/esm/components/select-list/utils/partition.js +9 -0
  267. package/dist/esm/components/selectable-button-group/SelectableButtonGroup.context.d.ts +1 -5
  268. package/dist/esm/components/selectable-button-group/SelectableButtonGroup.d.ts +6 -1
  269. package/dist/esm/components/selectable-button-group/SelectableButtonGroup.js +23 -23
  270. package/dist/esm/components/selectable-button-group/TanstackSelectableButtonGroup.d.ts +27 -0
  271. package/dist/esm/components/selectable-button-group/TanstackSelectableButtonGroup.js +34 -0
  272. package/dist/esm/components/selectable-button-group/parts/SelectableButton.d.ts +1 -16
  273. package/dist/esm/components/selectable-button-group/parts/SelectableButton.js +56 -57
  274. package/dist/esm/components/selectable-button-group-field/SelectableButtonGroupField.d.ts +2 -0
  275. package/dist/esm/components/selectable-button-group-field/TanstackSelectableButtonGroupField.d.ts +81 -0
  276. package/dist/esm/components/selectable-button-group-field/TanstackSelectableButtonGroupField.js +47 -0
  277. package/dist/esm/components/selectable-card/internals/Description.js +1 -1
  278. package/dist/esm/components/selectable-card/selectable-card-checkbox-group/SelectableCardCheckboxGroup.js +1 -1
  279. package/dist/esm/components/selectable-card/selectable-card-checkbox-group/TanstackSelectableCardCheckboxGroup.d.ts +26 -0
  280. package/dist/esm/components/selectable-card/selectable-card-checkbox-group/TanstackSelectableCardCheckboxGroup.js +32 -0
  281. package/dist/esm/components/selectable-card/selectable-card-checkbox-group/parts/SelectableCardCheckbox.js +24 -24
  282. package/dist/esm/components/selectable-card/selectable-card-radio-group/SelectableCardRadioGroup.d.ts +2 -0
  283. package/dist/esm/components/selectable-card/selectable-card-radio-group/SelectableCardRadioGroup.js +12 -14
  284. package/dist/esm/components/selectable-card/selectable-card-radio-group/TanstackSelectableCardRadioGroup.d.ts +28 -0
  285. package/dist/esm/components/selectable-card/selectable-card-radio-group/TanstackSelectableCardRadioGroup.js +32 -0
  286. package/dist/esm/components/selectable-card/selectable-card-radio-group/parts/RadioIndicator.js +14 -13
  287. package/dist/esm/components/selectable-card/selectable-card-radio-group/parts/SelectableCardRadio.js +27 -25
  288. package/dist/esm/components/selectable-card/selectableCard.variant.js +5 -5
  289. package/dist/esm/components/selectable-card-checkbox-group-field/SelectableCardCheckboxGroupField.d.ts +2 -0
  290. package/dist/esm/components/selectable-card-checkbox-group-field/TanstackSelectableCardCheckboxGroupField.d.ts +10 -0
  291. package/dist/esm/components/selectable-card-checkbox-group-field/TanstackSelectableCardCheckboxGroupField.js +38 -0
  292. package/dist/esm/components/selectable-card-radio-group-field/SelectableCardRadioGroupField.d.ts +2 -0
  293. package/dist/esm/components/selectable-card-radio-group-field/TanstackSelectableCardRadioGroupField.d.ts +10 -0
  294. package/dist/esm/components/selectable-card-radio-group-field/TanstackSelectableCardRadioGroupField.js +38 -0
  295. package/dist/esm/components/side-panel/parts/SidePanelFooter.js +19 -10
  296. package/dist/esm/components/table/Table.context.d.ts +5 -0
  297. package/dist/esm/components/table/Table.context.js +14 -13
  298. package/dist/esm/components/table/Table.d.ts +93 -0
  299. package/dist/esm/components/table/Table.js +135 -107
  300. package/dist/esm/components/table/parts/TableBody.js +83 -21
  301. package/dist/esm/components/table/parts/TableEmptyState.js +6 -6
  302. package/dist/esm/components/table/parts/TableHeader.js +1 -1
  303. package/dist/esm/components/table/parts/TablePagination.js +1 -1
  304. package/dist/esm/components/table/parts/TableRow.js +1 -0
  305. package/dist/esm/components/tabs/Tabs.variant.d.ts +0 -6
  306. package/dist/esm/components/tabs/Tabs.variant.js +11 -12
  307. package/dist/esm/components/task-menu/parts/RawSubTask.js +26 -26
  308. package/dist/esm/components/task-menu/parts/RawTask.js +32 -28
  309. package/dist/esm/components/task-menu/parts/TaskGroup.js +30 -26
  310. package/dist/esm/components/task-menu/parts/task.variants.js +4 -2
  311. package/dist/esm/components/text/Text.d.ts +11 -1
  312. package/dist/esm/components/text/Text.js +41 -31
  313. package/dist/esm/components/text/Text.variants.d.ts +12 -0
  314. package/dist/esm/components/text/Text.variants.js +4 -0
  315. package/dist/esm/components/text-area/TanstackTextArea.d.ts +21 -0
  316. package/dist/esm/components/text-area/TanstackTextArea.js +35 -0
  317. package/dist/esm/components/text-area/TextArea.js +31 -29
  318. package/dist/esm/components/text-field/TanstackTextField.d.ts +79 -0
  319. package/dist/esm/components/text-field/TanstackTextField.js +60 -0
  320. package/dist/esm/components/text-field/TextField.d.ts +2 -0
  321. package/dist/esm/components/toast/UnityToast.js +5 -5
  322. package/dist/esm/components/toast/test-utils.d.ts +36 -0
  323. package/dist/esm/components/toast/test-utils.js +118 -0
  324. package/dist/esm/components/toggle-switch/TanstackToggleSwitch.d.ts +46 -0
  325. package/dist/esm/components/toggle-switch/TanstackToggleSwitch.js +25 -0
  326. package/dist/esm/components/toggle-switch/ToggleSwitch.d.ts +21 -9
  327. package/dist/esm/components/toggle-switch/ToggleSwitch.js +71 -32
  328. package/dist/esm/components/toggle-switch-field/TanstackToggleSwitchField.d.ts +11 -0
  329. package/dist/esm/components/toggle-switch-field/TanstackToggleSwitchField.js +34 -0
  330. package/dist/esm/components/toggle-switch-field/ToggleSwitchField.d.ts +2 -0
  331. package/dist/esm/components/toggle-switch-group/TanstackToggleSwitchGroup.d.ts +57 -0
  332. package/dist/esm/components/toggle-switch-group/TanstackToggleSwitchGroup.js +23 -0
  333. package/dist/esm/components/toggle-switch-group/ToggleSwitchGroup.js +1 -1
  334. package/dist/esm/components/toggle-switch-group-field/TanstackToggleSwitchGroupField.d.ts +19 -0
  335. package/dist/esm/components/toggle-switch-group-field/TanstackToggleSwitchGroupField.js +50 -0
  336. package/dist/esm/components/toggle-switch-group-field/ToggleSwitchGroupField.d.ts +2 -0
  337. package/dist/esm/docs/{table → examples/data}/mocks/employee-columns.d.ts +1 -1
  338. package/dist/esm/hooks/tanstack-form-context.d.ts +1 -0
  339. package/dist/esm/hooks/tanstack-form-context.js +8 -0
  340. package/dist/esm/hooks/use-form.d.ts +2 -0
  341. package/dist/esm/hooks/use-has-scroll.d.ts +71 -0
  342. package/dist/esm/hooks/use-has-scroll.js +75 -0
  343. package/dist/esm/hooks/use-tanstack-form.d.ts +393 -0
  344. package/dist/esm/hooks/use-tanstack-form.js +232 -0
  345. package/dist/esm/index.d.ts +45 -20
  346. package/dist/esm/index.js +472 -407
  347. package/dist/esm/index.storybook-testing.d.ts +3 -0
  348. package/dist/esm/integrations/tanstack-router/components/form-contextual-link/FormContextualLink.d.ts +6 -1
  349. package/dist/esm/integrations/tanstack-router/components/form-contextual-link/TanstackFormContextualLink.d.ts +43 -0
  350. package/dist/esm/integrations/tanstack-router/components/list-view/ListView.d.ts +34 -0
  351. package/dist/esm/integrations/tanstack-router/components/list-view/ListView.js +25 -0
  352. package/dist/esm/integrations/tanstack-router/components/list-view/parts/ListViewItem.d.ts +51 -0
  353. package/dist/esm/integrations/tanstack-router/components/list-view/parts/ListViewItem.js +32 -0
  354. package/dist/esm/integrations/tanstack-router/components/navigation-card/NavigationCard.d.ts +73 -0
  355. package/dist/esm/integrations/tanstack-router/components/navigation-card/NavigationCard.js +37 -0
  356. package/dist/esm/integrations/tanstack-router/index.d.ts +3 -0
  357. package/dist/esm/integrations/tanstack-router/utils/decorators.d.ts +1 -1
  358. package/dist/esm/integrations/tanstack-router.js +32 -26
  359. package/dist/esm/mocks/employees.d.ts +1 -5
  360. package/dist/esm/storybook-testing.js +8 -2
  361. package/dist/esm/storybook-utilities/previewTransform.d.ts +1 -0
  362. package/dist/esm/utils/scroll-detection.d.ts +77 -0
  363. package/dist/esm/utils/scroll-detection.js +33 -0
  364. package/dist/esm/utils/spacing.d.ts +63 -0
  365. package/dist/esm/utils/spacing.js +15 -0
  366. package/i18n/en-GB.json +27 -8
  367. package/i18n/es-ES.json +29 -10
  368. package/i18n/fr-FR.json +30 -11
  369. package/package.json +41 -42
  370. package/dist/esm/components/multi-select/Multiselect.types.d.ts +0 -109
  371. package/dist/esm/integrations/react-router/v5/UnityReactRouterV5Provider.d.ts +0 -6
  372. package/dist/esm/integrations/react-router/v5/UnityReactRouterV5Provider.js +0 -28
  373. package/dist/esm/integrations/react-router/v5/index.d.ts +0 -1
  374. package/dist/esm/integrations/react-router/v5.js +0 -4
@@ -0,0 +1,114 @@
1
+ import { UseComboboxFilterProps } from './hooks/use-combobox-filter.js';
2
+ type Key = string | number;
3
+ /**
4
+ * Common props shared by all MultiSelect variants.
5
+ */
6
+ export interface MultiSelectBaseProps {
7
+ /** The ID of the element */
8
+ id?: string;
9
+ /** Default content when no value is selected */
10
+ placeholder?: string;
11
+ /** Whether the select is searchable and shows a search input on top of the options */
12
+ isSearchable?: boolean;
13
+ /** Whether the select is disabled */
14
+ isDisabled?: boolean;
15
+ /** Whether the select is invalid */
16
+ isInvalid?: boolean;
17
+ /** Whether the select is read only */
18
+ isReadOnly?: boolean;
19
+ /** Whether the select is in a loading state */
20
+ isLoading?: boolean;
21
+ /** Callback when the clear button is pressed */
22
+ onClearButtonPress?: () => void;
23
+ /** Maximum number of items to show in the select button before showing a counter badge */
24
+ maxVisibleItems?: number;
25
+ /** Callback when the select is focused */
26
+ onFocus?: () => void;
27
+ /** Callback when the select is blurred */
28
+ onBlur?: () => void;
29
+ /** The ID of the element that labels this select when no visible label is provided */
30
+ 'aria-labelledby'?: string;
31
+ /** The ID of the element that labels this select when no visible label is provided */
32
+ 'aria-label'?: string;
33
+ }
34
+ /**
35
+ * Props for flat (non-grouped) dynamic items MultiSelect.
36
+ * @template TItems The type of set of items.
37
+ */
38
+ export interface FlatSelectProps<TItems extends Set<unknown>> extends MultiSelectBaseProps {
39
+ /** The items to display in the select */
40
+ items: TItems;
41
+ /** Function to get the value from an item, defaults to String(item) */ getItemValue?: (item: TItems extends Set<infer U> ? U : never) => Key;
42
+ /** The currently selected values (controlled mode) */
43
+ value?: Set<Key>;
44
+ /** The default selected values (uncontrolled mode) */
45
+ defaultValue?: Set<Key>;
46
+ /** Callback when the selection changes */
47
+ onChange?: (value: Set<Key>) => void;
48
+ /** Function to render the selected value(s) in the button */
49
+ renderValue?: (value: Set<TItems extends Set<infer U> ? U : never>) => string;
50
+ /** Children must be a render function that returns Option components */ children: (item: TItems extends Set<infer U> ? U : never) => React.JSX.Element;
51
+ /** Options for filtering the items */
52
+ searchOptions?: UseComboboxFilterProps<TItems extends Set<infer U> ? U : never>['searchOptions'];
53
+ }
54
+ /**
55
+ * Props for grouped dynamic items MultiSelect.
56
+ * @template TItems The type of map from group key to array of items.
57
+ */
58
+ export interface GroupedSelectProps<TItems extends Map<string, unknown[]>> extends MultiSelectBaseProps {
59
+ /** The items to display in the select, grouped by category */
60
+ items: TItems;
61
+ /** Function to get the value from an item, defaults to String(item) */
62
+ getItemValue?: (item: TItems extends Map<string, Array<infer U>> ? U : never) => Key;
63
+ /** The currently selected values (controlled mode) */
64
+ value?: Set<Key>;
65
+ /** The default selected values (uncontrolled mode) */
66
+ defaultValue?: Set<Key>;
67
+ /** Callback when the selection changes */
68
+ onChange?: (value: Set<Key>) => void;
69
+ /** Function to render the selected value(s) in the button */
70
+ renderValue?: (value: Set<TItems extends Map<string, Array<infer U>> ? U : never>) => string;
71
+ /** Children must be a render function that returns OptGroup components */
72
+ children: (groupKey: string, items: TItems extends Map<string, Array<infer U>> ? U[] : never) => React.JSX.Element;
73
+ /** Options for filtering the items */
74
+ searchOptions?: UseComboboxFilterProps<TItems extends Map<string, Array<infer U>> ? U : never>['searchOptions'];
75
+ }
76
+ /**
77
+ * Props for static MultiSelect API (all items are defined via React children).
78
+ */
79
+ export interface StaticItemsProps<TItem = Key> extends MultiSelectBaseProps {
80
+ /** The items to display in the select (for dynamic API) */
81
+ items?: never;
82
+ /** Function to get the value from an item, defaults to String(item) */
83
+ getItemValue?: never;
84
+ /** The currently selected values (controlled mode) */
85
+ value?: Set<TItem>;
86
+ /** The default selected values (uncontrolled mode) */
87
+ defaultValue?: Set<TItem>;
88
+ /** Callback when the selection changes */
89
+ onChange?: (value: Set<TItem>) => void;
90
+ /** Function to render the selected value(s) in the button */
91
+ renderValue?: (value: Set<TItem>) => string;
92
+ /** Children must be Option components */
93
+ children: React.ReactNode;
94
+ /** Options for filtering the items */
95
+ searchOptions?: UseComboboxFilterProps<TItem>['searchOptions'];
96
+ }
97
+ /**
98
+ * Helper type to simplify usage for dynamic MultiSelect props.
99
+ * Picks flat or grouped variant depending on items type.
100
+ */
101
+ export type DynamicMultiSelectProps<TItems = Set<unknown> | Map<string, unknown[]>> = TItems extends Set<unknown> ? FlatSelectProps<TItems> : TItems extends Map<string, unknown[]> ? GroupedSelectProps<TItems> : never;
102
+ /**
103
+ * Top-level MultiSelect props type, picks static or dynamic variant as appropriate.
104
+ */
105
+ export type MultiSelectProps<TItems = Set<unknown> | Map<string, unknown[]> | undefined> = TItems extends undefined ? StaticItemsProps : DynamicMultiSelectProps<TItems>;
106
+ /**
107
+ * MultiSelect component type signature.
108
+ */
109
+ export type MultiSelectComponent = <TItems = undefined>(props: MultiSelectProps<TItems> & {
110
+ ref?: React.ForwardedRef<HTMLButtonElement>;
111
+ } & {
112
+ displayName?: string;
113
+ }) => React.JSX.Element;
114
+ export {};
@@ -0,0 +1,7 @@
1
+ import { MultiSelectComponent, MultiSelectProps } from './MultiselectTypes.js';
2
+ export type TanstackMultiSelectProps<TItems = undefined> = Omit<MultiSelectProps<TItems>, 'value' | 'defaultValue' | 'onChange' | 'onBlur' | 'isInvalid'> & {
3
+ children?: MultiSelectProps<TItems>['children'];
4
+ };
5
+ export declare const TanstackMultiSelect: MultiSelectComponent & {
6
+ displayName: string;
7
+ };
@@ -0,0 +1,41 @@
1
+ import { jsx as h } from "react/jsx-runtime";
2
+ import { forwardRef as p } from "react";
3
+ import { useFieldContext as C } from "../../hooks/tanstack-form-context.js";
4
+ import { useFieldA11yContext as B } from "../form-field/TanstackFormField.context.js";
5
+ import { MultiSelect as y } from "./MultiSelect.js";
6
+ const S = (l, o) => {
7
+ const e = C(), t = B(), s = e.state.meta.isTouched && !e.state.meta.isValid, { onClearButtonPress: a, onFocus: i, isReadOnly: r, isDisabled: d, ...n } = l, u = (f) => {
8
+ e.handleChange(f);
9
+ }, c = () => {
10
+ e.handleBlur();
11
+ }, m = () => {
12
+ e.setValue(/* @__PURE__ */ new Set()), a && a();
13
+ };
14
+ return (
15
+ // @ts-expect-error - Typescript is not able to infer the type of the MultiSelect component
16
+ /* @__PURE__ */ h(
17
+ y,
18
+ {
19
+ ...n,
20
+ ref: o,
21
+ id: t.inputId || n.id,
22
+ value: e.state.value,
23
+ onChange: u,
24
+ onBlur: c,
25
+ onFocus: i,
26
+ onClearButtonPress: m,
27
+ isReadOnly: r,
28
+ isDisabled: d,
29
+ isInvalid: s,
30
+ "aria-labelledby": t.labelId
31
+ }
32
+ )
33
+ );
34
+ }, b = p(
35
+ // @ts-expect-error - forwardRef struggles with generic components
36
+ S
37
+ );
38
+ b.displayName = "TanstackMultiSelect";
39
+ export {
40
+ b as TanstackMultiSelect
41
+ };
@@ -10,6 +10,8 @@ export interface MultiSelectButtonProps<TItem> {
10
10
  /** Function to render the selected items */
11
11
  renderValue: (values: Set<TItem>) => string;
12
12
  onClearButtonPress?: () => void;
13
+ onBlur?: () => void;
14
+ onFocus?: () => void;
13
15
  }
14
16
  export declare const MultiSelectButton: <TItem>(props: MultiSelectButtonProps<TItem> & {
15
17
  ref?: ForwardedRef<HTMLButtonElement>;
@@ -1,18 +1,18 @@
1
1
  import { jsxs as i, jsx as e } from "react/jsx-runtime";
2
- import { memo as j, forwardRef as E, useContext as k, useMemo as A } from "react";
3
- import { useSelectContext as D, useStoreState as K, Select as $ } from "@ariakit/react";
4
- import { uyTv as L } from "@payfit/unity-themes";
5
- import { useId as P } from "react-aria";
6
- import { useIntl as R } from "react-intl";
7
- import { Badge as T } from "../../badge/Badge.js";
8
- import { CircularIconButton as U } from "../../icon-button/CircularIconButton.js";
2
+ import { memo as D, forwardRef as k, useContext as A, useMemo as K } from "react";
3
+ import { useSelectContext as R, useStoreState as $, Select as L } from "@ariakit/react";
4
+ import { uyTv as P } from "@payfit/unity-themes";
5
+ import { useId as T } from "react-aria";
6
+ import { useIntl as U } from "react-intl";
7
+ import { Badge as W } from "../../badge/Badge.js";
8
+ import { CircularIconButton as q } from "../../icon-button/CircularIconButton.js";
9
9
  import { Icon as b } from "../../icon/Icon.js";
10
- import { Spinner as W } from "../../spinner/Spinner.js";
11
- import { MultiSelectContext as q } from "../Multiselect.context.js";
12
- const F = L({
10
+ import { Spinner as F } from "../../spinner/Spinner.js";
11
+ import { MultiSelectContext as G } from "../Multiselect.context.js";
12
+ const H = P({
13
13
  slots: {
14
- base: "uy:h-500 uy:flex uy:items-center uy:justify-between uy:py-100 uy:px-150 uy:w-full uy:border uy:border-solid uy:rounded-75 uy:focus-within:outline-none uy:focus-within:ring-2 uy:focus-within:ring-utility-focus-ring uy:focus-within:ring-offset-2 uy:active:not([disabled]):border-border-form-active uy:pointer-events-auto!",
15
- inputValue: "uy:flex-1 uy:typography-body uy:text-content-form-enabled uy:text-left uy:line-clamp-1",
14
+ base: "uy:h-5.5 uy:sm:h-500 uy:flex uy:items-center uy:justify-between uy:py-125 uy:sm:py-100 uy:px-150 uy:w-full uy:border uy:border-solid uy:rounded-100 uy:sm:rounded-75 uy:focus-within:outline-none uy:focus-within:ring-2 uy:focus-within:ring-utility-focus-ring uy:focus-within:ring-offset-2 uy:active:not([disabled]):border-border-form-active uy:pointer-events-auto!",
15
+ inputValue: "uy:flex-1 uy:typography-body uy:text-left uy:line-clamp-1",
16
16
  state: "uy:grow-0 uy:outline-none uy:typography-body uy:placeholder:text-content-neutral-lowest uy:inline-flex uy:gap-50 uy:items-center uy:px-100",
17
17
  suffix: "uy:text-content-neutral-low"
18
18
  },
@@ -44,6 +44,9 @@ const F = L({
44
44
  isEmpty: {
45
45
  true: {
46
46
  inputValue: "uy:text-content-neutral-lowest"
47
+ },
48
+ false: {
49
+ inputValue: "uy:text-content-form-enabled"
47
50
  }
48
51
  }
49
52
  },
@@ -58,77 +61,90 @@ const F = L({
58
61
  state: "uy:text-content-neutral-disabled",
59
62
  suffix: "uy:border-border-form-enabled uy:text-content-form-enabled"
60
63
  }
64
+ },
65
+ {
66
+ isEmpty: !0,
67
+ isDisabled: !1,
68
+ isReadOnly: !1,
69
+ isInvalid: !1,
70
+ className: {
71
+ inputValue: "uy:text-content-neutral-lowest"
72
+ }
61
73
  }
62
74
  ]
63
75
  });
64
- function G({
65
- isDisabled: r,
76
+ function J({
77
+ isDisabled: n,
66
78
  isReadOnly: t,
67
79
  isLoading: c,
68
- isInvalid: n,
69
- placeholder: u,
80
+ isInvalid: r,
81
+ placeholder: s,
70
82
  selectedItems: x,
71
83
  renderValue: d,
72
84
  onClearButtonPress: g,
73
- ...w
74
- }, h) {
75
- const m = P(), s = R(), S = D(), C = K(S, "open"), f = k(q), a = f.maxVisibleItems ?? 0, l = f.selectedKeys ?? /* @__PURE__ */ new Set(), o = Array.from(x), { base: M, inputValue: v, state: I, suffix: B } = F({
76
- isDisabled: !!r,
85
+ onBlur: w,
86
+ onFocus: h,
87
+ ...S
88
+ }, v) {
89
+ const m = T(), u = U(), C = R(), I = $(C, "open"), f = A(G), a = f.maxVisibleItems ?? 0, l = f.selectedKeys ?? /* @__PURE__ */ new Set(), o = Array.from(x), { base: M, inputValue: V, state: B, suffix: N } = H({
90
+ isDisabled: !!n,
77
91
  isReadOnly: !!t,
78
- isInvalid: !!n,
92
+ isInvalid: !!r,
79
93
  isEmpty: l.size === 0
80
94
  }), y = Math.max(
81
95
  o.length - a,
82
96
  0
83
- ), V = l.size > 0 && !r && !t && !c, N = A(() => {
84
- if (o.length === 0) return u;
85
- const O = o.slice(0, a), z = new Set(O);
86
- return d(z);
87
- }, [o, a, d, u]);
97
+ ), O = l.size > 0 && !n && !t && !c, z = K(() => {
98
+ if (o.length === 0) return s;
99
+ const E = o.slice(0, a), j = new Set(E);
100
+ return d(j);
101
+ }, [o, a, d, s]);
88
102
  return /* @__PURE__ */ i(
89
- $,
103
+ L,
90
104
  {
91
- ...w,
92
- ref: h,
105
+ ...S,
106
+ ref: v,
93
107
  className: M(),
94
- disabled: r || t,
95
- "aria-invalid": n,
108
+ disabled: n || t,
109
+ "aria-invalid": r,
96
110
  "aria-readonly": t,
97
111
  "aria-labelledby": `${m}-select-button-label`,
98
112
  "data-dd-privacy": "mask",
113
+ onBlur: w,
114
+ onFocus: h,
99
115
  children: [
100
- /* @__PURE__ */ e("span", { id: `${m}-select-button-label`, className: v(), children: l.size > 0 ? N : u }),
101
- /* @__PURE__ */ i("div", { className: I(), children: [
116
+ /* @__PURE__ */ e("span", { id: `${m}-select-button-label`, className: V(), children: l.size > 0 ? z : s }),
117
+ /* @__PURE__ */ i("div", { className: B(), children: [
102
118
  c && /* @__PURE__ */ e(
103
- W,
119
+ F,
104
120
  {
105
121
  color: "inherit",
106
122
  size: "small",
107
- label: s.formatMessage({
123
+ label: u.formatMessage({
108
124
  id: "unity:component:form-field:form-input:spinner:label",
109
125
  defaultMessage: "Loading"
110
126
  })
111
127
  }
112
128
  ),
113
- n && /* @__PURE__ */ e(
129
+ r && /* @__PURE__ */ e(
114
130
  b,
115
131
  {
116
132
  src: "WarningCircleOutlined",
117
133
  color: "content.form.invalid",
118
- alt: s.formatMessage({
134
+ alt: u.formatMessage({
119
135
  id: "unity:component:form-field:form-input:error:alt",
120
136
  defaultMessage: "Error"
121
137
  })
122
138
  }
123
139
  ),
124
- y > 0 && /* @__PURE__ */ i(T, { variant: "numeric", children: [
140
+ y > 0 && /* @__PURE__ */ i(W, { variant: "numeric", children: [
125
141
  "+",
126
142
  y
127
143
  ] }),
128
- V && /* @__PURE__ */ e(
129
- U,
144
+ O && /* @__PURE__ */ e(
145
+ q,
130
146
  {
131
- title: s.formatMessage({
147
+ title: u.formatMessage({
132
148
  id: "unity:component:common:clear:title",
133
149
  defaultMessage: "Clear"
134
150
  }),
@@ -144,8 +160,8 @@ function G({
144
160
  b,
145
161
  {
146
162
  color: "content.neutral.low",
147
- className: B(),
148
- src: C ? "CaretUpOutlined" : "CaretDownOutlined",
163
+ className: N(),
164
+ src: I ? "CaretUpOutlined" : "CaretDownOutlined",
149
165
  role: "presentation"
150
166
  }
151
167
  )
@@ -153,9 +169,9 @@ function G({
153
169
  }
154
170
  );
155
171
  }
156
- const p = j(E(G));
172
+ const p = D(k(J));
157
173
  p.displayName = "MultiselectButton";
158
- const ne = p;
174
+ const ue = p;
159
175
  export {
160
- ne as MultiSelectButton
176
+ ue as MultiSelectButton
161
177
  };
@@ -1,4 +1,4 @@
1
- import { jsx as e, jsxs as o, Fragment as m } from "react/jsx-runtime";
1
+ import { jsx as o, jsxs as e, Fragment as m } from "react/jsx-runtime";
2
2
  import { memo as b, useContext as f } from "react";
3
3
  import { SelectPopover as h, Combobox as v, ComboboxList as x } from "@ariakit/react";
4
4
  import { uyTv as t } from "@payfit/unity-themes";
@@ -6,35 +6,35 @@ import { Icon as g } from "../../icon/Icon.js";
6
6
  import { MultiSelectContext as w } from "../Multiselect.context.js";
7
7
  const S = t({
8
8
  slots: {
9
- base: "uy:shadow-floating uy:absolute uy:top-full uy:left-0 uy:z-50 uy:w-full uy:rounded-75 uy:border uy:border-solid uy:border-border-neutral uy:bg-surface-neutral uy:overflow-auto uy:max-h-[min(var(--popover-available-height,300px),300px)] uy:outline-none",
9
+ base: "uy:shadow-floating uy:absolute uy:top-full uy:left-0 uy:z-50 uy:w-full uy:rounded-100 uy:sm:rounded-75 uy:border uy:border-solid uy:border-border-neutral uy:bg-surface-neutral uy:overflow-auto uy:max-h-[min(var(--popover-available-height,300px),300px)] uy:outline-none",
10
10
  list: "uy:p-100"
11
11
  }
12
12
  }), N = t({
13
13
  slots: {
14
14
  wrapper: "uy:sticky uy:top-0 uy:bg-surface-neutral uy:pt-100 uy:px-100",
15
- base: "uy:flex uy:w-full uy:gap-100 uy:h-500 uy:border uy:border-solid uy:rounded-75 uy:py-100 uy:border-border-form-enabled uy:bg-surface-form-enabled uy:px-150 uy:typography-body uy:focus-within:outline-none uy:focus-within:ring-2 uy:focus-within:ring-utility-focus-ring uy:focus-within:ring-offset-2 uy:active:border-border-form-active",
15
+ base: "uy:flex uy:w-full uy:gap-100 uy:sm:h-500 uy:transition-colors uy:rounded-100 uy:sm:rounded-75 uy:py-125 uy:sm:py-100 uy:bg-surface-form-high-enabled uy:px-125 uy:sm:px-150 uy:typography-body uy:focus-within:outline-none uy:focus-within:ring-2 uy:focus-within:ring-utility-focus-ring uy:focus-within:ring-offset-2 uy:active:border uy:active:border-solid uy:active:border-border-form-active",
16
16
  input: "uy:focus-visible:outline-none",
17
17
  divider: "uy:my-100 uy:border-t uy:border-border-neutral"
18
18
  }
19
19
  });
20
20
  function C({
21
21
  children: r,
22
- ...l
22
+ ...s
23
23
  }) {
24
- const i = f(w), { base: s, list: u } = S(), { base: n, input: a, wrapper: y, divider: c } = N(), { onBlur: d, ...p } = l;
25
- return /* @__PURE__ */ e(
24
+ const i = f(w), { base: l, list: u } = S(), { base: n, input: a, wrapper: y, divider: c } = N(), { onBlur: d, ...p } = s;
25
+ return /* @__PURE__ */ o(
26
26
  h,
27
27
  {
28
28
  portal: !0,
29
29
  sameWidth: !0,
30
30
  unmountOnHide: !0,
31
- className: s(),
31
+ className: l(),
32
32
  onClose: () => d?.(),
33
33
  ...p,
34
- children: i.isSearchable ? /* @__PURE__ */ o(m, { children: [
35
- /* @__PURE__ */ o("div", { className: y(), children: [
36
- /* @__PURE__ */ o("div", { className: n(), children: [
37
- /* @__PURE__ */ e(
34
+ children: i.isSearchable ? /* @__PURE__ */ e(m, { children: [
35
+ /* @__PURE__ */ e("div", { className: y(), children: [
36
+ /* @__PURE__ */ e("div", { className: n(), children: [
37
+ /* @__PURE__ */ o(
38
38
  g,
39
39
  {
40
40
  src: "MagnifyingGlassOutlined",
@@ -42,7 +42,7 @@ function C({
42
42
  "aria-hidden": !0
43
43
  }
44
44
  ),
45
- /* @__PURE__ */ e(
45
+ /* @__PURE__ */ o(
46
46
  v,
47
47
  {
48
48
  autoSelect: !0,
@@ -51,10 +51,10 @@ function C({
51
51
  }
52
52
  )
53
53
  ] }),
54
- /* @__PURE__ */ e("hr", { className: c() })
54
+ /* @__PURE__ */ o("hr", { className: c() })
55
55
  ] }),
56
- /* @__PURE__ */ e(x, { className: u(), children: r })
57
- ] }) : /* @__PURE__ */ e("div", { className: u(), children: r })
56
+ /* @__PURE__ */ o(x, { className: u(), children: r })
57
+ ] }) : /* @__PURE__ */ o("div", { className: u(), children: r })
58
58
  }
59
59
  );
60
60
  }
@@ -3,8 +3,7 @@ import { ForwardedRef, ReactNode } from 'react';
3
3
  import { FieldPath, FieldValues } from 'react-hook-form';
4
4
  import { Schema } from '../../hooks/use-form.types.js';
5
5
  import { LabelProps } from '../label/Label.js';
6
- import { MultiSelectProps } from '../multi-select/Multiselect.types.js';
7
- type Key = string | number;
6
+ import { MultiSelectProps } from '../multi-select/MultiselectTypes.js';
8
7
  interface FieldProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> extends Pick<LabelProps, 'isRequired' | 'requiredVariant'> {
9
8
  /** The name of the field, which should match the form schema. */
10
9
  name: TName;
@@ -17,13 +16,14 @@ interface FieldProps<TFieldValues extends FieldValues = FieldValues, TName exten
17
16
  /** A contextual link to display below the multi-select field. */
18
17
  contextualLink?: ReactNode;
19
18
  }
20
- type BaseMultiSelectProps<TItem, // Item type
21
- TItemKey extends keyof TItem, // key name of the item
22
- TKeyType extends TItem[TItemKey] & Key> = Omit<MultiSelectProps<TItem, TItemKey, TKeyType>, 'value' | 'defaultValue' | 'onChange' | 'aria-labelledby' | 'aria-label'>;
23
- export type MultiSelectFieldProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>, TItem = unknown, TItemKey extends keyof TItem = keyof TItem, TKeyType extends TItem[TItemKey] & Key = TItem[TItemKey] & Key> = FieldProps<TFieldValues, TName> & BaseMultiSelectProps<TItem, TItemKey, TKeyType>;
19
+ type BaseMultiSelectProps<TItems = undefined> = Omit<MultiSelectProps<TItems>, 'value' | 'defaultValue' | 'onChange' | 'aria-labelledby' | 'aria-label'>;
20
+ export type MultiSelectFieldProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>, TItems = undefined> = FieldProps<TFieldValues, TName> & BaseMultiSelectProps<TItems>;
24
21
  /**
25
22
  * The `MultiSelectField` component renders a full field that allows selecting multiple items from a dropdown list, and integrates with the `Form` component automatically.
26
- * @example
23
+ *
24
+ * The component uses a single generic parameter `TItems` that infers the item type from the `items` prop
25
+ * for the dynamic API, or defaults to `undefined` for the static API (using `children` directly).
26
+ * @example Static API
27
27
  * ```tsx
28
28
  * const schema = z.object({
29
29
  * fruits: z.set(z.string()),
@@ -46,14 +46,47 @@ export type MultiSelectFieldProps<TFieldValues extends FieldValues = FieldValues
46
46
  * )
47
47
  * }
48
48
  * ```
49
+ * @example Dynamic API
50
+ * ```tsx
51
+ * interface Fruit { id: string; name: string }
52
+ * const fruits = new Set<Fruit>([...])
53
+ *
54
+ * const schema = z.object({
55
+ * fruits: z.set(z.string()),
56
+ * })
57
+ *
58
+ * function MyForm() {
59
+ * const { Form } = useUnityForm(schema)
60
+ *
61
+ * return (
62
+ * <Form action={handleSubmit}>
63
+ * <MultiSelectField<typeof schema, Set<Fruit>>
64
+ * name="fruits"
65
+ * label="Select fruits"
66
+ * items={fruits}
67
+ * getItemValue={fruit => fruit.id}
68
+ * >
69
+ * {fruit => (
70
+ * <MultiSelectOption value={fruit.id}>{fruit.name}</MultiSelectOption>
71
+ * )}
72
+ * </MultiSelectField>
73
+ * </Form>
74
+ * )
75
+ * }
76
+ * ```
49
77
  * @note The schema type parameter is needed to ensure type safety with the form's schema. If you omit it, the `name` prop will not be type-safe.
50
78
  * @remarks
51
79
  * [API & Docs](https://unity-components.payfit.io/?path=/docs/forms-multiselectfield--docs) • [Design Guidelines](https://www.payfit.design/24f360409/p/928776-multiselect)
80
+ * @deprecated React Hook Form components are deprecated. Use the TanStack Form version instead.
81
+ * @see Storybook docs: https://unity-components.payfit.io/?path=/docs/forms-introduction-to-unity-forms--docs
82
+ */
83
+ /**
84
+ * Component type for MultiSelectField with proper generic support
52
85
  */
53
- export declare const MultiSelectField: {
54
- <TSchema extends Schema, TItem = unknown>(props: MultiSelectFieldProps<StandardSchemaV1.InferOutput<TSchema>, FieldPath<StandardSchemaV1.InferOutput<TSchema>>, TItem, keyof TItem, TItem[keyof TItem] & Key> & {
55
- ref?: ForwardedRef<HTMLButtonElement>;
56
- }): React.JSX.Element;
57
- displayName?: string;
86
+ type MultiSelectFieldComponent = <TSchema extends Schema = Schema, TItems = undefined>(props: MultiSelectFieldProps<StandardSchemaV1.InferOutput<TSchema>, FieldPath<StandardSchemaV1.InferOutput<TSchema>>, TItems> & {
87
+ ref?: ForwardedRef<HTMLButtonElement>;
88
+ }) => React.JSX.Element;
89
+ export declare const MultiSelectField: MultiSelectFieldComponent & {
90
+ displayName: string;
58
91
  };
59
92
  export {};
@@ -1,82 +1,72 @@
1
- import { jsxs as C, jsx as t } from "react/jsx-runtime";
2
- import { forwardRef as P } from "react";
3
- import { uyTv as M } from "@payfit/unity-themes";
4
- import { useFormContext as T } from "react-hook-form";
5
- import { FormField as k } from "../form-field/FormField.js";
6
- import { FormControl as g } from "../form-field/parts/FormControl.js";
7
- import { FormFeedbackText as B } from "../form-field/parts/FormFeedbackText.js";
8
- import { FormHelperText as L } from "../form-field/parts/FormHelperText.js";
9
- import { FormLabel as R } from "../form-field/parts/FormLabel.js";
10
- import { MultiSelect as u } from "../multi-select/MultiSelect.js";
11
- const j = M({
1
+ import { jsxs as y, jsx as r } from "react/jsx-runtime";
2
+ import { forwardRef as C } from "react";
3
+ import { uyTv as I } from "@payfit/unity-themes";
4
+ import { useFormContext as P } from "react-hook-form";
5
+ import { FormField as T } from "../form-field/FormField.js";
6
+ import { FormControl as k } from "../form-field/parts/FormControl.js";
7
+ import { FormFeedbackText as M } from "../form-field/parts/FormFeedbackText.js";
8
+ import { FormHelperText as B } from "../form-field/parts/FormHelperText.js";
9
+ import { FormLabel as L } from "../form-field/parts/FormLabel.js";
10
+ import { MultiSelect as R } from "../multi-select/MultiSelect.js";
11
+ const g = I({
12
12
  base: "uy:flex uy:flex-col uy:gap-100"
13
13
  });
14
- function q(e, l) {
15
- const { control: r, setValue: d } = T(), {
16
- name: i,
17
- label: f,
18
- helperText: o,
19
- feedbackText: x,
20
- contextualLink: F,
21
- isRequired: b,
22
- isInvalid: h,
23
- isLoading: n,
24
- isDisabled: m,
25
- isReadOnly: a,
26
- requiredVariant: p,
27
- children: s,
28
- onClearButtonPress: S,
29
- ...y
30
- } = e, I = {
31
- isRequired: b,
32
- isInvalid: h,
33
- isLoading: n,
34
- isDisabled: m,
35
- isReadOnly: a
36
- }, V = "items" in e && "getItemValue" in e, c = {
14
+ function j(e, a) {
15
+ const { control: m, setValue: s } = P(), {
16
+ name: l,
17
+ label: c,
18
+ helperText: t,
19
+ feedbackText: d,
20
+ contextualLink: u,
21
+ isRequired: f,
22
+ isInvalid: p,
23
+ isLoading: o,
24
+ isDisabled: i,
25
+ isReadOnly: n,
26
+ requiredVariant: x,
27
+ children: F,
28
+ onClearButtonPress: b,
29
+ ...h
30
+ } = e, S = {
31
+ isRequired: f,
32
+ isInvalid: p,
33
+ isLoading: o,
34
+ isDisabled: i,
35
+ isReadOnly: n
36
+ }, V = {
37
37
  onClearButtonPress: () => {
38
- d(i, /* @__PURE__ */ new Set()), S?.();
38
+ s(l, /* @__PURE__ */ new Set()), b?.();
39
39
  },
40
40
  placeholder: e.placeholder,
41
41
  isSearchable: e.isSearchable,
42
42
  maxVisibleItems: e.maxVisibleItems,
43
- isDisabled: m,
44
- isReadOnly: a,
45
- isLoading: n,
46
- renderValue: e.renderValue
43
+ isDisabled: i,
44
+ isReadOnly: n,
45
+ isLoading: o,
46
+ ...e.renderValue && { renderValue: e.renderValue }
47
47
  };
48
- return /* @__PURE__ */ C(
49
- k,
48
+ return /* @__PURE__ */ y(
49
+ T,
50
50
  {
51
- control: r,
52
- name: i,
53
- className: j(),
54
- ...I,
51
+ control: m,
52
+ name: l,
53
+ className: g(),
54
+ ...S,
55
55
  children: [
56
- /* @__PURE__ */ t(R, { requiredVariant: p, children: f }),
57
- o && /* @__PURE__ */ t(L, { children: o }),
58
- /* @__PURE__ */ t(g, { children: V ? (
59
- // @ts-expect-error - Type system cannot fully express this but it works correctly at runtime
60
- /* @__PURE__ */ t(
61
- u,
62
- {
63
- ...y,
64
- ...c,
65
- ref: l,
66
- children: s
67
- }
68
- )
69
- ) : /* @__PURE__ */ t(u, { ...c, ref: l, children: s }) }),
70
- /* @__PURE__ */ t(B, { children: x }),
71
- F
56
+ /* @__PURE__ */ r(L, { requiredVariant: x, children: c }),
57
+ t && /* @__PURE__ */ r(B, { children: t }),
58
+ /* @__PURE__ */ r(k, { children: /* @__PURE__ */ r(R, { ...h, ...V, ref: a, children: F }) }),
59
+ /* @__PURE__ */ r(M, { children: d }),
60
+ u
72
61
  ]
73
62
  }
74
63
  );
75
64
  }
76
- const v = P(function(l, r) {
77
- return q(l, r);
78
- });
79
- v.displayName = "MultiSelectField";
65
+ const q = (
66
+ // @ts-expect-error - forwardRef struggles with generic components
67
+ C(j)
68
+ );
69
+ q.displayName = "MultiSelectField";
80
70
  export {
81
- v as MultiSelectField
71
+ q as MultiSelectField
82
72
  };