@kywi-software/core 0.1.0 → 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 (467) 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/kywi-logo.d.ts +21 -0
  18. package/dist/admin/kywi-logo.d.ts.map +1 -0
  19. package/dist/admin/kywi-logo.js +123 -0
  20. package/dist/admin/kywi-logo.js.map +1 -0
  21. package/dist/admin/nav.d.ts +21 -1
  22. package/dist/admin/nav.d.ts.map +1 -1
  23. package/dist/admin/nav.js +45 -88
  24. package/dist/admin/nav.js.map +1 -1
  25. package/dist/admin/primitives.d.ts +52 -0
  26. package/dist/admin/primitives.d.ts.map +1 -0
  27. package/dist/admin/primitives.js +78 -0
  28. package/dist/admin/primitives.js.map +1 -0
  29. package/dist/admin/registry.d.ts +130 -0
  30. package/dist/admin/registry.d.ts.map +1 -0
  31. package/dist/admin/registry.js +456 -0
  32. package/dist/admin/registry.js.map +1 -0
  33. package/dist/admin/server.d.ts +154 -0
  34. package/dist/admin/server.d.ts.map +1 -0
  35. package/dist/admin/server.js +121 -0
  36. package/dist/admin/server.js.map +1 -0
  37. package/dist/admin/shell.d.ts +27 -1
  38. package/dist/admin/shell.d.ts.map +1 -1
  39. package/dist/admin/shell.js +71 -6
  40. package/dist/admin/shell.js.map +1 -1
  41. package/dist/admin/styles/admin.css +113 -23
  42. package/dist/admin/surface-matcher.d.ts +51 -0
  43. package/dist/admin/surface-matcher.d.ts.map +1 -0
  44. package/dist/admin/surface-matcher.js +181 -0
  45. package/dist/admin/surface-matcher.js.map +1 -0
  46. package/dist/admin/surfaces/approvals/approvals-data.d.ts +17 -0
  47. package/dist/admin/surfaces/approvals/approvals-data.d.ts.map +1 -0
  48. package/dist/admin/surfaces/approvals/approvals-data.js +55 -0
  49. package/dist/admin/surfaces/approvals/approvals-data.js.map +1 -0
  50. package/dist/admin/surfaces/approvals/approvals-index.d.ts +3 -0
  51. package/dist/admin/surfaces/approvals/approvals-index.d.ts.map +1 -0
  52. package/dist/admin/surfaces/approvals/approvals-index.js +75 -0
  53. package/dist/admin/surfaces/approvals/approvals-index.js.map +1 -0
  54. package/dist/admin/surfaces/audiences/audiences-data.d.ts +107 -0
  55. package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -0
  56. package/dist/admin/surfaces/audiences/audiences-data.js +216 -0
  57. package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -0
  58. package/dist/admin/surfaces/audiences/audiences-detail.d.ts +3 -0
  59. package/dist/admin/surfaces/audiences/audiences-detail.d.ts.map +1 -0
  60. package/dist/admin/surfaces/audiences/audiences-detail.js +78 -0
  61. package/dist/admin/surfaces/audiences/audiences-detail.js.map +1 -0
  62. package/dist/admin/surfaces/audiences/audiences-edit.d.ts +3 -0
  63. package/dist/admin/surfaces/audiences/audiences-edit.d.ts.map +1 -0
  64. package/dist/admin/surfaces/audiences/audiences-edit.js +55 -0
  65. package/dist/admin/surfaces/audiences/audiences-edit.js.map +1 -0
  66. package/dist/admin/surfaces/audiences/audiences-fields.d.ts +3 -0
  67. package/dist/admin/surfaces/audiences/audiences-fields.d.ts.map +1 -0
  68. package/dist/admin/surfaces/audiences/audiences-fields.js +56 -0
  69. package/dist/admin/surfaces/audiences/audiences-fields.js.map +1 -0
  70. package/dist/admin/surfaces/audiences/audiences-list.d.ts +3 -0
  71. package/dist/admin/surfaces/audiences/audiences-list.d.ts.map +1 -0
  72. package/dist/admin/surfaces/audiences/audiences-list.js +50 -0
  73. package/dist/admin/surfaces/audiences/audiences-list.js.map +1 -0
  74. package/dist/admin/surfaces/audiences/audiences-new.d.ts +3 -0
  75. package/dist/admin/surfaces/audiences/audiences-new.d.ts.map +1 -0
  76. package/dist/admin/surfaces/audiences/audiences-new.js +54 -0
  77. package/dist/admin/surfaces/audiences/audiences-new.js.map +1 -0
  78. package/dist/admin/surfaces/audiences/audiences-preview-tokens.d.ts +3 -0
  79. package/dist/admin/surfaces/audiences/audiences-preview-tokens.d.ts.map +1 -0
  80. package/dist/admin/surfaces/audiences/audiences-preview-tokens.js +123 -0
  81. package/dist/admin/surfaces/audiences/audiences-preview-tokens.js.map +1 -0
  82. package/dist/admin/surfaces/audiences/audiences-selfid-widget.d.ts +3 -0
  83. package/dist/admin/surfaces/audiences/audiences-selfid-widget.d.ts.map +1 -0
  84. package/dist/admin/surfaces/audiences/audiences-selfid-widget.js +50 -0
  85. package/dist/admin/surfaces/audiences/audiences-selfid-widget.js.map +1 -0
  86. package/dist/admin/surfaces/audiences/audiences-test.d.ts +3 -0
  87. package/dist/admin/surfaces/audiences/audiences-test.d.ts.map +1 -0
  88. package/dist/admin/surfaces/audiences/audiences-test.js +39 -0
  89. package/dist/admin/surfaces/audiences/audiences-test.js.map +1 -0
  90. package/dist/admin/surfaces/audiences/states.d.ts +10 -0
  91. package/dist/admin/surfaces/audiences/states.d.ts.map +1 -0
  92. package/dist/admin/surfaces/audiences/states.js +11 -0
  93. package/dist/admin/surfaces/audiences/states.js.map +1 -0
  94. package/dist/admin/surfaces/changesets/changesets-data.d.ts +35 -0
  95. package/dist/admin/surfaces/changesets/changesets-data.d.ts.map +1 -0
  96. package/dist/admin/surfaces/changesets/changesets-data.js +151 -0
  97. package/dist/admin/surfaces/changesets/changesets-data.js.map +1 -0
  98. package/dist/admin/surfaces/changesets/changesets-detail.d.ts +3 -0
  99. package/dist/admin/surfaces/changesets/changesets-detail.d.ts.map +1 -0
  100. package/dist/admin/surfaces/changesets/changesets-detail.js +84 -0
  101. package/dist/admin/surfaces/changesets/changesets-detail.js.map +1 -0
  102. package/dist/admin/surfaces/changesets/changesets-index.d.ts +3 -0
  103. package/dist/admin/surfaces/changesets/changesets-index.d.ts.map +1 -0
  104. package/dist/admin/surfaces/changesets/changesets-index.js +62 -0
  105. package/dist/admin/surfaces/changesets/changesets-index.js.map +1 -0
  106. package/dist/admin/surfaces/comments/comment-moderation.d.ts +18 -0
  107. package/dist/admin/surfaces/comments/comment-moderation.d.ts.map +1 -0
  108. package/dist/admin/surfaces/comments/comment-moderation.js +36 -0
  109. package/dist/admin/surfaces/comments/comment-moderation.js.map +1 -0
  110. package/dist/admin/surfaces/comments/comments-data.d.ts +23 -0
  111. package/dist/admin/surfaces/comments/comments-data.d.ts.map +1 -0
  112. package/dist/admin/surfaces/comments/comments-data.js +81 -0
  113. package/dist/admin/surfaces/comments/comments-data.js.map +1 -0
  114. package/dist/admin/surfaces/comments/comments-index.d.ts +3 -0
  115. package/dist/admin/surfaces/comments/comments-index.d.ts.map +1 -0
  116. package/dist/admin/surfaces/comments/comments-index.js +73 -0
  117. package/dist/admin/surfaces/comments/comments-index.js.map +1 -0
  118. package/dist/admin/surfaces/content/content-edit.d.ts +3 -0
  119. package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -0
  120. package/dist/admin/surfaces/content/content-edit.js +321 -0
  121. package/dist/admin/surfaces/content/content-edit.js.map +1 -0
  122. package/dist/admin/surfaces/content/content-index.d.ts +3 -0
  123. package/dist/admin/surfaces/content/content-index.d.ts.map +1 -0
  124. package/dist/admin/surfaces/content/content-index.js +21 -0
  125. package/dist/admin/surfaces/content/content-index.js.map +1 -0
  126. package/dist/admin/surfaces/content/content-list.d.ts +3 -0
  127. package/dist/admin/surfaces/content/content-list.d.ts.map +1 -0
  128. package/dist/admin/surfaces/content/content-list.js +70 -0
  129. package/dist/admin/surfaces/content/content-list.js.map +1 -0
  130. package/dist/admin/surfaces/content/content-new.d.ts +3 -0
  131. package/dist/admin/surfaces/content/content-new.d.ts.map +1 -0
  132. package/dist/admin/surfaces/content/content-new.js +109 -0
  133. package/dist/admin/surfaces/content/content-new.js.map +1 -0
  134. package/dist/admin/surfaces/content/content-translation-bar.d.ts +12 -0
  135. package/dist/admin/surfaces/content/content-translation-bar.d.ts.map +1 -0
  136. package/dist/admin/surfaces/content/content-translation-bar.js +65 -0
  137. package/dist/admin/surfaces/content/content-translation-bar.js.map +1 -0
  138. package/dist/admin/surfaces/content/runtime-content-types.d.ts +41 -0
  139. package/dist/admin/surfaces/content/runtime-content-types.d.ts.map +1 -0
  140. package/dist/admin/surfaces/content/runtime-content-types.js +51 -0
  141. package/dist/admin/surfaces/content/runtime-content-types.js.map +1 -0
  142. package/dist/admin/surfaces/contentTree/content-tree.d.ts +3 -0
  143. package/dist/admin/surfaces/contentTree/content-tree.d.ts.map +1 -0
  144. package/dist/admin/surfaces/contentTree/content-tree.js +179 -0
  145. package/dist/admin/surfaces/contentTree/content-tree.js.map +1 -0
  146. package/dist/admin/surfaces/contentTree/move-to-picker.d.ts +12 -0
  147. package/dist/admin/surfaces/contentTree/move-to-picker.d.ts.map +1 -0
  148. package/dist/admin/surfaces/contentTree/move-to-picker.js +77 -0
  149. package/dist/admin/surfaces/contentTree/move-to-picker.js.map +1 -0
  150. package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts +3 -0
  151. package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -0
  152. package/dist/admin/surfaces/contentTypes/content-types-designer.js +260 -0
  153. package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -0
  154. package/dist/admin/surfaces/contentTypes/content-types-list.d.ts +3 -0
  155. package/dist/admin/surfaces/contentTypes/content-types-list.d.ts.map +1 -0
  156. package/dist/admin/surfaces/contentTypes/content-types-list.js +69 -0
  157. package/dist/admin/surfaces/contentTypes/content-types-list.js.map +1 -0
  158. package/dist/admin/surfaces/dashboard/dashboard-index.d.ts +3 -0
  159. package/dist/admin/surfaces/dashboard/dashboard-index.d.ts.map +1 -0
  160. package/dist/admin/surfaces/dashboard/dashboard-index.js +100 -0
  161. package/dist/admin/surfaces/dashboard/dashboard-index.js.map +1 -0
  162. package/dist/admin/surfaces/experiments/experiments-data.d.ts +12 -0
  163. package/dist/admin/surfaces/experiments/experiments-data.d.ts.map +1 -0
  164. package/dist/admin/surfaces/experiments/experiments-data.js +89 -0
  165. package/dist/admin/surfaces/experiments/experiments-data.js.map +1 -0
  166. package/dist/admin/surfaces/experiments/experiments-detail.d.ts +3 -0
  167. package/dist/admin/surfaces/experiments/experiments-detail.d.ts.map +1 -0
  168. package/dist/admin/surfaces/experiments/experiments-detail.js +87 -0
  169. package/dist/admin/surfaces/experiments/experiments-detail.js.map +1 -0
  170. package/dist/admin/surfaces/experiments/experiments-list.d.ts +3 -0
  171. package/dist/admin/surfaces/experiments/experiments-list.d.ts.map +1 -0
  172. package/dist/admin/surfaces/experiments/experiments-list.js +37 -0
  173. package/dist/admin/surfaces/experiments/experiments-list.js.map +1 -0
  174. package/dist/admin/surfaces/experiments/experiments-new.d.ts +3 -0
  175. package/dist/admin/surfaces/experiments/experiments-new.d.ts.map +1 -0
  176. package/dist/admin/surfaces/experiments/experiments-new.js +33 -0
  177. package/dist/admin/surfaces/experiments/experiments-new.js.map +1 -0
  178. package/dist/admin/surfaces/experiments/states.d.ts +10 -0
  179. package/dist/admin/surfaces/experiments/states.d.ts.map +1 -0
  180. package/dist/admin/surfaces/experiments/states.js +11 -0
  181. package/dist/admin/surfaces/experiments/states.js.map +1 -0
  182. package/dist/admin/surfaces/extensions/extensions-data.d.ts +59 -0
  183. package/dist/admin/surfaces/extensions/extensions-data.d.ts.map +1 -0
  184. package/dist/admin/surfaces/extensions/extensions-data.js +71 -0
  185. package/dist/admin/surfaces/extensions/extensions-data.js.map +1 -0
  186. package/dist/admin/surfaces/extensions/extensions-import-export.d.ts +3 -0
  187. package/dist/admin/surfaces/extensions/extensions-import-export.d.ts.map +1 -0
  188. package/dist/admin/surfaces/extensions/extensions-import-export.js +77 -0
  189. package/dist/admin/surfaces/extensions/extensions-import-export.js.map +1 -0
  190. package/dist/admin/surfaces/extensions/extensions-list.d.ts +3 -0
  191. package/dist/admin/surfaces/extensions/extensions-list.d.ts.map +1 -0
  192. package/dist/admin/surfaces/extensions/extensions-list.js +106 -0
  193. package/dist/admin/surfaces/extensions/extensions-list.js.map +1 -0
  194. package/dist/admin/surfaces/extensions/form-modal.d.ts +17 -0
  195. package/dist/admin/surfaces/extensions/form-modal.d.ts.map +1 -0
  196. package/dist/admin/surfaces/extensions/form-modal.js +27 -0
  197. package/dist/admin/surfaces/extensions/form-modal.js.map +1 -0
  198. package/dist/admin/surfaces/feeds/feed-editor.d.ts +8 -0
  199. package/dist/admin/surfaces/feeds/feed-editor.d.ts.map +1 -0
  200. package/dist/admin/surfaces/feeds/feed-editor.js +120 -0
  201. package/dist/admin/surfaces/feeds/feed-editor.js.map +1 -0
  202. package/dist/admin/surfaces/feeds/feeds-data.d.ts +35 -0
  203. package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -0
  204. package/dist/admin/surfaces/feeds/feeds-data.js +81 -0
  205. package/dist/admin/surfaces/feeds/feeds-data.js.map +1 -0
  206. package/dist/admin/surfaces/feeds/feeds-detail.d.ts +3 -0
  207. package/dist/admin/surfaces/feeds/feeds-detail.d.ts.map +1 -0
  208. package/dist/admin/surfaces/feeds/feeds-detail.js +36 -0
  209. package/dist/admin/surfaces/feeds/feeds-detail.js.map +1 -0
  210. package/dist/admin/surfaces/feeds/feeds-list.d.ts +3 -0
  211. package/dist/admin/surfaces/feeds/feeds-list.d.ts.map +1 -0
  212. package/dist/admin/surfaces/feeds/feeds-list.js +49 -0
  213. package/dist/admin/surfaces/feeds/feeds-list.js.map +1 -0
  214. package/dist/admin/surfaces/feeds/feeds-new.d.ts +3 -0
  215. package/dist/admin/surfaces/feeds/feeds-new.d.ts.map +1 -0
  216. package/dist/admin/surfaces/feeds/feeds-new.js +7 -0
  217. package/dist/admin/surfaces/feeds/feeds-new.js.map +1 -0
  218. package/dist/admin/surfaces/forms/form-editor.d.ts +5 -0
  219. package/dist/admin/surfaces/forms/form-editor.d.ts.map +1 -0
  220. package/dist/admin/surfaces/forms/form-editor.js +59 -0
  221. package/dist/admin/surfaces/forms/form-editor.js.map +1 -0
  222. package/dist/admin/surfaces/forms/forms-data.d.ts +52 -0
  223. package/dist/admin/surfaces/forms/forms-data.d.ts.map +1 -0
  224. package/dist/admin/surfaces/forms/forms-data.js +106 -0
  225. package/dist/admin/surfaces/forms/forms-data.js.map +1 -0
  226. package/dist/admin/surfaces/forms/forms-edit.d.ts +3 -0
  227. package/dist/admin/surfaces/forms/forms-edit.d.ts.map +1 -0
  228. package/dist/admin/surfaces/forms/forms-edit.js +40 -0
  229. package/dist/admin/surfaces/forms/forms-edit.js.map +1 -0
  230. package/dist/admin/surfaces/forms/forms-list.d.ts +3 -0
  231. package/dist/admin/surfaces/forms/forms-list.d.ts.map +1 -0
  232. package/dist/admin/surfaces/forms/forms-list.js +53 -0
  233. package/dist/admin/surfaces/forms/forms-list.js.map +1 -0
  234. package/dist/admin/surfaces/forms/forms-new.d.ts +3 -0
  235. package/dist/admin/surfaces/forms/forms-new.d.ts.map +1 -0
  236. package/dist/admin/surfaces/forms/forms-new.js +7 -0
  237. package/dist/admin/surfaces/forms/forms-new.js.map +1 -0
  238. package/dist/admin/surfaces/forms/forms-submissions.d.ts +3 -0
  239. package/dist/admin/surfaces/forms/forms-submissions.d.ts.map +1 -0
  240. package/dist/admin/surfaces/forms/forms-submissions.js +125 -0
  241. package/dist/admin/surfaces/forms/forms-submissions.js.map +1 -0
  242. package/dist/admin/surfaces/layouts/layout-editor-client.d.ts +8 -0
  243. package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -0
  244. package/dist/admin/surfaces/layouts/layout-editor-client.js +77 -0
  245. package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -0
  246. package/dist/admin/surfaces/layouts/layouts-data.d.ts +53 -0
  247. package/dist/admin/surfaces/layouts/layouts-data.d.ts.map +1 -0
  248. package/dist/admin/surfaces/layouts/layouts-data.js +61 -0
  249. package/dist/admin/surfaces/layouts/layouts-data.js.map +1 -0
  250. package/dist/admin/surfaces/layouts/layouts-detail.d.ts +3 -0
  251. package/dist/admin/surfaces/layouts/layouts-detail.d.ts.map +1 -0
  252. package/dist/admin/surfaces/layouts/layouts-detail.js +38 -0
  253. package/dist/admin/surfaces/layouts/layouts-detail.js.map +1 -0
  254. package/dist/admin/surfaces/layouts/layouts-list.d.ts +3 -0
  255. package/dist/admin/surfaces/layouts/layouts-list.d.ts.map +1 -0
  256. package/dist/admin/surfaces/layouts/layouts-list.js +62 -0
  257. package/dist/admin/surfaces/layouts/layouts-list.js.map +1 -0
  258. package/dist/admin/surfaces/layouts/layouts-new.d.ts +3 -0
  259. package/dist/admin/surfaces/layouts/layouts-new.d.ts.map +1 -0
  260. package/dist/admin/surfaces/layouts/layouts-new.js +7 -0
  261. package/dist/admin/surfaces/layouts/layouts-new.js.map +1 -0
  262. package/dist/admin/surfaces/login.d.ts +20 -0
  263. package/dist/admin/surfaces/login.d.ts.map +1 -0
  264. package/dist/admin/surfaces/login.js +93 -0
  265. package/dist/admin/surfaces/login.js.map +1 -0
  266. package/dist/admin/surfaces/media/library.d.ts +3 -0
  267. package/dist/admin/surfaces/media/library.d.ts.map +1 -0
  268. package/dist/admin/surfaces/media/library.js +7 -0
  269. package/dist/admin/surfaces/media/library.js.map +1 -0
  270. package/dist/admin/surfaces/media/media-client.d.ts +4 -0
  271. package/dist/admin/surfaces/media/media-client.d.ts.map +1 -0
  272. package/dist/admin/surfaces/media/media-client.js +203 -0
  273. package/dist/admin/surfaces/media/media-client.js.map +1 -0
  274. package/dist/admin/surfaces/media/upload.d.ts +3 -0
  275. package/dist/admin/surfaces/media/upload.d.ts.map +1 -0
  276. package/dist/admin/surfaces/media/upload.js +7 -0
  277. package/dist/admin/surfaces/media/upload.js.map +1 -0
  278. package/dist/admin/surfaces/plugins/plugins-data.d.ts +37 -0
  279. package/dist/admin/surfaces/plugins/plugins-data.d.ts.map +1 -0
  280. package/dist/admin/surfaces/plugins/plugins-data.js +31 -0
  281. package/dist/admin/surfaces/plugins/plugins-data.js.map +1 -0
  282. package/dist/admin/surfaces/plugins/plugins-index.d.ts +3 -0
  283. package/dist/admin/surfaces/plugins/plugins-index.d.ts.map +1 -0
  284. package/dist/admin/surfaces/plugins/plugins-index.js +72 -0
  285. package/dist/admin/surfaces/plugins/plugins-index.js.map +1 -0
  286. package/dist/admin/surfaces/search/search-index.d.ts +3 -0
  287. package/dist/admin/surfaces/search/search-index.d.ts.map +1 -0
  288. package/dist/admin/surfaces/search/search-index.js +76 -0
  289. package/dist/admin/surfaces/search/search-index.js.map +1 -0
  290. package/dist/admin/surfaces/settings/admin-features.d.ts +3 -0
  291. package/dist/admin/surfaces/settings/admin-features.d.ts.map +1 -0
  292. package/dist/admin/surfaces/settings/admin-features.js +138 -0
  293. package/dist/admin/surfaces/settings/admin-features.js.map +1 -0
  294. package/dist/admin/surfaces/settings/settings-ax.d.ts +3 -0
  295. package/dist/admin/surfaces/settings/settings-ax.d.ts.map +1 -0
  296. package/dist/admin/surfaces/settings/settings-ax.js +63 -0
  297. package/dist/admin/surfaces/settings/settings-ax.js.map +1 -0
  298. package/dist/admin/surfaces/settings/settings-cache.d.ts +3 -0
  299. package/dist/admin/surfaces/settings/settings-cache.d.ts.map +1 -0
  300. package/dist/admin/surfaces/settings/settings-cache.js +64 -0
  301. package/dist/admin/surfaces/settings/settings-cache.js.map +1 -0
  302. package/dist/admin/surfaces/settings/settings-email.d.ts +3 -0
  303. package/dist/admin/surfaces/settings/settings-email.d.ts.map +1 -0
  304. package/dist/admin/surfaces/settings/settings-email.js +89 -0
  305. package/dist/admin/surfaces/settings/settings-email.js.map +1 -0
  306. package/dist/admin/surfaces/settings/settings-general.d.ts +3 -0
  307. package/dist/admin/surfaces/settings/settings-general.d.ts.map +1 -0
  308. package/dist/admin/surfaces/settings/settings-general.js +91 -0
  309. package/dist/admin/surfaces/settings/settings-general.js.map +1 -0
  310. package/dist/admin/surfaces/settings/settings-site.d.ts +3 -0
  311. package/dist/admin/surfaces/settings/settings-site.d.ts.map +1 -0
  312. package/dist/admin/surfaces/settings/settings-site.js +14 -0
  313. package/dist/admin/surfaces/settings/settings-site.js.map +1 -0
  314. package/dist/admin/surfaces/settings/settings-sites.d.ts +3 -0
  315. package/dist/admin/surfaces/settings/settings-sites.d.ts.map +1 -0
  316. package/dist/admin/surfaces/settings/settings-sites.js +134 -0
  317. package/dist/admin/surfaces/settings/settings-sites.js.map +1 -0
  318. package/dist/admin/surfaces/settings/states.d.ts +33 -0
  319. package/dist/admin/surfaces/settings/states.d.ts.map +1 -0
  320. package/dist/admin/surfaces/settings/states.js +33 -0
  321. package/dist/admin/surfaces/settings/states.js.map +1 -0
  322. package/dist/admin/surfaces/taxonomy/categories.d.ts +3 -0
  323. package/dist/admin/surfaces/taxonomy/categories.d.ts.map +1 -0
  324. package/dist/admin/surfaces/taxonomy/categories.js +162 -0
  325. package/dist/admin/surfaces/taxonomy/categories.js.map +1 -0
  326. package/dist/admin/surfaces/taxonomy/tags.d.ts +3 -0
  327. package/dist/admin/surfaces/taxonomy/tags.d.ts.map +1 -0
  328. package/dist/admin/surfaces/taxonomy/tags.js +112 -0
  329. package/dist/admin/surfaces/taxonomy/tags.js.map +1 -0
  330. package/dist/admin/surfaces/taxonomy/taxonomy-ui.d.ts +39 -0
  331. package/dist/admin/surfaces/taxonomy/taxonomy-ui.d.ts.map +1 -0
  332. package/dist/admin/surfaces/taxonomy/taxonomy-ui.js +66 -0
  333. package/dist/admin/surfaces/taxonomy/taxonomy-ui.js.map +1 -0
  334. package/dist/admin/surfaces/translations/states.d.ts +10 -0
  335. package/dist/admin/surfaces/translations/states.d.ts.map +1 -0
  336. package/dist/admin/surfaces/translations/states.js +11 -0
  337. package/dist/admin/surfaces/translations/states.js.map +1 -0
  338. package/dist/admin/surfaces/translations/translations-index.d.ts +3 -0
  339. package/dist/admin/surfaces/translations/translations-index.d.ts.map +1 -0
  340. package/dist/admin/surfaces/translations/translations-index.js +99 -0
  341. package/dist/admin/surfaces/translations/translations-index.js.map +1 -0
  342. package/dist/admin/surfaces/trash/trash-index.d.ts +3 -0
  343. package/dist/admin/surfaces/trash/trash-index.d.ts.map +1 -0
  344. package/dist/admin/surfaces/trash/trash-index.js +96 -0
  345. package/dist/admin/surfaces/trash/trash-index.js.map +1 -0
  346. package/dist/admin/surfaces/users/users-data.d.ts +51 -0
  347. package/dist/admin/surfaces/users/users-data.d.ts.map +1 -0
  348. package/dist/admin/surfaces/users/users-data.js +60 -0
  349. package/dist/admin/surfaces/users/users-data.js.map +1 -0
  350. package/dist/admin/surfaces/users/users-detail.d.ts +3 -0
  351. package/dist/admin/surfaces/users/users-detail.d.ts.map +1 -0
  352. package/dist/admin/surfaces/users/users-detail.js +148 -0
  353. package/dist/admin/surfaces/users/users-detail.js.map +1 -0
  354. package/dist/admin/surfaces/users/users-groups.d.ts +3 -0
  355. package/dist/admin/surfaces/users/users-groups.d.ts.map +1 -0
  356. package/dist/admin/surfaces/users/users-groups.js +136 -0
  357. package/dist/admin/surfaces/users/users-groups.js.map +1 -0
  358. package/dist/admin/surfaces/users/users-list.d.ts +3 -0
  359. package/dist/admin/surfaces/users/users-list.d.ts.map +1 -0
  360. package/dist/admin/surfaces/users/users-list.js +119 -0
  361. package/dist/admin/surfaces/users/users-list.js.map +1 -0
  362. package/dist/admin/surfaces/users/users-new.d.ts +3 -0
  363. package/dist/admin/surfaces/users/users-new.d.ts.map +1 -0
  364. package/dist/admin/surfaces/users/users-new.js +78 -0
  365. package/dist/admin/surfaces/users/users-new.js.map +1 -0
  366. package/dist/admin/surfaces/users/users-permissions.d.ts +3 -0
  367. package/dist/admin/surfaces/users/users-permissions.d.ts.map +1 -0
  368. package/dist/admin/surfaces/users/users-permissions.js +135 -0
  369. package/dist/admin/surfaces/users/users-permissions.js.map +1 -0
  370. package/dist/admin/surfaces/webServices/api-keys.d.ts +3 -0
  371. package/dist/admin/surfaces/webServices/api-keys.d.ts.map +1 -0
  372. package/dist/admin/surfaces/webServices/api-keys.js +65 -0
  373. package/dist/admin/surfaces/webServices/api-keys.js.map +1 -0
  374. package/dist/admin/surfaces/webServices/oauth.d.ts +3 -0
  375. package/dist/admin/surfaces/webServices/oauth.d.ts.map +1 -0
  376. package/dist/admin/surfaces/webServices/oauth.js +75 -0
  377. package/dist/admin/surfaces/webServices/oauth.js.map +1 -0
  378. package/dist/admin/surfaces/webServices/secret-reveal-modal.d.ts +8 -0
  379. package/dist/admin/surfaces/webServices/secret-reveal-modal.d.ts.map +1 -0
  380. package/dist/admin/surfaces/webServices/secret-reveal-modal.js +30 -0
  381. package/dist/admin/surfaces/webServices/secret-reveal-modal.js.map +1 -0
  382. package/dist/admin/surfaces/webServices/web-services-data.d.ts +38 -0
  383. package/dist/admin/surfaces/webServices/web-services-data.d.ts.map +1 -0
  384. package/dist/admin/surfaces/webServices/web-services-data.js +52 -0
  385. package/dist/admin/surfaces/webServices/web-services-data.js.map +1 -0
  386. package/dist/api/admin-features-routes.d.ts +10 -0
  387. package/dist/api/admin-features-routes.d.ts.map +1 -0
  388. package/dist/api/admin-features-routes.js +61 -0
  389. package/dist/api/admin-features-routes.js.map +1 -0
  390. package/dist/api/graphql/resolvers.d.ts +6 -6
  391. package/dist/api/index.d.ts.map +1 -1
  392. package/dist/api/index.js +2 -0
  393. package/dist/api/index.js.map +1 -1
  394. package/dist/config/define.d.ts +22 -1
  395. package/dist/config/define.d.ts.map +1 -1
  396. package/dist/config/define.js +44 -0
  397. package/dist/config/define.js.map +1 -1
  398. package/dist/config/parse.d.ts.map +1 -1
  399. package/dist/config/parse.js +8 -2
  400. package/dist/config/parse.js.map +1 -1
  401. package/dist/config/types.d.ts +60 -1
  402. package/dist/config/types.d.ts.map +1 -1
  403. package/dist/config/types.js +20 -1
  404. package/dist/config/types.js.map +1 -1
  405. package/dist/config/validate.d.ts.map +1 -1
  406. package/dist/config/validate.js +60 -0
  407. package/dist/config/validate.js.map +1 -1
  408. package/dist/db/admin-features-queries.d.ts +29 -0
  409. package/dist/db/admin-features-queries.d.ts.map +1 -0
  410. package/dist/db/admin-features-queries.js +46 -0
  411. package/dist/db/admin-features-queries.js.map +1 -0
  412. package/dist/db/analytics-queries.d.ts +2 -2
  413. package/dist/db/audit-queries.d.ts +3 -3
  414. package/dist/db/category-queries.d.ts +6 -6
  415. package/dist/db/changeset-audit-queries.d.ts +2 -2
  416. package/dist/db/changeset-queries.d.ts +8 -8
  417. package/dist/db/extension-queries.d.ts +17 -17
  418. package/dist/db/feed-queries.d.ts +6 -6
  419. package/dist/db/media-queries.d.ts +12 -12
  420. package/dist/db/site-admin-queries.d.ts +1 -1
  421. package/dist/db/site-queries.d.ts +3 -3
  422. package/dist/db/tag-queries.d.ts +4 -4
  423. package/dist/db/webhook-queries.d.ts +8 -8
  424. package/dist/db/workflow-queries.d.ts +5 -5
  425. package/dist/experiments/schema.d.ts +1 -1
  426. package/dist/host-client/index.d.ts +1 -0
  427. package/dist/host-client/index.d.ts.map +1 -1
  428. package/dist/host-client/index.js +4 -0
  429. package/dist/host-client/index.js.map +1 -1
  430. package/dist/host-client/json.d.ts +36 -0
  431. package/dist/host-client/json.d.ts.map +1 -0
  432. package/dist/host-client/json.js +106 -0
  433. package/dist/host-client/json.js.map +1 -0
  434. package/dist/layout/modules-extended.d.ts.map +1 -1
  435. package/dist/layout/modules-extended.js +9 -8
  436. package/dist/layout/modules-extended.js.map +1 -1
  437. package/dist/layout/modules.js +5 -5
  438. package/dist/layout/modules.js.map +1 -1
  439. package/dist/schema/base.d.ts +1 -1
  440. package/dist/scope/breadcrumbs.d.ts.map +1 -1
  441. package/dist/scope/breadcrumbs.js +4 -1
  442. package/dist/scope/breadcrumbs.js.map +1 -1
  443. package/dist/scope/head-foot.d.ts +12 -4
  444. package/dist/scope/head-foot.d.ts.map +1 -1
  445. package/dist/scope/head-foot.js +14 -6
  446. package/dist/scope/head-foot.js.map +1 -1
  447. package/dist/scope/jsonld.d.ts.map +1 -1
  448. package/dist/scope/jsonld.js +1 -11
  449. package/dist/scope/jsonld.js.map +1 -1
  450. package/dist/scope/kywi-form.d.ts.map +1 -1
  451. package/dist/scope/kywi-form.js +3 -3
  452. package/dist/scope/kywi-form.js.map +1 -1
  453. package/dist/scope/kywi-wizard-form.d.ts.map +1 -1
  454. package/dist/scope/kywi-wizard-form.js +3 -3
  455. package/dist/scope/kywi-wizard-form.js.map +1 -1
  456. package/dist/scope/rendering.d.ts.map +1 -1
  457. package/dist/scope/rendering.js +7 -6
  458. package/dist/scope/rendering.js.map +1 -1
  459. package/dist/util/jsonld.d.ts +13 -0
  460. package/dist/util/jsonld.d.ts.map +1 -0
  461. package/dist/util/jsonld.js +15 -0
  462. package/dist/util/jsonld.js.map +1 -0
  463. package/dist/util/sanitize.d.ts +6 -0
  464. package/dist/util/sanitize.d.ts.map +1 -0
  465. package/dist/util/sanitize.js +156 -0
  466. package/dist/util/sanitize.js.map +1 -0
  467. package/package.json +12 -3
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Server-only helpers for the configurable admin app (design
3
+ * `docs/orchestration/plans/admin-app-configurable.md` §1.1, §3).
4
+ *
5
+ * `toAdminRuntimeConfig` is what the generated catch-all page
6
+ * (`app/admin/[[...admin]]/page.tsx`, T14) calls to turn a full, server-side
7
+ * `KywiConfig` (secrets and all — db url, auth secret, SMTP/S3 credentials,
8
+ * content-type hooks/access functions) into the small, JSON-serializable,
9
+ * SECRET-FREE `AdminRuntimeConfig` that is safe to pass as a prop into the
10
+ * client component tree. This is the fix for the current fragile pattern
11
+ * (`AdminShell` takes the full `KywiConfig` as a client prop, verified in
12
+ * `apps/reference/lib/config.ts` + `components/admin-shell-wrapper.tsx`) —
13
+ * the projection below is the *only* shape that may ever cross that boundary.
14
+ *
15
+ * Import via `@kywi-software/core/admin/server` (see `packages/core/package.json`
16
+ * `exports["./admin/server"]`) — a separate entry point from `@kywi-software/core/admin`
17
+ * (the client-component barrel, `admin/index.ts`) so a server module never
18
+ * accidentally pulls in React admin components, and vice versa.
19
+ *
20
+ * ── Security invariant ────────────────────────────────────────────────────────
21
+ * Every field is a CURATED, per-field-vetted copy of a known-safe, display-only
22
+ * scalar/struct. The projection NEVER copies: db url/connection string, auth
23
+ * secret, S3 access/secret keys or endpoint, cache (redis) connection string,
24
+ * SMTP/sendgrid credentials, per-site free-form `settings`, or any server
25
+ * function (content-type/plugin hooks, access-control predicates, field-level
26
+ * ACLs, JSON-LD transforms). Enforced structurally by the copy-only-known-fields
27
+ * shape below and asserted by the deep-scan leak test in
28
+ * `admin/__tests__/server.test.ts` (key scan + value scan + no-functions scan).
29
+ */
30
+ import type { DeploymentMode, KywiConfig, FieldType, FieldValidation, DbProvider, AuthProvider, CacheProvider } from '../config/types.js';
31
+ import { ADMIN_FEATURES_SURFACE_ID, type ResolvedAdminConfig } from '../config/types.js';
32
+ import type { ImageSizeConfig, MediaConfig } from '../media/types.js';
33
+ /**
34
+ * Client-safe subset of a `FieldDefinition` — the data-only members the admin
35
+ * list/edit forms and the content-type reference read. Recurses `fields` for
36
+ * `group` fields.
37
+ *
38
+ * OMITS `access` (`FieldAccessConfig`): it is FUNCTION-valued (read/write
39
+ * predicates) so it can never serialize, and no admin surface reads it (the
40
+ * server enforces field ACLs regardless — exposing the rule set is both unsafe
41
+ * to serialize and unnecessary). `source` IS included: it is a harmless
42
+ * `'config' | 'admin'` provenance flag the designer UI uses to distinguish
43
+ * config-defined from runtime-added fields. `validation` is declarative
44
+ * (`min`/`max`/length/`pattern`) — no functions, safe to serialize.
45
+ */
46
+ export interface AdminRuntimeField {
47
+ name: string;
48
+ type: FieldType;
49
+ label: string;
50
+ required?: boolean;
51
+ /** For `select` / `multiSelect`. */
52
+ options?: string[];
53
+ /** For `relationship`. */
54
+ relatedType?: string;
55
+ /** Field's default value (declarative config data; already rendered client-side into forms). */
56
+ defaultValue?: unknown;
57
+ /** Declarative value-level validation (min/max/length/pattern) — no functions. */
58
+ validation?: FieldValidation;
59
+ /** Provenance flag ('config' = kywi.config.ts, 'admin' = runtime designer). */
60
+ source?: 'config' | 'admin';
61
+ /** Sub-fields when `type` is `group`. */
62
+ fields?: AdminRuntimeField[];
63
+ }
64
+ /** Client-safe subset of `ContentTypeConfig` — labels/names/icons + the data-only `fields`. No hooks, no access functions, no field validators-as-functions. */
65
+ export interface AdminRuntimeContentType {
66
+ name: string;
67
+ label: string;
68
+ pluralLabel?: string;
69
+ baseType: KywiConfig['contentTypes'][number]['baseType'];
70
+ icon?: string;
71
+ /** The client-safe projection of this type's fields (see `AdminRuntimeField`). */
72
+ fields?: AdminRuntimeField[];
73
+ }
74
+ /**
75
+ * Client-safe subset of `SiteConfig` — id/name/domain/locales + the display
76
+ * metadata (`defaultLocale`, `theme`) the settings reference renders. STILL NO
77
+ * `settings` object (free-form, may hold secrets — kept excluded as T2
78
+ * documented) and no pool-sharing wiring. `slug` is deliberately absent: it is
79
+ * not a `SiteConfig` member at all — it is a per-site runtime DB identifier
80
+ * surfaced via `GET /api/v1/sites`, so there is no config-as-code source to
81
+ * project it from.
82
+ */
83
+ export interface AdminRuntimeSite {
84
+ id: string;
85
+ name: string;
86
+ domain: string;
87
+ locales?: string[];
88
+ /** Default locale (display metadata). */
89
+ defaultLocale: string;
90
+ /** Configured theme name (display metadata). */
91
+ theme: string;
92
+ }
93
+ /** A theme, projected to its display-safe identity: name + region names. Tokens are omitted (no surface reads them; add here if one ever does — they are display data). */
94
+ export interface AdminRuntimeTheme {
95
+ name: string;
96
+ regions: Array<{
97
+ name: string;
98
+ }>;
99
+ }
100
+ /**
101
+ * Display-only overview of the resolved platform configuration for the
102
+ * `settings.site` reference surface. Provider NAMES and non-sensitive display
103
+ * knobs only — NEVER connection strings, keys, or secrets.
104
+ */
105
+ export interface AdminRuntimeOverview {
106
+ /** DB provider NAME only (e.g. `'postgresql'`). NEVER `db.url`. */
107
+ db: {
108
+ provider: DbProvider;
109
+ };
110
+ /** Auth provider NAMES only (e.g. `['credentials','google']`). NEVER `auth.secret` or client secrets. */
111
+ auth: {
112
+ providers: AuthProvider[];
113
+ };
114
+ /** Media provider + non-sensitive display knobs. NEVER S3 bucket/region/keys/endpoint or `localPath`. */
115
+ media: {
116
+ provider: MediaConfig['provider'];
117
+ maxUploadSizeMb?: number;
118
+ imageSizes?: Record<string, ImageSizeConfig>;
119
+ };
120
+ /** Cache provider NAME + default TTL. NEVER the redis connection string. */
121
+ cache: {
122
+ provider: CacheProvider;
123
+ defaultTtl?: number;
124
+ };
125
+ /** Configured themes (names + region names). */
126
+ themes: AdminRuntimeTheme[];
127
+ }
128
+ /**
129
+ * The projection passed from the server-rendered catch-all page into
130
+ * `KywiAdminApp` (T14). Every field here is safe to serialize into the client
131
+ * bundle: no `db`.url, no `auth`.secret, no `email`/SMTP/S3 credentials, no
132
+ * cache connection string, no server functions (hooks, access control,
133
+ * validators). Enforced by `toAdminRuntimeConfig`'s shape (only ever copies
134
+ * known-safe scalar fields) and asserted by the deep-scan test in
135
+ * `admin/__tests__/server.test.ts`.
136
+ */
137
+ export interface AdminRuntimeConfig {
138
+ mode: DeploymentMode;
139
+ admin: ResolvedAdminConfig;
140
+ contentTypes: AdminRuntimeContentType[];
141
+ sites: AdminRuntimeSite[];
142
+ /** Display-only overview of platform config (provider names, no secrets). */
143
+ overview: AdminRuntimeOverview;
144
+ }
145
+ /**
146
+ * Build the secret-free `AdminRuntimeConfig` from a full `KywiConfig`. Calls
147
+ * `resolveAdminConfig` itself (rather than trusting `config.admin` to already
148
+ * be resolved) so this stays correct even if a caller hand-builds a
149
+ * `KywiConfig` object literal instead of going through `defineKywiConfig`.
150
+ */
151
+ export declare function toAdminRuntimeConfig(config: KywiConfig): AdminRuntimeConfig;
152
+ export { ADMIN_FEATURES_SURFACE_ID };
153
+ export { resolveSurface, type SurfaceMatch } from './surface-matcher.js';
154
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/admin/server.ts"],"names":[],"mappings":"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"}
@@ -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;AAGtD,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;AA+GD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA8GpG"}
@@ -1,18 +1,83 @@
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
- function NavItem({ item, currentPath, depth = 0 }) {
5
+ import { KywiLogo, KywiLogoDark } from './kywi-logo.js';
6
+ /** localStorage key persisting per-group expand/collapse overrides. */
7
+ const NAV_COLLAPSE_KEY = 'kywi-admin-nav-groups';
8
+ /**
9
+ * Does `currentPath` fall inside this group — either under the group's own href
10
+ * or under any of its child hrefs (some children, e.g. Settings → Content Types,
11
+ * live outside the group's href prefix)? Drives the active-group-expanded default.
12
+ */
13
+ function isGroupActive(item, currentPath) {
14
+ const within = (href) => currentPath === href || currentPath.startsWith(href + '/');
15
+ if (within(item.href))
16
+ return true;
17
+ return (item.children ?? []).some(c => within(c.href));
18
+ }
19
+ /** Down-chevron disclosure glyph; rotates via CSS from the group's data-expanded. */
20
+ function NavChevron() {
21
+ return (_jsx("svg", { className: "kywi-nav-chevron", width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M4 6l4 4 4-4" }) }));
22
+ }
23
+ function NavItem({ item, currentPath, depth = 0, expanded, onToggle, }) {
6
24
  const isActive = currentPath === item.href || currentPath.startsWith(item.href + '/');
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))) }))] }));
25
+ const hasChildren = Array.isArray(item.children) && item.children.length > 0;
26
+ // Only top-level groups (depth 0) with children AND a toggle handler collapse.
27
+ const collapsible = depth === 0 && hasChildren && typeof onToggle === 'function';
28
+ const isExpanded = collapsible ? expanded !== false : true;
29
+ const childrenId = collapsible
30
+ ? `kywi-nav-group-${item.href.replace(/[^a-z0-9]+/gi, '-').replace(/^-+|-+$/g, '')}`
31
+ : undefined;
32
+ const link = (_jsx("a", { href: item.href, className: `kywi-nav-link ${isActive ? 'kywi-nav-active' : ''}`, style: { paddingLeft: `${(depth + 1) * 16}px` }, children: item.label }));
33
+ return (_jsxs("li", { className: `kywi-nav-item${collapsible ? ' kywi-nav-group' : ''}`, "data-active": isActive, ...(collapsible ? { 'data-expanded': isExpanded } : {}), children: [collapsible ? (_jsxs("div", { className: "kywi-nav-group-row", children: [link, _jsx("button", { type: "button", className: "kywi-nav-toggle", "aria-expanded": isExpanded, "aria-controls": childrenId, "aria-label": `${isExpanded ? 'Collapse' : 'Expand'} ${item.label}`, onClick: () => onToggle(item), children: _jsx(NavChevron, {}) })] })) : (link), hasChildren && (_jsx("div", { className: "kywi-nav-children-wrap", children: _jsx("ul", { id: childrenId, className: "kywi-nav-children", ...(collapsible ? { 'aria-hidden': !isExpanded } : {}), children: item.children.map(child => (_jsx(NavItem, { item: child, currentPath: currentPath, depth: depth + 1 }, child.href))) }) }))] }));
8
34
  }
