LeConte deployments page complete, better auto-formatting and import sorting, new inline link, popover definitions, and paragraph components, improvements to component interfaces
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 4.1 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.1 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.8 MiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -2,4 +2,4 @@
|
||||
|
||||
---
|
||||
|
||||
<h3 class="my-4 font-bold md:text-lg">{Astro.props.text}</h3>
|
||||
<h3 class="mt-4 mb-2 font-bold md:text-lg">{Astro.props.text}</h3>
|
||||
|
||||
14
src/components/InlineLink.astro
Normal file
14
src/components/InlineLink.astro
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
interface Props {
|
||||
href: string;
|
||||
target?: string;
|
||||
}
|
||||
|
||||
const { href, target = "_blank" } = Astro.props;
|
||||
---
|
||||
|
||||
<>
|
||||
<a class="text-blue-500 hover:text-blue-300" href={href} target={target}>
|
||||
<slot />
|
||||
</a>
|
||||
</>
|
||||
@@ -1,11 +1,18 @@
|
||||
---
|
||||
interface Props {
|
||||
title: string;
|
||||
|
||||
href: string;
|
||||
target?: string;
|
||||
}
|
||||
|
||||
const { title, href, target = "_blank" } = Astro.props;
|
||||
---
|
||||
|
||||
<a
|
||||
class="text-caperren-green border-caperren-green hover:border-caperren-green-light hover:text-caperren-green-light rounded-2xl border-2 bg-black p-2"
|
||||
href={Astro.props.href}
|
||||
target={Astro.props.target || "_blank"}
|
||||
href={href}
|
||||
target={target}
|
||||
>
|
||||
{Astro.props.title}
|
||||
{title}
|
||||
</a>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import {
|
||||
Carousel,
|
||||
type CarouselItem,
|
||||
type CarouselInterface,
|
||||
type CarouselItem,
|
||||
type CarouselOptions,
|
||||
type IndicatorItem,
|
||||
Modal,
|
||||
|
||||
@@ -1,11 +1,34 @@
|
||||
---
|
||||
import { type videoConfig } from "@interfaces/video.ts";
|
||||
interface Props {
|
||||
videoPath: string;
|
||||
videoType?: string;
|
||||
|
||||
const config: videoConfig = Astro.props.videoConfig;
|
||||
console.log(config);
|
||||
controls?: boolean;
|
||||
autoPlay?: boolean;
|
||||
loop?: boolean;
|
||||
playsInline?: boolean;
|
||||
}
|
||||
|
||||
const {
|
||||
videoPath,
|
||||
videoType = "video/mp4",
|
||||
|
||||
controls = true,
|
||||
autoPlay = false,
|
||||
loop = false,
|
||||
playsInline = false,
|
||||
} = Astro.props;
|
||||
---
|
||||
|
||||
<video class="h-auto w-full max-w-1/2" controls>
|
||||
<source src={config.videoPath} type={config.videoType ?? "video/mp4"} />
|
||||
Your browser does not support the video tag.
|
||||
</video>
|
||||
<div class="mx-auto my-auto">
|
||||
<video
|
||||
class="h-auto w-full"
|
||||
controls={controls}
|
||||
autoplay={autoPlay}
|
||||
loop={loop}
|
||||
playsinline={playsInline}
|
||||
>
|
||||
<source src={videoPath} type={videoType} />
|
||||
Your browser does not support the video tag.
|
||||
</video>
|
||||
</div>
|
||||
|
||||
7
src/components/Paragraph.astro
Normal file
7
src/components/Paragraph.astro
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
<div class="">
|
||||
<slot />
|
||||
</div>
|
||||
7
src/components/Paragraphs.astro
Normal file
7
src/components/Paragraphs.astro
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
<div class="space-y-2">
|
||||
<slot />
|
||||
</div>
|
||||
43
src/components/PopoverWordDefinition.astro
Normal file
43
src/components/PopoverWordDefinition.astro
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
|
||||
const popoverUUID = uuidv4();
|
||||
|
||||
const keys: { [key: string]: string } = {
|
||||
ADCP: "Acoustic doppler current profiler",
|
||||
COTS: "Consumer off-the-shelf",
|
||||
CTD: "Conductivity, temperature, and depth sensor",
|
||||
};
|
||||
|
||||
const key: string | undefined = Astro.props.key;
|
||||
let word: string | undefined = Astro.props.word;
|
||||
let definition: string | undefined = Astro.props.definition;
|
||||
|
||||
if (key && keys.hasOwnProperty(key)) {
|
||||
word = key;
|
||||
definition = keys[key];
|
||||
}
|
||||
---
|
||||
|
||||
<>
|
||||
<a
|
||||
href="#"
|
||||
class="text-fg-brand decoration-caperren-green font-medium underline decoration-dashed hover:no-underline"
|
||||
data-popover-target={popoverUUID}>{word}</a
|
||||
>
|
||||
<div
|
||||
data-popover
|
||||
id={popoverUUID}
|
||||
role="tooltip"
|
||||
class="text-body border-caperren-green invisible absolute z-90 inline-block w-fit max-w-96 rounded-lg border border-dashed bg-black p-3 text-sm opacity-0 shadow-xs transition-opacity duration-300"
|
||||
>
|
||||
<div>
|
||||
<h3
|
||||
class="text-heading border-b-caperren-green-dark mb-1 border-b font-semibold"
|
||||
>
|
||||
{word}
|
||||
</h3>
|
||||
<p>{definition}</p>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
@@ -8,14 +8,17 @@ export const siteLayout: navLink[] = [
|
||||
path: "experience",
|
||||
children: [
|
||||
{
|
||||
enabled: false,
|
||||
navText: "SpaceX",
|
||||
path: "spacex",
|
||||
children: [
|
||||
{
|
||||
enabled: false,
|
||||
navText: "Hardware Test Engineer I/II",
|
||||
path: "hardware-test-engineer-i-ii",
|
||||
},
|
||||
{
|
||||
enabled: false,
|
||||
navText: "Avionics Test Engineering Internship",
|
||||
path: "avionics-test-engineering-internship",
|
||||
},
|
||||
@@ -26,6 +29,7 @@ export const siteLayout: navLink[] = [
|
||||
path: "osu-ceoas-ocean-mixing-group",
|
||||
children: [
|
||||
{
|
||||
enabled: false,
|
||||
navText: "Robotics Oceanographic Surface Sampler",
|
||||
path: "robotic-oceanographic-surface-sampler",
|
||||
},
|
||||
|
||||
@@ -1,15 +1,23 @@
|
||||
---
|
||||
import "@styles/global.css";
|
||||
|
||||
import Navbar from "@components/Navbar.astro";
|
||||
import Footer from "@components/Footer.astro";
|
||||
import Navbar from "@components/Navbar.astro";
|
||||
|
||||
import { pathToMetadata } from "@data/site-layout.ts";
|
||||
|
||||
interface Props {
|
||||
title?: string;
|
||||
subTitles?: string[];
|
||||
|
||||
showTitle?: boolean;
|
||||
}
|
||||
|
||||
const { title, subTitles, showTitle = true } = Astro.props;
|
||||
|
||||
const pageTitle = Astro.props.title
|
||||
? `${Astro.props.title} - Corwin Perren`
|
||||
: "Corwin Perren";
|
||||
const showTitle = Astro.props.showTitle ?? true;
|
||||
const pageEnabled = pathToMetadata(Astro.url.pathname).enabled ?? true;
|
||||
---
|
||||
|
||||
@@ -38,12 +46,31 @@ const pageEnabled = pathToMetadata(Astro.url.pathname).enabled ?? true;
|
||||
<Navbar />
|
||||
<main class="mx-6 my-6">
|
||||
{
|
||||
Astro.props.title && showTitle && pageEnabled && (
|
||||
<h1 class="font-extrabold md:mb-6 md:text-3xl">
|
||||
{Astro.props.title}
|
||||
title && showTitle && pageEnabled && (
|
||||
<h1
|
||||
class={
|
||||
"text-xl font-extrabold md:text-3xl " +
|
||||
(subTitles ? "" : "md:mb-6")
|
||||
}
|
||||
>
|
||||
{title}
|
||||
</h1>
|
||||
)
|
||||
}
|
||||
{
|
||||
showTitle &&
|
||||
pageEnabled &&
|
||||
subTitles?.map((subTitle, index) => (
|
||||
<p
|
||||
class={
|
||||
"text-sm font-bold md:text-xl " +
|
||||
(index == subTitles.length - 1 ? "mb-2 md:mb-6" : "")
|
||||
}
|
||||
>
|
||||
{subTitle}
|
||||
</p>
|
||||
))
|
||||
}
|
||||
{pageEnabled && <slot />}
|
||||
</main>
|
||||
</div>
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
import BaseLayout from "./BaseLayout.astro";
|
||||
---
|
||||
|
||||
<BaseLayout title={Astro.props.title}>
|
||||
<BaseLayout {...Astro.props}>
|
||||
<slot />
|
||||
</BaseLayout>
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
import BaseLayout from "./BaseLayout.astro";
|
||||
---
|
||||
|
||||
<BaseLayout title={Astro.props.title}>
|
||||
<BaseLayout {...Astro.props}>
|
||||
<slot />
|
||||
</BaseLayout>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
---
|
||||
import BaseLayout from "@layouts/BaseLayout.astro";
|
||||
import PdfViewer from "@components/Media/PdfViewer.astro";
|
||||
import BaseLayout from "@layouts/BaseLayout.astro";
|
||||
---
|
||||
|
||||
<BaseLayout title={Astro.props.title}>
|
||||
<BaseLayout {...Astro.props}>
|
||||
<div class="h-dvh">
|
||||
<PdfViewer class="mx-auto" pdf={Astro.props.resume} />
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
import BaseLayout from "@layouts/BaseLayout.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
import Table from "@components/Table.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
import BaseLayout from "@layouts/BaseLayout.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
import type { tableData } from "@interfaces/table.ts";
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
---
|
||||
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
||||
import H3 from "@components/CustomHtmlWrappers/H3.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
|
||||
import H2 from "@components/CustomHtmlWrappers/H2.astro";
|
||||
import H3 from "@components/CustomHtmlWrappers/H3.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import Paragraph from "@components/Paragraph.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
import { deploymentTimeline } from "./osu-ceoas-ocean-mixing-group.ts";
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
import building from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/building.jpg";
|
||||
import glacier_selfie from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/glacier-selfie.jpg";
|
||||
@@ -15,16 +18,34 @@ import iced_in from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-gla
|
||||
import pushing_icebergs from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/pushing-icebergs.jpg";
|
||||
import ross_at_terminus from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/ross-at-terminus.png";
|
||||
import ross_on_the_docks from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/ross-on-the-docks.jpg";
|
||||
import ross_steller_ice_operations from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/ross-steller-ice-operations.png";
|
||||
import steller_at_terminus from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/steller-at-terminus.png";
|
||||
import steller_in_ice_from_above from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/steller-in-ice-from-above.jpg";
|
||||
import whole_glacier from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/whole-glacier.jpg";
|
||||
import working_at_the_docks from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/working-at-the-docks.jpg";
|
||||
import working_trailer from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/working-trailer.jpg";
|
||||
|
||||
import massive_calving from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/videos/massive-calving-compressed.mp4";
|
||||
import petersburg_working_timelapse from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/videos/petersburg-working-timelapse-compressed.mp4";
|
||||
import ross_iceops from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/videos/ross-iceops-compressed.mp4";
|
||||
import ross_terminus_calving from "@assets/experience/osu-ceoas-ocean-mixing-group/leconte-glacier-deployments/videos/ross-terminus-calving-compressed.mp4";
|
||||
|
||||
const videos = [
|
||||
ross_terminus_calving,
|
||||
ross_iceops,
|
||||
massive_calving,
|
||||
petersburg_working_timelapse,
|
||||
];
|
||||
|
||||
const headerCarouselGroup: carouselGroup = {
|
||||
animation: "slide",
|
||||
images: [
|
||||
ross_at_terminus,
|
||||
ground_station,
|
||||
ross_steller_ice_operations,
|
||||
steller_at_terminus,
|
||||
steller_in_ice_from_above,
|
||||
whole_glacier,
|
||||
ground_station,
|
||||
glacier_selfie,
|
||||
iced_in,
|
||||
pushing_icebergs,
|
||||
@@ -34,12 +55,84 @@ const headerCarouselGroup: carouselGroup = {
|
||||
working_trailer,
|
||||
],
|
||||
};
|
||||
|
||||
import InlineLink from "@components/InlineLink.astro";
|
||||
import Video from "@components/Media/Video.astro";
|
||||
import Paragraphs from "@components/Paragraphs.astro";
|
||||
import PopoverWordDefinition from "@components/PopoverWordDefinition.astro";
|
||||
import { subTitles } from "./osu-ceoas-ocean-mixing-group.ts";
|
||||
---
|
||||
|
||||
<ExperienceLayout title="CEOAS - LeConte Glacier Deployments">
|
||||
<ExperienceLayout title="LeConte Glacier Deployments" subTitles={subTitles}>
|
||||
<Carousel carouselGroup={headerCarouselGroup} />
|
||||
<H2 text="Summary" />
|
||||
<H3 text="Timeline" />
|
||||
<Timeline timeline={deploymentTimeline} />
|
||||
<H3 text="Details" />
|
||||
<H3 text="Location" />
|
||||
<iframe
|
||||
class="w-full"
|
||||
width="600"
|
||||
height="450"
|
||||
src="https://maps.google.com/maps?q=leconte%20glacier&t=k&z=11&ie=UTF8&iwloc=B&output=embed"
|
||||
></iframe>
|
||||
<H2 text="Details" />
|
||||
<Paragraphs>
|
||||
<Paragraph>
|
||||
As part of my time working on the
|
||||
<InlineLink
|
||||
href="/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler"
|
||||
>
|
||||
Robotic Oceanographic Surface Sampler</InlineLink
|
||||
>, I had the fantastic opportunity to be deployed at the LeConte Glacier
|
||||
in Alaska! This started in early 2017 with setup and ocean trials in
|
||||
nearby Petersburg. The team had sent multiple shipping containers with our
|
||||
robotic platforms and most equipment to assemble, test, and debug them a
|
||||
few months prior, allowing us to get to work the moment we arrived. We
|
||||
spent multiple weeks at the docks with our makeshift workstations built
|
||||
from plywood and pelican cases, validating the hardware we'd sent, and
|
||||
making adjustments with improved hardware we'd hand-carried on our
|
||||
flights. This also provided a great opportunity to work out any final
|
||||
firmware and/or software bugs while the vehicles were still relatively
|
||||
easy to retrieve. After a short trip back home to recover, and prep any
|
||||
last minute items we'd forgotten, our research team flew back and headed
|
||||
for the glacier!
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
The towering mountain of ice sits roughly 30 miles from Petersburg, so
|
||||
we'd commissioned an off-season fishing vessel, Steller, and it's crew, to
|
||||
take us as close to it as was reasonably safe. The team worked 24 hours a
|
||||
day, on two shifts, deploying and retrieving the ROSS platforms,
|
||||
performing repairs (as needed), recovering/processing collected data,
|
||||
manually deploying the ship's <PopoverWordDefinition key="CTD" />, and
|
||||
occasionally spending considerable time pushing icebergs the size of
|
||||
houses away from an <PopoverWordDefinition key="ADCP" /> mounted to Steller
|
||||
using fiberglass poles. Many hardware failures had to be solved during these
|
||||
long days, and it was a very rewarding and creative experience to work around
|
||||
the limitations of this isolated (and salty) environment.
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
On top of being a unique engineering and team building experience, LeConte
|
||||
lives among the most beautiful places I've yet to experience in this life.
|
||||
There's something special about being somewhere so incredibly remote and
|
||||
untouched by humans. The pristine evergreen forests, eerie blue-green hues
|
||||
of the glacier and icebergs, ancient towering mountains, and genuinely
|
||||
curious looks from local land and marine life unfamiliar with human
|
||||
presence made it humbly clear that for once we as humans were the odd
|
||||
ones out. These trips were ones that I will treasure and think back on
|
||||
fondly on for the rest of my life.
|
||||
</Paragraph>
|
||||
</Paragraphs>
|
||||
<H2 text="Videos" />
|
||||
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||
{
|
||||
videos.map((video) => (
|
||||
<Video
|
||||
videoPath={video}
|
||||
autoPlay={true}
|
||||
loop={true}
|
||||
playsInline={true}
|
||||
/>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</ExperienceLayout>
|
||||
|
||||
@@ -22,3 +22,8 @@ export const deploymentTimeline: timelineEntry[] = [
|
||||
date: "September 2017",
|
||||
},
|
||||
];
|
||||
|
||||
export const subTitles = [
|
||||
"Oregon State University",
|
||||
"College of Earth, Ocean, and Atmospheric Sciences",
|
||||
];
|
||||
|
||||
@@ -1,26 +1,29 @@
|
||||
---
|
||||
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
||||
|
||||
import H2 from "@components/CustomHtmlWrappers/H2.astro";
|
||||
import H3 from "@components/CustomHtmlWrappers/H3.astro";
|
||||
import LinkButton from "@components/LinkButton.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import PdfViewer from "@components/Media/PdfViewer.astro";
|
||||
import PopoverWordDefinition from "@components/PopoverWordDefinition.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
import type { timelineEntry } from "@interfaces/timeline.ts";
|
||||
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import H2 from "@components/CustomHtmlWrappers/H2.astro";
|
||||
import H3 from "@components/CustomHtmlWrappers/H3.astro";
|
||||
import LinkButton from "@components/LinkButton.astro";
|
||||
import PdfViewer from "@components/Media/PdfViewer.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
|
||||
import publication from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/ross-publication.pdf";
|
||||
|
||||
import electronics_box from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/electronics-box.jpg";
|
||||
import jet_drive from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/jet-drive.jpg";
|
||||
import ross_on_vessel from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/ross-on-vessel.jpg";
|
||||
import ross_on_vessel_at_night from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/ross-on-vessel-at-night.jpg";
|
||||
import ross_on_vessel from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/ross-on-vessel.jpg";
|
||||
import publication from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/ross-publication.pdf";
|
||||
import ross_team from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/ross-team.jpg";
|
||||
import ui from "@assets/experience/osu-ceoas-ocean-mixing-group/robotic-oceanographic-surface-sampler/ui.jpg";
|
||||
|
||||
import { deploymentTimeline } from "./osu-ceoas-ocean-mixing-group.ts";
|
||||
import {
|
||||
deploymentTimeline,
|
||||
subTitles,
|
||||
} from "./osu-ceoas-ocean-mixing-group.ts";
|
||||
|
||||
const headerCarouselGroup: carouselGroup = {
|
||||
animation: "slide",
|
||||
@@ -49,7 +52,10 @@ const timeline: timelineEntry[] = [
|
||||
];
|
||||
---
|
||||
|
||||
<ExperienceLayout title="CEOAS - Robotic Oceanographic Surface Sampler">
|
||||
<ExperienceLayout
|
||||
title="Robotic Oceanographic Surface Sampler"
|
||||
subTitles={subTitles}
|
||||
>
|
||||
<Carousel carouselGroup={headerCarouselGroup} />
|
||||
<div class="mt-4 flex items-center justify-center">
|
||||
<LinkButton
|
||||
@@ -62,7 +68,13 @@ const timeline: timelineEntry[] = [
|
||||
<Timeline timeline={timeline} />
|
||||
<H3 text="Key Takeaways" />
|
||||
<ul class="list-inside list-disc">
|
||||
<li>One</li>
|
||||
<li>
|
||||
<div class="inline-block">
|
||||
Assembled, fabricated, and debugged both custom and
|
||||
<PopoverWordDefinition key="COTS" />
|
||||
hardware and electronics.
|
||||
</div>
|
||||
</li>
|
||||
<li>Two</li>
|
||||
<li>Three</li>
|
||||
</ul>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
---
|
||||
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
import YtVideo from "@components/Media/YtVideo.astro";
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
import type { videoConfig } from "@interfaces/video.ts";
|
||||
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
||||
|
||||
const headerCarouselGroup: carouselGroup = {
|
||||
animation: "slide",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
||||
|
||||
import spring_2019_interns from "@assets/experience/spacex/avionics-test-engineering-internship/spring-2019-interns.jpg";
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import Timeline from "@components/Timeline/Timeline.astro";
|
||||
import ExperienceLayout from "@layouts/ExperienceLayout.astro";
|
||||
|
||||
import starlink_headquarters_selfie from "@assets/experience/spacex/hardware-test-engineer-i-ii/starlink-headquarters-selfie.jpg";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
---
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
import enclosure_front from "@assets/hobby/homelab/offsite-backup-rack/enclosure-front.jpg";
|
||||
import enclosure_front_pc_panel_open from "@assets/hobby/homelab/offsite-backup-rack/enclosure-front-pc-panel-open.jpg";
|
||||
import enclosure_front from "@assets/hobby/homelab/offsite-backup-rack/enclosure-front.jpg";
|
||||
import enclosure_left from "@assets/hobby/homelab/offsite-backup-rack/enclosure-left.jpg";
|
||||
import enclosure_rear from "@assets/hobby/homelab/offsite-backup-rack/enclosure-rear.jpg";
|
||||
import enclosure_right from "@assets/hobby/homelab/offsite-backup-rack/enclosure-right.jpg";
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
---
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
import LinkButton from "@components/LinkButton.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
import bottom_fasteners_installed from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/bottom-fasteners-installed.jpg";
|
||||
import closed_seam from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/closed-seam.jpg";
|
||||
import closed_top_buttons_installed from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/closed-top-buttons-installed.jpg";
|
||||
import inside_top_and_bottom from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/inside-top-and-bottom.jpg";
|
||||
import inside_top_and_bottom_buttons_installed from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/inside-top-and-bottom-buttons-installed.jpg";
|
||||
import inside_top_and_bottom_with_buttons from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/inside-top-and-bottom-with-buttons.jpg";
|
||||
import inside_top_and_bottom from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/inside-top-and-bottom.jpg";
|
||||
import installed_on_bike_handlebars_reference from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/installed-on-bike-handlebars-reference.jpg";
|
||||
import installed_on_bike_riders_position from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/installed-on-bike-riders-position.jpg";
|
||||
import top_and_bottom from "@assets/hobby/motorcycling/custom-accessories/chubby-buttons-2-mount/top-and-bottom.jpg";
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
---
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import HobbyLayout from "@layouts/HobbyLayout.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
import kz750 from "@assets/hobby/motorcycling/lineup/1979-kawasaki-kz750-senior-photo.jpg";
|
||||
import ninja600 from "@assets/hobby/motorcycling/lineup/1991-kawasaki-ninja-600r.jpg";
|
||||
import concours from "@assets/hobby/motorcycling/lineup/1999-kawasaki-concours.jpg";
|
||||
import concours_offroad from "@assets/hobby/motorcycling/lineup/1999-kawasaki-concours-offroad.jpg";
|
||||
import concours_trailer from "@assets/hobby/motorcycling/lineup/1999-kawasaki-concours-with-trailer.jpg";
|
||||
import concours from "@assets/hobby/motorcycling/lineup/1999-kawasaki-concours.jpg";
|
||||
import drz400 from "@assets/hobby/motorcycling/lineup/2005-suzuki-drz-400.jpg";
|
||||
import fjr1300 from "@assets/hobby/motorcycling/lineup/2015-fjr-1300-mountaintop.jpg";
|
||||
import sg400 from "@assets/hobby/motorcycling/lineup/2021-csc-sg400.jpg";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
|
||||
import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
|
||||
import type { carouselGroup } from "@interfaces/image-carousel.ts";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
import ResumeLayout from "@layouts/ResumeLayout.astro";
|
||||
import resume from "@assets/resume/corwin_perren_2019-07-01_hardware_test_engineer.pdf";
|
||||
import ResumeLayout from "@layouts/ResumeLayout.astro";
|
||||
---
|
||||
|
||||
<ResumeLayout title="2019-07-01 - Hardware Test Engineer" resume={resume} />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
import ResumeLayout from "@layouts/ResumeLayout.astro";
|
||||
import resume from "@assets/resume/corwin_perren_2025-10-27-infrastructure_engineer.pdf";
|
||||
import ResumeLayout from "@layouts/ResumeLayout.astro";
|
||||
---
|
||||
|
||||
<ResumeLayout title="2025-10-27 - Infrastructure Engineer" resume={resume} />
|
||||
|
||||
Reference in New Issue
Block a user