@pyric/ui 0.1.0-alpha.10

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 (603) hide show
  1. package/LICENSE +216 -0
  2. package/README.md +79 -0
  3. package/dist/agents/ContextWindowUsage.d.ts +67 -0
  4. package/dist/agents/ContextWindowUsage.d.ts.map +1 -0
  5. package/dist/agents/ContextWindowUsage.js +115 -0
  6. package/dist/agents/ContextWindowUsage.js.map +1 -0
  7. package/dist/agents/EmptyState.d.ts +18 -0
  8. package/dist/agents/EmptyState.d.ts.map +1 -0
  9. package/dist/agents/EmptyState.js +11 -0
  10. package/dist/agents/EmptyState.js.map +1 -0
  11. package/dist/agents/Fold.d.ts +37 -0
  12. package/dist/agents/Fold.d.ts.map +1 -0
  13. package/dist/agents/Fold.js +18 -0
  14. package/dist/agents/Fold.js.map +1 -0
  15. package/dist/agents/Modal.d.ts +25 -0
  16. package/dist/agents/Modal.d.ts.map +1 -0
  17. package/dist/agents/Modal.js +28 -0
  18. package/dist/agents/Modal.js.map +1 -0
  19. package/dist/agents/PulsingDot.d.ts +21 -0
  20. package/dist/agents/PulsingDot.d.ts.map +1 -0
  21. package/dist/agents/PulsingDot.js +18 -0
  22. package/dist/agents/PulsingDot.js.map +1 -0
  23. package/dist/agents/index.d.ts +15 -0
  24. package/dist/agents/index.d.ts.map +1 -0
  25. package/dist/agents/index.js +15 -0
  26. package/dist/agents/index.js.map +1 -0
  27. package/dist/auth/authApi.d.ts +32 -0
  28. package/dist/auth/authApi.d.ts.map +1 -0
  29. package/dist/auth/authApi.js +27 -0
  30. package/dist/auth/authApi.js.map +1 -0
  31. package/dist/auth/claims.d.ts +27 -0
  32. package/dist/auth/claims.d.ts.map +1 -0
  33. package/dist/auth/claims.js +58 -0
  34. package/dist/auth/claims.js.map +1 -0
  35. package/dist/auth/components/AuthProviderToggles.d.ts +31 -0
  36. package/dist/auth/components/AuthProviderToggles.d.ts.map +1 -0
  37. package/dist/auth/components/AuthProviderToggles.js +48 -0
  38. package/dist/auth/components/AuthProviderToggles.js.map +1 -0
  39. package/dist/auth/components/AuthSignInHelper.d.ts +57 -0
  40. package/dist/auth/components/AuthSignInHelper.d.ts.map +1 -0
  41. package/dist/auth/components/AuthSignInHelper.js +69 -0
  42. package/dist/auth/components/AuthSignInHelper.js.map +1 -0
  43. package/dist/auth/components/AuthUserForm.d.ts +84 -0
  44. package/dist/auth/components/AuthUserForm.d.ts.map +1 -0
  45. package/dist/auth/components/AuthUserForm.js +89 -0
  46. package/dist/auth/components/AuthUserForm.js.map +1 -0
  47. package/dist/auth/components/AuthUserList.d.ts +62 -0
  48. package/dist/auth/components/AuthUserList.d.ts.map +1 -0
  49. package/dist/auth/components/AuthUserList.js +46 -0
  50. package/dist/auth/components/AuthUserList.js.map +1 -0
  51. package/dist/auth/components/ClaimsField.d.ts +22 -0
  52. package/dist/auth/components/ClaimsField.d.ts.map +1 -0
  53. package/dist/auth/components/ClaimsField.js +11 -0
  54. package/dist/auth/components/ClaimsField.js.map +1 -0
  55. package/dist/auth/components/confirmActions.d.ts +40 -0
  56. package/dist/auth/components/confirmActions.d.ts.map +1 -0
  57. package/dist/auth/components/confirmActions.js +49 -0
  58. package/dist/auth/components/confirmActions.js.map +1 -0
  59. package/dist/auth/controller.d.ts +73 -0
  60. package/dist/auth/controller.d.ts.map +1 -0
  61. package/dist/auth/controller.js +139 -0
  62. package/dist/auth/controller.js.map +1 -0
  63. package/dist/auth/hooks/index.d.ts +7 -0
  64. package/dist/auth/hooks/index.d.ts.map +1 -0
  65. package/dist/auth/hooks/index.js +7 -0
  66. package/dist/auth/hooks/index.js.map +1 -0
  67. package/dist/auth/hooks/useAuthFlowHelper.d.ts +30 -0
  68. package/dist/auth/hooks/useAuthFlowHelper.d.ts.map +1 -0
  69. package/dist/auth/hooks/useAuthFlowHelper.js +30 -0
  70. package/dist/auth/hooks/useAuthFlowHelper.js.map +1 -0
  71. package/dist/auth/hooks/useAuthProviderConfig.d.ts +37 -0
  72. package/dist/auth/hooks/useAuthProviderConfig.d.ts.map +1 -0
  73. package/dist/auth/hooks/useAuthProviderConfig.js +98 -0
  74. package/dist/auth/hooks/useAuthProviderConfig.js.map +1 -0
  75. package/dist/auth/hooks/useAuthUserEditor.d.ts +30 -0
  76. package/dist/auth/hooks/useAuthUserEditor.d.ts.map +1 -0
  77. package/dist/auth/hooks/useAuthUserEditor.js +27 -0
  78. package/dist/auth/hooks/useAuthUserEditor.js.map +1 -0
  79. package/dist/auth/hooks/useAuthUsers.d.ts +38 -0
  80. package/dist/auth/hooks/useAuthUsers.d.ts.map +1 -0
  81. package/dist/auth/hooks/useAuthUsers.js +111 -0
  82. package/dist/auth/hooks/useAuthUsers.js.map +1 -0
  83. package/dist/auth/index.d.ts +11 -0
  84. package/dist/auth/index.d.ts.map +1 -0
  85. package/dist/auth/index.js +13 -0
  86. package/dist/auth/index.js.map +1 -0
  87. package/dist/auth/providers.d.ts +11 -0
  88. package/dist/auth/providers.d.ts.map +1 -0
  89. package/dist/auth/providers.js +28 -0
  90. package/dist/auth/providers.js.map +1 -0
  91. package/dist/auth/reducers/userEditor.d.ts +55 -0
  92. package/dist/auth/reducers/userEditor.d.ts.map +1 -0
  93. package/dist/auth/reducers/userEditor.js +136 -0
  94. package/dist/auth/reducers/userEditor.js.map +1 -0
  95. package/dist/events/components/ActivityActionItems.d.ts +45 -0
  96. package/dist/events/components/ActivityActionItems.d.ts.map +1 -0
  97. package/dist/events/components/ActivityActionItems.js +68 -0
  98. package/dist/events/components/ActivityActionItems.js.map +1 -0
  99. package/dist/events/components/ActivityGrid.d.ts +65 -0
  100. package/dist/events/components/ActivityGrid.d.ts.map +1 -0
  101. package/dist/events/components/ActivityGrid.js +61 -0
  102. package/dist/events/components/ActivityGrid.js.map +1 -0
  103. package/dist/events/components/ActivityGridRow.d.ts +31 -0
  104. package/dist/events/components/ActivityGridRow.d.ts.map +1 -0
  105. package/dist/events/components/ActivityGridRow.js +23 -0
  106. package/dist/events/components/ActivityGridRow.js.map +1 -0
  107. package/dist/events/components/ProposedChangeDiff.d.ts +46 -0
  108. package/dist/events/components/ProposedChangeDiff.d.ts.map +1 -0
  109. package/dist/events/components/ProposedChangeDiff.js +60 -0
  110. package/dist/events/components/ProposedChangeDiff.js.map +1 -0
  111. package/dist/events/components/format.d.ts +11 -0
  112. package/dist/events/components/format.d.ts.map +1 -0
  113. package/dist/events/components/format.js +26 -0
  114. package/dist/events/components/format.js.map +1 -0
  115. package/dist/events/components/index.d.ts +6 -0
  116. package/dist/events/components/index.d.ts.map +1 -0
  117. package/dist/events/components/index.js +6 -0
  118. package/dist/events/components/index.js.map +1 -0
  119. package/dist/events/digest.d.ts +167 -0
  120. package/dist/events/digest.d.ts.map +1 -0
  121. package/dist/events/digest.js +426 -0
  122. package/dist/events/digest.js.map +1 -0
  123. package/dist/events/hooks/index.d.ts +3 -0
  124. package/dist/events/hooks/index.d.ts.map +1 -0
  125. package/dist/events/hooks/index.js +3 -0
  126. package/dist/events/hooks/index.js.map +1 -0
  127. package/dist/events/hooks/useActivityDigest.d.ts +27 -0
  128. package/dist/events/hooks/useActivityDigest.d.ts.map +1 -0
  129. package/dist/events/hooks/useActivityDigest.js +18 -0
  130. package/dist/events/hooks/useActivityDigest.js.map +1 -0
  131. package/dist/events/hooks/useActivityStream.d.ts +44 -0
  132. package/dist/events/hooks/useActivityStream.d.ts.map +1 -0
  133. package/dist/events/hooks/useActivityStream.js +38 -0
  134. package/dist/events/hooks/useActivityStream.js.map +1 -0
  135. package/dist/events/index.d.ts +15 -0
  136. package/dist/events/index.d.ts.map +1 -0
  137. package/dist/events/index.js +14 -0
  138. package/dist/events/index.js.map +1 -0
  139. package/dist/events/types.d.ts +160 -0
  140. package/dist/events/types.d.ts.map +1 -0
  141. package/dist/events/types.js +21 -0
  142. package/dist/events/types.js.map +1 -0
  143. package/dist/firestore/components/CollectionList.d.ts +22 -0
  144. package/dist/firestore/components/CollectionList.d.ts.map +1 -0
  145. package/dist/firestore/components/CollectionList.js +21 -0
  146. package/dist/firestore/components/CollectionList.js.map +1 -0
  147. package/dist/firestore/components/DeleteWithConfirm.d.ts +38 -0
  148. package/dist/firestore/components/DeleteWithConfirm.d.ts.map +1 -0
  149. package/dist/firestore/components/DeleteWithConfirm.js +33 -0
  150. package/dist/firestore/components/DeleteWithConfirm.js.map +1 -0
  151. package/dist/firestore/components/DocumentEditor.d.ts +47 -0
  152. package/dist/firestore/components/DocumentEditor.d.ts.map +1 -0
  153. package/dist/firestore/components/DocumentEditor.js +176 -0
  154. package/dist/firestore/components/DocumentEditor.js.map +1 -0
  155. package/dist/firestore/components/DocumentList.d.ts +63 -0
  156. package/dist/firestore/components/DocumentList.d.ts.map +1 -0
  157. package/dist/firestore/components/DocumentList.js +53 -0
  158. package/dist/firestore/components/DocumentList.js.map +1 -0
  159. package/dist/firestore/components/DocumentPreview.d.ts +68 -0
  160. package/dist/firestore/components/DocumentPreview.d.ts.map +1 -0
  161. package/dist/firestore/components/DocumentPreview.js +76 -0
  162. package/dist/firestore/components/DocumentPreview.js.map +1 -0
  163. package/dist/firestore/components/FieldRenderer.d.ts +17 -0
  164. package/dist/firestore/components/FieldRenderer.d.ts.map +1 -0
  165. package/dist/firestore/components/FieldRenderer.js +16 -0
  166. package/dist/firestore/components/FieldRenderer.js.map +1 -0
  167. package/dist/firestore/components/QueryBuilder.d.ts +25 -0
  168. package/dist/firestore/components/QueryBuilder.d.ts.map +1 -0
  169. package/dist/firestore/components/QueryBuilder.js +78 -0
  170. package/dist/firestore/components/QueryBuilder.js.map +1 -0
  171. package/dist/firestore/components/ReferencePicker.d.ts +33 -0
  172. package/dist/firestore/components/ReferencePicker.d.ts.map +1 -0
  173. package/dist/firestore/components/ReferencePicker.js +42 -0
  174. package/dist/firestore/components/ReferencePicker.js.map +1 -0
  175. package/dist/firestore/components/TreeEntry.d.ts +15 -0
  176. package/dist/firestore/components/TreeEntry.d.ts.map +1 -0
  177. package/dist/firestore/components/TreeEntry.js +23 -0
  178. package/dist/firestore/components/TreeEntry.js.map +1 -0
  179. package/dist/firestore/components/context.d.ts +18 -0
  180. package/dist/firestore/components/context.d.ts.map +1 -0
  181. package/dist/firestore/components/context.js +7 -0
  182. package/dist/firestore/components/context.js.map +1 -0
  183. package/dist/firestore/fieldEditors/array.d.ts +3 -0
  184. package/dist/firestore/fieldEditors/array.d.ts.map +1 -0
  185. package/dist/firestore/fieldEditors/array.js +16 -0
  186. package/dist/firestore/fieldEditors/array.js.map +1 -0
  187. package/dist/firestore/fieldEditors/boolean.d.ts +3 -0
  188. package/dist/firestore/fieldEditors/boolean.d.ts.map +1 -0
  189. package/dist/firestore/fieldEditors/boolean.js +13 -0
  190. package/dist/firestore/fieldEditors/boolean.js.map +1 -0
  191. package/dist/firestore/fieldEditors/bytes.d.ts +4 -0
  192. package/dist/firestore/fieldEditors/bytes.d.ts.map +1 -0
  193. package/dist/firestore/fieldEditors/bytes.js +31 -0
  194. package/dist/firestore/fieldEditors/bytes.js.map +1 -0
  195. package/dist/firestore/fieldEditors/geopoint.d.ts +4 -0
  196. package/dist/firestore/fieldEditors/geopoint.d.ts.map +1 -0
  197. package/dist/firestore/fieldEditors/geopoint.js +32 -0
  198. package/dist/firestore/fieldEditors/geopoint.js.map +1 -0
  199. package/dist/firestore/fieldEditors/map.d.ts +3 -0
  200. package/dist/firestore/fieldEditors/map.d.ts.map +1 -0
  201. package/dist/firestore/fieldEditors/map.js +19 -0
  202. package/dist/firestore/fieldEditors/map.js.map +1 -0
  203. package/dist/firestore/fieldEditors/null.d.ts +3 -0
  204. package/dist/firestore/fieldEditors/null.d.ts.map +1 -0
  205. package/dist/firestore/fieldEditors/null.js +17 -0
  206. package/dist/firestore/fieldEditors/null.js.map +1 -0
  207. package/dist/firestore/fieldEditors/number.d.ts +3 -0
  208. package/dist/firestore/fieldEditors/number.d.ts.map +1 -0
  209. package/dist/firestore/fieldEditors/number.js +24 -0
  210. package/dist/firestore/fieldEditors/number.js.map +1 -0
  211. package/dist/firestore/fieldEditors/reference.d.ts +4 -0
  212. package/dist/firestore/fieldEditors/reference.d.ts.map +1 -0
  213. package/dist/firestore/fieldEditors/reference.js +49 -0
  214. package/dist/firestore/fieldEditors/reference.js.map +1 -0
  215. package/dist/firestore/fieldEditors/registry.d.ts +16 -0
  216. package/dist/firestore/fieldEditors/registry.d.ts.map +1 -0
  217. package/dist/firestore/fieldEditors/registry.js +42 -0
  218. package/dist/firestore/fieldEditors/registry.js.map +1 -0
  219. package/dist/firestore/fieldEditors/string.d.ts +3 -0
  220. package/dist/firestore/fieldEditors/string.d.ts.map +1 -0
  221. package/dist/firestore/fieldEditors/string.js +13 -0
  222. package/dist/firestore/fieldEditors/string.js.map +1 -0
  223. package/dist/firestore/fieldEditors/timestamp.d.ts +4 -0
  224. package/dist/firestore/fieldEditors/timestamp.d.ts.map +1 -0
  225. package/dist/firestore/fieldEditors/timestamp.js +52 -0
  226. package/dist/firestore/fieldEditors/timestamp.js.map +1 -0
  227. package/dist/firestore/fieldEditors/types.d.ts +64 -0
  228. package/dist/firestore/fieldEditors/types.d.ts.map +1 -0
  229. package/dist/firestore/fieldEditors/types.js +2 -0
  230. package/dist/firestore/fieldEditors/types.js.map +1 -0
  231. package/dist/firestore/fieldEditors/vector.d.ts +29 -0
  232. package/dist/firestore/fieldEditors/vector.d.ts.map +1 -0
  233. package/dist/firestore/fieldEditors/vector.js +93 -0
  234. package/dist/firestore/fieldEditors/vector.js.map +1 -0
  235. package/dist/firestore/firestoreApi.d.ts +35 -0
  236. package/dist/firestore/firestoreApi.d.ts.map +1 -0
  237. package/dist/firestore/firestoreApi.js +29 -0
  238. package/dist/firestore/firestoreApi.js.map +1 -0
  239. package/dist/firestore/hooks/coerceError.d.ts +17 -0
  240. package/dist/firestore/hooks/coerceError.d.ts.map +1 -0
  241. package/dist/firestore/hooks/coerceError.js +41 -0
  242. package/dist/firestore/hooks/coerceError.js.map +1 -0
  243. package/dist/firestore/hooks/index.d.ts +10 -0
  244. package/dist/firestore/hooks/index.d.ts.map +1 -0
  245. package/dist/firestore/hooks/index.js +10 -0
  246. package/dist/firestore/hooks/index.js.map +1 -0
  247. package/dist/firestore/hooks/useCollectionList.d.ts +37 -0
  248. package/dist/firestore/hooks/useCollectionList.d.ts.map +1 -0
  249. package/dist/firestore/hooks/useCollectionList.js +51 -0
  250. package/dist/firestore/hooks/useCollectionList.js.map +1 -0
  251. package/dist/firestore/hooks/useDocumentEditor.d.ts +61 -0
  252. package/dist/firestore/hooks/useDocumentEditor.d.ts.map +1 -0
  253. package/dist/firestore/hooks/useDocumentEditor.js +71 -0
  254. package/dist/firestore/hooks/useDocumentEditor.js.map +1 -0
  255. package/dist/firestore/hooks/useDocumentList.d.ts +50 -0
  256. package/dist/firestore/hooks/useDocumentList.d.ts.map +1 -0
  257. package/dist/firestore/hooks/useDocumentList.js +162 -0
  258. package/dist/firestore/hooks/useDocumentList.js.map +1 -0
  259. package/dist/firestore/hooks/useDocumentSubcollections.d.ts +29 -0
  260. package/dist/firestore/hooks/useDocumentSubcollections.d.ts.map +1 -0
  261. package/dist/firestore/hooks/useDocumentSubcollections.js +48 -0
  262. package/dist/firestore/hooks/useDocumentSubcollections.js.map +1 -0
  263. package/dist/firestore/hooks/useFirestoreCollection.d.ts +14 -0
  264. package/dist/firestore/hooks/useFirestoreCollection.d.ts.map +1 -0
  265. package/dist/firestore/hooks/useFirestoreCollection.js +36 -0
  266. package/dist/firestore/hooks/useFirestoreCollection.js.map +1 -0
  267. package/dist/firestore/hooks/useFirestoreDoc.d.ts +17 -0
  268. package/dist/firestore/hooks/useFirestoreDoc.d.ts.map +1 -0
  269. package/dist/firestore/hooks/useFirestoreDoc.js +35 -0
  270. package/dist/firestore/hooks/useFirestoreDoc.js.map +1 -0
  271. package/dist/firestore/hooks/useQueryBuilder.d.ts +51 -0
  272. package/dist/firestore/hooks/useQueryBuilder.d.ts.map +1 -0
  273. package/dist/firestore/hooks/useQueryBuilder.js +110 -0
  274. package/dist/firestore/hooks/useQueryBuilder.js.map +1 -0
  275. package/dist/firestore/hooks/useRecursiveDelete.d.ts +40 -0
  276. package/dist/firestore/hooks/useRecursiveDelete.d.ts.map +1 -0
  277. package/dist/firestore/hooks/useRecursiveDelete.js +44 -0
  278. package/dist/firestore/hooks/useRecursiveDelete.js.map +1 -0
  279. package/dist/firestore/hooks/useReferencePicker.d.ts +70 -0
  280. package/dist/firestore/hooks/useReferencePicker.d.ts.map +1 -0
  281. package/dist/firestore/hooks/useReferencePicker.js +140 -0
  282. package/dist/firestore/hooks/useReferencePicker.js.map +1 -0
  283. package/dist/firestore/import/parseImport.d.ts +55 -0
  284. package/dist/firestore/import/parseImport.d.ts.map +1 -0
  285. package/dist/firestore/import/parseImport.js +101 -0
  286. package/dist/firestore/import/parseImport.js.map +1 -0
  287. package/dist/firestore/index.d.ts +21 -0
  288. package/dist/firestore/index.d.ts.map +1 -0
  289. package/dist/firestore/index.js +29 -0
  290. package/dist/firestore/index.js.map +1 -0
  291. package/dist/firestore/reducers/defaults.d.ts +10 -0
  292. package/dist/firestore/reducers/defaults.d.ts.map +1 -0
  293. package/dist/firestore/reducers/defaults.js +37 -0
  294. package/dist/firestore/reducers/defaults.js.map +1 -0
  295. package/dist/firestore/reducers/documentEditor.d.ts +23 -0
  296. package/dist/firestore/reducers/documentEditor.d.ts.map +1 -0
  297. package/dist/firestore/reducers/documentEditor.js +201 -0
  298. package/dist/firestore/reducers/documentEditor.js.map +1 -0
  299. package/dist/firestore/reducers/tree.d.ts +28 -0
  300. package/dist/firestore/reducers/tree.d.ts.map +1 -0
  301. package/dist/firestore/reducers/tree.js +129 -0
  302. package/dist/firestore/reducers/tree.js.map +1 -0
  303. package/dist/firestore/reducers/types.d.ts +115 -0
  304. package/dist/firestore/reducers/types.d.ts.map +1 -0
  305. package/dist/firestore/reducers/types.js +2 -0
  306. package/dist/firestore/reducers/types.js.map +1 -0
  307. package/dist/firestore/reducers/validation.d.ts +25 -0
  308. package/dist/firestore/reducers/validation.d.ts.map +1 -0
  309. package/dist/firestore/reducers/validation.js +121 -0
  310. package/dist/firestore/reducers/validation.js.map +1 -0
  311. package/dist/firestore/types.d.ts +77 -0
  312. package/dist/firestore/types.d.ts.map +1 -0
  313. package/dist/firestore/types.js +196 -0
  314. package/dist/firestore/types.js.map +1 -0
  315. package/dist/firestore/validation/ids.d.ts +23 -0
  316. package/dist/firestore/validation/ids.d.ts.map +1 -0
  317. package/dist/firestore/validation/ids.js +46 -0
  318. package/dist/firestore/validation/ids.js.map +1 -0
  319. package/dist/firestore/valueEquality.d.ts +4 -0
  320. package/dist/firestore/valueEquality.d.ts.map +1 -0
  321. package/dist/firestore/valueEquality.js +44 -0
  322. package/dist/firestore/valueEquality.js.map +1 -0
  323. package/dist/index.d.ts +2 -0
  324. package/dist/index.d.ts.map +1 -0
  325. package/dist/index.js +2 -0
  326. package/dist/index.js.map +1 -0
  327. package/dist/primitives/Badge.d.ts +28 -0
  328. package/dist/primitives/Badge.d.ts.map +1 -0
  329. package/dist/primitives/Badge.js +11 -0
  330. package/dist/primitives/Badge.js.map +1 -0
  331. package/dist/primitives/ConfirmDialog.d.ts +42 -0
  332. package/dist/primitives/ConfirmDialog.d.ts.map +1 -0
  333. package/dist/primitives/ConfirmDialog.js +61 -0
  334. package/dist/primitives/ConfirmDialog.js.map +1 -0
  335. package/dist/primitives/CopyButton.d.ts +28 -0
  336. package/dist/primitives/CopyButton.d.ts.map +1 -0
  337. package/dist/primitives/CopyButton.js +27 -0
  338. package/dist/primitives/CopyButton.js.map +1 -0
  339. package/dist/primitives/JsonView.d.ts +29 -0
  340. package/dist/primitives/JsonView.d.ts.map +1 -0
  341. package/dist/primitives/JsonView.js +56 -0
  342. package/dist/primitives/JsonView.js.map +1 -0
  343. package/dist/primitives/SegmentedControl.d.ts +37 -0
  344. package/dist/primitives/SegmentedControl.d.ts.map +1 -0
  345. package/dist/primitives/SegmentedControl.js +18 -0
  346. package/dist/primitives/SegmentedControl.js.map +1 -0
  347. package/dist/primitives/Toast.d.ts +48 -0
  348. package/dist/primitives/Toast.d.ts.map +1 -0
  349. package/dist/primitives/Toast.js +60 -0
  350. package/dist/primitives/Toast.js.map +1 -0
  351. package/dist/primitives/VirtualList.d.ts +37 -0
  352. package/dist/primitives/VirtualList.d.ts.map +1 -0
  353. package/dist/primitives/VirtualList.js +47 -0
  354. package/dist/primitives/VirtualList.js.map +1 -0
  355. package/dist/primitives/hooks/useContainerSize.d.ts +29 -0
  356. package/dist/primitives/hooks/useContainerSize.d.ts.map +1 -0
  357. package/dist/primitives/hooks/useContainerSize.js +45 -0
  358. package/dist/primitives/hooks/useContainerSize.js.map +1 -0
  359. package/dist/primitives/hooks/useUpdateHighlights.d.ts +18 -0
  360. package/dist/primitives/hooks/useUpdateHighlights.d.ts.map +1 -0
  361. package/dist/primitives/hooks/useUpdateHighlights.js +84 -0
  362. package/dist/primitives/hooks/useUpdateHighlights.js.map +1 -0
  363. package/dist/primitives/index.d.ts +11 -0
  364. package/dist/primitives/index.d.ts.map +1 -0
  365. package/dist/primitives/index.js +11 -0
  366. package/dist/primitives/index.js.map +1 -0
  367. package/dist/primitives/useConfirm.d.ts +34 -0
  368. package/dist/primitives/useConfirm.d.ts.map +1 -0
  369. package/dist/primitives/useConfirm.js +63 -0
  370. package/dist/primitives/useConfirm.js.map +1 -0
  371. package/dist/rtdb/components/RtdbPathBar.d.ts +31 -0
  372. package/dist/rtdb/components/RtdbPathBar.d.ts.map +1 -0
  373. package/dist/rtdb/components/RtdbPathBar.js +47 -0
  374. package/dist/rtdb/components/RtdbPathBar.js.map +1 -0
  375. package/dist/rtdb/components/RtdbTree.d.ts +38 -0
  376. package/dist/rtdb/components/RtdbTree.d.ts.map +1 -0
  377. package/dist/rtdb/components/RtdbTree.js +104 -0
  378. package/dist/rtdb/components/RtdbTree.js.map +1 -0
  379. package/dist/rtdb/editor.d.ts +25 -0
  380. package/dist/rtdb/editor.d.ts.map +1 -0
  381. package/dist/rtdb/editor.js +79 -0
  382. package/dist/rtdb/editor.js.map +1 -0
  383. package/dist/rtdb/hooks/useRtdbTree.d.ts +33 -0
  384. package/dist/rtdb/hooks/useRtdbTree.d.ts.map +1 -0
  385. package/dist/rtdb/hooks/useRtdbTree.js +67 -0
  386. package/dist/rtdb/hooks/useRtdbTree.js.map +1 -0
  387. package/dist/rtdb/index.d.ts +17 -0
  388. package/dist/rtdb/index.d.ts.map +1 -0
  389. package/dist/rtdb/index.js +21 -0
  390. package/dist/rtdb/index.js.map +1 -0
  391. package/dist/rtdb/pathInput.d.ts +28 -0
  392. package/dist/rtdb/pathInput.d.ts.map +1 -0
  393. package/dist/rtdb/pathInput.js +40 -0
  394. package/dist/rtdb/pathInput.js.map +1 -0
  395. package/dist/rtdb/reducers/tree.d.ts +86 -0
  396. package/dist/rtdb/reducers/tree.d.ts.map +1 -0
  397. package/dist/rtdb/reducers/tree.js +131 -0
  398. package/dist/rtdb/reducers/tree.js.map +1 -0
  399. package/dist/rtdb/rtdbApi.d.ts +20 -0
  400. package/dist/rtdb/rtdbApi.d.ts.map +1 -0
  401. package/dist/rtdb/rtdbApi.js +2 -0
  402. package/dist/rtdb/rtdbApi.js.map +1 -0
  403. package/dist/rtdb/values.d.ts +50 -0
  404. package/dist/rtdb/values.d.ts.map +1 -0
  405. package/dist/rtdb/values.js +186 -0
  406. package/dist/rtdb/values.js.map +1 -0
  407. package/dist/rules/components/DenialInspector.d.ts +18 -0
  408. package/dist/rules/components/DenialInspector.d.ts.map +1 -0
  409. package/dist/rules/components/DenialInspector.js +58 -0
  410. package/dist/rules/components/DenialInspector.js.map +1 -0
  411. package/dist/rules/components/format.d.ts +56 -0
  412. package/dist/rules/components/format.d.ts.map +1 -0
  413. package/dist/rules/components/format.js +137 -0
  414. package/dist/rules/components/format.js.map +1 -0
  415. package/dist/rules/components/index.d.ts +4 -0
  416. package/dist/rules/components/index.d.ts.map +1 -0
  417. package/dist/rules/components/index.js +4 -0
  418. package/dist/rules/components/index.js.map +1 -0
  419. package/dist/rules/components/scope.d.ts +10 -0
  420. package/dist/rules/components/scope.d.ts.map +1 -0
  421. package/dist/rules/components/scope.js +72 -0
  422. package/dist/rules/components/scope.js.map +1 -0
  423. package/dist/rules/hooks/index.d.ts +2 -0
  424. package/dist/rules/hooks/index.d.ts.map +1 -0
  425. package/dist/rules/hooks/index.js +2 -0
  426. package/dist/rules/hooks/index.js.map +1 -0
  427. package/dist/rules/hooks/useDenialTrace.d.ts +51 -0
  428. package/dist/rules/hooks/useDenialTrace.d.ts.map +1 -0
  429. package/dist/rules/hooks/useDenialTrace.js +58 -0
  430. package/dist/rules/hooks/useDenialTrace.js.map +1 -0
  431. package/dist/rules/index.d.ts +14 -0
  432. package/dist/rules/index.d.ts.map +1 -0
  433. package/dist/rules/index.js +13 -0
  434. package/dist/rules/index.js.map +1 -0
  435. package/dist/rules/types.d.ts +75 -0
  436. package/dist/rules/types.d.ts.map +1 -0
  437. package/dist/rules/types.js +2 -0
  438. package/dist/rules/types.js.map +1 -0
  439. package/dist/storage/collisionRename.d.ts +73 -0
  440. package/dist/storage/collisionRename.d.ts.map +1 -0
  441. package/dist/storage/collisionRename.js +113 -0
  442. package/dist/storage/collisionRename.js.map +1 -0
  443. package/dist/storage/components/DeleteSelectionWithConfirm.d.ts +66 -0
  444. package/dist/storage/components/DeleteSelectionWithConfirm.d.ts.map +1 -0
  445. package/dist/storage/components/DeleteSelectionWithConfirm.js +82 -0
  446. package/dist/storage/components/DeleteSelectionWithConfirm.js.map +1 -0
  447. package/dist/storage/components/ObjectBrowser.d.ts +78 -0
  448. package/dist/storage/components/ObjectBrowser.d.ts.map +1 -0
  449. package/dist/storage/components/ObjectBrowser.js +60 -0
  450. package/dist/storage/components/ObjectBrowser.js.map +1 -0
  451. package/dist/storage/components/ObjectInspector.d.ts +43 -0
  452. package/dist/storage/components/ObjectInspector.d.ts.map +1 -0
  453. package/dist/storage/components/ObjectInspector.js +92 -0
  454. package/dist/storage/components/ObjectInspector.js.map +1 -0
  455. package/dist/storage/components/PathBreadcrumb.d.ts +30 -0
  456. package/dist/storage/components/PathBreadcrumb.d.ts.map +1 -0
  457. package/dist/storage/components/PathBreadcrumb.js +26 -0
  458. package/dist/storage/components/PathBreadcrumb.js.map +1 -0
  459. package/dist/storage/components/UploadDropzone.d.ts +50 -0
  460. package/dist/storage/components/UploadDropzone.d.ts.map +1 -0
  461. package/dist/storage/components/UploadDropzone.js +109 -0
  462. package/dist/storage/components/UploadDropzone.js.map +1 -0
  463. package/dist/storage/folderPlaceholder.d.ts +20 -0
  464. package/dist/storage/folderPlaceholder.d.ts.map +1 -0
  465. package/dist/storage/folderPlaceholder.js +34 -0
  466. package/dist/storage/folderPlaceholder.js.map +1 -0
  467. package/dist/storage/hooks/index.d.ts +9 -0
  468. package/dist/storage/hooks/index.d.ts.map +1 -0
  469. package/dist/storage/hooks/index.js +9 -0
  470. package/dist/storage/hooks/index.js.map +1 -0
  471. package/dist/storage/hooks/useMetadataEditor.d.ts +114 -0
  472. package/dist/storage/hooks/useMetadataEditor.d.ts.map +1 -0
  473. package/dist/storage/hooks/useMetadataEditor.js +193 -0
  474. package/dist/storage/hooks/useMetadataEditor.js.map +1 -0
  475. package/dist/storage/hooks/useObjectUpload.d.ts +105 -0
  476. package/dist/storage/hooks/useObjectUpload.d.ts.map +1 -0
  477. package/dist/storage/hooks/useObjectUpload.js +134 -0
  478. package/dist/storage/hooks/useObjectUpload.js.map +1 -0
  479. package/dist/storage/hooks/usePathState.d.ts +43 -0
  480. package/dist/storage/hooks/usePathState.d.ts.map +1 -0
  481. package/dist/storage/hooks/usePathState.js +42 -0
  482. package/dist/storage/hooks/usePathState.js.map +1 -0
  483. package/dist/storage/hooks/useStorageDelete.d.ts +74 -0
  484. package/dist/storage/hooks/useStorageDelete.d.ts.map +1 -0
  485. package/dist/storage/hooks/useStorageDelete.js +120 -0
  486. package/dist/storage/hooks/useStorageDelete.js.map +1 -0
  487. package/dist/storage/hooks/useStorageList.d.ts +72 -0
  488. package/dist/storage/hooks/useStorageList.d.ts.map +1 -0
  489. package/dist/storage/hooks/useStorageList.js +164 -0
  490. package/dist/storage/hooks/useStorageList.js.map +1 -0
  491. package/dist/storage/hooks/useStorageObject.d.ts +33 -0
  492. package/dist/storage/hooks/useStorageObject.d.ts.map +1 -0
  493. package/dist/storage/hooks/useStorageObject.js +114 -0
  494. package/dist/storage/hooks/useStorageObject.js.map +1 -0
  495. package/dist/storage/hooks/useStorageRulesGate.d.ts +116 -0
  496. package/dist/storage/hooks/useStorageRulesGate.d.ts.map +1 -0
  497. package/dist/storage/hooks/useStorageRulesGate.js +150 -0
  498. package/dist/storage/hooks/useStorageRulesGate.js.map +1 -0
  499. package/dist/storage/hooks/useStorageSelection.d.ts +32 -0
  500. package/dist/storage/hooks/useStorageSelection.d.ts.map +1 -0
  501. package/dist/storage/hooks/useStorageSelection.js +55 -0
  502. package/dist/storage/hooks/useStorageSelection.js.map +1 -0
  503. package/dist/storage/index.d.ts +11 -0
  504. package/dist/storage/index.d.ts.map +1 -0
  505. package/dist/storage/index.js +17 -0
  506. package/dist/storage/index.js.map +1 -0
  507. package/dist/storage/pendingPrefixes.d.ts +77 -0
  508. package/dist/storage/pendingPrefixes.d.ts.map +1 -0
  509. package/dist/storage/pendingPrefixes.js +104 -0
  510. package/dist/storage/pendingPrefixes.js.map +1 -0
  511. package/dist/storage/previews.d.ts +51 -0
  512. package/dist/storage/previews.d.ts.map +1 -0
  513. package/dist/storage/previews.js +73 -0
  514. package/dist/storage/previews.js.map +1 -0
  515. package/dist/storage/storageApi.d.ts +30 -0
  516. package/dist/storage/storageApi.d.ts.map +1 -0
  517. package/dist/storage/storageApi.js +20 -0
  518. package/dist/storage/storageApi.js.map +1 -0
  519. package/dist/traffic/components/RuleHeatmap.d.ts +34 -0
  520. package/dist/traffic/components/RuleHeatmap.d.ts.map +1 -0
  521. package/dist/traffic/components/RuleHeatmap.js +40 -0
  522. package/dist/traffic/components/RuleHeatmap.js.map +1 -0
  523. package/dist/traffic/components/TrafficDetail.d.ts +33 -0
  524. package/dist/traffic/components/TrafficDetail.d.ts.map +1 -0
  525. package/dist/traffic/components/TrafficDetail.js +28 -0
  526. package/dist/traffic/components/TrafficDetail.js.map +1 -0
  527. package/dist/traffic/components/TrafficGroupRow.d.ts +28 -0
  528. package/dist/traffic/components/TrafficGroupRow.d.ts.map +1 -0
  529. package/dist/traffic/components/TrafficGroupRow.js +25 -0
  530. package/dist/traffic/components/TrafficGroupRow.js.map +1 -0
  531. package/dist/traffic/components/TrafficLineChart.d.ts +37 -0
  532. package/dist/traffic/components/TrafficLineChart.d.ts.map +1 -0
  533. package/dist/traffic/components/TrafficLineChart.js +49 -0
  534. package/dist/traffic/components/TrafficLineChart.js.map +1 -0
  535. package/dist/traffic/components/TrafficLog.d.ts +52 -0
  536. package/dist/traffic/components/TrafficLog.d.ts.map +1 -0
  537. package/dist/traffic/components/TrafficLog.js +34 -0
  538. package/dist/traffic/components/TrafficLog.js.map +1 -0
  539. package/dist/traffic/components/TrafficMetricCards.d.ts +26 -0
  540. package/dist/traffic/components/TrafficMetricCards.d.ts.map +1 -0
  541. package/dist/traffic/components/TrafficMetricCards.js +24 -0
  542. package/dist/traffic/components/TrafficMetricCards.js.map +1 -0
  543. package/dist/traffic/components/TrafficRow.d.ts +40 -0
  544. package/dist/traffic/components/TrafficRow.d.ts.map +1 -0
  545. package/dist/traffic/components/TrafficRow.js +27 -0
  546. package/dist/traffic/components/TrafficRow.js.map +1 -0
  547. package/dist/traffic/components/TrafficStats.d.ts +18 -0
  548. package/dist/traffic/components/TrafficStats.d.ts.map +1 -0
  549. package/dist/traffic/components/TrafficStats.js +19 -0
  550. package/dist/traffic/components/TrafficStats.js.map +1 -0
  551. package/dist/traffic/components/TrafficTimeline.d.ts +88 -0
  552. package/dist/traffic/components/TrafficTimeline.d.ts.map +1 -0
  553. package/dist/traffic/components/TrafficTimeline.js +86 -0
  554. package/dist/traffic/components/TrafficTimeline.js.map +1 -0
  555. package/dist/traffic/components/format.d.ts +13 -0
  556. package/dist/traffic/components/format.d.ts.map +1 -0
  557. package/dist/traffic/components/format.js +24 -0
  558. package/dist/traffic/components/format.js.map +1 -0
  559. package/dist/traffic/components/index.d.ts +11 -0
  560. package/dist/traffic/components/index.d.ts.map +1 -0
  561. package/dist/traffic/components/index.js +11 -0
  562. package/dist/traffic/components/index.js.map +1 -0
  563. package/dist/traffic/hooks/index.d.ts +8 -0
  564. package/dist/traffic/hooks/index.d.ts.map +1 -0
  565. package/dist/traffic/hooks/index.js +8 -0
  566. package/dist/traffic/hooks/index.js.map +1 -0
  567. package/dist/traffic/hooks/useRuleHeatmap.d.ts +33 -0
  568. package/dist/traffic/hooks/useRuleHeatmap.d.ts.map +1 -0
  569. package/dist/traffic/hooks/useRuleHeatmap.js +54 -0
  570. package/dist/traffic/hooks/useRuleHeatmap.js.map +1 -0
  571. package/dist/traffic/hooks/useTrafficBuckets.d.ts +71 -0
  572. package/dist/traffic/hooks/useTrafficBuckets.d.ts.map +1 -0
  573. package/dist/traffic/hooks/useTrafficBuckets.js +74 -0
  574. package/dist/traffic/hooks/useTrafficBuckets.js.map +1 -0
  575. package/dist/traffic/hooks/useTrafficFilter.d.ts +40 -0
  576. package/dist/traffic/hooks/useTrafficFilter.d.ts.map +1 -0
  577. package/dist/traffic/hooks/useTrafficFilter.js +33 -0
  578. package/dist/traffic/hooks/useTrafficFilter.js.map +1 -0
  579. package/dist/traffic/hooks/useTrafficGroups.d.ts +47 -0
  580. package/dist/traffic/hooks/useTrafficGroups.d.ts.map +1 -0
  581. package/dist/traffic/hooks/useTrafficGroups.js +73 -0
  582. package/dist/traffic/hooks/useTrafficGroups.js.map +1 -0
  583. package/dist/traffic/hooks/useTrafficMetrics.d.ts +66 -0
  584. package/dist/traffic/hooks/useTrafficMetrics.d.ts.map +1 -0
  585. package/dist/traffic/hooks/useTrafficMetrics.js +156 -0
  586. package/dist/traffic/hooks/useTrafficMetrics.js.map +1 -0
  587. package/dist/traffic/hooks/useTrafficMonitor.d.ts +56 -0
  588. package/dist/traffic/hooks/useTrafficMonitor.d.ts.map +1 -0
  589. package/dist/traffic/hooks/useTrafficMonitor.js +58 -0
  590. package/dist/traffic/hooks/useTrafficMonitor.js.map +1 -0
  591. package/dist/traffic/hooks/useTrafficStats.d.ts +32 -0
  592. package/dist/traffic/hooks/useTrafficStats.d.ts.map +1 -0
  593. package/dist/traffic/hooks/useTrafficStats.js +45 -0
  594. package/dist/traffic/hooks/useTrafficStats.js.map +1 -0
  595. package/dist/traffic/index.d.ts +4 -0
  596. package/dist/traffic/index.d.ts.map +1 -0
  597. package/dist/traffic/index.js +3 -0
  598. package/dist/traffic/index.js.map +1 -0
  599. package/dist/traffic/types.d.ts +72 -0
  600. package/dist/traffic/types.d.ts.map +1 -0
  601. package/dist/traffic/types.js +10 -0
  602. package/dist/traffic/types.js.map +1 -0
  603. package/package.json +127 -0
