Files
portfolio/app/components/resume/ResumeExperience.vue
T
mahdiarghyani 12c8847447 feat(resume): enhance spacing, styling, and add markdown text parsing
- Update section spacing from mb-8 to mb-12 for improved visual hierarchy
- Refine heading padding and margins for consistent section styling
- Adjust work experience highlights spacing and add leading-relaxed for readability
- Implement markdown bold text parsing in job highlights using new composable
- Add color-coded icons in resume header (red for location, green for phone, amber for email, blue for website)
- Reorganize contact information into two lines for better layout organization
- Standardize icon sizing with explicit w-4 h-4 dimensions across header
- Create useMarkdownText composable for markdown formatting utilities
- Update resume data and PDF export endpoint to support enhanced styling
- Improve print styling consistency across all resume components
2025-12-06 14:04:45 +03:30

65 lines
2.0 KiB
Vue

<script setup lang="ts">
import type { WorkExperience } from '~/types/resume'
import { parseMarkdownBold } from '~/composables/useMarkdownText'
interface Props {
work: WorkExperience[]
}
const props = defineProps<Props>()
const { formatDate } = useResumeData()
const sortedWork = computed(() => {
return [...props.work].sort((a, b) => {
const dateA = a.startDate || ''
const dateB = b.startDate || ''
return dateB.localeCompare(dateA)
})
})
function formatDateRange(start: string, end?: string): string {
const startFormatted = formatDate(start)
const endFormatted = end ? formatDate(end) : 'Present'
return `${startFormatted} - ${endFormatted}`
}
</script>
<template>
<section class="mb-12 print:mb-12">
<h2
class="text-base font-bold text-blue-700 uppercase border-b-2 border-blue-600 pb-2 mb-6 print:mb-6 tracking-wide">
Work Experience
</h2>
<div v-for="job in sortedWork" :key="job.company + job.startDate" class="mb-8 last:mb-0 print:mb-8">
<div class="flex justify-between items-start gap-4">
<div class="flex-1 min-w-0">
<h3 class="text-sm font-bold text-gray-900 break-words hyphens-none">{{ job.position }}</h3>
<p class="text-sm font-medium text-gray-600">{{ job.company }}</p>
</div>
<span class="text-sm text-gray-500 whitespace-nowrap flex-shrink-0 font-medium">
{{ formatDateRange(job.startDate, job.endDate) }}
</span>
</div>
<ul class="mt-4 space-y-2.5 print:mt-4 print:space-y-2.5">
<li v-for="(highlight, idx) in job.highlights" :key="idx"
class="text-sm text-gray-700 pl-4 relative before:content-['•'] before:absolute before:left-0 before:text-gray-500 before:font-bold print:before:text-gray-500 break-words hyphens-none leading-relaxed"
v-html="parseMarkdownBold(highlight)" />
</ul>
</div>
</section>
</template>
<style scoped>
.hyphens-none {
hyphens: none;
-webkit-hyphens: none;
-ms-hyphens: none;
}
.break-words {
word-break: normal;
overflow-wrap: break-word;
}
</style>