@byline/host-tanstack-start 0.9.3

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 (511) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +48 -0
  3. package/dist/admin-shell/admin-roles/container.d.ts +34 -0
  4. package/dist/admin-shell/admin-roles/container.d.ts.map +1 -0
  5. package/dist/admin-shell/admin-roles/container.js +259 -0
  6. package/dist/admin-shell/admin-roles/container.module.js +17 -0
  7. package/dist/admin-shell/admin-roles/container_module.css +93 -0
  8. package/dist/admin-shell/admin-roles/delete.d.ts +9 -0
  9. package/dist/admin-shell/admin-roles/delete.d.ts.map +1 -0
  10. package/dist/admin-shell/admin-roles/delete.js +107 -0
  11. package/dist/admin-shell/admin-roles/delete.module.js +10 -0
  12. package/dist/admin-shell/admin-roles/delete_module.css +35 -0
  13. package/dist/admin-shell/admin-roles/list.d.ts +25 -0
  14. package/dist/admin-shell/admin-roles/list.d.ts.map +1 -0
  15. package/dist/admin-shell/admin-roles/list.js +292 -0
  16. package/dist/admin-shell/admin-roles/list.module.js +24 -0
  17. package/dist/admin-shell/admin-roles/list_module.css +113 -0
  18. package/dist/admin-shell/admin-users/container.d.ts +18 -0
  19. package/dist/admin-shell/admin-users/container.d.ts.map +1 -0
  20. package/dist/admin-shell/admin-users/container.js +418 -0
  21. package/dist/admin-shell/admin-users/container.module.js +22 -0
  22. package/dist/admin-shell/admin-users/container_module.css +136 -0
  23. package/dist/admin-shell/admin-users/delete.d.ts +9 -0
  24. package/dist/admin-shell/admin-users/delete.d.ts.map +1 -0
  25. package/dist/admin-shell/admin-users/delete.js +115 -0
  26. package/dist/admin-shell/admin-users/delete.module.js +10 -0
  27. package/dist/admin-shell/admin-users/delete_module.css +35 -0
  28. package/dist/admin-shell/admin-users/list.d.ts +13 -0
  29. package/dist/admin-shell/admin-users/list.d.ts.map +1 -0
  30. package/dist/admin-shell/admin-users/list.js +328 -0
  31. package/dist/admin-shell/admin-users/list.module.js +22 -0
  32. package/dist/admin-shell/admin-users/list_module.css +112 -0
  33. package/dist/admin-shell/chrome/admin-app-bar.d.ts +7 -0
  34. package/dist/admin-shell/chrome/admin-app-bar.d.ts.map +1 -0
  35. package/dist/admin-shell/chrome/admin-app-bar.js +71 -0
  36. package/dist/admin-shell/chrome/admin-app-bar.module.js +9 -0
  37. package/dist/admin-shell/chrome/admin-app-bar_module.css +54 -0
  38. package/dist/admin-shell/chrome/admin-layout.module.js +5 -0
  39. package/dist/admin-shell/chrome/admin-layout_module.css +8 -0
  40. package/dist/admin-shell/chrome/branding.d.ts +9 -0
  41. package/dist/admin-shell/chrome/branding.d.ts.map +1 -0
  42. package/dist/admin-shell/chrome/branding.js +17 -0
  43. package/dist/admin-shell/chrome/branding.module.js +6 -0
  44. package/dist/admin-shell/chrome/branding_module.css +11 -0
  45. package/dist/admin-shell/chrome/breadcrumbs/@types.d.ts +6 -0
  46. package/dist/admin-shell/chrome/breadcrumbs/@types.d.ts.map +1 -0
  47. package/dist/admin-shell/chrome/breadcrumbs/@types.js +1 -0
  48. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs-client.d.ts +7 -0
  49. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs-client.d.ts.map +1 -0
  50. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs-client.js +20 -0
  51. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs-provider.d.ts +24 -0
  52. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs-provider.d.ts.map +1 -0
  53. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs-provider.js +23 -0
  54. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs.d.ts +15 -0
  55. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs.d.ts.map +1 -0
  56. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs.js +77 -0
  57. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs.module.js +12 -0
  58. package/dist/admin-shell/chrome/breadcrumbs/breadcrumbs_module.css +81 -0
  59. package/dist/admin-shell/chrome/byline-logo.d.ts +12 -0
  60. package/dist/admin-shell/chrome/byline-logo.d.ts.map +1 -0
  61. package/dist/admin-shell/chrome/byline-logo.js +178 -0
  62. package/dist/admin-shell/chrome/content.d.ts +24 -0
  63. package/dist/admin-shell/chrome/content.d.ts.map +1 -0
  64. package/dist/admin-shell/chrome/content.js +31 -0
  65. package/dist/admin-shell/chrome/content.module.js +5 -0
  66. package/dist/admin-shell/chrome/content_module.css +10 -0
  67. package/dist/admin-shell/chrome/dashboard.d.ts +14 -0
  68. package/dist/admin-shell/chrome/dashboard.d.ts.map +1 -0
  69. package/dist/admin-shell/chrome/dashboard.js +129 -0
  70. package/dist/admin-shell/chrome/dashboard.module.js +19 -0
  71. package/dist/admin-shell/chrome/dashboard_module.css +175 -0
  72. package/dist/admin-shell/chrome/drawer-toggle.d.ts +9 -0
  73. package/dist/admin-shell/chrome/drawer-toggle.d.ts.map +1 -0
  74. package/dist/admin-shell/chrome/drawer-toggle.js +57 -0
  75. package/dist/admin-shell/chrome/drawer-toggle.module.js +8 -0
  76. package/dist/admin-shell/chrome/drawer-toggle_module.css +21 -0
  77. package/dist/admin-shell/chrome/hamburger.d.ts +10 -0
  78. package/dist/admin-shell/chrome/hamburger.d.ts.map +1 -0
  79. package/dist/admin-shell/chrome/hamburger.js +30 -0
  80. package/dist/admin-shell/chrome/hamburger.module.js +5 -0
  81. package/dist/admin-shell/chrome/hamburger_module.css +7 -0
  82. package/dist/admin-shell/chrome/loose-router.d.ts +33 -0
  83. package/dist/admin-shell/chrome/loose-router.d.ts.map +1 -0
  84. package/dist/admin-shell/chrome/loose-router.js +6 -0
  85. package/dist/admin-shell/chrome/menu-drawer.d.ts +10 -0
  86. package/dist/admin-shell/chrome/menu-drawer.d.ts.map +1 -0
  87. package/dist/admin-shell/chrome/menu-drawer.js +141 -0
  88. package/dist/admin-shell/chrome/menu-drawer.module.js +12 -0
  89. package/dist/admin-shell/chrome/menu-drawer_module.css +137 -0
  90. package/dist/admin-shell/chrome/menu-provider.d.ts +21 -0
  91. package/dist/admin-shell/chrome/menu-provider.d.ts.map +1 -0
  92. package/dist/admin-shell/chrome/menu-provider.js +54 -0
  93. package/dist/admin-shell/chrome/preview-toggle.d.ts +13 -0
  94. package/dist/admin-shell/chrome/preview-toggle.d.ts.map +1 -0
  95. package/dist/admin-shell/chrome/preview-toggle.js +75 -0
  96. package/dist/admin-shell/chrome/route-error.d.ts +22 -0
  97. package/dist/admin-shell/chrome/route-error.d.ts.map +1 -0
  98. package/dist/admin-shell/chrome/route-error.js +119 -0
  99. package/dist/admin-shell/chrome/route-error.module.js +14 -0
  100. package/dist/admin-shell/chrome/route-error_module.css +94 -0
  101. package/dist/admin-shell/chrome/router-pager.d.ts +19 -0
  102. package/dist/admin-shell/chrome/router-pager.d.ts.map +1 -0
  103. package/dist/admin-shell/chrome/router-pager.js +91 -0
  104. package/dist/admin-shell/chrome/sign-in-page.d.ts +19 -0
  105. package/dist/admin-shell/chrome/sign-in-page.d.ts.map +1 -0
  106. package/dist/admin-shell/chrome/sign-in-page.js +20 -0
  107. package/dist/admin-shell/chrome/sign-in-page.module.js +6 -0
  108. package/dist/admin-shell/chrome/sign-in-page_module.css +22 -0
  109. package/dist/admin-shell/chrome/sort-icons.d.ts +10 -0
  110. package/dist/admin-shell/chrome/sort-icons.d.ts.map +1 -0
  111. package/dist/admin-shell/chrome/sort-icons.js +103 -0
  112. package/dist/admin-shell/chrome/th-sortable.d.ts +23 -0
  113. package/dist/admin-shell/chrome/th-sortable.d.ts.map +1 -0
  114. package/dist/admin-shell/chrome/th-sortable.js +75 -0
  115. package/dist/admin-shell/chrome/th-sortable.module.js +10 -0
  116. package/dist/admin-shell/chrome/th-sortable_module.css +37 -0
  117. package/dist/admin-shell/chrome/use-media-query.d.ts +9 -0
  118. package/dist/admin-shell/chrome/use-media-query.d.ts.map +1 -0
  119. package/dist/admin-shell/chrome/use-media-query.js +20 -0
  120. package/dist/admin-shell/chrome/utils.d.ts +12 -0
  121. package/dist/admin-shell/chrome/utils.d.ts.map +1 -0
  122. package/dist/admin-shell/chrome/utils.js +8 -0
  123. package/dist/admin-shell/collections/api.d.ts +28 -0
  124. package/dist/admin-shell/collections/api.d.ts.map +1 -0
  125. package/dist/admin-shell/collections/api.js +51 -0
  126. package/dist/admin-shell/collections/api.module.js +9 -0
  127. package/dist/admin-shell/collections/api_module.css +42 -0
  128. package/dist/admin-shell/collections/create.d.ts +14 -0
  129. package/dist/admin-shell/collections/create.d.ts.map +1 -0
  130. package/dist/admin-shell/collections/create.js +77 -0
  131. package/dist/admin-shell/collections/edit.d.ts +19 -0
  132. package/dist/admin-shell/collections/edit.d.ts.map +1 -0
  133. package/dist/admin-shell/collections/edit.js +279 -0
  134. package/dist/admin-shell/collections/history.d.ts +20 -0
  135. package/dist/admin-shell/collections/history.d.ts.map +1 -0
  136. package/dist/admin-shell/collections/history.js +252 -0
  137. package/dist/admin-shell/collections/history.module.js +18 -0
  138. package/dist/admin-shell/collections/history_module.css +121 -0
  139. package/dist/admin-shell/collections/list.d.ts +16 -0
  140. package/dist/admin-shell/collections/list.d.ts.map +1 -0
  141. package/dist/admin-shell/collections/list.js +253 -0
  142. package/dist/admin-shell/collections/list.module.js +16 -0
  143. package/dist/admin-shell/collections/list_module.css +88 -0
  144. package/dist/admin-shell/collections/preview-link.d.ts +32 -0
  145. package/dist/admin-shell/collections/preview-link.d.ts.map +1 -0
  146. package/dist/admin-shell/collections/preview-link.js +54 -0
  147. package/dist/admin-shell/collections/tanstack-navigation-guard.d.ts +16 -0
  148. package/dist/admin-shell/collections/tanstack-navigation-guard.d.ts.map +1 -0
  149. package/dist/admin-shell/collections/tanstack-navigation-guard.js +19 -0
  150. package/dist/admin-shell/collections/view-menu.d.ts +58 -0
  151. package/dist/admin-shell/collections/view-menu.d.ts.map +1 -0
  152. package/dist/admin-shell/collections/view-menu.js +203 -0
  153. package/dist/admin-shell/collections/view-menu.module.js +11 -0
  154. package/dist/admin-shell/collections/view-menu_module.css +43 -0
  155. package/dist/auth/auth-context.d.ts +38 -0
  156. package/dist/auth/auth-context.d.ts.map +1 -0
  157. package/dist/auth/auth-context.js +57 -0
  158. package/dist/auth/auth-cookies.d.ts +35 -0
  159. package/dist/auth/auth-cookies.d.ts.map +1 -0
  160. package/dist/auth/auth-cookies.js +46 -0
  161. package/dist/auth/preview-cookies.d.ts +20 -0
  162. package/dist/auth/preview-cookies.d.ts.map +1 -0
  163. package/dist/auth/preview-cookies.js +26 -0
  164. package/dist/index.d.ts +43 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +1 -0
  167. package/dist/integrations/abilities.d.ts +67 -0
  168. package/dist/integrations/abilities.d.ts.map +1 -0
  169. package/dist/integrations/abilities.js +25 -0
  170. package/dist/integrations/api-utils.d.ts +34 -0
  171. package/dist/integrations/api-utils.d.ts.map +1 -0
  172. package/dist/integrations/api-utils.js +22 -0
  173. package/dist/integrations/byline-admin-services.d.ts +25 -0
  174. package/dist/integrations/byline-admin-services.d.ts.map +1 -0
  175. package/dist/integrations/byline-admin-services.js +26 -0
  176. package/dist/integrations/byline-client.d.ts +22 -0
  177. package/dist/integrations/byline-client.d.ts.map +1 -0
  178. package/dist/integrations/byline-client.js +13 -0
  179. package/dist/integrations/byline-core.d.ts +28 -0
  180. package/dist/integrations/byline-core.d.ts.map +1 -0
  181. package/dist/integrations/byline-core.js +5 -0
  182. package/dist/integrations/byline-field-services.d.ts +19 -0
  183. package/dist/integrations/byline-field-services.d.ts.map +1 -0
  184. package/dist/integrations/byline-field-services.js +14 -0
  185. package/dist/integrations/byline-public-client.d.ts +10 -0
  186. package/dist/integrations/byline-public-client.d.ts.map +1 -0
  187. package/dist/integrations/byline-public-client.js +15 -0
  188. package/dist/integrations/byline-viewer-client.d.ts +21 -0
  189. package/dist/integrations/byline-viewer-client.d.ts.map +1 -0
  190. package/dist/integrations/byline-viewer-client.js +39 -0
  191. package/dist/integrations/start-errors.d.ts +23 -0
  192. package/dist/integrations/start-errors.d.ts.map +1 -0
  193. package/dist/integrations/start-errors.js +32 -0
  194. package/dist/routes/create-admin-account-route.d.ts +9 -0
  195. package/dist/routes/create-admin-account-route.d.ts.map +1 -0
  196. package/dist/routes/create-admin-account-route.js +68 -0
  197. package/dist/routes/create-admin-dashboard-route.d.ts +9 -0
  198. package/dist/routes/create-admin-dashboard-route.d.ts.map +1 -0
  199. package/dist/routes/create-admin-dashboard-route.js +44 -0
  200. package/dist/routes/create-admin-layout-route.d.ts +14 -0
  201. package/dist/routes/create-admin-layout-route.d.ts.map +1 -0
  202. package/dist/routes/create-admin-layout-route.js +64 -0
  203. package/dist/routes/create-admin-permissions-route.d.ts +9 -0
  204. package/dist/routes/create-admin-permissions-route.d.ts.map +1 -0
  205. package/dist/routes/create-admin-permissions-route.js +39 -0
  206. package/dist/routes/create-admin-role-edit-route.d.ts +9 -0
  207. package/dist/routes/create-admin-role-edit-route.d.ts.map +1 -0
  208. package/dist/routes/create-admin-role-edit-route.js +79 -0
  209. package/dist/routes/create-admin-roles-list-route.d.ts +9 -0
  210. package/dist/routes/create-admin-roles-list-route.d.ts.map +1 -0
  211. package/dist/routes/create-admin-roles-list-route.js +39 -0
  212. package/dist/routes/create-admin-user-edit-route.d.ts +9 -0
  213. package/dist/routes/create-admin-user-edit-route.d.ts.map +1 -0
  214. package/dist/routes/create-admin-user-edit-route.js +86 -0
  215. package/dist/routes/create-admin-users-list-route.d.ts +9 -0
  216. package/dist/routes/create-admin-users-list-route.d.ts.map +1 -0
  217. package/dist/routes/create-admin-users-list-route.js +71 -0
  218. package/dist/routes/create-collection-api-route.d.ts +15 -0
  219. package/dist/routes/create-collection-api-route.d.ts.map +1 -0
  220. package/dist/routes/create-collection-api-route.js +71 -0
  221. package/dist/routes/create-collection-create-route.d.ts +9 -0
  222. package/dist/routes/create-collection-create-route.d.ts.map +1 -0
  223. package/dist/routes/create-collection-create-route.js +53 -0
  224. package/dist/routes/create-collection-edit-route.d.ts +15 -0
  225. package/dist/routes/create-collection-edit-route.d.ts.map +1 -0
  226. package/dist/routes/create-collection-edit-route.js +65 -0
  227. package/dist/routes/create-collection-history-route.d.ts +15 -0
  228. package/dist/routes/create-collection-history-route.d.ts.map +1 -0
  229. package/dist/routes/create-collection-history-route.js +94 -0
  230. package/dist/routes/create-collection-list-route.d.ts +9 -0
  231. package/dist/routes/create-collection-list-route.d.ts.map +1 -0
  232. package/dist/routes/create-collection-list-route.js +130 -0
  233. package/dist/routes/create-sign-in-route.d.ts +9 -0
  234. package/dist/routes/create-sign-in-route.d.ts.map +1 -0
  235. package/dist/routes/create-sign-in-route.js +21 -0
  236. package/dist/routes/index.d.ts +35 -0
  237. package/dist/routes/index.d.ts.map +1 -0
  238. package/dist/routes/index.js +14 -0
  239. package/dist/server-fns/admin-account/change-password.d.ts +30 -0
  240. package/dist/server-fns/admin-account/change-password.d.ts.map +1 -0
  241. package/dist/server-fns/admin-account/change-password.js +13 -0
  242. package/dist/server-fns/admin-account/get.d.ts +31 -0
  243. package/dist/server-fns/admin-account/get.d.ts.map +1 -0
  244. package/dist/server-fns/admin-account/get.js +13 -0
  245. package/dist/server-fns/admin-account/index.d.ts +22 -0
  246. package/dist/server-fns/admin-account/index.d.ts.map +1 -0
  247. package/dist/server-fns/admin-account/index.js +3 -0
  248. package/dist/server-fns/admin-account/update.d.ts +34 -0
  249. package/dist/server-fns/admin-account/update.d.ts.map +1 -0
  250. package/dist/server-fns/admin-account/update.js +13 -0
  251. package/dist/server-fns/admin-permissions/get-role-abilities.d.ts +16 -0
  252. package/dist/server-fns/admin-permissions/get-role-abilities.d.ts.map +1 -0
  253. package/dist/server-fns/admin-permissions/get-role-abilities.js +14 -0
  254. package/dist/server-fns/admin-permissions/index.d.ts +25 -0
  255. package/dist/server-fns/admin-permissions/index.d.ts.map +1 -0
  256. package/dist/server-fns/admin-permissions/index.js +4 -0
  257. package/dist/server-fns/admin-permissions/list-registered.d.ts +33 -0
  258. package/dist/server-fns/admin-permissions/list-registered.d.ts.map +1 -0
  259. package/dist/server-fns/admin-permissions/list-registered.js +14 -0
  260. package/dist/server-fns/admin-permissions/set-role-abilities.d.ts +16 -0
  261. package/dist/server-fns/admin-permissions/set-role-abilities.d.ts.map +1 -0
  262. package/dist/server-fns/admin-permissions/set-role-abilities.js +14 -0
  263. package/dist/server-fns/admin-permissions/who-has.d.ts +26 -0
  264. package/dist/server-fns/admin-permissions/who-has.d.ts.map +1 -0
  265. package/dist/server-fns/admin-permissions/who-has.js +14 -0
  266. package/dist/server-fns/admin-roles/create.d.ts +24 -0
  267. package/dist/server-fns/admin-roles/create.d.ts.map +1 -0
  268. package/dist/server-fns/admin-roles/create.js +13 -0
  269. package/dist/server-fns/admin-roles/delete.d.ts +17 -0
  270. package/dist/server-fns/admin-roles/delete.d.ts.map +1 -0
  271. package/dist/server-fns/admin-roles/delete.js +13 -0
  272. package/dist/server-fns/admin-roles/get.d.ts +22 -0
  273. package/dist/server-fns/admin-roles/get.d.ts.map +1 -0
  274. package/dist/server-fns/admin-roles/get.js +13 -0
  275. package/dist/server-fns/admin-roles/index.d.ts +23 -0
  276. package/dist/server-fns/admin-roles/index.d.ts.map +1 -0
  277. package/dist/server-fns/admin-roles/index.js +6 -0
  278. package/dist/server-fns/admin-roles/list.d.ts +26 -0
  279. package/dist/server-fns/admin-roles/list.d.ts.map +1 -0
  280. package/dist/server-fns/admin-roles/list.js +13 -0
  281. package/dist/server-fns/admin-roles/reorder.d.ts +15 -0
  282. package/dist/server-fns/admin-roles/reorder.d.ts.map +1 -0
  283. package/dist/server-fns/admin-roles/reorder.js +13 -0
  284. package/dist/server-fns/admin-roles/update.d.ts +27 -0
  285. package/dist/server-fns/admin-roles/update.d.ts.map +1 -0
  286. package/dist/server-fns/admin-roles/update.js +13 -0
  287. package/dist/server-fns/admin-users/create.d.ts +35 -0
  288. package/dist/server-fns/admin-users/create.d.ts.map +1 -0
  289. package/dist/server-fns/admin-users/create.js +13 -0
  290. package/dist/server-fns/admin-users/delete.d.ts +17 -0
  291. package/dist/server-fns/admin-users/delete.d.ts.map +1 -0
  292. package/dist/server-fns/admin-users/delete.js +13 -0
  293. package/dist/server-fns/admin-users/disable.d.ts +15 -0
  294. package/dist/server-fns/admin-users/disable.d.ts.map +1 -0
  295. package/dist/server-fns/admin-users/disable.js +13 -0
  296. package/dist/server-fns/admin-users/enable.d.ts +15 -0
  297. package/dist/server-fns/admin-users/enable.d.ts.map +1 -0
  298. package/dist/server-fns/admin-users/enable.js +13 -0
  299. package/dist/server-fns/admin-users/get-user-roles.d.ts +25 -0
  300. package/dist/server-fns/admin-users/get-user-roles.d.ts.map +1 -0
  301. package/dist/server-fns/admin-users/get-user-roles.js +13 -0
  302. package/dist/server-fns/admin-users/get.d.ts +29 -0
  303. package/dist/server-fns/admin-users/get.d.ts.map +1 -0
  304. package/dist/server-fns/admin-users/get.js +13 -0
  305. package/dist/server-fns/admin-users/index.d.ts +28 -0
  306. package/dist/server-fns/admin-users/index.d.ts.map +1 -0
  307. package/dist/server-fns/admin-users/index.js +10 -0
  308. package/dist/server-fns/admin-users/list.d.ts +51 -0
  309. package/dist/server-fns/admin-users/list.d.ts.map +1 -0
  310. package/dist/server-fns/admin-users/list.js +13 -0
  311. package/dist/server-fns/admin-users/set-password.d.ts +30 -0
  312. package/dist/server-fns/admin-users/set-password.d.ts.map +1 -0
  313. package/dist/server-fns/admin-users/set-password.js +13 -0
  314. package/dist/server-fns/admin-users/set-user-roles.d.ts +25 -0
  315. package/dist/server-fns/admin-users/set-user-roles.d.ts.map +1 -0
  316. package/dist/server-fns/admin-users/set-user-roles.js +13 -0
  317. package/dist/server-fns/admin-users/update.d.ts +37 -0
  318. package/dist/server-fns/admin-users/update.d.ts.map +1 -0
  319. package/dist/server-fns/admin-users/update.js +13 -0
  320. package/dist/server-fns/auth/current-user.d.ts +38 -0
  321. package/dist/server-fns/auth/current-user.d.ts.map +1 -0
  322. package/dist/server-fns/auth/current-user.js +52 -0
  323. package/dist/server-fns/auth/index.d.ts +11 -0
  324. package/dist/server-fns/auth/index.d.ts.map +1 -0
  325. package/dist/server-fns/auth/index.js +3 -0
  326. package/dist/server-fns/auth/sign-in.d.ts +19 -0
  327. package/dist/server-fns/auth/sign-in.d.ts.map +1 -0
  328. package/dist/server-fns/auth/sign-in.js +31 -0
  329. package/dist/server-fns/auth/sign-out.d.ts +11 -0
  330. package/dist/server-fns/auth/sign-out.d.ts.map +1 -0
  331. package/dist/server-fns/auth/sign-out.js +17 -0
  332. package/dist/server-fns/collections/create.d.ts +21 -0
  333. package/dist/server-fns/collections/create.d.ts.map +1 -0
  334. package/dist/server-fns/collections/create.js +40 -0
  335. package/dist/server-fns/collections/delete.d.ts +18 -0
  336. package/dist/server-fns/collections/delete.d.ts.map +1 -0
  337. package/dist/server-fns/collections/delete.js +44 -0
  338. package/dist/server-fns/collections/get.d.ts +26 -0
  339. package/dist/server-fns/collections/get.d.ts.map +1 -0
  340. package/dist/server-fns/collections/get.js +133 -0
  341. package/dist/server-fns/collections/history.d.ts +43 -0
  342. package/dist/server-fns/collections/history.d.ts.map +1 -0
  343. package/dist/server-fns/collections/history.js +29 -0
  344. package/dist/server-fns/collections/index.d.ts +16 -0
  345. package/dist/server-fns/collections/index.d.ts.map +1 -0
  346. package/dist/server-fns/collections/index.js +9 -0
  347. package/dist/server-fns/collections/list.d.ts +54 -0
  348. package/dist/server-fns/collections/list.d.ts.map +1 -0
  349. package/dist/server-fns/collections/list.js +65 -0
  350. package/dist/server-fns/collections/stats.d.ts +17 -0
  351. package/dist/server-fns/collections/stats.d.ts.map +1 -0
  352. package/dist/server-fns/collections/stats.js +28 -0
  353. package/dist/server-fns/collections/status.d.ts +31 -0
  354. package/dist/server-fns/collections/status.d.ts.map +1 -0
  355. package/dist/server-fns/collections/status.js +79 -0
  356. package/dist/server-fns/collections/update.d.ts +26 -0
  357. package/dist/server-fns/collections/update.d.ts.map +1 -0
  358. package/dist/server-fns/collections/update.js +41 -0
  359. package/dist/server-fns/collections/upload.d.ts +57 -0
  360. package/dist/server-fns/collections/upload.d.ts.map +1 -0
  361. package/dist/server-fns/collections/upload.js +132 -0
  362. package/dist/server-fns/collections/utils.d.ts +15 -0
  363. package/dist/server-fns/collections/utils.d.ts.map +1 -0
  364. package/dist/server-fns/collections/utils.js +4 -0
  365. package/dist/server-fns/preview/disable.d.ts +12 -0
  366. package/dist/server-fns/preview/disable.d.ts.map +1 -0
  367. package/dist/server-fns/preview/disable.js +12 -0
  368. package/dist/server-fns/preview/enable.d.ts +12 -0
  369. package/dist/server-fns/preview/enable.d.ts.map +1 -0
  370. package/dist/server-fns/preview/enable.js +14 -0
  371. package/dist/server-fns/preview/index.d.ts +11 -0
  372. package/dist/server-fns/preview/index.d.ts.map +1 -0
  373. package/dist/server-fns/preview/index.js +3 -0
  374. package/dist/server-fns/preview/state.d.ts +11 -0
  375. package/dist/server-fns/preview/state.d.ts.map +1 -0
  376. package/dist/server-fns/preview/state.js +8 -0
  377. package/package.json +164 -0
  378. package/src/admin-shell/admin-roles/container.module.css +132 -0
  379. package/src/admin-shell/admin-roles/container.tsx +209 -0
  380. package/src/admin-shell/admin-roles/delete.module.css +52 -0
  381. package/src/admin-shell/admin-roles/delete.tsx +117 -0
  382. package/src/admin-shell/admin-roles/list.module.css +158 -0
  383. package/src/admin-shell/admin-roles/list.tsx +308 -0
  384. package/src/admin-shell/admin-users/container.module.css +199 -0
  385. package/src/admin-shell/admin-users/container.tsx +344 -0
  386. package/src/admin-shell/admin-users/delete.module.css +52 -0
  387. package/src/admin-shell/admin-users/delete.tsx +129 -0
  388. package/src/admin-shell/admin-users/list.module.css +164 -0
  389. package/src/admin-shell/admin-users/list.tsx +314 -0
  390. package/src/admin-shell/chrome/admin-app-bar.module.css +72 -0
  391. package/src/admin-shell/chrome/admin-app-bar.tsx +74 -0
  392. package/src/admin-shell/chrome/admin-layout.module.css +16 -0
  393. package/src/admin-shell/chrome/branding.module.css +20 -0
  394. package/src/admin-shell/chrome/branding.tsx +23 -0
  395. package/src/admin-shell/chrome/breadcrumbs/@types.ts +5 -0
  396. package/src/admin-shell/chrome/breadcrumbs/breadcrumbs-client.tsx +30 -0
  397. package/src/admin-shell/chrome/breadcrumbs/breadcrumbs-provider.tsx +48 -0
  398. package/src/admin-shell/chrome/breadcrumbs/breadcrumbs.module.css +93 -0
  399. package/src/admin-shell/chrome/breadcrumbs/breadcrumbs.tsx +96 -0
  400. package/src/admin-shell/chrome/byline-logo.tsx +151 -0
  401. package/src/admin-shell/chrome/content.module.css +16 -0
  402. package/src/admin-shell/chrome/content.tsx +60 -0
  403. package/src/admin-shell/chrome/dashboard.module.css +245 -0
  404. package/src/admin-shell/chrome/dashboard.tsx +128 -0
  405. package/src/admin-shell/chrome/drawer-toggle.module.css +30 -0
  406. package/src/admin-shell/chrome/drawer-toggle.tsx +62 -0
  407. package/src/admin-shell/chrome/hamburger.module.css +16 -0
  408. package/src/admin-shell/chrome/hamburger.tsx +56 -0
  409. package/src/admin-shell/chrome/loose-router.ts +47 -0
  410. package/src/admin-shell/chrome/menu-drawer.module.css +196 -0
  411. package/src/admin-shell/chrome/menu-drawer.tsx +155 -0
  412. package/src/admin-shell/chrome/menu-provider.tsx +95 -0
  413. package/src/admin-shell/chrome/preview-toggle.tsx +107 -0
  414. package/src/admin-shell/chrome/route-error.module.css +114 -0
  415. package/src/admin-shell/chrome/route-error.tsx +125 -0
  416. package/src/admin-shell/chrome/router-pager.tsx +179 -0
  417. package/src/admin-shell/chrome/sign-in-page.module.css +32 -0
  418. package/src/admin-shell/chrome/sign-in-page.tsx +35 -0
  419. package/src/admin-shell/chrome/sort-icons.tsx +127 -0
  420. package/src/admin-shell/chrome/th-sortable.module.css +51 -0
  421. package/src/admin-shell/chrome/th-sortable.tsx +114 -0
  422. package/src/admin-shell/chrome/use-media-query.ts +28 -0
  423. package/src/admin-shell/chrome/utils.ts +20 -0
  424. package/src/admin-shell/collections/api.module.css +62 -0
  425. package/src/admin-shell/collections/api.tsx +70 -0
  426. package/src/admin-shell/collections/create.tsx +108 -0
  427. package/src/admin-shell/collections/edit.tsx +319 -0
  428. package/src/admin-shell/collections/history.module.css +156 -0
  429. package/src/admin-shell/collections/history.tsx +352 -0
  430. package/src/admin-shell/collections/list.module.css +124 -0
  431. package/src/admin-shell/collections/list.tsx +313 -0
  432. package/src/admin-shell/collections/preview-link.tsx +138 -0
  433. package/src/admin-shell/collections/tanstack-navigation-guard.ts +43 -0
  434. package/src/admin-shell/collections/view-menu.module.css +60 -0
  435. package/src/admin-shell/collections/view-menu.tsx +238 -0
  436. package/src/auth/auth-context.test.node.ts +200 -0
  437. package/src/auth/auth-context.ts +119 -0
  438. package/src/auth/auth-cookies.ts +113 -0
  439. package/src/auth/preview-cookies.ts +73 -0
  440. package/src/declarations.d.ts +4 -0
  441. package/src/index.ts +44 -0
  442. package/src/integrations/abilities.tsx +90 -0
  443. package/src/integrations/api-utils.ts +66 -0
  444. package/src/integrations/byline-admin-services.ts +86 -0
  445. package/src/integrations/byline-client.ts +40 -0
  446. package/src/integrations/byline-core.ts +32 -0
  447. package/src/integrations/byline-field-services.ts +35 -0
  448. package/src/integrations/byline-public-client.ts +53 -0
  449. package/src/integrations/byline-viewer-client.ts +99 -0
  450. package/src/integrations/start-errors.ts +86 -0
  451. package/src/routes/create-admin-account-route.tsx +65 -0
  452. package/src/routes/create-admin-dashboard-route.tsx +52 -0
  453. package/src/routes/create-admin-layout-route.tsx +89 -0
  454. package/src/routes/create-admin-permissions-route.tsx +43 -0
  455. package/src/routes/create-admin-role-edit-route.tsx +88 -0
  456. package/src/routes/create-admin-roles-list-route.tsx +39 -0
  457. package/src/routes/create-admin-user-edit-route.tsx +105 -0
  458. package/src/routes/create-admin-users-list-route.tsx +84 -0
  459. package/src/routes/create-collection-api-route.tsx +111 -0
  460. package/src/routes/create-collection-create-route.tsx +66 -0
  461. package/src/routes/create-collection-edit-route.tsx +102 -0
  462. package/src/routes/create-collection-history-route.tsx +130 -0
  463. package/src/routes/create-collection-list-route.tsx +175 -0
  464. package/src/routes/create-sign-in-route.tsx +39 -0
  465. package/src/routes/index.ts +36 -0
  466. package/src/server-fns/admin-account/change-password.ts +27 -0
  467. package/src/server-fns/admin-account/get.ts +27 -0
  468. package/src/server-fns/admin-account/index.ts +28 -0
  469. package/src/server-fns/admin-account/update.ts +31 -0
  470. package/src/server-fns/admin-permissions/get-role-abilities.ts +27 -0
  471. package/src/server-fns/admin-permissions/index.ts +36 -0
  472. package/src/server-fns/admin-permissions/list-registered.ts +36 -0
  473. package/src/server-fns/admin-permissions/set-role-abilities.ts +32 -0
  474. package/src/server-fns/admin-permissions/who-has.ts +24 -0
  475. package/src/server-fns/admin-roles/create.ts +28 -0
  476. package/src/server-fns/admin-roles/delete.ts +25 -0
  477. package/src/server-fns/admin-roles/get.ts +21 -0
  478. package/src/server-fns/admin-roles/index.ts +25 -0
  479. package/src/server-fns/admin-roles/list.ts +27 -0
  480. package/src/server-fns/admin-roles/reorder.ts +21 -0
  481. package/src/server-fns/admin-roles/update.ts +31 -0
  482. package/src/server-fns/admin-users/create.ts +32 -0
  483. package/src/server-fns/admin-users/delete.ts +21 -0
  484. package/src/server-fns/admin-users/disable.ts +24 -0
  485. package/src/server-fns/admin-users/enable.ts +24 -0
  486. package/src/server-fns/admin-users/get-user-roles.ts +21 -0
  487. package/src/server-fns/admin-users/get.ts +21 -0
  488. package/src/server-fns/admin-users/index.ts +35 -0
  489. package/src/server-fns/admin-users/list.ts +40 -0
  490. package/src/server-fns/admin-users/set-password.ts +27 -0
  491. package/src/server-fns/admin-users/set-user-roles.ts +26 -0
  492. package/src/server-fns/admin-users/update.ts +34 -0
  493. package/src/server-fns/auth/current-user.ts +117 -0
  494. package/src/server-fns/auth/index.ts +15 -0
  495. package/src/server-fns/auth/sign-in.ts +71 -0
  496. package/src/server-fns/auth/sign-out.ts +42 -0
  497. package/src/server-fns/collections/create.ts +58 -0
  498. package/src/server-fns/collections/delete.ts +62 -0
  499. package/src/server-fns/collections/get.ts +233 -0
  500. package/src/server-fns/collections/history.ts +73 -0
  501. package/src/server-fns/collections/index.ts +16 -0
  502. package/src/server-fns/collections/list.ts +121 -0
  503. package/src/server-fns/collections/stats.ts +52 -0
  504. package/src/server-fns/collections/status.ts +102 -0
  505. package/src/server-fns/collections/update.ts +67 -0
  506. package/src/server-fns/collections/upload.ts +274 -0
  507. package/src/server-fns/collections/utils.ts +17 -0
  508. package/src/server-fns/preview/disable.ts +24 -0
  509. package/src/server-fns/preview/enable.ts +27 -0
  510. package/src/server-fns/preview/index.ts +11 -0
  511. package/src/server-fns/preview/state.ts +30 -0