9
- export function AdminShell({ config, currentPath, children }) {
10
- const nav = buildAdminNav(config);
35
+ export function AdminShell({ config, role, flags, pluginNav, currentPath, children }) {
36
+ // Role/flags (when provided) narrow the derived tree beyond the config ceiling.
37
+ const opts = {};
38
+ if (role !== undefined)
39
+ opts.role = role;
40
+ if (flags !== undefined)
41
+ opts.flags = flags;
42
+ const nav = buildAdminNav(config, opts);
11
43
  // Below the responsive breakpoint the sidebar is an off-canvas drawer toggled
12
44
  // by the topbar hamburger; on desktop these controls are hidden by CSS and the
13
45
  // sidebar is always visible. Close the drawer whenever the route changes.
14
46
  const [sidebarOpen, setSidebarOpen] = useState(false);
15
47
  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] })] }));
48
+ // Per-group expand/collapse overrides (href user's explicit choice). Empty
49
+ // until hydrated from localStorage so the server render and the first client
50
+ // render agree (both fall back to the active-group-expanded default); the
51
+ // effect then applies any persisted choices. A group with no override follows
52
+ // the default, so navigating auto-expands the newly-active section.
53
+ const [overrides, setOverrides] = useState({});
54
+ useEffect(() => {
55
+ try {
56
+ const raw = window.localStorage.getItem(NAV_COLLAPSE_KEY);
57
+ if (raw) {
58
+ const parsed = JSON.parse(raw);
59
+ if (parsed && typeof parsed === 'object')
60
+ setOverrides(parsed);
61
+ }
62
+ }
63
+ catch {
64
+ // Best-effort: a storage hiccup just leaves the active-default layout.
65
+ }
66
+ }, []);
67
+ const isExpanded = (item) => item.href in overrides ? overrides[item.href] : isGroupActive(item, currentPath);
68
+ const toggleGroup = (item) => {
69
+ setOverrides(prev => {
70
+ const current = item.href in prev ? prev[item.href] : isGroupActive(item, currentPath);
71
+ const next = { ...prev, [item.href]: !current };
72
+ try {
73
+ window.localStorage.setItem(NAV_COLLAPSE_KEY, JSON.stringify(next));
74
+ }
75
+ catch {
76
+ // Non-fatal: the toggle still takes effect for this session.
77
+ }
78
+ return next;
79
+ });
80
+ };
81
+ 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", className: "kywi-admin-logo-link", "aria-label": "Kywi \u2014 go to dashboard", children: _jsx(KywiLogo, { className: "kywi-admin-logo-mark" }) }) }), _jsxs("nav", { className: "kywi-admin-nav", children: [_jsx("ul", { children: nav.map(item => (_jsx(NavItem, { item: item, currentPath: currentPath, expanded: isExpanded(item), onToggle: toggleGroup }, 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", "aria-label": "Kywi \u2014 go to dashboard", children: _jsx(KywiLogoDark, { className: "kywi-admin-mobile-logo" }) })] }), children] })] }));
17
82
  }
