@limonify/zest-ui 0.3.1 → 0.4.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 (381) hide show
  1. package/README.md +3 -0
  2. package/lib/alert-dialog/index.parts.d.ts +1 -1
  3. package/lib/alert-dialog/index.parts.d.ts.map +1 -1
  4. package/lib/alert-dialog/index.parts.js.map +1 -1
  5. package/lib/autocomplete/handle.d.ts +15 -0
  6. package/lib/autocomplete/handle.d.ts.map +1 -0
  7. package/lib/autocomplete/handle.js +12 -0
  8. package/lib/autocomplete/handle.js.map +1 -0
  9. package/lib/autocomplete/index.d.ts +1 -0
  10. package/lib/autocomplete/index.d.ts.map +1 -1
  11. package/lib/autocomplete/index.parts.d.ts +1 -0
  12. package/lib/autocomplete/index.parts.d.ts.map +1 -1
  13. package/lib/autocomplete/index.parts.js +3 -1
  14. package/lib/autocomplete/index.parts.js.map +1 -1
  15. package/lib/autocomplete/root/AutocompleteRoot.d.ts +55 -16
  16. package/lib/autocomplete/root/AutocompleteRoot.d.ts.map +1 -1
  17. package/lib/autocomplete/root/AutocompleteRoot.js +2 -18
  18. package/lib/autocomplete/root/AutocompleteRoot.js.map +1 -1
  19. package/lib/avatar/fallback/AvatarFallback.d.ts.map +1 -1
  20. package/lib/avatar/fallback/AvatarFallback.js +3 -1
  21. package/lib/avatar/fallback/AvatarFallback.js.map +1 -1
  22. package/lib/avatar/image/AvatarImage.d.ts.map +1 -1
  23. package/lib/avatar/image/AvatarImage.js +5 -0
  24. package/lib/avatar/image/AvatarImage.js.map +1 -1
  25. package/lib/checkbox/root/CheckboxRoot.d.ts.map +1 -1
  26. package/lib/checkbox/root/CheckboxRoot.js +9 -4
  27. package/lib/checkbox/root/CheckboxRoot.js.map +1 -1
  28. package/lib/combobox/backdrop/ComboboxBackdrop.d.ts.map +1 -1
  29. package/lib/combobox/backdrop/ComboboxBackdrop.js +10 -2
  30. package/lib/combobox/backdrop/ComboboxBackdrop.js.map +1 -1
  31. package/lib/combobox/empty/ComboboxEmpty.d.ts.map +1 -1
  32. package/lib/combobox/empty/ComboboxEmpty.js +4 -1
  33. package/lib/combobox/empty/ComboboxEmpty.js.map +1 -1
  34. package/lib/combobox/index.d.ts +2 -0
  35. package/lib/combobox/index.d.ts.map +1 -1
  36. package/lib/combobox/index.js +3 -1
  37. package/lib/combobox/index.js.map +1 -1
  38. package/lib/combobox/index.parts.d.ts +1 -0
  39. package/lib/combobox/index.parts.d.ts.map +1 -1
  40. package/lib/combobox/index.parts.js +4 -1
  41. package/lib/combobox/index.parts.js.map +1 -1
  42. package/lib/combobox/input/ComboboxInput.d.ts +24 -3
  43. package/lib/combobox/input/ComboboxInput.d.ts.map +1 -1
  44. package/lib/combobox/input/ComboboxInput.js +68 -8
  45. package/lib/combobox/input/ComboboxInput.js.map +1 -1
  46. package/lib/combobox/item/ComboboxItem.d.ts +11 -1
  47. package/lib/combobox/item/ComboboxItem.d.ts.map +1 -1
  48. package/lib/combobox/item/ComboboxItem.js +9 -4
  49. package/lib/combobox/item/ComboboxItem.js.map +1 -1
  50. package/lib/combobox/list/ComboboxList.d.ts +1 -1
  51. package/lib/combobox/list/ComboboxList.d.ts.map +1 -1
  52. package/lib/combobox/list/ComboboxList.js +4 -1
  53. package/lib/combobox/list/ComboboxList.js.map +1 -1
  54. package/lib/combobox/popup/ComboboxPopup.d.ts +26 -0
  55. package/lib/combobox/popup/ComboboxPopup.d.ts.map +1 -1
  56. package/lib/combobox/popup/ComboboxPopup.js +18 -2
  57. package/lib/combobox/popup/ComboboxPopup.js.map +1 -1
  58. package/lib/combobox/portal/ComboboxPortal.d.ts.map +1 -1
  59. package/lib/combobox/portal/ComboboxPortal.js +8 -4
  60. package/lib/combobox/portal/ComboboxPortal.js.map +1 -1
  61. package/lib/combobox/portal/ComboboxPortalContext.d.ts +4 -0
  62. package/lib/combobox/portal/ComboboxPortalContext.d.ts.map +1 -0
  63. package/lib/combobox/portal/ComboboxPortalContext.js +48 -0
  64. package/lib/combobox/portal/ComboboxPortalContext.js.map +1 -0
  65. package/lib/combobox/positioner/ComboboxPositioner.d.ts +11 -1
  66. package/lib/combobox/positioner/ComboboxPositioner.d.ts.map +1 -1
  67. package/lib/combobox/positioner/ComboboxPositioner.js +67 -7
  68. package/lib/combobox/positioner/ComboboxPositioner.js.map +1 -1
  69. package/lib/combobox/positioner/ComboboxPositionerContext.d.ts +9 -0
  70. package/lib/combobox/positioner/ComboboxPositionerContext.d.ts.map +1 -0
  71. package/lib/combobox/positioner/ComboboxPositionerContext.js +48 -0
  72. package/lib/combobox/positioner/ComboboxPositionerContext.js.map +1 -0
  73. package/lib/combobox/root/ComboboxItemsContext.d.ts +18 -0
  74. package/lib/combobox/root/ComboboxItemsContext.d.ts.map +1 -0
  75. package/lib/combobox/root/ComboboxItemsContext.js +55 -0
  76. package/lib/combobox/root/ComboboxItemsContext.js.map +1 -0
  77. package/lib/combobox/root/ComboboxRoot.d.ts +77 -21
  78. package/lib/combobox/root/ComboboxRoot.d.ts.map +1 -1
  79. package/lib/combobox/root/ComboboxRoot.js +4 -23
  80. package/lib/combobox/root/ComboboxRoot.js.map +1 -1
  81. package/lib/combobox/root/ComboboxRootContext.d.ts +4 -43
  82. package/lib/combobox/root/ComboboxRootContext.d.ts.map +1 -1
  83. package/lib/combobox/root/ComboboxRootContext.js.map +1 -1
  84. package/lib/combobox/root/ComboboxTransitionContext.d.ts +8 -0
  85. package/lib/combobox/root/ComboboxTransitionContext.d.ts.map +1 -0
  86. package/lib/combobox/root/ComboboxTransitionContext.js +44 -0
  87. package/lib/combobox/root/ComboboxTransitionContext.js.map +1 -0
  88. package/lib/combobox/root/useRenderComboboxRoot.d.ts +39 -0
  89. package/lib/combobox/root/useRenderComboboxRoot.d.ts.map +1 -0
  90. package/lib/combobox/root/useRenderComboboxRoot.js +136 -0
  91. package/lib/combobox/root/useRenderComboboxRoot.js.map +1 -0
  92. package/lib/combobox/store/ComboboxHandle.d.ts +42 -0
  93. package/lib/combobox/store/ComboboxHandle.d.ts.map +1 -0
  94. package/lib/combobox/store/ComboboxHandle.js +65 -0
  95. package/lib/combobox/store/ComboboxHandle.js.map +1 -0
  96. package/lib/combobox/store/ComboboxStore.d.ts +147 -0
  97. package/lib/combobox/store/ComboboxStore.d.ts.map +1 -0
  98. package/lib/combobox/store/ComboboxStore.js +127 -0
  99. package/lib/combobox/store/ComboboxStore.js.map +1 -0
  100. package/lib/combobox/value/ComboboxValue.d.ts.map +1 -1
  101. package/lib/combobox/value/ComboboxValue.js +2 -1
  102. package/lib/combobox/value/ComboboxValue.js.map +1 -1
  103. package/lib/context-menu/positioner/ContextMenuPositioner.d.ts +19 -3
  104. package/lib/context-menu/positioner/ContextMenuPositioner.d.ts.map +1 -1
  105. package/lib/context-menu/positioner/ContextMenuPositioner.js +56 -7
  106. package/lib/context-menu/positioner/ContextMenuPositioner.js.map +1 -1
  107. package/lib/context-menu/root/ContextMenuRoot.d.ts +8 -0
  108. package/lib/context-menu/root/ContextMenuRoot.d.ts.map +1 -1
  109. package/lib/dialog/backdrop/DialogBackdrop.d.ts +9 -0
  110. package/lib/dialog/backdrop/DialogBackdrop.d.ts.map +1 -1
  111. package/lib/dialog/backdrop/DialogBackdrop.js +3 -1
  112. package/lib/dialog/backdrop/DialogBackdrop.js.map +1 -1
  113. package/lib/dialog/popup/DialogPopup.d.ts +9 -0
  114. package/lib/dialog/popup/DialogPopup.d.ts.map +1 -1
  115. package/lib/dialog/popup/DialogPopup.js +2 -2
  116. package/lib/dialog/popup/DialogPopup.js.map +1 -1
  117. package/lib/dialog/popup/useDialogPopupProps.d.ts +2 -0
  118. package/lib/dialog/popup/useDialogPopupProps.d.ts.map +1 -1
  119. package/lib/dialog/popup/useDialogPopupProps.js +4 -0
  120. package/lib/dialog/popup/useDialogPopupProps.js.map +1 -1
  121. package/lib/dialog/root/DialogNestingContext.d.ts +20 -0
  122. package/lib/dialog/root/DialogNestingContext.d.ts.map +1 -0
  123. package/lib/dialog/root/DialogNestingContext.js +53 -0
  124. package/lib/dialog/root/DialogNestingContext.js.map +1 -0
  125. package/lib/dialog/root/useRenderDialogRoot.d.ts.map +1 -1
  126. package/lib/dialog/root/useRenderDialogRoot.js +26 -2
  127. package/lib/dialog/root/useRenderDialogRoot.js.map +1 -1
  128. package/lib/dialog/store/DialogStore.d.ts +19 -2
  129. package/lib/dialog/store/DialogStore.d.ts.map +1 -1
  130. package/lib/dialog/store/DialogStore.js +14 -2
  131. package/lib/dialog/store/DialogStore.js.map +1 -1
  132. package/lib/drawer/index.parts.d.ts +1 -1
  133. package/lib/drawer/index.parts.d.ts.map +1 -1
  134. package/lib/drawer/index.parts.js.map +1 -1
  135. package/lib/drawer/popup/DrawerPopup.d.ts +9 -0
  136. package/lib/drawer/popup/DrawerPopup.d.ts.map +1 -1
  137. package/lib/drawer/popup/DrawerPopup.js +3 -1
  138. package/lib/drawer/popup/DrawerPopup.js.map +1 -1
  139. package/lib/filter/index.d.ts +2 -0
  140. package/lib/filter/index.d.ts.map +1 -0
  141. package/lib/filter/index.js +6 -0
  142. package/lib/filter/index.js.map +1 -0
  143. package/lib/filter/useFilter.d.ts +45 -0
  144. package/lib/filter/useFilter.d.ts.map +1 -0
  145. package/lib/filter/useFilter.js +96 -0
  146. package/lib/filter/useFilter.js.map +1 -0
  147. package/lib/index.d.ts +1 -0
  148. package/lib/index.d.ts.map +1 -1
  149. package/lib/index.js +1 -0
  150. package/lib/index.js.map +1 -1
  151. package/lib/internals/field/useFieldControlRegistration.d.ts +25 -6
  152. package/lib/internals/field/useFieldControlRegistration.d.ts.map +1 -1
  153. package/lib/internals/field/useFieldControlRegistration.js +93 -6
  154. package/lib/internals/field/useFieldControlRegistration.js.map +1 -1
  155. package/lib/menu/popup/MenuPopup.d.ts +10 -0
  156. package/lib/menu/popup/MenuPopup.d.ts.map +1 -1
  157. package/lib/menu/popup/MenuPopup.js +10 -1
  158. package/lib/menu/popup/MenuPopup.js.map +1 -1
  159. package/lib/menu/positioner/MenuPositioner.d.ts +10 -0
  160. package/lib/menu/positioner/MenuPositioner.d.ts.map +1 -1
  161. package/lib/menu/positioner/MenuPositioner.js +9 -1
  162. package/lib/menu/positioner/MenuPositioner.js.map +1 -1
  163. package/lib/menu/store/MenuStore.d.ts +11 -0
  164. package/lib/menu/store/MenuStore.d.ts.map +1 -1
  165. package/lib/menu/store/MenuStore.js +4 -0
  166. package/lib/menu/store/MenuStore.js.map +1 -1
  167. package/lib/menu/submenu-trigger/MenuSubmenuTrigger.d.ts.map +1 -1
  168. package/lib/menu/submenu-trigger/MenuSubmenuTrigger.js +3 -0
  169. package/lib/menu/submenu-trigger/MenuSubmenuTrigger.js.map +1 -1
  170. package/lib/menu/trigger/MenuTrigger.d.ts.map +1 -1
  171. package/lib/menu/trigger/MenuTrigger.js +4 -1
  172. package/lib/menu/trigger/MenuTrigger.js.map +1 -1
  173. package/lib/meter/indicator/MeterIndicator.d.ts +2 -1
  174. package/lib/meter/indicator/MeterIndicator.d.ts.map +1 -1
  175. package/lib/meter/indicator/MeterIndicator.js +1 -2
  176. package/lib/meter/indicator/MeterIndicator.js.map +1 -1
  177. package/lib/meter/label/MeterLabel.d.ts +2 -1
  178. package/lib/meter/label/MeterLabel.d.ts.map +1 -1
  179. package/lib/meter/label/MeterLabel.js +1 -2
  180. package/lib/meter/label/MeterLabel.js.map +1 -1
  181. package/lib/meter/root/MeterRoot.d.ts +21 -0
  182. package/lib/meter/root/MeterRoot.d.ts.map +1 -1
  183. package/lib/meter/root/MeterRoot.js +2 -2
  184. package/lib/meter/root/MeterRoot.js.map +1 -1
  185. package/lib/meter/root/MeterRootContext.d.ts +5 -0
  186. package/lib/meter/root/MeterRootContext.d.ts.map +1 -1
  187. package/lib/meter/root/MeterRootContext.js.map +1 -1
  188. package/lib/meter/track/MeterTrack.d.ts +2 -1
  189. package/lib/meter/track/MeterTrack.d.ts.map +1 -1
  190. package/lib/meter/track/MeterTrack.js +1 -2
  191. package/lib/meter/track/MeterTrack.js.map +1 -1
  192. package/lib/meter/value/MeterValue.d.ts +2 -1
  193. package/lib/meter/value/MeterValue.d.ts.map +1 -1
  194. package/lib/meter/value/MeterValue.js +1 -2
  195. package/lib/meter/value/MeterValue.js.map +1 -1
  196. package/lib/number-field/input/NumberFieldInput.d.ts.map +1 -1
  197. package/lib/number-field/input/NumberFieldInput.js +11 -2
  198. package/lib/number-field/input/NumberFieldInput.js.map +1 -1
  199. package/lib/number-field/root/NumberFieldRoot.d.ts.map +1 -1
  200. package/lib/number-field/root/NumberFieldRoot.js +5 -2
  201. package/lib/number-field/root/NumberFieldRoot.js.map +1 -1
  202. package/lib/otp-field/input/OTPFieldInput.d.ts.map +1 -1
  203. package/lib/otp-field/input/OTPFieldInput.js +4 -0
  204. package/lib/otp-field/input/OTPFieldInput.js.map +1 -1
  205. package/lib/otp-field/root/OTPFieldRoot.d.ts.map +1 -1
  206. package/lib/otp-field/root/OTPFieldRoot.js +20 -2
  207. package/lib/otp-field/root/OTPFieldRoot.js.map +1 -1
  208. package/lib/popover/popup/PopoverPopup.d.ts +10 -0
  209. package/lib/popover/popup/PopoverPopup.d.ts.map +1 -1
  210. package/lib/popover/popup/PopoverPopup.js +10 -1
  211. package/lib/popover/popup/PopoverPopup.js.map +1 -1
  212. package/lib/popover/positioner/PopoverPositioner.d.ts +10 -0
  213. package/lib/popover/positioner/PopoverPositioner.d.ts.map +1 -1
  214. package/lib/popover/positioner/PopoverPositioner.js +4 -0
  215. package/lib/popover/positioner/PopoverPositioner.js.map +1 -1
  216. package/lib/popover/store/PopoverStore.d.ts +11 -0
  217. package/lib/popover/store/PopoverStore.d.ts.map +1 -1
  218. package/lib/popover/store/PopoverStore.js +4 -0
  219. package/lib/popover/store/PopoverStore.js.map +1 -1
  220. package/lib/popover/trigger/PopoverTrigger.d.ts.map +1 -1
  221. package/lib/popover/trigger/PopoverTrigger.js +4 -1
  222. package/lib/popover/trigger/PopoverTrigger.js.map +1 -1
  223. package/lib/progress/root/ProgressRoot.d.ts +21 -0
  224. package/lib/progress/root/ProgressRoot.d.ts.map +1 -1
  225. package/lib/progress/root/ProgressRoot.js +1 -1
  226. package/lib/progress/root/ProgressRoot.js.map +1 -1
  227. package/lib/radio-group/RadioGroup.d.ts.map +1 -1
  228. package/lib/radio-group/RadioGroup.js +5 -2
  229. package/lib/radio-group/RadioGroup.js.map +1 -1
  230. package/lib/select/backdrop/SelectBackdrop.d.ts.map +1 -1
  231. package/lib/select/backdrop/SelectBackdrop.js +3 -0
  232. package/lib/select/backdrop/SelectBackdrop.js.map +1 -1
  233. package/lib/select/index.parts.d.ts +1 -0
  234. package/lib/select/index.parts.d.ts.map +1 -1
  235. package/lib/select/index.parts.js +4 -1
  236. package/lib/select/index.parts.js.map +1 -1
  237. package/lib/select/popup/SelectPopup.d.ts +8 -0
  238. package/lib/select/popup/SelectPopup.d.ts.map +1 -1
  239. package/lib/select/popup/SelectPopup.js +10 -1
  240. package/lib/select/popup/SelectPopup.js.map +1 -1
  241. package/lib/select/positioner/SelectPositioner.d.ts +9 -0
  242. package/lib/select/positioner/SelectPositioner.d.ts.map +1 -1
  243. package/lib/select/positioner/SelectPositioner.js +9 -1
  244. package/lib/select/positioner/SelectPositioner.js.map +1 -1
  245. package/lib/select/root/SelectRoot.d.ts +45 -4
  246. package/lib/select/root/SelectRoot.d.ts.map +1 -1
  247. package/lib/select/root/SelectRoot.js +43 -5
  248. package/lib/select/root/SelectRoot.js.map +1 -1
  249. package/lib/select/store/SelectHandle.d.ts +42 -0
  250. package/lib/select/store/SelectHandle.d.ts.map +1 -0
  251. package/lib/select/store/SelectHandle.js +69 -0
  252. package/lib/select/store/SelectHandle.js.map +1 -0
  253. package/lib/select/store/SelectStore.d.ts +33 -0
  254. package/lib/select/store/SelectStore.d.ts.map +1 -1
  255. package/lib/select/store/SelectStore.js +17 -1
  256. package/lib/select/store/SelectStore.js.map +1 -1
  257. package/lib/select/trigger/SelectTrigger.d.ts +18 -3
  258. package/lib/select/trigger/SelectTrigger.d.ts.map +1 -1
  259. package/lib/select/trigger/SelectTrigger.js +51 -4
  260. package/lib/select/trigger/SelectTrigger.js.map +1 -1
  261. package/lib/slider/root/SliderRoot.d.ts.map +1 -1
  262. package/lib/slider/root/SliderRoot.js +9 -1
  263. package/lib/slider/root/SliderRoot.js.map +1 -1
  264. package/lib/slider/thumb/SliderThumb.d.ts.map +1 -1
  265. package/lib/slider/thumb/SliderThumb.js +10 -2
  266. package/lib/slider/thumb/SliderThumb.js.map +1 -1
  267. package/lib/switch/root/SwitchRoot.d.ts.map +1 -1
  268. package/lib/switch/root/SwitchRoot.js +6 -2
  269. package/lib/switch/root/SwitchRoot.js.map +1 -1
  270. package/lib/tabs/tab/TabsTab.d.ts +2 -10
  271. package/lib/tabs/tab/TabsTab.d.ts.map +1 -1
  272. package/lib/tooltip/popup/TooltipPopup.d.ts +10 -0
  273. package/lib/tooltip/popup/TooltipPopup.d.ts.map +1 -1
  274. package/lib/tooltip/popup/TooltipPopup.js +10 -1
  275. package/lib/tooltip/popup/TooltipPopup.js.map +1 -1
  276. package/lib/tooltip/positioner/TooltipPositioner.d.ts +10 -0
  277. package/lib/tooltip/positioner/TooltipPositioner.d.ts.map +1 -1
  278. package/lib/tooltip/positioner/TooltipPositioner.js +4 -0
  279. package/lib/tooltip/positioner/TooltipPositioner.js.map +1 -1
  280. package/lib/tooltip/store/TooltipStore.d.ts +11 -0
  281. package/lib/tooltip/store/TooltipStore.d.ts.map +1 -1
  282. package/lib/tooltip/store/TooltipStore.js +11 -1
  283. package/lib/tooltip/store/TooltipStore.js.map +1 -1
  284. package/lib/tooltip/trigger/TooltipTrigger.d.ts.map +1 -1
  285. package/lib/tooltip/trigger/TooltipTrigger.js +4 -1
  286. package/lib/tooltip/trigger/TooltipTrigger.js.map +1 -1
  287. package/package.json +1 -1
  288. package/src/alert-dialog/index.parts.ts +1 -1
  289. package/src/autocomplete/handle.ts +18 -0
  290. package/src/autocomplete/index.parts.ts +1 -0
  291. package/src/autocomplete/index.ts +1 -0
  292. package/src/autocomplete/root/AutocompleteRoot.tsx +65 -50
  293. package/src/avatar/fallback/AvatarFallback.tsx +3 -1
  294. package/src/avatar/image/AvatarImage.tsx +5 -0
  295. package/src/checkbox/root/CheckboxRoot.tsx +7 -2
  296. package/src/combobox/backdrop/ComboboxBackdrop.tsx +10 -2
  297. package/src/combobox/empty/ComboboxEmpty.tsx +5 -1
  298. package/src/combobox/index.parts.ts +1 -0
  299. package/src/combobox/index.ts +2 -0
  300. package/src/combobox/input/ComboboxInput.tsx +118 -23
  301. package/src/combobox/item/ComboboxItem.tsx +24 -5
  302. package/src/combobox/list/ComboboxList.tsx +7 -2
  303. package/src/combobox/popup/ComboboxPopup.tsx +44 -2
  304. package/src/combobox/portal/ComboboxPortal.tsx +19 -13
  305. package/src/combobox/portal/ComboboxPortalContext.ts +15 -0
  306. package/src/combobox/positioner/ComboboxPositioner.tsx +52 -7
  307. package/src/combobox/positioner/ComboboxPositionerContext.ts +23 -0
  308. package/src/combobox/root/ComboboxItemsContext.ts +32 -0
  309. package/src/combobox/root/ComboboxRoot.tsx +94 -56
  310. package/src/combobox/root/ComboboxRootContext.ts +3 -43
  311. package/src/combobox/root/ComboboxTransitionContext.ts +15 -0
  312. package/src/combobox/root/useRenderComboboxRoot.tsx +189 -0
  313. package/src/combobox/store/ComboboxHandle.ts +64 -0
  314. package/src/combobox/store/ComboboxStore.ts +249 -0
  315. package/src/combobox/value/ComboboxValue.tsx +2 -1
  316. package/src/context-menu/positioner/ContextMenuPositioner.tsx +90 -10
  317. package/src/context-menu/root/ContextMenuRoot.tsx +8 -0
  318. package/src/dialog/backdrop/DialogBackdrop.tsx +12 -1
  319. package/src/dialog/popup/DialogPopup.tsx +11 -2
  320. package/src/dialog/popup/useDialogPopupProps.ts +4 -0
  321. package/src/dialog/root/DialogNestingContext.ts +27 -0
  322. package/src/dialog/root/useRenderDialogRoot.tsx +37 -2
  323. package/src/dialog/store/DialogStore.ts +24 -2
  324. package/src/drawer/index.parts.ts +1 -1
  325. package/src/drawer/popup/DrawerPopup.tsx +12 -1
  326. package/src/filter/index.ts +5 -0
  327. package/src/filter/useFilter.ts +95 -0
  328. package/src/index.ts +1 -0
  329. package/src/internals/field/useFieldControlRegistration.ts +86 -6
  330. package/src/menu/popup/MenuPopup.tsx +20 -1
  331. package/src/menu/positioner/MenuPositioner.tsx +19 -1
  332. package/src/menu/store/MenuStore.ts +13 -0
  333. package/src/menu/submenu-trigger/MenuSubmenuTrigger.tsx +3 -0
  334. package/src/menu/trigger/MenuTrigger.tsx +5 -2
  335. package/src/meter/indicator/MeterIndicator.tsx +3 -4
  336. package/src/meter/label/MeterLabel.tsx +3 -4
  337. package/src/meter/root/MeterRoot.tsx +29 -4
  338. package/src/meter/root/MeterRootContext.ts +5 -0
  339. package/src/meter/track/MeterTrack.tsx +3 -4
  340. package/src/meter/value/MeterValue.tsx +3 -4
  341. package/src/number-field/input/NumberFieldInput.tsx +11 -2
  342. package/src/number-field/root/NumberFieldRoot.tsx +4 -2
  343. package/src/otp-field/input/OTPFieldInput.tsx +4 -0
  344. package/src/otp-field/root/OTPFieldRoot.tsx +22 -2
  345. package/src/popover/popup/PopoverPopup.tsx +20 -1
  346. package/src/popover/positioner/PopoverPositioner.tsx +14 -0
  347. package/src/popover/store/PopoverStore.ts +13 -0
  348. package/src/popover/trigger/PopoverTrigger.tsx +5 -2
  349. package/src/progress/root/ProgressRoot.tsx +25 -1
  350. package/src/radio-group/RadioGroup.tsx +5 -2
  351. package/src/select/backdrop/SelectBackdrop.tsx +4 -0
  352. package/src/select/index.parts.ts +1 -0
  353. package/src/select/popup/SelectPopup.tsx +18 -1
  354. package/src/select/positioner/SelectPositioner.tsx +18 -1
  355. package/src/select/root/SelectRoot.tsx +109 -9
  356. package/src/select/store/SelectHandle.ts +68 -0
  357. package/src/select/store/SelectStore.ts +44 -1
  358. package/src/select/trigger/SelectTrigger.tsx +81 -8
  359. package/src/slider/root/SliderRoot.tsx +11 -1
  360. package/src/slider/thumb/SliderThumb.tsx +10 -1
  361. package/src/switch/root/SwitchRoot.tsx +5 -2
  362. package/src/tabs/tab/TabsTab.tsx +2 -10
  363. package/src/tooltip/popup/TooltipPopup.tsx +20 -1
  364. package/src/tooltip/positioner/TooltipPositioner.tsx +14 -0
  365. package/src/tooltip/store/TooltipStore.ts +20 -1
  366. package/src/tooltip/trigger/TooltipTrigger.tsx +5 -2
  367. package/lib/combobox/root/useComboboxRoot.d.ts +0 -29
  368. package/lib/combobox/root/useComboboxRoot.d.ts.map +0 -1
  369. package/lib/combobox/root/useComboboxRoot.js +0 -168
  370. package/lib/combobox/root/useComboboxRoot.js.map +0 -1
  371. package/lib/utils/fastObjectShallowCompare.d.ts +0 -2
  372. package/lib/utils/fastObjectShallowCompare.d.ts.map +0 -1
  373. package/lib/utils/fastObjectShallowCompare.js +0 -29
  374. package/lib/utils/fastObjectShallowCompare.js.map +0 -1
  375. package/lib/utils/mergeObjects.d.ts +0 -2
  376. package/lib/utils/mergeObjects.d.ts.map +0 -1
  377. package/lib/utils/mergeObjects.js +0 -16
  378. package/lib/utils/mergeObjects.js.map +0 -1
  379. package/src/combobox/root/useComboboxRoot.ts +0 -190
  380. package/src/utils/fastObjectShallowCompare.ts +0 -30
  381. package/src/utils/mergeObjects.ts +0 -15
