@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,124 @@
1
+ import { MINIMUM_PASSWORD_LENGTH } from '@kelpie/schemas'
2
+ import { useState } from 'react'
3
+ import type { FormEvent } from 'react'
4
+ import { Link, useSearchParams } from 'react-router'
5
+
6
+ import { useConfirmPasswordReset } from '../../api/resources/session.ts'
7
+ import { ErrorPanel } from '../../components/QueryState.tsx'
8
+ import { SubmitButton, TextField } from './AuthForm.tsx'
9
+ import { AuthLayout } from './AuthLayout.tsx'
10
+
11
+ /**
12
+ * Where a reset email lands: `/reset-password?token=…`.
13
+ *
14
+ * The mockup has no page for this, because a mockup never sent the email. The
15
+ * token is in the URL rather than typed, so the form asks for the new password
16
+ * and nothing else.
17
+ *
18
+ * Success does not sign anyone in. The service ends every session the account
19
+ * had, which is the point of a reset when the account was stolen, so the only
20
+ * honest next step is the sign-in form.
21
+ */
22
+ export function ResetPasswordPage(): React.JSX.Element {
23
+ const [searchParameters] = useSearchParams()
24
+ const token = searchParameters.get('token') ?? ''
25
+ const confirm = useConfirmPasswordReset()
26
+ const [password, setPassword] = useState('')
27
+ const [confirmation, setConfirmation] = useState('')
28
+ const [localError, setLocalError] = useState<string | null>(null)
29
+ const [done, setDone] = useState(false)
30
+
31
+ const backToSignIn = (
32
+ <Link to="/login" className="font-medium text-accent hover:underline">
33
+ Back to sign in
34
+ </Link>
35
+ )
36
+
37
+ if (token.length === 0) {
38
+ return (
39
+ <AuthLayout title="This link is incomplete" footer={backToSignIn}>
40
+ <p className="mt-4 text-[13px] text-ink-muted">
41
+ It carries no reset token. Ask for a new link from{' '}
42
+ <Link to="/forgot-password" className="font-medium text-accent hover:underline">
43
+ Forgot password
44
+ </Link>
45
+ .
46
+ </p>
47
+ </AuthLayout>
48
+ )
49
+ }
50
+
51
+ if (done) {
52
+ return (
53
+ <AuthLayout title="Password changed" footer={backToSignIn}>
54
+ <p className="mt-4 text-[13px] text-ink-muted">
55
+ Every device that was signed in to this account has been signed out. Sign in again with
56
+ the new password.
57
+ </p>
58
+ </AuthLayout>
59
+ )
60
+ }
61
+
62
+ /** The two rules the browser can decide on its own, before spending the token. */
63
+ function localProblem(): string | null {
64
+ if (password.length < MINIMUM_PASSWORD_LENGTH) {
65
+ return `Password must be at least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`
66
+ }
67
+
68
+ return password === confirmation ? null : 'Password and confirmation do not match.'
69
+ }
70
+
71
+ function submit(event: FormEvent): void {
72
+ event.preventDefault()
73
+
74
+ const problem = localProblem()
75
+
76
+ setLocalError(problem)
77
+
78
+ if (problem !== null) {
79
+ return
80
+ }
81
+
82
+ confirm
83
+ .runAsync({ token, password })
84
+ .then(() => {
85
+ setDone(true)
86
+ })
87
+ .catch(() => undefined)
88
+ }
89
+
90
+ return (
91
+ <AuthLayout
92
+ title="Choose a new password"
93
+ description="This link works once."
94
+ footer={backToSignIn}
95
+ >
96
+ <form onSubmit={submit} className="mt-5 space-y-3">
97
+ <TextField
98
+ label="New password"
99
+ type="password"
100
+ value={password}
101
+ onChange={setPassword}
102
+ autoComplete="new-password"
103
+ hint={`At least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`}
104
+ required
105
+ />
106
+ <TextField
107
+ label="Confirm new password"
108
+ type="password"
109
+ value={confirmation}
110
+ onChange={setConfirmation}
111
+ autoComplete="new-password"
112
+ required
113
+ />
114
+ {localError !== null && <p className="text-[12px] text-danger">{localError}</p>}
115
+ {confirm.error !== null && <ErrorPanel error={confirm.error} />}
116
+ <SubmitButton
117
+ label="Set new password"
118
+ pendingLabel="Saving…"
119
+ isPending={confirm.isPending}
120
+ />
121
+ </form>
122
+ </AuthLayout>
123
+ )
124
+ }
@@ -0,0 +1,83 @@
1
+ import { useState } from 'react'
2
+ import type { FormEvent } from 'react'
3
+ import { Link, useNavigate, useSearchParams } from 'react-router'
4
+
5
+ import { useLogIn } from '../../api/resources/session.ts'
6
+ import { ErrorPanel } from '../../components/QueryState.tsx'
7
+ import { SubmitButton, TextField } from './AuthForm.tsx'
8
+ import { AuthLayout } from './AuthLayout.tsx'
9
+
10
+ /**
11
+ * Sign in, against `POST /v1/auth/login`.
12
+ *
13
+ * Where the browser goes afterwards is not always the app. An invitation link
14
+ * sends its token through `?next=`, and dropping it would land the invitee on
15
+ * People with the invitation still unaccepted.
16
+ */
17
+
18
+ /**
19
+ * Only a path within this app. An absolute URL in `?next=` would turn the
20
+ * sign-in form into an open redirect.
21
+ */
22
+ function safeNext(value: string | null): string {
23
+ return value !== null && value.startsWith('/') && !value.startsWith('//') ? value : '/dashboard'
24
+ }
25
+
26
+ export function SignInPage(): React.JSX.Element {
27
+ const navigate = useNavigate()
28
+ const [searchParameters] = useSearchParams()
29
+ const logIn = useLogIn()
30
+ const [email, setEmail] = useState('')
31
+ const [password, setPassword] = useState('')
32
+
33
+ const next = safeNext(searchParameters.get('next'))
34
+
35
+ function submit(event: FormEvent): void {
36
+ event.preventDefault()
37
+
38
+ logIn
39
+ .runAsync({ email: email.trim(), password })
40
+ .then(() => navigate(next, { replace: true }))
41
+ .catch(() => undefined)
42
+ }
43
+
44
+ return (
45
+ <AuthLayout
46
+ title="Sign in"
47
+ footer={
48
+ <div className="flex flex-col gap-1.5">
49
+ <Link to="/forgot-password" className="font-medium text-accent hover:underline">
50
+ Forgot password?
51
+ </Link>
52
+ <span className="text-ink-muted">
53
+ No account?{' '}
54
+ <Link to="/signup" className="font-medium text-accent hover:underline">
55
+ Sign up
56
+ </Link>
57
+ </span>
58
+ </div>
59
+ }
60
+ >
61
+ <form onSubmit={submit} className="mt-5 space-y-3">
62
+ <TextField
63
+ label="Email"
64
+ type="email"
65
+ value={email}
66
+ onChange={setEmail}
67
+ autoComplete="email"
68
+ required
69
+ />
70
+ <TextField
71
+ label="Password"
72
+ type="password"
73
+ value={password}
74
+ onChange={setPassword}
75
+ autoComplete="current-password"
76
+ required
77
+ />
78
+ {logIn.error !== null && <ErrorPanel error={logIn.error} />}
79
+ <SubmitButton label="Sign in" pendingLabel="Signing in…" isPending={logIn.isPending} />
80
+ </form>
81
+ </AuthLayout>
82
+ )
83
+ }
@@ -0,0 +1,93 @@
1
+ import { MINIMUM_PASSWORD_LENGTH } from '@kelpie/schemas'
2
+ import { useState } from 'react'
3
+ import type { FormEvent } from 'react'
4
+ import { Link, useNavigate } from 'react-router'
5
+
6
+ import { useSignUp } from '../../api/resources/session.ts'
7
+ import { ErrorPanel } from '../../components/QueryState.tsx'
8
+ import { SubmitButton, TextField } from './AuthForm.tsx'
9
+ import { AuthLayout } from './AuthLayout.tsx'
10
+
11
+ /**
12
+ * Creating an account, against `POST /v1/auth/signup`.
13
+ *
14
+ * Signup makes the user and nothing else, per `onboarding.md`, so success lands
15
+ * on the first onboarding step rather than in the app. The response sets the
16
+ * session cookie, which is why the next page can already write.
17
+ *
18
+ * The mockup collected this into `sessionStorage` and committed the lot at the
19
+ * end of the wizard. Here each step commits as it is finished: a draft account
20
+ * held in the browser is one an interrupted signup loses.
21
+ */
22
+ export function SignUpPage(): React.JSX.Element {
23
+ const navigate = useNavigate()
24
+ const signUp = useSignUp()
25
+ const [name, setName] = useState('')
26
+ const [email, setEmail] = useState('')
27
+ const [password, setPassword] = useState('')
28
+ const [localError, setLocalError] = useState<string | null>(null)
29
+
30
+ function submit(event: FormEvent): void {
31
+ event.preventDefault()
32
+
33
+ // Checked here as well as by the service so the rule is stated before a
34
+ // submission rather than as a rejection afterwards.
35
+ if (password.length < MINIMUM_PASSWORD_LENGTH) {
36
+ setLocalError(`Password must be at least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`)
37
+
38
+ return
39
+ }
40
+
41
+ setLocalError(null)
42
+
43
+ signUp
44
+ .runAsync({ name: name.trim(), email: email.trim(), password })
45
+ .then(() => navigate('/onboarding/workspace', { replace: true }))
46
+ .catch(() => undefined)
47
+ }
48
+
49
+ return (
50
+ <AuthLayout
51
+ title="Create account"
52
+ description="Next you will create a workspace for your company."
53
+ footer={
54
+ <span className="text-ink-muted">
55
+ Already have an account?{' '}
56
+ <Link to="/login" className="font-medium text-accent hover:underline">
57
+ Sign in
58
+ </Link>
59
+ </span>
60
+ }
61
+ >
62
+ <form onSubmit={submit} className="mt-5 space-y-3">
63
+ <TextField
64
+ label="Your name"
65
+ value={name}
66
+ onChange={setName}
67
+ autoComplete="name"
68
+ required
69
+ />
70
+ <TextField
71
+ label="Email"
72
+ type="email"
73
+ value={email}
74
+ onChange={setEmail}
75
+ autoComplete="email"
76
+ required
77
+ />
78
+ <TextField
79
+ label="Password"
80
+ type="password"
81
+ value={password}
82
+ onChange={setPassword}
83
+ autoComplete="new-password"
84
+ hint={`At least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`}
85
+ required
86
+ />
87
+ {localError !== null && <p className="text-[12px] text-danger">{localError}</p>}
88
+ {signUp.error !== null && <ErrorPanel error={signUp.error} />}
89
+ <SubmitButton label="Continue" pendingLabel="Creating…" isPending={signUp.isPending} />
90
+ </form>
91
+ </AuthLayout>
92
+ )
93
+ }
@@ -0,0 +1,175 @@
1
+ import {
2
+ CANDIDATE_STATUS_LABELS,
3
+ CANDIDATE_STATUSES,
4
+ FIRST_INTERVIEW_STAGE,
5
+ INTERVIEW_STAGE_LABELS,
6
+ INTERVIEW_STAGES,
7
+ } from '@kelpie/schemas'
8
+ import type { Candidate, CandidateInput, CandidateStatus, InterviewStage } from '@kelpie/schemas'
9
+ import { useState } from 'react'
10
+
11
+ import { usePatch } from '../api/resource.ts'
12
+ import type { PatchResult } from '../api/resource.ts'
13
+ import { usePeople } from '../api/resources/people.ts'
14
+ import { useUpdateCandidate } from '../api/resources/candidates.ts'
15
+ import { Chip } from '../components/Chip.tsx'
16
+ import type { ChipTone } from '../components/Chip.tsx'
17
+ import { EntitySearch } from '../components/EntitySearch.tsx'
18
+ import { InlineEdit } from '../components/InlineEdit.tsx'
19
+ import { ErrorPanel } from '../components/QueryState.tsx'
20
+
21
+ /**
22
+ * The three editable fields of a candidacy, shared by the Role page and the
23
+ * person's Hiring tab.
24
+ *
25
+ * Both pages draw them differently — a row of chips on one, a labelled grid on
26
+ * the other, which is how the mockup draws them — so what is shared is the
27
+ * editing rather than the layout.
28
+ *
29
+ * None of these knows the rule tying stage to status. Setting a status away from
30
+ * `in_process` clears the stage server-side and setting it back restores the
31
+ * first one, so a page sends the one field the user touched and renders whatever
32
+ * comes back.
33
+ */
34
+
35
+ const STATUS_OPTIONS = CANDIDATE_STATUSES.map((status) => ({
36
+ value: status,
37
+ label: CANDIDATE_STATUS_LABELS[status],
38
+ }))
39
+
40
+ const STAGE_OPTIONS = INTERVIEW_STAGES.map((stage) => ({
41
+ value: stage,
42
+ label: INTERVIEW_STAGE_LABELS[stage],
43
+ }))
44
+
45
+ const STATUS_TONES: Readonly<Record<CandidateStatus, ChipTone>> = {
46
+ hired: 'success',
47
+ in_process: 'accent',
48
+ nurture: 'warning',
49
+ passed: 'danger',
50
+ withdrawn: 'danger',
51
+ }
52
+
53
+ function useCandidatePatch(candidate: Candidate): PatchResult<CandidateInput> {
54
+ return usePatch(useUpdateCandidate, candidate)
55
+ }
56
+
57
+ export interface CandidateFieldProps {
58
+ readonly candidate: Candidate
59
+ /** Rendered instead of the chip where the surrounding page uses plain text. */
60
+ readonly plain?: boolean
61
+ }
62
+
63
+ export function CandidateStatusField({
64
+ candidate,
65
+ plain = false,
66
+ }: CandidateFieldProps): React.JSX.Element {
67
+ const { patch, error } = useCandidatePatch(candidate)
68
+
69
+ return (
70
+ <div className="inline-flex flex-col gap-1">
71
+ <InlineEdit
72
+ value={candidate.status}
73
+ onChange={(value) => {
74
+ patch({ status: value as CandidateStatus })
75
+ }}
76
+ options={STATUS_OPTIONS}
77
+ display={
78
+ plain ? (
79
+ <span className="px-1 text-[13px]">{CANDIDATE_STATUS_LABELS[candidate.status]}</span>
80
+ ) : (
81
+ <Chip tone={STATUS_TONES[candidate.status]}>
82
+ {CANDIDATE_STATUS_LABELS[candidate.status]}
83
+ </Chip>
84
+ )
85
+ }
86
+ displayClassName={plain ? 'not-italic text-[13px]' : 'not-italic inline-flex'}
87
+ className={plain ? '' : '!w-auto'}
88
+ />
89
+ {error !== null && <ErrorPanel error={error} />}
90
+ </div>
91
+ )
92
+ }
93
+
94
+ export function CandidateStageField({
95
+ candidate,
96
+ plain = false,
97
+ }: CandidateFieldProps): React.JSX.Element {
98
+ const { patch, error } = useCandidatePatch(candidate)
99
+ const stage = candidate.interviewStage ?? FIRST_INTERVIEW_STAGE
100
+
101
+ return (
102
+ <div className="inline-flex flex-col gap-1">
103
+ <InlineEdit
104
+ value={stage}
105
+ onChange={(value) => {
106
+ patch({ interviewStage: value as InterviewStage })
107
+ }}
108
+ options={STAGE_OPTIONS}
109
+ display={
110
+ plain ? (
111
+ <span className="px-1 text-[13px]">{INTERVIEW_STAGE_LABELS[stage]}</span>
112
+ ) : (
113
+ <span className="text-[12px] text-ink-muted">{INTERVIEW_STAGE_LABELS[stage]}</span>
114
+ )
115
+ }
116
+ displayClassName={plain ? 'not-italic text-[13px]' : 'not-italic'}
117
+ className={plain ? '' : '!w-auto'}
118
+ />
119
+ {error !== null && <ErrorPanel error={error} />}
120
+ </div>
121
+ )
122
+ }
123
+
124
+ export interface CandidateReferrerFieldProps {
125
+ readonly candidate: Candidate
126
+ /** The referrer's name when it is already on the page, so the picker shows it. */
127
+ readonly referrerName: string | undefined
128
+ }
129
+
130
+ /**
131
+ * Who vouched for this candidate.
132
+ *
133
+ * The candidate themselves is filtered out of the options: the API refuses a
134
+ * self-referral with a `422`, and offering a choice that cannot be made is worse
135
+ * than not offering it.
136
+ */
137
+ export function CandidateReferrerField({
138
+ candidate,
139
+ referrerName,
140
+ }: CandidateReferrerFieldProps): React.JSX.Element {
141
+ const { patch, error } = useCandidatePatch(candidate)
142
+ const [search, setSearch] = useState('')
143
+ const searchable = usePeople({ term: search.trim().length > 0 ? search.trim() : undefined })
144
+
145
+ const options = [
146
+ ...(candidate.referrerPersonId === null
147
+ ? []
148
+ : [{ id: candidate.referrerPersonId, label: referrerName ?? candidate.referrerPersonId }]),
149
+ ...searchable.records
150
+ .filter(
151
+ (person) => person.id !== candidate.personId && person.id !== candidate.referrerPersonId,
152
+ )
153
+ .map((person) => ({
154
+ id: person.id,
155
+ label: person.name,
156
+ meta: person.email ?? undefined,
157
+ })),
158
+ ]
159
+
160
+ return (
161
+ <div className="flex flex-col gap-1">
162
+ <EntitySearch
163
+ options={options}
164
+ value={candidate.referrerPersonId ?? ''}
165
+ onChange={(referrerPersonId) => {
166
+ patch({ referrerPersonId: referrerPersonId.length > 0 ? referrerPersonId : null })
167
+ }}
168
+ onQueryChange={setSearch}
169
+ placeholder="Search people…"
170
+ emptyMessage="No people match"
171
+ />
172
+ {error !== null && <ErrorPanel error={error} />}
173
+ </div>
174
+ )
175
+ }
@@ -0,0 +1,108 @@
1
+ import type { Dashboard } from '@kelpie/schemas'
2
+
3
+ import { useDashboard } from '../../api/resources/dashboard.ts'
4
+ import { useMembers } from '../../api/resources/members.ts'
5
+ import { useWorkspace } from '../../api/resources/workspace.ts'
6
+ import { AgentTasks } from '../../components/AgentTasks.tsx'
7
+ import { PageHeader } from '../../components/PageHeader.tsx'
8
+ import { ErrorPanel, LoadingPanel } from '../../components/QueryState.tsx'
9
+ import { attentionRows, briefLines } from './attention.ts'
10
+ import { ActivityFeed, AttentionList, DecisionsList, NotesList } from './sections.tsx'
11
+
12
+ /**
13
+ * The workspace home: what is open, what is late, and what happened lately.
14
+ *
15
+ * One request, not seven. `GET /v1/dashboard` answers the whole page, with the
16
+ * name of every record it points at already resolved, so this file holds no
17
+ * fetching beyond the two directories the shell needs anyway — the workspace,
18
+ * for its name, and the team, to turn an author id into a person.
19
+ */
20
+
21
+ /** The heading date, written in the workspace's own day rather than the browser's. */
22
+ function briefHeading(dashboard: Dashboard): string {
23
+ return new Intl.DateTimeFormat('en-AU', {
24
+ weekday: 'long',
25
+ month: 'short',
26
+ day: 'numeric',
27
+ timeZone: dashboard.timezone,
28
+ }).format(dashboard.generatedAt)
29
+ }
30
+
31
+ export function DashboardPage(): React.JSX.Element {
32
+ const { dashboard, isLoading, error } = useDashboard()
33
+ const { workspace } = useWorkspace()
34
+ const { nameById } = useMembers()
35
+
36
+ return (
37
+ <div className="animate-fade-in">
38
+ <PageHeader title="Dashboard" description="What needs attention across this workspace." />
39
+
40
+ {error !== null && <ErrorPanel error={error} />}
41
+ {isLoading && <LoadingPanel label="Loading the workspace…" />}
42
+
43
+ {dashboard !== undefined && (
44
+ <DashboardBody
45
+ dashboard={dashboard}
46
+ workspaceId={workspace?.id}
47
+ workspaceName={workspace?.name ?? 'This workspace'}
48
+ nameById={nameById}
49
+ />
50
+ )}
51
+ </div>
52
+ )
53
+ }
54
+
55
+ function DashboardBody({
56
+ dashboard,
57
+ workspaceId,
58
+ workspaceName,
59
+ nameById,
60
+ }: {
61
+ readonly dashboard: Dashboard
62
+ readonly workspaceId: string | undefined
63
+ readonly workspaceName: string
64
+ readonly nameById: ReadonlyMap<string, string>
65
+ }): React.JSX.Element {
66
+ // `generatedAt` rather than a fresh `new Date()`: every relative time on the
67
+ // page is then measured from the same instant the counts were, so a tab left
68
+ // open does not creep towards "2 hours ago" on rows that never moved.
69
+ const now = dashboard.generatedAt
70
+
71
+ return (
72
+ <div>
73
+ <section className="mb-8 border-b border-border pb-6">
74
+ <div className="flex flex-wrap items-start justify-between gap-3">
75
+ <div>
76
+ <p className="text-[11px] text-ink-faint">Daily brief</p>
77
+ <h2 className="mt-0.5 text-[15px] font-semibold tracking-tight text-ink">
78
+ {workspaceName} · {briefHeading(dashboard)}
79
+ </h2>
80
+ <p className="mt-1 text-[12px] text-ink-muted">
81
+ Assembled from overdue Plans, partnership touchpoints, and contacts going cold.
82
+ </p>
83
+ </div>
84
+ {workspaceId !== undefined && (
85
+ <AgentTasks targetType="workspace" targetId={workspaceId} targetLabel={workspaceName} />
86
+ )}
87
+ </div>
88
+ <ul className="mt-4 space-y-1.5">
89
+ {briefLines(dashboard).map((line) => (
90
+ <li key={line} className="flex gap-2 text-[13px] leading-relaxed text-ink">
91
+ <span className="mt-[9px] h-1 w-1 shrink-0 rounded-full bg-accent" />
92
+ <span>{line}</span>
93
+ </li>
94
+ ))}
95
+ </ul>
96
+ </section>
97
+
98
+ <div className="mb-8 grid gap-8 lg:grid-cols-2">
99
+ <AttentionList rows={attentionRows(dashboard)} />
100
+ <ActivityFeed activities={dashboard.recentActivity} nameById={nameById} now={now} />
101
+ </div>
102
+ <div className="grid gap-8 lg:grid-cols-2">
103
+ <NotesList notes={dashboard.recentNotes} nameById={nameById} now={now} />
104
+ <DecisionsList decisions={dashboard.recentDecisions} nameById={nameById} />
105
+ </div>
106
+ </div>
107
+ )
108
+ }