@ahrowe/ui 0.33.0 → 0.35.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 (566) hide show
  1. package/README.md +101 -40
  2. package/dist/esm/common/accordion/accordion.mjs +1 -1
  3. package/dist/esm/common/accordion/accordion.mjs.map +1 -1
  4. package/dist/esm/common/accordion/accordion.module.mjs +1 -1
  5. package/dist/esm/common/accordion/accordion.module.mjs.map +1 -1
  6. package/dist/esm/common/accordion/accordion.plain.module.mjs +1 -1
  7. package/dist/esm/common/accordion/accordion.plain.module.mjs.map +1 -1
  8. package/dist/esm/common/accordion/accordion.primary.module.mjs +1 -1
  9. package/dist/esm/common/accordion/accordion.primary.module.mjs.map +1 -1
  10. package/dist/esm/common/accordion/accordion.types.mjs +1 -1
  11. package/dist/esm/common/accordion/accordion.types.mjs.map +1 -1
  12. package/dist/esm/common/actionButtons/actionButtons.mjs +1 -1
  13. package/dist/esm/common/actionButtons/actionButtons.mjs.map +1 -1
  14. package/dist/esm/common/actionButtons/actionButtons.module.mjs +1 -1
  15. package/dist/esm/common/actionIcon/actionIcon.mjs +1 -1
  16. package/dist/esm/common/actionIcon/actionIcon.mjs.map +1 -1
  17. package/dist/esm/common/actionIcon/actionIcon.module.mjs +1 -1
  18. package/dist/esm/common/actionIcon/actionIcon.module.mjs.map +1 -1
  19. package/dist/esm/common/alert/alert.mjs +1 -1
  20. package/dist/esm/common/alert/alert.mjs.map +1 -1
  21. package/dist/esm/common/alert/alert.module.mjs +1 -1
  22. package/dist/esm/common/alert/alert.types.mjs +1 -1
  23. package/dist/esm/common/alert/alert.types.mjs.map +1 -1
  24. package/dist/esm/common/animatedIcon/animatedIcon.mjs +1 -1
  25. package/dist/esm/common/animatedIcon/animatedIcon.mjs.map +1 -1
  26. package/dist/esm/common/animatedIcon/animatedIcon.module.mjs +1 -1
  27. package/dist/esm/common/animatedLogo/animatedLogo.mjs +1 -1
  28. package/dist/esm/common/animatedLogo/animatedLogo.mjs.map +1 -1
  29. package/dist/esm/common/animatedLogo/animatedLogo.module.mjs +1 -1
  30. package/dist/esm/common/animatedText/animatedText.mjs +1 -1
  31. package/dist/esm/common/animatedText/animatedText.mjs.map +1 -1
  32. package/dist/esm/common/animatedText/animatedText.module.mjs +1 -1
  33. package/dist/esm/common/animatedText/animatedText.types.mjs +1 -1
  34. package/dist/esm/common/animatedText/animatedText.types.mjs.map +1 -1
  35. package/dist/esm/common/avatar/avatar.mjs +1 -1
  36. package/dist/esm/common/avatar/avatar.mjs.map +1 -1
  37. package/dist/esm/common/avatar/avatar.module.mjs +1 -1
  38. package/dist/esm/common/avatar/avatarGroup.mjs +1 -1
  39. package/dist/esm/common/avatar/avatarGroup.mjs.map +1 -1
  40. package/dist/esm/common/badge/badge.mjs +1 -1
  41. package/dist/esm/common/badge/badge.mjs.map +1 -1
  42. package/dist/esm/common/badge/badge.module.mjs +1 -1
  43. package/dist/esm/common/badge/badge.types.mjs +1 -1
  44. package/dist/esm/common/badge/badge.types.mjs.map +1 -1
  45. package/dist/esm/common/bodyEnd/bodyEnd.mjs +1 -1
  46. package/dist/esm/common/bodyEnd/bodyEnd.mjs.map +1 -1
  47. package/dist/esm/common/breadcrumb/breadcrumb.mjs +1 -1
  48. package/dist/esm/common/breadcrumb/breadcrumb.mjs.map +1 -1
  49. package/dist/esm/common/breadcrumb/breadcrumb.module.mjs +1 -1
  50. package/dist/esm/common/breadcrumb/breadcrumb.module.mjs.map +1 -1
  51. package/dist/esm/common/button/button.mjs +1 -1
  52. package/dist/esm/common/button/button.mjs.map +1 -1
  53. package/dist/esm/common/button/button.module.mjs +1 -1
  54. package/dist/esm/common/button/button.types.mjs +1 -1
  55. package/dist/esm/common/button/button.types.mjs.map +1 -1
  56. package/dist/esm/common/buttonGroup/buttonGroup.mjs +1 -1
  57. package/dist/esm/common/buttonGroup/buttonGroup.mjs.map +1 -1
  58. package/dist/esm/common/buttonGroup/buttonGroup.module.mjs +1 -1
  59. package/dist/esm/common/buttonGroup/buttonGroup.types.mjs +1 -1
  60. package/dist/esm/common/buttonGroup/buttonGroup.types.mjs.map +1 -1
  61. package/dist/esm/common/card/Card.mjs +1 -1
  62. package/dist/esm/common/card/Card.mjs.map +1 -1
  63. package/dist/esm/common/card/CardActions.mjs +1 -1
  64. package/dist/esm/common/card/CardActions.mjs.map +1 -1
  65. package/dist/esm/common/card/CardContent.mjs +1 -1
  66. package/dist/esm/common/card/CardContent.mjs.map +1 -1
  67. package/dist/esm/common/card/CardHeader.mjs +1 -1
  68. package/dist/esm/common/card/CardHeader.mjs.map +1 -1
  69. package/dist/esm/common/card/CardMedia.mjs +1 -1
  70. package/dist/esm/common/card/CardMedia.mjs.map +1 -1
  71. package/dist/esm/common/card/card.module.mjs +1 -1
  72. package/dist/esm/common/card/card.module.mjs.map +1 -1
  73. package/dist/esm/common/card/card.types.mjs +1 -1
  74. package/dist/esm/common/card/card.types.mjs.map +1 -1
  75. package/dist/esm/common/carousel/carousel.mjs +1 -1
  76. package/dist/esm/common/carousel/carousel.mjs.map +1 -1
  77. package/dist/esm/common/carousel/carousel.module.mjs +1 -1
  78. package/dist/esm/common/checkbox/checkbox.mjs +1 -1
  79. package/dist/esm/common/checkbox/checkbox.mjs.map +1 -1
  80. package/dist/esm/common/checkbox/checkbox.module.mjs +1 -1
  81. package/dist/esm/common/checkbox/checkbox.module.mjs.map +1 -1
  82. package/dist/esm/common/chip/chip.mjs +1 -1
  83. package/dist/esm/common/chip/chip.mjs.map +1 -1
  84. package/dist/esm/common/chip/chip.module.mjs +1 -1
  85. package/dist/esm/common/chip/chip.types.mjs +1 -1
  86. package/dist/esm/common/chip/chip.types.mjs.map +1 -1
  87. package/dist/esm/common/chip/chipContainer.mjs +1 -1
  88. package/dist/esm/common/chip/chipContainer.mjs.map +1 -1
  89. package/dist/esm/common/colorPicker/colorPicker.mjs +1 -1
  90. package/dist/esm/common/colorPicker/colorPicker.mjs.map +1 -1
  91. package/dist/esm/common/colorPicker/colorPicker.module.mjs +1 -1
  92. package/dist/esm/common/colorPicker/colorPicker.module.mjs.map +1 -1
  93. package/dist/esm/common/colorPicker/toHex.mjs +1 -1
  94. package/dist/esm/common/colorPicker/toHex.mjs.map +1 -1
  95. package/dist/esm/common/configProvider/configProvider.mjs +1 -1
  96. package/dist/esm/common/configProvider/configProvider.mjs.map +1 -1
  97. package/dist/esm/common/configProvider/presentation.types.mjs +2 -0
  98. package/dist/esm/common/configProvider/presentation.types.mjs.map +1 -0
  99. package/dist/esm/common/configProvider/useComponentDefaults.mjs +1 -1
  100. package/dist/esm/common/configProvider/useComponentDefaults.mjs.map +1 -1
  101. package/dist/esm/common/configProvider/useLabels.mjs +1 -1
  102. package/dist/esm/common/configProvider/useLabels.mjs.map +1 -1
  103. package/dist/esm/common/configProvider/usePresentationDefault.mjs +1 -1
  104. package/dist/esm/common/configProvider/usePresentationDefault.mjs.map +1 -1
  105. package/dist/esm/common/confirmModal/confirmModal.mjs +1 -1
  106. package/dist/esm/common/confirmModal/confirmModal.mjs.map +1 -1
  107. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.mjs +1 -1
  108. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.mjs.map +1 -1
  109. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.module.mjs +1 -1
  110. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.module.mjs.map +1 -1
  111. package/dist/esm/common/datePicker/dateFunctions.mjs +1 -1
  112. package/dist/esm/common/datePicker/dateFunctions.mjs.map +1 -1
  113. package/dist/esm/common/datePicker/datePicker.mjs +1 -1
  114. package/dist/esm/common/datePicker/datePicker.mjs.map +1 -1
  115. package/dist/esm/common/datePicker/datePicker.module.mjs +1 -1
  116. package/dist/esm/common/divider/divider.mjs +1 -1
  117. package/dist/esm/common/divider/divider.mjs.map +1 -1
  118. package/dist/esm/common/divider/divider.module.mjs +1 -1
  119. package/dist/esm/common/divider/divider.types.mjs +1 -1
  120. package/dist/esm/common/divider/divider.types.mjs.map +1 -1
  121. package/dist/esm/common/drawer/drawer.mjs +1 -1
  122. package/dist/esm/common/drawer/drawer.mjs.map +1 -1
  123. package/dist/esm/common/drawer/drawer.module.mjs +1 -1
  124. package/dist/esm/common/dropZone/dropZone.mjs +1 -1
  125. package/dist/esm/common/dropZone/dropZone.mjs.map +1 -1
  126. package/dist/esm/common/dropZone/dropZone.module.mjs +1 -1
  127. package/dist/esm/common/dropZone/dropZone.types.mjs +1 -1
  128. package/dist/esm/common/dropZone/dropZone.types.mjs.map +1 -1
  129. package/dist/esm/common/dropdown/dropdown.mjs +1 -1
  130. package/dist/esm/common/dropdown/dropdown.mjs.map +1 -1
  131. package/dist/esm/common/dropdown/dropdown.module.mjs +1 -1
  132. package/dist/esm/common/dropdown/dropdown.module.mjs.map +1 -1
  133. package/dist/esm/common/emptyState/emptyState.mjs +1 -1
  134. package/dist/esm/common/emptyState/emptyState.mjs.map +1 -1
  135. package/dist/esm/common/emptyState/emptyState.module.mjs +1 -1
  136. package/dist/esm/common/errorBoundary/errorBoundary.mjs +1 -1
  137. package/dist/esm/common/errorBoundary/errorBoundary.mjs.map +1 -1
  138. package/dist/esm/common/errorBoundary/errorBoundary.module.mjs +1 -1
  139. package/dist/esm/common/fab/components/fabBase/fabBase.mjs +1 -1
  140. package/dist/esm/common/fab/components/fabBase/fabBase.mjs.map +1 -1
  141. package/dist/esm/common/fab/components/fabBase/fabBase.module.mjs +1 -1
  142. package/dist/esm/common/fab/fab.mjs +1 -1
  143. package/dist/esm/common/fab/fab.mjs.map +1 -1
  144. package/dist/esm/common/fab/fab.module.mjs +1 -1
  145. package/dist/esm/common/fab/fab.module.mjs.map +1 -1
  146. package/dist/esm/common/flip/flip.mjs +1 -1
  147. package/dist/esm/common/flip/flip.mjs.map +1 -1
  148. package/dist/esm/common/flip/flip.module.mjs +1 -1
  149. package/dist/esm/common/floorPlan/floorPlan.faces.mjs +1 -1
  150. package/dist/esm/common/floorPlan/floorPlan.faces.mjs.map +1 -1
  151. package/dist/esm/common/floorPlan/floorPlan.geometry.mjs +1 -1
  152. package/dist/esm/common/floorPlan/floorPlan.geometry.mjs.map +1 -1
  153. package/dist/esm/common/floorPlan/floorPlan.graph.mjs +1 -1
  154. package/dist/esm/common/floorPlan/floorPlan.graph.mjs.map +1 -1
  155. package/dist/esm/common/floorPlan/floorPlan.hit.mjs +1 -1
  156. package/dist/esm/common/floorPlan/floorPlan.hit.mjs.map +1 -1
  157. package/dist/esm/common/floorPlan/floorPlan.json.mjs +1 -1
  158. package/dist/esm/common/floorPlan/floorPlan.json.mjs.map +1 -1
  159. package/dist/esm/common/floorPlan/floorPlan.mesh.mjs +1 -1
  160. package/dist/esm/common/floorPlan/floorPlan.mesh.mjs.map +1 -1
  161. package/dist/esm/common/floorPlan/floorPlan.path.mjs +1 -1
  162. package/dist/esm/common/floorPlan/floorPlan.path.mjs.map +1 -1
  163. package/dist/esm/common/floorPlan/floorPlan.plan.mjs +1 -1
  164. package/dist/esm/common/floorPlan/floorPlan.plan.mjs.map +1 -1
  165. package/dist/esm/common/floorPlan/floorPlan.rooms.mjs +1 -1
  166. package/dist/esm/common/floorPlan/floorPlan.rooms.mjs.map +1 -1
  167. package/dist/esm/common/floorPlan/floorPlan.snap.mjs +1 -1
  168. package/dist/esm/common/floorPlan/floorPlan.snap.mjs.map +1 -1
  169. package/dist/esm/common/floorPlan/floorPlan.triangulate.mjs +1 -1
  170. package/dist/esm/common/floorPlan/floorPlan.triangulate.mjs.map +1 -1
  171. package/dist/esm/common/floorPlan/floorPlan.types.mjs +1 -1
  172. package/dist/esm/common/floorPlan/floorPlan.types.mjs.map +1 -1
  173. package/dist/esm/common/floorPlan/legacySvg.mjs +1 -1
  174. package/dist/esm/common/floorPlan/legacySvg.mjs.map +1 -1
  175. package/dist/esm/common/hooks/useAnchorTracking.mjs +1 -1
  176. package/dist/esm/common/hooks/useAnchorTracking.mjs.map +1 -1
  177. package/dist/esm/common/hooks/useCoarsePointer.mjs +1 -1
  178. package/dist/esm/common/hooks/useCoarsePointer.mjs.map +1 -1
  179. package/dist/esm/common/hooks/useFocusBoundary.mjs +1 -1
  180. package/dist/esm/common/hooks/useFocusBoundary.mjs.map +1 -1
  181. package/dist/esm/common/hooks/useMediaQuery.mjs +1 -1
  182. package/dist/esm/common/hooks/useMediaQuery.mjs.map +1 -1
  183. package/dist/esm/common/hooks/useOverlay.mjs +1 -1
  184. package/dist/esm/common/hooks/useOverlay.mjs.map +1 -1
  185. package/dist/esm/common/hooks/useSheet.mjs +1 -1
  186. package/dist/esm/common/hooks/useSheet.mjs.map +1 -1
  187. package/dist/esm/common/hooks/useSwipeDismiss.mjs +1 -1
  188. package/dist/esm/common/hooks/useSwipeDismiss.mjs.map +1 -1
  189. package/dist/esm/common/hooks/useVisualViewportSize.mjs +1 -1
  190. package/dist/esm/common/hooks/useVisualViewportSize.mjs.map +1 -1
  191. package/dist/esm/common/iconPicker/iconPicker.mjs +1 -1
  192. package/dist/esm/common/iconPicker/iconPicker.mjs.map +1 -1
  193. package/dist/esm/common/iconPicker/iconPicker.module.mjs +1 -1
  194. package/dist/esm/common/idleManager/idleManager.mjs +1 -1
  195. package/dist/esm/common/idleManager/idleManager.mjs.map +1 -1
  196. package/dist/esm/common/infiniteBlock/infiniteBlock.mjs +1 -1
  197. package/dist/esm/common/infiniteBlock/infiniteBlock.mjs.map +1 -1
  198. package/dist/esm/common/infiniteBlock/infiniteBlock.module.mjs +1 -1
  199. package/dist/esm/common/input/input.mjs +1 -1
  200. package/dist/esm/common/input/input.mjs.map +1 -1
  201. package/dist/esm/common/input/input.module.mjs +1 -1
  202. package/dist/esm/common/input/input.module.mjs.map +1 -1
  203. package/dist/esm/common/input/input.types.mjs +1 -1
  204. package/dist/esm/common/input/input.types.mjs.map +1 -1
  205. package/dist/esm/common/inputDropdown/inputDropdown.mjs +1 -1
  206. package/dist/esm/common/inputDropdown/inputDropdown.mjs.map +1 -1
  207. package/dist/esm/common/inputDropdown/inputDropdown.module.mjs +1 -1
  208. package/dist/esm/common/inputDropdown/inputDropdown.module.mjs.map +1 -1
  209. package/dist/esm/common/interactableDiv/index.mjs +1 -1
  210. package/dist/esm/common/interactableDiv/index.mjs.map +1 -1
  211. package/dist/esm/common/interactableDiv/interactableDiv.mjs +1 -1
  212. package/dist/esm/common/interactableDiv/interactableDiv.mjs.map +1 -1
  213. package/dist/esm/common/interactableDiv/interactableDiv.module.mjs +1 -1
  214. package/dist/esm/common/kanbanBoard/KanbanBoard.mjs +1 -1
  215. package/dist/esm/common/kanbanBoard/KanbanBoard.mjs.map +1 -1
  216. package/dist/esm/common/kanbanBoard/KanbanColumn.mjs +1 -1
  217. package/dist/esm/common/kanbanBoard/KanbanColumn.mjs.map +1 -1
  218. package/dist/esm/common/kanbanBoard/KanbanItem.mjs +1 -1
  219. package/dist/esm/common/kanbanBoard/KanbanItem.mjs.map +1 -1
  220. package/dist/esm/common/kanbanBoard/kanbanBoard.module.mjs +1 -1
  221. package/dist/esm/common/kanbanBoard/kanbanBoard.utils.mjs +1 -1
  222. package/dist/esm/common/kanbanBoard/kanbanBoard.utils.mjs.map +1 -1
  223. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.mjs +1 -1
  224. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.mjs.map +1 -1
  225. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.module.mjs +1 -1
  226. package/dist/esm/common/klipyPicker/components/gifView/gifView.mjs +1 -1
  227. package/dist/esm/common/klipyPicker/components/gifView/gifView.mjs.map +1 -1
  228. package/dist/esm/common/klipyPicker/components/gifView/gifView.module.mjs +1 -1
  229. package/dist/esm/common/klipyPicker/klipyPicker.mjs +1 -1
  230. package/dist/esm/common/klipyPicker/klipyPicker.mjs.map +1 -1
  231. package/dist/esm/common/klipyPicker/klipyPicker.module.mjs +1 -1
  232. package/dist/esm/common/loading/iconLoading/iconLoading.mjs +1 -1
  233. package/dist/esm/common/loading/iconLoading/iconLoading.mjs.map +1 -1
  234. package/dist/esm/common/loading/iconLoading/iconLoading.module.mjs +1 -1
  235. package/dist/esm/common/loading/iconLoading/index.mjs +1 -1
  236. package/dist/esm/common/loading/iconLoading/index.mjs.map +1 -1
  237. package/dist/esm/common/loading/spinnerLoading/index.mjs +1 -1
  238. package/dist/esm/common/loading/spinnerLoading/index.mjs.map +1 -1
  239. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs +1 -1
  240. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs.map +1 -1
  241. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.module.mjs +1 -1
  242. package/dist/esm/common/menu/menu.mjs +2 -0
  243. package/dist/esm/common/menu/menu.mjs.map +1 -0
  244. package/dist/esm/common/menu/menu.module.mjs +2 -0
  245. package/dist/esm/common/menu/menu.module.mjs.map +1 -0
  246. package/dist/esm/common/menu/menu.types.mjs +2 -0
  247. package/dist/esm/common/menu/menu.types.mjs.map +1 -0
  248. package/dist/esm/common/modal/modal.mjs +1 -1
  249. package/dist/esm/common/modal/modal.mjs.map +1 -1
  250. package/dist/esm/common/modal/modal.module.mjs +1 -1
  251. package/dist/esm/common/modal/modal.module.mjs.map +1 -1
  252. package/dist/esm/common/multiSelect/multiSelect.mjs +1 -1
  253. package/dist/esm/common/multiSelect/multiSelect.mjs.map +1 -1
  254. package/dist/esm/common/multiSelect/multiSelect.module.mjs +1 -1
  255. package/dist/esm/common/multiSelect/multiSelect.module.mjs.map +1 -1
  256. package/dist/esm/common/numberInput/index.mjs +1 -1
  257. package/dist/esm/common/numberInput/index.mjs.map +1 -1
  258. package/dist/esm/common/numberInput/numberInput.mjs +1 -1
  259. package/dist/esm/common/numberInput/numberInput.mjs.map +1 -1
  260. package/dist/esm/common/numberInput/numberInput.module.mjs +1 -1
  261. package/dist/esm/common/numberInput/useStepRepeat.mjs +1 -1
  262. package/dist/esm/common/numberInput/useStepRepeat.mjs.map +1 -1
  263. package/dist/esm/common/optionPicker/optionPicker.mjs +1 -1
  264. package/dist/esm/common/optionPicker/optionPicker.mjs.map +1 -1
  265. package/dist/esm/common/optionPicker/optionPicker.module.mjs +1 -1
  266. package/dist/esm/common/otpInput/otpInput.mjs +1 -1
  267. package/dist/esm/common/otpInput/otpInput.mjs.map +1 -1
  268. package/dist/esm/common/otpInput/otpInput.module.mjs +1 -1
  269. package/dist/esm/common/otpInput/otpInput.types.mjs +1 -1
  270. package/dist/esm/common/otpInput/otpInput.types.mjs.map +1 -1
  271. package/dist/esm/common/overscroll/overscroll.mjs +1 -1
  272. package/dist/esm/common/overscroll/overscroll.mjs.map +1 -1
  273. package/dist/esm/common/overscroll/overscroll.module.mjs +1 -1
  274. package/dist/esm/common/pagination/pagination.mjs +1 -1
  275. package/dist/esm/common/pagination/pagination.mjs.map +1 -1
  276. package/dist/esm/common/pagination/pagination.module.mjs +1 -1
  277. package/dist/esm/common/planCanvas/planCanvas.mjs +1 -1
  278. package/dist/esm/common/planCanvas/planCanvas.mjs.map +1 -1
  279. package/dist/esm/common/planCanvas/planCanvas.module.mjs +1 -1
  280. package/dist/esm/common/popover/popover.mjs +1 -1
  281. package/dist/esm/common/popover/popover.mjs.map +1 -1
  282. package/dist/esm/common/popover/popover.module.mjs +1 -1
  283. package/dist/esm/common/popover/popover.module.mjs.map +1 -1
  284. package/dist/esm/common/popover/popover.types.mjs +1 -1
  285. package/dist/esm/common/popover/popover.types.mjs.map +1 -1
  286. package/dist/esm/common/popover/usePopoverPosition.mjs +1 -1
  287. package/dist/esm/common/popover/usePopoverPosition.mjs.map +1 -1
  288. package/dist/esm/common/progressBar/progressBar.mjs +1 -1
  289. package/dist/esm/common/progressBar/progressBar.mjs.map +1 -1
  290. package/dist/esm/common/progressBar/progressBar.module.mjs +1 -1
  291. package/dist/esm/common/progressBar/progressBar.module.mjs.map +1 -1
  292. package/dist/esm/common/radioGroup/radioGroup.mjs +1 -1
  293. package/dist/esm/common/radioGroup/radioGroup.mjs.map +1 -1
  294. package/dist/esm/common/radioGroup/radioGroup.module.mjs +1 -1
  295. package/dist/esm/common/radioGroup/radioGroup.module.mjs.map +1 -1
  296. package/dist/esm/common/radioGroup/radioGroup.types.mjs +1 -1
  297. package/dist/esm/common/radioGroup/radioGroup.types.mjs.map +1 -1
  298. package/dist/esm/common/rating/rating.mjs +1 -1
  299. package/dist/esm/common/rating/rating.mjs.map +1 -1
  300. package/dist/esm/common/rating/rating.module.mjs +1 -1
  301. package/dist/esm/common/revealLens/revealLens.mjs +1 -1
  302. package/dist/esm/common/revealLens/revealLens.mjs.map +1 -1
  303. package/dist/esm/common/revealLens/revealLens.module.mjs +1 -1
  304. package/dist/esm/common/ripple/ripple.mjs +1 -1
  305. package/dist/esm/common/ripple/ripple.mjs.map +1 -1
  306. package/dist/esm/common/ripple/ripple.module.mjs +1 -1
  307. package/dist/esm/common/ripple/ripple.module.mjs.map +1 -1
  308. package/dist/esm/common/roomDrawer/roomDrawer.mjs +1 -1
  309. package/dist/esm/common/roomDrawer/roomDrawer.mjs.map +1 -1
  310. package/dist/esm/common/roomDrawer/roomDrawer.module.mjs +1 -1
  311. package/dist/esm/common/roomDrawer/usePlanHistory.mjs +1 -1
  312. package/dist/esm/common/roomDrawer/usePlanHistory.mjs.map +1 -1
  313. package/dist/esm/common/roomViewer/roomViewer.mjs +1 -1
  314. package/dist/esm/common/roomViewer/roomViewer.mjs.map +1 -1
  315. package/dist/esm/common/roomViewer/roomViewer.module.mjs +1 -1
  316. package/dist/esm/common/scrollbarProvider/index.mjs +1 -1
  317. package/dist/esm/common/scrollbarProvider/index.mjs.map +1 -1
  318. package/dist/esm/common/scrollbarProvider/scrollbarProvider.mjs +1 -1
  319. package/dist/esm/common/scrollbarProvider/scrollbarProvider.mjs.map +1 -1
  320. package/dist/esm/common/scrollbarProvider/scrollbarProvider.module.mjs +1 -1
  321. package/dist/esm/common/searchInput/searchInput.mjs +1 -1
  322. package/dist/esm/common/searchInput/searchInput.mjs.map +1 -1
  323. package/dist/esm/common/searchInput/searchInput.module.mjs +1 -1
  324. package/dist/esm/common/sectionHeader/sectionHeader.mjs +1 -1
  325. package/dist/esm/common/sectionHeader/sectionHeader.mjs.map +1 -1
  326. package/dist/esm/common/sectionHeader/sectionHeader.module.mjs +1 -1
  327. package/dist/esm/common/sectionHeader/sectionHeader.types.mjs +1 -1
  328. package/dist/esm/common/sectionHeader/sectionHeader.types.mjs.map +1 -1
  329. package/dist/esm/common/sheetBackdrop/sheetBackdrop.mjs +1 -1
  330. package/dist/esm/common/sheetBackdrop/sheetBackdrop.mjs.map +1 -1
  331. package/dist/esm/common/skeleton/skeleton.mjs +1 -1
  332. package/dist/esm/common/skeleton/skeleton.mjs.map +1 -1
  333. package/dist/esm/common/skeleton/skeleton.module.mjs +1 -1
  334. package/dist/esm/common/skeleton/skeleton.types.mjs +1 -1
  335. package/dist/esm/common/skeleton/skeleton.types.mjs.map +1 -1
  336. package/dist/esm/common/slider/slider.mjs +1 -1
  337. package/dist/esm/common/slider/slider.mjs.map +1 -1
  338. package/dist/esm/common/slider/slider.module.mjs +1 -1
  339. package/dist/esm/common/splitButton/splitButton.mjs +1 -1
  340. package/dist/esm/common/splitButton/splitButton.mjs.map +1 -1
  341. package/dist/esm/common/splitButton/splitButton.module.mjs +1 -1
  342. package/dist/esm/common/splitButton/splitButton.module.mjs.map +1 -1
  343. package/dist/esm/common/stepper/stepper.mjs +1 -1
  344. package/dist/esm/common/stepper/stepper.mjs.map +1 -1
  345. package/dist/esm/common/stepper/stepper.module.mjs +1 -1
  346. package/dist/esm/common/stepper/stepper.types.mjs +1 -1
  347. package/dist/esm/common/stepper/stepper.types.mjs.map +1 -1
  348. package/dist/esm/common/sticky/sticky.mjs +1 -1
  349. package/dist/esm/common/sticky/sticky.mjs.map +1 -1
  350. package/dist/esm/common/sticky/sticky.module.mjs +1 -1
  351. package/dist/esm/common/sticky/stickyStack.mjs +1 -1
  352. package/dist/esm/common/sticky/stickyStack.mjs.map +1 -1
  353. package/dist/esm/common/styles/sheet.module.mjs +1 -1
  354. package/dist/esm/common/styles/sheet.module.mjs.map +1 -1
  355. package/dist/esm/common/switch/switch.mjs +1 -1
  356. package/dist/esm/common/switch/switch.mjs.map +1 -1
  357. package/dist/esm/common/switch/switch.module.mjs +1 -1
  358. package/dist/esm/common/switch/switch.module.mjs.map +1 -1
  359. package/dist/esm/common/tabHeader/tabHeader.mjs +1 -1
  360. package/dist/esm/common/tabHeader/tabHeader.mjs.map +1 -1
  361. package/dist/esm/common/tabHeader/tabHeader.module.mjs +1 -1
  362. package/dist/esm/common/textarea/textarea.mjs +1 -1
  363. package/dist/esm/common/textarea/textarea.mjs.map +1 -1
  364. package/dist/esm/common/themeProvider/defaultTheme.mjs +1 -1
  365. package/dist/esm/common/themeProvider/defaultTheme.mjs.map +1 -1
  366. package/dist/esm/common/themeProvider/lightTheme.mjs +2 -0
  367. package/dist/esm/common/themeProvider/lightTheme.mjs.map +1 -0
  368. package/dist/esm/common/themeProvider/theme.module.mjs +1 -1
  369. package/dist/esm/common/themeProvider/themeProvider.mjs +1 -1
  370. package/dist/esm/common/themeProvider/themeProvider.mjs.map +1 -1
  371. package/dist/esm/common/themeProvider/themeVariablesContext.mjs +1 -1
  372. package/dist/esm/common/themeProvider/themeVariablesContext.mjs.map +1 -1
  373. package/dist/esm/common/themeProvider/useTheme.mjs +1 -1
  374. package/dist/esm/common/themeProvider/useTheme.mjs.map +1 -1
  375. package/dist/esm/common/tilt/tilt.mjs +1 -1
  376. package/dist/esm/common/tilt/tilt.mjs.map +1 -1
  377. package/dist/esm/common/tilt/tilt.module.mjs +1 -1
  378. package/dist/esm/common/tilt/tiltMath.mjs +1 -1
  379. package/dist/esm/common/tilt/tiltMath.mjs.map +1 -1
  380. package/dist/esm/common/tiltGroup/tiltGroup.mjs +1 -1
  381. package/dist/esm/common/tiltGroup/tiltGroup.mjs.map +1 -1
  382. package/dist/esm/common/timeInput/components/clockDial/clockDial.mjs +1 -1
  383. package/dist/esm/common/timeInput/components/clockDial/clockDial.mjs.map +1 -1
  384. package/dist/esm/common/timeInput/components/clockDial/clockDial.module.mjs +1 -1
  385. package/dist/esm/common/timeInput/timeFunctions.mjs +1 -1
  386. package/dist/esm/common/timeInput/timeFunctions.mjs.map +1 -1
  387. package/dist/esm/common/timeInput/timeInput.mjs +1 -1
  388. package/dist/esm/common/timeInput/timeInput.mjs.map +1 -1
  389. package/dist/esm/common/timeInput/timeInput.module.mjs +1 -1
  390. package/dist/esm/common/timeline/timeline.mjs +1 -1
  391. package/dist/esm/common/timeline/timeline.mjs.map +1 -1
  392. package/dist/esm/common/timeline/timeline.module.mjs +1 -1
  393. package/dist/esm/common/timeline/timeline.types.mjs +1 -1
  394. package/dist/esm/common/timeline/timeline.types.mjs.map +1 -1
  395. package/dist/esm/common/timer/timer.chime.mjs +1 -1
  396. package/dist/esm/common/timer/timer.chime.mjs.map +1 -1
  397. package/dist/esm/common/timer/timer.mjs +1 -1
  398. package/dist/esm/common/timer/timer.mjs.map +1 -1
  399. package/dist/esm/common/timer/timer.module.mjs +1 -1
  400. package/dist/esm/common/toast/toast.mjs +1 -1
  401. package/dist/esm/common/toast/toast.mjs.map +1 -1
  402. package/dist/esm/common/toast/toast.module.mjs +1 -1
  403. package/dist/esm/common/toast/toast.module.mjs.map +1 -1
  404. package/dist/esm/common/toast/toastProvider.mjs +1 -1
  405. package/dist/esm/common/toast/toastProvider.mjs.map +1 -1
  406. package/dist/esm/common/toast/toastService.mjs +1 -1
  407. package/dist/esm/common/toast/toastService.mjs.map +1 -1
  408. package/dist/esm/common/tooltip/tooltip.mjs +1 -1
  409. package/dist/esm/common/tooltip/tooltip.mjs.map +1 -1
  410. package/dist/esm/common/tooltip/tooltip.module.mjs +1 -1
  411. package/dist/esm/common/tooltip/tooltip.module.mjs.map +1 -1
  412. package/dist/esm/common/tree/flattenTree.mjs +1 -1
  413. package/dist/esm/common/tree/flattenTree.mjs.map +1 -1
  414. package/dist/esm/common/tree/tree.mjs +1 -1
  415. package/dist/esm/common/tree/tree.mjs.map +1 -1
  416. package/dist/esm/common/tree/tree.module.mjs +1 -1
  417. package/dist/esm/common/tree/tree.module.mjs.map +1 -1
  418. package/dist/esm/common/utils/activationKey.mjs +1 -1
  419. package/dist/esm/common/utils/activationKey.mjs.map +1 -1
  420. package/dist/esm/common/utils/mergeRefs.mjs +2 -0
  421. package/dist/esm/common/utils/mergeRefs.mjs.map +1 -0
  422. package/dist/esm/common/utils/renderIcon.mjs +1 -1
  423. package/dist/esm/common/utils/renderIcon.mjs.map +1 -1
  424. package/dist/esm/common/utils/scrollAncestors.mjs +1 -1
  425. package/dist/esm/common/utils/scrollAncestors.mjs.map +1 -1
  426. package/dist/esm/common/utils/visualViewport.mjs +1 -1
  427. package/dist/esm/common/utils/visualViewport.mjs.map +1 -1
  428. package/dist/esm/common/virtualList/useColumnResize.mjs +1 -1
  429. package/dist/esm/common/virtualList/useColumnResize.mjs.map +1 -1
  430. package/dist/esm/common/virtualList/useColumns.mjs +1 -1
  431. package/dist/esm/common/virtualList/useColumns.mjs.map +1 -1
  432. package/dist/esm/common/virtualList/useHeaderNavigation.mjs +1 -1
  433. package/dist/esm/common/virtualList/useHeaderNavigation.mjs.map +1 -1
  434. package/dist/esm/common/virtualList/useRowDrag.mjs +1 -1
  435. package/dist/esm/common/virtualList/useRowDrag.mjs.map +1 -1
  436. package/dist/esm/common/virtualList/useRowNavigation.mjs +1 -1
  437. package/dist/esm/common/virtualList/useRowNavigation.mjs.map +1 -1
  438. package/dist/esm/common/virtualList/useSelection.mjs +1 -1
  439. package/dist/esm/common/virtualList/useSelection.mjs.map +1 -1
  440. package/dist/esm/common/virtualList/useSorting.mjs +1 -1
  441. package/dist/esm/common/virtualList/useSorting.mjs.map +1 -1
  442. package/dist/esm/common/virtualList/useVirtualWindow.mjs +1 -1
  443. package/dist/esm/common/virtualList/useVirtualWindow.mjs.map +1 -1
  444. package/dist/esm/common/virtualList/virtualList.mjs +1 -1
  445. package/dist/esm/common/virtualList/virtualList.mjs.map +1 -1
  446. package/dist/esm/common/virtualList/virtualList.module.mjs +1 -1
  447. package/dist/esm/common/virtualList/virtualList.module.mjs.map +1 -1
  448. package/dist/esm/common/virtualList/virtualList.utils.mjs +1 -1
  449. package/dist/esm/common/virtualList/virtualList.utils.mjs.map +1 -1
  450. package/dist/esm/common/virtualList/virtualListHeader.mjs +1 -1
  451. package/dist/esm/common/virtualList/virtualListHeader.mjs.map +1 -1
  452. package/dist/esm/common/virtualList/virtualRow.mjs +1 -1
  453. package/dist/esm/common/virtualList/virtualRow.mjs.map +1 -1
  454. package/dist/esm/common/wizard/wizard.mjs +1 -1
  455. package/dist/esm/common/wizard/wizard.mjs.map +1 -1
  456. package/dist/esm/common/wizard/wizard.module.mjs +1 -1
  457. package/dist/esm/hooks/useWindowSize.mjs +1 -1
  458. package/dist/esm/hooks/useWindowSize.mjs.map +1 -1
  459. package/dist/esm/index.mjs +1 -1
  460. package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs +1 -1
  461. package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs.map +1 -1
  462. package/dist/esm/services/formValidation/index.mjs +1 -1
  463. package/dist/esm/services/formValidation/useFormValidatorGroup.mjs +1 -1
  464. package/dist/esm/services/formValidation/useFormValidatorGroup.mjs.map +1 -1
  465. package/dist/esm/services/formValidation/validatableComponent.mjs +1 -1
  466. package/dist/esm/services/formValidation/validatableComponent.mjs.map +1 -1
  467. package/dist/esm/services/klipy.mjs +1 -1
  468. package/dist/esm/services/klipy.mjs.map +1 -1
  469. package/dist/esm/services/localization.mjs +1 -1
  470. package/dist/esm/services/localization.mjs.map +1 -1
  471. package/dist/index.cjs +3 -3
  472. package/dist/index.cjs.map +1 -1
  473. package/dist/mcp.js +21096 -5
  474. package/dist/style.css +1 -1
  475. package/dist/types/common/actionIcon/actionIcon.types.d.ts +3 -1
  476. package/dist/types/common/card/card.types.d.ts +3 -1
  477. package/dist/types/common/checkbox/checkbox.types.d.ts +3 -1
  478. package/dist/types/common/colorPicker/colorPicker.types.d.ts +4 -0
  479. package/dist/types/common/configProvider/configProvider.d.ts +1 -1
  480. package/dist/types/common/configProvider/configProvider.types.d.ts +6 -3
  481. package/dist/types/common/configProvider/index.d.ts +1 -0
  482. package/dist/types/common/configProvider/presentation.types.d.ts +14 -0
  483. package/dist/types/common/configProvider/usePresentationDefault.d.ts +1 -1
  484. package/dist/types/common/dropdown/dropdown.types.d.ts +1 -1
  485. package/dist/types/common/flip/flip.d.ts +2 -2
  486. package/dist/types/common/flip/flip.types.d.ts +3 -1
  487. package/dist/types/common/hooks/useAnchorTracking.d.ts +1 -1
  488. package/dist/types/common/hooks/useFocusBoundary.d.ts +3 -3
  489. package/dist/types/common/hooks/useSheet.d.ts +1 -1
  490. package/dist/types/common/input/input.types.d.ts +5 -0
  491. package/dist/types/common/interactableDiv/interactableDiv.d.ts +3 -2
  492. package/dist/types/common/loading/spinnerLoading/spinnerLoading.d.ts +0 -5
  493. package/dist/types/common/menu/index.d.ts +2 -0
  494. package/dist/types/common/menu/menu.d.ts +14 -0
  495. package/dist/types/common/menu/menu.types.d.ts +55 -0
  496. package/dist/types/common/modal/modal.types.d.ts +1 -1
  497. package/dist/types/common/multiSelect/multiSelect.types.d.ts +1 -1
  498. package/dist/types/common/numberInput/numberInput.types.d.ts +2 -0
  499. package/dist/types/common/otpInput/otpInput.types.d.ts +2 -0
  500. package/dist/types/common/planCanvas/planCanvas.d.ts +1 -1
  501. package/dist/types/common/planCanvas/planCanvas.types.d.ts +3 -1
  502. package/dist/types/common/popover/popover.types.d.ts +34 -3
  503. package/dist/types/common/popover/usePopoverPosition.d.ts +20 -1
  504. package/dist/types/common/ripple/ripple.d.ts +1 -1
  505. package/dist/types/common/ripple/ripple.types.d.ts +1 -0
  506. package/dist/types/common/roomDrawer/roomDrawer.d.ts +2 -2
  507. package/dist/types/common/roomDrawer/roomDrawer.types.d.ts +3 -1
  508. package/dist/types/common/roomViewer/roomViewer.d.ts +2 -2
  509. package/dist/types/common/roomViewer/roomViewer.types.d.ts +3 -1
  510. package/dist/types/common/searchInput/searchInput.d.ts +1 -1
  511. package/dist/types/common/searchInput/searchInput.types.d.ts +3 -0
  512. package/dist/types/common/splitButton/splitButton.types.d.ts +3 -3
  513. package/dist/types/common/switch/switch.types.d.ts +3 -1
  514. package/dist/types/common/themeProvider/index.d.ts +1 -0
  515. package/dist/types/common/themeProvider/lightTheme.d.ts +13 -0
  516. package/dist/types/common/tilt/tilt.d.ts +2 -2
  517. package/dist/types/common/tilt/tilt.types.d.ts +3 -1
  518. package/dist/types/common/timer/timer.d.ts +2 -2
  519. package/dist/types/common/timer/timer.types.d.ts +3 -1
  520. package/dist/types/common/tooltip/tooltip.d.ts +1 -1
  521. package/dist/types/common/tooltip/tooltip.types.d.ts +7 -0
  522. package/dist/types/common/types/baseProps.types.d.ts +6 -0
  523. package/dist/types/common/utils/mergeRefs.d.ts +12 -0
  524. package/dist/types/common/virtualList/virtualList.d.ts +2 -4
  525. package/dist/types/common/virtualList/virtualList.types.d.ts +3 -1
  526. package/dist/types/index.d.ts +2 -2
  527. package/docs/Accordion.md +9 -0
  528. package/docs/ActionIcon.md +1 -0
  529. package/docs/Breadcrumb.md +2 -2
  530. package/docs/ButtonGroup.md +1 -1
  531. package/docs/CLAUDE.md +38 -1
  532. package/docs/Card.md +2 -1
  533. package/docs/Checkbox.md +1 -0
  534. package/docs/ColorPicker.md +13 -1
  535. package/docs/ConfigProvider.md +2 -2
  536. package/docs/Dropdown.md +1 -1
  537. package/docs/Input.md +1 -0
  538. package/docs/InputDropdown.md +1 -1
  539. package/docs/InteractableDiv.md +2 -0
  540. package/docs/KlipyPicker.md +1 -1
  541. package/docs/Menu.md +107 -0
  542. package/docs/Modal.md +1 -1
  543. package/docs/NumberInput.md +1 -0
  544. package/docs/OtpInput.md +1 -0
  545. package/docs/Popover.md +11 -5
  546. package/docs/SearchInput.md +1 -0
  547. package/docs/SplitButton.md +8 -4
  548. package/docs/Switch.md +1 -0
  549. package/docs/Textarea.md +1 -0
  550. package/docs/ThemeProvider.md +31 -2
  551. package/docs/Tooltip.md +23 -1
  552. package/docs/VirtualList.md +2 -2
  553. package/package.json +8 -7
  554. package/dist/esm/common/floatingMenu/floatingMenu.mjs +0 -2
  555. package/dist/esm/common/floatingMenu/floatingMenu.mjs.map +0 -1
  556. package/dist/esm/common/floatingMenu/floatingMenu.module.mjs +0 -2
  557. package/dist/esm/common/floatingMenu/floatingMenu.module.mjs.map +0 -1
  558. package/dist/esm/common/floatingMenu/floatingMenu.types.mjs +0 -2
  559. package/dist/esm/common/floatingMenu/floatingMenu.types.mjs.map +0 -1
  560. package/dist/esm/common/floatingMenu/useFloatingPosition.mjs +0 -2
  561. package/dist/esm/common/floatingMenu/useFloatingPosition.mjs.map +0 -1
  562. package/dist/types/common/floatingMenu/floatingMenu.d.ts +0 -3
  563. package/dist/types/common/floatingMenu/floatingMenu.types.d.ts +0 -32
  564. package/dist/types/common/floatingMenu/index.d.ts +0 -2
  565. package/dist/types/common/floatingMenu/useFloatingPosition.d.ts +0 -27
  566. package/docs/FloatingMenu.md +0 -90
