@shipfox/client-auth 13.0.0 → 14.0.1
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +29 -0
- package/dist/components/email-code-verification.js +1 -1
- package/dist/components/email-code-verification.js.map +1 -1
- package/dist/components/password-login-form.js +1 -1
- package/dist/components/password-login-form.js.map +1 -1
- package/dist/components/workspace-switcher.js +3 -3
- package/dist/components/workspace-switcher.js.map +1 -1
- package/dist/pages/login-page.js +1 -1
- package/dist/pages/login-page.js.map +1 -1
- package/dist/pages/password-reset-page.js +2 -2
- package/dist/pages/password-reset-page.js.map +1 -1
- package/dist/pages/signup-page.js +2 -2
- package/dist/pages/signup-page.js.map +1 -1
- package/dist/pages/workspace-onboarding-page.js +16 -16
- package/dist/pages/workspace-onboarding-page.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/components/email-code-verification.tsx +1 -1
- package/src/components/password-login-form.tsx +1 -1
- package/src/components/workspace-switcher.tsx +3 -3
- package/src/pages/login-page.tsx +1 -1
- package/src/pages/password-reset-page.tsx +2 -2
- package/src/pages/signup-page.tsx +2 -2
- package/src/pages/workspace-onboarding-page.tsx +16 -16
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -124,14 +124,14 @@ export function WorkspaceOnboardingPage() {
|
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
126
|
return /*#__PURE__*/ _jsx("main", {
|
|
127
|
-
className: "min-h-screen bg-background-subtle-base px-
|
|
127
|
+
className: "min-h-screen bg-background-subtle-base px-frame py-frame max-[520px]:px-row",
|
|
128
128
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
129
|
-
className: "mx-auto flex min-h-[calc(100vh-64px)] w-full max-w-[1120px] flex-col gap-
|
|
129
|
+
className: "mx-auto flex min-h-[calc(100vh-64px)] w-full max-w-[1120px] flex-col gap-section",
|
|
130
130
|
children: [
|
|
131
131
|
/*#__PURE__*/ _jsx("header", {
|
|
132
132
|
className: "flex items-center justify-between",
|
|
133
133
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
134
|
-
className: "flex items-center gap-
|
|
134
|
+
className: "flex items-center gap-inline",
|
|
135
135
|
children: [
|
|
136
136
|
/*#__PURE__*/ _jsx("div", {
|
|
137
137
|
className: "flex size-36 items-center justify-center rounded-8 border border-border-neutral-base bg-background-neutral-base shadow-button-neutral",
|
|
@@ -149,7 +149,7 @@ export function WorkspaceOnboardingPage() {
|
|
|
149
149
|
})
|
|
150
150
|
}),
|
|
151
151
|
/*#__PURE__*/ _jsxs("section", {
|
|
152
|
-
className: "grid flex-1 items-center gap-
|
|
152
|
+
className: "grid flex-1 items-center gap-region lg:grid-cols-[minmax(0,440px)_minmax(0,1fr)]",
|
|
153
153
|
children: [
|
|
154
154
|
/*#__PURE__*/ _jsx("form", {
|
|
155
155
|
className: "relative z-10 w-full",
|
|
@@ -161,10 +161,10 @@ export function WorkspaceOnboardingPage() {
|
|
|
161
161
|
void form.handleSubmit();
|
|
162
162
|
},
|
|
163
163
|
children: /*#__PURE__*/ _jsxs(Card, {
|
|
164
|
-
className: "gap-
|
|
164
|
+
className: "gap-section p-panel shadow-button-neutral",
|
|
165
165
|
children: [
|
|
166
166
|
/*#__PURE__*/ _jsxs(CardHeader, {
|
|
167
|
-
className: "gap-
|
|
167
|
+
className: "gap-inline",
|
|
168
168
|
children: [
|
|
169
169
|
/*#__PURE__*/ _jsx(CardTitle, {
|
|
170
170
|
id: "workspace-onboarding-title",
|
|
@@ -182,7 +182,7 @@ export function WorkspaceOnboardingPage() {
|
|
|
182
182
|
children: formError
|
|
183
183
|
}) : null,
|
|
184
184
|
/*#__PURE__*/ _jsxs(CardContent, {
|
|
185
|
-
className: "flex flex-col gap-
|
|
185
|
+
className: "flex flex-col gap-inline",
|
|
186
186
|
children: [
|
|
187
187
|
/*#__PURE__*/ _jsx(form.Field, {
|
|
188
188
|
name: "name",
|
|
@@ -253,13 +253,13 @@ export function WorkspaceOnboardingPage() {
|
|
|
253
253
|
})
|
|
254
254
|
}),
|
|
255
255
|
/*#__PURE__*/ _jsxs("div", {
|
|
256
|
-
className: "hidden flex-col gap-
|
|
256
|
+
className: "hidden flex-col gap-group lg:flex",
|
|
257
257
|
"aria-hidden": "true",
|
|
258
258
|
children: [
|
|
259
259
|
/*#__PURE__*/ _jsx("div", {
|
|
260
|
-
className: "grid grid-cols-4 gap-
|
|
260
|
+
className: "grid grid-cols-4 gap-cluster",
|
|
261
261
|
children: previewMetrics.map((metric)=>/*#__PURE__*/ _jsxs("div", {
|
|
262
|
-
className: "rounded-8 border border-border-neutral-base bg-background-neutral-base p-
|
|
262
|
+
className: "rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral",
|
|
263
263
|
children: [
|
|
264
264
|
/*#__PURE__*/ _jsx(Text, {
|
|
265
265
|
size: "xs",
|
|
@@ -275,7 +275,7 @@ export function WorkspaceOnboardingPage() {
|
|
|
275
275
|
}, metric.label))
|
|
276
276
|
}),
|
|
277
277
|
/*#__PURE__*/ _jsxs("div", {
|
|
278
|
-
className: "grid grid-cols-2 gap-
|
|
278
|
+
className: "grid grid-cols-2 gap-group",
|
|
279
279
|
children: [
|
|
280
280
|
/*#__PURE__*/ _jsx(PreviewPanel, {
|
|
281
281
|
title: "Performance over time"
|
|
@@ -287,7 +287,7 @@ export function WorkspaceOnboardingPage() {
|
|
|
287
287
|
]
|
|
288
288
|
}),
|
|
289
289
|
/*#__PURE__*/ _jsxs("div", {
|
|
290
|
-
className: "rounded-8 border border-border-neutral-base bg-background-neutral-base p-
|
|
290
|
+
className: "flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral",
|
|
291
291
|
children: [
|
|
292
292
|
/*#__PURE__*/ _jsx(Text, {
|
|
293
293
|
size: "sm",
|
|
@@ -295,14 +295,14 @@ export function WorkspaceOnboardingPage() {
|
|
|
295
295
|
children: "Jobs breakdown"
|
|
296
296
|
}),
|
|
297
297
|
/*#__PURE__*/ _jsx("div", {
|
|
298
|
-
className: "
|
|
298
|
+
className: "flex flex-col gap-inline",
|
|
299
299
|
children: [
|
|
300
300
|
0,
|
|
301
301
|
1,
|
|
302
302
|
2,
|
|
303
303
|
3
|
|
304
304
|
].map((row)=>/*#__PURE__*/ _jsxs("div", {
|
|
305
|
-
className: "grid grid-cols-[1fr_80px_80px] gap-
|
|
305
|
+
className: "grid grid-cols-[1fr_80px_80px] gap-cluster border-t border-border-neutral-base pt-[10px]",
|
|
306
306
|
children: [
|
|
307
307
|
/*#__PURE__*/ _jsx("div", {
|
|
308
308
|
className: "h-12 rounded-full bg-background-neutral-disabled"
|
|
@@ -328,7 +328,7 @@ export function WorkspaceOnboardingPage() {
|
|
|
328
328
|
}
|
|
329
329
|
function PreviewPanel({ title, bars = false }) {
|
|
330
330
|
return /*#__PURE__*/ _jsxs("div", {
|
|
331
|
-
className: "rounded-8 border border-border-neutral-base bg-background-neutral-base p-
|
|
331
|
+
className: "flex flex-col gap-group rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral",
|
|
332
332
|
children: [
|
|
333
333
|
/*#__PURE__*/ _jsx(Text, {
|
|
334
334
|
size: "sm",
|
|
@@ -336,7 +336,7 @@ function PreviewPanel({ title, bars = false }) {
|
|
|
336
336
|
children: title
|
|
337
337
|
}),
|
|
338
338
|
/*#__PURE__*/ _jsx("div", {
|
|
339
|
-
className: "
|
|
339
|
+
className: "flex h-[220px] items-end gap-inline border-b border-l border-border-neutral-base px-row pb-[10px]",
|
|
340
340
|
children: previewBars.map((bar)=>/*#__PURE__*/ _jsx("div", {
|
|
341
341
|
className: bars ? 'w-full rounded-t-4 bg-background-neutral-disabled' : 'w-full rounded-full bg-background-neutral-disabled',
|
|
342
342
|
style: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pages/workspace-onboarding-page.tsx"],"sourcesContent":["import {slugifyName, slugSchema} from '@shipfox/api-common-dto';\nimport {createWorkspaceBodySchema} from '@shipfox/api-workspaces-dto';\nimport {displayNameFieldError, SlugField} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@shipfox/react-ui/card';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useNavigate} from '@tanstack/react-router';\nimport {useSetAtom} from 'jotai';\nimport {useState} from 'react';\nimport {checkWorkspaceSlugAvailability, useCreateWorkspaceAuth} from '#hooks/api/workspace-auth.js';\nimport {useAuthState} from '#hooks/use-auth-state.js';\nimport {lastWorkspaceIdAtom, rememberLastWorkspaceId} from '#state/last-workspace.js';\nimport {workspaceOnboardingErrorToFormError} from './form-errors.js';\n\nconst previewMetrics = [\n {label: 'Runs', value: '--'},\n {label: 'Passed', value: '--'},\n {label: 'Failed', value: '--'},\n {label: 'Duration', value: '--'},\n];\nconst previewBars = [\n {id: 'runs-start', height: 32},\n {id: 'runs-mid-low', height: 48},\n {id: 'runs-dip', height: 28},\n {id: 'runs-mid-high', height: 66},\n {id: 'runs-mid', height: 54},\n {id: 'runs-peak', height: 82},\n {id: 'runs-late-low', height: 44},\n {id: 'runs-late-high', height: 74},\n];\n\nfunction isSlugValid(value: string): boolean {\n return slugSchema.safeParse(value).success;\n}\n\nexport function WorkspaceOnboardingPage() {\n const createWorkspace = useCreateWorkspaceAuth();\n const {user} = useAuthState();\n const navigate = useNavigate();\n const setLastWorkspaceId = useSetAtom(lastWorkspaceIdAtom);\n const [formError, setFormError] = useState<string | undefined>();\n const [slugTouched, setSlugTouched] = useState(false);\n\n const form = useForm({\n defaultValues: {name: '', slug: ''},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n try {\n const command = createWorkspaceBodySchema.parse({name: value.name, slug: value.slug});\n const created = await createWorkspace.mutateAsync(command);\n toast.success('Workspace created.');\n // Pin the new workspace as the last-active one so a page refresh and\n // future visits to `/` land on it.\n try {\n setLastWorkspaceId(created.id);\n if (user?.id) rememberLastWorkspaceId(user.id, created.id);\n } catch {\n // localStorage may throw in private browsing or quota-exceeded.\n }\n await navigate({to: '/w/$workspaceSlug', params: {workspaceSlug: created.slug}});\n } catch (error) {\n const mapped = workspaceOnboardingErrorToFormError(error);\n if (mapped.kind === 'field') {\n form.setFieldMeta(mapped.field, (previous) => ({\n ...previous,\n errorMap: {...previous.errorMap, onServer: mapped.message},\n }));\n } else {\n setFormError(mapped.message);\n }\n }\n },\n });\n\n return (\n <main className=\"min-h-screen bg-background-subtle-base px-24 py-32 max-[520px]:px-16\">\n <div className=\"mx-auto flex min-h-[calc(100vh-64px)] w-full max-w-[1120px] flex-col gap-24\">\n <header className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-10\">\n <div className=\"flex size-36 items-center justify-center rounded-8 border border-border-neutral-base bg-background-neutral-base shadow-button-neutral\">\n <Icon name=\"shipfox\" className=\"size-24 text-background-highlight-interactive\" />\n </div>\n <Text size=\"md\" bold>\n Shipfox\n </Text>\n </div>\n </header>\n\n <section className=\"grid flex-1 items-center gap-32 lg:grid-cols-[minmax(0,440px)_minmax(0,1fr)]\">\n <form\n className=\"relative z-10 w-full\"\n noValidate\n aria-labelledby=\"workspace-onboarding-title\"\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <Card className=\"gap-20 p-24 shadow-button-neutral\">\n <CardHeader className=\"gap-8\">\n <CardTitle id=\"workspace-onboarding-title\" variant=\"h1\">\n Create your workspace\n </CardTitle>\n <CardDescription>Give your team a place to collaborate.</CardDescription>\n </CardHeader>\n\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n {formError}\n </Callout>\n ) : null}\n\n <CardContent className=\"flex flex-col gap-8\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n onSubmit: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n }}\n >\n {(field) => (\n <FormField label=\"Workspace name\" id=\"workspace-name\" error={fieldError(field)}>\n <FormFieldInput\n autoComplete=\"organization\"\n name=\"name\"\n placeholder=\"Acme\"\n type=\"text\"\n value={field.state.value}\n onChange={(event) => {\n const name = event.target.value;\n field.handleChange(name);\n if (!slugTouched) {\n form.setFieldValue(\n 'slug',\n name ? slugifyName(name, {fallback: 'workspace'}) : '',\n );\n }\n }}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field\n name=\"slug\"\n validators={{\n onBlur: createWorkspaceBodySchema.shape.slug,\n onSubmit: createWorkspaceBodySchema.shape.slug,\n }}\n >\n {(field) => (\n <SlugField\n id=\"workspace-slug\"\n label=\"Workspace slug\"\n name=\"slug\"\n value={field.state.value}\n onChange={(value) => {\n setSlugTouched(true);\n field.handleChange(value);\n }}\n onBlur={field.handleBlur}\n error={fieldError(field)}\n description={\n <span className=\"break-all font-code\">\n {`${window.location.origin}/w/${field.state.value || 'acme'}`}\n </span>\n }\n placeholder=\"acme\"\n checkEnabled={slugTouched}\n isValid={isSlugValid}\n checkAvailability={checkWorkspaceSlugAvailability}\n />\n )}\n </form.Field>\n </CardContent>\n\n <Button\n className=\"w-full\"\n iconRight=\"chevronRight\"\n isLoading={createWorkspace.isPending}\n type=\"submit\"\n >\n {createWorkspace.isPending ? 'Creating workspace...' : 'Create workspace'}\n </Button>\n </Card>\n </form>\n\n <div className=\"hidden flex-col gap-18 lg:flex\" aria-hidden=\"true\">\n <div className=\"grid grid-cols-4 gap-12\">\n {previewMetrics.map((metric) => (\n <div\n className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-14 shadow-button-neutral\"\n key={metric.label}\n >\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n {metric.label}\n </Text>\n <Text size=\"xl\" bold>\n {metric.value}\n </Text>\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-2 gap-18\">\n <PreviewPanel title=\"Performance over time\" />\n <PreviewPanel title=\"Duration distribution\" bars />\n </div>\n <div className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-16 shadow-button-neutral\">\n <Text size=\"sm\" bold>\n Jobs breakdown\n </Text>\n <div className=\"mt-14 flex flex-col gap-10\">\n {[0, 1, 2, 3].map((row) => (\n <div\n className=\"grid grid-cols-[1fr_80px_80px] gap-12 border-t border-border-neutral-base pt-10\"\n key={row}\n >\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n </section>\n </div>\n </main>\n );\n}\n\nfunction PreviewPanel({title, bars = false}: {title: string; bars?: boolean}) {\n return (\n <div className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-16 shadow-button-neutral\">\n <Text size=\"sm\" bold>\n {title}\n </Text>\n <div className=\"mt-16 flex h-[220px] items-end gap-8 border-b border-l border-border-neutral-base px-12 pb-10\">\n {previewBars.map((bar) => (\n <div\n className={\n bars\n ? 'w-full rounded-t-4 bg-background-neutral-disabled'\n : 'w-full rounded-full bg-background-neutral-disabled'\n }\n key={`${title}-${bar.id}`}\n style={{height: `${bar.height}%`}}\n />\n ))}\n </div>\n </div>\n );\n}\n"],"names":["slugifyName","slugSchema","createWorkspaceBodySchema","displayNameFieldError","SlugField","Button","Callout","Card","CardContent","CardDescription","CardHeader","CardTitle","FormField","FormFieldInput","fieldError","Icon","toast","Text","useForm","useNavigate","useSetAtom","useState","checkWorkspaceSlugAvailability","useCreateWorkspaceAuth","useAuthState","lastWorkspaceIdAtom","rememberLastWorkspaceId","workspaceOnboardingErrorToFormError","previewMetrics","label","value","previewBars","id","height","isSlugValid","safeParse","success","WorkspaceOnboardingPage","createWorkspace","user","navigate","setLastWorkspaceId","formError","setFormError","slugTouched","setSlugTouched","form","defaultValues","name","slug","onSubmit","undefined","command","parse","created","mutateAsync","to","params","workspaceSlug","error","mapped","kind","setFieldMeta","field","previous","errorMap","onServer","message","main","className","div","header","size","bold","section","noValidate","aria-labelledby","event","preventDefault","stopPropagation","handleSubmit","variant","role","type","Field","validators","onBlur","shape","autoComplete","placeholder","state","onChange","target","handleChange","setFieldValue","fallback","handleBlur","description","span","window","location","origin","checkEnabled","isValid","checkAvailability","iconRight","isLoading","isPending","aria-hidden","map","metric","PreviewPanel","title","bars","row","bar","style"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/pages/workspace-onboarding-page.tsx"],"sourcesContent":["import {slugifyName, slugSchema} from '@shipfox/api-common-dto';\nimport {createWorkspaceBodySchema} from '@shipfox/api-workspaces-dto';\nimport {displayNameFieldError, SlugField} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@shipfox/react-ui/card';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useNavigate} from '@tanstack/react-router';\nimport {useSetAtom} from 'jotai';\nimport {useState} from 'react';\nimport {checkWorkspaceSlugAvailability, useCreateWorkspaceAuth} from '#hooks/api/workspace-auth.js';\nimport {useAuthState} from '#hooks/use-auth-state.js';\nimport {lastWorkspaceIdAtom, rememberLastWorkspaceId} from '#state/last-workspace.js';\nimport {workspaceOnboardingErrorToFormError} from './form-errors.js';\n\nconst previewMetrics = [\n {label: 'Runs', value: '--'},\n {label: 'Passed', value: '--'},\n {label: 'Failed', value: '--'},\n {label: 'Duration', value: '--'},\n];\nconst previewBars = [\n {id: 'runs-start', height: 32},\n {id: 'runs-mid-low', height: 48},\n {id: 'runs-dip', height: 28},\n {id: 'runs-mid-high', height: 66},\n {id: 'runs-mid', height: 54},\n {id: 'runs-peak', height: 82},\n {id: 'runs-late-low', height: 44},\n {id: 'runs-late-high', height: 74},\n];\n\nfunction isSlugValid(value: string): boolean {\n return slugSchema.safeParse(value).success;\n}\n\nexport function WorkspaceOnboardingPage() {\n const createWorkspace = useCreateWorkspaceAuth();\n const {user} = useAuthState();\n const navigate = useNavigate();\n const setLastWorkspaceId = useSetAtom(lastWorkspaceIdAtom);\n const [formError, setFormError] = useState<string | undefined>();\n const [slugTouched, setSlugTouched] = useState(false);\n\n const form = useForm({\n defaultValues: {name: '', slug: ''},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n try {\n const command = createWorkspaceBodySchema.parse({name: value.name, slug: value.slug});\n const created = await createWorkspace.mutateAsync(command);\n toast.success('Workspace created.');\n // Pin the new workspace as the last-active one so a page refresh and\n // future visits to `/` land on it.\n try {\n setLastWorkspaceId(created.id);\n if (user?.id) rememberLastWorkspaceId(user.id, created.id);\n } catch {\n // localStorage may throw in private browsing or quota-exceeded.\n }\n await navigate({to: '/w/$workspaceSlug', params: {workspaceSlug: created.slug}});\n } catch (error) {\n const mapped = workspaceOnboardingErrorToFormError(error);\n if (mapped.kind === 'field') {\n form.setFieldMeta(mapped.field, (previous) => ({\n ...previous,\n errorMap: {...previous.errorMap, onServer: mapped.message},\n }));\n } else {\n setFormError(mapped.message);\n }\n }\n },\n });\n\n return (\n <main className=\"min-h-screen bg-background-subtle-base px-frame py-frame max-[520px]:px-row\">\n <div className=\"mx-auto flex min-h-[calc(100vh-64px)] w-full max-w-[1120px] flex-col gap-section\">\n <header className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-inline\">\n <div className=\"flex size-36 items-center justify-center rounded-8 border border-border-neutral-base bg-background-neutral-base shadow-button-neutral\">\n <Icon name=\"shipfox\" className=\"size-24 text-background-highlight-interactive\" />\n </div>\n <Text size=\"md\" bold>\n Shipfox\n </Text>\n </div>\n </header>\n\n <section className=\"grid flex-1 items-center gap-region lg:grid-cols-[minmax(0,440px)_minmax(0,1fr)]\">\n <form\n className=\"relative z-10 w-full\"\n noValidate\n aria-labelledby=\"workspace-onboarding-title\"\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <Card className=\"gap-section p-panel shadow-button-neutral\">\n <CardHeader className=\"gap-inline\">\n <CardTitle id=\"workspace-onboarding-title\" variant=\"h1\">\n Create your workspace\n </CardTitle>\n <CardDescription>Give your team a place to collaborate.</CardDescription>\n </CardHeader>\n\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n {formError}\n </Callout>\n ) : null}\n\n <CardContent className=\"flex flex-col gap-inline\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n onSubmit: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n }}\n >\n {(field) => (\n <FormField label=\"Workspace name\" id=\"workspace-name\" error={fieldError(field)}>\n <FormFieldInput\n autoComplete=\"organization\"\n name=\"name\"\n placeholder=\"Acme\"\n type=\"text\"\n value={field.state.value}\n onChange={(event) => {\n const name = event.target.value;\n field.handleChange(name);\n if (!slugTouched) {\n form.setFieldValue(\n 'slug',\n name ? slugifyName(name, {fallback: 'workspace'}) : '',\n );\n }\n }}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field\n name=\"slug\"\n validators={{\n onBlur: createWorkspaceBodySchema.shape.slug,\n onSubmit: createWorkspaceBodySchema.shape.slug,\n }}\n >\n {(field) => (\n <SlugField\n id=\"workspace-slug\"\n label=\"Workspace slug\"\n name=\"slug\"\n value={field.state.value}\n onChange={(value) => {\n setSlugTouched(true);\n field.handleChange(value);\n }}\n onBlur={field.handleBlur}\n error={fieldError(field)}\n description={\n <span className=\"break-all font-code\">\n {`${window.location.origin}/w/${field.state.value || 'acme'}`}\n </span>\n }\n placeholder=\"acme\"\n checkEnabled={slugTouched}\n isValid={isSlugValid}\n checkAvailability={checkWorkspaceSlugAvailability}\n />\n )}\n </form.Field>\n </CardContent>\n\n <Button\n className=\"w-full\"\n iconRight=\"chevronRight\"\n isLoading={createWorkspace.isPending}\n type=\"submit\"\n >\n {createWorkspace.isPending ? 'Creating workspace...' : 'Create workspace'}\n </Button>\n </Card>\n </form>\n\n <div className=\"hidden flex-col gap-group lg:flex\" aria-hidden=\"true\">\n <div className=\"grid grid-cols-4 gap-cluster\">\n {previewMetrics.map((metric) => (\n <div\n className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\"\n key={metric.label}\n >\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n {metric.label}\n </Text>\n <Text size=\"xl\" bold>\n {metric.value}\n </Text>\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-2 gap-group\">\n <PreviewPanel title=\"Performance over time\" />\n <PreviewPanel title=\"Duration distribution\" bars />\n </div>\n <div className=\"flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\">\n <Text size=\"sm\" bold>\n Jobs breakdown\n </Text>\n <div className=\"flex flex-col gap-inline\">\n {[0, 1, 2, 3].map((row) => (\n <div\n className=\"grid grid-cols-[1fr_80px_80px] gap-cluster border-t border-border-neutral-base pt-[10px]\"\n key={row}\n >\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n </section>\n </div>\n </main>\n );\n}\n\nfunction PreviewPanel({title, bars = false}: {title: string; bars?: boolean}) {\n return (\n <div className=\"flex flex-col gap-group rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\">\n <Text size=\"sm\" bold>\n {title}\n </Text>\n <div className=\"flex h-[220px] items-end gap-inline border-b border-l border-border-neutral-base px-row pb-[10px]\">\n {previewBars.map((bar) => (\n <div\n className={\n bars\n ? 'w-full rounded-t-4 bg-background-neutral-disabled'\n : 'w-full rounded-full bg-background-neutral-disabled'\n }\n key={`${title}-${bar.id}`}\n style={{height: `${bar.height}%`}}\n />\n ))}\n </div>\n </div>\n );\n}\n"],"names":["slugifyName","slugSchema","createWorkspaceBodySchema","displayNameFieldError","SlugField","Button","Callout","Card","CardContent","CardDescription","CardHeader","CardTitle","FormField","FormFieldInput","fieldError","Icon","toast","Text","useForm","useNavigate","useSetAtom","useState","checkWorkspaceSlugAvailability","useCreateWorkspaceAuth","useAuthState","lastWorkspaceIdAtom","rememberLastWorkspaceId","workspaceOnboardingErrorToFormError","previewMetrics","label","value","previewBars","id","height","isSlugValid","safeParse","success","WorkspaceOnboardingPage","createWorkspace","user","navigate","setLastWorkspaceId","formError","setFormError","slugTouched","setSlugTouched","form","defaultValues","name","slug","onSubmit","undefined","command","parse","created","mutateAsync","to","params","workspaceSlug","error","mapped","kind","setFieldMeta","field","previous","errorMap","onServer","message","main","className","div","header","size","bold","section","noValidate","aria-labelledby","event","preventDefault","stopPropagation","handleSubmit","variant","role","type","Field","validators","onBlur","shape","autoComplete","placeholder","state","onChange","target","handleChange","setFieldValue","fallback","handleBlur","description","span","window","location","origin","checkEnabled","isValid","checkAvailability","iconRight","isLoading","isPending","aria-hidden","map","metric","PreviewPanel","title","bars","row","bar","style"],"mappings":"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"}
|