@kywi-software/core 0.1.0 → 0.2.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 (463) hide show
  1. package/dist/admin/app.d.ts +69 -0
  2. package/dist/admin/app.d.ts.map +1 -0
  3. package/dist/admin/app.js +98 -0
  4. package/dist/admin/app.js.map +1 -0
  5. package/dist/admin/chrome.d.ts +37 -0
  6. package/dist/admin/chrome.d.ts.map +1 -0
  7. package/dist/admin/chrome.js +162 -0
  8. package/dist/admin/chrome.js.map +1 -0
  9. package/dist/admin/context.d.ts +58 -0
  10. package/dist/admin/context.d.ts.map +1 -0
  11. package/dist/admin/context.js +31 -0
  12. package/dist/admin/context.js.map +1 -0
  13. package/dist/admin/index.d.ts +9 -1
  14. package/dist/admin/index.d.ts.map +1 -1
  15. package/dist/admin/index.js +12 -0
  16. package/dist/admin/index.js.map +1 -1
  17. package/dist/admin/nav.d.ts +21 -1
  18. package/dist/admin/nav.d.ts.map +1 -1
  19. package/dist/admin/nav.js +45 -88
  20. package/dist/admin/nav.js.map +1 -1
  21. package/dist/admin/primitives.d.ts +52 -0
  22. package/dist/admin/primitives.d.ts.map +1 -0
  23. package/dist/admin/primitives.js +78 -0
  24. package/dist/admin/primitives.js.map +1 -0
  25. package/dist/admin/registry.d.ts +130 -0
  26. package/dist/admin/registry.d.ts.map +1 -0
  27. package/dist/admin/registry.js +456 -0
  28. package/dist/admin/registry.js.map +1 -0
  29. package/dist/admin/server.d.ts +154 -0
  30. package/dist/admin/server.d.ts.map +1 -0
  31. package/dist/admin/server.js +121 -0
  32. package/dist/admin/server.js.map +1 -0
  33. package/dist/admin/shell.d.ts +27 -1
  34. package/dist/admin/shell.d.ts.map +1 -1
  35. package/dist/admin/shell.js +10 -4
  36. package/dist/admin/shell.js.map +1 -1
  37. package/dist/admin/styles/admin.css +24 -0
  38. package/dist/admin/surface-matcher.d.ts +51 -0
  39. package/dist/admin/surface-matcher.d.ts.map +1 -0
  40. package/dist/admin/surface-matcher.js +181 -0
  41. package/dist/admin/surface-matcher.js.map +1 -0
  42. package/dist/admin/surfaces/approvals/approvals-data.d.ts +17 -0
  43. package/dist/admin/surfaces/approvals/approvals-data.d.ts.map +1 -0
  44. package/dist/admin/surfaces/approvals/approvals-data.js +55 -0
  45. package/dist/admin/surfaces/approvals/approvals-data.js.map +1 -0
  46. package/dist/admin/surfaces/approvals/approvals-index.d.ts +3 -0
  47. package/dist/admin/surfaces/approvals/approvals-index.d.ts.map +1 -0
  48. package/dist/admin/surfaces/approvals/approvals-index.js +75 -0
  49. package/dist/admin/surfaces/approvals/approvals-index.js.map +1 -0
  50. package/dist/admin/surfaces/audiences/audiences-data.d.ts +107 -0
  51. package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -0
  52. package/dist/admin/surfaces/audiences/audiences-data.js +216 -0
  53. package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -0
  54. package/dist/admin/surfaces/audiences/audiences-detail.d.ts +3 -0
  55. package/dist/admin/surfaces/audiences/audiences-detail.d.ts.map +1 -0
  56. package/dist/admin/surfaces/audiences/audiences-detail.js +78 -0
  57. package/dist/admin/surfaces/audiences/audiences-detail.js.map +1 -0
  58. package/dist/admin/surfaces/audiences/audiences-edit.d.ts +3 -0
  59. package/dist/admin/surfaces/audiences/audiences-edit.d.ts.map +1 -0
  60. package/dist/admin/surfaces/audiences/audiences-edit.js +55 -0
  61. package/dist/admin/surfaces/audiences/audiences-edit.js.map +1 -0
  62. package/dist/admin/surfaces/audiences/audiences-fields.d.ts +3 -0
  63. package/dist/admin/surfaces/audiences/audiences-fields.d.ts.map +1 -0
  64. package/dist/admin/surfaces/audiences/audiences-fields.js +56 -0
  65. package/dist/admin/surfaces/audiences/audiences-fields.js.map +1 -0
  66. package/dist/admin/surfaces/audiences/audiences-list.d.ts +3 -0
  67. package/dist/admin/surfaces/audiences/audiences-list.d.ts.map +1 -0
  68. package/dist/admin/surfaces/audiences/audiences-list.js +50 -0
  69. package/dist/admin/surfaces/audiences/audiences-list.js.map +1 -0
  70. package/dist/admin/surfaces/audiences/audiences-new.d.ts +3 -0
  71. package/dist/admin/surfaces/audiences/audiences-new.d.ts.map +1 -0
  72. package/dist/admin/surfaces/audiences/audiences-new.js +54 -0
  73. package/dist/admin/surfaces/audiences/audiences-new.js.map +1 -0
  74. package/dist/admin/surfaces/audiences/audiences-preview-tokens.d.ts +3 -0
  75. package/dist/admin/surfaces/audiences/audiences-preview-tokens.d.ts.map +1 -0
  76. package/dist/admin/surfaces/audiences/audiences-preview-tokens.js +123 -0
  77. package/dist/admin/surfaces/audiences/audiences-preview-tokens.js.map +1 -0
  78. package/dist/admin/surfaces/audiences/audiences-selfid-widget.d.ts +3 -0
  79. package/dist/admin/surfaces/audiences/audiences-selfid-widget.d.ts.map +1 -0
  80. package/dist/admin/surfaces/audiences/audiences-selfid-widget.js +50 -0
  81. package/dist/admin/surfaces/audiences/audiences-selfid-widget.js.map +1 -0
  82. package/dist/admin/surfaces/audiences/audiences-test.d.ts +3 -0
  83. package/dist/admin/surfaces/audiences/audiences-test.d.ts.map +1 -0
  84. package/dist/admin/surfaces/audiences/audiences-test.js +39 -0
  85. package/dist/admin/surfaces/audiences/audiences-test.js.map +1 -0
  86. package/dist/admin/surfaces/audiences/states.d.ts +10 -0
  87. package/dist/admin/surfaces/audiences/states.d.ts.map +1 -0
  88. package/dist/admin/surfaces/audiences/states.js +11 -0
  89. package/dist/admin/surfaces/audiences/states.js.map +1 -0
  90. package/dist/admin/surfaces/changesets/changesets-data.d.ts +35 -0
  91. package/dist/admin/surfaces/changesets/changesets-data.d.ts.map +1 -0
  92. package/dist/admin/surfaces/changesets/changesets-data.js +151 -0
  93. package/dist/admin/surfaces/changesets/changesets-data.js.map +1 -0
  94. package/dist/admin/surfaces/changesets/changesets-detail.d.ts +3 -0
  95. package/dist/admin/surfaces/changesets/changesets-detail.d.ts.map +1 -0
  96. package/dist/admin/surfaces/changesets/changesets-detail.js +84 -0
  97. package/dist/admin/surfaces/changesets/changesets-detail.js.map +1 -0
  98. package/dist/admin/surfaces/changesets/changesets-index.d.ts +3 -0
  99. package/dist/admin/surfaces/changesets/changesets-index.d.ts.map +1 -0
  100. package/dist/admin/surfaces/changesets/changesets-index.js +62 -0
  101. package/dist/admin/surfaces/changesets/changesets-index.js.map +1 -0
  102. package/dist/admin/surfaces/comments/comment-moderation.d.ts +18 -0
  103. package/dist/admin/surfaces/comments/comment-moderation.d.ts.map +1 -0
  104. package/dist/admin/surfaces/comments/comment-moderation.js +36 -0
  105. package/dist/admin/surfaces/comments/comment-moderation.js.map +1 -0
  106. package/dist/admin/surfaces/comments/comments-data.d.ts +23 -0
  107. package/dist/admin/surfaces/comments/comments-data.d.ts.map +1 -0
  108. package/dist/admin/surfaces/comments/comments-data.js +81 -0
  109. package/dist/admin/surfaces/comments/comments-data.js.map +1 -0
  110. package/dist/admin/surfaces/comments/comments-index.d.ts +3 -0
  111. package/dist/admin/surfaces/comments/comments-index.d.ts.map +1 -0
  112. package/dist/admin/surfaces/comments/comments-index.js +73 -0
  113. package/dist/admin/surfaces/comments/comments-index.js.map +1 -0
  114. package/dist/admin/surfaces/content/content-edit.d.ts +3 -0
  115. package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -0
  116. package/dist/admin/surfaces/content/content-edit.js +321 -0
  117. package/dist/admin/surfaces/content/content-edit.js.map +1 -0
  118. package/dist/admin/surfaces/content/content-index.d.ts +3 -0
  119. package/dist/admin/surfaces/content/content-index.d.ts.map +1 -0
  120. package/dist/admin/surfaces/content/content-index.js +21 -0
  121. package/dist/admin/surfaces/content/content-index.js.map +1 -0
  122. package/dist/admin/surfaces/content/content-list.d.ts +3 -0
  123. package/dist/admin/surfaces/content/content-list.d.ts.map +1 -0
  124. package/dist/admin/surfaces/content/content-list.js +70 -0
  125. package/dist/admin/surfaces/content/content-list.js.map +1 -0
  126. package/dist/admin/surfaces/content/content-new.d.ts +3 -0
  127. package/dist/admin/surfaces/content/content-new.d.ts.map +1 -0
  128. package/dist/admin/surfaces/content/content-new.js +109 -0
  129. package/dist/admin/surfaces/content/content-new.js.map +1 -0
  130. package/dist/admin/surfaces/content/content-translation-bar.d.ts +12 -0
  131. package/dist/admin/surfaces/content/content-translation-bar.d.ts.map +1 -0
  132. package/dist/admin/surfaces/content/content-translation-bar.js +65 -0
  133. package/dist/admin/surfaces/content/content-translation-bar.js.map +1 -0
  134. package/dist/admin/surfaces/content/runtime-content-types.d.ts +41 -0
  135. package/dist/admin/surfaces/content/runtime-content-types.d.ts.map +1 -0
  136. package/dist/admin/surfaces/content/runtime-content-types.js +51 -0
  137. package/dist/admin/surfaces/content/runtime-content-types.js.map +1 -0
  138. package/dist/admin/surfaces/contentTree/content-tree.d.ts +3 -0
  139. package/dist/admin/surfaces/contentTree/content-tree.d.ts.map +1 -0
  140. package/dist/admin/surfaces/contentTree/content-tree.js +179 -0
  141. package/dist/admin/surfaces/contentTree/content-tree.js.map +1 -0
  142. package/dist/admin/surfaces/contentTree/move-to-picker.d.ts +12 -0
  143. package/dist/admin/surfaces/contentTree/move-to-picker.d.ts.map +1 -0
  144. package/dist/admin/surfaces/contentTree/move-to-picker.js +77 -0
  145. package/dist/admin/surfaces/contentTree/move-to-picker.js.map +1 -0
  146. package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts +3 -0
  147. package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -0
  148. package/dist/admin/surfaces/contentTypes/content-types-designer.js +260 -0
  149. package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -0
  150. package/dist/admin/surfaces/contentTypes/content-types-list.d.ts +3 -0
  151. package/dist/admin/surfaces/contentTypes/content-types-list.d.ts.map +1 -0
  152. package/dist/admin/surfaces/contentTypes/content-types-list.js +69 -0
  153. package/dist/admin/surfaces/contentTypes/content-types-list.js.map +1 -0
  154. package/dist/admin/surfaces/dashboard/dashboard-index.d.ts +3 -0
  155. package/dist/admin/surfaces/dashboard/dashboard-index.d.ts.map +1 -0
  156. package/dist/admin/surfaces/dashboard/dashboard-index.js +100 -0
  157. package/dist/admin/surfaces/dashboard/dashboard-index.js.map +1 -0
  158. package/dist/admin/surfaces/experiments/experiments-data.d.ts +12 -0
  159. package/dist/admin/surfaces/experiments/experiments-data.d.ts.map +1 -0
  160. package/dist/admin/surfaces/experiments/experiments-data.js +89 -0
  161. package/dist/admin/surfaces/experiments/experiments-data.js.map +1 -0
  162. package/dist/admin/surfaces/experiments/experiments-detail.d.ts +3 -0
  163. package/dist/admin/surfaces/experiments/experiments-detail.d.ts.map +1 -0
  164. package/dist/admin/surfaces/experiments/experiments-detail.js +87 -0
  165. package/dist/admin/surfaces/experiments/experiments-detail.js.map +1 -0
  166. package/dist/admin/surfaces/experiments/experiments-list.d.ts +3 -0
  167. package/dist/admin/surfaces/experiments/experiments-list.d.ts.map +1 -0
  168. package/dist/admin/surfaces/experiments/experiments-list.js +37 -0
  169. package/dist/admin/surfaces/experiments/experiments-list.js.map +1 -0
  170. package/dist/admin/surfaces/experiments/experiments-new.d.ts +3 -0
  171. package/dist/admin/surfaces/experiments/experiments-new.d.ts.map +1 -0
  172. package/dist/admin/surfaces/experiments/experiments-new.js +33 -0
  173. package/dist/admin/surfaces/experiments/experiments-new.js.map +1 -0
  174. package/dist/admin/surfaces/experiments/states.d.ts +10 -0
  175. package/dist/admin/surfaces/experiments/states.d.ts.map +1 -0
  176. package/dist/admin/surfaces/experiments/states.js +11 -0
  177. package/dist/admin/surfaces/experiments/states.js.map +1 -0
  178. package/dist/admin/surfaces/extensions/extensions-data.d.ts +59 -0
  179. package/dist/admin/surfaces/extensions/extensions-data.d.ts.map +1 -0
  180. package/dist/admin/surfaces/extensions/extensions-data.js +71 -0
  181. package/dist/admin/surfaces/extensions/extensions-data.js.map +1 -0
  182. package/dist/admin/surfaces/extensions/extensions-import-export.d.ts +3 -0
  183. package/dist/admin/surfaces/extensions/extensions-import-export.d.ts.map +1 -0
  184. package/dist/admin/surfaces/extensions/extensions-import-export.js +77 -0
  185. package/dist/admin/surfaces/extensions/extensions-import-export.js.map +1 -0
  186. package/dist/admin/surfaces/extensions/extensions-list.d.ts +3 -0
  187. package/dist/admin/surfaces/extensions/extensions-list.d.ts.map +1 -0
  188. package/dist/admin/surfaces/extensions/extensions-list.js +106 -0
  189. package/dist/admin/surfaces/extensions/extensions-list.js.map +1 -0
  190. package/dist/admin/surfaces/extensions/form-modal.d.ts +17 -0
  191. package/dist/admin/surfaces/extensions/form-modal.d.ts.map +1 -0
  192. package/dist/admin/surfaces/extensions/form-modal.js +27 -0
  193. package/dist/admin/surfaces/extensions/form-modal.js.map +1 -0
  194. package/dist/admin/surfaces/feeds/feed-editor.d.ts +8 -0
  195. package/dist/admin/surfaces/feeds/feed-editor.d.ts.map +1 -0
  196. package/dist/admin/surfaces/feeds/feed-editor.js +120 -0
  197. package/dist/admin/surfaces/feeds/feed-editor.js.map +1 -0
  198. package/dist/admin/surfaces/feeds/feeds-data.d.ts +35 -0
  199. package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -0
  200. package/dist/admin/surfaces/feeds/feeds-data.js +81 -0
  201. package/dist/admin/surfaces/feeds/feeds-data.js.map +1 -0
  202. package/dist/admin/surfaces/feeds/feeds-detail.d.ts +3 -0
  203. package/dist/admin/surfaces/feeds/feeds-detail.d.ts.map +1 -0
  204. package/dist/admin/surfaces/feeds/feeds-detail.js +36 -0
  205. package/dist/admin/surfaces/feeds/feeds-detail.js.map +1 -0
  206. package/dist/admin/surfaces/feeds/feeds-list.d.ts +3 -0
  207. package/dist/admin/surfaces/feeds/feeds-list.d.ts.map +1 -0
  208. package/dist/admin/surfaces/feeds/feeds-list.js +49 -0
  209. package/dist/admin/surfaces/feeds/feeds-list.js.map +1 -0
  210. package/dist/admin/surfaces/feeds/feeds-new.d.ts +3 -0
  211. package/dist/admin/surfaces/feeds/feeds-new.d.ts.map +1 -0
  212. package/dist/admin/surfaces/feeds/feeds-new.js +7 -0
  213. package/dist/admin/surfaces/feeds/feeds-new.js.map +1 -0
  214. package/dist/admin/surfaces/forms/form-editor.d.ts +5 -0
  215. package/dist/admin/surfaces/forms/form-editor.d.ts.map +1 -0
  216. package/dist/admin/surfaces/forms/form-editor.js +59 -0
  217. package/dist/admin/surfaces/forms/form-editor.js.map +1 -0
  218. package/dist/admin/surfaces/forms/forms-data.d.ts +52 -0
  219. package/dist/admin/surfaces/forms/forms-data.d.ts.map +1 -0
  220. package/dist/admin/surfaces/forms/forms-data.js +106 -0
  221. package/dist/admin/surfaces/forms/forms-data.js.map +1 -0
  222. package/dist/admin/surfaces/forms/forms-edit.d.ts +3 -0
  223. package/dist/admin/surfaces/forms/forms-edit.d.ts.map +1 -0
  224. package/dist/admin/surfaces/forms/forms-edit.js +40 -0
  225. package/dist/admin/surfaces/forms/forms-edit.js.map +1 -0
  226. package/dist/admin/surfaces/forms/forms-list.d.ts +3 -0
  227. package/dist/admin/surfaces/forms/forms-list.d.ts.map +1 -0
  228. package/dist/admin/surfaces/forms/forms-list.js +53 -0
  229. package/dist/admin/surfaces/forms/forms-list.js.map +1 -0
  230. package/dist/admin/surfaces/forms/forms-new.d.ts +3 -0
  231. package/dist/admin/surfaces/forms/forms-new.d.ts.map +1 -0
  232. package/dist/admin/surfaces/forms/forms-new.js +7 -0
  233. package/dist/admin/surfaces/forms/forms-new.js.map +1 -0
  234. package/dist/admin/surfaces/forms/forms-submissions.d.ts +3 -0
  235. package/dist/admin/surfaces/forms/forms-submissions.d.ts.map +1 -0
  236. package/dist/admin/surfaces/forms/forms-submissions.js +125 -0
  237. package/dist/admin/surfaces/forms/forms-submissions.js.map +1 -0
  238. package/dist/admin/surfaces/layouts/layout-editor-client.d.ts +8 -0
  239. package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -0
  240. package/dist/admin/surfaces/layouts/layout-editor-client.js +77 -0
  241. package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -0
  242. package/dist/admin/surfaces/layouts/layouts-data.d.ts +53 -0
  243. package/dist/admin/surfaces/layouts/layouts-data.d.ts.map +1 -0
  244. package/dist/admin/surfaces/layouts/layouts-data.js +61 -0
  245. package/dist/admin/surfaces/layouts/layouts-data.js.map +1 -0
  246. package/dist/admin/surfaces/layouts/layouts-detail.d.ts +3 -0
  247. package/dist/admin/surfaces/layouts/layouts-detail.d.ts.map +1 -0
  248. package/dist/admin/surfaces/layouts/layouts-detail.js +38 -0
  249. package/dist/admin/surfaces/layouts/layouts-detail.js.map +1 -0
  250. package/dist/admin/surfaces/layouts/layouts-list.d.ts +3 -0
  251. package/dist/admin/surfaces/layouts/layouts-list.d.ts.map +1 -0
  252. package/dist/admin/surfaces/layouts/layouts-list.js +62 -0
  253. package/dist/admin/surfaces/layouts/layouts-list.js.map +1 -0
  254. package/dist/admin/surfaces/layouts/layouts-new.d.ts +3 -0
  255. package/dist/admin/surfaces/layouts/layouts-new.d.ts.map +1 -0
  256. package/dist/admin/surfaces/layouts/layouts-new.js +7 -0
  257. package/dist/admin/surfaces/layouts/layouts-new.js.map +1 -0
  258. package/dist/admin/surfaces/login.d.ts +20 -0
  259. package/dist/admin/surfaces/login.d.ts.map +1 -0
  260. package/dist/admin/surfaces/login.js +92 -0
  261. package/dist/admin/surfaces/login.js.map +1 -0
  262. package/dist/admin/surfaces/media/library.d.ts +3 -0
  263. package/dist/admin/surfaces/media/library.d.ts.map +1 -0
  264. package/dist/admin/surfaces/media/library.js +7 -0
  265. package/dist/admin/surfaces/media/library.js.map +1 -0
  266. package/dist/admin/surfaces/media/media-client.d.ts +4 -0
  267. package/dist/admin/surfaces/media/media-client.d.ts.map +1 -0
  268. package/dist/admin/surfaces/media/media-client.js +203 -0
  269. package/dist/admin/surfaces/media/media-client.js.map +1 -0
  270. package/dist/admin/surfaces/media/upload.d.ts +3 -0
  271. package/dist/admin/surfaces/media/upload.d.ts.map +1 -0
  272. package/dist/admin/surfaces/media/upload.js +7 -0
  273. package/dist/admin/surfaces/media/upload.js.map +1 -0
  274. package/dist/admin/surfaces/plugins/plugins-data.d.ts +37 -0
  275. package/dist/admin/surfaces/plugins/plugins-data.d.ts.map +1 -0
  276. package/dist/admin/surfaces/plugins/plugins-data.js +31 -0
  277. package/dist/admin/surfaces/plugins/plugins-data.js.map +1 -0
  278. package/dist/admin/surfaces/plugins/plugins-index.d.ts +3 -0
  279. package/dist/admin/surfaces/plugins/plugins-index.d.ts.map +1 -0
  280. package/dist/admin/surfaces/plugins/plugins-index.js +72 -0
  281. package/dist/admin/surfaces/plugins/plugins-index.js.map +1 -0
  282. package/dist/admin/surfaces/search/search-index.d.ts +3 -0
  283. package/dist/admin/surfaces/search/search-index.d.ts.map +1 -0
  284. package/dist/admin/surfaces/search/search-index.js +76 -0
  285. package/dist/admin/surfaces/search/search-index.js.map +1 -0
  286. package/dist/admin/surfaces/settings/admin-features.d.ts +3 -0
  287. package/dist/admin/surfaces/settings/admin-features.d.ts.map +1 -0
  288. package/dist/admin/surfaces/settings/admin-features.js +138 -0
  289. package/dist/admin/surfaces/settings/admin-features.js.map +1 -0
  290. package/dist/admin/surfaces/settings/settings-ax.d.ts +3 -0
  291. package/dist/admin/surfaces/settings/settings-ax.d.ts.map +1 -0
  292. package/dist/admin/surfaces/settings/settings-ax.js +63 -0
  293. package/dist/admin/surfaces/settings/settings-ax.js.map +1 -0
  294. package/dist/admin/surfaces/settings/settings-cache.d.ts +3 -0
  295. package/dist/admin/surfaces/settings/settings-cache.d.ts.map +1 -0
  296. package/dist/admin/surfaces/settings/settings-cache.js +64 -0
  297. package/dist/admin/surfaces/settings/settings-cache.js.map +1 -0
  298. package/dist/admin/surfaces/settings/settings-email.d.ts +3 -0
  299. package/dist/admin/surfaces/settings/settings-email.d.ts.map +1 -0
  300. package/dist/admin/surfaces/settings/settings-email.js +89 -0
  301. package/dist/admin/surfaces/settings/settings-email.js.map +1 -0
  302. package/dist/admin/surfaces/settings/settings-general.d.ts +3 -0
  303. package/dist/admin/surfaces/settings/settings-general.d.ts.map +1 -0
  304. package/dist/admin/surfaces/settings/settings-general.js +91 -0
  305. package/dist/admin/surfaces/settings/settings-general.js.map +1 -0
  306. package/dist/admin/surfaces/settings/settings-site.d.ts +3 -0
  307. package/dist/admin/surfaces/settings/settings-site.d.ts.map +1 -0
  308. package/dist/admin/surfaces/settings/settings-site.js +14 -0
  309. package/dist/admin/surfaces/settings/settings-site.js.map +1 -0
  310. package/dist/admin/surfaces/settings/settings-sites.d.ts +3 -0
  311. package/dist/admin/surfaces/settings/settings-sites.d.ts.map +1 -0
  312. package/dist/admin/surfaces/settings/settings-sites.js +134 -0
  313. package/dist/admin/surfaces/settings/settings-sites.js.map +1 -0
  314. package/dist/admin/surfaces/settings/states.d.ts +33 -0
  315. package/dist/admin/surfaces/settings/states.d.ts.map +1 -0
  316. package/dist/admin/surfaces/settings/states.js +33 -0
  317. package/dist/admin/surfaces/settings/states.js.map +1 -0
  318. package/dist/admin/surfaces/taxonomy/categories.d.ts +3 -0
  319. package/dist/admin/surfaces/taxonomy/categories.d.ts.map +1 -0
  320. package/dist/admin/surfaces/taxonomy/categories.js +162 -0
  321. package/dist/admin/surfaces/taxonomy/categories.js.map +1 -0
  322. package/dist/admin/surfaces/taxonomy/tags.d.ts +3 -0
  323. package/dist/admin/surfaces/taxonomy/tags.d.ts.map +1 -0
  324. package/dist/admin/surfaces/taxonomy/tags.js +112 -0
  325. package/dist/admin/surfaces/taxonomy/tags.js.map +1 -0
  326. package/dist/admin/surfaces/taxonomy/taxonomy-ui.d.ts +39 -0
  327. package/dist/admin/surfaces/taxonomy/taxonomy-ui.d.ts.map +1 -0
  328. package/dist/admin/surfaces/taxonomy/taxonomy-ui.js +66 -0
  329. package/dist/admin/surfaces/taxonomy/taxonomy-ui.js.map +1 -0
  330. package/dist/admin/surfaces/translations/states.d.ts +10 -0
  331. package/dist/admin/surfaces/translations/states.d.ts.map +1 -0
  332. package/dist/admin/surfaces/translations/states.js +11 -0
  333. package/dist/admin/surfaces/translations/states.js.map +1 -0
  334. package/dist/admin/surfaces/translations/translations-index.d.ts +3 -0
  335. package/dist/admin/surfaces/translations/translations-index.d.ts.map +1 -0
  336. package/dist/admin/surfaces/translations/translations-index.js +99 -0
  337. package/dist/admin/surfaces/translations/translations-index.js.map +1 -0
  338. package/dist/admin/surfaces/trash/trash-index.d.ts +3 -0
  339. package/dist/admin/surfaces/trash/trash-index.d.ts.map +1 -0
  340. package/dist/admin/surfaces/trash/trash-index.js +96 -0
  341. package/dist/admin/surfaces/trash/trash-index.js.map +1 -0
  342. package/dist/admin/surfaces/users/users-data.d.ts +51 -0
  343. package/dist/admin/surfaces/users/users-data.d.ts.map +1 -0
  344. package/dist/admin/surfaces/users/users-data.js +60 -0
  345. package/dist/admin/surfaces/users/users-data.js.map +1 -0
  346. package/dist/admin/surfaces/users/users-detail.d.ts +3 -0
  347. package/dist/admin/surfaces/users/users-detail.d.ts.map +1 -0
  348. package/dist/admin/surfaces/users/users-detail.js +148 -0
  349. package/dist/admin/surfaces/users/users-detail.js.map +1 -0
  350. package/dist/admin/surfaces/users/users-groups.d.ts +3 -0
  351. package/dist/admin/surfaces/users/users-groups.d.ts.map +1 -0
  352. package/dist/admin/surfaces/users/users-groups.js +136 -0
  353. package/dist/admin/surfaces/users/users-groups.js.map +1 -0
  354. package/dist/admin/surfaces/users/users-list.d.ts +3 -0
  355. package/dist/admin/surfaces/users/users-list.d.ts.map +1 -0
  356. package/dist/admin/surfaces/users/users-list.js +119 -0
  357. package/dist/admin/surfaces/users/users-list.js.map +1 -0
  358. package/dist/admin/surfaces/users/users-new.d.ts +3 -0
  359. package/dist/admin/surfaces/users/users-new.d.ts.map +1 -0
  360. package/dist/admin/surfaces/users/users-new.js +78 -0
  361. package/dist/admin/surfaces/users/users-new.js.map +1 -0
  362. package/dist/admin/surfaces/users/users-permissions.d.ts +3 -0
  363. package/dist/admin/surfaces/users/users-permissions.d.ts.map +1 -0
  364. package/dist/admin/surfaces/users/users-permissions.js +135 -0
  365. package/dist/admin/surfaces/users/users-permissions.js.map +1 -0
  366. package/dist/admin/surfaces/webServices/api-keys.d.ts +3 -0
  367. package/dist/admin/surfaces/webServices/api-keys.d.ts.map +1 -0
  368. package/dist/admin/surfaces/webServices/api-keys.js +65 -0
  369. package/dist/admin/surfaces/webServices/api-keys.js.map +1 -0
  370. package/dist/admin/surfaces/webServices/oauth.d.ts +3 -0
  371. package/dist/admin/surfaces/webServices/oauth.d.ts.map +1 -0
  372. package/dist/admin/surfaces/webServices/oauth.js +75 -0
  373. package/dist/admin/surfaces/webServices/oauth.js.map +1 -0
  374. package/dist/admin/surfaces/webServices/secret-reveal-modal.d.ts +8 -0
  375. package/dist/admin/surfaces/webServices/secret-reveal-modal.d.ts.map +1 -0
  376. package/dist/admin/surfaces/webServices/secret-reveal-modal.js +30 -0
  377. package/dist/admin/surfaces/webServices/secret-reveal-modal.js.map +1 -0
  378. package/dist/admin/surfaces/webServices/web-services-data.d.ts +38 -0
  379. package/dist/admin/surfaces/webServices/web-services-data.d.ts.map +1 -0
  380. package/dist/admin/surfaces/webServices/web-services-data.js +52 -0
  381. package/dist/admin/surfaces/webServices/web-services-data.js.map +1 -0
  382. package/dist/api/admin-features-routes.d.ts +10 -0
  383. package/dist/api/admin-features-routes.d.ts.map +1 -0
  384. package/dist/api/admin-features-routes.js +61 -0
  385. package/dist/api/admin-features-routes.js.map +1 -0
  386. package/dist/api/graphql/resolvers.d.ts +6 -6
  387. package/dist/api/index.d.ts.map +1 -1
  388. package/dist/api/index.js +2 -0
  389. package/dist/api/index.js.map +1 -1
  390. package/dist/config/define.d.ts +22 -1
  391. package/dist/config/define.d.ts.map +1 -1
  392. package/dist/config/define.js +44 -0
  393. package/dist/config/define.js.map +1 -1
  394. package/dist/config/parse.d.ts.map +1 -1
  395. package/dist/config/parse.js +8 -2
  396. package/dist/config/parse.js.map +1 -1
  397. package/dist/config/types.d.ts +60 -1
  398. package/dist/config/types.d.ts.map +1 -1
  399. package/dist/config/types.js +20 -1
  400. package/dist/config/types.js.map +1 -1
  401. package/dist/config/validate.d.ts.map +1 -1
  402. package/dist/config/validate.js +60 -0
  403. package/dist/config/validate.js.map +1 -1
  404. package/dist/db/admin-features-queries.d.ts +29 -0
  405. package/dist/db/admin-features-queries.d.ts.map +1 -0
  406. package/dist/db/admin-features-queries.js +46 -0
  407. package/dist/db/admin-features-queries.js.map +1 -0
  408. package/dist/db/analytics-queries.d.ts +2 -2
  409. package/dist/db/audit-queries.d.ts +3 -3
  410. package/dist/db/category-queries.d.ts +6 -6
  411. package/dist/db/changeset-audit-queries.d.ts +2 -2
  412. package/dist/db/changeset-queries.d.ts +8 -8
  413. package/dist/db/extension-queries.d.ts +17 -17
  414. package/dist/db/feed-queries.d.ts +6 -6
  415. package/dist/db/media-queries.d.ts +12 -12
  416. package/dist/db/site-admin-queries.d.ts +1 -1
  417. package/dist/db/site-queries.d.ts +3 -3
  418. package/dist/db/tag-queries.d.ts +4 -4
  419. package/dist/db/webhook-queries.d.ts +8 -8
  420. package/dist/db/workflow-queries.d.ts +5 -5
  421. package/dist/experiments/schema.d.ts +1 -1
  422. package/dist/host-client/index.d.ts +1 -0
  423. package/dist/host-client/index.d.ts.map +1 -1
  424. package/dist/host-client/index.js +4 -0
  425. package/dist/host-client/index.js.map +1 -1
  426. package/dist/host-client/json.d.ts +36 -0
  427. package/dist/host-client/json.d.ts.map +1 -0
  428. package/dist/host-client/json.js +106 -0
  429. package/dist/host-client/json.js.map +1 -0
  430. package/dist/layout/modules-extended.d.ts.map +1 -1
  431. package/dist/layout/modules-extended.js +9 -8
  432. package/dist/layout/modules-extended.js.map +1 -1
  433. package/dist/layout/modules.js +5 -5
  434. package/dist/layout/modules.js.map +1 -1
  435. package/dist/schema/base.d.ts +1 -1
  436. package/dist/scope/breadcrumbs.d.ts.map +1 -1
  437. package/dist/scope/breadcrumbs.js +4 -1
  438. package/dist/scope/breadcrumbs.js.map +1 -1
  439. package/dist/scope/head-foot.d.ts +12 -4
  440. package/dist/scope/head-foot.d.ts.map +1 -1
  441. package/dist/scope/head-foot.js +14 -6
  442. package/dist/scope/head-foot.js.map +1 -1
  443. package/dist/scope/jsonld.d.ts.map +1 -1
  444. package/dist/scope/jsonld.js +1 -11
  445. package/dist/scope/jsonld.js.map +1 -1
  446. package/dist/scope/kywi-form.d.ts.map +1 -1
  447. package/dist/scope/kywi-form.js +3 -3
  448. package/dist/scope/kywi-form.js.map +1 -1
  449. package/dist/scope/kywi-wizard-form.d.ts.map +1 -1
  450. package/dist/scope/kywi-wizard-form.js +3 -3
  451. package/dist/scope/kywi-wizard-form.js.map +1 -1
  452. package/dist/scope/rendering.d.ts.map +1 -1
  453. package/dist/scope/rendering.js +7 -6
  454. package/dist/scope/rendering.js.map +1 -1
  455. package/dist/util/jsonld.d.ts +13 -0
  456. package/dist/util/jsonld.d.ts.map +1 -0
  457. package/dist/util/jsonld.js +15 -0
  458. package/dist/util/jsonld.js.map +1 -0
  459. package/dist/util/sanitize.d.ts +6 -0
  460. package/dist/util/sanitize.d.ts.map +1 -0
  461. package/dist/util/sanitize.js +156 -0
  462. package/dist/util/sanitize.js.map +1 -0
  463. package/package.json +12 -3