@@ -1,5 +1,6 @@
1
1
  import { createSelector } from '../../store/createSelector';
2
2
  import { ReactStore } from '../../store/ReactStore';
3
+ import { PopupTriggerMap } from '../../utils/popups/PopupTriggerMap';
3
4
  import type { SelectRoot } from '../root/SelectRoot';
4
5
 
5
6
  /**
@@ -101,6 +102,7 @@ export type State = {
101
102
  disabled: boolean;
102
103
  readOnly: boolean;
103
104
  required: boolean;
105
+ disablePointerDismissal: boolean;
104
106
  /**
105
107
  * The anchor's native node, carried across the portal boundary.
106
108
  */
@@ -111,11 +113,37 @@ export type State = {
111
113
  */
112
114
  labelId: string | undefined;
113
115
  update: (() => void) | undefined;
116
+ /**
117
+ * The trigger's measured width, used to size the popup.
118
+ */
119
+ triggerWidth: number | undefined;
120
+ /**
121
+ * The trigger's measured height.
122
+ */
123
+ triggerHeight: number | undefined;
124
+ /**
125
+ * The payload of the trigger the select was opened by, handed to the root's
126
+ * children when they are a function.
127
+ */
128
+ payload: unknown;
129
+ /**
130
+ * The id of the trigger the select is associated with, or `null` for none.
131
+ */
132
+ triggerId: string | null;
133
+ /**
134
+ * The controlled `triggerId` prop, when provided.
135
+ */
136
+ triggerIdProp: string | null | undefined;
114
137
  };
