@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,455 @@
1
+ import { IN_PROCESS, ROLE_STATUS_LABELS, ROLE_STATUSES } from '@kelpie/schemas'
2
+ import type { Candidate, Note, Role, RoleInput, RoleStatus } from '@kelpie/schemas'
3
+ import { useEffect, useState } from 'react'
4
+ import type { FormEvent } from 'react'
5
+ import { Link, useNavigate, useParams } from 'react-router'
6
+
7
+ import { usePatch } from '../api/resource.ts'
8
+ import type { PatchResult } from '../api/resource.ts'
9
+ import { useCandidates, useCreateCandidate, useDeleteCandidate } from '../api/resources/candidates.ts'
10
+ import { useCreateNote, useDeleteNote, useUpdateNote } from '../api/resources/notes.ts'
11
+ import { useCreatePerson, usePeople } from '../api/resources/people.ts'
12
+ import { useDeleteRole, useRole, useUpdateRole } from '../api/resources/roles.ts'
13
+ import { AgentTasks } from '../components/AgentTasks.tsx'
14
+ import { Chip } from '../components/Chip.tsx'
15
+ import { DeleteRecord } from '../components/DeleteRecord.tsx'
16
+ import { EntitySearch } from '../components/EntitySearch.tsx'
17
+ import { InlineEdit } from '../components/InlineEdit.tsx'
18
+ import { ErrorPanel, LoadingPanel, NotFoundPanel } from '../components/QueryState.tsx'
19
+ import { SectionHeader } from '../components/SectionHeader.tsx'
20
+ import {
21
+ CandidateReferrerField,
22
+ CandidateStageField,
23
+ CandidateStatusField,
24
+ } from './candidateFields.tsx'
25
+ import { useCandidateNotes, usePersonNames } from './hiringDirectory.ts'
26
+
27
+ /**
28
+ * One role, and the people up for it.
29
+ *
30
+ * A role has no tabs. It holds no summary, no plan and no timeline of its own —
31
+ * it is not a record a note or an activity attaches to — so the page is the
32
+ * candidate pipeline and nothing else, exactly as the mockup draws it.
33
+ *
34
+ * Deleting the role takes its candidacies with it. There is nothing to choose in
35
+ * the confirmation, because roadmap decision 2 settles the cascade server-side.
36
+ */
37
+
38
+ const STATUS_OPTIONS = ROLE_STATUSES.map((status) => ({
39
+ value: status,
40
+ label: ROLE_STATUS_LABELS[status],
41
+ }))
42
+
43
+ export function RoleDetail(): React.JSX.Element {
44
+ const { id } = useParams()
45
+ const navigate = useNavigate()
46
+ const { record, isLoading, isNotFound, error } = useRole(id)
47
+ const deleteRole = useDeleteRole()
48
+
49
+ if (isNotFound) {
50
+ return <NotFoundPanel label="Role" backTo="/hiring" />
51
+ }
52
+
53
+ if (error !== null) {
54
+ return <ErrorPanel error={error} />
55
+ }
56
+
57
+ if (isLoading || record === undefined || id === undefined) {
58
+ return <LoadingPanel label="Loading role…" />
59
+ }
60
+
61
+ return (
62
+ <div className="animate-fade-in mx-auto max-w-4xl">
63
+ <Link
64
+ to="/hiring"
65
+ className="mb-4 inline-flex text-[12px] font-medium text-ink-muted transition hover:text-accent"
66
+ >
67
+ ← Hiring
68
+ </Link>
69
+
70
+ <div className="mb-6 flex flex-wrap items-start justify-between gap-3">
71
+ <RoleHeading role={record} />
72
+ <div className="flex shrink-0 flex-wrap items-center gap-3">
73
+ <RoleStatusField role={record} />
74
+ <AgentTasks targetType="role" targetId={record.id} targetLabel={record.title} />
75
+ <DeleteRecord
76
+ recordLabel="Role"
77
+ recordName={record.title}
78
+ isPending={deleteRole.isPending}
79
+ error={deleteRole.error}
80
+ onConfirm={() => {
81
+ deleteRole
82
+ .runAsync(record.id)
83
+ .then(() => navigate('/hiring'))
84
+ .catch(() => undefined)
85
+ }}
86
+ />
87
+ </div>
88
+ </div>
89
+
90
+ <RoleCandidates role={record} />
91
+ </div>
92
+ )
93
+ }
94
+
95
+ function useRolePatch(role: Role): PatchResult<RoleInput> {
96
+ return usePatch(useUpdateRole, role)
97
+ }
98
+
99
+ function RoleHeading({ role }: { readonly role: Role }): React.JSX.Element {
100
+ const { patch, error } = useRolePatch(role)
101
+
102
+ return (
103
+ <div className="min-w-0 flex-1">
104
+ {error !== null && (
105
+ <div className="mb-2">
106
+ <ErrorPanel error={error} />
107
+ </div>
108
+ )}
109
+ <InlineEdit
110
+ value={role.title}
111
+ onChange={(title) => {
112
+ patch({ title })
113
+ }}
114
+ displayClassName="text-[22px] font-semibold tracking-tight text-ink not-italic"
115
+ emptyLabel="Untitled role"
116
+ />
117
+ </div>
118
+ )
119
+ }
120
+
121
+ function RoleStatusField({ role }: { readonly role: Role }): React.JSX.Element {
122
+ const { patch, error } = useRolePatch(role)
123
+
124
+ return (
125
+ <div className="flex flex-col items-end gap-1">
126
+ <InlineEdit
127
+ value={role.status}
128
+ onChange={(value) => {
129
+ patch({ status: value as RoleStatus })
130
+ }}
131
+ options={STATUS_OPTIONS}
132
+ display={
133
+ <Chip tone={role.status === 'open' ? 'accent' : 'neutral'}>
134
+ {ROLE_STATUS_LABELS[role.status]}
135
+ </Chip>
136
+ }
137
+ displayClassName="not-italic inline-flex"
138
+ className="!w-auto"
139
+ />
140
+ {error !== null && <ErrorPanel error={error} />}
141
+ </div>
142
+ )
143
+ }
144
+
145
+ /** The role's pipeline: everyone attached to it, whatever state they are in. */
146
+ function RoleCandidates({ role }: { readonly role: Role }): React.JSX.Element {
147
+ const candidates = useCandidates({ roleIds: [role.id] })
148
+ const names = usePersonNames()
149
+ const notes = useCandidateNotes(candidates.records.map((candidate) => candidate.id))
150
+ const createCandidate = useCreateCandidate()
151
+ const createPerson = useCreatePerson()
152
+
153
+ const [adding, setAdding] = useState(false)
154
+ const [search, setSearch] = useState('')
155
+ const searchable = usePeople({ term: search.trim().length > 0 ? search.trim() : undefined })
156
+
157
+ const attached = new Set(candidates.records.map((candidate) => candidate.personId))
158
+
159
+ function add(personId: string): void {
160
+ if (attached.has(personId)) {
161
+ return
162
+ }
163
+
164
+ createCandidate.run({ roleId: role.id, personId })
165
+ setAdding(false)
166
+ setSearch('')
167
+ }
168
+
169
+ /**
170
+ * A name that matched nobody becomes a person and a candidacy in one go, as
171
+ * the mockup's picker does. The `candidate` tag is the mockup's too: someone
172
+ * created from this box is in the workspace because of this role.
173
+ */
174
+ async function addNewPerson(name: string): Promise<void> {
175
+ const person = await createPerson.runAsync({ name, tags: ['candidate'] })
176
+
177
+ add(person.id)
178
+ }
179
+
180
+ return (
181
+ <section>
182
+ <SectionHeader
183
+ title="Candidates"
184
+ onAdd={() => {
185
+ setAdding((current) => !current)
186
+ }}
187
+ addLabel="Add candidate"
188
+ />
189
+
190
+ {adding && (
191
+ <div className="mb-3 flex gap-2">
192
+ <div className="min-w-0 flex-1">
193
+ <EntitySearch
194
+ options={searchable.records
195
+ .filter((person) => !attached.has(person.id))
196
+ .map((person) => ({
197
+ id: person.id,
198
+ label: person.name,
199
+ meta: person.email ?? undefined,
200
+ }))}
201
+ value=""
202
+ onChange={add}
203
+ onQueryChange={setSearch}
204
+ onCreate={(name) => {
205
+ void addNewPerson(name)
206
+ }}
207
+ createLabel={(query) => `Create person “${query}”`}
208
+ placeholder="Search or create a person…"
209
+ emptyMessage="No matches"
210
+ size="md"
211
+ />
212
+ </div>
213
+ <button
214
+ type="button"
215
+ onClick={() => {
216
+ setAdding(false)
217
+ setSearch('')
218
+ }}
219
+ className="shrink-0 rounded-md px-2.5 py-1.5 text-[12px] font-medium text-ink-muted hover:text-ink"
220
+ >
221
+ Cancel
222
+ </button>
223
+ </div>
224
+ )}
225
+
226
+ {createCandidate.error !== null && (
227
+ <div className="mb-3">
228
+ <ErrorPanel error={createCandidate.error} />
229
+ </div>
230
+ )}
231
+ {createPerson.error !== null && (
232
+ <div className="mb-3">
233
+ <ErrorPanel error={createPerson.error} />
234
+ </div>
235
+ )}
236
+ {candidates.error !== null && <ErrorPanel error={candidates.error} />}
237
+
238
+ {candidates.isLoading ? (
239
+ <LoadingPanel label="Loading candidates…" />
240
+ ) : candidates.records.length === 0 && !adding ? (
241
+ <p className="text-[13px] text-ink-faint">No candidates yet.</p>
242
+ ) : (
243
+ <ul className="overflow-hidden rounded-md border border-border">
244
+ {candidates.records.map((candidate) => (
245
+ <CandidateRow
246
+ key={candidate.id}
247
+ candidate={candidate}
248
+ personName={names.nameFor(candidate.personId)}
249
+ referrerName={
250
+ candidate.referrerPersonId === null
251
+ ? undefined
252
+ : names.nameFor(candidate.referrerPersonId)
253
+ }
254
+ note={notes.noteFor(candidate.id)}
255
+ noteResolved={notes.isComplete || notes.noteFor(candidate.id) !== undefined}
256
+ />
257
+ ))}
258
+ </ul>
259
+ )}
260
+
261
+ {candidates.hasMore && (
262
+ <button
263
+ type="button"
264
+ onClick={candidates.loadMore}
265
+ disabled={candidates.isLoadingMore}
266
+ className="mt-3 rounded-md border border-border px-3 py-1.5 text-[12px] font-medium text-ink transition hover:border-border-strong hover:bg-surface-sunken disabled:opacity-50"
267
+ >
268
+ {candidates.isLoadingMore ? 'Loading…' : 'Load more'}
269
+ </button>
270
+ )}
271
+ </section>
272
+ )
273
+ }
274
+
275
+ function CandidateRow({
276
+ candidate,
277
+ personName,
278
+ referrerName,
279
+ note,
280
+ noteResolved,
281
+ }: {
282
+ readonly candidate: Candidate
283
+ readonly personName: string | undefined
284
+ readonly referrerName: string | undefined
285
+ readonly note: Note | undefined
286
+ readonly noteResolved: boolean
287
+ }): React.JSX.Element {
288
+ const removeCandidate = useDeleteCandidate()
289
+
290
+ return (
291
+ <li className="border-b border-border px-4 py-3.5 last:border-0">
292
+ <div className="flex flex-wrap items-start justify-between gap-3">
293
+ <Link
294
+ to={`/people/${candidate.personId}`}
295
+ className="text-left text-[13px] font-medium text-ink hover:text-accent"
296
+ >
297
+ {personName ?? candidate.personId}
298
+ </Link>
299
+ <div className="flex flex-wrap items-center gap-2">
300
+ <AgentTasks
301
+ targetType="candidate"
302
+ targetId={candidate.id}
303
+ targetLabel={personName ?? candidate.personId}
304
+ compact
305
+ />
306
+ <CandidateStatusField candidate={candidate} />
307
+ {candidate.status === IN_PROCESS && <CandidateStageField candidate={candidate} />}
308
+ <button
309
+ type="button"
310
+ onClick={() => {
311
+ removeCandidate.run(candidate.id)
312
+ }}
313
+ className="text-[11px] font-medium text-danger hover:underline"
314
+ >
315
+ Remove
316
+ </button>
317
+ </div>
318
+ </div>
319
+
320
+ {removeCandidate.error !== null && (
321
+ <div className="mt-2">
322
+ <ErrorPanel error={removeCandidate.error} />
323
+ </div>
324
+ )}
325
+
326
+ <dl className="mt-3 grid gap-3 sm:grid-cols-2">
327
+ <div>
328
+ <dt className="mb-1 text-[10px] font-semibold tracking-wide text-ink-faint uppercase">
329
+ Referrer
330
+ </dt>
331
+ <dd>
332
+ <CandidateReferrerField candidate={candidate} referrerName={referrerName} />
333
+ </dd>
334
+ </div>
335
+ <div>
336
+ <dt className="mb-1 text-[10px] font-semibold tracking-wide text-ink-faint uppercase">
337
+ Note
338
+ </dt>
339
+ <dd>
340
+ <CandidateNote candidate={candidate} existing={note} resolved={noteResolved} />
341
+ </dd>
342
+ </div>
343
+ </dl>
344
+ </li>
345
+ )
346
+ }
347
+
348
+ /**
349
+ * The candidate's most recent interview note, editable in place.
350
+ *
351
+ * The mockup edits one note here and shows the full panel on the person's Hiring
352
+ * tab, and this reproduces that. The note arrives from the page rather than
353
+ * being fetched here: `?target_id=` names a set, so the whole pipeline's notes
354
+ * come back in one request with the candidates.
355
+ *
356
+ * `resolved` false means the pipeline holds more notes than one page returns and
357
+ * this candidate was not among them, so whether they have one is unknown. It
358
+ * renders as unknown rather than as "Add note…", because offering to write is
359
+ * offering to write over a note nobody looked at.
360
+ */
361
+ function CandidateNote({
362
+ candidate,
363
+ existing,
364
+ resolved,
365
+ }: {
366
+ readonly candidate: Candidate
367
+ readonly existing: Note | undefined
368
+ readonly resolved: boolean
369
+ }): React.JSX.Element {
370
+ const createNote = useCreateNote()
371
+ const updateNote = useUpdateNote()
372
+ const deleteNote = useDeleteNote()
373
+
374
+ const [editing, setEditing] = useState(false)
375
+ const [draft, setDraft] = useState(existing?.body ?? '')
376
+
377
+ useEffect(() => {
378
+ if (!editing) {
379
+ setDraft(existing?.body ?? '')
380
+ }
381
+ }, [existing, editing])
382
+
383
+ function submit(event: FormEvent): void {
384
+ event.preventDefault()
385
+
386
+ const body = draft.trim()
387
+
388
+ if (body.length === 0) {
389
+ if (existing !== undefined) {
390
+ deleteNote.run(existing.id)
391
+ }
392
+ } else if (existing === undefined) {
393
+ createNote.run({ targetType: 'candidate', targetId: candidate.id, body })
394
+ } else if (body !== existing.body) {
395
+ updateNote.run({ id: existing.id, changes: { body } })
396
+ }
397
+
398
+ setEditing(false)
399
+ }
400
+
401
+ if (!resolved) {
402
+ return <p className="text-[12px] text-ink-faint">Not loaded on this page.</p>
403
+ }
404
+
405
+ if (editing) {
406
+ return (
407
+ <form onSubmit={submit} className="space-y-2">
408
+ <textarea
409
+ value={draft}
410
+ onChange={(event) => {
411
+ setDraft(event.target.value)
412
+ }}
413
+ rows={3}
414
+ autoFocus
415
+ placeholder="Hiring note…"
416
+ className="w-full resize-y rounded-md border border-border bg-surface px-2.5 py-2 text-[12px] outline-none focus:border-accent focus:ring-2 focus:ring-accent/20"
417
+ />
418
+ <div className="flex justify-end gap-2">
419
+ <button
420
+ type="button"
421
+ onClick={() => {
422
+ setDraft(existing?.body ?? '')
423
+ setEditing(false)
424
+ }}
425
+ className="rounded-md px-2 py-1 text-[11px] font-medium text-ink-muted hover:text-ink"
426
+ >
427
+ Cancel
428
+ </button>
429
+ <button
430
+ type="submit"
431
+ className="rounded-md bg-accent px-2.5 py-1 text-[11px] font-semibold text-accent-fg hover:bg-accent-hover"
432
+ >
433
+ Save
434
+ </button>
435
+ </div>
436
+ </form>
437
+ )
438
+ }
439
+
440
+ return (
441
+ <button
442
+ type="button"
443
+ onClick={() => {
444
+ setEditing(true)
445
+ }}
446
+ className={
447
+ existing === undefined
448
+ ? 'text-[12px] text-ink-faint hover:text-accent'
449
+ : 'block w-full text-left text-[12px] leading-relaxed text-ink-muted hover:text-ink'
450
+ }
451
+ >
452
+ {existing?.body ?? 'Add note…'}
453
+ </button>
454
+ )
455
+ }
@@ -0,0 +1,135 @@
1
+ import type { SearchCollection, SearchResult, SearchResultGroup } from '@kelpie/schemas'
2
+ import { Link, useSearchParams } from 'react-router'
3
+
4
+ import { useSearch } from '../api/resources/search.ts'
5
+ import { ErrorPanel, LoadingPanel } from '../components/QueryState.tsx'
6
+ import { PageHeader } from '../components/PageHeader.tsx'
7
+
8
+ /**
9
+ * `/search?q=`, the destination of the box in the application shell.
10
+ *
11
+ * The server decides what matched, how it ranks, and what each row says. The
12
+ * mockup did all three in the browser over seed data; here the page is a
13
+ * renderer, and the only thing it still owns is where a result links to.
14
+ */
15
+
16
+ /** What each collection is called on screen, and where one of its results lives. */
17
+ const COLLECTIONS: Readonly<Record<SearchCollection, { label: string; path: (id: string) => string }>> = {
18
+ handbook_page: { label: 'Handbook', path: (id) => `/handbook/${id}` },
19
+ person: { label: 'People', path: (id) => `/people/${id}` },
20
+ role: { label: 'Roles', path: (id) => `/hiring/${id}` },
21
+ company: { label: 'Companies', path: (id) => `/companies/${id}` },
22
+ deal: { label: 'Deals', path: (id) => `/deals/${id}` },
23
+ opportunity: { label: 'Opportunities', path: (id) => `/opportunities/${id}` },
24
+ raise: { label: 'Fundraising', path: (id) => `/fundraising/${id}` },
25
+ partnership: { label: 'Partnerships', path: (id) => `/partnerships/${id}` },
26
+ // Decisions have no detail page of their own, in the mockup or here. The global
27
+ // list is where one is read.
28
+ decision: { label: 'Decisions', path: () => '/decisions' },
29
+ }
30
+
31
+ export function SearchPage(): React.JSX.Element {
32
+ const [params] = useSearchParams()
33
+ const term = params.get('q') ?? ''
34
+ const { results, isLoading, error } = useSearch(term)
35
+
36
+ if (term.trim().length === 0) {
37
+ return (
38
+ <div className="animate-fade-in py-16 text-center">
39
+ <p className="text-[15px] font-medium text-ink">Search Kelpie</p>
40
+ <p className="mt-1 text-[13px] text-ink-muted">
41
+ Find people, companies, deals, raises, decisions, and handbook pages.
42
+ </p>
43
+ </div>
44
+ )
45
+ }
46
+
47
+ return (
48
+ <div className="animate-fade-in mx-auto max-w-3xl">
49
+ <PageHeader
50
+ title="Search"
51
+ description={
52
+ results === undefined
53
+ ? `Searching for “${term}”`
54
+ : `${String(results.total)} result${results.total === 1 ? '' : 's'} for “${term}”`
55
+ }
56
+ />
57
+
58
+ {error !== null && <ErrorPanel error={error} />}
59
+ {error === null && isLoading && <LoadingPanel label="Searching…" />}
60
+
61
+ {results !== undefined && results.total === 0 && (
62
+ <div className="rounded-lg border border-dashed border-border-strong bg-surface-raised px-6 py-14 text-center">
63
+ <p className="text-[15px] font-medium text-ink">No matches</p>
64
+ <p className="mt-1 text-[13px] text-ink-muted">
65
+ Try a name, tag, plan item, or handbook topic.
66
+ </p>
67
+ </div>
68
+ )}
69
+
70
+ {results !== undefined && results.total > 0 && (
71
+ <div className="space-y-6">
72
+ {results.groups.map((group) => (
73
+ <ResultGroup key={group.collection} group={group} />
74
+ ))}
75
+ </div>
76
+ )}
77
+ </div>
78
+ )
79
+ }
80
+
81
+ function ResultGroup({ group }: { readonly group: SearchResultGroup }): React.JSX.Element | null {
82
+ if (group.items.length === 0) {
83
+ return null
84
+ }
85
+
86
+ const { label } = COLLECTIONS[group.collection]
87
+ // `total` counts every match; the list is capped by the request. Saying so
88
+ // beats a list that silently stops at ten.
89
+ const withheld = group.total - group.items.length
90
+
91
+ return (
92
+ <section>
93
+ <h2 className="mb-2 flex items-baseline gap-2 text-[11px] font-semibold tracking-wide text-ink-faint uppercase">
94
+ {label}
95
+ {withheld > 0 && (
96
+ <span className="font-normal normal-case">
97
+ showing {group.items.length} of {group.total}
98
+ </span>
99
+ )}
100
+ </h2>
101
+ <ul className="overflow-hidden rounded-md border border-border">
102
+ {group.items.map((item) => (
103
+ <li key={item.id} className="border-b border-border last:border-0">
104
+ <ResultRow collection={group.collection} item={item} />
105
+ </li>
106
+ ))}
107
+ </ul>
108
+ </section>
109
+ )
110
+ }
111
+
112
+ function ResultRow({
113
+ collection,
114
+ item,
115
+ }: {
116
+ readonly collection: SearchCollection
117
+ readonly item: SearchResult
118
+ }): React.JSX.Element {
119
+ return (
120
+ <Link
121
+ to={COLLECTIONS[collection].path(item.id)}
122
+ className="block px-4 py-2.5 transition hover:bg-accent-soft/30"
123
+ >
124
+ <div className="flex items-center justify-between gap-3">
125
+ <span className="min-w-0 flex-1 truncate text-[13px] font-medium text-ink">{item.title}</span>
126
+ {item.subtitle !== null && item.subtitle.length > 0 && (
127
+ <span className="max-w-[45%] truncate text-[11px] text-ink-faint">{item.subtitle}</span>
128
+ )}
129
+ </div>
130
+ {item.snippet.length > 0 && (
131
+ <p className="mt-0.5 truncate text-[12px] text-ink-muted">{item.snippet}</p>
132
+ )}
133
+ </Link>
134
+ )
135
+ }
@@ -0,0 +1,38 @@
1
+ import { NavLink, Outlet } from 'react-router'
2
+
3
+ /**
4
+ * Tabs across the account's own settings, from the mockup's `AccountNav`.
5
+ *
6
+ * Three of its five tabs are here. Personal API keys and integrations arrive
7
+ * with the features behind them, the same rule the shell's sidebar follows.
8
+ */
9
+
10
+ const TABS = [
11
+ { to: '/account/profile', label: 'Profile' },
12
+ { to: '/account/security', label: 'Security' },
13
+ { to: '/account/preferences', label: 'Preferences' },
14
+ ] as const
15
+
16
+ function tabClass({ isActive }: { isActive: boolean }): string {
17
+ return [
18
+ 'rounded-md px-3 py-1.5 text-[13px] font-medium transition-colors',
19
+ isActive
20
+ ? 'bg-accent-soft text-accent-hover'
21
+ : 'text-ink-muted hover:bg-surface hover:text-ink',
22
+ ].join(' ')
23
+ }
24
+
25
+ export function AccountLayout(): React.JSX.Element {
26
+ return (
27
+ <div className="animate-fade-in mx-auto max-w-4xl">
28
+ <nav className="mb-6 flex flex-wrap gap-1 border-b border-border pb-3">
29
+ {TABS.map((tab) => (
30
+ <NavLink key={tab.to} to={tab.to} className={tabClass}>
31
+ {tab.label}
32
+ </NavLink>
33
+ ))}
34
+ </nav>
35
+ <Outlet />
36
+ </div>
37
+ )
38
+ }
@@ -0,0 +1,20 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ /** A labelled control, with the optional line of help under it. */
4
+ export function Field({
5
+ label,
6
+ hint,
7
+ children,
8
+ }: {
9
+ readonly label: string
10
+ readonly hint?: string
11
+ readonly children: ReactNode
12
+ }): React.JSX.Element {
13
+ return (
14
+ <label className="block">
15
+ <span className="mb-1.5 block text-[12px] font-medium text-ink">{label}</span>
16
+ {children}
17
+ {hint !== undefined && <span className="mt-1 block text-[11px] text-ink-faint">{hint}</span>}
18
+ </label>
19
+ )
20
+ }