@@ -0,0 +1,121 @@
1
+ import { ADMIN_FEATURES_SURFACE_ID } from '../config/types.js';
2
+ import { resolveAdminConfig } from '../config/define.js';
3
+ /** Project one `FieldDefinition` to its client-safe subset, recursing group sub-fields. */
4
+ function toAdminRuntimeField(f) {
5
+ const rf = { name: f.name, type: f.type, label: f.label };
6
+ if (f.required !== undefined)
7
+ rf.required = f.required;
8
+ if (f.options !== undefined)
9
+ rf.options = [...f.options];
10
+ if (f.relatedType !== undefined)
11
+ rf.relatedType = f.relatedType;
12
+ if (f.defaultValue !== undefined)
13
+ rf.defaultValue = f.defaultValue;
14
+ if (f.validation !== undefined) {
15
+ // Copy ONLY the known declarative members — never spread an unknown-shaped
16
+ // object into the client projection.
17
+ const v = {};
18
+ if (f.validation.min !== undefined)
19
+ v.min = f.validation.min;
20
+ if (f.validation.max !== undefined)
21
+ v.max = f.validation.max;
22
+ if (f.validation.minLength !== undefined)
23
+ v.minLength = f.validation.minLength;
24
+ if (f.validation.maxLength !== undefined)
25
+ v.maxLength = f.validation.maxLength;
26
+ if (f.validation.pattern !== undefined)
27
+ v.pattern = f.validation.pattern;
28
+ rf.validation = v;
29
+ }
30
+ if (f.source !== undefined)
31
+ rf.source = f.source;
32
+ if (f.fields !== undefined)
33
+ rf.fields = f.fields.map(toAdminRuntimeField);
34
+ // NOTE: `access` (FieldAccessConfig) is intentionally NOT copied — it is
35
+ // function-valued and the server enforces field ACLs anyway.
36
+ return rf;
37
+ }
38
+ /** Project the media config to its display-safe subset — provider + size knobs only, never S3 credentials/bucket/endpoint or localPath. */
39
+ function toAdminRuntimeMedia(media) {
40
+ const out = { provider: media.provider };
41
+ if (media.maxUploadSizeMb !== undefined)
42
+ out.maxUploadSizeMb = media.maxUploadSizeMb;
43
+ if (media.imageSizes !== undefined) {
44
+ const sizes = {};
45
+ for (const [key, cfg] of Object.entries(media.imageSizes)) {
46
+ const size = { width: cfg.width };
47
+ if (cfg.height !== undefined)
48
+ size.height = cfg.height;
49
+ if (cfg.fit !== undefined)
50
+ size.fit = cfg.fit;
51
+ sizes[key] = size;
52
+ }
53
+ out.imageSizes = sizes;
54
+ }
55
+ return out;
56
+ }
57
+ /**
58
+ * Build the secret-free `AdminRuntimeConfig` from a full `KywiConfig`. Calls
59
+ * `resolveAdminConfig` itself (rather than trusting `config.admin` to already
60
+ * be resolved) so this stays correct even if a caller hand-builds a
61
+ * `KywiConfig` object literal instead of going through `defineKywiConfig`.
62
+ */
63
+ export function toAdminRuntimeConfig(config) {
64
+ const cache = { provider: config.cache.provider };
65
+ if (config.cache.defaultTtl !== undefined)
66
+ cache.defaultTtl = config.cache.defaultTtl;
67
+ return {
68
+ mode: config.mode,
69
+ admin: resolveAdminConfig(config.admin),
70
+ contentTypes: config.contentTypes.map(ct => {
71
+ const runtime = {
72
+ name: ct.name,
73
+ label: ct.label,
74
+ baseType: ct.baseType,
75
+ };
76
+ if (ct.pluralLabel !== undefined)
77
+ runtime.pluralLabel = ct.pluralLabel;
78
+ if (ct.icon !== undefined)
79
+ runtime.icon = ct.icon;
80
+ runtime.fields = ct.fields.map(toAdminRuntimeField);
81
+ return runtime;
82
+ }),
83
+ sites: config.sites.map(s => {
84
+ const runtime = {
85
+ id: s.id,
86
+ name: s.name,
87
+ domain: s.domain,
88
+ defaultLocale: s.defaultLocale,
89
+ theme: s.theme,
90
+ };
91
+ if (s.locales !== undefined)
92
+ runtime.locales = s.locales;
93
+ return runtime;
94
+ }),
95
+ overview: {
96
+ db: { provider: config.db.provider },
97
+ auth: { providers: [...config.auth.providers] },
98
+ media: toAdminRuntimeMedia(config.media),
99
+ cache,
100
+ themes: config.themes.map(t => ({
101
+ name: t.name,
102
+ regions: t.regions.map(r => ({ name: r.name })),
103
+ })),
104
+ },
105
+ };
106
+ }
107
+ // Re-exported for T16: the stable id of the superAdmin "Admin Features"
108
+ // surface that must stay reachable even when the `settings` area is
109
+ // disabled — see the full contract documented on the constant in
110
+ // `config/types.ts`.
111
+ export { ADMIN_FEATURES_SURFACE_ID };
112
+ // Re-exported for T18: the generated `/admin` catch-all page is a server
113
+ // component that pre-checks the matched surface against the CONFIG CEILING and
114
+ // calls Next's `notFound()` for a real HTTP 404 on unknown/config-disabled
115
+ // paths (plan §1.1, §49). It surfaces here — rather than the host importing the
116
+ // client-heavy `@kywi-software/core/admin` index — so the pure, `next`-free
117
+ // matcher can be used from a server component without pulling any client
118
+ // component into the server graph. `runtime.admin` (a `ResolvedAdminConfig`) is
119
+ // a valid `AdminConfigCeiling`.
120
+ export { resolveSurface } from './surface-matcher.js';
121
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/admin/server.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,36 @@
1
1
  import React from 'react';
