@ginia/ui 0.1.1 → 0.1.3

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 (273) hide show
  1. package/dist/components/domain/resume/resume-editor/resume-editor.cjs +13 -5
  2. package/dist/components/domain/resume/resume-editor/resume-editor.cjs.map +1 -1
  3. package/dist/components/domain/resume/resume-editor/resume-editor.d.cts +1 -1
  4. package/dist/components/domain/resume/resume-editor/resume-editor.d.ts +1 -1
  5. package/dist/components/domain/resume/resume-editor/resume-editor.js +19 -6
  6. package/dist/components/domain/resume/resume-editor/resume-editor.js.map +1 -1
  7. package/dist/components/domain/resume/resume-editor/sections/academic-info.cjs +1 -1
  8. package/dist/components/domain/resume/resume-editor/sections/academic-info.cjs.map +1 -1
  9. package/dist/components/domain/resume/resume-editor/sections/academic-info.js +1 -1
  10. package/dist/components/domain/resume/resume-editor/sections/academic-info.js.map +1 -1
  11. package/dist/components/domain/resume/resume-editor/sections/activities.cjs +25 -11
  12. package/dist/components/domain/resume/resume-editor/sections/activities.cjs.map +1 -1
  13. package/dist/components/domain/resume/resume-editor/sections/activities.js +25 -11
  14. package/dist/components/domain/resume/resume-editor/sections/activities.js.map +1 -1
  15. package/dist/components/domain/resume/resume-editor/sections/certifications.cjs +27 -12
  16. package/dist/components/domain/resume/resume-editor/sections/certifications.cjs.map +1 -1
  17. package/dist/components/domain/resume/resume-editor/sections/certifications.js +27 -12
  18. package/dist/components/domain/resume/resume-editor/sections/certifications.js.map +1 -1
  19. package/dist/components/domain/resume/resume-editor/sections/education.cjs +25 -11
  20. package/dist/components/domain/resume/resume-editor/sections/education.cjs.map +1 -1
  21. package/dist/components/domain/resume/resume-editor/sections/education.js +25 -11
  22. package/dist/components/domain/resume/resume-editor/sections/education.js.map +1 -1
  23. package/dist/components/domain/resume/resume-editor/sections/experience.cjs +25 -11
  24. package/dist/components/domain/resume/resume-editor/sections/experience.cjs.map +1 -1
  25. package/dist/components/domain/resume/resume-editor/sections/experience.js +25 -11
  26. package/dist/components/domain/resume/resume-editor/sections/experience.js.map +1 -1
  27. package/dist/components/domain/resume/resume-editor/sections/personal-info.cjs +1 -1
  28. package/dist/components/domain/resume/resume-editor/sections/personal-info.cjs.map +1 -1
  29. package/dist/components/domain/resume/resume-editor/sections/personal-info.js +1 -1
  30. package/dist/components/domain/resume/resume-editor/sections/personal-info.js.map +1 -1
  31. package/dist/components/domain/resume/resume-editor/sections/preferences.cjs +2 -2
  32. package/dist/components/domain/resume/resume-editor/sections/preferences.cjs.map +1 -1
  33. package/dist/components/domain/resume/resume-editor/sections/preferences.js +2 -2
  34. package/dist/components/domain/resume/resume-editor/sections/preferences.js.map +1 -1
  35. package/dist/components/domain/resume/resume-editor/sections/requirements.cjs +19 -11
  36. package/dist/components/domain/resume/resume-editor/sections/requirements.cjs.map +1 -1
  37. package/dist/components/domain/resume/resume-editor/sections/requirements.js +29 -12
  38. package/dist/components/domain/resume/resume-editor/sections/requirements.js.map +1 -1
  39. package/dist/components/domain/resume/resume-editor/sections/skills.cjs +30 -10
  40. package/dist/components/domain/resume/resume-editor/sections/skills.cjs.map +1 -1
  41. package/dist/components/domain/resume/resume-editor/sections/skills.js +30 -10
  42. package/dist/components/domain/resume/resume-editor/sections/skills.js.map +1 -1
  43. package/dist/components/domain/resume/resume-preview/resume-preview.cjs +27 -11
  44. package/dist/components/domain/resume/resume-preview/resume-preview.cjs.map +1 -1
  45. package/dist/components/domain/resume/resume-preview/resume-preview.js +27 -11
  46. package/dist/components/domain/resume/resume-preview/resume-preview.js.map +1 -1
  47. package/dist/components/domain/resume/resume-preview/sections/contact-skills.cjs +31 -15
  48. package/dist/components/domain/resume/resume-preview/sections/contact-skills.cjs.map +1 -1
  49. package/dist/components/domain/resume/resume-preview/sections/contact-skills.js +31 -15
  50. package/dist/components/domain/resume/resume-preview/sections/contact-skills.js.map +1 -1
  51. package/dist/components/domain/resume/resume-preview/sections/experience-education.cjs +131 -73
  52. package/dist/components/domain/resume/resume-preview/sections/experience-education.cjs.map +1 -1
  53. package/dist/components/domain/resume/resume-preview/sections/experience-education.d.cts +1 -1
  54. package/dist/components/domain/resume/resume-preview/sections/experience-education.d.ts +1 -1
  55. package/dist/components/domain/resume/resume-preview/sections/experience-education.js +131 -73
  56. package/dist/components/domain/resume/resume-preview/sections/experience-education.js.map +1 -1
  57. package/dist/components/domain/resume/resume-preview/sections/footer-preview.cjs +2 -2
  58. package/dist/components/domain/resume/resume-preview/sections/footer-preview.cjs.map +1 -1
  59. package/dist/components/domain/resume/resume-preview/sections/footer-preview.js +2 -2
  60. package/dist/components/domain/resume/resume-preview/sections/footer-preview.js.map +1 -1
  61. package/dist/components/domain/resume/resume-preview/sections/header-preview.cjs +7 -7
  62. package/dist/components/domain/resume/resume-preview/sections/header-preview.cjs.map +1 -1
  63. package/dist/components/domain/resume/resume-preview/sections/header-preview.js +7 -7
  64. package/dist/components/domain/resume/resume-preview/sections/header-preview.js.map +1 -1
  65. package/dist/components/domain/resume/resume.cjs +46 -29
  66. package/dist/components/domain/resume/resume.cjs.map +1 -1
  67. package/dist/components/domain/resume/resume.js +46 -29
  68. package/dist/components/domain/resume/resume.js.map +1 -1
  69. package/dist/components/ui/accordion/accordion.cjs +1 -3
  70. package/dist/components/ui/accordion/accordion.cjs.map +1 -1
  71. package/dist/components/ui/accordion/accordion.js +1 -3
  72. package/dist/components/ui/accordion/accordion.js.map +1 -1
  73. package/dist/components/ui/alert/alert.cjs +12 -25
  74. package/dist/components/ui/alert/alert.cjs.map +1 -1
  75. package/dist/components/ui/alert/alert.js +12 -25
  76. package/dist/components/ui/alert/alert.js.map +1 -1
  77. package/dist/components/ui/alert-dialog/alert-dialog.cjs +12 -46
  78. package/dist/components/ui/alert-dialog/alert-dialog.cjs.map +1 -1
  79. package/dist/components/ui/alert-dialog/alert-dialog.js +12 -46
  80. package/dist/components/ui/alert-dialog/alert-dialog.js.map +1 -1
  81. package/dist/components/ui/autocomplete/autocomplete.cjs +12 -12
  82. package/dist/components/ui/autocomplete/autocomplete.cjs.map +1 -1
  83. package/dist/components/ui/autocomplete/autocomplete.js +12 -12
  84. package/dist/components/ui/autocomplete/autocomplete.js.map +1 -1
  85. package/dist/components/ui/avatar/avatar.cjs +1 -4
  86. package/dist/components/ui/avatar/avatar.cjs.map +1 -1
  87. package/dist/components/ui/avatar/avatar.js +1 -4
  88. package/dist/components/ui/avatar/avatar.js.map +1 -1
  89. package/dist/components/ui/badge/badge.cjs +1 -8
  90. package/dist/components/ui/badge/badge.cjs.map +1 -1
  91. package/dist/components/ui/badge/badge.js +1 -8
  92. package/dist/components/ui/badge/badge.js.map +1 -1
  93. package/dist/components/ui/breadcrumb/breadcrumb.cjs +6 -19
  94. package/dist/components/ui/breadcrumb/breadcrumb.cjs.map +1 -1
  95. package/dist/components/ui/breadcrumb/breadcrumb.js +6 -19
  96. package/dist/components/ui/breadcrumb/breadcrumb.js.map +1 -1
  97. package/dist/components/ui/button/button.cjs.map +1 -1
  98. package/dist/components/ui/button/button.js.map +1 -1
  99. package/dist/components/ui/calendar/calendar.cjs +1 -6
  100. package/dist/components/ui/calendar/calendar.cjs.map +1 -1
  101. package/dist/components/ui/calendar/calendar.js +1 -6
  102. package/dist/components/ui/calendar/calendar.js.map +1 -1
  103. package/dist/components/ui/card/card.cjs +7 -17
  104. package/dist/components/ui/card/card.cjs.map +1 -1
  105. package/dist/components/ui/card/card.js +7 -17
  106. package/dist/components/ui/card/card.js.map +1 -1
  107. package/dist/components/ui/carousel/carousel.cjs +4 -11
  108. package/dist/components/ui/carousel/carousel.cjs.map +1 -1
  109. package/dist/components/ui/carousel/carousel.js +4 -11
  110. package/dist/components/ui/carousel/carousel.js.map +1 -1
  111. package/dist/components/ui/checkbox/checkbox.cjs +1 -7
  112. package/dist/components/ui/checkbox/checkbox.cjs.map +1 -1
  113. package/dist/components/ui/checkbox/checkbox.js +1 -7
  114. package/dist/components/ui/checkbox/checkbox.js.map +1 -1
  115. package/dist/components/ui/collapsible/collapsible.cjs.map +1 -1
  116. package/dist/components/ui/collapsible/collapsible.js.map +1 -1
  117. package/dist/components/ui/combobox/combobox.cjs +1 -3
  118. package/dist/components/ui/combobox/combobox.cjs.map +1 -1
  119. package/dist/components/ui/combobox/combobox.js +1 -3
  120. package/dist/components/ui/combobox/combobox.js.map +1 -1
  121. package/dist/components/ui/command/command.cjs +7 -24
  122. package/dist/components/ui/command/command.cjs.map +1 -1
  123. package/dist/components/ui/command/command.js +7 -24
  124. package/dist/components/ui/command/command.js.map +1 -1
  125. package/dist/components/ui/context-menu/context-menu.cjs +4 -18
  126. package/dist/components/ui/context-menu/context-menu.cjs.map +1 -1
  127. package/dist/components/ui/context-menu/context-menu.js +4 -18
  128. package/dist/components/ui/context-menu/context-menu.js.map +1 -1
  129. package/dist/components/ui/date-picker/date-picker.cjs +21 -57
  130. package/dist/components/ui/date-picker/date-picker.cjs.map +1 -1
  131. package/dist/components/ui/date-picker/date-picker.js +22 -62
  132. package/dist/components/ui/date-picker/date-picker.js.map +1 -1
  133. package/dist/components/ui/dialog/dialog.cjs +12 -29
  134. package/dist/components/ui/dialog/dialog.cjs.map +1 -1
  135. package/dist/components/ui/dialog/dialog.js +12 -29
  136. package/dist/components/ui/dialog/dialog.js.map +1 -1
  137. package/dist/components/ui/drawer/drawer.cjs +9 -23
  138. package/dist/components/ui/drawer/drawer.cjs.map +1 -1
  139. package/dist/components/ui/drawer/drawer.js +9 -23
  140. package/dist/components/ui/drawer/drawer.js.map +1 -1
  141. package/dist/components/ui/dropdown-menu/dropdown-menu.cjs +3 -16
  142. package/dist/components/ui/dropdown-menu/dropdown-menu.cjs.map +1 -1
  143. package/dist/components/ui/dropdown-menu/dropdown-menu.js +3 -16
  144. package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
  145. package/dist/components/ui/form/form.cjs +7 -24
  146. package/dist/components/ui/form/form.cjs.map +1 -1
  147. package/dist/components/ui/form/form.js +7 -24
  148. package/dist/components/ui/form/form.js.map +1 -1
  149. package/dist/components/ui/hover-card/hover-card.cjs +2 -6
  150. package/dist/components/ui/hover-card/hover-card.cjs.map +1 -1
  151. package/dist/components/ui/hover-card/hover-card.js +2 -6
  152. package/dist/components/ui/hover-card/hover-card.js.map +1 -1
  153. package/dist/components/ui/icon/icon.cjs +1 -1
  154. package/dist/components/ui/icon/icon.cjs.map +1 -1
  155. package/dist/components/ui/icon/icon.js +1 -1
  156. package/dist/components/ui/icon/icon.js.map +1 -1
  157. package/dist/components/ui/input/input.cjs +1 -1
  158. package/dist/components/ui/input/input.cjs.map +1 -1
  159. package/dist/components/ui/input/input.js +1 -1
  160. package/dist/components/ui/input/input.js.map +1 -1
  161. package/dist/components/ui/input-field/input-field.cjs +1 -1
  162. package/dist/components/ui/input-field/input-field.cjs.map +1 -1
  163. package/dist/components/ui/input-field/input-field.js +1 -1
  164. package/dist/components/ui/input-field/input-field.js.map +1 -1
  165. package/dist/components/ui/input-otp/input-otp.cjs +5 -15
  166. package/dist/components/ui/input-otp/input-otp.cjs.map +1 -1
  167. package/dist/components/ui/input-otp/input-otp.js +5 -15
  168. package/dist/components/ui/input-otp/input-otp.js.map +1 -1
  169. package/dist/components/ui/label/label.cjs +2 -5
  170. package/dist/components/ui/label/label.cjs.map +1 -1
  171. package/dist/components/ui/label/label.js +2 -5
  172. package/dist/components/ui/label/label.js.map +1 -1
  173. package/dist/components/ui/loading-state/loading-state.cjs +3 -8
  174. package/dist/components/ui/loading-state/loading-state.cjs.map +1 -1
  175. package/dist/components/ui/loading-state/loading-state.d.cts +1 -1
  176. package/dist/components/ui/loading-state/loading-state.d.ts +1 -1
  177. package/dist/components/ui/loading-state/loading-state.js +3 -8
  178. package/dist/components/ui/loading-state/loading-state.js.map +1 -1
  179. package/dist/components/ui/menubar/menubar.cjs +5 -21
  180. package/dist/components/ui/menubar/menubar.cjs.map +1 -1
  181. package/dist/components/ui/menubar/menubar.js +5 -21
  182. package/dist/components/ui/menubar/menubar.js.map +1 -1
  183. package/dist/components/ui/month-year-picker/month-year-picker.cjs +5 -23
  184. package/dist/components/ui/month-year-picker/month-year-picker.cjs.map +1 -1
  185. package/dist/components/ui/month-year-picker/month-year-picker.js +6 -28
  186. package/dist/components/ui/month-year-picker/month-year-picker.js.map +1 -1
  187. package/dist/components/ui/multi-select/multi-select.cjs +12 -29
  188. package/dist/components/ui/multi-select/multi-select.cjs.map +1 -1
  189. package/dist/components/ui/multi-select/multi-select.js +12 -29
  190. package/dist/components/ui/multi-select/multi-select.js.map +1 -1
  191. package/dist/components/ui/navigation-menu/navigation-menu.cjs +7 -13
  192. package/dist/components/ui/navigation-menu/navigation-menu.cjs.map +1 -1
  193. package/dist/components/ui/navigation-menu/navigation-menu.js +7 -13
  194. package/dist/components/ui/navigation-menu/navigation-menu.js.map +1 -1
  195. package/dist/components/ui/pagination/pagination.cjs +4 -18
  196. package/dist/components/ui/pagination/pagination.cjs.map +1 -1
  197. package/dist/components/ui/pagination/pagination.js +4 -18
  198. package/dist/components/ui/pagination/pagination.js.map +1 -1
  199. package/dist/components/ui/popover/popover.cjs.map +1 -1
  200. package/dist/components/ui/popover/popover.js.map +1 -1
  201. package/dist/components/ui/progress/progress.cjs +2 -2
  202. package/dist/components/ui/progress/progress.cjs.map +1 -1
  203. package/dist/components/ui/progress/progress.js +2 -2
  204. package/dist/components/ui/progress/progress.js.map +1 -1
  205. package/dist/components/ui/radio-group/radio-group.cjs +1 -8
  206. package/dist/components/ui/radio-group/radio-group.cjs.map +1 -1
  207. package/dist/components/ui/radio-group/radio-group.js +1 -8
  208. package/dist/components/ui/radio-group/radio-group.js.map +1 -1
  209. package/dist/components/ui/resizable/resizable.cjs +3 -6
  210. package/dist/components/ui/resizable/resizable.cjs.map +1 -1
  211. package/dist/components/ui/resizable/resizable.js +4 -11
  212. package/dist/components/ui/resizable/resizable.js.map +1 -1
  213. package/dist/components/ui/rich-text-editor/rich-text-editor.cjs +25 -37
  214. package/dist/components/ui/rich-text-editor/rich-text-editor.cjs.map +1 -1
  215. package/dist/components/ui/rich-text-editor/rich-text-editor.js +25 -37
  216. package/dist/components/ui/rich-text-editor/rich-text-editor.js.map +1 -1
  217. package/dist/components/ui/scroll-area/scroll-area.cjs.map +1 -1
  218. package/dist/components/ui/scroll-area/scroll-area.js.map +1 -1
  219. package/dist/components/ui/section-loader/section-loader.cjs +4 -15
  220. package/dist/components/ui/section-loader/section-loader.cjs.map +1 -1
  221. package/dist/components/ui/section-loader/section-loader.js +4 -15
  222. package/dist/components/ui/section-loader/section-loader.js.map +1 -1
  223. package/dist/components/ui/select/select.cjs +11 -29
  224. package/dist/components/ui/select/select.cjs.map +1 -1
  225. package/dist/components/ui/select/select.js +11 -29
  226. package/dist/components/ui/select/select.js.map +1 -1
  227. package/dist/components/ui/separator/separator.cjs +14 -16
  228. package/dist/components/ui/separator/separator.cjs.map +1 -1
  229. package/dist/components/ui/separator/separator.js +14 -16
  230. package/dist/components/ui/separator/separator.js.map +1 -1
  231. package/dist/components/ui/sheet/sheet.cjs +10 -24
  232. package/dist/components/ui/sheet/sheet.cjs.map +1 -1
  233. package/dist/components/ui/sheet/sheet.js +10 -24
  234. package/dist/components/ui/sheet/sheet.js.map +1 -1
  235. package/dist/components/ui/skeleton/skeleton.cjs +2 -11
  236. package/dist/components/ui/skeleton/skeleton.cjs.map +1 -1
  237. package/dist/components/ui/skeleton/skeleton.js +2 -11
  238. package/dist/components/ui/skeleton/skeleton.js.map +1 -1
  239. package/dist/components/ui/slider/slider.cjs +1 -4
  240. package/dist/components/ui/slider/slider.cjs.map +1 -1
  241. package/dist/components/ui/slider/slider.js +1 -4
  242. package/dist/components/ui/slider/slider.js.map +1 -1
  243. package/dist/components/ui/sonner/sonner.cjs.map +1 -1
  244. package/dist/components/ui/sonner/sonner.js.map +1 -1
  245. package/dist/components/ui/spinner/spinner.cjs +1 -1
  246. package/dist/components/ui/spinner/spinner.cjs.map +1 -1
  247. package/dist/components/ui/spinner/spinner.js +1 -1
  248. package/dist/components/ui/spinner/spinner.js.map +1 -1
  249. package/dist/components/ui/switch/switch.cjs.map +1 -1
  250. package/dist/components/ui/switch/switch.js.map +1 -1
  251. package/dist/components/ui/table/table.cjs +6 -28
  252. package/dist/components/ui/table/table.cjs.map +1 -1
  253. package/dist/components/ui/table/table.js +6 -28
  254. package/dist/components/ui/table/table.js.map +1 -1
  255. package/dist/components/ui/tabs/tabs.cjs.map +1 -1
  256. package/dist/components/ui/tabs/tabs.js.map +1 -1
  257. package/dist/components/ui/textarea/textarea.cjs +1 -4
  258. package/dist/components/ui/textarea/textarea.cjs.map +1 -1
  259. package/dist/components/ui/textarea/textarea.js +1 -4
  260. package/dist/components/ui/textarea/textarea.js.map +1 -1
  261. package/dist/components/ui/toast/toast.cjs +3 -12
  262. package/dist/components/ui/toast/toast.cjs.map +1 -1
  263. package/dist/components/ui/toast/toast.js +3 -12
  264. package/dist/components/ui/toast/toast.js.map +1 -1
  265. package/dist/components/ui/toggle/toggle.cjs.map +1 -1
  266. package/dist/components/ui/toggle/toggle.js.map +1 -1
  267. package/dist/components/ui/toggle-group/toggle-group.cjs +1 -4
  268. package/dist/components/ui/toggle-group/toggle-group.cjs.map +1 -1
  269. package/dist/components/ui/toggle-group/toggle-group.js +1 -4
  270. package/dist/components/ui/toggle-group/toggle-group.js.map +1 -1
  271. package/dist/components/ui/tooltip/tooltip.cjs.map +1 -1
  272. package/dist/components/ui/tooltip/tooltip.js.map +1 -1
  273. package/package.json +1 -1
