@pyric/ui 0.1.0-alpha.7

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 (594) hide show
  1. package/README.md +79 -0
  2. package/dist/agents/ContextWindowUsage.d.ts +67 -0
  3. package/dist/agents/ContextWindowUsage.d.ts.map +1 -0
  4. package/dist/agents/ContextWindowUsage.js +115 -0
  5. package/dist/agents/ContextWindowUsage.js.map +1 -0
  6. package/dist/agents/EmptyState.d.ts +18 -0
  7. package/dist/agents/EmptyState.d.ts.map +1 -0
  8. package/dist/agents/EmptyState.js +11 -0
  9. package/dist/agents/EmptyState.js.map +1 -0
  10. package/dist/agents/Fold.d.ts +37 -0
  11. package/dist/agents/Fold.d.ts.map +1 -0
  12. package/dist/agents/Fold.js +18 -0
  13. package/dist/agents/Fold.js.map +1 -0
  14. package/dist/agents/Modal.d.ts +25 -0
  15. package/dist/agents/Modal.d.ts.map +1 -0
  16. package/dist/agents/Modal.js +28 -0
  17. package/dist/agents/Modal.js.map +1 -0
  18. package/dist/agents/PulsingDot.d.ts +21 -0
  19. package/dist/agents/PulsingDot.d.ts.map +1 -0
  20. package/dist/agents/PulsingDot.js +18 -0
  21. package/dist/agents/PulsingDot.js.map +1 -0
  22. package/dist/agents/index.d.ts +15 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +15 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/auth/authApi.d.ts +32 -0
  27. package/dist/auth/authApi.d.ts.map +1 -0
  28. package/dist/auth/authApi.js +27 -0
  29. package/dist/auth/authApi.js.map +1 -0
  30. package/dist/auth/claims.d.ts +27 -0
  31. package/dist/auth/claims.d.ts.map +1 -0
  32. package/dist/auth/claims.js +58 -0
  33. package/dist/auth/claims.js.map +1 -0
  34. package/dist/auth/components/AuthProviderToggles.d.ts +31 -0
  35. package/dist/auth/components/AuthProviderToggles.d.ts.map +1 -0
  36. package/dist/auth/components/AuthProviderToggles.js +48 -0
  37. package/dist/auth/components/AuthProviderToggles.js.map +1 -0
  38. package/dist/auth/components/AuthSignInHelper.d.ts +57 -0
  39. package/dist/auth/components/AuthSignInHelper.d.ts.map +1 -0
  40. package/dist/auth/components/AuthSignInHelper.js +69 -0
  41. package/dist/auth/components/AuthSignInHelper.js.map +1 -0
  42. package/dist/auth/components/AuthUserForm.d.ts +84 -0
  43. package/dist/auth/components/AuthUserForm.d.ts.map +1 -0
  44. package/dist/auth/components/AuthUserForm.js +89 -0
  45. package/dist/auth/components/AuthUserForm.js.map +1 -0
  46. package/dist/auth/components/AuthUserList.d.ts +51 -0
  47. package/dist/auth/components/AuthUserList.d.ts.map +1 -0
  48. package/dist/auth/components/AuthUserList.js +46 -0
  49. package/dist/auth/components/AuthUserList.js.map +1 -0
  50. package/dist/auth/components/ClaimsField.d.ts +22 -0
  51. package/dist/auth/components/ClaimsField.d.ts.map +1 -0
  52. package/dist/auth/components/ClaimsField.js +11 -0
  53. package/dist/auth/components/ClaimsField.js.map +1 -0
  54. package/dist/auth/components/confirmActions.d.ts +40 -0
  55. package/dist/auth/components/confirmActions.d.ts.map +1 -0
  56. package/dist/auth/components/confirmActions.js +49 -0
  57. package/dist/auth/components/confirmActions.js.map +1 -0
  58. package/dist/auth/controller.d.ts +73 -0
  59. package/dist/auth/controller.d.ts.map +1 -0
  60. package/dist/auth/controller.js +139 -0
  61. package/dist/auth/controller.js.map +1 -0
  62. package/dist/auth/hooks/index.d.ts +7 -0
  63. package/dist/auth/hooks/index.d.ts.map +1 -0
  64. package/dist/auth/hooks/index.js +7 -0
  65. package/dist/auth/hooks/index.js.map +1 -0
  66. package/dist/auth/hooks/useAuthFlowHelper.d.ts +30 -0
  67. package/dist/auth/hooks/useAuthFlowHelper.d.ts.map +1 -0
  68. package/dist/auth/hooks/useAuthFlowHelper.js +30 -0
  69. package/dist/auth/hooks/useAuthFlowHelper.js.map +1 -0
  70. package/dist/auth/hooks/useAuthProviderConfig.d.ts +37 -0
  71. package/dist/auth/hooks/useAuthProviderConfig.d.ts.map +1 -0
  72. package/dist/auth/hooks/useAuthProviderConfig.js +98 -0
  73. package/dist/auth/hooks/useAuthProviderConfig.js.map +1 -0
  74. package/dist/auth/hooks/useAuthUserEditor.d.ts +30 -0
  75. package/dist/auth/hooks/useAuthUserEditor.d.ts.map +1 -0
  76. package/dist/auth/hooks/useAuthUserEditor.js +27 -0
  77. package/dist/auth/hooks/useAuthUserEditor.js.map +1 -0
  78. package/dist/auth/hooks/useAuthUsers.d.ts +38 -0
  79. package/dist/auth/hooks/useAuthUsers.d.ts.map +1 -0
  80. package/dist/auth/hooks/useAuthUsers.js +111 -0
  81. package/dist/auth/hooks/useAuthUsers.js.map +1 -0
  82. package/dist/auth/index.d.ts +11 -0
  83. package/dist/auth/index.d.ts.map +1 -0
  84. package/dist/auth/index.js +13 -0
  85. package/dist/auth/index.js.map +1 -0
  86. package/dist/auth/providers.d.ts +11 -0
  87. package/dist/auth/providers.d.ts.map +1 -0
  88. package/dist/auth/providers.js +28 -0
  89. package/dist/auth/providers.js.map +1 -0
  90. package/dist/auth/reducers/userEditor.d.ts +55 -0
  91. package/dist/auth/reducers/userEditor.d.ts.map +1 -0
  92. package/dist/auth/reducers/userEditor.js +136 -0
  93. package/dist/auth/reducers/userEditor.js.map +1 -0
  94. package/dist/events/components/ActivityActionItems.d.ts +45 -0
  95. package/dist/events/components/ActivityActionItems.d.ts.map +1 -0
  96. package/dist/events/components/ActivityActionItems.js +68 -0
  97. package/dist/events/components/ActivityActionItems.js.map +1 -0
  98. package/dist/events/components/ActivityGrid.d.ts +65 -0
  99. package/dist/events/components/ActivityGrid.d.ts.map +1 -0
  100. package/dist/events/components/ActivityGrid.js +61 -0
  101. package/dist/events/components/ActivityGrid.js.map +1 -0
  102. package/dist/events/components/ActivityGridRow.d.ts +31 -0
  103. package/dist/events/components/ActivityGridRow.d.ts.map +1 -0
  104. package/dist/events/components/ActivityGridRow.js +23 -0
  105. package/dist/events/components/ActivityGridRow.js.map +1 -0
  106. package/dist/events/components/ProposedChangeDiff.d.ts +46 -0
  107. package/dist/events/components/ProposedChangeDiff.d.ts.map +1 -0
  108. package/dist/events/components/ProposedChangeDiff.js +60 -0
  109. package/dist/events/components/ProposedChangeDiff.js.map +1 -0
  110. package/dist/events/components/format.d.ts +11 -0
  111. package/dist/events/components/format.d.ts.map +1 -0
  112. package/dist/events/components/format.js +26 -0
  113. package/dist/events/components/format.js.map +1 -0
  114. package/dist/events/components/index.d.ts +6 -0
  115. package/dist/events/components/index.d.ts.map +1 -0
  116. package/dist/events/components/index.js +6 -0
  117. package/dist/events/components/index.js.map +1 -0
  118. package/dist/events/digest.d.ts +167 -0
  119. package/dist/events/digest.d.ts.map +1 -0
  120. package/dist/events/digest.js +426 -0
  121. package/dist/events/digest.js.map +1 -0
  122. package/dist/events/hooks/index.d.ts +3 -0
  123. package/dist/events/hooks/index.d.ts.map +1 -0
  124. package/dist/events/hooks/index.js +3 -0
  125. package/dist/events/hooks/index.js.map +1 -0
  126. package/dist/events/hooks/useActivityDigest.d.ts +27 -0
  127. package/dist/events/hooks/useActivityDigest.d.ts.map +1 -0
  128. package/dist/events/hooks/useActivityDigest.js +18 -0
  129. package/dist/events/hooks/useActivityDigest.js.map +1 -0
  130. package/dist/events/hooks/useActivityStream.d.ts +44 -0
  131. package/dist/events/hooks/useActivityStream.d.ts.map +1 -0
  132. package/dist/events/hooks/useActivityStream.js +38 -0
  133. package/dist/events/hooks/useActivityStream.js.map +1 -0
  134. package/dist/events/index.d.ts +15 -0
  135. package/dist/events/index.d.ts.map +1 -0
  136. package/dist/events/index.js +14 -0
  137. package/dist/events/index.js.map +1 -0
  138. package/dist/events/types.d.ts +160 -0
  139. package/dist/events/types.d.ts.map +1 -0
  140. package/dist/events/types.js +21 -0
  141. package/dist/events/types.js.map +1 -0
  142. package/dist/firestore/components/CollectionList.d.ts +22 -0
  143. package/dist/firestore/components/CollectionList.d.ts.map +1 -0
  144. package/dist/firestore/components/CollectionList.js +21 -0
  145. package/dist/firestore/components/CollectionList.js.map +1 -0
  146. package/dist/firestore/components/DeleteWithConfirm.d.ts +38 -0
  147. package/dist/firestore/components/DeleteWithConfirm.d.ts.map +1 -0
  148. package/dist/firestore/components/DeleteWithConfirm.js +33 -0
  149. package/dist/firestore/components/DeleteWithConfirm.js.map +1 -0
  150. package/dist/firestore/components/DocumentEditor.d.ts +47 -0
  151. package/dist/firestore/components/DocumentEditor.d.ts.map +1 -0
  152. package/dist/firestore/components/DocumentEditor.js +176 -0
  153. package/dist/firestore/components/DocumentEditor.js.map +1 -0
  154. package/dist/firestore/components/DocumentList.d.ts +60 -0
  155. package/dist/firestore/components/DocumentList.d.ts.map +1 -0
  156. package/dist/firestore/components/DocumentList.js +39 -0
  157. package/dist/firestore/components/DocumentList.js.map +1 -0
  158. package/dist/firestore/components/DocumentPreview.d.ts +68 -0
  159. package/dist/firestore/components/DocumentPreview.d.ts.map +1 -0
  160. package/dist/firestore/components/DocumentPreview.js +76 -0
  161. package/dist/firestore/components/DocumentPreview.js.map +1 -0
  162. package/dist/firestore/components/FieldRenderer.d.ts +17 -0
  163. package/dist/firestore/components/FieldRenderer.d.ts.map +1 -0
  164. package/dist/firestore/components/FieldRenderer.js +16 -0
  165. package/dist/firestore/components/FieldRenderer.js.map +1 -0
  166. package/dist/firestore/components/QueryBuilder.d.ts +25 -0
  167. package/dist/firestore/components/QueryBuilder.d.ts.map +1 -0
  168. package/dist/firestore/components/QueryBuilder.js +78 -0
  169. package/dist/firestore/components/QueryBuilder.js.map +1 -0
  170. package/dist/firestore/components/ReferencePicker.d.ts +33 -0
  171. package/dist/firestore/components/ReferencePicker.d.ts.map +1 -0
  172. package/dist/firestore/components/ReferencePicker.js +42 -0
  173. package/dist/firestore/components/ReferencePicker.js.map +1 -0
  174. package/dist/firestore/components/TreeEntry.d.ts +15 -0
  175. package/dist/firestore/components/TreeEntry.d.ts.map +1 -0
  176. package/dist/firestore/components/TreeEntry.js +23 -0
  177. package/dist/firestore/components/TreeEntry.js.map +1 -0
  178. package/dist/firestore/components/context.d.ts +18 -0
  179. package/dist/firestore/components/context.d.ts.map +1 -0
  180. package/dist/firestore/components/context.js +7 -0
  181. package/dist/firestore/components/context.js.map +1 -0
  182. package/dist/firestore/fieldEditors/array.d.ts +3 -0
  183. package/dist/firestore/fieldEditors/array.d.ts.map +1 -0
  184. package/dist/firestore/fieldEditors/array.js +16 -0
  185. package/dist/firestore/fieldEditors/array.js.map +1 -0
  186. package/dist/firestore/fieldEditors/boolean.d.ts +3 -0
  187. package/dist/firestore/fieldEditors/boolean.d.ts.map +1 -0
  188. package/dist/firestore/fieldEditors/boolean.js +13 -0
  189. package/dist/firestore/fieldEditors/boolean.js.map +1 -0
  190. package/dist/firestore/fieldEditors/bytes.d.ts +4 -0
  191. package/dist/firestore/fieldEditors/bytes.d.ts.map +1 -0
  192. package/dist/firestore/fieldEditors/bytes.js +31 -0
  193. package/dist/firestore/fieldEditors/bytes.js.map +1 -0
  194. package/dist/firestore/fieldEditors/geopoint.d.ts +4 -0
  195. package/dist/firestore/fieldEditors/geopoint.d.ts.map +1 -0
  196. package/dist/firestore/fieldEditors/geopoint.js +32 -0
  197. package/dist/firestore/fieldEditors/geopoint.js.map +1 -0
  198. package/dist/firestore/fieldEditors/map.d.ts +3 -0
  199. package/dist/firestore/fieldEditors/map.d.ts.map +1 -0
  200. package/dist/firestore/fieldEditors/map.js +19 -0
  201. package/dist/firestore/fieldEditors/map.js.map +1 -0
  202. package/dist/firestore/fieldEditors/null.d.ts +3 -0
  203. package/dist/firestore/fieldEditors/null.d.ts.map +1 -0
  204. package/dist/firestore/fieldEditors/null.js +17 -0
  205. package/dist/firestore/fieldEditors/null.js.map +1 -0
  206. package/dist/firestore/fieldEditors/number.d.ts +3 -0
  207. package/dist/firestore/fieldEditors/number.d.ts.map +1 -0
  208. package/dist/firestore/fieldEditors/number.js +24 -0
  209. package/dist/firestore/fieldEditors/number.js.map +1 -0
  210. package/dist/firestore/fieldEditors/reference.d.ts +4 -0
  211. package/dist/firestore/fieldEditors/reference.d.ts.map +1 -0
  212. package/dist/firestore/fieldEditors/reference.js +49 -0
  213. package/dist/firestore/fieldEditors/reference.js.map +1 -0
  214. package/dist/firestore/fieldEditors/registry.d.ts +16 -0
  215. package/dist/firestore/fieldEditors/registry.d.ts.map +1 -0
  216. package/dist/firestore/fieldEditors/registry.js +42 -0
  217. package/dist/firestore/fieldEditors/registry.js.map +1 -0
  218. package/dist/firestore/fieldEditors/string.d.ts +3 -0
  219. package/dist/firestore/fieldEditors/string.d.ts.map +1 -0
  220. package/dist/firestore/fieldEditors/string.js +13 -0
  221. package/dist/firestore/fieldEditors/string.js.map +1 -0
  222. package/dist/firestore/fieldEditors/timestamp.d.ts +4 -0
  223. package/dist/firestore/fieldEditors/timestamp.d.ts.map +1 -0
  224. package/dist/firestore/fieldEditors/timestamp.js +52 -0
  225. package/dist/firestore/fieldEditors/timestamp.js.map +1 -0
  226. package/dist/firestore/fieldEditors/types.d.ts +64 -0
  227. package/dist/firestore/fieldEditors/types.d.ts.map +1 -0
  228. package/dist/firestore/fieldEditors/types.js +2 -0
  229. package/dist/firestore/fieldEditors/types.js.map +1 -0
  230. package/dist/firestore/fieldEditors/vector.d.ts +29 -0
  231. package/dist/firestore/fieldEditors/vector.d.ts.map +1 -0
  232. package/dist/firestore/fieldEditors/vector.js +93 -0
  233. package/dist/firestore/fieldEditors/vector.js.map +1 -0
  234. package/dist/firestore/firestoreApi.d.ts +35 -0
  235. package/dist/firestore/firestoreApi.d.ts.map +1 -0
  236. package/dist/firestore/firestoreApi.js +28 -0
  237. package/dist/firestore/firestoreApi.js.map +1 -0
  238. package/dist/firestore/hooks/coerceError.d.ts +17 -0
  239. package/dist/firestore/hooks/coerceError.d.ts.map +1 -0
  240. package/dist/firestore/hooks/coerceError.js +41 -0
  241. package/dist/firestore/hooks/coerceError.js.map +1 -0
  242. package/dist/firestore/hooks/index.d.ts +10 -0
  243. package/dist/firestore/hooks/index.d.ts.map +1 -0
  244. package/dist/firestore/hooks/index.js +10 -0
  245. package/dist/firestore/hooks/index.js.map +1 -0
  246. package/dist/firestore/hooks/useCollectionList.d.ts +37 -0
  247. package/dist/firestore/hooks/useCollectionList.d.ts.map +1 -0
  248. package/dist/firestore/hooks/useCollectionList.js +51 -0
  249. package/dist/firestore/hooks/useCollectionList.js.map +1 -0
  250. package/dist/firestore/hooks/useDocumentEditor.d.ts +58 -0
  251. package/dist/firestore/hooks/useDocumentEditor.d.ts.map +1 -0
  252. package/dist/firestore/hooks/useDocumentEditor.js +68 -0
  253. package/dist/firestore/hooks/useDocumentEditor.js.map +1 -0
  254. package/dist/firestore/hooks/useDocumentList.d.ts +45 -0
  255. package/dist/firestore/hooks/useDocumentList.d.ts.map +1 -0
  256. package/dist/firestore/hooks/useDocumentList.js +112 -0
  257. package/dist/firestore/hooks/useDocumentList.js.map +1 -0
  258. package/dist/firestore/hooks/useDocumentSubcollections.d.ts +29 -0
  259. package/dist/firestore/hooks/useDocumentSubcollections.d.ts.map +1 -0
  260. package/dist/firestore/hooks/useDocumentSubcollections.js +48 -0
  261. package/dist/firestore/hooks/useDocumentSubcollections.js.map +1 -0
  262. package/dist/firestore/hooks/useFirestoreCollection.d.ts +14 -0
  263. package/dist/firestore/hooks/useFirestoreCollection.d.ts.map +1 -0
  264. package/dist/firestore/hooks/useFirestoreCollection.js +35 -0
  265. package/dist/firestore/hooks/useFirestoreCollection.js.map +1 -0
  266. package/dist/firestore/hooks/useFirestoreDoc.d.ts +17 -0
  267. package/dist/firestore/hooks/useFirestoreDoc.d.ts.map +1 -0
  268. package/dist/firestore/hooks/useFirestoreDoc.js +34 -0
  269. package/dist/firestore/hooks/useFirestoreDoc.js.map +1 -0
  270. package/dist/firestore/hooks/useQueryBuilder.d.ts +51 -0
  271. package/dist/firestore/hooks/useQueryBuilder.d.ts.map +1 -0
  272. package/dist/firestore/hooks/useQueryBuilder.js +110 -0
  273. package/dist/firestore/hooks/useQueryBuilder.js.map +1 -0
  274. package/dist/firestore/hooks/useRecursiveDelete.d.ts +40 -0
  275. package/dist/firestore/hooks/useRecursiveDelete.d.ts.map +1 -0
  276. package/dist/firestore/hooks/useRecursiveDelete.js +44 -0
  277. package/dist/firestore/hooks/useRecursiveDelete.js.map +1 -0
  278. package/dist/firestore/hooks/useReferencePicker.d.ts +70 -0
  279. package/dist/firestore/hooks/useReferencePicker.d.ts.map +1 -0
  280. package/dist/firestore/hooks/useReferencePicker.js +140 -0
  281. package/dist/firestore/hooks/useReferencePicker.js.map +1 -0
  282. package/dist/firestore/import/parseImport.d.ts +55 -0
  283. package/dist/firestore/import/parseImport.d.ts.map +1 -0
  284. package/dist/firestore/import/parseImport.js +101 -0
  285. package/dist/firestore/import/parseImport.js.map +1 -0
  286. package/dist/firestore/index.d.ts +20 -0
  287. package/dist/firestore/index.d.ts.map +1 -0
  288. package/dist/firestore/index.js +28 -0
  289. package/dist/firestore/index.js.map +1 -0
  290. package/dist/firestore/reducers/defaults.d.ts +10 -0
  291. package/dist/firestore/reducers/defaults.d.ts.map +1 -0
  292. package/dist/firestore/reducers/defaults.js +37 -0
  293. package/dist/firestore/reducers/defaults.js.map +1 -0
  294. package/dist/firestore/reducers/documentEditor.d.ts +23 -0
  295. package/dist/firestore/reducers/documentEditor.d.ts.map +1 -0
  296. package/dist/firestore/reducers/documentEditor.js +199 -0
  297. package/dist/firestore/reducers/documentEditor.js.map +1 -0
  298. package/dist/firestore/reducers/tree.d.ts +28 -0
  299. package/dist/firestore/reducers/tree.d.ts.map +1 -0
  300. package/dist/firestore/reducers/tree.js +129 -0
  301. package/dist/firestore/reducers/tree.js.map +1 -0
  302. package/dist/firestore/reducers/types.d.ts +112 -0
  303. package/dist/firestore/reducers/types.d.ts.map +1 -0
  304. package/dist/firestore/reducers/types.js +2 -0
  305. package/dist/firestore/reducers/types.js.map +1 -0
  306. package/dist/firestore/reducers/validation.d.ts +25 -0
  307. package/dist/firestore/reducers/validation.d.ts.map +1 -0
  308. package/dist/firestore/reducers/validation.js +121 -0
  309. package/dist/firestore/reducers/validation.js.map +1 -0
  310. package/dist/firestore/types.d.ts +77 -0
  311. package/dist/firestore/types.d.ts.map +1 -0
  312. package/dist/firestore/types.js +196 -0
  313. package/dist/firestore/types.js.map +1 -0
  314. package/dist/firestore/validation/ids.d.ts +23 -0
  315. package/dist/firestore/validation/ids.d.ts.map +1 -0
  316. package/dist/firestore/validation/ids.js +46 -0
  317. package/dist/firestore/validation/ids.js.map +1 -0
  318. package/dist/index.d.ts +2 -0
  319. package/dist/index.d.ts.map +1 -0
  320. package/dist/index.js +2 -0
  321. package/dist/index.js.map +1 -0
  322. package/dist/primitives/Badge.d.ts +28 -0
  323. package/dist/primitives/Badge.d.ts.map +1 -0
  324. package/dist/primitives/Badge.js +11 -0
  325. package/dist/primitives/Badge.js.map +1 -0
  326. package/dist/primitives/ConfirmDialog.d.ts +42 -0
  327. package/dist/primitives/ConfirmDialog.d.ts.map +1 -0
  328. package/dist/primitives/ConfirmDialog.js +61 -0
  329. package/dist/primitives/ConfirmDialog.js.map +1 -0
  330. package/dist/primitives/CopyButton.d.ts +28 -0
  331. package/dist/primitives/CopyButton.d.ts.map +1 -0
  332. package/dist/primitives/CopyButton.js +27 -0
  333. package/dist/primitives/CopyButton.js.map +1 -0
  334. package/dist/primitives/JsonView.d.ts +29 -0
  335. package/dist/primitives/JsonView.d.ts.map +1 -0
  336. package/dist/primitives/JsonView.js +56 -0
  337. package/dist/primitives/JsonView.js.map +1 -0
  338. package/dist/primitives/SegmentedControl.d.ts +37 -0
  339. package/dist/primitives/SegmentedControl.d.ts.map +1 -0
  340. package/dist/primitives/SegmentedControl.js +18 -0
  341. package/dist/primitives/SegmentedControl.js.map +1 -0
  342. package/dist/primitives/Toast.d.ts +48 -0
  343. package/dist/primitives/Toast.d.ts.map +1 -0
  344. package/dist/primitives/Toast.js +60 -0
  345. package/dist/primitives/Toast.js.map +1 -0
  346. package/dist/primitives/VirtualList.d.ts +37 -0
  347. package/dist/primitives/VirtualList.d.ts.map +1 -0
  348. package/dist/primitives/VirtualList.js +47 -0
  349. package/dist/primitives/VirtualList.js.map +1 -0
  350. package/dist/primitives/hooks/useContainerSize.d.ts +29 -0
  351. package/dist/primitives/hooks/useContainerSize.d.ts.map +1 -0
  352. package/dist/primitives/hooks/useContainerSize.js +45 -0
  353. package/dist/primitives/hooks/useContainerSize.js.map +1 -0
  354. package/dist/primitives/index.d.ts +10 -0
  355. package/dist/primitives/index.d.ts.map +1 -0
  356. package/dist/primitives/index.js +10 -0
  357. package/dist/primitives/index.js.map +1 -0
  358. package/dist/primitives/useConfirm.d.ts +34 -0
  359. package/dist/primitives/useConfirm.d.ts.map +1 -0
  360. package/dist/primitives/useConfirm.js +63 -0
  361. package/dist/primitives/useConfirm.js.map +1 -0
  362. package/dist/rtdb/components/RtdbPathBar.d.ts +31 -0
  363. package/dist/rtdb/components/RtdbPathBar.d.ts.map +1 -0
  364. package/dist/rtdb/components/RtdbPathBar.js +47 -0
  365. package/dist/rtdb/components/RtdbPathBar.js.map +1 -0
  366. package/dist/rtdb/components/RtdbTree.d.ts +38 -0
  367. package/dist/rtdb/components/RtdbTree.d.ts.map +1 -0
  368. package/dist/rtdb/components/RtdbTree.js +103 -0
  369. package/dist/rtdb/components/RtdbTree.js.map +1 -0
  370. package/dist/rtdb/editor.d.ts +25 -0
  371. package/dist/rtdb/editor.d.ts.map +1 -0
  372. package/dist/rtdb/editor.js +79 -0
  373. package/dist/rtdb/editor.js.map +1 -0
  374. package/dist/rtdb/hooks/useRtdbTree.d.ts +31 -0
  375. package/dist/rtdb/hooks/useRtdbTree.d.ts.map +1 -0
  376. package/dist/rtdb/hooks/useRtdbTree.js +49 -0
  377. package/dist/rtdb/hooks/useRtdbTree.js.map +1 -0
  378. package/dist/rtdb/index.d.ts +17 -0
  379. package/dist/rtdb/index.d.ts.map +1 -0
  380. package/dist/rtdb/index.js +21 -0
  381. package/dist/rtdb/index.js.map +1 -0
  382. package/dist/rtdb/pathInput.d.ts +28 -0
  383. package/dist/rtdb/pathInput.d.ts.map +1 -0
  384. package/dist/rtdb/pathInput.js +40 -0
  385. package/dist/rtdb/pathInput.js.map +1 -0
  386. package/dist/rtdb/reducers/tree.d.ts +86 -0
  387. package/dist/rtdb/reducers/tree.d.ts.map +1 -0
  388. package/dist/rtdb/reducers/tree.js +131 -0
  389. package/dist/rtdb/reducers/tree.js.map +1 -0
  390. package/dist/rtdb/rtdbApi.d.ts +20 -0
  391. package/dist/rtdb/rtdbApi.d.ts.map +1 -0
  392. package/dist/rtdb/rtdbApi.js +2 -0
  393. package/dist/rtdb/rtdbApi.js.map +1 -0
  394. package/dist/rtdb/values.d.ts +44 -0
  395. package/dist/rtdb/values.d.ts.map +1 -0
  396. package/dist/rtdb/values.js +143 -0
  397. package/dist/rtdb/values.js.map +1 -0
  398. package/dist/rules/components/DenialInspector.d.ts +18 -0
  399. package/dist/rules/components/DenialInspector.d.ts.map +1 -0
  400. package/dist/rules/components/DenialInspector.js +58 -0
  401. package/dist/rules/components/DenialInspector.js.map +1 -0
  402. package/dist/rules/components/format.d.ts +56 -0
  403. package/dist/rules/components/format.d.ts.map +1 -0
  404. package/dist/rules/components/format.js +137 -0
  405. package/dist/rules/components/format.js.map +1 -0
  406. package/dist/rules/components/index.d.ts +4 -0
  407. package/dist/rules/components/index.d.ts.map +1 -0
  408. package/dist/rules/components/index.js +4 -0
  409. package/dist/rules/components/index.js.map +1 -0
  410. package/dist/rules/components/scope.d.ts +10 -0
  411. package/dist/rules/components/scope.d.ts.map +1 -0
  412. package/dist/rules/components/scope.js +72 -0
  413. package/dist/rules/components/scope.js.map +1 -0
  414. package/dist/rules/hooks/index.d.ts +2 -0
  415. package/dist/rules/hooks/index.d.ts.map +1 -0
  416. package/dist/rules/hooks/index.js +2 -0
  417. package/dist/rules/hooks/index.js.map +1 -0
  418. package/dist/rules/hooks/useDenialTrace.d.ts +51 -0
  419. package/dist/rules/hooks/useDenialTrace.d.ts.map +1 -0
  420. package/dist/rules/hooks/useDenialTrace.js +58 -0
  421. package/dist/rules/hooks/useDenialTrace.js.map +1 -0
  422. package/dist/rules/index.d.ts +14 -0
  423. package/dist/rules/index.d.ts.map +1 -0
  424. package/dist/rules/index.js +13 -0
  425. package/dist/rules/index.js.map +1 -0
  426. package/dist/rules/types.d.ts +75 -0
  427. package/dist/rules/types.d.ts.map +1 -0
  428. package/dist/rules/types.js +2 -0
  429. package/dist/rules/types.js.map +1 -0
  430. package/dist/storage/collisionRename.d.ts +73 -0
  431. package/dist/storage/collisionRename.d.ts.map +1 -0
  432. package/dist/storage/collisionRename.js +113 -0
  433. package/dist/storage/collisionRename.js.map +1 -0
  434. package/dist/storage/components/DeleteSelectionWithConfirm.d.ts +68 -0
  435. package/dist/storage/components/DeleteSelectionWithConfirm.d.ts.map +1 -0
  436. package/dist/storage/components/DeleteSelectionWithConfirm.js +82 -0
  437. package/dist/storage/components/DeleteSelectionWithConfirm.js.map +1 -0
  438. package/dist/storage/components/ObjectBrowser.d.ts +75 -0
  439. package/dist/storage/components/ObjectBrowser.d.ts.map +1 -0
  440. package/dist/storage/components/ObjectBrowser.js +59 -0
  441. package/dist/storage/components/ObjectBrowser.js.map +1 -0
  442. package/dist/storage/components/ObjectInspector.d.ts +43 -0
  443. package/dist/storage/components/ObjectInspector.d.ts.map +1 -0
  444. package/dist/storage/components/ObjectInspector.js +92 -0
  445. package/dist/storage/components/ObjectInspector.js.map +1 -0
  446. package/dist/storage/components/PathBreadcrumb.d.ts +30 -0
  447. package/dist/storage/components/PathBreadcrumb.d.ts.map +1 -0
  448. package/dist/storage/components/PathBreadcrumb.js +26 -0
  449. package/dist/storage/components/PathBreadcrumb.js.map +1 -0
  450. package/dist/storage/components/UploadDropzone.d.ts +50 -0
  451. package/dist/storage/components/UploadDropzone.d.ts.map +1 -0
  452. package/dist/storage/components/UploadDropzone.js +109 -0
  453. package/dist/storage/components/UploadDropzone.js.map +1 -0
  454. package/dist/storage/folderPlaceholder.d.ts +14 -0
  455. package/dist/storage/folderPlaceholder.d.ts.map +1 -0
  456. package/dist/storage/folderPlaceholder.js +27 -0
  457. package/dist/storage/folderPlaceholder.js.map +1 -0
  458. package/dist/storage/hooks/index.d.ts +9 -0
  459. package/dist/storage/hooks/index.d.ts.map +1 -0
  460. package/dist/storage/hooks/index.js +9 -0
  461. package/dist/storage/hooks/index.js.map +1 -0
  462. package/dist/storage/hooks/useMetadataEditor.d.ts +114 -0
  463. package/dist/storage/hooks/useMetadataEditor.d.ts.map +1 -0
  464. package/dist/storage/hooks/useMetadataEditor.js +193 -0
  465. package/dist/storage/hooks/useMetadataEditor.js.map +1 -0
  466. package/dist/storage/hooks/useObjectUpload.d.ts +109 -0
  467. package/dist/storage/hooks/useObjectUpload.d.ts.map +1 -0
  468. package/dist/storage/hooks/useObjectUpload.js +134 -0
  469. package/dist/storage/hooks/useObjectUpload.js.map +1 -0
  470. package/dist/storage/hooks/usePathState.d.ts +43 -0
  471. package/dist/storage/hooks/usePathState.d.ts.map +1 -0
  472. package/dist/storage/hooks/usePathState.js +42 -0
  473. package/dist/storage/hooks/usePathState.js.map +1 -0
  474. package/dist/storage/hooks/useStorageDelete.d.ts +73 -0
  475. package/dist/storage/hooks/useStorageDelete.d.ts.map +1 -0
  476. package/dist/storage/hooks/useStorageDelete.js +114 -0
  477. package/dist/storage/hooks/useStorageDelete.js.map +1 -0
  478. package/dist/storage/hooks/useStorageList.d.ts +74 -0
  479. package/dist/storage/hooks/useStorageList.d.ts.map +1 -0
  480. package/dist/storage/hooks/useStorageList.js +167 -0
  481. package/dist/storage/hooks/useStorageList.js.map +1 -0
  482. package/dist/storage/hooks/useStorageObject.d.ts +34 -0
  483. package/dist/storage/hooks/useStorageObject.d.ts.map +1 -0
  484. package/dist/storage/hooks/useStorageObject.js +114 -0
  485. package/dist/storage/hooks/useStorageObject.js.map +1 -0
  486. package/dist/storage/hooks/useStorageRulesGate.d.ts +128 -0
  487. package/dist/storage/hooks/useStorageRulesGate.d.ts.map +1 -0
  488. package/dist/storage/hooks/useStorageRulesGate.js +158 -0
  489. package/dist/storage/hooks/useStorageRulesGate.js.map +1 -0
  490. package/dist/storage/hooks/useStorageSelection.d.ts +32 -0
  491. package/dist/storage/hooks/useStorageSelection.d.ts.map +1 -0
  492. package/dist/storage/hooks/useStorageSelection.js +55 -0
  493. package/dist/storage/hooks/useStorageSelection.js.map +1 -0
  494. package/dist/storage/index.d.ts +11 -0
  495. package/dist/storage/index.d.ts.map +1 -0
  496. package/dist/storage/index.js +17 -0
  497. package/dist/storage/index.js.map +1 -0
  498. package/dist/storage/pendingPrefixes.d.ts +73 -0
  499. package/dist/storage/pendingPrefixes.d.ts.map +1 -0
  500. package/dist/storage/pendingPrefixes.js +98 -0
  501. package/dist/storage/pendingPrefixes.js.map +1 -0
  502. package/dist/storage/previews.d.ts +51 -0
  503. package/dist/storage/previews.d.ts.map +1 -0
  504. package/dist/storage/previews.js +73 -0
  505. package/dist/storage/previews.js.map +1 -0
  506. package/dist/storage/storageApi.d.ts +30 -0
  507. package/dist/storage/storageApi.d.ts.map +1 -0
  508. package/dist/storage/storageApi.js +13 -0
  509. package/dist/storage/storageApi.js.map +1 -0
  510. package/dist/traffic/components/RuleHeatmap.d.ts +34 -0
  511. package/dist/traffic/components/RuleHeatmap.d.ts.map +1 -0
  512. package/dist/traffic/components/RuleHeatmap.js +40 -0
  513. package/dist/traffic/components/RuleHeatmap.js.map +1 -0
  514. package/dist/traffic/components/TrafficDetail.d.ts +33 -0
  515. package/dist/traffic/components/TrafficDetail.d.ts.map +1 -0
  516. package/dist/traffic/components/TrafficDetail.js +28 -0
  517. package/dist/traffic/components/TrafficDetail.js.map +1 -0
  518. package/dist/traffic/components/TrafficGroupRow.d.ts +28 -0
  519. package/dist/traffic/components/TrafficGroupRow.d.ts.map +1 -0
  520. package/dist/traffic/components/TrafficGroupRow.js +18 -0
  521. package/dist/traffic/components/TrafficGroupRow.js.map +1 -0
  522. package/dist/traffic/components/TrafficLineChart.d.ts +34 -0
  523. package/dist/traffic/components/TrafficLineChart.d.ts.map +1 -0
  524. package/dist/traffic/components/TrafficLineChart.js +49 -0
  525. package/dist/traffic/components/TrafficLineChart.js.map +1 -0
  526. package/dist/traffic/components/TrafficLog.d.ts +52 -0
  527. package/dist/traffic/components/TrafficLog.d.ts.map +1 -0
  528. package/dist/traffic/components/TrafficLog.js +34 -0
  529. package/dist/traffic/components/TrafficLog.js.map +1 -0
  530. package/dist/traffic/components/TrafficMetricCards.d.ts +26 -0
  531. package/dist/traffic/components/TrafficMetricCards.d.ts.map +1 -0
  532. package/dist/traffic/components/TrafficMetricCards.js +24 -0
  533. package/dist/traffic/components/TrafficMetricCards.js.map +1 -0
  534. package/dist/traffic/components/TrafficRow.d.ts +40 -0
  535. package/dist/traffic/components/TrafficRow.d.ts.map +1 -0
  536. package/dist/traffic/components/TrafficRow.js +27 -0
  537. package/dist/traffic/components/TrafficRow.js.map +1 -0
  538. package/dist/traffic/components/TrafficStats.d.ts +18 -0
  539. package/dist/traffic/components/TrafficStats.d.ts.map +1 -0
  540. package/dist/traffic/components/TrafficStats.js +19 -0
  541. package/dist/traffic/components/TrafficStats.js.map +1 -0
  542. package/dist/traffic/components/TrafficTimeline.d.ts +81 -0
  543. package/dist/traffic/components/TrafficTimeline.d.ts.map +1 -0
  544. package/dist/traffic/components/TrafficTimeline.js +72 -0
  545. package/dist/traffic/components/TrafficTimeline.js.map +1 -0
  546. package/dist/traffic/components/format.d.ts +13 -0
  547. package/dist/traffic/components/format.d.ts.map +1 -0
  548. package/dist/traffic/components/format.js +24 -0
  549. package/dist/traffic/components/format.js.map +1 -0
  550. package/dist/traffic/components/index.d.ts +11 -0
  551. package/dist/traffic/components/index.d.ts.map +1 -0
  552. package/dist/traffic/components/index.js +11 -0
  553. package/dist/traffic/components/index.js.map +1 -0
  554. package/dist/traffic/hooks/index.d.ts +8 -0
  555. package/dist/traffic/hooks/index.d.ts.map +1 -0
  556. package/dist/traffic/hooks/index.js +8 -0
  557. package/dist/traffic/hooks/index.js.map +1 -0
  558. package/dist/traffic/hooks/useRuleHeatmap.d.ts +33 -0
  559. package/dist/traffic/hooks/useRuleHeatmap.d.ts.map +1 -0
  560. package/dist/traffic/hooks/useRuleHeatmap.js +54 -0
  561. package/dist/traffic/hooks/useRuleHeatmap.js.map +1 -0
  562. package/dist/traffic/hooks/useTrafficBuckets.d.ts +71 -0
  563. package/dist/traffic/hooks/useTrafficBuckets.d.ts.map +1 -0
  564. package/dist/traffic/hooks/useTrafficBuckets.js +74 -0
  565. package/dist/traffic/hooks/useTrafficBuckets.js.map +1 -0
  566. package/dist/traffic/hooks/useTrafficFilter.d.ts +40 -0
  567. package/dist/traffic/hooks/useTrafficFilter.d.ts.map +1 -0
  568. package/dist/traffic/hooks/useTrafficFilter.js +33 -0
  569. package/dist/traffic/hooks/useTrafficFilter.js.map +1 -0
  570. package/dist/traffic/hooks/useTrafficGroups.d.ts +47 -0
  571. package/dist/traffic/hooks/useTrafficGroups.d.ts.map +1 -0
  572. package/dist/traffic/hooks/useTrafficGroups.js +73 -0
  573. package/dist/traffic/hooks/useTrafficGroups.js.map +1 -0
  574. package/dist/traffic/hooks/useTrafficMetrics.d.ts +66 -0
  575. package/dist/traffic/hooks/useTrafficMetrics.d.ts.map +1 -0
  576. package/dist/traffic/hooks/useTrafficMetrics.js +156 -0
  577. package/dist/traffic/hooks/useTrafficMetrics.js.map +1 -0
  578. package/dist/traffic/hooks/useTrafficMonitor.d.ts +56 -0
  579. package/dist/traffic/hooks/useTrafficMonitor.d.ts.map +1 -0
  580. package/dist/traffic/hooks/useTrafficMonitor.js +58 -0
  581. package/dist/traffic/hooks/useTrafficMonitor.js.map +1 -0
  582. package/dist/traffic/hooks/useTrafficStats.d.ts +32 -0
  583. package/dist/traffic/hooks/useTrafficStats.d.ts.map +1 -0
  584. package/dist/traffic/hooks/useTrafficStats.js +45 -0
  585. package/dist/traffic/hooks/useTrafficStats.js.map +1 -0
  586. package/dist/traffic/index.d.ts +4 -0
  587. package/dist/traffic/index.d.ts.map +1 -0
  588. package/dist/traffic/index.js +3 -0
  589. package/dist/traffic/index.js.map +1 -0
  590. package/dist/traffic/types.d.ts +72 -0
  591. package/dist/traffic/types.d.ts.map +1 -0
  592. package/dist/traffic/types.js +10 -0
  593. package/dist/traffic/types.js.map +1 -0
  594. package/package.json +116 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/firestore/reducers/validation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAmDhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG;IAC9C,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAkDA"}