115
138
 
116
139
  type Context = {
117
140
  onValueChange: ((value: any, eventDetails: SelectRoot.ChangeEventDetails) => void) | undefined;
118
141
  onOpenChange: ((open: boolean, eventDetails: SelectRoot.ChangeEventDetails) => void) | undefined;
142
+ /**
143
+ * Every trigger bound to this select, by id. A handle resolves `open(id)`
144
+ * through this, which is what lets a trigger rendered outside the root open it.
145
+ */
146
+ triggerNodes: PopupTriggerMap;
119
147
  };
120
148
 
121
149
  const selectors = {
@@ -132,6 +160,11 @@ const selectors = {
132
160
  triggerNode: createSelector((state: State) => state.triggerNode),
133
161
  labelId: createSelector((state: State) => state.labelId),
134
162
  update: createSelector((state: State) => state.update),
163
+ triggerWidth: createSelector((state: State) => state.triggerWidth),
164
+ triggerHeight: createSelector((state: State) => state.triggerHeight),
165
+ disablePointerDismissal: createSelector((state: State) => state.disablePointerDismissal),
166
+ payload: createSelector((state: State) => state.payload),
167
+ triggerId: createSelector((state: State) => state.triggerIdProp ?? state.triggerId),
135
168
  };
136
169
 
137
170
  export class SelectStore extends ReactStore<Readonly<State>, Context, typeof selectors> {
@@ -148,12 +181,22 @@ export class SelectStore extends ReactStore<Readonly<State>, Context, typeof sel
148
181
  disabled: false,
149
182
  readOnly: false,
150
183
  required: false,
184
+ disablePointerDismissal: false,
151
185
  triggerNode: null,
152
186
  labelId: undefined,
153
187
  update: undefined,
188
+ triggerWidth: undefined,
189
+ triggerHeight: undefined,
190
+ payload: undefined,
191
+ triggerId: null,
192
+ triggerIdProp: undefined,
154
193
  ...initialState,
155
194
  },
156
- { onValueChange: undefined, onOpenChange: undefined },
195
+ {
196
+ onValueChange: undefined,
197
+ onOpenChange: undefined,
198
+ triggerNodes: new PopupTriggerMap(),
199
+ },
157
200
  selectors,
158
201
  );