@@ -35,20 +35,38 @@ var import_jsx_runtime = require("react/jsx-runtime");
35
35
  var import_react = require("react");
36
36
  var import_html2canvas = __toESM(require("html2canvas"), 1);
37
37
  var import_jspdf = require("jspdf");
38
- var import_resume_editor = require("@/components/domain/resume/resume-editor/resume-editor");
39
- var import_resume_preview = require("@/components/domain/resume/resume-preview/resume-preview");
40
- var import_button = require("@/components/ui/button");
38
+ var import_resume_editor = require("./resume-editor/resume-editor");
39
+ var import_resume_preview = require("./resume-preview/resume-preview");
40
+ var import_button = require("../../ui/button");
41
41
  var import_lucide_react = require("lucide-react");
42
- var import_sheet = require("@/components/ui/sheet");
42
+ var import_sheet = require("../../ui/sheet");
43
43
  function calculateDiffs(original, current) {
44
44
  const candidateData = {};
45
- if (original.student_education_institution_id !== current.student_education_institution_id) candidateData.student_education_institution_id = current.student_education_institution_id;
46
- if (original.education_institution_id !== current.education_institution_id) candidateData.education_institution_id = current.education_institution_id;
47
- if (original.program_name !== current.program_name) candidateData.program_name = current.program_name;
48
- if (JSON.stringify(original.preferences) !== JSON.stringify(current.preferences)) candidateData.preferences = current.preferences;
49
- if (JSON.stringify(original.advanced) !== JSON.stringify(current.advanced)) candidateData.advanced = current.advanced;
45
+ if (original.student_education_institution_id !== current.student_education_institution_id)
46
+ candidateData.student_education_institution_id = current.student_education_institution_id;
47
+ if (original.education_institution_id !== current.education_institution_id)
48
+ candidateData.education_institution_id = current.education_institution_id;
49
+ if (original.program_name !== current.program_name)
50
+ candidateData.program_name = current.program_name;
51
+ if (JSON.stringify(original.preferences) !== JSON.stringify(current.preferences))
52
+ candidateData.preferences = current.preferences;
53
+ if (JSON.stringify(original.advanced) !== JSON.stringify(current.advanced))
54
+ candidateData.advanced = current.advanced;
50
55
  const userData = {};
51
- const userFields = ["first_name", "middle_name", "last_name", "second_last_name", "phone_number", "phone_number_2", "email", "city", "address", "postal_code", "birth_date", "photo_url"];
56
+ const userFields = [
57
+ "first_name",
58
+ "middle_name",
59
+ "last_name",
60
+ "second_last_name",
61
+ "phone_number",
62
+ "phone_number_2",
63
+ "email",
64
+ "city",
65
+ "address",
66
+ "postal_code",
67
+ "birth_date",
68
+ "photo_url"
69
+ ];
52
70
  userFields.forEach((field) => {
53
71
  if (original[field] !== current[field]) {
54
72
  userData[field] = current[field];
@@ -82,10 +100,7 @@ function calculateDiffs(original, current) {
82
100
  const hwCurr = current.skills?.hard || [];
83
101
  const swOrig = original.skills?.soft || [];
84
102
  const swCurr = current.skills?.soft || [];
85
- const skillsDiff = [
86
- ...calculateArrayDiff(hwOrig, hwCurr),
87
- ...calculateArrayDiff(swOrig, swCurr)
88
- ];
103
+ const skillsDiff = [...calculateArrayDiff(hwOrig, hwCurr), ...calculateArrayDiff(swOrig, swCurr)];
89
104
  return {
90
105
  candidate: {
91
106
  action: Object.keys(candidateData).length > 0 ? "update" : "none",
@@ -183,7 +198,9 @@ function Resume({
183
198
  svg.style.marginRight = "0.4rem";
184
199
  svg.style.marginBottom = "-1.2rem";
185
200
  });
186
- const clampElements = clonedElement.querySelectorAll(".line-clamp-1, .line-clamp-2, .line-clamp-3");
201
+ const clampElements = clonedElement.querySelectorAll(
202
+ ".line-clamp-1, .line-clamp-2, .line-clamp-3"
203
+ );
187
204
  clampElements.forEach((el) => {
188
205
  if (el instanceof HTMLElement) {
189
206
  el.style.display = "block";
@@ -271,10 +288,10 @@ function Resume({
271
288
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
272
289
  "div",
273
290
  {
274
- className: "relative w-full h-full bg-muted/20 py-8 px-4 sm:px-8 overflow-y-auto",
291
+ className: "relative h-full w-full overflow-y-auto bg-muted/20 px-4 py-8 sm:px-8",
275
292
  style: themeStyle,
276
293
  children: [
277
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full max-w-5xl mx-auto h-full", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
294
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mx-auto h-full w-full max-w-5xl", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
278
295
  import_resume_preview.ResumePreview,
279
296
  {
280
297
  ref: previewRef,
@@ -285,16 +302,16 @@ function Resume({
285
302
  hideSections
286
303
  }
287
304
  ) }),
288
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "fixed bottom-6 right-6 z-50 flex flex-col sm:flex-row gap-3", children: [
305
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "fixed bottom-6 right-6 z-50 flex flex-col gap-3 sm:flex-row", children: [
289
306
  editable && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_sheet.Sheet, { open: isOpen, onOpenChange: handleOpenChange, children: [
290
307
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_sheet.SheetTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
291
308
  import_button.Button,
292
309
  {
293
310
  size: "lg",
294
- className: "shadow-xl rounded-full px-4 flex items-center gap-2 bg-primary text-primary-foreground hover:bg-primary/90",
311
+ className: "flex items-center gap-2 rounded-full bg-primary px-4 text-primary-foreground shadow-xl hover:bg-primary/90",
295
312
  children: [
296
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Edit, { className: "w-5 h-5" }),
297
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "hidden sm:inline font-semibold", children: "Editar" })
313
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Edit, { className: "h-5 w-5" }),
314
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "hidden font-semibold sm:inline", children: "Editar" })
298
315
  ]
299
316
  }
300
317
  ) }),
@@ -303,12 +320,12 @@ function Resume({
303
320
  {
304
321
  side: "right",
305
322
  showCloseButton: false,
306
- className: "w-full sm:max-w-md md:max-w-2xl p-0 flex flex-col overflow-hidden bg-card",
323
+ className: "flex w-full flex-col overflow-hidden bg-card p-0 sm:max-w-md md:max-w-2xl",
307
324
  children: [
308
325
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between p-6 pb-2", children: [
309
326
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_sheet.SheetTitle, { className: "text-2xl font-bold text-foreground", children: "Editar" }),
310
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_sheet.SheetClose, { className: "rounded-full p-2 hover:bg-muted transition-colors opacity-70 hover:opacity-100", children: [
311
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.X, { className: "w-6 h-6 text-foreground" }),
327
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_sheet.SheetClose, { className: "rounded-full p-2 opacity-70 transition-colors hover:bg-muted hover:opacity-100", children: [
328
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.X, { className: "h-6 w-6 text-foreground" }),
312
329
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: "Cerrar" })
313
330
  ] })
314
331
  ] }),
@@ -323,10 +340,10 @@ function Resume({
323
340
  menuSlot
324
341
  }
325
342
  ) }),
326
- onSave && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: " p-4 flex justify-end gap-3", children: [
343
+ onSave && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex justify-end gap-3 p-4", children: [
327
344
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_sheet.SheetClose, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { variant: "outline", children: "Cancelar" }) }),
328
345
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_button.Button, { onClick: handleSave, className: "gap-2", children: [
329
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Save, { className: "w-4 h-4" }),
346
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Save, { className: "h-4 w-4" }),
330
347
  "Guardar"
331
348
  ] })
