@airdraft/react-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/AcceptInviteForm.d.ts +22 -0
  3. package/dist/AcceptInviteForm.d.ts.map +1 -0
  4. package/dist/AcceptInviteForm.js +52 -0
  5. package/dist/AcceptInviteForm.js.map +1 -0
  6. package/dist/AuditLogViewer.d.ts +42 -0
  7. package/dist/AuditLogViewer.d.ts.map +1 -0
  8. package/dist/AuditLogViewer.js +95 -0
  9. package/dist/AuditLogViewer.js.map +1 -0
  10. package/dist/CollectionManager.d.ts +26 -0
  11. package/dist/CollectionManager.d.ts.map +1 -0
  12. package/dist/CollectionManager.js +100 -0
  13. package/dist/CollectionManager.js.map +1 -0
  14. package/dist/CollectionsIndex.d.ts +25 -0
  15. package/dist/CollectionsIndex.d.ts.map +1 -0
  16. package/dist/CollectionsIndex.js +42 -0
  17. package/dist/CollectionsIndex.js.map +1 -0
  18. package/dist/ContentManager.d.ts +26 -0
  19. package/dist/ContentManager.d.ts.map +1 -0
  20. package/dist/ContentManager.js +110 -0
  21. package/dist/ContentManager.js.map +1 -0
  22. package/dist/EntryEditor.d.ts +25 -0
  23. package/dist/EntryEditor.d.ts.map +1 -0
  24. package/dist/EntryEditor.js +190 -0
  25. package/dist/EntryEditor.js.map +1 -0
  26. package/dist/LoginForm.d.ts +18 -0
  27. package/dist/LoginForm.d.ts.map +1 -0
  28. package/dist/LoginForm.js +41 -0
  29. package/dist/LoginForm.js.map +1 -0
  30. package/dist/MediaManager.d.ts +21 -0
  31. package/dist/MediaManager.d.ts.map +1 -0
  32. package/dist/MediaManager.js +59 -0
  33. package/dist/MediaManager.js.map +1 -0
  34. package/dist/SchemaEditor.d.ts +22 -0
  35. package/dist/SchemaEditor.d.ts.map +1 -0
  36. package/dist/SchemaEditor.js +35 -0
  37. package/dist/SchemaEditor.js.map +1 -0
  38. package/dist/SchemaEditorContent.d.ts +4 -0
  39. package/dist/SchemaEditorContent.d.ts.map +1 -0
  40. package/dist/SchemaEditorContent.js +82 -0
  41. package/dist/SchemaEditorContent.js.map +1 -0
  42. package/dist/SchemaEditorFieldDrawer.d.ts +2 -0
  43. package/dist/SchemaEditorFieldDrawer.d.ts.map +1 -0
  44. package/dist/SchemaEditorFieldDrawer.js +126 -0
  45. package/dist/SchemaEditorFieldDrawer.js.map +1 -0
  46. package/dist/SchemaEditorRoot.d.ts +59 -0
  47. package/dist/SchemaEditorRoot.d.ts.map +1 -0
  48. package/dist/SchemaEditorRoot.js +71 -0
  49. package/dist/SchemaEditorRoot.js.map +1 -0
  50. package/dist/SchemaEditorSidebar.d.ts +4 -0
  51. package/dist/SchemaEditorSidebar.d.ts.map +1 -0
  52. package/dist/SchemaEditorSidebar.js +67 -0
  53. package/dist/SchemaEditorSidebar.js.map +1 -0
  54. package/dist/TeamManager.d.ts +18 -0
  55. package/dist/TeamManager.d.ts.map +1 -0
  56. package/dist/TeamManager.js +90 -0
  57. package/dist/TeamManager.js.map +1 -0
  58. package/dist/components/CmsAdminHeader.d.ts +11 -0
  59. package/dist/components/CmsAdminHeader.d.ts.map +1 -0
  60. package/dist/components/CmsAdminHeader.js +119 -0
  61. package/dist/components/CmsAdminHeader.js.map +1 -0
  62. package/dist/components/ConfirmDialog.d.ts +19 -0
  63. package/dist/components/ConfirmDialog.d.ts.map +1 -0
  64. package/dist/components/ConfirmDialog.js +12 -0
  65. package/dist/components/ConfirmDialog.js.map +1 -0
  66. package/dist/components/EmptyState.d.ts +9 -0
  67. package/dist/components/EmptyState.d.ts.map +1 -0
  68. package/dist/components/EmptyState.js +7 -0
  69. package/dist/components/EmptyState.js.map +1 -0
  70. package/dist/components/EntryRow.d.ts +12 -0
  71. package/dist/components/EntryRow.d.ts.map +1 -0
  72. package/dist/components/EntryRow.js +20 -0
  73. package/dist/components/EntryRow.js.map +1 -0
  74. package/dist/components/ErrorAlert.d.ts +32 -0
  75. package/dist/components/ErrorAlert.d.ts.map +1 -0
  76. package/dist/components/ErrorAlert.js +40 -0
  77. package/dist/components/ErrorAlert.js.map +1 -0
  78. package/dist/components/InviteRow.d.ts +18 -0
  79. package/dist/components/InviteRow.d.ts.map +1 -0
  80. package/dist/components/InviteRow.js +28 -0
  81. package/dist/components/InviteRow.js.map +1 -0
  82. package/dist/components/MediaCard.d.ts +10 -0
  83. package/dist/components/MediaCard.d.ts.map +1 -0
  84. package/dist/components/MediaCard.js +29 -0
  85. package/dist/components/MediaCard.js.map +1 -0
  86. package/dist/components/MemberRow.d.ts +19 -0
  87. package/dist/components/MemberRow.d.ts.map +1 -0
  88. package/dist/components/MemberRow.js +19 -0
  89. package/dist/components/MemberRow.js.map +1 -0
  90. package/dist/components/PageHeader.d.ts +8 -0
  91. package/dist/components/PageHeader.d.ts.map +1 -0
  92. package/dist/components/PageHeader.js +7 -0
  93. package/dist/components/PageHeader.js.map +1 -0
  94. package/dist/components/RoleBadge.d.ts +7 -0
  95. package/dist/components/RoleBadge.d.ts.map +1 -0
  96. package/dist/components/RoleBadge.js +12 -0
  97. package/dist/components/RoleBadge.js.map +1 -0
  98. package/dist/components/StatusBadge.d.ts +8 -0
  99. package/dist/components/StatusBadge.d.ts.map +1 -0
  100. package/dist/components/StatusBadge.js +16 -0
  101. package/dist/components/StatusBadge.js.map +1 -0
  102. package/dist/components/TagInput.d.ts +12 -0
  103. package/dist/components/TagInput.d.ts.map +1 -0
  104. package/dist/components/TagInput.js +76 -0
  105. package/dist/components/TagInput.js.map +1 -0
  106. package/dist/components/UploadZone.d.ts +9 -0
  107. package/dist/components/UploadZone.d.ts.map +1 -0
  108. package/dist/components/UploadZone.js +21 -0
  109. package/dist/components/UploadZone.js.map +1 -0
  110. package/dist/components/index.d.ts +27 -0
  111. package/dist/components/index.d.ts.map +1 -0
  112. package/dist/components/index.js +15 -0
  113. package/dist/components/index.js.map +1 -0
  114. package/dist/hooks/use-mobile.d.ts +2 -0
  115. package/dist/hooks/use-mobile.d.ts.map +1 -0
  116. package/dist/hooks/use-mobile.js +16 -0
  117. package/dist/hooks/use-mobile.js.map +1 -0
  118. package/dist/hooks/useMediaQuery.d.ts +2 -0
  119. package/dist/hooks/useMediaQuery.d.ts.map +1 -0
  120. package/dist/hooks/useMediaQuery.js +16 -0
  121. package/dist/hooks/useMediaQuery.js.map +1 -0
  122. package/dist/index.d.ts +29 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +23 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/lib/utils.d.ts +3 -0
  127. package/dist/lib/utils.d.ts.map +1 -0
  128. package/dist/lib/utils.js +6 -0
  129. package/dist/lib/utils.js.map +1 -0
  130. package/dist/ui/accordion.d.ts +8 -0
  131. package/dist/ui/accordion.d.ts.map +1 -0
  132. package/dist/ui/accordion.js +19 -0
  133. package/dist/ui/accordion.js.map +1 -0
  134. package/dist/ui/aevr/aevr/activity-item.d.ts +107 -0
  135. package/dist/ui/aevr/aevr/activity-item.d.ts.map +1 -0
  136. package/dist/ui/aevr/aevr/activity-item.js +154 -0
  137. package/dist/ui/aevr/aevr/activity-item.js.map +1 -0
  138. package/dist/ui/aevr/aevr/blurred-background.d.ts +10 -0
  139. package/dist/ui/aevr/aevr/blurred-background.d.ts.map +1 -0
  140. package/dist/ui/aevr/aevr/blurred-background.js +31 -0
  141. package/dist/ui/aevr/aevr/blurred-background.js.map +1 -0
  142. package/dist/ui/aevr/aevr/button.d.ts +11 -0
  143. package/dist/ui/aevr/aevr/button.d.ts.map +1 -0
  144. package/dist/ui/aevr/aevr/button.js +37 -0
  145. package/dist/ui/aevr/aevr/button.js.map +1 -0
  146. package/dist/ui/aevr/aevr/country-dropdown.d.ts +25 -0
  147. package/dist/ui/aevr/aevr/country-dropdown.d.ts.map +1 -0
  148. package/dist/ui/aevr/aevr/country-dropdown.js +38 -0
  149. package/dist/ui/aevr/aevr/country-dropdown.js.map +1 -0
  150. package/dist/ui/aevr/aevr/currency-amount-input.d.ts +19 -0
  151. package/dist/ui/aevr/aevr/currency-amount-input.d.ts.map +1 -0
  152. package/dist/ui/aevr/aevr/currency-amount-input.js +89 -0
  153. package/dist/ui/aevr/aevr/currency-amount-input.js.map +1 -0
  154. package/dist/ui/aevr/aevr/currency-select.d.ts +16 -0
  155. package/dist/ui/aevr/aevr/currency-select.d.ts.map +1 -0
  156. package/dist/ui/aevr/aevr/currency-select.js +38 -0
  157. package/dist/ui/aevr/aevr/currency-select.js.map +1 -0
  158. package/dist/ui/aevr/aevr/file-upload.d.ts +70 -0
  159. package/dist/ui/aevr/aevr/file-upload.d.ts.map +1 -0
  160. package/dist/ui/aevr/aevr/file-upload.js +388 -0
  161. package/dist/ui/aevr/aevr/file-upload.js.map +1 -0
  162. package/dist/ui/aevr/aevr/info-box.d.ts +32 -0
  163. package/dist/ui/aevr/aevr/info-box.d.ts.map +1 -0
  164. package/dist/ui/aevr/aevr/info-box.js +248 -0
  165. package/dist/ui/aevr/aevr/info-box.js.map +1 -0
  166. package/dist/ui/aevr/aevr/loader.d.ts +6 -0
  167. package/dist/ui/aevr/aevr/loader.d.ts.map +1 -0
  168. package/dist/ui/aevr/aevr/loader.js +14 -0
  169. package/dist/ui/aevr/aevr/loader.js.map +1 -0
  170. package/dist/ui/aevr/aevr/mini-wallet-card.d.ts +29 -0
  171. package/dist/ui/aevr/aevr/mini-wallet-card.d.ts.map +1 -0
  172. package/dist/ui/aevr/aevr/mini-wallet-card.js +31 -0
  173. package/dist/ui/aevr/aevr/mini-wallet-card.js.map +1 -0
  174. package/dist/ui/aevr/aevr/multistep.d.ts +40 -0
  175. package/dist/ui/aevr/aevr/multistep.d.ts.map +1 -0
  176. package/dist/ui/aevr/aevr/multistep.js +95 -0
  177. package/dist/ui/aevr/aevr/multistep.js.map +1 -0
  178. package/dist/ui/aevr/aevr/nav-user.d.ts +35 -0
  179. package/dist/ui/aevr/aevr/nav-user.d.ts.map +1 -0
  180. package/dist/ui/aevr/aevr/nav-user.js +47 -0
  181. package/dist/ui/aevr/aevr/nav-user.js.map +1 -0
  182. package/dist/ui/aevr/aevr/page-header.d.ts +46 -0
  183. package/dist/ui/aevr/aevr/page-header.d.ts.map +1 -0
  184. package/dist/ui/aevr/aevr/page-header.js +68 -0
  185. package/dist/ui/aevr/aevr/page-header.js.map +1 -0
  186. package/dist/ui/aevr/aevr/phone-input.d.ts +8 -0
  187. package/dist/ui/aevr/aevr/phone-input.d.ts.map +1 -0
  188. package/dist/ui/aevr/aevr/phone-input.js +60 -0
  189. package/dist/ui/aevr/aevr/phone-input.js.map +1 -0
  190. package/dist/ui/aevr/aevr/progress.d.ts +38 -0
  191. package/dist/ui/aevr/aevr/progress.d.ts.map +1 -0
  192. package/dist/ui/aevr/aevr/progress.js +65 -0
  193. package/dist/ui/aevr/aevr/progress.js.map +1 -0
  194. package/dist/ui/aevr/aevr/responsive-breadcrumb.d.ts +14 -0
  195. package/dist/ui/aevr/aevr/responsive-breadcrumb.d.ts.map +1 -0
  196. package/dist/ui/aevr/aevr/responsive-breadcrumb.js +17 -0
  197. package/dist/ui/aevr/aevr/responsive-breadcrumb.js.map +1 -0
  198. package/dist/ui/aevr/aevr/responsive-dialog.d.ts +16 -0
  199. package/dist/ui/aevr/aevr/responsive-dialog.d.ts.map +1 -0
  200. package/dist/ui/aevr/aevr/responsive-dialog.js +29 -0
  201. package/dist/ui/aevr/aevr/responsive-dialog.js.map +1 -0
  202. package/dist/ui/aevr/aevr/search-command.d.ts +31 -0
  203. package/dist/ui/aevr/aevr/search-command.d.ts.map +1 -0
  204. package/dist/ui/aevr/aevr/search-command.js +129 -0
  205. package/dist/ui/aevr/aevr/search-command.js.map +1 -0
  206. package/dist/ui/aevr/aevr/settings-card.d.ts +15 -0
  207. package/dist/ui/aevr/aevr/settings-card.d.ts.map +1 -0
  208. package/dist/ui/aevr/aevr/settings-card.js +29 -0
  209. package/dist/ui/aevr/aevr/settings-card.js.map +1 -0
  210. package/dist/ui/aevr/aevr/settings-header.d.ts +8 -0
  211. package/dist/ui/aevr/aevr/settings-header.d.ts.map +1 -0
  212. package/dist/ui/aevr/aevr/settings-header.js +9 -0
  213. package/dist/ui/aevr/aevr/settings-header.js.map +1 -0
  214. package/dist/ui/aevr/aevr/stat-card.d.ts +55 -0
  215. package/dist/ui/aevr/aevr/stat-card.d.ts.map +1 -0
  216. package/dist/ui/aevr/aevr/stat-card.js +86 -0
  217. package/dist/ui/aevr/aevr/stat-card.js.map +1 -0
  218. package/dist/ui/aevr/aevr/summary-card.d.ts +20 -0
  219. package/dist/ui/aevr/aevr/summary-card.d.ts.map +1 -0
  220. package/dist/ui/aevr/aevr/summary-card.js +29 -0
  221. package/dist/ui/aevr/aevr/summary-card.js.map +1 -0
  222. package/dist/ui/aevr/aevr/tag.d.ts +15 -0
  223. package/dist/ui/aevr/aevr/tag.d.ts.map +1 -0
  224. package/dist/ui/aevr/aevr/tag.js +42 -0
  225. package/dist/ui/aevr/aevr/tag.js.map +1 -0
  226. package/dist/ui/aevr/aevr/theme-toggle.d.ts +2 -0
  227. package/dist/ui/aevr/aevr/theme-toggle.d.ts.map +1 -0
  228. package/dist/ui/aevr/aevr/theme-toggle.js +20 -0
  229. package/dist/ui/aevr/aevr/theme-toggle.js.map +1 -0
  230. package/dist/ui/aevr/aevr/transaction-pin-confirm.d.ts +21 -0
  231. package/dist/ui/aevr/aevr/transaction-pin-confirm.d.ts.map +1 -0
  232. package/dist/ui/aevr/aevr/transaction-pin-confirm.js +65 -0
  233. package/dist/ui/aevr/aevr/transaction-pin-confirm.js.map +1 -0
  234. package/dist/ui/aevr/aevr/wallet-activity-item.d.ts +36 -0
  235. package/dist/ui/aevr/aevr/wallet-activity-item.d.ts.map +1 -0
  236. package/dist/ui/aevr/aevr/wallet-activity-item.js +288 -0
  237. package/dist/ui/aevr/aevr/wallet-activity-item.js.map +1 -0
  238. package/dist/ui/aevr/aevr/wallet-topup-form.d.ts +26 -0
  239. package/dist/ui/aevr/aevr/wallet-topup-form.d.ts.map +1 -0
  240. package/dist/ui/aevr/aevr/wallet-topup-form.js +13 -0
  241. package/dist/ui/aevr/aevr/wallet-topup-form.js.map +1 -0
  242. package/dist/ui/aevr/blurred-background.d.ts +10 -0
  243. package/dist/ui/aevr/blurred-background.d.ts.map +1 -0
  244. package/dist/ui/aevr/blurred-background.js +31 -0
  245. package/dist/ui/aevr/blurred-background.js.map +1 -0
  246. package/dist/ui/aevr/loader.d.ts +7 -0
  247. package/dist/ui/aevr/loader.d.ts.map +1 -0
  248. package/dist/ui/aevr/loader.js +15 -0
  249. package/dist/ui/aevr/loader.js.map +1 -0
  250. package/dist/ui/aevr/nav-user.d.ts +35 -0
  251. package/dist/ui/aevr/nav-user.d.ts.map +1 -0
  252. package/dist/ui/aevr/nav-user.js +38 -0
  253. package/dist/ui/aevr/nav-user.js.map +1 -0
  254. package/dist/ui/aevr/page-header.d.ts +46 -0
  255. package/dist/ui/aevr/page-header.d.ts.map +1 -0
  256. package/dist/ui/aevr/page-header.js +72 -0
  257. package/dist/ui/aevr/page-header.js.map +1 -0
  258. package/dist/ui/aevr/progress.d.ts +38 -0
  259. package/dist/ui/aevr/progress.d.ts.map +1 -0
  260. package/dist/ui/aevr/progress.js +65 -0
  261. package/dist/ui/aevr/progress.js.map +1 -0
  262. package/dist/ui/aevr/responsive-breadcrumb.d.ts +14 -0
  263. package/dist/ui/aevr/responsive-breadcrumb.d.ts.map +1 -0
  264. package/dist/ui/aevr/responsive-breadcrumb.js +17 -0
  265. package/dist/ui/aevr/responsive-breadcrumb.js.map +1 -0
  266. package/dist/ui/aevr/search-command.d.ts +31 -0
  267. package/dist/ui/aevr/search-command.d.ts.map +1 -0
  268. package/dist/ui/aevr/search-command.js +129 -0
  269. package/dist/ui/aevr/search-command.js.map +1 -0
  270. package/dist/ui/aevr/theme-toggle.d.ts +2 -0
  271. package/dist/ui/aevr/theme-toggle.d.ts.map +1 -0
  272. package/dist/ui/aevr/theme-toggle.js +20 -0
  273. package/dist/ui/aevr/theme-toggle.js.map +1 -0
  274. package/dist/ui/alert-dialog.d.ts +19 -0
  275. package/dist/ui/alert-dialog.d.ts.map +1 -0
  276. package/dist/ui/alert-dialog.js +42 -0
  277. package/dist/ui/alert-dialog.js.map +1 -0
  278. package/dist/ui/alert.d.ts +11 -0
  279. package/dist/ui/alert.d.ts.map +1 -0
  280. package/dist/ui/alert.js +28 -0
  281. package/dist/ui/alert.js.map +1 -0
  282. package/dist/ui/avatar.d.ts +12 -0
  283. package/dist/ui/avatar.d.ts.map +1 -0
  284. package/dist/ui/avatar.js +24 -0
  285. package/dist/ui/avatar.js.map +1 -0
  286. package/dist/ui/badge.d.ts +10 -0
  287. package/dist/ui/badge.d.ts.map +1 -0
  288. package/dist/ui/badge.js +25 -0
  289. package/dist/ui/badge.js.map +1 -0
  290. package/dist/ui/breadcrumb.d.ts +12 -0
  291. package/dist/ui/breadcrumb.d.ts.map +1 -0
  292. package/dist/ui/breadcrumb.js +28 -0
  293. package/dist/ui/breadcrumb.js.map +1 -0
  294. package/dist/ui/button.d.ts +11 -0
  295. package/dist/ui/button.d.ts.map +1 -0
  296. package/dist/ui/button.js +36 -0
  297. package/dist/ui/button.js.map +1 -0
  298. package/dist/ui/checkbox.d.ts +5 -0
  299. package/dist/ui/checkbox.d.ts.map +1 -0
  300. package/dist/ui/checkbox.js +9 -0
  301. package/dist/ui/checkbox.js.map +1 -0
  302. package/dist/ui/command.d.ts +19 -0
  303. package/dist/ui/command.d.ts.map +1 -0
  304. package/dist/ui/command.js +35 -0
  305. package/dist/ui/command.js.map +1 -0
  306. package/dist/ui/dialog.d.ts +18 -0
  307. package/dist/ui/dialog.d.ts.map +1 -0
  308. package/dist/ui/dialog.js +37 -0
  309. package/dist/ui/dialog.js.map +1 -0
  310. package/dist/ui/drawer.d.ts +14 -0
  311. package/dist/ui/drawer.d.ts.map +1 -0
  312. package/dist/ui/drawer.js +35 -0
  313. package/dist/ui/drawer.js.map +1 -0
  314. package/dist/ui/dropdown-menu.d.ts +30 -0
  315. package/dist/ui/dropdown-menu.d.ts.map +1 -0
  316. package/dist/ui/dropdown-menu.js +52 -0
  317. package/dist/ui/dropdown-menu.js.map +1 -0
  318. package/dist/ui/field.d.ts +25 -0
  319. package/dist/ui/field.d.ts.map +1 -0
  320. package/dist/ui/field.js +68 -0
  321. package/dist/ui/field.js.map +1 -0
  322. package/dist/ui/hover-card.d.ts +7 -0
  323. package/dist/ui/hover-card.d.ts.map +1 -0
  324. package/dist/ui/hover-card.js +14 -0
  325. package/dist/ui/hover-card.js.map +1 -0
  326. package/dist/ui/input-group.d.ts +17 -0
  327. package/dist/ui/input-group.d.ts.map +1 -0
  328. package/dist/ui/input-group.js +57 -0
  329. package/dist/ui/input-group.js.map +1 -0
  330. package/dist/ui/input.d.ts +4 -0
  331. package/dist/ui/input.d.ts.map +1 -0
  332. package/dist/ui/input.js +7 -0
  333. package/dist/ui/input.js.map +1 -0
  334. package/dist/ui/item.d.ts +24 -0
  335. package/dist/ui/item.d.ts.map +1 -0
  336. package/dist/ui/item.js +68 -0
  337. package/dist/ui/item.js.map +1 -0
  338. package/dist/ui/label.d.ts +5 -0
  339. package/dist/ui/label.d.ts.map +1 -0
  340. package/dist/ui/label.js +8 -0
  341. package/dist/ui/label.js.map +1 -0
  342. package/dist/ui/radio-group.d.ts +6 -0
  343. package/dist/ui/radio-group.d.ts.map +1 -0
  344. package/dist/ui/radio-group.js +11 -0
  345. package/dist/ui/radio-group.js.map +1 -0
  346. package/dist/ui/select.d.ts +16 -0
  347. package/dist/ui/select.d.ts.map +1 -0
  348. package/dist/ui/select.js +36 -0
  349. package/dist/ui/select.js.map +1 -0
  350. package/dist/ui/separator.d.ts +5 -0
  351. package/dist/ui/separator.d.ts.map +1 -0
  352. package/dist/ui/separator.js +9 -0
  353. package/dist/ui/separator.js.map +1 -0
  354. package/dist/ui/sheet.d.ts +15 -0
  355. package/dist/ui/sheet.d.ts.map +1 -0
  356. package/dist/ui/sheet.js +37 -0
  357. package/dist/ui/sheet.js.map +1 -0
  358. package/dist/ui/sidebar.d.ts +70 -0
  359. package/dist/ui/sidebar.d.ts.map +1 -0
  360. package/dist/ui/sidebar.js +207 -0
  361. package/dist/ui/sidebar.js.map +1 -0
  362. package/dist/ui/skeleton.d.ts +3 -0
  363. package/dist/ui/skeleton.d.ts.map +1 -0
  364. package/dist/ui/skeleton.js +7 -0
  365. package/dist/ui/skeleton.js.map +1 -0
  366. package/dist/ui/switch.d.ts +7 -0
  367. package/dist/ui/switch.d.ts.map +1 -0
  368. package/dist/ui/switch.js +8 -0
  369. package/dist/ui/switch.js.map +1 -0
  370. package/dist/ui/table.d.ts +11 -0
  371. package/dist/ui/table.d.ts.map +1 -0
  372. package/dist/ui/table.js +28 -0
  373. package/dist/ui/table.js.map +1 -0
  374. package/dist/ui/textarea.d.ts +4 -0
  375. package/dist/ui/textarea.d.ts.map +1 -0
  376. package/dist/ui/textarea.js +7 -0
  377. package/dist/ui/textarea.js.map +1 -0
  378. package/dist/ui/toggle-group.d.ts +11 -0
  379. package/dist/ui/toggle-group.d.ts.map +1 -0
  380. package/dist/ui/toggle-group.js +24 -0
  381. package/dist/ui/toggle-group.js.map +1 -0
  382. package/dist/ui/toggle.d.ts +10 -0
  383. package/dist/ui/toggle.d.ts.map +1 -0
  384. package/dist/ui/toggle.js +26 -0
  385. package/dist/ui/toggle.js.map +1 -0
  386. package/dist/ui/tooltip.d.ts +8 -0
  387. package/dist/ui/tooltip.d.ts.map +1 -0
  388. package/dist/ui/tooltip.js +17 -0
  389. package/dist/ui/tooltip.js.map +1 -0
  390. package/package.json +57 -0