@@ -0,0 +1,313 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ import { useMemo, useState } from 'react'
10
+ import { useRouterState } from '@tanstack/react-router'
11
+
12
+ import type { ColumnDefinition, WorkflowStatus } from '@byline/core'
13
+ import type { AnyCollectionSchemaTypes } from '@byline/core/zod-schemas'
14
+ import { renderFormatted, StatusBadge } from '@byline/ui'
15
+ import {
16
+ Container,
17
+ IconButton,
18
+ LoaderRing,
19
+ PlusIcon,
20
+ Search,
21
+ Section,
22
+ Select,
23
+ Table,
24
+ } from '@infonomic/uikit/react'
25
+ import cx from 'classnames'
26
+
27
+ import { Link, useNavigate } from '../chrome/loose-router.js'
28
+ import { RouterPager } from '../chrome/router-pager.js'
29
+ import { TableHeadingCellSortable } from '../chrome/th-sortable.js'
30
+ import { formatNumber } from '../chrome/utils.js'
31
+ import styles from './list.module.css'
32
+
33
+ /**
34
+ * Resolve a column value from a document, checking `fields` first (user-defined
35
+ * collection fields) then the root (metadata like status, updated_at).
36
+ */
37
+ // biome-ignore lint/suspicious/noExplicitAny: collection rows are heterogeneous
38
+ function getColumnValue(document: any, fieldName: string): any {
39
+ if (document.fields && fieldName in document.fields) {
40
+ return document.fields[fieldName]
41
+ }
42
+ return document[fieldName]
43
+ }
44
+
45
+ function Stats({ total }: { total: number }) {
46
+ const [showLoader, _] = useState(false)
47
+
48
+ if (showLoader) {
49
+ return (
50
+ <LoaderRing
51
+ className={cx('byline-coll-list-stats-loader', styles.statsLoader)}
52
+ size={24}
53
+ color="#666666"
54
+ />
55
+ )
56
+ }
57
+ return (
58
+ <span className={cx('byline-coll-list-stats', styles.stats)}>
59
+ {formatNumber(total as number, 0)}
60
+ </span>
61
+ )
62
+ }
63
+
64
+ function padRows(value: number) {
65
+ return Array.from({ length: value }).map((_, index) => (
66
+ <div
67
+ key={`empty-row-${
68
+ // biome-ignore lint/suspicious/noArrayIndexKey: we're okay here
69
+ index
70
+ }`}
71
+ className={cx('byline-coll-list-pad-row', styles.padRow)}
72
+ >
73
+ &nbsp;
74
+ </div>
75
+ ))
76
+ }
77
+
78
+ export const ListView = ({
79
+ data,
80
+ columns,
81
+ workflowStatuses,
82
+ useAsTitle,
83
+ }: {
84
+ data: AnyCollectionSchemaTypes['ListType']
85
+ columns: ColumnDefinition[]
86
+ workflowStatuses?: WorkflowStatus[]
87
+ useAsTitle?: string
88
+ }) => {
89
+ const navigate = useNavigate()
90
+ const location = useRouterState({ select: (s) => s.location })
91
+
92
+ // Memoized so Base UI's SelectRoot doesn't see a fresh items identity on
93
+ // every render — a non-stable items array combined with a controlled value
94
+ // trips an internal store sync loop (manifests as "Maximum update depth
95
+ // exceeded" inside SelectRoot after navigations that cause a re-render).
96
+ const statusItems = useMemo(
97
+ () => [
98
+ { value: '_all', label: 'All' },
99
+ ...(workflowStatuses?.map((ws) => ({ value: ws.name, label: ws.label ?? ws.name })) ?? []),
100
+ ],
101
+ [workflowStatuses]
102
+ )
103
+
104
+ const handleOnSearch = (query: string): void => {
105
+ if (query != null && query.length > 0) {
106
+ const params = structuredClone(location.search)
107
+ delete params.page
108
+ params.query = query
109
+ navigate({
110
+ to: '/admin/collections/$collection' as never,
111
+ params: { collection: data.included.collection.path },
112
+ search: params,
113
+ })
114
+ }
115
+ }
116
+
117
+ const handleOnClear = (): void => {
118
+ const params = structuredClone(location.search)
119
+ delete params.page
120
+ delete params.query
121
+ navigate({
122
+ to: '/admin/collections/$collection' as never,
123
+ params: { collection: data.included.collection.path },
124
+ search: params,
125
+ })
126
+ }
127
+
128
+ const handleOnStatusFilter = (value: string | null): void => {
129
+ if (typeof value !== 'string' || value.length === 0) return
130
+ const params = structuredClone(location.search)
131
+ delete params.page
132
+ if (value === '_all') {
133
+ delete params.status
134
+ } else {
135
+ params.status = value
136
+ }
137
+ navigate({
138
+ to: '/admin/collections/$collection' as never,
139
+ params: { collection: data.included.collection.path },
140
+ search: params,
141
+ })
142
+ }
143
+
144
+ function handleOnPageSizeChange(value: string | null): void {
145
+ if (typeof value !== 'string' || value.length === 0) return
146
+ const params = structuredClone(location.search)
147
+ delete params.page
148
+ params.page_size = Number.parseInt(value, 10)
149
+ navigate({
150
+ to: '/admin/collections/$collection' as never,
151
+ params: { collection: data.included.collection.path },
152
+ search: params,
153
+ })
154
+ }
155
+
156
+ return (
157
+ <Section>
158
+ <Container>
159
+ <div className={cx('byline-coll-list-head', styles.head)}>
160
+ <h1 className={cx('byline-coll-list-title', styles.title)}>
161
+ {data.included.collection.labels.plural as string}
162
+ </h1>
163
+ <Stats total={data?.meta.total} />
164
+ <IconButton
165
+ aria-label="Create New"
166
+ render={
167
+ <Link
168
+ to={'/admin/collections/$collection/create' as never}
169
+ params={{ collection: data.included.collection.path }}
170
+ />
171
+ }
172
+ >
173
+ <PlusIcon height="18px" width="18px" svgClassName="stroke-white" />
174
+ </IconButton>
175
+ </div>
176
+ <div className={cx('byline-coll-list-options', styles.options)}>
177
+ <Search
178
+ onSearch={handleOnSearch}
179
+ onClear={handleOnClear}
180
+ inputSize="sm"
181
+ placeholder="Search"
182
+ className={cx('byline-coll-list-search', styles.search)}
183
+ />
184
+
185
+ {workflowStatuses && workflowStatuses.length > 1 && (
186
+ <Select<string>
187
+ id="status_filter"
188
+ name="status_filter"
189
+ size="sm"
190
+ value={(location.search as { status?: string }).status ?? '_all'}
191
+ items={statusItems}
192
+ onValueChange={handleOnStatusFilter}
193
+ />
194
+ )}
195
+
196
+ <RouterPager
197
+ page={data?.meta.page}
198
+ count={data?.meta.totalPages}
199
+ showFirstButton
200
+ showLastButton
201
+ componentName="pagerTop"
202
+ aria-label="Top Pager"
203
+ />
204
+ </div>
205
+ <Table.Container className={cx('byline-coll-list-table-wrap', styles.tableWrap)}>
206
+ <Table>
207
+ <Table.Header>
208
+ <Table.Row>
209
+ {columns.map((column) => {
210
+ return (
211
+ <TableHeadingCellSortable
212
+ key={String(column.fieldName)}
213
+ fieldName={String(column.fieldName)}
214
+ label={column.label}
215
+ sortable={column.sortable}
216
+ scope="col"
217
+ align={column.align}
218
+ className={column.className}
219
+ />
220
+ )
221
+ })}
222
+ </Table.Row>
223
+ </Table.Header>
224
+
225
+ <Table.Body>
226
+ {data?.docs?.map((document) => {
227
+ return (
228
+ <Table.Row key={document.id}>
229
+ {columns.map((column) => (
230
+ <Table.Cell
231
+ key={String(column.fieldName)}
232
+ className={cx({
233
+ 'byline-coll-list-cell-right': column.align === 'right',
234
+ [styles.cellRight]: column.align === 'right',
235
+ 'byline-coll-list-cell-center': column.align === 'center',
236
+ [styles.cellCenter]: column.align === 'center',
237
+ })}
238
+ >
239
+ {useAsTitle && column.fieldName === useAsTitle ? (
240
+ <Link
241
+ to={'/admin/collections/$collection/$id' as never}
242
+ params={{
243
+ collection: data.included.collection.path,
244
+ id: document.id,
245
+ }}
246
+ >
247
+ {column.formatter
248
+ ? renderFormatted(
249
+ getColumnValue(document, column.fieldName as string),
250
+ document,
251
+ column.formatter
252
+ )
253
+ : (getColumnValue(document, column.fieldName as string) ?? '------')}
254
+ </Link>
255
+ ) : column.formatter ? (
256
+ renderFormatted(
257
+ getColumnValue(document, column.fieldName as string),
258
+ document,
259
+ column.formatter
260
+ )
261
+ ) : column.fieldName === 'status' && workflowStatuses ? (
262
+ <StatusBadge
263
+ status={document.status}
264
+ workflowStatuses={workflowStatuses}
265
+ hasPublishedVersion={document.hasPublishedVersion}
266
+ />
267
+ ) : (
268
+ String(getColumnValue(document, column.fieldName as string) ?? '')
269
+ )}
270
+ </Table.Cell>
271
+ ))}
272
+ </Table.Row>
273
+ )
274
+ })}
275
+ </Table.Body>
276
+ </Table>
277
+ {padRows(6 - (data?.docs?.length ?? 0))}
278
+ </Table.Container>
279
+ <div
280
+ className={cx(
281
+ 'byline-coll-list-options byline-coll-list-options-bottom',
282
+ styles.options,
283
+ styles.optionsBottom
284
+ )}
285
+ >
286
+ <Select<string>
287
+ containerClassName={cx('byline-coll-list-page-size', styles.pageSize)}
288
+ id="page_size"
289
+ name="page_size"
290
+ size="sm"
291
+ defaultValue="15"
292
+ items={[
293
+ { value: '15', label: '15' },
294
+ { value: '30', label: '30' },
295
+ { value: '50', label: '50' },
296
+ { value: '100', label: '100' },
297
+ ]}
298
+ onValueChange={handleOnPageSizeChange}
299
+ />
300
+ <RouterPager
301
+ smoothScrollToTop={true}
302
+ page={data?.meta.page}
303
+ count={data?.meta.totalPages}
304
+ showFirstButton
305
+ showLastButton
306
+ componentName="pagerBottom"
307
+ aria-label="Bottom Pager"
308
+ />
309
+ </div>
310
+ </Container>
311
+ </Section>
312
+ )
313
+ }
@@ -0,0 +1,138 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ /**
10
+ * Per-document preview affordance for the admin shell.
11
+ *
12
+ * Renders an external-link icon that, when clicked:
13
+ * 1. Calls `enablePreviewModeFn()` to set the `byline_preview` cookie
14
+ * on the admin's session — so the front-end host's viewer client
15
+ * starts surfacing draft versions for this admin's subsequent
16
+ * requests.
17
+ * 2. Opens the document's preview URL in a new tab via
18
+ * `window.open(url, '_blank', 'noopener,noreferrer')`.
19
+ *
20
+ * The preview URL comes from `CollectionAdminConfig.preview.url(doc, ctx)`
21
+ * when configured; otherwise it falls back to the conventional
22
+ * `/${collectionPath}/${doc.path}`. When the configured `url(...)` returns
23
+ * `null` (missing slug, missing required relation, etc.), the icon is
24
+ * not rendered at all — there is no public URL meaningful for this
25
+ * document yet, so offering a preview link would just lead to a 404.
26
+ *
27
+ * The component does not load the document itself. Callers pass the
28
+ * already-loaded `doc` from their route loader. If `preview.populate`
29
+ * is configured, it's the loader's responsibility to apply that hint
30
+ * when fetching the document so `url(doc, ctx)` sees the resolved
31
+ * relation values it expects (e.g. `doc.fields.area?.document?.path`).
32
+ *
33
+ * Two-step "enable cookie then navigate" intentionally avoids the
34
+ * Payload-style `/routes/draft?url=...&secret=...` redirect handler:
35
+ * `enablePreviewModeFn()` is itself the gate (it requires a valid admin
36
+ * session before setting the cookie), so no shared secret needs to ride
37
+ * in the URL.
38
+ */
39
+
40
+ import { useState } from 'react'
41
+
42
+ import type { CollectionAdminConfig, PreviewDocument } from '@byline/core'
43
+ import { ExternalLinkIcon, IconButton, useToastManager } from '@infonomic/uikit/react'
44
+ import cx from 'classnames'
45
+
46
+ import { enablePreviewModeFn } from '../../server-fns/preview/index.js'
47
+
48
+ export interface PreviewLinkProps {
49
+ /** Collection path (e.g. `'news'`, `'pages'`). */
50
+ collectionPath: string
51
+ /** The loaded document — must include `id`, `path`, and `fields`. */
52
+ doc: PreviewDocument
53
+ /** Admin config for the collection. Read for `preview.url`. */
54
+ adminConfig?: CollectionAdminConfig
55
+ /** Current content locale (forwarded into `preview.url(doc, { locale })`). */
56
+ locale?: string
57
+ /** Optional className for the IconButton. */
58
+ className?: string
59
+ }
60
+
61
+ /**
62
+ * Resolve the preview URL for a doc against an admin config. Exported so
63
+ * other surfaces (list-row preview links in the future) can share the
64
+ * same fallback logic.
65
+ *
66
+ * Returns:
67
+ * - `string` → URL to open
68
+ * - `null` → no preview URL meaningful for this doc; hide affordance
69
+ */
70
+ export function resolvePreviewUrl(
71
+ doc: PreviewDocument,
72
+ collectionPath: string,
73
+ adminConfig: CollectionAdminConfig | undefined,
74
+ locale: string | undefined
75
+ ): string | null {
76
+ if (adminConfig?.preview) {
77
+ return adminConfig.preview.url(doc, { locale })
78
+ }
79
+ // Default convention: collection lives at `/${collectionPath}/${path}`.
80
+ // Returns null when the doc has no path yet (unsaved, awaiting slug).
81
+ if (!doc.path) return null
82
+ return `/${collectionPath}/${doc.path}`
83
+ }
84
+
85
+ export const PreviewLink = ({
86
+ collectionPath,
87
+ doc,
88
+ adminConfig,
89
+ locale,
90
+ className,
91
+ }: PreviewLinkProps) => {
92
+ const toastManager = useToastManager()
93
+ const [busy, setBusy] = useState(false)
94
+
95
+ const url = resolvePreviewUrl(doc, collectionPath, adminConfig, locale)
96
+ if (url == null) return null
97
+
98
+ const handleClick = async () => {
99
+ if (busy) return
100
+ setBusy(true)
101
+ try {
102
+ // Enable preview mode for the admin's browser session before opening
103
+ // the URL. The viewer client on the front-end host reads the cookie
104
+ // on subsequent requests and elevates the read context.
105
+ await enablePreviewModeFn()
106
+ // `noopener,noreferrer` so the opened tab can't reach back into
107
+ // the admin window via `window.opener`.
108
+ window.open(url, '_blank', 'noopener,noreferrer')
109
+ } catch (err) {
110
+ toastManager.add({
111
+ title: 'Preview',
112
+ description: `Could not enable preview mode: ${(err as Error).message}`,
113
+ data: {
114
+ intent: 'danger',
115
+ iconType: 'danger',
116
+ icon: true,
117
+ close: true,
118
+ },
119
+ })
120
+ } finally {
121
+ setBusy(false)
122
+ }
123
+ }
124
+
125
+ return (
126
+ <IconButton
127
+ className={cx('byline-preview-link', className)}
128
+ size="xs"
129
+ variant="text"
130
+ disabled={busy}
131
+ onClick={handleClick}
132
+ aria-label="Open preview in new tab"
133
+ title="Preview"
134
+ >
135
+ <ExternalLinkIcon width="20px" height="20px" className="byline-preview-link-icon" />
136
+ </IconButton>
137
+ )
138
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ /**
10
+ * TanStack Router adapter for the framework-agnostic NavigationGuard interface.
11
+ *
12
+ * This file lives in `@byline/host-tanstack-start` (not in `@byline/ui`) because
13
+ * it depends on `@tanstack/react-router` — a framework-specific dependency.
14
+ */
15
+
16
+ import { useCallback } from 'react'
17
+ import { useBlocker } from '@tanstack/react-router'
18
+
19
+ import type { NavigationGuardResult, UseNavigationGuard } from '@byline/ui'
20
+
21
+ /**
22
+ * Navigation guard backed by TanStack Router's `useBlocker`.
23
+ *
24
+ * Blocks both in-app (soft) navigation and the browser's native `beforeunload`
25
+ * event when `shouldBlock` is `true`.
26
+ */
27
+ export const useTanStackNavigationGuard: UseNavigationGuard = (shouldBlock) => {
28
+ const shouldBlockFn = useCallback(() => shouldBlock, [shouldBlock])
29
+
30
+ const blocker = useBlocker({
31
+ shouldBlockFn,
32
+ enableBeforeUnload: shouldBlock,
33
+ withResolver: true,
34
+ })
35
+
36
+ const result: NavigationGuardResult = {
37
+ isBlocked: blocker.status === 'blocked',
38
+ stay: () => blocker.reset?.(),
39
+ proceed: () => blocker.proceed?.(),
40
+ }
41
+
42
+ return result
43
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * ViewMenu — mini-nav bar for document-level views (Edit, History, API).
3
+ *
4
+ * Override handles:
5
+ * .byline-view-menu — outer flex row
6
+ * .byline-view-menu-label — locale/depth label (lg-only)
7
+ * .byline-view-menu-button — primary view buttons (Edit/API)
8
+ * .byline-view-menu-icon-button — history icon button
9
+ */
10
+
11
+ .root,
12
+ :global(.byline-view-menu) {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 0.5rem;
16
+ margin-top: 0.5rem;
17
+ margin-bottom: 0.5rem;
18
+ }
19
+
20
+ .label,
21
+ :global(.byline-view-menu-label) {
22
+ display: none;
23
+ color: var(--gray-400);
24
+ font-size: 0.75rem;
25
+ padding-top: 2px;
26
+ }
27
+
28
+ @media (min-width: 66rem) {
29
+ .label,
30
+ :global(.byline-view-menu-label) {
31
+ display: block;
32
+ }
33
+ }
34
+
35
+ .localeSelect,
36
+ :global(.byline-view-menu-locale-select) {
37
+ min-width: 100px;
38
+ padding: 0.1rem 0;
39
+ }
40
+
41
+ .depthSelect,
42
+ :global(.byline-view-menu-depth-select) {
43
+ min-width: 60px;
44
+ }
45
+
46
+ .iconButton,
47
+ :global(.byline-view-menu-icon-button) {
48
+ min-width: 24px;
49
+ }
50
+
51
+ .iconButtonIcon,
52
+ :global(.byline-view-menu-icon-button-icon) {
53
+ width: 1.25rem;
54
+ height: 1.25rem;
55
+ }
56
+
57
+ .button,
58
+ :global(.byline-view-menu-button) {
59
+ min-width: 50px;
60
+ }