159
202
  }
@@ -1,10 +1,16 @@
1
1
  'use client';
2
2
  import * as React from 'react';
3
- import { Pressable, type GestureResponderEvent } from 'react-native';
4
- import { useSelectRootContext } from '../root/SelectRootContext';
3
+ import { Pressable, type GestureResponderEvent, type LayoutChangeEvent } from 'react-native';
4
+ import { SelectRootContext } from '../root/SelectRootContext';
5
5
  import { useRenderElement } from '../../use-render/useRenderElement';
6
6
  import { useButton } from '../../internals/use-button/useButton';
7
+ import { useFieldControlRegistration } from '../../internals/field/useFieldControlRegistration';
8
+ import { useId } from '../../hooks/useId';
9
+ import { useIsoLayoutEffect } from '../../hooks/useIsoLayoutEffect';
7
10
  import { useMergedRefs } from '../../hooks/useMergedRefs';
11
+ import { usePopupHandleStore } from '../../utils/popups/usePopupHandleStore';
12
+ import type { SelectHandle } from '../store/SelectHandle';
13
+ import type { SelectStore } from '../store/SelectStore';
8
14
  import type { ZestUIComponentProps } from '../../types';
9
15
  import { createChangeEventDetails } from '../../utils/createChangeEventDetails';