2
2
  import type { KywiConfig } from '../config/types.js';
3
+ import type { KywiRole } from '../auth/roles.js';
4
+ import { type AdminNavItem } from './nav.js';
5
+ import type { AdminFeatureFlags } from './registry.js';
3
6
  interface AdminShellProps {
7
+ /**
8
+ * Config source for nav derivation. `buildAdminNav` only ever reads `.admin`
9
+ * (the config ceiling), so a caller that has just the secret-free projection
10
+ * may pass a minimal `{ admin }` shim instead of a full `KywiConfig` — that is
11
+ * exactly what `AdminChrome` does with `runtime.admin` so the full config never
12
+ * crosses into the client. The reference `AdminShellWrapper` still passes its
13
+ * full `KywiConfig` unchanged (back-compat).
14
+ */
4
15
  config: KywiConfig;
16
+ /**
17
+ * Signed-in user's role — when provided, filters nav to the surfaces the user
18
+ * can reach. Optional/additive: omitting it preserves the previous
19
+ * config-ceiling-only nav (the reference wrapper passes no role).
20
+ */
21
+ role?: KywiRole | undefined;
22
+ /** Runtime feature flags (T16). Omitted ⇒ no flag filtering. */
23
+ flags?: AdminFeatureFlags | undefined;
24
+ /**
25
+ * Plugin-contributed nav items (T17, from `GET /plugins/nav`). Rendered as
26
+ * an additional "Plugins" section beneath the core nav, reusing `NavItem` so
27
+ * markup/classes match the core sections exactly. Omitted/empty ⇒ no
28
+ * section rendered (back-compat with callers that don't fetch plugin nav).
29
+ */
30
+ pluginNav?: AdminNavItem[] | undefined;
5
31
  currentPath: string;
6
32
  children: React.ReactNode;
7
33
  }