332
349
  ] })
@@ -341,10 +358,10 @@ function Resume({
341
358
  variant: "ghost",
342
359
  disabled: isDownloading,
343
360
  onClick: handleDownload,
344
- className: "shadow-xl rounded-full px-4 flex items-center gap-2 text-secondary text-purple-800 bg-purple-200",
361
+ className: "flex items-center gap-2 rounded-full bg-purple-200 px-4 text-purple-800 text-secondary shadow-xl",
345
362
  children: [
346
- isDownloading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "w-5 h-5 animate-spin" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Download, { className: "w-5 h-5" }),
347
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "hidden sm:inline font-semibold", children: isDownloading ? "Generando..." : "Descargar" })
363
+ isDownloading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { className: "h-5 w-5 animate-spin" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Download, { className: "h-5 w-5" }),
364
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "hidden font-semibold sm:inline", children: isDownloading ? "Generando..." : "Descargar" })
348
365
  ]
349
366
  }
350
367
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/domain/resume/resume.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport html2canvas from \"html2canvas\";\nimport { jsPDF } from \"jspdf\";\nimport { CandidateProfile, ResumeProps, ResumeSavePayload, Action } from \"@/components/domain/resume/types\";\nimport { ResumeEditor } from \"@/components/domain/resume/resume-editor/resume-editor\";\nimport { ResumePreview } from \"@/components/domain/resume/resume-preview/resume-preview\";\nimport { Button } from \"@/components/ui/button\";\nimport { Download, Edit, Loader2, Save, X } from \"lucide-react\";\nimport { Sheet, SheetTrigger, SheetContent, SheetTitle, SheetClose } from \"@/components/ui/sheet\";\n\nfunction calculateDiffs(original: CandidateProfile, current: CandidateProfile): ResumeSavePayload {\n // Determine diff for candidate table (academic info etc)\n const candidateData: Partial<CandidateProfile> = {};\n if (original.student_education_institution_id !== current.student_education_institution_id) candidateData.student_education_institution_id = current.student_education_institution_id;\n if (original.education_institution_id !== current.education_institution_id) candidateData.education_institution_id = current.education_institution_id;\n if (original.program_name !== current.program_name) candidateData.program_name = current.program_name;\n if (JSON.stringify(original.preferences) !== JSON.stringify(current.preferences)) candidateData.preferences = current.preferences;\n if (JSON.stringify(original.advanced) !== JSON.stringify(current.advanced)) candidateData.advanced = current.advanced;\n\n // Determine diff for user table (personal info)\n const userData: Partial<CandidateProfile> = {};\n const userFields: (keyof CandidateProfile)[] = ['first_name', 'middle_name', 'last_name', 'second_last_name', 'phone_number', 'phone_number_2', 'email', 'city', 'address', 'postal_code', 'birth_date', 'photo_url'];\n userFields.forEach(field => {\n if (original[field] !== current[field]) {\n // @ts-expect-error - jspdf types are a bit funky\n userData[field] = current[field];\n }\n });\n\n // Helper for array diffs\n const calculateArrayDiff = (origArray: any[] = [], currArray: any[] = []) => {\n const changes: any[] = [];\n const origMap = new Map(origArray.map(item => [item.id, item]));\n\n currArray.forEach(currItem => {\n const origItem = origMap.get(currItem.id);\n if (!origItem) {\n // New item\n changes.push({ action: 'create' as Action, data: currItem });\n } else if (JSON.stringify(origItem) !== JSON.stringify(currItem)) {\n // Updated item\n changes.push({ action: 'update' as Action, data: currItem, id: currItem.id });\n }\n });\n\n const currMap = new Map(currArray.map(item => [item.id, item]));\n origArray.forEach(origItem => {\n if (!currMap.has(origItem.id)) {\n // Deleted item\n changes.push({ action: 'delete' as Action, id: origItem.id });\n }\n });\n\n return changes;\n };\n\n const experiencesDiff = [\n ...calculateArrayDiff(original.work_experience, current.work_experience),\n ...calculateArrayDiff(original.education, current.education),\n ...calculateArrayDiff(original.activities, current.activities)\n ];\n\n const hwOrig = original.skills?.hard || [];\n const hwCurr = current.skills?.hard || [];\n const swOrig = original.skills?.soft || [];\n const swCurr = current.skills?.soft || [];\n\n const skillsDiff = [\n ...calculateArrayDiff(hwOrig, hwCurr),\n ...calculateArrayDiff(swOrig, swCurr)\n ];\n\n return {\n candidate: {\n action: Object.keys(candidateData).length > 0 ? 'update' : 'none',\n data: candidateData\n },\n user: {\n action: Object.keys(userData).length > 0 ? 'update' : 'none',\n data: userData\n },\n curriculum: {\n action: original.summary !== current.summary ? 'update' : 'none',\n data: { summary: current.summary }\n },\n experiences: experiencesDiff,\n skills: skillsDiff,\n certifications: calculateArrayDiff(original.certifications, current.certifications)\n };\n}\n\nexport function Resume({\n data,\n editable = false,\n headerSlot,\n withDownload = false,\n theme = \"hsl(var(--secondary))\",\n hideFields = [],\n hideSections = [],\n menuSlot = [],\n onSave,\n}: ResumeProps) {\n const themeStyle = theme ? { \"--cv-theme\": theme } as React.CSSProperties : undefined;\n const [draftData, setDraftData] = useState<CandidateProfile>(data);\n const [isOpen, setIsOpen] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const previewRef = useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (open: boolean) => {\n if (open) {\n setDraftData(data);\n }\n setIsOpen(open);\n };\n\n const handleSave = () => {\n if (onSave) {\n const payload = calculateDiffs(data, draftData);\n onSave(payload, draftData);\n }\n setIsOpen(false);\n };\n\n const handleDownload = async () => {\n if (!previewRef.current || isDownloading) return;\n setIsDownloading(true);\n\n try {\n const element = previewRef.current;\n const canvas = await html2canvas(element, {\n scale: 2,\n useCORS: true,\n backgroundColor: \"#ffffff\",\n logging: false,\n windowWidth: 1200, // Force desktop layout breakpoint\n onclone: (clonedDoc) => {\n const clonedElement = clonedDoc.getElementById(\"resume-capture-area\");\n if (clonedElement instanceof HTMLElement) {\n clonedElement.style.height = \"auto\";\n clonedElement.style.overflow = \"visible\";\n clonedElement.style.width = \"1200px\";\n\n // Fix for images with object-fit: cover not being respected by html2canvas\n const objectCoverImages = clonedElement.querySelectorAll(\"img.object-cover\");\n objectCoverImages.forEach((img) => {\n if (img instanceof HTMLImageElement) {\n const parent = img.parentElement;\n if (parent) {\n // Replace img with a div that has background-image: cover\n const div = clonedDoc.createElement(\"div\");\n div.style.width = \"100%\";\n div.style.height = \"100%\";\n div.style.backgroundImage = `url(${img.src})`;\n div.style.backgroundSize = \"cover\";\n div.style.backgroundPosition = \"center\";\n div.style.borderRadius = window.getComputedStyle(img).borderRadius;\n div.className = img.className;\n parent.style.marginTop = \"1rem\"\n parent.replaceChild(div, img);\n }\n }\n });\n\n // Hide elements marked as hidden for PDF\n const hiddenElements = clonedElement.querySelectorAll(\".pdf-hidden\");\n hiddenElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"none\";\n }\n });\n\n // Fix SVG vertical alignment for html2canvas\n // html2canvas doesn't properly handle flex align-items with SVGs\n const svgs = clonedElement.querySelectorAll(\"svg\");\n svgs.forEach((svg) => {\n svg.style.display = \"inline-block\";\n svg.style.verticalAlign = \"middle\";\n svg.style.flexShrink = \"0\";\n svg.style.marginRight = \"0.4rem\";\n svg.style.marginBottom = \"-1.2rem\";\n });\n\n // Fix line-clamp which causes text vertical cut-offs in html2canvas\n const clampElements = clonedElement.querySelectorAll(\".line-clamp-1, .line-clamp-2, .line-clamp-3\");\n clampElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"block\";\n el.style.webkitLineClamp = \"unset\";\n el.style.webkitBoxOrient = \"unset\";\n el.style.overflow = \"visible\";\n el.style.whiteSpace = \"normal\";\n el.style.lineHeight = \"1.5\";\n }\n });\n\n // Replace generic HTML elements like custom badges with simple spans\n // because html2canvas struggles with flexbox and strict borders inside round pills\n const badges = clonedElement.querySelectorAll(\".pdf-badge\");\n badges.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.paddingTop = \"-10px\"\n el.style.display = \"block\";\n el.style.paddingTop = \"0px\";\n el.style.paddingBottom = \"0.8rem\";\n }\n });\n\n // Fix headers with bottom borders losing padding/margin\n const headersWithBorders = clonedElement.querySelectorAll(\"h1, h2, h3, h4\");\n headersWithBorders.forEach((el) => {\n if (el instanceof HTMLElement) {\n const hasBorder = el.className.includes(\"border-b\") || el.style.borderBottomWidth !== \"\";\n if (hasBorder) {\n el.style.paddingBottom = \"1.2rem\";\n }\n }\n });\n\n // Add margin top to pdf-line-v elements\n const verticalLines = clonedElement.querySelectorAll(\".pdf-line-v\");\n verticalLines.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.marginTop = \"0.5rem\";\n el.style.zIndex = \"5\"\n }\n });\n\n // Add margin bottom to initials in header for better alignment in PDF\n const headerInitials = clonedElement.querySelectorAll(\".pdf-header-initials\");\n headerInitials.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.paddingBottom = \"2rem\";\n }\n });\n\n // Add styles to summary for PDF\n const summaries = clonedElement.querySelectorAll(\".pdf-summary\");\n summaries.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.width = \"100%\";\n el.style.maxWidth = \"100%\";\n el.style.marginTop = \"1.5rem\";\n }\n });\n\n // Show footer in PDF and force grayscale for the logo\n const pdfFooters = clonedElement.querySelectorAll(\".pdf-footer\");\n pdfFooters.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"flex\";\n }\n });\n\n // Also make sure parent containers don't restrict height\n let parent = clonedElement.parentElement;\n while (parent) {\n parent.style.height = \"auto\";\n parent.style.overflow = \"visible\";\n parent = parent.parentElement;\n }\n }\n }\n });\n\n const imgData = canvas.toDataURL(\"image/jpeg\", 1);\n const imgWidthPx = canvas.width;\n const imgHeightPx = canvas.height;\n\n // Convert px to mm (at 96 DPI base * scale factor)\n const pxToMm = 25.4 / (96 * 2);\n const pdfWidth = imgWidthPx * pxToMm;\n const pdfHeight = imgHeightPx * pxToMm;\n\n const pdf = new jsPDF({\n orientation: pdfWidth > pdfHeight ? \"landscape\" : \"portrait\",\n unit: \"mm\",\n format: [pdfWidth, pdfHeight],\n });\n\n pdf.addImage(imgData, \"JPEG\", 0, 0, pdfWidth, pdfHeight, undefined, 'FAST');\n\n const fileName = `CV_${data.first_name}_${data.last_name}`.replace(/\\s+/g, \"_\");\n pdf.save(`${fileName}.pdf`);\n } catch (error) {\n console.error(\"Error generating PDF:\", error);\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n <div\n className=\"relative w-full h-full bg-muted/20 py-8 px-4 sm:px-8 overflow-y-auto\"\n style={themeStyle}\n >\n {/* Preview Panel - Takes full width, centered like a document */}\n <div className=\"w-full max-w-5xl mx-auto h-full\">\n <ResumePreview\n ref={previewRef}\n data={draftData}\n headerSlot={headerSlot}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n />\n </div>\n\n {/* Floating Action Buttons */}\n <div className=\"fixed bottom-6 right-6 z-50 flex flex-col sm:flex-row gap-3\">\n {editable && (\n <Sheet open={isOpen} onOpenChange={handleOpenChange}>\n <SheetTrigger asChild>\n <Button\n size=\"lg\"\n className=\"shadow-xl rounded-full px-4 flex items-center gap-2 bg-primary text-primary-foreground hover:bg-primary/90\"\n >\n <Edit className=\"w-5 h-5\" />\n <span className=\"hidden sm:inline font-semibold\">Editar</span>\n </Button>\n </SheetTrigger>\n {/* Drawer opens from the right side, taking good width */}\n <SheetContent\n side=\"right\"\n showCloseButton={false}\n className=\"w-full sm:max-w-md md:max-w-2xl p-0 flex flex-col overflow-hidden bg-card\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-6 pb-2\">\n <SheetTitle className=\"text-2xl font-bold text-foreground\">Editar</SheetTitle>\n <SheetClose className=\"rounded-full p-2 hover:bg-muted transition-colors opacity-70 hover:opacity-100\">\n <X className=\"w-6 h-6 text-foreground\" />\n <span className=\"sr-only\">Cerrar</span>\n </SheetClose>\n </div>\n\n {/* Scrollable editor content */}\n <div className=\"flex-1 overflow-y-auto px-6 pb-6 pt-2\">\n <ResumeEditor\n data={draftData}\n onChange={setDraftData}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n menuSlot={menuSlot}\n />\n </div>\n\n {/* Sticky save footer */}\n {onSave && (\n <div className=\" p-4 flex justify-end gap-3\">\n <SheetClose asChild>\n <Button variant=\"outline\">Cancelar</Button>\n </SheetClose>\n <Button onClick={handleSave} className=\"gap-2\">\n <Save className=\"w-4 h-4\" />\n Guardar\n </Button>\n </div>\n )}\n </SheetContent>\n </Sheet>\n )}\n\n {withDownload && (\n <Button\n size=\"lg\"\n variant=\"ghost\"\n disabled={isDownloading}\n onClick={handleDownload}\n className=\"shadow-xl rounded-full px-4 flex items-center gap-2 text-secondary text-purple-800 bg-purple-200\"\n >\n {isDownloading ? (\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Download className=\"w-5 h-5\" />\n )}\n <span className=\"hidden sm:inline font-semibold\">\n {isDownloading ? \"Generando...\" : \"Descargar\"}\n </span>\n </Button>\n )}\n </div>\n </div>\n );\n}\n\n"],"mappings":"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","names":["html2canvas","parent"]}
1
+ {"version":3,"sources":["../../../../src/components/domain/resume/resume.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport html2canvas from \"html2canvas\";\nimport { jsPDF } from \"jspdf\";\nimport { CandidateProfile, ResumeProps, ResumeSavePayload, Action } from \"./types\";\nimport { ResumeEditor } from \"./resume-editor/resume-editor\";\nimport { ResumePreview } from \"./resume-preview/resume-preview\";\nimport { Button } from \"../../ui/button\";\nimport { Download, Edit, Loader2, Save, X } from \"lucide-react\";\nimport { Sheet, SheetTrigger, SheetContent, SheetTitle, SheetClose } from \"../../ui/sheet\";\n\nfunction calculateDiffs(original: CandidateProfile, current: CandidateProfile): ResumeSavePayload {\n // Determine diff for candidate table (academic info etc)\n const candidateData: Partial<CandidateProfile> = {};\n if (original.student_education_institution_id !== current.student_education_institution_id)\n candidateData.student_education_institution_id = current.student_education_institution_id;\n if (original.education_institution_id !== current.education_institution_id)\n candidateData.education_institution_id = current.education_institution_id;\n if (original.program_name !== current.program_name)\n candidateData.program_name = current.program_name;\n if (JSON.stringify(original.preferences) !== JSON.stringify(current.preferences))\n candidateData.preferences = current.preferences;\n if (JSON.stringify(original.advanced) !== JSON.stringify(current.advanced))\n candidateData.advanced = current.advanced;\n\n // Determine diff for user table (personal info)\n const userData: Partial<CandidateProfile> = {};\n const userFields: (keyof CandidateProfile)[] = [\n \"first_name\",\n \"middle_name\",\n \"last_name\",\n \"second_last_name\",\n \"phone_number\",\n \"phone_number_2\",\n \"email\",\n \"city\",\n \"address\",\n \"postal_code\",\n \"birth_date\",\n \"photo_url\",\n ];\n userFields.forEach((field) => {\n if (original[field] !== current[field]) {\n // @ts-expect-error - jspdf types are a bit funky\n userData[field] = current[field];\n }\n });\n\n // Helper for array diffs\n const calculateArrayDiff = (origArray: any[] = [], currArray: any[] = []) => {\n const changes: any[] = [];\n const origMap = new Map(origArray.map((item) => [item.id, item]));\n\n currArray.forEach((currItem) => {\n const origItem = origMap.get(currItem.id);\n if (!origItem) {\n // New item\n changes.push({ action: \"create\" as Action, data: currItem });\n } else if (JSON.stringify(origItem) !== JSON.stringify(currItem)) {\n // Updated item\n changes.push({ action: \"update\" as Action, data: currItem, id: currItem.id });\n }\n });\n\n const currMap = new Map(currArray.map((item) => [item.id, item]));\n origArray.forEach((origItem) => {\n if (!currMap.has(origItem.id)) {\n // Deleted item\n changes.push({ action: \"delete\" as Action, id: origItem.id });\n }\n });\n\n return changes;\n };\n\n const experiencesDiff = [\n ...calculateArrayDiff(original.work_experience, current.work_experience),\n ...calculateArrayDiff(original.education, current.education),\n ...calculateArrayDiff(original.activities, current.activities),\n ];\n\n const hwOrig = original.skills?.hard || [];\n const hwCurr = current.skills?.hard || [];\n const swOrig = original.skills?.soft || [];\n const swCurr = current.skills?.soft || [];\n\n const skillsDiff = [...calculateArrayDiff(hwOrig, hwCurr), ...calculateArrayDiff(swOrig, swCurr)];\n\n return {\n candidate: {\n action: Object.keys(candidateData).length > 0 ? \"update\" : \"none\",\n data: candidateData,\n },\n user: {\n action: Object.keys(userData).length > 0 ? \"update\" : \"none\",\n data: userData,\n },\n curriculum: {\n action: original.summary !== current.summary ? \"update\" : \"none\",\n data: { summary: current.summary },\n },\n experiences: experiencesDiff,\n skills: skillsDiff,\n certifications: calculateArrayDiff(original.certifications, current.certifications),\n };\n}\n\nexport function Resume({\n data,\n editable = false,\n headerSlot,\n withDownload = false,\n theme = \"hsl(var(--secondary))\",\n hideFields = [],\n hideSections = [],\n menuSlot = [],\n onSave,\n}: ResumeProps) {\n const themeStyle = theme ? ({ \"--cv-theme\": theme } as React.CSSProperties) : undefined;\n const [draftData, setDraftData] = useState<CandidateProfile>(data);\n const [isOpen, setIsOpen] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const previewRef = useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (open: boolean) => {\n if (open) {\n setDraftData(data);\n }\n setIsOpen(open);\n };\n\n const handleSave = () => {\n if (onSave) {\n const payload = calculateDiffs(data, draftData);\n onSave(payload, draftData);\n }\n setIsOpen(false);\n };\n\n const handleDownload = async () => {\n if (!previewRef.current || isDownloading) return;\n setIsDownloading(true);\n\n try {\n const element = previewRef.current;\n const canvas = await html2canvas(element, {\n scale: 2,\n useCORS: true,\n backgroundColor: \"#ffffff\",\n logging: false,\n windowWidth: 1200, // Force desktop layout breakpoint\n onclone: (clonedDoc) => {\n const clonedElement = clonedDoc.getElementById(\"resume-capture-area\");\n if (clonedElement instanceof HTMLElement) {\n clonedElement.style.height = \"auto\";\n clonedElement.style.overflow = \"visible\";\n clonedElement.style.width = \"1200px\";\n\n // Fix for images with object-fit: cover not being respected by html2canvas\n const objectCoverImages = clonedElement.querySelectorAll(\"img.object-cover\");\n objectCoverImages.forEach((img) => {\n if (img instanceof HTMLImageElement) {\n const parent = img.parentElement;\n if (parent) {\n // Replace img with a div that has background-image: cover\n const div = clonedDoc.createElement(\"div\");\n div.style.width = \"100%\";\n div.style.height = \"100%\";\n div.style.backgroundImage = `url(${img.src})`;\n div.style.backgroundSize = \"cover\";\n div.style.backgroundPosition = \"center\";\n div.style.borderRadius = window.getComputedStyle(img).borderRadius;\n div.className = img.className;\n parent.style.marginTop = \"1rem\";\n parent.replaceChild(div, img);\n }\n }\n });\n\n // Hide elements marked as hidden for PDF\n const hiddenElements = clonedElement.querySelectorAll(\".pdf-hidden\");\n hiddenElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"none\";\n }\n });\n\n // Fix SVG vertical alignment for html2canvas\n // html2canvas doesn't properly handle flex align-items with SVGs\n const svgs = clonedElement.querySelectorAll(\"svg\");\n svgs.forEach((svg) => {\n svg.style.display = \"inline-block\";\n svg.style.verticalAlign = \"middle\";\n svg.style.flexShrink = \"0\";\n svg.style.marginRight = \"0.4rem\";\n svg.style.marginBottom = \"-1.2rem\";\n });\n\n // Fix line-clamp which causes text vertical cut-offs in html2canvas\n const clampElements = clonedElement.querySelectorAll(\n \".line-clamp-1, .line-clamp-2, .line-clamp-3\",\n );\n clampElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"block\";\n el.style.webkitLineClamp = \"unset\";\n el.style.webkitBoxOrient = \"unset\";\n el.style.overflow = \"visible\";\n el.style.whiteSpace = \"normal\";\n el.style.lineHeight = \"1.5\";\n }\n });\n\n // Replace generic HTML elements like custom badges with simple spans\n // because html2canvas struggles with flexbox and strict borders inside round pills\n const badges = clonedElement.querySelectorAll(\".pdf-badge\");\n badges.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.paddingTop = \"-10px\";\n el.style.display = \"block\";\n el.style.paddingTop = \"0px\";\n el.style.paddingBottom = \"0.8rem\";\n }\n });\n\n // Fix headers with bottom borders losing padding/margin\n const headersWithBorders = clonedElement.querySelectorAll(\"h1, h2, h3, h4\");\n headersWithBorders.forEach((el) => {\n if (el instanceof HTMLElement) {\n const hasBorder =\n el.className.includes(\"border-b\") || el.style.borderBottomWidth !== \"\";\n if (hasBorder) {\n el.style.paddingBottom = \"1.2rem\";\n }\n }\n });\n\n // Add margin top to pdf-line-v elements\n const verticalLines = clonedElement.querySelectorAll(\".pdf-line-v\");\n verticalLines.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.marginTop = \"0.5rem\";\n el.style.zIndex = \"5\";\n }\n });\n\n // Add margin bottom to initials in header for better alignment in PDF\n const headerInitials = clonedElement.querySelectorAll(\".pdf-header-initials\");\n headerInitials.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.paddingBottom = \"2rem\";\n }\n });\n\n // Add styles to summary for PDF\n const summaries = clonedElement.querySelectorAll(\".pdf-summary\");\n summaries.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.width = \"100%\";\n el.style.maxWidth = \"100%\";\n el.style.marginTop = \"1.5rem\";\n }\n });\n\n // Show footer in PDF and force grayscale for the logo\n const pdfFooters = clonedElement.querySelectorAll(\".pdf-footer\");\n pdfFooters.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"flex\";\n }\n });\n\n // Also make sure parent containers don't restrict height\n let parent = clonedElement.parentElement;\n while (parent) {\n parent.style.height = \"auto\";\n parent.style.overflow = \"visible\";\n parent = parent.parentElement;\n }\n }\n },\n });\n\n const imgData = canvas.toDataURL(\"image/jpeg\", 1);\n const imgWidthPx = canvas.width;\n const imgHeightPx = canvas.height;\n\n // Convert px to mm (at 96 DPI base * scale factor)\n const pxToMm = 25.4 / (96 * 2);\n const pdfWidth = imgWidthPx * pxToMm;\n const pdfHeight = imgHeightPx * pxToMm;\n\n const pdf = new jsPDF({\n orientation: pdfWidth > pdfHeight ? \"landscape\" : \"portrait\",\n unit: \"mm\",\n format: [pdfWidth, pdfHeight],\n });\n\n pdf.addImage(imgData, \"JPEG\", 0, 0, pdfWidth, pdfHeight, undefined, \"FAST\");\n\n const fileName = `CV_${data.first_name}_${data.last_name}`.replace(/\\s+/g, \"_\");\n pdf.save(`${fileName}.pdf`);\n } catch (error) {\n console.error(\"Error generating PDF:\", error);\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n <div\n className=\"relative h-full w-full overflow-y-auto bg-muted/20 px-4 py-8 sm:px-8\"\n style={themeStyle}\n >\n {/* Preview Panel - Takes full width, centered like a document */}\n <div className=\"mx-auto h-full w-full max-w-5xl\">\n <ResumePreview\n ref={previewRef}\n data={draftData}\n headerSlot={headerSlot}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n />\n </div>\n\n {/* Floating Action Buttons */}\n <div className=\"fixed bottom-6 right-6 z-50 flex flex-col gap-3 sm:flex-row\">\n {editable && (\n <Sheet open={isOpen} onOpenChange={handleOpenChange}>\n <SheetTrigger asChild>\n <Button\n size=\"lg\"\n className=\"flex items-center gap-2 rounded-full bg-primary px-4 text-primary-foreground shadow-xl hover:bg-primary/90\"\n >\n <Edit className=\"h-5 w-5\" />\n <span className=\"hidden font-semibold sm:inline\">Editar</span>\n </Button>\n </SheetTrigger>\n {/* Drawer opens from the right side, taking good width */}\n <SheetContent\n side=\"right\"\n showCloseButton={false}\n className=\"flex w-full flex-col overflow-hidden bg-card p-0 sm:max-w-md md:max-w-2xl\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-6 pb-2\">\n <SheetTitle className=\"text-2xl font-bold text-foreground\">Editar</SheetTitle>\n <SheetClose className=\"rounded-full p-2 opacity-70 transition-colors hover:bg-muted hover:opacity-100\">\n <X className=\"h-6 w-6 text-foreground\" />\n <span className=\"sr-only\">Cerrar</span>\n </SheetClose>\n </div>\n\n {/* Scrollable editor content */}\n <div className=\"flex-1 overflow-y-auto px-6 pb-6 pt-2\">\n <ResumeEditor\n data={draftData}\n onChange={setDraftData}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n menuSlot={menuSlot}\n />\n </div>\n\n {/* Sticky save footer */}\n {onSave && (\n <div className=\"flex justify-end gap-3 p-4\">\n <SheetClose asChild>\n <Button variant=\"outline\">Cancelar</Button>\n </SheetClose>\n <Button onClick={handleSave} className=\"gap-2\">\n <Save className=\"h-4 w-4\" />\n Guardar\n </Button>\n </div>\n )}\n </SheetContent>\n </Sheet>\n )}\n\n {withDownload && (\n <Button\n size=\"lg\"\n variant=\"ghost\"\n disabled={isDownloading}\n onClick={handleDownload}\n className=\"flex items-center gap-2 rounded-full bg-purple-200 px-4 text-purple-800 text-secondary shadow-xl\"\n >\n {isDownloading ? (\n <Loader2 className=\"h-5 w-5 animate-spin\" />\n ) : (\n <Download className=\"h-5 w-5\" />\n )}\n <span className=\"hidden font-semibold sm:inline\">\n {isDownloading ? \"Generando...\" : \"Descargar\"}\n </span>\n </Button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["html2canvas","parent"]}
@@ -2,20 +2,38 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useRef, useState } from "react";
3
3
  import html2canvas from "html2canvas";
4
4
  import { jsPDF } from "jspdf";
5
- import { ResumeEditor } from "@/components/domain/resume/resume-editor/resume-editor";
6
- import { ResumePreview } from "@/components/domain/resume/resume-preview/resume-preview";
7
- import { Button } from "@/components/ui/button";
5
+ import { ResumeEditor } from "./resume-editor/resume-editor";
6
+ import { ResumePreview } from "./resume-preview/resume-preview";
7
+ import { Button } from "../../ui/button";
8
8
  import { Download, Edit, Loader2, Save, X } from "lucide-react";
9
- import { Sheet, SheetTrigger, SheetContent, SheetTitle, SheetClose } from "@/components/ui/sheet";
9
+ import { Sheet, SheetTrigger, SheetContent, SheetTitle, SheetClose } from "../../ui/sheet";
10
10
  function calculateDiffs(original, current) {
11
11
  const candidateData = {};
12
- if (original.student_education_institution_id !== current.student_education_institution_id) candidateData.student_education_institution_id = current.student_education_institution_id;
13
- if (original.education_institution_id !== current.education_institution_id) candidateData.education_institution_id = current.education_institution_id;
14
- if (original.program_name !== current.program_name) candidateData.program_name = current.program_name;
15
- if (JSON.stringify(original.preferences) !== JSON.stringify(current.preferences)) candidateData.preferences = current.preferences;
16
- if (JSON.stringify(original.advanced) !== JSON.stringify(current.advanced)) candidateData.advanced = current.advanced;
12
+ if (original.student_education_institution_id !== current.student_education_institution_id)
13
+ candidateData.student_education_institution_id = current.student_education_institution_id;
14
+ if (original.education_institution_id !== current.education_institution_id)
15
+ candidateData.education_institution_id = current.education_institution_id;
16
+ if (original.program_name !== current.program_name)
17
+ candidateData.program_name = current.program_name;
18
+ if (JSON.stringify(original.preferences) !== JSON.stringify(current.preferences))
19
+ candidateData.preferences = current.preferences;
20
+ if (JSON.stringify(original.advanced) !== JSON.stringify(current.advanced))
21
+ candidateData.advanced = current.advanced;
17
22
  const userData = {};
18
- const userFields = ["first_name", "middle_name", "last_name", "second_last_name", "phone_number", "phone_number_2", "email", "city", "address", "postal_code", "birth_date", "photo_url"];
23
+ const userFields = [
24
+ "first_name",
25
+ "middle_name",
26
+ "last_name",
27
+ "second_last_name",
28
+ "phone_number",
29
+ "phone_number_2",
30
+ "email",
31
+ "city",
32
+ "address",
33
+ "postal_code",
34
+ "birth_date",
35
+ "photo_url"
36
+ ];
19
37
  userFields.forEach((field) => {
20
38
  if (original[field] !== current[field]) {
21
39
  userData[field] = current[field];
@@ -49,10 +67,7 @@ function calculateDiffs(original, current) {
49
67
  const hwCurr = current.skills?.hard || [];
50
68
  const swOrig = original.skills?.soft || [];
51
69
  const swCurr = current.skills?.soft || [];
52
- const skillsDiff = [
53
- ...calculateArrayDiff(hwOrig, hwCurr),
54
- ...calculateArrayDiff(swOrig, swCurr)
55
- ];
70
+ const skillsDiff = [...calculateArrayDiff(hwOrig, hwCurr), ...calculateArrayDiff(swOrig, swCurr)];
56
71
  return {
57
72
  candidate: {
58
73
  action: Object.keys(candidateData).length > 0 ? "update" : "none",
@@ -150,7 +165,9 @@ function Resume({
150
165
  svg.style.marginRight = "0.4rem";
151
166
  svg.style.marginBottom = "-1.2rem";
152
167
  });
153
- const clampElements = clonedElement.querySelectorAll(".line-clamp-1, .line-clamp-2, .line-clamp-3");
168
+ const clampElements = clonedElement.querySelectorAll(
169
+ ".line-clamp-1, .line-clamp-2, .line-clamp-3"
170
+ );
154
171
  clampElements.forEach((el) => {
155
172
  if (el instanceof HTMLElement) {
156
173
  el.style.display = "block";
@@ -238,10 +255,10 @@ function Resume({
238
255
  return /* @__PURE__ */ jsxs(
239
256
  "div",
240
257
  {
241
- className: "relative w-full h-full bg-muted/20 py-8 px-4 sm:px-8 overflow-y-auto",
258
+ className: "relative h-full w-full overflow-y-auto bg-muted/20 px-4 py-8 sm:px-8",
242
259
  style: themeStyle,
243
260
  children: [
244
- /* @__PURE__ */ jsx("div", { className: "w-full max-w-5xl mx-auto h-full", children: /* @__PURE__ */ jsx(
261
+ /* @__PURE__ */ jsx("div", { className: "mx-auto h-full w-full max-w-5xl", children: /* @__PURE__ */ jsx(
245
262
  ResumePreview,
246
263
  {
247
264
  ref: previewRef,
@@ -252,16 +269,16 @@ function Resume({
252
269
  hideSections
253
270
  }
254
271
  ) }),
255
- /* @__PURE__ */ jsxs("div", { className: "fixed bottom-6 right-6 z-50 flex flex-col sm:flex-row gap-3", children: [
272
+ /* @__PURE__ */ jsxs("div", { className: "fixed bottom-6 right-6 z-50 flex flex-col gap-3 sm:flex-row", children: [
256
273
  editable && /* @__PURE__ */ jsxs(Sheet, { open: isOpen, onOpenChange: handleOpenChange, children: [
257
274
  /* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
258
275
  Button,
259
276
  {
260
277
  size: "lg",
261
- className: "shadow-xl rounded-full px-4 flex items-center gap-2 bg-primary text-primary-foreground hover:bg-primary/90",
278
+ className: "flex items-center gap-2 rounded-full bg-primary px-4 text-primary-foreground shadow-xl hover:bg-primary/90",
262
279
  children: [
263
- /* @__PURE__ */ jsx(Edit, { className: "w-5 h-5" }),
264
- /* @__PURE__ */ jsx("span", { className: "hidden sm:inline font-semibold", children: "Editar" })
280
+ /* @__PURE__ */ jsx(Edit, { className: "h-5 w-5" }),
281
+ /* @__PURE__ */ jsx("span", { className: "hidden font-semibold sm:inline", children: "Editar" })
265
282
  ]
266
283
  }
267
284
  ) }),
@@ -270,12 +287,12 @@ function Resume({
270
287
  {
271
288
  side: "right",
272
289
  showCloseButton: false,
273
- className: "w-full sm:max-w-md md:max-w-2xl p-0 flex flex-col overflow-hidden bg-card",
290
+ className: "flex w-full flex-col overflow-hidden bg-card p-0 sm:max-w-md md:max-w-2xl",
274
291
  children: [
275
292
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-6 pb-2", children: [
276
293
  /* @__PURE__ */ jsx(SheetTitle, { className: "text-2xl font-bold text-foreground", children: "Editar" }),
277
- /* @__PURE__ */ jsxs(SheetClose, { className: "rounded-full p-2 hover:bg-muted transition-colors opacity-70 hover:opacity-100", children: [
278
- /* @__PURE__ */ jsx(X, { className: "w-6 h-6 text-foreground" }),
294
+ /* @__PURE__ */ jsxs(SheetClose, { className: "rounded-full p-2 opacity-70 transition-colors hover:bg-muted hover:opacity-100", children: [
295
+ /* @__PURE__ */ jsx(X, { className: "h-6 w-6 text-foreground" }),
279
296
  /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Cerrar" })
280
297
  ] })
281
298
  ] }),
@@ -290,10 +307,10 @@ function Resume({
290
307
  menuSlot
291
308
  }
292
309
  ) }),
293
- onSave && /* @__PURE__ */ jsxs("div", { className: " p-4 flex justify-end gap-3", children: [
310
+ onSave && /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-3 p-4", children: [
294
311
  /* @__PURE__ */ jsx(SheetClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "outline", children: "Cancelar" }) }),
295
312
  /* @__PURE__ */ jsxs(Button, { onClick: handleSave, className: "gap-2", children: [
296
- /* @__PURE__ */ jsx(Save, { className: "w-4 h-4" }),
313
+ /* @__PURE__ */ jsx(Save, { className: "h-4 w-4" }),
297
314
  "Guardar"
298
315
  ] })
299
316
  ] })
@@ -308,10 +325,10 @@ function Resume({
308
325
  variant: "ghost",
309
326
  disabled: isDownloading,
310
327
  onClick: handleDownload,
311
- className: "shadow-xl rounded-full px-4 flex items-center gap-2 text-secondary text-purple-800 bg-purple-200",
328
+ className: "flex items-center gap-2 rounded-full bg-purple-200 px-4 text-purple-800 text-secondary shadow-xl",
312
329
  children: [
313
- isDownloading ? /* @__PURE__ */ jsx(Loader2, { className: "w-5 h-5 animate-spin" }) : /* @__PURE__ */ jsx(Download, { className: "w-5 h-5" }),
314
- /* @__PURE__ */ jsx("span", { className: "hidden sm:inline font-semibold", children: isDownloading ? "Generando..." : "Descargar" })
330
+ isDownloading ? /* @__PURE__ */ jsx(Loader2, { className: "h-5 w-5 animate-spin" }) : /* @__PURE__ */ jsx(Download, { className: "h-5 w-5" }),
331
+ /* @__PURE__ */ jsx("span", { className: "hidden font-semibold sm:inline", children: isDownloading ? "Generando..." : "Descargar" })
315
332
  ]
316
333
  }
317
334
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/domain/resume/resume.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport html2canvas from \"html2canvas\";\nimport { jsPDF } from \"jspdf\";\nimport { CandidateProfile, ResumeProps, ResumeSavePayload, Action } from \"@/components/domain/resume/types\";\nimport { ResumeEditor } from \"@/components/domain/resume/resume-editor/resume-editor\";\nimport { ResumePreview } from \"@/components/domain/resume/resume-preview/resume-preview\";\nimport { Button } from \"@/components/ui/button\";\nimport { Download, Edit, Loader2, Save, X } from \"lucide-react\";\nimport { Sheet, SheetTrigger, SheetContent, SheetTitle, SheetClose } from \"@/components/ui/sheet\";\n\nfunction calculateDiffs(original: CandidateProfile, current: CandidateProfile): ResumeSavePayload {\n // Determine diff for candidate table (academic info etc)\n const candidateData: Partial<CandidateProfile> = {};\n if (original.student_education_institution_id !== current.student_education_institution_id) candidateData.student_education_institution_id = current.student_education_institution_id;\n if (original.education_institution_id !== current.education_institution_id) candidateData.education_institution_id = current.education_institution_id;\n if (original.program_name !== current.program_name) candidateData.program_name = current.program_name;\n if (JSON.stringify(original.preferences) !== JSON.stringify(current.preferences)) candidateData.preferences = current.preferences;\n if (JSON.stringify(original.advanced) !== JSON.stringify(current.advanced)) candidateData.advanced = current.advanced;\n\n // Determine diff for user table (personal info)\n const userData: Partial<CandidateProfile> = {};\n const userFields: (keyof CandidateProfile)[] = ['first_name', 'middle_name', 'last_name', 'second_last_name', 'phone_number', 'phone_number_2', 'email', 'city', 'address', 'postal_code', 'birth_date', 'photo_url'];\n userFields.forEach(field => {\n if (original[field] !== current[field]) {\n // @ts-expect-error - jspdf types are a bit funky\n userData[field] = current[field];\n }\n });\n\n // Helper for array diffs\n const calculateArrayDiff = (origArray: any[] = [], currArray: any[] = []) => {\n const changes: any[] = [];\n const origMap = new Map(origArray.map(item => [item.id, item]));\n\n currArray.forEach(currItem => {\n const origItem = origMap.get(currItem.id);\n if (!origItem) {\n // New item\n changes.push({ action: 'create' as Action, data: currItem });\n } else if (JSON.stringify(origItem) !== JSON.stringify(currItem)) {\n // Updated item\n changes.push({ action: 'update' as Action, data: currItem, id: currItem.id });\n }\n });\n\n const currMap = new Map(currArray.map(item => [item.id, item]));\n origArray.forEach(origItem => {\n if (!currMap.has(origItem.id)) {\n // Deleted item\n changes.push({ action: 'delete' as Action, id: origItem.id });\n }\n });\n\n return changes;\n };\n\n const experiencesDiff = [\n ...calculateArrayDiff(original.work_experience, current.work_experience),\n ...calculateArrayDiff(original.education, current.education),\n ...calculateArrayDiff(original.activities, current.activities)\n ];\n\n const hwOrig = original.skills?.hard || [];\n const hwCurr = current.skills?.hard || [];\n const swOrig = original.skills?.soft || [];\n const swCurr = current.skills?.soft || [];\n\n const skillsDiff = [\n ...calculateArrayDiff(hwOrig, hwCurr),\n ...calculateArrayDiff(swOrig, swCurr)\n ];\n\n return {\n candidate: {\n action: Object.keys(candidateData).length > 0 ? 'update' : 'none',\n data: candidateData\n },\n user: {\n action: Object.keys(userData).length > 0 ? 'update' : 'none',\n data: userData\n },\n curriculum: {\n action: original.summary !== current.summary ? 'update' : 'none',\n data: { summary: current.summary }\n },\n experiences: experiencesDiff,\n skills: skillsDiff,\n certifications: calculateArrayDiff(original.certifications, current.certifications)\n };\n}\n\nexport function Resume({\n data,\n editable = false,\n headerSlot,\n withDownload = false,\n theme = \"hsl(var(--secondary))\",\n hideFields = [],\n hideSections = [],\n menuSlot = [],\n onSave,\n}: ResumeProps) {\n const themeStyle = theme ? { \"--cv-theme\": theme } as React.CSSProperties : undefined;\n const [draftData, setDraftData] = useState<CandidateProfile>(data);\n const [isOpen, setIsOpen] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const previewRef = useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (open: boolean) => {\n if (open) {\n setDraftData(data);\n }\n setIsOpen(open);\n };\n\n const handleSave = () => {\n if (onSave) {\n const payload = calculateDiffs(data, draftData);\n onSave(payload, draftData);\n }\n setIsOpen(false);\n };\n\n const handleDownload = async () => {\n if (!previewRef.current || isDownloading) return;\n setIsDownloading(true);\n\n try {\n const element = previewRef.current;\n const canvas = await html2canvas(element, {\n scale: 2,\n useCORS: true,\n backgroundColor: \"#ffffff\",\n logging: false,\n windowWidth: 1200, // Force desktop layout breakpoint\n onclone: (clonedDoc) => {\n const clonedElement = clonedDoc.getElementById(\"resume-capture-area\");\n if (clonedElement instanceof HTMLElement) {\n clonedElement.style.height = \"auto\";\n clonedElement.style.overflow = \"visible\";\n clonedElement.style.width = \"1200px\";\n\n // Fix for images with object-fit: cover not being respected by html2canvas\n const objectCoverImages = clonedElement.querySelectorAll(\"img.object-cover\");\n objectCoverImages.forEach((img) => {\n if (img instanceof HTMLImageElement) {\n const parent = img.parentElement;\n if (parent) {\n // Replace img with a div that has background-image: cover\n const div = clonedDoc.createElement(\"div\");\n div.style.width = \"100%\";\n div.style.height = \"100%\";\n div.style.backgroundImage = `url(${img.src})`;\n div.style.backgroundSize = \"cover\";\n div.style.backgroundPosition = \"center\";\n div.style.borderRadius = window.getComputedStyle(img).borderRadius;\n div.className = img.className;\n parent.style.marginTop = \"1rem\"\n parent.replaceChild(div, img);\n }\n }\n });\n\n // Hide elements marked as hidden for PDF\n const hiddenElements = clonedElement.querySelectorAll(\".pdf-hidden\");\n hiddenElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"none\";\n }\n });\n\n // Fix SVG vertical alignment for html2canvas\n // html2canvas doesn't properly handle flex align-items with SVGs\n const svgs = clonedElement.querySelectorAll(\"svg\");\n svgs.forEach((svg) => {\n svg.style.display = \"inline-block\";\n svg.style.verticalAlign = \"middle\";\n svg.style.flexShrink = \"0\";\n svg.style.marginRight = \"0.4rem\";\n svg.style.marginBottom = \"-1.2rem\";\n });\n\n // Fix line-clamp which causes text vertical cut-offs in html2canvas\n const clampElements = clonedElement.querySelectorAll(\".line-clamp-1, .line-clamp-2, .line-clamp-3\");\n clampElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"block\";\n el.style.webkitLineClamp = \"unset\";\n el.style.webkitBoxOrient = \"unset\";\n el.style.overflow = \"visible\";\n el.style.whiteSpace = \"normal\";\n el.style.lineHeight = \"1.5\";\n }\n });\n\n // Replace generic HTML elements like custom badges with simple spans\n // because html2canvas struggles with flexbox and strict borders inside round pills\n const badges = clonedElement.querySelectorAll(\".pdf-badge\");\n badges.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.paddingTop = \"-10px\"\n el.style.display = \"block\";\n el.style.paddingTop = \"0px\";\n el.style.paddingBottom = \"0.8rem\";\n }\n });\n\n // Fix headers with bottom borders losing padding/margin\n const headersWithBorders = clonedElement.querySelectorAll(\"h1, h2, h3, h4\");\n headersWithBorders.forEach((el) => {\n if (el instanceof HTMLElement) {\n const hasBorder = el.className.includes(\"border-b\") || el.style.borderBottomWidth !== \"\";\n if (hasBorder) {\n el.style.paddingBottom = \"1.2rem\";\n }\n }\n });\n\n // Add margin top to pdf-line-v elements\n const verticalLines = clonedElement.querySelectorAll(\".pdf-line-v\");\n verticalLines.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.marginTop = \"0.5rem\";\n el.style.zIndex = \"5\"\n }\n });\n\n // Add margin bottom to initials in header for better alignment in PDF\n const headerInitials = clonedElement.querySelectorAll(\".pdf-header-initials\");\n headerInitials.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.paddingBottom = \"2rem\";\n }\n });\n\n // Add styles to summary for PDF\n const summaries = clonedElement.querySelectorAll(\".pdf-summary\");\n summaries.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.width = \"100%\";\n el.style.maxWidth = \"100%\";\n el.style.marginTop = \"1.5rem\";\n }\n });\n\n // Show footer in PDF and force grayscale for the logo\n const pdfFooters = clonedElement.querySelectorAll(\".pdf-footer\");\n pdfFooters.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"flex\";\n }\n });\n\n // Also make sure parent containers don't restrict height\n let parent = clonedElement.parentElement;\n while (parent) {\n parent.style.height = \"auto\";\n parent.style.overflow = \"visible\";\n parent = parent.parentElement;\n }\n }\n }\n });\n\n const imgData = canvas.toDataURL(\"image/jpeg\", 1);\n const imgWidthPx = canvas.width;\n const imgHeightPx = canvas.height;\n\n // Convert px to mm (at 96 DPI base * scale factor)\n const pxToMm = 25.4 / (96 * 2);\n const pdfWidth = imgWidthPx * pxToMm;\n const pdfHeight = imgHeightPx * pxToMm;\n\n const pdf = new jsPDF({\n orientation: pdfWidth > pdfHeight ? \"landscape\" : \"portrait\",\n unit: \"mm\",\n format: [pdfWidth, pdfHeight],\n });\n\n pdf.addImage(imgData, \"JPEG\", 0, 0, pdfWidth, pdfHeight, undefined, 'FAST');\n\n const fileName = `CV_${data.first_name}_${data.last_name}`.replace(/\\s+/g, \"_\");\n pdf.save(`${fileName}.pdf`);\n } catch (error) {\n console.error(\"Error generating PDF:\", error);\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n <div\n className=\"relative w-full h-full bg-muted/20 py-8 px-4 sm:px-8 overflow-y-auto\"\n style={themeStyle}\n >\n {/* Preview Panel - Takes full width, centered like a document */}\n <div className=\"w-full max-w-5xl mx-auto h-full\">\n <ResumePreview\n ref={previewRef}\n data={draftData}\n headerSlot={headerSlot}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n />\n </div>\n\n {/* Floating Action Buttons */}\n <div className=\"fixed bottom-6 right-6 z-50 flex flex-col sm:flex-row gap-3\">\n {editable && (\n <Sheet open={isOpen} onOpenChange={handleOpenChange}>\n <SheetTrigger asChild>\n <Button\n size=\"lg\"\n className=\"shadow-xl rounded-full px-4 flex items-center gap-2 bg-primary text-primary-foreground hover:bg-primary/90\"\n >\n <Edit className=\"w-5 h-5\" />\n <span className=\"hidden sm:inline font-semibold\">Editar</span>\n </Button>\n </SheetTrigger>\n {/* Drawer opens from the right side, taking good width */}\n <SheetContent\n side=\"right\"\n showCloseButton={false}\n className=\"w-full sm:max-w-md md:max-w-2xl p-0 flex flex-col overflow-hidden bg-card\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-6 pb-2\">\n <SheetTitle className=\"text-2xl font-bold text-foreground\">Editar</SheetTitle>\n <SheetClose className=\"rounded-full p-2 hover:bg-muted transition-colors opacity-70 hover:opacity-100\">\n <X className=\"w-6 h-6 text-foreground\" />\n <span className=\"sr-only\">Cerrar</span>\n </SheetClose>\n </div>\n\n {/* Scrollable editor content */}\n <div className=\"flex-1 overflow-y-auto px-6 pb-6 pt-2\">\n <ResumeEditor\n data={draftData}\n onChange={setDraftData}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n menuSlot={menuSlot}\n />\n </div>\n\n {/* Sticky save footer */}\n {onSave && (\n <div className=\" p-4 flex justify-end gap-3\">\n <SheetClose asChild>\n <Button variant=\"outline\">Cancelar</Button>\n </SheetClose>\n <Button onClick={handleSave} className=\"gap-2\">\n <Save className=\"w-4 h-4\" />\n Guardar\n </Button>\n </div>\n )}\n </SheetContent>\n </Sheet>\n )}\n\n {withDownload && (\n <Button\n size=\"lg\"\n variant=\"ghost\"\n disabled={isDownloading}\n onClick={handleDownload}\n className=\"shadow-xl rounded-full px-4 flex items-center gap-2 text-secondary text-purple-800 bg-purple-200\"\n >\n {isDownloading ? (\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Download className=\"w-5 h-5\" />\n )}\n <span className=\"hidden sm:inline font-semibold\">\n {isDownloading ? \"Generando...\" : \"Descargar\"}\n </span>\n </Button>\n )}\n </div>\n </div>\n );\n}\n\n"],"mappings":"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","names":["parent"]}
1
+ {"version":3,"sources":["../../../../src/components/domain/resume/resume.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport html2canvas from \"html2canvas\";\nimport { jsPDF } from \"jspdf\";\nimport { CandidateProfile, ResumeProps, ResumeSavePayload, Action } from \"./types\";\nimport { ResumeEditor } from \"./resume-editor/resume-editor\";\nimport { ResumePreview } from \"./resume-preview/resume-preview\";\nimport { Button } from \"../../ui/button\";\nimport { Download, Edit, Loader2, Save, X } from \"lucide-react\";\nimport { Sheet, SheetTrigger, SheetContent, SheetTitle, SheetClose } from \"../../ui/sheet\";\n\nfunction calculateDiffs(original: CandidateProfile, current: CandidateProfile): ResumeSavePayload {\n // Determine diff for candidate table (academic info etc)\n const candidateData: Partial<CandidateProfile> = {};\n if (original.student_education_institution_id !== current.student_education_institution_id)\n candidateData.student_education_institution_id = current.student_education_institution_id;\n if (original.education_institution_id !== current.education_institution_id)\n candidateData.education_institution_id = current.education_institution_id;\n if (original.program_name !== current.program_name)\n candidateData.program_name = current.program_name;\n if (JSON.stringify(original.preferences) !== JSON.stringify(current.preferences))\n candidateData.preferences = current.preferences;\n if (JSON.stringify(original.advanced) !== JSON.stringify(current.advanced))\n candidateData.advanced = current.advanced;\n\n // Determine diff for user table (personal info)\n const userData: Partial<CandidateProfile> = {};\n const userFields: (keyof CandidateProfile)[] = [\n \"first_name\",\n \"middle_name\",\n \"last_name\",\n \"second_last_name\",\n \"phone_number\",\n \"phone_number_2\",\n \"email\",\n \"city\",\n \"address\",\n \"postal_code\",\n \"birth_date\",\n \"photo_url\",\n ];\n userFields.forEach((field) => {\n if (original[field] !== current[field]) {\n // @ts-expect-error - jspdf types are a bit funky\n userData[field] = current[field];\n }\n });\n\n // Helper for array diffs\n const calculateArrayDiff = (origArray: any[] = [], currArray: any[] = []) => {\n const changes: any[] = [];\n const origMap = new Map(origArray.map((item) => [item.id, item]));\n\n currArray.forEach((currItem) => {\n const origItem = origMap.get(currItem.id);\n if (!origItem) {\n // New item\n changes.push({ action: \"create\" as Action, data: currItem });\n } else if (JSON.stringify(origItem) !== JSON.stringify(currItem)) {\n // Updated item\n changes.push({ action: \"update\" as Action, data: currItem, id: currItem.id });\n }\n });\n\n const currMap = new Map(currArray.map((item) => [item.id, item]));\n origArray.forEach((origItem) => {\n if (!currMap.has(origItem.id)) {\n // Deleted item\n changes.push({ action: \"delete\" as Action, id: origItem.id });\n }\n });\n\n return changes;\n };\n\n const experiencesDiff = [\n ...calculateArrayDiff(original.work_experience, current.work_experience),\n ...calculateArrayDiff(original.education, current.education),\n ...calculateArrayDiff(original.activities, current.activities),\n ];\n\n const hwOrig = original.skills?.hard || [];\n const hwCurr = current.skills?.hard || [];\n const swOrig = original.skills?.soft || [];\n const swCurr = current.skills?.soft || [];\n\n const skillsDiff = [...calculateArrayDiff(hwOrig, hwCurr), ...calculateArrayDiff(swOrig, swCurr)];\n\n return {\n candidate: {\n action: Object.keys(candidateData).length > 0 ? \"update\" : \"none\",\n data: candidateData,\n },\n user: {\n action: Object.keys(userData).length > 0 ? \"update\" : \"none\",\n data: userData,\n },\n curriculum: {\n action: original.summary !== current.summary ? \"update\" : \"none\",\n data: { summary: current.summary },\n },\n experiences: experiencesDiff,\n skills: skillsDiff,\n certifications: calculateArrayDiff(original.certifications, current.certifications),\n };\n}\n\nexport function Resume({\n data,\n editable = false,\n headerSlot,\n withDownload = false,\n theme = \"hsl(var(--secondary))\",\n hideFields = [],\n hideSections = [],\n menuSlot = [],\n onSave,\n}: ResumeProps) {\n const themeStyle = theme ? ({ \"--cv-theme\": theme } as React.CSSProperties) : undefined;\n const [draftData, setDraftData] = useState<CandidateProfile>(data);\n const [isOpen, setIsOpen] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const previewRef = useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (open: boolean) => {\n if (open) {\n setDraftData(data);\n }\n setIsOpen(open);\n };\n\n const handleSave = () => {\n if (onSave) {\n const payload = calculateDiffs(data, draftData);\n onSave(payload, draftData);\n }\n setIsOpen(false);\n };\n\n const handleDownload = async () => {\n if (!previewRef.current || isDownloading) return;\n setIsDownloading(true);\n\n try {\n const element = previewRef.current;\n const canvas = await html2canvas(element, {\n scale: 2,\n useCORS: true,\n backgroundColor: \"#ffffff\",\n logging: false,\n windowWidth: 1200, // Force desktop layout breakpoint\n onclone: (clonedDoc) => {\n const clonedElement = clonedDoc.getElementById(\"resume-capture-area\");\n if (clonedElement instanceof HTMLElement) {\n clonedElement.style.height = \"auto\";\n clonedElement.style.overflow = \"visible\";\n clonedElement.style.width = \"1200px\";\n\n // Fix for images with object-fit: cover not being respected by html2canvas\n const objectCoverImages = clonedElement.querySelectorAll(\"img.object-cover\");\n objectCoverImages.forEach((img) => {\n if (img instanceof HTMLImageElement) {\n const parent = img.parentElement;\n if (parent) {\n // Replace img with a div that has background-image: cover\n const div = clonedDoc.createElement(\"div\");\n div.style.width = \"100%\";\n div.style.height = \"100%\";\n div.style.backgroundImage = `url(${img.src})`;\n div.style.backgroundSize = \"cover\";\n div.style.backgroundPosition = \"center\";\n div.style.borderRadius = window.getComputedStyle(img).borderRadius;\n div.className = img.className;\n parent.style.marginTop = \"1rem\";\n parent.replaceChild(div, img);\n }\n }\n });\n\n // Hide elements marked as hidden for PDF\n const hiddenElements = clonedElement.querySelectorAll(\".pdf-hidden\");\n hiddenElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"none\";\n }\n });\n\n // Fix SVG vertical alignment for html2canvas\n // html2canvas doesn't properly handle flex align-items with SVGs\n const svgs = clonedElement.querySelectorAll(\"svg\");\n svgs.forEach((svg) => {\n svg.style.display = \"inline-block\";\n svg.style.verticalAlign = \"middle\";\n svg.style.flexShrink = \"0\";\n svg.style.marginRight = \"0.4rem\";\n svg.style.marginBottom = \"-1.2rem\";\n });\n\n // Fix line-clamp which causes text vertical cut-offs in html2canvas\n const clampElements = clonedElement.querySelectorAll(\n \".line-clamp-1, .line-clamp-2, .line-clamp-3\",\n );\n clampElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"block\";\n el.style.webkitLineClamp = \"unset\";\n el.style.webkitBoxOrient = \"unset\";\n el.style.overflow = \"visible\";\n el.style.whiteSpace = \"normal\";\n el.style.lineHeight = \"1.5\";\n }\n });\n\n // Replace generic HTML elements like custom badges with simple spans\n // because html2canvas struggles with flexbox and strict borders inside round pills\n const badges = clonedElement.querySelectorAll(\".pdf-badge\");\n badges.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.paddingTop = \"-10px\";\n el.style.display = \"block\";\n el.style.paddingTop = \"0px\";\n el.style.paddingBottom = \"0.8rem\";\n }\n });\n\n // Fix headers with bottom borders losing padding/margin\n const headersWithBorders = clonedElement.querySelectorAll(\"h1, h2, h3, h4\");\n headersWithBorders.forEach((el) => {\n if (el instanceof HTMLElement) {\n const hasBorder =\n el.className.includes(\"border-b\") || el.style.borderBottomWidth !== \"\";\n if (hasBorder) {\n el.style.paddingBottom = \"1.2rem\";\n }\n }\n });\n\n // Add margin top to pdf-line-v elements\n const verticalLines = clonedElement.querySelectorAll(\".pdf-line-v\");\n verticalLines.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.marginTop = \"0.5rem\";\n el.style.zIndex = \"5\";\n }\n });\n\n // Add margin bottom to initials in header for better alignment in PDF\n const headerInitials = clonedElement.querySelectorAll(\".pdf-header-initials\");\n headerInitials.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.paddingBottom = \"2rem\";\n }\n });\n\n // Add styles to summary for PDF\n const summaries = clonedElement.querySelectorAll(\".pdf-summary\");\n summaries.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.width = \"100%\";\n el.style.maxWidth = \"100%\";\n el.style.marginTop = \"1.5rem\";\n }\n });\n\n // Show footer in PDF and force grayscale for the logo\n const pdfFooters = clonedElement.querySelectorAll(\".pdf-footer\");\n pdfFooters.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.display = \"flex\";\n }\n });\n\n // Also make sure parent containers don't restrict height\n let parent = clonedElement.parentElement;\n while (parent) {\n parent.style.height = \"auto\";\n parent.style.overflow = \"visible\";\n parent = parent.parentElement;\n }\n }\n },\n });\n\n const imgData = canvas.toDataURL(\"image/jpeg\", 1);\n const imgWidthPx = canvas.width;\n const imgHeightPx = canvas.height;\n\n // Convert px to mm (at 96 DPI base * scale factor)\n const pxToMm = 25.4 / (96 * 2);\n const pdfWidth = imgWidthPx * pxToMm;\n const pdfHeight = imgHeightPx * pxToMm;\n\n const pdf = new jsPDF({\n orientation: pdfWidth > pdfHeight ? \"landscape\" : \"portrait\",\n unit: \"mm\",\n format: [pdfWidth, pdfHeight],\n });\n\n pdf.addImage(imgData, \"JPEG\", 0, 0, pdfWidth, pdfHeight, undefined, \"FAST\");\n\n const fileName = `CV_${data.first_name}_${data.last_name}`.replace(/\\s+/g, \"_\");\n pdf.save(`${fileName}.pdf`);\n } catch (error) {\n console.error(\"Error generating PDF:\", error);\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n <div\n className=\"relative h-full w-full overflow-y-auto bg-muted/20 px-4 py-8 sm:px-8\"\n style={themeStyle}\n >\n {/* Preview Panel - Takes full width, centered like a document */}\n <div className=\"mx-auto h-full w-full max-w-5xl\">\n <ResumePreview\n ref={previewRef}\n data={draftData}\n headerSlot={headerSlot}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n />\n </div>\n\n {/* Floating Action Buttons */}\n <div className=\"fixed bottom-6 right-6 z-50 flex flex-col gap-3 sm:flex-row\">\n {editable && (\n <Sheet open={isOpen} onOpenChange={handleOpenChange}>\n <SheetTrigger asChild>\n <Button\n size=\"lg\"\n className=\"flex items-center gap-2 rounded-full bg-primary px-4 text-primary-foreground shadow-xl hover:bg-primary/90\"\n >\n <Edit className=\"h-5 w-5\" />\n <span className=\"hidden font-semibold sm:inline\">Editar</span>\n </Button>\n </SheetTrigger>\n {/* Drawer opens from the right side, taking good width */}\n <SheetContent\n side=\"right\"\n showCloseButton={false}\n className=\"flex w-full flex-col overflow-hidden bg-card p-0 sm:max-w-md md:max-w-2xl\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-6 pb-2\">\n <SheetTitle className=\"text-2xl font-bold text-foreground\">Editar</SheetTitle>\n <SheetClose className=\"rounded-full p-2 opacity-70 transition-colors hover:bg-muted hover:opacity-100\">\n <X className=\"h-6 w-6 text-foreground\" />\n <span className=\"sr-only\">Cerrar</span>\n </SheetClose>\n </div>\n\n {/* Scrollable editor content */}\n <div className=\"flex-1 overflow-y-auto px-6 pb-6 pt-2\">\n <ResumeEditor\n data={draftData}\n onChange={setDraftData}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n menuSlot={menuSlot}\n />\n </div>\n\n {/* Sticky save footer */}\n {onSave && (\n <div className=\"flex justify-end gap-3 p-4\">\n <SheetClose asChild>\n <Button variant=\"outline\">Cancelar</Button>\n </SheetClose>\n <Button onClick={handleSave} className=\"gap-2\">\n <Save className=\"h-4 w-4\" />\n Guardar\n </Button>\n </div>\n )}\n </SheetContent>\n </Sheet>\n )}\n\n {withDownload && (\n <Button\n size=\"lg\"\n variant=\"ghost\"\n disabled={isDownloading}\n onClick={handleDownload}\n className=\"flex items-center gap-2 rounded-full bg-purple-200 px-4 text-purple-800 text-secondary shadow-xl\"\n >\n {isDownloading ? (\n <Loader2 className=\"h-5 w-5 animate-spin\" />\n ) : (\n <Download className=\"h-5 w-5\" />\n )}\n <span className=\"hidden font-semibold sm:inline\">\n {isDownloading ? \"Generando...\" : \"Descargar\"}\n </span>\n </Button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["parent"]}
@@ -39,9 +39,7 @@ var import_jsx_runtime = require("react/jsx-runtime");
39
39
  var AccordionPrimitive = __toESM(require("@radix-ui/react-accordion"), 1);
40
40
  var import_lucide_react = require("lucide-react");
41
41
  var import_utils = require("../../../lib/utils");
42
- function Accordion({
43
- ...props
44
- }) {
42
+ function Accordion({ ...props }) {
45
43
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AccordionPrimitive.Root, { "data-slot": "accordion", ...props });
46
44
  }
47
45
  function AccordionItem({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ui/accordion/accordion.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport { ChevronDown } from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\n\nfunction Accordion({\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b\", className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWS;AART,yBAAoC;AACpC,0BAA4B;AAE5B,mBAAmB;AAEnB,SAAS,UAAU;AAAA,EACjB,GAAG;AACL,GAAyD;AACvD,SAAO,4CAAC,mBAAmB,MAAnB,EAAwB,aAAU,aAAa,GAAG,OAAO;AACnE;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA,GAAG;AACL,GAAyD;AACvD,SACE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,eAAW,iBAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE,4CAAC,mBAAmB,QAAnB,EAA0B,WAAU,QACnC;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,4CAAC,mCAAY,WAAU,sDAAqD;AAAA;AAAA;AAAA,EAC9E,GACF;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAU;AAAA,MACT,GAAG;AAAA,MAEJ,sDAAC,SAAI,eAAW,iBAAG,aAAa,SAAS,GAAI,UAAS;AAAA;AAAA,EACxD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/ui/accordion/accordion.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport { ChevronDown } from \"lucide-react\";\n\nimport { cn } from \"../../../lib/utils\";\n\nfunction Accordion({ ...props }: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b\", className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASS;AANT,yBAAoC;AACpC,0BAA4B;AAE5B,mBAAmB;AAEnB,SAAS,UAAU,EAAE,GAAG,MAAM,GAAyD;AACrF,SAAO,4CAAC,mBAAmB,MAAnB,EAAwB,aAAU,aAAa,GAAG,OAAO;AACnE;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA,GAAG;AACL,GAAyD;AACvD,SACE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,eAAW,iBAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE,4CAAC,mBAAmB,QAAnB,EAA0B,WAAU,QACnC;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,4CAAC,mCAAY,WAAU,sDAAqD;AAAA;AAAA;AAAA,EAC9E,GACF;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAU;AAAA,MACT,GAAG;AAAA,MAEJ,sDAAC,SAAI,eAAW,iBAAG,aAAa,SAAS,GAAI,UAAS;AAAA;AAAA,EACxD;AAEJ;","names":[]}
@@ -3,9 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
4
4
  import { ChevronDown } from "lucide-react";
5
5
  import { cn } from "../../../lib/utils";
6
- function Accordion({
7
- ...props
8
- }) {
6
+ function Accordion({ ...props }) {
9
7
  return /* @__PURE__ */ jsx(AccordionPrimitive.Root, { "data-slot": "accordion", ...props });
10
8
  }
11
9
  function AccordionItem({