@kapiuara/ui 0.0.0-stage → 0.1.1

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 (425) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +764 -2
  3. package/dist/components/data/KapiPagination.d.ts +36 -0
  4. package/dist/components/data/KapiPagination.js +102 -0
  5. package/dist/components/data/KapiTable.d.ts +245 -0
  6. package/dist/components/data/KapiTable.js +748 -0
  7. package/dist/components/data/KapiTableFilter.d.ts +48 -0
  8. package/dist/components/data/KapiTableFilter.js +81 -0
  9. package/dist/components/data/index.d.ts +10 -0
  10. package/dist/components/data/tableLogic.d.ts +197 -0
  11. package/dist/components/data/tableLogic.js +145 -0
  12. package/dist/components/data/tableResizeLogic.d.ts +28 -0
  13. package/dist/components/data/tableResizeLogic.js +20 -0
  14. package/dist/components/display/KapiAnnotation.d.ts +32 -0
  15. package/dist/components/display/KapiAnnotation.js +130 -0
  16. package/dist/components/display/KapiAvatar.d.ts +27 -0
  17. package/dist/components/display/KapiAvatar.js +43 -0
  18. package/dist/components/display/KapiAvatarGroup.d.ts +19 -0
  19. package/dist/components/display/KapiAvatarGroup.js +38 -0
  20. package/dist/components/display/KapiBadge.d.ts +21 -0
  21. package/dist/components/display/KapiBadge.js +28 -0
  22. package/dist/components/display/KapiComment.d.ts +27 -0
  23. package/dist/components/display/KapiComment.js +66 -0
  24. package/dist/components/display/KapiCommentComposer.d.ts +49 -0
  25. package/dist/components/display/KapiCommentComposer.js +76 -0
  26. package/dist/components/display/KapiDescriptionList.d.ts +19 -0
  27. package/dist/components/display/KapiDescriptionList.js +35 -0
  28. package/dist/components/display/KapiFileItem.d.ts +39 -0
  29. package/dist/components/display/KapiFileItem.js +74 -0
  30. package/dist/components/display/KapiFileViewer.d.ts +51 -0
  31. package/dist/components/display/KapiFileViewer.js +107 -0
  32. package/dist/components/display/KapiIconTile.d.ts +16 -0
  33. package/dist/components/display/KapiIconTile.js +29 -0
  34. package/dist/components/display/KapiStat.d.ts +24 -0
  35. package/dist/components/display/KapiStat.js +41 -0
  36. package/dist/components/display/KapiTag.d.ts +27 -0
  37. package/dist/components/display/KapiTag.js +44 -0
  38. package/dist/components/display/KapiTimeline.d.ts +15 -0
  39. package/dist/components/display/KapiTimeline.js +30 -0
  40. package/dist/components/display/annotationLogic.d.ts +26 -0
  41. package/dist/components/display/annotationLogic.js +17 -0
  42. package/dist/components/display/avatarGroupLogic.d.ts +14 -0
  43. package/dist/components/display/avatarGroupLogic.js +13 -0
  44. package/dist/components/display/avatarLogic.d.ts +5 -0
  45. package/dist/components/display/avatarLogic.js +9 -0
  46. package/dist/components/display/commentLogic.d.ts +18 -0
  47. package/dist/components/display/commentLogic.js +7 -0
  48. package/dist/components/display/fileItemLogic.d.ts +9 -0
  49. package/dist/components/display/fileItemLogic.js +12 -0
  50. package/dist/components/display/iconTileLogic.d.ts +13 -0
  51. package/dist/components/display/iconTileLogic.js +13 -0
  52. package/dist/components/display/index.d.ts +40 -0
  53. package/dist/components/display/statLogic.d.ts +10 -0
  54. package/dist/components/display/statLogic.js +10 -0
  55. package/dist/components/display/tagLogic.d.ts +11 -0
  56. package/dist/components/display/tagLogic.js +10 -0
  57. package/dist/components/display/timelineLogic.d.ts +5 -0
  58. package/dist/components/display/timelineLogic.js +4 -0
  59. package/dist/components/feedback/KapiAlert.d.ts +28 -0
  60. package/dist/components/feedback/KapiAlert.js +53 -0
  61. package/dist/components/feedback/KapiBulkBar.d.ts +30 -0
  62. package/dist/components/feedback/KapiBulkBar.js +34 -0
  63. package/dist/components/feedback/KapiCountdown.d.ts +26 -0
  64. package/dist/components/feedback/KapiCountdown.js +43 -0
  65. package/dist/components/feedback/KapiEmpty.d.ts +14 -0
  66. package/dist/components/feedback/KapiEmpty.js +31 -0
  67. package/dist/components/feedback/KapiFab.d.ts +34 -0
  68. package/dist/components/feedback/KapiFab.js +116 -0
  69. package/dist/components/feedback/KapiOfflineBanner.d.ts +25 -0
  70. package/dist/components/feedback/KapiOfflineBanner.js +40 -0
  71. package/dist/components/feedback/KapiProgress.d.ts +24 -0
  72. package/dist/components/feedback/KapiProgress.js +94 -0
  73. package/dist/components/feedback/KapiSkeleton.d.ts +12 -0
  74. package/dist/components/feedback/KapiSkeleton.js +16 -0
  75. package/dist/components/feedback/KapiToastContainer.d.ts +16 -0
  76. package/dist/components/feedback/KapiToastContainer.js +81 -0
  77. package/dist/components/feedback/KapiTour.d.ts +40 -0
  78. package/dist/components/feedback/KapiTour.js +157 -0
  79. package/dist/components/feedback/KapiUnsavedBar.d.ts +35 -0
  80. package/dist/components/feedback/KapiUnsavedBar.js +47 -0
  81. package/dist/components/feedback/bulkBarLogic.d.ts +2 -0
  82. package/dist/components/feedback/bulkBarLogic.js +7 -0
  83. package/dist/components/feedback/countdownLogic.d.ts +74 -0
  84. package/dist/components/feedback/countdownLogic.js +70 -0
  85. package/dist/components/feedback/fabLogic.d.ts +17 -0
  86. package/dist/components/feedback/fabLogic.js +10 -0
  87. package/dist/components/feedback/index.d.ts +33 -0
  88. package/dist/components/feedback/offlineBannerLogic.d.ts +10 -0
  89. package/dist/components/feedback/offlineBannerLogic.js +8 -0
  90. package/dist/components/feedback/progressLogic.d.ts +17 -0
  91. package/dist/components/feedback/progressLogic.js +16 -0
  92. package/dist/components/feedback/toastStore.d.ts +62 -0
  93. package/dist/components/feedback/toastStore.js +38 -0
  94. package/dist/components/feedback/tourLogic.d.ts +64 -0
  95. package/dist/components/feedback/tourLogic.js +31 -0
  96. package/dist/components/feedback/unsavedBarLogic.d.ts +2 -0
  97. package/dist/components/feedback/unsavedBarLogic.js +8 -0
  98. package/dist/components/inputs/KapiAutocomplete.d.ts +81 -0
  99. package/dist/components/inputs/KapiAutocomplete.js +205 -0
  100. package/dist/components/inputs/KapiButton.d.ts +23 -0
  101. package/dist/components/inputs/KapiButton.js +25 -0
  102. package/dist/components/inputs/KapiCalendar.d.ts +35 -0
  103. package/dist/components/inputs/KapiCalendar.js +60 -0
  104. package/dist/components/inputs/KapiCalendarGrid.d.ts +29 -0
  105. package/dist/components/inputs/KapiCalendarGrid.js +65 -0
  106. package/dist/components/inputs/KapiCheckCard.d.ts +28 -0
  107. package/dist/components/inputs/KapiCheckCard.js +41 -0
  108. package/dist/components/inputs/KapiCheckbox.d.ts +7 -0
  109. package/dist/components/inputs/KapiCheckbox.js +5 -0
  110. package/dist/components/inputs/KapiDatePicker.d.ts +46 -0
  111. package/dist/components/inputs/KapiDatePicker.js +189 -0
  112. package/dist/components/inputs/KapiDateRangePicker.d.ts +49 -0
  113. package/dist/components/inputs/KapiDateRangePicker.js +179 -0
  114. package/dist/components/inputs/KapiFacetedSearch.d.ts +45 -0
  115. package/dist/components/inputs/KapiFacetedSearch.js +188 -0
  116. package/dist/components/inputs/KapiField.d.ts +33 -0
  117. package/dist/components/inputs/KapiField.js +60 -0
  118. package/dist/components/inputs/KapiFileUpload.d.ts +58 -0
  119. package/dist/components/inputs/KapiFileUpload.js +134 -0
  120. package/dist/components/inputs/KapiIconButton.d.ts +13 -0
  121. package/dist/components/inputs/KapiIconButton.js +16 -0
  122. package/dist/components/inputs/KapiInput.d.ts +92 -0
  123. package/dist/components/inputs/KapiInput.js +123 -0
  124. package/dist/components/inputs/KapiInputGroup.d.ts +37 -0
  125. package/dist/components/inputs/KapiInputGroup.js +29 -0
  126. package/dist/components/inputs/KapiMaskedInput.d.ts +52 -0
  127. package/dist/components/inputs/KapiMaskedInput.js +78 -0
  128. package/dist/components/inputs/KapiNumberStepper.d.ts +44 -0
  129. package/dist/components/inputs/KapiNumberStepper.js +100 -0
  130. package/dist/components/inputs/KapiRadio.d.ts +7 -0
  131. package/dist/components/inputs/KapiRadio.js +5 -0
  132. package/dist/components/inputs/KapiRating.d.ts +55 -0
  133. package/dist/components/inputs/KapiRating.js +99 -0
  134. package/dist/components/inputs/KapiSegmented.d.ts +41 -0
  135. package/dist/components/inputs/KapiSegmented.js +83 -0
  136. package/dist/components/inputs/KapiSelect.d.ts +109 -0
  137. package/dist/components/inputs/KapiSelect.js +443 -0
  138. package/dist/components/inputs/KapiSlider.d.ts +42 -0
  139. package/dist/components/inputs/KapiSlider.js +70 -0
  140. package/dist/components/inputs/KapiSwitch.d.ts +13 -0
  141. package/dist/components/inputs/KapiSwitch.js +28 -0
  142. package/dist/components/inputs/KapiTagInput.d.ts +79 -0
  143. package/dist/components/inputs/KapiTagInput.js +115 -0
  144. package/dist/components/inputs/KapiTextarea.d.ts +32 -0
  145. package/dist/components/inputs/KapiTextarea.js +67 -0
  146. package/dist/components/inputs/asyncSelectLogic.d.ts +42 -0
  147. package/dist/components/inputs/asyncSelectLogic.js +46 -0
  148. package/dist/components/inputs/autocompleteLogic.d.ts +73 -0
  149. package/dist/components/inputs/autocompleteLogic.js +67 -0
  150. package/dist/components/inputs/checkControl.d.ts +20 -0
  151. package/dist/components/inputs/checkControl.js +31 -0
  152. package/dist/components/inputs/datePickerLogic.d.ts +92 -0
  153. package/dist/components/inputs/datePickerLogic.js +174 -0
  154. package/dist/components/inputs/dateRangeLogic.d.ts +31 -0
  155. package/dist/components/inputs/dateRangeLogic.js +44 -0
  156. package/dist/components/inputs/facetedSearchLogic.d.ts +69 -0
  157. package/dist/components/inputs/facetedSearchLogic.js +39 -0
  158. package/dist/components/inputs/fieldLogic.d.ts +67 -0
  159. package/dist/components/inputs/fieldLogic.js +35 -0
  160. package/dist/components/inputs/fileUploadLogic.d.ts +13 -0
  161. package/dist/components/inputs/fileUploadLogic.js +9 -0
  162. package/dist/components/inputs/index.d.ts +55 -0
  163. package/dist/components/inputs/inputGroupLogic.d.ts +22 -0
  164. package/dist/components/inputs/inputGroupLogic.js +9 -0
  165. package/dist/components/inputs/inputLogic.d.ts +25 -0
  166. package/dist/components/inputs/inputLogic.js +10 -0
  167. package/dist/components/inputs/maskLogic.d.ts +34 -0
  168. package/dist/components/inputs/maskLogic.js +57 -0
  169. package/dist/components/inputs/numberStepLogic.d.ts +14 -0
  170. package/dist/components/inputs/numberStepLogic.js +21 -0
  171. package/dist/components/inputs/ratingLogic.d.ts +9 -0
  172. package/dist/components/inputs/ratingLogic.js +22 -0
  173. package/dist/components/inputs/segmentedLogic.d.ts +6 -0
  174. package/dist/components/inputs/segmentedLogic.js +14 -0
  175. package/dist/components/inputs/selectLogic.d.ts +89 -0
  176. package/dist/components/inputs/selectLogic.js +82 -0
  177. package/dist/components/inputs/sliderLogic.d.ts +9 -0
  178. package/dist/components/inputs/sliderLogic.js +17 -0
  179. package/dist/components/inputs/tagInputLogic.d.ts +40 -0
  180. package/dist/components/inputs/tagInputLogic.js +40 -0
  181. package/dist/components/inputs/textareaLogic.d.ts +17 -0
  182. package/dist/components/inputs/textareaLogic.js +13 -0
  183. package/dist/components/inputs/useCalendarFocus.d.ts +13 -0
  184. package/dist/components/inputs/useCalendarFocus.js +25 -0
  185. package/dist/components/inputs/useDatePopSide.d.ts +15 -0
  186. package/dist/components/inputs/useDatePopSide.js +20 -0
  187. package/dist/components/labelsLogic.d.ts +6 -0
  188. package/dist/components/labelsLogic.js +11 -0
  189. package/dist/components/layout/KapiAccessCard.d.ts +40 -0
  190. package/dist/components/layout/KapiAccessCard.js +66 -0
  191. package/dist/components/layout/KapiAccountMenu.d.ts +61 -0
  192. package/dist/components/layout/KapiAccountMenu.js +212 -0
  193. package/dist/components/layout/KapiCard.d.ts +43 -0
  194. package/dist/components/layout/KapiCard.js +53 -0
  195. package/dist/components/layout/KapiCluster.d.ts +15 -0
  196. package/dist/components/layout/KapiCluster.js +21 -0
  197. package/dist/components/layout/KapiContextSlot.d.ts +45 -0
  198. package/dist/components/layout/KapiContextSlot.js +92 -0
  199. package/dist/components/layout/KapiDivider.d.ts +16 -0
  200. package/dist/components/layout/KapiDivider.js +41 -0
  201. package/dist/components/layout/KapiGrid.d.ts +19 -0
  202. package/dist/components/layout/KapiGrid.js +25 -0
  203. package/dist/components/layout/KapiNotificationBell.d.ts +75 -0
  204. package/dist/components/layout/KapiNotificationBell.js +196 -0
  205. package/dist/components/layout/KapiPageHeader.d.ts +28 -0
  206. package/dist/components/layout/KapiPageHeader.js +47 -0
  207. package/dist/components/layout/KapiPanelParts.d.ts +35 -0
  208. package/dist/components/layout/KapiPanelParts.js +63 -0
  209. package/dist/components/layout/KapiRail.d.ts +40 -0
  210. package/dist/components/layout/KapiRail.js +102 -0
  211. package/dist/components/layout/KapiScrollArea.d.ts +40 -0
  212. package/dist/components/layout/KapiScrollArea.js +49 -0
  213. package/dist/components/layout/KapiShell.d.ts +40 -0
  214. package/dist/components/layout/KapiShell.js +48 -0
  215. package/dist/components/layout/KapiStack.d.ts +11 -0
  216. package/dist/components/layout/KapiStack.js +19 -0
  217. package/dist/components/layout/accessCardLogic.d.ts +18 -0
  218. package/dist/components/layout/accessCardLogic.js +11 -0
  219. package/dist/components/layout/cardLogic.d.ts +9 -0
  220. package/dist/components/layout/cardLogic.js +11 -0
  221. package/dist/components/layout/index.d.ts +33 -0
  222. package/dist/components/layout/layoutPrimitives.d.ts +51 -0
  223. package/dist/components/layout/layoutPrimitives.js +58 -0
  224. package/dist/components/layout/notificationBellLogic.d.ts +20 -0
  225. package/dist/components/layout/notificationBellLogic.js +14 -0
  226. package/dist/components/layout/railLogic.d.ts +52 -0
  227. package/dist/components/layout/railLogic.js +16 -0
  228. package/dist/components/locale/KapiLocaleProvider.d.ts +29 -0
  229. package/dist/components/locale/KapiLocaleProvider.js +27 -0
  230. package/dist/components/locale/index.d.ts +5 -0
  231. package/dist/components/locale/labelRegistry.d.ts +110 -0
  232. package/dist/components/locale/linkLabels.d.ts +6 -0
  233. package/dist/components/locale/linkLabels.js +4 -0
  234. package/dist/components/navigation/CtxSlidingList.d.ts +11 -0
  235. package/dist/components/navigation/CtxSlidingList.js +24 -0
  236. package/dist/components/navigation/KapiAccordion.d.ts +24 -0
  237. package/dist/components/navigation/KapiAccordion.js +68 -0
  238. package/dist/components/navigation/KapiBreadcrumb.d.ts +23 -0
  239. package/dist/components/navigation/KapiBreadcrumb.js +32 -0
  240. package/dist/components/navigation/KapiCollapsiblePanel.d.ts +63 -0
  241. package/dist/components/navigation/KapiCollapsiblePanel.js +83 -0
  242. package/dist/components/navigation/KapiContextPanel.d.ts +117 -0
  243. package/dist/components/navigation/KapiContextPanel.js +265 -0
  244. package/dist/components/navigation/KapiFilterChips.d.ts +30 -0
  245. package/dist/components/navigation/KapiFilterChips.js +40 -0
  246. package/dist/components/navigation/KapiNavBadge.d.ts +26 -0
  247. package/dist/components/navigation/KapiNavBadge.js +33 -0
  248. package/dist/components/navigation/KapiPanelGroup.d.ts +69 -0
  249. package/dist/components/navigation/KapiPanelGroup.js +149 -0
  250. package/dist/components/navigation/KapiSteps.d.ts +43 -0
  251. package/dist/components/navigation/KapiSteps.js +63 -0
  252. package/dist/components/navigation/KapiTabs.d.ts +56 -0
  253. package/dist/components/navigation/KapiTabs.js +81 -0
  254. package/dist/components/navigation/KapiTree.d.ts +56 -0
  255. package/dist/components/navigation/KapiTree.js +157 -0
  256. package/dist/components/navigation/KapiWizard.d.ts +49 -0
  257. package/dist/components/navigation/KapiWizard.js +104 -0
  258. package/dist/components/navigation/MiniNavItem.d.ts +35 -0
  259. package/dist/components/navigation/MiniNavItem.js +57 -0
  260. package/dist/components/navigation/accordionLogic.d.ts +4 -0
  261. package/dist/components/navigation/accordionLogic.js +4 -0
  262. package/dist/components/navigation/activeItemLogic.d.ts +7 -0
  263. package/dist/components/navigation/activeItemLogic.js +4 -0
  264. package/dist/components/navigation/breadcrumbLogic.d.ts +8 -0
  265. package/dist/components/navigation/breadcrumbLogic.js +4 -0
  266. package/dist/components/navigation/contextPanelLogic.d.ts +27 -0
  267. package/dist/components/navigation/contextPanelLogic.js +11 -0
  268. package/dist/components/navigation/filterChipsLogic.d.ts +23 -0
  269. package/dist/components/navigation/filterChipsLogic.js +20 -0
  270. package/dist/components/navigation/index.d.ts +39 -0
  271. package/dist/components/navigation/navBadgeLogic.d.ts +26 -0
  272. package/dist/components/navigation/navBadgeLogic.js +16 -0
  273. package/dist/components/navigation/panelGroupLogic.d.ts +15 -0
  274. package/dist/components/navigation/panelGroupLogic.js +13 -0
  275. package/dist/components/navigation/panelMini.d.ts +13 -0
  276. package/dist/components/navigation/panelMini.js +9 -0
  277. package/dist/components/navigation/panelMiniLogic.d.ts +19 -0
  278. package/dist/components/navigation/panelMiniLogic.js +6 -0
  279. package/dist/components/navigation/stepsLogic.d.ts +25 -0
  280. package/dist/components/navigation/stepsLogic.js +10 -0
  281. package/dist/components/navigation/tabsLogic.d.ts +12 -0
  282. package/dist/components/navigation/tabsLogic.js +14 -0
  283. package/dist/components/navigation/treeLogic.d.ts +80 -0
  284. package/dist/components/navigation/treeLogic.js +91 -0
  285. package/dist/components/navigation/wizardLogic.d.ts +11 -0
  286. package/dist/components/navigation/wizardLogic.js +7 -0
  287. package/dist/components/overlays/KapiCanvasForm.d.ts +42 -0
  288. package/dist/components/overlays/KapiCanvasForm.js +60 -0
  289. package/dist/components/overlays/KapiCommandPalette.d.ts +58 -0
  290. package/dist/components/overlays/KapiCommandPalette.js +152 -0
  291. package/dist/components/overlays/KapiConfirm.d.ts +48 -0
  292. package/dist/components/overlays/KapiConfirm.js +94 -0
  293. package/dist/components/overlays/KapiContextMenu.d.ts +51 -0
  294. package/dist/components/overlays/KapiContextMenu.js +90 -0
  295. package/dist/components/overlays/KapiDialogHost.d.ts +23 -0
  296. package/dist/components/overlays/KapiDialogHost.js +129 -0
  297. package/dist/components/overlays/KapiDropdown.d.ts +30 -0
  298. package/dist/components/overlays/KapiDropdown.js +84 -0
  299. package/dist/components/overlays/KapiLoading.d.ts +14 -0
  300. package/dist/components/overlays/KapiLoading.js +43 -0
  301. package/dist/components/overlays/KapiMenuButton.d.ts +25 -0
  302. package/dist/components/overlays/KapiMenuButton.js +109 -0
  303. package/dist/components/overlays/KapiModal.d.ts +61 -0
  304. package/dist/components/overlays/KapiModal.js +106 -0
  305. package/dist/components/overlays/KapiOffcanvas.d.ts +96 -0
  306. package/dist/components/overlays/KapiOffcanvas.js +209 -0
  307. package/dist/components/overlays/KapiOffcanvasStack.d.ts +58 -0
  308. package/dist/components/overlays/KapiOffcanvasStack.js +84 -0
  309. package/dist/components/overlays/KapiPhotoView.d.ts +60 -0
  310. package/dist/components/overlays/KapiPhotoView.js +122 -0
  311. package/dist/components/overlays/KapiPopover.d.ts +46 -0
  312. package/dist/components/overlays/KapiPopover.js +68 -0
  313. package/dist/components/overlays/KapiShapeSheet.d.ts +34 -0
  314. package/dist/components/overlays/KapiShapeSheet.js +82 -0
  315. package/dist/components/overlays/KapiSplitModal.d.ts +41 -0
  316. package/dist/components/overlays/KapiSplitModal.js +125 -0
  317. package/dist/components/overlays/KapiTooltip.d.ts +38 -0
  318. package/dist/components/overlays/KapiTooltip.js +105 -0
  319. package/dist/components/overlays/canvasFormLogic.d.ts +18 -0
  320. package/dist/components/overlays/canvasFormLogic.js +16 -0
  321. package/dist/components/overlays/commandPaletteLogic.d.ts +29 -0
  322. package/dist/components/overlays/commandPaletteLogic.js +19 -0
  323. package/dist/components/overlays/dialogStore.d.ts +114 -0
  324. package/dist/components/overlays/dialogStore.js +76 -0
  325. package/dist/components/overlays/dialogUtils.d.ts +72 -0
  326. package/dist/components/overlays/dialogUtils.js +62 -0
  327. package/dist/components/overlays/exitPresenceLogic.d.ts +14 -0
  328. package/dist/components/overlays/exitPresenceLogic.js +5 -0
  329. package/dist/components/overlays/index.d.ts +38 -0
  330. package/dist/components/overlays/menuButtonLogic.d.ts +58 -0
  331. package/dist/components/overlays/menuButtonLogic.js +9 -0
  332. package/dist/components/overlays/menuKeyboardLogic.d.ts +25 -0
  333. package/dist/components/overlays/menuKeyboardLogic.js +30 -0
  334. package/dist/components/overlays/offcanvasCompanion.d.ts +16 -0
  335. package/dist/components/overlays/offcanvasCompanion.js +6 -0
  336. package/dist/components/overlays/offcanvasResize.d.ts +22 -0
  337. package/dist/components/overlays/offcanvasResize.js +10 -0
  338. package/dist/components/overlays/offcanvasSide.d.ts +30 -0
  339. package/dist/components/overlays/offcanvasSide.js +29 -0
  340. package/dist/components/overlays/offcanvasStack.d.ts +76 -0
  341. package/dist/components/overlays/offcanvasStack.js +72 -0
  342. package/dist/components/overlays/overlayPortal.d.ts +9 -0
  343. package/dist/components/overlays/overlayPortal.js +6 -0
  344. package/dist/components/overlays/popoverLogic.d.ts +94 -0
  345. package/dist/components/overlays/popoverLogic.js +47 -0
  346. package/dist/components/overlays/splitModalLayout.d.ts +8 -0
  347. package/dist/components/overlays/splitModalLayout.js +5 -0
  348. package/dist/components/overlays/useExitPresence.d.ts +14 -0
  349. package/dist/components/overlays/useExitPresence.js +34 -0
  350. package/dist/components/overlays/useNativeDialog.d.ts +30 -0
  351. package/dist/components/overlays/useNativeDialog.js +56 -0
  352. package/dist/components/rootProps.d.ts +17 -0
  353. package/dist/components/rootProps.js +4 -0
  354. package/dist/hooks/breakpointOpenLogic.d.ts +7 -0
  355. package/dist/hooks/breakpointOpenLogic.js +4 -0
  356. package/dist/hooks/dateFormat.d.ts +12 -0
  357. package/dist/hooks/dateFormat.js +15 -0
  358. package/dist/hooks/downloadLogic.d.ts +31 -0
  359. package/dist/hooks/downloadLogic.js +85 -0
  360. package/dist/hooks/focusLogic.d.ts +18 -0
  361. package/dist/hooks/focusLogic.js +17 -0
  362. package/dist/hooks/growOriginLogic.d.ts +22 -0
  363. package/dist/hooks/growOriginLogic.js +10 -0
  364. package/dist/hooks/hotkeyLogic.d.ts +22 -0
  365. package/dist/hooks/hotkeyLogic.js +32 -0
  366. package/dist/hooks/index.d.ts +49 -0
  367. package/dist/hooks/kapiRoot.d.ts +16 -0
  368. package/dist/hooks/kapiRoot.js +9 -0
  369. package/dist/hooks/onlineStatusLogic.d.ts +31 -0
  370. package/dist/hooks/onlineStatusLogic.js +28 -0
  371. package/dist/hooks/persistentStateLogic.d.ts +12 -0
  372. package/dist/hooks/persistentStateLogic.js +17 -0
  373. package/dist/hooks/rafThrottle.d.ts +33 -0
  374. package/dist/hooks/rafThrottle.js +33 -0
  375. package/dist/hooks/recentLogic.d.ts +9 -0
  376. package/dist/hooks/recentLogic.js +10 -0
  377. package/dist/hooks/reducedMotion.d.ts +13 -0
  378. package/dist/hooks/reducedMotion.js +5 -0
  379. package/dist/hooks/rightClick.d.ts +37 -0
  380. package/dist/hooks/rightClick.js +30 -0
  381. package/dist/hooks/scrollCollapseLogic.d.ts +12 -0
  382. package/dist/hooks/scrollCollapseLogic.js +4 -0
  383. package/dist/hooks/scrollEdgesLogic.d.ts +49 -0
  384. package/dist/hooks/scrollEdgesLogic.js +19 -0
  385. package/dist/hooks/slidingIndicatorLogic.d.ts +25 -0
  386. package/dist/hooks/slidingIndicatorLogic.js +15 -0
  387. package/dist/hooks/storageLogic.d.ts +15 -0
  388. package/dist/hooks/storageLogic.js +24 -0
  389. package/dist/hooks/unsavedGuardLogic.d.ts +17 -0
  390. package/dist/hooks/unsavedGuardLogic.js +17 -0
  391. package/dist/hooks/useDragScroll.d.ts +12 -0
  392. package/dist/hooks/useDragScroll.js +32 -0
  393. package/dist/hooks/useGlobalRightClick.d.ts +14 -0
  394. package/dist/hooks/useGlobalRightClick.js +35 -0
  395. package/dist/hooks/useGrowOrigin.d.ts +13 -0
  396. package/dist/hooks/useGrowOrigin.js +16 -0
  397. package/dist/hooks/useHotkey.d.ts +15 -0
  398. package/dist/hooks/useHotkey.js +31 -0
  399. package/dist/hooks/useKapiTheme.d.ts +69 -0
  400. package/dist/hooks/useKapiTheme.js +88 -0
  401. package/dist/hooks/useMediaQuery.d.ts +6 -0
  402. package/dist/hooks/useMediaQuery.js +13 -0
  403. package/dist/hooks/useObjectUrl.d.ts +6 -0
  404. package/dist/hooks/useObjectUrl.js +19 -0
  405. package/dist/hooks/useOnlineStatus.d.ts +7 -0
  406. package/dist/hooks/useOnlineStatus.js +7 -0
  407. package/dist/hooks/usePersistentState.d.ts +19 -0
  408. package/dist/hooks/usePersistentState.js +37 -0
  409. package/dist/hooks/usePlacement.d.ts +36 -0
  410. package/dist/hooks/usePlacement.js +84 -0
  411. package/dist/hooks/useRecent.d.ts +17 -0
  412. package/dist/hooks/useRecent.js +16 -0
  413. package/dist/hooks/useScrollCollapse.d.ts +10 -0
  414. package/dist/hooks/useScrollCollapse.js +27 -0
  415. package/dist/hooks/useScrollEdges.d.ts +32 -0
  416. package/dist/hooks/useScrollEdges.js +91 -0
  417. package/dist/hooks/useSlidingIndicator.d.ts +23 -0
  418. package/dist/hooks/useSlidingIndicator.js +51 -0
  419. package/dist/hooks/useUnsavedGuard.d.ts +70 -0
  420. package/dist/hooks/useUnsavedGuard.js +47 -0
  421. package/dist/index.d.ts +12 -0
  422. package/dist/index.js +162 -0
  423. package/dist/kapi.css +2 -0
  424. package/dist/kapi.layered.css +4 -0
  425. package/package.json +87 -4
