@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.
- package/LICENSE +661 -0
- package/README.md +44 -0
- package/dist/ServiceStatus.d.ts +6 -0
- package/dist/ServiceStatus.d.ts.map +1 -0
- package/dist/ServiceStatus.js +35 -0
- package/dist/ServiceStatus.js.map +1 -0
- package/dist/api/ApiProvider.d.ts +19 -0
- package/dist/api/ApiProvider.d.ts.map +1 -0
- package/dist/api/ApiProvider.js +18 -0
- package/dist/api/ApiProvider.js.map +1 -0
- package/dist/api/client.d.ts +83 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +162 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/context.d.ts +14 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +20 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/errors.d.ts +9 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +14 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/health.d.ts +15 -0
- package/dist/api/health.d.ts.map +1 -0
- package/dist/api/health.js +22 -0
- package/dist/api/health.js.map +1 -0
- package/dist/api/json.d.ts +3 -0
- package/dist/api/json.d.ts.map +1 -0
- package/dist/api/json.js +5 -0
- package/dist/api/json.js.map +1 -0
- package/dist/api/queryClient.d.ts +17 -0
- package/dist/api/queryClient.d.ts.map +1 -0
- package/dist/api/queryClient.js +33 -0
- package/dist/api/queryClient.js.map +1 -0
- package/dist/api/resource.d.ts +110 -0
- package/dist/api/resource.d.ts.map +1 -0
- package/dist/api/resource.js +238 -0
- package/dist/api/resource.js.map +1 -0
- package/dist/api/resources/account.d.ts +49 -0
- package/dist/api/resources/account.d.ts.map +1 -0
- package/dist/api/resources/account.js +146 -0
- package/dist/api/resources/account.js.map +1 -0
- package/dist/api/resources/activities.d.ts +8 -0
- package/dist/api/resources/activities.d.ts.map +1 -0
- package/dist/api/resources/activities.js +21 -0
- package/dist/api/resources/activities.js.map +1 -0
- package/dist/api/resources/agentTasks.d.ts +31 -0
- package/dist/api/resources/agentTasks.d.ts.map +1 -0
- package/dist/api/resources/agentTasks.js +103 -0
- package/dist/api/resources/agentTasks.js.map +1 -0
- package/dist/api/resources/candidates.d.ts +17 -0
- package/dist/api/resources/candidates.d.ts.map +1 -0
- package/dist/api/resources/candidates.js +40 -0
- package/dist/api/resources/candidates.js.map +1 -0
- package/dist/api/resources/companies.d.ts +22 -0
- package/dist/api/resources/companies.d.ts.map +1 -0
- package/dist/api/resources/companies.js +36 -0
- package/dist/api/resources/companies.js.map +1 -0
- package/dist/api/resources/dashboard.d.ts +8 -0
- package/dist/api/resources/dashboard.d.ts.map +1 -0
- package/dist/api/resources/dashboard.js +27 -0
- package/dist/api/resources/dashboard.js.map +1 -0
- package/dist/api/resources/deals.d.ts +30 -0
- package/dist/api/resources/deals.d.ts.map +1 -0
- package/dist/api/resources/deals.js +38 -0
- package/dist/api/resources/deals.js.map +1 -0
- package/dist/api/resources/decisions.d.ts +13 -0
- package/dist/api/resources/decisions.d.ts.map +1 -0
- package/dist/api/resources/decisions.js +38 -0
- package/dist/api/resources/decisions.js.map +1 -0
- package/dist/api/resources/forms.d.ts +82 -0
- package/dist/api/resources/forms.d.ts.map +1 -0
- package/dist/api/resources/forms.js +129 -0
- package/dist/api/resources/forms.js.map +1 -0
- package/dist/api/resources/handbookPages.d.ts +33 -0
- package/dist/api/resources/handbookPages.d.ts.map +1 -0
- package/dist/api/resources/handbookPages.js +49 -0
- package/dist/api/resources/handbookPages.js.map +1 -0
- package/dist/api/resources/importJobs.d.ts +72 -0
- package/dist/api/resources/importJobs.d.ts.map +1 -0
- package/dist/api/resources/importJobs.js +145 -0
- package/dist/api/resources/importJobs.js.map +1 -0
- package/dist/api/resources/invites.d.ts +19 -0
- package/dist/api/resources/invites.d.ts.map +1 -0
- package/dist/api/resources/invites.js +78 -0
- package/dist/api/resources/invites.js.map +1 -0
- package/dist/api/resources/mcpTools.d.ts +8 -0
- package/dist/api/resources/mcpTools.d.ts.map +1 -0
- package/dist/api/resources/mcpTools.js +23 -0
- package/dist/api/resources/mcpTools.js.map +1 -0
- package/dist/api/resources/members.d.ts +40 -0
- package/dist/api/resources/members.d.ts.map +1 -0
- package/dist/api/resources/members.js +67 -0
- package/dist/api/resources/members.js.map +1 -0
- package/dist/api/resources/moduleSettings.d.ts +14 -0
- package/dist/api/resources/moduleSettings.d.ts.map +1 -0
- package/dist/api/resources/moduleSettings.js +43 -0
- package/dist/api/resources/moduleSettings.js.map +1 -0
- package/dist/api/resources/mutation.d.ts +18 -0
- package/dist/api/resources/mutation.d.ts.map +1 -0
- package/dist/api/resources/mutation.js +12 -0
- package/dist/api/resources/mutation.js.map +1 -0
- package/dist/api/resources/notes.d.ts +14 -0
- package/dist/api/resources/notes.d.ts.map +1 -0
- package/dist/api/resources/notes.js +39 -0
- package/dist/api/resources/notes.js.map +1 -0
- package/dist/api/resources/opportunities.d.ts +29 -0
- package/dist/api/resources/opportunities.d.ts.map +1 -0
- package/dist/api/resources/opportunities.js +38 -0
- package/dist/api/resources/opportunities.js.map +1 -0
- package/dist/api/resources/partnerships.d.ts +33 -0
- package/dist/api/resources/partnerships.d.ts.map +1 -0
- package/dist/api/resources/partnerships.js +39 -0
- package/dist/api/resources/partnerships.js.map +1 -0
- package/dist/api/resources/people.d.ts +22 -0
- package/dist/api/resources/people.d.ts.map +1 -0
- package/dist/api/resources/people.js +36 -0
- package/dist/api/resources/people.js.map +1 -0
- package/dist/api/resources/pipelineStages.d.ts +22 -0
- package/dist/api/resources/pipelineStages.d.ts.map +1 -0
- package/dist/api/resources/pipelineStages.js +61 -0
- package/dist/api/resources/pipelineStages.js.map +1 -0
- package/dist/api/resources/planItems.d.ts +31 -0
- package/dist/api/resources/planItems.d.ts.map +1 -0
- package/dist/api/resources/planItems.js +60 -0
- package/dist/api/resources/planItems.js.map +1 -0
- package/dist/api/resources/positions.d.ts +23 -0
- package/dist/api/resources/positions.d.ts.map +1 -0
- package/dist/api/resources/positions.js +31 -0
- package/dist/api/resources/positions.js.map +1 -0
- package/dist/api/resources/raises.d.ts +30 -0
- package/dist/api/resources/raises.d.ts.map +1 -0
- package/dist/api/resources/raises.js +38 -0
- package/dist/api/resources/raises.js.map +1 -0
- package/dist/api/resources/roles.d.ts +20 -0
- package/dist/api/resources/roles.d.ts.map +1 -0
- package/dist/api/resources/roles.js +31 -0
- package/dist/api/resources/roles.js.map +1 -0
- package/dist/api/resources/search.d.ts +12 -0
- package/dist/api/resources/search.d.ts.map +1 -0
- package/dist/api/resources/search.js +37 -0
- package/dist/api/resources/search.js.map +1 -0
- package/dist/api/resources/session.d.ts +58 -0
- package/dist/api/resources/session.d.ts.map +1 -0
- package/dist/api/resources/session.js +157 -0
- package/dist/api/resources/session.js.map +1 -0
- package/dist/api/resources/webhooks.d.ts +45 -0
- package/dist/api/resources/webhooks.d.ts.map +1 -0
- package/dist/api/resources/webhooks.js +106 -0
- package/dist/api/resources/webhooks.js.map +1 -0
- package/dist/api/resources/workspace.d.ts +20 -0
- package/dist/api/resources/workspace.d.ts.map +1 -0
- package/dist/api/resources/workspace.js +63 -0
- package/dist/api/resources/workspace.js.map +1 -0
- package/dist/app/KelpieApp.d.ts +18 -0
- package/dist/app/KelpieApp.d.ts.map +1 -0
- package/dist/app/KelpieApp.js +59 -0
- package/dist/app/KelpieApp.js.map +1 -0
- package/dist/app/SessionGate.d.ts +14 -0
- package/dist/app/SessionGate.d.ts.map +1 -0
- package/dist/app/SessionGate.js +33 -0
- package/dist/app/SessionGate.js.map +1 -0
- package/dist/components/ActivitiesPanel.d.ts +28 -0
- package/dist/components/ActivitiesPanel.d.ts.map +1 -0
- package/dist/components/ActivitiesPanel.js +75 -0
- package/dist/components/ActivitiesPanel.js.map +1 -0
- package/dist/components/AgentTasks.d.ts +16 -0
- package/dist/components/AgentTasks.d.ts.map +1 -0
- package/dist/components/AgentTasks.js +166 -0
- package/dist/components/AgentTasks.js.map +1 -0
- package/dist/components/Chip.d.ts +10 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +21 -0
- package/dist/components/Chip.js.map +1 -0
- package/dist/components/CopyButton.d.ts +7 -0
- package/dist/components/CopyButton.d.ts.map +1 -0
- package/dist/components/CopyButton.js +30 -0
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/components/DataTable.d.ts +36 -0
- package/dist/components/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable.js +43 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/DecisionsPanel.d.ts +14 -0
- package/dist/components/DecisionsPanel.d.ts.map +1 -0
- package/dist/components/DecisionsPanel.js +73 -0
- package/dist/components/DecisionsPanel.js.map +1 -0
- package/dist/components/DeleteRecord.d.ts +19 -0
- package/dist/components/DeleteRecord.d.ts.map +1 -0
- package/dist/components/DeleteRecord.js +22 -0
- package/dist/components/DeleteRecord.js.map +1 -0
- package/dist/components/EntitySearch.d.ts +33 -0
- package/dist/components/EntitySearch.d.ts.map +1 -0
- package/dist/components/EntitySearch.js +111 -0
- package/dist/components/EntitySearch.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +21 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +26 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/InlineEdit.d.ts +37 -0
- package/dist/components/InlineEdit.d.ts.map +1 -0
- package/dist/components/InlineEdit.js +77 -0
- package/dist/components/InlineEdit.js.map +1 -0
- package/dist/components/KanbanBoard.d.ts +24 -0
- package/dist/components/KanbanBoard.d.ts.map +1 -0
- package/dist/components/KanbanBoard.js +92 -0
- package/dist/components/KanbanBoard.js.map +1 -0
- package/dist/components/MarkdownView.d.ts +4 -0
- package/dist/components/MarkdownView.d.ts.map +1 -0
- package/dist/components/MarkdownView.js +45 -0
- package/dist/components/MarkdownView.js.map +1 -0
- package/dist/components/NotesPanel.d.ts +17 -0
- package/dist/components/NotesPanel.d.ts.map +1 -0
- package/dist/components/NotesPanel.js +53 -0
- package/dist/components/NotesPanel.js.map +1 -0
- package/dist/components/PageHeader.d.ts +20 -0
- package/dist/components/PageHeader.d.ts.map +1 -0
- package/dist/components/PageHeader.js +15 -0
- package/dist/components/PageHeader.js.map +1 -0
- package/dist/components/PhonesField.d.ts +7 -0
- package/dist/components/PhonesField.d.ts.map +1 -0
- package/dist/components/PhonesField.js +92 -0
- package/dist/components/PhonesField.js.map +1 -0
- package/dist/components/PlanAttention.d.ts +40 -0
- package/dist/components/PlanAttention.d.ts.map +1 -0
- package/dist/components/PlanAttention.js +86 -0
- package/dist/components/PlanAttention.js.map +1 -0
- package/dist/components/PlanPanel.d.ts +18 -0
- package/dist/components/PlanPanel.d.ts.map +1 -0
- package/dist/components/PlanPanel.js +102 -0
- package/dist/components/PlanPanel.js.map +1 -0
- package/dist/components/QueryState.d.ts +24 -0
- package/dist/components/QueryState.d.ts.map +1 -0
- package/dist/components/QueryState.js +34 -0
- package/dist/components/QueryState.js.map +1 -0
- package/dist/components/RecordTabs.d.ts +16 -0
- package/dist/components/RecordTabs.d.ts.map +1 -0
- package/dist/components/RecordTabs.js +15 -0
- package/dist/components/RecordTabs.js.map +1 -0
- package/dist/components/SectionHeader.d.ts +15 -0
- package/dist/components/SectionHeader.d.ts.map +1 -0
- package/dist/components/SectionHeader.js +14 -0
- package/dist/components/SectionHeader.js.map +1 -0
- package/dist/components/SegmentedControl.d.ts +13 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl.js +14 -0
- package/dist/components/SegmentedControl.js.map +1 -0
- package/dist/components/Shell.d.ts +2 -0
- package/dist/components/Shell.d.ts.map +1 -0
- package/dist/components/Shell.js +143 -0
- package/dist/components/Shell.js.map +1 -0
- package/dist/components/SidebarField.d.ts +8 -0
- package/dist/components/SidebarField.d.ts.map +1 -0
- package/dist/components/SidebarField.js +6 -0
- package/dist/components/SidebarField.js.map +1 -0
- package/dist/components/SocialProfilesField.d.ts +8 -0
- package/dist/components/SocialProfilesField.d.ts.map +1 -0
- package/dist/components/SocialProfilesField.js +176 -0
- package/dist/components/SocialProfilesField.js.map +1 -0
- package/dist/components/StageSettings.d.ts +16 -0
- package/dist/components/StageSettings.d.ts.map +1 -0
- package/dist/components/StageSettings.js +107 -0
- package/dist/components/StageSettings.js.map +1 -0
- package/dist/components/SummaryBlock.d.ts +12 -0
- package/dist/components/SummaryBlock.d.ts.map +1 -0
- package/dist/components/SummaryBlock.js +12 -0
- package/dist/components/SummaryBlock.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/dates.d.ts +26 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +71 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/money.d.ts +7 -0
- package/dist/lib/money.d.ts.map +1 -0
- package/dist/lib/money.js +13 -0
- package/dist/lib/money.js.map +1 -0
- package/dist/lib/names.d.ts +9 -0
- package/dist/lib/names.d.ts.map +1 -0
- package/dist/lib/names.js +13 -0
- package/dist/lib/names.js.map +1 -0
- package/dist/lib/plan.d.ts +67 -0
- package/dist/lib/plan.d.ts.map +1 -0
- package/dist/lib/plan.js +96 -0
- package/dist/lib/plan.js.map +1 -0
- package/dist/lib/theme.d.ts +19 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +30 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/pages/CompaniesPage.d.ts +2 -0
- package/dist/pages/CompaniesPage.d.ts.map +1 -0
- package/dist/pages/CompaniesPage.js +77 -0
- package/dist/pages/CompaniesPage.js.map +1 -0
- package/dist/pages/CompanyDetail.d.ts +2 -0
- package/dist/pages/CompanyDetail.d.ts.map +1 -0
- package/dist/pages/CompanyDetail.js +177 -0
- package/dist/pages/CompanyDetail.js.map +1 -0
- package/dist/pages/DealDetail.d.ts +2 -0
- package/dist/pages/DealDetail.d.ts.map +1 -0
- package/dist/pages/DealDetail.js +192 -0
- package/dist/pages/DealDetail.js.map +1 -0
- package/dist/pages/DealStageSettingsPage.d.ts +7 -0
- package/dist/pages/DealStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/DealStageSettingsPage.js +38 -0
- package/dist/pages/DealStageSettingsPage.js.map +1 -0
- package/dist/pages/DealsPage.d.ts +2 -0
- package/dist/pages/DealsPage.d.ts.map +1 -0
- package/dist/pages/DealsPage.js +177 -0
- package/dist/pages/DealsPage.js.map +1 -0
- package/dist/pages/DecisionsPage.d.ts +2 -0
- package/dist/pages/DecisionsPage.d.ts.map +1 -0
- package/dist/pages/DecisionsPage.js +121 -0
- package/dist/pages/DecisionsPage.js.map +1 -0
- package/dist/pages/FormDetail.d.ts +2 -0
- package/dist/pages/FormDetail.d.ts.map +1 -0
- package/dist/pages/FormDetail.js +56 -0
- package/dist/pages/FormDetail.js.map +1 -0
- package/dist/pages/FormsPage.d.ts +2 -0
- package/dist/pages/FormsPage.d.ts.map +1 -0
- package/dist/pages/FormsPage.js +67 -0
- package/dist/pages/FormsPage.js.map +1 -0
- package/dist/pages/FundraisingPage.d.ts +2 -0
- package/dist/pages/FundraisingPage.d.ts.map +1 -0
- package/dist/pages/FundraisingPage.js +187 -0
- package/dist/pages/FundraisingPage.js.map +1 -0
- package/dist/pages/HiringPage.d.ts +9 -0
- package/dist/pages/HiringPage.d.ts.map +1 -0
- package/dist/pages/HiringPage.js +73 -0
- package/dist/pages/HiringPage.js.map +1 -0
- package/dist/pages/NotFoundPage.d.ts +10 -0
- package/dist/pages/NotFoundPage.d.ts.map +1 -0
- package/dist/pages/NotFoundPage.js +14 -0
- package/dist/pages/NotFoundPage.js.map +1 -0
- package/dist/pages/OpportunitiesPage.d.ts +2 -0
- package/dist/pages/OpportunitiesPage.d.ts.map +1 -0
- package/dist/pages/OpportunitiesPage.js +184 -0
- package/dist/pages/OpportunitiesPage.js.map +1 -0
- package/dist/pages/OpportunityDetail.d.ts +2 -0
- package/dist/pages/OpportunityDetail.d.ts.map +1 -0
- package/dist/pages/OpportunityDetail.js +132 -0
- package/dist/pages/OpportunityDetail.js.map +1 -0
- package/dist/pages/OpportunityStageSettingsPage.d.ts +3 -0
- package/dist/pages/OpportunityStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/OpportunityStageSettingsPage.js +34 -0
- package/dist/pages/OpportunityStageSettingsPage.js.map +1 -0
- package/dist/pages/PartnershipDetail.d.ts +2 -0
- package/dist/pages/PartnershipDetail.d.ts.map +1 -0
- package/dist/pages/PartnershipDetail.js +179 -0
- package/dist/pages/PartnershipDetail.js.map +1 -0
- package/dist/pages/PartnershipStageSettingsPage.d.ts +3 -0
- package/dist/pages/PartnershipStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/PartnershipStageSettingsPage.js +34 -0
- package/dist/pages/PartnershipStageSettingsPage.js.map +1 -0
- package/dist/pages/PartnershipsPage.d.ts +2 -0
- package/dist/pages/PartnershipsPage.d.ts.map +1 -0
- package/dist/pages/PartnershipsPage.js +182 -0
- package/dist/pages/PartnershipsPage.js.map +1 -0
- package/dist/pages/PeoplePage.d.ts +10 -0
- package/dist/pages/PeoplePage.d.ts.map +1 -0
- package/dist/pages/PeoplePage.js +71 -0
- package/dist/pages/PeoplePage.js.map +1 -0
- package/dist/pages/PersonDetail.d.ts +2 -0
- package/dist/pages/PersonDetail.d.ts.map +1 -0
- package/dist/pages/PersonDetail.js +193 -0
- package/dist/pages/PersonDetail.js.map +1 -0
- package/dist/pages/PlanningPage.d.ts +2 -0
- package/dist/pages/PlanningPage.d.ts.map +1 -0
- package/dist/pages/PlanningPage.js +112 -0
- package/dist/pages/PlanningPage.js.map +1 -0
- package/dist/pages/RaiseDetail.d.ts +2 -0
- package/dist/pages/RaiseDetail.d.ts.map +1 -0
- package/dist/pages/RaiseDetail.js +198 -0
- package/dist/pages/RaiseDetail.js.map +1 -0
- package/dist/pages/RaiseStageSettingsPage.d.ts +3 -0
- package/dist/pages/RaiseStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/RaiseStageSettingsPage.js +34 -0
- package/dist/pages/RaiseStageSettingsPage.js.map +1 -0
- package/dist/pages/RoleDetail.d.ts +2 -0
- package/dist/pages/RoleDetail.d.ts.map +1 -0
- package/dist/pages/RoleDetail.js +177 -0
- package/dist/pages/RoleDetail.js.map +1 -0
- package/dist/pages/SearchPage.d.ts +2 -0
- package/dist/pages/SearchPage.d.ts.map +1 -0
- package/dist/pages/SearchPage.js +51 -0
- package/dist/pages/SearchPage.js.map +1 -0
- package/dist/pages/account/AccountLayout.d.ts +2 -0
- package/dist/pages/account/AccountLayout.d.ts.map +1 -0
- package/dist/pages/account/AccountLayout.js +25 -0
- package/dist/pages/account/AccountLayout.js.map +1 -0
- package/dist/pages/account/Field.d.ts +8 -0
- package/dist/pages/account/Field.d.ts.map +1 -0
- package/dist/pages/account/Field.js +6 -0
- package/dist/pages/account/Field.js.map +1 -0
- package/dist/pages/account/PreferencesPage.d.ts +2 -0
- package/dist/pages/account/PreferencesPage.d.ts.map +1 -0
- package/dist/pages/account/PreferencesPage.js +92 -0
- package/dist/pages/account/PreferencesPage.js.map +1 -0
- package/dist/pages/account/ProfilePage.d.ts +14 -0
- package/dist/pages/account/ProfilePage.d.ts.map +1 -0
- package/dist/pages/account/ProfilePage.js +71 -0
- package/dist/pages/account/ProfilePage.js.map +1 -0
- package/dist/pages/account/SecurityPage.d.ts +11 -0
- package/dist/pages/account/SecurityPage.d.ts.map +1 -0
- package/dist/pages/account/SecurityPage.js +78 -0
- package/dist/pages/account/SecurityPage.js.map +1 -0
- package/dist/pages/admin/DataPage.d.ts +3 -0
- package/dist/pages/admin/DataPage.d.ts.map +1 -0
- package/dist/pages/admin/DataPage.js +210 -0
- package/dist/pages/admin/DataPage.js.map +1 -0
- package/dist/pages/admin/McpPage.d.ts +2 -0
- package/dist/pages/admin/McpPage.d.ts.map +1 -0
- package/dist/pages/admin/McpPage.js +128 -0
- package/dist/pages/admin/McpPage.js.map +1 -0
- package/dist/pages/admin/ModulesPage.d.ts +2 -0
- package/dist/pages/admin/ModulesPage.d.ts.map +1 -0
- package/dist/pages/admin/ModulesPage.js +53 -0
- package/dist/pages/admin/ModulesPage.js.map +1 -0
- package/dist/pages/admin/TeamPage.d.ts +2 -0
- package/dist/pages/admin/TeamPage.d.ts.map +1 -0
- package/dist/pages/admin/TeamPage.js +99 -0
- package/dist/pages/admin/TeamPage.js.map +1 -0
- package/dist/pages/admin/WebhookDeliveries.d.ts +4 -0
- package/dist/pages/admin/WebhookDeliveries.d.ts.map +1 -0
- package/dist/pages/admin/WebhookDeliveries.js +88 -0
- package/dist/pages/admin/WebhookDeliveries.js.map +1 -0
- package/dist/pages/admin/WebhooksPage.d.ts +2 -0
- package/dist/pages/admin/WebhooksPage.d.ts.map +1 -0
- package/dist/pages/admin/WebhooksPage.js +152 -0
- package/dist/pages/admin/WebhooksPage.js.map +1 -0
- package/dist/pages/admin/WorkspaceSettingsPage.d.ts +2 -0
- package/dist/pages/admin/WorkspaceSettingsPage.d.ts.map +1 -0
- package/dist/pages/admin/WorkspaceSettingsPage.js +117 -0
- package/dist/pages/admin/WorkspaceSettingsPage.js.map +1 -0
- package/dist/pages/auth/AuthForm.d.ts +46 -0
- package/dist/pages/auth/AuthForm.d.ts.map +1 -0
- package/dist/pages/auth/AuthForm.js +32 -0
- package/dist/pages/auth/AuthForm.js.map +1 -0
- package/dist/pages/auth/AuthLayout.d.ts +24 -0
- package/dist/pages/auth/AuthLayout.d.ts.map +1 -0
- package/dist/pages/auth/AuthLayout.js +19 -0
- package/dist/pages/auth/AuthLayout.js.map +1 -0
- package/dist/pages/auth/ForgotPasswordPage.d.ts +13 -0
- package/dist/pages/auth/ForgotPasswordPage.d.ts.map +1 -0
- package/dist/pages/auth/ForgotPasswordPage.js +39 -0
- package/dist/pages/auth/ForgotPasswordPage.js.map +1 -0
- package/dist/pages/auth/JoinPage.d.ts +12 -0
- package/dist/pages/auth/JoinPage.d.ts.map +1 -0
- package/dist/pages/auth/JoinPage.js +43 -0
- package/dist/pages/auth/JoinPage.js.map +1 -0
- package/dist/pages/auth/ResetPasswordPage.d.ts +13 -0
- package/dist/pages/auth/ResetPasswordPage.d.ts.map +1 -0
- package/dist/pages/auth/ResetPasswordPage.js +58 -0
- package/dist/pages/auth/ResetPasswordPage.js.map +1 -0
- package/dist/pages/auth/SignInPage.d.ts +2 -0
- package/dist/pages/auth/SignInPage.d.ts.map +1 -0
- package/dist/pages/auth/SignInPage.js +38 -0
- package/dist/pages/auth/SignInPage.js.map +1 -0
- package/dist/pages/auth/SignUpPage.d.ts +13 -0
- package/dist/pages/auth/SignUpPage.d.ts.map +1 -0
- package/dist/pages/auth/SignUpPage.js +43 -0
- package/dist/pages/auth/SignUpPage.js.map +1 -0
- package/dist/pages/candidateFields.d.ts +22 -0
- package/dist/pages/candidateFields.d.ts.map +1 -0
- package/dist/pages/candidateFields.js +82 -0
- package/dist/pages/candidateFields.js.map +1 -0
- package/dist/pages/dashboard/DashboardPage.d.ts +2 -0
- package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardPage.js +40 -0
- package/dist/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/pages/dashboard/attention.d.ts +41 -0
- package/dist/pages/dashboard/attention.d.ts.map +1 -0
- package/dist/pages/dashboard/attention.js +146 -0
- package/dist/pages/dashboard/attention.js.map +1 -0
- package/dist/pages/dashboard/sections.d.ts +20 -0
- package/dist/pages/dashboard/sections.d.ts.map +1 -0
- package/dist/pages/dashboard/sections.js +60 -0
- package/dist/pages/dashboard/sections.js.map +1 -0
- package/dist/pages/fields.d.ts +11 -0
- package/dist/pages/fields.d.ts.map +1 -0
- package/dist/pages/fields.js +17 -0
- package/dist/pages/fields.js.map +1 -0
- package/dist/pages/forms/EmbedPanel.d.ts +14 -0
- package/dist/pages/forms/EmbedPanel.d.ts.map +1 -0
- package/dist/pages/forms/EmbedPanel.js +19 -0
- package/dist/pages/forms/EmbedPanel.js.map +1 -0
- package/dist/pages/forms/FieldsEditor.d.ts +6 -0
- package/dist/pages/forms/FieldsEditor.d.ts.map +1 -0
- package/dist/pages/forms/FieldsEditor.js +115 -0
- package/dist/pages/forms/FieldsEditor.js.map +1 -0
- package/dist/pages/forms/FormSettings.d.ts +6 -0
- package/dist/pages/forms/FormSettings.d.ts.map +1 -0
- package/dist/pages/forms/FormSettings.js +47 -0
- package/dist/pages/forms/FormSettings.js.map +1 -0
- package/dist/pages/forms/SubmissionsTable.d.ts +8 -0
- package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -0
- package/dist/pages/forms/SubmissionsTable.js +91 -0
- package/dist/pages/forms/SubmissionsTable.js.map +1 -0
- package/dist/pages/forms/fieldList.d.ts +70 -0
- package/dist/pages/forms/fieldList.d.ts.map +1 -0
- package/dist/pages/forms/fieldList.js +126 -0
- package/dist/pages/forms/fieldList.js.map +1 -0
- package/dist/pages/forms/template.d.ts +18 -0
- package/dist/pages/forms/template.d.ts.map +1 -0
- package/dist/pages/forms/template.js +34 -0
- package/dist/pages/forms/template.js.map +1 -0
- package/dist/pages/handbook/HandbookPage.d.ts +2 -0
- package/dist/pages/handbook/HandbookPage.d.ts.map +1 -0
- package/dist/pages/handbook/HandbookPage.js +197 -0
- package/dist/pages/handbook/HandbookPage.js.map +1 -0
- package/dist/pages/handbook/tree.d.ts +62 -0
- package/dist/pages/handbook/tree.d.ts.map +1 -0
- package/dist/pages/handbook/tree.js +222 -0
- package/dist/pages/handbook/tree.js.map +1 -0
- package/dist/pages/hiringDirectory.d.ts +60 -0
- package/dist/pages/hiringDirectory.d.ts.map +1 -0
- package/dist/pages/hiringDirectory.js +81 -0
- package/dist/pages/hiringDirectory.js.map +1 -0
- package/dist/pages/onboarding/HandbookStepPage.d.ts +14 -0
- package/dist/pages/onboarding/HandbookStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/HandbookStepPage.js +29 -0
- package/dist/pages/onboarding/HandbookStepPage.js.map +1 -0
- package/dist/pages/onboarding/InvitesStepPage.d.ts +2 -0
- package/dist/pages/onboarding/InvitesStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/InvitesStepPage.js +77 -0
- package/dist/pages/onboarding/InvitesStepPage.js.map +1 -0
- package/dist/pages/onboarding/WorkspaceStepPage.d.ts +2 -0
- package/dist/pages/onboarding/WorkspaceStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/WorkspaceStepPage.js +72 -0
- package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -0
- package/dist/pages/positionDirectory.d.ts +20 -0
- package/dist/pages/positionDirectory.d.ts.map +1 -0
- package/dist/pages/positionDirectory.js +58 -0
- package/dist/pages/positionDirectory.js.map +1 -0
- package/dist/registry/UiExtensionProvider.d.ts +12 -0
- package/dist/registry/UiExtensionProvider.d.ts.map +1 -0
- package/dist/registry/UiExtensionProvider.js +10 -0
- package/dist/registry/UiExtensionProvider.js.map +1 -0
- package/dist/registry/context.d.ts +31 -0
- package/dist/registry/context.d.ts.map +1 -0
- package/dist/registry/context.js +45 -0
- package/dist/registry/context.js.map +1 -0
- package/dist/registry/contributions.d.ts +71 -0
- package/dist/registry/contributions.d.ts.map +1 -0
- package/dist/registry/contributions.js +25 -0
- package/dist/registry/contributions.js.map +1 -0
- package/dist/registry/overridable.d.ts +27 -0
- package/dist/registry/overridable.d.ts.map +1 -0
- package/dist/registry/overridable.js +29 -0
- package/dist/registry/overridable.js.map +1 -0
- package/dist/registry/registry.d.ts +68 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +112 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/testing/inputs.d.ts +13 -0
- package/dist/testing/inputs.d.ts.map +1 -0
- package/dist/testing/inputs.js +16 -0
- package/dist/testing/inputs.js.map +1 -0
- package/dist/testing/stubClient.d.ts +42 -0
- package/dist/testing/stubClient.d.ts.map +1 -0
- package/dist/testing/stubClient.js +29 -0
- package/dist/testing/stubClient.js.map +1 -0
- package/package.json +73 -0
- package/src/ServiceStatus.tsx +61 -0
- package/src/api/ApiProvider.tsx +40 -0
- package/src/api/client.ts +267 -0
- package/src/api/context.ts +25 -0
- package/src/api/errors.ts +14 -0
- package/src/api/health.ts +38 -0
- package/src/api/json.ts +4 -0
- package/src/api/queryClient.ts +35 -0
- package/src/api/resource.ts +412 -0
- package/src/api/resources/account.ts +220 -0
- package/src/api/resources/activities.ts +31 -0
- package/src/api/resources/agentTasks.ts +172 -0
- package/src/api/resources/candidates.ts +69 -0
- package/src/api/resources/companies.ts +72 -0
- package/src/api/resources/dashboard.ts +39 -0
- package/src/api/resources/deals.ts +82 -0
- package/src/api/resources/decisions.ts +60 -0
- package/src/api/resources/forms.ts +218 -0
- package/src/api/resources/handbookPages.ts +77 -0
- package/src/api/resources/importJobs.ts +229 -0
- package/src/api/resources/invites.ts +112 -0
- package/src/api/resources/mcpTools.ts +28 -0
- package/src/api/resources/members.ts +105 -0
- package/src/api/resources/moduleSettings.ts +67 -0
- package/src/api/resources/mutation.ts +31 -0
- package/src/api/resources/notes.ts +62 -0
- package/src/api/resources/opportunities.ts +84 -0
- package/src/api/resources/partnerships.ts +89 -0
- package/src/api/resources/people.ts +72 -0
- package/src/api/resources/pipelineStages.ts +93 -0
- package/src/api/resources/planItems.ts +103 -0
- package/src/api/resources/positions.ts +70 -0
- package/src/api/resources/raises.ts +82 -0
- package/src/api/resources/roles.ts +65 -0
- package/src/api/resources/search.ts +49 -0
- package/src/api/resources/session.ts +220 -0
- package/src/api/resources/webhooks.ts +157 -0
- package/src/api/resources/workspace.ts +81 -0
- package/src/app/KelpieApp.tsx +162 -0
- package/src/app/SessionGate.tsx +42 -0
- package/src/components/ActivitiesPanel.tsx +235 -0
- package/src/components/AgentTasks.tsx +473 -0
- package/src/components/Chip.tsx +36 -0
- package/src/components/CopyButton.tsx +48 -0
- package/src/components/DataTable.tsx +209 -0
- package/src/components/DecisionsPanel.tsx +233 -0
- package/src/components/DeleteRecord.tsx +73 -0
- package/src/components/EntitySearch.tsx +268 -0
- package/src/components/ErrorBoundary.tsx +58 -0
- package/src/components/InlineEdit.tsx +179 -0
- package/src/components/KanbanBoard.tsx +234 -0
- package/src/components/MarkdownView.tsx +73 -0
- package/src/components/NotesPanel.tsx +169 -0
- package/src/components/PageHeader.tsx +61 -0
- package/src/components/PhonesField.tsx +204 -0
- package/src/components/PlanAttention.tsx +249 -0
- package/src/components/PlanPanel.tsx +317 -0
- package/src/components/QueryState.tsx +83 -0
- package/src/components/RecordTabs.tsx +69 -0
- package/src/components/SectionHeader.tsx +63 -0
- package/src/components/SegmentedControl.tsx +48 -0
- package/src/components/Shell.tsx +300 -0
- package/src/components/SidebarField.tsx +18 -0
- package/src/components/SocialProfilesField.tsx +356 -0
- package/src/components/StageSettings.tsx +319 -0
- package/src/components/SummaryBlock.tsx +27 -0
- package/src/index.ts +190 -0
- package/src/lib/dates.ts +90 -0
- package/src/lib/money.ts +12 -0
- package/src/lib/names.ts +13 -0
- package/src/lib/plan.ts +147 -0
- package/src/lib/theme.ts +53 -0
- package/src/pages/CompaniesPage.tsx +143 -0
- package/src/pages/CompanyDetail.tsx +502 -0
- package/src/pages/DealDetail.tsx +512 -0
- package/src/pages/DealStageSettingsPage.tsx +67 -0
- package/src/pages/DealsPage.tsx +342 -0
- package/src/pages/DecisionsPage.tsx +211 -0
- package/src/pages/FormDetail.tsx +130 -0
- package/src/pages/FormsPage.tsx +151 -0
- package/src/pages/FundraisingPage.tsx +354 -0
- package/src/pages/HiringPage.tsx +169 -0
- package/src/pages/NotFoundPage.tsx +27 -0
- package/src/pages/OpportunitiesPage.tsx +349 -0
- package/src/pages/OpportunityDetail.tsx +337 -0
- package/src/pages/OpportunityStageSettingsPage.tsx +63 -0
- package/src/pages/PartnershipDetail.tsx +490 -0
- package/src/pages/PartnershipStageSettingsPage.tsx +63 -0
- package/src/pages/PartnershipsPage.tsx +353 -0
- package/src/pages/PeoplePage.tsx +145 -0
- package/src/pages/PersonDetail.tsx +526 -0
- package/src/pages/PlanningPage.tsx +318 -0
- package/src/pages/RaiseDetail.tsx +498 -0
- package/src/pages/RaiseStageSettingsPage.tsx +63 -0
- package/src/pages/RoleDetail.tsx +455 -0
- package/src/pages/SearchPage.tsx +135 -0
- package/src/pages/account/AccountLayout.tsx +38 -0
- package/src/pages/account/Field.tsx +20 -0
- package/src/pages/account/PreferencesPage.tsx +224 -0
- package/src/pages/account/ProfilePage.tsx +147 -0
- package/src/pages/account/SecurityPage.tsx +237 -0
- package/src/pages/admin/DataPage.tsx +772 -0
- package/src/pages/admin/McpPage.tsx +404 -0
- package/src/pages/admin/ModulesPage.tsx +113 -0
- package/src/pages/admin/TeamPage.tsx +386 -0
- package/src/pages/admin/WebhookDeliveries.tsx +184 -0
- package/src/pages/admin/WebhooksPage.tsx +443 -0
- package/src/pages/admin/WorkspaceSettingsPage.tsx +274 -0
- package/src/pages/auth/AuthForm.tsx +118 -0
- package/src/pages/auth/AuthLayout.tsx +74 -0
- package/src/pages/auth/ForgotPasswordPage.tsx +80 -0
- package/src/pages/auth/JoinPage.tsx +85 -0
- package/src/pages/auth/ResetPasswordPage.tsx +124 -0
- package/src/pages/auth/SignInPage.tsx +83 -0
- package/src/pages/auth/SignUpPage.tsx +93 -0
- package/src/pages/candidateFields.tsx +175 -0
- package/src/pages/dashboard/DashboardPage.tsx +108 -0
- package/src/pages/dashboard/attention.ts +206 -0
- package/src/pages/dashboard/sections.tsx +269 -0
- package/src/pages/fields.ts +21 -0
- package/src/pages/forms/EmbedPanel.tsx +95 -0
- package/src/pages/forms/FieldsEditor.tsx +412 -0
- package/src/pages/forms/FormSettings.tsx +159 -0
- package/src/pages/forms/SubmissionsTable.tsx +171 -0
- package/src/pages/forms/fieldList.ts +209 -0
- package/src/pages/forms/template.ts +37 -0
- package/src/pages/handbook/HandbookPage.tsx +500 -0
- package/src/pages/handbook/tree.ts +327 -0
- package/src/pages/hiringDirectory.ts +146 -0
- package/src/pages/onboarding/HandbookStepPage.tsx +75 -0
- package/src/pages/onboarding/InvitesStepPage.tsx +180 -0
- package/src/pages/onboarding/WorkspaceStepPage.tsx +122 -0
- package/src/pages/positionDirectory.ts +98 -0
- package/src/registry/UiExtensionProvider.tsx +20 -0
- package/src/registry/context.ts +67 -0
- package/src/registry/contributions.ts +89 -0
- package/src/registry/overridable.ts +62 -0
- package/src/registry/registry.ts +204 -0
- package/src/styles.css +175 -0
- package/src/testing/inputs.ts +18 -0
- 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 @@
|
|
|
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":";AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,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,UAAU;IACxB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpC,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;IAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAEjE,SAAS,MAAM,CAAC,KAAgB;QAC9B,KAAK,CAAC,cAAc,EAAE,CAAA;QAEtB,wEAAwE;QACxE,oDAAoD;QACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;YAC9C,aAAa,CAAC,6BAA6B,MAAM,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAA;YAEzF,OAAM;QACR,CAAC;QAED,aAAa,CAAC,IAAI,CAAC,CAAA;QAEnB,MAAM;aACH,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;aAC9D,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aAChE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC3B,CAAC;IAED,OAAO,CACL,KAAC,UAAU,IACT,KAAK,EAAC,gBAAgB,EACtB,WAAW,EAAC,oDAAoD,EAChE,MAAM,EACJ,gBAAM,SAAS,EAAC,gBAAgB,yCACL,GAAG,EAC5B,KAAC,IAAI,IAAC,EAAE,EAAC,QAAQ,EAAC,SAAS,EAAC,yCAAyC,wBAE9D,IACF,YAGT,gBAAM,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAC,gBAAgB,aAChD,KAAC,SAAS,IACR,KAAK,EAAC,WAAW,EACjB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAC,MAAM,EACnB,QAAQ,SACR,EACF,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,cAAc,EAC3B,IAAI,EAAE,YAAY,MAAM,CAAC,uBAAuB,CAAC,cAAc,EAC/D,QAAQ,SACR,EACD,UAAU,KAAK,IAAI,IAAI,YAAG,SAAS,EAAC,yBAAyB,YAAE,UAAU,GAAK,EAC9E,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,KAAC,UAAU,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAI,EAC7D,KAAC,YAAY,IAAC,KAAK,EAAC,UAAU,EAAC,YAAY,EAAC,gBAAW,EAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAI,IAClF,GACI,CACd,CAAA;AACH,CAAC"}
|
|
@@ -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
|