18
83
  //# sourceMappingURL=shell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAA;AAQ3D,SAAS,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,EAA+D;IAC5G,MAAM,QAAQ,GAAG,WAAW,KAAK,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;IACrF,OAAO,CACL,cAAI,SAAS,EAAC,eAAe,iBAAc,QAAQ,aACjD,YAAG,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,EAChF,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,YAC/C,IAAI,CAAC,KAAK,GACT,EACH,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAC5C,aAAI,SAAS,EAAC,mBAAmB,YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAC1B,KAAC,OAAO,IAAkB,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,IAAnE,KAAK,CAAC,IAAI,CAA6D,CACtF,CAAC,GACC,CACN,IACE,CACN,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAmB;IAC3E,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACjC,8EAA8E;IAC9E,+EAA+E;IAC/E,0EAA0E;IAC1E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,SAAS,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEzD,OAAO,CACL,eAAK,SAAS,EAAC,kBAAkB,uBAAoB,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,aAEjF,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,kBAAkB,gBACjB,kBAAkB,EAC7B,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,GACpC,EACF,gBAAO,EAAE,EAAC,oBAAoB,EAAC,SAAS,EAAC,oBAAoB,YAG3D,eAAK,SAAS,EAAC,2BAA2B,aACxC,cAAK,SAAS,EAAC,iBAAiB,YAAC,YAAG,IAAI,EAAC,kBAAkB,2BAAe,GAAM,EAChF,cAAK,SAAS,EAAC,gBAAgB,YAC7B,uBAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAC,OAAO,IAAiB,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,IAA/C,IAAI,CAAC,IAAI,CAA0C,CAAC,GAAM,GACzF,IACF,GACA,EACR,gBAAM,SAAS,EAAC,iBAAiB,aAE/B,eAAK,SAAS,EAAC,uBAAuB,aACpC,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,sBAAsB,gBACrB,iBAAiB,mBACd,oBAAoB,mBACnB,WAAW,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAE5C,eAAM,SAAS,EAAC,0BAA0B,GAAG,EAC7C,eAAM,SAAS,EAAC,0BAA0B,GAAG,EAC7C,eAAM,SAAS,EAAC,0BAA0B,GAAG,IACtC,EACT,YAAG,IAAI,EAAC,kBAAkB,EAAC,SAAS,EAAC,yBAAyB,2BAAe,IACzE,EACL,QAAQ,IACJ,IACH,CACP,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"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"}