8
- export declare function AdminShell({ config, currentPath, children }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
34
+ export declare function AdminShell({ config, role, flags, pluginNav, currentPath, children }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
9
35
  export {};
10
36
  //# sourceMappingURL=shell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAGpD,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAqBD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAiD5E"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,UAAU,eAAe;IACvB;;;;;;;OAOG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC3B,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;IACrC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAA;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAqBD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA2DpG"}
@@ -1,18 +1,24 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useEffect } from 'react';
4
4
  import { buildAdminNav } from './nav.js';
5
5
  function NavItem({ item, currentPath, depth = 0 }) {
6
6
  const isActive = currentPath === item.href || currentPath.startsWith(item.href + '/');
7
7
  return (_jsxs("li", { className: "kywi-nav-item", "data-active": isActive, children: [_jsx("a", { href: item.href, className: `kywi-nav-link ${isActive ? 'kywi-nav-active' : ''}`, style: { paddingLeft: `${(depth + 1) * 16}px` }, children: item.label }), item.children && item.children.length > 0 && (_jsx("ul", { className: "kywi-nav-children", children: item.children.map(child => (_jsx(NavItem, { item: child, currentPath: currentPath, depth: depth + 1 }, child.href))) }))] }));
8
8
  }
9
- export function AdminShell({ config, currentPath, children }) {
10
- const nav = buildAdminNav(config);
9
+ export function AdminShell({ config, role, flags, pluginNav, currentPath, children }) {
10
+ // Role/flags (when provided) narrow the derived tree beyond the config ceiling.
11
+ const opts = {};
12
+ if (role !== undefined)
13
+ opts.role = role;
14
+ if (flags !== undefined)
15
+ opts.flags = flags;
16
+ const nav = buildAdminNav(config, opts);
11
17
  // Below the responsive breakpoint the sidebar is an off-canvas drawer toggled
12
18
  // by the topbar hamburger; on desktop these controls are hidden by CSS and the
13
19
  // sidebar is always visible. Close the drawer whenever the route changes.
14
20
  const [sidebarOpen, setSidebarOpen] = useState(false);
15
21
  useEffect(() => { setSidebarOpen(false); }, [currentPath]);
16
- return (_jsxs("div", { className: "kywi-admin-shell", "data-sidebar-open": sidebarOpen ? 'true' : 'false', children: [_jsx("button", { type: "button", className: "kywi-admin-scrim", "aria-label": "Close navigation", tabIndex: sidebarOpen ? 0 : -1, onClick: () => setSidebarOpen(false) }), _jsx("aside", { id: "kywi-admin-sidebar", className: "kywi-admin-sidebar", children: _jsxs("div", { className: "kywi-admin-sidebar-sticky", children: [_jsx("div", { className: "kywi-admin-logo", children: _jsx("a", { href: "/admin/dashboard", children: "Kywi Admin" }) }), _jsx("nav", { className: "kywi-admin-nav", children: _jsx("ul", { children: nav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) }) })] }) }), _jsxs("main", { className: "kywi-admin-main", children: [_jsxs("div", { className: "kywi-admin-mobile-bar", children: [_jsxs("button", { type: "button", className: "kywi-admin-hamburger", "aria-label": "Open navigation", "aria-controls": "kywi-admin-sidebar", "aria-expanded": sidebarOpen, onClick: () => setSidebarOpen(open => !open), children: [_jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" })] }), _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-mobile-brand", children: "Kywi Admin" })] }), children] })] }));
22
+ return (_jsxs("div", { className: "kywi-admin-shell", "data-sidebar-open": sidebarOpen ? 'true' : 'false', children: [_jsx("button", { type: "button", className: "kywi-admin-scrim", "aria-label": "Close navigation", tabIndex: sidebarOpen ? 0 : -1, onClick: () => setSidebarOpen(false) }), _jsx("aside", { id: "kywi-admin-sidebar", className: "kywi-admin-sidebar", children: _jsxs("div", { className: "kywi-admin-sidebar-sticky", children: [_jsx("div", { className: "kywi-admin-logo", children: _jsx("a", { href: "/admin/dashboard", children: "Kywi Admin" }) }), _jsxs("nav", { className: "kywi-admin-nav", children: [_jsx("ul", { children: nav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) }), pluginNav && pluginNav.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "kywi-admin-nav-section-label", children: "Plugins" }), _jsx("ul", { children: pluginNav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) })] }))] })] }) }), _jsxs("main", { className: "kywi-admin-main", children: [_jsxs("div", { className: "kywi-admin-mobile-bar", children: [_jsxs("button", { type: "button", className: "kywi-admin-hamburger", "aria-label": "Open navigation", "aria-controls": "kywi-admin-sidebar", "aria-expanded": sidebarOpen, onClick: () => setSidebarOpen(open => !open), children: [_jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" })] }), _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-mobile-brand", children: "Kywi Admin" })] }), children] })] }));
17
23
  }