10
16
  import { REASONS } from '../../utils/reasons';
@@ -12,18 +18,42 @@ import { REASONS } from '../../utils/reasons';
12
18
  /**
13
19
  * A button that opens the select popup, and the element it is positioned against.
14
20
  * Renders a `<Pressable>`.
21
+ *
22
+ * Pass a `handle` to render a trigger outside of its `Select.Root`: there is no
23
+ * context reaching across, so the handle is what connects the two.
15
24
  */
16
- export function SelectTrigger(componentProps: SelectTrigger.Props) {
25
+ export function SelectTrigger<Payload = unknown>(componentProps: SelectTrigger.Props<Payload>) {
17
26
  const {
18
27
  render,
19
28
  className,
20
29
  style,
21
30
  disabled: disabledProp = false,
31
+ handle,
32
+ nativeID: idProp,
33
+ payload,
22
34
  ref,
23
35
  ...elementProps
24
36
  } = componentProps;
25
37
 
26
- const store = useSelectRootContext();
38
+ const rootStore = React.useContext(SelectRootContext);
39
+ const handleStore = usePopupHandleStore(handle);
40
+
41
+ // A trigger inside a root uses that root; a detached one follows its handle,
42
+ // which resolves to the attached root's store or to an inert fallback.
43
+ const store = (handleStore ?? rootStore) as SelectStore | undefined;
44
+
45
+ if (store === undefined) {
46
+ throw new Error(
47
+ 'Zest: Select.Trigger must be placed within <Select.Root>, or given a `handle` it shares with one.',
48
+ );
49
+ }
50
+
51
+ const id = useId(idProp ?? undefined);
52
+
53
+ // The trigger is the element assistive tech announces, so the field's label
54
+ // and messages attach here rather than to the root.
55
+ const { fieldProps } = useFieldControlRegistration();
56
+
27
57
  const open = store.useState('open');
28
58
  const rootDisabled = store.useState('disabled');
29
59
  const readOnly = store.useState('readOnly');
@@ -36,14 +66,31 @@ export function SelectTrigger(componentProps: SelectTrigger.Props) {
36
66
 
37
67
  const { getButtonProps } = useButton({ disabled });
38
68
 
69
+ const triggerRef = React.useRef<unknown>(null);
39
70
  const anchorRef = React.useCallback(
40
71
  (node: unknown) => {
72
+ triggerRef.current = node;
41
73
  store.set('triggerNode', node);
42
74
  },
43
75
  [store],
44
76
  );
45
77
  const mergedRef = useMergedRefs(ref, anchorRef);
46
78
 
79
+ // Registering into whichever store is current is what lets a handle resolve
80
+ // `open(id)`. The effect re-runs when the handle swaps stores, migrating the
81
+ // registration to the root that just attached.
82
+ useIsoLayoutEffect(() => {
83
+ if (id === undefined) {
84
+ return undefined;
85
+ }
86
+
87
+ store.context.triggerNodes.add(id, triggerRef.current);
88
+
89
+ return () => {
90
+ store.context.triggerNodes.delete(id);
91
+ };
92
+ }, [store, id]);
93
+
47
94
  const state: SelectTriggerState = { disabled, open, pressed, readOnly, required };
48
95
 
49
96
  return useRenderElement(Pressable, componentProps, {
@@ -51,11 +98,19 @@ export function SelectTrigger(componentProps: SelectTrigger.Props) {
51
98
  ref: mergedRef,
52
99
  props: [
53
100
  {
101
+ nativeID: id,
54
102
  onPress(event: GestureResponderEvent) {
55
103
  if (readOnly) {
56
104
  return;
57
105
  }
58
106
 
107
+ if (payload !== undefined) {
108
+ store.set('payload', payload);
109
+ }
110
+ if (id !== undefined) {
111
+ store.set('triggerId', id);
112
+ }
113
+
59
114
  store.setOpen(!open, createChangeEventDetails(REASONS.triggerPress, event));
60
115
  },
61
116
  onPressIn() {
@@ -64,15 +119,22 @@ export function SelectTrigger(componentProps: SelectTrigger.Props) {
64
119
  onPressOut() {
65
120
  setPressed(false);
66
121
  },
67
- onLayout() {
122
+ onLayout(event: LayoutChangeEvent) {
123
+ const { width, height } = event.nativeEvent.layout;
124
+ store.set('triggerWidth', width);
125
+ store.set('triggerHeight', height);
68
126
  store.state.update?.();
69
127
  },
70
128
  accessibilityRole: 'combobox' as const,
71
- accessibilityLabelledBy: labelId,
72
129
  accessibilityState: { expanded: open, disabled: disabled || undefined },
73
130
  'aria-haspopup': 'listbox' as const,
74
131
  'aria-readonly': readOnly || undefined,
75
132
  'aria-required': required || undefined,
133
+ ...fieldProps,
134
+ // A surrounding `Field.Label` names the control; `Select.Label` is the
135
+ // fallback for a select that stands on its own.
136
+ accessibilityLabelledBy: fieldProps.accessibilityLabelledBy ?? labelId,
137
+ 'aria-labelledby': fieldProps['aria-labelledby'] ?? labelId,
76
138
  },
77
139
  elementProps,
78
140
  getButtonProps,
@@ -88,16 +150,27 @@ export interface SelectTriggerState {
88
150
  required: boolean;
89
151
  }
90
152
 
91
- export interface SelectTriggerProps
153
+ export interface SelectTriggerProps<Payload = unknown>
92
154
  extends ZestUIComponentProps<typeof Pressable, SelectTriggerState> {
93
155
  /**
94
156
  * Whether the component should ignore user interaction.
95
157
  * @default false
96
158
  */
97
159
  disabled?: boolean | undefined;
160
+ /**
161
+ * A handle shared with a `Select.Root`, which is what lets this trigger live
162
+ * outside of it. Create one with `Select.createHandle()`.
163
+ *
164
+ * The trigger's `nativeID` is the id a handle's `open(triggerId)` resolves.
165
+ */
166
+ handle?: SelectHandle<Payload> | undefined;
167
+ /**
168
+ * A payload handed to the root's children when they are a function.
169
+ */
170
+ payload?: Payload | undefined;
98
171
  }
99
172
 
100
173
  export namespace SelectTrigger {
101
174
  export type State = SelectTriggerState;
102
- export type Props = SelectTriggerProps;
175
+ export type Props<TPayload = unknown> = SelectTriggerProps<TPayload>;
103
176
  }
@@ -5,6 +5,7 @@ import { useControlled } from '../../hooks/useControlled';
5
5
  import { useIsoLayoutEffect } from '../../hooks/useIsoLayoutEffect';
6
6
  import { useStableCallback } from '../../hooks/useStableCallback';
7
7
  import { useRenderElement } from '../../use-render/useRenderElement';
8
+ import { useFieldControlRegistration } from '../../internals/field/useFieldControlRegistration';
8
9
  import { clamp } from '../../utils/clamp';
9
10
  import type { ZestUIComponentProps, Orientation } from '../../types';
10
11
  import type { ZestChangeEventDetails } from '../../utils/createChangeEventDetails';
@@ -24,7 +25,7 @@ export function SliderRoot<Value extends number | readonly number[] = number>(
24
25
  const {
25
26
  className,
26
27
  defaultValue,
27
- disabled = false,
28
+ disabled: disabledProp = false,
28
29
  format,
29
30
  locale,
30
31
  max = 100,
@@ -41,6 +42,12 @@ export function SliderRoot<Value extends number | readonly number[] = number>(
41
42
  ...elementProps
42
43
  } = componentProps;
43
44
 
45
+ const { fieldDisabled, markChanged, markTouched } = useFieldControlRegistration({
46
+ initialValue: defaultValue ?? value,
47
+ });
48
+
49
+ const disabled = disabledProp || fieldDisabled;
50
+
44
51
  // A range slider is just a slider whose value is an array; remember which
45
52
  // shape the consumer used so callbacks hand back the same one.
46
53
  const isRange = Array.isArray(value ?? defaultValue);
@@ -123,6 +130,7 @@ export function SliderRoot<Value extends number | readonly number[] = number>(
123
130
 
124
131
  valuesRef.current = nextValues;
125
132
  setValuesState(nextValues);
133
+ markChanged(fromArray(nextValues, isRange));
126
134
  },
127
135
  );
128
136
 
@@ -154,6 +162,8 @@ export function SliderRoot<Value extends number | readonly number[] = number>(
154
162
 
155
163
  const commitValue = useStableCallback((eventDetails: SliderRoot.ChangeEventDetails) => {
156
164
  onValueCommitted?.(fromArray(valuesRef.current, isRange) as Value, eventDetails);
165
+ // Releasing the thumb is the end of the interaction — a slider's blur.
166
+ markTouched(fromArray(valuesRef.current, isRange));
157
167
  });
158
168
 
159
169
  const state: SliderRootState = React.useMemo(
@@ -2,6 +2,7 @@
2
2
  import { View } from 'react-native';
3
3
  import { useSliderRootContext } from '../root/SliderRootContext';
4
4
  import { useRenderElement } from '../../use-render/useRenderElement';
5
+ import { useFieldControlRegistration } from '../../internals/field/useFieldControlRegistration';
5
6
  import { formatNumber } from '../../utils/formatNumber';
6
7
  import type { SliderRootState } from '../root/SliderRoot';
7
8
  import type { ZestUIComponentProps } from '../../types';
@@ -20,6 +21,10 @@ export function SliderThumb(componentProps: SliderThumb.Props) {
20
21
  const { disabled, format, labelId, locale, max, min, orientation, state, values } =
21
22
  useSliderRootContext();
22
23
 
24
+ // The thumb is what assistive tech announces and adjusts, so a surrounding
25
+ // field's label and messages attach here rather than to the root.
26
+ const { fieldProps } = useFieldControlRegistration();
27
+
23
28
  const value = values[index] ?? min;
24
29
  const percent = max === min ? 0 : ((value - min) / (max - min)) * 100;
25
30
 
@@ -37,7 +42,6 @@ export function SliderThumb(componentProps: SliderThumb.Props) {
37
42
  {
38
43
  style: positionStyle,
39
44
  accessibilityRole: 'adjustable' as const,
40
- accessibilityLabelledBy: labelId,
41
45
  accessibilityState: { disabled: disabled || undefined },
42
46
  accessibilityValue: {
43
47
  min,
@@ -46,6 +50,11 @@ export function SliderThumb(componentProps: SliderThumb.Props) {
46
50
  text: formatValue(value, format, locale),
47
51
  },
48
52
  'aria-orientation': orientation,
53
+ ...fieldProps,
54
+ // A surrounding `Field.Label` names the control; `Slider.Label` is the
55
+ // fallback for a slider that stands on its own.
56
+ accessibilityLabelledBy: fieldProps.accessibilityLabelledBy ?? labelId,
57
+ 'aria-labelledby': fieldProps['aria-labelledby'] ?? labelId,
49
58
  },
50
59
  elementProps,
51
60
  ],
@@ -35,7 +35,9 @@ export function SwitchRoot(componentProps: SwitchRoot.Props) {
35
35
  ...elementProps
36
36
  } = componentProps;
37
37
 
38
- const { fieldDisabled, fieldProps, validateField } = useFieldControlRegistration();
38
+ const { fieldDisabled, fieldProps, markChanged, markTouched } = useFieldControlRegistration({
39
+ initialValue: defaultChecked ?? checkedProp ?? false,
40
+ });
39
41
 
40
42
  const disabled = disabledProp || fieldDisabled;
41
43
 
@@ -78,7 +80,8 @@ export function SwitchRoot(componentProps: SwitchRoot.Props) {
78
80
  }
79
81
 
80
82
  setCheckedState(nextChecked);
81
- validateField(nextChecked);
83
+ markChanged(nextChecked);
84
+ markTouched(nextChecked);
82
85
  },
83
86
  accessibilityRole: 'switch' as const,
84
87
  accessibilityState: {
@@ -7,7 +7,7 @@ import { useButton } from '../../internals/use-button/useButton';
7
7
  import { useCompositeListItem } from '../../internals/composite/list/useCompositeListItem';
8
8
  import type { CompositeItemLayout } from '../../internals/composite/list/CompositeListContext';
9
9
  import { useTabsRootContext } from '../root/TabsRootContext';
10
- import type { TabsRoot } from '../root/TabsRoot';
10
+ import type { TabsRoot, TabsRootState } from '../root/TabsRoot';
11
11
  import type { ZestUIComponentProps } from '../../types';
12
12
  import { createChangeEventDetails } from '../../utils/createChangeEventDetails';
13
13
  import { REASONS } from '../../utils/reasons';
@@ -106,7 +106,7 @@ export interface TabsTabMetadata {
106
106
  layout?: CompositeItemLayout | undefined;
107
107
  }
108
108
 
109
- export interface TabsTabState {
109
+ export interface TabsTabState extends TabsRootState {
110
110
  /**
111
111
  * Whether the component should ignore user interaction.
112
112
  */
@@ -115,14 +115,6 @@ export interface TabsTabState {
115
115
  * Whether the component is active.
116
116
  */
117
117
  active: boolean;
118
- /**
119
- * The component orientation.
120
- */
121
- orientation: TabsRoot.Orientation;
122
- /**
123
- * The direction used for tab activation.
124
- */
125
- tabActivationDirection: TabsTab.ActivationDirection;
126
118
  /**
127
119
  * Whether the tab is currently pressed.
128
120
  */
@@ -20,8 +20,17 @@ export function TooltipPopup(componentProps: TooltipPopup.Props) {
20
20
  const { transitionStatus } = useTooltipTransitionContext() ?? { transitionStatus: undefined };
21
21
 
22
22
  const open = store.useState('open');
23
+ const triggerWidth = store.useState('triggerWidth');
24
+ const triggerHeight = store.useState('triggerHeight');
23
25
 
24
- const state: TooltipPopupState = { open, transitionStatus, side, align };
26
+ const state: TooltipPopupState = {
27
+ open,
28
+ transitionStatus,
29
+ side,
30
+ align,
31
+ triggerWidth,
32
+ triggerHeight,
33
+ };
25
34
 
26
35
  return useRenderElement(View, componentProps, {
27
36
  state,
@@ -57,6 +66,16 @@ export interface TooltipPopupState {
57
66
  * The alignment the popup was actually placed with.
58
67
  */
59
68
  align: Align;
69
+ /**
70
+ * The trigger's measured width, available for consumers to size the popup
71
+ * against its anchor. This is the React Native equivalent of the web's
72
+ * `--anchor-width` CSS variable.
73
+ */
74
+ triggerWidth: number | undefined;
75
+ /**
76
+ * The trigger's measured height.
77
+ */
78
+ triggerHeight: number | undefined;
60
79
  }
61
80
 
62
81
  export interface TooltipPopupProps extends ZestUIComponentProps<typeof View, TooltipPopupState> {}
@@ -38,6 +38,8 @@ export function TooltipPositioner(componentProps: TooltipPositioner.Props) {
38
38
  useTooltipPortalContext();
39
39
  const store = useTooltipRootContext();
40
40
  const open = store.useState('open');
41
+ const triggerWidth = store.useState('triggerWidth');
42
+ const triggerHeight = store.useState('triggerHeight');
41
43
  const triggerNode = store.useState('triggerNode');
42
44
 
43
45
  const positioning = useAnchorPositioning({
@@ -69,6 +71,8 @@ export function TooltipPositioner(componentProps: TooltipPositioner.Props) {
69
71
  open,
70
72
  side: positioning.side,
71
73
  align: positioning.align,
74
+ triggerWidth,
75
+ triggerHeight,
72
76
  };
73
77
 
74
78
  const contextValue: TooltipPositionerContext = React.useMemo(
@@ -101,6 +105,16 @@ export interface TooltipPositionerState {
101
105
  open: boolean;
102
106
  side: Side;
103
107
  align: Align;
108
+ /**
109
+ * The trigger's measured width, available for consumers to size the popup
110
+ * against its anchor. This is the React Native equivalent of the web's
111
+ * `--anchor-width` CSS variable.
112
+ */
113
+ triggerWidth: number | undefined;
114
+ /**
115
+ * The trigger's measured height.
116
+ */
117
+ triggerHeight: number | undefined;
104
118
  }
105
119
 
106
120
  export interface TooltipPositionerProps
@@ -9,6 +9,15 @@ export type State = {
9
9
  * The anchor's native node, carried across the portal boundary.
10
10
  */
11
11
  triggerNode: unknown;
12
+ /**
13
+ * The trigger's measured width, the React Native counterpart of the web's
14
+ * `--anchor-width` CSS variable.
15
+ */
16
+ triggerWidth: number | undefined;
17
+ /**
18
+ * The trigger's measured height.
19
+ */
20
+ triggerHeight: number | undefined;
12
21
  update: (() => void) | undefined;
13
22
  };
14
23
 
@@ -19,13 +28,23 @@ type Context = {
19
28
  const selectors = {
20
29
  open: createSelector((state: State) => state.openProp ?? state.open),
21
30
  triggerNode: createSelector((state: State) => state.triggerNode),
31
+ triggerWidth: createSelector((state: State) => state.triggerWidth),
32
+ triggerHeight: createSelector((state: State) => state.triggerHeight),
22
33
  update: createSelector((state: State) => state.update),
23
34
  };
24
35
 
25
36
  export class TooltipStore extends ReactStore<Readonly<State>, Context, typeof selectors> {
26
37
  constructor(initialState?: Partial<State>) {
27
38
  super(
28
- { open: false, openProp: undefined, triggerNode: null, update: undefined, ...initialState },
39
+ {
40
+ open: false,
41
+ openProp: undefined,
42
+ triggerNode: null,
43
+ triggerWidth: undefined,
44
+ triggerHeight: undefined,
45
+ update: undefined,
46
+ ...initialState,
47
+ },
29
48
  { onOpenChange: undefined },
30
49
  selectors,
31
50
  );
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import * as React from 'react';
3
- import { Pressable, type GestureResponderEvent } from 'react-native';
3
+ import { Pressable, type GestureResponderEvent, type LayoutChangeEvent } from 'react-native';
4
4
  import { useTooltipRootContext } from '../root/TooltipRootContext';
5
5
  import { useRenderElement } from '../../use-render/useRenderElement';
6
6
  import { useMergedRefs } from '../../hooks/useMergedRefs';
@@ -61,7 +61,10 @@ export function TooltipTrigger(componentProps: TooltipTrigger.Props) {
61
61
  onPressOut() {
62
62
  setPressed(false);
63
63
  },
64
- onLayout() {
64
+ onLayout(event: LayoutChangeEvent) {
65
+ const { width, height } = event.nativeEvent.layout;
66
+ store.set('triggerWidth', width);
67
+ store.set('triggerHeight', height);
65
68
  store.state.update?.();
66
69
  },
67
70
  accessibilityState: { expanded: open, disabled: disabled || undefined },
@@ -1,29 +0,0 @@
1
- import type { ZestNativeEvent } from '../../utils/createChangeEventDetails';
2
- import { ComboboxRootContext, type ComboboxItem } from './ComboboxRootContext';
3
- export type ComboboxItems = ReadonlyArray<string | {
4
- value: unknown;
5
- label: string;
6
- }>;
7
- export interface UseComboboxRootParameters {
8
- mode: 'combobox' | 'autocomplete';
9
- items: ComboboxItems | undefined;
10
- value?: unknown;
11
- defaultValue?: unknown;
12
- onValueChange?: ((value: unknown) => void) | undefined;
13
- inputValue?: string | undefined;
14
- defaultInputValue?: string | undefined;
15
- onInputValueChange?: ((value: string) => void) | undefined;
16
- open?: boolean | undefined;
17
- defaultOpen?: boolean | undefined;
18
- onOpenChange?: ((open: boolean, event?: ZestNativeEvent) => void) | undefined;
19
- openOnFocus?: boolean | undefined;
20
- filter?: ((item: ComboboxItem, query: string) => boolean) | undefined;
21
- disabled: boolean;
22
- }
23
- /**
24
- * The state behind `Combobox.Root` and `Autocomplete.Root`: the resolved item
25
- * list, the filtered view of it, the input text, the selection, and the open
26
- * state — plus the anchor plumbing the popup needs.
27
- */
28
- export declare function useComboboxRoot(parameters: UseComboboxRootParameters): ComboboxRootContext;
29
- //# sourceMappingURL=useComboboxRoot.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useComboboxRoot.d.ts","sourceRoot":"","sources":["../../../src/combobox/root/useComboboxRoot.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE/E,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAYtF,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC;IAClC,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACvD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9E,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;IACtE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAKD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,yBAAyB,GAAG,mBAAmB,CAgJ1F"}