@ginia/ui 0.1.6 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/domain/resume/resume-preview/resume-preview.cjs +9 -6
- package/dist/components/domain/resume/resume-preview/resume-preview.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/resume-preview.d.cts +2 -0
- package/dist/components/domain/resume/resume-preview/resume-preview.d.ts +2 -0
- package/dist/components/domain/resume/resume-preview/resume-preview.js +9 -6
- package/dist/components/domain/resume/resume-preview/resume-preview.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/contact-skills.cjs +6 -6
- package/dist/components/domain/resume/resume-preview/sections/contact-skills.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/contact-skills.js +6 -6
- package/dist/components/domain/resume/resume-preview/sections/contact-skills.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/experience-education.cjs +12 -28
- package/dist/components/domain/resume/resume-preview/sections/experience-education.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/experience-education.js +13 -29
- package/dist/components/domain/resume/resume-preview/sections/experience-education.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/footer-preview.cjs +15 -3
- package/dist/components/domain/resume/resume-preview/sections/footer-preview.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/footer-preview.js +15 -3
- package/dist/components/domain/resume/resume-preview/sections/footer-preview.js.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/header-preview.cjs +19 -4
- package/dist/components/domain/resume/resume-preview/sections/header-preview.cjs.map +1 -1
- package/dist/components/domain/resume/resume-preview/sections/header-preview.js +19 -4
- package/dist/components/domain/resume/resume-preview/sections/header-preview.js.map +1 -1
- package/dist/components/domain/resume/resume.cjs +14 -5
- package/dist/components/domain/resume/resume.cjs.map +1 -1
- package/dist/components/domain/resume/resume.d.cts +1 -1
- package/dist/components/domain/resume/resume.d.ts +1 -1
- package/dist/components/domain/resume/resume.js +14 -5
- package/dist/components/domain/resume/resume.js.map +1 -1
- package/dist/components/domain/resume/types.cjs.map +1 -1
- package/dist/components/domain/resume/types.d.cts +10 -0
- package/dist/components/domain/resume/types.d.ts +10 -0
- package/package.json +1 -1
|
@@ -34,22 +34,26 @@ module.exports = __toCommonJS(resume_preview_exports);
|
|
|
34
34
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
35
35
|
var React = __toESM(require("react"), 1);
|
|
36
36
|
var import_ui = require("../../../ui");
|
|
37
|
+
var import_utils = require("../../../../lib/utils");
|
|
37
38
|
var import_header_preview = require("./sections/header-preview");
|
|
38
39
|
var import_contact_skills = require("./sections/contact-skills");
|
|
39
40
|
var import_experience_education = require("./sections/experience-education");
|
|
40
41
|
var import_footer_preview = require("./sections/footer-preview");
|
|
41
42
|
const ResumePreview = React.forwardRef(
|
|
42
|
-
function ResumePreview2({ data, headerSlot, theme, hideFields = [], hideSections = [] }, ref) {
|
|
43
|
+
function ResumePreview2({ data, headerSlot, theme, hideFields = [], hideSections = [], showTopBar = true, className }, ref) {
|
|
43
44
|
const themeStyle = theme ? { backgroundColor: theme } : void 0;
|
|
44
45
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
45
46
|
"div",
|
|
46
47
|
{
|
|
47
48
|
ref,
|
|
48
49
|
id: "resume-capture-area",
|
|
49
|
-
className:
|
|
50
|
+
className: (0, import_utils.cn)(
|
|
51
|
+
"relative mx-auto flex min-h-[1056px] w-full flex-col rounded-sm border border-border bg-card p-8 text-card-foreground shadow-2xl sm:p-12 md:p-14",
|
|
52
|
+
className
|
|
53
|
+
),
|
|
50
54
|
children: [
|
|
51
55
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Background, {}),
|
|
52
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
56
|
+
showTopBar && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
53
57
|
"div",
|
|
54
58
|
{
|
|
55
59
|
className: `absolute left-0 top-0 h-2 w-full ${theme ? "" : "bg-gradient-to-r from-primary to-primary/50"}`,
|
|
@@ -66,10 +70,9 @@ const ResumePreview = React.forwardRef(
|
|
|
66
70
|
hideFields
|
|
67
71
|
}
|
|
68
72
|
),
|
|
69
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-8 grid grid-cols-1 gap-10 lg:grid-cols-12", children: [
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-8 mb-8 grid grid-cols-1 gap-10 lg:grid-cols-12", children: [
|
|
70
74
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "space-y-8 lg:col-span-4 lg:pr-6", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_contact_skills.ContactSkills, { data, hideFields, hideSections }) }),
|
|
71
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "
|
|
72
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "space-y-8 lg:col-span-8", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
75
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "space-y-8 lg:col-span-8 lg:border-l lg:border-border/40 lg:pl-8", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
73
76
|
import_experience_education.ExperienceEducation,
|
|
74
77
|
{
|
|
75
78
|
data,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/domain/resume/resume-preview/resume-preview.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { CandidateProfile } from \"../types\";\nimport { Background } from \"../../../ui\";\nimport { HeaderPreview } from \"./sections/header-preview\";\nimport { ContactSkills } from \"./sections/contact-skills\";\nimport { ExperienceEducation } from \"./sections/experience-education\";\nimport { FooterPreview } from \"./sections/footer-preview\";\n\nexport interface ResumePreviewProps {\n data: CandidateProfile;\n headerSlot?: React.ReactNode;\n theme?: string;\n hideFields?: string[];\n hideSections?: string[];\n}\n\nexport const ResumePreview = React.forwardRef<HTMLDivElement, ResumePreviewProps>(\n function ResumePreview({ data, headerSlot, theme, hideFields = [], hideSections = []
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/domain/resume/resume-preview/resume-preview.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { CandidateProfile } from \"../types\";\nimport { Background } from \"../../../ui\";\nimport { cn } from \"../../../../lib/utils\";\nimport { HeaderPreview } from \"./sections/header-preview\";\nimport { ContactSkills } from \"./sections/contact-skills\";\nimport { ExperienceEducation } from \"./sections/experience-education\";\nimport { FooterPreview } from \"./sections/footer-preview\";\n\nexport interface ResumePreviewProps {\n data: CandidateProfile;\n headerSlot?: React.ReactNode;\n theme?: string;\n hideFields?: string[];\n hideSections?: string[];\n showTopBar?: boolean;\n className?: string;\n}\n\nexport const ResumePreview = React.forwardRef<HTMLDivElement, ResumePreviewProps>(\n function ResumePreview(\n { data, headerSlot, theme, hideFields = [], hideSections = [], showTopBar = true, className },\n ref,\n ) {\n const themeStyle = theme ? { backgroundColor: theme } : undefined;\n\n return (\n <div\n ref={ref}\n id=\"resume-capture-area\"\n className={cn(\n \"relative mx-auto flex min-h-[1056px] w-full flex-col rounded-sm border border-border bg-card p-8 text-card-foreground shadow-2xl sm:p-12 md:p-14\",\n className,\n )}\n >\n <Background />\n {showTopBar && (\n <div\n className={`absolute left-0 top-0 h-2 w-full ${theme ? \"\" : \"bg-gradient-to-r from-primary to-primary/50\"}`}\n style={themeStyle}\n />\n )}\n {/* Content layer — above background */}\n <div className=\"relative z-10\">\n {/* Subtle decorative top bar */}\n\n\n {/* Header Profile */}\n {!hideSections.includes(\"Información personal\") && (\n <HeaderPreview\n data={data}\n headerSlot={headerSlot}\n theme={theme}\n hideFields={hideFields}\n />\n )}\n\n {/* Main Content Layout */}\n <div className=\"mt-8 mb-8 grid grid-cols-1 gap-10 lg:grid-cols-12\">\n {/* Left Column (4/12) */}\n <div className=\"space-y-8 lg:col-span-4 lg:pr-6\">\n <ContactSkills data={data} hideFields={hideFields} hideSections={hideSections} />\n </div>\n\n {/* Right Column (8/12) - border-l acts as divider, avoids overlap with long content */}\n <div className=\"space-y-8 lg:col-span-8 lg:border-l lg:border-border/40 lg:pl-8\">\n <ExperienceEducation\n data={data}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n />\n </div>\n </div>\n\n <FooterPreview />\n </div>\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCQ;AAnCR,YAAuB;AAEvB,gBAA2B;AAC3B,mBAAmB;AACnB,4BAA8B;AAC9B,4BAA8B;AAC9B,kCAAoC;AACpC,4BAA8B;AAYvB,MAAM,gBAAgB,MAAM;AAAA,EACjC,SAASA,eACP,EAAE,MAAM,YAAY,OAAO,aAAa,CAAC,GAAG,eAAe,CAAC,GAAG,aAAa,MAAM,UAAU,GAC5F,KACA;AACA,UAAM,aAAa,QAAQ,EAAE,iBAAiB,MAAM,IAAI;AAExD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAG;AAAA,QACH,eAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEA;AAAA,sDAAC,wBAAW;AAAA,UACX,cACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,oCAAoC,QAAQ,KAAK,6CAA6C;AAAA,cACzG,OAAO;AAAA;AAAA,UACT;AAAA,UAGF,6CAAC,SAAI,WAAU,iBAKZ;AAAA,aAAC,aAAa,SAAS,yBAAsB,KAC5C;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF;AAAA,YAIF,6CAAC,SAAI,WAAU,qDAEb;AAAA,0DAAC,SAAI,WAAU,mCACb,sDAAC,uCAAc,MAAY,YAAwB,cAA4B,GACjF;AAAA,cAGA,4CAAC,SAAI,WAAU,mEACb;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA;AAAA,cACF,GACF;AAAA,eACF;AAAA,YAEA,4CAAC,uCAAc;AAAA,aACjB;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;","names":["ResumePreview"]}
|
|
@@ -7,6 +7,8 @@ interface ResumePreviewProps {
|
|
|
7
7
|
theme?: string;
|
|
8
8
|
hideFields?: string[];
|
|
9
9
|
hideSections?: string[];
|
|
10
|
+
showTopBar?: boolean;
|
|
11
|
+
className?: string;
|
|
10
12
|
}
|
|
11
13
|
declare const ResumePreview: React.ForwardRefExoticComponent<ResumePreviewProps & React.RefAttributes<HTMLDivElement>>;
|
|
12
14
|
|
|
@@ -7,6 +7,8 @@ interface ResumePreviewProps {
|
|
|
7
7
|
theme?: string;
|
|
8
8
|
hideFields?: string[];
|
|
9
9
|
hideSections?: string[];
|
|
10
|
+
showTopBar?: boolean;
|
|
11
|
+
className?: string;
|
|
10
12
|
}
|
|
11
13
|
declare const ResumePreview: React.ForwardRefExoticComponent<ResumePreviewProps & React.RefAttributes<HTMLDivElement>>;
|
|
12
14
|
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { Background } from "../../../ui";
|
|
4
|
+
import { cn } from "../../../../lib/utils";
|
|
4
5
|
import { HeaderPreview } from "./sections/header-preview";
|
|
5
6
|
import { ContactSkills } from "./sections/contact-skills";
|
|
6
7
|
import { ExperienceEducation } from "./sections/experience-education";
|
|
7
8
|
import { FooterPreview } from "./sections/footer-preview";
|
|
8
9
|
const ResumePreview = React.forwardRef(
|
|
9
|
-
function ResumePreview2({ data, headerSlot, theme, hideFields = [], hideSections = [] }, ref) {
|
|
10
|
+
function ResumePreview2({ data, headerSlot, theme, hideFields = [], hideSections = [], showTopBar = true, className }, ref) {
|
|
10
11
|
const themeStyle = theme ? { backgroundColor: theme } : void 0;
|
|
11
12
|
return /* @__PURE__ */ jsxs(
|
|
12
13
|
"div",
|
|
13
14
|
{
|
|
14
15
|
ref,
|
|
15
16
|
id: "resume-capture-area",
|
|
16
|
-
className:
|
|
17
|
+
className: cn(
|
|
18
|
+
"relative mx-auto flex min-h-[1056px] w-full flex-col rounded-sm border border-border bg-card p-8 text-card-foreground shadow-2xl sm:p-12 md:p-14",
|
|
19
|
+
className
|
|
20
|
+
),
|
|
17
21
|
children: [
|
|
18
22
|
/* @__PURE__ */ jsx(Background, {}),
|
|
19
|
-
/* @__PURE__ */ jsx(
|
|
23
|
+
showTopBar && /* @__PURE__ */ jsx(
|
|
20
24
|
"div",
|
|
21
25
|
{
|
|
22
26
|
className: `absolute left-0 top-0 h-2 w-full ${theme ? "" : "bg-gradient-to-r from-primary to-primary/50"}`,
|
|
@@ -33,10 +37,9 @@ const ResumePreview = React.forwardRef(
|
|
|
33
37
|
hideFields
|
|
34
38
|
}
|
|
35
39
|
),
|
|
36
|
-
/* @__PURE__ */ jsxs("div", { className: "mt-8 grid grid-cols-1 gap-10 lg:grid-cols-12", children: [
|
|
40
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-8 mb-8 grid grid-cols-1 gap-10 lg:grid-cols-12", children: [
|
|
37
41
|
/* @__PURE__ */ jsx("div", { className: "space-y-8 lg:col-span-4 lg:pr-6", children: /* @__PURE__ */ jsx(ContactSkills, { data, hideFields, hideSections }) }),
|
|
38
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
39
|
-
/* @__PURE__ */ jsx("div", { className: "space-y-8 lg:col-span-8", children: /* @__PURE__ */ jsx(
|
|
42
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-8 lg:col-span-8 lg:border-l lg:border-border/40 lg:pl-8", children: /* @__PURE__ */ jsx(
|
|
40
43
|
ExperienceEducation,
|
|
41
44
|
{
|
|
42
45
|
data,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/domain/resume/resume-preview/resume-preview.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { CandidateProfile } from \"../types\";\nimport { Background } from \"../../../ui\";\nimport { HeaderPreview } from \"./sections/header-preview\";\nimport { ContactSkills } from \"./sections/contact-skills\";\nimport { ExperienceEducation } from \"./sections/experience-education\";\nimport { FooterPreview } from \"./sections/footer-preview\";\n\nexport interface ResumePreviewProps {\n data: CandidateProfile;\n headerSlot?: React.ReactNode;\n theme?: string;\n hideFields?: string[];\n hideSections?: string[];\n}\n\nexport const ResumePreview = React.forwardRef<HTMLDivElement, ResumePreviewProps>(\n function ResumePreview({ data, headerSlot, theme, hideFields = [], hideSections = []
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/domain/resume/resume-preview/resume-preview.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { CandidateProfile } from \"../types\";\nimport { Background } from \"../../../ui\";\nimport { cn } from \"../../../../lib/utils\";\nimport { HeaderPreview } from \"./sections/header-preview\";\nimport { ContactSkills } from \"./sections/contact-skills\";\nimport { ExperienceEducation } from \"./sections/experience-education\";\nimport { FooterPreview } from \"./sections/footer-preview\";\n\nexport interface ResumePreviewProps {\n data: CandidateProfile;\n headerSlot?: React.ReactNode;\n theme?: string;\n hideFields?: string[];\n hideSections?: string[];\n showTopBar?: boolean;\n className?: string;\n}\n\nexport const ResumePreview = React.forwardRef<HTMLDivElement, ResumePreviewProps>(\n function ResumePreview(\n { data, headerSlot, theme, hideFields = [], hideSections = [], showTopBar = true, className },\n ref,\n ) {\n const themeStyle = theme ? { backgroundColor: theme } : undefined;\n\n return (\n <div\n ref={ref}\n id=\"resume-capture-area\"\n className={cn(\n \"relative mx-auto flex min-h-[1056px] w-full flex-col rounded-sm border border-border bg-card p-8 text-card-foreground shadow-2xl sm:p-12 md:p-14\",\n className,\n )}\n >\n <Background />\n {showTopBar && (\n <div\n className={`absolute left-0 top-0 h-2 w-full ${theme ? \"\" : \"bg-gradient-to-r from-primary to-primary/50\"}`}\n style={themeStyle}\n />\n )}\n {/* Content layer — above background */}\n <div className=\"relative z-10\">\n {/* Subtle decorative top bar */}\n\n\n {/* Header Profile */}\n {!hideSections.includes(\"Información personal\") && (\n <HeaderPreview\n data={data}\n headerSlot={headerSlot}\n theme={theme}\n hideFields={hideFields}\n />\n )}\n\n {/* Main Content Layout */}\n <div className=\"mt-8 mb-8 grid grid-cols-1 gap-10 lg:grid-cols-12\">\n {/* Left Column (4/12) */}\n <div className=\"space-y-8 lg:col-span-4 lg:pr-6\">\n <ContactSkills data={data} hideFields={hideFields} hideSections={hideSections} />\n </div>\n\n {/* Right Column (8/12) - border-l acts as divider, avoids overlap with long content */}\n <div className=\"space-y-8 lg:col-span-8 lg:border-l lg:border-border/40 lg:pl-8\">\n <ExperienceEducation\n data={data}\n theme={theme}\n hideFields={hideFields}\n hideSections={hideSections}\n />\n </div>\n </div>\n\n <FooterPreview />\n </div>\n </div>\n );\n },\n);\n"],"mappings":"AAmCQ,cAuBE,YAvBF;AAnCR,YAAY,WAAW;AAEvB,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AACnB,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAYvB,MAAM,gBAAgB,MAAM;AAAA,EACjC,SAASA,eACP,EAAE,MAAM,YAAY,OAAO,aAAa,CAAC,GAAG,eAAe,CAAC,GAAG,aAAa,MAAM,UAAU,GAC5F,KACA;AACA,UAAM,aAAa,QAAQ,EAAE,iBAAiB,MAAM,IAAI;AAExD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAG;AAAA,QACH,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEA;AAAA,8BAAC,cAAW;AAAA,UACX,cACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,oCAAoC,QAAQ,KAAK,6CAA6C;AAAA,cACzG,OAAO;AAAA;AAAA,UACT;AAAA,UAGF,qBAAC,SAAI,WAAU,iBAKZ;AAAA,aAAC,aAAa,SAAS,yBAAsB,KAC5C;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF;AAAA,YAIF,qBAAC,SAAI,WAAU,qDAEb;AAAA,kCAAC,SAAI,WAAU,mCACb,8BAAC,iBAAc,MAAY,YAAwB,cAA4B,GACjF;AAAA,cAGA,oBAAC,SAAI,WAAU,mEACb;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA;AAAA,cACF,GACF;AAAA,eACF;AAAA,YAEA,oBAAC,iBAAc;AAAA,aACjB;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;","names":["ResumePreview"]}
|
|
@@ -27,7 +27,7 @@ var import_lucide_react = require("lucide-react");
|
|
|
27
27
|
function ContactSkills({ data, hideFields = [], hideSections = [] }) {
|
|
28
28
|
const hardSkills = data.skills?.hard || [];
|
|
29
29
|
const softSkills = data.skills?.soft || [];
|
|
30
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-10", children: [
|
|
30
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0 space-y-10", children: [
|
|
31
31
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-4", children: [
|
|
32
32
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h3", { className: "flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary", children: [
|
|
33
33
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.User, { className: "h-5 w-5 text-primary" }),
|
|
@@ -57,14 +57,14 @@ function ContactSkills({ data, hideFields = [], hideSections = [] }) {
|
|
|
57
57
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Code, { className: "h-5 w-5 text-primary" }),
|
|
58
58
|
"Habilidades T\xE9cnicas"
|
|
59
59
|
] }),
|
|
60
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-4 flex flex-wrap gap-2", children: hardSkills.map((skill) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
60
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-4 flex min-w-0 flex-wrap gap-2 overflow-hidden", children: hardSkills.map((skill) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
61
61
|
import_ui.Badge,
|
|
62
62
|
{
|
|
63
63
|
variant: "outline",
|
|
64
|
-
className: "pdf-badge border-border/80 bg-muted/20 px-3 py-1 text-sm text-muted-foreground",
|
|
64
|
+
className: "pdf-badge inline-flex max-w-full flex-wrap items-center gap-1 whitespace-normal break-words border-border/80 bg-muted/20 px-3 py-1 text-left text-sm text-muted-foreground",
|
|
65
65
|
children: [
|
|
66
66
|
skill.name,
|
|
67
|
-
skill.verified && !hideFields.includes("skills.hard.verified") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCircle2, { className: "
|
|
67
|
+
skill.verified && !hideFields.includes("skills.hard.verified") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CheckCircle2, { className: "h-3.5 w-3.5 shrink-0 text-primary-foreground/90" })
|
|
68
68
|
]
|
|
69
69
|
},
|
|
70
70
|
skill.id
|
|
@@ -75,11 +75,11 @@ function ContactSkills({ data, hideFields = [], hideSections = [] }) {
|
|
|
75
75
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Users, { className: "h-5 w-5 text-primary" }),
|
|
76
76
|
"Aptitudes"
|
|
77
77
|
] }),
|
|
78
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-4 flex flex-wrap gap-2", children: softSkills.map((skill) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
78
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-4 flex min-w-0 flex-wrap gap-2 overflow-hidden", children: softSkills.map((skill) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
79
79
|
import_ui.Badge,
|
|
80
80
|
{
|
|
81
81
|
variant: "outline",
|
|
82
|
-
className: "pdf-badge border-border/80 bg-muted/20 px-3 py-1 text-sm text-muted-foreground",
|
|
82
|
+
className: "pdf-badge inline-block max-w-full whitespace-normal break-words border-border/80 bg-muted/20 px-3 py-1 text-left text-sm text-muted-foreground",
|
|
83
83
|
children: skill.name
|
|
84
84
|
},
|
|
85
85
|
skill.id
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/components/domain/resume/resume-preview/sections/contact-skills.tsx"],"sourcesContent":["import { CandidateProfile } from \"../../types\";\nimport { Badge } from \"../../../../ui\";\nimport { User, Mail, Phone, MapPin, Code, CheckCircle2, Users } from \"lucide-react\";\n\ninterface ContactSkillsProps {\n data: CandidateProfile;\n hideFields?: string[];\n hideSections?: string[];\n}\n\nexport function ContactSkills({ data, hideFields = [], hideSections = [] }: ContactSkillsProps) {\n const hardSkills = data.skills?.hard || [];\n const softSkills = data.skills?.soft || [];\n\n return (\n <div className=\"space-y-10\">\n {/* Contacto */}\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <User className=\"h-5 w-5 text-primary\" />\n Contacto\n </h3>\n <div className=\"mt-4 space-y-3\">\n {data.email && !hideFields.includes(\"email\") && (\n <div className=\"flex items-center gap-3 text-sm text-foreground\">\n <Mail className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"break-all font-medium\">{data.email}</span>\n </div>\n )}\n {data.phone_number && !hideFields.includes(\"phone_number\") && (\n <div className=\"flex items-center gap-3 text-sm text-foreground\">\n <Phone className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"font-medium\">{data.phone_number}</span>\n </div>\n )}\n {(data.city || data.address) &&\n (!hideFields.includes(\"city\") || !hideFields.includes(\"address\")) && (\n <div className=\"flex items-start gap-3 text-sm text-foreground\">\n <MapPin className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"font-medium leading-tight\">\n {[\n !hideFields.includes(\"address\") ? data.address : null,\n !hideFields.includes(\"city\") ? data.city : null,\n ]\n .filter(Boolean)\n .join(\", \")}\n </span>\n </div>\n )}\n </div>\n </div>\n\n {/* Skills */}\n {!hideSections.includes(\"Habilidades\") && (\n <div className=\"space-y-6\">\n {hardSkills.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <Code className=\"h-5 w-5 text-primary\" />\n Habilidades Técnicas\n </h3>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {hardSkills.map((skill) => (\n <Badge\n key={skill.id}\n variant=\"outline\"\n className=\"pdf-badge border-border/80 bg-muted/20 px-3 py-1 text-sm text-muted-foreground\"\n >\n {skill.name}\n {skill.verified && !hideFields.includes(\"skills.hard.verified\") && (\n <CheckCircle2 className=\"
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/domain/resume/resume-preview/sections/contact-skills.tsx"],"sourcesContent":["import { CandidateProfile } from \"../../types\";\nimport { Badge } from \"../../../../ui\";\nimport { User, Mail, Phone, MapPin, Code, CheckCircle2, Users } from \"lucide-react\";\n\ninterface ContactSkillsProps {\n data: CandidateProfile;\n hideFields?: string[];\n hideSections?: string[];\n}\n\nexport function ContactSkills({ data, hideFields = [], hideSections = [] }: ContactSkillsProps) {\n const hardSkills = data.skills?.hard || [];\n const softSkills = data.skills?.soft || [];\n\n return (\n <div className=\"min-w-0 space-y-10\">\n {/* Contacto */}\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <User className=\"h-5 w-5 text-primary\" />\n Contacto\n </h3>\n <div className=\"mt-4 space-y-3\">\n {data.email && !hideFields.includes(\"email\") && (\n <div className=\"flex items-center gap-3 text-sm text-foreground\">\n <Mail className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"break-all font-medium\">{data.email}</span>\n </div>\n )}\n {data.phone_number && !hideFields.includes(\"phone_number\") && (\n <div className=\"flex items-center gap-3 text-sm text-foreground\">\n <Phone className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"font-medium\">{data.phone_number}</span>\n </div>\n )}\n {(data.city || data.address) &&\n (!hideFields.includes(\"city\") || !hideFields.includes(\"address\")) && (\n <div className=\"flex items-start gap-3 text-sm text-foreground\">\n <MapPin className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"font-medium leading-tight\">\n {[\n !hideFields.includes(\"address\") ? data.address : null,\n !hideFields.includes(\"city\") ? data.city : null,\n ]\n .filter(Boolean)\n .join(\", \")}\n </span>\n </div>\n )}\n </div>\n </div>\n\n {/* Skills */}\n {!hideSections.includes(\"Habilidades\") && (\n <div className=\"space-y-6\">\n {hardSkills.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <Code className=\"h-5 w-5 text-primary\" />\n Habilidades Técnicas\n </h3>\n <div className=\"mt-4 flex min-w-0 flex-wrap gap-2 overflow-hidden\">\n {hardSkills.map((skill) => (\n <Badge\n key={skill.id}\n variant=\"outline\"\n className=\"pdf-badge inline-flex max-w-full flex-wrap items-center gap-1 whitespace-normal break-words border-border/80 bg-muted/20 px-3 py-1 text-left text-sm text-muted-foreground\"\n >\n {skill.name}\n {skill.verified && !hideFields.includes(\"skills.hard.verified\") && (\n <CheckCircle2 className=\"h-3.5 w-3.5 shrink-0 text-primary-foreground/90\" />\n )}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n {softSkills.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <Users className=\"h-5 w-5 text-primary\" />\n Aptitudes\n </h3>\n <div className=\"mt-4 flex min-w-0 flex-wrap gap-2 overflow-hidden\">\n {softSkills.map((skill) => (\n <Badge\n key={skill.id}\n variant=\"outline\"\n className=\"pdf-badge inline-block max-w-full whitespace-normal break-words border-border/80 bg-muted/20 px-3 py-1 text-left text-sm text-muted-foreground\"\n >\n {skill.name}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBQ;AAjBR,gBAAsB;AACtB,0BAAqE;AAQ9D,SAAS,cAAc,EAAE,MAAM,aAAa,CAAC,GAAG,eAAe,CAAC,EAAE,GAAuB;AAC9F,QAAM,aAAa,KAAK,QAAQ,QAAQ,CAAC;AACzC,QAAM,aAAa,KAAK,QAAQ,QAAQ,CAAC;AAEzC,SACE,6CAAC,SAAI,WAAU,sBAEb;AAAA,iDAAC,SAAI,WAAU,aACb;AAAA,mDAAC,QAAG,WAAU,sFACZ;AAAA,oDAAC,4BAAK,WAAU,wBAAuB;AAAA,QAAE;AAAA,SAE3C;AAAA,MACA,6CAAC,SAAI,WAAU,kBACZ;AAAA,aAAK,SAAS,CAAC,WAAW,SAAS,OAAO,KACzC,6CAAC,SAAI,WAAU,mDACb;AAAA,sDAAC,4BAAK,WAAU,+CAA8C;AAAA,UAC9D,4CAAC,UAAK,WAAU,yBAAyB,eAAK,OAAM;AAAA,WACtD;AAAA,QAED,KAAK,gBAAgB,CAAC,WAAW,SAAS,cAAc,KACvD,6CAAC,SAAI,WAAU,mDACb;AAAA,sDAAC,6BAAM,WAAU,+CAA8C;AAAA,UAC/D,4CAAC,UAAK,WAAU,eAAe,eAAK,cAAa;AAAA,WACnD;AAAA,SAEA,KAAK,QAAQ,KAAK,aACjB,CAAC,WAAW,SAAS,MAAM,KAAK,CAAC,WAAW,SAAS,SAAS,MAC7D,6CAAC,SAAI,WAAU,kDACb;AAAA,sDAAC,8BAAO,WAAU,sDAAqD;AAAA,UACvE,4CAAC,UAAK,WAAU,6BACb;AAAA,YACC,CAAC,WAAW,SAAS,SAAS,IAAI,KAAK,UAAU;AAAA,YACjD,CAAC,WAAW,SAAS,MAAM,IAAI,KAAK,OAAO;AAAA,UAC7C,EACG,OAAO,OAAO,EACd,KAAK,IAAI,GACd;AAAA,WACF;AAAA,SAEN;AAAA,OACF;AAAA,IAGC,CAAC,aAAa,SAAS,aAAa,KACnC,6CAAC,SAAI,WAAU,aACZ;AAAA,iBAAW,SAAS,KACnB,6CAAC,SAAI,WAAU,aACb;AAAA,qDAAC,QAAG,WAAU,sFACZ;AAAA,sDAAC,4BAAK,WAAU,wBAAuB;AAAA,UAAE;AAAA,WAE3C;AAAA,QACA,4CAAC,SAAI,WAAU,qDACZ,qBAAW,IAAI,CAAC,UACf;AAAA,UAAC;AAAA;AAAA,YAEC,SAAQ;AAAA,YACR,WAAU;AAAA,YAET;AAAA,oBAAM;AAAA,cACN,MAAM,YAAY,CAAC,WAAW,SAAS,sBAAsB,KAC5D,4CAAC,oCAAa,WAAU,mDAAkD;AAAA;AAAA;AAAA,UANvE,MAAM;AAAA,QAQb,CACD,GACH;AAAA,SACF;AAAA,MAGD,WAAW,SAAS,KACnB,6CAAC,SAAI,WAAU,aACb;AAAA,qDAAC,QAAG,WAAU,sFACZ;AAAA,sDAAC,6BAAM,WAAU,wBAAuB;AAAA,UAAE;AAAA,WAE5C;AAAA,QACA,4CAAC,SAAI,WAAU,qDACZ,qBAAW,IAAI,CAAC,UACf;AAAA,UAAC;AAAA;AAAA,YAEC,SAAQ;AAAA,YACR,WAAU;AAAA,YAET,gBAAM;AAAA;AAAA,UAJF,MAAM;AAAA,QAKb,CACD,GACH;AAAA,SACF;AAAA,OAEJ;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -4,7 +4,7 @@ import { User, Mail, Phone, MapPin, Code, CheckCircle2, Users } from "lucide-rea
|
|
|
4
4
|
function ContactSkills({ data, hideFields = [], hideSections = [] }) {
|
|
5
5
|
const hardSkills = data.skills?.hard || [];
|
|
6
6
|
const softSkills = data.skills?.soft || [];
|
|
7
|
-
return /* @__PURE__ */ jsxs("div", { className: "space-y-10", children: [
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-10", children: [
|
|
8
8
|
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
9
9
|
/* @__PURE__ */ jsxs("h3", { className: "flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary", children: [
|
|
10
10
|
/* @__PURE__ */ jsx(User, { className: "h-5 w-5 text-primary" }),
|
|
@@ -34,14 +34,14 @@ function ContactSkills({ data, hideFields = [], hideSections = [] }) {
|
|
|
34
34
|
/* @__PURE__ */ jsx(Code, { className: "h-5 w-5 text-primary" }),
|
|
35
35
|
"Habilidades T\xE9cnicas"
|
|
36
36
|
] }),
|
|
37
|
-
/* @__PURE__ */ jsx("div", { className: "mt-4 flex flex-wrap gap-2", children: hardSkills.map((skill) => /* @__PURE__ */ jsxs(
|
|
37
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 flex min-w-0 flex-wrap gap-2 overflow-hidden", children: hardSkills.map((skill) => /* @__PURE__ */ jsxs(
|
|
38
38
|
Badge,
|
|
39
39
|
{
|
|
40
40
|
variant: "outline",
|
|
41
|
-
className: "pdf-badge border-border/80 bg-muted/20 px-3 py-1 text-sm text-muted-foreground",
|
|
41
|
+
className: "pdf-badge inline-flex max-w-full flex-wrap items-center gap-1 whitespace-normal break-words border-border/80 bg-muted/20 px-3 py-1 text-left text-sm text-muted-foreground",
|
|
42
42
|
children: [
|
|
43
43
|
skill.name,
|
|
44
|
-
skill.verified && !hideFields.includes("skills.hard.verified") && /* @__PURE__ */ jsx(CheckCircle2, { className: "
|
|
44
|
+
skill.verified && !hideFields.includes("skills.hard.verified") && /* @__PURE__ */ jsx(CheckCircle2, { className: "h-3.5 w-3.5 shrink-0 text-primary-foreground/90" })
|
|
45
45
|
]
|
|
46
46
|
},
|
|
47
47
|
skill.id
|
|
@@ -52,11 +52,11 @@ function ContactSkills({ data, hideFields = [], hideSections = [] }) {
|
|
|
52
52
|
/* @__PURE__ */ jsx(Users, { className: "h-5 w-5 text-primary" }),
|
|
53
53
|
"Aptitudes"
|
|
54
54
|
] }),
|
|
55
|
-
/* @__PURE__ */ jsx("div", { className: "mt-4 flex flex-wrap gap-2", children: softSkills.map((skill) => /* @__PURE__ */ jsx(
|
|
55
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 flex min-w-0 flex-wrap gap-2 overflow-hidden", children: softSkills.map((skill) => /* @__PURE__ */ jsx(
|
|
56
56
|
Badge,
|
|
57
57
|
{
|
|
58
58
|
variant: "outline",
|
|
59
|
-
className: "pdf-badge border-border/80 bg-muted/20 px-3 py-1 text-sm text-muted-foreground",
|
|
59
|
+
className: "pdf-badge inline-block max-w-full whitespace-normal break-words border-border/80 bg-muted/20 px-3 py-1 text-left text-sm text-muted-foreground",
|
|
60
60
|
children: skill.name
|
|
61
61
|
},
|
|
62
62
|
skill.id
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/components/domain/resume/resume-preview/sections/contact-skills.tsx"],"sourcesContent":["import { CandidateProfile } from \"../../types\";\nimport { Badge } from \"../../../../ui\";\nimport { User, Mail, Phone, MapPin, Code, CheckCircle2, Users } from \"lucide-react\";\n\ninterface ContactSkillsProps {\n data: CandidateProfile;\n hideFields?: string[];\n hideSections?: string[];\n}\n\nexport function ContactSkills({ data, hideFields = [], hideSections = [] }: ContactSkillsProps) {\n const hardSkills = data.skills?.hard || [];\n const softSkills = data.skills?.soft || [];\n\n return (\n <div className=\"space-y-10\">\n {/* Contacto */}\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <User className=\"h-5 w-5 text-primary\" />\n Contacto\n </h3>\n <div className=\"mt-4 space-y-3\">\n {data.email && !hideFields.includes(\"email\") && (\n <div className=\"flex items-center gap-3 text-sm text-foreground\">\n <Mail className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"break-all font-medium\">{data.email}</span>\n </div>\n )}\n {data.phone_number && !hideFields.includes(\"phone_number\") && (\n <div className=\"flex items-center gap-3 text-sm text-foreground\">\n <Phone className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"font-medium\">{data.phone_number}</span>\n </div>\n )}\n {(data.city || data.address) &&\n (!hideFields.includes(\"city\") || !hideFields.includes(\"address\")) && (\n <div className=\"flex items-start gap-3 text-sm text-foreground\">\n <MapPin className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"font-medium leading-tight\">\n {[\n !hideFields.includes(\"address\") ? data.address : null,\n !hideFields.includes(\"city\") ? data.city : null,\n ]\n .filter(Boolean)\n .join(\", \")}\n </span>\n </div>\n )}\n </div>\n </div>\n\n {/* Skills */}\n {!hideSections.includes(\"Habilidades\") && (\n <div className=\"space-y-6\">\n {hardSkills.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <Code className=\"h-5 w-5 text-primary\" />\n Habilidades Técnicas\n </h3>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {hardSkills.map((skill) => (\n <Badge\n key={skill.id}\n variant=\"outline\"\n className=\"pdf-badge border-border/80 bg-muted/20 px-3 py-1 text-sm text-muted-foreground\"\n >\n {skill.name}\n {skill.verified && !hideFields.includes(\"skills.hard.verified\") && (\n <CheckCircle2 className=\"
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/domain/resume/resume-preview/sections/contact-skills.tsx"],"sourcesContent":["import { CandidateProfile } from \"../../types\";\nimport { Badge } from \"../../../../ui\";\nimport { User, Mail, Phone, MapPin, Code, CheckCircle2, Users } from \"lucide-react\";\n\ninterface ContactSkillsProps {\n data: CandidateProfile;\n hideFields?: string[];\n hideSections?: string[];\n}\n\nexport function ContactSkills({ data, hideFields = [], hideSections = [] }: ContactSkillsProps) {\n const hardSkills = data.skills?.hard || [];\n const softSkills = data.skills?.soft || [];\n\n return (\n <div className=\"min-w-0 space-y-10\">\n {/* Contacto */}\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <User className=\"h-5 w-5 text-primary\" />\n Contacto\n </h3>\n <div className=\"mt-4 space-y-3\">\n {data.email && !hideFields.includes(\"email\") && (\n <div className=\"flex items-center gap-3 text-sm text-foreground\">\n <Mail className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"break-all font-medium\">{data.email}</span>\n </div>\n )}\n {data.phone_number && !hideFields.includes(\"phone_number\") && (\n <div className=\"flex items-center gap-3 text-sm text-foreground\">\n <Phone className=\"h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"font-medium\">{data.phone_number}</span>\n </div>\n )}\n {(data.city || data.address) &&\n (!hideFields.includes(\"city\") || !hideFields.includes(\"address\")) && (\n <div className=\"flex items-start gap-3 text-sm text-foreground\">\n <MapPin className=\"mt-0.5 h-4 w-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"font-medium leading-tight\">\n {[\n !hideFields.includes(\"address\") ? data.address : null,\n !hideFields.includes(\"city\") ? data.city : null,\n ]\n .filter(Boolean)\n .join(\", \")}\n </span>\n </div>\n )}\n </div>\n </div>\n\n {/* Skills */}\n {!hideSections.includes(\"Habilidades\") && (\n <div className=\"space-y-6\">\n {hardSkills.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <Code className=\"h-5 w-5 text-primary\" />\n Habilidades Técnicas\n </h3>\n <div className=\"mt-4 flex min-w-0 flex-wrap gap-2 overflow-hidden\">\n {hardSkills.map((skill) => (\n <Badge\n key={skill.id}\n variant=\"outline\"\n className=\"pdf-badge inline-flex max-w-full flex-wrap items-center gap-1 whitespace-normal break-words border-border/80 bg-muted/20 px-3 py-1 text-left text-sm text-muted-foreground\"\n >\n {skill.name}\n {skill.verified && !hideFields.includes(\"skills.hard.verified\") && (\n <CheckCircle2 className=\"h-3.5 w-3.5 shrink-0 text-primary-foreground/90\" />\n )}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n {softSkills.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"flex items-center gap-2 border-b border-border pb-2 text-xl font-bold text-primary\">\n <Users className=\"h-5 w-5 text-primary\" />\n Aptitudes\n </h3>\n <div className=\"mt-4 flex min-w-0 flex-wrap gap-2 overflow-hidden\">\n {softSkills.map((skill) => (\n <Badge\n key={skill.id}\n variant=\"outline\"\n className=\"pdf-badge inline-block max-w-full whitespace-normal break-words border-border/80 bg-muted/20 px-3 py-1 text-left text-sm text-muted-foreground\"\n >\n {skill.name}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"AAkBQ,SACE,KADF;AAjBR,SAAS,aAAa;AACtB,SAAS,MAAM,MAAM,OAAO,QAAQ,MAAM,cAAc,aAAa;AAQ9D,SAAS,cAAc,EAAE,MAAM,aAAa,CAAC,GAAG,eAAe,CAAC,EAAE,GAAuB;AAC9F,QAAM,aAAa,KAAK,QAAQ,QAAQ,CAAC;AACzC,QAAM,aAAa,KAAK,QAAQ,QAAQ,CAAC;AAEzC,SACE,qBAAC,SAAI,WAAU,sBAEb;AAAA,yBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,QAAG,WAAU,sFACZ;AAAA,4BAAC,QAAK,WAAU,wBAAuB;AAAA,QAAE;AAAA,SAE3C;AAAA,MACA,qBAAC,SAAI,WAAU,kBACZ;AAAA,aAAK,SAAS,CAAC,WAAW,SAAS,OAAO,KACzC,qBAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,QAAK,WAAU,+CAA8C;AAAA,UAC9D,oBAAC,UAAK,WAAU,yBAAyB,eAAK,OAAM;AAAA,WACtD;AAAA,QAED,KAAK,gBAAgB,CAAC,WAAW,SAAS,cAAc,KACvD,qBAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,SAAM,WAAU,+CAA8C;AAAA,UAC/D,oBAAC,UAAK,WAAU,eAAe,eAAK,cAAa;AAAA,WACnD;AAAA,SAEA,KAAK,QAAQ,KAAK,aACjB,CAAC,WAAW,SAAS,MAAM,KAAK,CAAC,WAAW,SAAS,SAAS,MAC7D,qBAAC,SAAI,WAAU,kDACb;AAAA,8BAAC,UAAO,WAAU,sDAAqD;AAAA,UACvE,oBAAC,UAAK,WAAU,6BACb;AAAA,YACC,CAAC,WAAW,SAAS,SAAS,IAAI,KAAK,UAAU;AAAA,YACjD,CAAC,WAAW,SAAS,MAAM,IAAI,KAAK,OAAO;AAAA,UAC7C,EACG,OAAO,OAAO,EACd,KAAK,IAAI,GACd;AAAA,WACF;AAAA,SAEN;AAAA,OACF;AAAA,IAGC,CAAC,aAAa,SAAS,aAAa,KACnC,qBAAC,SAAI,WAAU,aACZ;AAAA,iBAAW,SAAS,KACnB,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,QAAG,WAAU,sFACZ;AAAA,8BAAC,QAAK,WAAU,wBAAuB;AAAA,UAAE;AAAA,WAE3C;AAAA,QACA,oBAAC,SAAI,WAAU,qDACZ,qBAAW,IAAI,CAAC,UACf;AAAA,UAAC;AAAA;AAAA,YAEC,SAAQ;AAAA,YACR,WAAU;AAAA,YAET;AAAA,oBAAM;AAAA,cACN,MAAM,YAAY,CAAC,WAAW,SAAS,sBAAsB,KAC5D,oBAAC,gBAAa,WAAU,mDAAkD;AAAA;AAAA;AAAA,UANvE,MAAM;AAAA,QAQb,CACD,GACH;AAAA,SACF;AAAA,MAGD,WAAW,SAAS,KACnB,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,QAAG,WAAU,sFACZ;AAAA,8BAAC,SAAM,WAAU,wBAAuB;AAAA,UAAE;AAAA,WAE5C;AAAA,QACA,oBAAC,SAAI,WAAU,qDACZ,qBAAW,IAAI,CAAC,UACf;AAAA,UAAC;AAAA;AAAA,YAEC,SAAQ;AAAA,YACR,WAAU;AAAA,YAET,gBAAM;AAAA;AAAA,UAJF,MAAM;AAAA,QAKb,CACD,GACH;AAAA,SACF;AAAA,OAEJ;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -83,13 +83,10 @@ function ExperienceEducation({
|
|
|
83
83
|
!hideFields.includes("experience.title") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h4", { className: "text-lg font-bold text-foreground", children: exp.title }),
|
|
84
84
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between", children: [
|
|
85
85
|
!hideFields.includes("experience.institution_name") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-base font-semibold text-primary", children: exp.institution_name }),
|
|
86
|
-
(!hideFields.includes("experience.start_date") || !hideFields.includes("experience.end_date")) && /* @__PURE__ */ (0, import_jsx_runtime.
|
|
86
|
+
(!hideFields.includes("experience.start_date") || !hideFields.includes("experience.end_date")) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge", children: [
|
|
87
87
|
!hideFields.includes("experience.start_date") && exp.start_date,
|
|
88
|
-
!hideFields.includes("experience.end_date") &&
|
|
89
|
-
|
|
90
|
-
exp.end_date ? `- ${exp.end_date}` : "- Presente"
|
|
91
|
-
] })
|
|
92
|
-
] })
|
|
88
|
+
!hideFields.includes("experience.end_date") && exp.end_date && exp.end_date.toLowerCase() !== "presente" ? `- ${exp.end_date}` : null
|
|
89
|
+
].filter(Boolean).join(" ") })
|
|
93
90
|
] }),
|
|
94
91
|
exp.description && !hideFields.includes("experience.description") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80", children: exp.description })
|
|
95
92
|
]
|
|
@@ -117,13 +114,10 @@ function ExperienceEducation({
|
|
|
117
114
|
!hideFields.includes("education.title") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h4", { className: "text-lg font-bold text-foreground", children: edu.title }),
|
|
118
115
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between", children: [
|
|
119
116
|
!hideFields.includes("education.institution_name") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-base font-semibold text-primary", children: edu.institution_name }),
|
|
120
|
-
(!hideFields.includes("education.start_date") || !hideFields.includes("education.end_date")) && /* @__PURE__ */ (0, import_jsx_runtime.
|
|
117
|
+
(!hideFields.includes("education.start_date") || !hideFields.includes("education.end_date")) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge", children: [
|
|
121
118
|
!hideFields.includes("education.start_date") && edu.start_date,
|
|
122
|
-
!hideFields.includes("education.end_date") &&
|
|
123
|
-
|
|
124
|
-
edu.end_date ? `- ${edu.end_date}` : "- Presente"
|
|
125
|
-
] })
|
|
126
|
-
] })
|
|
119
|
+
!hideFields.includes("education.end_date") && edu.end_date && edu.end_date.toLowerCase() !== "presente" ? `- ${edu.end_date}` : null
|
|
120
|
+
].filter(Boolean).join(" ") })
|
|
127
121
|
] }),
|
|
128
122
|
edu.description && !hideFields.includes("education.description") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80", children: edu.description })
|
|
129
123
|
]
|
|
@@ -151,13 +145,10 @@ function ExperienceEducation({
|
|
|
151
145
|
!hideFields.includes("activities.title") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h4", { className: "text-lg font-bold text-foreground", children: act.title }),
|
|
152
146
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between", children: [
|
|
153
147
|
!hideFields.includes("activities.institution_name") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-base font-semibold text-primary", children: act.institution_name }),
|
|
154
|
-
(!hideFields.includes("activities.start_date") || !hideFields.includes("activities.end_date")) && /* @__PURE__ */ (0, import_jsx_runtime.
|
|
148
|
+
(!hideFields.includes("activities.start_date") || !hideFields.includes("activities.end_date")) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge", children: [
|
|
155
149
|
!hideFields.includes("activities.start_date") && act.start_date,
|
|
156
|
-
!hideFields.includes("activities.end_date") &&
|
|
157
|
-
|
|
158
|
-
act.end_date ? `- ${act.end_date}` : "- Presente"
|
|
159
|
-
] })
|
|
160
|
-
] })
|
|
150
|
+
!hideFields.includes("activities.end_date") && act.end_date && act.end_date.toLowerCase() !== "presente" ? `- ${act.end_date}` : null
|
|
151
|
+
].filter(Boolean).join(" ") })
|
|
161
152
|
] }),
|
|
162
153
|
act.description && !hideFields.includes("activities.description") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80", children: act.description })
|
|
163
154
|
]
|
|
@@ -170,22 +161,15 @@ function ExperienceEducation({
|
|
|
170
161
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Award, { className: "h-6 w-6 text-primary" }),
|
|
171
162
|
"Certificaciones"
|
|
172
163
|
] }),
|
|
173
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-1 gap-4
|
|
164
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-1 gap-4", children: certifications.map((cert) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
174
165
|
"div",
|
|
175
166
|
{
|
|
176
167
|
className: "rounded-lg border border-border/60 bg-card p-4 shadow-sm transition-colors hover:border-primary/30 hover:shadow-md",
|
|
177
168
|
children: [
|
|
178
|
-
!hideFields.includes("certifications.title") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
179
|
-
"h4",
|
|
180
|
-
{
|
|
181
|
-
className: "line-clamp-1 text-base font-bold text-foreground",
|
|
182
|
-
title: cert.title,
|
|
183
|
-
children: cert.title
|
|
184
|
-
}
|
|
185
|
-
),
|
|
169
|
+
!hideFields.includes("certifications.title") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h4", { className: "break-words text-base font-bold text-foreground", children: cert.title }),
|
|
186
170
|
!hideFields.includes("certifications.institution_name") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-1 line-clamp-1 text-sm text-muted-foreground", children: cert.institution_name }),
|
|
187
171
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-4 flex items-center justify-between", children: [
|
|
188
|
-
!hideFields.includes("certifications.date_awarded") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "rounded-md bg-muted/50 px-2 py-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: cert.date_awarded }),
|
|
172
|
+
!hideFields.includes("certifications.date_awarded") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "rounded-md bg-muted/50 px-2 py-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground pdf-badge", children: cert.date_awarded }),
|
|
189
173
|
cert.verified && !hideFields.includes("certifications.verified") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
190
174
|
"span",
|
|
191
175
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/components/domain/resume/resume-preview/sections/experience-education.tsx"],"sourcesContent":["import { CandidateProfile } from \"../../types\";\nimport type { CVExperienceBaseItem, CVCertificationItem } from \"../../types\";\nimport { GraduationCap, Briefcase, Trophy, Award } from \"lucide-react\";\n\n/** Parsea una fecha (MM/YYYY, YYYY-MM o YYYY) a un valor numérico para ordenar (mayor = más reciente) */\nfunction parseDateToSortValue(dateStr: string | undefined): number {\n if (!dateStr || dateStr.toLowerCase() === \"presente\") return 0;\n // MM/YYYY\n const mmYyyy = dateStr.match(/^(\\d{1,2})\\/(\\d{4})$/);\n if (mmYyyy) return parseInt(mmYyyy[2], 10) * 12 + parseInt(mmYyyy[1], 10);\n // YYYY-MM o YYYY-MM-DD\n const yyyyMm = dateStr.match(/^(\\d{4})-(\\d{1,2})/);\n if (yyyyMm) return parseInt(yyyyMm[1], 10) * 12 + parseInt(yyyyMm[2], 10);\n // Solo año\n const year = dateStr.match(/\\d{4}/);\n if (year) return parseInt(year[0], 10) * 12;\n return 0;\n}\n\n/** Ordena descendente por fecha de fin; si no hay end_date (Presente), usa start_date y prioriza como más reciente */\nfunction sortByDateDesc<T extends CVExperienceBaseItem>(items: T[]): T[] {\n return [...items].sort((a, b) => {\n const aEnd = a.end_date?.toLowerCase();\n const bEnd = b.end_date?.toLowerCase();\n const aOngoing = !a.end_date || aEnd === \"presente\";\n const bOngoing = !b.end_date || bEnd === \"presente\";\n const aVal = aOngoing ? parseDateToSortValue(a.start_date) + 9999 * 12 : parseDateToSortValue(a.end_date);\n const bVal = bOngoing ? parseDateToSortValue(b.start_date) + 9999 * 12 : parseDateToSortValue(b.end_date);\n return bVal - aVal;\n });\n}\n\n/** Ordena certificaciones descendente por date_awarded */\nfunction sortCertificationsByDateDesc(items: CVCertificationItem[]): CVCertificationItem[] {\n return [...items].sort((a, b) => {\n const aVal = parseDateToSortValue(a.date_awarded);\n const bVal = parseDateToSortValue(b.date_awarded);\n return bVal - aVal;\n });\n}\n\ninterface ExperienceEducationProps {\n data: CandidateProfile;\n theme?: string;\n hideFields?: string[];\n hideSections?: string[];\n}\n\nexport function ExperienceEducation({\n data,\n theme,\n hideFields = [],\n hideSections = [],\n}: ExperienceEducationProps) {\n const experiences = sortByDateDesc(data.work_experience || []);\n const education = sortByDateDesc(data.education || []);\n const activities = sortByDateDesc(data.activities || []);\n const certifications = sortCertificationsByDateDesc(data.certifications || []);\n\n const themeStyle = theme ? { backgroundColor: theme } : undefined;\n\n return (\n <div className=\"space-y-12\">\n {/* Experience */}\n {experiences.length > 0 && !hideSections.includes(\"Experiencia laboral\") && (\n <div className=\"space-y-6\">\n <h3 className=\"flex items-center gap-2 border-b-2 border-primary/20 pb-2 text-2xl font-bold text-primary\">\n <Briefcase className=\"h-6 w-6 text-primary\" />\n Experiencia Laboral\n </h3>\n <div className=\"space-y-8\">\n {experiences.map((exp) => (\n <div\n key={exp.id}\n className=\"relative pl-6 after:absolute after:bottom-[-24px] after:left-[3px] after:top-4 after:w-[2px] after:bg-border last:after:hidden\"\n >\n <div\n className=\"pdf-line-v absolute left-0 top-2 h-2 w-2 rounded-full bg-primary\"\n style={themeStyle}\n />\n {!hideFields.includes(\"experience.title\") && (\n <h4 className=\"text-lg font-bold text-foreground\">{exp.title}</h4>\n )}\n <div className=\"mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between\">\n {!hideFields.includes(\"experience.institution_name\") && (\n <span className=\"text-base font-semibold text-primary\">\n {exp.institution_name}\n </span>\n )}\n {(!hideFields.includes(\"experience.start_date\") ||\n !hideFields.includes(\"experience.end_date\")) && (\n <span className=\"mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0\">\n {!hideFields.includes(\"experience.start_date\") && exp.start_date}\n {!hideFields.includes(\"experience.end_date\") && (\n <> {exp.end_date ? `- ${exp.end_date}` : \"- Presente\"}</>\n )}\n </span>\n )}\n </div>\n {exp.description && !hideFields.includes(\"experience.description\") && (\n <p className=\"mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80\">\n {exp.description}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Education */}\n {education.length > 0 && !hideSections.includes(\"Educación\") && (\n <div className=\"space-y-6\">\n <h3 className=\"flex items-center gap-2 border-b-2 border-primary/20 pb-2 text-2xl font-bold text-primary\">\n <GraduationCap className=\"h-6 w-6 text-primary\" />\n Educación\n </h3>\n <div className=\"space-y-8\">\n {education.map((edu) => (\n <div\n key={edu.id}\n className=\"relative pl-6 after:absolute after:bottom-[-24px] after:left-[3px] after:top-4 after:w-[2px] after:bg-border last:after:hidden\"\n >\n <div\n className=\"pdf-line-v absolute left-0 top-2 h-2 w-2 rounded-full bg-primary\"\n style={themeStyle}\n />\n {!hideFields.includes(\"education.title\") && (\n <h4 className=\"text-lg font-bold text-foreground\">{edu.title}</h4>\n )}\n <div className=\"mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between\">\n {!hideFields.includes(\"education.institution_name\") && (\n <span className=\"text-base font-semibold text-primary\">\n {edu.institution_name}\n </span>\n )}\n {(!hideFields.includes(\"education.start_date\") ||\n !hideFields.includes(\"education.end_date\")) && (\n <span className=\"mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0\">\n {!hideFields.includes(\"education.start_date\") && edu.start_date}\n {!hideFields.includes(\"education.end_date\") && (\n <> {edu.end_date ? `- ${edu.end_date}` : \"- Presente\"}</>\n )}\n </span>\n )}\n </div>\n {edu.description && !hideFields.includes(\"education.description\") && (\n <p className=\"mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80\">\n {edu.description}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Activities */}\n {activities.length > 0 && !hideSections.includes(\"Actividades y Logros\") && (\n <div className=\"space-y-6\">\n <h3 className=\"flex items-center gap-2 border-b-2 border-primary/20 pb-2 text-2xl font-bold text-primary\">\n <Trophy className=\"h-6 w-6 text-primary\" />\n Actividades y Logros\n </h3>\n <div className=\"space-y-8\">\n {activities.map((act) => (\n <div\n key={act.id}\n className=\"relative pl-6 after:absolute after:bottom-[-24px] after:left-[3px] after:top-4 after:w-[2px] after:bg-border last:after:hidden\"\n >\n <div\n className=\"pdf-line-v absolute left-0 top-2 h-2 w-2 rounded-full bg-primary\"\n style={themeStyle}\n />\n {!hideFields.includes(\"activities.title\") && (\n <h4 className=\"text-lg font-bold text-foreground\">{act.title}</h4>\n )}\n <div className=\"mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between\">\n {!hideFields.includes(\"activities.institution_name\") && (\n <span className=\"text-base font-semibold text-primary\">\n {act.institution_name}\n </span>\n )}\n {(!hideFields.includes(\"activities.start_date\") ||\n !hideFields.includes(\"activities.end_date\")) && (\n <span className=\"mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0\">\n {!hideFields.includes(\"activities.start_date\") && act.start_date}\n {!hideFields.includes(\"activities.end_date\") && (\n <> {act.end_date ? `- ${act.end_date}` : \"- Presente\"}</>\n )}\n </span>\n )}\n </div>\n {act.description && !hideFields.includes(\"activities.description\") && (\n <p className=\"mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80\">\n {act.description}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Certifications */}\n {certifications.length > 0 && !hideSections.includes(\"Certificaciones\") && (\n <div className=\"space-y-6\">\n <h3 className=\"flex items-center gap-2 border-b-2 border-primary/20 pb-2 text-2xl font-bold text-primary\">\n <Award className=\"h-6 w-6 text-primary\" />\n Certificaciones\n </h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {certifications.map((cert) => (\n <div\n key={cert.id}\n className=\"rounded-lg border border-border/60 bg-card p-4 shadow-sm transition-colors hover:border-primary/30 hover:shadow-md\"\n >\n {!hideFields.includes(\"certifications.title\") && (\n <h4\n className=\"line-clamp-1 text-base font-bold text-foreground\"\n title={cert.title}\n >\n {cert.title}\n </h4>\n )}\n {!hideFields.includes(\"certifications.institution_name\") && (\n <p className=\"mt-1 line-clamp-1 text-sm text-muted-foreground\">\n {cert.institution_name}\n </p>\n )}\n <div className=\"mt-4 flex items-center justify-between\">\n {!hideFields.includes(\"certifications.date_awarded\") && (\n <span className=\"rounded-md bg-muted/50 px-2 py-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {cert.date_awarded}\n </span>\n )}\n {cert.verified && !hideFields.includes(\"certifications.verified\") && (\n <span\n className=\"pdf-badge rounded-full border px-2.5 py-1 text-xs font-bold transition-colors\"\n style={{\n backgroundColor: theme?.startsWith(\"#\") ? `${theme}15` : undefined,\n color: theme,\n borderColor: theme?.startsWith(\"#\") ? `${theme}30` : theme,\n }}\n >\n Verificado\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/domain/resume/resume-preview/sections/experience-education.tsx"],"sourcesContent":["import { CandidateProfile } from \"../../types\";\nimport type { CVExperienceBaseItem, CVCertificationItem } from \"../../types\";\nimport { GraduationCap, Briefcase, Trophy, Award } from \"lucide-react\";\n\n/** Parsea una fecha (MM/YYYY, YYYY-MM o YYYY) a un valor numérico para ordenar (mayor = más reciente) */\nfunction parseDateToSortValue(dateStr: string | undefined): number {\n if (!dateStr || dateStr.toLowerCase() === \"presente\") return 0;\n // MM/YYYY\n const mmYyyy = dateStr.match(/^(\\d{1,2})\\/(\\d{4})$/);\n if (mmYyyy) return parseInt(mmYyyy[2], 10) * 12 + parseInt(mmYyyy[1], 10);\n // YYYY-MM o YYYY-MM-DD\n const yyyyMm = dateStr.match(/^(\\d{4})-(\\d{1,2})/);\n if (yyyyMm) return parseInt(yyyyMm[1], 10) * 12 + parseInt(yyyyMm[2], 10);\n // Solo año\n const year = dateStr.match(/\\d{4}/);\n if (year) return parseInt(year[0], 10) * 12;\n return 0;\n}\n\n/** Ordena descendente por fecha de fin; si no hay end_date (Presente), usa start_date y prioriza como más reciente */\nfunction sortByDateDesc<T extends CVExperienceBaseItem>(items: T[]): T[] {\n return [...items].sort((a, b) => {\n const aEnd = a.end_date?.toLowerCase();\n const bEnd = b.end_date?.toLowerCase();\n const aOngoing = !a.end_date || aEnd === \"presente\";\n const bOngoing = !b.end_date || bEnd === \"presente\";\n const aVal = aOngoing ? parseDateToSortValue(a.start_date) + 9999 * 12 : parseDateToSortValue(a.end_date);\n const bVal = bOngoing ? parseDateToSortValue(b.start_date) + 9999 * 12 : parseDateToSortValue(b.end_date);\n return bVal - aVal;\n });\n}\n\n/** Ordena certificaciones descendente por date_awarded */\nfunction sortCertificationsByDateDesc(items: CVCertificationItem[]): CVCertificationItem[] {\n return [...items].sort((a, b) => {\n const aVal = parseDateToSortValue(a.date_awarded);\n const bVal = parseDateToSortValue(b.date_awarded);\n return bVal - aVal;\n });\n}\n\ninterface ExperienceEducationProps {\n data: CandidateProfile;\n theme?: string;\n hideFields?: string[];\n hideSections?: string[];\n}\n\nexport function ExperienceEducation({\n data,\n theme,\n hideFields = [],\n hideSections = [],\n}: ExperienceEducationProps) {\n const experiences = sortByDateDesc(data.work_experience || []);\n const education = sortByDateDesc(data.education || []);\n const activities = sortByDateDesc(data.activities || []);\n const certifications = sortCertificationsByDateDesc(data.certifications || []);\n\n const themeStyle = theme ? { backgroundColor: theme } : undefined;\n\n return (\n <div className=\"space-y-12\">\n {/* Experience */}\n {experiences.length > 0 && !hideSections.includes(\"Experiencia laboral\") && (\n <div className=\"space-y-6\">\n <h3 className=\"flex items-center gap-2 border-b-2 border-primary/20 pb-2 text-2xl font-bold text-primary\">\n <Briefcase className=\"h-6 w-6 text-primary\" />\n Experiencia Laboral\n </h3>\n <div className=\"space-y-8\">\n {experiences.map((exp) => (\n <div\n key={exp.id}\n className=\"relative pl-6 after:absolute after:bottom-[-24px] after:left-[3px] after:top-4 after:w-[2px] after:bg-border last:after:hidden\"\n >\n <div\n className=\"pdf-line-v absolute left-0 top-2 h-2 w-2 rounded-full bg-primary\"\n style={themeStyle}\n />\n {!hideFields.includes(\"experience.title\") && (\n <h4 className=\"text-lg font-bold text-foreground\">{exp.title}</h4>\n )}\n <div className=\"mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between\">\n {!hideFields.includes(\"experience.institution_name\") && (\n <span className=\"text-base font-semibold text-primary\">\n {exp.institution_name}\n </span>\n )}\n {(!hideFields.includes(\"experience.start_date\") ||\n !hideFields.includes(\"experience.end_date\")) && (\n <span className=\"mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge\">\n {[\n !hideFields.includes(\"experience.start_date\") && exp.start_date,\n !hideFields.includes(\"experience.end_date\") &&\n exp.end_date &&\n exp.end_date.toLowerCase() !== \"presente\"\n ? `- ${exp.end_date}`\n : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n </span>\n )}\n </div>\n {exp.description && !hideFields.includes(\"experience.description\") && (\n <p className=\"mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80\">\n {exp.description}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Education */}\n {education.length > 0 && !hideSections.includes(\"Educación\") && (\n <div className=\"space-y-6\">\n <h3 className=\"flex items-center gap-2 border-b-2 border-primary/20 pb-2 text-2xl font-bold text-primary\">\n <GraduationCap className=\"h-6 w-6 text-primary\" />\n Educación\n </h3>\n <div className=\"space-y-8\">\n {education.map((edu) => (\n <div\n key={edu.id}\n className=\"relative pl-6 after:absolute after:bottom-[-24px] after:left-[3px] after:top-4 after:w-[2px] after:bg-border last:after:hidden\"\n >\n <div\n className=\"pdf-line-v absolute left-0 top-2 h-2 w-2 rounded-full bg-primary\"\n style={themeStyle}\n />\n {!hideFields.includes(\"education.title\") && (\n <h4 className=\"text-lg font-bold text-foreground\">{edu.title}</h4>\n )}\n <div className=\"mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between\">\n {!hideFields.includes(\"education.institution_name\") && (\n <span className=\"text-base font-semibold text-primary\">\n {edu.institution_name}\n </span>\n )}\n {(!hideFields.includes(\"education.start_date\") ||\n !hideFields.includes(\"education.end_date\")) && (\n <span className=\"mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge\">\n {[\n !hideFields.includes(\"education.start_date\") && edu.start_date,\n !hideFields.includes(\"education.end_date\") &&\n edu.end_date &&\n edu.end_date.toLowerCase() !== \"presente\"\n ? `- ${edu.end_date}`\n : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n </span>\n )}\n </div>\n {edu.description && !hideFields.includes(\"education.description\") && (\n <p className=\"mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80\">\n {edu.description}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Activities */}\n {activities.length > 0 && !hideSections.includes(\"Actividades y Logros\") && (\n <div className=\"space-y-6\">\n <h3 className=\"flex items-center gap-2 border-b-2 border-primary/20 pb-2 text-2xl font-bold text-primary\">\n <Trophy className=\"h-6 w-6 text-primary\" />\n Actividades y Logros\n </h3>\n <div className=\"space-y-8\">\n {activities.map((act) => (\n <div\n key={act.id}\n className=\"relative pl-6 after:absolute after:bottom-[-24px] after:left-[3px] after:top-4 after:w-[2px] after:bg-border last:after:hidden\"\n >\n <div\n className=\"pdf-line-v absolute left-0 top-2 h-2 w-2 rounded-full bg-primary\"\n style={themeStyle}\n />\n {!hideFields.includes(\"activities.title\") && (\n <h4 className=\"text-lg font-bold text-foreground\">{act.title}</h4>\n )}\n <div className=\"mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between\">\n {!hideFields.includes(\"activities.institution_name\") && (\n <span className=\"text-base font-semibold text-primary\">\n {act.institution_name}\n </span>\n )}\n {(!hideFields.includes(\"activities.start_date\") ||\n !hideFields.includes(\"activities.end_date\")) && (\n <span className=\"mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge\">\n {[\n !hideFields.includes(\"activities.start_date\") && act.start_date,\n !hideFields.includes(\"activities.end_date\") &&\n act.end_date &&\n act.end_date.toLowerCase() !== \"presente\"\n ? `- ${act.end_date}`\n : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n </span>\n )}\n </div>\n {act.description && !hideFields.includes(\"activities.description\") && (\n <p className=\"mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80\">\n {act.description}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Certifications */}\n {certifications.length > 0 && !hideSections.includes(\"Certificaciones\") && (\n <div className=\"space-y-6\">\n <h3 className=\"flex items-center gap-2 border-b-2 border-primary/20 pb-2 text-2xl font-bold text-primary\">\n <Award className=\"h-6 w-6 text-primary\" />\n Certificaciones\n </h3>\n <div className=\"grid grid-cols-1 gap-4\">\n {certifications.map((cert) => (\n <div\n key={cert.id}\n className=\"rounded-lg border border-border/60 bg-card p-4 shadow-sm transition-colors hover:border-primary/30 hover:shadow-md\"\n >\n {!hideFields.includes(\"certifications.title\") && (\n <h4 className=\"break-words text-base font-bold text-foreground\">\n {cert.title}\n </h4>\n )}\n {!hideFields.includes(\"certifications.institution_name\") && (\n <p className=\"mt-1 line-clamp-1 text-sm text-muted-foreground\">\n {cert.institution_name}\n </p>\n )}\n <div className=\"mt-4 flex items-center justify-between\">\n {!hideFields.includes(\"certifications.date_awarded\") && (\n <span className=\"rounded-md bg-muted/50 px-2 py-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground pdf-badge\">\n {cert.date_awarded}\n </span>\n )}\n {cert.verified && !hideFields.includes(\"certifications.verified\") && (\n <span\n className=\"pdf-badge rounded-full border px-2.5 py-1 text-xs font-bold transition-colors\"\n style={{\n backgroundColor: theme?.startsWith(\"#\") ? `${theme}15` : undefined,\n color: theme,\n borderColor: theme?.startsWith(\"#\") ? `${theme}30` : theme,\n }}\n >\n Verificado\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { GraduationCap, Briefcase, Trophy, Award } from "lucide-react";
|
|
3
3
|
function parseDateToSortValue(dateStr) {
|
|
4
4
|
if (!dateStr || dateStr.toLowerCase() === "presente") return 0;
|
|
@@ -60,13 +60,10 @@ function ExperienceEducation({
|
|
|
60
60
|
!hideFields.includes("experience.title") && /* @__PURE__ */ jsx("h4", { className: "text-lg font-bold text-foreground", children: exp.title }),
|
|
61
61
|
/* @__PURE__ */ jsxs("div", { className: "mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between", children: [
|
|
62
62
|
!hideFields.includes("experience.institution_name") && /* @__PURE__ */ jsx("span", { className: "text-base font-semibold text-primary", children: exp.institution_name }),
|
|
63
|
-
(!hideFields.includes("experience.start_date") || !hideFields.includes("experience.end_date")) && /* @__PURE__ */
|
|
63
|
+
(!hideFields.includes("experience.start_date") || !hideFields.includes("experience.end_date")) && /* @__PURE__ */ jsx("span", { className: "mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge", children: [
|
|
64
64
|
!hideFields.includes("experience.start_date") && exp.start_date,
|
|
65
|
-
!hideFields.includes("experience.end_date") &&
|
|
66
|
-
|
|
67
|
-
exp.end_date ? `- ${exp.end_date}` : "- Presente"
|
|
68
|
-
] })
|
|
69
|
-
] })
|
|
65
|
+
!hideFields.includes("experience.end_date") && exp.end_date && exp.end_date.toLowerCase() !== "presente" ? `- ${exp.end_date}` : null
|
|
66
|
+
].filter(Boolean).join(" ") })
|
|
70
67
|
] }),
|
|
71
68
|
exp.description && !hideFields.includes("experience.description") && /* @__PURE__ */ jsx("p", { className: "mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80", children: exp.description })
|
|
72
69
|
]
|
|
@@ -94,13 +91,10 @@ function ExperienceEducation({
|
|
|
94
91
|
!hideFields.includes("education.title") && /* @__PURE__ */ jsx("h4", { className: "text-lg font-bold text-foreground", children: edu.title }),
|
|
95
92
|
/* @__PURE__ */ jsxs("div", { className: "mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between", children: [
|
|
96
93
|
!hideFields.includes("education.institution_name") && /* @__PURE__ */ jsx("span", { className: "text-base font-semibold text-primary", children: edu.institution_name }),
|
|
97
|
-
(!hideFields.includes("education.start_date") || !hideFields.includes("education.end_date")) && /* @__PURE__ */
|
|
94
|
+
(!hideFields.includes("education.start_date") || !hideFields.includes("education.end_date")) && /* @__PURE__ */ jsx("span", { className: "mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge", children: [
|
|
98
95
|
!hideFields.includes("education.start_date") && edu.start_date,
|
|
99
|
-
!hideFields.includes("education.end_date") &&
|
|
100
|
-
|
|
101
|
-
edu.end_date ? `- ${edu.end_date}` : "- Presente"
|
|
102
|
-
] })
|
|
103
|
-
] })
|
|
96
|
+
!hideFields.includes("education.end_date") && edu.end_date && edu.end_date.toLowerCase() !== "presente" ? `- ${edu.end_date}` : null
|
|
97
|
+
].filter(Boolean).join(" ") })
|
|
104
98
|
] }),
|
|
105
99
|
edu.description && !hideFields.includes("education.description") && /* @__PURE__ */ jsx("p", { className: "mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80", children: edu.description })
|
|
106
100
|
]
|
|
@@ -128,13 +122,10 @@ function ExperienceEducation({
|
|
|
128
122
|
!hideFields.includes("activities.title") && /* @__PURE__ */ jsx("h4", { className: "text-lg font-bold text-foreground", children: act.title }),
|
|
129
123
|
/* @__PURE__ */ jsxs("div", { className: "mb-2 flex flex-col sm:flex-row sm:items-center sm:justify-between", children: [
|
|
130
124
|
!hideFields.includes("activities.institution_name") && /* @__PURE__ */ jsx("span", { className: "text-base font-semibold text-primary", children: act.institution_name }),
|
|
131
|
-
(!hideFields.includes("activities.start_date") || !hideFields.includes("activities.end_date")) && /* @__PURE__ */
|
|
125
|
+
(!hideFields.includes("activities.start_date") || !hideFields.includes("activities.end_date")) && /* @__PURE__ */ jsx("span", { className: "mt-1 w-fit rounded-md bg-muted/30 px-2 py-0.5 text-sm font-medium text-muted-foreground sm:mt-0 pdf-badge", children: [
|
|
132
126
|
!hideFields.includes("activities.start_date") && act.start_date,
|
|
133
|
-
!hideFields.includes("activities.end_date") &&
|
|
134
|
-
|
|
135
|
-
act.end_date ? `- ${act.end_date}` : "- Presente"
|
|
136
|
-
] })
|
|
137
|
-
] })
|
|
127
|
+
!hideFields.includes("activities.end_date") && act.end_date && act.end_date.toLowerCase() !== "presente" ? `- ${act.end_date}` : null
|
|
128
|
+
].filter(Boolean).join(" ") })
|
|
138
129
|
] }),
|
|
139
130
|
act.description && !hideFields.includes("activities.description") && /* @__PURE__ */ jsx("p", { className: "mt-3 whitespace-pre-wrap text-base leading-relaxed text-foreground/80", children: act.description })
|
|
140
131
|
]
|
|
@@ -147,22 +138,15 @@ function ExperienceEducation({
|
|
|
147
138
|
/* @__PURE__ */ jsx(Award, { className: "h-6 w-6 text-primary" }),
|
|
148
139
|
"Certificaciones"
|
|
149
140
|
] }),
|
|
150
|
-
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4
|
|
141
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4", children: certifications.map((cert) => /* @__PURE__ */ jsxs(
|
|
151
142
|
"div",
|
|
152
143
|
{
|
|
153
144
|
className: "rounded-lg border border-border/60 bg-card p-4 shadow-sm transition-colors hover:border-primary/30 hover:shadow-md",
|
|
154
145
|
children: [
|
|
155
|
-
!hideFields.includes("certifications.title") && /* @__PURE__ */ jsx(
|
|
156
|
-
"h4",
|
|
157
|
-
{
|
|
158
|
-
className: "line-clamp-1 text-base font-bold text-foreground",
|
|
159
|
-
title: cert.title,
|
|
160
|
-
children: cert.title
|
|
161
|
-
}
|
|
162
|
-
),
|
|
146
|
+
!hideFields.includes("certifications.title") && /* @__PURE__ */ jsx("h4", { className: "break-words text-base font-bold text-foreground", children: cert.title }),
|
|
163
147
|
!hideFields.includes("certifications.institution_name") && /* @__PURE__ */ jsx("p", { className: "mt-1 line-clamp-1 text-sm text-muted-foreground", children: cert.institution_name }),
|
|
164
148
|
/* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center justify-between", children: [
|
|
165
|
-
!hideFields.includes("certifications.date_awarded") && /* @__PURE__ */ jsx("span", { className: "rounded-md bg-muted/50 px-2 py-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: cert.date_awarded }),
|
|
149
|
+
!hideFields.includes("certifications.date_awarded") && /* @__PURE__ */ jsx("span", { className: "rounded-md bg-muted/50 px-2 py-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground pdf-badge", children: cert.date_awarded }),
|
|
166
150
|
cert.verified && !hideFields.includes("certifications.verified") && /* @__PURE__ */ jsx(
|
|
167
151
|
"span",
|
|
168
152
|
{
|