@recruitnepal/shared-packages 1.8.0 → 1.8.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/dist/career-personality-test/components/CareerFitTestLanding.d.ts +10 -0
- package/dist/career-personality-test/components/CareerFitTestLanding.d.ts.map +1 -0
- package/dist/career-personality-test/components/CareerFitTestLanding.js +20 -0
- package/dist/career-personality-test/components/CareerTestDetailsForm.d.ts +28 -0
- package/dist/career-personality-test/components/CareerTestDetailsForm.d.ts.map +1 -0
- package/dist/career-personality-test/components/CareerTestDetailsForm.js +91 -0
- package/dist/career-personality-test/components/CareerTestResultsPage.d.ts +27 -0
- package/dist/career-personality-test/components/CareerTestResultsPage.d.ts.map +1 -0
- package/dist/career-personality-test/components/CareerTestResultsPage.js +121 -0
- package/dist/career-personality-test/components/CareerTestStart.d.ts +7 -0
- package/dist/career-personality-test/components/CareerTestStart.d.ts.map +1 -0
- package/dist/career-personality-test/components/CareerTestStart.js +87 -0
- package/dist/career-personality-test/constants/resultConstants.d.ts +29 -0
- package/dist/career-personality-test/constants/resultConstants.d.ts.map +1 -0
- package/dist/career-personality-test/constants/resultConstants.js +92 -0
- package/dist/career-personality-test/constants/storageKeys.d.ts +3 -0
- package/dist/career-personality-test/constants/storageKeys.d.ts.map +1 -0
- package/dist/career-personality-test/constants/storageKeys.js +2 -0
- package/dist/career-personality-test/data/overallBands.d.ts +13 -0
- package/dist/career-personality-test/data/overallBands.d.ts.map +1 -0
- package/dist/career-personality-test/data/overallBands.js +10 -0
- package/dist/career-personality-test/data/questions.d.ts +16 -0
- package/dist/career-personality-test/data/questions.d.ts.map +1 -0
- package/dist/career-personality-test/data/questions.js +51 -0
- package/dist/career-personality-test/data/traits.d.ts +7 -0
- package/dist/career-personality-test/data/traits.d.ts.map +1 -0
- package/dist/career-personality-test/data/traits.js +15 -0
- package/dist/career-personality-test/index.d.ts +20 -0
- package/dist/career-personality-test/index.d.ts.map +1 -0
- package/dist/career-personality-test/index.js +14 -0
- package/dist/career-personality-test/utils/scoring.d.ts +18 -0
- package/dist/career-personality-test/utils/scoring.d.ts.map +1 -0
- package/dist/career-personality-test/utils/scoring.js +69 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/package.json +16 -6
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type CareerFitTestLandingProps = {
|
|
2
|
+
/** Base path for routes, e.g. "/career-personality-test" */
|
|
3
|
+
basePath: string;
|
|
4
|
+
/** Base path for images, e.g. "/images/careerFitPersonality" */
|
|
5
|
+
imageBasePath: string;
|
|
6
|
+
/** Optional brand name for title */
|
|
7
|
+
brandName?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function CareerFitTestLanding({ basePath, imageBasePath, brandName }: CareerFitTestLandingProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=CareerFitTestLanding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CareerFitTestLanding.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/components/CareerFitTestLanding.tsx"],"names":[],"mappings":"AAkBA,MAAM,MAAM,yBAAyB,GAAG;IACtC,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAiBF,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,SAA2B,EAAE,EAAE,yBAAyB,2CAyGvH"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ArrowRight, BarChart3, BookText, CheckCircle2, ChevronRight, Compass, Layers, Percent, PieChart, Sparkles, ThumbsUp, } from 'lucide-react';
|
|
4
|
+
import { Button } from '../../components/ui/Button';
|
|
5
|
+
const CARD_ITEMS = [
|
|
6
|
+
{ icon: BarChart3, title: 'Trait Percentages', desc: 'Your exact scores for every Big Five and RIASEC trait, weighted and normalized for clarity.' },
|
|
7
|
+
{ icon: PieChart, title: 'Pie Charts', desc: 'Two visuals: Big Five distribution and RIASEC interests. Compare strengths side by side.' },
|
|
8
|
+
{ icon: BookText, title: 'Personality Narrative', desc: 'Readable summary of how you plan, collaborate, communicate, and handle pressure.' },
|
|
9
|
+
{ icon: Layers, title: 'Top Career Fields', desc: 'Fields mapped to your strongest RIASEC pattern so you focus your search where you\'ll thrive.' },
|
|
10
|
+
{ icon: Compass, title: 'Role Recommendations', desc: 'A curated list of role ideas aligned to your top traits and interests — practical, not vague.' },
|
|
11
|
+
{ icon: Percent, title: 'Combined Career-Fit', desc: 'One overall score blending both models to show readiness and fit scope at a glance.' },
|
|
12
|
+
];
|
|
13
|
+
const WHY_ITEMS = [
|
|
14
|
+
{ icon: Sparkles, title: 'Clarity you can use', desc: 'Everyday language, not just scores — spot your strengths, blind spots, and energizers.' },
|
|
15
|
+
{ icon: ThumbsUp, title: 'Confidence to choose', desc: 'Know which problems to tackle, how you collaborate, and where you\'re most resilient.' },
|
|
16
|
+
{ icon: CheckCircle2, title: 'Action you can take', desc: 'Target roles that match your natural interests. Align your resume with authentic talking points.' },
|
|
17
|
+
];
|
|
18
|
+
export function CareerFitTestLanding({ basePath, imageBasePath, brandName = 'Recruit Nepal' }) {
|
|
19
|
+
return (_jsxs("main", { className: "container mx-auto px-6 py-10", children: [_jsxs("section", { className: "flex flex-col items-center text-center max-w-3xl mx-auto", children: [_jsx("div", { className: "mb-6", children: _jsxs("span", { className: "inline-flex items-center gap-2 rounded-full border px-3 py-1 text-xs text-muted-foreground bg-white", children: [_jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-blue-500" }), "Career Fit Test"] }) }), _jsx("h1", { className: "text-5xl font-semibold text-primary mb-4", children: "Career Fit Test" }), _jsx("p", { className: "mt-3 text-base text-muted-foreground max-w-xl", children: "Discover your work style, strengths, and ideal career paths \u2014 all in one test." })] }), _jsxs("section", { className: "grid lg:grid-cols-2 gap-10 items-start mt-20", children: [_jsxs("div", { children: [_jsx("h3", { className: "font-semibold mb-3 text-lg", children: "What is the Career Fit Test ?" }), _jsx("p", { className: "text-muted-foreground", children: "Our personality test is a short assessment that measures your work behaviors and career interests. You'll answer 40 short items. Quality results need focused attention." }), _jsx("p", { className: "mt-4 text-muted-foreground", children: "You'll respond on a 5-point scale and a few Yes/No items. Each response maps to a trait with a defined weight, so your final result reflects both what you chose and how strongly it signals that trait." }), _jsx("p", { className: "mt-4 text-muted-foreground", children: "Our test uses two proven models:" }), _jsxs("ul", { className: "list-disc ml-5 text-muted-foreground", children: [_jsxs("li", { children: [_jsx("span", { className: "font-medium", children: "BigFive (BIG-O):" }), " Openness, Conscientiousness, Extraversion, Agreeableness, and Neuroticism."] }), _jsxs("li", { children: [_jsx("span", { className: "font-medium", children: "RIASEC:" }), " Realistic, Investigative, Artistic, Social, Enterprising, and Conventional."] })] }), _jsx("p", { className: "mt-4 text-muted-foreground", children: "The result is a clear set of trait percentages that reflect both what you chose and how strongly each answer signals a trait, so we can match you to roles and work environments you're likely to enjoy and excel in." })] }), _jsx("div", { className: "relative aspect-[4/3] w-full overflow-hidden rounded-xl bg-white", children: _jsx("img", { src: `${imageBasePath}/careerfit-home.png`, alt: "Career Fit Test illustration", className: "w-full h-full object-contain" }) })] }), _jsxs("section", { className: "mt-20", children: [_jsx("h2", { className: "text-3xl font-semibold text-primary text-center mb-8", children: "What Results You'll Get" }), _jsx("div", { className: "grid md:grid-cols-3 gap-6", children: CARD_ITEMS.map((item, i) => (_jsx("div", { className: "rounded-lg border bg-white p-5 shadow-sm", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-0.5 text-primary", children: _jsx(item.icon, { className: "h-5 w-5" }) }), _jsxs("div", { children: [_jsx("p", { className: "font-medium", children: item.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: item.desc })] })] }) }, i))) })] }), _jsxs("section", { className: "mt-20", children: [_jsx("h2", { className: "text-3xl font-semibold text-primary text-center mb-8", children: "Why take the test?" }), _jsx("p", { className: "text-center text-sm text-muted-foreground mt-2", children: "In 10 minutes, this 40-question, weighted assessment turns your work style (BIG-O) and interests (RIASEC) into a plan you can use today." }), _jsx("div", { className: "mt-10 grid md:grid-cols-3 gap-6", children: WHY_ITEMS.map((f, i) => (_jsxs("div", { className: "rounded-xl border bg-white p-6 text-center", children: [_jsx("div", { className: "mx-auto mb-3 w-10 h-10 grid place-items-center rounded-full bg-blue-50 text-blue-600", children: _jsx(f.icon, { className: "h-6 w-6" }) }), _jsx("p", { className: "font-medium", children: f.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: f.desc })] }, i))) }), _jsx("div", { className: "mt-8 rounded-xl border border-blue-100 bg-[#F5F9FF] p-5 shadow-sm", children: _jsxs("div", { className: "grid md:grid-cols-3 gap-4 items-center", children: [_jsxs("div", { children: [_jsx("p", { className: "text-xs font-semibold text-[#155177]", children: "BEFORE:" }), _jsx("p", { className: "text-sm text-gray-700", children: "Guessing, generic applications, mismatch fatigue." })] }), _jsx("div", { className: "hidden md:flex items-center justify-center text-[#155177]", children: _jsx(ChevronRight, { className: "h-5 w-5" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-xs font-semibold text-[#155177]", children: "AFTER:" }), _jsx("p", { className: "text-sm text-gray-700", children: "Targeted roles, a clear story for interviews, momentum in the next 30\u201360 days." })] })] }) }), _jsx("div", { className: "mt-8 flex items-center justify-center", children: _jsx(Button, { asChild: true, size: "lg", className: "px-8", children: _jsxs("a", { href: `${basePath}/details`, className: "flex items-center gap-2", children: ["Start the Test", _jsx(ArrowRight, { className: "h-4 w-4" })] }) }) }), _jsx("p", { className: "mt-3 text-center text-xs text-muted-foreground", children: "Weighted scoring \u2022 BIG-O + RIASEC \u2022 Private by default" })] })] }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type CareerTestDetailsFormInitial = {
|
|
2
|
+
firstName?: string;
|
|
3
|
+
lastName?: string;
|
|
4
|
+
email?: string;
|
|
5
|
+
phone?: string;
|
|
6
|
+
education?: string;
|
|
7
|
+
};
|
|
8
|
+
export type CareerTestDetailsFormProps = {
|
|
9
|
+
/** Base path, e.g. "/career-personality-test" */
|
|
10
|
+
basePath: string;
|
|
11
|
+
/** Callback to navigate (e.g. router.push) */
|
|
12
|
+
navigate: (path: string) => void;
|
|
13
|
+
/** Optional: load initial values (e.g. from API) */
|
|
14
|
+
getInitialData?: () => CareerTestDetailsFormInitial | Promise<CareerTestDetailsFormInitial>;
|
|
15
|
+
/** Optional: persist to backend before proceeding */
|
|
16
|
+
onSubmit?: (payload: CareerTestDetailsFormPayload) => Promise<void>;
|
|
17
|
+
/** Session storage key for user payload; default CAREER_TEST_USER_KEY */
|
|
18
|
+
storageKeyUser?: string;
|
|
19
|
+
};
|
|
20
|
+
export type CareerTestDetailsFormPayload = {
|
|
21
|
+
firstName: string;
|
|
22
|
+
lastName?: string;
|
|
23
|
+
email: string;
|
|
24
|
+
phone?: string;
|
|
25
|
+
education?: string;
|
|
26
|
+
};
|
|
27
|
+
export declare function CareerTestDetailsForm({ basePath, navigate, getInitialData, onSubmit, storageKeyUser, }: CareerTestDetailsFormProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=CareerTestDetailsForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CareerTestDetailsForm.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/components/CareerTestDetailsForm.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,4BAA4B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC5F,qDAAqD;IACrD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,4BAA4B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAgBF,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,cAAqC,GACtC,EAAE,0BAA0B,2CAoJ5B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cn } from '../../utils/cn';
|
|
5
|
+
import { CAREER_TEST_USER_KEY } from '../constants/storageKeys';
|
|
6
|
+
const EDUCATION_OPTIONS = [
|
|
7
|
+
{ value: 'below_slc_see', label: 'Below SLC/SEE' },
|
|
8
|
+
{ value: 'school', label: 'SLC/SEE' },
|
|
9
|
+
{ value: 'diploma', label: 'Diploma' },
|
|
10
|
+
{ value: 'intermediate', label: 'Intermediate (+2)' },
|
|
11
|
+
{ value: 'bachelor', label: "Bachelor's Degree" },
|
|
12
|
+
{ value: 'post_graduate_diploma', label: 'Post Graduate Diploma' },
|
|
13
|
+
{ value: 'master', label: "Master's Degree" },
|
|
14
|
+
{ value: 'mphil', label: 'MPhil' },
|
|
15
|
+
{ value: 'phd', label: 'PHD' },
|
|
16
|
+
];
|
|
17
|
+
export function CareerTestDetailsForm({ basePath, navigate, getInitialData, onSubmit, storageKeyUser = CAREER_TEST_USER_KEY, }) {
|
|
18
|
+
const [firstName, setFirstName] = React.useState('');
|
|
19
|
+
const [lastName, setLastName] = React.useState('');
|
|
20
|
+
const [email, setEmail] = React.useState('');
|
|
21
|
+
const [phone, setPhone] = React.useState('');
|
|
22
|
+
const [education, setEducation] = React.useState('');
|
|
23
|
+
const [submitting, setSubmitting] = React.useState(false);
|
|
24
|
+
const [errors, setErrors] = React.useState({});
|
|
25
|
+
React.useEffect(() => {
|
|
26
|
+
const load = async () => {
|
|
27
|
+
if (!getInitialData)
|
|
28
|
+
return;
|
|
29
|
+
const data = await getInitialData();
|
|
30
|
+
if (data?.firstName && !firstName)
|
|
31
|
+
setFirstName(data.firstName ?? '');
|
|
32
|
+
if (data?.lastName !== undefined && !lastName)
|
|
33
|
+
setLastName(data.lastName ?? '');
|
|
34
|
+
if (data?.email && !email)
|
|
35
|
+
setEmail(data.email ?? '');
|
|
36
|
+
if (data?.phone !== undefined && !phone)
|
|
37
|
+
setPhone(data.phone ?? '');
|
|
38
|
+
if (data?.education && !education)
|
|
39
|
+
setEducation(data.education ?? '');
|
|
40
|
+
};
|
|
41
|
+
load();
|
|
42
|
+
}, [getInitialData]);
|
|
43
|
+
const validate = () => {
|
|
44
|
+
const e = {};
|
|
45
|
+
if (!firstName.trim())
|
|
46
|
+
e.firstName = 'First name is required';
|
|
47
|
+
else if (firstName.trim().length > 50)
|
|
48
|
+
e.firstName = 'Max 50 characters';
|
|
49
|
+
if (lastName.trim().length > 50)
|
|
50
|
+
e.lastName = 'Max 50 characters';
|
|
51
|
+
const em = email.trim().toLowerCase();
|
|
52
|
+
if (!em)
|
|
53
|
+
e.email = 'Email is required';
|
|
54
|
+
else if (!/^[a-z0-9._%+-]+@gmail\.com$/i.test(em))
|
|
55
|
+
e.email = 'Please use a valid @gmail.com address';
|
|
56
|
+
if (phone.trim() && !/^[0-9+\-\s()]{6,20}$/.test(phone.trim()))
|
|
57
|
+
e.phone = 'Enter a valid phone (or leave blank)';
|
|
58
|
+
setErrors(e);
|
|
59
|
+
return Object.keys(e).length === 0;
|
|
60
|
+
};
|
|
61
|
+
const handleSubmit = async (ev) => {
|
|
62
|
+
ev.preventDefault();
|
|
63
|
+
if (!validate())
|
|
64
|
+
return;
|
|
65
|
+
setSubmitting(true);
|
|
66
|
+
const payload = {
|
|
67
|
+
firstName: firstName.trim(),
|
|
68
|
+
lastName: lastName.trim() || undefined,
|
|
69
|
+
email: email.trim().toLowerCase(),
|
|
70
|
+
phone: phone.trim() || undefined,
|
|
71
|
+
education: education.trim() || undefined,
|
|
72
|
+
};
|
|
73
|
+
try {
|
|
74
|
+
if (onSubmit)
|
|
75
|
+
await onSubmit(payload);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// ignore
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
if (typeof window !== 'undefined')
|
|
82
|
+
window.sessionStorage.setItem(storageKeyUser, JSON.stringify(payload));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// ignore
|
|
86
|
+
}
|
|
87
|
+
setSubmitting(false);
|
|
88
|
+
navigate(`${basePath}/start`);
|
|
89
|
+
};
|
|
90
|
+
return (_jsx("main", { className: "container mx-auto px-4 md:px-6 py-10 md:py-14", children: _jsxs("div", { className: "mx-auto max-w-3xl rounded-2xl border shadow-sm bg-white p-6 md:p-10 relative", children: [_jsx("div", { className: "pointer-events-none absolute inset-0 rounded-2xl ring-2 ring-[#4DA0E6]/80" }), _jsx("h1", { className: "text-center text-3xl md:text-4xl font-semibold text-[#2E7DBE]", children: "Let's Get Started" }), _jsxs("p", { className: "mt-2 text-center text-sm text-slate-600", children: ["We'll use this to personalize your report and show", _jsx("br", { className: "hidden md:block" }), " your name on the results page."] }), _jsxs("form", { onSubmit: handleSubmit, className: "mt-8 space-y-5", children: [_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-[12px] text-slate-600 mb-1", children: "First Name" }), _jsx("input", { type: "text", value: firstName, onChange: (e) => setFirstName(e.target.value), className: cn('w-full rounded-lg border px-3 py-2.5 text-sm outline-none', errors.firstName ? 'border-red-400 focus:ring-2 focus:ring-red-200' : 'border-slate-200 focus:ring-2 focus:ring-slate-200'), maxLength: 50, autoComplete: "given-name" }), errors.firstName && _jsx("p", { className: "mt-1 text-xs text-red-500", children: errors.firstName })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-[12px] text-slate-600 mb-1", children: "Last Name" }), _jsx("input", { type: "text", value: lastName, onChange: (e) => setLastName(e.target.value), className: cn('w-full rounded-lg border px-3 py-2.5 text-sm outline-none', errors.lastName ? 'border-red-400 focus:ring-2 focus:ring-red-200' : 'border-slate-200 focus:ring-2 focus:ring-slate-200'), maxLength: 50, autoComplete: "family-name" }), errors.lastName && _jsx("p", { className: "mt-1 text-xs text-red-500", children: errors.lastName })] })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-[12px] text-slate-600 mb-1", children: "Email" }), _jsx("input", { type: "email", value: email, onChange: (e) => setEmail(e.target.value), className: cn('w-full rounded-lg border px-3 py-2.5 text-sm outline-none', errors.email ? 'border-red-400 focus:ring-2 focus:ring-red-200' : 'border-slate-200 focus:ring-2 focus:ring-slate-200'), autoComplete: "email" }), errors.email && _jsx("p", { className: "mt-1 text-xs text-red-500", children: errors.email })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-[12px] text-slate-600 mb-1", children: "Phone Number" }), _jsx("input", { type: "tel", value: phone, onChange: (e) => setPhone(e.target.value), className: cn('w-full rounded-lg border px-3 py-2.5 text-sm outline-none', errors.phone ? 'border-red-400 focus:ring-2 focus:ring-red-200' : 'border-slate-200 focus:ring-2 focus:ring-slate-200'), placeholder: "Optional", autoComplete: "tel" }), errors.phone && _jsx("p", { className: "mt-1 text-xs text-red-500", children: errors.phone })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-[12px] text-slate-600 mb-1", children: "Education Level" }), _jsxs("select", { value: education, onChange: (e) => setEducation(e.target.value), className: cn('w-full rounded-lg border px-3 py-2.5 text-sm outline-none', errors.education ? 'border-red-400 focus:ring-2 focus:ring-red-200' : 'border-slate-200 focus:ring-2 focus:ring-slate-200'), children: [_jsx("option", { value: "", children: "Select education level" }), EDUCATION_OPTIONS.map((o) => (_jsx("option", { value: o.value, children: o.label }, o.value)))] }), errors.education && _jsx("p", { className: "mt-1 text-xs text-red-500", children: errors.education })] }), _jsx("p", { className: "text-center text-[11px] text-slate-500", children: "We won't share your details with employers without your permission." }), _jsx("div", { className: "flex justify-center pt-1", children: _jsx("button", { type: "submit", disabled: submitting, className: cn('w-full md:w-[280px] rounded-lg bg-[#4D97D9] px-5 py-3 text-white text-base font-semibold shadow-sm', submitting && 'opacity-70 cursor-not-allowed'), children: submitting ? 'Please wait…' : 'Start the Test' }) }), errors.form && _jsx("p", { className: "text-center text-sm text-red-500 mt-2", children: errors.form })] })] }) }));
|
|
91
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { TraitName } from '../utils/scoring';
|
|
2
|
+
export type StoredResults = {
|
|
3
|
+
overallPercentage: number;
|
|
4
|
+
frameworkPercentages?: {
|
|
5
|
+
BIGO: number;
|
|
6
|
+
RIASEC: number;
|
|
7
|
+
};
|
|
8
|
+
traitPercentages?: Partial<Record<TraitName, number>>;
|
|
9
|
+
};
|
|
10
|
+
export type CareerTestResultsPageProps = {
|
|
11
|
+
basePath: string;
|
|
12
|
+
imageBasePath: string;
|
|
13
|
+
/** Optional: save result to backend (e.g. POST /api/career-test) */
|
|
14
|
+
onSaveResult?: (payload: {
|
|
15
|
+
firstName?: string;
|
|
16
|
+
lastName?: string;
|
|
17
|
+
email?: string;
|
|
18
|
+
overallPct: number;
|
|
19
|
+
bigoPct: number;
|
|
20
|
+
riasecPct: number;
|
|
21
|
+
personaType: string;
|
|
22
|
+
}) => Promise<void>;
|
|
23
|
+
storageKeyResults?: string;
|
|
24
|
+
storageKeyUser?: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function CareerTestResultsPage({ basePath, imageBasePath, onSaveResult, storageKeyResults, storageKeyUser, }: CareerTestResultsPageProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=CareerTestResultsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CareerTestResultsPage.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/components/CareerTestResultsPage.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,MAAM,aAAa,GAAG;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,gBAAgB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,iBAA2C,EAC3C,cAAqC,GACtC,EAAE,0BAA0B,2CAsR5B"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, LabelList, CartesianGrid, } from 'recharts';
|
|
5
|
+
import { Button } from '../../components/ui/Button';
|
|
6
|
+
import { BIGO_LETTERS, RIASEC_LETTERS, BIGO_COMBOS, RIASEC_COMBOS, RIASEC_ROLES, pickPersonaBand, pickWorkStyleBand, } from '../constants/resultConstants';
|
|
7
|
+
import { CAREER_TEST_RESULTS_KEY, CAREER_TEST_USER_KEY } from '../constants/storageKeys';
|
|
8
|
+
export function CareerTestResultsPage({ basePath, imageBasePath, onSaveResult, storageKeyResults = CAREER_TEST_RESULTS_KEY, storageKeyUser = CAREER_TEST_USER_KEY, }) {
|
|
9
|
+
const [data, setData] = React.useState(null);
|
|
10
|
+
const [user, setUser] = React.useState(null);
|
|
11
|
+
const hasSavedRef = React.useRef(false);
|
|
12
|
+
React.useEffect(() => {
|
|
13
|
+
try {
|
|
14
|
+
const raw = typeof window !== 'undefined' ? window.sessionStorage.getItem(storageKeyResults) : null;
|
|
15
|
+
if (!raw)
|
|
16
|
+
return;
|
|
17
|
+
setData(JSON.parse(raw));
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
console.error('Failed to load careerTestResults:', e);
|
|
21
|
+
}
|
|
22
|
+
}, [storageKeyResults]);
|
|
23
|
+
React.useEffect(() => {
|
|
24
|
+
try {
|
|
25
|
+
const raw = typeof window !== 'undefined' ? window.sessionStorage.getItem(storageKeyUser) : null;
|
|
26
|
+
if (raw)
|
|
27
|
+
setUser(JSON.parse(raw));
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
console.error('Failed to load user from sessionStorage', e);
|
|
31
|
+
}
|
|
32
|
+
}, [storageKeyUser]);
|
|
33
|
+
const hasData = !!data;
|
|
34
|
+
const overall = Math.round(data?.overallPercentage ?? 0);
|
|
35
|
+
const persona = pickPersonaBand(overall);
|
|
36
|
+
const workStyleBand = pickWorkStyleBand(overall);
|
|
37
|
+
const bigoPct = Math.round(data?.frameworkPercentages?.BIGO ?? 0);
|
|
38
|
+
const riasecPct = Math.round(data?.frameworkPercentages?.RIASEC ?? 0);
|
|
39
|
+
const tp = data?.traitPercentages ?? {};
|
|
40
|
+
const bigoChartData = [
|
|
41
|
+
{ name: 'Openness', value: tp.Openness ?? 0 },
|
|
42
|
+
{ name: 'Conscientiousness', value: tp.Conscientiousness ?? 0 },
|
|
43
|
+
{ name: 'Extraversion', value: tp.Extraversion ?? 0 },
|
|
44
|
+
{ name: 'Agreeableness', value: tp.Agreeableness ?? 0 },
|
|
45
|
+
{ name: 'Neuroticism', value: tp.Neuroticism ?? 0 },
|
|
46
|
+
];
|
|
47
|
+
const riasecChartData = [
|
|
48
|
+
{ name: 'Realistic', value: tp.Realistic ?? 0 },
|
|
49
|
+
{ name: 'Investigative', value: tp.Investigative ?? 0 },
|
|
50
|
+
{ name: 'Artistic', value: tp.Artistic ?? 0 },
|
|
51
|
+
{ name: 'Social', value: tp.Social ?? 0 },
|
|
52
|
+
{ name: 'Enterprising', value: tp.Enterprising ?? 0 },
|
|
53
|
+
{ name: 'Conventional', value: tp.Conventional ?? 0 },
|
|
54
|
+
];
|
|
55
|
+
const top3Bigo = [...bigoChartData].sort((a, b) => b.value - a.value).slice(0, 3);
|
|
56
|
+
const top3BigoLetters = top3Bigo.map((t) => BIGO_LETTERS[t.name]).filter((x) => !!x);
|
|
57
|
+
const bigoComboDisplay = top3BigoLetters.length === 3 ? top3BigoLetters.join(' + ') : '—';
|
|
58
|
+
const bigoComboKey = top3BigoLetters.length === 3 ? [...top3BigoLetters].sort().join('') : '';
|
|
59
|
+
const bigoComboDescription = (bigoComboKey && BIGO_COMBOS[bigoComboKey]) || "Your top Big-O traits combine into a unique working style. As you complete more projects and reflect on what energizes you, this pattern will become even clearer.";
|
|
60
|
+
const top3Riasec = [...riasecChartData].sort((a, b) => b.value - a.value).slice(0, 3);
|
|
61
|
+
const top3RiasecLetters = top3Riasec.map((t) => RIASEC_LETTERS[t.name]).filter((x) => !!x);
|
|
62
|
+
const riasecComboDisplay = top3RiasecLetters.length === 3 ? top3RiasecLetters.join(' + ') : '—';
|
|
63
|
+
const riasecComboKey = top3RiasecLetters.length === 3 ? [...top3RiasecLetters].sort().join('') : '';
|
|
64
|
+
const riasecComboDescription = (riasecComboKey && RIASEC_COMBOS[riasecComboKey]) || "Your top RIASEC interests form a starting point for exploring roles and environments where you'll feel naturally engaged.";
|
|
65
|
+
const matchedRoles = (riasecComboKey && RIASEC_ROLES[riasecComboKey]) || [];
|
|
66
|
+
React.useEffect(() => {
|
|
67
|
+
if (!data || !user || hasSavedRef.current || !onSaveResult)
|
|
68
|
+
return;
|
|
69
|
+
const saveResult = async () => {
|
|
70
|
+
try {
|
|
71
|
+
await onSaveResult({
|
|
72
|
+
firstName: user.firstName,
|
|
73
|
+
lastName: user.lastName,
|
|
74
|
+
email: user.email,
|
|
75
|
+
overallPct: overall,
|
|
76
|
+
bigoPct,
|
|
77
|
+
riasecPct,
|
|
78
|
+
personaType: persona.title,
|
|
79
|
+
});
|
|
80
|
+
hasSavedRef.current = true;
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
console.error('Failed to save test result:', e);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
saveResult();
|
|
87
|
+
}, [data, user, overall, bigoPct, riasecPct, persona.title, onSaveResult]);
|
|
88
|
+
const handleDownloadPdf = () => {
|
|
89
|
+
if (typeof window !== 'undefined')
|
|
90
|
+
window.print();
|
|
91
|
+
};
|
|
92
|
+
const handleShareLink = async () => {
|
|
93
|
+
if (typeof window === 'undefined')
|
|
94
|
+
return;
|
|
95
|
+
const url = window.location.href;
|
|
96
|
+
if (navigator.share) {
|
|
97
|
+
try {
|
|
98
|
+
await navigator.share({ title: 'My Career Fit Results', text: 'Here are my BIG-O + RIASEC career fit results.', url });
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
console.error('Share failed:', err);
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (navigator.clipboard) {
|
|
106
|
+
try {
|
|
107
|
+
await navigator.clipboard.writeText(url);
|
|
108
|
+
alert('Link copied to clipboard!');
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
alert(`Copy this link: ${url}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
alert(`Copy this link: ${url}`);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const personaImageSrc = `${imageBasePath}/${persona.image}`;
|
|
119
|
+
const workStyleImageSrc = `${imageBasePath}/${workStyleBand.image}`;
|
|
120
|
+
return (_jsxs("main", { className: "container mx-auto px-4 md:px-6 py-6 md:py-10", children: [_jsxs("div", { className: "flex items-end justify-end gap-4 text-xs text-[#155177]", children: [_jsx("button", { type: "button", onClick: handleDownloadPdf, className: "hover:underline", children: "Download PDF" }), _jsx("button", { type: "button", onClick: handleShareLink, className: "hover:underline", children: "Share Link" })] }), !hasData ? (_jsxs("section", { className: "mt-6 max-w-3xl", children: [_jsx("h1", { className: "text-2xl font-semibold text-[#155177]", children: "Your Results" }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "We couldn't find your test data in this session. Please take the test again." }), _jsx("div", { className: "mt-4", children: _jsx(Button, { asChild: true, children: _jsx("a", { href: `${basePath}/start`, children: "Retake the Test" }) }) })] })) : (_jsxs(_Fragment, { children: [_jsxs("section", { className: "mt-3 grid md:grid-cols-[1fr_180px] gap-4", children: [_jsxs("div", { className: "rounded-2xl border bg-white px-5 py-5 shadow-sm", children: [_jsxs("h1", { className: "text-2xl md:text-3xl font-semibold text-[#155177]", children: ["Hello, ", _jsx("span", { className: "opacity-70", children: user?.firstName ? user.firstName : 'there' })] }), _jsx("p", { className: "mt-1 text-[11px] text-muted-foreground", children: "Based on BIG-O + RIASEC, here's how you work and where you'll thrive." })] }), _jsxs("div", { className: "rounded-2xl border bg-white px-6 py-5 shadow-sm text-center", children: [_jsx("p", { className: "text-[11px] text-muted-foreground font-medium", children: "Overall Match" }), _jsxs("p", { className: "mt-1 text-2xl md:text-3xl font-bold", children: [overall, "%"] })] })] }), _jsxs("section", { className: "mt-6 rounded-2xl overflow-hidden border shadow-sm", children: [_jsxs("div", { className: "relative bg-[#24486a] text-white px-6 md:px-10 pt-10 pb-20", children: [_jsxs("div", { className: "grid md:grid-cols-5 gap-10 items-center", children: [_jsx("div", { className: "md:col-span-2 flex justify-end relative", children: _jsx("div", { className: "relative h-44 w-44 md:h-56 md:w-56 drop-shadow-2xl translate-x-10 md:translate-x-12", children: _jsx("img", { src: personaImageSrc, alt: persona.title, className: "w-full h-full object-contain" }) }) }), _jsxs("div", { className: "md:col-span-3", children: [_jsx("p", { className: "text-xs md:text-sm opacity-80", children: "Your Personality Type is:" }), _jsx("h2", { className: "mt-1 text-3xl md:text-4xl font-semibold text-[#2697D4]", children: persona.title }), _jsx("p", { className: "mt-3 text-sm md:text-base font-medium", children: persona.subtitle })] })] }), _jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 h-16 text-white", children: _jsx("svg", { viewBox: "0 0 1440 320", preserveAspectRatio: "none", className: "w-full h-full", children: _jsx("path", { fill: "#ffffff", d: "M0,224L48,213.3C96,203,192,181,288,165.3C384,149,480,139,576,149.3C672,160,768,192,864,208C960,224,1056,224,1152,213.3C1248,203,1344,181,1392,170.7L1440,160L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z" }) }) })] }), _jsxs("div", { className: "bg-white px-6 md:px-10 pb-8 pt-2", children: [_jsx("p", { className: "text-sm md:text-base leading-6 text-slate-700 whitespace-pre-line", children: persona.description }), _jsxs("div", { className: "mt-5", children: [_jsx("h4", { className: "text-sm md:text-base font-semibold text-[#155177]", children: "Positive Attributes" }), _jsx("ul", { className: "mt-2 list-disc pl-5 text-sm md:text-base text-slate-700 space-y-1", children: persona.positiveAttributes.map((attr) => (_jsx("li", { children: attr }, attr))) })] })] })] }), _jsxs("section", { className: "mt-8", children: [_jsx("h3", { className: "text-center text-[#155177] text-lg md:text-xl font-semibold", children: "BIG-O Traits" }), _jsx("div", { className: "mt-3 rounded-xl border bg-white p-4 shadow-sm", children: _jsx("div", { className: "h-72 w-full", children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(BarChart, { data: bigoChartData, margin: { top: 20, right: 20, left: 0, bottom: 40 }, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3", vertical: false }), _jsx(XAxis, { dataKey: "name", interval: 0, tick: { fontSize: 11 } }), _jsx(YAxis, { tick: { fontSize: 11 }, domain: [0, 100], tickFormatter: (v) => `${v}%` }), _jsx(Tooltip, { formatter: (v) => `${v}%` }), _jsx(Bar, { dataKey: "value", radius: [6, 6, 0, 0], fill: "#4D7CF3", children: _jsx(LabelList, { dataKey: "value", position: "top", formatter: (label) => (label != null ? `${label}%` : ''), style: { fontSize: 11 } }) })] }) }) }) }), _jsxs("div", { className: "mt-3 grid md:grid-cols-2 gap-4", children: [_jsxs("div", { className: "rounded-xl border bg-white p-4 shadow-sm", children: [_jsxs("p", { className: "text-xs font-semibold text-[#155177]", children: ["Top 3 Big-O: ", _jsx("span", { className: "font-bold", children: bigoComboDisplay || '—' })] }), _jsx("ul", { className: "mt-2 ml-4 list-disc text-xs text-slate-700 space-y-1", children: top3Bigo.map((t) => (_jsx("li", { children: t.name }, t.name))) })] }), _jsx("div", { className: "rounded-xl border bg-white p-4 shadow-sm", children: _jsx("p", { className: "text-xs text-muted-foreground whitespace-pre-line", children: bigoComboDescription }) })] })] }), _jsxs("section", { className: "mt-8", children: [_jsx("h3", { className: "text-center text-[#155177] text-lg md:text-xl font-semibold", children: "RIASEC Traits" }), _jsx("div", { className: "mt-3 rounded-xl border bg-white p-4 shadow-sm", children: _jsx("div", { className: "h-72 w-full", children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(BarChart, { data: riasecChartData, margin: { top: 20, right: 20, left: 0, bottom: 40 }, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3", vertical: false }), _jsx(XAxis, { dataKey: "name", interval: 0, tick: { fontSize: 11 } }), _jsx(YAxis, { tick: { fontSize: 11 }, domain: [0, 100], tickFormatter: (v) => `${v}%` }), _jsx(Tooltip, { formatter: (v) => `${v}%` }), _jsx(Bar, { dataKey: "value", radius: [6, 6, 0, 0], fill: "#4D7CF3", children: _jsx(LabelList, { dataKey: "value", position: "top", formatter: (label) => (label != null ? `${label}%` : ''), style: { fontSize: 11 } }) })] }) }) }) }), _jsxs("div", { className: "mt-3 grid md:grid-cols-2 gap-4", children: [_jsxs("div", { className: "rounded-xl border bg-white p-4 shadow-sm", children: [_jsxs("p", { className: "text-xs font-semibold text-[#155177]", children: ["Top 3 RIASEC: ", _jsx("span", { className: "font-bold", children: riasecComboDisplay || '—' })] }), _jsx("ul", { className: "mt-2 ml-4 list-disc text-xs text-slate-700 space-y-1", children: top3Riasec.map((t) => (_jsx("li", { children: t.name }, t.name))) })] }), _jsx("div", { className: "rounded-xl border bg-white p-4 shadow-sm", children: _jsx("p", { className: "text-xs text-muted-foreground whitespace-pre-line", children: riasecComboDescription }) })] })] }), _jsx("section", { className: "mt-8 rounded-2xl border bg-white shadow-sm overflow-hidden", children: _jsxs("div", { className: "grid md:grid-cols-[220px_1fr] gap-0", children: [_jsx("div", { className: "p-6 md:p-8 flex items-center justify-center", children: _jsx("div", { className: "relative h-32 w-32 md:h-40 md:w-40", children: _jsx("img", { src: workStyleImageSrc, alt: "Work-style personality", className: "w-full h-full object-contain" }) }) }), _jsxs("div", { className: "p-6 md:p-8", children: [_jsx("h4", { className: "text-[#2697D4] text-xl md:text-2xl font-semibold", children: "Work-Style Personality" }), _jsx("p", { className: "mt-3 text-sm md:text-base text-slate-700 whitespace-pre-line leading-6", children: workStyleBand.text })] })] }) }), _jsxs("section", { className: "mt-8", children: [_jsxs("h4", { className: "text-[#155177] font-semibold text-lg md:text-xl", children: ["Matched Roles For ", riasecComboDisplay || '—'] }), _jsx("div", { className: "mt-3 grid sm:grid-cols-2 lg:grid-cols-3 gap-3", children: matchedRoles.length === 0 ? (_jsx("p", { className: "text-xs text-muted-foreground", children: "Once you complete the full assessment, you'll see matched role suggestions here." })) : (matchedRoles.map((role) => (_jsx("div", { className: "rounded-full border bg-white px-4 py-2 text-xs shadow-sm text-slate-700 text-center", children: role }, role)))) })] }), _jsx("div", { className: "mt-10 flex items-center justify-center gap-3", children: _jsx(Button, { variant: "outline", asChild: true, children: _jsx("a", { href: `${basePath}/start`, children: "Retake Test" }) }) })] }))] }));
|
|
121
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type CareerTestStartProps = {
|
|
2
|
+
basePath: string;
|
|
3
|
+
navigate: (path: string) => void;
|
|
4
|
+
storageKeyResults?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function CareerTestStart({ basePath, navigate, storageKeyResults }: CareerTestStartProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=CareerTestStart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CareerTestStart.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/components/CareerTestStart.tsx"],"names":[],"mappings":"AA4BA,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAsDF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAA2C,EAAE,EAAE,oBAAoB,2CAmGxH"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { ChevronRight } from 'lucide-react';
|
|
5
|
+
import { Button } from '../../components/ui/Button';
|
|
6
|
+
import { QUESTIONS_BY_SECTION } from '../data/questions';
|
|
7
|
+
import { computeOverall } from '../utils/scoring';
|
|
8
|
+
import { CAREER_TEST_RESULTS_KEY } from '../constants/storageKeys';
|
|
9
|
+
import { QUESTIONS } from '../data/questions';
|
|
10
|
+
const TOTAL_SECTIONS = 6;
|
|
11
|
+
const NAV_OFFSET = 96;
|
|
12
|
+
const SCALE = [
|
|
13
|
+
{ key: 1, label: 'Strongly\nDisagree', ring: 'ring-red-500' },
|
|
14
|
+
{ key: 2, label: 'Disagree', ring: 'ring-red-400' },
|
|
15
|
+
{ key: 3, label: 'Neutral', ring: 'ring-blue-400' },
|
|
16
|
+
{ key: 4, label: 'Agree', ring: 'ring-green-400' },
|
|
17
|
+
{ key: 5, label: 'Strongly\nAgree', ring: 'ring-green-500' },
|
|
18
|
+
];
|
|
19
|
+
function smoothScrollToEl(el) {
|
|
20
|
+
if (!el)
|
|
21
|
+
return;
|
|
22
|
+
const top = el.getBoundingClientRect().top + window.pageYOffset - NAV_OFFSET;
|
|
23
|
+
window.scrollTo({ top, behavior: 'smooth' });
|
|
24
|
+
}
|
|
25
|
+
function QuestionRow({ q, value, onChange, setRef, }) {
|
|
26
|
+
return (_jsxs("div", { className: "text-center", ref: setRef, children: [_jsx("h3", { className: "text-xl md:text-2xl font-semibold", children: q.prompt }), q.type === 'likert' ? (_jsx("div", { className: "mt-6 grid grid-cols-5 gap-6 md:gap-8 place-items-center", children: SCALE.map((opt) => {
|
|
27
|
+
const active = value === opt.key;
|
|
28
|
+
return (_jsxs("button", { type: "button", onClick: () => onChange(opt.key), className: "group flex flex-col items-center gap-2 focus:outline-none", children: [_jsx("span", { className: ['h-9 w-9 rounded-full border-2 bg-white ring-2 transition', active ? 'border-current ring-current' : `border-transparent ${opt.ring}`].join(' ') }), _jsx("span", { className: "whitespace-pre-line text-[10px] text-muted-foreground text-center leading-tight", children: opt.label })] }, opt.key));
|
|
29
|
+
}) })) : (_jsx("div", { className: "mt-6 flex items-center justify-center gap-4", children: ['yes', 'no'].map((opt) => (_jsx(Button, { type: "button", variant: value === opt ? 'default' : 'outline', onClick: () => onChange(opt), className: "min-w-[90px]", children: opt.toUpperCase() }, opt))) }))] }));
|
|
30
|
+
}
|
|
31
|
+
export function CareerTestStart({ basePath, navigate, storageKeyResults = CAREER_TEST_RESULTS_KEY }) {
|
|
32
|
+
const [section, setSection] = React.useState(1);
|
|
33
|
+
const [answers, setAnswers] = React.useState({});
|
|
34
|
+
const questionRefs = React.useRef([]);
|
|
35
|
+
questionRefs.current = [];
|
|
36
|
+
const list = React.useMemo(() => QUESTIONS_BY_SECTION[section], [section]);
|
|
37
|
+
const progressPct = (section / TOTAL_SECTIONS) * 100;
|
|
38
|
+
React.useEffect(() => {
|
|
39
|
+
const t = setTimeout(() => smoothScrollToEl(questionRefs.current[0]), 100);
|
|
40
|
+
return () => clearTimeout(t);
|
|
41
|
+
}, [section]);
|
|
42
|
+
const selectAnswer = (qIndex, q, value) => {
|
|
43
|
+
setAnswers((prev) => ({ ...prev, [q.id]: value }));
|
|
44
|
+
const nextIdx = qIndex + 1;
|
|
45
|
+
if (nextIdx < list.length) {
|
|
46
|
+
requestAnimationFrame(() => smoothScrollToEl(questionRefs.current[nextIdx]));
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const fillUnansweredWithDefaults = () => {
|
|
50
|
+
setAnswers((prev) => {
|
|
51
|
+
const updated = { ...prev };
|
|
52
|
+
for (const q of list) {
|
|
53
|
+
if (updated[q.id] === undefined) {
|
|
54
|
+
updated[q.id] = q.type === 'likert' ? 3 : 'no';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return updated;
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const goPrev = () => setSection((s) => Math.max(1, s - 1));
|
|
61
|
+
const goNext = () => {
|
|
62
|
+
fillUnansweredWithDefaults();
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
setSection((s) => Math.min(TOTAL_SECTIONS, s + 1));
|
|
65
|
+
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
66
|
+
}, 150);
|
|
67
|
+
};
|
|
68
|
+
const seeResults = () => {
|
|
69
|
+
const filled = { ...answers };
|
|
70
|
+
for (const q of list) {
|
|
71
|
+
if (filled[q.id] === undefined) {
|
|
72
|
+
filled[q.id] = q.type === 'likert' ? 3 : 'no';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
setAnswers(filled);
|
|
76
|
+
const result = computeOverall(QUESTIONS, filled);
|
|
77
|
+
try {
|
|
78
|
+
if (typeof window !== 'undefined')
|
|
79
|
+
window.sessionStorage.setItem(storageKeyResults, JSON.stringify(result));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// ignore
|
|
83
|
+
}
|
|
84
|
+
navigate(`${basePath}/results`);
|
|
85
|
+
};
|
|
86
|
+
return (_jsxs("main", { className: "container mx-auto px-6 py-10", children: [_jsxs("div", { className: "mx-auto max-w-3xl rounded-xl border bg-blue-50/60 p-3 shadow-sm", children: [_jsxs("div", { className: "text-[11px] font-semibold text-center text-gray-700 tracking-wide", children: ["SECTION ", section, " OF ", TOTAL_SECTIONS] }), _jsx("div", { className: "mt-2 h-1.5 w-full rounded-full bg-blue-100", children: _jsx("div", { className: "h-1.5 rounded-full bg-[#155177] transition-all", style: { width: `${progressPct}%` } }) })] }), _jsx("div", { className: "mt-10 max-w-3xl mx-auto space-y-12", children: list.map((q, idx) => (_jsx(QuestionRow, { q: q, value: answers[q.id], onChange: (val) => selectAnswer(idx, q, val), setRef: (el) => (questionRefs.current[idx] = el) }, q.id))) }), _jsxs("div", { className: "mt-12 max-w-3xl mx-auto flex items-center justify-between", children: [_jsx(Button, { variant: "outline", className: "min-w-[150px]", onClick: goPrev, disabled: section <= 1, children: "Previous Step" }), section < TOTAL_SECTIONS ? (_jsxs(Button, { className: "min-w-[150px]", onClick: goNext, children: ["Next", _jsx(ChevronRight, { className: "ml-2 h-4 w-4" })] })) : (_jsxs(Button, { className: "min-w-[170px]", onClick: seeResults, children: ["See my result", _jsx(ChevronRight, { className: "ml-2 h-4 w-4" })] }))] })] }));
|
|
87
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result content for career personality test: letter maps, combo descriptions, roles, bands.
|
|
3
|
+
* Image paths are filename-only; prepend imageBasePath in the Results component.
|
|
4
|
+
*/
|
|
5
|
+
import type { TraitName } from '../utils/scoring';
|
|
6
|
+
export declare const BIGO_LETTERS: Partial<Record<TraitName, 'O' | 'C' | 'E' | 'A' | 'N'>>;
|
|
7
|
+
export declare const RIASEC_LETTERS: Partial<Record<TraitName, 'R' | 'I' | 'A' | 'S' | 'E' | 'C'>>;
|
|
8
|
+
export declare const BIGO_COMBOS: Record<string, string>;
|
|
9
|
+
export declare const RIASEC_COMBOS: Record<string, string>;
|
|
10
|
+
export type WorkStyleBand = {
|
|
11
|
+
min: number;
|
|
12
|
+
max: number;
|
|
13
|
+
text: string;
|
|
14
|
+
image: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const WORK_STYLE_BANDS: WorkStyleBand[];
|
|
17
|
+
export declare function pickWorkStyleBand(overallPct: number): WorkStyleBand;
|
|
18
|
+
export type PersonaBand = {
|
|
19
|
+
key: 'explorer' | 'builder' | 'achiever' | 'catalyst';
|
|
20
|
+
label: string;
|
|
21
|
+
title: string;
|
|
22
|
+
subtitle: string;
|
|
23
|
+
description: string;
|
|
24
|
+
image: string;
|
|
25
|
+
positiveAttributes: string[];
|
|
26
|
+
};
|
|
27
|
+
export declare function pickPersonaBand(overallPct: number): PersonaBand;
|
|
28
|
+
export declare const RIASEC_ROLES: Record<string, string[]>;
|
|
29
|
+
//# sourceMappingURL=resultConstants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resultConstants.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/constants/resultConstants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAMhF,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAOxF,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAW9C,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqBhD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAK3C,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAGnE;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC;AASF,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAI/D;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAqBjD,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export const BIGO_LETTERS = {
|
|
2
|
+
Openness: 'O',
|
|
3
|
+
Conscientiousness: 'C',
|
|
4
|
+
Extraversion: 'E',
|
|
5
|
+
Agreeableness: 'A',
|
|
6
|
+
Neuroticism: 'N',
|
|
7
|
+
};
|
|
8
|
+
export const RIASEC_LETTERS = {
|
|
9
|
+
Realistic: 'R',
|
|
10
|
+
Investigative: 'I',
|
|
11
|
+
Artistic: 'A',
|
|
12
|
+
Social: 'S',
|
|
13
|
+
Enterprising: 'E',
|
|
14
|
+
Conventional: 'C',
|
|
15
|
+
};
|
|
16
|
+
export const BIGO_COMBOS = {
|
|
17
|
+
CEO: "You're an innovative doer who plans well and brings people along. You spot new possibilities, organize the work, and communicate with energy. Stakeholder-heavy projects that need both creativity and delivery discipline are your sweet spot.",
|
|
18
|
+
ACO: "You're a thoughtful builder who protects both quality and harmony. You manage cross-functional work with care, balancing fresh ideas with reliable execution and a steady, collaborative tone. Teams trust you to make change feel safe.",
|
|
19
|
+
CNO: "You're a calm innovator with discipline. Ambiguity doesn't rattle you; you set a plan, test options, and ship reliably. You're well suited to strategic initiatives where exploration and delivery must coexist without drama.",
|
|
20
|
+
AEO: "You're a creative collaborator who energizes groups. You co-create solutions, keep user needs central, and communicate ideas with warmth. Workshops, product discovery, and public-facing creative projects feel natural.",
|
|
21
|
+
ENO: "You're a visionary communicator who stays composed under pressure. Pitching, iterating, and guiding teams through change come easily. You help others see the future and feel confident stepping into it.",
|
|
22
|
+
ANO: "You're an empathetic innovator. You bring original ideas with a steady, supportive presence, making you ideal for change programs, design research, and transformation work where people need reassurance.",
|
|
23
|
+
ACE: "You're an organized people-driver. You set structure, motivate teams, and keep standards high without losing cohesion. You excel in delivery leadership, onboarding, enablement, and client implementations.",
|
|
24
|
+
CEN: "You're a reliable leader under pressure. You coordinate stakeholders, manage deadlines, and land outcomes when stakes are high. Crisis-proof projects, escalations, and go-lives benefit from your steadiness.",
|
|
25
|
+
ACN: "You're a steady, trustworthy teammate who keeps quality and relationships strong. Compliance, onboarding, account management, and service operations suit your patient, consistent delivery style.",
|
|
26
|
+
AEN: "You're a warm, resilient influencer. You build rapport quickly, stay balanced with feedback, and move people toward decisions. Growth, partnerships, customer success, and advocacy roles match your social energy and calm.",
|
|
27
|
+
};
|
|
28
|
+
export const RIASEC_COMBOS = {
|
|
29
|
+
AIR: "You're a hands-on maker with analytical depth and creative flair. You like to move from data and insight to something you can touch: prototypes, tools, installations, working models. You test quickly, refine based on evidence and care about finish and usability.\n\nRoles that let you think, build and beautify in tight cycles—labs, product workshops, creative tech—bring out your best.",
|
|
30
|
+
IRS: "You solve real-world problems with a mix of practicality, evidence, and care for people. You enjoy translating analysis into help that users can feel, such as training sessions, field support, troubleshooting or service workflows that actually work on the ground.\n\nWork that connects data to human outcomes in health, education or tech ops suits your temperament.",
|
|
31
|
+
EIR: "You're an action-oriented analyst who turns opportunities into results. You like testing hypotheses in the wild, cutting through noise and driving projects to measurable impact. You're comfortable making informed bets and adjusting fast.\n\nRoles at the intersection of analysis, field execution and business outcomes—process improvement, growth ops, technical PM—fit you naturally.",
|
|
32
|
+
CIR: "You blend technical practicality with standards and systems. Consistency, safety, and quality matter to you and you enjoy working where measurements and methods keep everyone aligned.\n\nManufacturing, QA, compliance, process engineering, or documentation-heavy environments let you improve reliability without losing sight of the real world.",
|
|
33
|
+
ARS: "You're a maker who creates experiences for people. Workshops, learning labs, community events, and experiential design are your sweet spot.\n\nYou enjoy crafting tangible outputs that teach, guide or inspire, blending a human touch with creativity and a bias for action. You shine where empathy and making meet.",
|
|
34
|
+
AER: "You build, stage and sell the vision. You like showing what's possible with compelling demos, pilots, and creative production and you're energized by moving others to act.\n\nYou're a natural in product showcases, creative ops and go-to-market experiments where prototypes, storytelling and decisive execution come together.",
|
|
35
|
+
ACR: "You're a detail-driven craftsperson who respects structure. You enjoy creative work that requires precision, standards, and reliable delivery: production design, print/packaging, asset libraries, brand systems or studio operations.\n\nYour strength is making creative output repeatable, accurate and on time.",
|
|
36
|
+
ERS: "You're a people-centric operator who gets things done on the ground. You coordinate vendors, teams and schedules. You keep services running and customers satisfied.\n\nSite coordination, service operations leadership and event or retail ops are strong fits.",
|
|
37
|
+
CRS: "You're a supportive organizer with a practical backbone. You like facilities, logistics, and documentation that make everyone else's work smoother. Reliability and consistency are your calling cards.\n\nRoles in office admin, campus/clinic operations, inventory or service scheduling let you deliver value every day.",
|
|
38
|
+
CER: "You're an operational leader who loves structure and momentum. You move resources, manage risk and raise throughput. You're steady under load and keep the system humming.\n\nSupply chain, warehouse/plant leadership, shift management or process excellence teams will feel like home.",
|
|
39
|
+
AIS: "You translate complex ideas into clear, human stories. You're good at empathizing with learners, customers or stakeholders and guiding them through research-backed recommendations.\n\nUX research, L&D content, data storytelling, and client education are strong lanes—anywhere clarity and empathy meet evidence.",
|
|
40
|
+
AEI: "You pair discovery with creativity and ownership. You start with insight, test concepts, and drive toward outcomes fast. Experiments and iteration excite you; you enjoy aligning people around a clear \"why.\"\n\nProduct discovery, growth strategy, and innovation consulting roles match your cadence.",
|
|
41
|
+
ACI: "You're an analytical creator who values clarity and standards. You enjoy research documentation, information architecture, and content or knowledge systems, especially in regulated settings.\n\nYou make complex things understandable and traceable so teams can create confidently within guardrails.",
|
|
42
|
+
EIS: "You're an influential problem-solver. You build evidence, consult with stakeholders, and secure decisions that move the work forward.\n\nPre-sales engineering, solutions consulting or strategy roles that combine advisory, analysis, and persuasion fit you well.",
|
|
43
|
+
CIS: "You're a patient, precise helper who thrives in structured service. Academic/admin support, compliance training, records/data stewardship, and policy rollout suit your steady approach.\n\nYou like getting details right so people can rely on the system.",
|
|
44
|
+
CEI: "You're a results-driven analyst with process discipline. You enjoy tracking performance, building dashboards, and enforcing standards that improve outcomes.\n\nFinance/BI, PMO, governance, and performance operations let you pair rigor with impact.",
|
|
45
|
+
AES: "You use storytelling to create people impact and influence.\n\nYou enjoy brand/community work, CX, enablement, and training-led marketing—anywhere you can craft a narrative that mobilizes teams and customers around change.",
|
|
46
|
+
ACS: "You're a human-centered organizer who lands creative work with structure.\n\nProgram coordination, L&D ops, editorial planning and campaign operations benefit from your ability to turn good ideas into consistent delivery.",
|
|
47
|
+
ACE: "You're a creative strategist who ships on time. You balance imagination with production realism, making you ideal for campaign/production management, brand ops and content systems where deadlines matter.",
|
|
48
|
+
CES: "You're a service-oriented leader with structure. You keep standards high while advocating for people.\n\nCustomer success leadership, HR programs, service quality, and policy implementation play to your strengths.",
|
|
49
|
+
};
|
|
50
|
+
export const WORK_STYLE_BANDS = [
|
|
51
|
+
{ min: 0, max: 39, text: "Your answers suggest you're still clarifying what feels natural at work. You tend to do best when expectations are clear, tasks are broken into steps, and feedback is frequent. Social energy and high-pressure contexts may feel draining right now, so smaller, scoped wins help you build confidence and discover what truly motivates you.\n\nThink of this as an exploration phase: try short projects in your strongest interest area and notice which activities leave you energized vs. exhausted.", image: 'The_Explorer_work_personality-removebg-preview.png' },
|
|
52
|
+
{ min: 40, max: 59, text: "You show a balanced profile with a few emerging strengths. Structure and clear goals help you stay on track, while purposeful interactions (not constant meetings) keep you engaged. You can collaborate well when roles are defined, and you handle pressure best when routines and check-ins are in place.\n\nAs you lean into your top interests and trim work tied to your lowest codes, your confidence and momentum grow quickly.", image: 'The_builder_work_personality-removebg-preview.png' },
|
|
53
|
+
{ min: 60, max: 79, text: "You have a clear sense of how you like to work and where you add value. You're comfortable taking a problem from investigation to delivery, following through on commitments, and collaborating with the right partners.\n\nUnder typical pressure you remain steady, and you thrive when your day mixes focus time with purposeful collaboration. Your strengths show up consistently in how you learn, plan, communicate, and improve results over each cycle.", image: 'The_achiever_work_personality-removebg-preview.png' },
|
|
54
|
+
{ min: 80, max: 100, text: "You have a clear sense of how you like to work and where you add value. You're comfortable taking a problem from investigation to delivery, following through on commitments, and collaborating with the right partners.\n\nUnder typical pressure you remain steady, and you thrive when your day mixes focus time with purposeful collaboration. Your strengths show up consistently in how you learn, plan, communicate, and improve results over each cycle.", image: 'the_catalyst_work_personality-removebg-preview.png' },
|
|
55
|
+
];
|
|
56
|
+
export function pickWorkStyleBand(overallPct) {
|
|
57
|
+
const clamped = Math.max(0, Math.min(100, overallPct));
|
|
58
|
+
return WORK_STYLE_BANDS.find(({ min, max }) => clamped >= min && clamped <= max) ?? WORK_STYLE_BANDS[0];
|
|
59
|
+
}
|
|
60
|
+
const PERSONA_BANDS = [
|
|
61
|
+
{ min: 0, max: 39, band: { key: 'explorer', label: 'Low Match', title: 'The Explorer', subtitle: 'still exploring; needs structure and feedback', description: "You are in a stage where you are still discovering what kind of work environment, responsibilities, and collaboration style suit you best. Your profile reflects someone who has broad curiosity but has not yet anchored themselves to a clear direction and that is completely normal at this stage of growth. You tend to do your best when tasks are structured, expectations are clearly defined, and guidance is available as you navigate new challenges. You learn well through experimentation and short, simple tasks that allow you to understand what energizes you and what drains you.\n\nThis is a chapter of exploration, reflection, and self-awareness. You grow quickest when you receive steady feedback and have opportunities to try different types of work. Instead of locking yourself into one path too soon, this is your time to observe how you naturally respond to different roles, team dynamics, and responsibilities. Over time, these small experiences will help you define your strengths, make better decisions about your future roles, and build confidence in what truly aligns with your personality and long-term goals.", image: 'The_Explorer-removebg-preview.png', positiveAttributes: ['Curious by nature — you show a genuine interest in understanding how things work and enjoy discovering new options before choosing a path.', 'Eager to learn — you absorb new information quickly and are open to experimenting with unfamiliar tasks or tools.', 'Flexible mindset — you adapt easily when things change, and you\'re comfortable exploring alternatives when something doesn\'t feel right.', 'Open to feedback — you respond well to guidance, and feedback tends to motivate you rather than discourage you.', 'Naturally observant — you notice patterns, team dynamics, and small details that others may overlook, helping you understand what environment you feel most comfortable in.', 'Willing to try before you commit — you approach opportunities with a healthy mindset, wanting to experience something first before deciding.', 'Growth-oriented personality — you show signs that you learn quickly from mistakes and turn them into stepping stones.', 'Low ego, high adaptability — you\'re not afraid to start small, ask questions, and improve through exploration.', 'Independent thinker — you like to form your own opinions rather than following assumptions.', 'Resilient beginner — even if something feels unclear or unfamiliar, you bounce back and try again.'] } },
|
|
62
|
+
{ min: 40, max: 59, band: { key: 'builder', label: 'Moderate Match', title: 'The Builder', subtitle: 'partial alignment; learning clarity through projects', description: "Your profile shows partial but meaningful alignment with the types of work you may be considering. You have a growing understanding of how you like to work, think, plan, and collaborate but there is still room for clarity and refinement. Builders perform especially well when projects have defined priorities, practical timelines, and consistent feedback. You tend to deliver strong results when the scope is focused and when you can lean into your natural strengths.\n\nThis stage of your development is all about sharpening direction: identifying the tasks that feel natural, recognising patterns in what motivates you, and understanding what drains your energy. With the right environment — one that sets realistic goals and supports you through weekly or bi-weekly check-ins — you quickly transform your potential into concrete results. You are in a phase where a few well-chosen projects can help you achieve major clarity about where you fit best and how you can contribute with confidence.", image: 'The_Builder-removebg-preview.png', positiveAttributes: ['Strong sense of responsibility — once expectations are clear, you deliver consistently and reliably.', 'Good at organizing tasks — you show an emerging ability to plan and break work into manageable steps.', 'Balanced personality — you combine creativity with structure, allowing you to handle both routine and new tasks well.', 'Steady learner — your growth is visible when you work with clear priorities and supportive guidance.', 'Self-reflective — you notice what you enjoy, what drains your energy, and what direction feels right.', 'Improving confidence — each completed project boosts your clarity and personal belief in your abilities.', 'Team-aware — you engage well when others share expectations clearly and respectfully.', 'Problem-aware mindset — you can identify bottlenecks early and suggest practical adjustments.', 'Dependable collaborator — you support the team by completing your part on time and asking for clarity when needed.', 'Focused effort — when scope is clear, you produce clean, thoughtful work that reflects genuine effort.'] } },
|
|
63
|
+
{ min: 60, max: 79, band: { key: 'achiever', label: 'High Match', title: 'The Achiever', subtitle: 'strong alignment; ready to own meaningful problems', description: "Your profile indicates strong alignment between your natural strengths and the types of roles or environments you are suited for. Achievers typically work with a healthy balance of structure and independence. You know how to collaborate, how to plan, and how to maintain momentum even under normal levels of pressure. You tend to understand where you add value, and you approach tasks with a combination of practicality, focus, and self-awareness. You thrive when goals are clear, partners are reliable, and expectations are measurable.\n\nYou are someone who can confidently take responsibility for meaningful tasks and follow through with consistency. With the right mix of challenge and guidance, you grow quickly and demonstrate your potential through well-executed outcomes. You are at a point where you can take on increasingly complex responsibilities, communicate effectively across teams, and use your strengths to make a visible impact on the work you do.", image: 'The_Achiever-removebg-preview.png', positiveAttributes: ['Strong internal motivation — you push yourself to deliver solid results without needing constant supervision.', 'Clear sense of direction — you understand your strengths and can use them effectively in day-to-day work.', 'Consistent performer — you maintain momentum even when tasks get challenging or deadlines approach.', 'Collaborative but independent — you work well with others while still being able to manage your own responsibilities.', 'Goal-oriented mindset — you set personal standards and aim to meet or exceed them.', 'Emotionally steady — you generally stay composed under pressure, allowing you to think clearly and act rationally.', 'Highly dependable — people can count on you to follow through on responsibilities.', 'Strong decision-making instincts — you weigh information logically and choose practical solutions.', 'Growth-focused — you actively seek opportunities to improve and take on tasks that stretch your capabilities.', 'Positive team influence — your work ethic naturally encourages and motivates others.'] } },
|
|
64
|
+
{ min: 80, max: 100, band: { key: 'catalyst', label: 'Very High Match', title: 'The Catalyst', subtitle: 'full alignment; leadership and influence traits visible', description: "Your profile reflects someone with exceptional alignment, clarity, and readiness for impactful work. Catalysts are individuals who naturally take ownership, influence others positively, and elevate the quality of their environment. You think ahead, remain calm under pressure, and adapt quickly to new demands. You have the ability to understand both the bigger picture and the finer details, which allows you to move between strategic thinking and execution effortlessly.\n\nYou thrive in environments that trust you with autonomy, invite your ideas, and give you room to experiment, innovate, and lead. You are the type of person who brings energy into a team, someone who motivates others and pushes projects forward with intention. This score suggests that you not only fit well into many roles but also have the potential to shape them, propose improvements, and guide others as you grow. Your natural combination of confidence, initiative, and adaptability positions you for leadership over time, and you are ready for opportunities that challenge you to take the next step in your professional journey.", image: 'The_Catalyst-removebg-preview.png', positiveAttributes: ['Natural sense of ownership — you take initiative and drive projects forward without waiting for direction.', 'Strategic thinker — you understand long-term implications and plan ahead with clarity and purpose.', 'Influential communicator — people value your voice because you articulate ideas confidently and logically.', 'High adaptability — you adjust quickly to new challenges, environments, and responsibilities.', 'Strong leadership tendencies — you elevate others, bring structure to discussions, and guide the team toward outcomes.', 'Mentor-like energy — people often seek your feedback because you provide clarity and perspective.', 'Strong execution mindset — you turn plans into measurable outcomes with discipline and consistency.', 'Innovative problem-solver — you identify opportunities for improvement and propose actionable solutions.', 'Emotionally resilient — you manage pressure exceptionally well and maintain clarity even in uncertain moments.', 'High-impact presence — your involvement often improves the quality, speed, and direction of the work around you.'] } },
|
|
65
|
+
];
|
|
66
|
+
export function pickPersonaBand(overallPct) {
|
|
67
|
+
const clamped = Math.max(0, Math.min(100, overallPct));
|
|
68
|
+
const match = PERSONA_BANDS.find(({ min, max }) => clamped >= min && clamped <= max) ?? PERSONA_BANDS[0];
|
|
69
|
+
return match.band;
|
|
70
|
+
}
|
|
71
|
+
export const RIASEC_ROLES = {
|
|
72
|
+
AIR: ['Creative Technologist', 'Prototype Engineer', 'Product Workshop Specialist', 'Technical Designer', 'Rapid Prototyping Specialist', 'Industrial Designer', 'Hardware Prototyper', 'UX Prototyper', 'Innovation Lab Associate', 'Experimental Fabrication Specialist', 'Design Technologist', 'Human–Computer Interaction Prototyper'],
|
|
73
|
+
IRS: ['Field Operations Specialist', 'Training & Implementation Associate', 'Service/Tech Ops Coordinator', 'Technical Support Trainer', 'Health Tech Ops Associate', 'EdTech Implementation Specialist', 'User Support Analyst', 'Field Data Technician', 'Vocational Trainer', 'Customer Onboarding Specialist', 'Service Workflow Designer', 'Community Technology Facilitator'],
|
|
74
|
+
EIR: ['Technical Project Manager', 'Process Improvement Analyst', 'Growth Operations Manager', 'Business Operations Analyst', 'Field Program Manager', 'Product Operations Manager', 'Revenue Operations Analyst', 'Experimentation Program Manager', 'Technical Program Manager (TPM)', 'Solutions Operations Lead', 'Continuous Improvement Lead', 'Operations Strategist'],
|
|
75
|
+
CIR: ['QA/QC Analyst', 'Process/Manufacturing Engineer', 'Compliance Analyst', 'Quality Systems Specialist', 'Validation Engineer', 'Documentation Specialist', 'Laboratory QA Coordinator', 'Regulatory Operations Associate', 'Reliability Engineer', 'Process Control Technician', 'Industrial Quality Auditor', 'SOP/Standards Coordinator'],
|
|
76
|
+
ARS: ['Workshop/Training Facilitator', 'Learning Lab Coordinator', 'Community Program Producer', 'Experience Designer', 'Instructional Designer (Hands-on)', 'Event Producer', 'Educational Maker Coach', 'Exhibit/Museum Designer', 'Training Workshop Designer', 'Service Design Associate', 'Community Learning Designer', 'Outreach Workshop Lead'],
|
|
77
|
+
AER: ['Product Demo Specialist', 'Creative Producer', 'Experiential Marketing Manager', 'Prototype Showcase Lead', 'GTM Pilot Lead', 'Creative Operations Manager', 'Brand Activation Manager', 'Technical Evangelist', 'Solutions Demonstration Specialist', 'Product Marketing Producer', 'Experiential Producer', 'Field Marketing Engineer'],
|
|
78
|
+
ACR: ['Production Designer', 'Print/Packaging Specialist', 'Brand Asset Librarian', 'Studio/Traffic Coordinator', 'Production Artworker', 'Prepress Technician', 'Creative Operations Coordinator', 'Design QA Specialist', 'Artwork Compliance Coordinator', 'Catalog/Template Manager', 'Content Production Scheduler', 'Design Systems Producer'],
|
|
79
|
+
ERS: ['Site/Operations Coordinator', 'Vendor Manager', 'Service Operations Manager', 'Facility Manager', 'Event Operations Manager', 'Retail Operations Lead', 'Logistics Supervisor', 'Field Service Manager', 'Workforce Scheduling Manager', 'Regional Operations Coordinator', 'Service Delivery Lead', 'Multi-site Operations Supervisor'],
|
|
80
|
+
CRS: ['Office/Clinic Operations Associate', 'Logistics & Inventory Coordinator', 'Service Scheduler', 'Records Officer', 'Administrative Services Manager', 'Procurement Assistant', 'Fleet Coordinator', 'Operations Support Specialist', 'Facilities Coordinator', 'Documentation & Compliance Assistant', 'Front Office Lead', 'Service Desk Operations Coordinator'],
|
|
81
|
+
CER: ['Supply Chain Coordinator', 'Warehouse/Plant Supervisor', 'Shift Manager', 'Production Planner', 'Process Excellence Analyst', 'Operations Controller', 'Risk & Safety Coordinator', 'Distribution Center Lead', 'Industrial Scheduler', 'Fulfillment Operations Manager', 'Materials Planner', 'Operations Compliance Supervisor'],
|
|
82
|
+
AIS: ['UX Researcher', 'Data Storyteller', 'L&D Content Designer', 'Client Education Specialist', 'Research Communicator', 'Instructional Content Writer', 'Insights Presenter', 'Knowledge Translator', 'Design Researcher', 'User Education Program Manager', 'Research-to-Practice Specialist', 'Customer Insights Educator'],
|
|
83
|
+
AEI: ['Product Manager (Discovery)', 'Growth/Strategy Analyst', 'Innovation Consultant', 'Experimentation Lead', 'Product Strategist', 'Market Research Lead', 'Venture Builder Associate', 'Product Analyst (Discovery)', 'Solutions Strategist', 'New Initiatives PM', 'GTM Experiments Manager', 'Opportunity Assessment Lead'],
|
|
84
|
+
ACI: ['Research Documentation Specialist', 'Information Architect', 'Knowledge Management Lead', 'Regulatory Content Designer', 'Technical Writer', 'Data Catalog Manager', 'Taxonomy Specialist', 'Compliance Documentation Analyst', 'Quality Documentation Manager', 'Information Governance Analyst', 'Research Librarian', 'Metadata Manager'],
|
|
85
|
+
EIS: ['Solutions Consultant', 'Pre-Sales Engineer', 'Strategy Associate', 'Customer Solutions Lead', 'Partner Solutions Architect', 'Business Consultant', 'Customer Success Strategist', 'Enterprise Onboarding Consultant', 'Value Engineer', 'Proposal Engineer', 'Solutions Advisor', 'Engagement Manager (Solutions)'],
|
|
86
|
+
CIS: ['Academic Program Coordinator', 'Compliance Training Specialist', 'Records & Data Steward', 'Policy Implementation Coordinator', 'Research Administration Associate', 'Registrar Assistant', 'Data Governance Coordinator', 'Quality Training Coordinator', 'Grants & Compliance Associate', 'Documentation Control Specialist', 'Academic Operations Officer', 'Institutional Compliance Coordinator'],
|
|
87
|
+
CEI: ['Finance/BI Analyst', 'PMO Analyst', 'Governance & Risk Associate', 'Performance Operations Analyst', 'Business Intelligence Developer', 'Financial Planning Analyst', 'Operational Reporting Analyst', 'Process Governance Specialist', 'Analytics Program Coordinator', 'Portfolio Analyst', 'Controls & Assurance Analyst', 'Data Quality Lead'],
|
|
88
|
+
AES: ['Brand Strategist', 'Content Strategist', 'Community Manager', 'Customer Experience Lead', 'Sales/Enablement Specialist', 'Training-Led Marketing Manager', 'Campaign Strategist', 'Employer Branding Specialist', 'Advocacy/Influencer Program Manager', 'Engagement Lead', 'Partner Marketing Manager', 'Community Growth Lead'],
|
|
89
|
+
ACS: ['Program Coordinator (L&D/Editorial)', 'Campaign Operations Manager', 'Content Operations Specialist', 'Editorial Project Manager', 'Learning Operations Coordinator', 'Creative Project Coordinator', 'Curriculum Operations Manager', 'Production Scheduler (Creative)', 'Knowledge Content Coordinator', 'Studio Traffic Manager', 'Editorial Operations Lead', 'Program Scheduling Manager'],
|
|
90
|
+
ACE: ['Campaign/Production Manager', 'Brand Operations Lead', 'Content Systems Manager', 'Creative Operations Lead', 'Project Manager (Creative)', 'Marketing Operations Manager', 'Studio Manager', 'Release/Traffic Manager', 'Integrated Producer', 'Content Program Manager', 'Creative Delivery Manager', 'Production Operations Lead'],
|
|
91
|
+
CES: ['Customer Success Manager', 'HR Programs Specialist', 'Service Quality Manager', 'Policy Implementation Lead', 'People Operations Partner', 'Onboarding Program Manager', 'Support Operations Manager', 'Workforce Planning Analyst', 'Community Partnerships Manager', 'Client Services Lead', 'Service Excellence Manager', 'Employee Experience Program Lead'],
|
|
92
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storageKeys.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/constants/storageKeys.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAC3D,eAAO,MAAM,oBAAoB,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Image is filename only; prepend imageBasePath in UI (e.g. "/images/careerFitPersonality") */
|
|
2
|
+
export type OverallBand = {
|
|
3
|
+
label: 'Low Match' | 'Moderate Match' | 'High Match' | 'Very High Match';
|
|
4
|
+
min: number;
|
|
5
|
+
max: number;
|
|
6
|
+
persona: string;
|
|
7
|
+
tagline: string;
|
|
8
|
+
description: string;
|
|
9
|
+
image: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const OVERALL_BANDS: OverallBand[];
|
|
12
|
+
export declare function pickOverallBand(pct: number): OverallBand;
|
|
13
|
+
//# sourceMappingURL=overallBands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overallBands.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/data/overallBands.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,WAAW,GAAG,gBAAgB,GAAG,YAAY,GAAG,iBAAiB,CAAC;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAAW,EAKtC,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAGxD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const OVERALL_BANDS = [
|
|
2
|
+
{ label: 'Low Match', min: 0, max: 39, persona: 'The Explorer', tagline: 'still exploring; needs structure and feedback', description: "You're still exploring what fits you best. Your answers suggest that the roles you've tried or imagined don't fully align with how you like to work. Right now, you'll grow fastest by focusing on one clear interest and building confidence with small, scoped tasks. Aim for teams that give clear guidance, step-by-step goals and frequent feedback so you can discover what energizes you and what doesn't. Use this phase to name your strengths, notice what drains you and gather quick wins you can point to in applications.", image: 'The_Explorer-removebg-preview.png' },
|
|
3
|
+
{ label: 'Moderate Match', min: 40, max: 59, persona: 'The Builder', tagline: 'partial alignment; learning clarity through projects', description: "You have partial alignment with the work you're aiming at. With focused scope, good checklists and steady feedback, you can deliver strong results — especially when you lean into your Top-3 interests and avoid work tied to your lowest codes. You'll do well in environments that set clear priorities and weekly checkpoints while giving enough room to use your natural strengths. Treat this as a clarity phase: double down on what feels right, trim what doesn't and turn 1–2 projects into evidence of fit.", image: 'The_Builder-removebg-preview.png' },
|
|
4
|
+
{ label: 'High Match', min: 60, max: 79, persona: 'The Achiever', tagline: 'strong alignment; ready to own meaningful problems', description: "Your profile shows strong alignment. You're ready to own meaningful problems and produce measurable outcomes. You tend to understand where you add value and how you like to collaborate, and you can stay steady under normal pressure. Look for roles that combine your Top-1 or Top-2 RIASEC interests with your standout BIG-O behaviors. You'll thrive with clear KPIs, cross-functional partners and regular review cycles that let you investigate, create, deliver and iterate.", image: 'The_Achiever-removebg-preview.png' },
|
|
5
|
+
{ label: 'Very High Match', min: 80, max: 100, persona: 'The Catalyst', tagline: 'full alignment; leadership and influence traits visible', description: "You're an excellent fit for work that uses your pattern every day. You expect to ramp quickly, take ownership of outcomes and influence people or systems around you. Environments with clear metrics, experimentation budget and leadership access will bring out your best. Lean into your Top-2 interests and shape your role around them. This is the time to propose a roadmap, lead initiatives and mentor others. Your profile has a clear story: who you are at work, why you perform and where you'll have the strongest trajectory.", image: 'The_Catalyst-removebg-preview.png' },
|
|
6
|
+
];
|
|
7
|
+
export function pickOverallBand(pct) {
|
|
8
|
+
const p = Math.max(0, Math.min(100, Math.round(pct)));
|
|
9
|
+
return OVERALL_BANDS.find(b => p >= b.min && p <= b.max) ?? OVERALL_BANDS[0];
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Framework, BigOTrait, RiasecTrait } from './traits';
|
|
2
|
+
export type QuestionType = 'likert' | 'binary';
|
|
3
|
+
export type Question = {
|
|
4
|
+
id: string;
|
|
5
|
+
section: 1 | 2 | 3 | 4 | 5 | 6;
|
|
6
|
+
framework: Framework;
|
|
7
|
+
trait: BigOTrait | RiasecTrait;
|
|
8
|
+
prompt: string;
|
|
9
|
+
type: QuestionType;
|
|
10
|
+
weight: number;
|
|
11
|
+
reverse?: boolean;
|
|
12
|
+
order: number;
|
|
13
|
+
};
|
|
14
|
+
export declare const QUESTIONS: Question[];
|
|
15
|
+
export declare const QUESTIONS_BY_SECTION: Record<1 | 2 | 3 | 4 | 5 | 6, Question[]>;
|
|
16
|
+
//# sourceMappingURL=questions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/data/questions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAIF,eAAO,MAAM,SAAS,EAAE,QAAQ,EAyC/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAO1E,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const qid = (k) => `q_${k.replace(/\s+/g, '_').toLowerCase()}`;
|
|
2
|
+
export const QUESTIONS = [
|
|
3
|
+
{ id: qid('openness_1'), section: 1, framework: 'BIGO', trait: 'Openness', prompt: 'I enjoy learning new work methods or technologies.', type: 'likert', weight: 1.0, reverse: false, order: 1 },
|
|
4
|
+
{ id: qid('openness_2'), section: 1, framework: 'BIGO', trait: 'Openness', prompt: 'I am open to trying different career fields or roles.', type: 'likert', weight: 1.0, reverse: false, order: 2 },
|
|
5
|
+
{ id: qid('openness_3'), section: 1, framework: 'BIGO', trait: 'Openness', prompt: 'I like solving problems creatively at work.', type: 'likert', weight: 1.0, reverse: false, order: 3 },
|
|
6
|
+
{ id: qid('openness_4'), section: 1, framework: 'BIGO', trait: 'Openness', prompt: 'I enjoy jobs that let me innovate or think outside the box.', type: 'likert', weight: 1.0, reverse: false, order: 4 },
|
|
7
|
+
{ id: qid('conscientiousness_1'), section: 1, framework: 'BIGO', trait: 'Conscientiousness', prompt: 'I prefer tasks with clear goals and deadlines.', type: 'likert', weight: 1.0, reverse: false, order: 5 },
|
|
8
|
+
{ id: qid('conscientiousness_2'), section: 1, framework: 'BIGO', trait: 'Conscientiousness', prompt: 'I carefully plan my work to avoid mistakes.', type: 'likert', weight: 1.0, reverse: false, order: 6 },
|
|
9
|
+
{ id: qid('conscientiousness_3'), section: 1, framework: 'BIGO', trait: 'Conscientiousness', prompt: 'I feel satisfied finishing work early.', type: 'likert', weight: 1.0, reverse: false, order: 7 },
|
|
10
|
+
{ id: qid('conscientiousness_4'), section: 1, framework: 'BIGO', trait: 'Conscientiousness', prompt: 'I prefer jobs needing attention to detail.', type: 'likert', weight: 1.0, reverse: false, order: 8 },
|
|
11
|
+
{ id: qid('extraversion_1'), section: 2, framework: 'BIGO', trait: 'Extraversion', prompt: 'I enjoy group projects or a team environment.', type: 'likert', weight: 1.5, reverse: false, order: 1 },
|
|
12
|
+
{ id: qid('extraversion_2'), section: 2, framework: 'BIGO', trait: 'Extraversion', prompt: 'I feel energized when meeting new colleagues or clients.', type: 'likert', weight: 1.5, reverse: false, order: 2 },
|
|
13
|
+
{ id: qid('extraversion_3'), section: 2, framework: 'BIGO', trait: 'Extraversion', prompt: 'I like roles involving public speaking or networking.', type: 'likert', weight: 1.5, reverse: false, order: 3 },
|
|
14
|
+
{ id: qid('extraversion_4'), section: 2, framework: 'BIGO', trait: 'Extraversion', prompt: 'I prefer careers with lots of interaction.', type: 'likert', weight: 1.5, reverse: false, order: 4 },
|
|
15
|
+
{ id: qid('agreeableness_1'), section: 2, framework: 'BIGO', trait: 'Agreeableness', prompt: 'I try to maintain positive coworker relationships.', type: 'likert', weight: 1.0, reverse: false, order: 5 },
|
|
16
|
+
{ id: qid('agreeableness_2'), section: 2, framework: 'BIGO', trait: 'Agreeableness', prompt: 'I enjoy helping teammates with problems.', type: 'likert', weight: 1.0, reverse: false, order: 6 },
|
|
17
|
+
{ id: qid('agreeableness_3'), section: 2, framework: 'BIGO', trait: 'Agreeableness', prompt: 'I value cooperation over competition.', type: 'likert', weight: 1.0, reverse: false, order: 7 },
|
|
18
|
+
{ id: qid('agreeableness_4'), section: 2, framework: 'BIGO', trait: 'Agreeableness', prompt: 'I feel fulfilled supporting or mentoring others.', type: 'likert', weight: 1.0, reverse: false, order: 8 },
|
|
19
|
+
{ id: qid('neuroticism_1'), section: 3, framework: 'BIGO', trait: 'Neuroticism', prompt: 'I get stressed easily under deadlines.', type: 'likert', weight: 1.5, reverse: true, order: 1 },
|
|
20
|
+
{ id: qid('neuroticism_2'), section: 3, framework: 'BIGO', trait: 'Neuroticism', prompt: 'I worry about making mistakes at work.', type: 'likert', weight: 1.5, reverse: true, order: 2 },
|
|
21
|
+
{ id: qid('neuroticism_3'), section: 3, framework: 'BIGO', trait: 'Neuroticism', prompt: 'I find it hard to stay calm under pressure.', type: 'likert', weight: 1.5, reverse: true, order: 3 },
|
|
22
|
+
{ id: qid('neuroticism_4'), section: 3, framework: 'BIGO', trait: 'Neuroticism', prompt: 'I feel anxious about career uncertainty.', type: 'likert', weight: 1.5, reverse: true, order: 4 },
|
|
23
|
+
{ id: qid('realistic_1'), section: 3, framework: 'RIASEC', trait: 'Realistic', prompt: 'I enjoy careers involving building or repairing with tools.', type: 'likert', weight: 1.0, reverse: false, order: 5 },
|
|
24
|
+
{ id: qid('realistic_2'), section: 3, framework: 'RIASEC', trait: 'Realistic', prompt: 'I like hands-on, physical, or outdoor jobs.', type: 'binary', weight: 1.0, reverse: false, order: 6 },
|
|
25
|
+
{ id: qid('realistic_3'), section: 3, framework: 'RIASEC', trait: 'Realistic', prompt: 'I prefer solving practical problems.', type: 'likert', weight: 1.0, reverse: false, order: 7 },
|
|
26
|
+
{ id: qid('investigative_1'), section: 4, framework: 'RIASEC', trait: 'Investigative', prompt: 'I enjoy careers in data analysis or research.', type: 'likert', weight: 1.5, reverse: false, order: 1 },
|
|
27
|
+
{ id: qid('investigative_2'), section: 4, framework: 'RIASEC', trait: 'Investigative', prompt: 'I enjoy jobs in research, science, or tech.', type: 'binary', weight: 1.5, reverse: false, order: 2 },
|
|
28
|
+
{ id: qid('investigative_3'), section: 4, framework: 'RIASEC', trait: 'Investigative', prompt: 'I prefer jobs that require logical thinking and experimentation.', type: 'likert', weight: 1.5, reverse: false, order: 3 },
|
|
29
|
+
{ id: qid('investigative_4'), section: 4, framework: 'RIASEC', trait: 'Investigative', prompt: 'I feel motivated solving complex or abstract problems.', type: 'likert', weight: 1.5, reverse: false, order: 4 },
|
|
30
|
+
{ id: qid('artistic_1'), section: 4, framework: 'RIASEC', trait: 'Artistic', prompt: 'I enjoy jobs where I can design, write, perform, or create.', type: 'likert', weight: 1.0, reverse: false, order: 5 },
|
|
31
|
+
{ id: qid('artistic_2'), section: 4, framework: 'RIASEC', trait: 'Artistic', prompt: 'I prefer flexible work valuing creativity.', type: 'likert', weight: 1.0, reverse: false, order: 6 },
|
|
32
|
+
{ id: qid('artistic_3'), section: 4, framework: 'RIASEC', trait: 'Artistic', prompt: 'I feel energized brainstorming solutions.', type: 'likert', weight: 1.0, reverse: false, order: 7 },
|
|
33
|
+
{ id: qid('artistic_4'), section: 4, framework: 'RIASEC', trait: 'Artistic', prompt: 'I prefer flexible environments over a strict office routine.', type: 'likert', weight: 1.0, reverse: false, order: 8 },
|
|
34
|
+
{ id: qid('social_1'), section: 5, framework: 'RIASEC', trait: 'Social', prompt: 'I enjoy jobs teaching, training, or guiding others.', type: 'likert', weight: 1.0, reverse: false, order: 1 },
|
|
35
|
+
{ id: qid('social_2'), section: 5, framework: 'RIASEC', trait: 'Social', prompt: 'I feel fulfilled helping people in my workplace.', type: 'likert', weight: 1.0, reverse: false, order: 2 },
|
|
36
|
+
{ id: qid('social_3'), section: 5, framework: 'RIASEC', trait: 'Social', prompt: 'I prefer a career in healthcare, education, or counseling.', type: 'binary', weight: 1.0, reverse: false, order: 3 },
|
|
37
|
+
{ id: qid('enterprising_1'), section: 5, framework: 'RIASEC', trait: 'Enterprising', prompt: 'I enjoy persuading or motivating people at work.', type: 'likert', weight: 2.0, reverse: false, order: 4 },
|
|
38
|
+
{ id: qid('enterprising_2'), section: 5, framework: 'RIASEC', trait: 'Enterprising', prompt: 'I like leadership, decision-making, or risk-taking jobs.', type: 'likert', weight: 2.0, reverse: false, order: 5 },
|
|
39
|
+
{ id: qid('enterprising_3'), section: 5, framework: 'RIASEC', trait: 'Enterprising', prompt: 'I feel drawn to business, sales, or management careers.', type: 'likert', weight: 2.0, reverse: false, order: 6 },
|
|
40
|
+
{ id: qid('conventional_1'), section: 6, framework: 'RIASEC', trait: 'Conventional', prompt: 'I enjoy jobs organizing records or managing information.', type: 'likert', weight: 1.0, reverse: false, order: 1 },
|
|
41
|
+
{ id: qid('conventional_2'), section: 6, framework: 'RIASEC', trait: 'Conventional', prompt: 'I prefer structured roles with clear rules.', type: 'likert', weight: 1.0, reverse: false, order: 2 },
|
|
42
|
+
{ id: qid('conventional_3'), section: 6, framework: 'RIASEC', trait: 'Conventional', prompt: 'I prefer careers in finance, administration, or data.', type: 'binary', weight: 1.0, reverse: false, order: 3 },
|
|
43
|
+
];
|
|
44
|
+
export const QUESTIONS_BY_SECTION = {
|
|
45
|
+
1: QUESTIONS.filter(q => q.section === 1).sort((a, b) => a.order - b.order),
|
|
46
|
+
2: QUESTIONS.filter(q => q.section === 2).sort((a, b) => a.order - b.order),
|
|
47
|
+
3: QUESTIONS.filter(q => q.section === 3).sort((a, b) => a.order - b.order),
|
|
48
|
+
4: QUESTIONS.filter(q => q.section === 4).sort((a, b) => a.order - b.order),
|
|
49
|
+
5: QUESTIONS.filter(q => q.section === 5).sort((a, b) => a.order - b.order),
|
|
50
|
+
6: QUESTIONS.filter(q => q.section === 6).sort((a, b) => a.order - b.order),
|
|
51
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type Framework = 'BIGO' | 'RIASEC';
|
|
2
|
+
export type BigOTrait = 'Openness' | 'Conscientiousness' | 'Extraversion' | 'Agreeableness' | 'Neuroticism';
|
|
3
|
+
export type RiasecTrait = 'Realistic' | 'Investigative' | 'Artistic' | 'Social' | 'Enterprising' | 'Conventional';
|
|
4
|
+
export type AnyTrait = BigOTrait | RiasecTrait;
|
|
5
|
+
export declare const BIGO_TRAITS: BigOTrait[];
|
|
6
|
+
export declare const RIASEC_TRAITS: RiasecTrait[];
|
|
7
|
+
//# sourceMappingURL=traits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traits.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/data/traits.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1C,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,mBAAmB,GACnB,cAAc,GACd,eAAe,GACf,aAAa,CAAC;AAElB,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,eAAe,GACf,UAAU,GACV,QAAQ,GACR,cAAc,GACd,cAAc,CAAC;AAEnB,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE/C,eAAO,MAAM,WAAW,EAAE,SAAS,EAMlC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAAW,EAOtC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const BIGO_TRAITS = [
|
|
2
|
+
'Openness',
|
|
3
|
+
'Conscientiousness',
|
|
4
|
+
'Extraversion',
|
|
5
|
+
'Agreeableness',
|
|
6
|
+
'Neuroticism',
|
|
7
|
+
];
|
|
8
|
+
export const RIASEC_TRAITS = [
|
|
9
|
+
'Realistic',
|
|
10
|
+
'Investigative',
|
|
11
|
+
'Artistic',
|
|
12
|
+
'Social',
|
|
13
|
+
'Enterprising',
|
|
14
|
+
'Conventional',
|
|
15
|
+
];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { QUESTIONS, QUESTIONS_BY_SECTION } from './data/questions';
|
|
2
|
+
export type { Question, QuestionType } from './data/questions';
|
|
3
|
+
export { BIGO_TRAITS, RIASEC_TRAITS } from './data/traits';
|
|
4
|
+
export type { Framework, BigOTrait, RiasecTrait, AnyTrait } from './data/traits';
|
|
5
|
+
export { OVERALL_BANDS, pickOverallBand } from './data/overallBands';
|
|
6
|
+
export type { OverallBand } from './data/overallBands';
|
|
7
|
+
export { calculateTraitScore, computeOverall } from './utils/scoring';
|
|
8
|
+
export type { AnswerValue, AnswersMap, TraitName } from './utils/scoring';
|
|
9
|
+
export { CAREER_TEST_RESULTS_KEY, CAREER_TEST_USER_KEY } from './constants/storageKeys';
|
|
10
|
+
export { BIGO_LETTERS, RIASEC_LETTERS, BIGO_COMBOS, RIASEC_COMBOS, RIASEC_ROLES, WORK_STYLE_BANDS, pickWorkStyleBand, pickPersonaBand, } from './constants/resultConstants';
|
|
11
|
+
export type { WorkStyleBand, PersonaBand } from './constants/resultConstants';
|
|
12
|
+
export { CareerFitTestLanding } from './components/CareerFitTestLanding';
|
|
13
|
+
export type { CareerFitTestLandingProps } from './components/CareerFitTestLanding';
|
|
14
|
+
export { CareerTestDetailsForm } from './components/CareerTestDetailsForm';
|
|
15
|
+
export type { CareerTestDetailsFormProps, CareerTestDetailsFormPayload, CareerTestDetailsFormInitial, } from './components/CareerTestDetailsForm';
|
|
16
|
+
export { CareerTestStart } from './components/CareerTestStart';
|
|
17
|
+
export type { CareerTestStartProps } from './components/CareerTestStart';
|
|
18
|
+
export { CareerTestResultsPage } from './components/CareerTestResultsPage';
|
|
19
|
+
export type { CareerTestResultsPageProps, StoredResults } from './components/CareerTestResultsPage';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/career-personality-test/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3D,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG1E,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EACL,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,YAAY,EACV,0BAA0B,EAC1B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,YAAY,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Data
|
|
2
|
+
export { QUESTIONS, QUESTIONS_BY_SECTION } from './data/questions';
|
|
3
|
+
export { BIGO_TRAITS, RIASEC_TRAITS } from './data/traits';
|
|
4
|
+
export { OVERALL_BANDS, pickOverallBand } from './data/overallBands';
|
|
5
|
+
// Utils
|
|
6
|
+
export { calculateTraitScore, computeOverall } from './utils/scoring';
|
|
7
|
+
// Constants
|
|
8
|
+
export { CAREER_TEST_RESULTS_KEY, CAREER_TEST_USER_KEY } from './constants/storageKeys';
|
|
9
|
+
export { BIGO_LETTERS, RIASEC_LETTERS, BIGO_COMBOS, RIASEC_COMBOS, RIASEC_ROLES, WORK_STYLE_BANDS, pickWorkStyleBand, pickPersonaBand, } from './constants/resultConstants';
|
|
10
|
+
// Components
|
|
11
|
+
export { CareerFitTestLanding } from './components/CareerFitTestLanding';
|
|
12
|
+
export { CareerTestDetailsForm } from './components/CareerTestDetailsForm';
|
|
13
|
+
export { CareerTestStart } from './components/CareerTestStart';
|
|
14
|
+
export { CareerTestResultsPage } from './components/CareerTestResultsPage';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Question } from '../data/questions';
|
|
2
|
+
export type AnswerValue = 1 | 2 | 3 | 4 | 5 | 'yes' | 'no';
|
|
3
|
+
export type AnswersMap = Record<string, AnswerValue | undefined>;
|
|
4
|
+
export type TraitName = 'Openness' | 'Conscientiousness' | 'Extraversion' | 'Agreeableness' | 'Neuroticism' | 'Realistic' | 'Investigative' | 'Artistic' | 'Social' | 'Enterprising' | 'Conventional';
|
|
5
|
+
export declare function calculateTraitScore(trait: TraitName, answers: AnswersMap): {
|
|
6
|
+
totalScore: number;
|
|
7
|
+
maxScore: number;
|
|
8
|
+
percentage: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function computeOverall(_questions: Question[], answers: AnswersMap): {
|
|
11
|
+
traitPercentages: Record<TraitName, number>;
|
|
12
|
+
frameworkPercentages: {
|
|
13
|
+
BIGO: number;
|
|
14
|
+
RIASEC: number;
|
|
15
|
+
};
|
|
16
|
+
overallPercentage: number;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=scoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../../src/career-personality-test/utils/scoring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;AAC3D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;AAEjE,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,mBAAmB,GACnB,cAAc,GACd,eAAe,GACf,aAAa,GACb,WAAW,GACX,eAAe,GACf,UAAU,GACV,QAAQ,GACR,cAAc,GACd,cAAc,CAAC;AAgBnB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,UAAU,GAClB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAmB9D;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,QAAQ,EAAE,EACtB,OAAO,EAAE,UAAU,GAClB;IACD,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C,oBAAoB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CA+BA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { QUESTIONS } from '../data/questions';
|
|
2
|
+
const TRAIT_MAX = {
|
|
3
|
+
Openness: 20,
|
|
4
|
+
Conscientiousness: 20,
|
|
5
|
+
Extraversion: 30,
|
|
6
|
+
Agreeableness: 20,
|
|
7
|
+
Neuroticism: 30,
|
|
8
|
+
Realistic: 15,
|
|
9
|
+
Investigative: 24,
|
|
10
|
+
Artistic: 20,
|
|
11
|
+
Social: 11,
|
|
12
|
+
Enterprising: 30,
|
|
13
|
+
Conventional: 11,
|
|
14
|
+
};
|
|
15
|
+
export function calculateTraitScore(trait, answers) {
|
|
16
|
+
let totalScore = 0;
|
|
17
|
+
QUESTIONS.forEach((q) => {
|
|
18
|
+
if (q.trait !== trait)
|
|
19
|
+
return;
|
|
20
|
+
const answer = answers[q.id];
|
|
21
|
+
if (answer === undefined)
|
|
22
|
+
return;
|
|
23
|
+
let rawScore;
|
|
24
|
+
if (q.type === 'likert') {
|
|
25
|
+
if (typeof answer !== 'number')
|
|
26
|
+
return;
|
|
27
|
+
rawScore = answer;
|
|
28
|
+
if (q.reverse)
|
|
29
|
+
rawScore = 6 - rawScore;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
rawScore = answer === 'yes' ? 1 : 0;
|
|
33
|
+
}
|
|
34
|
+
totalScore += rawScore * q.weight;
|
|
35
|
+
});
|
|
36
|
+
const maxScore = TRAIT_MAX[trait];
|
|
37
|
+
const percentage = maxScore > 0 ? (totalScore / maxScore) * 100 : 0;
|
|
38
|
+
return { totalScore, maxScore, percentage };
|
|
39
|
+
}
|
|
40
|
+
export function computeOverall(_questions, answers) {
|
|
41
|
+
const bigoTraits = [
|
|
42
|
+
'Openness',
|
|
43
|
+
'Conscientiousness',
|
|
44
|
+
'Extraversion',
|
|
45
|
+
'Agreeableness',
|
|
46
|
+
'Neuroticism',
|
|
47
|
+
];
|
|
48
|
+
const riasecTraits = [
|
|
49
|
+
'Realistic',
|
|
50
|
+
'Investigative',
|
|
51
|
+
'Artistic',
|
|
52
|
+
'Social',
|
|
53
|
+
'Enterprising',
|
|
54
|
+
'Conventional',
|
|
55
|
+
];
|
|
56
|
+
const traitPercentages = {};
|
|
57
|
+
bigoTraits.concat(riasecTraits).forEach((trait) => {
|
|
58
|
+
const { percentage } = calculateTraitScore(trait, answers);
|
|
59
|
+
traitPercentages[trait] = percentage;
|
|
60
|
+
});
|
|
61
|
+
const bigoAvg = bigoTraits.reduce((sum, t) => sum + traitPercentages[t], 0) / bigoTraits.length;
|
|
62
|
+
const riasecAvg = riasecTraits.reduce((sum, t) => sum + traitPercentages[t], 0) / riasecTraits.length;
|
|
63
|
+
const overallPercentage = bigoAvg * 0.4 + riasecAvg * 0.6;
|
|
64
|
+
return {
|
|
65
|
+
traitPercentages,
|
|
66
|
+
frameworkPercentages: { BIGO: bigoAvg, RIASEC: riasecAvg },
|
|
67
|
+
overallPercentage,
|
|
68
|
+
};
|
|
69
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -37,4 +37,5 @@ export { default as IndustrySelect } from './components/ui/IndustrySelect';
|
|
|
37
37
|
export { default as DesignationSelect } from './components/ui/DesignationSelect';
|
|
38
38
|
export { MultiSelectOptions } from './components/ui/MultiSelectOptions';
|
|
39
39
|
export type { MultiSelectOptionsProps } from './components/ui/MultiSelectOptions';
|
|
40
|
+
export * from './career-personality-test';
|
|
40
41
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxD,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,UAAU,EACV,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,eAAe,EACf,eAAe,EACf,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,YAAY,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACpF,YAAY,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAGnF,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxD,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,UAAU,EACV,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,eAAe,EACf,eAAe,EACf,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,YAAY,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACpF,YAAY,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAGnF,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAGlF,cAAc,2BAA2B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -29,3 +29,5 @@ export { RatingStars } from './components/ui/RatingStars';
|
|
|
29
29
|
export { default as IndustrySelect } from './components/ui/IndustrySelect';
|
|
30
30
|
export { default as DesignationSelect } from './components/ui/DesignationSelect';
|
|
31
31
|
export { MultiSelectOptions } from './components/ui/MultiSelectOptions';
|
|
32
|
+
// Career Personality Test
|
|
33
|
+
export * from './career-personality-test';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@recruitnepal/shared-packages",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "Shared hooks, API client, types and utils for Recruit Nepal (CV builder UI and preprocess stay in each repo)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -9,7 +9,12 @@
|
|
|
9
9
|
"dev": "tsc --watch",
|
|
10
10
|
"prepublishOnly": "npm run build"
|
|
11
11
|
},
|
|
12
|
-
"keywords": [
|
|
12
|
+
"keywords": [
|
|
13
|
+
"react",
|
|
14
|
+
"nextjs",
|
|
15
|
+
"recruit-nepal",
|
|
16
|
+
"shared-components"
|
|
17
|
+
],
|
|
13
18
|
"author": "",
|
|
14
19
|
"license": "MIT",
|
|
15
20
|
"peerDependencies": {
|
|
@@ -26,7 +31,8 @@
|
|
|
26
31
|
"class-variance-authority": "^0.7.0",
|
|
27
32
|
"@radix-ui/react-popover": "^1.1.0",
|
|
28
33
|
"@radix-ui/react-slot": "^1.1.0",
|
|
29
|
-
"react-intersection-observer": "^9.16.0"
|
|
34
|
+
"react-intersection-observer": "^9.16.0",
|
|
35
|
+
"recharts": "^2.15.0"
|
|
30
36
|
},
|
|
31
37
|
"dependencies": {
|
|
32
38
|
"axios": "^1.7.8",
|
|
@@ -37,7 +43,8 @@
|
|
|
37
43
|
"class-variance-authority": "^0.7.0",
|
|
38
44
|
"@radix-ui/react-popover": "^1.1.0",
|
|
39
45
|
"@radix-ui/react-slot": "^1.1.0",
|
|
40
|
-
"react-intersection-observer": "^9.16.0"
|
|
46
|
+
"react-intersection-observer": "^9.16.0",
|
|
47
|
+
"recharts": "^2.15.0"
|
|
41
48
|
},
|
|
42
49
|
"devDependencies": {
|
|
43
50
|
"@types/node": "^20.11.17",
|
|
@@ -48,5 +55,8 @@
|
|
|
48
55
|
"react-hook-form": "^7.49.0",
|
|
49
56
|
"@hookform/resolvers": "^3.3.0"
|
|
50
57
|
},
|
|
51
|
-
"files": [
|
|
52
|
-
|
|
58
|
+
"files": [
|
|
59
|
+
"dist",
|
|
60
|
+
"README.md"
|
|
61
|
+
]
|
|
62
|
+
}
|