@@ -0,0 +1,90 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { useTeam } from '@airdraft/react';
5
+ import { Button } from './ui/button.js';
6
+ import Loader from './ui/aevr/loader.js';
7
+ import { Input } from './ui/input.js';
8
+ import { Label } from './ui/label.js';
9
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from './ui/select.js';
10
+ import { Table, TableBody, TableHead, TableHeader, TableRow, } from './ui/table.js';
11
+ import { PageHeader } from './components/PageHeader.js';
12
+ import { EmptyState } from './components/EmptyState.js';
13
+ import { MemberRow } from './components/MemberRow.js';
14
+ import { InviteRow } from './components/InviteRow.js';
15
+ import { ErrorAlert } from './components/ErrorAlert.js';
16
+ import { Users, UserPlus, X } from 'lucide-react';
17
+ import { cn } from './lib/utils.js';
18
+ // ---------------------------------------------------------------------------
19
+ // Invite form
20
+ // ---------------------------------------------------------------------------
21
+ function InviteForm({ onDone, onInvite, inviting, }) {
22
+ const [email, setEmail] = useState('');
23
+ const [role, setRole] = useState('editor');
24
+ const [error, setError] = useState(null);
25
+ async function handleSubmit(e) {
26
+ e.preventDefault();
27
+ if (!email.trim()) {
28
+ setError('Email is required');
29
+ return;
30
+ }
31
+ try {
32
+ await onInvite(email.trim(), role);
33
+ onDone();
34
+ }
35
+ catch (err) {
36
+ setError(err instanceof Error ? err.message : 'Failed to send invite.');
37
+ }
38
+ }
39
+ return (_jsxs("form", { onSubmit: handleSubmit, className: "flex flex-wrap items-end gap-2 rounded-lg border bg-muted/30 p-3", children: [_jsxs("div", { className: "flex-1 min-w-45 space-y-1", children: [_jsx(Label, { htmlFor: "invite-email", className: "text-xs", children: "Email" }), _jsx(Input, { id: "invite-email", type: "email", value: email, onChange: (e) => { setEmail(e.target.value); setError(null); }, placeholder: "team@example.com", className: "h-8 text-sm", autoFocus: true })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "invite-role", className: "text-xs", children: "Role" }), _jsxs(Select, { value: role, onValueChange: (v) => setRole(v), children: [_jsx(SelectTrigger, { id: "invite-role", className: "h-8 w-28 text-xs", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "admin", children: "Admin" }), _jsx(SelectItem, { value: "publisher", children: "Publisher" }), _jsx(SelectItem, { value: "editor", children: "Editor" })] })] })] }), _jsxs(Button, { type: "submit", size: "sm", disabled: inviting, children: [_jsx(Loader, { loading: inviting, className: "size-3.5" }), inviting ? 'Sending…' : 'Send invite'] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "h-8 w-8", onClick: onDone, children: _jsx(X, { className: "h-4 w-4" }) }), error && _jsx(ErrorAlert, { error: error, compact: true, className: "w-full" })] }));
40
+ }
41
+ // ---------------------------------------------------------------------------
42
+ // TeamManager
43
+ // ---------------------------------------------------------------------------
44
+ /**
45
+ * Tier 3 — drop-in team manager.
46
+ *
47
+ * Lists team members and pending invites. Requires admin role to manage.
48
+ *
49
+ * ```tsx
50
+ * import { TeamManager } from '@airdraft/react-ui'
51
+ *
52
+ * export default function TeamPage() {
53
+ * return <TeamManager />
54
+ * }
55
+ * ```
56
+ */
57
+ // Inner component — only rendered (and therefore only fetches) when the user is admin.
58
+ function TeamManagerAdmin({ className, inviteBasePath, currentUserEmail }) {
59
+ const { users, invites, loading, error, refresh, inviting, createInvite, revokeInvite, changeRole, removeUser } = useTeam();
60
+ const [showInvite, setShowInvite] = useState(false);
61
+ const [removingId, setRemovingId] = useState(null);
62
+ const [revokingToken, setRevokingToken] = useState(null);
63
+ const basePath = inviteBasePath ?? (typeof window !== 'undefined' ? window.location.origin : '');
64
+ const handleRemove = async (userId) => {
65
+ setRemovingId(userId);
66
+ try {
67
+ await removeUser(userId);
68
+ }
69
+ finally {
70
+ setRemovingId(null);
71
+ }
72
+ };
73
+ const handleRevoke = async (token) => {
74
+ setRevokingToken(token);
75
+ try {
76
+ await revokeInvite(token);
77
+ }
78
+ finally {
79
+ setRevokingToken(null);
80
+ }
81
+ };
82
+ return (_jsxs("div", { className: cn('space-y-6', className), children: [_jsx(PageHeader, { title: "Team", description: `${users.length} member${users.length === 1 ? '' : 's'}`, actions: !showInvite && (_jsxs(Button, { size: "sm", onClick: () => setShowInvite(true), children: [_jsx(UserPlus, { className: "mr-1.5 h-3.5 w-3.5" }), "Invite member"] })) }), showInvite && (_jsx(InviteForm, { onDone: () => setShowInvite(false), onInvite: createInvite, inviting: inviting })), loading ? (_jsx("div", { className: "flex justify-center py-8", children: _jsx(Loader, {}) })) : error ? (_jsx(ErrorAlert, { error: error, title: "Failed to load team", onRetry: refresh })) : (_jsxs(_Fragment, { children: [users.length === 0 ? (_jsx(EmptyState, { icon: _jsx(Users, { className: "h-10 w-10" }), title: "No team members", description: "Invite your first team member to get started." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Member" }), _jsx(TableHead, { children: "Role" }), _jsx(TableHead, { children: "Joined" }), _jsx(TableHead, {})] }) }), _jsx(TableBody, { children: users.map((u) => (_jsx(MemberRow, { user: u, currentUserEmail: currentUserEmail, canManage: true, onRemove: handleRemove, removing: removingId === u.id }, u.id))) })] })), invites.length > 0 && (_jsxs("div", { className: "space-y-2", children: [_jsx("h3", { className: "text-sm font-medium text-muted-foreground", children: "Pending invites" }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Email" }), _jsx(TableHead, { children: "Role" }), _jsx(TableHead, { children: "Expires" }), _jsx(TableHead, {})] }) }), _jsx(TableBody, { children: invites.map((inv) => (_jsx(InviteRow, { invite: inv, inviteBasePath: basePath, canManage: true, revoking: revokingToken === inv.token }, inv.token))) })] })] }))] }))] }));
83
+ }
84
+ export function TeamManager({ className, inviteBasePath, isAdmin = true, currentUserEmail }) {
85
+ if (!isAdmin) {
86
+ return (_jsxs("div", { className: cn('space-y-6', className), children: [_jsx(PageHeader, { title: "Team", description: "" }), _jsx(EmptyState, { icon: _jsx(Users, { className: "h-10 w-10" }), title: "Access restricted", description: "Only admins can manage team members." })] }));
87
+ }
88
+ return (_jsx(TeamManagerAdmin, { className: className, inviteBasePath: inviteBasePath, currentUserEmail: currentUserEmail }));
89
+ }
90
+ //# sourceMappingURL=TeamManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamManager.js","sourceRoot":"","sources":["../src/TeamManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface CmsAdminHeaderProps {
2
+ /** The authenticated CMS user. Omit when running in API-key mode or when
3
+ * the user is not yet known — the user menu is hidden in that case. */
4
+ user?: {
5
+ email: string;
6
+ name?: string;
7
+ } | null;
8
+ onLogout?: () => void;
9
+ }
10
+ export declare function CmsAdminHeader({ user, onLogout }: CmsAdminHeaderProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=CmsAdminHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CmsAdminHeader.d.ts","sourceRoot":"","sources":["../../src/components/CmsAdminHeader.tsx"],"names":[],"mappings":"AA4HA,MAAM,WAAW,mBAAmB;IAClC;4EACwE;IACxE,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CA8CrE"}
@@ -0,0 +1,119 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Link from "next/link";
4
+ import Image from "next/image";
5
+ import { usePathname } from "next/navigation";
6
+ import { PageHeader } from "../ui/aevr/page-header.js";
7
+ import { NavUser } from "../ui/aevr/nav-user.js";
8
+ import { SearchCommand } from "../ui/aevr/search-command.js";
9
+ import { ActivityIcon, Code2Icon, ImageIcon, LayoutListIcon, SettingsIcon, UsersIcon, } from "lucide-react";
10
+ // ── Segment config for CMS breadcrumbs ───────────────────────────────────────
11
+ // The "cms" segment itself is skipped so breadcrumbs start from the sub-route.
12
+ const CMS_SEGMENT_CONFIG = {
13
+ collections: {
14
+ label: "Content",
15
+ shortLabel: "Content",
16
+ icon: LayoutListIcon,
17
+ },
18
+ media: { label: "Media", shortLabel: "Media", icon: ImageIcon },
19
+ settings: { label: "Settings", shortLabel: "Settings", icon: SettingsIcon },
20
+ schema: { label: "Schema", shortLabel: "Schema", icon: Code2Icon },
21
+ team: { label: "Team", shortLabel: "Team", icon: UsersIcon },
22
+ audit: { label: "Audit Log", shortLabel: "Audit", icon: ActivityIcon },
23
+ };
24
+ // ── Search command config ─────────────────────────────────────────────────────
25
+ const CMS_SEARCH_GROUPS = [
26
+ {
27
+ heading: "Navigation",
28
+ entries: [
29
+ {
30
+ title: "Content",
31
+ description: "Manage collection entries",
32
+ href: "/cms",
33
+ icon: LayoutListIcon,
34
+ shortcut: "gc",
35
+ keywords: ["content", "entries", "collections"],
36
+ },
37
+ {
38
+ title: "Media",
39
+ description: "Upload and browse media files",
40
+ href: "/cms/media",
41
+ icon: ImageIcon,
42
+ shortcut: "gm",
43
+ keywords: ["media", "images", "files", "uploads"],
44
+ },
45
+ {
46
+ title: "Schema",
47
+ description: "Edit content schema and fields",
48
+ href: "/cms/settings/schema",
49
+ icon: Code2Icon,
50
+ shortcut: "gs",
51
+ keywords: ["schema", "fields", "types"],
52
+ },
53
+ {
54
+ title: "Team",
55
+ description: "Manage team members and invites",
56
+ href: "/cms/settings/team",
57
+ icon: UsersIcon,
58
+ shortcut: "gt",
59
+ keywords: ["team", "users", "members", "invites"],
60
+ },
61
+ {
62
+ title: "Audit Log",
63
+ description: "View content activity history",
64
+ href: "/cms/settings/audit",
65
+ icon: ActivityIcon,
66
+ keywords: ["audit", "log", "activity", "history"],
67
+ },
68
+ ],
69
+ },
70
+ ];
71
+ const CMS_KEY_SEQUENCES = {
72
+ gc: "/cms",
73
+ gm: "/cms/media",
74
+ gs: "/cms/settings/schema",
75
+ gt: "/cms/settings/team",
76
+ };
77
+ // ── Primary nav items ─────────────────────────────────────────────────────────
78
+ const NAV_ITEMS = [
79
+ {
80
+ href: "/cms",
81
+ label: "Content",
82
+ match: (p) => p === "/cms" || p.startsWith("/cms/collections"),
83
+ },
84
+ {
85
+ href: "/cms/media",
86
+ label: "Media",
87
+ match: (p) => p.startsWith("/cms/media"),
88
+ },
89
+ {
90
+ href: "/cms/settings/schema",
91
+ label: "Schema",
92
+ match: (p) => p.startsWith("/cms/settings/schema"),
93
+ },
94
+ {
95
+ href: "/cms/settings/team",
96
+ label: "Team",
97
+ match: (p) => p.startsWith("/cms/settings/team"),
98
+ },
99
+ {
100
+ href: "/cms/settings/audit",
101
+ label: "Audit",
102
+ match: (p) => p.startsWith("/cms/settings/audit"),
103
+ },
104
+ ];
105
+ export function CmsAdminHeader({ user, onLogout }) {
106
+ const pathname = usePathname();
107
+ const navUser = user
108
+ ? {
109
+ displayName: user.name ?? user.email.split("@")[0],
110
+ email: user.email,
111
+ }
112
+ : null;
113
+ return (_jsx(PageHeader, { segmentConfig: CMS_SEGMENT_CONFIG, skipSegments: ["cms"], logoSlot: _jsxs(Link, { href: "/cms", className: "text-sm flex items-center gap-2 font-semibold whitespace-nowrap", children: [_jsx(Image, { src: "https://aevr.online/favicon.ico", alt: "Airdraft", width: 24, height: 24, className: "rounded-full" }), "Airdraft"] }), searchSlot: _jsx(SearchCommand, { groups: CMS_SEARCH_GROUPS, keySequenceRoutes: CMS_KEY_SEQUENCES, triggerLabel: "Search...", storageKey: "cms:search:recent" }), userSlot: navUser && (_jsx(NavUser, { variant: "header", user: navUser, onLogout: onLogout })), options: {
114
+ showBreadcrumbs: true,
115
+ showThemeToggle: true,
116
+ showSearch: true,
117
+ } }));
118
+ }
119
+ //# sourceMappingURL=CmsAdminHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CmsAdminHeader.js","sourceRoot":"","sources":["../../src/components/CmsAdminHeader.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface ConfirmDialogProps {
2
+ /** The trigger element — or omit to control `open` externally. */
3
+ trigger?: React.ReactNode;
4
+ /** Controlled open state (use with `onOpenChange`). */
5
+ open?: boolean;
6
+ onOpenChange?: (open: boolean) => void;
7
+ title: string;
8
+ description: string;
9
+ /** Label for the confirm button. Default: "Confirm" */
10
+ confirmLabel?: string;
11
+ /** Label for the cancel button. Default: "Cancel" */
12
+ cancelLabel?: string;
13
+ /** Applies destructive (red) styling to the confirm button. Default: true */
14
+ destructive?: boolean;
15
+ onConfirm: () => void;
16
+ loading?: boolean;
17
+ }
18
+ export declare function ConfirmDialog({ trigger, open, onOpenChange, title, description, confirmLabel, cancelLabel, destructive, onConfirm, loading, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
19
+ //# sourceMappingURL=ConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,uDAAuD;IACvD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,WAAW,EACX,YAAwB,EACxB,WAAsB,EACtB,WAAkB,EAClB,SAAS,EACT,OAAO,GACR,EAAE,kBAAkB,2CAmCpB"}
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '../ui/alert-dialog.js';
4
+ import Loader from '../ui/aevr/loader.js';
5
+ export function ConfirmDialog({ trigger, open, onOpenChange, title, description, confirmLabel = 'Confirm', cancelLabel = 'Cancel', destructive = true, onConfirm, loading, }) {
6
+ const content = (_jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: title }), _jsx(AlertDialogDescription, { children: description })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: loading, children: cancelLabel }), _jsxs(AlertDialogAction, { onClick: onConfirm, disabled: loading, className: destructive ? 'bg-destructive text-destructive-foreground hover:bg-destructive/90' : undefined, children: [_jsx(Loader, { loading: loading, className: "size-3.5" }), loading ? 'Loading…' : confirmLabel] })] })] }));
7
+ if (trigger) {
8
+ return (_jsxs(AlertDialog, { open: open, onOpenChange: onOpenChange, children: [_jsx(AlertDialogTrigger, { asChild: true, children: trigger }), content] }));
9
+ }
10
+ return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: content }));
11
+ }
12
+ //# sourceMappingURL=ConfirmDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.js","sourceRoot":"","sources":["../../src/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,MAAM,MAAM,sBAAsB,CAAA;AAoBzC,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,WAAW,EACX,YAAY,GAAG,SAAS,EACxB,WAAW,GAAG,QAAQ,EACtB,WAAW,GAAG,IAAI,EAClB,SAAS,EACT,OAAO,GACY;IACnB,MAAM,OAAO,GAAG,CACd,MAAC,kBAAkB,eACjB,MAAC,iBAAiB,eAChB,KAAC,gBAAgB,cAAE,KAAK,GAAoB,EAC5C,KAAC,sBAAsB,cAAE,WAAW,GAA0B,IAC5C,EACpB,MAAC,iBAAiB,eAChB,KAAC,iBAAiB,IAAC,QAAQ,EAAE,OAAO,YAAG,WAAW,GAAqB,EACvE,MAAC,iBAAiB,IAChB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,oEAAoE,CAAC,CAAC,CAAC,SAAS,aAEzG,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,UAAU,GAAG,EAChD,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,IAClB,IACF,IACD,CACtB,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,MAAC,WAAW,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,aACjD,KAAC,kBAAkB,IAAC,OAAO,kBAAE,OAAO,GAAsB,EACzD,OAAO,IACI,CACf,CAAA;IACH,CAAC;IAED,OAAO,CACL,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,YAChD,OAAO,GACI,CACf,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface EmptyStateProps {
2
+ icon?: React.ReactNode;
3
+ title: string;
4
+ description?: string;
5
+ action?: React.ReactNode;
6
+ className?: string;
7
+ }
8
+ export declare function EmptyState({ icon, title, description, action, className }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,eAAe,2CAW1F"}
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from '../lib/utils.js';
4
+ export function EmptyState({ icon, title, description, action, className }) {
5
+ return (_jsxs("div", { className: cn('flex flex-col items-center justify-center gap-3 py-16 text-center', className), children: [icon && _jsx("div", { className: "text-muted-foreground/50", children: icon }), _jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-sm font-medium", children: title }), description && _jsx("p", { className: "text-xs text-muted-foreground", children: description })] }), action] }));
6
+ }
7
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAUpC,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAmB;IACzF,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,mEAAmE,EAAE,SAAS,CAAC,aAC/F,IAAI,IAAI,cAAK,SAAS,EAAC,0BAA0B,YAAE,IAAI,GAAO,EAC/D,eAAK,SAAS,EAAC,WAAW,aACxB,YAAG,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAK,EAC7C,WAAW,IAAI,YAAG,SAAS,EAAC,+BAA+B,YAAE,WAAW,GAAK,IAC1E,EACL,MAAM,IACH,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Entry } from '@airdraft/core';
2
+ export interface EntryRowProps {
3
+ entry: Entry;
4
+ /** Field name used as the display title. Defaults to 'title'. */
5
+ titleField?: string;
6
+ hasPublish?: boolean;
7
+ onEdit?: (entry: Entry) => void;
8
+ onDelete?: (entry: Entry) => void;
9
+ deleting?: boolean;
10
+ }
11
+ export declare function EntryRow({ entry, titleField, hasPublish, onEdit, onDelete, deleting }: EntryRowProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=EntryRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntryRow.d.ts","sourceRoot":"","sources":["../../src/components/EntryRow.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAO3C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAA;IACZ,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAC/B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAmD9G"}
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { TableCell, TableRow } from '../ui/table.js';
5
+ import { Button } from '../ui/button.js';
6
+ import { StatusBadge } from './StatusBadge.js';
7
+ import { ConfirmDialog } from './ConfirmDialog.js';
8
+ import { Pencil, Trash2 } from 'lucide-react';
9
+ export function EntryRow({ entry, titleField = 'title', hasPublish, onEdit, onDelete, deleting }) {
10
+ const [confirmOpen, setConfirmOpen] = useState(false);
11
+ const title = entry.data?.[titleField] ?? entry.slug;
12
+ const published = Boolean(entry.data?.['published']);
13
+ const publishedAt = entry.data?.['publishedAt'];
14
+ const dateStr = undefined;
15
+ return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: title }), _jsx(TableCell, { className: "text-muted-foreground text-xs", children: entry.slug }), hasPublish && (_jsx(TableCell, { children: _jsx(StatusBadge, { published: published, publishedAt: publishedAt }) })), dateStr && (_jsx(TableCell, { className: "text-muted-foreground text-xs", children: dateStr })), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [onEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7", onClick: () => onEdit(entry), children: _jsx(Pencil, { className: "h-3.5 w-3.5" }) })), onDelete && (_jsx(ConfirmDialog, { trigger: _jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7 text-destructive hover:text-destructive", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }), open: confirmOpen, onOpenChange: setConfirmOpen, title: "Delete entry", description: `Delete "${title}"? This cannot be undone.`, confirmLabel: "Delete", loading: deleting, onConfirm: () => {
16
+ onDelete(entry);
17
+ setConfirmOpen(false);
18
+ } }))] }) })] }));
19
+ }
20
+ //# sourceMappingURL=EntryRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntryRow.js","sourceRoot":"","sources":["../../src/components/EntryRow.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAY7C,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IAC7G,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAErD,MAAM,KAAK,GAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAwB,IAAI,KAAK,CAAC,IAAI,CAAA;IAC5E,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IACpD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,aAAa,CAA8B,CAAA;IAE5E,MAAM,OAAO,GAAG,SAAS,CAAA;IAEzB,OAAO,CACL,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,YAAE,KAAK,GAAa,EACtD,KAAC,SAAS,IAAC,SAAS,EAAC,+BAA+B,YAAE,KAAK,CAAC,IAAI,GAAa,EAC5E,UAAU,IAAI,CACb,KAAC,SAAS,cACR,KAAC,WAAW,IAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAI,GACrD,CACb,EACA,OAAO,IAAI,CACV,KAAC,SAAS,IAAC,SAAS,EAAC,+BAA+B,YAAE,OAAO,GAAa,CAC3E,EACD,KAAC,SAAS,IAAC,SAAS,EAAC,YAAY,YAC/B,eAAK,SAAS,EAAC,wBAAwB,aACpC,MAAM,IAAI,CACT,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,YAClF,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,GAAG,GAC3B,CACV,EACA,QAAQ,IAAI,CACX,KAAC,aAAa,IACZ,OAAO,EACL,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,iDAAiD,YAC7F,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,GAAG,GAC3B,EAEX,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,cAAc,EAC5B,KAAK,EAAC,cAAc,EACpB,WAAW,EAAE,WAAW,KAAK,2BAA2B,EACxD,YAAY,EAAC,QAAQ,EACrB,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,GAAG,EAAE;gCACd,QAAQ,CAAC,KAAK,CAAC,CAAA;gCACf,cAAc,CAAC,KAAK,CAAC,CAAA;4BACvB,CAAC,GACD,CACH,IACG,GACI,IACH,CACZ,CAAA;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ type ErrorLike = Error | {
2
+ message: string;
3
+ code?: string;
4
+ } | string;
5
+ export interface ErrorAlertProps {
6
+ /** The error to display. Accepts an Error, an object with `message`/`code`, or a plain string. */
7
+ error: ErrorLike;
8
+ /** Heading shown above the message. Defaults to "Something went wrong". */
9
+ title?: string;
10
+ /** Callback for a "Retry" button. Omit to hide the button. */
11
+ onRetry?: () => void;
12
+ /** Render a compact single-line variant (no border/background). Use inside forms. */
13
+ compact?: boolean;
14
+ className?: string;
15
+ }
16
+ /**
17
+ * System-wide error display built on the shadcn `Alert` primitive.
18
+ *
19
+ * - **Default**: full `Alert` with icon, title, description, and optional retry button.
20
+ * - **Compact** (`compact`): inline single-line text with icon — use inside forms.
21
+ *
22
+ * @example
23
+ * // Page-level load failure
24
+ * <ErrorAlert error={error} title="Failed to load entries" onRetry={refresh} />
25
+ *
26
+ * @example
27
+ * // Inline form validation error
28
+ * <ErrorAlert error={mutError} compact />
29
+ */
30
+ export declare function ErrorAlert({ error, title, onRetry, compact, className }: ErrorAlertProps): import("react/jsx-runtime").JSX.Element;
31
+ export {};
32
+ //# sourceMappingURL=ErrorAlert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorAlert.d.ts","sourceRoot":"","sources":["../../src/components/ErrorAlert.tsx"],"names":[],"mappings":"AAWA,KAAK,SAAS,GAAG,KAAK,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAA;AAEpE,MAAM,WAAW,eAAe;IAC9B,kGAAkG;IAClG,KAAK,EAAE,SAAS,CAAA;IAChB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAA8B,EAAE,OAAO,EAAE,OAAe,EAAE,SAAS,EAAE,EAAE,eAAe,2CAgDzH"}
@@ -0,0 +1,40 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { AlertCircle, RefreshCw } from 'lucide-react';
4
+ import { Alert, AlertTitle, AlertDescription, AlertAction } from '../ui/alert.js';
5
+ import { Button } from '../ui/button.js';
6
+ import { cn } from '../lib/utils.js';
7
+ // ---------------------------------------------------------------------------
8
+ // Helpers
9
+ // ---------------------------------------------------------------------------
10
+ function toErrorParts(error) {
11
+ if (typeof error === 'string')
12
+ return { message: error };
13
+ const e = error;
14
+ return { message: e.message, code: e.code };
15
+ }
16
+ // ---------------------------------------------------------------------------
17
+ // ErrorAlert
18
+ // ---------------------------------------------------------------------------
19
+ /**
20
+ * System-wide error display built on the shadcn `Alert` primitive.
21
+ *
22
+ * - **Default**: full `Alert` with icon, title, description, and optional retry button.
23
+ * - **Compact** (`compact`): inline single-line text with icon — use inside forms.
24
+ *
25
+ * @example
26
+ * // Page-level load failure
27
+ * <ErrorAlert error={error} title="Failed to load entries" onRetry={refresh} />
28
+ *
29
+ * @example
30
+ * // Inline form validation error
31
+ * <ErrorAlert error={mutError} compact />
32
+ */
33
+ export function ErrorAlert({ error, title = 'Something went wrong', onRetry, compact = false, className }) {
34
+ const { message, code } = toErrorParts(error);
35
+ if (compact) {
36
+ return (_jsxs("p", { className: cn('flex items-start gap-1.5 text-xs text-destructive', className), children: [_jsx(AlertCircle, { className: "mt-px h-3.5 w-3.5 shrink-0" }), _jsxs("span", { children: [code && _jsxs("code", { className: "font-mono mr-1", children: ["[", code, "]"] }), message, onRetry && (_jsx("button", { type: "button", onClick: onRetry, className: "ml-2 underline hover:no-underline", children: "Retry" }))] })] }));
37
+ }
38
+ return (_jsxs(Alert, { variant: "destructive", className: className, children: [_jsx(AlertCircle, {}), _jsx(AlertTitle, { children: title }), _jsxs(AlertDescription, { children: [code && _jsxs("code", { className: "font-mono text-xs mr-1.5", children: ["[", code, "]"] }), message] }), onRetry && (_jsx(AlertAction, { children: _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: onRetry, className: "h-6 gap-1.5 px-2 text-xs", children: [_jsx(RefreshCw, { className: "h-3 w-3" }), "Retry"] }) }))] }));
39
+ }
40
+ //# sourceMappingURL=ErrorAlert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorAlert.js","sourceRoot":"","sources":["../../src/components/ErrorAlert.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAoBpC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,YAAY,CAAC,KAAgB;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACxD,MAAM,CAAC,GAAG,KAA2C,CAAA;IACrD,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AAC7C,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,EAAmB;IACxH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAE7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,aAAG,SAAS,EAAE,EAAE,CAAC,mDAAmD,EAAE,SAAS,CAAC,aAC9E,KAAC,WAAW,IAAC,SAAS,EAAC,4BAA4B,GAAG,EACtD,2BACG,IAAI,IAAI,gBAAM,SAAS,EAAC,gBAAgB,kBAAG,IAAI,SAAS,EACxD,OAAO,EACP,OAAO,IAAI,CACV,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,mCAAmC,sBAGtC,CACV,IACI,IACL,CACL,CAAA;IACH,CAAC;IAED,OAAO,CACL,MAAC,KAAK,IAAC,OAAO,EAAC,aAAa,EAAC,SAAS,EAAE,SAAS,aAC/C,KAAC,WAAW,KAAG,EACf,KAAC,UAAU,cAAE,KAAK,GAAc,EAChC,MAAC,gBAAgB,eACd,IAAI,IAAI,gBAAM,SAAS,EAAC,0BAA0B,kBAAG,IAAI,SAAS,EAClE,OAAO,IACS,EAClB,OAAO,IAAI,CACV,KAAC,WAAW,cACV,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,0BAA0B,aAEpC,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,aAE1B,GACG,CACf,IACK,CACT,CAAA;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type CmsRole } from './RoleBadge.js';
2
+ export interface CmsInvite {
3
+ token: string;
4
+ email: string;
5
+ role: CmsRole;
6
+ expiresAt: number;
7
+ inviteUrl?: string;
8
+ }
9
+ export interface InviteRowProps {
10
+ invite: CmsInvite;
11
+ /** Base URL used to build the invite link when `invite.inviteUrl` is absent. */
12
+ inviteBasePath?: string;
13
+ canManage?: boolean;
14
+ onRevoke?: (token: string) => void;
15
+ revoking?: boolean;
16
+ }
17
+ export declare function InviteRow({ invite, inviteBasePath, canManage, onRevoke, revoking }: InviteRowProps): import("react/jsx-runtime").JSX.Element;
18
+ //# sourceMappingURL=InviteRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InviteRow.d.ts","sourceRoot":"","sources":["../../src/components/InviteRow.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAIxD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAA;IACjB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA2ElG"}
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { TableCell, TableRow } from '../ui/table.js';
5
+ import { Button } from '../ui/button.js';
6
+ import { RoleBadge } from './RoleBadge.js';
7
+ import { ConfirmDialog } from './ConfirmDialog.js';
8
+ import { Copy, Check, XCircle, Clock } from 'lucide-react';
9
+ export function InviteRow({ invite, inviteBasePath, canManage, onRevoke, revoking }) {
10
+ const [confirmOpen, setConfirmOpen] = useState(false);
11
+ const [copied, setCopied] = useState(false);
12
+ const inviteUrl = invite.inviteUrl ??
13
+ (inviteBasePath ? `${inviteBasePath}/auth/invite/${invite.token}` : null);
14
+ const expiresIn = invite.expiresAt - Math.floor(Date.now() / 1000);
15
+ const hoursLeft = Math.max(0, Math.round(expiresIn / 3600));
16
+ async function copyLink() {
17
+ if (!inviteUrl)
18
+ return;
19
+ await navigator.clipboard.writeText(inviteUrl);
20
+ setCopied(true);
21
+ setTimeout(() => setCopied(false), 2000);
22
+ }
23
+ return (_jsxs(TableRow, { className: "text-muted-foreground", children: [_jsx(TableCell, { children: _jsx("p", { className: "text-sm", children: invite.email }) }), _jsx(TableCell, { children: _jsx(RoleBadge, { role: invite.role }) }), _jsx(TableCell, { className: "text-xs", children: _jsxs("span", { className: "flex items-center gap-1", children: [_jsx(Clock, { className: "h-3 w-3" }), hoursLeft > 0 ? `${hoursLeft}h left` : 'Expired'] }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1", children: [inviteUrl && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7", title: "Copy invite link", onClick: copyLink, children: copied ? _jsx(Check, { className: "h-3.5 w-3.5 text-emerald-600" }) : _jsx(Copy, { className: "h-3.5 w-3.5" }) })), canManage && onRevoke && (_jsx(ConfirmDialog, { trigger: _jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7 hover:text-destructive", children: _jsx(XCircle, { className: "h-3.5 w-3.5" }) }), open: confirmOpen, onOpenChange: setConfirmOpen, title: "Revoke invite", description: `Revoke the invite for ${invite.email}?`, confirmLabel: "Revoke", loading: revoking, onConfirm: () => {
24
+ onRevoke(invite.token);
25
+ setConfirmOpen(false);
26
+ } }))] }) })] }));
27
+ }
28
+ //# sourceMappingURL=InviteRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InviteRow.js","sourceRoot":"","sources":["../../src/components/InviteRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { MediaItem } from '@airdraft/core';
2
+ export interface MediaCardProps {
3
+ item: MediaItem;
4
+ onDelete?: (item: MediaItem) => void;
5
+ onSelect?: (item: MediaItem) => void;
6
+ deleting?: boolean;
7
+ selected?: boolean;
8
+ }
9
+ export declare function MediaCard({ item, onDelete, onSelect, deleting, selected }: MediaCardProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=MediaCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaCard.d.ts","sourceRoot":"","sources":["../../src/components/MediaCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAO/C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAQD,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAmFzF"}
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { Button } from '../ui/button.js';
5
+ import { Item } from '../ui/item.js';
6
+ import { ConfirmDialog } from './ConfirmDialog.js';
7
+ import { Trash2, File, ExternalLink } from 'lucide-react';
8
+ import { cn } from '../lib/utils.js';
9
+ function humanBytes(bytes) {
10
+ if (bytes < 1024)
11
+ return `${bytes} B`;
12
+ if (bytes < 1024 * 1024)
13
+ return `${(bytes / 1024).toFixed(1)} KB`;
14
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
15
+ }
16
+ export function MediaCard({ item, onDelete, onSelect, deleting, selected }) {
17
+ const [confirmOpen, setConfirmOpen] = useState(false);
18
+ // Detect images via mimeType, falling back to file extension for items
19
+ // uploaded before MIME type was recorded in the sidecar.
20
+ const isImage = item.mimeType?.startsWith('image/') ||
21
+ /\.(jpe?g|png|webp|gif|svg|avif)$/i.test(item.name ?? item.key ?? '');
22
+ return (_jsxs(Item, { variant: "outline", className: cn('flex-col gap-0 p-0 overflow-hidden', selected && 'ring-2 ring-primary', onSelect && 'cursor-pointer'), onClick: () => onSelect?.(item), children: [_jsxs("div", { className: "relative w-full aspect-square flex-shrink-0 overflow-hidden border-b bg-muted", children: [isImage ? (
23
+ // eslint-disable-next-line @next/next/no-img-element
24
+ _jsx("img", { src: item.url, alt: item.alt ?? item.name, className: "w-full h-full object-cover" })) : (_jsx("div", { className: "flex h-full w-full items-center justify-center", children: _jsx(File, { className: "h-10 w-10 text-muted-foreground" }) })), _jsxs("div", { className: "absolute top-1 right-1 flex gap-1 opacity-0 group-hover/item:opacity-100 transition-opacity", children: [_jsx(Button, { variant: "secondary", size: "icon", asChild: true, onClick: (e) => e.stopPropagation(), children: _jsx("a", { href: item.url, target: "_blank", rel: "noopener noreferrer", children: _jsx(ExternalLink, { className: "size-4" }) }) }), onDelete && (_jsx(ConfirmDialog, { trigger: _jsx(Button, { variant: "secondary", size: "icon", className: "text-destructive hover:text-destructive", onClick: (e) => e.stopPropagation(), children: _jsx(Trash2, { className: "size-4" }) }), open: confirmOpen, onOpenChange: setConfirmOpen, title: "Delete media", description: `Delete "${item.name}"? This cannot be undone.`, confirmLabel: "Delete", loading: deleting, onConfirm: () => {
25
+ onDelete(item);
26
+ setConfirmOpen(false);
27
+ } }))] })] }), _jsxs("div", { className: "flex flex-col gap-0.5 px-2.5 py-2 min-w-0 w-full", children: [_jsx("p", { className: "text-xs font-medium truncate", title: item.name, children: item.name }), item.size != null && (_jsx("p", { className: "text-xs text-muted-foreground", children: humanBytes(item.size) }))] })] }));
28
+ }
29
+ //# sourceMappingURL=MediaCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaCard.js","sourceRoot":"","sources":["../../src/components/MediaCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type CmsRole } from './RoleBadge.js';
2
+ export interface CmsUser {
3
+ id: string;
4
+ email: string;
5
+ name?: string;
6
+ role: CmsRole;
7
+ createdAt: number;
8
+ }
9
+ export interface MemberRowProps {
10
+ user: CmsUser;
11
+ /** Email of the currently logged-in user — disables self-removal. */
12
+ currentUserEmail?: string;
13
+ canManage?: boolean;
14
+ onRoleChange?: (userId: string, role: CmsRole) => void;
15
+ onRemove?: (userId: string) => void;
16
+ removing?: boolean;
17
+ }
18
+ export declare function MemberRow({ user, currentUserEmail, canManage, onRoleChange, onRemove, removing, }: MemberRowProps): import("react/jsx-runtime").JSX.Element;
19
+ //# sourceMappingURL=MemberRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemberRow.d.ts","sourceRoot":"","sources":["../../src/components/MemberRow.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAIxD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,EAAE,cAAc,2CAsEhB"}