@@ -0,0 +1,76 @@
1
+ export type StackEntryState = "open" | "closing";
2
+ export type StackEntry = Readonly<{
3
+ id: string;
4
+ state: StackEntryState;
5
+ }>;
6
+ export type StackState = readonly StackEntry[];
7
+ export type StackAction = {
8
+ type: "add";
9
+ id: string;
10
+ } | {
11
+ type: "mark";
12
+ id: string;
13
+ state: StackEntryState;
14
+ } | {
15
+ type: "remove";
16
+ id: string;
17
+ };
18
+ export declare const EMPTY_STACK: StackState;
19
+ /** Idempotente: devuelve la MISMA referencia si la acción no cambia nada. */
20
+ export declare const stackReducer: (state: StackState, action: StackAction) => StackState;
21
+ /** Cantidad de paneles ABIERTOS (no cerrándose) apilados por encima de `id`. */
22
+ export declare const depthOf: (state: StackState, id: string) => number;
23
+ /** Posición en la pila (0 = base). -1 si no está registrado. */
24
+ export declare const levelOf: (state: StackState, id: string) => number;
25
+ export declare const DEFAULT_PUSH_RATIO = 0.04;
26
+ export declare const DEFAULT_PUSH_OFFSET = 16;
27
+ export declare const MIN_PUSH_SCALE = 0.8;
28
+ export declare const MAX_PUSH_RATIO = 0.2;
29
+ export type PushTransform = {
30
+ scale: number;
31
+ translateX: number;
32
+ };
33
+ /**
34
+ * Cuánto se empuja un panel que tiene `depth` hijos abiertos encima:
35
+ * escala `1 - depth * ratio` (con piso) y corrimiento a la izquierda de
36
+ * `depth * offset` px (asoma como "carta" detrás del hijo).
37
+ */
38
+ export declare const pushTransform: (depth: number, ratio?: number, offset?: number) => PushTransform;
39
+ /** Store mínimo (compatible con useSyncExternalStore) sobre `stackReducer`. */
40
+ export declare const createStackStore: () => {
41
+ getSnapshot: () => StackState;
42
+ getServerSnapshot: () => StackState;
43
+ subscribe: (listener: () => void) => () => void;
44
+ dispatch: (action: StackAction) => void;
45
+ };
46
+ /** Singleton compartido por todos los `KapiOffcanvas` de la página. */
47
+ export declare const offcanvasStackStore: {
48
+ getSnapshot: () => StackState;
49
+ getServerSnapshot: () => StackState;
50
+ subscribe: (listener: () => void) => () => void;
51
+ dispatch: (action: StackAction) => void;
52
+ };
53
+ export type OffcanvasPhase = "unmounted" | "enter" | "open" | "exit";
54
+ export type OffcanvasPhaseEvent = "open" | "entered" | "close" | "exited";
55
+ export declare const phaseReducer: (phase: OffcanvasPhase, event: OffcanvasPhaseEvent) => OffcanvasPhase;
56
+ export type PanelEntry<T> = Readonly<{
57
+ id: string;
58
+ open: boolean;
59
+ config: T;
60
+ }>;
61
+ export type PanelsAction<T> = {
62
+ type: "push";
63
+ id: string;
64
+ config: T;
65
+ } | {
66
+ type: "close";
67
+ id: string;
68
+ } | {
69
+ type: "closeAll";
70
+ } | {
71
+ type: "remove";
72
+ id: string;
73
+ };
74
+ export declare const panelsReducer: <T>(state: readonly PanelEntry<T>[], action: PanelsAction<T>) => readonly PanelEntry<T>[];
75
+ /** Id del panel abierto más alto de la pila (el que cierra Escape / `pop`). */
76
+ export declare const topOpenId: <T>(state: readonly PanelEntry<T>[]) => string | undefined;
@@ -0,0 +1,72 @@
1
+ import { clamp as e } from "./dialogUtils.js";
2
+ //#region src/components/overlays/offcanvasStack.ts
3
+ var t = [], n = (e, t) => {
4
+ let n = e.findIndex((e) => e.id === t.id);
5
+ switch (t.type) {
6
+ case "add": return n >= 0 ? e : [...e, {
7
+ id: t.id,
8
+ state: "open"
9
+ }];
10
+ case "mark": return n < 0 || e[n]?.state === t.state ? e : e.map((e, r) => r === n ? {
11
+ ...e,
12
+ state: t.state
13
+ } : e);
14
+ case "remove": return n < 0 ? e : e.filter((e) => e.id !== t.id);
15
+ }
16
+ }, r = (e, t) => {
17
+ let n = e.findIndex((e) => e.id === t);
18
+ return n < 0 ? 0 : e.slice(n + 1).filter((e) => e.state === "open").length;
19
+ }, i = (e, t) => e.findIndex((e) => e.id === t), a = .04, o = .8, s = .2, c = (t, n = a, r = 16) => {
20
+ let i = Math.max(0, Math.floor(t));
21
+ if (i === 0) return {
22
+ scale: 1,
23
+ translateX: 0
24
+ };
25
+ let c = e(Number.isFinite(n) ? n : a, 0, s), l = Math.max(0, Number.isFinite(r) ? r : 16);
26
+ return {
27
+ scale: Math.round(e(1 - i * c, o, 1) * 1e4) / 1e4,
28
+ translateX: l === 0 ? 0 : -i * l
29
+ };
30
+ }, l = () => {
31
+ let e = t, r = /* @__PURE__ */ new Set();
32
+ return {
33
+ getSnapshot: () => e,
34
+ getServerSnapshot: () => t,
35
+ subscribe: (e) => (r.add(e), () => {
36
+ r.delete(e);
37
+ }),
38
+ dispatch: (t) => {
39
+ let i = n(e, t);
40
+ i !== e && (e = i, r.forEach((e) => e()));
41
+ }
42
+ };
43
+ }, u = l(), d = (e, t) => {
44
+ switch (t) {
45
+ case "open": return e === "unmounted" ? "enter" : e === "exit" ? "open" : e;
46
+ case "entered": return e === "enter" ? "open" : e;
47
+ case "close": return e === "enter" ? "unmounted" : e === "open" ? "exit" : e;
48
+ case "exited": return e === "exit" ? "unmounted" : e;
49
+ }
50
+ }, f = (e, t) => {
51
+ switch (t.type) {
52
+ case "push": return e.some((e) => e.id === t.id) ? e : [...e, {
53
+ id: t.id,
54
+ open: !0,
55
+ config: t.config
56
+ }];
57
+ case "close": {
58
+ let n = e.findIndex((e) => e.id === t.id);
59
+ return n < 0 || e.slice(n).every((e) => !e.open) ? e : e.map((e, t) => t >= n && e.open ? {
60
+ ...e,
61
+ open: !1
62
+ } : e);
63
+ }
64
+ case "closeAll": return e.every((e) => !e.open) ? e : e.map((e) => e.open ? {
65
+ ...e,
66
+ open: !1
67
+ } : e);
68
+ case "remove": return e.some((e) => e.id === t.id) ? e.filter((e) => e.id !== t.id) : e;
69
+ }
70
+ }, p = (e) => [...e].reverse().find((e) => e.open)?.id;
71
+ //#endregion
72
+ export { a as DEFAULT_PUSH_RATIO, t as EMPTY_STACK, s as MAX_PUSH_RATIO, o as MIN_PUSH_SCALE, l as createStackStore, r as depthOf, i as levelOf, u as offcanvasStackStore, f as panelsReducer, d as phaseReducer, c as pushTransform, n as stackReducer, p as topOpenId };
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from "react";
2
+ export type KapiOverlayPortalProps = {
3
+ /** Destino del portal (ver `resolveKapiRoot` en hooks/kapiRoot). Si es `null`, no renderiza. */
4
+ root: HTMLElement | null;
5
+ /** Contenido que se portalea a `root`. */
6
+ children: ReactNode;
7
+ };
8
+ /** Portal fino hacia el nodo `.kapi`. */
9
+ export declare const KapiOverlayPortal: ({ root, children }: KapiOverlayPortalProps) => import("react").ReactPortal | null;
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ import { createPortal as e } from "react-dom";
3
+ //#region src/components/overlays/overlayPortal.tsx
4
+ var t = ({ root: t, children: n }) => t ? e(n, t) : null;
5
+ //#endregion
6
+ export { t as KapiOverlayPortal };
@@ -0,0 +1,94 @@
1
+ /** Lado del ancla donde se abre el popover. */
2
+ export type KapiPopoverSide = "top" | "bottom" | "left" | "right";
3
+ /** Alineación en el eje cruzado: inicio, centro o fin del ancla. */
4
+ export type KapiPopoverAlign = "start" | "center" | "end";
5
+ export type KapiPopoverRect = {
6
+ top: number;
7
+ bottom: number;
8
+ left: number;
9
+ right: number;
10
+ width: number;
11
+ height: number;
12
+ };
13
+ export type KapiPopoverSize = {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ /** Ancla puntual (p. ej. la posición del click derecho). */
18
+ export type KapiPopoverPoint = {
19
+ x: number;
20
+ y: number;
21
+ };
22
+ /** Rect, punto o `null` (sin ancla: se usa `fallback`). */
23
+ export type KapiPopoverAnchor = KapiPopoverRect | KapiPopoverPoint | null;
24
+ /**
25
+ * Cuándo da vuelta al lado opuesto en el eje principal:
26
+ * - `"auto"`: si está medido, no entra y del otro lado hay más lugar (default).
27
+ * - `"if-overflow"`: siempre que no entre, sin mirar el otro lado ni si está medido.
28
+ * - `false`: nunca.
29
+ */
30
+ export type KapiPopoverFlip = "auto" | "if-overflow" | false;
31
+ /**
32
+ * Ancho del popover:
33
+ * - `"content"`: el propio (medido o estimado), sin tocar (default).
34
+ * - `"anchor"`: exactamente el del ancla (salida `width`).
35
+ * - `"min-anchor"`: al menos el del ancla (salida `minWidth`).
36
+ * - `{ max }`: fijo, `max` acotado al viewport menos los márgenes (salida `width`).
37
+ */
38
+ export type KapiPopoverWidth = "content" | "anchor" | "min-anchor" | {
39
+ max: number;
40
+ };
41
+ export type KapiPlacePopoverOptions = {
42
+ /** Lado preferido. Default `"bottom"`. */
43
+ side?: KapiPopoverSide;
44
+ /** Default `"start"`. `"auto"` elige inicio o fin del ancla según el lugar (menús de acciones). */
45
+ align?: KapiPopoverAlign | "auto";
46
+ /** Separación (px) entre ancla y popover. Default `6`. */
47
+ offset?: number;
48
+ /** Margen mínimo (px) al borde del viewport en el eje cruzado. Default `8`. */
49
+ margin?: number;
50
+ /** Default `"auto"`. */
51
+ flip?: KapiPopoverFlip;
52
+ /**
53
+ * Acotar al viewport con `margin`: `true` sólo el eje cruzado (default), `"both"` también el
54
+ * principal, `false` nada.
55
+ */
56
+ shift?: boolean | "both";
57
+ /** Piso (px) de la posición hacia arriba/izquierda en el eje principal. Default `0`. */
58
+ mainMin?: number;
59
+ /** Default `"content"`. */
60
+ width?: KapiPopoverWidth;
61
+ /** Dirección del texto: en `"rtl"` el inicio/fin horizontal se espeja. Default `"ltr"`. */
62
+ dir?: "ltr" | "rtl";
63
+ /** Esquina donde va el popover sin ancla (`null`). Default `{ x: margin, y: margin }`. */
64
+ fallback?: KapiPopoverPoint;
65
+ };
66
+ export type KapiPopoverPlacement = {
67
+ top: number;
68
+ left: number;
69
+ side: KapiPopoverSide;
70
+ align: KapiPopoverAlign;
71
+ /** Centro horizontal del popover (para CSS que centra con `translateX(-50%)`). */
72
+ centerX: number;
73
+ /** Con `width: "anchor"` o `{ max }`. */
74
+ width?: number;
75
+ /** Con `width: "min-anchor"`. */
76
+ minWidth?: number;
77
+ };
78
+ /** Acota `value` a `[margin, viewport - size - margin]`; si no entra, queda en `margin`. */
79
+ export declare const shiftIntoView: (value: number, size: number, viewport: number, margin?: number) => number;
80
+ /**
81
+ * Motor único de posicionamiento (coordenadas de viewport, `position: fixed`) de un elemento
82
+ * flotante anclado a un rect, un punto o nada. En el eje principal da vuelta según `flip`; hacia
83
+ * arriba/izquierda nunca queda por debajo de `mainMin`. En el eje cruzado se acota al viewport con
84
+ * `margin` (`shift`). Puro: el tamaño puede venir medido o estimado.
85
+ */
86
+ export declare function placePopover(anchor: KapiPopoverAnchor, popover: KapiPopoverSize, viewport: KapiPopoverSize, { side, align, offset, margin, flip, shift, mainMin, width: widthMode, dir, fallback }?: KapiPlacePopoverOptions): KapiPopoverPlacement;
87
+ /** ¿Dos ubicaciones son iguales? (guarda de igualdad para no re-renderizar en loop). */
88
+ export declare const samePlacement: (a: KapiPopoverPlacement | null, b: KapiPopoverPlacement | null) => boolean;
89
+ type Containing = {
90
+ contains: (node: never) => boolean;
91
+ } | null | undefined;
92
+ /** ¿El evento cayó fuera del popover y de su ancla? (target nulo: no se considera afuera). */
93
+ export declare const isOutsidePopover: (target: unknown, nodes: ReadonlyArray<Containing>) => boolean;
94
+ export {};
@@ -0,0 +1,47 @@
1
+ //#region src/components/overlays/popoverLogic.ts
2
+ var e = {
3
+ top: "bottom",
4
+ bottom: "top",
5
+ left: "right",
6
+ right: "left"
7
+ }, t = (e, t, n) => Math.max(t, Math.min(e, n)), n = (e, n, r, i = 8) => t(e, i, Math.max(r - n - i, i)), r = (e) => "top" in e ? e : {
8
+ top: e.y,
9
+ bottom: e.y,
10
+ left: e.x,
11
+ right: e.x,
12
+ width: 0,
13
+ height: 0
14
+ }, i = (e) => Number.isFinite(e) && e > 0 ? e : 0, a = (e, t, n) => e === "bottom" ? n.height - t.bottom : e === "top" ? t.top : e === "right" ? n.width - t.right : t.left, o = (e, t, n, r, i) => e === "auto" ? t > 0 && t + n > r && i > r : e === "if-overflow" && t + n > r, s = (e, t, n, r, i) => {
15
+ let a = n > 0 && e + n > r - i, o = e + t / 2 > r / 2, s = n > 0 && e + t - n < i;
16
+ return (a || o) && !s ? "end" : "start";
17
+ }, c = (e) => e === "start" ? "end" : e === "end" ? "start" : e;
18
+ function l(t, l, u, { side: d = "bottom", align: f = "start", offset: p = 6, margin: m = 8, flip: h = "auto", shift: g = !0, mainMin: _ = 0, width: v = "content", dir: y = "ltr", fallback: b = {
19
+ x: m,
20
+ y: m
21
+ } } = {}) {
22
+ let x = t ? r(t) : null, S = d === "top" || d === "bottom", C = l.width, w, T;
23
+ v === "anchor" ? (w = i(x?.width ?? 0), C = w) : v === "min-anchor" ? (T = x?.width ?? 0, C = Math.max(l.width, T)) : typeof v == "object" && (w = Math.max(0, Math.min(v.max, u.width - m * 2)), C = w);
24
+ let E = {
25
+ width: C,
26
+ height: l.height
27
+ }, D = d, O, k, A;
28
+ if (!x) O = S ? b.y : b.x, k = S ? b.x : b.y, A = f === "auto" ? "start" : f;
29
+ else {
30
+ o(h, S ? E.height : E.width, p, a(d, x, u), a(e[d], x, u)) && (D = e[d]), O = D === "bottom" ? x.bottom + p : D === "right" ? x.right + p : D === "top" ? Math.max(_, x.top - p - E.height) : Math.max(_, x.left - p - E.width);
31
+ let t = S ? x.left : x.top, n = S ? x.width : x.height, r = S ? E.width : E.height, i = S ? u.width : u.height, l = y === "rtl" && S, g = f === "auto" ? s(t, n, r, i, m) : l ? c(f) : f;
32
+ A = l ? c(g) : g, k = g === "start" ? t : g === "end" ? t + n - r : t + (n - r) / 2;
33
+ }
34
+ let j = S ? E.width : E.height, M = S ? E.height : E.width, N = g ? n(k, j, S ? u.width : u.height, m) : k;
35
+ g === "both" && (O = n(O, M, S ? u.height : u.width, m));
36
+ let P = S ? O : N, F = S ? N : O, I = {
37
+ top: P,
38
+ left: F,
39
+ side: D,
40
+ align: A,
41
+ centerX: F + E.width / 2
42
+ };
43
+ return w !== void 0 && (I.width = w), T !== void 0 && (I.minWidth = T), I;
44
+ }
45
+ var u = (e, t) => e === t || !!e && !!t && e.top === t.top && e.left === t.left && e.side === t.side && e.align === t.align && e.width === t.width && e.minWidth === t.minWidth && e.centerX === t.centerX, d = (e, t) => e != null && !t.some((t) => t?.contains(e));
46
+ //#endregion
47
+ export { d as isOutsidePopover, l as placePopover, u as samePlacement, n as shiftIntoView };
@@ -0,0 +1,8 @@
1
+ export type KapiSplitModalSide = "left" | "right";
2
+ export declare const DEFAULT_ASIDE_WIDTH = "380px";
3
+ /** DOM order of the two panels: `left` = [aside | main], `right` = [main | aside]. */
4
+ export declare const resolvePanelOrder: (side?: KapiSplitModalSide) => ["aside", "main"] | ["main", "aside"];
5
+ /** Aside width as a CSS length (number → px, numeric string → px, other strings untouched). */
6
+ export declare const resolveAsideWidth: (width: number | string | undefined) => string;
7
+ /** Class list of the split row (side modifier included). */
8
+ export declare const splitModalClasses: (side?: KapiSplitModalSide) => string;
@@ -0,0 +1,5 @@
1
+ import { toCssSize as e } from "./dialogUtils.js";
2
+ //#region src/components/overlays/splitModalLayout.ts
3
+ var t = "380px", n = (e = "left") => e === "right" ? ["main", "aside"] : ["aside", "main"], r = (n) => e(n, t), i = (e = "left") => `kapi-splitmodal kapi-splitmodal--${e === "right" ? "right" : "left"}`;
4
+ //#endregion
5
+ export { t as DEFAULT_ASIDE_WIDTH, r as resolveAsideWidth, n as resolvePanelOrder, i as splitModalClasses };
@@ -0,0 +1,14 @@
1
+ import { type RefObject } from "react";
2
+ /**
3
+ * Mantiene montado un overlay mientras anima su salida. Con `open` en false el componente sigue
4
+ * renderizando (`closing` en true: que ponga `data-closing` y el CSS dispare la animación de salida)
5
+ * hasta que `el` termina su animación/transición; recién ahí `present` pasa a false.
6
+ *
7
+ * La espera se deriva del CSS computado de `el` (nunca un número fijo). Sin movimiento (reduced-motion
8
+ * del SO o `data-motion="reduced"`, o sin animación que esperar) cierra en el mismo commit, así que un
9
+ * overlay sin animación se desmonta igual de rápido que antes. `ref` debe apuntar al elemento que anima.
10
+ */
11
+ export declare const useExitPresence: (open: boolean, ref: RefObject<HTMLElement | null>) => {
12
+ present: boolean;
13
+ closing: boolean;
14
+ };
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { prefersReducedMotion as e } from "../../hooks/reducedMotion.js";
3
+ import { exitWaitMs as t, nextExitPhase as n } from "./exitPresenceLogic.js";
4
+ import { useLayoutEffect as r, useState as i } from "react";
5
+ //#region src/components/overlays/useExitPresence.ts
6
+ var a = (a, o) => {
7
+ let [s, c] = i(a ? "open" : "closed"), l = n(s, a);
8
+ return l !== s && c(l), r(() => {
9
+ if (s !== "closing") return;
10
+ let n = o.current;
11
+ if (!n || e(n)) {
12
+ c("closed");
13
+ return;
14
+ }
15
+ let r = t(getComputedStyle(n));
16
+ if (r <= 0) {
17
+ c("closed");
18
+ return;
19
+ }
20
+ let i = () => c("closed"), a = (e) => {
21
+ e.target === n && i();
22
+ };
23
+ n.addEventListener("animationend", a), n.addEventListener("transitionend", a);
24
+ let l = setTimeout(i, r + 100);
25
+ return () => {
26
+ n.removeEventListener("animationend", a), n.removeEventListener("transitionend", a), clearTimeout(l);
27
+ };
28
+ }, [s, o]), {
29
+ present: l !== "closed",
30
+ closing: l === "closing"
31
+ };
32
+ };
33
+ //#endregion
34
+ export { a as useExitPresence };
@@ -0,0 +1,30 @@
1
+ import { type MouseEvent, type SyntheticEvent } from "react";
2
+ /** Nodo donde se montan los diálogos: la raíz `.kapi` (hereda tokens). `null` en SSR. */
3
+ export declare const getPortalRoot: () => HTMLElement | null;
4
+ export type UseNativeDialogOptions = {
5
+ /**
6
+ * Se llama cuando el usuario pide cerrar (Escape o cierre nativo). Si es
7
+ * `undefined`, el diálogo es bloqueante: Escape se ignora y, si el navegador
8
+ * lo cierra igual, se vuelve a abrir.
9
+ */
10
+ onRequestClose?: (() => void) | undefined;
11
+ /** Bloquea el scroll del `body` mientras está montado. Default true. */
12
+ lockScroll?: boolean;
13
+ };
14
+ /**
15
+ * Ciclo de vida de un `<dialog>` modal nativo: `showModal()` al montar (focus
16
+ * trap, `inert` del fondo, Escape y `::backdrop` los da el navegador), bloqueo de
17
+ * scroll, foco inicial en `[data-autofocus]` y restauración de foco al desmontar.
18
+ */
19
+ export declare const useNativeDialog: ({ onRequestClose, lockScroll }?: UseNativeDialogOptions) => {
20
+ ref: import("react").RefObject<HTMLDialogElement | null>;
21
+ dialogProps: {
22
+ onCancel: (e: SyntheticEvent<HTMLDialogElement>) => void;
23
+ onClose: () => void;
24
+ };
25
+ };
26
+ /** Cierra al hacer click en el fondo (el propio `<dialog>`), no al soltar un drag desde adentro. */
27
+ export declare const useBackdropClose: (onClose: (() => void) | undefined) => {
28
+ onMouseDown: (e: MouseEvent<HTMLDialogElement>) => void;
29
+ onClick: (e: MouseEvent<HTMLDialogElement>) => void;
30
+ };
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { resolveKapiRoot as e } from "../../hooks/kapiRoot.js";
3
+ import { createScrollLock as t } from "./dialogUtils.js";
4
+ import { useCallback as n, useLayoutEffect as r, useRef as i } from "react";
5
+ //#region src/components/overlays/useNativeDialog.ts
6
+ var a = () => e(), o = t({
7
+ getTarget: () => typeof document > "u" ? null : document.body,
8
+ measure: () => ({
9
+ scrollbar: Math.max(0, window.innerWidth - document.documentElement.clientWidth),
10
+ padding: parseFloat(getComputedStyle(document.body).paddingRight) || 0
11
+ })
12
+ }), s = (e) => {
13
+ e.open || (typeof e.showModal == "function" ? e.showModal() : e.setAttribute("open", ""));
14
+ }, c = (e) => {
15
+ typeof e.close == "function" ? e.open && e.close() : e.removeAttribute("open");
16
+ }, l = ({ onRequestClose: e, lockScroll: t = !0 } = {}) => {
17
+ let a = i(null), l = i(e);
18
+ return r(() => {
19
+ l.current = e;
20
+ }), r(() => {
21
+ let e = a.current;
22
+ if (!e) return;
23
+ let n = document.activeElement instanceof HTMLElement ? document.activeElement : null;
24
+ s(e);
25
+ let r = t ? o.acquire() : void 0;
26
+ return e.querySelector("[data-autofocus]")?.focus(), () => {
27
+ r?.(), c(e), n?.isConnected && n.focus();
28
+ };
29
+ }, [t]), {
30
+ ref: a,
31
+ dialogProps: {
32
+ onCancel: n((e) => {
33
+ e.nativeEvent.cancelable && (e.preventDefault(), l.current?.());
34
+ }, []),
35
+ onClose: n(() => {
36
+ let e = a.current;
37
+ e && (e.open || (l.current?.(), setTimeout(() => {
38
+ e.isConnected && !e.open && s(e);
39
+ }, 0)));
40
+ }, [])
41
+ }
42
+ };
43
+ }, u = (e) => {
44
+ let t = i(!1);
45
+ return {
46
+ onMouseDown: (e) => {
47
+ t.current = e.target === e.currentTarget;
48
+ },
49
+ onClick: (n) => {
50
+ let r = t.current && n.target === n.currentTarget;
51
+ t.current = !1, r && e?.();
52
+ }
53
+ };
54
+ };
55
+ //#endregion
56
+ export { a as getPortalRoot, u as useBackdropClose, l as useNativeDialog };
@@ -0,0 +1,17 @@
1
+ import type { CSSProperties } from "react";
2
+ /**
3
+ * Atributos nativos mínimos que acepta todo componente cuyo elemento visible no es un elemento
4
+ * plano propio (portaleado, compuesto o con varias raíces). Cada componente documenta en qué
5
+ * elemento caen. Los componentes con un elemento raíz plano aceptan además el resto de los
6
+ * atributos nativos (`data-*`, `aria-*`, handlers).
7
+ */
8
+ export type KapiRootProps = {
9
+ /** Clase extra de la superficie visible (se une a las clases propias). */
10
+ className?: string | undefined;
11
+ /** Estilos en línea de la superficie visible. */
12
+ style?: CSSProperties | undefined;
13
+ /** `id` de la superficie visible. */
14
+ id?: string | undefined;
15
+ };
16
+ /** Une clases ignorando las vacías. Pura. */
17
+ export declare const joinClasses: (...parts: Array<string | false | null | undefined>) => string;
@@ -0,0 +1,4 @@
1
+ //#region src/components/rootProps.ts
2
+ var e = (...e) => e.filter(Boolean).join(" ");
3
+ //#endregion
4
+ export { e as joinClasses };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Estado abierto/cerrado de un panel que en desktop es lateral y en móvil es drawer, al cruzar
3
+ * el breakpoint (lógica pura). Devuelve el nuevo estado, o `null` si no hubo cruce.
4
+ * - desktop → móvil: se cierra (un drawer abierto taparía todo con su backdrop).
5
+ * - móvil → desktop: vuelve al último estado que tenía en desktop.
6
+ */
7
+ export declare const openOnBreakpointCross: (wasMobile: boolean, isMobile: boolean, lastDesktopOpen: boolean) => boolean | null;
@@ -0,0 +1,4 @@
1
+ //#region src/hooks/breakpointOpenLogic.ts
2
+ var e = (e, t, n) => e === t ? null : !t && n;
3
+ //#endregion
4
+ export { e as openOnBreakpointCross };
@@ -0,0 +1,12 @@
1
+ export declare const isoDateTime: (date: Date | string) => string | null;
2
+ /**
3
+ * Fecha relativa a `now` con `Intl.RelativeTimeFormat` ("ahora", "hace 5 minutos", "ayer",
4
+ * "hace 2 semanas", "dentro de 10 minutos"…). Acepta `Date` o string parseable; una fecha inválida
5
+ * devuelve "". Trunca en vez de redondear: 59,5 minutos es "hace 59 minutos", nunca "hace 60 minutos".
6
+ */
7
+ export declare const formatRelativeTime: (date: Date | string, now?: Date, locale?: string) => string;
8
+ /**
9
+ * Fecha absoluta con `Intl.DateTimeFormat` (default `{ dateStyle: "medium" }`: "12 mar 2026").
10
+ * Acepta `Date` o string parseable; una fecha inválida devuelve "".
11
+ */
12
+ export declare const formatDate: (date: Date | string, locale?: string, options?: Intl.DateTimeFormatOptions) => string;
@@ -0,0 +1,15 @@
1
+ //#region src/hooks/dateFormat.ts
2
+ var e = 6e4, t = 60 * e, n = 24 * t, r = 7 * n, i = 30 * n, a = 365 * n, o = /* @__PURE__ */ new Map(), s = (e) => {
3
+ let t = o.get(e);
4
+ return t || (t = new Intl.RelativeTimeFormat(e, { numeric: "auto" }), o.set(e, t)), t;
5
+ }, c = (e) => (typeof e == "string" ? new Date(e) : e).getTime(), l = /^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/, u = (e) => Number.isFinite(c(e)) ? typeof e == "string" && l.test(e) ? e : (typeof e == "string" ? new Date(e) : e).toISOString() : null, d = (o, l = /* @__PURE__ */ new Date(), u = "es") => {
6
+ let d = c(o);
7
+ if (!Number.isFinite(d)) return "";
8
+ let f = d - l.getTime(), p = Math.abs(f), m = s(u);
9
+ return p < e ? m.format(0, "second") : p < t ? m.format(Math.trunc(f / e), "minute") : p < n ? m.format(Math.trunc(f / t), "hour") : p < r ? m.format(Math.trunc(f / n), "day") : p < i ? m.format(Math.trunc(f / r), "week") : p < a ? m.format(Math.trunc(f / i), "month") : m.format(Math.trunc(f / a), "year");
10
+ }, f = (e, t = "es", n = { dateStyle: "medium" }) => {
11
+ let r = c(e);
12
+ return Number.isFinite(r) ? new Intl.DateTimeFormat(t, n).format(r) : "";
13
+ };
14
+ //#endregion
15
+ export { f as formatDate, d as formatRelativeTime, u as isoDateTime };
@@ -0,0 +1,31 @@
1
+ /** Cómo se puede mostrar un archivo en el navegador. */
2
+ export type KapiFileKind = "pdf" | "image" | "text" | "other";
3
+ /**
4
+ * Nombre de archivo de un header `Content-Disposition` (RFC 6266): `filename*` (UTF-8, codificado)
5
+ * gana sobre `filename`. Se descartan las rutas. `null` si no trae nombre.
6
+ */
7
+ export declare const fileNameFromContentDisposition: (header: string | null | undefined) => string | null;
8
+ /** Nombre de archivo del último segmento de una URL (sin query ni hash). `null` para `blob:`/`data:`. */
9
+ export declare const fileNameFromUrl: (url: string) => string | null;
10
+ /**
11
+ * Tipo de visualización a partir de un MIME (`application/pdf`) o de un nombre/URL (`acta.pdf`).
12
+ * `text` es solo texto plano y JSON: CSV, HTML y el resto van a `other` (se descargan).
13
+ */
14
+ export declare const fileKind: (mimeOrName: string | null | undefined) => KapiFileKind;
15
+ /**
16
+ * Tamaño legible en base 1024: "0 B", "512 B", "1,5 KB", "23 MB", "1,2 GB" (bytes sin decimales; el
17
+ * resto con un decimal como máximo, según `locale`). Si el redondeo llega a 1024 sube de unidad
18
+ * ("1 MB", nunca "1024 KB"). Negativo, `NaN` o infinito → "".
19
+ */
20
+ export declare const formatFileSize: (bytes: number, locale?: string) => string;
21
+ /**
22
+ * URL que se puede poner en un `href`/`data`/`src` del visor: relativa, `http(s):`, `blob:` o un
23
+ * `data:` de imagen o PDF. Rechaza `javascript:` y el resto de los esquemas.
24
+ */
25
+ export declare const isSafeFileUrl: (url: string) => boolean;
26
+ /**
27
+ * Descarga un Blob con un nombre: crea una URL temporal, hace click en un `<a download>` y lo quita.
28
+ * La URL se revoca en el próximo tick (para que el click llegue a iniciar la descarga). Fuera del
29
+ * navegador no hace nada.
30
+ */
31
+ export declare const downloadBlob: (blob: Blob, fileName: string) => void;
@@ -0,0 +1,85 @@
1
+ //#region src/hooks/downloadLogic.ts
2
+ var e = (e) => e.split(/[\\/]/).pop() ?? "", t = (e) => {
3
+ let t = /* @__PURE__ */ new Map();
4
+ for (let n of `;${e}`.matchAll(/;\s*([^\s=;]+)\s*=\s*("(?:[^"\\]|\\.)*"|[^;]*)/g)) {
5
+ let e = (n[1] ?? "").toLowerCase(), r = (n[2] ?? "").trim();
6
+ r.startsWith("\"") && (r = r.slice(1, -1).replace(/\\(["\\])/g, "$1")), t.has(e) || t.set(e, r);
7
+ }
8
+ return t;
9
+ }, n = (e) => {
10
+ let t = /^([^']*)'[^']*'(.*)$/.exec(e);
11
+ if (!t) return null;
12
+ let n = (t[1] ?? "").toLowerCase();
13
+ if (n !== "utf-8" && n !== "") return null;
14
+ try {
15
+ return decodeURIComponent(t[2] ?? "");
16
+ } catch {
17
+ return null;
18
+ }
19
+ }, r = (r) => {
20
+ if (!r) return null;
21
+ let i = t(r), a = i.get("filename*");
22
+ return e((a === void 0 ? null : n(a)) ?? i.get("filename") ?? "") || null;
23
+ }, i = (t) => {
24
+ if (!t || /^(blob|data):/i.test(t)) return null;
25
+ let n = e((t.split(/[?#]/)[0] ?? "").replace(/^[a-z][a-z0-9+.-]*:\/\/[^/\\]*/i, ""));
26
+ if (!n) return null;
27
+ try {
28
+ return decodeURIComponent(n);
29
+ } catch {
30
+ return n;
31
+ }
32
+ }, a = /* @__PURE__ */ new Set([
33
+ "png",
34
+ "jpg",
35
+ "jpeg",
36
+ "gif",
37
+ "webp",
38
+ "avif",
39
+ "bmp",
40
+ "svg",
41
+ "ico"
42
+ ]), o = /* @__PURE__ */ new Set([
43
+ "txt",
44
+ "log",
45
+ "json",
46
+ "md"
47
+ ]), s = /* @__PURE__ */ new Set(["text/plain", "application/json"]), c = /^(application|audio|font|image|message|model|multipart|text|video)\/[a-z0-9.+-]+$/, l = (t) => {
48
+ let n = (t ?? "").trim().toLowerCase();
49
+ if (!n) return "other";
50
+ let r = e(n.split(/[?#]/)[0] ?? ""), i = r.lastIndexOf("."), l = i < 0 ? "" : r.slice(i + 1);
51
+ if (l === "pdf") return "pdf";
52
+ if (a.has(l)) return "image";
53
+ if (o.has(l)) return "text";
54
+ let u = (n.split(";")[0] ?? "").trim();
55
+ return c.test(u) ? u === "application/pdf" ? "pdf" : u.startsWith("image/") ? "image" : s.has(u) ? "text" : "other" : "other";
56
+ }, u = [
57
+ "B",
58
+ "KB",
59
+ "MB",
60
+ "GB",
61
+ "TB"
62
+ ], d = /* @__PURE__ */ new Map(), f = (e, t) => {
63
+ let n = `${e}|${t}`, r = d.get(n);
64
+ return r || (r = new Intl.NumberFormat(e, { maximumFractionDigits: t }), d.set(n, r)), r;
65
+ }, p = (e, t = "es") => {
66
+ if (!Number.isFinite(e) || e < 0) return "";
67
+ let n = 0, r = e;
68
+ for (; n < u.length - 1 && r >= 1024;) r /= 1024, n++;
69
+ let i = 10 ** (n === 0 ? 0 : 1);
70
+ return Math.round(r * i) / i >= 1024 && n < u.length - 1 && (r /= 1024, n++), `${f(t, n === 0 ? 0 : 1).format(r)} ${u[n]}`;
71
+ }, m = (e) => {
72
+ let t = 0, n = e.length;
73
+ for (; t < n && e.charCodeAt(t) <= 32;) t++;
74
+ for (; n > t && e.charCodeAt(n - 1) <= 32;) n--;
75
+ return e.slice(t, n);
76
+ }, h = (e) => {
77
+ let t = m(e.replace(/[\t\n\r]/g, "")).toLowerCase(), n = /^([a-z][a-z0-9+.-]*):/.exec(t)?.[1];
78
+ return n === void 0 ? !0 : n === "data" ? /^data:(image\/|application\/pdf[;,])/.test(t) : n === "http" || n === "https" || n === "blob";
79
+ }, g = (e, t) => {
80
+ if (typeof document > "u" || typeof URL.createObjectURL != "function") return;
81
+ let n = URL.createObjectURL(e), r = document.createElement("a");
82
+ r.href = n, r.download = t, r.style.display = "none", document.body.appendChild(r), r.click(), r.remove(), setTimeout(() => URL.revokeObjectURL(n), 0);
83
+ };
84
+ //#endregion
85
+ export { g as downloadBlob, l as fileKind, r as fileNameFromContentDisposition, i as fileNameFromUrl, p as formatFileSize, h as isSafeFileUrl };