@ginia/ui 0.1.5 → 0.1.8
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 +30 -22
- 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 +30 -22
- 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 +41 -22
- 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 +42 -23
- 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 +4 -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 +4 -4
- package/dist/components/domain/resume/resume-preview/sections/header-preview.js.map +1 -1
- package/dist/components/domain/resume/resume.cjs +41 -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 +41 -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 +9 -0
- package/dist/components/domain/resume/types.d.ts +9 -0
- package/dist/components/ui/background/background.cjs +80 -0
- package/dist/components/ui/background/background.cjs.map +1 -0
- package/dist/components/ui/background/background.d.cts +23 -0
- package/dist/components/ui/background/background.d.ts +23 -0
- package/dist/components/ui/background/background.js +44 -0
- package/dist/components/ui/background/background.js.map +1 -0
- package/dist/components/ui/background/index.cjs +33 -0
- package/dist/components/ui/background/index.cjs.map +1 -0
- package/dist/components/ui/background/index.d.cts +2 -0
- package/dist/components/ui/background/index.d.ts +2 -0
- package/dist/components/ui/background/index.js +7 -0
- package/dist/components/ui/background/index.js.map +1 -0
- package/dist/components/ui/index.cjs +2 -0
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.d.cts +1 -0
- package/dist/components/ui/index.d.ts +1 -0
- package/dist/components/ui/index.js +1 -0
- package/dist/components/ui/index.js.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -95,7 +95,9 @@ function Resume({
|
|
|
95
95
|
hideFields = [],
|
|
96
96
|
hideSections = [],
|
|
97
97
|
menuSlot = [],
|
|
98
|
-
onSave
|
|
98
|
+
onSave,
|
|
99
|
+
showTopBar = true,
|
|
100
|
+
className
|
|
99
101
|
}) {
|
|
100
102
|
const themeStyle = theme ? { "--cv-theme": theme } : void 0;
|
|
101
103
|
const [draftData, setDraftData] = useState(data);
|
|
@@ -133,6 +135,38 @@ function Resume({
|
|
|
133
135
|
clonedElement.style.height = "auto";
|
|
134
136
|
clonedElement.style.overflow = "visible";
|
|
135
137
|
clonedElement.style.width = "1200px";
|
|
138
|
+
const backgroundGradients = clonedElement.querySelectorAll("[data-pdf-background-gradient]");
|
|
139
|
+
const w = 1200;
|
|
140
|
+
const h = 160;
|
|
141
|
+
const canvas2 = clonedDoc.createElement("canvas");
|
|
142
|
+
canvas2.width = w;
|
|
143
|
+
canvas2.height = h;
|
|
144
|
+
const ctx = canvas2.getContext("2d");
|
|
145
|
+
if (ctx) {
|
|
146
|
+
const hGrad = ctx.createLinearGradient(0, 0, w, 0);
|
|
147
|
+
hGrad.addColorStop(0, "#ffffff");
|
|
148
|
+
hGrad.addColorStop(0.5, "#f3e8ff");
|
|
149
|
+
hGrad.addColorStop(1, "#bfdbfe");
|
|
150
|
+
ctx.fillStyle = hGrad;
|
|
151
|
+
ctx.fillRect(0, 0, w, h);
|
|
152
|
+
ctx.globalCompositeOperation = "destination-in";
|
|
153
|
+
const vGrad = ctx.createLinearGradient(0, 0, 0, h);
|
|
154
|
+
vGrad.addColorStop(0, "rgba(0,0,0,1)");
|
|
155
|
+
vGrad.addColorStop(1, "rgba(0,0,0,0)");
|
|
156
|
+
ctx.fillStyle = vGrad;
|
|
157
|
+
ctx.fillRect(0, 0, w, h);
|
|
158
|
+
ctx.globalCompositeOperation = "source-over";
|
|
159
|
+
}
|
|
160
|
+
const dataUrl = canvas2.toDataURL("image/png");
|
|
161
|
+
backgroundGradients.forEach((el) => {
|
|
162
|
+
if (el instanceof HTMLElement) {
|
|
163
|
+
el.style.maskImage = "none";
|
|
164
|
+
el.style.background = "none";
|
|
165
|
+
el.style.backgroundImage = `url(${dataUrl})`;
|
|
166
|
+
el.style.backgroundSize = "100% 100%";
|
|
167
|
+
el.style.backgroundPosition = "0 0";
|
|
168
|
+
}
|
|
169
|
+
});
|
|
136
170
|
const objectCoverImages = clonedElement.querySelectorAll("img.object-cover");
|
|
137
171
|
objectCoverImages.forEach((img) => {
|
|
138
172
|
if (img instanceof HTMLImageElement) {
|
|
@@ -146,7 +180,7 @@ function Resume({
|
|
|
146
180
|
div.style.backgroundPosition = "center";
|
|
147
181
|
div.style.borderRadius = window.getComputedStyle(img).borderRadius;
|
|
148
182
|
div.className = img.className;
|
|
149
|
-
parent2.style.marginTop = "
|
|
183
|
+
parent2.style.marginTop = "1.33rem";
|
|
150
184
|
parent2.replaceChild(div, img);
|
|
151
185
|
}
|
|
152
186
|
}
|
|
@@ -255,7 +289,7 @@ function Resume({
|
|
|
255
289
|
return /* @__PURE__ */ jsxs(
|
|
256
290
|
"div",
|
|
257
291
|
{
|
|
258
|
-
className: "relative h-full w-full overflow-y-auto bg-muted/20 px-4 py-
|
|
292
|
+
className: "relative h-full w-full overflow-y-auto bg-muted/20 px-4 py-4 sm:px-8",
|
|
259
293
|
style: themeStyle,
|
|
260
294
|
children: [
|
|
261
295
|
/* @__PURE__ */ jsx("div", { className: "mx-auto h-full w-full max-w-5xl", children: /* @__PURE__ */ jsx(
|
|
@@ -266,7 +300,9 @@ function Resume({
|
|
|
266
300
|
headerSlot,
|
|
267
301
|
theme,
|
|
268
302
|
hideFields,
|
|
269
|
-
hideSections
|
|
303
|
+
hideSections,
|
|
304
|
+
showTopBar,
|
|
305
|
+
className
|
|
270
306
|
}
|
|
271
307
|
) }),
|
|
272
308
|
/* @__PURE__ */ jsxs("div", { className: "fixed bottom-6 right-6 z-50 flex flex-col gap-3 sm:flex-row", children: [
|
|
@@ -325,7 +361,7 @@ function Resume({
|
|
|
325
361
|
variant: "ghost",
|
|
326
362
|
disabled: isDownloading,
|
|
327
363
|
onClick: handleDownload,
|
|
328
|
-
className: "flex items-center gap-2 rounded-full bg-purple-200 px-4 text-purple-
|
|
364
|
+
className: "flex items-center gap-2 rounded-full bg-purple-200 px-4 text-purple-100 text-primary shadow-xl",
|
|
329
365
|
children: [
|
|
330
366
|
isDownloading ? /* @__PURE__ */ jsx(Loader2, { className: "h-5 w-5 animate-spin" }) : /* @__PURE__ */ jsx(Download, { className: "h-5 w-5" }),
|
|
331
367
|
/* @__PURE__ */ jsx("span", { className: "hidden font-semibold sm:inline", children: isDownloading ? "Generando..." : "Descargar" })
|
|
@@ -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 \"./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"]}
|
|
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 showTopBar = true,\n className,\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 Background: html2canvas doesn't support mask-image. Render gradient to canvas\n // and use as background-image for pixel-perfect PDF output.\n const backgroundGradients = clonedElement.querySelectorAll(\"[data-pdf-background-gradient]\");\n const w = 1200;\n const h = 160;\n const canvas = clonedDoc.createElement(\"canvas\");\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n const hGrad = ctx.createLinearGradient(0, 0, w, 0);\n hGrad.addColorStop(0, \"#ffffff\");\n hGrad.addColorStop(0.5, \"#f3e8ff\");\n hGrad.addColorStop(1, \"#bfdbfe\");\n ctx.fillStyle = hGrad;\n ctx.fillRect(0, 0, w, h);\n ctx.globalCompositeOperation = \"destination-in\";\n const vGrad = ctx.createLinearGradient(0, 0, 0, h);\n vGrad.addColorStop(0, \"rgba(0,0,0,1)\");\n vGrad.addColorStop(1, \"rgba(0,0,0,0)\");\n ctx.fillStyle = vGrad;\n ctx.fillRect(0, 0, w, h);\n ctx.globalCompositeOperation = \"source-over\";\n }\n const dataUrl = canvas.toDataURL(\"image/png\");\n backgroundGradients.forEach((el) => {\n if (el instanceof HTMLElement) {\n el.style.maskImage = \"none\";\n el.style.background = \"none\";\n el.style.backgroundImage = `url(${dataUrl})`;\n el.style.backgroundSize = \"100% 100%\";\n el.style.backgroundPosition = \"0 0\";\n }\n });\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 = \"1.33rem\";\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-4 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 showTopBar={showTopBar}\n className={className}\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-100 text-primary 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":["canvas","parent"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/domain/resume/types.ts"],"sourcesContent":["import { ReactNode } from \"react\";\n\nexport type Action = \"create\" | \"update\" | \"delete\" | \"none\";\n\nexport interface CVExperienceBaseItem {\n id: string;\n title: string;\n type: string;\n institution_name?: string;\n institution_id?: string;\n start_date: string;\n end_date?: string;\n description?: string;\n}\n\nexport interface CVEducationItem extends CVExperienceBaseItem {\n _type?: \"education\";\n}\nexport interface CVExperienceItem extends CVExperienceBaseItem {\n _type?: \"experience\";\n}\nexport interface CVActivityItem extends CVExperienceBaseItem {\n _type?: \"activity\";\n}\n\nexport interface ExperienceWithAction extends CVExperienceBaseItem {\n action?: Action;\n}\n\nexport interface CVSkillItem {\n id: string;\n name: string;\n verified?: boolean;\n type?: string;\n}\n\nexport interface SkillWithAction extends CVSkillItem {\n action?: Action;\n}\n\nexport interface CVCertificationItem {\n id: string;\n title: string;\n institution_name?: string;\n institution_id?: string;\n date_awarded?: string;\n verified?: boolean;\n url?: string;\n}\n\nexport interface CertificationWithAction extends CVCertificationItem {\n action?: Action;\n}\n\nexport interface CVDocumentItem {\n id: string;\n document_type?: string;\n document_status?: string;\n document_url?: string;\n appointment_date?: string;\n comments?: string;\n}\n\nexport interface DocumentWithAction extends CVDocumentItem {\n action?: Action;\n}\n\nexport interface CandidateProfile {\n // Información personal (from user table)\n photo_url?: string;\n first_name: string;\n middle_name?: string;\n last_name: string;\n second_last_name?: string;\n phone_number?: string;\n phone_number_2?: string;\n email?: string;\n city?: string;\n address?: string;\n postal_code?: string;\n birth_date?: string;\n\n // Curriculum (from curriculum table)\n summary?: string;\n\n // Información Académica (from candidate table)\n student_education_institution_id?: string;\n education_institution_id?: string; // added this too for autocomplete logic\n program_name?: string;\n\n // Listados estructurados (from experience table, filtered by type)\n education?: CVEducationItem[];\n work_experience?: CVExperienceItem[];\n activities?: CVActivityItem[];\n\n // Habilidades (from skill table, grouped by type: hard/soft)\n skills?: {\n hard?: CVSkillItem[];\n soft?: CVSkillItem[];\n };\n\n // Certificaciones (from certification table)\n certifications?: CVCertificationItem[];\n\n // Requisitos laborales (from document table)\n work_requirements?: {\n documents: CVDocumentItem[];\n };\n\n // Preferencias (from candidate table fields)\n preferences?: {\n candidate_state?: string;\n employment_preference?: string;\n work_study_preference?: string;\n min_expected_salary?: number;\n max_expected_salary?: number;\n desired_role?: string;\n dream_job?: string;\n english_job_interest?: boolean;\n };\n\n // Avanzado\n advanced?: {\n notes?: string;\n };\n}\n\nexport interface ResumeSkill {\n id: string;\n name: string;\n type: \"Técnica\" | \"Interpersonal\";\n verified: boolean;\n}\nexport interface ResumeExperience {\n id: string;\n}\nexport interface ResumeEducation {\n id: string;\n}\nexport interface ResumeAward {\n id: string;\n}\n\nexport interface ResumeMenuSlot {\n title: string;\n node: ReactNode;\n}\n\nexport interface ResumeSavePayload {\n candidate: {\n action: Action;\n data: Partial<CandidateProfile>;\n };\n user: {\n action: Action;\n data: Partial<CandidateProfile>;\n };\n curriculum: {\n action: Action;\n data: {\n summary?: string;\n };\n };\n experiences: {\n action: Action;\n data: Partial<CVExperienceBaseItem>;\n id?: string;\n }[];\n skills: { action: Action; data: Partial<CVSkillItem>; id?: string }[];\n certifications: {\n action: Action;\n data: Partial<CVCertificationItem>;\n id?: string;\n }[];\n}\n\nexport interface ResumeProps {\n /**\n * Data del CV del candidato.\n */\n data: CandidateProfile;\n /**\n * Determina si el panel de edición (botón y drawer) es visible.\n * @default false\n */\n editable?: boolean;\n /**\n * Opciones u acciones extra a renderizar en la cabecera del preview.\n */\n headerSlot?: ReactNode;\n /**\n * Activa el botón flotante de descargar PDF.\n * @default false\n */\n withDownload?: boolean;\n /**\n * Color del tema (Hex, RGB o CSS color) usado para destacar el header, detalles y borde del avatar.\n * @default undefined (usa el primario de ginia-ui)\n */\n theme?: string;\n /**\n * Arreglo con la ruta de los campos a ocultar del editor y preview.\n * Por ejemplo: [\"first_name\", \"education.title\", \"skills.hard.verified\"]\n */\n hideFields?: string[];\n /**\n * Arreglo con los nombres de las secciones a ocultar completamente del editor y preview.\n * Por ejemplo: [\"Avanzado\", \"Preferencias\", \"Educación\"]\n */\n hideSections?: string[];\n /**\n * Slots adicionales para el menú del editor (Accordion).\n */\n menuSlot?: ResumeMenuSlot[];\n /**\n * Callback al guardar los cambios del editor.\n * Recibe el CandidateProfile actualizado y el array estructurado guardado por tipo de items\n */\n onSave?: (payload: ResumeSavePayload, fullProfile: CandidateProfile) => void;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/domain/resume/types.ts"],"sourcesContent":["import { ReactNode } from \"react\";\n\nexport type Action = \"create\" | \"update\" | \"delete\" | \"none\";\n\nexport interface CVExperienceBaseItem {\n id: string;\n title: string;\n type: string;\n institution_name?: string;\n institution_id?: string;\n start_date: string;\n end_date?: string;\n description?: string;\n}\n\nexport interface CVEducationItem extends CVExperienceBaseItem {\n _type?: \"education\";\n}\nexport interface CVExperienceItem extends CVExperienceBaseItem {\n _type?: \"experience\";\n}\nexport interface CVActivityItem extends CVExperienceBaseItem {\n _type?: \"activity\";\n}\n\nexport interface ExperienceWithAction extends CVExperienceBaseItem {\n action?: Action;\n}\n\nexport interface CVSkillItem {\n id: string;\n name: string;\n verified?: boolean;\n type?: string;\n}\n\nexport interface SkillWithAction extends CVSkillItem {\n action?: Action;\n}\n\nexport interface CVCertificationItem {\n id: string;\n title: string;\n institution_name?: string;\n institution_id?: string;\n date_awarded?: string;\n verified?: boolean;\n url?: string;\n}\n\nexport interface CertificationWithAction extends CVCertificationItem {\n action?: Action;\n}\n\nexport interface CVDocumentItem {\n id: string;\n document_type?: string;\n document_status?: string;\n document_url?: string;\n appointment_date?: string;\n comments?: string;\n}\n\nexport interface DocumentWithAction extends CVDocumentItem {\n action?: Action;\n}\n\nexport interface CandidateProfile {\n // Información personal (from user table)\n photo_url?: string;\n first_name: string;\n middle_name?: string;\n last_name: string;\n second_last_name?: string;\n phone_number?: string;\n phone_number_2?: string;\n email?: string;\n city?: string;\n address?: string;\n postal_code?: string;\n birth_date?: string;\n\n // Curriculum (from curriculum table)\n summary?: string;\n\n // Información Académica (from candidate table)\n student_education_institution_id?: string;\n education_institution_id?: string; // added this too for autocomplete logic\n program_name?: string;\n\n // Listados estructurados (from experience table, filtered by type)\n education?: CVEducationItem[];\n work_experience?: CVExperienceItem[];\n activities?: CVActivityItem[];\n\n // Habilidades (from skill table, grouped by type: hard/soft)\n skills?: {\n hard?: CVSkillItem[];\n soft?: CVSkillItem[];\n };\n\n // Certificaciones (from certification table)\n certifications?: CVCertificationItem[];\n\n // Requisitos laborales (from document table)\n work_requirements?: {\n documents: CVDocumentItem[];\n };\n\n // Preferencias (from candidate table fields)\n preferences?: {\n candidate_state?: string;\n employment_preference?: string;\n work_study_preference?: string;\n min_expected_salary?: number;\n max_expected_salary?: number;\n desired_role?: string;\n dream_job?: string;\n english_job_interest?: boolean;\n };\n\n // Avanzado\n advanced?: {\n notes?: string;\n };\n}\n\nexport interface ResumeSkill {\n id: string;\n name: string;\n type: \"Técnica\" | \"Interpersonal\";\n verified: boolean;\n}\nexport interface ResumeExperience {\n id: string;\n}\nexport interface ResumeEducation {\n id: string;\n}\nexport interface ResumeAward {\n id: string;\n}\n\nexport interface ResumeMenuSlot {\n title: string;\n node: ReactNode;\n}\n\nexport interface ResumeSavePayload {\n candidate: {\n action: Action;\n data: Partial<CandidateProfile>;\n };\n user: {\n action: Action;\n data: Partial<CandidateProfile>;\n };\n curriculum: {\n action: Action;\n data: {\n summary?: string;\n };\n };\n experiences: {\n action: Action;\n data: Partial<CVExperienceBaseItem>;\n id?: string;\n }[];\n skills: { action: Action; data: Partial<CVSkillItem>; id?: string }[];\n certifications: {\n action: Action;\n data: Partial<CVCertificationItem>;\n id?: string;\n }[];\n}\n\nexport interface ResumeProps {\n /**\n * Data del CV del candidato.\n */\n data: CandidateProfile;\n /**\n * Determina si el panel de edición (botón y drawer) es visible.\n * @default false\n */\n editable?: boolean;\n /**\n * Opciones u acciones extra a renderizar en la cabecera del preview.\n */\n headerSlot?: ReactNode;\n /**\n * Activa el botón flotante de descargar PDF.\n * @default false\n */\n withDownload?: boolean;\n /**\n * Color del tema (Hex, RGB o CSS color) usado para destacar el header, detalles y borde del avatar.\n * @default undefined (usa el primario de ginia-ui)\n */\n theme?: string;\n /**\n * Arreglo con la ruta de los campos a ocultar del editor y preview.\n * Por ejemplo: [\"first_name\", \"education.title\", \"skills.hard.verified\"]\n */\n hideFields?: string[];\n /**\n * Arreglo con los nombres de las secciones a ocultar completamente del editor y preview.\n * Por ejemplo: [\"Avanzado\", \"Preferencias\", \"Educación\"]\n */\n hideSections?: string[];\n /**\n * Slots adicionales para el menú del editor (Accordion).\n */\n menuSlot?: ResumeMenuSlot[];\n /**\n * Callback al guardar los cambios del editor.\n * Recibe el CandidateProfile actualizado y el array estructurado guardado por tipo de items\n */\n onSave?: (payload: ResumeSavePayload, fullProfile: CandidateProfile) => void;\n /**\n * Muestra u oculta la raya superior del preview.\n * @default true\n */\n showTopBar?: boolean;\n /**\n * Clases CSS adicionales para el contenedor del preview.\n */\n className?: string;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
@@ -190,6 +190,15 @@ interface ResumeProps {
|
|
|
190
190
|
* Recibe el CandidateProfile actualizado y el array estructurado guardado por tipo de items
|
|
191
191
|
*/
|
|
192
192
|
onSave?: (payload: ResumeSavePayload, fullProfile: CandidateProfile) => void;
|
|
193
|
+
/**
|
|
194
|
+
* Muestra u oculta la raya superior del preview.
|
|
195
|
+
* @default true
|
|
196
|
+
*/
|
|
197
|
+
showTopBar?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Clases CSS adicionales para el contenedor del preview.
|
|
200
|
+
*/
|
|
201
|
+
className?: string;
|
|
193
202
|
}
|
|
194
203
|
|
|
195
204
|
export type { Action, CVActivityItem, CVCertificationItem, CVDocumentItem, CVEducationItem, CVExperienceBaseItem, CVExperienceItem, CVSkillItem, CandidateProfile, CertificationWithAction, DocumentWithAction, ExperienceWithAction, ResumeAward, ResumeEducation, ResumeExperience, ResumeMenuSlot, ResumeProps, ResumeSavePayload, ResumeSkill, SkillWithAction };
|
|
@@ -190,6 +190,15 @@ interface ResumeProps {
|
|
|
190
190
|
* Recibe el CandidateProfile actualizado y el array estructurado guardado por tipo de items
|
|
191
191
|
*/
|
|
192
192
|
onSave?: (payload: ResumeSavePayload, fullProfile: CandidateProfile) => void;
|
|
193
|
+
/**
|
|
194
|
+
* Muestra u oculta la raya superior del preview.
|
|
195
|
+
* @default true
|
|
196
|
+
*/
|
|
197
|
+
showTopBar?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Clases CSS adicionales para el contenedor del preview.
|
|
200
|
+
*/
|
|
201
|
+
className?: string;
|
|
193
202
|
}
|
|
194
203
|
|
|
195
204
|
export type { Action, CVActivityItem, CVCertificationItem, CVDocumentItem, CVEducationItem, CVExperienceBaseItem, CVExperienceItem, CVSkillItem, CandidateProfile, CertificationWithAction, DocumentWithAction, ExperienceWithAction, ResumeAward, ResumeEducation, ResumeExperience, ResumeMenuSlot, ResumeProps, ResumeSavePayload, ResumeSkill, SkillWithAction };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var background_exports = {};
|
|
31
|
+
__export(background_exports, {
|
|
32
|
+
Background: () => Background,
|
|
33
|
+
CORNER_GRADIENT: () => CORNER_GRADIENT,
|
|
34
|
+
RESUME_GRADIENT: () => RESUME_GRADIENT
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(background_exports);
|
|
37
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
38
|
+
var React = __toESM(require("react"), 1);
|
|
39
|
+
var import_utils = require("../../../lib/utils");
|
|
40
|
+
const RESUME_GRADIENT = "h-24 w-full bg-gradient-to-r from-[#FFFFFF] via-[#EBEBFF] to-[#E1F0FF]";
|
|
41
|
+
const CORNER_GRADIENT = "radial-gradient(ellipse 80% 60% at 100% 0%, hsl(var(--secondary) / 0.1) 0%, hsl(var(--accent-blue) / 0.06) 50%, transparent 70%)";
|
|
42
|
+
const Background = React.forwardRef(
|
|
43
|
+
({
|
|
44
|
+
className,
|
|
45
|
+
style,
|
|
46
|
+
gradientClassName = "bg-gradient-to-r from-white via-purple-100 to-blue-200",
|
|
47
|
+
children,
|
|
48
|
+
...props
|
|
49
|
+
}, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
50
|
+
"div",
|
|
51
|
+
{
|
|
52
|
+
ref,
|
|
53
|
+
className: (0, import_utils.cn)("absolute w-full h-40 bg-white overflow-hidden left-0 top-0", className),
|
|
54
|
+
style,
|
|
55
|
+
...props,
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
58
|
+
"div",
|
|
59
|
+
{
|
|
60
|
+
"data-pdf-background-gradient": true,
|
|
61
|
+
className: (0, import_utils.cn)(
|
|
62
|
+
"absolute inset-0 w-full h-full",
|
|
63
|
+
gradientClassName,
|
|
64
|
+
"[mask-image:linear-gradient(to_bottom,black_0%,transparent_100%)]"
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
children
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
);
|
|
73
|
+
Background.displayName = "Background";
|
|
74
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
75
|
+
0 && (module.exports = {
|
|
76
|
+
Background,
|
|
77
|
+
CORNER_GRADIENT,
|
|
78
|
+
RESUME_GRADIENT
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=background.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/background/background.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../../lib/utils\";\n\n/**\n * Soft diagonal gradient: top-left (white) → pale lavender (mid) → pale blue (bottom-right).\n * Ethereal, very subtle pastel transition.\n */\nconst RESUME_GRADIENT =\n \"h-24 w-full bg-gradient-to-r from-[#FFFFFF] via-[#EBEBFF] to-[#E1F0FF]\";\n\n/**\n * Subtle gradient wash for upper-right corner decoration.\n * Multi-stop: lavender/pink → blue, fading to transparent.\n * Uses semantic tokens for theme compatibility.\n */\nconst CORNER_GRADIENT =\n \"radial-gradient(ellipse 80% 60% at 100% 0%, hsl(var(--secondary) / 0.1) 0%, hsl(var(--accent-blue) / 0.06) 50%, transparent 70%)\";\n\ninterface BackgroundProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Custom gradient classes. Defaults to white → purple-100 → blue-200. */\n gradientClassName?: string;\n}\n\n/**\n * Wrapper with gradient background and bottom fade mask. Renders children inside.\n */\nconst Background = React.forwardRef<HTMLDivElement, BackgroundProps>(\n (\n {\n className,\n style,\n gradientClassName = \"bg-gradient-to-r from-white via-purple-100 to-blue-200\",\n children,\n ...props\n },\n ref,\n ) => (\n <div\n ref={ref}\n className={cn(\"absolute w-full h-40 bg-white overflow-hidden left-0 top-0\", className)}\n style={style}\n {...props}\n >\n <div\n data-pdf-background-gradient\n className={cn(\n \"absolute inset-0 w-full h-full\",\n gradientClassName,\n \"[mask-image:linear-gradient(to_bottom,black_0%,transparent_100%)]\",\n )}\n />\n {children}\n </div>\n ),\n);\nBackground.displayName = \"Background\";\n\nexport { Background, RESUME_GRADIENT, CORNER_GRADIENT };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCI;AAtCJ,YAAuB;AAEvB,mBAAmB;AAMnB,MAAM,kBACJ;AAOF,MAAM,kBACJ;AAUF,MAAM,aAAa,MAAM;AAAA,EACvB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,IACA,GAAG;AAAA,EACL,GACA,QAEA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAW,iBAAG,8DAA8D,SAAS;AAAA,MACrF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,gCAA4B;AAAA,YAC5B,eAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AAEJ;AACA,WAAW,cAAc;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Soft diagonal gradient: top-left (white) → pale lavender (mid) → pale blue (bottom-right).
|
|
5
|
+
* Ethereal, very subtle pastel transition.
|
|
6
|
+
*/
|
|
7
|
+
declare const RESUME_GRADIENT = "h-24 w-full bg-gradient-to-r from-[#FFFFFF] via-[#EBEBFF] to-[#E1F0FF]";
|
|
8
|
+
/**
|
|
9
|
+
* Subtle gradient wash for upper-right corner decoration.
|
|
10
|
+
* Multi-stop: lavender/pink → blue, fading to transparent.
|
|
11
|
+
* Uses semantic tokens for theme compatibility.
|
|
12
|
+
*/
|
|
13
|
+
declare const CORNER_GRADIENT = "radial-gradient(ellipse 80% 60% at 100% 0%, hsl(var(--secondary) / 0.1) 0%, hsl(var(--accent-blue) / 0.06) 50%, transparent 70%)";
|
|
14
|
+
interface BackgroundProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
15
|
+
/** Custom gradient classes. Defaults to white → purple-100 → blue-200. */
|
|
16
|
+
gradientClassName?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Wrapper with gradient background and bottom fade mask. Renders children inside.
|
|
20
|
+
*/
|
|
21
|
+
declare const Background: React.ForwardRefExoticComponent<BackgroundProps & React.RefAttributes<HTMLDivElement>>;
|
|
22
|
+
|
|
23
|
+
export { Background, CORNER_GRADIENT, RESUME_GRADIENT };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Soft diagonal gradient: top-left (white) → pale lavender (mid) → pale blue (bottom-right).
|
|
5
|
+
* Ethereal, very subtle pastel transition.
|
|
6
|
+
*/
|
|
7
|
+
declare const RESUME_GRADIENT = "h-24 w-full bg-gradient-to-r from-[#FFFFFF] via-[#EBEBFF] to-[#E1F0FF]";
|
|
8
|
+
/**
|
|
9
|
+
* Subtle gradient wash for upper-right corner decoration.
|
|
10
|
+
* Multi-stop: lavender/pink → blue, fading to transparent.
|
|
11
|
+
* Uses semantic tokens for theme compatibility.
|
|
12
|
+
*/
|
|
13
|
+
declare const CORNER_GRADIENT = "radial-gradient(ellipse 80% 60% at 100% 0%, hsl(var(--secondary) / 0.1) 0%, hsl(var(--accent-blue) / 0.06) 50%, transparent 70%)";
|
|
14
|
+
interface BackgroundProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
15
|
+
/** Custom gradient classes. Defaults to white → purple-100 → blue-200. */
|
|
16
|
+
gradientClassName?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Wrapper with gradient background and bottom fade mask. Renders children inside.
|
|
20
|
+
*/
|
|
21
|
+
declare const Background: React.ForwardRefExoticComponent<BackgroundProps & React.RefAttributes<HTMLDivElement>>;
|
|
22
|
+
|
|
23
|
+
export { Background, CORNER_GRADIENT, RESUME_GRADIENT };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../../../lib/utils";
|
|
5
|
+
const RESUME_GRADIENT = "h-24 w-full bg-gradient-to-r from-[#FFFFFF] via-[#EBEBFF] to-[#E1F0FF]";
|
|
6
|
+
const CORNER_GRADIENT = "radial-gradient(ellipse 80% 60% at 100% 0%, hsl(var(--secondary) / 0.1) 0%, hsl(var(--accent-blue) / 0.06) 50%, transparent 70%)";
|
|
7
|
+
const Background = React.forwardRef(
|
|
8
|
+
({
|
|
9
|
+
className,
|
|
10
|
+
style,
|
|
11
|
+
gradientClassName = "bg-gradient-to-r from-white via-purple-100 to-blue-200",
|
|
12
|
+
children,
|
|
13
|
+
...props
|
|
14
|
+
}, ref) => /* @__PURE__ */ jsxs(
|
|
15
|
+
"div",
|
|
16
|
+
{
|
|
17
|
+
ref,
|
|
18
|
+
className: cn("absolute w-full h-40 bg-white overflow-hidden left-0 top-0", className),
|
|
19
|
+
style,
|
|
20
|
+
...props,
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ jsx(
|
|
23
|
+
"div",
|
|
24
|
+
{
|
|
25
|
+
"data-pdf-background-gradient": true,
|
|
26
|
+
className: cn(
|
|
27
|
+
"absolute inset-0 w-full h-full",
|
|
28
|
+
gradientClassName,
|
|
29
|
+
"[mask-image:linear-gradient(to_bottom,black_0%,transparent_100%)]"
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
children
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
);
|
|
38
|
+
Background.displayName = "Background";
|
|
39
|
+
export {
|
|
40
|
+
Background,
|
|
41
|
+
CORNER_GRADIENT,
|
|
42
|
+
RESUME_GRADIENT
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/background/background.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../../lib/utils\";\n\n/**\n * Soft diagonal gradient: top-left (white) → pale lavender (mid) → pale blue (bottom-right).\n * Ethereal, very subtle pastel transition.\n */\nconst RESUME_GRADIENT =\n \"h-24 w-full bg-gradient-to-r from-[#FFFFFF] via-[#EBEBFF] to-[#E1F0FF]\";\n\n/**\n * Subtle gradient wash for upper-right corner decoration.\n * Multi-stop: lavender/pink → blue, fading to transparent.\n * Uses semantic tokens for theme compatibility.\n */\nconst CORNER_GRADIENT =\n \"radial-gradient(ellipse 80% 60% at 100% 0%, hsl(var(--secondary) / 0.1) 0%, hsl(var(--accent-blue) / 0.06) 50%, transparent 70%)\";\n\ninterface BackgroundProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Custom gradient classes. Defaults to white → purple-100 → blue-200. */\n gradientClassName?: string;\n}\n\n/**\n * Wrapper with gradient background and bottom fade mask. Renders children inside.\n */\nconst Background = React.forwardRef<HTMLDivElement, BackgroundProps>(\n (\n {\n className,\n style,\n gradientClassName = \"bg-gradient-to-r from-white via-purple-100 to-blue-200\",\n children,\n ...props\n },\n ref,\n ) => (\n <div\n ref={ref}\n className={cn(\"absolute w-full h-40 bg-white overflow-hidden left-0 top-0\", className)}\n style={style}\n {...props}\n >\n <div\n data-pdf-background-gradient\n className={cn(\n \"absolute inset-0 w-full h-full\",\n gradientClassName,\n \"[mask-image:linear-gradient(to_bottom,black_0%,transparent_100%)]\",\n )}\n />\n {children}\n </div>\n ),\n);\nBackground.displayName = \"Background\";\n\nexport { Background, RESUME_GRADIENT, CORNER_GRADIENT };\n"],"mappings":";AAwCI,SAME,KANF;AAtCJ,YAAY,WAAW;AAEvB,SAAS,UAAU;AAMnB,MAAM,kBACJ;AAOF,MAAM,kBACJ;AAUF,MAAM,aAAa,MAAM;AAAA,EACvB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,IACA,GAAG;AAAA,EACL,GACA,QAEA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,8DAA8D,SAAS;AAAA,MACrF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,gCAA4B;AAAA,YAC5B,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AAEJ;AACA,WAAW,cAAc;","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var background_exports = {};
|
|
20
|
+
__export(background_exports, {
|
|
21
|
+
Background: () => import_background.Background,
|
|
22
|
+
CORNER_GRADIENT: () => import_background.CORNER_GRADIENT,
|
|
23
|
+
RESUME_GRADIENT: () => import_background.RESUME_GRADIENT
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(background_exports);
|
|
26
|
+
var import_background = require("./background");
|
|
27
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
+
0 && (module.exports = {
|
|
29
|
+
Background,
|
|
30
|
+
CORNER_GRADIENT,
|
|
31
|
+
RESUME_GRADIENT
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/background/index.ts"],"sourcesContent":["export { Background, RESUME_GRADIENT, CORNER_GRADIENT } from \"./background\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA6D;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/background/index.ts"],"sourcesContent":["export { Background, RESUME_GRADIENT, CORNER_GRADIENT } from \"./background\";\n"],"mappings":"AAAA,SAAS,YAAY,iBAAiB,uBAAuB;","names":[]}
|
|
@@ -21,6 +21,7 @@ __reExport(ui_exports, require("./alert-dialog"), module.exports);
|
|
|
21
21
|
__reExport(ui_exports, require("./aspect-ratio"), module.exports);
|
|
22
22
|
__reExport(ui_exports, require("./autocomplete"), module.exports);
|
|
23
23
|
__reExport(ui_exports, require("./avatar"), module.exports);
|
|
24
|
+
__reExport(ui_exports, require("./background"), module.exports);
|
|
24
25
|
__reExport(ui_exports, require("./badge"), module.exports);
|
|
25
26
|
__reExport(ui_exports, require("./breadcrumb"), module.exports);
|
|
26
27
|
__reExport(ui_exports, require("./button"), module.exports);
|
|
@@ -81,6 +82,7 @@ __reExport(ui_exports, require("./tooltip"), module.exports);
|
|
|
81
82
|
...require("./aspect-ratio"),
|
|
82
83
|
...require("./autocomplete"),
|
|
83
84
|
...require("./avatar"),
|
|
85
|
+
...require("./background"),
|
|
84
86
|
...require("./badge"),
|
|
85
87
|
...require("./breadcrumb"),
|
|
86
88
|
...require("./button"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ui/index.ts"],"sourcesContent":["export * from \"./accordion\";\nexport * from \"./alert\";\nexport * from \"./alert-dialog\";\nexport * from \"./aspect-ratio\";\nexport * from \"./autocomplete\";\nexport * from \"./avatar\";\nexport * from \"./badge\";\nexport * from \"./breadcrumb\";\nexport * from \"./button\";\nexport * from \"./calendar\";\nexport * from \"./card\";\nexport * from \"./carousel\";\nexport * from \"./checkbox\";\nexport * from \"./collapsible\";\nexport * from \"./combobox\";\nexport * from \"./command\";\nexport * from \"./context-menu\";\nexport * from \"./date-picker\";\nexport * from \"./dialog\";\nexport * from \"./drawer\";\nexport * from \"./dropdown-menu\";\nexport * from \"./form\";\nexport * from \"./hover-card\";\nexport * from \"./icon\";\nexport * from \"./input\";\nexport * from \"./input-field\";\nexport * from \"./input-otp\";\nexport * from \"./label\";\nexport * from \"./logo\";\nexport * from \"./loading-state\";\nexport * from \"./menubar\";\nexport * from \"./month-year-picker\";\nexport * from \"./multi-select\";\nexport * from \"./navigation-menu\";\nexport * from \"./pagination\";\nexport * from \"./popover\";\nexport * from \"./progress\";\nexport * from \"./radio-group\";\nexport * from \"./resizable\";\nexport * from \"./rich-text-editor\";\nexport * from \"./scroll-area\";\nexport * from \"./section-loader\";\nexport * from \"./select\";\nexport * from \"./separator\";\nexport * from \"./sheet\";\nexport * from \"./skeleton\";\nexport * from \"./slider\";\nexport * from \"./sonner\";\nexport * from \"./spinner\";\nexport * from \"./switch\";\nexport * from \"./table\";\nexport * from \"./tabs\";\nexport * from \"./tag-input\";\nexport * from \"./textarea\";\nexport * from \"./toast\";\nexport * from \"./toggle\";\nexport * from \"./toggle-group\";\nexport * from \"./tooltip\";\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,uBAAc,wBAAd;AACA,uBAAc,oBADd;AAEA,uBAAc,2BAFd;AAGA,uBAAc,2BAHd;AAIA,uBAAc,2BAJd;AAKA,uBAAc,qBALd;AAMA,uBAAc,
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ui/index.ts"],"sourcesContent":["export * from \"./accordion\";\nexport * from \"./alert\";\nexport * from \"./alert-dialog\";\nexport * from \"./aspect-ratio\";\nexport * from \"./autocomplete\";\nexport * from \"./avatar\";\nexport * from \"./background\";\nexport * from \"./badge\";\nexport * from \"./breadcrumb\";\nexport * from \"./button\";\nexport * from \"./calendar\";\nexport * from \"./card\";\nexport * from \"./carousel\";\nexport * from \"./checkbox\";\nexport * from \"./collapsible\";\nexport * from \"./combobox\";\nexport * from \"./command\";\nexport * from \"./context-menu\";\nexport * from \"./date-picker\";\nexport * from \"./dialog\";\nexport * from \"./drawer\";\nexport * from \"./dropdown-menu\";\nexport * from \"./form\";\nexport * from \"./hover-card\";\nexport * from \"./icon\";\nexport * from \"./input\";\nexport * from \"./input-field\";\nexport * from \"./input-otp\";\nexport * from \"./label\";\nexport * from \"./logo\";\nexport * from \"./loading-state\";\nexport * from \"./menubar\";\nexport * from \"./month-year-picker\";\nexport * from \"./multi-select\";\nexport * from \"./navigation-menu\";\nexport * from \"./pagination\";\nexport * from \"./popover\";\nexport * from \"./progress\";\nexport * from \"./radio-group\";\nexport * from \"./resizable\";\nexport * from \"./rich-text-editor\";\nexport * from \"./scroll-area\";\nexport * from \"./section-loader\";\nexport * from \"./select\";\nexport * from \"./separator\";\nexport * from \"./sheet\";\nexport * from \"./skeleton\";\nexport * from \"./slider\";\nexport * from \"./sonner\";\nexport * from \"./spinner\";\nexport * from \"./switch\";\nexport * from \"./table\";\nexport * from \"./tabs\";\nexport * from \"./tag-input\";\nexport * from \"./textarea\";\nexport * from \"./toast\";\nexport * from \"./toggle\";\nexport * from \"./toggle-group\";\nexport * from \"./tooltip\";\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,uBAAc,wBAAd;AACA,uBAAc,oBADd;AAEA,uBAAc,2BAFd;AAGA,uBAAc,2BAHd;AAIA,uBAAc,2BAJd;AAKA,uBAAc,qBALd;AAMA,uBAAc,yBANd;AAOA,uBAAc,oBAPd;AAQA,uBAAc,yBARd;AASA,uBAAc,qBATd;AAUA,uBAAc,uBAVd;AAWA,uBAAc,mBAXd;AAYA,uBAAc,uBAZd;AAaA,uBAAc,uBAbd;AAcA,uBAAc,0BAdd;AAeA,uBAAc,uBAfd;AAgBA,uBAAc,sBAhBd;AAiBA,uBAAc,2BAjBd;AAkBA,uBAAc,0BAlBd;AAmBA,uBAAc,qBAnBd;AAoBA,uBAAc,qBApBd;AAqBA,uBAAc,4BArBd;AAsBA,uBAAc,mBAtBd;AAuBA,uBAAc,yBAvBd;AAwBA,uBAAc,mBAxBd;AAyBA,uBAAc,oBAzBd;AA0BA,uBAAc,0BA1Bd;AA2BA,uBAAc,wBA3Bd;AA4BA,uBAAc,oBA5Bd;AA6BA,uBAAc,mBA7Bd;AA8BA,uBAAc,4BA9Bd;AA+BA,uBAAc,sBA/Bd;AAgCA,uBAAc,gCAhCd;AAiCA,uBAAc,2BAjCd;AAkCA,uBAAc,8BAlCd;AAmCA,uBAAc,yBAnCd;AAoCA,uBAAc,sBApCd;AAqCA,uBAAc,uBArCd;AAsCA,uBAAc,0BAtCd;AAuCA,uBAAc,wBAvCd;AAwCA,uBAAc,+BAxCd;AAyCA,uBAAc,0BAzCd;AA0CA,uBAAc,6BA1Cd;AA2CA,uBAAc,qBA3Cd;AA4CA,uBAAc,wBA5Cd;AA6CA,uBAAc,oBA7Cd;AA8CA,uBAAc,uBA9Cd;AA+CA,uBAAc,qBA/Cd;AAgDA,uBAAc,qBAhDd;AAiDA,uBAAc,sBAjDd;AAkDA,uBAAc,qBAlDd;AAmDA,uBAAc,oBAnDd;AAoDA,uBAAc,mBApDd;AAqDA,uBAAc,wBArDd;AAsDA,uBAAc,uBAtDd;AAuDA,uBAAc,oBAvDd;AAwDA,uBAAc,qBAxDd;AAyDA,uBAAc,2BAzDd;AA0DA,uBAAc,sBA1Dd;","names":[]}
|
|
@@ -4,6 +4,7 @@ export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
|
|
|
4
4
|
export { AspectRatio } from './aspect-ratio/aspect-ratio.cjs';
|
|
5
5
|
export { Autocomplete, AutocompleteOption, AutocompleteProps } from './autocomplete/autocomplete.cjs';
|
|
6
6
|
export { Avatar, AvatarFallback, AvatarImage } from './avatar/avatar.cjs';
|
|
7
|
+
export { Background, CORNER_GRADIENT, RESUME_GRADIENT } from './background/background.cjs';
|
|
7
8
|
export { Badge, badgeVariants } from './badge/badge.cjs';
|
|
8
9
|
export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from './breadcrumb/breadcrumb.cjs';
|
|
9
10
|
export { Button, buttonVariants } from './button/button.cjs';
|
|
@@ -4,6 +4,7 @@ export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
|
|
|
4
4
|
export { AspectRatio } from './aspect-ratio/aspect-ratio.js';
|
|
5
5
|
export { Autocomplete, AutocompleteOption, AutocompleteProps } from './autocomplete/autocomplete.js';
|
|
6
6
|
export { Avatar, AvatarFallback, AvatarImage } from './avatar/avatar.js';
|
|
7
|
+
export { Background, CORNER_GRADIENT, RESUME_GRADIENT } from './background/background.js';
|
|
7
8
|
export { Badge, badgeVariants } from './badge/badge.js';
|
|
8
9
|
export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from './breadcrumb/breadcrumb.js';
|
|
9
10
|
export { Button, buttonVariants } from './button/button.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ui/index.ts"],"sourcesContent":["export * from \"./accordion\";\nexport * from \"./alert\";\nexport * from \"./alert-dialog\";\nexport * from \"./aspect-ratio\";\nexport * from \"./autocomplete\";\nexport * from \"./avatar\";\nexport * from \"./badge\";\nexport * from \"./breadcrumb\";\nexport * from \"./button\";\nexport * from \"./calendar\";\nexport * from \"./card\";\nexport * from \"./carousel\";\nexport * from \"./checkbox\";\nexport * from \"./collapsible\";\nexport * from \"./combobox\";\nexport * from \"./command\";\nexport * from \"./context-menu\";\nexport * from \"./date-picker\";\nexport * from \"./dialog\";\nexport * from \"./drawer\";\nexport * from \"./dropdown-menu\";\nexport * from \"./form\";\nexport * from \"./hover-card\";\nexport * from \"./icon\";\nexport * from \"./input\";\nexport * from \"./input-field\";\nexport * from \"./input-otp\";\nexport * from \"./label\";\nexport * from \"./logo\";\nexport * from \"./loading-state\";\nexport * from \"./menubar\";\nexport * from \"./month-year-picker\";\nexport * from \"./multi-select\";\nexport * from \"./navigation-menu\";\nexport * from \"./pagination\";\nexport * from \"./popover\";\nexport * from \"./progress\";\nexport * from \"./radio-group\";\nexport * from \"./resizable\";\nexport * from \"./rich-text-editor\";\nexport * from \"./scroll-area\";\nexport * from \"./section-loader\";\nexport * from \"./select\";\nexport * from \"./separator\";\nexport * from \"./sheet\";\nexport * from \"./skeleton\";\nexport * from \"./slider\";\nexport * from \"./sonner\";\nexport * from \"./spinner\";\nexport * from \"./switch\";\nexport * from \"./table\";\nexport * from \"./tabs\";\nexport * from \"./tag-input\";\nexport * from \"./textarea\";\nexport * from \"./toast\";\nexport * from \"./toggle\";\nexport * from \"./toggle-group\";\nexport * from \"./tooltip\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ui/index.ts"],"sourcesContent":["export * from \"./accordion\";\nexport * from \"./alert\";\nexport * from \"./alert-dialog\";\nexport * from \"./aspect-ratio\";\nexport * from \"./autocomplete\";\nexport * from \"./avatar\";\nexport * from \"./background\";\nexport * from \"./badge\";\nexport * from \"./breadcrumb\";\nexport * from \"./button\";\nexport * from \"./calendar\";\nexport * from \"./card\";\nexport * from \"./carousel\";\nexport * from \"./checkbox\";\nexport * from \"./collapsible\";\nexport * from \"./combobox\";\nexport * from \"./command\";\nexport * from \"./context-menu\";\nexport * from \"./date-picker\";\nexport * from \"./dialog\";\nexport * from \"./drawer\";\nexport * from \"./dropdown-menu\";\nexport * from \"./form\";\nexport * from \"./hover-card\";\nexport * from \"./icon\";\nexport * from \"./input\";\nexport * from \"./input-field\";\nexport * from \"./input-otp\";\nexport * from \"./label\";\nexport * from \"./logo\";\nexport * from \"./loading-state\";\nexport * from \"./menubar\";\nexport * from \"./month-year-picker\";\nexport * from \"./multi-select\";\nexport * from \"./navigation-menu\";\nexport * from \"./pagination\";\nexport * from \"./popover\";\nexport * from \"./progress\";\nexport * from \"./radio-group\";\nexport * from \"./resizable\";\nexport * from \"./rich-text-editor\";\nexport * from \"./scroll-area\";\nexport * from \"./section-loader\";\nexport * from \"./select\";\nexport * from \"./separator\";\nexport * from \"./sheet\";\nexport * from \"./skeleton\";\nexport * from \"./slider\";\nexport * from \"./sonner\";\nexport * from \"./spinner\";\nexport * from \"./switch\";\nexport * from \"./table\";\nexport * from \"./tabs\";\nexport * from \"./tag-input\";\nexport * from \"./textarea\";\nexport * from \"./toast\";\nexport * from \"./toggle\";\nexport * from \"./toggle-group\";\nexport * from \"./tooltip\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|