@@ -1,3 +1,3 @@
1
- import { TiltHandle, TiltProps } from './tilt.types';
2
- declare const Tilt: import('react').ForwardRefExoticComponent<TiltProps & import('react').RefAttributes<TiltHandle>>;
1
+ import { TiltProps } from './tilt.types';
2
+ declare function Tilt(props: TiltProps): import("react").JSX.Element;
3
3
  export default Tilt;
@@ -1,4 +1,4 @@
1
- import { CSSProperties, ReactNode } from 'react';
1
+ import { CSSProperties, ReactNode, Ref } from 'react';
2
2
  import { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';
3
3
  import { TiltAxisLock } from './tiltMath';
4
4
  export type TiltTrackingMode = 'self' | 'group';
@@ -31,6 +31,8 @@ export interface TiltProps extends HtmlProps {
31
31
  disabled?: boolean;
32
32
  /** Fires on every applied tilt update. */
33
33
  onTiltChange?: (rotateX: number, rotateY: number) => void;
34
+ /** Imperative handle for driving the tilt directly. */
35
+ ref?: Ref<TiltHandle>;
34
36
  className?: string;
35
37
  style?: CSSProperties;
36
38
  classNames?: SlotClassNames<TiltSlots>;
@@ -1,3 +1,3 @@
1
- import { TimerHandle, TimerProps } from './timer.types';
2
- declare const Timer: import('react').ForwardRefExoticComponent<TimerProps & import('react').RefAttributes<TimerHandle>>;
1
+ import { TimerProps } from './timer.types';
2
+ declare function Timer(props: TimerProps): import("react").JSX.Element;
3
3
  export default Timer;
@@ -1,4 +1,4 @@
1
- import { CSSProperties, ReactNode } from 'react';
1
+ import { CSSProperties, ReactNode, Ref } from 'react';
2
2
  import { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';
3
3
  export type TimerSlots = 'root' | 'ringWrapper' | 'ringSvg' | 'ringTrack' | 'ringProgress' | 'ripples' | 'ripple' | 'display' | 'time' | 'label' | 'controls' | 'addButton' | 'removeButton' | 'pauseButton' | 'cancelButton';
4
4
  export type TimerStatus = 'idle' | 'running' | 'paused' | 'completed' | 'cancelled';
@@ -99,6 +99,8 @@ export interface TimerProps extends HtmlProps {
99
99
  notificationTitle?: string;
100
100
  /** Notification body when `notifyOnComplete` is set. Falls back to `label` when it's a string. */
101
101
  notificationBody?: string;
102
+ /** Imperative handle for starting, pausing and resetting the timer. */
103
+ ref?: Ref<TimerHandle>;
102
104
  className?: string;
103
105
  style?: CSSProperties;
104
106
  classNames?: SlotClassNames<TimerSlots>;
@@ -1,3 +1,3 @@
1
1
  import { default as React } from 'react';
2
2
  import { TooltipProps } from './tooltip.types';
3
- export default function Tooltip({ variant, message, isVisible, tooltipPosition, onClick }: TooltipProps): React.JSX.Element | null;
3
+ export default function Tooltip({ variant, message, isVisible, tooltipPosition, onClick, labels, }: TooltipProps): React.JSX.Element | null;
@@ -1,5 +1,10 @@
1
1
  import { default as React } from 'react';
2
2
  export type TooltipVariant = 'info' | 'details' | 'error';
3
+ /** Text Tooltip renders of its own, for translating it. */
4
+ export interface TooltipLabels {
5
+ /** Accessible name of the `?` icon the `details` variant renders (default `More information`). */
6
+ details?: string;
7
+ }
3
8
  export interface TooltipProps {
4
9
  variant: TooltipVariant;
5
10
  message?: React.ReactNode;
@@ -7,4 +12,6 @@ export interface TooltipProps {
7
12
  iconPosition?: string;
8
13
  tooltipPosition?: string;
9
14
  onClick?: () => void;
15
+ /** Overrides the text Tooltip renders of its own. Merged per key. */
16
+ labels?: TooltipLabels;
10
17
  }
@@ -15,6 +15,12 @@ type DataAttributes = {
15
15
  * matching React type instead and add `DataProps` for the `data-*` half — `Button` does this
16
16
  * with `React.ButtonHTMLAttributes<HTMLButtonElement>`.
17
17
  *
18
+ * `ref` is deliberately *not* here. `Ref<E>` is invariant, so a shared `Ref<HTMLElement>` is not
19
+ * assignable to the `<div>` it would be spread onto, and narrowing the default to `HTMLDivElement`
20
+ * re-types every event handler with it — which breaks `Dropdown` and `SplitButton`, whose `onClick`
21
+ * is typed for the `<button>` they hand it to. A component that accepts a ref declares it itself,
22
+ * next to its other props, typed for the element it actually lands on.
23
+ *
18
24
  * A component prop that collides with a native one of the same name must `Omit` the native one.
19
25
  */
20
26
  export type HtmlProps<E extends HTMLElement = HTMLElement> = React.HTMLAttributes<E> & DataAttributes;
@@ -0,0 +1,12 @@
1
+ import { Ref } from 'react';
2
+ /**
3
+ * Fans one element out to several refs, for a component that needs the node itself *and*
4
+ * hands it to the consumer through a `ref` prop.
5
+ *
6
+ * The returned callback is a new function on every render, so React detaches and reattaches
7
+ * it each time (null, then the node). Every ref here is therefore written twice per render,
8
+ * which is fine for storing a node and wrong for anything with a side effect. Call it inline
9
+ * rather than memoising: a memo would have to list the refs it closes over, and a consumer
10
+ * passing an inline callback ref changes that identity every render anyway.
11
+ */
12
+ export declare function mergeRefs<T>(...refs: (Ref<T> | undefined)[]): (node: T | null) => void;
@@ -1,7 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { VirtualListProps, VirtualListHandle } from './virtualList.types';
2
+ import { VirtualListProps } from './virtualList.types';
3
3
  export { buildOffsets, findStartIndex, getVisibleRange, resolveReorderTarget, resolveTreeDropTarget, lastDescendantIndex, buildColumnTemplate, compareSortValues, isColumnSortable, isEmptySortValue, nextSort, sortItems, } from './virtualList.utils';
4
- declare const VirtualList: <T>(props: VirtualListProps<T> & {
5
- ref?: React.Ref<VirtualListHandle>;
6
- }) => React.ReactElement | null;
4
+ declare function VirtualList<T>({ ref, items, renderRow, ariaRoles, columns, height, estimatedRowHeight, overscan, rowGap, rowPadding, selectedKey, getItemKey, onRowClick, keyboardNavigation, visibleColumnKeys, onVisibleColumnsChange, persistColumnsKey, resizableColumns, columnWidths, onColumnWidthsChange, labels, sort, defaultSort, onSortChange, showColumnToggle, onLoadMore, loadMoreThreshold, isLoading, multiSelect, selectedKeys, onSelectionChange, reorderable, onReorder, longPressDelay, treeReorder, getItemDepth, isGroup, onTreeDrop, treeIndentPx, dragHandle, showDivider, rowHover, className, style, classNames, styles: slotStyles, ...rest }: VirtualListProps<T>): React.JSX.Element;
7
5
  export default VirtualList;
@@ -1,4 +1,4 @@
1
- import { CSSProperties, ReactNode } from 'react';
1
+ import { CSSProperties, ReactNode, Ref } from 'react';
2
2
  import { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';
3
3
  export type ColumnWidthFixed = {
4
4
  type: 'fixed';
@@ -308,6 +308,8 @@ export interface VirtualListProps<T> extends HtmlProps {
308
308
  * and touch. Render a handle in your row, e.g. `<span data-drag-handle>⠿</span>`.
309
309
  */
310
310
  dragHandle?: boolean;
311
+ /** Imperative handle for scrolling and for recalculating column layout. */
312
+ ref?: Ref<VirtualListHandle>;
311
313
  className?: string;
312
314
  style?: CSSProperties;
313
315
  classNames?: SlotClassNames<VirtualListSlots>;
@@ -53,8 +53,6 @@ export { default as Fab } from './common/fab';
53
53
  export * from './common/fab';
54
54
  export { default as Flip } from './common/flip';
55
55
  export * from './common/flip';
56
- export { default as FloatingMenu } from './common/floatingMenu';
57
- export * from './common/floatingMenu';
58
56
  export * from './common/floorPlan';
59
57
  export { default as IconPicker } from './common/iconPicker';
60
58
  export * from './common/iconPicker';
@@ -73,6 +71,8 @@ export * from './common/kanbanBoard';
73
71
  export { default as KlipyPicker } from './common/klipyPicker';
74
72
  export * from './common/klipyPicker';
75
73
  export * from './common/loading';
74
+ export { default as Menu } from './common/menu';
75
+ export * from './common/menu';
76
76
  export { default as Modal } from './common/modal';
77
77
  export * from './common/modal';
78
78
  export { default as MultiSelect } from './common/multiSelect';
package/docs/Accordion.md CHANGED
@@ -40,6 +40,15 @@ import { Accordion, AccordionStyleType } from '@ahrowe/ui';
40
40
  | `hideHeader` | `boolean` | Hide the clickable header |
41
41
  | `id` | `string` | Passed back in `onHeaderClicked` |
42
42
 
43
+ ## Accessibility
44
+
45
+ The header is a button: it takes focus, toggles on Enter and Space, and reports the section's
46
+ state through `aria-expanded`. It names the body it controls with `aria-controls`, and the body is
47
+ a `role="region"` labelled by the header, so a screen reader can move between the two.
48
+
49
+ An activation key pressed inside the body does not reach the header, so a Space typed into a
50
+ field in an open section types a space instead of collapsing the section.
51
+
43
52
  **Slots:** `root` `header` `title` `icon` `body` `bodyInner`
44
53
 
45
54
  ## Sizing
@@ -27,3 +27,4 @@ import { faTrash } from '@fortawesome/free-solid-svg-icons';
27
27
  | `title` | `string` | Tooltip / accessible label |
28
28
  | `onClick` | `(event: MouseEvent) => void` | Click handler |
29
29
  | `className` | `string` | Root element class |
30
+ | `ref` | `Ref<HTMLDivElement>` | Ref to the root element |
@@ -68,7 +68,7 @@ function Example() {
68
68
  // Long trails: collapse the middle behind a clickable ellipsis once items.length
69
69
  // exceeds maxItems. The ellipsis counts as one of the visible slots, so maxItems={3}
70
70
  // on a 4-item trail shows: Home / ... / Settings. Clicking the ellipsis opens a menu
71
- // (via FloatingMenu) listing the hidden items.
71
+ // (via Popover) listing the hidden items.
72
72
  <Breadcrumb
73
73
  items={[
74
74
  { label: 'Home', href: '/' },
@@ -80,7 +80,7 @@ function Example() {
80
80
  />
81
81
  ```
82
82
 
83
- **Requires:** `<div id="bodyEnd"></div>` in your HTML when `maxItems` is used and the trail actually collapses (the hidden-items menu is a `FloatingMenu`, which renders via portal).
83
+ **Requires:** `<div id="bodyEnd"></div>` in your HTML when `maxItems` is used and the trail actually collapses (the hidden-items menu is a `Popover`, which renders via portal).
84
84
 
85
85
  **BreadcrumbItem:**
86
86
 
@@ -81,6 +81,6 @@ Flattening reaches a child's visible border even when that border doesn't live o
81
81
 
82
82
  **Separators:** any child with `role="separator"` (what `Divider` sets) is excluded from that border-collapsing margin, on both sides — it stays fully visible between its neighbors instead of being partially hidden under one of them. Use a vertical `Divider` (see [Divider.md](Divider.md)) between two buttons when their style has no visible border of its own to merge (`Primary`, `Delete`), so there's still a clear seam between them.
83
83
 
84
- **Note:** the corner-flattening rules key off DOM position (`:first-child`/`:last-child`), so they work for direct `Button`/`Input`/`Dropdown`-family children out of the box. A child that renders as a wrapper around its own button (e.g. a component that portals its real content elsewhere) won't get the flattening automatically. `SplitButton` is exactly that case (its second child is a `FloatingMenu`-wrapped button), which is why it sets its own corner overrides directly rather than relying on `ButtonGroup`'s automatic ones. See [SplitButton.md](SplitButton.md). A fully custom component whose CSS doesn't reference the `--group-radius-*` variables can still be flattened manually the same way, via its own `classNames`/`styles` slots if it exposes the right one.
84
+ **Note:** the corner-flattening rules key off DOM position (`:first-child`/`:last-child`), so they work for direct `Button`/`Input`/`Dropdown`-family children out of the box. A child that renders as a wrapper around its own button (e.g. a component that portals its real content elsewhere) won't get the flattening automatically. `SplitButton` is exactly that case (its second child is a `Popover`-wrapped button), which is why it sets its own corner overrides directly rather than relying on `ButtonGroup`'s automatic ones. See [SplitButton.md](SplitButton.md). A fully custom component whose CSS doesn't reference the `--group-radius-*` variables can still be flattened manually the same way, via its own `classNames`/`styles` slots if it exposes the right one.
85
85
 
86
86
  **Slots:** none — `ButtonGroup` has no named inner elements, only `className`/`style` on the root.
package/docs/CLAUDE.md CHANGED
@@ -90,6 +90,43 @@ Most components expose `classNames` and `styles` props for styling inner element
90
90
 
91
91
  Slot keys per component are documented in each component's doc file below.
92
92
 
93
+ ## Refs
94
+
95
+ The library targets **React 19 or newer**. Every component that takes a ref takes it as a plain
96
+ prop, not through `forwardRef`, so there is nothing to unwrap and a generic component keeps its
97
+ type parameter.
98
+
99
+ ```tsx
100
+ const input = useRef<HTMLInputElement>(null);
101
+ <Input label="Name" ref={input} />;
102
+ input.current?.focus();
103
+ ```
104
+
105
+ A ref lands on the element you would actually reach for, which is not always the root: `Input`,
106
+ `Textarea`, `NumberInput` and `SearchInput` give you the `<input>` or `<textarea>` inside, not
107
+ their wrapper. Components that do more than hold a node expose an imperative handle instead of an
108
+ element: `Timer` (`start`/`pause`/`reset`), `Flip` (`flip`/`setFlipped`/`reset`), `Tilt`
109
+ (`setTilt`/`reset`), `Ripple` (`addRipple`), `VirtualList` (scrolling and column layout),
110
+ `RoomDrawer` and `RoomViewer`. Each handle's type is exported next to the component's props.
111
+
112
+ ## Server components
113
+
114
+ Every module in the package is marked `'use client'`. All the components are interactive, so none
115
+ of them renders on a server, but they can be imported straight into a React Server Components app
116
+ (Next.js App Router and the like) with no wrapper component in between.
117
+
118
+ ## Right to left
119
+
120
+ Not supported. The stylesheets use physical CSS properties (`margin-left`, `left`), so the library
121
+ does not mirror for right-to-left languages.
122
+
123
+ ## Reduced motion
124
+
125
+ Components honour `prefers-reduced-motion: reduce`: entrances, slides, chevron rotations and the
126
+ ink ripple stop, while fades and colour changes stay. Two things deliberately keep moving, because
127
+ freezing them would state something untrue: the loading spinners, and the Toast progress bar that
128
+ shows how long a toast has left.
129
+
93
130
  ## Icon props (`IconDefinition | ReactElement`)
94
131
 
95
132
  Every `icon` prop (and every icon field inside an item/action object) accepts either a
@@ -142,7 +179,6 @@ FontAwesome internals, so they still take an `IconDefinition` only.
142
179
  @ErrorBoundary.md
143
180
  @Fab.md
144
181
  @Flip.md
145
- @FloatingMenu.md
146
182
  @FloorPlan.md
147
183
  @FormValidator.md
148
184
  @FormValidatorGroup.md
@@ -155,6 +191,7 @@ FontAwesome internals, so they still take an `IconDefinition` only.
155
191
  @KanbanBoard.md
156
192
  @KlipyPicker.md
157
193
  @Loading.md
194
+ @Menu.md
158
195
  @Modal.md
159
196
  @MultiSelect.md
160
197
  @NumberInput.md
package/docs/Card.md CHANGED
@@ -60,7 +60,8 @@ All sub-components are optional — use only what you need. Stacked sub-componen
60
60
  | `hoverEffect` | `boolean` | Adds hover elevation |
61
61
  | `tabIndex` | `number \| null` | For keyboard navigation |
62
62
  | `autoGap` | `boolean` | Space stacked sub-components apart with a shared gap (default `true`); set `false` to space them yourself |
63
- | `clip` | `boolean` | Clip content to the rounded corners (`overflow: hidden`, default `false`). Set `true` for full-bleed `CardMedia` or a clipped hover/ripple effect. Safe to enable even when the card holds a `Dropdown`/`FloatingMenu`/`Tooltip` — those popovers are portaled and always escape the card regardless of this setting |
63
+ | `clip` | `boolean` | Clip content to the rounded corners (`overflow: hidden`, default `false`). Set `true` for full-bleed `CardMedia` or a clipped hover/ripple effect. Safe to enable even when the card holds a `Dropdown`/`Popover`/`Tooltip` — those popovers are portaled and always escape the card regardless of this setting |
64
+ | `ref` | `Ref<HTMLDivElement>` | Ref to the root element |
64
65
 
65
66
  **CardHeaderProps:**
66
67
 
package/docs/Checkbox.md CHANGED
@@ -36,6 +36,7 @@ const agreedValidator = new FormValidator(false, [Validators.required()]);
36
36
  | `isLoading` | `boolean` | Shows skeleton state |
37
37
  | `children` | `ReactNode` | Custom label content |
38
38
  | `cursorDefault` | `boolean` | Use default cursor instead of pointer |
39
+ | `ref` | `Ref<HTMLDivElement>` | Ref to the root element |
39
40
 
40
41
  **Slots:** `icon` `checkmark` `label`
41
42
 
@@ -51,6 +51,18 @@ The inline swatch tracks the theme's text size, since it sits beside a label: `-
51
51
 
52
52
  The picker panel deliberately does not. It is a floating control surface with its own fixed layout — a saturation area, sliders and a hex field — and it holds together at a large base font rather than needing to grow with it.
53
53
 
54
- **Labels:** `pickFromScreen` — the text this component renders of its own. Pass `labels` to override any of them, on the component or app-wide through `ConfigProvider`; they merge per key. Type: `ColorPickerLabels`.
54
+ **Labels:** `pickFromScreen`, `saturationAndBrightness`, `saturationAndBrightnessValue(saturation, brightness)` — the text this component renders of its own. Pass `labels` to override any of them, on the component or app-wide through `ConfigProvider`; they merge per key. Type: `ColorPickerLabels`.
55
+
56
+ **Keyboard:** the swatch is a button, so `Enter` or `Space` opens the panel and puts the focus on the saturation and brightness square. A click leaves the focus on the swatch, since a pointer open is not a request to be taken somewhere. `Tab` walks the rest of the panel, and `Escape` closes and hands the focus back to the swatch.
57
+
58
+ | Key | Does |
59
+ |-----|------|
60
+ | `←` `→` | Saturation, a percent at a time |
61
+ | `↑` `↓` | Brightness, a percent at a time |
62
+ | `Shift` with any arrow | Ten at a time |
63
+ | `Home` `End` | Saturation to either end |
64
+ | `PageUp` `PageDown` | Brightness to either end |
65
+
66
+ The square is a two-axis control, which ARIA has no role for. It reports itself as a slider whose value is the horizontal axis, with `aria-valuetext` carrying both numbers, so a screen reader reads out "62% saturation, 40% brightness" after every move.
55
67
 
56
68
  **Slots:** `root` `swatch` `panel` `gradient` `hueSlider` `alphaSlider` `hexInput` `eyeDropper`
@@ -59,7 +59,7 @@ So a global default only fills in props a given instance left out — any instan
59
59
 
60
60
  ## App-wide `presentation`
61
61
 
62
- `FloatingMenu`, `Dropdown`, `Popover` and `Modal` can each present as a bottom sheet instead of anchored to their trigger (centred, for `Modal`). They're unrelated components, so setting that through `defaultProps` would mean four entries, and missing one would leave sheets in half an app. `presentation` is the single switch:
62
+ `Popover`, `Menu`, `Dropdown`, `MultiSelect` and `Modal` can each present as a bottom sheet instead of anchored to their trigger (centred, for `Modal`). They're unrelated components, so setting that through `defaultProps` would mean five entries, and missing one would leave sheets in half an app. `presentation` is the single switch:
63
63
 
64
64
  ```tsx
65
65
  // Bottom sheets on small touch screens, everywhere, in one line
@@ -93,7 +93,7 @@ Each entry is a `Partial<...Props>`, so any of that component's props can be def
93
93
 
94
94
  - **Form inputs:** `Input` · `Textarea` · `NumberInput` · `Dropdown` · `InputDropdown` · `Checkbox` · `Switch` · `RadioGroup` · `DatePicker` · `OptionPicker` · `OtpInput`
95
95
  - **Display:** `Button` · `ActionButtons` · `Badge` · `Chip` · `Card` · `SectionHeader` · `Skeleton` · `Accordion` · `Divider` · `Timer`
96
- - **Overlays:** `ConfirmModal` · `Modal` · `FloatingMenu` · `Popover`
96
+ - **Overlays:** `ConfirmModal` · `Modal` · `Popover` · `Popover`
97
97
  - **Editors:** `RoomDrawer`, `RoomViewer`
98
98
 
99
99
  ```tsx
package/docs/Dropdown.md CHANGED
@@ -62,7 +62,7 @@ const statusValidator = new FormValidator('', [Validators.required()]);
62
62
  | `presentation` | `Presentation` | Where the list opens: anchored to the input (`Default`), always a bottom sheet, or a sheet only on a small touch screen. Imported from the same package: `import { Presentation } from '@ahrowe/ui'` |
63
63
  | `alwaysFloatLabel` | `boolean` | Keep the material label floated in the border notch even when nothing is selected, so an empty dropdown reads as blank instead of showing the label as if it were the selected value. Only applies with `useMatLabelStyle` (default) |
64
64
 
65
- The list is rendered through a portal and tracks the trigger across scroll, so it always escapes clipping ancestors (cards, scroll containers, virtualized lists). It flips to open upward automatically when there's no room below, and shifts horizontally to stay within the viewport when the trigger sits near the left or right edge of the screen. It hides (without closing) if the trigger itself scrolls behind a clipping ancestor, reappearing once it's back in view. It also re-measures when its own content changes size while open, so a list that shrinks (e.g. filtered down to fewer entries) stays anchored to the trigger instead of hanging above it.
65
+ The list is rendered through a portal and tracks the trigger across scroll, so it always escapes clipping ancestors (cards, scroll containers, virtualized lists). The panel itself is a [Popover](Popover.md), so it flips, clamps and presents as a bottom sheet the same way every other anchored surface in the library does. It flips to open upward automatically when there's no room below, and shifts horizontally to stay within the viewport when the trigger sits near the left or right edge of the screen. It hides (without closing) if the trigger itself scrolls behind a clipping ancestor, reappearing once it's back in view. It also re-measures when its own content changes size while open, so a list that shrinks (e.g. filtered down to fewer entries) stays anchored to the trigger instead of hanging above it.
66
66
 
67
67
  **Bottom sheet:** `presentation={Presentation.Sheet}` drops the anchoring entirely and pins the list to the bottom of the screen instead, full width up to 560px, behind a backdrop, scrolling internally past 70% of the viewport height and lifting itself above an open on-screen keyboard, shrinking to fit the space that leaves rather than running off the top of the screen. Tapping the backdrop closes the list without also pressing whatever sits behind it. It is the same list with the same keyboard handling, so selection, highlighting and infinite scroll are unchanged. `Presentation.Auto` does that only when the pointer is coarse *and* the screen is under 768px wide. The default is `Presentation.Default`. A whole app can opt in with `<ConfigProvider defaultProps={{ Dropdown: { presentation: Presentation.Auto } }}>`, or for every sheet-capable component at once with `<ConfigProvider presentation={Presentation.Auto}>` — see [ConfigProvider.md](ConfigProvider.md).
68
68
 
package/docs/Input.md CHANGED
@@ -122,6 +122,7 @@ The stored value is the formatted one, spaces included, so strip them before a l
122
122
  | `parse` | `(value: string) => string` | Transform the value on every change, before `onChange`/`formValidator` — also what gets rendered (see above) |
123
123
  | `isUppercase` | `boolean` | Uppercases the field's rendering (CSS only — the stored value is unchanged; use `parse` to uppercase the value itself) |
124
124
  | `customInput` | `ReactElement` | Element rendered in place of the internal `<input>`, cloned with all of Input's props. The escape hatch for a mask library; note `autoFocus` and `autoResize` stop working, since Input cannot attach its ref |
125
+ | `ref` | `Ref<HTMLInputElement \| HTMLTextAreaElement>` | Ref to the inner field, not the wrapper. Not forwarded to a `customInput` |
125
126
 
126
127
  **Slots:** `label` `container` `input` `suffix` `upperRightLabel` `fieldset`
127
128
 
@@ -71,4 +71,4 @@ interface InputDropdownItem {
71
71
 
72
72
  Long lists are handled by capping how many matches are rendered (`maxItems`, default `100`) rather than by virtualizing: only about six rows fit in the scroll box, so anything past the cap is DOM the user never sees. Raise `maxItems` (or set it to `0`) if a list is genuinely meant to be scrolled end to end. For lists too large to pass as `items` at all, fetch on the server, keep the results in your own state and feed them in as `items`.
73
73
 
74
- The list is rendered through a portal and tracks the trigger across scroll, so it always escapes clipping ancestors (cards, scroll containers, virtualized lists). It flips to open upward automatically when there's no room below, and shifts horizontally to stay within the viewport when the trigger sits near the left or right edge of the screen. It hides (without closing) if the trigger itself scrolls behind a clipping ancestor, reappearing once it's back in view. It also re-measures when its own content changes size while open, so a list that shrinks (e.g. filtered down to fewer entries) stays anchored to the trigger instead of hanging above it.
74
+ The list is rendered through a portal and tracks the trigger across scroll, so it always escapes clipping ancestors (cards, scroll containers, virtualized lists). The panel itself is a [Popover](Popover.md), so it flips, clamps and presents as a bottom sheet the same way every other anchored surface in the library does. It flips to open upward automatically when there's no room below, and shifts horizontally to stay within the viewport when the trigger sits near the left or right edge of the screen. It hides (without closing) if the trigger itself scrolls behind a clipping ancestor, reappearing once it's back in view. It also re-measures when its own content changes size while open, so a list that shrinks (e.g. filtered down to fewer entries) stays anchored to the trigger instead of hanging above it.
@@ -2,6 +2,8 @@
2
2
 
3
3
  **When to use:** Accessible `<div>` that behaves like a button — click and keyboard (Enter/Space) events, with proper ARIA semantics. Use when you need a custom-styled clickable container that isn't a `<button>`.
4
4
 
5
+ Enter and Space dispatch a real click, the way a native button does, so `onClick` always receives a `MouseEvent` and a handler on an element above this one sees the activation too.
6
+
5
7
  **Keywords:** custom button div
6
8
 
7
9
  **Import:** `import { InteractableDiv } from '@ahrowe/ui'`
@@ -6,7 +6,7 @@
6
6
 
7
7
  **Import:** `import { KlipyPicker } from '@ahrowe/ui'`
8
8
 
9
- **Requires:** `<div id="bodyEnd"></div>` in your HTML when `isModal` is used (Modal renders via portal). A Klipy API token — the component ships with a default key, but supply your own `token` prop for production use.
9
+ **Requires:** `<div id="bodyEnd"></div>` in your HTML when `isModal` is used (Modal renders via portal). A Klipy API token, passed as the `token` prop. There is no built-in key: without one the picker renders but every request fails.
10
10
 
11
11
  ```tsx
12
12
  import { KlipyPicker } from '@ahrowe/ui';
package/docs/Menu.md ADDED
@@ -0,0 +1,107 @@
1
+ # Menu
2
+
3
+ **When to use:** A list of actions hanging off a trigger — a row's "more" button, a toolbar overflow, a context menu on a card. Use [Popover](Popover.md) directly when the panel holds something other than a list of actions, and [Dropdown](Dropdown.md) when the user is picking a value rather than doing something.
4
+
5
+ **Keywords:** context menu, action menu, overflow menu, kebab menu, three dots, popup menu, right click, anchored list
6
+
7
+ **Import:** `import { Menu } from '@ahrowe/ui'`
8
+ **Types:** `import type { MenuProps, MenuEntry, MenuAction } from '@ahrowe/ui'`
9
+
10
+ **Requires:** `<div id="bodyEnd"></div>` in your app: the menu is portalled there, like every other anchored panel in the library.
11
+
12
+ ```tsx
13
+ import { Menu } from '@ahrowe/ui';
14
+ import type { MenuEntry } from '@ahrowe/ui';
15
+ import { faPen, faCopy, faTrash } from '@fortawesome/free-solid-svg-icons';
16
+
17
+ const items: MenuEntry[] = [
18
+ { id: 'edit', label: 'Edit', icon: faPen, shortcut: '⌘E' },
19
+ { id: 'duplicate', label: 'Duplicate', icon: faCopy },
20
+ { separator: true },
21
+ { id: 'delete', label: 'Delete', icon: faTrash, danger: true },
22
+ ];
23
+
24
+ <Menu items={items} onAction={(id) => run(id)}>
25
+ <Button>Actions</Button>
26
+ </Menu>;
27
+ ```
28
+
29
+ **Entries** are one of three shapes, and the list is read in the order you give it:
30
+
31
+ ```ts
32
+ { id: 'edit', label: 'Edit', icon, shortcut, disabled, danger, onClick } // an action
33
+ { separator: true } // a line
34
+ { heading: 'This document' } // a label over what follows
35
+ ```
36
+
37
+ An action runs its own `onClick` first, then `onAction` on the menu, then the menu closes. Use whichever of the two fits: a handler per entry when they are unrelated, `onAction` when they funnel into one place.
38
+
39
+ ```tsx
40
+ // Grouped, with a heading over each group
41
+ <Menu
42
+ items={[
43
+ { heading: 'This document' },
44
+ { id: 'rename', label: 'Rename' },
45
+ { separator: true },
46
+ { heading: 'Elsewhere' },
47
+ { id: 'open', label: 'Open in a new tab' },
48
+ ]}
49
+ >
50
+ <ActionIcon icon={faEllipsisVertical} aria-label='More actions' />
51
+ </Menu>
52
+
53
+ // A sheet on a small touch screen, anchored everywhere else
54
+ <Menu items={items} presentation={Presentation.Auto}>
55
+ <Button>Open</Button>
56
+ </Menu>
57
+ ```
58
+
59
+ **Keyboard:** the menu takes one tab stop, and follows the menu-button pattern.
60
+
61
+ | Key | Does |
62
+ |-----|------|
63
+ | `↓` on the closed trigger | Open, focus the first entry |
64
+ | `↑` on the closed trigger | Open, focus the last entry |
65
+ | `↓` `↑` on the trigger of a menu opened by mouse | Move into the list, at the first or last entry |
66
+ | `↑` `↓` | Move between entries, wrapping, skipping disabled ones |
67
+ | `Home` `End` | First or last entry |
68
+ | a letter | Jump to the next entry that starts with it; keep typing to narrow, or repeat one letter to walk the matches |
69
+ | `Enter` `Space` | Run the focused entry |
70
+ | `Escape` | Close and hand focus back to the trigger |
71
+ | `Tab` | Close, and carry on to whatever follows the trigger, from any entry |
72
+ | `Shift+Tab` | Close, and hand focus back to the trigger |
73
+
74
+ A click opens the menu without moving the focus, so no entry is marked until you point at one or press an arrow key: a highlight that does not follow the mouse reads as a selection. Opening with the keyboard, including `Enter` and `Space`, puts the focus on an entry straight away.
75
+
76
+ Separators and headings are never focused. The trigger is given `aria-haspopup`, `aria-expanded` and `aria-controls` unless it sets them itself, so a screen reader announces it as a menu button.
77
+
78
+ **Key props:**
79
+
80
+ | Prop | Type | Description |
81
+ |------|------|-------------|
82
+ | `items` | `MenuEntry[]` | What the menu offers (required) |
83
+ | `children` | `ReactNode` | The trigger |
84
+ | `onAction` | `(id: string) => void` | Called with the id of the entry that was picked |
85
+ | `isOpen` | `boolean` | Controlled open state; leave it out to let the menu manage its own |
86
+ | `onOpenChange` | `(isOpen: boolean) => void` | Called when the menu wants to open or close |
87
+ | `placement` | `PopoverPlacement` | Which side of the trigger it opens on (default `Bottom`) |
88
+ | `align` | `PopoverAlign` | Which edge it lines up with (default `Start`) |
89
+ | `presentation` | `Presentation` | Anchored, a bottom sheet, or a sheet only on touch |
90
+
91
+ **Entry fields (`MenuAction`):**
92
+
93
+ | Field | Type | Description |
94
+ |-------|------|-------------|
95
+ | `id` | `string` | Stable id, also what `onAction` reports |
96
+ | `label` | `ReactNode` | What the entry says |
97
+ | `icon` | `IconContent` | Leading icon |
98
+ | `shortcut` | `ReactNode` | Hint on the trailing edge, e.g. `⌘K`. Display only: binding it is yours |
99
+ | `disabled` | `boolean` | Not clickable, and skipped by the arrow keys |
100
+ | `danger` | `boolean` | Renders in the destructive colour |
101
+ | `onClick` | `() => void` | Runs before `onAction` |
102
+
103
+ **Slots:** `root` `trigger` `menu` `item` `itemIcon` `itemLabel` `itemShortcut` `separator` `heading`
104
+
105
+ `root` and `trigger` generate no box, so your trigger keeps the place it would have had without a Menu around it. A `className` or `style` on those two cannot paint; style the trigger you pass in instead.
106
+
107
+ **No submenus yet.** An entry is a single action. Nesting brings its own interaction model — hover intent, a second layer of focus management, and a different shape again as a sheet on touch — so it is a separate piece of work rather than a field on `MenuAction`.
package/docs/Modal.md CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  The panel itself never scrolls: the header is fixed and the children scroll inside the `body` slot, so the title and close button stay visible no matter how long the content is.
12
12
 
13
- While open, the modal traps focus (focus moves into the panel and returns to whatever was focused before on close), locks scrolling on the page behind it, and closes on Escape. Modals nest correctly: Escape closes only the topmost one, and the page stays locked until the last one closes. The same applies to anything opened from inside a modal — a `FloatingMenu`, `Dropdown` or `Popover` counts as the layer above it, so Escape closes that first, and the modal's focus trap leaves focus alone while it's open (all three render through the same portal, so their DOM sits beside the modal's panel rather than inside it).
13
+ While open, the modal traps focus (focus moves into the panel and returns to whatever was focused before on close), locks scrolling on the page behind it, and closes on Escape. Modals nest correctly: Escape closes only the topmost one, and the page stays locked until the last one closes. The same applies to anything opened from inside a modal — a `Menu`, `Dropdown` or `Popover` counts as the layer above it, so Escape closes that first, and the modal's focus trap leaves focus alone while it's open (all three render through the same portal, so their DOM sits beside the modal's panel rather than inside it).
14
14
 
15
15
  ```tsx
16
16
  import { Modal, ActionButtons } from '@ahrowe/ui';
@@ -76,6 +76,7 @@ const priceValidator = new FormValidator<number | undefined>(undefined, [Validat
76
76
  | `arrowsLayout` | `'auto' \| 'stacked' \| 'split'` | Stepper layout. Default: `'auto'` |
77
77
  | `labels.increase` | `string` | Accessible name for the increase button. Default: `'Increase'` |
78
78
  | `labels.decrease` | `string` | Accessible name for the decrease button. Default: `'Decrease'` |
79
+ | `ref` | `Ref<HTMLInputElement>` | Ref to the inner `<input>` |
79
80
 
80
81
  **Steppers (`showArrows`):** two layouts, picked by `arrowsLayout`:
81
82
 
package/docs/OtpInput.md CHANGED
@@ -88,6 +88,7 @@ const codeValidator = new FormValidator('', [Validators.required(), Validators.m
88
88
  | `clearErrorDelay` | `number` | Delay in ms before `clearOnError` clears the boxes (default `900`) |
89
89
  | `disabled` | `boolean` | |
90
90
  | `autoFocus` | `boolean` | Focuses the first empty box (or the first box) on mount |
91
+ | `ref` | `Ref<HTMLDivElement>` | Ref to the root element |
91
92
 
92
93
  **Slots:** `root` `label` `inputs` `input` `separator`
93
94
 
package/docs/Popover.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Popover
2
2
 
3
- **When to use:** A floating panel anchored to a trigger — profile cards, quick forms, action menus, help panels, filter dropdowns. Reach for `Tooltip` for plain text hints, `FloatingMenu` for a menu that mirrors the trigger width; use `Popover` when you need free content on any side with an arrow.
3
+ **When to use:** Any panel anchored to a trigger: profile cards, quick forms, action menus, pickers, filter dropdowns. It is the one anchored surface in the library, and it absorbed `FloatingMenu`, which used to be the other one. Reach for `Tooltip` instead when all you need is a plain text hint on hover.
4
4
 
5
- **Keywords:** hover card, info panel, bottom sheet, action sheet, mobile, touch
5
+ **Keywords:** hover card, info panel, bottom sheet, action sheet, mobile, touch, anchored panel, dropdown surface
6
6
 
7
7
  **Import:** `import { Popover } from '@ahrowe/ui'`
8
8
 
@@ -49,7 +49,7 @@ import { Popover, PopoverPlacement, PopoverAlign, PopoverTrigger } from '@ahrowe
49
49
  | `trigger` | `PopoverTrigger` | `Click` | What opens the popover |
50
50
  | `isOpen` | `boolean` | — | Controlled open state (omit for uncontrolled) |
51
51
  | `defaultOpen` | `boolean` | `false` | Initial open state when uncontrolled |
52
- | `onOpenChange` | `(isOpen: boolean) => void` | — | Open-state change callback |
52
+ | `onOpenChange` | `(isOpen, { fromKeyboard }) => void` | — | Open-state change callback. `fromKeyboard` says whether a key caused it, which is what a menu uses to decide between putting the focus on an entry and leaving it on the trigger |
53
53
  | `offset` | `number` | `10` | Gap in px between trigger and panel |
54
54
  | `withArrow` | `boolean` | `true` | Render the arrow pointing at the trigger |
55
55
  | `closeOnOutsideClick` | `boolean` | `true` | Close on click outside (ignored for hover trigger) |
@@ -58,15 +58,21 @@ import { Popover, PopoverPlacement, PopoverAlign, PopoverTrigger } from '@ahrowe
58
58
  | `closeDelay` | `number` | `120` | Hover close delay in ms |
59
59
  | `disabled` | `boolean` | `false` | Prevent opening |
60
60
  | `presentation` | `Presentation` | `Default` | Where the panel opens: anchored to the trigger, always a bottom sheet, or a sheet only on a small touch screen |
61
+ | `focusOnOpen` | `boolean \| 'keyboard'` | `'keyboard'` | Move focus into the panel on open, and claim `role="dialog"` with it. `'keyboard'` does it only when the open came from the keyboard, which is the only way into a panel portaled to the end of the document, while a click leaves the focus where the pointer already put it. `true` always, `false` never |
62
+ | `closeOnTriggerClick` | `boolean` | `true` | Whether clicking the trigger while open closes it. Off for a field that opens a picker, where a click to place the caret must not take the panel away |
63
+ | `width` | `'auto' \| 'trigger'` | `'auto'` | `'trigger'` gives the panel at least the trigger's width, for a list that lines up with its field |
64
+ | `constrainWidth` | `boolean` | `true` | Cap the panel at a readable measure. Off for a panel with its own width, a calendar or a media grid |
61
65
 
62
66
  **Slots:** `root` `trigger` `floating` `panel` `arrow` `backdrop` (`backdrop` only exists while presenting as a sheet)
63
67
 
68
+ `root` and `trigger` generate no box of their own, so your trigger sits in your layout exactly as it would without Popover around it: it is the flex item, the grid item, the block-level child, and a row that stretches its children reaches it. The trade is that a `className` or `style` on those two cannot paint a background, padding or a border. Style the trigger you pass in instead.
69
+
64
70
  **Bottom sheet:** `presentation={Presentation.Sheet}` drops the anchoring and the arrow, and pins the panel to the bottom of the screen instead — full width up to 560px, behind a backdrop, scrolling internally past 70% of the viewport height, lifted above an open on-screen keyboard, and shrunk to fit the space that leaves rather than running off the top of the screen. Scrolling on the page behind it is locked while it's open, and tapping the backdrop closes it without pressing whatever sits behind it (`closeOnOutsideClick={false}` leaves the backdrop inert but still blocking). `Presentation.Auto` applies that only when the pointer is coarse *and* the screen is under 768px wide.
65
71
 
66
72
  Only a `Click` trigger presents as a sheet. `Hover` and `Focus` open something small next to whatever caused them, which is the opposite of a screen-owning sheet, so they stay anchored regardless of `presentation`.
67
73
 
68
74
  **Global defaults:** adopts `ConfigProvider`, e.g. `defaultProps={{ Popover: { presentation: Presentation.Auto } }}`, or `presentation={Presentation.Auto}` on the provider itself to set every sheet-capable component at once. See [ConfigProvider.md](ConfigProvider.md).
69
75
 
70
- Requires a `<div id="bodyEnd"></div>` at the app root — the panel is portaled there, same as `Tooltip` and `FloatingMenu`.
76
+ Requires a `<div id="bodyEnd"></div>` at the app root — the panel is portaled there, same as `Tooltip` and `Menu`.
71
77
 
72
- **Keyboard & focus (click trigger):** the panel is portaled to the end of the DOM, so Tab can't reach it naturally. When the panel has focusable content, opening it (click trigger only) moves focus to the first focusable element and the panel gets `role="dialog"`. Tabbing past the last element closes the popover and moves focus to the element after the trigger; Shift+Tab past the first element, and Escape, close it and return focus to the trigger. This is non-modal — focus is not trapped, and hover/focus triggers don't steal focus. Escape closes only the innermost open layer, so a popover inside a `Modal` closes on the first press and leaves the modal open. Popovers with only static content don't manage focus or claim the dialog role.
78
+ **Keyboard & focus (click trigger):** the panel is portaled to the end of the DOM, so Tab can't reach it naturally. When the panel has focusable content and the keyboard opened it (Enter or Space on the trigger, or ArrowDown/ArrowUp), focus moves to the first focusable element and the panel gets `role="dialog"`; a pointer click leaves the focus where it already is. `focusOnOpen` forces either. Tabbing past the last element closes the popover and moves focus to the element after the trigger; Shift+Tab past the first element, and Escape, close it and return focus to the trigger. This is non-modal: focus is not trapped, and hover/focus triggers don't steal focus. Escape closes only the innermost open layer, so a popover inside a `Modal` closes on the first press and leaves the modal open. Popovers with only static content don't manage focus or claim the dialog role.
@@ -40,6 +40,7 @@ import { SearchInput } from '@ahrowe/ui';
40
40
  | Variable | Falls back to |
41
41
  |----------|---------------|
42
42
  | `--search-input-color` | *(none — unset by default)* |
43
+ | `ref` | `Ref<HTMLInputElement>` | Ref to the inner `<input>`, for focusing the field |
43
44
 
44
45
  **Key props:**
45
46
 
@@ -1,13 +1,14 @@
1
1
  # SplitButton
2
2
 
3
- **When to use:** A primary action button with a small attached dropdown for closely related secondary actions, e.g. "Save ▾" opening "Save as draft" / "Save and close". Built from `Button`, `ButtonGroup`, and `FloatingMenu` internally, rather than a mechanism of its own.
3
+ **When to use:** A primary action button with a small attached dropdown for closely related secondary actions, e.g. "Save ▾" opening "Save as draft" / "Save and close". Built from `Button`, `ButtonGroup` and [Menu](Menu.md) internally, rather than a mechanism of its own. Reach for `Menu` on its own when there is no primary action to weld the list to.
4
4
 
5
5
  **Keywords:** dropdown button, button with menu
6
6
 
7
7
  **Import:** `import { SplitButton } from '@ahrowe/ui'`
8
- **Types:** `import type { SplitButtonAction, SplitButtonProps } from '@ahrowe/ui'`
8
+ **Types:** `import type { SplitButtonAction, SplitButtonProps } from '@ahrowe/ui'`
9
+ **Enums:** `import { PopoverAlign } from '@ahrowe/ui'` for `align`.
9
10
 
10
- **Requires:** `<div id="bodyEnd"></div>` in your HTML (the actions menu renders via `FloatingMenu`, which portals).
11
+ **Requires:** `<div id="bodyEnd"></div>` in your HTML (the actions menu is a `Menu`, which portals).
11
12
 
12
13
  ```tsx
13
14
  import { SplitButton } from '@ahrowe/ui';
@@ -73,11 +74,14 @@ import { ButtonStyleType } from '@ahrowe/ui';
73
74
  | `size` | `ButtonSize` | Size variant, shared by both buttons |
74
75
  | `disabled` | `boolean` | Disables both the primary and trigger button |
75
76
  | `isLoading` | `boolean` | Shows a spinner on the primary button (same as `Button`'s own `isLoading`) |
77
+ | `align` | `PopoverAlign` | Which edge of the group the menu lines up with (default `End`, the chevron's side). The menu is a [Menu](Menu.md), hence `Popover`'s enum |
76
78
 
77
79
  **`isLoading` vs. `disabled`:** `isLoading` only affects the primary button — the trigger and its menu stay usable while the primary action is in flight, e.g. to cancel via a menu action. To lock the whole control during the async action instead, pass both: `isLoading={isSaving} disabled={isSaving}`. Setting `disabled` also closes the menu if it happened to be open already, and blocks any in-flight click on a menu action.
78
80
 
79
81
  **Global defaults:** adopts `ConfigProvider`, e.g. `defaultProps={{ SplitButton: { styleType: ButtonStyleType.Default } }}`. See [ConfigProvider.md](ConfigProvider.md).
80
82
 
81
- **Slots:** `root` `primaryButton` `triggerButton` `menu` `menuItem`
83
+ **Keyboard:** the list is a [Menu](Menu.md), so it behaves like one: `↓` `↑` move between actions and skip disabled ones, `Home` and `End` jump to either end, typing a letter jumps to the action that starts with it, `Enter` and `Space` run the focused action, and `Escape` closes and hands the focus back. A click opens the menu without taking the focus, so nothing is marked until you point at an action or press an arrow key; opening with the keyboard focuses the first action straight away. The trigger announces itself as a menu button.
84
+
85
+ **Slots:** `root` `primaryButton` `triggerButton` `menu` `menuItem` (`menu` is Menu's list, `menuItem` one of its rows)
82
86
 
83
87
  **Labels:** `moreActions` — the text this component renders of its own. Pass `labels` to override any of them, on the component or app-wide through `ConfigProvider`; they merge per key. Type: `SplitButtonLabels`.