@revealui/core 0.0.1-pre.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/LICENSE +22 -202
  2. package/README.md +108 -152
  3. package/dist/api/compression.d.ts +83 -0
  4. package/dist/api/compression.d.ts.map +1 -0
  5. package/dist/api/compression.js +233 -0
  6. package/dist/api/payload-optimization.d.ts +138 -0
  7. package/dist/api/payload-optimization.d.ts.map +1 -0
  8. package/dist/api/payload-optimization.js +320 -0
  9. package/dist/api/rate-limit.d.ts +113 -0
  10. package/dist/api/rate-limit.d.ts.map +1 -0
  11. package/dist/api/rate-limit.js +316 -0
  12. package/dist/api/response-cache.d.ts +125 -0
  13. package/dist/api/response-cache.d.ts.map +1 -0
  14. package/dist/api/response-cache.js +335 -0
  15. package/dist/api/rest.d.ts +54 -0
  16. package/dist/api/rest.d.ts.map +1 -0
  17. package/dist/api/rest.js +464 -0
  18. package/dist/auth/access.d.ts +25 -0
  19. package/dist/auth/access.d.ts.map +1 -0
  20. package/dist/auth/access.js +20 -0
  21. package/dist/auth/index.d.ts +2 -0
  22. package/dist/auth/index.d.ts.map +1 -0
  23. package/dist/auth/index.js +2 -0
  24. package/dist/cache/query-cache.d.ts +98 -0
  25. package/dist/cache/query-cache.d.ts.map +1 -0
  26. package/dist/cache/query-cache.js +260 -0
  27. package/dist/caching/app-cache.d.ts +237 -0
  28. package/dist/caching/app-cache.d.ts.map +1 -0
  29. package/dist/caching/app-cache.js +430 -0
  30. package/dist/caching/cdn-config.d.ts +155 -0
  31. package/dist/caching/cdn-config.d.ts.map +1 -0
  32. package/dist/caching/cdn-config.js +411 -0
  33. package/dist/caching/edge-cache.d.ts +177 -0
  34. package/dist/caching/edge-cache.d.ts.map +1 -0
  35. package/dist/caching/edge-cache.js +385 -0
  36. package/dist/caching/service-worker.d.ts +154 -0
  37. package/dist/caching/service-worker.d.ts.map +1 -0
  38. package/dist/caching/service-worker.js +437 -0
  39. package/dist/client/admin/RichText.d.ts +12 -0
  40. package/dist/client/admin/RichText.d.ts.map +1 -0
  41. package/dist/client/admin/RichText.js +5 -0
  42. package/dist/client/admin/components/AdminDashboard.d.ts +7 -0
  43. package/dist/client/admin/components/AdminDashboard.d.ts.map +1 -0
  44. package/dist/client/admin/components/AdminDashboard.js +318 -0
  45. package/dist/client/admin/components/CollectionList.d.ts +16 -0
  46. package/dist/client/admin/components/CollectionList.d.ts.map +1 -0
  47. package/dist/client/admin/components/CollectionList.js +67 -0
  48. package/dist/client/admin/components/DocumentForm.d.ts +11 -0
  49. package/dist/client/admin/components/DocumentForm.d.ts.map +1 -0
  50. package/dist/client/admin/components/DocumentForm.js +99 -0
  51. package/dist/client/admin/components/GlobalForm.d.ts +11 -0
  52. package/dist/client/admin/components/GlobalForm.d.ts.map +1 -0
  53. package/dist/client/admin/components/GlobalForm.js +74 -0
  54. package/dist/client/admin/i18n/en.d.ts +25 -0
  55. package/dist/client/admin/i18n/en.d.ts.map +1 -0
  56. package/dist/client/admin/i18n/en.js +25 -0
  57. package/dist/client/admin/index.d.ts +10 -0
  58. package/dist/client/admin/index.d.ts.map +1 -0
  59. package/dist/client/admin/index.js +10 -0
  60. package/dist/client/admin/layout.d.ts +10 -0
  61. package/dist/client/admin/layout.d.ts.map +1 -0
  62. package/dist/client/admin/layout.js +6 -0
  63. package/dist/client/admin/page.d.ts +38 -0
  64. package/dist/client/admin/page.d.ts.map +1 -0
  65. package/dist/client/admin/page.js +15 -0
  66. package/dist/client/admin/utils/apiClient.d.ts +110 -0
  67. package/dist/client/admin/utils/apiClient.d.ts.map +1 -0
  68. package/dist/client/admin/utils/apiClient.js +220 -0
  69. package/dist/client/admin/utils/auth.d.ts +23 -0
  70. package/dist/client/admin/utils/auth.d.ts.map +1 -0
  71. package/dist/client/admin/utils/auth.js +52 -0
  72. package/dist/client/admin/utils/index.d.ts +6 -0
  73. package/dist/client/admin/utils/index.d.ts.map +1 -0
  74. package/dist/client/admin/utils/index.js +5 -0
  75. package/dist/client/admin/utils/serializeConfig.d.ts +7 -0
  76. package/dist/client/admin/utils/serializeConfig.d.ts.map +1 -0
  77. package/dist/client/admin/utils/serializeConfig.js +35 -0
  78. package/dist/client/hooks.d.ts +18 -0
  79. package/dist/client/hooks.d.ts.map +1 -0
  80. package/dist/client/hooks.js +29 -0
  81. package/dist/client/http/client.d.ts +15 -0
  82. package/dist/client/http/client.d.ts.map +1 -0
  83. package/dist/client/http/client.js +49 -0
  84. package/dist/client/http/fetchBanner.d.ts +18 -0
  85. package/dist/client/http/fetchBanner.d.ts.map +1 -0
  86. package/dist/client/http/fetchBanner.js +44 -0
  87. package/dist/client/http/fetchCard.d.ts +18 -0
  88. package/dist/client/http/fetchCard.d.ts.map +1 -0
  89. package/dist/client/http/fetchCard.js +46 -0
  90. package/dist/client/http/fetchEvents.d.ts +18 -0
  91. package/dist/client/http/fetchEvents.d.ts.map +1 -0
  92. package/dist/client/http/fetchEvents.js +44 -0
  93. package/dist/client/http/fetchHero.d.ts +17 -0
  94. package/dist/client/http/fetchHero.d.ts.map +1 -0
  95. package/dist/client/http/fetchHero.js +55 -0
  96. package/dist/client/http/fetchMainInfos.d.ts +17 -0
  97. package/dist/client/http/fetchMainInfos.d.ts.map +1 -0
  98. package/dist/client/http/fetchMainInfos.js +44 -0
  99. package/dist/client/http/fetchVideos.d.ts +13 -0
  100. package/dist/client/http/fetchVideos.d.ts.map +1 -0
  101. package/dist/client/http/fetchVideos.js +36 -0
  102. package/dist/client/http/index.d.ts +19 -0
  103. package/dist/client/http/index.d.ts.map +1 -0
  104. package/dist/client/http/index.js +11 -0
  105. package/dist/client/index.d.ts +11 -0
  106. package/dist/client/index.d.ts.map +1 -0
  107. package/dist/client/index.js +13 -0
  108. package/dist/client/richtext/RichTextEditor.d.ts +48 -0
  109. package/dist/client/richtext/RichTextEditor.d.ts.map +1 -0
  110. package/dist/client/richtext/RichTextEditor.js +360 -0
  111. package/dist/client/richtext/components/ImageNodeComponent.d.ts +9 -0
  112. package/dist/client/richtext/components/ImageNodeComponent.d.ts.map +1 -0
  113. package/dist/client/richtext/components/ImageNodeComponent.js +99 -0
  114. package/dist/client/richtext/components/ImageUploadButton.d.ts +11 -0
  115. package/dist/client/richtext/components/ImageUploadButton.d.ts.map +1 -0
  116. package/dist/client/richtext/components/ImageUploadButton.js +103 -0
  117. package/dist/client/richtext/index.d.ts +92 -0
  118. package/dist/client/richtext/index.d.ts.map +1 -0
  119. package/dist/client/richtext/index.js +74 -0
  120. package/dist/client/richtext/nodes/DecoratorBlockNode.d.ts +20 -0
  121. package/dist/client/richtext/nodes/DecoratorBlockNode.d.ts.map +1 -0
  122. package/dist/client/richtext/nodes/DecoratorBlockNode.js +29 -0
  123. package/dist/client/richtext/nodes/ImageNode.d.ts +51 -0
  124. package/dist/client/richtext/nodes/ImageNode.d.ts.map +1 -0
  125. package/dist/client/richtext/nodes/ImageNode.js +95 -0
  126. package/dist/client/richtext/plugins/CollaborationPlugin.d.ts +13 -0
  127. package/dist/client/richtext/plugins/CollaborationPlugin.d.ts.map +1 -0
  128. package/dist/client/richtext/plugins/CollaborationPlugin.js +8 -0
  129. package/dist/client/richtext/plugins/CursorsOverlayPlugin.d.ts +4 -0
  130. package/dist/client/richtext/plugins/CursorsOverlayPlugin.d.ts.map +1 -0
  131. package/dist/client/richtext/plugins/CursorsOverlayPlugin.js +50 -0
  132. package/dist/client/richtext/plugins/FloatingToolbarPlugin.d.ts +7 -0
  133. package/dist/client/richtext/plugins/FloatingToolbarPlugin.d.ts.map +1 -0
  134. package/dist/client/richtext/plugins/FloatingToolbarPlugin.js +248 -0
  135. package/dist/client/richtext/plugins/ImagePlugin.d.ts +3 -0
  136. package/dist/client/richtext/plugins/ImagePlugin.d.ts.map +1 -0
  137. package/dist/client/richtext/plugins/ImagePlugin.js +73 -0
  138. package/dist/client/richtext/plugins/PastePlugin.d.ts +2 -0
  139. package/dist/client/richtext/plugins/PastePlugin.d.ts.map +1 -0
  140. package/dist/client/richtext/plugins/PastePlugin.js +36 -0
  141. package/dist/client/richtext/plugins/ToolbarPlugin.d.ts +8 -0
  142. package/dist/client/richtext/plugins/ToolbarPlugin.d.ts.map +1 -0
  143. package/dist/client/richtext/plugins/ToolbarPlugin.js +204 -0
  144. package/dist/client/ui/index.d.ts +111 -0
  145. package/dist/client/ui/index.d.ts.map +1 -0
  146. package/dist/client/ui/index.js +130 -0
  147. package/dist/collections/CollectionOperations.d.ts +27 -0
  148. package/dist/collections/CollectionOperations.d.ts.map +1 -0
  149. package/dist/collections/CollectionOperations.js +34 -0
  150. package/dist/collections/hooks.d.ts +11 -0
  151. package/dist/collections/hooks.d.ts.map +1 -0
  152. package/dist/collections/hooks.js +35 -0
  153. package/dist/collections/index.d.ts +2 -0
  154. package/dist/collections/index.d.ts.map +1 -0
  155. package/dist/collections/index.js +1 -0
  156. package/dist/collections/operations/create.d.ts +10 -0
  157. package/dist/collections/operations/create.d.ts.map +1 -0
  158. package/dist/collections/operations/create.js +101 -0
  159. package/dist/collections/operations/delete.d.ts +10 -0
  160. package/dist/collections/operations/delete.d.ts.map +1 -0
  161. package/dist/collections/operations/delete.js +16 -0
  162. package/dist/collections/operations/fieldHooks.d.ts +21 -0
  163. package/dist/collections/operations/fieldHooks.d.ts.map +1 -0
  164. package/dist/collections/operations/fieldHooks.js +51 -0
  165. package/dist/collections/operations/find.d.ts +10 -0
  166. package/dist/collections/operations/find.d.ts.map +1 -0
  167. package/dist/collections/operations/find.js +124 -0
  168. package/dist/collections/operations/findById.d.ts +15 -0
  169. package/dist/collections/operations/findById.d.ts.map +1 -0
  170. package/dist/collections/operations/findById.js +59 -0
  171. package/dist/collections/operations/update.d.ts +10 -0
  172. package/dist/collections/operations/update.d.ts.map +1 -0
  173. package/dist/collections/operations/update.js +134 -0
  174. package/dist/config/index.d.ts +9 -0
  175. package/dist/config/index.d.ts.map +1 -0
  176. package/dist/config/index.js +61 -0
  177. package/dist/config/runtime.d.ts +22 -0
  178. package/dist/config/runtime.d.ts.map +1 -0
  179. package/dist/config/runtime.js +32 -0
  180. package/dist/config/utils.d.ts +12 -0
  181. package/dist/config/utils.d.ts.map +1 -0
  182. package/dist/config/utils.js +34 -0
  183. package/dist/database/index.d.ts +1 -0
  184. package/dist/database/index.d.ts.map +1 -0
  185. package/dist/database/index.js +6 -0
  186. package/dist/database/safe-parse.d.ts +26 -0
  187. package/dist/database/safe-parse.d.ts.map +1 -0
  188. package/dist/database/safe-parse.js +42 -0
  189. package/dist/database/ssl-config.d.ts +9 -0
  190. package/dist/database/ssl-config.d.ts.map +1 -0
  191. package/dist/database/ssl-config.js +7 -0
  192. package/dist/database/type-adapter.d.ts +113 -0
  193. package/dist/database/type-adapter.d.ts.map +1 -0
  194. package/dist/database/type-adapter.js +97 -0
  195. package/dist/database/universal-postgres.d.ts +45 -0
  196. package/dist/database/universal-postgres.d.ts.map +1 -0
  197. package/dist/database/universal-postgres.js +526 -0
  198. package/dist/dataloader.d.ts +26 -0
  199. package/dist/dataloader.d.ts.map +1 -0
  200. package/dist/dataloader.js +176 -0
  201. package/dist/error-handling/circuit-breaker.d.ts +262 -0
  202. package/dist/error-handling/circuit-breaker.d.ts.map +1 -0
  203. package/dist/error-handling/circuit-breaker.js +542 -0
  204. package/dist/error-handling/error-boundary.d.ts +94 -0
  205. package/dist/error-handling/error-boundary.d.ts.map +1 -0
  206. package/dist/error-handling/error-boundary.js +285 -0
  207. package/dist/error-handling/error-reporter.d.ts +214 -0
  208. package/dist/error-handling/error-reporter.d.ts.map +1 -0
  209. package/dist/error-handling/error-reporter.js +477 -0
  210. package/dist/error-handling/fallback-components.d.ts +131 -0
  211. package/dist/error-handling/fallback-components.d.ts.map +1 -0
  212. package/dist/error-handling/fallback-components.js +371 -0
  213. package/dist/error-handling/index.d.ts +16 -0
  214. package/dist/error-handling/index.d.ts.map +1 -0
  215. package/dist/error-handling/index.js +15 -0
  216. package/dist/error-handling/retry.d.ts +194 -0
  217. package/dist/error-handling/retry.d.ts.map +1 -0
  218. package/dist/error-handling/retry.js +450 -0
  219. package/dist/errors/index.d.ts +23 -0
  220. package/dist/errors/index.d.ts.map +1 -0
  221. package/dist/errors/index.js +40 -0
  222. package/dist/factories/builders.d.ts +50 -0
  223. package/dist/factories/builders.d.ts.map +1 -0
  224. package/dist/factories/builders.js +77 -0
  225. package/dist/factories/index.d.ts +2 -0
  226. package/dist/factories/index.d.ts.map +1 -0
  227. package/dist/factories/index.js +1 -0
  228. package/dist/features.d.ts +86 -0
  229. package/dist/features.d.ts.map +1 -0
  230. package/dist/features.js +92 -0
  231. package/dist/fieldTraversal.d.ts +26 -0
  232. package/dist/fieldTraversal.d.ts.map +1 -0
  233. package/dist/fieldTraversal.js +132 -0
  234. package/dist/fields/config/types.d.ts +48 -0
  235. package/dist/fields/config/types.d.ts.map +1 -0
  236. package/dist/fields/config/types.js +20 -0
  237. package/dist/fields/getDefaultValue.d.ts +16 -0
  238. package/dist/fields/getDefaultValue.d.ts.map +1 -0
  239. package/dist/fields/getDefaultValue.js +20 -0
  240. package/dist/fields/getFieldPaths.d.ts +25 -0
  241. package/dist/fields/getFieldPaths.d.ts.map +1 -0
  242. package/dist/fields/getFieldPaths.js +23 -0
  243. package/dist/fields/hooks/afterRead/index.d.ts +36 -0
  244. package/dist/fields/hooks/afterRead/index.d.ts.map +1 -0
  245. package/dist/fields/hooks/afterRead/index.js +70 -0
  246. package/dist/fields/hooks/afterRead/promise.d.ts +46 -0
  247. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -0
  248. package/dist/fields/hooks/afterRead/promise.js +178 -0
  249. package/dist/fields/hooks/afterRead/traverseFields.d.ts +44 -0
  250. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -0
  251. package/dist/fields/hooks/afterRead/traverseFields.js +37 -0
  252. package/dist/generated/agents/index.d.ts +8 -0
  253. package/dist/generated/agents/index.d.ts.map +1 -0
  254. package/dist/generated/agents/index.js +7 -0
  255. package/dist/generated/components/index.d.ts +8 -0
  256. package/dist/generated/components/index.d.ts.map +1 -0
  257. package/dist/generated/components/index.js +7 -0
  258. package/dist/generated/functions/index.d.ts +8 -0
  259. package/dist/generated/functions/index.d.ts.map +1 -0
  260. package/dist/generated/functions/index.js +7 -0
  261. package/dist/generated/hooks/index.d.ts +8 -0
  262. package/dist/generated/hooks/index.d.ts.map +1 -0
  263. package/dist/generated/hooks/index.js +7 -0
  264. package/dist/generated/index.d.ts +10 -0
  265. package/dist/generated/index.d.ts.map +1 -0
  266. package/dist/generated/index.js +9 -0
  267. package/dist/generated/plans/index.d.ts +8 -0
  268. package/dist/generated/plans/index.d.ts.map +1 -0
  269. package/dist/generated/plans/index.js +7 -0
  270. package/dist/generated/prompts/index.d.ts +8 -0
  271. package/dist/generated/prompts/index.d.ts.map +1 -0
  272. package/dist/generated/prompts/index.js +7 -0
  273. package/dist/generated/tools/index.d.ts +8 -0
  274. package/dist/generated/tools/index.d.ts.map +1 -0
  275. package/dist/generated/tools/index.js +7 -0
  276. package/dist/generated/types/cms.d.ts +1766 -0
  277. package/dist/generated/types/cms.d.ts.map +1 -0
  278. package/dist/generated/types/cms.js +12 -0
  279. package/dist/generated/types/index.d.ts +16 -0
  280. package/dist/generated/types/index.d.ts.map +1 -0
  281. package/dist/generated/types/index.js +21 -0
  282. package/dist/generated/types/neon.d.ts +11 -0
  283. package/dist/generated/types/neon.d.ts.map +1 -0
  284. package/dist/generated/types/neon.js +11 -0
  285. package/dist/generated/types/supabase.d.ts +193 -0
  286. package/dist/generated/types/supabase.d.ts.map +1 -0
  287. package/dist/generated/types/supabase.js +5 -0
  288. package/dist/globals/GlobalOperations.d.ts +24 -0
  289. package/dist/globals/GlobalOperations.d.ts.map +1 -0
  290. package/dist/globals/GlobalOperations.js +149 -0
  291. package/dist/globals/index.d.ts +2 -0
  292. package/dist/globals/index.d.ts.map +1 -0
  293. package/dist/globals/index.js +1 -0
  294. package/dist/index.d.ts +64 -1
  295. package/dist/index.d.ts.map +1 -0
  296. package/dist/index.js +126 -33
  297. package/dist/instance/RevealUIInstance.d.ts +6 -0
  298. package/dist/instance/RevealUIInstance.d.ts.map +1 -0
  299. package/dist/instance/RevealUIInstance.js +306 -0
  300. package/dist/instance/index.d.ts +3 -0
  301. package/dist/instance/index.d.ts.map +1 -0
  302. package/dist/instance/index.js +2 -0
  303. package/dist/instance/logger.d.ts +31 -0
  304. package/dist/instance/logger.d.ts.map +1 -0
  305. package/dist/instance/logger.js +42 -0
  306. package/dist/instance/methods/create.d.ts +10 -0
  307. package/dist/instance/methods/create.d.ts.map +1 -0
  308. package/dist/instance/methods/create.js +41 -0
  309. package/dist/instance/methods/delete.d.ts +10 -0
  310. package/dist/instance/methods/delete.d.ts.map +1 -0
  311. package/dist/instance/methods/delete.js +27 -0
  312. package/dist/instance/methods/find.d.ts +10 -0
  313. package/dist/instance/methods/find.d.ts.map +1 -0
  314. package/dist/instance/methods/find.js +23 -0
  315. package/dist/instance/methods/findById.d.ts +13 -0
  316. package/dist/instance/methods/findById.d.ts.map +1 -0
  317. package/dist/instance/methods/findById.js +23 -0
  318. package/dist/instance/methods/hooks.d.ts +14 -0
  319. package/dist/instance/methods/hooks.d.ts.map +1 -0
  320. package/dist/instance/methods/hooks.js +34 -0
  321. package/dist/instance/methods/update.d.ts +10 -0
  322. package/dist/instance/methods/update.d.ts.map +1 -0
  323. package/dist/instance/methods/update.js +45 -0
  324. package/dist/license.d.ts +82 -0
  325. package/dist/license.d.ts.map +1 -0
  326. package/dist/license.js +193 -0
  327. package/dist/monitoring/alerts.d.ts +118 -0
  328. package/dist/monitoring/alerts.d.ts.map +1 -0
  329. package/dist/monitoring/alerts.js +324 -0
  330. package/dist/monitoring/cleanup-manager.d.ts +71 -0
  331. package/dist/monitoring/cleanup-manager.d.ts.map +1 -0
  332. package/dist/monitoring/cleanup-manager.js +226 -0
  333. package/dist/monitoring/health-monitor.d.ts +22 -0
  334. package/dist/monitoring/health-monitor.d.ts.map +1 -0
  335. package/dist/monitoring/health-monitor.js +142 -0
  336. package/dist/monitoring/index.d.ts +14 -0
  337. package/dist/monitoring/index.d.ts.map +1 -0
  338. package/dist/monitoring/index.js +17 -0
  339. package/dist/monitoring/process-registry.d.ts +97 -0
  340. package/dist/monitoring/process-registry.d.ts.map +1 -0
  341. package/dist/monitoring/process-registry.js +222 -0
  342. package/dist/monitoring/query-monitor.d.ts +153 -0
  343. package/dist/monitoring/query-monitor.d.ts.map +1 -0
  344. package/dist/monitoring/query-monitor.js +209 -0
  345. package/dist/monitoring/types.d.ts +231 -0
  346. package/dist/monitoring/types.d.ts.map +1 -0
  347. package/dist/monitoring/types.js +42 -0
  348. package/dist/monitoring/zombie-detector.d.ts +81 -0
  349. package/dist/monitoring/zombie-detector.d.ts.map +1 -0
  350. package/dist/monitoring/zombie-detector.js +231 -0
  351. package/dist/nextjs/index.d.ts +4 -0
  352. package/dist/nextjs/index.d.ts.map +1 -0
  353. package/dist/nextjs/index.js +3 -0
  354. package/dist/nextjs/utilities.d.ts +5 -0
  355. package/dist/nextjs/utilities.d.ts.map +1 -0
  356. package/dist/nextjs/utilities.js +16 -0
  357. package/dist/nextjs/withRevealUI.d.ts +20 -0
  358. package/dist/nextjs/withRevealUI.d.ts.map +1 -0
  359. package/dist/nextjs/withRevealUI.js +181 -0
  360. package/dist/observability/alerts.d.ts +138 -0
  361. package/dist/observability/alerts.d.ts.map +1 -0
  362. package/dist/observability/alerts.js +390 -0
  363. package/dist/observability/health-check.d.ts +95 -0
  364. package/dist/observability/health-check.d.ts.map +1 -0
  365. package/dist/observability/health-check.js +375 -0
  366. package/dist/observability/index.d.ts +12 -0
  367. package/dist/observability/index.d.ts.map +1 -0
  368. package/dist/observability/index.js +11 -0
  369. package/dist/observability/logger.d.ts +47 -0
  370. package/dist/observability/logger.d.ts.map +1 -0
  371. package/dist/observability/logger.js +140 -0
  372. package/dist/observability/metrics.d.ts +205 -0
  373. package/dist/observability/metrics.d.ts.map +1 -0
  374. package/dist/observability/metrics.js +429 -0
  375. package/dist/observability/tracing.d.ts +149 -0
  376. package/dist/observability/tracing.d.ts.map +1 -0
  377. package/dist/observability/tracing.js +381 -0
  378. package/dist/optimization/asset-optimizer.d.ts +202 -0
  379. package/dist/optimization/asset-optimizer.d.ts.map +1 -0
  380. package/dist/optimization/asset-optimizer.js +312 -0
  381. package/dist/optimization/build-optimizer.d.ts +202 -0
  382. package/dist/optimization/build-optimizer.d.ts.map +1 -0
  383. package/dist/optimization/build-optimizer.js +271 -0
  384. package/dist/optimization/bundle-analyzer.d.ts +98 -0
  385. package/dist/optimization/bundle-analyzer.d.ts.map +1 -0
  386. package/dist/optimization/bundle-analyzer.js +322 -0
  387. package/dist/optimization/code-splitting.d.ts +131 -0
  388. package/dist/optimization/code-splitting.d.ts.map +1 -0
  389. package/dist/optimization/code-splitting.js +277 -0
  390. package/dist/plugin/index.d.ts +12 -0
  391. package/dist/plugin/index.d.ts.map +1 -0
  392. package/dist/plugin/index.js +4 -0
  393. package/dist/plugins/form-builder.d.ts +115 -0
  394. package/dist/plugins/form-builder.d.ts.map +1 -0
  395. package/dist/plugins/form-builder.js +239 -0
  396. package/dist/plugins/index.d.ts +5 -0
  397. package/dist/plugins/index.d.ts.map +1 -0
  398. package/dist/plugins/index.js +4 -0
  399. package/dist/plugins/nested-docs.d.ts +8 -0
  400. package/dist/plugins/nested-docs.d.ts.map +1 -0
  401. package/dist/plugins/nested-docs.js +67 -0
  402. package/dist/plugins/redirects.d.ts +17 -0
  403. package/dist/plugins/redirects.d.ts.map +1 -0
  404. package/dist/plugins/redirects.js +62 -0
  405. package/dist/queries/index.d.ts +2 -0
  406. package/dist/queries/index.d.ts.map +1 -0
  407. package/dist/queries/index.js +1 -0
  408. package/dist/queries/queryBuilder.d.ts +47 -0
  409. package/dist/queries/queryBuilder.d.ts.map +1 -0
  410. package/dist/queries/queryBuilder.js +255 -0
  411. package/dist/relationships/analyzer.d.ts +39 -0
  412. package/dist/relationships/analyzer.d.ts.map +1 -0
  413. package/dist/relationships/analyzer.js +127 -0
  414. package/dist/relationships/index.d.ts +3 -0
  415. package/dist/relationships/index.d.ts.map +1 -0
  416. package/dist/relationships/index.js +2 -0
  417. package/dist/relationships/populate-helpers.d.ts +104 -0
  418. package/dist/relationships/populate-helpers.d.ts.map +1 -0
  419. package/dist/relationships/populate-helpers.js +187 -0
  420. package/dist/relationships/population.d.ts +42 -0
  421. package/dist/relationships/population.d.ts.map +1 -0
  422. package/dist/relationships/population.js +188 -0
  423. package/dist/revealui.d.ts +46 -0
  424. package/dist/revealui.d.ts.map +1 -0
  425. package/dist/revealui.js +92 -0
  426. package/dist/richtext/exports/client/rcc.d.ts +37 -0
  427. package/dist/richtext/exports/client/rcc.d.ts.map +1 -0
  428. package/dist/richtext/exports/client/rcc.js +182 -0
  429. package/dist/richtext/exports/server/rsc.d.ts +117 -0
  430. package/dist/richtext/exports/server/rsc.d.ts.map +1 -0
  431. package/dist/richtext/exports/server/rsc.js +288 -0
  432. package/dist/richtext/index.d.ts +161 -0
  433. package/dist/richtext/index.d.ts.map +1 -0
  434. package/dist/richtext/index.js +243 -0
  435. package/dist/richtext/lexical.d.ts +23 -0
  436. package/dist/richtext/lexical.d.ts.map +1 -0
  437. package/dist/richtext/lexical.js +35 -0
  438. package/dist/security/audit.d.ts +188 -0
  439. package/dist/security/audit.d.ts.map +1 -0
  440. package/dist/security/audit.js +431 -0
  441. package/dist/security/auth.d.ts +241 -0
  442. package/dist/security/auth.d.ts.map +1 -0
  443. package/dist/security/auth.js +476 -0
  444. package/dist/security/authorization.d.ts +235 -0
  445. package/dist/security/authorization.d.ts.map +1 -0
  446. package/dist/security/authorization.js +434 -0
  447. package/dist/security/encryption.d.ts +214 -0
  448. package/dist/security/encryption.d.ts.map +1 -0
  449. package/dist/security/encryption.js +517 -0
  450. package/dist/security/gdpr.d.ts +300 -0
  451. package/dist/security/gdpr.d.ts.map +1 -0
  452. package/dist/security/gdpr.js +465 -0
  453. package/dist/security/headers.d.ts +182 -0
  454. package/dist/security/headers.d.ts.map +1 -0
  455. package/dist/security/headers.js +402 -0
  456. package/dist/security/index.d.ts +19 -0
  457. package/dist/security/index.d.ts.map +1 -0
  458. package/dist/security/index.js +18 -0
  459. package/dist/server/index.d.ts +21 -0
  460. package/dist/server/index.d.ts.map +1 -0
  461. package/dist/server/index.js +28 -0
  462. package/dist/server/renderPage.d.ts +69 -0
  463. package/dist/server/renderPage.d.ts.map +1 -0
  464. package/dist/server/renderPage.js +109 -0
  465. package/dist/storage/index.d.ts +1 -0
  466. package/dist/storage/index.d.ts.map +1 -0
  467. package/dist/storage/index.js +4 -0
  468. package/dist/storage/vercel-blob.d.ts +17 -0
  469. package/dist/storage/vercel-blob.d.ts.map +1 -0
  470. package/dist/storage/vercel-blob.js +83 -0
  471. package/dist/translations/index.d.ts +17 -0
  472. package/dist/translations/index.d.ts.map +1 -0
  473. package/dist/translations/index.js +1 -0
  474. package/dist/types/access.d.ts +67 -0
  475. package/dist/types/access.d.ts.map +1 -0
  476. package/dist/types/access.js +8 -0
  477. package/dist/types/api.d.ts +57 -0
  478. package/dist/types/api.d.ts.map +1 -0
  479. package/dist/types/api.js +8 -0
  480. package/dist/types/cms.d.ts +8 -0
  481. package/dist/types/cms.d.ts.map +1 -0
  482. package/dist/types/cms.js +6 -0
  483. package/dist/types/config.d.ts +152 -0
  484. package/dist/types/config.d.ts.map +1 -0
  485. package/dist/types/config.js +9 -0
  486. package/dist/types/core.d.ts +11 -0
  487. package/dist/types/core.d.ts.map +1 -0
  488. package/dist/types/core.js +9 -0
  489. package/dist/types/extensions.d.ts +116 -0
  490. package/dist/types/extensions.d.ts.map +1 -0
  491. package/dist/types/extensions.js +8 -0
  492. package/dist/types/frontend.d.ts +53 -0
  493. package/dist/types/frontend.d.ts.map +1 -0
  494. package/dist/types/frontend.js +7 -0
  495. package/dist/types/generated.d.ts +12 -0
  496. package/dist/types/generated.d.ts.map +1 -0
  497. package/dist/types/generated.js +10 -0
  498. package/dist/types/hooks.d.ts +53 -0
  499. package/dist/types/hooks.d.ts.map +1 -0
  500. package/dist/types/hooks.js +8 -0
  501. package/dist/types/index.d.ts +49 -0
  502. package/dist/types/index.d.ts.map +1 -0
  503. package/dist/types/index.js +61 -0
  504. package/dist/types/interfaces/app.d.ts +50 -0
  505. package/dist/types/interfaces/app.d.ts.map +1 -0
  506. package/dist/types/interfaces/app.js +5 -0
  507. package/dist/types/jobs.d.ts +112 -0
  508. package/dist/types/jobs.d.ts.map +1 -0
  509. package/dist/types/jobs.js +7 -0
  510. package/dist/types/legacy.d.ts +147 -0
  511. package/dist/types/legacy.d.ts.map +1 -0
  512. package/dist/types/legacy.js +8 -0
  513. package/dist/types/plugins.d.ts +17 -0
  514. package/dist/types/plugins.d.ts.map +1 -0
  515. package/dist/types/plugins.js +8 -0
  516. package/dist/types/query.d.ts +99 -0
  517. package/dist/types/query.d.ts.map +1 -0
  518. package/dist/types/query.js +24 -0
  519. package/dist/types/request.d.ts +40 -0
  520. package/dist/types/request.d.ts.map +1 -0
  521. package/dist/types/request.js +8 -0
  522. package/dist/types/richtext.d.ts +23 -0
  523. package/dist/types/richtext.d.ts.map +1 -0
  524. package/dist/types/richtext.js +8 -0
  525. package/dist/types/runtime.d.ts +216 -0
  526. package/dist/types/runtime.d.ts.map +1 -0
  527. package/dist/types/runtime.js +9 -0
  528. package/dist/types/schema.d.ts +9 -0
  529. package/dist/types/schema.d.ts.map +1 -0
  530. package/dist/types/schema.js +7 -0
  531. package/dist/types/user.d.ts +48 -0
  532. package/dist/types/user.d.ts.map +1 -0
  533. package/dist/types/user.js +8 -0
  534. package/dist/utils/access-conversion.d.ts +17 -0
  535. package/dist/utils/access-conversion.d.ts.map +1 -0
  536. package/dist/utils/access-conversion.js +96 -0
  537. package/dist/utils/api-wrapper.d.ts +63 -0
  538. package/dist/utils/api-wrapper.d.ts.map +1 -0
  539. package/dist/utils/api-wrapper.js +151 -0
  540. package/dist/utils/block-conversion.d.ts +21 -0
  541. package/dist/utils/block-conversion.d.ts.map +1 -0
  542. package/dist/utils/block-conversion.js +109 -0
  543. package/dist/utils/cache.d.ts +86 -0
  544. package/dist/utils/cache.d.ts.map +1 -0
  545. package/dist/utils/cache.js +154 -0
  546. package/dist/utils/deep-clone.d.ts +25 -0
  547. package/dist/utils/deep-clone.d.ts.map +1 -0
  548. package/dist/utils/deep-clone.js +115 -0
  549. package/dist/utils/error-responses.d.ts +57 -0
  550. package/dist/utils/error-responses.d.ts.map +1 -0
  551. package/dist/utils/error-responses.js +96 -0
  552. package/dist/utils/errors.d.ts +97 -0
  553. package/dist/utils/errors.d.ts.map +1 -0
  554. package/dist/utils/errors.js +397 -0
  555. package/dist/utils/field-conversion.d.ts +40 -0
  556. package/dist/utils/field-conversion.d.ts.map +1 -0
  557. package/dist/utils/field-conversion.js +275 -0
  558. package/dist/utils/flattenResult.d.ts +7 -0
  559. package/dist/utils/flattenResult.d.ts.map +1 -0
  560. package/dist/utils/flattenResult.js +23 -0
  561. package/dist/utils/getBlockSelect.d.ts +12 -0
  562. package/dist/utils/getBlockSelect.d.ts.map +1 -0
  563. package/dist/utils/getBlockSelect.js +12 -0
  564. package/dist/utils/getSelectMode.d.ts +8 -0
  565. package/dist/utils/getSelectMode.d.ts.map +1 -0
  566. package/dist/utils/getSelectMode.js +21 -0
  567. package/dist/utils/isValidID.d.ts +5 -0
  568. package/dist/utils/isValidID.d.ts.map +1 -0
  569. package/dist/utils/isValidID.js +13 -0
  570. package/dist/utils/json-parsing.d.ts +48 -0
  571. package/dist/utils/json-parsing.d.ts.map +1 -0
  572. package/dist/utils/json-parsing.js +130 -0
  573. package/dist/utils/jwt-validation.d.ts +14 -0
  574. package/dist/utils/jwt-validation.d.ts.map +1 -0
  575. package/dist/utils/jwt-validation.js +36 -0
  576. package/dist/utils/logger-client.d.ts +32 -0
  577. package/dist/utils/logger-client.d.ts.map +1 -0
  578. package/dist/utils/logger-client.js +55 -0
  579. package/dist/utils/logger-server.d.ts +32 -0
  580. package/dist/utils/logger-server.d.ts.map +1 -0
  581. package/dist/utils/logger-server.js +68 -0
  582. package/dist/utils/logger.d.ts +14 -0
  583. package/dist/utils/logger.d.ts.map +1 -0
  584. package/dist/utils/logger.js +12 -0
  585. package/dist/utils/request-context.d.ts +143 -0
  586. package/dist/utils/request-context.d.ts.map +1 -0
  587. package/dist/utils/request-context.js +168 -0
  588. package/dist/utils/request-headers.d.ts +15 -0
  589. package/dist/utils/request-headers.d.ts.map +1 -0
  590. package/dist/utils/request-headers.js +31 -0
  591. package/dist/utils/stripUnselectedFields.d.ts +10 -0
  592. package/dist/utils/stripUnselectedFields.d.ts.map +1 -0
  593. package/dist/utils/stripUnselectedFields.js +20 -0
  594. package/dist/utils/type-guards.d.ts +33 -0
  595. package/dist/utils/type-guards.d.ts.map +1 -0
  596. package/dist/utils/type-guards.js +63 -0
  597. package/dist/utils/user.d.ts +14 -0
  598. package/dist/utils/user.d.ts.map +1 -0
  599. package/dist/utils/user.js +15 -0
  600. package/package.json +241 -724
  601. package/LICENSE_SUMMARY.md +0 -55
  602. package/NOTICE +0 -34
  603. package/dist/exports/RenderErrorPage.js +0 -3
  604. package/dist/exports/__internal.js +0 -3
  605. package/dist/exports/abort.js +0 -3
  606. package/dist/exports/bin-entry.js +0 -5
  607. package/dist/exports/client.js +0 -3
  608. package/dist/exports/config.js +0 -1
  609. package/dist/exports/helpers.js +0 -1
  610. package/dist/exports/index.js +0 -33
  611. package/dist/exports/plugin.js +0 -3
  612. package/dist/exports/prerender.js +0 -3
  613. package/dist/exports/router.js +0 -3
  614. package/dist/exports/routing.js +0 -3
  615. package/dist/exports/server.js +0 -3
  616. package/dist/exports/setup.js +0 -3
  617. package/dist/exports/types.js +0 -1
  618. package/dist/integration/styles.css +0 -141
  619. package/dist/shared/RenderErrorPage.d.ts +0 -3
  620. package/dist/shared/RenderErrorPage.js +0 -3
  621. package/dist/shared/abort.js +0 -3
  622. package/dist/shared/route/routing.js +0 -3
