@ansiversa/components 0.0.106 → 0.0.117
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/package.json +1 -1
- package/resume-templates/resumeData.ts +6 -0
- package/resume-templates/typescript-schema.ts +6 -0
- package/src/resume-templates/ResumeTemplateClassic.astro +91 -5
- package/src/resume-templates/ResumeTemplateExecutiveTimeline.astro +27 -0
- package/src/resume-templates/ResumeTemplateMinimal.astro +27 -0
- package/src/resume-templates/ResumeTemplateModernTwoTone.astro +25 -0
- package/src/styles/global.css +1 -0
package/package.json
CHANGED
|
@@ -127,6 +127,12 @@ export const resumeData: ResumeData = {
|
|
|
127
127
|
{ name: "Tamil", proficiency: "Native" },
|
|
128
128
|
],
|
|
129
129
|
|
|
130
|
+
declaration: {
|
|
131
|
+
text: "I hereby declare that the information furnished above is true to the best of my knowledge.",
|
|
132
|
+
place: "Pondicherry – India.",
|
|
133
|
+
name: "Karthikeyan Subbarayan Ramalingam",
|
|
134
|
+
},
|
|
135
|
+
|
|
130
136
|
settings: {
|
|
131
137
|
showSkillsAs: "chips",
|
|
132
138
|
paper: "A4",
|
|
@@ -91,6 +91,12 @@ export type ResumeData = {
|
|
|
91
91
|
summary?: string;
|
|
92
92
|
}>;
|
|
93
93
|
|
|
94
|
+
declaration?: {
|
|
95
|
+
text?: string;
|
|
96
|
+
place?: string;
|
|
97
|
+
name?: string;
|
|
98
|
+
};
|
|
99
|
+
|
|
94
100
|
// Template feature flags (optional)
|
|
95
101
|
settings?: {
|
|
96
102
|
showSkillsAs?: "chips" | "levels"; // chips for classic/modern, levels for minimal
|
|
@@ -29,15 +29,22 @@ if (basics.contact.website) {
|
|
|
29
29
|
contactItems.push({ label: formatUrlLabel(basics.contact.website), href: basics.contact.website });
|
|
30
30
|
}
|
|
31
31
|
for (const link of basics.links ?? []) {
|
|
32
|
-
|
|
32
|
+
const urlLabel = link.url ? formatUrlLabel(link.url) : link.label;
|
|
33
|
+
if (urlLabel) {
|
|
34
|
+
contactItems.push({ label: urlLabel, href: link.url });
|
|
35
|
+
}
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
const experienceItems = data.experience ?? [];
|
|
36
39
|
const projectItems = data.projects ?? [];
|
|
37
40
|
const educationItems = data.education ?? [];
|
|
38
41
|
const skills = data.skills ?? [];
|
|
42
|
+
const certifications = data.certifications ?? [];
|
|
39
43
|
const highlights = data.highlights ?? [];
|
|
40
44
|
const languages = data.languages ?? [];
|
|
45
|
+
const awards = data.awards ?? [];
|
|
46
|
+
const declaration = data.declaration ?? {};
|
|
47
|
+
const hasDeclaration = Boolean(declaration.text || declaration.place || declaration.name);
|
|
41
48
|
---
|
|
42
49
|
|
|
43
50
|
<style>
|
|
@@ -46,6 +53,19 @@ const languages = data.languages ?? [];
|
|
|
46
53
|
text-decoration: none;
|
|
47
54
|
color: inherit;
|
|
48
55
|
}
|
|
56
|
+
|
|
57
|
+
.resume-template .classic-grid {
|
|
58
|
+
display: grid;
|
|
59
|
+
grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
|
|
60
|
+
gap: 2.5rem;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.resume-template .classic-divider {
|
|
64
|
+
background: none !important;
|
|
65
|
+
border-top: 1px solid #e2e8f0 !important;
|
|
66
|
+
-webkit-print-color-adjust: exact;
|
|
67
|
+
print-color-adjust: exact;
|
|
68
|
+
}
|
|
49
69
|
}
|
|
50
70
|
</style>
|
|
51
71
|
|
|
@@ -57,13 +77,13 @@ const languages = data.languages ?? [];
|
|
|
57
77
|
<h1 class="text-3xl font-bold tracking-tight">{basics.fullName}</h1>
|
|
58
78
|
<p class="mt-1 text-base font-medium text-slate-700">{basics.headline}</p>
|
|
59
79
|
{basics.summary && (
|
|
60
|
-
<p class="mt-3
|
|
80
|
+
<p class="mt-3 text-sm leading-6 text-slate-600">{basics.summary}</p>
|
|
61
81
|
)}
|
|
62
82
|
</div>
|
|
63
83
|
|
|
64
84
|
{contactItems.length > 0 && (
|
|
65
85
|
<div class="text-sm text-slate-700 sm:text-right">
|
|
66
|
-
<div class="flex flex-col gap-1">
|
|
86
|
+
<div class="flex flex-col gap-1 sm:items-end">
|
|
67
87
|
{contactItems.map((item) =>
|
|
68
88
|
item.href ? (
|
|
69
89
|
<a
|
|
@@ -81,9 +101,9 @@ const languages = data.languages ?? [];
|
|
|
81
101
|
)}
|
|
82
102
|
</header>
|
|
83
103
|
|
|
84
|
-
<div class="my-8 h-
|
|
104
|
+
<div class="classic-divider my-8 h-0 border-t border-slate-200"></div>
|
|
85
105
|
|
|
86
|
-
<div class="grid gap-10 lg:grid-cols-3">
|
|
106
|
+
<div class="classic-grid grid gap-10 lg:grid-cols-3">
|
|
87
107
|
<div class="space-y-10 lg:col-span-2">
|
|
88
108
|
{experienceItems.length > 0 && (
|
|
89
109
|
<section>
|
|
@@ -203,6 +223,29 @@ const languages = data.languages ?? [];
|
|
|
203
223
|
</section>
|
|
204
224
|
)}
|
|
205
225
|
|
|
226
|
+
{certifications.length > 0 && (
|
|
227
|
+
<section>
|
|
228
|
+
<h2 class="text-sm font-bold tracking-widest text-slate-900">CERTIFICATIONS</h2>
|
|
229
|
+
<ul class="mt-4 space-y-3 text-sm text-slate-700">
|
|
230
|
+
{certifications.map((cert) => {
|
|
231
|
+
const meta = [cert.issuer, cert.year].filter(Boolean).join(" · ");
|
|
232
|
+
return (
|
|
233
|
+
<li class="space-y-1">
|
|
234
|
+
{cert.link ? (
|
|
235
|
+
<a class="font-semibold text-slate-900 underline underline-offset-2" href={cert.link}>
|
|
236
|
+
{cert.name}
|
|
237
|
+
</a>
|
|
238
|
+
) : (
|
|
239
|
+
<div class="font-semibold text-slate-900">{cert.name}</div>
|
|
240
|
+
)}
|
|
241
|
+
{meta && <div class="text-xs text-slate-600">{meta}</div>}
|
|
242
|
+
</li>
|
|
243
|
+
);
|
|
244
|
+
})}
|
|
245
|
+
</ul>
|
|
246
|
+
</section>
|
|
247
|
+
)}
|
|
248
|
+
|
|
206
249
|
{highlights.length > 0 && (
|
|
207
250
|
<section>
|
|
208
251
|
<h2 class="text-sm font-bold tracking-widest text-slate-900">HIGHLIGHTS</h2>
|
|
@@ -227,8 +270,51 @@ const languages = data.languages ?? [];
|
|
|
227
270
|
</ul>
|
|
228
271
|
</section>
|
|
229
272
|
)}
|
|
273
|
+
|
|
274
|
+
{awards.length > 0 && (
|
|
275
|
+
<section>
|
|
276
|
+
<h2 class="text-sm font-bold tracking-widest text-slate-900">ACHIEVEMENTS</h2>
|
|
277
|
+
<ul class="mt-4 space-y-3 text-sm text-slate-700">
|
|
278
|
+
{awards.map((award) => {
|
|
279
|
+
const meta = [award.by, award.year].filter(Boolean).join(" · ");
|
|
280
|
+
return (
|
|
281
|
+
<li class="space-y-1">
|
|
282
|
+
<div class="font-semibold text-slate-900">{award.title}</div>
|
|
283
|
+
{meta && <div class="text-xs text-slate-600">{meta}</div>}
|
|
284
|
+
{award.summary && <div class="text-sm text-slate-700">{award.summary}</div>}
|
|
285
|
+
</li>
|
|
286
|
+
);
|
|
287
|
+
})}
|
|
288
|
+
</ul>
|
|
289
|
+
</section>
|
|
290
|
+
)}
|
|
230
291
|
</aside>
|
|
231
292
|
</div>
|
|
293
|
+
|
|
294
|
+
{hasDeclaration && (
|
|
295
|
+
<>
|
|
296
|
+
<div class="classic-divider my-8 h-0 border-t border-slate-200"></div>
|
|
297
|
+
<section class="space-y-4">
|
|
298
|
+
<h2 class="text-sm font-bold tracking-widest text-slate-900">DECLARATION</h2>
|
|
299
|
+
{declaration.text && (
|
|
300
|
+
<p class="text-sm leading-6 text-slate-700">{declaration.text}</p>
|
|
301
|
+
)}
|
|
302
|
+
{(declaration.place || declaration.name) && (
|
|
303
|
+
<div class="flex flex-wrap items-center justify-between gap-2 text-sm text-slate-700">
|
|
304
|
+
{declaration.place && (
|
|
305
|
+
<div>
|
|
306
|
+
<span class="font-semibold text-slate-900">Place:</span>{" "}
|
|
307
|
+
{declaration.place}
|
|
308
|
+
</div>
|
|
309
|
+
)}
|
|
310
|
+
{declaration.name && (
|
|
311
|
+
<div class="font-semibold text-slate-900">{declaration.name}</div>
|
|
312
|
+
)}
|
|
313
|
+
</div>
|
|
314
|
+
)}
|
|
315
|
+
</section>
|
|
316
|
+
</>
|
|
317
|
+
)}
|
|
232
318
|
</section>
|
|
233
319
|
</main>
|
|
234
320
|
</div>
|
|
@@ -30,6 +30,8 @@ const projects = data.projects ?? [];
|
|
|
30
30
|
const skills = data.skills ?? [];
|
|
31
31
|
const education = data.education ?? [];
|
|
32
32
|
const highlights = data.highlights ?? [];
|
|
33
|
+
const declaration = data.declaration ?? {};
|
|
34
|
+
const hasDeclaration = Boolean(declaration.text || declaration.place || declaration.name);
|
|
33
35
|
---
|
|
34
36
|
|
|
35
37
|
<style>
|
|
@@ -183,6 +185,31 @@ const highlights = data.highlights ?? [];
|
|
|
183
185
|
)}
|
|
184
186
|
</aside>
|
|
185
187
|
</div>
|
|
188
|
+
|
|
189
|
+
{hasDeclaration && (
|
|
190
|
+
<>
|
|
191
|
+
<div class="my-8 h-px bg-slate-200"></div>
|
|
192
|
+
<section class="space-y-4">
|
|
193
|
+
<h2 class="text-sm font-bold tracking-widest text-slate-900">DECLARATION</h2>
|
|
194
|
+
{declaration.text && (
|
|
195
|
+
<p class="text-sm leading-6 text-slate-700">{declaration.text}</p>
|
|
196
|
+
)}
|
|
197
|
+
{(declaration.place || declaration.name) && (
|
|
198
|
+
<div class="flex flex-wrap items-center justify-between gap-2 text-sm text-slate-700">
|
|
199
|
+
{declaration.place && (
|
|
200
|
+
<div>
|
|
201
|
+
<span class="font-semibold text-slate-900">Place:</span>{" "}
|
|
202
|
+
{declaration.place}
|
|
203
|
+
</div>
|
|
204
|
+
)}
|
|
205
|
+
{declaration.name && (
|
|
206
|
+
<div class="font-semibold text-slate-900">{declaration.name}</div>
|
|
207
|
+
)}
|
|
208
|
+
</div>
|
|
209
|
+
)}
|
|
210
|
+
</section>
|
|
211
|
+
</>
|
|
212
|
+
)}
|
|
186
213
|
</section>
|
|
187
214
|
</main>
|
|
188
215
|
</div>
|
|
@@ -38,6 +38,8 @@ const skills = data.skills ?? [];
|
|
|
38
38
|
const education = data.education ?? [];
|
|
39
39
|
const certifications = data.certifications ?? [];
|
|
40
40
|
const showSkillsAs = data.settings?.showSkillsAs ?? "levels";
|
|
41
|
+
const declaration = data.declaration ?? {};
|
|
42
|
+
const hasDeclaration = Boolean(declaration.text || declaration.place || declaration.name);
|
|
41
43
|
---
|
|
42
44
|
|
|
43
45
|
<style>
|
|
@@ -214,6 +216,31 @@ const showSkillsAs = data.settings?.showSkillsAs ?? "levels";
|
|
|
214
216
|
)}
|
|
215
217
|
</aside>
|
|
216
218
|
</div>
|
|
219
|
+
|
|
220
|
+
{hasDeclaration && (
|
|
221
|
+
<>
|
|
222
|
+
<div class="my-10 h-px bg-slate-200"></div>
|
|
223
|
+
<section class="space-y-4">
|
|
224
|
+
<h2 class="text-xs font-semibold tracking-[0.25em] text-slate-500">DECLARATION</h2>
|
|
225
|
+
{declaration.text && (
|
|
226
|
+
<p class="text-sm leading-7 text-slate-700">{declaration.text}</p>
|
|
227
|
+
)}
|
|
228
|
+
{(declaration.place || declaration.name) && (
|
|
229
|
+
<div class="flex flex-wrap items-center justify-between gap-2 text-sm text-slate-700">
|
|
230
|
+
{declaration.place && (
|
|
231
|
+
<div>
|
|
232
|
+
<span class="font-semibold text-slate-900">Place:</span>{" "}
|
|
233
|
+
{declaration.place}
|
|
234
|
+
</div>
|
|
235
|
+
)}
|
|
236
|
+
{declaration.name && (
|
|
237
|
+
<div class="font-semibold text-slate-900">{declaration.name}</div>
|
|
238
|
+
)}
|
|
239
|
+
</div>
|
|
240
|
+
)}
|
|
241
|
+
</section>
|
|
242
|
+
</>
|
|
243
|
+
)}
|
|
217
244
|
</section>
|
|
218
245
|
</main>
|
|
219
246
|
</div>
|
|
@@ -40,6 +40,8 @@ const experienceItems = data.experience ?? [];
|
|
|
40
40
|
const projects = data.projects ?? [];
|
|
41
41
|
const education = data.education ?? [];
|
|
42
42
|
const highlights = data.highlights ?? [];
|
|
43
|
+
const declaration = data.declaration ?? {};
|
|
44
|
+
const hasDeclaration = Boolean(declaration.text || declaration.place || declaration.name);
|
|
43
45
|
---
|
|
44
46
|
|
|
45
47
|
<style>
|
|
@@ -238,6 +240,29 @@ const highlights = data.highlights ?? [];
|
|
|
238
240
|
)}
|
|
239
241
|
</div>
|
|
240
242
|
</section>
|
|
243
|
+
|
|
244
|
+
{hasDeclaration && (
|
|
245
|
+
<section>
|
|
246
|
+
<div class="my-8 h-px bg-slate-200"></div>
|
|
247
|
+
<h2 class="text-xs font-bold tracking-widest text-slate-500">DECLARATION</h2>
|
|
248
|
+
{declaration.text && (
|
|
249
|
+
<p class="mt-3 text-sm leading-6 text-slate-700">{declaration.text}</p>
|
|
250
|
+
)}
|
|
251
|
+
{(declaration.place || declaration.name) && (
|
|
252
|
+
<div class="mt-3 flex flex-wrap items-center justify-between gap-2 text-sm text-slate-700">
|
|
253
|
+
{declaration.place && (
|
|
254
|
+
<div>
|
|
255
|
+
<span class="font-semibold text-slate-900">Place:</span>{" "}
|
|
256
|
+
{declaration.place}
|
|
257
|
+
</div>
|
|
258
|
+
)}
|
|
259
|
+
{declaration.name && (
|
|
260
|
+
<div class="font-semibold text-slate-900">{declaration.name}</div>
|
|
261
|
+
)}
|
|
262
|
+
</div>
|
|
263
|
+
)}
|
|
264
|
+
</section>
|
|
265
|
+
)}
|
|
241
266
|
</div>
|
|
242
267
|
</div>
|
|
243
268
|
</section>
|