@@ -0,0 +1,121 @@
1
+ import { Timestamp, GeoPoint, Bytes } from 'pyric/firestore';
2
+ import { asVectorView } from '../types.js';
3
+ /**
4
+ * Per-type leaf validator. Returns an error message when the value
5
+ * doesn't satisfy the type's constraints, `undefined` when valid.
6
+ *
7
+ * `map` and `array` aren't validated here — their integrity comes
8
+ * from their children + (for maps) sibling-key uniqueness, which
9
+ * is enforced in {@link validateTree}.
10
+ */
11
+ export function validateLeaf(type, value) {
12
+ switch (type) {
13
+ case 'string':
14
+ return typeof value === 'string' ? undefined : 'Expected a string';
15
+ case 'number':
16
+ if (typeof value !== 'number')
17
+ return 'Expected a number';
18
+ if (!Number.isFinite(value))
19
+ return 'Number must be finite';
20
+ return undefined;
21
+ case 'boolean':
22
+ return typeof value === 'boolean' ? undefined : 'Expected a boolean';
23
+ case 'null':
24
+ return value === null || value === undefined ? undefined : 'Expected null';
25
+ case 'timestamp':
26
+ return value instanceof Timestamp ? undefined : 'Expected a Timestamp';
27
+ case 'geopoint':
28
+ if (!(value instanceof GeoPoint))
29
+ return 'Expected a GeoPoint';
30
+ if (value.latitude < -90 || value.latitude > 90)
31
+ return 'Latitude must be between -90 and 90';
32
+ if (value.longitude < -180 || value.longitude > 180)
33
+ return 'Longitude must be between -180 and 180';
34
+ return undefined;
35
+ case 'reference':
36
+ // Structural reference check matches `inferType`. A reference's
37
+ // path must be non-empty and have an even segment count
38
+ // (collection/doc/collection/doc/...).
39
+ if (value === null || typeof value !== 'object')
40
+ return 'Expected a DocumentReference';
41
+ const obj = value;
42
+ if (typeof obj.path !== 'string')
43
+ return 'Reference missing `path`';
44
+ if (!obj.path)
45
+ return 'Reference path is empty';
46
+ const segments = obj.path.split('/').filter(Boolean);
47
+ if (segments.length % 2 !== 0)
48
+ return 'Reference path must have an even segment count';
49
+ return undefined;
50
+ case 'bytes':
51
+ return value instanceof Bytes ? undefined : 'Expected a Bytes value';
52
+ case 'vector':
53
+ return asVectorView(value) !== null ? undefined : 'Expected a vector value';
54
+ case 'map':
55
+ case 'array':
56
+ return undefined; // structural; see validateTree
57
+ }
58
+ }
59
+ /**
60
+ * Walk the tree, attach an `error` to each node, and return the
61
+ * mutated tree along with the total error count. The function does
62
+ * not mutate the input; it returns a fresh tree.
63
+ *
64
+ * Per-leaf errors come from {@link validateLeaf}. Map nodes
65
+ * additionally surface duplicate-key + empty-key errors on the
66
+ * offending children (not on the parent).
67
+ */
68
+ export function validateTree(tree) {
69
+ const nodes = {};
70
+ let errorCount = 0;
71
+ for (const [id, node] of Object.entries(tree.nodes)) {
72
+ nodes[id] = { ...node, error: undefined };
73
+ }
74
+ // Leaf validation
75
+ for (const node of Object.values(nodes)) {
76
+ if (node.type === 'map' || node.type === 'array')
77
+ continue;
78
+ const err = validateLeaf(node.type, node.value);
79
+ if (err) {
80
+ nodes[node.id].error = err;
81
+ errorCount++;
82
+ }
83
+ }
84
+ // Map sibling-key checks: empty + duplicate
85
+ for (const [parentId, parent] of Object.entries(nodes)) {
86
+ if (parent.type !== 'map')
87
+ continue;
88
+ const childIds = tree.childIds[parentId] ?? [];
89
+ const keys = new Map(); // key -> child ids
90
+ for (const childId of childIds) {
91
+ const child = nodes[childId];
92
+ if (!child)
93
+ continue;
94
+ const key = child.key ?? '';
95
+ if (!key) {
96
+ if (!child.error)
97
+ errorCount++;
98
+ nodes[childId].error = nodes[childId].error ?? 'Field name is required';
99
+ }
100
+ const bucket = keys.get(key) ?? [];
101
+ bucket.push(childId);
102
+ keys.set(key, bucket);
103
+ }
104
+ for (const [key, ids] of keys) {
105
+ if (!key)
106
+ continue; // already flagged as required
107
+ if (ids.length > 1) {
108
+ for (const id of ids) {
109
+ if (!nodes[id].error)
110
+ errorCount++;
111
+ nodes[id].error = nodes[id].error ?? 'Field name must be unique';
112
+ }
113
+ }
114
+ }
115
+ }
116
+ return {
117
+ tree: { rootId: tree.rootId, nodes, childIds: tree.childIds },
118
+ errorCount,
119
+ };
120
+ }
121
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/firestore/reducers/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * The set of value types `@pyric/ui` knows how to display + edit.
3
+ * Maps 1:1 to Firestore's serializable value shapes; consumers can
4
+ * extend the registry but the built-in editors cover these.
5
+ */
6
+ export type FieldType = 'string' | 'number' | 'boolean' | 'null' | 'timestamp' | 'geopoint' | 'reference' | 'bytes' | 'map' | 'array' | 'vector';
7
+ /**
8
+ * Runtime-classify a value into one of the {@link FieldType}s.
9
+ *
10
+ * The discrimination order matters:
11
+ * - `null` checked before `typeof === 'object'` (null is an object)
12
+ * - vector (a typed embedding wrapper) checked before `Array.isArray`
13
+ * and before generic objects — its wire-sentinel shape is a plain
14
+ * object, and a bare `number[]` must stay `array`, not `vector`
15
+ * - `Array.isArray` checked before generic objects
16
+ * - Firestore special types (Timestamp/GeoPoint/Bytes/DocumentRef)
17
+ * checked before falling through to `map`
18
+ *
19
+ * `undefined` values aren't legal Firestore field values; we coerce
20
+ * them to `'null'` rather than throw — the caller can decide whether
21
+ * to display or filter.
22
+ */
23
+ export declare function inferType(value: unknown): FieldType;
24
+ /**
25
+ * A serialized Timestamp: exactly `{ seconds, nanoseconds }` (or the firebase
26
+ * `{ _seconds, _nanoseconds }` variant), both numbers, no other keys. The
27
+ * "exactly two keys" guard keeps a genuine map that merely contains those
28
+ * fields from being misclassified.
29
+ */
30
+ export declare function isTimestampShape(v: object): boolean;
31
+ /** A serialized GeoPoint: exactly `{ latitude, longitude }`, both numbers. The
32
+ * GeoPoint display reads `.latitude` / `.longitude`, so the plain shape renders
33
+ * unchanged. */
34
+ export declare function isGeoPointShape(v: object): boolean;
35
+ /**
36
+ * Normalized read-side view of a Firestore vector (embedding) value.
37
+ * Editors and the renderer work against this rather than the raw shape
38
+ * so they don't have to care which backend produced the value.
39
+ */
40
+ export interface VectorView {
41
+ /** The embedding components. Defensive copy — safe to read freely. */
42
+ readonly values: number[];
43
+ /** Number of components. Equivalent to `values.length`; surfaced
44
+ * separately because that's what the UI labels (`vector · <dims>`). */
45
+ readonly dimension: number;
46
+ }
47
+ /**
48
+ * Detect + normalize a Firestore vector value, or return `null` if the
49
+ * value isn't a vector. Vectors reach `@pyric/ui` in several runtime
50
+ * shapes depending on the backend the snapshot came from — there is no
51
+ * single `VectorValue` class `pyric/firestore` re-exports, so we match
52
+ * structurally (the same strategy {@link isDocumentReferenceShape} uses
53
+ * for refs):
54
+ *
55
+ * 1. **pyric `Vector` wrapper** — frozen `.value: number[]` array plus
56
+ * a `.dimension` getter (sandbox / rules-side reads).
57
+ * 2. **firebase/firestore (web) `VectorValue`** — exposes `.toArray()`
58
+ * and nothing else publicly.
59
+ * 3. **firebase-admin `VectorValue`** — internal `._values: number[]`
60
+ * (also a `.toArray()`).
61
+ * 4. **wire sentinel** — `{ __type__: '__vector__', value: number[] }`,
62
+ * the plain-object encoded form a discover crawler / seed emits.
63
+ *
64
+ * A bare `number[]` is intentionally NOT a vector — those stay `array`.
65
+ * Only the typed/branded shapes above match.
66
+ */
67
+ export declare function asVectorView(value: unknown): VectorView | null;
68
+ /** Compact, display-safe rendering of a vector: `vector · <dim> [a, b, c, …]`.
69
+ * So a real embedding never dumps its full array into a diff, a rules trace, or
70
+ * a debugger panel. */
71
+ export declare function vectorPreview(view: VectorView): string;
72
+ /** Deep-replace any vector-shaped value with a compact preview STRING, so the
73
+ * result can be `JSON.stringify`'d / formatted without dumping full embeddings.
74
+ * Recurses plain objects + arrays; class instances (Timestamp/GeoPoint) and
75
+ * scalars pass through untouched. Vector instances/sentinels are caught first. */
76
+ export declare function truncateVectorsForDisplay(value: unknown): unknown;
77
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/firestore/types.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,WAAW,GACX,UAAU,GACV,WAAW,GACX,OAAO,GACP,KAAK,GACL,OAAO,GACP,QAAQ,CAAC;AAEb;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CA6CnD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED;;iBAEiB;AACjB,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAIlD;AAgBD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B;4EACwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAiC9D;AAcD;;wBAEwB;AACxB,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAItD;AAED;;;mFAGmF;AACnF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAejE"}
@@ -0,0 +1,196 @@
1
+ import { Timestamp, GeoPoint, Bytes } from 'pyric/firestore';
2
+ /**
3
+ * Runtime-classify a value into one of the {@link FieldType}s.
4
+ *
5
+ * The discrimination order matters:
6
+ * - `null` checked before `typeof === 'object'` (null is an object)
7
+ * - vector (a typed embedding wrapper) checked before `Array.isArray`
8
+ * and before generic objects — its wire-sentinel shape is a plain
9
+ * object, and a bare `number[]` must stay `array`, not `vector`
10
+ * - `Array.isArray` checked before generic objects
11
+ * - Firestore special types (Timestamp/GeoPoint/Bytes/DocumentRef)
12
+ * checked before falling through to `map`
13
+ *
14
+ * `undefined` values aren't legal Firestore field values; we coerce
15
+ * them to `'null'` rather than throw — the caller can decide whether
16
+ * to display or filter.
17
+ */
18
+ export function inferType(value) {
19
+ if (value === null || value === undefined)
20
+ return 'null';
21
+ if (typeof value === 'string')
22
+ return 'string';
23
+ if (typeof value === 'number')
24
+ return 'number';
25
+ if (typeof value === 'boolean')
26
+ return 'boolean';
27
+ // Vector (embedding) before array + map: a vector arrives as one of
28
+ // several typed shapes (see {@link asVectorView}), one of which is a
29
+ // plain `{__type__:'__vector__', value}` object. A bare numeric array
30
+ // is deliberately NOT a vector — only the typed VectorValue / wrapper
31
+ // / sentinel shapes classify here, so ordinary `number[]` data stays
32
+ // `array`.
33
+ if (typeof value === 'object' && asVectorView(value) !== null)
34
+ return 'vector';
35
+ if (Array.isArray(value))
36
+ return 'array';
37
+ // Firestore SDK value types — these are class instances at runtime.
38
+ // `instanceof` works against the same import pyric/firestore
39
+ // re-exports (Bytes / GeoPoint from firebase/firestore directly;
40
+ // Timestamp from either backend's compatible class).
41
+ if (value instanceof Timestamp)
42
+ return 'timestamp';
43
+ if (value instanceof GeoPoint)
44
+ return 'geopoint';
45
+ if (value instanceof Bytes)
46
+ return 'bytes';
47
+ // Serialized Timestamp / GeoPoint: crossing a worker / postMessage boundary
48
+ // strips the class, leaving plain `{ seconds, nanoseconds }` /
49
+ // `{ latitude, longitude }`. Detect them structurally (same rationale as
50
+ // references below) rather than rendering them as maps of internal fields.
51
+ if (typeof value === 'object' && isTimestampShape(value))
52
+ return 'timestamp';
53
+ if (typeof value === 'object' && isGeoPointShape(value))
54
+ return 'geopoint';
55
+ // DocumentReference has no shared class identity across the two
56
+ // backends (sandbox-chainable vs. firebase/firestore). Use a
57
+ // structural check on the brand-bearing fields. Any object that
58
+ // looks reference-shaped (path + firestore handle + id) is
59
+ // classified as a reference; the alternative is rendering it as
60
+ // a map of those three fields, which is strictly worse.
61
+ if (typeof value === 'object' && isDocumentReferenceShape(value)) {
62
+ return 'reference';
63
+ }
64
+ if (typeof value === 'object')
65
+ return 'map';
66
+ // Unreachable for Firestore-shaped data, but TS wants exhaustivity.
67
+ return 'null';
68
+ }
69
+ /**
70
+ * A serialized Timestamp: exactly `{ seconds, nanoseconds }` (or the firebase
71
+ * `{ _seconds, _nanoseconds }` variant), both numbers, no other keys. The
72
+ * "exactly two keys" guard keeps a genuine map that merely contains those
73
+ * fields from being misclassified.
74
+ */
75
+ export function isTimestampShape(v) {
76
+ const obj = v;
77
+ const keys = Object.keys(obj);
78
+ if (keys.length !== 2)
79
+ return false;
80
+ return ((typeof obj.seconds === 'number' && typeof obj.nanoseconds === 'number') ||
81
+ (typeof obj._seconds === 'number' && typeof obj._nanoseconds === 'number'));
82
+ }
83
+ /** A serialized GeoPoint: exactly `{ latitude, longitude }`, both numbers. The
84
+ * GeoPoint display reads `.latitude` / `.longitude`, so the plain shape renders
85
+ * unchanged. */
86
+ export function isGeoPointShape(v) {
87
+ const obj = v;
88
+ const keys = Object.keys(obj);
89
+ return keys.length === 2 && typeof obj.latitude === 'number' && typeof obj.longitude === 'number';
90
+ }
91
+ function isDocumentReferenceShape(v) {
92
+ const obj = v;
93
+ if (typeof obj.path !== 'string' || typeof obj.id !== 'string')
94
+ return false;
95
+ // The Web SDK ref exposes a `.firestore` handle; the chainable
96
+ // (sandbox) ref exposes `.env` instead. Either signals "this is a
97
+ // ref, not a plain map that happens to have `path` + `id` fields."
98
+ // Also accept `.type === 'document'` which both backends set on
99
+ // their ref class instances.
100
+ const hasFirestore = typeof obj.firestore === 'object' && obj.firestore !== null;
101
+ const hasEnv = typeof obj.env === 'object' && obj.env !== null;
102
+ const hasDocBrand = obj.type === 'document';
103
+ return hasFirestore || hasEnv || hasDocBrand;
104
+ }
105
+ /**
106
+ * Detect + normalize a Firestore vector value, or return `null` if the
107
+ * value isn't a vector. Vectors reach `@pyric/ui` in several runtime
108
+ * shapes depending on the backend the snapshot came from — there is no
109
+ * single `VectorValue` class `pyric/firestore` re-exports, so we match
110
+ * structurally (the same strategy {@link isDocumentReferenceShape} uses
111
+ * for refs):
112
+ *
113
+ * 1. **pyric `Vector` wrapper** — frozen `.value: number[]` array plus
114
+ * a `.dimension` getter (sandbox / rules-side reads).
115
+ * 2. **firebase/firestore (web) `VectorValue`** — exposes `.toArray()`
116
+ * and nothing else publicly.
117
+ * 3. **firebase-admin `VectorValue`** — internal `._values: number[]`
118
+ * (also a `.toArray()`).
119
+ * 4. **wire sentinel** — `{ __type__: '__vector__', value: number[] }`,
120
+ * the plain-object encoded form a discover crawler / seed emits.
121
+ *
122
+ * A bare `number[]` is intentionally NOT a vector — those stay `array`.
123
+ * Only the typed/branded shapes above match.
124
+ */
125
+ export function asVectorView(value) {
126
+ if (value === null || typeof value !== 'object')
127
+ return null;
128
+ const obj = value;
129
+ // (1) pyric Vector wrapper: branded by `typeName === 'vector'` with a
130
+ // numeric `.value` array. `.dimension` is a getter on the class.
131
+ if (obj.typeName === 'vector' && isNumberArray(obj.value)) {
132
+ return freezeView(obj.value);
133
+ }
134
+ // (4) wire sentinel: `{ __type__: '__vector__', value: number[] }`.
135
+ if (obj.__type__ === '__vector__' && isNumberArray(obj.value)) {
136
+ return freezeView(obj.value);
137
+ }
138
+ // (3) firebase-admin VectorValue: internal `_values` array.
139
+ if (isNumberArray(obj._values)) {
140
+ return freezeView(obj._values);
141
+ }
142
+ // (2) firebase/firestore (web) VectorValue: only a `.toArray()`. Guard
143
+ // the call so a plain object with an unrelated `toArray` can't throw —
144
+ // a non-numeric result fails the `isNumberArray` gate below.
145
+ if (typeof obj.toArray === 'function') {
146
+ try {
147
+ const arr = obj.toArray();
148
+ if (isNumberArray(arr))
149
+ return freezeView(arr);
150
+ }
151
+ catch {
152
+ // Not a vector — fall through.
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ function isNumberArray(v) {
158
+ return Array.isArray(v) && v.every((n) => typeof n === 'number');
159
+ }
160
+ function freezeView(values) {
161
+ const copy = values.slice();
162
+ return { values: copy, dimension: copy.length };
163
+ }
164
+ /** How many leading components to show in a truncated vector preview. */
165
+ const VECTOR_PREVIEW_COUNT = 4;
166
+ /** Compact, display-safe rendering of a vector: `vector · <dim> [a, b, c, …]`.
167
+ * So a real embedding never dumps its full array into a diff, a rules trace, or
168
+ * a debugger panel. */
169
+ export function vectorPreview(view) {
170
+ const head = view.values.slice(0, VECTOR_PREVIEW_COUNT).join(', ');
171
+ const tail = view.values.length > VECTOR_PREVIEW_COUNT ? ', …' : '';
172
+ return `vector · ${view.dimension} [${head}${tail}]`;
173
+ }
174
+ /** Deep-replace any vector-shaped value with a compact preview STRING, so the
175
+ * result can be `JSON.stringify`'d / formatted without dumping full embeddings.
176
+ * Recurses plain objects + arrays; class instances (Timestamp/GeoPoint) and
177
+ * scalars pass through untouched. Vector instances/sentinels are caught first. */
178
+ export function truncateVectorsForDisplay(value) {
179
+ const view = asVectorView(value);
180
+ if (view)
181
+ return vectorPreview(view);
182
+ if (Array.isArray(value))
183
+ return value.map(truncateVectorsForDisplay);
184
+ if (value && typeof value === 'object') {
185
+ const proto = Object.getPrototypeOf(value);
186
+ if (proto === Object.prototype || proto === null) {
187
+ const out = {};
188
+ for (const [k, v] of Object.entries(value)) {
189
+ out[k] = truncateVectorsForDisplay(v);
190
+ }
191
+ return out;
192
+ }
193
+ }
194
+ return value;
195
+ }
196
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/firestore/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Firestore collection/document id validation (create-collection /
3
+ * create-document / JSON-import flows).
4
+ *
5
+ * Pure, dependency-free, and deliberately narrow: it mirrors the rules the
6
+ * real backend enforces (see Firestore's "Rules and limits" docs), so a form
7
+ * can reject an invalid id BEFORE the write round-trip rather than
8
+ * surfacing a raw backend error string.
9
+ *
10
+ * Rules (both collection and document ids):
11
+ * - non-empty
12
+ * - no `/` (that's a path separator, not part of an id)
13
+ * - not solely `.` or `..`
14
+ * - doesn't match `__.*__` (reserved for internal use)
15
+ * - at most 1500 bytes (UTF-8) — Firestore caps BOTH collection ids and
16
+ * document ids at 1500 bytes ("Rules and limits": "Maximum size for a
17
+ * collection ID" / "Maximum size for a document ID", both 1,500 bytes).
18
+ */
19
+ /** Validate a collection id. Returns an error message, or `undefined` when valid. */
20
+ export declare function validateCollectionId(id: string): string | undefined;
21
+ /** Validate a document id. Returns an error message, or `undefined` when valid. */
22
+ export declare function validateDocumentId(id: string): string | undefined;
23
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../../src/firestore/validation/ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAcH,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnE;AAOD,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Firestore collection/document id validation (create-collection /
3
+ * create-document / JSON-import flows).
4
+ *
5
+ * Pure, dependency-free, and deliberately narrow: it mirrors the rules the
6
+ * real backend enforces (see Firestore's "Rules and limits" docs), so a form
7
+ * can reject an invalid id BEFORE the write round-trip rather than
8
+ * surfacing a raw backend error string.
9
+ *
10
+ * Rules (both collection and document ids):
11
+ * - non-empty
12
+ * - no `/` (that's a path separator, not part of an id)
13
+ * - not solely `.` or `..`
14
+ * - doesn't match `__.*__` (reserved for internal use)
15
+ * - at most 1500 bytes (UTF-8) — Firestore caps BOTH collection ids and
16
+ * document ids at 1500 bytes ("Rules and limits": "Maximum size for a
17
+ * collection ID" / "Maximum size for a document ID", both 1,500 bytes).
18
+ */
19
+ const RESERVED_DUNDER = /^__.*__$/;
20
+ /** Shared structural checks common to both collection and document ids. */
21
+ function structuralError(id) {
22
+ if (id.length === 0)
23
+ return 'Cannot be empty';
24
+ if (id.includes('/'))
25
+ return 'Cannot contain "/"';
26
+ if (id === '.' || id === '..')
27
+ return 'Cannot be "." or ".."';
28
+ if (RESERVED_DUNDER.test(id))
29
+ return 'Cannot match __.*__ (reserved)';
30
+ if (utf8ByteLength(id) > 1500)
31
+ return 'Cannot exceed 1500 bytes';
32
+ return undefined;
33
+ }
34
+ /** Validate a collection id. Returns an error message, or `undefined` when valid. */
35
+ export function validateCollectionId(id) {
36
+ return structuralError(id);
37
+ }
38
+ /** UTF-8 byte length of a string (Firestore's 1500-byte id cap). */
39
+ function utf8ByteLength(s) {
40
+ return new TextEncoder().encode(s).length;
41
+ }
42
+ /** Validate a document id. Returns an error message, or `undefined` when valid. */
43
+ export function validateDocumentId(id) {
44
+ return structuralError(id);
45
+ }
46
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../../src/firestore/validation/ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,eAAe,GAAG,UAAU,CAAC;AAEnC,2EAA2E;AAC3E,SAAS,eAAe,CAAC,EAAU;IACjC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAC9C,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,oBAAoB,CAAC;IAClD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,uBAAuB,CAAC;IAC9D,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,gCAAgC,CAAC;IACtE,IAAI,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI;QAAE,OAAO,0BAA0B,CAAC;IACjE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,oBAAoB,CAAC,EAAU;IAC7C,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,oEAAoE;AACpE,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface BadgeProps {
3
+ /** Badge content — usually a short word like "ALLOW" or "GET". */
4
+ children: ReactNode;
5
+ /**
6
+ * Freeform category surfaced as `data-pyric-badge-kind`. The
7
+ * library doesn't enumerate kinds — the consumer decides what
8
+ * values exist (`allow`, `deny`, `get`, `update`, …) and styles
9
+ * them via `[data-pyric-badge-kind="…"]`.
10
+ */
11
+ kind?: string;
12
+ /** Forwarded to the underlying `<span>`. */
13
+ className?: string;
14
+ /**
15
+ * Accessible label. When set, the visible text becomes
16
+ * `aria-hidden` and screen readers announce this instead — useful
17
+ * when the badge is a terse glyph but the meaning is longer.
18
+ */
19
+ ariaLabel?: string;
20
+ }
21
+ /**
22
+ * Headless pill / tag. Renders an inline `<span>` carrying
23
+ * `data-pyric-badge` and (when `kind` is set) `data-pyric-badge-kind`
24
+ * so consumers can style categories with attribute selectors. Ships
25
+ * no visual styling of its own.
26
+ */
27
+ export declare function Badge({ children, kind, className, ariaLabel }: BadgeProps): import("react").JSX.Element;
28
+ //# sourceMappingURL=Badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../src/primitives/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,UAAU,+BAWzE"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Headless pill / tag. Renders an inline `<span>` carrying
4
+ * `data-pyric-badge` and (when `kind` is set) `data-pyric-badge-kind`
5
+ * so consumers can style categories with attribute selectors. Ships
6
+ * no visual styling of its own.
7
+ */
8
+ export function Badge({ children, kind, className, ariaLabel }) {
9
+ return (_jsx("span", { "data-pyric-badge": "", "data-pyric-badge-kind": kind, className: className, "aria-label": ariaLabel, children: ariaLabel ? _jsx("span", { "aria-hidden": "true", children: children }) : children }));
10
+ }
11
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sourceRoot":"","sources":["../../src/primitives/Badge.tsx"],"names":[],"mappings":";AAsBA;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAc;IACxE,OAAO,CACL,mCACmB,EAAE,2BACI,IAAI,EAC3B,SAAS,EAAE,SAAS,gBACR,SAAS,YAEpB,SAAS,CAAC,CAAC,CAAC,8BAAkB,MAAM,YAAE,QAAQ,GAAQ,CAAC,CAAC,CAAC,QAAQ,GAC7D,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface ConfirmDialogProps {
3
+ /** Controlled open state. */
4
+ open: boolean;
5
+ /** Called when the user dismisses via overlay click, Escape, or
6
+ * the cancel button. NOT called by `onConfirm`. */
7
+ onOpenChange: (open: boolean) => void;
8
+ /** Heading. */
9
+ title: string;
10
+ /** Body content — explanation, consequences, paths affected. */
11
+ body?: ReactNode;
12
+ /** When `true`, the confirm button carries `data-pyric-destructive`
13
+ * so consumers can style it differently (e.g. red). */
14
+ destructive?: boolean;
15
+ confirmLabel?: string;
16
+ cancelLabel?: string;
17
+ /** Fires when the user presses confirm. The component does NOT
18
+ * close itself on confirm — the consumer typically dismisses
19
+ * after the destructive action resolves. */
20
+ onConfirm: () => void;
21
+ /** Forwarded to the content node so consumers can style. */
22
+ className?: string;
23
+ }
24
+ /**
25
+ * Headless confirmation dialog. Hand-rolled (we evaluated Radix
26
+ * Dialog at M4 but Radix's Presence + Portal stack doesn't render
27
+ * under our bun:test + JSDOM env — see plan section 7 risk #1).
28
+ *
29
+ * Provides:
30
+ * - Portal to `document.body` (so the dialog can escape parent
31
+ * stacking contexts)
32
+ * - Escape-to-close
33
+ * - Overlay click to close
34
+ * - ARIA `role="dialog" aria-modal="true"` wiring
35
+ * - Focus restoration to the previously-focused element on close
36
+ * - Initial focus on the confirm button when opening
37
+ *
38
+ * Ships no visual CSS. Consumers style via the structural
39
+ * `data-pyric-*` attributes.
40
+ */
41
+ export declare function ConfirmDialog({ open, onOpenChange, title, body, destructive, confirmLabel, cancelLabel, onConfirm, className, }: ConfirmDialogProps): import("react").ReactPortal | null;
42
+ //# sourceMappingURL=ConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../src/primitives/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1D,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd;wDACoD;IACpD,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,eAAe;IACf,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;4DACwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;iDAE6C;IAC7C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,IAAI,EACJ,WAAW,EACX,YAAwB,EACxB,WAAsB,EACtB,SAAS,EACT,SAAS,GACV,EAAE,kBAAkB,sCAmFpB"}