@@ -0,0 +1,318 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { logger } from '@revealui/core/utils/logger';
4
+ import { useEffect, useState } from 'react';
5
+ import { APIError, APIErrorType, apiClient } from '../utils/index.js';
6
+ import { CollectionList } from './CollectionList.js';
7
+ import { DocumentForm } from './DocumentForm.js';
8
+ import { GlobalForm } from './GlobalForm.js';
9
+ export function AdminDashboard({ config }) {
10
+ const [currentView, setCurrentView] = useState({
11
+ type: 'dashboard',
12
+ });
13
+ const [collectionData, setCollectionData] = useState({
14
+ documents: [],
15
+ totalDocs: 0,
16
+ page: 1,
17
+ totalPages: 1,
18
+ loading: false,
19
+ error: null,
20
+ });
21
+ const [saving, setSaving] = useState(false);
22
+ const [deleting, setDeleting] = useState(null);
23
+ const [error, setError] = useState(null);
24
+ const [successMessage, setSuccessMessage] = useState(null);
25
+ const [globalData, setGlobalData] = useState({
26
+ document: null,
27
+ loading: false,
28
+ error: null,
29
+ });
30
+ const collections = config.collections || [];
31
+ const globals = config.globals || [];
32
+ // Auto-dismiss success messages
33
+ useEffect(() => {
34
+ if (successMessage) {
35
+ const timer = setTimeout(() => setSuccessMessage(null), 3000);
36
+ return () => clearTimeout(timer);
37
+ }
38
+ return;
39
+ }, [successMessage]);
40
+ // Auto-dismiss error messages
41
+ useEffect(() => {
42
+ if (error) {
43
+ const timer = setTimeout(() => setError(null), 5000);
44
+ return () => clearTimeout(timer);
45
+ }
46
+ return;
47
+ }, [error]);
48
+ const handleCollectionClick = async (collection) => {
49
+ setCurrentView({ type: 'collection', collection });
50
+ setError(null);
51
+ setSuccessMessage(null);
52
+ try {
53
+ // Show loading state
54
+ setCollectionData((prev) => ({ ...prev, loading: true, error: null }));
55
+ // Fetch first page of documents
56
+ const response = await apiClient.find({
57
+ collection: String(collection.slug),
58
+ page: 1,
59
+ limit: 10,
60
+ });
61
+ setCollectionData({
62
+ documents: response.docs || [],
63
+ totalDocs: response.totalDocs || 0,
64
+ page: response.page || 1,
65
+ totalPages: response.totalPages || 1,
66
+ loading: false,
67
+ error: null,
68
+ });
69
+ }
70
+ catch (err) {
71
+ // Handle error
72
+ const errorMessage = err instanceof APIError ? err.message : 'Failed to fetch collection data. Please try again.';
73
+ logger.error('Failed to fetch collection data', { error: err });
74
+ setCollectionData((prev) => ({
75
+ ...prev,
76
+ loading: false,
77
+ error: errorMessage,
78
+ }));
79
+ setError(errorMessage);
80
+ // Handle authentication errors
81
+ if (err instanceof APIError && err.type === APIErrorType.Authentication) {
82
+ // Redirect to login would be handled by the auth system
83
+ logger.warn('Authentication required');
84
+ }
85
+ }
86
+ };
87
+ const handleGlobalClick = async (global) => {
88
+ setCurrentView({ type: 'global', global });
89
+ setError(null);
90
+ setSuccessMessage(null);
91
+ try {
92
+ // Show loading state
93
+ setGlobalData({ document: null, loading: true, error: null });
94
+ // Fetch global data
95
+ const document = await apiClient.findGlobal({
96
+ slug: String(global.slug),
97
+ depth: 0,
98
+ });
99
+ setGlobalData({
100
+ document,
101
+ loading: false,
102
+ error: null,
103
+ });
104
+ }
105
+ catch (err) {
106
+ // Handle error
107
+ const errorMessage = err instanceof APIError ? err.message : 'Failed to fetch global data. Please try again.';
108
+ logger.error('Failed to fetch global data', { error: err });
109
+ setGlobalData({
110
+ document: null,
111
+ loading: false,
112
+ error: errorMessage,
113
+ });
114
+ setError(errorMessage);
115
+ // Handle authentication errors
116
+ if (err instanceof APIError && err.type === APIErrorType.Authentication) {
117
+ logger.warn('Authentication required');
118
+ }
119
+ }
120
+ };
121
+ const handleCreate = () => {
122
+ if (currentView.collection) {
123
+ setCurrentView({ type: 'edit', collection: currentView.collection });
124
+ }
125
+ };
126
+ const handleEdit = (document) => {
127
+ if (currentView.collection) {
128
+ setCurrentView({
129
+ type: 'edit',
130
+ collection: currentView.collection,
131
+ document,
132
+ });
133
+ }
134
+ };
135
+ const handleDelete = async (document) => {
136
+ if (!(currentView.collection && document.id))
137
+ return;
138
+ // Show confirmation dialog
139
+ const confirmed = window.confirm(`Are you sure you want to delete this ${String(currentView.collection.slug)}? This action cannot be undone.`);
140
+ if (!confirmed)
141
+ return;
142
+ try {
143
+ setDeleting(String(document.id));
144
+ setError(null);
145
+ setSuccessMessage(null);
146
+ await apiClient.delete({
147
+ collection: String(currentView.collection.slug),
148
+ id: String(document.id),
149
+ });
150
+ // Refresh collection list
151
+ if (currentView.collection) {
152
+ await handleCollectionClick(currentView.collection);
153
+ }
154
+ // Show success message
155
+ setSuccessMessage('Document deleted successfully');
156
+ }
157
+ catch (err) {
158
+ const errorMessage = err instanceof APIError ? err.message : 'Failed to delete document. Please try again.';
159
+ logger.error('Failed to delete document', { error: err });
160
+ setError(errorMessage);
161
+ // Handle authentication errors
162
+ if (err instanceof APIError && err.type === APIErrorType.Authentication) {
163
+ logger.warn('Authentication required');
164
+ }
165
+ }
166
+ finally {
167
+ setDeleting(null);
168
+ }
169
+ };
170
+ const handleSave = async (data) => {
171
+ if (!currentView.collection)
172
+ return;
173
+ try {
174
+ setSaving(true);
175
+ setError(null);
176
+ setSuccessMessage(null);
177
+ if (currentView.document?.id) {
178
+ // Update existing document
179
+ await apiClient.update({
180
+ collection: String(currentView.collection.slug),
181
+ id: String(currentView.document.id),
182
+ data,
183
+ });
184
+ setSuccessMessage('Document updated successfully');
185
+ }
186
+ else {
187
+ // Auto-generate slug from title if the collection has a slug field but none was
188
+ // submitted. Server-side beforeValidate field hooks may not run for all routes,
189
+ // so we replicate the slug-generation logic here as a reliable client-side fallback.
190
+ const hasSlugField = currentView.collection.fields.some((f) => 'name' in f && f.name === 'slug');
191
+ const submitData = hasSlugField && !data.slug && typeof data.title === 'string'
192
+ ? {
193
+ ...data,
194
+ slug: data.title
195
+ .replace(/ /g, '-')
196
+ .replace(/[^\w-]+/g, '')
197
+ .toLowerCase(),
198
+ }
199
+ : data;
200
+ // Create new document
201
+ await apiClient.create({
202
+ collection: String(currentView.collection.slug),
203
+ data: submitData,
204
+ });
205
+ setSuccessMessage('Document created successfully');
206
+ }
207
+ // Refresh collection list
208
+ if (currentView.collection) {
209
+ await handleCollectionClick(currentView.collection);
210
+ }
211
+ // Navigate back to collection view
212
+ setCurrentView({
213
+ type: 'collection',
214
+ collection: currentView.collection,
215
+ });
216
+ }
217
+ catch (err) {
218
+ const errorMessage = err instanceof APIError ? err.message : 'Failed to save document. Please try again.';
219
+ logger.error('Failed to save document', { error: err });
220
+ setError(errorMessage);
221
+ // Handle validation errors
222
+ if (err instanceof APIError && err.type === APIErrorType.Validation) {
223
+ // Validation errors are already in the error message
224
+ logger.warn('Validation error', {
225
+ field: err.field,
226
+ message: err.message,
227
+ });
228
+ }
229
+ // Handle authentication errors
230
+ if (err instanceof APIError && err.type === APIErrorType.Authentication) {
231
+ logger.warn('Authentication required');
232
+ }
233
+ }
234
+ finally {
235
+ setSaving(false);
236
+ }
237
+ };
238
+ const handleSaveGlobal = async (data) => {
239
+ if (!currentView.global)
240
+ return;
241
+ try {
242
+ setSaving(true);
243
+ setError(null);
244
+ setSuccessMessage(null);
245
+ // Update global
246
+ await apiClient.updateGlobal({
247
+ slug: String(currentView.global.slug),
248
+ data,
249
+ });
250
+ setSuccessMessage('Global updated successfully');
251
+ // Navigate back to dashboard
252
+ setCurrentView({ type: 'dashboard' });
253
+ }
254
+ catch (err) {
255
+ const errorMessage = err instanceof APIError ? err.message : 'Failed to save global. Please try again.';
256
+ logger.error('Failed to save global', { error: err });
257
+ setError(errorMessage);
258
+ // Handle validation errors
259
+ if (err instanceof APIError && err.type === APIErrorType.Validation) {
260
+ logger.warn('Validation error', {
261
+ field: err.field,
262
+ message: err.message,
263
+ });
264
+ }
265
+ // Handle authentication errors
266
+ if (err instanceof APIError && err.type === APIErrorType.Authentication) {
267
+ logger.warn('Authentication required');
268
+ }
269
+ }
270
+ finally {
271
+ setSaving(false);
272
+ }
273
+ };
274
+ const handleCancel = () => {
275
+ setCurrentView({ type: 'dashboard' });
276
+ };
277
+ const handlePageChange = async (page) => {
278
+ if (!currentView.collection)
279
+ return;
280
+ try {
281
+ setCollectionData((prev) => ({ ...prev, loading: true, error: null }));
282
+ const response = await apiClient.find({
283
+ collection: String(currentView.collection.slug),
284
+ page,
285
+ limit: 10,
286
+ });
287
+ setCollectionData({
288
+ documents: response.docs || [],
289
+ totalDocs: response.totalDocs || 0,
290
+ page: response.page || 1,
291
+ totalPages: response.totalPages || 1,
292
+ loading: false,
293
+ error: null,
294
+ });
295
+ }
296
+ catch (err) {
297
+ const errorMessage = err instanceof APIError ? err.message : 'Failed to fetch page. Please try again.';
298
+ logger.error('Failed to fetch page', { error: err });
299
+ setCollectionData((prev) => ({
300
+ ...prev,
301
+ loading: false,
302
+ error: errorMessage,
303
+ }));
304
+ setError(errorMessage);
305
+ }
306
+ };
307
+ if (currentView.type === 'collection' && currentView.collection) {
308
+ return (_jsxs("div", { className: "min-h-screen bg-gray-50", children: [_jsx("header", { className: "bg-white shadow-sm border-b", children: _jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: _jsx("div", { className: "flex justify-between items-center py-4", children: _jsxs("div", { className: "flex items-center space-x-4", children: [_jsx("button", { type: "button", onClick: () => setCurrentView({ type: 'dashboard' }), className: "text-gray-400 hover:text-gray-600", children: "\u2190 Back to Dashboard" }), _jsx("h1", { className: "text-2xl font-bold text-gray-900 capitalize", children: String(currentView.collection.slug) })] }) }) }) }), _jsxs("main", { className: "max-w-7xl mx-auto py-6 sm:px-6 lg:px-8", children: [error && (_jsxs("div", { className: "mb-4 bg-red-50 border border-red-200 text-red-800 px-4 py-3 rounded", children: [_jsx("p", { className: "font-medium", children: "Error" }), _jsx("p", { className: "text-sm", children: error })] })), successMessage && (_jsxs("div", { className: "mb-4 bg-green-50 border border-green-200 text-green-800 px-4 py-3 rounded", children: [_jsx("p", { className: "font-medium", children: "Success" }), _jsx("p", { className: "text-sm", children: successMessage })] })), collectionData.loading && (_jsxs("div", { className: "mb-4 text-center py-8", children: [_jsx("div", { className: "inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900" }), _jsx("p", { className: "mt-2 text-sm text-gray-600", children: "Loading..." })] })), _jsx(CollectionList, { collection: currentView.collection, documents: collectionData.documents, totalDocs: collectionData.totalDocs, page: collectionData.page, totalPages: collectionData.totalPages, onCreate: handleCreate, onEdit: handleEdit, onDelete: (document) => void handleDelete(document), onPageChange: (nextPage) => void handlePageChange(nextPage), deleting: deleting })] })] }));
309
+ }
310
+ if (currentView.type === 'edit' && currentView.collection) {
311
+ return (_jsxs("div", { className: "min-h-screen bg-gray-50", children: [_jsx("header", { className: "bg-white shadow-sm border-b", children: _jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: _jsx("div", { className: "flex justify-between items-center py-4", children: _jsxs("div", { className: "flex items-center space-x-4", children: [_jsx("button", { type: "button", onClick: () => setCurrentView({ type: 'dashboard' }), className: "text-gray-400 hover:text-gray-600", children: "\u2190 Back to Dashboard" }), _jsxs("h1", { className: "text-2xl font-bold text-gray-900 capitalize", children: [currentView.document ? 'Edit' : 'Create', ' ', String(currentView.collection.slug).slice(0, -1)] })] }) }) }) }), _jsx("main", { className: "max-w-7xl mx-auto py-6 sm:px-6 lg:px-8", children: _jsxs("div", { className: "max-w-3xl", children: [error && (_jsxs("div", { className: "mb-4 bg-red-50 border border-red-200 text-red-800 px-4 py-3 rounded", children: [_jsx("p", { className: "font-medium", children: "Error" }), _jsx("p", { className: "text-sm", children: error })] })), successMessage && (_jsxs("div", { className: "mb-4 bg-green-50 border border-green-200 text-green-800 px-4 py-3 rounded", children: [_jsx("p", { className: "font-medium", children: "Success" }), _jsx("p", { className: "text-sm", children: successMessage })] })), _jsx(DocumentForm, { collection: currentView.collection, document: currentView.document, onSave: (data) => void handleSave(data), onCancel: handleCancel, isLoading: saving })] }) })] }));
312
+ }
313
+ if (currentView.type === 'global' && currentView.global) {
314
+ return (_jsxs("div", { className: "min-h-screen bg-gray-50", children: [_jsx("header", { className: "bg-white shadow-sm border-b", children: _jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: _jsx("div", { className: "flex justify-between items-center py-4", children: _jsxs("div", { className: "flex items-center space-x-4", children: [_jsx("button", { type: "button", onClick: () => setCurrentView({ type: 'dashboard' }), className: "text-gray-400 hover:text-gray-600", children: "\u2190 Back to Dashboard" }), _jsx("h1", { className: "text-2xl font-bold text-gray-900 capitalize", children: currentView.global.label || String(currentView.global.slug) })] }) }) }) }), _jsx("main", { className: "max-w-7xl mx-auto py-6 sm:px-6 lg:px-8", children: _jsxs("div", { className: "max-w-3xl", children: [error && (_jsxs("div", { className: "mb-4 bg-red-50 border border-red-200 text-red-800 px-4 py-3 rounded", children: [_jsx("p", { className: "font-medium", children: "Error" }), _jsx("p", { className: "text-sm", children: error })] })), successMessage && (_jsxs("div", { className: "mb-4 bg-green-50 border border-green-200 text-green-800 px-4 py-3 rounded", children: [_jsx("p", { className: "font-medium", children: "Success" }), _jsx("p", { className: "text-sm", children: successMessage })] })), globalData.loading && (_jsxs("div", { className: "mb-4 text-center py-8", children: [_jsx("div", { className: "inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900" }), _jsx("p", { className: "mt-2 text-sm text-gray-600", children: "Loading..." })] })), !globalData.loading && globalData.document && (_jsx(GlobalForm, { global: currentView.global, document: globalData.document, onSave: (data) => void handleSaveGlobal(data), onCancel: handleCancel, isLoading: saving }))] }) })] }));
315
+ }
316
+ // Dashboard view
317
+ return (_jsxs("div", { className: "min-h-screen bg-gray-50", children: [_jsx("header", { className: "bg-white shadow-sm border-b", children: _jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: _jsxs("div", { className: "flex justify-between items-center py-4", children: [_jsx("div", { className: "flex items-center", children: _jsx("h1", { className: "text-2xl font-bold text-gray-900", children: "RevealUI Admin" }) }), _jsx("div", { className: "flex items-center space-x-4", children: _jsx("span", { className: "text-sm text-gray-500", children: "v0.1.0" }) })] }) }) }), _jsx("main", { className: "max-w-7xl mx-auto py-6 sm:px-6 lg:px-8", children: _jsx("div", { className: "px-4 py-6 sm:px-0", children: _jsxs("div", { className: "grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3", children: [_jsxs("div", { className: "bg-white overflow-hidden shadow rounded-lg", children: [_jsx("div", { className: "p-5", children: _jsxs("div", { className: "flex items-center", children: [_jsx("div", { className: "flex-shrink-0", children: _jsxs("svg", { className: "h-8 w-8 text-gray-400", "aria-label": "Collections", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", role: "img", children: [_jsx("title", { children: "Collections" }), _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" })] }) }), _jsx("div", { className: "ml-5 w-0 flex-1", children: _jsxs("dl", { children: [_jsx("dt", { className: "text-sm font-medium text-gray-500 truncate", children: "Collections" }), _jsx("dd", { className: "text-lg font-medium text-gray-900", children: collections.length })] }) })] }) }), _jsx("div", { className: "bg-gray-50 px-5 py-3", children: _jsx("div", { className: "text-sm", children: collections.length > 0 ? (_jsx("ul", { className: "space-y-1 max-h-48 overflow-y-auto", children: collections.map((collection) => (_jsx("li", { className: "text-gray-600 hover:text-gray-900", children: _jsx("button", { type: "button", onClick: () => void handleCollectionClick(collection), className: "hover:underline cursor-pointer", children: String(collection.slug) }) }, String(collection.slug)))) })) : (_jsx("p", { className: "text-gray-500", children: "No collections configured" })) }) })] }), _jsxs("div", { className: "bg-white overflow-hidden shadow rounded-lg", children: [_jsx("div", { className: "p-5", children: _jsxs("div", { className: "flex items-center", children: [_jsx("div", { className: "flex-shrink-0", children: _jsxs("svg", { className: "h-8 w-8 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-labelledby": "globals-icon-title", role: "img", children: [_jsx("title", { id: "globals-icon-title", children: "Globals" }), _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 100 4m0-4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 100 4m0-4v2m0-6V4" })] }) }), _jsx("div", { className: "ml-5 w-0 flex-1", children: _jsxs("dl", { children: [_jsx("dt", { className: "text-sm font-medium text-gray-500 truncate", children: "Globals" }), _jsx("dd", { className: "text-lg font-medium text-gray-900", children: globals.length })] }) })] }) }), _jsx("div", { className: "bg-gray-50 px-5 py-3", children: _jsx("div", { className: "text-sm", children: globals.length > 0 ? (_jsx("ul", { className: "space-y-1 max-h-32 overflow-y-auto", children: globals.map((global) => (_jsx("li", { className: "text-gray-600 hover:text-gray-900", children: _jsx("button", { type: "button", onClick: () => void handleGlobalClick(global), className: "hover:underline cursor-pointer", children: global.label || String(global.slug) }) }, String(global.slug)))) })) : (_jsx("p", { className: "text-gray-500", children: "No globals configured" })) }) })] }), _jsxs("div", { className: "bg-white overflow-hidden shadow rounded-lg", children: [_jsx("div", { className: "p-5", children: _jsxs("div", { className: "flex items-center", children: [_jsx("div", { className: "flex-shrink-0", children: _jsx("div", { className: "h-8 w-8 bg-green-100 rounded-full flex items-center justify-center", children: _jsxs("svg", { className: "h-5 w-5 text-green-600", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-labelledby": "system-status-icon-title", role: "img", children: [_jsx("title", { id: "system-status-icon-title", children: "System Status: Healthy" }), _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" })] }) }) }), _jsx("div", { className: "ml-5 w-0 flex-1", children: _jsxs("dl", { children: [_jsx("dt", { className: "text-sm font-medium text-gray-500 truncate", children: "System Status" }), _jsx("dd", { className: "text-lg font-medium text-gray-900", children: "Healthy" })] }) })] }) }), _jsx("div", { className: "bg-gray-50 px-5 py-3", children: _jsx("div", { className: "text-sm text-gray-600", children: "RevealUI CMS is running successfully" }) })] })] }) }) })] }));
318
+ }
@@ -0,0 +1,16 @@
1
+ import type { RevealCollectionConfig, RevealDocument } from '../../../types/index.js';
2
+ interface CollectionListProps {
3
+ collection: RevealCollectionConfig;
4
+ documents: RevealDocument[];
5
+ totalDocs: number;
6
+ page: number;
7
+ totalPages: number;
8
+ onCreate: () => void;
9
+ onEdit: (doc: RevealDocument) => void;
10
+ onDelete: (doc: RevealDocument) => void;
11
+ onPageChange: (page: number) => void;
12
+ deleting?: string | null;
13
+ }
14
+ export declare function CollectionList({ collection, documents, totalDocs, page, totalPages, onCreate, onEdit, onDelete, onPageChange, deleting, }: CollectionListProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=CollectionList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionList.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/components/CollectionList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAiB,MAAM,yBAAyB,CAAA;AAoCpG,UAAU,mBAAmB;IAC3B,UAAU,EAAE,sBAAsB,CAAA;IAClC,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAA;IACrC,QAAQ,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAA;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,SAAS,EACT,SAAS,EACT,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,QAAQ,GACT,EAAE,mBAAmB,2CAqKrB"}
@@ -0,0 +1,67 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ function getFieldLabel(field) {
4
+ const { label } = field;
5
+ if (typeof label === 'function') {
6
+ return label({ t: (key) => key });
7
+ }
8
+ if (typeof label === 'string') {
9
+ return label;
10
+ }
11
+ return typeof field.name === 'string' ? field.name : 'Field';
12
+ }
13
+ function formatTextValue(value) {
14
+ if (value === null || value === undefined)
15
+ return '';
16
+ if (typeof value === 'string')
17
+ return value;
18
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
19
+ return String(value);
20
+ }
21
+ if (typeof value === 'symbol')
22
+ return value.description ?? value.toString();
23
+ if (typeof value === 'function')
24
+ return value.name || 'function';
25
+ return JSON.stringify(value);
26
+ }
27
+ function formatDateValue(value) {
28
+ if (value instanceof Date)
29
+ return value.toLocaleDateString();
30
+ if (typeof value === 'string' || typeof value === 'number') {
31
+ const parsed = new Date(value);
32
+ return Number.isNaN(parsed.getTime()) ? '' : parsed.toLocaleDateString();
33
+ }
34
+ return '';
35
+ }
36
+ export function CollectionList({ collection, documents, totalDocs, page, totalPages, onCreate, onEdit, onDelete, onPageChange, deleting, }) {
37
+ // Filter to only include fields with names (exclude layout fields) that are visible
38
+ const displayFields = collection.fields
39
+ .filter((field) => {
40
+ return field.name && field.admin?.position !== 'sidebar' && !field.admin?.hidden;
41
+ })
42
+ .slice(0, 5); // Show first 5 visible fields
43
+ return (_jsxs("div", { className: "bg-white shadow overflow-hidden sm:rounded-md", children: [_jsxs("div", { className: "px-4 py-5 sm:px-6 flex justify-between items-center", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg leading-6 font-medium text-gray-900 capitalize", children: collection.slug }), _jsxs("p", { className: "mt-1 max-w-2xl text-sm text-gray-500", children: [totalDocs, " ", totalDocs === 1 ? 'document' : 'documents'] })] }), _jsxs("button", { type: "button", onClick: onCreate, className: "inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500", children: [_jsxs("svg", { className: "-ml-1 mr-2 h-5 w-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", role: "img", focusable: "false", children: [_jsx("title", { children: "Create New" }), _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" })] }), "Create New"] })] }), _jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "min-w-full divide-y divide-gray-200", children: [_jsx("thead", { className: "bg-gray-50", children: _jsxs("tr", { children: [displayFields.map((field) => (_jsx("th", { scope: "col", className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider", children: getFieldLabel(field) }, field.name))), _jsx("th", { scope: "col", className: "relative px-6 py-3", children: _jsx("span", { className: "sr-only", children: "Actions" }) })] }) }), _jsx("tbody", { className: "bg-white divide-y divide-gray-200", children: documents.length === 0 ? (_jsx("tr", { children: _jsxs("td", { colSpan: displayFields.length + 1, className: "px-6 py-4 text-center text-sm text-gray-500", children: ["No documents found.", ' ', _jsx("button", { type: "button", onClick: onCreate, className: "text-indigo-600 hover:text-indigo-500", children: "Create the first one" }), "."] }) })) : (documents.map((doc) => (_jsxs("tr", { className: "hover:bg-gray-50", children: [displayFields.map((field) => (_jsx("td", { className: "px-6 py-4 whitespace-nowrap text-sm text-gray-900", children: renderFieldValue(field.name ? doc[field.name] : undefined, field) }, field.name))), _jsxs("td", { className: "px-6 py-4 whitespace-nowrap text-right text-sm font-medium space-x-2", children: [_jsx("button", { type: "button", onClick: () => onEdit(doc), className: "text-indigo-600 hover:text-indigo-900 disabled:opacity-50 disabled:cursor-not-allowed", disabled: deleting !== null, children: "Edit" }), _jsx("button", { type: "button", onClick: () => onDelete(doc), className: "text-red-600 hover:text-red-900 disabled:opacity-50 disabled:cursor-not-allowed", disabled: deleting !== null, children: deleting === doc.id ? 'Deleting...' : 'Delete' })] })] }, doc.id)))) })] }) }), totalPages > 1 && (_jsxs("div", { className: "bg-white px-4 py-3 flex items-center justify-between border-t border-gray-200 sm:px-6", children: [_jsxs("div", { className: "flex-1 flex justify-between sm:hidden", children: [_jsx("button", { type: "button", onClick: () => onPageChange(page - 1), disabled: page <= 1, className: "relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed", children: "Previous" }), _jsx("button", { type: "button", onClick: () => onPageChange(page + 1), disabled: page >= totalPages, className: "ml-3 relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed", children: "Next" })] }), _jsxs("div", { className: "hidden sm:flex-1 sm:flex sm:items-center sm:justify-between", children: [_jsx("div", { children: _jsxs("p", { className: "text-sm text-gray-700", children: ["Showing page ", _jsx("span", { className: "font-medium", children: page }), " of", ' ', _jsx("span", { className: "font-medium", children: totalPages })] }) }), _jsx("div", { children: _jsxs("nav", { className: "relative z-0 inline-flex rounded-md shadow-sm -space-x-px", children: [_jsx("button", { type: "button", onClick: () => onPageChange(page - 1), disabled: page <= 1, className: "relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed", children: "Previous" }), _jsx("button", { type: "button", onClick: () => onPageChange(page + 1), disabled: page >= totalPages, className: "relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed", children: "Next" })] }) })] })] }))] }));
44
+ }
45
+ function renderFieldValue(value, field) {
46
+ if (value === null || value === undefined) {
47
+ return _jsx("span", { className: "text-gray-400", children: "-" });
48
+ }
49
+ switch (field.type) {
50
+ case 'text':
51
+ case 'textarea':
52
+ return formatTextValue(value);
53
+ case 'number':
54
+ return Number(value);
55
+ case 'checkbox':
56
+ return value ? '✓' : '✗';
57
+ case 'date':
58
+ return formatDateValue(value);
59
+ case 'select':
60
+ return formatTextValue(value);
61
+ default:
62
+ if (typeof value === 'object') {
63
+ return JSON.stringify(value);
64
+ }
65
+ return formatTextValue(value);
66
+ }
67
+ }
@@ -0,0 +1,11 @@
1
+ import type { RevealCollectionConfig, RevealDocument } from '../../../types/index.js';
2
+ interface DocumentFormProps {
3
+ collection: RevealCollectionConfig;
4
+ document?: RevealDocument;
5
+ onSave: (data: Record<string, unknown>) => void;
6
+ onCancel: () => void;
7
+ isLoading?: boolean;
8
+ }
9
+ export declare function DocumentForm({ collection, document, onSave, onCancel, isLoading, }: DocumentFormProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=DocumentForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentForm.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/components/DocumentForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAiB,MAAM,yBAAyB,CAAA;AA4DpG,UAAU,iBAAiB;IACzB,UAAU,EAAE,sBAAsB,CAAA;IAClC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAiB,GAClB,EAAE,iBAAiB,2CA0DnB"}
@@ -0,0 +1,99 @@
1
+ 'use client';
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { RichTextEditor } from '../../richtext/RichTextEditor.js';
5
+ function getFieldLabel(field) {
6
+ const { label } = field;
7
+ if (typeof label === 'function') {
8
+ return label({ t: (key) => key });
9
+ }
10
+ if (typeof label === 'string') {
11
+ return label;
12
+ }
13
+ return typeof field.name === 'string' ? field.name : 'Field';
14
+ }
15
+ function formatTextValue(value) {
16
+ if (value === null || value === undefined)
17
+ return '';
18
+ if (typeof value === 'string')
19
+ return value;
20
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
21
+ return String(value);
22
+ }
23
+ if (typeof value === 'symbol')
24
+ return value.description ?? value.toString();
25
+ if (typeof value === 'function')
26
+ return value.name || 'function';
27
+ return JSON.stringify(value);
28
+ }
29
+ function formatDateInputValue(value) {
30
+ if (value instanceof Date) {
31
+ return value.toISOString().slice(0, 16);
32
+ }
33
+ if (typeof value === 'string' || typeof value === 'number') {
34
+ const parsed = new Date(value);
35
+ return Number.isNaN(parsed.getTime()) ? '' : parsed.toISOString().slice(0, 16);
36
+ }
37
+ return '';
38
+ }
39
+ // Flatten tabs/rows and skip sidebar/hidden/disabled fields
40
+ function getVisibleFields(fields) {
41
+ const result = [];
42
+ for (const field of fields) {
43
+ if (field.admin?.position === 'sidebar' || field.admin?.hidden || field.admin?.disabled) {
44
+ continue;
45
+ }
46
+ const anyField = field;
47
+ if (field.type === 'tabs' && Array.isArray(anyField.tabs)) {
48
+ for (const tab of anyField.tabs) {
49
+ result.push(...getVisibleFields(tab.fields ?? []));
50
+ }
51
+ }
52
+ else if (field.type === 'row' && Array.isArray(anyField.fields)) {
53
+ result.push(...getVisibleFields(anyField.fields));
54
+ }
55
+ else {
56
+ result.push(field);
57
+ }
58
+ }
59
+ return result;
60
+ }
61
+ export function DocumentForm({ collection, document, onSave, onCancel, isLoading = false, }) {
62
+ const [formData, setFormData] = useState(document || {});
63
+ const visibleFields = getVisibleFields(collection.fields);
64
+ const handleSubmit = (e) => {
65
+ e.preventDefault();
66
+ onSave(formData);
67
+ };
68
+ const handleFieldChange = (fieldName, value) => {
69
+ setFormData((prev) => ({ ...prev, [fieldName]: value }));
70
+ };
71
+ return (_jsx("div", { className: "bg-white shadow overflow-hidden sm:rounded-lg", children: _jsxs("div", { className: "px-4 py-5 sm:p-6", children: [_jsxs("h3", { className: "text-lg leading-6 font-medium text-gray-900 mb-4", children: [document ? 'Edit' : 'Create', " ", collection.slug.slice(0, -1)] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [visibleFields.map((field) => (_jsxs("div", { children: [_jsxs("label", { htmlFor: field.name, className: "block text-sm font-medium text-gray-700", children: [getFieldLabel(field), field.required && _jsx("span", { className: "text-red-500 ml-1", children: "*" })] }), _jsx("div", { className: "mt-1", children: _jsx(FieldInput, { field: field, value: field.name ? formData[field.name] : undefined, onChange: (value) => field.name && handleFieldChange(field.name, value) }) })] }, field.name || 'layout'))), _jsxs("div", { className: "flex justify-end space-x-3 pt-6", children: [_jsx("button", { type: "button", onClick: onCancel, className: "bg-white py-2 px-4 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500", children: "Cancel" }), _jsx("button", { type: "submit", disabled: isLoading, className: "inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed", children: isLoading ? 'Saving...' : 'Save' })] })] })] }) }));
72
+ }
73
+ function FieldInput({ field, value, onChange }) {
74
+ const baseClasses = 'mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm';
75
+ switch (field.type) {
76
+ case 'text':
77
+ return (_jsx("input", { type: "text", id: field.name, value: formatTextValue(value), onChange: (e) => onChange(e.target.value), className: baseClasses, required: field.required }));
78
+ case 'textarea':
79
+ return (_jsx("textarea", { id: field.name, value: formatTextValue(value), onChange: (e) => onChange(e.target.value), rows: 4, className: baseClasses, required: field.required }));
80
+ case 'number':
81
+ return (_jsx("input", { type: "number", id: field.name, value: typeof value === 'number' ? value : value ? Number(value) : '', onChange: (e) => onChange(Number(e.target.value) || undefined), className: baseClasses, required: field.required, min: field.min, max: field.max }));
82
+ case 'checkbox':
83
+ return (_jsx("input", { type: "checkbox", id: field.name, checked: Boolean(value), onChange: (e) => onChange(e.target.checked), className: "h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 rounded" }));
84
+ case 'select':
85
+ return (_jsxs("select", { id: field.name, value: formatTextValue(value), onChange: (e) => onChange(e.target.value), className: baseClasses, required: field.required, children: [_jsx("option", { value: "", children: "Select an option" }), field.options?.map((option) => {
86
+ const value = typeof option === 'string' ? option : option.value;
87
+ const label = typeof option === 'string' ? option : option.label;
88
+ return (_jsx("option", { value: value, children: label }, value));
89
+ })] }));
90
+ case 'date':
91
+ return (_jsx("input", { type: "datetime-local", id: field.name, value: formatDateInputValue(value), onChange: (e) => onChange(e.target.value ? new Date(e.target.value) : null), className: baseClasses, required: field.required }));
92
+ case 'richText': {
93
+ const editorConfig = field.editor;
94
+ return (_jsx(RichTextEditor, { namespace: String(field.name), editorConfig: editorConfig, initialValue: value, onSerializedChange: (json) => onChange(json), className: "border border-gray-300 rounded-md" }));
95
+ }
96
+ default:
97
+ return (_jsx("input", { type: "text", id: field.name, value: formatTextValue(value), onChange: (e) => onChange(e.target.value), className: baseClasses, required: field.required }));
98
+ }
99
+ }
@@ -0,0 +1,11 @@
1
+ import type { RevealDocument, RevealGlobalConfig } from '../../../types/index.js';
2
+ interface GlobalFormProps {
3
+ global: RevealGlobalConfig;
4
+ document?: RevealDocument;
5
+ onSave: (data: Record<string, unknown>) => void;
6
+ onCancel: () => void;
7
+ isLoading?: boolean;
8
+ }
9
+ export declare function GlobalForm({ global, document, onSave, onCancel, isLoading, }: GlobalFormProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=GlobalForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalForm.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/components/GlobalForm.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAiB,MAAM,yBAAyB,CAAA;AAsChG,UAAU,eAAe;IACvB,MAAM,EAAE,kBAAkB,CAAA;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAiB,GAClB,EAAE,eAAe,2CA4DjB"}
@@ -0,0 +1,74 @@
1
+ 'use client';
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ function getFieldLabel(field) {
5
+ const { label } = field;
6
+ if (typeof label === 'function') {
7
+ return label({ t: (key) => key });
8
+ }
9
+ if (typeof label === 'string') {
10
+ return label;
11
+ }
12
+ return typeof field.name === 'string' ? field.name : 'Field';
13
+ }
14
+ function formatTextValue(value) {
15
+ if (value === null || value === undefined)
16
+ return '';
17
+ if (typeof value === 'string')
18
+ return value;
19
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
20
+ return String(value);
21
+ }
22
+ if (typeof value === 'symbol')
23
+ return value.description ?? value.toString();
24
+ if (typeof value === 'function')
25
+ return value.name || 'function';
26
+ return JSON.stringify(value);
27
+ }
28
+ function formatDateInputValue(value) {
29
+ if (value instanceof Date) {
30
+ return value.toISOString().slice(0, 16);
31
+ }
32
+ if (typeof value === 'string' || typeof value === 'number') {
33
+ const parsed = new Date(value);
34
+ return Number.isNaN(parsed.getTime()) ? '' : parsed.toISOString().slice(0, 16);
35
+ }
36
+ return '';
37
+ }
38
+ export function GlobalForm({ global, document, onSave, onCancel, isLoading = false, }) {
39
+ const [formData, setFormData] = useState(document || {});
40
+ const visibleFields = global.fields.filter((field) => {
41
+ return field.admin?.position !== 'sidebar' && !field.admin?.hidden;
42
+ });
43
+ const handleSubmit = (e) => {
44
+ e.preventDefault();
45
+ onSave(formData);
46
+ };
47
+ const handleFieldChange = (fieldName, value) => {
48
+ setFormData((prev) => ({ ...prev, [fieldName]: value }));
49
+ };
50
+ return (_jsx("div", { className: "bg-white shadow overflow-hidden sm:rounded-lg", children: _jsxs("div", { className: "px-4 py-5 sm:p-6", children: [_jsxs("h3", { className: "text-lg leading-6 font-medium text-gray-900 mb-4", children: ["Edit ", global.label || global.slug] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [visibleFields.map((field) => (_jsxs("div", { children: [_jsxs("label", { htmlFor: field.name, className: "block text-sm font-medium text-gray-700", children: [getFieldLabel(field), field.required && _jsx("span", { className: "text-red-500 ml-1", children: "*" })] }), _jsx("div", { className: "mt-1", children: _jsx(FieldInput, { field: field, value: field.name ? formData[field.name] : undefined, onChange: (value) => field.name && handleFieldChange(field.name, value) }) })] }, field.name || 'layout'))), _jsxs("div", { className: "flex justify-end space-x-3 pt-6", children: [_jsx("button", { type: "button", onClick: onCancel, className: "bg-white py-2 px-4 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500", children: "Cancel" }), _jsx("button", { type: "submit", disabled: isLoading, className: "inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed", children: isLoading ? 'Saving...' : 'Save' })] })] })] }) }));
51
+ }
52
+ function FieldInput({ field, value, onChange }) {
53
+ const baseClasses = 'mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm';
54
+ switch (field.type) {
55
+ case 'text':
56
+ return (_jsx("input", { type: "text", id: field.name, value: formatTextValue(value), onChange: (e) => onChange(e.target.value), className: baseClasses, required: field.required }));
57
+ case 'textarea':
58
+ return (_jsx("textarea", { id: field.name, value: formatTextValue(value), onChange: (e) => onChange(e.target.value), rows: 4, className: baseClasses, required: field.required }));
59
+ case 'number':
60
+ return (_jsx("input", { type: "number", id: field.name, value: typeof value === 'number' ? value : value ? Number(value) : '', onChange: (e) => onChange(Number(e.target.value) || undefined), className: baseClasses, required: field.required, min: field.min, max: field.max }));
61
+ case 'checkbox':
62
+ return (_jsx("input", { type: "checkbox", id: field.name, checked: Boolean(value), onChange: (e) => onChange(e.target.checked), className: "h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 rounded" }));
63
+ case 'select':
64
+ return (_jsxs("select", { id: field.name, value: formatTextValue(value), onChange: (e) => onChange(e.target.value), className: baseClasses, required: field.required, children: [_jsx("option", { value: "", children: "Select an option" }), field.options?.map((option) => {
65
+ const value = typeof option === 'string' ? option : option.value;
66
+ const label = typeof option === 'string' ? option : option.label;
67
+ return (_jsx("option", { value: value, children: label }, value));
68
+ })] }));
69
+ case 'date':
70
+ return (_jsx("input", { type: "datetime-local", id: field.name, value: formatDateInputValue(value), onChange: (e) => onChange(e.target.value ? new Date(e.target.value) : null), className: baseClasses, required: field.required }));
71
+ default:
72
+ return (_jsx("input", { type: "text", id: field.name, value: formatTextValue(value), onChange: (e) => onChange(e.target.value), className: baseClasses, required: field.required }));
73
+ }
74
+ }