18
24
  //# sourceMappingURL=shell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"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"}
@@ -349,6 +349,15 @@
349
349
  border-radius: var(--kywi-radius-pill);
350
350
  background: var(--kywi-sidebar-accent);
351
351
  }
352
+ .kywi-admin-nav-section-label {
353
+ padding: var(--kywi-space-3) var(--kywi-space-3) 4px;
354
+ font-size: var(--kywi-text-xs);
355
+ font-weight: var(--kywi-weight-semibold);
356
+ letter-spacing: var(--kywi-tracking-tight);
357
+ text-transform: uppercase;
358
+ color: var(--kywi-sidebar-fg-muted);
359
+ opacity: 0.7;
360
+ }
352
361
  .kywi-admin-sidebar .kywi-nav-children { margin: 1px 0 var(--kywi-space-1); }
353
362
  .kywi-admin-sidebar .kywi-nav-children .kywi-nav-link { font-size: var(--kywi-text-xs); padding-top: 5px; padding-bottom: 5px; }
354
363
  .kywi-admin-sidebar :focus-visible { box-shadow: 0 0 0 2px var(--kywi-sidebar-accent); }
@@ -361,6 +370,21 @@
361
370
  background: var(--kywi-bg);
362
371
  }
363
372
 
373
+ /* T14: core 404 / 403 surface fallbacks (KywiAdminApp SurfaceNotFound/Forbidden). */
374
+ .kywi-admin-surface-message {
375
+ max-width: 32rem;
376
+ margin: var(--kywi-space-10) auto;
377
+ text-align: center;
378
+ color: var(--kywi-text);
379
+ }
380
+ .kywi-admin-surface-message h1 {
381
+ margin-bottom: var(--kywi-space-3);
382
+ }
383
+ .kywi-admin-surface-message p {
384
+ margin-bottom: var(--kywi-space-3);
385
+ color: var(--kywi-text-muted, var(--kywi-text));
386
+ }
387
+
364
388
  .kywi-admin-topbar {
365
389
  display: flex;
366
390
  justify-content: flex-end;
@@ -0,0 +1,51 @@
1
+ import { type KywiRole } from '../auth/roles.js';
2
+ import { type AdminSurface, type AdminConfigCeiling, type AdminFeatureFlags } from './registry.js';
3
+ export interface SurfaceMatch {
4
+ surface: AdminSurface;
5
+ params: Record<string, string>;
6
+ }
7
+ /**
8
+ * Match admin path segments (already stripped of the `/admin` prefix) to a
9
+ * surface. Empty segments (`/admin`) resolve to the index surface (dashboard).
10
+ * Config/flag/role gating is NOT applied here — see `resolveSurface` /
11
+ * `isSurfaceEnabled`. Returns null for no match.
12
+ */
13
+ export declare function matchSurface(segments: string[]): SurfaceMatch | null;
14
+ /**
15
+ * The precedence gate: a surface is enabled iff it passes the config ceiling
16
+ * (hard) AND the runtime flag (soft) AND the role check — each optional and
17
+ * skipped when its argument is omitted.
18
+ *
19
+ * effective = config ceiling ∧ runtime flag ∧ hasMinRole(role, surface.minRole)
20
+ *
21
+ * Config-off beats runtime/role-on; a runtime-off never resurrects a config-off.
22
+ * (Runtime flags param is the T16 placeholder; full storage lands in T16.)
23
+ */
24
+ export declare function isSurfaceEnabled(surface: AdminSurface, adminConfig?: AdminConfigCeiling, flags?: AdminFeatureFlags, role?: KywiRole): boolean;
25
+ /**
26
+ * Match segments then apply the CONFIG CEILING only (the hard, server-side gate
27
+ * used by the generated catch-all to decide a real 404). Role/flags are soft,
28
+ * client-side gates and are intentionally not applied here. Returns null when
29
+ * unmatched or config-disabled.
30
+ *
31
+ * The Admin Features surface is exempt from the area/surface-level config
32
+ * denylist (escape hatch) — only the master `enabled: false` switch can 404 it.
33
+ */
34
+ export declare function resolveSurface(segments: string[], adminConfig?: AdminConfigCeiling): SurfaceMatch | null;
35
+ /**
36
+ * The visibility gate used by BOTH the nav derivation (`buildAdminNav`) and the
37
+ * router's client-side surface gate (`KywiAdminApp`): identical to
38
+ * `isSurfaceEnabled` for every ordinary surface, but with the Admin Features
39
+ * escape-hatch special-case folded in (T16).
40
+ *
41
+ * For the Admin Features surface:
42
+ * - the config-area (`features.settings`) and runtime flags NEVER hide it;
43
+ * - the master switch (`enabled: false`) still does;
44
+ * - the role gate still applies AND it is only ever shown to a CONFIRMED
45
+ * superAdmin — when `role` is omitted (e.g. the legacy reference nav that
46
+ * passes no role) it is hidden, so it never leaks into a role-agnostic nav.
47
+ *
48
+ * For every other surface this delegates to the frozen `isSurfaceEnabled`.
49
+ */
50
+ export declare function isSurfaceVisible(surface: AdminSurface, adminConfig?: AdminConfigCeiling, flags?: AdminFeatureFlags, role?: KywiRole): boolean;
51
+ //# sourceMappingURL=surface-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-matcher.d.ts","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AA+EtB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CASpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAeT;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CASxG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAOT"}
@@ -0,0 +1,181 @@
1
+ import { hasMinRole } from '../auth/roles.js';
2
+ import { ADMIN_SURFACES, ADMIN_INDEX_SURFACE_ID, } from './registry.js';
3
+ import { ADMIN_FEATURES_SURFACE_ID } from '../config/types.js';
4
+ function parsePattern(pattern) {
5
+ const raw = pattern.startsWith('/') ? pattern.slice(1) : pattern;
6
+ const parts = raw.split('/');
7
+ const catchAllIndex = parts.findIndex(p => p.startsWith('*'));
8
+ if (catchAllIndex >= 0) {
9
+ return { segments: parts.slice(0, catchAllIndex), catchAllParam: parts[catchAllIndex].slice(1) };
10
+ }
11
+ return { segments: parts };
12
+ }
13
+ function matchParsed(parsed, pathSegments) {
14
+ const { segments, catchAllParam } = parsed;
15
+ const params = {};
16
+ if (catchAllParam) {
17
+ if (pathSegments.length < segments.length)
18
+ return null;
19
+ for (let i = 0; i < segments.length; i++) {
20
+ const routeSeg = segments[i];
21
+ const pathSeg = pathSegments[i];
22
+ if (routeSeg.startsWith(':'))
23
+ params[routeSeg.slice(1)] = pathSeg;
24
+ else if (routeSeg !== pathSeg)
25
+ return null;
26
+ }
27
+ params[catchAllParam] = pathSegments.slice(segments.length).join('/');
28
+ return params;
29
+ }
30
+ if (segments.length !== pathSegments.length)
31
+ return null;
32
+ for (let i = 0; i < segments.length; i++) {
33
+ const routeSeg = segments[i];
34
+ const pathSeg = pathSegments[i];
35
+ if (routeSeg.startsWith(':'))
36
+ params[routeSeg.slice(1)] = pathSeg;
37
+ else if (routeSeg !== pathSeg)
38
+ return null;
39
+ }
40
+ return params;
41
+ }
42
+ /**
43
+ * Order two patterns most-specific → least-specific, matching
44
+ * `api/router.ts#compareRouteSpecificity`: (1) more fixed segments first;
45
+ * (2) at equal length a literal beats a `:param` left-to-right; (3) a
46
+ * non-catch-all beats an otherwise-equal catch-all.
47
+ */
48
+ function compareSpecificity(a, b) {
49
+ if (a.segments.length !== b.segments.length)
50
+ return b.segments.length - a.segments.length;
51
+ for (let i = 0; i < a.segments.length; i++) {
52
+ const aParam = a.segments[i].startsWith(':');
53
+ const bParam = b.segments[i].startsWith(':');
54
+ if (aParam !== bParam)
55
+ return aParam ? 1 : -1;
56
+ }
57
+ const aCatch = a.catchAllParam ? 1 : 0;
58
+ const bCatch = b.catchAllParam ? 1 : 0;
59
+ return aCatch - bCatch;
60
+ }
61
+ // Pre-parse + specificity-sort once at module load (surfaces are static).
62
+ const SORTED_PATTERNS = ADMIN_SURFACES.map(surface => {
63
+ const { segments, catchAllParam } = parsePattern(surface.pattern);
64
+ const parsed = { surface, segments };
65
+ if (catchAllParam !== undefined)
66
+ parsed.catchAllParam = catchAllParam;
67
+ return parsed;
68
+ }).sort(compareSpecificity);
69
+ const INDEX_SURFACE = ADMIN_SURFACES.find(s => s.id === ADMIN_INDEX_SURFACE_ID);
70
+ /**
71
+ * Match admin path segments (already stripped of the `/admin` prefix) to a
72
+ * surface. Empty segments (`/admin`) resolve to the index surface (dashboard).
73
+ * Config/flag/role gating is NOT applied here — see `resolveSurface` /
74
+ * `isSurfaceEnabled`. Returns null for no match.
75
+ */
76
+ export function matchSurface(segments) {
77
+ if (segments.length === 0) {
78
+ return INDEX_SURFACE ? { surface: INDEX_SURFACE, params: {} } : null;
79
+ }
80
+ for (const parsed of SORTED_PATTERNS) {
81
+ const params = matchParsed(parsed, segments);
82
+ if (params !== null)
83
+ return { surface: parsed.surface, params };
84
+ }
85
+ return null;
86
+ }
87
+ /**
88
+ * The precedence gate: a surface is enabled iff it passes the config ceiling
89
+ * (hard) AND the runtime flag (soft) AND the role check — each optional and
90
+ * skipped when its argument is omitted.
91
+ *
92
+ * effective = config ceiling ∧ runtime flag ∧ hasMinRole(role, surface.minRole)
93
+ *
94
+ * Config-off beats runtime/role-on; a runtime-off never resurrects a config-off.
95
+ * (Runtime flags param is the T16 placeholder; full storage lands in T16.)
96
+ */
97
+ export function isSurfaceEnabled(surface, adminConfig, flags, role) {
98
+ // config ceiling (hard)
99
+ if (adminConfig) {
100
+ if (adminConfig.enabled === false)
101
+ return false;
102
+ if (adminConfig.features && adminConfig.features[surface.area] === false)
103
+ return false;
104
+ if (adminConfig.disableSurfaces && adminConfig.disableSurfaces.includes(surface.id))
105
+ return false;
106
+ }
107
+ // runtime flag (soft) — missing entry = enabled
108
+ if (flags) {
109
+ if (flags[surface.id] === false)
110
+ return false;
111
+ if (flags[surface.area] === false)
112
+ return false;
113
+ }
114
+ // role
115
+ if (role !== undefined && !hasMinRole(role, surface.minRole))
116
+ return false;
117
+ return true;
118
+ }
119
+ /**
120
+ * The T16 self-lockout escape hatch (contract documented on
121
+ * `ADMIN_FEATURES_SURFACE_ID` in `config/types.ts`). The superAdmin "Admin
122
+ * Features" surface must stay reachable so a superAdmin can always undo a
123
+ * runtime lockout: disabling the `settings` AREA — at config time
124
+ * (`admin.features.settings = false`) OR at runtime (a `settings` /
125
+ * `settings.adminFeatures` flag = false) — must NOT hide THIS surface. Only the
126
+ * master switch (`admin.enabled = false`, i.e. a fully headless host) removes
127
+ * it, and the role gate (superAdmin) still applies. `admin.disableSurfaces`
128
+ * naming this id is already a config-validation hard error, so it need not be
129
+ * re-checked here.
130
+ */
131
+ function isAdminFeaturesSurface(surface) {
132
+ return surface.id === ADMIN_FEATURES_SURFACE_ID;
133
+ }
134
+ /**
135
+ * Match segments then apply the CONFIG CEILING only (the hard, server-side gate
136
+ * used by the generated catch-all to decide a real 404). Role/flags are soft,
137
+ * client-side gates and are intentionally not applied here. Returns null when
138
+ * unmatched or config-disabled.
139
+ *
140
+ * The Admin Features surface is exempt from the area/surface-level config
141
+ * denylist (escape hatch) — only the master `enabled: false` switch can 404 it.
142
+ */
143
+ export function resolveSurface(segments, adminConfig) {
144
+ const match = matchSurface(segments);
145
+ if (!match)
146
+ return null;
147
+ if (isAdminFeaturesSurface(match.surface)) {
148
+ if (adminConfig?.enabled === false)
149
+ return null;
150
+ return match;
151
+ }
152
+ if (!isSurfaceEnabled(match.surface, adminConfig))
153
+ return null;
154
+ return match;
155
+ }
156
+ /**
157
+ * The visibility gate used by BOTH the nav derivation (`buildAdminNav`) and the
158
+ * router's client-side surface gate (`KywiAdminApp`): identical to
159
+ * `isSurfaceEnabled` for every ordinary surface, but with the Admin Features
160
+ * escape-hatch special-case folded in (T16).
161
+ *
162
+ * For the Admin Features surface:
163
+ * - the config-area (`features.settings`) and runtime flags NEVER hide it;
164
+ * - the master switch (`enabled: false`) still does;
165
+ * - the role gate still applies AND it is only ever shown to a CONFIRMED
166
+ * superAdmin — when `role` is omitted (e.g. the legacy reference nav that
167
+ * passes no role) it is hidden, so it never leaks into a role-agnostic nav.
168
+ *
169
+ * For every other surface this delegates to the frozen `isSurfaceEnabled`.
170
+ */
171
+ export function isSurfaceVisible(surface, adminConfig, flags, role) {
172
+ if (isAdminFeaturesSurface(surface)) {
173
+ if (adminConfig?.enabled === false)
174
+ return false;
175
+ if (role === undefined)
176
+ return false;
177
+ return hasMinRole(role, surface.minRole);
178
+ }
179
+ return isSurfaceEnabled(surface, adminConfig, flags, role);
180
+ }
181
+ //# sourceMappingURL=surface-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-matcher.js","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ApprovalQueueItem } from '../../approval-queue.js';
2
+ /** A queue item plus the content-type name needed to build the transition URL. */
3
+ export interface ApprovalItem extends ApprovalQueueItem {
4
+ contentTypeName: string;
5
+ }
6
+ /**
7
+ * Load the pending queue. Submitter ids and the site id are resolved to human
8
+ * names via the users/sites lists when available; a failed/forbidden lookup
9
+ * degrades to the raw id so the queue still renders. (The Site column value
10
+ * doubles as its filter key, so resolving it in place keeps the filter human.)
11
+ */
12
+ export declare function loadApprovals(): Promise<ApprovalItem[]>;
13
+ /** Approve a submission: version + publish it via the engine workflow. */
14
+ export declare function approveSubmission(contentTypeName: string, id: string, comment?: string): Promise<void>;
15
+ /** Reject a submission back to draft, recording the comment as the reason. */
16
+ export declare function rejectSubmission(contentTypeName: string, id: string, comment?: string): Promise<void>;
17
+ //# sourceMappingURL=approvals-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAehE,kFAAkF;AAClF,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,eAAe,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAoB7D;AAED,0EAA0E;AAC1E,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,8EAA8E;AAC9E,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Data helpers for the Approvals surface (`/admin/approvals`) — 0.2.0 T6
3
+ * migration.
4
+ *
5
+ * Ported verbatim from `apps/reference/app/admin/approvals/approvals-data.ts`;
6
+ * only the import source changes: `getJson`/`sendJson`/`loadUserDisplayMap`/
7
+ * `loadSiteDisplayMap` now come directly from `@kywi-software/core/host-client`
8
+ * instead of the app's `lib/admin-api` re-export shim.
9
+ *
10
+ * Pending submissions come from GET /content/pending (editor+). Approving from
11
+ * the queue publishes in one engine transition (approve route with
12
+ * `{ publish: true }`) so the content is both versioned and made live.
13
+ * Rejecting sends it back to draft with the comment as the reason.
14
+ */
15
+ import { getJson, sendJson, loadUserDisplayMap, loadSiteDisplayMap } from '../../../host-client/index.js';
16
+ /**
17
+ * Load the pending queue. Submitter ids and the site id are resolved to human
18
+ * names via the users/sites lists when available; a failed/forbidden lookup
19
+ * degrades to the raw id so the queue still renders. (The Site column value
20
+ * doubles as its filter key, so resolving it in place keeps the filter human.)
21
+ */
22
+ export async function loadApprovals() {
23
+ const [rows, userMap, siteMap] = await Promise.all([
24
+ getJson('/api/v1/content/pending'),
25
+ loadUserDisplayMap(),
26
+ loadSiteDisplayMap(),
27
+ ]);
28
+ return rows.map(row => {
29
+ const submitterId = row.updatedBy ?? row.createdBy ?? '';
30
+ return {
31
+ id: row.id,
32
+ title: row.title,
33
+ contentType: row.contentTypeName,
34
+ contentTypeName: row.contentTypeName,
35
+ siteId: siteMap.get(row.siteId) ?? row.siteId,
36
+ submittedBy: userMap.get(submitterId) ?? submitterId,
37
+ submittedAt: row.updatedAt ?? row.createdAt,
38
+ status: 'pending',
39
+ };
40
+ });
41
+ }
42
+ /** Approve a submission: version + publish it via the engine workflow. */
43
+ export async function approveSubmission(contentTypeName, id, comment) {
44
+ await sendJson(`/api/v1/content/${contentTypeName}/${id}/approve`, 'POST', {
45
+ publish: true,
46
+ ...(comment ? { comment } : {}),
47
+ });
48
+ }
49
+ /** Reject a submission back to draft, recording the comment as the reason. */
50
+ export async function rejectSubmission(contentTypeName, id, comment) {
51
+ await sendJson(`/api/v1/content/${contentTypeName}/${id}/reject`, 'POST', {
52
+ ...(comment ? { reason: comment } : {}),
53
+ });
54
+ }
55
+ //# sourceMappingURL=approvals-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAqBzG;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,OAAO,CAAsB,yBAAyB,CAAC;QACvD,kBAAkB,EAAE;QACpB,kBAAkB,EAAE;KACrB,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACpB,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAA;QACxD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,eAAe;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM;YAC7C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW;YACpD,WAAW,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS;YAC3C,MAAM,EAAE,SAAkB;SAC3B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,eAAuB,EACvB,EAAU,EACV,OAAgB;IAEhB,MAAM,QAAQ,CAAC,mBAAmB,eAAe,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE;QACzE,OAAO,EAAE,IAAI;QACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,eAAuB,EACvB,EAAU,EACV,OAAgB;IAEhB,MAAM,QAAQ,CAAC,mBAAmB,eAAe,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE;QACxE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SurfaceProps } from '../../registry.js';
2
+ export default function ApprovalsIndexSurface(_props: SurfaceProps): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=approvals-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals-index.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-index.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,MAAM,EAAE,YAAY,2CAsFjE"}