@@ -287,29 +287,32 @@
287
287
  }
288
288
  .kywi-admin-sidebar-sticky::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.16); background-clip: content-box; }
289
289
 
290
+ /* ---- Brand mark ------------------------------------------------------- */
291
+ /* The wordmark sits directly on the dark sidebar (no plate). Its type inherits
292
+ `currentColor`, which we drive to the muted nav-link colour so the wordmark
293
+ reads uniformly muted — exactly like the nav text beside it — while the kiwi
294
+ icon keeps its lime/cream accent as the single pop of colour. */
290
295
  .kywi-admin-logo {
291
296
  padding: var(--kywi-space-2) var(--kywi-space-5) var(--kywi-space-5);
292
297
  margin-bottom: var(--kywi-space-2);
293
298
  }
294
- .kywi-admin-logo a {
299
+ .kywi-admin-sidebar .kywi-admin-logo-link {
295
300
  display: inline-flex;
296
301
  align-items: center;
297
- gap: var(--kywi-space-2);
298
- color: #fff;
299
- font-size: var(--kywi-text-md);
300
- font-weight: var(--kywi-weight-bold);
301
- letter-spacing: var(--kywi-tracking-tight);
302
+ color: var(--kywi-sidebar-fg-muted);
302
303
  text-decoration: none;
304
+ transition: color var(--kywi-dur) var(--kywi-ease), opacity var(--kywi-dur) var(--kywi-ease);
303
305
  }
304
- .kywi-admin-logo a::before {
305
- content: "";
306
- width: 10px;
307
- height: 10px;
308
- border-radius: var(--kywi-radius-pill);
309
- background: var(--kywi-sidebar-accent);
310
- box-shadow: 0 0 0 3px rgba(87, 201, 156, 0.22);
311
- flex-shrink: 0;
306
+ .kywi-admin-sidebar .kywi-admin-logo-link:hover {
307
+ text-decoration: none;
308
+ color: var(--kywi-sidebar-fg);
312
309
  }
310
+ .kywi-admin-logo-mark {
311
+ display: block;
312
+ width: 156px;
313
+ aspect-ratio: 1638 / 382;
314
+ }
315
+ .kywi-admin-logo-mark > svg { display: block; width: 100%; height: 100%; }
313
316
 
314
317
  .kywi-admin-nav ul { list-style: none; margin: 0; padding: 0; }
315
318
  .kywi-admin-nav > ul { padding: 0 var(--kywi-space-3); }
@@ -349,10 +352,74 @@
349
352
  border-radius: var(--kywi-radius-pill);
350
353
  background: var(--kywi-sidebar-accent);
351
354
  }
355
+ .kywi-admin-nav-section-label {
356
+ padding: var(--kywi-space-3) var(--kywi-space-3) 4px;
357
+ font-size: var(--kywi-text-xs);
358
+ font-weight: var(--kywi-weight-semibold);
359
+ letter-spacing: var(--kywi-tracking-tight);
360
+ text-transform: uppercase;
361
+ color: var(--kywi-sidebar-fg-muted);
362
+ opacity: 0.7;
363
+ }
352
364
  .kywi-admin-sidebar .kywi-nav-children { margin: 1px 0 var(--kywi-space-1); }
353
365
  .kywi-admin-sidebar .kywi-nav-children .kywi-nav-link { font-size: var(--kywi-text-xs); padding-top: 5px; padding-bottom: 5px; }
354
366
  .kywi-admin-sidebar :focus-visible { box-shadow: 0 0 0 2px var(--kywi-sidebar-accent); }
355
367
 
368
+ /* ---- Collapsible groups ----------------------------------------------- */
369
+ /* A group row = the label link (navigates to group.href) + a chevron button
370
+ that toggles its children. Keeping the label a real link preserves keyboard
371
+ access to the group landing page; the separate button owns the disclosure. */
372
+ .kywi-admin-sidebar .kywi-nav-group-row { display: flex; align-items: center; gap: 2px; }
373
+ .kywi-admin-sidebar .kywi-nav-group-row .kywi-nav-link { flex: 1 1 auto; min-width: 0; }
374
+ .kywi-admin-sidebar .kywi-nav-toggle {
375
+ display: inline-flex;
376
+ align-items: center;
377
+ justify-content: center;
378
+ flex: 0 0 auto;
379
+ width: 28px;
380
+ height: 28px;
381
+ padding: 0;
382
+ margin: 0;
383
+ background: transparent;
384
+ border: 0;
385
+ border-radius: var(--kywi-radius);
386
+ color: var(--kywi-sidebar-fg-muted);
387
+ cursor: pointer;
388
+ transition: background var(--kywi-dur) var(--kywi-ease), color var(--kywi-dur) var(--kywi-ease);
389
+ }
390
+ .kywi-admin-sidebar .kywi-nav-toggle:hover {
391
+ background: var(--kywi-sidebar-hover-bg);
392
+ color: var(--kywi-sidebar-fg);
393
+ }
394
+ .kywi-admin-sidebar .kywi-nav-chevron {
395
+ display: block;
396
+ transition: transform var(--kywi-dur) var(--kywi-ease);
397
+ }
398
+ /* Chevron points down when open, rotates to point right when collapsed. */
399
+ .kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-chevron { transform: rotate(-90deg); }
400
+
401
+ /* Children collapse via an animatable grid row (0fr → 1fr) so variable-height
402
+ groups slide cleanly; `overflow:hidden` on the list clips them at 0 height.
403
+ The section-8 prefers-reduced-motion block already zeroes these transitions. */
404
+ .kywi-admin-sidebar .kywi-nav-children-wrap {
405
+ display: grid;
406
+ grid-template-rows: 1fr;
407
+ transition: grid-template-rows var(--kywi-dur-slow) var(--kywi-ease);
408
+ }
409
+ .kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-children-wrap { grid-template-rows: 0fr; }
410
+ .kywi-admin-sidebar .kywi-nav-children-wrap > .kywi-nav-children { overflow: hidden; min-height: 0; }
411
+ /* When collapsed, drop the children from the tab order + a11y tree (kept in the
412
+ DOM and query-able). Delay hiding until the collapse animation finishes;
413
+ reveal immediately on expand. */
414
+ .kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-children {
415
+ visibility: hidden;
416
+ transition: visibility 0s linear var(--kywi-dur-slow);
417
+ }
418
+ .kywi-admin-sidebar .kywi-nav-group[data-expanded="true"] .kywi-nav-children {
419
+ visibility: visible;
420
+ transition: visibility 0s;
421
+ }
422
+
356
423
  /* ---- Main + topbar ---------------------------------------------------- */
357
424
  .kywi-admin-main {
358
425
  flex: 1;
@@ -361,6 +428,21 @@
361
428
  background: var(--kywi-bg);
362
429
  }
363
430
 
431
+ /* T14: core 404 / 403 surface fallbacks (KywiAdminApp SurfaceNotFound/Forbidden). */
432
+ .kywi-admin-surface-message {
433
+ max-width: 32rem;
434
+ margin: var(--kywi-space-10) auto;
435
+ text-align: center;
436
+ color: var(--kywi-text);
437
+ }
438
+ .kywi-admin-surface-message h1 {
439
+ margin-bottom: var(--kywi-space-3);
440
+ }
441
+ .kywi-admin-surface-message p {
442
+ margin-bottom: var(--kywi-space-3);
443
+ color: var(--kywi-text-muted, var(--kywi-text));
444
+ }
445
+
364
446
  .kywi-admin-topbar {
365
447
  display: flex;
366
448
  justify-content: flex-end;
@@ -443,13 +525,15 @@
443
525
  justify-content: center;
444
526
  gap: var(--kywi-space-2);
445
527
  }
446
- .kywi-admin-shell .kywi-admin-login-dot {
447
- width: 10px;
448
- height: 10px;
449
- border-radius: var(--kywi-radius-pill);
450
- background: var(--kywi-accent);
451
- box-shadow: 0 0 0 3px var(--kywi-ring-color);
528
+ /* The login card is the hero of the sign-in screen, on a light surface — the
529
+ dark-inked wordmark reads as-is, sized a touch larger than the sidebar. */
530
+ .kywi-admin-shell .kywi-admin-login-logo {
531
+ display: block;
532
+ width: 200px;
533
+ max-width: 72%;
534
+ aspect-ratio: 1638 / 382;
452
535
  }
536
+ .kywi-admin-shell .kywi-admin-login-logo > svg { display: block; width: 100%; height: 100%; }
453
537
  .kywi-admin-shell .kywi-admin-login-subtitle {
454
538
  margin: calc(var(--kywi-space-2) * -1) 0 var(--kywi-space-2);
455
539
  text-align: center;
@@ -2614,12 +2698,18 @@
2614
2698
  background: var(--kywi-text);
2615
2699
  border-radius: 2px;
2616
2700
  }
2701
+ /* On the light mobile bar the wordmark reads directly — no chip needed. */
2617
2702
  .kywi-admin-shell .kywi-admin-mobile-brand {
2618
- font-weight: var(--kywi-weight-bold);
2619
- color: var(--kywi-text);
2620
- letter-spacing: var(--kywi-tracking-tight);
2703
+ display: inline-flex;
2704
+ align-items: center;
2621
2705
  text-decoration: none;
2622
2706
  }
2707
+ .kywi-admin-shell .kywi-admin-mobile-logo {
2708
+ display: block;
2709
+ width: 128px;
2710
+ aspect-ratio: 1638 / 382;
2711
+ }
2712
+ .kywi-admin-shell .kywi-admin-mobile-logo > svg { display: block; width: 100%; height: 100%; }
2623
2713
 
2624
2714
  /* Full-width content column with tighter gutters. */
2625
2715
  .kywi-admin-shell .kywi-admin-main {