@kelpie/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (704) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +44 -0
  3. package/dist/ServiceStatus.d.ts +6 -0
  4. package/dist/ServiceStatus.d.ts.map +1 -0
  5. package/dist/ServiceStatus.js +35 -0
  6. package/dist/ServiceStatus.js.map +1 -0
  7. package/dist/api/ApiProvider.d.ts +19 -0
  8. package/dist/api/ApiProvider.d.ts.map +1 -0
  9. package/dist/api/ApiProvider.js +18 -0
  10. package/dist/api/ApiProvider.js.map +1 -0
  11. package/dist/api/client.d.ts +83 -0
  12. package/dist/api/client.d.ts.map +1 -0
  13. package/dist/api/client.js +162 -0
  14. package/dist/api/client.js.map +1 -0
  15. package/dist/api/context.d.ts +14 -0
  16. package/dist/api/context.d.ts.map +1 -0
  17. package/dist/api/context.js +20 -0
  18. package/dist/api/context.js.map +1 -0
  19. package/dist/api/errors.d.ts +9 -0
  20. package/dist/api/errors.d.ts.map +1 -0
  21. package/dist/api/errors.js +14 -0
  22. package/dist/api/errors.js.map +1 -0
  23. package/dist/api/health.d.ts +15 -0
  24. package/dist/api/health.d.ts.map +1 -0
  25. package/dist/api/health.js +22 -0
  26. package/dist/api/health.js.map +1 -0
  27. package/dist/api/json.d.ts +3 -0
  28. package/dist/api/json.d.ts.map +1 -0
  29. package/dist/api/json.js +5 -0
  30. package/dist/api/json.js.map +1 -0
  31. package/dist/api/queryClient.d.ts +17 -0
  32. package/dist/api/queryClient.d.ts.map +1 -0
  33. package/dist/api/queryClient.js +33 -0
  34. package/dist/api/queryClient.js.map +1 -0
  35. package/dist/api/resource.d.ts +110 -0
  36. package/dist/api/resource.d.ts.map +1 -0
  37. package/dist/api/resource.js +238 -0
  38. package/dist/api/resource.js.map +1 -0
  39. package/dist/api/resources/account.d.ts +49 -0
  40. package/dist/api/resources/account.d.ts.map +1 -0
  41. package/dist/api/resources/account.js +146 -0
  42. package/dist/api/resources/account.js.map +1 -0
  43. package/dist/api/resources/activities.d.ts +8 -0
  44. package/dist/api/resources/activities.d.ts.map +1 -0
  45. package/dist/api/resources/activities.js +21 -0
  46. package/dist/api/resources/activities.js.map +1 -0
  47. package/dist/api/resources/agentTasks.d.ts +31 -0
  48. package/dist/api/resources/agentTasks.d.ts.map +1 -0
  49. package/dist/api/resources/agentTasks.js +103 -0
  50. package/dist/api/resources/agentTasks.js.map +1 -0
  51. package/dist/api/resources/candidates.d.ts +17 -0
  52. package/dist/api/resources/candidates.d.ts.map +1 -0
  53. package/dist/api/resources/candidates.js +40 -0
  54. package/dist/api/resources/candidates.js.map +1 -0
  55. package/dist/api/resources/companies.d.ts +22 -0
  56. package/dist/api/resources/companies.d.ts.map +1 -0
  57. package/dist/api/resources/companies.js +36 -0
  58. package/dist/api/resources/companies.js.map +1 -0
  59. package/dist/api/resources/dashboard.d.ts +8 -0
  60. package/dist/api/resources/dashboard.d.ts.map +1 -0
  61. package/dist/api/resources/dashboard.js +27 -0
  62. package/dist/api/resources/dashboard.js.map +1 -0
  63. package/dist/api/resources/deals.d.ts +30 -0
  64. package/dist/api/resources/deals.d.ts.map +1 -0
  65. package/dist/api/resources/deals.js +38 -0
  66. package/dist/api/resources/deals.js.map +1 -0
  67. package/dist/api/resources/decisions.d.ts +13 -0
  68. package/dist/api/resources/decisions.d.ts.map +1 -0
  69. package/dist/api/resources/decisions.js +38 -0
  70. package/dist/api/resources/decisions.js.map +1 -0
  71. package/dist/api/resources/forms.d.ts +82 -0
  72. package/dist/api/resources/forms.d.ts.map +1 -0
  73. package/dist/api/resources/forms.js +129 -0
  74. package/dist/api/resources/forms.js.map +1 -0
  75. package/dist/api/resources/handbookPages.d.ts +33 -0
  76. package/dist/api/resources/handbookPages.d.ts.map +1 -0
  77. package/dist/api/resources/handbookPages.js +49 -0
  78. package/dist/api/resources/handbookPages.js.map +1 -0
  79. package/dist/api/resources/importJobs.d.ts +72 -0
  80. package/dist/api/resources/importJobs.d.ts.map +1 -0
  81. package/dist/api/resources/importJobs.js +145 -0
  82. package/dist/api/resources/importJobs.js.map +1 -0
  83. package/dist/api/resources/invites.d.ts +19 -0
  84. package/dist/api/resources/invites.d.ts.map +1 -0
  85. package/dist/api/resources/invites.js +78 -0
  86. package/dist/api/resources/invites.js.map +1 -0
  87. package/dist/api/resources/mcpTools.d.ts +8 -0
  88. package/dist/api/resources/mcpTools.d.ts.map +1 -0
  89. package/dist/api/resources/mcpTools.js +23 -0
  90. package/dist/api/resources/mcpTools.js.map +1 -0
  91. package/dist/api/resources/members.d.ts +40 -0
  92. package/dist/api/resources/members.d.ts.map +1 -0
  93. package/dist/api/resources/members.js +67 -0
  94. package/dist/api/resources/members.js.map +1 -0
  95. package/dist/api/resources/moduleSettings.d.ts +14 -0
  96. package/dist/api/resources/moduleSettings.d.ts.map +1 -0
  97. package/dist/api/resources/moduleSettings.js +43 -0
  98. package/dist/api/resources/moduleSettings.js.map +1 -0
  99. package/dist/api/resources/mutation.d.ts +18 -0
  100. package/dist/api/resources/mutation.d.ts.map +1 -0
  101. package/dist/api/resources/mutation.js +12 -0
  102. package/dist/api/resources/mutation.js.map +1 -0
  103. package/dist/api/resources/notes.d.ts +14 -0
  104. package/dist/api/resources/notes.d.ts.map +1 -0
  105. package/dist/api/resources/notes.js +39 -0
  106. package/dist/api/resources/notes.js.map +1 -0
  107. package/dist/api/resources/opportunities.d.ts +29 -0
  108. package/dist/api/resources/opportunities.d.ts.map +1 -0
  109. package/dist/api/resources/opportunities.js +38 -0
  110. package/dist/api/resources/opportunities.js.map +1 -0
  111. package/dist/api/resources/partnerships.d.ts +33 -0
  112. package/dist/api/resources/partnerships.d.ts.map +1 -0
  113. package/dist/api/resources/partnerships.js +39 -0
  114. package/dist/api/resources/partnerships.js.map +1 -0
  115. package/dist/api/resources/people.d.ts +22 -0
  116. package/dist/api/resources/people.d.ts.map +1 -0
  117. package/dist/api/resources/people.js +36 -0
  118. package/dist/api/resources/people.js.map +1 -0
  119. package/dist/api/resources/pipelineStages.d.ts +22 -0
  120. package/dist/api/resources/pipelineStages.d.ts.map +1 -0
  121. package/dist/api/resources/pipelineStages.js +61 -0
  122. package/dist/api/resources/pipelineStages.js.map +1 -0
  123. package/dist/api/resources/planItems.d.ts +31 -0
  124. package/dist/api/resources/planItems.d.ts.map +1 -0
  125. package/dist/api/resources/planItems.js +60 -0
  126. package/dist/api/resources/planItems.js.map +1 -0
  127. package/dist/api/resources/positions.d.ts +23 -0
  128. package/dist/api/resources/positions.d.ts.map +1 -0
  129. package/dist/api/resources/positions.js +31 -0
  130. package/dist/api/resources/positions.js.map +1 -0
  131. package/dist/api/resources/raises.d.ts +30 -0
  132. package/dist/api/resources/raises.d.ts.map +1 -0
  133. package/dist/api/resources/raises.js +38 -0
  134. package/dist/api/resources/raises.js.map +1 -0
  135. package/dist/api/resources/roles.d.ts +20 -0
  136. package/dist/api/resources/roles.d.ts.map +1 -0
  137. package/dist/api/resources/roles.js +31 -0
  138. package/dist/api/resources/roles.js.map +1 -0
  139. package/dist/api/resources/search.d.ts +12 -0
  140. package/dist/api/resources/search.d.ts.map +1 -0
  141. package/dist/api/resources/search.js +37 -0
  142. package/dist/api/resources/search.js.map +1 -0
  143. package/dist/api/resources/session.d.ts +58 -0
  144. package/dist/api/resources/session.d.ts.map +1 -0
  145. package/dist/api/resources/session.js +157 -0
  146. package/dist/api/resources/session.js.map +1 -0
  147. package/dist/api/resources/webhooks.d.ts +45 -0
  148. package/dist/api/resources/webhooks.d.ts.map +1 -0
  149. package/dist/api/resources/webhooks.js +106 -0
  150. package/dist/api/resources/webhooks.js.map +1 -0
  151. package/dist/api/resources/workspace.d.ts +20 -0
  152. package/dist/api/resources/workspace.d.ts.map +1 -0
  153. package/dist/api/resources/workspace.js +63 -0
  154. package/dist/api/resources/workspace.js.map +1 -0
  155. package/dist/app/KelpieApp.d.ts +18 -0
  156. package/dist/app/KelpieApp.d.ts.map +1 -0
  157. package/dist/app/KelpieApp.js +59 -0
  158. package/dist/app/KelpieApp.js.map +1 -0
  159. package/dist/app/SessionGate.d.ts +14 -0
  160. package/dist/app/SessionGate.d.ts.map +1 -0
  161. package/dist/app/SessionGate.js +33 -0
  162. package/dist/app/SessionGate.js.map +1 -0
  163. package/dist/components/ActivitiesPanel.d.ts +28 -0
  164. package/dist/components/ActivitiesPanel.d.ts.map +1 -0
  165. package/dist/components/ActivitiesPanel.js +75 -0
  166. package/dist/components/ActivitiesPanel.js.map +1 -0
  167. package/dist/components/AgentTasks.d.ts +16 -0
  168. package/dist/components/AgentTasks.d.ts.map +1 -0
  169. package/dist/components/AgentTasks.js +166 -0
  170. package/dist/components/AgentTasks.js.map +1 -0
  171. package/dist/components/Chip.d.ts +10 -0
  172. package/dist/components/Chip.d.ts.map +1 -0
  173. package/dist/components/Chip.js +21 -0
  174. package/dist/components/Chip.js.map +1 -0
  175. package/dist/components/CopyButton.d.ts +7 -0
  176. package/dist/components/CopyButton.d.ts.map +1 -0
  177. package/dist/components/CopyButton.js +30 -0
  178. package/dist/components/CopyButton.js.map +1 -0
  179. package/dist/components/DataTable.d.ts +36 -0
  180. package/dist/components/DataTable.d.ts.map +1 -0
  181. package/dist/components/DataTable.js +43 -0
  182. package/dist/components/DataTable.js.map +1 -0
  183. package/dist/components/DecisionsPanel.d.ts +14 -0
  184. package/dist/components/DecisionsPanel.d.ts.map +1 -0
  185. package/dist/components/DecisionsPanel.js +73 -0
  186. package/dist/components/DecisionsPanel.js.map +1 -0
  187. package/dist/components/DeleteRecord.d.ts +19 -0
  188. package/dist/components/DeleteRecord.d.ts.map +1 -0
  189. package/dist/components/DeleteRecord.js +22 -0
  190. package/dist/components/DeleteRecord.js.map +1 -0
  191. package/dist/components/EntitySearch.d.ts +33 -0
  192. package/dist/components/EntitySearch.d.ts.map +1 -0
  193. package/dist/components/EntitySearch.js +111 -0
  194. package/dist/components/EntitySearch.js.map +1 -0
  195. package/dist/components/ErrorBoundary.d.ts +21 -0
  196. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  197. package/dist/components/ErrorBoundary.js +26 -0
  198. package/dist/components/ErrorBoundary.js.map +1 -0
  199. package/dist/components/InlineEdit.d.ts +37 -0
  200. package/dist/components/InlineEdit.d.ts.map +1 -0
  201. package/dist/components/InlineEdit.js +77 -0
  202. package/dist/components/InlineEdit.js.map +1 -0
  203. package/dist/components/KanbanBoard.d.ts +24 -0
  204. package/dist/components/KanbanBoard.d.ts.map +1 -0
  205. package/dist/components/KanbanBoard.js +92 -0
  206. package/dist/components/KanbanBoard.js.map +1 -0
  207. package/dist/components/MarkdownView.d.ts +4 -0
  208. package/dist/components/MarkdownView.d.ts.map +1 -0
  209. package/dist/components/MarkdownView.js +45 -0
  210. package/dist/components/MarkdownView.js.map +1 -0
  211. package/dist/components/NotesPanel.d.ts +17 -0
  212. package/dist/components/NotesPanel.d.ts.map +1 -0
  213. package/dist/components/NotesPanel.js +53 -0
  214. package/dist/components/NotesPanel.js.map +1 -0
  215. package/dist/components/PageHeader.d.ts +20 -0
  216. package/dist/components/PageHeader.d.ts.map +1 -0
  217. package/dist/components/PageHeader.js +15 -0
  218. package/dist/components/PageHeader.js.map +1 -0
  219. package/dist/components/PhonesField.d.ts +7 -0
  220. package/dist/components/PhonesField.d.ts.map +1 -0
  221. package/dist/components/PhonesField.js +92 -0
  222. package/dist/components/PhonesField.js.map +1 -0
  223. package/dist/components/PlanAttention.d.ts +40 -0
  224. package/dist/components/PlanAttention.d.ts.map +1 -0
  225. package/dist/components/PlanAttention.js +86 -0
  226. package/dist/components/PlanAttention.js.map +1 -0
  227. package/dist/components/PlanPanel.d.ts +18 -0
  228. package/dist/components/PlanPanel.d.ts.map +1 -0
  229. package/dist/components/PlanPanel.js +102 -0
  230. package/dist/components/PlanPanel.js.map +1 -0
  231. package/dist/components/QueryState.d.ts +24 -0
  232. package/dist/components/QueryState.d.ts.map +1 -0
  233. package/dist/components/QueryState.js +34 -0
  234. package/dist/components/QueryState.js.map +1 -0
  235. package/dist/components/RecordTabs.d.ts +16 -0
  236. package/dist/components/RecordTabs.d.ts.map +1 -0
  237. package/dist/components/RecordTabs.js +15 -0
  238. package/dist/components/RecordTabs.js.map +1 -0
  239. package/dist/components/SectionHeader.d.ts +15 -0
  240. package/dist/components/SectionHeader.d.ts.map +1 -0
  241. package/dist/components/SectionHeader.js +14 -0
  242. package/dist/components/SectionHeader.js.map +1 -0
  243. package/dist/components/SegmentedControl.d.ts +13 -0
  244. package/dist/components/SegmentedControl.d.ts.map +1 -0
  245. package/dist/components/SegmentedControl.js +14 -0
  246. package/dist/components/SegmentedControl.js.map +1 -0
  247. package/dist/components/Shell.d.ts +2 -0
  248. package/dist/components/Shell.d.ts.map +1 -0
  249. package/dist/components/Shell.js +143 -0
  250. package/dist/components/Shell.js.map +1 -0
  251. package/dist/components/SidebarField.d.ts +8 -0
  252. package/dist/components/SidebarField.d.ts.map +1 -0
  253. package/dist/components/SidebarField.js +6 -0
  254. package/dist/components/SidebarField.js.map +1 -0
  255. package/dist/components/SocialProfilesField.d.ts +8 -0
  256. package/dist/components/SocialProfilesField.d.ts.map +1 -0
  257. package/dist/components/SocialProfilesField.js +176 -0
  258. package/dist/components/SocialProfilesField.js.map +1 -0
  259. package/dist/components/StageSettings.d.ts +16 -0
  260. package/dist/components/StageSettings.d.ts.map +1 -0
  261. package/dist/components/StageSettings.js +107 -0
  262. package/dist/components/StageSettings.js.map +1 -0
  263. package/dist/components/SummaryBlock.d.ts +12 -0
  264. package/dist/components/SummaryBlock.d.ts.map +1 -0
  265. package/dist/components/SummaryBlock.js +12 -0
  266. package/dist/components/SummaryBlock.js.map +1 -0
  267. package/dist/index.d.ts +90 -0
  268. package/dist/index.d.ts.map +1 -0
  269. package/dist/index.js +55 -0
  270. package/dist/index.js.map +1 -0
  271. package/dist/lib/dates.d.ts +26 -0
  272. package/dist/lib/dates.d.ts.map +1 -0
  273. package/dist/lib/dates.js +71 -0
  274. package/dist/lib/dates.js.map +1 -0
  275. package/dist/lib/money.d.ts +7 -0
  276. package/dist/lib/money.d.ts.map +1 -0
  277. package/dist/lib/money.js +13 -0
  278. package/dist/lib/money.js.map +1 -0
  279. package/dist/lib/names.d.ts +9 -0
  280. package/dist/lib/names.d.ts.map +1 -0
  281. package/dist/lib/names.js +13 -0
  282. package/dist/lib/names.js.map +1 -0
  283. package/dist/lib/plan.d.ts +67 -0
  284. package/dist/lib/plan.d.ts.map +1 -0
  285. package/dist/lib/plan.js +96 -0
  286. package/dist/lib/plan.js.map +1 -0
  287. package/dist/lib/theme.d.ts +19 -0
  288. package/dist/lib/theme.d.ts.map +1 -0
  289. package/dist/lib/theme.js +30 -0
  290. package/dist/lib/theme.js.map +1 -0
  291. package/dist/pages/CompaniesPage.d.ts +2 -0
  292. package/dist/pages/CompaniesPage.d.ts.map +1 -0
  293. package/dist/pages/CompaniesPage.js +77 -0
  294. package/dist/pages/CompaniesPage.js.map +1 -0
  295. package/dist/pages/CompanyDetail.d.ts +2 -0
  296. package/dist/pages/CompanyDetail.d.ts.map +1 -0
  297. package/dist/pages/CompanyDetail.js +177 -0
  298. package/dist/pages/CompanyDetail.js.map +1 -0
  299. package/dist/pages/DealDetail.d.ts +2 -0
  300. package/dist/pages/DealDetail.d.ts.map +1 -0
  301. package/dist/pages/DealDetail.js +192 -0
  302. package/dist/pages/DealDetail.js.map +1 -0
  303. package/dist/pages/DealStageSettingsPage.d.ts +7 -0
  304. package/dist/pages/DealStageSettingsPage.d.ts.map +1 -0
  305. package/dist/pages/DealStageSettingsPage.js +38 -0
  306. package/dist/pages/DealStageSettingsPage.js.map +1 -0
  307. package/dist/pages/DealsPage.d.ts +2 -0
  308. package/dist/pages/DealsPage.d.ts.map +1 -0
  309. package/dist/pages/DealsPage.js +177 -0
  310. package/dist/pages/DealsPage.js.map +1 -0
  311. package/dist/pages/DecisionsPage.d.ts +2 -0
  312. package/dist/pages/DecisionsPage.d.ts.map +1 -0
  313. package/dist/pages/DecisionsPage.js +121 -0
  314. package/dist/pages/DecisionsPage.js.map +1 -0
  315. package/dist/pages/FormDetail.d.ts +2 -0
  316. package/dist/pages/FormDetail.d.ts.map +1 -0
  317. package/dist/pages/FormDetail.js +56 -0
  318. package/dist/pages/FormDetail.js.map +1 -0
  319. package/dist/pages/FormsPage.d.ts +2 -0
  320. package/dist/pages/FormsPage.d.ts.map +1 -0
  321. package/dist/pages/FormsPage.js +67 -0
  322. package/dist/pages/FormsPage.js.map +1 -0
  323. package/dist/pages/FundraisingPage.d.ts +2 -0
  324. package/dist/pages/FundraisingPage.d.ts.map +1 -0
  325. package/dist/pages/FundraisingPage.js +187 -0
  326. package/dist/pages/FundraisingPage.js.map +1 -0
  327. package/dist/pages/HiringPage.d.ts +9 -0
  328. package/dist/pages/HiringPage.d.ts.map +1 -0
  329. package/dist/pages/HiringPage.js +73 -0
  330. package/dist/pages/HiringPage.js.map +1 -0
  331. package/dist/pages/NotFoundPage.d.ts +10 -0
  332. package/dist/pages/NotFoundPage.d.ts.map +1 -0
  333. package/dist/pages/NotFoundPage.js +14 -0
  334. package/dist/pages/NotFoundPage.js.map +1 -0
  335. package/dist/pages/OpportunitiesPage.d.ts +2 -0
  336. package/dist/pages/OpportunitiesPage.d.ts.map +1 -0
  337. package/dist/pages/OpportunitiesPage.js +184 -0
  338. package/dist/pages/OpportunitiesPage.js.map +1 -0
  339. package/dist/pages/OpportunityDetail.d.ts +2 -0
  340. package/dist/pages/OpportunityDetail.d.ts.map +1 -0
  341. package/dist/pages/OpportunityDetail.js +132 -0
  342. package/dist/pages/OpportunityDetail.js.map +1 -0
  343. package/dist/pages/OpportunityStageSettingsPage.d.ts +3 -0
  344. package/dist/pages/OpportunityStageSettingsPage.d.ts.map +1 -0
  345. package/dist/pages/OpportunityStageSettingsPage.js +34 -0
  346. package/dist/pages/OpportunityStageSettingsPage.js.map +1 -0
  347. package/dist/pages/PartnershipDetail.d.ts +2 -0
  348. package/dist/pages/PartnershipDetail.d.ts.map +1 -0
  349. package/dist/pages/PartnershipDetail.js +179 -0
  350. package/dist/pages/PartnershipDetail.js.map +1 -0
  351. package/dist/pages/PartnershipStageSettingsPage.d.ts +3 -0
  352. package/dist/pages/PartnershipStageSettingsPage.d.ts.map +1 -0
  353. package/dist/pages/PartnershipStageSettingsPage.js +34 -0
  354. package/dist/pages/PartnershipStageSettingsPage.js.map +1 -0
  355. package/dist/pages/PartnershipsPage.d.ts +2 -0
  356. package/dist/pages/PartnershipsPage.d.ts.map +1 -0
  357. package/dist/pages/PartnershipsPage.js +182 -0
  358. package/dist/pages/PartnershipsPage.js.map +1 -0
  359. package/dist/pages/PeoplePage.d.ts +10 -0
  360. package/dist/pages/PeoplePage.d.ts.map +1 -0
  361. package/dist/pages/PeoplePage.js +71 -0
  362. package/dist/pages/PeoplePage.js.map +1 -0
  363. package/dist/pages/PersonDetail.d.ts +2 -0
  364. package/dist/pages/PersonDetail.d.ts.map +1 -0
  365. package/dist/pages/PersonDetail.js +193 -0
  366. package/dist/pages/PersonDetail.js.map +1 -0
  367. package/dist/pages/PlanningPage.d.ts +2 -0
  368. package/dist/pages/PlanningPage.d.ts.map +1 -0
  369. package/dist/pages/PlanningPage.js +112 -0
  370. package/dist/pages/PlanningPage.js.map +1 -0
  371. package/dist/pages/RaiseDetail.d.ts +2 -0
  372. package/dist/pages/RaiseDetail.d.ts.map +1 -0
  373. package/dist/pages/RaiseDetail.js +198 -0
  374. package/dist/pages/RaiseDetail.js.map +1 -0
  375. package/dist/pages/RaiseStageSettingsPage.d.ts +3 -0
  376. package/dist/pages/RaiseStageSettingsPage.d.ts.map +1 -0
  377. package/dist/pages/RaiseStageSettingsPage.js +34 -0
  378. package/dist/pages/RaiseStageSettingsPage.js.map +1 -0
  379. package/dist/pages/RoleDetail.d.ts +2 -0
  380. package/dist/pages/RoleDetail.d.ts.map +1 -0
  381. package/dist/pages/RoleDetail.js +177 -0
  382. package/dist/pages/RoleDetail.js.map +1 -0
  383. package/dist/pages/SearchPage.d.ts +2 -0
  384. package/dist/pages/SearchPage.d.ts.map +1 -0
  385. package/dist/pages/SearchPage.js +51 -0
  386. package/dist/pages/SearchPage.js.map +1 -0
  387. package/dist/pages/account/AccountLayout.d.ts +2 -0
  388. package/dist/pages/account/AccountLayout.d.ts.map +1 -0
  389. package/dist/pages/account/AccountLayout.js +25 -0
  390. package/dist/pages/account/AccountLayout.js.map +1 -0
  391. package/dist/pages/account/Field.d.ts +8 -0
  392. package/dist/pages/account/Field.d.ts.map +1 -0
  393. package/dist/pages/account/Field.js +6 -0
  394. package/dist/pages/account/Field.js.map +1 -0
  395. package/dist/pages/account/PreferencesPage.d.ts +2 -0
  396. package/dist/pages/account/PreferencesPage.d.ts.map +1 -0
  397. package/dist/pages/account/PreferencesPage.js +92 -0
  398. package/dist/pages/account/PreferencesPage.js.map +1 -0
  399. package/dist/pages/account/ProfilePage.d.ts +14 -0
  400. package/dist/pages/account/ProfilePage.d.ts.map +1 -0
  401. package/dist/pages/account/ProfilePage.js +71 -0
  402. package/dist/pages/account/ProfilePage.js.map +1 -0
  403. package/dist/pages/account/SecurityPage.d.ts +11 -0
  404. package/dist/pages/account/SecurityPage.d.ts.map +1 -0
  405. package/dist/pages/account/SecurityPage.js +78 -0
  406. package/dist/pages/account/SecurityPage.js.map +1 -0
  407. package/dist/pages/admin/DataPage.d.ts +3 -0
  408. package/dist/pages/admin/DataPage.d.ts.map +1 -0
  409. package/dist/pages/admin/DataPage.js +210 -0
  410. package/dist/pages/admin/DataPage.js.map +1 -0
  411. package/dist/pages/admin/McpPage.d.ts +2 -0
  412. package/dist/pages/admin/McpPage.d.ts.map +1 -0
  413. package/dist/pages/admin/McpPage.js +128 -0
  414. package/dist/pages/admin/McpPage.js.map +1 -0
  415. package/dist/pages/admin/ModulesPage.d.ts +2 -0
  416. package/dist/pages/admin/ModulesPage.d.ts.map +1 -0
  417. package/dist/pages/admin/ModulesPage.js +53 -0
  418. package/dist/pages/admin/ModulesPage.js.map +1 -0
  419. package/dist/pages/admin/TeamPage.d.ts +2 -0
  420. package/dist/pages/admin/TeamPage.d.ts.map +1 -0
  421. package/dist/pages/admin/TeamPage.js +99 -0
  422. package/dist/pages/admin/TeamPage.js.map +1 -0
  423. package/dist/pages/admin/WebhookDeliveries.d.ts +4 -0
  424. package/dist/pages/admin/WebhookDeliveries.d.ts.map +1 -0
  425. package/dist/pages/admin/WebhookDeliveries.js +88 -0
  426. package/dist/pages/admin/WebhookDeliveries.js.map +1 -0
  427. package/dist/pages/admin/WebhooksPage.d.ts +2 -0
  428. package/dist/pages/admin/WebhooksPage.d.ts.map +1 -0
  429. package/dist/pages/admin/WebhooksPage.js +152 -0
  430. package/dist/pages/admin/WebhooksPage.js.map +1 -0
  431. package/dist/pages/admin/WorkspaceSettingsPage.d.ts +2 -0
  432. package/dist/pages/admin/WorkspaceSettingsPage.d.ts.map +1 -0
  433. package/dist/pages/admin/WorkspaceSettingsPage.js +117 -0
  434. package/dist/pages/admin/WorkspaceSettingsPage.js.map +1 -0
  435. package/dist/pages/auth/AuthForm.d.ts +46 -0
  436. package/dist/pages/auth/AuthForm.d.ts.map +1 -0
  437. package/dist/pages/auth/AuthForm.js +32 -0
  438. package/dist/pages/auth/AuthForm.js.map +1 -0
  439. package/dist/pages/auth/AuthLayout.d.ts +24 -0
  440. package/dist/pages/auth/AuthLayout.d.ts.map +1 -0
  441. package/dist/pages/auth/AuthLayout.js +19 -0
  442. package/dist/pages/auth/AuthLayout.js.map +1 -0
  443. package/dist/pages/auth/ForgotPasswordPage.d.ts +13 -0
  444. package/dist/pages/auth/ForgotPasswordPage.d.ts.map +1 -0
  445. package/dist/pages/auth/ForgotPasswordPage.js +39 -0
  446. package/dist/pages/auth/ForgotPasswordPage.js.map +1 -0
  447. package/dist/pages/auth/JoinPage.d.ts +12 -0
  448. package/dist/pages/auth/JoinPage.d.ts.map +1 -0
  449. package/dist/pages/auth/JoinPage.js +43 -0
  450. package/dist/pages/auth/JoinPage.js.map +1 -0
  451. package/dist/pages/auth/ResetPasswordPage.d.ts +13 -0
  452. package/dist/pages/auth/ResetPasswordPage.d.ts.map +1 -0
  453. package/dist/pages/auth/ResetPasswordPage.js +58 -0
  454. package/dist/pages/auth/ResetPasswordPage.js.map +1 -0
  455. package/dist/pages/auth/SignInPage.d.ts +2 -0
  456. package/dist/pages/auth/SignInPage.d.ts.map +1 -0
  457. package/dist/pages/auth/SignInPage.js +38 -0
  458. package/dist/pages/auth/SignInPage.js.map +1 -0
  459. package/dist/pages/auth/SignUpPage.d.ts +13 -0
  460. package/dist/pages/auth/SignUpPage.d.ts.map +1 -0
  461. package/dist/pages/auth/SignUpPage.js +43 -0
  462. package/dist/pages/auth/SignUpPage.js.map +1 -0
  463. package/dist/pages/candidateFields.d.ts +22 -0
  464. package/dist/pages/candidateFields.d.ts.map +1 -0
  465. package/dist/pages/candidateFields.js +82 -0
  466. package/dist/pages/candidateFields.js.map +1 -0
  467. package/dist/pages/dashboard/DashboardPage.d.ts +2 -0
  468. package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
  469. package/dist/pages/dashboard/DashboardPage.js +40 -0
  470. package/dist/pages/dashboard/DashboardPage.js.map +1 -0
  471. package/dist/pages/dashboard/attention.d.ts +41 -0
  472. package/dist/pages/dashboard/attention.d.ts.map +1 -0
  473. package/dist/pages/dashboard/attention.js +146 -0
  474. package/dist/pages/dashboard/attention.js.map +1 -0
  475. package/dist/pages/dashboard/sections.d.ts +20 -0
  476. package/dist/pages/dashboard/sections.d.ts.map +1 -0
  477. package/dist/pages/dashboard/sections.js +60 -0
  478. package/dist/pages/dashboard/sections.js.map +1 -0
  479. package/dist/pages/fields.d.ts +11 -0
  480. package/dist/pages/fields.d.ts.map +1 -0
  481. package/dist/pages/fields.js +17 -0
  482. package/dist/pages/fields.js.map +1 -0
  483. package/dist/pages/forms/EmbedPanel.d.ts +14 -0
  484. package/dist/pages/forms/EmbedPanel.d.ts.map +1 -0
  485. package/dist/pages/forms/EmbedPanel.js +19 -0
  486. package/dist/pages/forms/EmbedPanel.js.map +1 -0
  487. package/dist/pages/forms/FieldsEditor.d.ts +6 -0
  488. package/dist/pages/forms/FieldsEditor.d.ts.map +1 -0
  489. package/dist/pages/forms/FieldsEditor.js +115 -0
  490. package/dist/pages/forms/FieldsEditor.js.map +1 -0
  491. package/dist/pages/forms/FormSettings.d.ts +6 -0
  492. package/dist/pages/forms/FormSettings.d.ts.map +1 -0
  493. package/dist/pages/forms/FormSettings.js +47 -0
  494. package/dist/pages/forms/FormSettings.js.map +1 -0
  495. package/dist/pages/forms/SubmissionsTable.d.ts +8 -0
  496. package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -0
  497. package/dist/pages/forms/SubmissionsTable.js +91 -0
  498. package/dist/pages/forms/SubmissionsTable.js.map +1 -0
  499. package/dist/pages/forms/fieldList.d.ts +70 -0
  500. package/dist/pages/forms/fieldList.d.ts.map +1 -0
  501. package/dist/pages/forms/fieldList.js +126 -0
  502. package/dist/pages/forms/fieldList.js.map +1 -0
  503. package/dist/pages/forms/template.d.ts +18 -0
  504. package/dist/pages/forms/template.d.ts.map +1 -0
  505. package/dist/pages/forms/template.js +34 -0
  506. package/dist/pages/forms/template.js.map +1 -0
  507. package/dist/pages/handbook/HandbookPage.d.ts +2 -0
  508. package/dist/pages/handbook/HandbookPage.d.ts.map +1 -0
  509. package/dist/pages/handbook/HandbookPage.js +197 -0
  510. package/dist/pages/handbook/HandbookPage.js.map +1 -0
  511. package/dist/pages/handbook/tree.d.ts +62 -0
  512. package/dist/pages/handbook/tree.d.ts.map +1 -0
  513. package/dist/pages/handbook/tree.js +222 -0
  514. package/dist/pages/handbook/tree.js.map +1 -0
  515. package/dist/pages/hiringDirectory.d.ts +60 -0
  516. package/dist/pages/hiringDirectory.d.ts.map +1 -0
  517. package/dist/pages/hiringDirectory.js +81 -0
  518. package/dist/pages/hiringDirectory.js.map +1 -0
  519. package/dist/pages/onboarding/HandbookStepPage.d.ts +14 -0
  520. package/dist/pages/onboarding/HandbookStepPage.d.ts.map +1 -0
  521. package/dist/pages/onboarding/HandbookStepPage.js +29 -0
  522. package/dist/pages/onboarding/HandbookStepPage.js.map +1 -0
  523. package/dist/pages/onboarding/InvitesStepPage.d.ts +2 -0
  524. package/dist/pages/onboarding/InvitesStepPage.d.ts.map +1 -0
  525. package/dist/pages/onboarding/InvitesStepPage.js +77 -0
  526. package/dist/pages/onboarding/InvitesStepPage.js.map +1 -0
  527. package/dist/pages/onboarding/WorkspaceStepPage.d.ts +2 -0
  528. package/dist/pages/onboarding/WorkspaceStepPage.d.ts.map +1 -0
  529. package/dist/pages/onboarding/WorkspaceStepPage.js +72 -0
  530. package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -0
  531. package/dist/pages/positionDirectory.d.ts +20 -0
  532. package/dist/pages/positionDirectory.d.ts.map +1 -0
  533. package/dist/pages/positionDirectory.js +58 -0
  534. package/dist/pages/positionDirectory.js.map +1 -0
  535. package/dist/registry/UiExtensionProvider.d.ts +12 -0
  536. package/dist/registry/UiExtensionProvider.d.ts.map +1 -0
  537. package/dist/registry/UiExtensionProvider.js +10 -0
  538. package/dist/registry/UiExtensionProvider.js.map +1 -0
  539. package/dist/registry/context.d.ts +31 -0
  540. package/dist/registry/context.d.ts.map +1 -0
  541. package/dist/registry/context.js +45 -0
  542. package/dist/registry/context.js.map +1 -0
  543. package/dist/registry/contributions.d.ts +71 -0
  544. package/dist/registry/contributions.d.ts.map +1 -0
  545. package/dist/registry/contributions.js +25 -0
  546. package/dist/registry/contributions.js.map +1 -0
  547. package/dist/registry/overridable.d.ts +27 -0
  548. package/dist/registry/overridable.d.ts.map +1 -0
  549. package/dist/registry/overridable.js +29 -0
  550. package/dist/registry/overridable.js.map +1 -0
  551. package/dist/registry/registry.d.ts +68 -0
  552. package/dist/registry/registry.d.ts.map +1 -0
  553. package/dist/registry/registry.js +112 -0
  554. package/dist/registry/registry.js.map +1 -0
  555. package/dist/testing/inputs.d.ts +13 -0
  556. package/dist/testing/inputs.d.ts.map +1 -0
  557. package/dist/testing/inputs.js +16 -0
  558. package/dist/testing/inputs.js.map +1 -0
  559. package/dist/testing/stubClient.d.ts +42 -0
  560. package/dist/testing/stubClient.d.ts.map +1 -0
  561. package/dist/testing/stubClient.js +29 -0
  562. package/dist/testing/stubClient.js.map +1 -0
  563. package/package.json +73 -0
  564. package/src/ServiceStatus.tsx +61 -0
  565. package/src/api/ApiProvider.tsx +40 -0
  566. package/src/api/client.ts +267 -0
  567. package/src/api/context.ts +25 -0
  568. package/src/api/errors.ts +14 -0
  569. package/src/api/health.ts +38 -0
  570. package/src/api/json.ts +4 -0
  571. package/src/api/queryClient.ts +35 -0
  572. package/src/api/resource.ts +412 -0
  573. package/src/api/resources/account.ts +220 -0
  574. package/src/api/resources/activities.ts +31 -0
  575. package/src/api/resources/agentTasks.ts +172 -0
  576. package/src/api/resources/candidates.ts +69 -0
  577. package/src/api/resources/companies.ts +72 -0
  578. package/src/api/resources/dashboard.ts +39 -0
  579. package/src/api/resources/deals.ts +82 -0
  580. package/src/api/resources/decisions.ts +60 -0
  581. package/src/api/resources/forms.ts +218 -0
  582. package/src/api/resources/handbookPages.ts +77 -0
  583. package/src/api/resources/importJobs.ts +229 -0
  584. package/src/api/resources/invites.ts +112 -0
  585. package/src/api/resources/mcpTools.ts +28 -0
  586. package/src/api/resources/members.ts +105 -0
  587. package/src/api/resources/moduleSettings.ts +67 -0
  588. package/src/api/resources/mutation.ts +31 -0
  589. package/src/api/resources/notes.ts +62 -0
  590. package/src/api/resources/opportunities.ts +84 -0
  591. package/src/api/resources/partnerships.ts +89 -0
  592. package/src/api/resources/people.ts +72 -0
  593. package/src/api/resources/pipelineStages.ts +93 -0
  594. package/src/api/resources/planItems.ts +103 -0
  595. package/src/api/resources/positions.ts +70 -0
  596. package/src/api/resources/raises.ts +82 -0
  597. package/src/api/resources/roles.ts +65 -0
  598. package/src/api/resources/search.ts +49 -0
  599. package/src/api/resources/session.ts +220 -0
  600. package/src/api/resources/webhooks.ts +157 -0
  601. package/src/api/resources/workspace.ts +81 -0
  602. package/src/app/KelpieApp.tsx +162 -0
  603. package/src/app/SessionGate.tsx +42 -0
  604. package/src/components/ActivitiesPanel.tsx +235 -0
  605. package/src/components/AgentTasks.tsx +473 -0
  606. package/src/components/Chip.tsx +36 -0
  607. package/src/components/CopyButton.tsx +48 -0
  608. package/src/components/DataTable.tsx +209 -0
  609. package/src/components/DecisionsPanel.tsx +233 -0
  610. package/src/components/DeleteRecord.tsx +73 -0
  611. package/src/components/EntitySearch.tsx +268 -0
  612. package/src/components/ErrorBoundary.tsx +58 -0
  613. package/src/components/InlineEdit.tsx +179 -0
  614. package/src/components/KanbanBoard.tsx +234 -0
  615. package/src/components/MarkdownView.tsx +73 -0
  616. package/src/components/NotesPanel.tsx +169 -0
  617. package/src/components/PageHeader.tsx +61 -0
  618. package/src/components/PhonesField.tsx +204 -0
  619. package/src/components/PlanAttention.tsx +249 -0
  620. package/src/components/PlanPanel.tsx +317 -0
  621. package/src/components/QueryState.tsx +83 -0
  622. package/src/components/RecordTabs.tsx +69 -0
  623. package/src/components/SectionHeader.tsx +63 -0
  624. package/src/components/SegmentedControl.tsx +48 -0
  625. package/src/components/Shell.tsx +300 -0
  626. package/src/components/SidebarField.tsx +18 -0
  627. package/src/components/SocialProfilesField.tsx +356 -0
  628. package/src/components/StageSettings.tsx +319 -0
  629. package/src/components/SummaryBlock.tsx +27 -0
  630. package/src/index.ts +190 -0
  631. package/src/lib/dates.ts +90 -0
  632. package/src/lib/money.ts +12 -0
  633. package/src/lib/names.ts +13 -0
  634. package/src/lib/plan.ts +147 -0
  635. package/src/lib/theme.ts +53 -0
  636. package/src/pages/CompaniesPage.tsx +143 -0
  637. package/src/pages/CompanyDetail.tsx +502 -0
  638. package/src/pages/DealDetail.tsx +512 -0
  639. package/src/pages/DealStageSettingsPage.tsx +67 -0
  640. package/src/pages/DealsPage.tsx +342 -0
  641. package/src/pages/DecisionsPage.tsx +211 -0
  642. package/src/pages/FormDetail.tsx +130 -0
  643. package/src/pages/FormsPage.tsx +151 -0
  644. package/src/pages/FundraisingPage.tsx +354 -0
  645. package/src/pages/HiringPage.tsx +169 -0
  646. package/src/pages/NotFoundPage.tsx +27 -0
  647. package/src/pages/OpportunitiesPage.tsx +349 -0
  648. package/src/pages/OpportunityDetail.tsx +337 -0
  649. package/src/pages/OpportunityStageSettingsPage.tsx +63 -0
  650. package/src/pages/PartnershipDetail.tsx +490 -0
  651. package/src/pages/PartnershipStageSettingsPage.tsx +63 -0
  652. package/src/pages/PartnershipsPage.tsx +353 -0
  653. package/src/pages/PeoplePage.tsx +145 -0
  654. package/src/pages/PersonDetail.tsx +526 -0
  655. package/src/pages/PlanningPage.tsx +318 -0
  656. package/src/pages/RaiseDetail.tsx +498 -0
  657. package/src/pages/RaiseStageSettingsPage.tsx +63 -0
  658. package/src/pages/RoleDetail.tsx +455 -0
  659. package/src/pages/SearchPage.tsx +135 -0
  660. package/src/pages/account/AccountLayout.tsx +38 -0
  661. package/src/pages/account/Field.tsx +20 -0
  662. package/src/pages/account/PreferencesPage.tsx +224 -0
  663. package/src/pages/account/ProfilePage.tsx +147 -0
  664. package/src/pages/account/SecurityPage.tsx +237 -0
  665. package/src/pages/admin/DataPage.tsx +772 -0
  666. package/src/pages/admin/McpPage.tsx +404 -0
  667. package/src/pages/admin/ModulesPage.tsx +113 -0
  668. package/src/pages/admin/TeamPage.tsx +386 -0
  669. package/src/pages/admin/WebhookDeliveries.tsx +184 -0
  670. package/src/pages/admin/WebhooksPage.tsx +443 -0
  671. package/src/pages/admin/WorkspaceSettingsPage.tsx +274 -0
  672. package/src/pages/auth/AuthForm.tsx +118 -0
  673. package/src/pages/auth/AuthLayout.tsx +74 -0
  674. package/src/pages/auth/ForgotPasswordPage.tsx +80 -0
  675. package/src/pages/auth/JoinPage.tsx +85 -0
  676. package/src/pages/auth/ResetPasswordPage.tsx +124 -0
  677. package/src/pages/auth/SignInPage.tsx +83 -0
  678. package/src/pages/auth/SignUpPage.tsx +93 -0
  679. package/src/pages/candidateFields.tsx +175 -0
  680. package/src/pages/dashboard/DashboardPage.tsx +108 -0
  681. package/src/pages/dashboard/attention.ts +206 -0
  682. package/src/pages/dashboard/sections.tsx +269 -0
  683. package/src/pages/fields.ts +21 -0
  684. package/src/pages/forms/EmbedPanel.tsx +95 -0
  685. package/src/pages/forms/FieldsEditor.tsx +412 -0
  686. package/src/pages/forms/FormSettings.tsx +159 -0
  687. package/src/pages/forms/SubmissionsTable.tsx +171 -0
  688. package/src/pages/forms/fieldList.ts +209 -0
  689. package/src/pages/forms/template.ts +37 -0
  690. package/src/pages/handbook/HandbookPage.tsx +500 -0
  691. package/src/pages/handbook/tree.ts +327 -0
  692. package/src/pages/hiringDirectory.ts +146 -0
  693. package/src/pages/onboarding/HandbookStepPage.tsx +75 -0
  694. package/src/pages/onboarding/InvitesStepPage.tsx +180 -0
  695. package/src/pages/onboarding/WorkspaceStepPage.tsx +122 -0
  696. package/src/pages/positionDirectory.ts +98 -0
  697. package/src/registry/UiExtensionProvider.tsx +20 -0
  698. package/src/registry/context.ts +67 -0
  699. package/src/registry/contributions.ts +89 -0
  700. package/src/registry/overridable.ts +62 -0
  701. package/src/registry/registry.ts +204 -0
  702. package/src/styles.css +175 -0
  703. package/src/testing/inputs.ts +18 -0
  704. package/src/testing/stubClient.ts +78 -0
