@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.
Files changed (28) hide show
  1. package/dist/components/cv/ResponsivePreview.d.ts +7 -0
  2. package/dist/components/cv/ResponsivePreview.d.ts.map +1 -0
  3. package/dist/components/cv/ResponsivePreview.js +47 -0
  4. package/dist/components/cv-builder/forms/AboutForm.d.ts +2 -0
  5. package/dist/components/cv-builder/forms/AboutForm.d.ts.map +1 -0
  6. package/dist/components/cv-builder/forms/AboutForm.js +86 -0
  7. package/dist/components/cv-builder/forms/AdditionalDetailsForm.d.ts +2 -0
  8. package/dist/components/cv-builder/forms/AdditionalDetailsForm.d.ts.map +1 -0
  9. package/dist/components/cv-builder/forms/AdditionalDetailsForm.js +227 -0
  10. package/dist/components/cv-builder/forms/EducationForm.d.ts +2 -0
  11. package/dist/components/cv-builder/forms/EducationForm.d.ts.map +1 -0
  12. package/dist/components/cv-builder/forms/EducationForm.js +168 -0
  13. package/dist/components/cv-builder/forms/ExperienceForm.d.ts +2 -0
  14. package/dist/components/cv-builder/forms/ExperienceForm.d.ts.map +1 -0
  15. package/dist/components/cv-builder/forms/ExperienceForm.js +266 -0
  16. package/dist/components/cv-builder/forms/PortfolioForm.d.ts +2 -0
  17. package/dist/components/cv-builder/forms/PortfolioForm.d.ts.map +1 -0
  18. package/dist/components/cv-builder/forms/PortfolioForm.js +159 -0
  19. package/dist/components/cv-builder/forms/ProjectsForm.d.ts +2 -0
  20. package/dist/components/cv-builder/forms/ProjectsForm.d.ts.map +1 -0
  21. package/dist/components/cv-builder/forms/ProjectsForm.js +134 -0
  22. package/dist/components/cv-builder/forms/SkillsForm.d.ts +2 -0
  23. package/dist/components/cv-builder/forms/SkillsForm.d.ts.map +1 -0
  24. package/dist/components/cv-builder/forms/SkillsForm.js +250 -0
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -0
  28. 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';
@@ -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
- "name": "@recruitnepal/shared-packages",
3
- "version": "1.7.1",
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
- }
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
+ }