@@ -0,0 +1,9 @@
1
+ export { useStorageList, } from './useStorageList.js';
2
+ export { usePathState, normalizeStoragePath, } from './usePathState.js';
3
+ export { useStorageObject, } from './useStorageObject.js';
4
+ export { useMetadataEditor, metadataEditorReducer, initMetadataEditorState, } from './useMetadataEditor.js';
5
+ export { useStorageSelection, } from './useStorageSelection.js';
6
+ export { useStorageDelete, createListAllDeleteImpl, } from './useStorageDelete.js';
7
+ export { useStorageRulesGate, } from './useStorageRulesGate.js';
8
+ export { useObjectUpload, } from './useObjectUpload.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAIf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,oBAAoB,GAGrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,GAMxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,GAGpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GAOxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,GAMpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,eAAe,GAOhB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { type FirebaseStorage, type FullMetadata, type SettableMetadata } from 'pyric/storage';
2
+ /** One `customMetadata` row. `id` is a stable render key — keys are
3
+ * user-editable, so they can't key the rows themselves. */
4
+ export interface CustomMetadataEntry {
5
+ id: string;
6
+ key: string;
7
+ value: string;
8
+ /** Validation error (`'Key is required'` / `'Duplicate key'`). */
9
+ error?: string;
10
+ }
11
+ interface MetadataDraft {
12
+ contentType: string;
13
+ cacheControl: string;
14
+ custom: CustomMetadataEntry[];
15
+ }
16
+ export interface MetadataEditorState {
17
+ draft: MetadataDraft;
18
+ /** Snapshot for `isDirty` / `reset` — same reference-compare
19
+ * semantics as the document editor's `tree !== initial`. */
20
+ initial: MetadataDraft;
21
+ errorCount: number;
22
+ }
23
+ export type MetadataEditorAction = {
24
+ type: 'setContentType';
25
+ value: string;
26
+ } | {
27
+ type: 'setCacheControl';
28
+ value: string;
29
+ } | {
30
+ type: 'setCustomKey';
31
+ id: string;
32
+ key: string;
33
+ } | {
34
+ type: 'setCustomValue';
35
+ id: string;
36
+ value: string;
37
+ } | {
38
+ type: 'addCustomEntry';
39
+ key?: string;
40
+ value?: string;
41
+ } | {
42
+ type: 'removeCustomEntry';
43
+ id: string;
44
+ } | {
45
+ type: 'reset';
46
+ }
47
+ /** Internal — a successful save makes the draft the new baseline. */
48
+ | {
49
+ type: 'commit';
50
+ };
51
+ /** Pure reducer — exported (with {@link initMetadataEditorState}) so
52
+ * the edit state is testable without React, mirroring the document
53
+ * editor's reducer/hook split. */
54
+ export declare function metadataEditorReducer(state: MetadataEditorState, action: MetadataEditorAction): MetadataEditorState;
55
+ /** Build the edit state from the metadata a `getMetadata` /
56
+ * `useStorageObject` read returned. */
57
+ export declare function initMetadataEditorState(initial: SettableMetadata | undefined): MetadataEditorState;
58
+ export interface UseMetadataEditorOptions {
59
+ /** The metadata being edited — the same shape `useStorageObject`'s
60
+ * `metadata` carries. Read once on mount (the editor is a
61
+ * stateful workspace, like the document editor); `reset()` +
62
+ * remount to re-initialize. */
63
+ initial?: SettableMetadata;
64
+ }
65
+ export interface UseMetadataEditorResult {
66
+ contentType: string;
67
+ cacheControl: string;
68
+ custom: CustomMetadataEntry[];
69
+ /** Convenience: `errorCount === 0`. */
70
+ isValid: boolean;
71
+ /** `true` once any modifying action fired since the last
72
+ * `reset`/successful `save`. Reference-compare semantics — manual
73
+ * re-entry of the original values does NOT clear it. */
74
+ isDirty: boolean;
75
+ errorCount: number;
76
+ /** Raw dispatch — prefer the named helpers. */
77
+ dispatch: (action: MetadataEditorAction) => void;
78
+ setContentType: (value: string) => void;
79
+ setCacheControl: (value: string) => void;
80
+ setCustomKey: (id: string, key: string) => void;
81
+ setCustomValue: (id: string, value: string) => void;
82
+ addCustomEntry: (key?: string, value?: string) => void;
83
+ removeCustomEntry: (id: string) => void;
84
+ /** Restore the initial values. Clears `isDirty`. */
85
+ reset: () => void;
86
+ /**
87
+ * Serialize the draft to an `updateMetadata` patch. Empty
88
+ * `contentType`/`cacheControl` become `undefined` — which LEAVES
89
+ * the previous value (the sandbox doesn't model null-clears; see
90
+ * `pyric/storage`'s `updateMetadata` doc). `customMetadata` is
91
+ * always included and replaces wholesale, so row removal works.
92
+ */
93
+ toPatch: () => SettableMetadata;
94
+ /**
95
+ * `updateMetadata(ref(storage, path), toPatch())`. Errors surface
96
+ * via `saveError` (typed `StorageError`), not throws — resolves
97
+ * `undefined` on failure or when the draft is invalid. On success
98
+ * the draft becomes the new baseline (`isDirty` clears) and the
99
+ * fresh `FullMetadata` is returned.
100
+ */
101
+ save: () => Promise<FullMetadata | undefined>;
102
+ isSaving: boolean;
103
+ saveError: Error | undefined;
104
+ }
105
+ /**
106
+ * Headless metadata editor — the `useDocumentEditor` reducer pattern
107
+ * over `updateMetadata`: a pure reducer owns the draft (contentType,
108
+ * cacheControl, customMetadata k/v rows with stable ids +
109
+ * empty/duplicate-key validation); the hook adds named dispatch
110
+ * helpers and the save half.
111
+ */
112
+ export declare function useMetadataEditor(storage: FirebaseStorage | null | undefined, path: string | null | undefined, options?: UseMetadataEditorOptions): UseMetadataEditorResult;
113
+ export {};
114
+ //# sourceMappingURL=useMetadataEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMetadataEditor.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/useMetadataEditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ import { useCallback, useMemo, useReducer, useRef, useState } from 'react';
2
+ import { ref as refFn, updateMetadata, } from 'pyric/storage';
3
+ import { normalizeStoragePath } from './usePathState.js';
4
+ /** Re-validate the k/v rows: empty keys and duplicate keys error. */
5
+ function validateCustom(custom) {
6
+ const counts = new Map();
7
+ for (const entry of custom) {
8
+ counts.set(entry.key, (counts.get(entry.key) ?? 0) + 1);
9
+ }
10
+ let errorCount = 0;
11
+ const next = custom.map((entry) => {
12
+ let error;
13
+ if (entry.key.trim() === '')
14
+ error = 'Key is required';
15
+ else if ((counts.get(entry.key) ?? 0) > 1)
16
+ error = 'Duplicate key';
17
+ if (error)
18
+ errorCount++;
19
+ if (error === entry.error)
20
+ return entry;
21
+ return { ...entry, error };
22
+ });
23
+ return { custom: next, errorCount };
24
+ }
25
+ function applyDraft(state, mutate) {
26
+ const mutated = mutate(state.draft);
27
+ const { custom, errorCount } = validateCustom(mutated.custom);
28
+ return { ...state, draft: { ...mutated, custom }, errorCount };
29
+ }
30
+ /** Pure reducer — exported (with {@link initMetadataEditorState}) so
31
+ * the edit state is testable without React, mirroring the document
32
+ * editor's reducer/hook split. */
33
+ export function metadataEditorReducer(state, action) {
34
+ switch (action.type) {
35
+ case 'setContentType':
36
+ return applyDraft(state, (d) => ({ ...d, contentType: action.value }));
37
+ case 'setCacheControl':
38
+ return applyDraft(state, (d) => ({ ...d, cacheControl: action.value }));
39
+ case 'setCustomKey':
40
+ return applyDraft(state, (d) => ({
41
+ ...d,
42
+ custom: d.custom.map((e) => (e.id === action.id ? { ...e, key: action.key } : e)),
43
+ }));
44
+ case 'setCustomValue':
45
+ return applyDraft(state, (d) => ({
46
+ ...d,
47
+ custom: d.custom.map((e) => e.id === action.id ? { ...e, value: action.value } : e),
48
+ }));
49
+ case 'addCustomEntry':
50
+ return applyDraft(state, (d) => ({
51
+ ...d,
52
+ custom: [
53
+ ...d.custom,
54
+ { id: crypto.randomUUID(), key: action.key ?? '', value: action.value ?? '' },
55
+ ],
56
+ }));
57
+ case 'removeCustomEntry':
58
+ return applyDraft(state, (d) => ({
59
+ ...d,
60
+ custom: d.custom.filter((e) => e.id !== action.id),
61
+ }));
62
+ case 'reset':
63
+ return {
64
+ draft: state.initial,
65
+ initial: state.initial,
66
+ errorCount: validateCustom(state.initial.custom).errorCount,
67
+ };
68
+ case 'commit':
69
+ return { ...state, initial: state.draft };
70
+ }
71
+ }
72
+ /** Build the edit state from the metadata a `getMetadata` /
73
+ * `useStorageObject` read returned. */
74
+ export function initMetadataEditorState(initial) {
75
+ const draft = {
76
+ contentType: initial?.contentType ?? '',
77
+ cacheControl: initial?.cacheControl ?? '',
78
+ custom: Object.entries(initial?.customMetadata ?? {}).map(([key, value]) => ({
79
+ id: crypto.randomUUID(),
80
+ key,
81
+ value,
82
+ })),
83
+ };
84
+ const { custom, errorCount } = validateCustom(draft.custom);
85
+ // One shared object: `isDirty` is `draft !== initial` by reference.
86
+ const validated = { ...draft, custom };
87
+ return { draft: validated, initial: validated, errorCount };
88
+ }
89
+ /**
90
+ * Headless metadata editor — the `useDocumentEditor` reducer pattern
91
+ * over `updateMetadata`: a pure reducer owns the draft (contentType,
92
+ * cacheControl, customMetadata k/v rows with stable ids +
93
+ * empty/duplicate-key validation); the hook adds named dispatch
94
+ * helpers and the save half.
95
+ */
96
+ export function useMetadataEditor(storage, path, options = {}) {
97
+ // Computed once — the reducer owns the live draft from here on
98
+ // (same `useRef` seed as `useDocumentEditor`).
99
+ const initialRef = useRef(null);
100
+ if (initialRef.current == null) {
101
+ initialRef.current = initMetadataEditorState(options.initial);
102
+ }
103
+ const [state, dispatch] = useReducer(metadataEditorReducer, initialRef.current);
104
+ const [isSaving, setIsSaving] = useState(false);
105
+ const [saveError, setSaveError] = useState(undefined);
106
+ // Stale-run protection for overlapping saves (generation token,
107
+ // house style).
108
+ const generationRef = useRef(0);
109
+ const setContentType = useCallback((value) => dispatch({ type: 'setContentType', value }), []);
110
+ const setCacheControl = useCallback((value) => dispatch({ type: 'setCacheControl', value }), []);
111
+ const setCustomKey = useCallback((id, key) => dispatch({ type: 'setCustomKey', id, key }), []);
112
+ const setCustomValue = useCallback((id, value) => dispatch({ type: 'setCustomValue', id, value }), []);
113
+ const addCustomEntry = useCallback((key, value) => dispatch({ type: 'addCustomEntry', key, value }), []);
114
+ const removeCustomEntry = useCallback((id) => dispatch({ type: 'removeCustomEntry', id }), []);
115
+ const reset = useCallback(() => dispatch({ type: 'reset' }), []);
116
+ const { draft, initial, errorCount } = state;
117
+ const toPatch = useCallback(() => {
118
+ return {
119
+ contentType: draft.contentType.trim() === '' ? undefined : draft.contentType,
120
+ cacheControl: draft.cacheControl.trim() === '' ? undefined : draft.cacheControl,
121
+ customMetadata: Object.fromEntries(draft.custom.filter((e) => e.key.trim() !== '').map((e) => [e.key, e.value])),
122
+ };
123
+ }, [draft]);
124
+ const save = useCallback(async () => {
125
+ const myGen = ++generationRef.current;
126
+ if (storage == null || path == null) {
127
+ setSaveError(new Error('useMetadataEditor: storage or path is null'));
128
+ return undefined;
129
+ }
130
+ if (errorCount > 0) {
131
+ setSaveError(new Error('useMetadataEditor: draft has validation errors'));
132
+ return undefined;
133
+ }
134
+ setSaveError(undefined);
135
+ setIsSaving(true);
136
+ try {
137
+ const next = await updateMetadata(refFn(storage, normalizeStoragePath(path)), toPatch());
138
+ if (myGen === generationRef.current) {
139
+ dispatch({ type: 'commit' });
140
+ }
141
+ return next;
142
+ }
143
+ catch (e) {
144
+ if (myGen === generationRef.current) {
145
+ setSaveError(e instanceof Error ? e : new Error(String(e)));
146
+ }
147
+ return undefined;
148
+ }
149
+ finally {
150
+ if (myGen === generationRef.current)
151
+ setIsSaving(false);
152
+ }
153
+ }, [storage, path, errorCount, toPatch]);
154
+ const isDirty = draft !== initial;
155
+ const isValid = errorCount === 0;
156
+ return useMemo(() => ({
157
+ contentType: draft.contentType,
158
+ cacheControl: draft.cacheControl,
159
+ custom: draft.custom,
160
+ isValid,
161
+ isDirty,
162
+ errorCount,
163
+ dispatch,
164
+ setContentType,
165
+ setCacheControl,
166
+ setCustomKey,
167
+ setCustomValue,
168
+ addCustomEntry,
169
+ removeCustomEntry,
170
+ reset,
171
+ toPatch,
172
+ save,
173
+ isSaving,
174
+ saveError,
175
+ }), [
176
+ draft,
177
+ isValid,
178
+ isDirty,
179
+ errorCount,
180
+ setContentType,
181
+ setCacheControl,
182
+ setCustomKey,
183
+ setCustomValue,
184
+ addCustomEntry,
185
+ removeCustomEntry,
186
+ reset,
187
+ toPatch,
188
+ save,
189
+ isSaving,
190
+ saveError,
191
+ ]);
192
+ }
193
+ //# sourceMappingURL=useMetadataEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMetadataEditor.js","sourceRoot":"","sources":["../../../src/storage/hooks/useMetadataEditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import type { FirebaseStorage, FullMetadata, SettableMetadata } from 'pyric/storage';
2
+ import type { UseStorageListResult } from './useStorageList.js';
3
+ export type UploadTaskStatus = 'running' | 'success' | 'error';
4
+ /**
5
+ * One file's upload, TASK-SHAPED for resumable forward-compat: the
6
+ * byte counters and the `onProgress` callback are in the type NOW so
7
+ * a future `uploadBytesResumable`-backed implementation emits real
8
+ * intermediate snapshots without a breaking change. Today
9
+ * (`pyric/storage` has no resumable uploads — COMPAT) a task
10
+ * completes in one tick: `onProgress` fires once at 0 bytes and once
11
+ * at `totalBytes`.
12
+ */
13
+ export interface UploadTask {
14
+ /** Stable id — key task rows on this, not on `fullPath` (two
15
+ * uploads can target the same path). */
16
+ id: string;
17
+ /** Bucket-rooted destination path. */
18
+ fullPath: string;
19
+ status: UploadTaskStatus;
20
+ bytesTransferred: number;
21
+ totalBytes: number;
22
+ /** Populated on `'success'`. */
23
+ metadata?: FullMetadata;
24
+ /** Populated on `'error'` — a typed `StorageError` from the
25
+ * sandbox (`.code` is `storage/<code>`, e.g.
26
+ * `storage/unauthorized` for a rules-denied write). */
27
+ error?: Error;
28
+ }
29
+ /** Explicit-path upload input. `path` is relative to the hook's
30
+ * `path` option (the destination folder). */
31
+ export interface UploadEntry {
32
+ path: string;
33
+ data: Blob | Uint8Array | ArrayBuffer;
34
+ metadata?: SettableMetadata;
35
+ }
36
+ /**
37
+ * `upload()` accepts plain `File`s (destination = the file's
38
+ * `webkitRelativePath` when present — folder drops keep their
39
+ * structure — else its `name`) or explicit {@link UploadEntry}s.
40
+ */
41
+ export type UploadInput = File | UploadEntry;
42
+ export interface UseObjectUploadOptions {
43
+ /** Destination folder, bucket-rooted. Default `''` (root). Wire to
44
+ * `usePathState().path` so uploads land in the browsed folder. */
45
+ path?: string;
46
+ /**
47
+ * Optimistic seam from `useStorageList`: each upload inserts its
48
+ * path immediately and rolls back via `removeItem` on failure.
49
+ * Caveat: rolling back an upload that was OVERWRITING an existing
50
+ * object drops that object's row locally (the seam can't tell an
51
+ * optimistic row from a listed one) — `refresh()` restores server
52
+ * truth.
53
+ */
54
+ list?: Pick<UseStorageListResult, 'insertItem' | 'removeItem'>;
55
+ /** Task-shaped progress callback (see {@link UploadTask}). */
56
+ onProgress?: (task: UploadTask) => void;
57
+ /** Fired once per task reaching `'success'`. */
58
+ onComplete?: (task: UploadTask) => void;
59
+ /** Fired once per task reaching `'error'`. */
60
+ onError?: (task: UploadTask) => void;
61
+ }
62
+ export interface UseObjectUploadResult {
63
+ /** Every task started by this hook instance, oldest first. */
64
+ tasks: UploadTask[];
65
+ /** `true` while any task is `'running'`. */
66
+ isUploading: boolean;
67
+ /**
68
+ * Upload one or many files. Tasks run concurrently; the promise
69
+ * resolves with the settled tasks once ALL finish and never
70
+ * rejects — per-file failures land on `task.error` (and
71
+ * `onError`), so one bad file doesn't mask the others.
72
+ */
73
+ upload: (input: UploadInput | UploadInput[]) => Promise<UploadTask[]>;
74
+ /**
75
+ * Create an empty folder under the hook's `path`: writes the GCS
76
+ * placeholder convention — a zero-byte object named `<path>/`
77
+ * (trailing slash). `listAll` hides the placeholder from `items`
78
+ * at every level (it only surfaces as a prefix), so the folder
79
+ * appears in the browser with no phantom file inside.
80
+ *
81
+ * `ref()` normalizes the trailing slash away, so the placeholder is
82
+ * written through a structural value-object reference the sandbox
83
+ * accepts. Throws the underlying error after rolling back the
84
+ * optimistic prefix insert.
85
+ *
86
+ * ALTERNATIVE: when the store must stay free of placeholder
87
+ * objects (Pyric Studio's choice), use the client-side
88
+ * pending-prefix mechanism instead — see `pendingPrefixes.ts`
89
+ * for the reducer and the recorded tradeoff.
90
+ */
91
+ createFolder: (name: string) => Promise<void>;
92
+ /** Drop settled (`success`/`error`) tasks from `tasks`. */
93
+ clearCompleted: () => void;
94
+ }
95
+ /**
96
+ * Multi-file upload over the package's single Storage handle prop.
97
+ * Headless: returns task state; render it however you like (the
98
+ * `<UploadDropzone>` component is one producer of `upload()` calls).
99
+ *
100
+ * Optimistic-with-rollback: with the `list` seam wired, each upload's
101
+ * row appears in `useStorageList` immediately and disappears again if
102
+ * the write fails (typed `StorageError` on `task.error`).
103
+ */
104
+ export declare function useObjectUpload(storage: FirebaseStorage | null | undefined, options?: UseObjectUploadOptions): UseObjectUploadResult;
105
+ //# sourceMappingURL=useObjectUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useObjectUpload.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/useObjectUpload.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB;6CACyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;;4DAEwD;IACxD,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;8CAC8C;AAC9C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,WAAW,CAAC;AAE7C,MAAM,WAAW,sBAAsB;IACrC;uEACmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC;IAC/D,8DAA8D;IAC9D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,gDAAgD;IAChD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,4CAA4C;IAC5C,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACtE;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,2DAA2D;IAC3D,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC3C,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAsHvB"}
@@ -0,0 +1,134 @@
1
+ import { useCallback, useRef, useState } from 'react';
2
+ import { folderPlaceholderRef } from '../folderPlaceholder.js';
3
+ import { useStorageApi } from '../storageApi.js';
4
+ import { normalizeStoragePath } from './usePathState.js';
5
+ function joinPath(base, child) {
6
+ if (base === '')
7
+ return child;
8
+ if (child === '')
9
+ return base;
10
+ return `${base}/${child}`;
11
+ }
12
+ function sizeOf(data) {
13
+ if (data instanceof Blob)
14
+ return data.size;
15
+ return data.byteLength;
16
+ }
17
+ function toEntry(input) {
18
+ if (input instanceof Blob) {
19
+ // File (the only Blob subtype `UploadInput` admits). Folder
20
+ // drops carry `webkitRelativePath`; plain picks carry `name`.
21
+ const file = input;
22
+ const rel = file.webkitRelativePath;
23
+ return { path: rel || file.name, data: file };
24
+ }
25
+ return input;
26
+ }
27
+ /**
28
+ * Multi-file upload over the package's single Storage handle prop.
29
+ * Headless: returns task state; render it however you like (the
30
+ * `<UploadDropzone>` component is one producer of `upload()` calls).
31
+ *
32
+ * Optimistic-with-rollback: with the `list` seam wired, each upload's
33
+ * row appears in `useStorageList` immediately and disappears again if
34
+ * the write fails (typed `StorageError` on `task.error`).
35
+ */
36
+ export function useObjectUpload(storage, options = {}) {
37
+ // Injected backend (in-process `pyric/storage` by default, the
38
+ // SharedWorker client bundle in Studio served mode) — uploads follow
39
+ // the same seam the browse hooks read through. The worker leg caps a
40
+ // payload at 8 MiB (base64 `storage.putBytes`); in-process writes are
41
+ // uncapped. An over-cap file fails as a normal per-file task error.
42
+ const { ref: refFn, uploadBytes } = useStorageApi();
43
+ const base = normalizeStoragePath(options.path ?? '');
44
+ const [tasks, setTasks] = useState([]);
45
+ // Latest-value refs so `upload`/`createFolder` stay referentially
46
+ // stable across option changes (same pattern as the house hooks'
47
+ // generation tokens — the callbacks read current options at call
48
+ // time).
49
+ const optionsRef = useRef(options);
50
+ optionsRef.current = options;
51
+ const patchTask = useCallback((next) => {
52
+ setTasks((prev) => prev.map((t) => (t.id === next.id ? next : t)));
53
+ }, []);
54
+ const upload = useCallback(async (input) => {
55
+ if (storage == null) {
56
+ throw new Error('useObjectUpload: storage handle is null');
57
+ }
58
+ const inputs = Array.isArray(input) ? input : [input];
59
+ const started = inputs.map((raw) => {
60
+ const entry = toEntry(raw);
61
+ const task = {
62
+ id: crypto.randomUUID(),
63
+ fullPath: joinPath(base, normalizeStoragePath(entry.path)),
64
+ status: 'running',
65
+ bytesTransferred: 0,
66
+ totalBytes: sizeOf(entry.data),
67
+ };
68
+ return { task, entry };
69
+ });
70
+ setTasks((prev) => [...prev, ...started.map((s) => s.task)]);
71
+ for (const { task } of started) {
72
+ optionsRef.current.list?.insertItem(task.fullPath);
73
+ optionsRef.current.onProgress?.(task);
74
+ }
75
+ return Promise.all(started.map(async ({ task, entry }) => {
76
+ try {
77
+ const result = await uploadBytes(refFn(storage, task.fullPath), entry.data, entry.metadata);
78
+ const done = {
79
+ ...task,
80
+ status: 'success',
81
+ bytesTransferred: task.totalBytes,
82
+ metadata: result.metadata,
83
+ };
84
+ patchTask(done);
85
+ optionsRef.current.onProgress?.(done);
86
+ optionsRef.current.onComplete?.(done);
87
+ return done;
88
+ }
89
+ catch (e) {
90
+ const failed = {
91
+ ...task,
92
+ status: 'error',
93
+ error: e instanceof Error ? e : new Error(String(e)),
94
+ };
95
+ // Roll the optimistic row back before surfacing.
96
+ optionsRef.current.list?.removeItem(task.fullPath);
97
+ patchTask(failed);
98
+ optionsRef.current.onError?.(failed);
99
+ return failed;
100
+ }
101
+ }));
102
+ }, [storage, base, patchTask, refFn, uploadBytes]);
103
+ const createFolder = useCallback(async (name) => {
104
+ if (storage == null) {
105
+ throw new Error('useObjectUpload: storage handle is null');
106
+ }
107
+ const folderPath = joinPath(base, normalizeStoragePath(name));
108
+ if (folderPath === '') {
109
+ throw new Error('createFolder: folder name is empty');
110
+ }
111
+ // Trailing slash → the seam inserts a prefix, not an item.
112
+ optionsRef.current.list?.insertItem(`${folderPath}/`);
113
+ try {
114
+ await uploadBytes(folderPlaceholderRef(storage, folderPath), new Blob([]),
115
+ // Matches the emulator UI's placeholder content type.
116
+ { contentType: 'text/plain' });
117
+ }
118
+ catch (e) {
119
+ optionsRef.current.list?.removeItem(folderPath);
120
+ throw e;
121
+ }
122
+ }, [storage, base, uploadBytes]);
123
+ const clearCompleted = useCallback(() => {
124
+ setTasks((prev) => prev.filter((t) => t.status === 'running'));
125
+ }, []);
126
+ return {
127
+ tasks,
128
+ isUploading: tasks.some((t) => t.status === 'running'),
129
+ upload,
130
+ createFolder,
131
+ clearCompleted,
132
+ };
133
+ }
134
+ //# sourceMappingURL=useObjectUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useObjectUpload.js","sourceRoot":"","sources":["../../../src/storage/hooks/useObjectUpload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /** Strip leading/trailing slashes and collapse repeats — mirrors
2
+ * `pyric/storage`'s reference normalization so `usePathState` and
3
+ * `useStorageList` always agree on what a path is. */
4
+ export declare function normalizeStoragePath(path: string): string;
5
+ export interface UsePathStateOptions {
6
+ /**
7
+ * Controlled value. When provided, the hook derives everything
8
+ * from it and navigation calls only fire `onPathChange` — the
9
+ * owner owns the state (e.g. a router binding `?path=`).
10
+ */
11
+ path?: string;
12
+ /** Fired with the normalized next path on every navigation. Called
13
+ * in both modes. */
14
+ onPathChange?: (path: string) => void;
15
+ /** Uncontrolled initial value. Default `''` (bucket root). */
16
+ defaultPath?: string;
17
+ }
18
+ export interface UsePathStateResult {
19
+ /** Current normalized path. `''` is the bucket root. */
20
+ path: string;
21
+ /** Path split into segments. `[]` at root. */
22
+ segments: string[];
23
+ /** Jump to an absolute path (normalized). */
24
+ setPath: (path: string) => void;
25
+ /** Descend into a child folder — accepts a bare name (`'sub'`) or
26
+ * an absolute path (`'docs/sub'`, e.g. a prefix's `fullPath`). */
27
+ enter: (nameOrPath: string) => void;
28
+ /** Ascend one level. No-op at root. */
29
+ up: () => void;
30
+ /**
31
+ * Jump to the ancestor ending at `segments[index]` — the breadcrumb
32
+ * click. `navigateToIndex(-1)` (or any negative) is the root.
33
+ */
34
+ navigateToIndex: (index: number) => void;
35
+ }
36
+ /**
37
+ * Path navigation state for the storage browser. Controlled when
38
+ * `path` is provided (the owner re-renders with the next value),
39
+ * uncontrolled otherwise — standard React value/defaultValue
40
+ * semantics. All emitted paths are normalized (`normalizeStoragePath`).
41
+ */
42
+ export declare function usePathState(options?: UsePathStateOptions): UsePathStateResult;
43
+ //# sourceMappingURL=usePathState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePathState.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/usePathState.ts"],"names":[],"mappings":"AAEA;;uDAEuD;AACvD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;yBACqB;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6CAA6C;IAC7C,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;uEACmE;IACnE,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,uCAAuC;IACvC,EAAE,EAAE,MAAM,IAAI,CAAC;IACf;;;OAGG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA2CpB"}