@recruitnepal/shared-packages 1.7.1 → 1.7.2
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/components/cv/ResponsivePreview.d.ts +7 -0
- package/dist/components/cv/ResponsivePreview.d.ts.map +1 -0
- package/dist/components/cv/ResponsivePreview.js +47 -0
- package/dist/components/cv-builder/forms/AboutForm.d.ts +2 -0
- package/dist/components/cv-builder/forms/AboutForm.d.ts.map +1 -0
- package/dist/components/cv-builder/forms/AboutForm.js +86 -0
- package/dist/components/cv-builder/forms/AdditionalDetailsForm.d.ts +2 -0
- package/dist/components/cv-builder/forms/AdditionalDetailsForm.d.ts.map +1 -0
- package/dist/components/cv-builder/forms/AdditionalDetailsForm.js +227 -0
- package/dist/components/cv-builder/forms/EducationForm.d.ts +2 -0
- package/dist/components/cv-builder/forms/EducationForm.d.ts.map +1 -0
- package/dist/components/cv-builder/forms/EducationForm.js +168 -0
- package/dist/components/cv-builder/forms/ExperienceForm.d.ts +2 -0
- package/dist/components/cv-builder/forms/ExperienceForm.d.ts.map +1 -0
- package/dist/components/cv-builder/forms/ExperienceForm.js +266 -0
- package/dist/components/cv-builder/forms/PortfolioForm.d.ts +2 -0
- package/dist/components/cv-builder/forms/PortfolioForm.d.ts.map +1 -0
- package/dist/components/cv-builder/forms/PortfolioForm.js +159 -0
- package/dist/components/cv-builder/forms/ProjectsForm.d.ts +2 -0
- package/dist/components/cv-builder/forms/ProjectsForm.d.ts.map +1 -0
- package/dist/components/cv-builder/forms/ProjectsForm.js +134 -0
- package/dist/components/cv-builder/forms/SkillsForm.d.ts +2 -0
- package/dist/components/cv-builder/forms/SkillsForm.d.ts.map +1 -0
- package/dist/components/cv-builder/forms/SkillsForm.js +250 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/package.json +50 -51
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef, useCallback, useMemo } from 'react';
|
|
4
|
+
import { useForm, useFieldArray } from 'react-hook-form';
|
|
5
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form';
|
|
8
|
+
import { Input } from '@/components/ui/input';
|
|
9
|
+
import { Textarea } from '@/components/ui/textarea';
|
|
10
|
+
import { Button } from '@/components/ui/button';
|
|
11
|
+
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from '@/components/ui/accordion';
|
|
12
|
+
import { Plus, Trash2 } from 'lucide-react';
|
|
13
|
+
import { useCvPreview } from '@/stores/cvPreview.store';
|
|
14
|
+
import { useCvDraftsStore } from '@/stores/cvDrafts.store';
|
|
15
|
+
import { MultiSelectOptions } from '@/components/multi-select';
|
|
16
|
+
import { useSkills } from '@/hooks/api/useSkills';
|
|
17
|
+
import { monthsDropdown, yearsDropdown } from '@/utils/commonDropdownOptions';
|
|
18
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select';
|
|
19
|
+
import NoData from '@/components/common/no-data';
|
|
20
|
+
const dateSchema = z.object({
|
|
21
|
+
year: z
|
|
22
|
+
.union([
|
|
23
|
+
z.number().int().gte(1000).lte(9999),
|
|
24
|
+
z.string().regex(/^\d{4}$/, 'Year must be a 4-digit number'),
|
|
25
|
+
])
|
|
26
|
+
.transform((val) => (typeof val === 'string' ? Number(val) : val)),
|
|
27
|
+
month: z
|
|
28
|
+
.union([
|
|
29
|
+
z.number().int().gte(1).lte(12),
|
|
30
|
+
z.string().regex(/^([1-9]|1[0-2])$/, 'Month must be between 1 and 12'),
|
|
31
|
+
])
|
|
32
|
+
.transform((val) => (typeof val === 'string' ? Number(val) : val)),
|
|
33
|
+
day: z
|
|
34
|
+
.union([
|
|
35
|
+
z.number().int().default(1),
|
|
36
|
+
z.string().transform((val) => Number(val)),
|
|
37
|
+
])
|
|
38
|
+
.default(1),
|
|
39
|
+
});
|
|
40
|
+
const skillTrainingSchema = z.object({
|
|
41
|
+
id: z.string().optional(),
|
|
42
|
+
institute_name: z.string().min(1, { message: 'Institute Name is required' }),
|
|
43
|
+
course_name: z.string().min(1, { message: 'Course Name is required' }),
|
|
44
|
+
description: z.string().min(1, { message: 'Description is required' }),
|
|
45
|
+
skills: z
|
|
46
|
+
.array(z.string())
|
|
47
|
+
.min(1, { message: 'Please add at least one skill.' }),
|
|
48
|
+
start: dateSchema,
|
|
49
|
+
end: dateSchema,
|
|
50
|
+
training_url: z.string().url().optional().or(z.literal('')),
|
|
51
|
+
});
|
|
52
|
+
const skillTrainingFormSchema = z.object({
|
|
53
|
+
trainingEntries: z.array(skillTrainingSchema).min(0),
|
|
54
|
+
// Global skills field
|
|
55
|
+
globalSkills: z.array(z.string()).min(0),
|
|
56
|
+
});
|
|
57
|
+
export default function SkillsForm() {
|
|
58
|
+
const { live, setSections } = useCvPreview();
|
|
59
|
+
const { getCurrentDraft, updateDraft } = useCvDraftsStore();
|
|
60
|
+
const { skillsQuery: infiniteSkillsQuery } = useSkills();
|
|
61
|
+
// Extract trainings from live data
|
|
62
|
+
const trainingsList = useMemo(() => {
|
|
63
|
+
return (live?.sections?.trainings && Array.isArray(live.sections.trainings))
|
|
64
|
+
? live.sections.trainings
|
|
65
|
+
: [];
|
|
66
|
+
}, [live?.sections?.trainings]);
|
|
67
|
+
// Extract global skills
|
|
68
|
+
const skillsCategory = live?.sections?.skills?.[0];
|
|
69
|
+
const skillsList = skillsCategory?.skills || [];
|
|
70
|
+
const skillsArray = skillsList.map(s => s.name).filter(Boolean);
|
|
71
|
+
// Transform trainings to form format
|
|
72
|
+
const defaultTrainings = useMemo(() => {
|
|
73
|
+
return trainingsList.map((t) => ({
|
|
74
|
+
id: t.id,
|
|
75
|
+
institute_name: t.institute || '',
|
|
76
|
+
course_name: t.course || '',
|
|
77
|
+
description: t.description || '',
|
|
78
|
+
skills: t.skills || [],
|
|
79
|
+
start: t.startDate
|
|
80
|
+
? {
|
|
81
|
+
year: new Date(t.startDate).getFullYear(),
|
|
82
|
+
month: new Date(t.startDate).getMonth() + 1,
|
|
83
|
+
day: 1,
|
|
84
|
+
}
|
|
85
|
+
: { year: new Date().getFullYear(), month: 1, day: 1 },
|
|
86
|
+
end: t.endDate
|
|
87
|
+
? {
|
|
88
|
+
year: new Date(t.endDate).getFullYear(),
|
|
89
|
+
month: new Date(t.endDate).getMonth() + 1,
|
|
90
|
+
day: 1,
|
|
91
|
+
}
|
|
92
|
+
: { year: new Date().getFullYear(), month: 1, day: 1 },
|
|
93
|
+
training_url: t.url || '',
|
|
94
|
+
}));
|
|
95
|
+
}, [trainingsList]);
|
|
96
|
+
const form = useForm({
|
|
97
|
+
resolver: zodResolver(skillTrainingFormSchema),
|
|
98
|
+
defaultValues: {
|
|
99
|
+
trainingEntries: defaultTrainings.length > 0 ? defaultTrainings : [],
|
|
100
|
+
globalSkills: skillsArray,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
const { fields, append, remove } = useFieldArray({
|
|
104
|
+
control: form.control,
|
|
105
|
+
name: 'trainingEntries',
|
|
106
|
+
});
|
|
107
|
+
// Track if we've initialized to prevent reset loops
|
|
108
|
+
const initializedRef = useRef(false);
|
|
109
|
+
const prevTrainingsRef = useRef('');
|
|
110
|
+
const prevSkillsRef = useRef('');
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
const currentTrainingsStr = JSON.stringify(defaultTrainings);
|
|
113
|
+
// Only reset if:
|
|
114
|
+
// 1. We haven't initialized yet
|
|
115
|
+
// 2. OR the data actually changed from an external source (different structure)
|
|
116
|
+
if (!initializedRef.current) {
|
|
117
|
+
form.reset({
|
|
118
|
+
trainingEntries: defaultTrainings.length > 0 ? defaultTrainings : [],
|
|
119
|
+
globalSkills: skillsArray,
|
|
120
|
+
});
|
|
121
|
+
initializedRef.current = true;
|
|
122
|
+
prevTrainingsRef.current = currentTrainingsStr;
|
|
123
|
+
prevSkillsRef.current = JSON.stringify(skillsArray);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Only reset if the structure changed significantly (e.g., loading a draft)
|
|
127
|
+
const prevTrainings = JSON.parse(prevTrainingsRef.current || '[]');
|
|
128
|
+
const currentIds = defaultTrainings.map(e => e.id).sort().join(',');
|
|
129
|
+
const prevIds = prevTrainings.map((e) => e.id).sort().join(',');
|
|
130
|
+
// Only reset trainings if IDs changed (new draft loaded) or count changed significantly
|
|
131
|
+
if (currentIds !== prevIds || Math.abs(defaultTrainings.length - prevTrainings.length) > 0) {
|
|
132
|
+
form.reset({
|
|
133
|
+
trainingEntries: defaultTrainings.length > 0 ? defaultTrainings : [],
|
|
134
|
+
globalSkills: skillsArray,
|
|
135
|
+
});
|
|
136
|
+
prevTrainingsRef.current = currentTrainingsStr;
|
|
137
|
+
prevSkillsRef.current = JSON.stringify(skillsArray);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const currentSkillsStr = JSON.stringify(skillsArray);
|
|
141
|
+
if (prevSkillsRef.current !== currentSkillsStr) {
|
|
142
|
+
// Only update globalSkills if it changed from external source
|
|
143
|
+
// Don't reset if user is typing (that would be handled by the watch)
|
|
144
|
+
form.setValue('globalSkills', skillsArray);
|
|
145
|
+
prevSkillsRef.current = currentSkillsStr;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}, [defaultTrainings, skillsArray, form]);
|
|
150
|
+
const debRefTrainings = useRef(null);
|
|
151
|
+
const debRefSkills = useRef(null);
|
|
152
|
+
// Format "YYYY-MM" safely from {year, month}
|
|
153
|
+
const mapTrainings = useCallback((rows) => {
|
|
154
|
+
const ymToStr = (ym) => ym?.year && ym?.month
|
|
155
|
+
? `${String(ym.year).padStart(4, '0')}-${String(ym.month).padStart(2, '0')}`
|
|
156
|
+
: undefined;
|
|
157
|
+
return (rows ?? []).map((t, i) => ({
|
|
158
|
+
id: String(t.id ?? `tmp-training-${i}`),
|
|
159
|
+
course: t.course_name || '',
|
|
160
|
+
institute: t.institute_name || '',
|
|
161
|
+
description: t.description || '',
|
|
162
|
+
skills: Array.isArray(t.skills) ? t.skills : [],
|
|
163
|
+
startDate: ymToStr(t.start),
|
|
164
|
+
endDate: ymToStr(t.end),
|
|
165
|
+
url: t.training_url || '',
|
|
166
|
+
}));
|
|
167
|
+
}, []);
|
|
168
|
+
const pushTrainings = useCallback((rows) => {
|
|
169
|
+
if (debRefTrainings.current)
|
|
170
|
+
clearTimeout(debRefTrainings.current);
|
|
171
|
+
const payload = mapTrainings(rows);
|
|
172
|
+
debRefTrainings.current = window.setTimeout(() => {
|
|
173
|
+
setSections({ trainings: payload });
|
|
174
|
+
}, 160);
|
|
175
|
+
}, [setSections, mapTrainings]);
|
|
176
|
+
const pushSkills = useCallback((skillsArray) => {
|
|
177
|
+
if (debRefSkills.current)
|
|
178
|
+
clearTimeout(debRefSkills.current);
|
|
179
|
+
debRefSkills.current = window.setTimeout(() => {
|
|
180
|
+
const skillNames = skillsArray.filter(Boolean);
|
|
181
|
+
if (skillNames.length === 0) {
|
|
182
|
+
setSections({ skills: [] });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const templateSkills = skillNames.map(name => ({ name }));
|
|
186
|
+
const category = {
|
|
187
|
+
id: 'all-skills',
|
|
188
|
+
category: 'Skills',
|
|
189
|
+
skills: templateSkills,
|
|
190
|
+
};
|
|
191
|
+
setSections({ skills: [category] });
|
|
192
|
+
}, 300);
|
|
193
|
+
}, [setSections]);
|
|
194
|
+
// Watch form changes for trainings
|
|
195
|
+
useEffect(() => {
|
|
196
|
+
const sub = form.watch((_v, { name }) => {
|
|
197
|
+
if (!name?.startsWith('trainingEntries'))
|
|
198
|
+
return;
|
|
199
|
+
pushTrainings(form.getValues().trainingEntries ?? []);
|
|
200
|
+
});
|
|
201
|
+
// bootstrap once
|
|
202
|
+
pushTrainings(form.getValues().trainingEntries ?? []);
|
|
203
|
+
return () => {
|
|
204
|
+
sub?.unsubscribe?.();
|
|
205
|
+
if (debRefTrainings.current)
|
|
206
|
+
clearTimeout(debRefTrainings.current);
|
|
207
|
+
};
|
|
208
|
+
}, [form, pushTrainings]);
|
|
209
|
+
// Watch global skills
|
|
210
|
+
useEffect(() => {
|
|
211
|
+
const sub = form.watch((v) => {
|
|
212
|
+
if (Array.isArray(v.globalSkills)) {
|
|
213
|
+
const skills = v.globalSkills.filter((s) => typeof s === 'string' && s.length > 0);
|
|
214
|
+
pushSkills(skills);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
pushSkills([]);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
return () => {
|
|
221
|
+
sub?.unsubscribe?.();
|
|
222
|
+
if (debRefSkills.current)
|
|
223
|
+
clearTimeout(debRefSkills.current);
|
|
224
|
+
};
|
|
225
|
+
}, [form, pushSkills]);
|
|
226
|
+
// Update draft when data changes
|
|
227
|
+
useEffect(() => {
|
|
228
|
+
const currentDraft = getCurrentDraft();
|
|
229
|
+
if (currentDraft && live) {
|
|
230
|
+
updateDraft(currentDraft.id, {
|
|
231
|
+
cv_data: live,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}, [live, getCurrentDraft, updateDraft]);
|
|
235
|
+
return (_jsxs("div", { className: "mb-6", children: [_jsx("h1", { className: "text-2xl mb-2 font-medium", children: "Skills & Trainings" }), _jsx("p", { className: "text-sm mb-6", children: "Add your skills and training certifications." }), _jsx(Form, { ...form, children: _jsxs("form", { className: "space-y-6", children: [_jsx("div", { className: "mb-6", children: _jsx(FormField, { control: form.control, name: "globalSkills", render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { children: "Skills" }), _jsx(FormControl, { children: _jsx(MultiSelectOptions, { value: field.value || [], onChange: field.onChange, options: [], query: infiniteSkillsQuery }) }), _jsx(FormMessage, {})] })) }) }), _jsxs("div", { children: [_jsx("h2", { className: "text-lg font-medium mb-4", children: "Trainings & Certifications" }), !fields.length && _jsx(NoData, {}), fields.map((field, index) => (_jsx(Accordion, { type: "single", collapsible: true, children: _jsxs(AccordionItem, { value: `training-${index}`, className: "border-none", children: [_jsxs("div", { className: "flex items-center justify-between bg-primary/10 py-3 px-4 rounded-xl accordion-grow", children: [_jsx(AccordionTrigger, { className: "h-[50px] flex-grow hover:no-underline p-0", children: _jsx("div", { className: "flex items-center justify-between w-full", children: _jsxs("div", { className: "flex flex-col items-start", children: [_jsx("p", { className: "text-base font-semibold", children: form.watch(`trainingEntries.${index}.course_name`) || 'New Training Entry' }), _jsx("p", { className: "text-sm font-light", children: form.watch(`trainingEntries.${index}.institute_name`) })] }) }) }), _jsx("div", { className: "pl-3 border-l border-black/60 ml-4", children: _jsx(Button, { variant: "link", type: "button", size: "sm", onClick: (e) => {
|
|
236
|
+
e.stopPropagation();
|
|
237
|
+
remove(index);
|
|
238
|
+
}, className: "h-8 w-8 p-0 hover:text-destructive", children: _jsx(Trash2, { size: 20, className: "text-text-primary hover:text-destructive" }) }) })] }), _jsx(AccordionContent, { children: _jsx("div", { className: "p-4 pt-0", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsx(FormField, { control: form.control, name: `trainingEntries.${index}.institute_name`, render: ({ field }) => (_jsxs(FormItem, { className: "w-full", children: [_jsx(FormLabel, { children: "Institution Name" }), _jsx(FormControl, { children: _jsx(Input, { placeholder: "Enter Institution Name", ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: `trainingEntries.${index}.course_name`, render: ({ field }) => (_jsxs(FormItem, { className: "w-full", children: [_jsx(FormLabel, { children: "Course Name" }), _jsx(FormControl, { children: _jsx(Input, { placeholder: "Enter course name", ...field }) }), _jsx(FormMessage, {})] })) })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx(FormLabel, { children: "Start Date" }), _jsxs("div", { className: "flex gap-2", children: [_jsx(FormField, { control: form.control, name: `trainingEntries.${index}.start.month`, render: ({ field }) => (_jsxs(FormItem, { className: "w-full", children: [_jsxs(Select, { onValueChange: (val) => field.onChange(Number(val)), value: field.value?.toString(), children: [_jsx(FormControl, { children: _jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Month" }) }) }), _jsx(SelectContent, { children: monthsDropdown.map((month) => (_jsx(SelectItem, { value: month.value.toString(), children: month.label }, month.value))) })] }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: `trainingEntries.${index}.start.year`, render: ({ field }) => (_jsxs(FormItem, { className: "w-full", children: [_jsxs(Select, { onValueChange: (val) => field.onChange(Number(val)), value: field.value?.toString(), children: [_jsx(FormControl, { children: _jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Year" }) }) }), _jsx(SelectContent, { children: yearsDropdown.map((year) => (_jsx(SelectItem, { value: year, children: year }, year))) })] }), _jsx(FormMessage, {})] })) })] })] }), _jsxs("div", { children: [_jsx(FormLabel, { children: "End Date" }), _jsxs("div", { className: "flex gap-2", children: [_jsx(FormField, { control: form.control, name: `trainingEntries.${index}.end.month`, render: ({ field }) => (_jsxs(FormItem, { className: "w-full", children: [_jsxs(Select, { onValueChange: (val) => field.onChange(Number(val)), value: field.value?.toString(), children: [_jsx(FormControl, { children: _jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Month" }) }) }), _jsx(SelectContent, { children: monthsDropdown.map((month) => (_jsx(SelectItem, { value: month.value.toString(), children: month.label }, month.value))) })] }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: `trainingEntries.${index}.end.year`, render: ({ field }) => (_jsxs(FormItem, { className: "w-full", children: [_jsxs(Select, { onValueChange: (val) => field.onChange(Number(val)), value: field.value?.toString(), children: [_jsx(FormControl, { children: _jsx(SelectTrigger, { children: _jsx(SelectValue, { placeholder: "Year" }) }) }), _jsx(SelectContent, { children: yearsDropdown.map((year) => (_jsx(SelectItem, { value: year, children: year }, year))) })] }), _jsx(FormMessage, {})] })) })] })] })] }), _jsx(FormField, { control: form.control, name: `trainingEntries.${index}.description`, render: ({ field }) => (_jsxs(FormItem, { className: "w-full", children: [_jsx(FormLabel, { children: "Training Description" }), _jsx(FormControl, { children: _jsx(Textarea, { placeholder: "Start Typing...", ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: `trainingEntries.${index}.training_url`, render: ({ field }) => (_jsxs(FormItem, { className: "w-full", children: [_jsx(FormLabel, { children: "Training URL (optional)" }), _jsx(FormControl, { children: _jsx(Input, { placeholder: "https://example.com/certificate", ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: `trainingEntries.${index}.skills`, render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { children: "Skills Acquired" }), _jsx(FormControl, { children: _jsx(MultiSelectOptions, { value: field.value || [], onChange: field.onChange, options: [], query: infiniteSkillsQuery }) }), _jsx(FormMessage, {})] })) })] }) }) })] }) }, field.id))), _jsxs(Button, { type: "button", variant: "outline", size: "sm", className: "text-primary w-fit", onClick: () => {
|
|
239
|
+
append({
|
|
240
|
+
id: undefined,
|
|
241
|
+
institute_name: '',
|
|
242
|
+
course_name: '',
|
|
243
|
+
description: '',
|
|
244
|
+
skills: [],
|
|
245
|
+
start: { year: new Date().getFullYear(), month: 1, day: 1 },
|
|
246
|
+
end: { year: new Date().getFullYear(), month: 1, day: 1 },
|
|
247
|
+
training_url: '',
|
|
248
|
+
});
|
|
249
|
+
}, children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), " Add Training"] })] })] }) })] }));
|
|
250
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -44,6 +44,7 @@ export { useCvDraftsStore } from './stores/cvDrafts.store';
|
|
|
44
44
|
export { default as TemplateRenderer } from './components/cv/TemplateRenderer';
|
|
45
45
|
export type { CvTemplateRegistry, TemplateRendererProps } from './components/cv/TemplateRenderer';
|
|
46
46
|
export { default as TemplatePicker } from './components/cv/TemplatePicker';
|
|
47
|
+
export { default as ResponsivePreview } from './components/cv/ResponsivePreview';
|
|
47
48
|
export type { TemplatePickerProps } from './components/cv/TemplatePicker';
|
|
48
49
|
export { generateSampleTemplateData } from './components/cv/TemplatePicker';
|
|
49
50
|
export { RatingStars } from './components/ui/RatingStars';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,7 @@ export { useCvDraftsStore } from './stores/cvDrafts.store';
|
|
|
34
34
|
// CV Builder: components (registry-based; no templates in package)
|
|
35
35
|
export { default as TemplateRenderer } from './components/cv/TemplateRenderer';
|
|
36
36
|
export { default as TemplatePicker } from './components/cv/TemplatePicker';
|
|
37
|
+
export { default as ResponsivePreview } from './components/cv/ResponsivePreview';
|
|
37
38
|
export { generateSampleTemplateData } from './components/cv/TemplatePicker';
|
|
38
39
|
// UI Components
|
|
39
40
|
export { RatingStars } from './components/ui/RatingStars';
|
package/package.json
CHANGED
|
@@ -1,51 +1,50 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@recruitnepal/shared-packages",
|
|
3
|
+
"version": "1.7.2",
|
|
4
|
+
"description": "Shared UI components and hooks for Recruit Nepal projects",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"dev": "tsc --watch",
|
|
10
|
+
"prepublishOnly": "npm run build"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"react",
|
|
14
|
+
"nextjs",
|
|
15
|
+
"recruit-nepal",
|
|
16
|
+
"shared-components",
|
|
17
|
+
"cv-builder"
|
|
18
|
+
],
|
|
19
|
+
"author": "",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"react": "^18.2.0",
|
|
23
|
+
"react-dom": "^18.2.0",
|
|
24
|
+
"@tanstack/react-query": "^5.50.0",
|
|
25
|
+
"zod": "^3.22.0",
|
|
26
|
+
"react-hook-form": "^7.49.0",
|
|
27
|
+
"@hookform/resolvers": "^3.3.0",
|
|
28
|
+
"zustand": "^4.5.0 || ^5.0.0",
|
|
29
|
+
"lucide-react": ">=0.263.0",
|
|
30
|
+
"@radix-ui/react-popover": "^1.0.0",
|
|
31
|
+
"cmdk": "^1.0.0"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"axios": "^1.7.8"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^20.11.17",
|
|
38
|
+
"@types/react": "^18.2.55",
|
|
39
|
+
"@types/react-dom": "^18.2.19",
|
|
40
|
+
"typescript": "^5.3.3",
|
|
41
|
+
"zod": "^3.22.0",
|
|
42
|
+
"react-hook-form": "^7.49.0",
|
|
43
|
+
"@hookform/resolvers": "^3.3.0",
|
|
44
|
+
"zustand": "^4.5.0"
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist",
|
|
48
|
+
"README.md"
|
|
49
|
+
]
|
|
50
|
+
}
|