@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,46 @@
1
+ /**
2
+ * The controls the signed-out pages share.
3
+ *
4
+ * Seven forms across sign-in, signup, the two reset pages, and onboarding wrote
5
+ * the same label, input, and button markup. One copy of it here means a change
6
+ * to how a field looks is one edit rather than seven, and a page reads as what
7
+ * it asks for rather than as a wall of class names.
8
+ */
9
+ /**
10
+ * Exported for the one control `TextField` cannot express: the invite row pairs
11
+ * an address with a role on a single line, so neither gets its own label.
12
+ */
13
+ export declare const AUTH_INPUT_CLASS = "w-full rounded-md border border-border bg-surface px-3 py-2 text-[13px] outline-none focus:border-accent focus:ring-2 focus:ring-accent/20";
14
+ export interface TextFieldProps {
15
+ readonly label: string;
16
+ readonly type?: 'text' | 'email' | 'password';
17
+ readonly value: string;
18
+ readonly onChange: (value: string) => void;
19
+ /** What a password manager should offer here. Always worth setting on a credential. */
20
+ readonly autoComplete?: string;
21
+ readonly placeholder?: string;
22
+ readonly hint?: string;
23
+ readonly required?: boolean;
24
+ /** A slug or a token: characters the reader has to be able to tell apart. */
25
+ readonly mono?: boolean;
26
+ }
27
+ export declare function TextField({ label, type, value, onChange, autoComplete, placeholder, hint, required, mono, }: TextFieldProps): React.JSX.Element;
28
+ export interface SubmitButtonProps {
29
+ readonly label: string;
30
+ /** Shown while the request is in flight, so the button says what is happening. */
31
+ readonly pendingLabel: string;
32
+ readonly isPending: boolean;
33
+ }
34
+ export declare function SubmitButton({ label, pendingLabel, isPending, }: SubmitButtonProps): React.JSX.Element;
35
+ /** The same button where there is no form to submit, only somewhere to go next. */
36
+ export declare function PrimaryButton({ label, onClick, }: {
37
+ readonly label: string;
38
+ readonly onClick: () => void;
39
+ }): React.JSX.Element;
40
+ /** The same button as a plain action: skipping a step, or finishing one. */
41
+ export declare function SecondaryButton({ label, onClick, disabled, }: {
42
+ readonly label: string;
43
+ readonly onClick: () => void;
44
+ readonly disabled?: boolean;
45
+ }): React.JSX.Element;
46
+ //# sourceMappingURL=AuthForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthForm.d.ts","sourceRoot":"","sources":["../../../src/pages/auth/AuthForm.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,+IACiH,CAAA;AAE9I,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,uFAAuF;IACvF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,IAAa,EACb,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,IAAI,EACJ,QAAgB,EAChB,IAAY,GACb,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkBpC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,kFAAkF;IAClF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAKD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,YAAY,EACZ,SAAS,GACV,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAMvC;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,GACR,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAC7B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAMpB;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,OAAO,EACP,QAAgB,GACjB,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAWpB"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * The controls the signed-out pages share.
4
+ *
5
+ * Seven forms across sign-in, signup, the two reset pages, and onboarding wrote
6
+ * the same label, input, and button markup. One copy of it here means a change
7
+ * to how a field looks is one edit rather than seven, and a page reads as what
8
+ * it asks for rather than as a wall of class names.
9
+ */
10
+ /**
11
+ * Exported for the one control `TextField` cannot express: the invite row pairs
12
+ * an address with a role on a single line, so neither gets its own label.
13
+ */
14
+ export const AUTH_INPUT_CLASS = 'w-full rounded-md border border-border bg-surface px-3 py-2 text-[13px] outline-none focus:border-accent focus:ring-2 focus:ring-accent/20';
15
+ export function TextField({ label, type = 'text', value, onChange, autoComplete, placeholder, hint, required = false, mono = false, }) {
16
+ return (_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-[12px] font-medium text-ink", children: label }), _jsx("input", { type: type, value: value, onChange: (event) => {
17
+ onChange(event.target.value);
18
+ }, autoComplete: autoComplete, placeholder: placeholder, required: required, className: mono ? `${AUTH_INPUT_CLASS} font-mono` : AUTH_INPUT_CLASS }), hint !== undefined && _jsx("span", { className: "mt-1 block text-[11px] text-ink-faint", children: hint })] }));
19
+ }
20
+ const PRIMARY_CLASS = 'w-full rounded-md bg-accent px-3.5 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50';
21
+ export function SubmitButton({ label, pendingLabel, isPending, }) {
22
+ return (_jsx("button", { type: "submit", disabled: isPending, className: PRIMARY_CLASS, children: isPending ? pendingLabel : label }));
23
+ }
24
+ /** The same button where there is no form to submit, only somewhere to go next. */
25
+ export function PrimaryButton({ label, onClick, }) {
26
+ return (_jsx("button", { type: "button", onClick: onClick, className: PRIMARY_CLASS, children: label }));
27
+ }
28
+ /** The same button as a plain action: skipping a step, or finishing one. */
29
+ export function SecondaryButton({ label, onClick, disabled = false, }) {
30
+ return (_jsx("button", { type: "button", onClick: onClick, disabled: disabled, className: "w-full rounded-md border border-border bg-surface px-3.5 py-2 text-[12px] font-medium text-ink-muted transition hover:bg-surface-raised disabled:opacity-50", children: label }));
31
+ }
32
+ //# sourceMappingURL=AuthForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthForm.js","sourceRoot":"","sources":["../../../src/pages/auth/AuthForm.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,4IAA4I,CAAA;AAgB9I,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,GAAG,MAAM,EACb,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,IAAI,EACJ,QAAQ,GAAG,KAAK,EAChB,IAAI,GAAG,KAAK,GACG;IACf,OAAO,CACL,iBAAO,SAAS,EAAC,OAAO,aACtB,eAAM,SAAS,EAAC,+CAA+C,YAAE,KAAK,GAAQ,EAC9E,gBACE,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC9B,CAAC,EACD,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,gBAAgB,YAAY,CAAC,CAAC,CAAC,gBAAgB,GACpE,EACD,IAAI,KAAK,SAAS,IAAI,eAAM,SAAS,EAAC,uCAAuC,YAAE,IAAI,GAAQ,IACtF,CACT,CAAA;AACH,CAAC;AASD,MAAM,aAAa,GACjB,uIAAuI,CAAA;AAEzI,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,YAAY,EACZ,SAAS,GACS;IAClB,OAAO,CACL,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,YAChE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,GAC1B,CACV,CAAA;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,GAIR;IACC,OAAO,CACL,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,YAC7D,KAAK,GACC,CACV,CAAA;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,EACL,OAAO,EACP,QAAQ,GAAG,KAAK,GAKjB;IACC,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,6JAA6J,YAEtK,KAAK,GACC,CACV,CAAA;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * The centred card every signed-out page sits in: sign in, signup, the two
4
+ * password-reset pages, and the three onboarding steps.
5
+ *
6
+ * `step` is what makes it an onboarding page. Onboarding is a sequence somebody
7
+ * is part-way through, and a card that does not say where they are in it turns
8
+ * three screens into three unrelated forms.
9
+ */
10
+ /** Onboarding, per `onboarding.md`: workspace, invites, handbook. */
11
+ declare const ONBOARDING_STEPS: readonly [1, 2, 3];
12
+ export type OnboardingStep = (typeof ONBOARDING_STEPS)[number];
13
+ export interface AuthLayoutProps {
14
+ readonly title: string;
15
+ readonly description?: string;
16
+ /** Which onboarding step this is. Draws the progress bar and widens the card. */
17
+ readonly step?: OnboardingStep;
18
+ readonly children: ReactNode;
19
+ /** Links below the form: the way back, or the other way in. */
20
+ readonly footer?: ReactNode;
21
+ }
22
+ export declare function AuthLayout({ title, description, step, children, footer, }: AuthLayoutProps): React.JSX.Element;
23
+ export {};
24
+ //# sourceMappingURL=AuthLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthLayout.d.ts","sourceRoot":"","sources":["../../../src/pages/auth/AuthLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;;;;;GAOG;AAEH,qEAAqE;AACrE,QAAA,MAAM,gBAAgB,YAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAA;AAE3C,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAC5B;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,MAAM,GACP,EAAE,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqBrC"}
@@ -0,0 +1,19 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link } from 'react-router';
3
+ /**
4
+ * The centred card every signed-out page sits in: sign in, signup, the two
5
+ * password-reset pages, and the three onboarding steps.
6
+ *
7
+ * `step` is what makes it an onboarding page. Onboarding is a sequence somebody
8
+ * is part-way through, and a card that does not say where they are in it turns
9
+ * three screens into three unrelated forms.
10
+ */
11
+ /** Onboarding, per `onboarding.md`: workspace, invites, handbook. */
12
+ const ONBOARDING_STEPS = [1, 2, 3];
13
+ export function AuthLayout({ title, description, step, children, footer, }) {
14
+ return (_jsxs("div", { className: "flex min-h-screen flex-col items-center justify-center bg-surface px-4 py-12", children: [_jsx(Link, { to: "/login", className: "mb-8 text-[20px] font-semibold tracking-tight text-ink", children: "Kelpie" }), _jsxs("div", { className: `w-full animate-fade-in rounded-md border border-border p-6 ${step === undefined ? 'max-w-sm' : 'max-w-md'}`, children: [step !== undefined && _jsx(StepProgress, { step: step }), _jsx("h1", { className: "text-[18px] font-semibold tracking-tight text-ink", children: title }), description !== undefined && (_jsx("p", { className: "mt-1 text-[13px] text-ink-muted", children: description })), children, footer !== undefined && _jsx("div", { className: "mt-4 text-center text-[12px]", children: footer })] })] }));
15
+ }
16
+ function StepProgress({ step }) {
17
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "mb-4 flex items-center gap-2", children: ONBOARDING_STEPS.map((each) => (_jsx("div", { "aria-hidden": true, className: `h-1.5 flex-1 rounded-full ${each <= step ? 'bg-accent' : 'bg-border'}` }, each))) }), _jsxs("p", { className: "mb-1 text-[11px] font-medium tracking-wide text-ink-faint uppercase", children: ["Step ", step, " of ", ONBOARDING_STEPS.length] })] }));
18
+ }
19
+ //# sourceMappingURL=AuthLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthLayout.js","sourceRoot":"","sources":["../../../src/pages/auth/AuthLayout.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEnC;;;;;;;GAOG;AAEH,qEAAqE;AACrE,MAAM,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAA;AAc3C,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,MAAM,GACU;IAChB,OAAO,CACL,eAAK,SAAS,EAAC,8EAA8E,aAC3F,KAAC,IAAI,IAAC,EAAE,EAAC,QAAQ,EAAC,SAAS,EAAC,wDAAwD,uBAE7E,EACP,eACE,SAAS,EAAE,8DACT,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UACpC,EAAE,aAED,IAAI,KAAK,SAAS,IAAI,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,GAAI,EACnD,aAAI,SAAS,EAAC,mDAAmD,YAAE,KAAK,GAAM,EAC7E,WAAW,KAAK,SAAS,IAAI,CAC5B,YAAG,SAAS,EAAC,iCAAiC,YAAE,WAAW,GAAK,CACjE,EACA,QAAQ,EACR,MAAM,KAAK,SAAS,IAAI,cAAK,SAAS,EAAC,8BAA8B,YAAE,MAAM,GAAO,IACjF,IACF,CACP,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,IAAI,EAAqC;IAC/D,OAAO,CACL,8BACE,cAAK,SAAS,EAAC,8BAA8B,YAC1C,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC9B,mCAGE,SAAS,EAAE,6BAA6B,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,IAF7E,IAAI,CAGT,CACH,CAAC,GACE,EACN,aAAG,SAAS,EAAC,qEAAqE,sBAC1E,IAAI,UAAM,gBAAgB,CAAC,MAAM,IACrC,IACH,CACJ,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Asking for a reset link, against `POST /v1/auth/password-reset`.
3
+ *
4
+ * The endpoint answers `202` whether or not the address is registered, and this
5
+ * page has to answer the same way. Saying "no account with that address" would
6
+ * make the form an account-existence oracle, which is the whole reason the
7
+ * service refuses to tell.
8
+ *
9
+ * So the confirmation is conditional: *if* an account exists. It is not a
10
+ * hedge, it is the only thing the browser actually knows.
11
+ */
12
+ export declare function ForgotPasswordPage(): React.JSX.Element;
13
+ //# sourceMappingURL=ForgotPasswordPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgotPasswordPage.d.ts","sourceRoot":"","sources":["../../../src/pages/auth/ForgotPasswordPage.tsx"],"names":[],"mappings":"AASA;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA2DtD"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Link } from 'react-router';
4
+ import { resetUrlTemplate, useRequestPasswordReset } from '../../api/resources/session.js';
5
+ import { ErrorPanel } from '../../components/QueryState.js';
6
+ import { SubmitButton, TextField } from './AuthForm.js';
7
+ import { AuthLayout } from './AuthLayout.js';
8
+ /**
9
+ * Asking for a reset link, against `POST /v1/auth/password-reset`.
10
+ *
11
+ * The endpoint answers `202` whether or not the address is registered, and this
12
+ * page has to answer the same way. Saying "no account with that address" would
13
+ * make the form an account-existence oracle, which is the whole reason the
14
+ * service refuses to tell.
15
+ *
16
+ * So the confirmation is conditional: *if* an account exists. It is not a
17
+ * hedge, it is the only thing the browser actually knows.
18
+ */
19
+ export function ForgotPasswordPage() {
20
+ const request = useRequestPasswordReset();
21
+ const [email, setEmail] = useState('');
22
+ const [sentTo, setSentTo] = useState(null);
23
+ function submit(event) {
24
+ event.preventDefault();
25
+ const address = email.trim();
26
+ request
27
+ .runAsync({ email: address, resetUrlTemplate: resetUrlTemplate(window.location.origin) })
28
+ .then(() => {
29
+ setSentTo(address);
30
+ })
31
+ .catch(() => undefined);
32
+ }
33
+ const backToSignIn = (_jsx(Link, { to: "/login", className: "font-medium text-accent hover:underline", children: "Back to sign in" }));
34
+ if (sentTo !== null) {
35
+ return (_jsx(AuthLayout, { title: "Check your email", footer: backToSignIn, children: _jsxs("p", { className: "mt-4 text-[13px] text-ink-muted", children: ["If an account exists for ", _jsx("span", { className: "font-medium text-ink", children: sentTo }), ", a reset link is on its way. The link expires, so use it soon."] }) }));
36
+ }
37
+ return (_jsx(AuthLayout, { title: "Reset password", description: "Enter your email and we will send you a link.", footer: backToSignIn, children: _jsxs("form", { onSubmit: submit, className: "mt-5 space-y-3", children: [_jsx(TextField, { label: "Email", type: "email", value: email, onChange: setEmail, autoComplete: "email", required: true }), request.error !== null && _jsx(ErrorPanel, { error: request.error }), _jsx(SubmitButton, { label: "Send reset link", pendingLabel: "Sending\u2026", isPending: request.isPending })] }) }));
38
+ }
39
+ //# sourceMappingURL=ForgotPasswordPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgotPasswordPage.js","sourceRoot":"","sources":["../../../src/pages/auth/ForgotPasswordPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEnC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAiC,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAgB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAA;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAA;IACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAEzD,SAAS,MAAM,CAAC,KAAgB;QAC9B,KAAK,CAAC,cAAc,EAAE,CAAA;QAEtB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;QAE5B,OAAO;aACJ,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;aACxF,IAAI,CAAC,GAAG,EAAE;YACT,SAAS,CAAC,OAAO,CAAC,CAAA;QACpB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC3B,CAAC;IAED,MAAM,YAAY,GAAG,CACnB,KAAC,IAAI,IAAC,EAAE,EAAC,QAAQ,EAAC,SAAS,EAAC,yCAAyC,gCAE9D,CACR,CAAA;IAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,CACL,KAAC,UAAU,IAAC,KAAK,EAAC,kBAAkB,EAAC,MAAM,EAAE,YAAY,YACvD,aAAG,SAAS,EAAC,iCAAiC,0CACnB,eAAM,SAAS,EAAC,sBAAsB,YAAE,MAAM,GAAQ,uEAE7E,GACO,CACd,CAAA;IACH,CAAC;IAED,OAAO,CACL,KAAC,UAAU,IACT,KAAK,EAAC,gBAAgB,EACtB,WAAW,EAAC,+CAA+C,EAC3D,MAAM,EAAE,YAAY,YAEpB,gBAAM,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAC,gBAAgB,aAChD,KAAC,SAAS,IACR,KAAK,EAAC,OAAO,EACb,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAC,OAAO,EACpB,QAAQ,SACR,EACD,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,KAAC,UAAU,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,GAAI,EAC/D,KAAC,YAAY,IACX,KAAK,EAAC,iBAAiB,EACvB,YAAY,EAAC,eAAU,EACvB,SAAS,EAAE,OAAO,CAAC,SAAS,GAC5B,IACG,GACI,CACd,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Where an invitation email lands: `/join?token=…`.
3
+ *
4
+ * Accepting needs a signed-in account, because the invitation adds *somebody* to
5
+ * the workspace and the token does not say who. An invitee who is signed out is
6
+ * sent to sign in with the token kept in the URL they come back to.
7
+ *
8
+ * Accepting is not automatic on load. It is a write that changes which workspace
9
+ * the session is in, so it waits for the person to press the button.
10
+ */
11
+ export declare function JoinPage(): React.JSX.Element;
12
+ //# sourceMappingURL=JoinPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JoinPage.d.ts","sourceRoot":"","sources":["../../../src/pages/auth/JoinPage.tsx"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAoE5C"}
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link, Navigate, useNavigate, useSearchParams } from 'react-router';
3
+ import { useAcceptInvite, useSession } from '../../api/resources/session.js';
4
+ import { ErrorPanel, LoadingPanel } from '../../components/QueryState.js';
5
+ import { AuthLayout } from './AuthLayout.js';
6
+ /**
7
+ * Where an invitation email lands: `/join?token=…`.
8
+ *
9
+ * Accepting needs a signed-in account, because the invitation adds *somebody* to
10
+ * the workspace and the token does not say who. An invitee who is signed out is
11
+ * sent to sign in with the token kept in the URL they come back to.
12
+ *
13
+ * Accepting is not automatic on load. It is a write that changes which workspace
14
+ * the session is in, so it waits for the person to press the button.
15
+ */
16
+ export function JoinPage() {
17
+ const navigate = useNavigate();
18
+ const [searchParameters] = useSearchParams();
19
+ const token = searchParameters.get('token') ?? '';
20
+ const { isLoading, isSignedOut, error } = useSession();
21
+ const accept = useAcceptInvite();
22
+ if (token.length === 0) {
23
+ return (_jsx(AuthLayout, { title: "This link is incomplete", description: "It carries no invitation token.", children: _jsx("p", { className: "mt-4 text-[13px] text-ink-muted", children: "Ask whoever invited you to send it again from the workspace's Team page." }) }));
24
+ }
25
+ // The token rides along so signing in comes back here rather than to the CRM.
26
+ const signInHere = `/login?next=${encodeURIComponent(`/join?token=${token}`)}`;
27
+ if (isSignedOut) {
28
+ return _jsx(Navigate, { to: signInHere, replace: true });
29
+ }
30
+ if (error !== null) {
31
+ return (_jsx(AuthLayout, { title: "Join a workspace", children: _jsx("div", { className: "mt-4", children: _jsx(ErrorPanel, { error: error }) }) }));
32
+ }
33
+ if (isLoading) {
34
+ return _jsx(LoadingPanel, {});
35
+ }
36
+ return (_jsx(AuthLayout, { title: "Join a workspace", description: "You have been invited. Accepting adds this account to it.", children: _jsxs("div", { className: "mt-5 space-y-3", children: [accept.error !== null && _jsx(ErrorPanel, { error: accept.error }), _jsx("button", { type: "button", disabled: accept.isPending, onClick: () => {
37
+ accept
38
+ .runAsync({ token })
39
+ .then(() => navigate('/dashboard', { replace: true }))
40
+ .catch(() => undefined);
41
+ }, className: "w-full rounded-md bg-accent px-3.5 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50", children: accept.isPending ? 'Joining…' : 'Accept invitation' }), _jsxs("p", { className: "text-[11px] text-ink-faint", children: ["Signed in as the wrong account?", ' ', _jsx(Link, { to: signInHere, className: "text-accent", children: "Sign in as somebody else" }), "."] })] }) }));
42
+ }
43
+ //# sourceMappingURL=JoinPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JoinPage.js","sourceRoot":"","sources":["../../../src/pages/auth/JoinPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE3E,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gCAAiC,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAA;AAE7C;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,gBAAgB,CAAC,GAAG,eAAe,EAAE,CAAA;IAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IACjD,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAA;IACtD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAEhC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CACL,KAAC,UAAU,IAAC,KAAK,EAAC,yBAAyB,EAAC,WAAW,EAAC,iCAAiC,YACvF,YAAG,SAAS,EAAC,iCAAiC,yFAE1C,GACO,CACd,CAAA;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,UAAU,GAAG,eAAe,kBAAkB,CAAC,eAAe,KAAK,EAAE,CAAC,EAAE,CAAA;IAE9E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,KAAC,QAAQ,IAAC,EAAE,EAAE,UAAU,EAAE,OAAO,SAAG,CAAA;IAC7C,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,CACL,KAAC,UAAU,IAAC,KAAK,EAAC,kBAAkB,YAClC,cAAK,SAAS,EAAC,MAAM,YACnB,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,GACxB,GACK,CACd,CAAA;IACH,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,YAAY,KAAG,CAAA;IACzB,CAAC;IAED,OAAO,CACL,KAAC,UAAU,IACT,KAAK,EAAC,kBAAkB,EACxB,WAAW,EAAC,2DAA2D,YAEvE,eAAK,SAAS,EAAC,gBAAgB,aAC5B,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,KAAC,UAAU,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAI,EAC7D,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,MAAM,CAAC,SAAS,EAC1B,OAAO,EAAE,GAAG,EAAE;wBACZ,MAAM;6BACH,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;6BACnB,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;6BACrD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;oBAC3B,CAAC,EACD,SAAS,EAAC,uIAAuI,YAEhJ,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,GAC7C,EACT,aAAG,SAAS,EAAC,4BAA4B,gDACP,GAAG,EACnC,KAAC,IAAI,IAAC,EAAE,EAAE,UAAU,EAAE,SAAS,EAAC,aAAa,yCAEtC,SAEL,IACA,GACK,CACd,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Where a reset email lands: `/reset-password?token=…`.
3
+ *
4
+ * The mockup has no page for this, because a mockup never sent the email. The
5
+ * token is in the URL rather than typed, so the form asks for the new password
6
+ * and nothing else.
7
+ *
8
+ * Success does not sign anyone in. The service ends every session the account
9
+ * had, which is the point of a reset when the account was stolen, so the only
10
+ * honest next step is the sign-in form.
11
+ */
12
+ export declare function ResetPasswordPage(): React.JSX.Element;
13
+ //# sourceMappingURL=ResetPasswordPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResetPasswordPage.d.ts","sourceRoot":"","sources":["../../../src/pages/auth/ResetPasswordPage.tsx"],"names":[],"mappings":"AAUA;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAsGrD"}
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { MINIMUM_PASSWORD_LENGTH } from '@kelpie/schemas';
3
+ import { useState } from 'react';
4
+ import { Link, useSearchParams } from 'react-router';
5
+ import { useConfirmPasswordReset } from '../../api/resources/session.js';
6
+ import { ErrorPanel } from '../../components/QueryState.js';
7
+ import { SubmitButton, TextField } from './AuthForm.js';
8
+ import { AuthLayout } from './AuthLayout.js';
9
+ /**
10
+ * Where a reset email lands: `/reset-password?token=…`.
11
+ *
12
+ * The mockup has no page for this, because a mockup never sent the email. The
13
+ * token is in the URL rather than typed, so the form asks for the new password
14
+ * and nothing else.
15
+ *
16
+ * Success does not sign anyone in. The service ends every session the account
17
+ * had, which is the point of a reset when the account was stolen, so the only
18
+ * honest next step is the sign-in form.
19
+ */
20
+ export function ResetPasswordPage() {
21
+ const [searchParameters] = useSearchParams();
22
+ const token = searchParameters.get('token') ?? '';
23
+ const confirm = useConfirmPasswordReset();
24
+ const [password, setPassword] = useState('');
25
+ const [confirmation, setConfirmation] = useState('');
26
+ const [localError, setLocalError] = useState(null);
27
+ const [done, setDone] = useState(false);
28
+ const backToSignIn = (_jsx(Link, { to: "/login", className: "font-medium text-accent hover:underline", children: "Back to sign in" }));
29
+ if (token.length === 0) {
30
+ return (_jsx(AuthLayout, { title: "This link is incomplete", footer: backToSignIn, children: _jsxs("p", { className: "mt-4 text-[13px] text-ink-muted", children: ["It carries no reset token. Ask for a new link from", ' ', _jsx(Link, { to: "/forgot-password", className: "font-medium text-accent hover:underline", children: "Forgot password" }), "."] }) }));
31
+ }
32
+ if (done) {
33
+ return (_jsx(AuthLayout, { title: "Password changed", footer: backToSignIn, children: _jsx("p", { className: "mt-4 text-[13px] text-ink-muted", children: "Every device that was signed in to this account has been signed out. Sign in again with the new password." }) }));
34
+ }
35
+ /** The two rules the browser can decide on its own, before spending the token. */
36
+ function localProblem() {
37
+ if (password.length < MINIMUM_PASSWORD_LENGTH) {
38
+ return `Password must be at least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`;
39
+ }
40
+ return password === confirmation ? null : 'Password and confirmation do not match.';
41
+ }
42
+ function submit(event) {
43
+ event.preventDefault();
44
+ const problem = localProblem();
45
+ setLocalError(problem);
46
+ if (problem !== null) {
47
+ return;
48
+ }
49
+ confirm
50
+ .runAsync({ token, password })
51
+ .then(() => {
52
+ setDone(true);
53
+ })
54
+ .catch(() => undefined);
55
+ }
56
+ return (_jsx(AuthLayout, { title: "Choose a new password", description: "This link works once.", footer: backToSignIn, children: _jsxs("form", { onSubmit: submit, className: "mt-5 space-y-3", children: [_jsx(TextField, { label: "New password", type: "password", value: password, onChange: setPassword, autoComplete: "new-password", hint: `At least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`, required: true }), _jsx(TextField, { label: "Confirm new password", type: "password", value: confirmation, onChange: setConfirmation, autoComplete: "new-password", required: true }), localError !== null && _jsx("p", { className: "text-[12px] text-danger", children: localError }), confirm.error !== null && _jsx(ErrorPanel, { error: confirm.error }), _jsx(SubmitButton, { label: "Set new password", pendingLabel: "Saving\u2026", isPending: confirm.isPending })] }) }));
57
+ }
58
+ //# sourceMappingURL=ResetPasswordPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResetPasswordPage.js","sourceRoot":"","sources":["../../../src/pages/auth/ResetPasswordPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function SignInPage(): React.JSX.Element;
2
+ //# sourceMappingURL=SignInPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignInPage.d.ts","sourceRoot":"","sources":["../../../src/pages/auth/SignInPage.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAyD9C"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Link, useNavigate, useSearchParams } from 'react-router';
4
+ import { useLogIn } from '../../api/resources/session.js';
5
+ import { ErrorPanel } from '../../components/QueryState.js';
6
+ import { SubmitButton, TextField } from './AuthForm.js';
7
+ import { AuthLayout } from './AuthLayout.js';
8
+ /**
9
+ * Sign in, against `POST /v1/auth/login`.
10
+ *
11
+ * Where the browser goes afterwards is not always the app. An invitation link
12
+ * sends its token through `?next=`, and dropping it would land the invitee on
13
+ * People with the invitation still unaccepted.
14
+ */
15
+ /**
16
+ * Only a path within this app. An absolute URL in `?next=` would turn the
17
+ * sign-in form into an open redirect.
18
+ */
19
+ function safeNext(value) {
20
+ return value !== null && value.startsWith('/') && !value.startsWith('//') ? value : '/dashboard';
21
+ }
22
+ export function SignInPage() {
23
+ const navigate = useNavigate();
24
+ const [searchParameters] = useSearchParams();
25
+ const logIn = useLogIn();
26
+ const [email, setEmail] = useState('');
27
+ const [password, setPassword] = useState('');
28
+ const next = safeNext(searchParameters.get('next'));
29
+ function submit(event) {
30
+ event.preventDefault();
31
+ logIn
32
+ .runAsync({ email: email.trim(), password })
33
+ .then(() => navigate(next, { replace: true }))
34
+ .catch(() => undefined);
35
+ }
36
+ return (_jsx(AuthLayout, { title: "Sign in", footer: _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Link, { to: "/forgot-password", className: "font-medium text-accent hover:underline", children: "Forgot password?" }), _jsxs("span", { className: "text-ink-muted", children: ["No account?", ' ', _jsx(Link, { to: "/signup", className: "font-medium text-accent hover:underline", children: "Sign up" })] })] }), children: _jsxs("form", { onSubmit: submit, className: "mt-5 space-y-3", children: [_jsx(TextField, { label: "Email", type: "email", value: email, onChange: setEmail, autoComplete: "email", required: true }), _jsx(TextField, { label: "Password", type: "password", value: password, onChange: setPassword, autoComplete: "current-password", required: true }), logIn.error !== null && _jsx(ErrorPanel, { error: logIn.error }), _jsx(SubmitButton, { label: "Sign in", pendingLabel: "Signing in\u2026", isPending: logIn.isPending })] }) }));
37
+ }
38
+ //# sourceMappingURL=SignInPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignInPage.js","sourceRoot":"","sources":["../../../src/pages/auth/SignInPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAiC,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAgB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAA;AAE7C;;;;;;GAMG;AAEH;;;GAGG;AACH,SAAS,QAAQ,CAAC,KAAoB;IACpC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAA;AAClG,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,gBAAgB,CAAC,GAAG,eAAe,EAAE,CAAA;IAC5C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE5C,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IAEnD,SAAS,MAAM,CAAC,KAAgB;QAC9B,KAAK,CAAC,cAAc,EAAE,CAAA;QAEtB,KAAK;aACF,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;aAC3C,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aAC7C,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC3B,CAAC;IAED,OAAO,CACL,KAAC,UAAU,IACT,KAAK,EAAC,SAAS,EACf,MAAM,EACJ,eAAK,SAAS,EAAC,uBAAuB,aACpC,KAAC,IAAI,IAAC,EAAE,EAAC,kBAAkB,EAAC,SAAS,EAAC,yCAAyC,iCAExE,EACP,gBAAM,SAAS,EAAC,gBAAgB,4BAClB,GAAG,EACf,KAAC,IAAI,IAAC,EAAE,EAAC,SAAS,EAAC,SAAS,EAAC,yCAAyC,wBAE/D,IACF,IACH,YAGR,gBAAM,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAC,gBAAgB,aAChD,KAAC,SAAS,IACR,KAAK,EAAC,OAAO,EACb,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAC,OAAO,EACpB,QAAQ,SACR,EACF,KAAC,SAAS,IACR,KAAK,EAAC,UAAU,EAChB,IAAI,EAAC,UAAU,EACf,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,WAAW,EACrB,YAAY,EAAC,kBAAkB,EAC/B,QAAQ,SACR,EACD,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAI,EAC3D,KAAC,YAAY,IAAC,KAAK,EAAC,SAAS,EAAC,YAAY,EAAC,kBAAa,EAAC,SAAS,EAAE,KAAK,CAAC,SAAS,GAAI,IAClF,GACI,CACd,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Creating an account, against `POST /v1/auth/signup`.
3
+ *
4
+ * Signup makes the user and nothing else, per `onboarding.md`, so success lands
5
+ * on the first onboarding step rather than in the app. The response sets the
6
+ * session cookie, which is why the next page can already write.
7
+ *
8
+ * The mockup collected this into `sessionStorage` and committed the lot at the
9
+ * end of the wizard. Here each step commits as it is finished: a draft account
10
+ * held in the browser is one an interrupted signup loses.
11
+ */
12
+ export declare function SignUpPage(): React.JSX.Element;
13
+ //# sourceMappingURL=SignUpPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignUpPage.d.ts","sourceRoot":"","sources":["../../../src/pages/auth/SignUpPage.tsx"],"names":[],"mappings":"AAUA;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAuE9C"}
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { MINIMUM_PASSWORD_LENGTH } from '@kelpie/schemas';
3
+ import { useState } from 'react';
4
+ import { Link, useNavigate } from 'react-router';
5
+ import { useSignUp } from '../../api/resources/session.js';
6
+ import { ErrorPanel } from '../../components/QueryState.js';
7
+ import { SubmitButton, TextField } from './AuthForm.js';
8
+ import { AuthLayout } from './AuthLayout.js';
9
+ /**
10
+ * Creating an account, against `POST /v1/auth/signup`.
11
+ *
12
+ * Signup makes the user and nothing else, per `onboarding.md`, so success lands
13
+ * on the first onboarding step rather than in the app. The response sets the
14
+ * session cookie, which is why the next page can already write.
15
+ *
16
+ * The mockup collected this into `sessionStorage` and committed the lot at the
17
+ * end of the wizard. Here each step commits as it is finished: a draft account
18
+ * held in the browser is one an interrupted signup loses.
19
+ */
20
+ export function SignUpPage() {
21
+ const navigate = useNavigate();
22
+ const signUp = useSignUp();
23
+ const [name, setName] = useState('');
24
+ const [email, setEmail] = useState('');
25
+ const [password, setPassword] = useState('');
26
+ const [localError, setLocalError] = useState(null);
27
+ function submit(event) {
28
+ event.preventDefault();
29
+ // Checked here as well as by the service so the rule is stated before a
30
+ // submission rather than as a rejection afterwards.
31
+ if (password.length < MINIMUM_PASSWORD_LENGTH) {
32
+ setLocalError(`Password must be at least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`);
33
+ return;
34
+ }
35
+ setLocalError(null);
36
+ signUp
37
+ .runAsync({ name: name.trim(), email: email.trim(), password })
38
+ .then(() => navigate('/onboarding/workspace', { replace: true }))
39
+ .catch(() => undefined);
40
+ }
41
+ return (_jsx(AuthLayout, { title: "Create account", description: "Next you will create a workspace for your company.", footer: _jsxs("span", { className: "text-ink-muted", children: ["Already have an account?", ' ', _jsx(Link, { to: "/login", className: "font-medium text-accent hover:underline", children: "Sign in" })] }), children: _jsxs("form", { onSubmit: submit, className: "mt-5 space-y-3", children: [_jsx(TextField, { label: "Your name", value: name, onChange: setName, autoComplete: "name", required: true }), _jsx(TextField, { label: "Email", type: "email", value: email, onChange: setEmail, autoComplete: "email", required: true }), _jsx(TextField, { label: "Password", type: "password", value: password, onChange: setPassword, autoComplete: "new-password", hint: `At least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`, required: true }), localError !== null && _jsx("p", { className: "text-[12px] text-danger", children: localError }), signUp.error !== null && _jsx(ErrorPanel, { error: signUp.error }), _jsx(SubmitButton, { label: "Continue", pendingLabel: "Creating\u2026", isPending: signUp.isPending })] }) }));
42
+ }
43
+ //# sourceMappingURL=SignUpPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignUpPage.js","sourceRoot":"","sources":["../../../src/pages/auth/SignUpPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Candidate } from '@kelpie/schemas';
2
+ export interface CandidateFieldProps {
3
+ readonly candidate: Candidate;
4
+ /** Rendered instead of the chip where the surrounding page uses plain text. */
5
+ readonly plain?: boolean;
6
+ }
7
+ export declare function CandidateStatusField({ candidate, plain, }: CandidateFieldProps): React.JSX.Element;
8
+ export declare function CandidateStageField({ candidate, plain, }: CandidateFieldProps): React.JSX.Element;
9
+ export interface CandidateReferrerFieldProps {
10
+ readonly candidate: Candidate;
11
+ /** The referrer's name when it is already on the page, so the picker shows it. */
12
+ readonly referrerName: string | undefined;
13
+ }
14
+ /**
15
+ * Who vouched for this candidate.
16
+ *
17
+ * The candidate themselves is filtered out of the options: the API refuses a
18
+ * self-referral with a `422`, and offering a choice that cannot be made is worse
19
+ * than not offering it.
20
+ */
21
+ export declare function CandidateReferrerField({ candidate, referrerName, }: CandidateReferrerFieldProps): React.JSX.Element;
22
+ //# sourceMappingURL=candidateFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidateFields.d.ts","sourceRoot":"","sources":["../../src/pages/candidateFields.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAmD,MAAM,iBAAiB,CAAA;AAiDjG,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,KAAa,GACd,EAAE,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0BzC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,KAAa,GACd,EAAE,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAyBzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,YAAY,GACb,EAAE,2BAA2B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAmCjD"}
@@ -0,0 +1,82 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CANDIDATE_STATUS_LABELS, CANDIDATE_STATUSES, FIRST_INTERVIEW_STAGE, INTERVIEW_STAGE_LABELS, INTERVIEW_STAGES, } from '@kelpie/schemas';
3
+ import { useState } from 'react';
4
+ import { usePatch } from '../api/resource.js';
5
+ import { usePeople } from '../api/resources/people.js';
6
+ import { useUpdateCandidate } from '../api/resources/candidates.js';
7
+ import { Chip } from '../components/Chip.js';
8
+ import { EntitySearch } from '../components/EntitySearch.js';
9
+ import { InlineEdit } from '../components/InlineEdit.js';
10
+ import { ErrorPanel } from '../components/QueryState.js';
11
+ /**
12
+ * The three editable fields of a candidacy, shared by the Role page and the
13
+ * person's Hiring tab.
14
+ *
15
+ * Both pages draw them differently — a row of chips on one, a labelled grid on
16
+ * the other, which is how the mockup draws them — so what is shared is the
17
+ * editing rather than the layout.
18
+ *
19
+ * None of these knows the rule tying stage to status. Setting a status away from
20
+ * `in_process` clears the stage server-side and setting it back restores the
21
+ * first one, so a page sends the one field the user touched and renders whatever
22
+ * comes back.
23
+ */
24
+ const STATUS_OPTIONS = CANDIDATE_STATUSES.map((status) => ({
25
+ value: status,
26
+ label: CANDIDATE_STATUS_LABELS[status],
27
+ }));
28
+ const STAGE_OPTIONS = INTERVIEW_STAGES.map((stage) => ({
29
+ value: stage,
30
+ label: INTERVIEW_STAGE_LABELS[stage],
31
+ }));
32
+ const STATUS_TONES = {
33
+ hired: 'success',
34
+ in_process: 'accent',
35
+ nurture: 'warning',
36
+ passed: 'danger',
37
+ withdrawn: 'danger',
38
+ };
39
+ function useCandidatePatch(candidate) {
40
+ return usePatch(useUpdateCandidate, candidate);
41
+ }
42
+ export function CandidateStatusField({ candidate, plain = false, }) {
43
+ const { patch, error } = useCandidatePatch(candidate);
44
+ return (_jsxs("div", { className: "inline-flex flex-col gap-1", children: [_jsx(InlineEdit, { value: candidate.status, onChange: (value) => {
45
+ patch({ status: value });
46
+ }, options: STATUS_OPTIONS, display: plain ? (_jsx("span", { className: "px-1 text-[13px]", children: CANDIDATE_STATUS_LABELS[candidate.status] })) : (_jsx(Chip, { tone: STATUS_TONES[candidate.status], children: CANDIDATE_STATUS_LABELS[candidate.status] })), displayClassName: plain ? 'not-italic text-[13px]' : 'not-italic inline-flex', className: plain ? '' : '!w-auto' }), error !== null && _jsx(ErrorPanel, { error: error })] }));
47
+ }
48
+ export function CandidateStageField({ candidate, plain = false, }) {
49
+ const { patch, error } = useCandidatePatch(candidate);
50
+ const stage = candidate.interviewStage ?? FIRST_INTERVIEW_STAGE;
51
+ return (_jsxs("div", { className: "inline-flex flex-col gap-1", children: [_jsx(InlineEdit, { value: stage, onChange: (value) => {
52
+ patch({ interviewStage: value });
53
+ }, options: STAGE_OPTIONS, display: plain ? (_jsx("span", { className: "px-1 text-[13px]", children: INTERVIEW_STAGE_LABELS[stage] })) : (_jsx("span", { className: "text-[12px] text-ink-muted", children: INTERVIEW_STAGE_LABELS[stage] })), displayClassName: plain ? 'not-italic text-[13px]' : 'not-italic', className: plain ? '' : '!w-auto' }), error !== null && _jsx(ErrorPanel, { error: error })] }));
54
+ }
55
+ /**
56
+ * Who vouched for this candidate.
57
+ *
58
+ * The candidate themselves is filtered out of the options: the API refuses a
59
+ * self-referral with a `422`, and offering a choice that cannot be made is worse
60
+ * than not offering it.
61
+ */
62
+ export function CandidateReferrerField({ candidate, referrerName, }) {
63
+ const { patch, error } = useCandidatePatch(candidate);
64
+ const [search, setSearch] = useState('');
65
+ const searchable = usePeople({ term: search.trim().length > 0 ? search.trim() : undefined });
66
+ const options = [
67
+ ...(candidate.referrerPersonId === null
68
+ ? []
69
+ : [{ id: candidate.referrerPersonId, label: referrerName ?? candidate.referrerPersonId }]),
70
+ ...searchable.records
71
+ .filter((person) => person.id !== candidate.personId && person.id !== candidate.referrerPersonId)
72
+ .map((person) => ({
73
+ id: person.id,
74
+ label: person.name,
75
+ meta: person.email ?? undefined,
76
+ })),
77
+ ];
78
+ return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(EntitySearch, { options: options, value: candidate.referrerPersonId ?? '', onChange: (referrerPersonId) => {
79
+ patch({ referrerPersonId: referrerPersonId.length > 0 ? referrerPersonId : null });
80
+ }, onQueryChange: setSearch, placeholder: "Search people\u2026", emptyMessage: "No people match" }), error !== null && _jsx(ErrorPanel, { error: error })] }));
81
+ }
82
+ //# sourceMappingURL=candidateFields.js.map