@@ -0,0 +1,197 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { DndContext, DragOverlay, PointerSensor, closestCenter, useSensor, useSensors, } from '@dnd-kit/core';
3
+ import { SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable';
4
+ import { CSS } from '@dnd-kit/utilities';
5
+ import { useEffect, useMemo, useState } from 'react';
6
+ import { Link, useNavigate, useParams } from 'react-router';
7
+ import { useCreateHandbookPage, useDeleteHandbookPage, useHandbookPages, useUpdateHandbookPage, } from '../../api/resources/handbookPages.js';
8
+ import { useMembers } from '../../api/resources/members.js';
9
+ import { AgentTasks } from '../../components/AgentTasks.js';
10
+ import { MarkdownView } from '../../components/MarkdownView.js';
11
+ import { ErrorPanel, LoadingPanel } from '../../components/QueryState.js';
12
+ import { formatDateTime } from '../../lib/dates.js';
13
+ import { INDENT, descendantIds, flattenTree, landingMoves, projectDrop } from './tree.js';
14
+ /**
15
+ * The handbook: a draggable tree of pages beside the one being read.
16
+ *
17
+ * Ported from the mockup, where the tree was local state and every edit was lost
18
+ * on navigation. The shapes are the same; what changed is where they live. A
19
+ * drop sends one PATCH naming the new parent and position, and the server
20
+ * renumbers both sibling sets, so the page never computes a `sort_order` for
21
+ * anything it did not drag.
22
+ */
23
+ const NEW_PAGE_TITLE = 'Untitled page';
24
+ export function HandbookLayout() {
25
+ const { pageId } = useParams();
26
+ const navigate = useNavigate();
27
+ const pages = useHandbookPages();
28
+ const members = useMembers();
29
+ const createPage = useCreateHandbookPage();
30
+ const updatePage = useUpdateHandbookPage();
31
+ const deletePage = useDeleteHandbookPage();
32
+ const [activeId, setActiveId] = useState(null);
33
+ const [overId, setOverId] = useState(null);
34
+ const [offsetX, setOffsetX] = useState(0);
35
+ const flat = useMemo(() => flattenTree(pages.records), [pages.records]);
36
+ const active = pages.records.find((page) => page.id === (pageId ?? flat[0]?.id));
37
+ const dragging = flat.find((item) => item.id === activeId);
38
+ const liveDepth = activeId !== null && overId !== null
39
+ ? projectDrop(flat, pages.records, activeId, overId, offsetX).depth
40
+ : dragging?.depth;
41
+ const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 6 } }));
42
+ useEffect(() => {
43
+ const first = flat[0];
44
+ if (pageId === undefined && first !== undefined) {
45
+ void navigate(`/handbook/${first.id}`, { replace: true });
46
+ }
47
+ }, [pageId, flat, navigate]);
48
+ async function addPage(parentId) {
49
+ const page = await createPage.runAsync({
50
+ title: NEW_PAGE_TITLE,
51
+ body: `# ${NEW_PAGE_TITLE}\n\nStart writing…\n`,
52
+ parentId,
53
+ });
54
+ await navigate(`/handbook/${page.id}`);
55
+ }
56
+ /**
57
+ * Deletes a page and everything under it, after saying how much that is.
58
+ *
59
+ * The count comes from the tree already on screen. It is the same cascade the
60
+ * API performs, named before it happens rather than reported after.
61
+ */
62
+ async function removePage(page) {
63
+ const nested = descendantIds(pages.records, page.id).size;
64
+ const confirmed = window.confirm(nested > 0
65
+ ? `Delete this page and ${String(nested)} nested page${nested > 1 ? 's' : ''}?`
66
+ : 'Delete this page?');
67
+ if (!confirmed) {
68
+ return;
69
+ }
70
+ const doomed = new Set([page.id, ...descendantIds(pages.records, page.id)]);
71
+ await deletePage.runAsync(page.id);
72
+ if (pageId !== undefined && doomed.has(pageId)) {
73
+ const fallback = flat.find((item) => !doomed.has(item.id));
74
+ await navigate(fallback === undefined ? '/handbook' : `/handbook/${fallback.id}`);
75
+ }
76
+ }
77
+ function clearDrag() {
78
+ setActiveId(null);
79
+ setOverId(null);
80
+ setOffsetX(0);
81
+ }
82
+ function onDragStart(event) {
83
+ setActiveId(String(event.active.id));
84
+ setOverId(String(event.active.id));
85
+ setOffsetX(0);
86
+ }
87
+ function onDragMove(event) {
88
+ setOffsetX(event.delta.x);
89
+ if (event.over !== null) {
90
+ setOverId(String(event.over.id));
91
+ }
92
+ }
93
+ /**
94
+ * A drop is projected even when it landed on the row it started from.
95
+ *
96
+ * The mockup bailed on that case, which made an indent-in-place impossible:
97
+ * dragging a page straight left to lift it out of its parent did nothing,
98
+ * because with no vertical movement the nearest row is the dragged one. What
99
+ * decides whether to write is whether the landing differs from where the page
100
+ * already is, not which row the pointer happened to finish over.
101
+ */
102
+ function onDragEnd(event) {
103
+ const dragId = activeId;
104
+ const dropId = event.over === null ? null : String(event.over.id);
105
+ const movedBy = offsetX;
106
+ clearDrag();
107
+ if (dragId === null || dropId === null) {
108
+ return;
109
+ }
110
+ const landing = projectDrop(flat, pages.records, dragId, dropId, movedBy);
111
+ if (!landingMoves(pages.records, dragId, landing)) {
112
+ return;
113
+ }
114
+ updatePage.run({
115
+ id: dragId,
116
+ changes: { parentId: landing.parentId, sortOrder: landing.insertIndex },
117
+ });
118
+ }
119
+ if (pages.isLoading) {
120
+ return _jsx(LoadingPanel, { label: "Loading the handbook\u2026" });
121
+ }
122
+ if (pages.error !== null) {
123
+ return _jsx(ErrorPanel, { error: pages.error });
124
+ }
125
+ return (_jsxs("div", { className: "animate-fade-in flex min-h-[calc(100vh-8rem)] gap-0 overflow-hidden rounded-md border border-border", children: [_jsxs("aside", { className: "flex w-[260px] shrink-0 flex-col border-r border-border bg-surface", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-border px-3 py-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-[13px] font-semibold text-ink", children: "Handbook" }), _jsx("div", { className: "text-[11px] text-ink-faint", children: "Drag to reorder \u00B7 indent to nest" })] }), _jsx("button", { type: "button", disabled: createPage.isPending, onClick: () => {
126
+ void addPage(null);
127
+ }, className: "rounded-md bg-accent px-2 py-1 text-[11px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50", children: "New" })] }), _jsxs("nav", { className: "flex-1 overflow-y-auto p-2", children: [_jsxs(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragStart: onDragStart, onDragMove: onDragMove, onDragEnd: onDragEnd, onDragCancel: clearDrag, children: [_jsx(SortableContext, { items: flat.map((item) => item.id), strategy: verticalListSortingStrategy, children: _jsx("ul", { className: "flex flex-col gap-0.5", children: flat.map((item) => (_jsx(SortableTreeItem, { item: item, depth: item.id === activeId && liveDepth !== undefined ? liveDepth : item.depth, selected: item.id === active?.id, onAddChild: () => {
128
+ void addPage(item.id);
129
+ }, onDelete: () => {
130
+ void removePage(item.page);
131
+ } }, item.id))) }) }), _jsx(DragOverlay, { dropAnimation: null, children: dragging === undefined ? null : (_jsx("div", { className: "rounded-md border border-accent bg-surface-raised px-2.5 py-1.5 text-[13px] font-medium text-ink", style: { marginLeft: (liveDepth ?? dragging.depth) * INDENT }, children: dragging.page.title })) })] }), flat.length === 0 && (_jsx("p", { className: "px-2 py-6 text-center text-[12px] text-ink-faint", children: "No pages yet." })), pages.hasMore && (_jsx("p", { className: "px-2 py-3 text-center text-[11px] text-ink-faint", children: "This handbook has more pages than one request returns, so the tree below is incomplete." }))] })] }), _jsx("div", { className: "min-w-0 flex-1", children: active === undefined ? (_jsx("div", { className: "flex h-full items-center justify-center text-[13px] text-ink-faint", children: "No handbook pages yet." })) : (_jsx(HandbookEditor, { page: active, authorName: active.updatedBy === null ? undefined : members.nameById.get(active.updatedBy), isSaving: updatePage.isPending, error: updatePage.error ?? deletePage.error, onSave: (changes) => {
132
+ updatePage.run({ id: active.id, changes });
133
+ }, onAddChild: () => {
134
+ void addPage(active.id);
135
+ }, onDelete: () => {
136
+ void removePage(active);
137
+ } }, active.id)) })] }));
138
+ }
139
+ function SortableTreeItem({ item, depth, selected, onAddChild, onDelete, }) {
140
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
141
+ id: item.id,
142
+ });
143
+ return (_jsx("li", { ref: setNodeRef, style: {
144
+ transform: CSS.Transform.toString(transform),
145
+ transition,
146
+ marginLeft: depth * INDENT,
147
+ opacity: isDragging ? 0.35 : 1,
148
+ }, className: "group relative", children: _jsxs("div", { className: [
149
+ 'flex items-center gap-0.5 rounded-md pr-1 transition-colors',
150
+ selected
151
+ ? 'bg-accent-soft text-accent-hover'
152
+ : 'text-ink-muted hover:bg-surface-raised hover:text-ink',
153
+ ].join(' '), children: [_jsx("button", { type: "button", className: "cursor-grab touch-none px-1 py-1.5 text-[10px] text-ink-faint active:cursor-grabbing", "aria-label": `Drag ${item.page.title} to reorder`, ...attributes, ...listeners, children: "\u22EE\u22EE" }), _jsx(Link, { to: `/handbook/${item.id}`, className: [
154
+ 'min-w-0 flex-1 truncate py-1.5 pr-1 text-[13px]',
155
+ selected ? 'font-medium' : '',
156
+ ].join(' '), children: item.page.title }), _jsx("button", { type: "button", title: "Add subpage", onClick: (event) => {
157
+ event.preventDefault();
158
+ onAddChild();
159
+ }, className: "hidden rounded px-1 py-0.5 text-[12px] font-medium text-ink-faint group-hover:inline hover:bg-surface hover:text-accent", children: "+" }), _jsx("button", { type: "button", title: "Delete", onClick: (event) => {
160
+ event.preventDefault();
161
+ onDelete();
162
+ }, className: "hidden rounded px-1 py-0.5 text-[11px] font-medium text-ink-faint group-hover:inline hover:bg-danger-soft hover:text-danger", children: "\u00D7" })] }) }));
163
+ }
164
+ /**
165
+ * One page: read as rendered markdown, edited as its source.
166
+ *
167
+ * A rename sends the title and nothing else about the address. The slug is the
168
+ * handle agent tasks name a page by, so the API leaves it where it is unless it
169
+ * is set on purpose, and this editor never sets it.
170
+ */
171
+ function HandbookEditor({ page, authorName, isSaving, error, onSave, onAddChild, onDelete, }) {
172
+ const [editing, setEditing] = useState(false);
173
+ const [title, setTitle] = useState(page.title);
174
+ const [body, setBody] = useState(page.body);
175
+ useEffect(() => {
176
+ setTitle(page.title);
177
+ setBody(page.body);
178
+ setEditing(false);
179
+ }, [page.id, page.title, page.body]);
180
+ function save() {
181
+ const trimmed = title.trim();
182
+ onSave({ title: trimmed.length === 0 ? NEW_PAGE_TITLE : trimmed, body });
183
+ setEditing(false);
184
+ }
185
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3 border-b border-border px-5 py-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [editing ? (_jsx("input", { value: title, "aria-label": "Page title", onChange: (event) => {
186
+ setTitle(event.target.value);
187
+ }, className: "w-full min-w-[200px] rounded-md border border-border bg-surface px-2.5 py-1.5 text-[15px] font-semibold outline-none focus:border-accent" })) : (_jsx("h1", { className: "text-[18px] font-semibold tracking-tight text-ink", children: page.title })), _jsxs("div", { className: "mt-1 text-[11px] text-ink-faint", children: ["Updated ", formatDateTime(page.updatedAt), authorName === undefined ? '' : ` · ${authorName}`] })] }), _jsx("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: editing ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
188
+ setTitle(page.title);
189
+ setBody(page.body);
190
+ setEditing(false);
191
+ }, className: "rounded-md px-2.5 py-1.5 text-[12px] font-medium text-ink-muted hover:text-ink", children: "Cancel" }), _jsx("button", { type: "button", disabled: isSaving, onClick: save, className: "rounded-md bg-accent px-3 py-1.5 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50", children: "Save" })] })) : (_jsxs(_Fragment, { children: [_jsx(AgentTasks, { targetType: "handbook", targetId: page.id, targetLabel: page.title }), _jsx("button", { type: "button", onClick: onAddChild, className: "rounded-md border border-border px-2.5 py-1.5 text-[12px] font-medium text-ink-muted transition hover:border-accent hover:text-accent-hover", children: "Add subpage" }), _jsx("button", { type: "button", onClick: onDelete, className: "rounded-md border border-border px-2.5 py-1.5 text-[12px] font-medium text-danger transition hover:border-danger hover:bg-danger-soft", children: "Delete" }), _jsx("button", { type: "button", onClick: () => {
192
+ setEditing(true);
193
+ }, className: "rounded-md border border-border px-3 py-1.5 text-[12px] font-semibold text-ink transition hover:border-accent hover:text-accent-hover", children: "Edit" })] })) })] }), _jsxs("div", { className: "flex-1 overflow-y-auto p-5", children: [error !== null && (_jsx("div", { className: "mb-4 max-w-3xl", children: _jsx(ErrorPanel, { error: error }) })), editing ? (_jsx("textarea", { value: body, "aria-label": "Page body", onChange: (event) => {
194
+ setBody(event.target.value);
195
+ }, className: "min-h-[480px] w-full resize-y rounded-md border border-border bg-surface p-4 font-mono text-[13px] leading-relaxed outline-none focus:border-accent focus:ring-2 focus:ring-accent/20", spellCheck: true })) : (_jsx("div", { className: "animate-slide-in max-w-3xl", children: _jsx(MarkdownView, { source: page.body }) }))] })] }));
196
+ }
197
+ //# sourceMappingURL=HandbookPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HandbookPage.js","sourceRoot":"","sources":["../../../src/pages/handbook/HandbookPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { HandbookPage } from '@kelpie/schemas';
2
+ /**
3
+ * The sidebar tree: how a flat list of pages becomes an indented list, and where
4
+ * a drag would put the page being dragged.
5
+ *
6
+ * Ported from the mockup's `HandbookPage.tsx`, extracted into its own module
7
+ * because the projection is the only genuinely intricate part of the page and it
8
+ * is pure: flat list in, landing spot out. The page turns that landing spot into
9
+ * one PATCH and lets the server renumber the siblings.
10
+ */
11
+ /** Pixels of indent per level. The drag reads horizontal movement in these units. */
12
+ export declare const INDENT = 14;
13
+ export interface FlatItem {
14
+ readonly id: string;
15
+ readonly page: HandbookPage;
16
+ readonly depth: number;
17
+ }
18
+ /** Where a dragged page would land: a new parent, and a position among that parent's children. */
19
+ export interface Projection {
20
+ readonly parentId: string | null;
21
+ readonly depth: number;
22
+ readonly insertIndex: number;
23
+ }
24
+ /**
25
+ * One parent's children, in sidebar order.
26
+ *
27
+ * Title breaks a tie, which the mockup did and the API makes unnecessary: the
28
+ * server keeps a sibling set contiguous from 0. It stays because the tie is
29
+ * real for the moment an optimistic update holds two pages at one position.
30
+ */
31
+ export declare function childrenOf(pages: readonly HandbookPage[], parentId: string | null): HandbookPage[];
32
+ /**
33
+ * The tree as the list of rows the sidebar renders, parents before their children.
34
+ *
35
+ * A page whose parent is missing is left out. That happens for the moment
36
+ * between deleting a page and the list refetching, and floating its orphaned
37
+ * subpages to the top level would read as though somebody had moved them there.
38
+ */
39
+ export declare function flattenTree(pages: readonly HandbookPage[]): FlatItem[];
40
+ /** Every page under this one, at any depth: the subtree a delete takes and a drag may not enter. */
41
+ export declare function descendantIds(pages: readonly HandbookPage[], rootId: string): Set<string>;
42
+ /**
43
+ * Where a drag would land the page.
44
+ *
45
+ * @param offsetX How far the pointer has moved horizontally. Divided by `INDENT`
46
+ * it is the change in nesting depth, which is how one gesture reorders and
47
+ * re-nests at once.
48
+ * @returns The landing spot, clamped to a legal one. A drop onto the page's own
49
+ * subtree, or past the depth cap, resolves to where the page already is rather
50
+ * than to a request the server would refuse.
51
+ */
52
+ export declare function projectDrop(flat: readonly FlatItem[], pages: readonly HandbookPage[], activeId: string, overId: string, offsetX: number): Projection;
53
+ /**
54
+ * Whether a landing actually moves the page.
55
+ *
56
+ * Every activated drag ends somewhere, including one that ended where it
57
+ * started. Without this a nudge past the 6px activation distance would send a
58
+ * PATCH, and the optimistic cache write behind it would make the sidebar jump
59
+ * for a gesture that asked for nothing.
60
+ */
61
+ export declare function landingMoves(pages: readonly HandbookPage[], pageId: string, landing: Projection): boolean;
62
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../src/pages/handbook/tree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD;;;;;;;;GAQG;AAEH,qFAAqF;AACrF,eAAO,MAAM,MAAM,KAAK,CAAA;AAExB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,kGAAkG;AAClG,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,YAAY,EAAE,CAMhB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,QAAQ,EAAE,CAatE;AAED,oGAAoG;AACpG,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAazF;AAkFD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,QAAQ,EAAE,EACzB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,UAAU,CAyCZ;AA2ED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,GAClB,OAAO,CAiBT"}
@@ -0,0 +1,222 @@
1
+ import { MAX_HANDBOOK_DEPTH } from '@kelpie/schemas';
2
+ /**
3
+ * The sidebar tree: how a flat list of pages becomes an indented list, and where
4
+ * a drag would put the page being dragged.
5
+ *
6
+ * Ported from the mockup's `HandbookPage.tsx`, extracted into its own module
7
+ * because the projection is the only genuinely intricate part of the page and it
8
+ * is pure: flat list in, landing spot out. The page turns that landing spot into
9
+ * one PATCH and lets the server renumber the siblings.
10
+ */
11
+ /** Pixels of indent per level. The drag reads horizontal movement in these units. */
12
+ export const INDENT = 14;
13
+ /**
14
+ * One parent's children, in sidebar order.
15
+ *
16
+ * Title breaks a tie, which the mockup did and the API makes unnecessary: the
17
+ * server keeps a sibling set contiguous from 0. It stays because the tie is
18
+ * real for the moment an optimistic update holds two pages at one position.
19
+ */
20
+ export function childrenOf(pages, parentId) {
21
+ return pages
22
+ .filter((page) => page.parentId === parentId)
23
+ .sort((left, right) => left.sortOrder - right.sortOrder || left.title.localeCompare(right.title));
24
+ }
25
+ /**
26
+ * The tree as the list of rows the sidebar renders, parents before their children.
27
+ *
28
+ * A page whose parent is missing is left out. That happens for the moment
29
+ * between deleting a page and the list refetching, and floating its orphaned
30
+ * subpages to the top level would read as though somebody had moved them there.
31
+ */
32
+ export function flattenTree(pages) {
33
+ const rows = [];
34
+ function walk(parentId, depth) {
35
+ for (const page of childrenOf(pages, parentId)) {
36
+ rows.push({ id: page.id, page, depth });
37
+ walk(page.id, depth + 1);
38
+ }
39
+ }
40
+ walk(null, 0);
41
+ return rows;
42
+ }
43
+ /** Every page under this one, at any depth: the subtree a delete takes and a drag may not enter. */
44
+ export function descendantIds(pages, rootId) {
45
+ const found = new Set();
46
+ function walk(parentId) {
47
+ for (const child of childrenOf(pages, parentId)) {
48
+ found.add(child.id);
49
+ walk(child.id);
50
+ }
51
+ }
52
+ walk(rootId);
53
+ return found;
54
+ }
55
+ /**
56
+ * The nearest row above and below the drop target, skipping the page being
57
+ * dragged and everything under it.
58
+ *
59
+ * Those rows are what bound the depth: a page can be at most one level deeper
60
+ * than the row above it, and no shallower than the row below, or it would adopt
61
+ * that row's subtree by sitting above it at a lower indent.
62
+ */
63
+ function neighbours(flat, activeIndex, overIndex, skip) {
64
+ const passes = (item) => !skip.has(item.id);
65
+ const movingDown = activeIndex < overIndex;
66
+ let previous;
67
+ let next;
68
+ for (let index = overIndex - (movingDown ? 0 : 1); index >= 0; index -= 1) {
69
+ const item = flat[index];
70
+ if (item !== undefined && passes(item)) {
71
+ previous = item;
72
+ break;
73
+ }
74
+ }
75
+ for (let index = overIndex + (movingDown ? 1 : 0); index < flat.length; index += 1) {
76
+ const item = flat[index];
77
+ if (item !== undefined && passes(item)) {
78
+ next = item;
79
+ break;
80
+ }
81
+ }
82
+ return { previous, next };
83
+ }
84
+ /** The parent a page sits under at `depth`, given the row above it. */
85
+ function parentAtDepth(flat, pages, previous, depth) {
86
+ if (depth === previous.depth) {
87
+ return previous.page.parentId;
88
+ }
89
+ if (depth > previous.depth) {
90
+ return previous.id;
91
+ }
92
+ // Shallower than the row above: walk up its ancestors to the one that sits at
93
+ // the level being dropped into.
94
+ let cursor = previous.page;
95
+ while (cursor !== undefined) {
96
+ const row = flat.find((item) => item.id === cursor?.id);
97
+ if (row !== undefined && row.depth === depth - 1) {
98
+ return cursor.id;
99
+ }
100
+ if (row !== undefined && row.depth < depth) {
101
+ return cursor.parentId;
102
+ }
103
+ cursor =
104
+ cursor.parentId === null
105
+ ? undefined
106
+ : pages.find((page) => page.id === cursor?.parentId);
107
+ }
108
+ return null;
109
+ }
110
+ /**
111
+ * Where a drag would land the page.
112
+ *
113
+ * @param offsetX How far the pointer has moved horizontally. Divided by `INDENT`
114
+ * it is the change in nesting depth, which is how one gesture reorders and
115
+ * re-nests at once.
116
+ * @returns The landing spot, clamped to a legal one. A drop onto the page's own
117
+ * subtree, or past the depth cap, resolves to where the page already is rather
118
+ * than to a request the server would refuse.
119
+ */
120
+ export function projectDrop(flat, pages, activeId, overId, offsetX) {
121
+ const active = flat.find((item) => item.id === activeId);
122
+ const over = flat.find((item) => item.id === overId);
123
+ if (active === undefined || over === undefined) {
124
+ return { parentId: null, depth: 0, insertIndex: 0 };
125
+ }
126
+ const doomed = descendantIds(pages, activeId);
127
+ const skip = new Set([activeId, ...doomed]);
128
+ const activeIndex = flat.findIndex((item) => item.id === activeId);
129
+ const overIndex = flat.findIndex((item) => item.id === overId);
130
+ const { previous, next } = neighbours(flat, activeIndex, overIndex, skip);
131
+ const requested = Math.round((active.depth * INDENT + offsetX) / INDENT);
132
+ const ceiling = previous === undefined ? 0 : Math.min(MAX_HANDBOOK_DEPTH, previous.depth + 1);
133
+ const floor = next?.depth ?? 0;
134
+ const depth = Math.max(floor, Math.min(ceiling, Math.max(0, requested)));
135
+ const proposed = depth === 0 || previous === undefined ? null : parentAtDepth(flat, pages, previous, depth);
136
+ // A projection can still name the page itself or one of its own subpages.
137
+ // Leaving it where it is beats sending a move the API would answer 422 to.
138
+ const refused = proposed === activeId || (proposed !== null && doomed.has(proposed));
139
+ const parentId = refused ? active.page.parentId : proposed;
140
+ const siblings = childrenOf(pages, parentId).filter((page) => page.id !== activeId);
141
+ return {
142
+ parentId,
143
+ depth: refused ? active.depth : depth,
144
+ insertIndex: insertionFor(siblings, {
145
+ pages,
146
+ activeId,
147
+ over,
148
+ previous,
149
+ parentId,
150
+ activeIndex,
151
+ overIndex,
152
+ }),
153
+ };
154
+ }
155
+ /**
156
+ * The row above the drop, or whichever of its ancestors is a child of `parentId`.
157
+ *
158
+ * The row immediately above is often deeper than where the page is landing: drop
159
+ * a top-level page below a nested one and the nearest row is a grandchild of the
160
+ * sibling it should follow. Walking up finds the sibling it can actually be
161
+ * measured against.
162
+ */
163
+ function landmarkUnder(pages, from, parentId) {
164
+ let cursor = from;
165
+ while (cursor !== undefined) {
166
+ if (cursor.parentId === parentId) {
167
+ return cursor.id;
168
+ }
169
+ const above = cursor.parentId;
170
+ cursor = above === null ? undefined : pages.find((page) => page.id === above);
171
+ }
172
+ return undefined;
173
+ }
174
+ /** The position among the new siblings, 0-based, which is what `sort_order` means to the API. */
175
+ function insertionFor(siblings, context) {
176
+ const { pages, activeId, over, previous, parentId, activeIndex, overIndex } = context;
177
+ // Dropped onto the page that is becoming the parent, or dropped straight below
178
+ // it: either way the page lands as its first child.
179
+ if (over.id === parentId || previous?.id === parentId) {
180
+ return 0;
181
+ }
182
+ // A drop onto the dragged row itself is an indent in place. The row dropped on
183
+ // is the one moving, so it cannot also be the landmark; `siblings` has it
184
+ // filtered out and asking it for a position would answer "the end".
185
+ if (over.id !== activeId && over.page.parentId === parentId) {
186
+ const index = siblings.findIndex((page) => page.id === over.id);
187
+ if (index < 0) {
188
+ return siblings.length;
189
+ }
190
+ // Dragging down lands after the row dropped on; dragging up lands before it.
191
+ return activeIndex < overIndex ? index + 1 : index;
192
+ }
193
+ if (previous === undefined) {
194
+ // Nothing above it in the list, so there is nowhere to land but the top.
195
+ return 0;
196
+ }
197
+ const landmark = landmarkUnder(pages, previous.page, parentId);
198
+ const index = landmark === undefined ? -1 : siblings.findIndex((page) => page.id === landmark);
199
+ return index < 0 ? siblings.length : index + 1;
200
+ }
201
+ /**
202
+ * Whether a landing actually moves the page.
203
+ *
204
+ * Every activated drag ends somewhere, including one that ended where it
205
+ * started. Without this a nudge past the 6px activation distance would send a
206
+ * PATCH, and the optimistic cache write behind it would make the sidebar jump
207
+ * for a gesture that asked for nothing.
208
+ */
209
+ export function landingMoves(pages, pageId, landing) {
210
+ const page = pages.find((candidate) => candidate.id === pageId);
211
+ if (page === undefined) {
212
+ return false;
213
+ }
214
+ if (page.parentId !== landing.parentId) {
215
+ return true;
216
+ }
217
+ // `insertIndex` counts a sibling set the page has been lifted out of, so the
218
+ // page's own current index is the position that means "put it back".
219
+ return (childrenOf(pages, page.parentId).findIndex((sibling) => sibling.id === pageId) !==
220
+ landing.insertIndex);
221
+ }
222
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/pages/handbook/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { Note } from '@kelpie/schemas';
2
+ export interface RoleCandidateCounts {
3
+ countFor(roleId: string): number;
4
+ readonly isLoading: boolean;
5
+ /**
6
+ * False when these roles hold more candidacies than one page could return, so
7
+ * the counts are floors rather than totals. The page says so instead of
8
+ * printing a number it cannot stand behind.
9
+ */
10
+ readonly isComplete: boolean;
11
+ }
12
+ export declare function useRoleCandidateCounts(roleIds: readonly string[]): RoleCandidateCounts;
13
+ export interface CandidateNotes {
14
+ /** The candidate's most recent note, or undefined when they have none. */
15
+ noteFor(candidateId: string): Note | undefined;
16
+ readonly isLoading: boolean;
17
+ /**
18
+ * False when these candidates hold more notes than one page could return.
19
+ *
20
+ * A candidate whose note is in the answer is showing their newest one: the
21
+ * list arrives newest first across the whole set, so a truncated page cannot
22
+ * hold an older note of theirs without the newer one. Only an *absent*
23
+ * candidate is ambiguous, and the caller says so rather than offering to
24
+ * write a second note over the one it did not fetch.
25
+ */
26
+ readonly isComplete: boolean;
27
+ }
28
+ /**
29
+ * The most recent note on each candidate in a pipeline.
30
+ *
31
+ * One request for the whole list rather than one per row. `?target_id=` on notes
32
+ * repeats to name a set, so a page rendering a note per candidate resolves them
33
+ * the way every other related column here does.
34
+ */
35
+ export declare function useCandidateNotes(candidateIds: readonly string[]): CandidateNotes;
36
+ export interface RoleTitles {
37
+ titleFor(roleId: string): string | undefined;
38
+ readonly isLoading: boolean;
39
+ }
40
+ /**
41
+ * Titles for the roles a person is up for.
42
+ *
43
+ * The whole first page rather than an id filter, because `/v1/roles` has no
44
+ * `?id=` and a workspace's open roles are few. A title missing past that page
45
+ * falls back to the id, which is wrong-looking rather than silently blank.
46
+ */
47
+ export declare function useRoleTitles(): RoleTitles;
48
+ export interface PersonNames {
49
+ nameFor(personId: string): string | undefined;
50
+ readonly isLoading: boolean;
51
+ }
52
+ /**
53
+ * Names for a set of people, from the directory's first page.
54
+ *
55
+ * `/v1/people` has no `?id=` filter, so this is the same compromise
56
+ * `RaiseKeyPeople` makes: past the first page a name is missing rather than
57
+ * wrong, and the caller falls back to the id instead of rendering a blank.
58
+ */
59
+ export declare function usePersonNames(): PersonNames;
60
+ //# sourceMappingURL=hiringDirectory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hiringDirectory.d.ts","sourceRoot":"","sources":["../../src/pages/hiringDirectory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAoB3C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAC7B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,mBAAmB,CAkBtF;AAED,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAyBjF;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAS1C;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAS5C"}