Skip to content

Commit

Permalink
Update experience and projects to use same template
Browse files Browse the repository at this point in the history
Add work card and card body for reuse
and to make it easier to have changes based on how old a thing is

Signed-off-by: Shauna Gordon <shauna@shaunagordon.com>
  • Loading branch information
ShaunaGordon committed Dec 11, 2024
1 parent 5834b2d commit 0613a70
Show file tree
Hide file tree
Showing 14 changed files with 128 additions and 96 deletions.
31 changes: 24 additions & 7 deletions public/main.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
:root {
interpolate-size: allow-keywords;
interpolate-size: allow-keywords; /* Allow transition to/from "auto" */
}

body {
Expand Down Expand Up @@ -67,19 +67,20 @@ a {
}

details {
height: 1rem;
height: 1.2rem;
padding: .5rem auto;

summary {
cursor: pointer;
}

/* @media screen and (prefers-reduced-animation: no-preference) { */
transition: all 1s;
transition: all 1s;

&[open] {
height: auto;
overflow: clip; /* Clip off contents while animating */
}
&[open] {
height: auto;
overflow: clip; /* Clip off contents while animating */
}
/* } */


Expand Down Expand Up @@ -115,6 +116,22 @@ details {
margin: 0;
opacity: .6;
}

&:not(.old) {
& + .old { /* Target the first .old card */
grid-column-start: 1;
position: relative;

&::before {
content: "Work Archive";
position: absolute;
top: -.75rem;
left: -.5rem;
font-size: 1.25rem;
opacity: .5;
}
}
}
}

.highlights {
Expand Down
2 changes: 0 additions & 2 deletions resumes/components/base.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
},
"basics": {
"name": "Shauna Gordon",
"label": "And I make things",
"summary": "I'm a problem-solver by nature and by profession. I have a natural drive to find solutions to problems spoken and unspoken. By digging down through pain points, I excel in finding the heart of issues and coming up with the best solution within the constraints of the environment.\n\nWhile I've historically specialized in PHP, I always enjoy learning new things, and have recently been neck-deep in React and Electron while at a Ruby on Rails shop, and had a lot of fun dabbling in Rust and Tauri. I've also been eyeing software architecture and program management as potential roles to grow into.",
"image": "https://resume.shaunagordon.com/img/avatar.png",
"email": "shauna@gordons.me",
"url": "https://shaunagordon.com",
Expand Down
30 changes: 15 additions & 15 deletions resumes/components/work.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
"comment": "Job history. Shouldn't change, but keeping in its own to avoid importing unnecessarily if it does.",
"work": [
{
"name": "Genome Studios",
"position": "Principal Software Engineer",
"entity": "Genome Studios",
"name": "Principal Software Engineer",
"url": "https://genomestudios.ca/",
"startDate": "2024-01",
"summary": "Helped establish a small development studio in the gaming industry by working closely with studio founder to architect and implement technical projects, including games, supplemental engine utilities, engine features and bug fixes, and others. Worked with the Open 3D Engine (O3DE) community to submit contributions back to the project.",
"description": "Helped establish a small development studio in the gaming industry by working closely with studio founder to architect and implement technical projects, including games, supplemental engine utilities, engine features and bug fixes, and others. Worked with the Open 3D Engine (O3DE) community to submit contributions back to the project.",
"highlights": [
"Provided guidance on organization and engineering direction",
"Contributed to Open 3D Engine (O3DE) open source project on behalf of the company",
Expand All @@ -31,12 +31,12 @@
}
},
{
"name": "Custom Ink",
"position": "Senior Software Engineer",
"entity": "Custom Ink",
"name": "Senior Software Engineer",
"url": "https://www.customink.com",
"startDate": "2021-12",
"endDate": "2023-12",
"summary": "Developed and maintained custom software to support the in-house printing facilities (IHP). Worked closely with management and user stakeholders to build software that met users' needs and made their work more efficient, while interfacing with the hardware used in the screenprinting and direct-to-garment (DTG, digital) printing process.",
"description": "Developed and maintained custom software to support the in-house printing facilities (IHP). Worked closely with management and user stakeholders to build software that met users' needs and made their work more efficient, while interfacing with the hardware used in the screenprinting and direct-to-garment (DTG, digital) printing process.",
"highlights": [
"Implemented changes with an impact of $650k in annual savings",
"Took ownership of software fundamental to the DTG process",
Expand All @@ -56,12 +56,12 @@
}
},
{
"name": "Proof Group",
"position": "Affiliate Software Engineer",
"entity": "Proof Group",
"name": "Affiliate Software Engineer",
"url": "https://www.proofgeist.com",
"startDate": "2018-11",
"endDate": "2021-11",
"summary": "Helped manage the custom Python/Django portions of client's FileMaker-backed web application.Create a component library system that took React, Vue, or Svelt components and created self-contained Web Components for both general web use and use inside FileMaker.",
"description": "Helped manage the custom Python/Django portions of client's FileMaker-backed web application.Create a component library system that took React, Vue, or Svelt components and created self-contained Web Components for both general web use and use inside FileMaker.",
"highlights": [
"Researched and developed a component library and build tool that could take Vue, React, or Svelt components and output self-contained, vanilla Web Components that could be used either in standard web applications, or within FileMaker's environment (which required additional processing to make all of the component's dependencies self-contained)."
],
Expand All @@ -73,11 +73,11 @@
}
},
{
"name": "Rocket Code",
"position": "Senior Backend Engineer",
"entity": "Rocket Code",
"name": "Senior Backend Engineer",
"startDate": "2016-10",
"endDate": "2018-02",
"summary": "Develop custom integrations between Shopify and other platforms using PHP. Work with front end developers to ensure proper data and data shape for front end work. Develop custom tools with PHP, Laravel, and VueJS that included Shopify integrations. Create and maintain Ruby Shopify checkout and cart scripts.",
"description": "Develop custom integrations between Shopify and other platforms using PHP. Work with front end developers to ensure proper data and data shape for front end work. Develop custom tools with PHP, Laravel, and VueJS that included Shopify integrations. Create and maintain Ruby Shopify checkout and cart scripts.",
"highlights": [
"Worked closely with Front-End Engineers to expand Shopify's capabilities",
"Built custom API-based integrations between platforms",
Expand All @@ -102,11 +102,11 @@
}
},
{
"name": "Core-Apps",
"position": "Engineer, GoExpo Division",
"entity": "Core-Apps",
"name": "Engineer, GoExpo Division",
"startDate": "2014",
"endDate": "2015",
"summary": "",
"description": "",
"tech": {
"php": "PHP",
"laravel": "Laravel",
Expand Down
12 changes: 8 additions & 4 deletions resumes/engineering.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@
"components/volunteer.json"
],
"meta": {
"version": "2.0",
"lastModified": "2024-08-30"
"version": "2.1",
"lastModified": "2024-12-10"
},
"basics": {
"label": "And I make things",
"summary": "I'm a problem-solver by nature and by profession. I have a natural drive to find solutions to problems spoken and unspoken. By digging down through pain points, I excel in finding the heart of issues and coming up with the best solution within the constraints of the environment.\n\nWhile I've historically specialized in PHP, I always enjoy learning new things, and have recently been neck-deep in React and Electron while at a Ruby on Rails shop, and had a lot of fun dabbling in Rust and Tauri. I've also been eyeing software architecture and program management as potential roles to grow into."
},
"projects": [
{
Expand Down Expand Up @@ -72,7 +76,7 @@
{
"name": "Auto Cart Builder",
"entity":"Custom Ink",
"description": "I wrote the new algorithm for prioritizing orders in the screenprinting process and as part of a team, overhauled the process for 20% increase in efficiency, a significant increase in our \"delivered error-free, on-time\" metrics, and near-elimination of facility-created \"rush\" orders.<br>The new process selected orders to batch together on a cart based on numerous factors, including number of screens needed, completion deadline, number of colors, and more.<br>Impact: $440k annual production cost savings",
"description": "I wrote the new algorithm for prioritizing orders in the screenprinting process and as part of a team, overhauled the process for 20% increase in efficiency, a significant increase in our \"delivered error-free, on-time\" metrics, and near-elimination of facility-created \"rush\" orders.<br>The new process selected orders to batch together on a cart based on numerous factors, including number of screens needed, completion deadline, number of colors, and more.\n\nImpact: $440k annual production cost savings",
"highlights": [
"**Impact:** 20% increase in prioritization efficiency",
"**Impact:** $440k cost savings per year",
Expand All @@ -89,7 +93,7 @@
{
"name": "Shopify-Netsuite Integration",
"entity": "Rocket Code",
"description": "I built a fully unit-tested, custom, bi-directional, ETL integration layer to allow Shopify act as the store's online storefront.<br>This layer:<ul><li>Took orders from Shopify and sent them to Netsuite for fulfillment<li>Took Netsuite's fulfillment updates and sent them to Shopify for customer updates<li>Took inventory information from Netsuite and sent it to Shopify, transforming it to allow for the automatic creation of products, variants, and collections, and with the use of tags, populate collections such that the custom storefront displayed them as single products (necessary due to the number of variants for the products)<li>Synced gift card information between Shopify and Netsuite to enable customers to use their brick-and-mortar store-created gift cards on the website</ul>",
"description": "I built a fully unit-tested, custom, bi-directional, ETL integration layer to allow Shopify act as the store's online storefront.\n\nThis layer:<ul><li>Took orders from Shopify and sent them to Netsuite for fulfillment<li>Took Netsuite's fulfillment updates and sent them to Shopify for customer updates<li>Took inventory information from Netsuite and sent it to Shopify, transforming it to allow for the automatic creation of products, variants, and collections, and with the use of tags, populate collections such that the custom storefront displayed them as single products (necessary due to the number of variants for the products)<li>Synced gift card information between Shopify and Netsuite to enable customers to use their brick-and-mortar store-created gift cards on the website</ul>",
"highlights": [
"Created robust, bidirectional ETL",
"Responsible for planning, architecture, and implementation",
Expand Down
4 changes: 2 additions & 2 deletions src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
<header-section v-if="resume.basics" :basics="resume.basics" :meta="resume.meta"></header-section>
<intro-section v-if="resume.basics" :data="resume.basics"></intro-section>

<projects-section v-if="resume.projects" :projects="resume.projects"></projects-section>

<work-section v-if="resume.work" :work="resume.work" :basics="resume.basics"></work-section>

<projects-section v-if="resume.projects" :projects="resume.projects"></projects-section>

<publications-section v-if="resume.publications" :publications="resume.publications"></publications-section>
</template>

Expand Down
32 changes: 7 additions & 25 deletions src/components/sections/Experience.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,7 @@
<p>This provides the most recent history. For a full employment history, <a :href="(getProfile('linkedin', basics.profiles)).url" target="_blank">see my LinkedIn profile</a>.</p>
</header>
<section class="cardholder">
<article v-for="(job, i) in work" class="card" :key="i">
<header>
<h3>{{ job.position }}</h3>
<h4>{{ job.name }}</h4>
<h4>{{ job.startDate }} - {{ job.endDate || 'Current' }}</h4>
</header>
<section v-if="job.tech">
<ul class="tech">
<li v-for="(t, i) in job.tech" :key="i"><i :class="getTechClass(i)"></i> {{ t }}</li>
</ul>
</section>
<section class="info" v-if="isCurrent(job.endDate)" v-html="job.summary">
</section>
<section class="highlights" v-if="job.highlights && isCurrent(job.endDate)">
<ul>
<li v-for="(item, i) in job.highlights" :key="i">{{ item }}</li>
</ul>
</section>
</article>
<WorkCard v-for="(job, i) in work" :item="job" :key="i" />
</section>
<footer>

Expand All @@ -32,13 +14,13 @@
</template>

<script setup>
import { defineProps } from 'vue';
import { useIcons } from '../../mixins/icons';
import { useProfiles } from '../../mixins/profiles';
import WorkCard from '../support/WorkCard.vue';
const { work, basics } = defineProps(['work', 'basics']);
const { getTechClass } = useIcons();
import { useDateUtils } from '../../mixins/dateUtils';
const { isCurrent } = useDateUtils();
import { useProfiles } from '../../mixins/profiles';
const { getProfile } = useProfiles();
const isCurrent = (date) => !date || Date.parse(date) >= Date.parse((new Date()).getFullYear() - 5);
const { work, basics } = defineProps(['work', 'basics']);
</script>
1 change: 0 additions & 1 deletion src/components/sections/Header.vue
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
</template>

<script setup>
import { defineProps } from 'vue';
import { useIcons } from '../../mixins/icons';
const { getFaBrandClass, getFaClass } = useIcons();
Expand Down
2 changes: 1 addition & 1 deletion src/components/sections/HireMe.vue
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export default {
}
</script>

<style>
<style scoped>
.cardholder {
grid-auto-flow: row dense;
h3 {
Expand Down
1 change: 0 additions & 1 deletion src/components/sections/Intro.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
</template>

<script setup>
import { defineProps } from 'vue';
import { useMarkdown } from '../../mixins/markdown';
const { fromMarkdown } = useMarkdown();
Expand Down
41 changes: 4 additions & 37 deletions src/components/sections/Projects.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,50 +2,17 @@
<section id="projects">
<header>
<h2>Projects</h2>
<p>Due to the nature of my primary work (both technically and legally), I rarely have the luxury of portfolio projects from my paid work. The below samples are projects that I work on in my free time, and therefore may be incomplete or self-contained samples. They should, however, provide an idea of my coding skill and style.</p>
<p>At any given point in time, I may have other projects that I can demonstrate on an individual basis, but that aren't yet publicly available. They are available upon request after we've had a discussion or two. I'm also willing to do small "take home" projects if desired.</p>
<p>Due to the nature of my primary work (both technically and legally), I rarely have the luxury of portfolio projects from my paid work. The below are descriptions of significant projects I've done at work, and samples that I've done in my spare time.</p>
<p>At any given point in time, I may have other projects that I can demonstrate on an individual basis, but that aren't yet publicly available. They are available upon request after we've had a discussion or two. I'm also willing to do certain types of interview projects if desired.</p>
</header>
<section class="cardholder">
<article v-for="(project, i) in projects" class="card" :key="i">
<header>
<h3>{{ project.name }}</h3>
<h4 v-if="project.entity">{{ project.entity }}</h4>
<h4 v-if="project.startDate">
{{ project.startDate }}
<span v-if="project.endDate"> - {{ project.endDate }}</span>
</h4>
<a :href="project.source" target="_blank" v-if="project.source"><i :class="getTechClass('git')"></i> <span>Source Code</span></a>
</header>
<section v-if="project.highlights">
<ul class="highlights">
<li v-for="(item, i) in project.highlights" :key="i" v-html="fromInlineMarkdown(item)">
</li>
</ul>
</section>
<section v-if="project.tech">
<ul class="tech">
<li v-for="(t, i) in project.tech" :key="i"><i :class="getTechClass(i)"></i> {{ t }}</li>
</ul>
</section>
<section>
<details>
<summary>More Information</summary>
<div v-html="fromMarkdown(project.description)"></div>
</details>
</section>
</article>
<WorkCard v-for="(project, i) in projects" class="card" :key="i" :item="project" />
</section>
</section>
</template>

<script setup>
import { defineProps } from 'vue';
import { useMarkdown } from '../../mixins/markdown';
import { useIcons } from '../../mixins/icons';
const { fromMarkdown, fromInlineMarkdown } = useMarkdown();
const { getTechClass } = useIcons();
import WorkCard from '../support/WorkCard.vue';
const { projects } = defineProps(['projects']);
</script>
1 change: 0 additions & 1 deletion src/components/sections/Publications.vue
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
</template>

<script setup>
import { defineProps } from 'vue';
import { useIcons } from '../../mixins/icons';
import { useMarkdown } from '../../mixins/markdown';
Expand Down
32 changes: 32 additions & 0 deletions src/components/support/WorkCard.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<template>
<article :class="classes(isCurrent(item.endDate))">
<header>
<h3>{{ item.name }}</h3>
<h4 v-if="item.entity">{{ item.entity }}</h4>
<h4 v-if="item.startDate">
{{ item.startDate }} - {{ item.endDate || 'Current' }}
</h4>
<a v-if="item.source" :href="item.source" target="_blank"><i :class="getTechClass('git')"></i> <span>Source Code</span></a>
</header>
<WorkCardBody v-if="isCurrent(item.endDate)" :item="item" />
<details v-else>
<summary>View Experience</summary>
<WorkCardBody :item="item" />
</details>
</article>
</template>

<script setup>
import WorkCardBody from './WorkCardBody.vue';
import { useDateUtils } from '../../mixins/dateUtils';
const { isCurrent } = useDateUtils();
import { useIcons } from '../../mixins/icons';
const { getTechClass } = useIcons();
const { item } = defineProps(['item']);
const classes = (current) => `card ${current ? '' : 'old'}`;
</script>
30 changes: 30 additions & 0 deletions src/components/support/WorkCardBody.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<template>
<section v-if="item.highlights">
<ul class="highlights">
<li v-for="(item, i) in item.highlights" :key="i" v-html="fromInlineMarkdown(item)">
</li>
</ul>
</section>
<section v-if="item.tech">
<ul class="tech">
<li v-for="(t, i) in item.tech" :key="i"><i :class="getTechClass(i)"></i> {{ t }}</li>
</ul>
</section>
<section v-if="item.description">
<details>
<summary v-if="item.summary" v-html="fromMarkdown(item.summary)"></summary>
<summary v-else>More Information</summary>
<div v-html="fromMarkdown(item.description)"></div>
</details>
</section>
</template>

<script setup>
import { useIcons } from '../../mixins/icons';
import { useMarkdown } from '../../mixins/markdown';
const { getTechClass } = useIcons();
const { fromMarkdown, fromInlineMarkdown } = useMarkdown();
const { item } = defineProps(['item']);
</script>
Loading

0 comments on commit 0613a70

Please sign in to comment.