Compare commits

..

17 Commits

Author SHA1 Message Date
6ff2249955 Added won 1st to mars rover
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 6m36s
Build and Test - Staging / build_and_push (pull_request) Successful in 5m14s
Build and Test - Staging / deploy_staging (pull_request) Successful in 2s
2025-12-17 20:23:44 -08:00
ec6cfba9ba Content for mars rover software lead and embryo pick and plate, small padding tweak to printed circuit board notes
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 6m24s
Build and Test - Staging / build_and_push (pull_request) Successful in 5m23s
Build and Test - Staging / deploy_staging (pull_request) Successful in 2s
2025-12-17 20:05:12 -08:00
22b6a06b32 Added media for embryo pick and plate, including pcbs, made tweaks to pcb astro component for title and description, new H4 component, enabled zebrafish pnp and mars rover software team pages 2025-12-17 17:37:44 -08:00
dac9e80efd Fix unit tests for placeholder site-layout entries
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 5m26s
Build and Test - Staging / build_and_push (pull_request) Successful in 4m16s
Build and Test - Staging / deploy_staging (pull_request) Successful in 3s
2025-12-12 23:05:47 -08:00
8fd744118f Component for PCBs, many visual tweaks, finished dechorionator content, added many many photos, started work on mars rover software lead, timeline to luxon and automatic date-based ordering
Some checks failed
Build and Test - Staging / test (pull_request) Failing after 4m56s
Build and Test - Staging / build_and_push (pull_request) Has been skipped
Build and Test - Staging / deploy_staging (pull_request) Has been skipped
2025-12-12 22:48:03 -08:00
adcbce68c8 Fix site layout formatting
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 4m16s
Build and Test - Staging / build_and_push (pull_request) Successful in 3m22s
Build and Test - Staging / deploy_staging (pull_request) Successful in 3s
2025-12-11 17:18:09 -08:00
33fbbe96b3 Temporarily disable mars rover software lead for deploy
Some checks failed
Build and Test - Staging / test (pull_request) Failing after 1m56s
Build and Test - Staging / build_and_push (pull_request) Has been skipped
Build and Test - Staging / deploy_staging (pull_request) Has been skipped
2025-12-11 17:11:51 -08:00
076618784a Lots of media for mars rover software lead, yt video grid now working, small fixes to import orders and extra photos
Some checks failed
Build and Test - Staging / build_and_push (pull_request) Has been cancelled
Build and Test - Staging / deploy_staging (pull_request) Has been cancelled
Build and Test - Staging / test (pull_request) Has been cancelled
2025-12-11 17:07:42 -08:00
91ce9aa6c6 Fixes for hardware test engineer page
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 4m32s
Build and Test - Staging / build_and_push (pull_request) Successful in 2m55s
Build and Test - Staging / deploy_staging (pull_request) Successful in 2s
2025-12-11 15:29:53 -08:00
52eac520e8 Added core content for hardware test engineer page
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 4m13s
Build and Test - Staging / build_and_push (pull_request) Successful in 3m0s
Build and Test - Staging / deploy_staging (pull_request) Successful in 3s
2025-12-11 14:44:16 -08:00
2583e4e99b Update production with local build changes
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 4m3s
Build and Test - Staging / build_and_push (pull_request) Successful in 2m57s
Build and Test - Staging / deploy_staging (pull_request) Successful in 2s
2025-12-11 12:14:34 -08:00
1b1db88a2a Buildkit for docker add local insecure registry
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 4m29s
Build and Test - Staging / build_and_push (pull_request) Successful in 2m57s
Build and Test - Staging / deploy_staging (pull_request) Successful in 2s
2025-12-11 11:56:39 -08:00
028637fdd3 Round two, trying local gitea actions
Some checks failed
Build and Test - Staging / test (pull_request) Successful in 5m1s
Build and Test - Staging / build_and_push (pull_request) Failing after 4m45s
Build and Test - Staging / deploy_staging (pull_request) Successful in 2s
2025-12-11 11:38:42 -08:00
649b596c7c Added this website as content to hobbies, refactored some items into site-layout
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 5m6s
Build and Test - Staging / build_and_push (pull_request) Successful in 5m14s
Build and Test - Staging / deploy_staging (pull_request) Successful in 3s
2025-12-10 16:59:54 -08:00
25c08f7a1d Fixed extra padding in dropdowns for some entries in navbar
All checks were successful
Build and Test - Staging / test (pull_request) Successful in 4m41s
Build and Test - Staging / build_and_push (pull_request) Successful in 5m19s
Build and Test - Staging / deploy_staging (pull_request) Successful in 3s
2025-12-10 14:34:57 -08:00
c320190a8d Finished avionics test engineering internship
Some checks failed
Build and Test - Staging / test (pull_request) Successful in 4m49s
Build and Test - Staging / deploy_staging (pull_request) Has been cancelled
Build and Test - Staging / build_and_push (pull_request) Has been cancelled
2025-12-10 14:28:59 -08:00
e17d28914e Inc to corp on Resume for SpaceX 2025-12-10 13:48:22 -08:00
128 changed files with 2142 additions and 516 deletions

View File

@@ -57,12 +57,16 @@ jobs:
- name: Login to Docker Registry - name: Login to Docker Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: gitea.perren.cloud registry: 192.168.1.36:30008
username: ${{ secrets.REGISTRY_USERNAME }} username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.ACTIONS_TOKEN }} password: ${{ secrets.ACTIONS_TOKEN }}
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
with:
buildkitd-config-inline: |
[registry."192.168.1.36:30008"]
http = true
- name: Build and Push - name: Build and Push
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
@@ -70,8 +74,8 @@ jobs:
context: caperren-com context: caperren-com
push: true push: true
tags: | tags: |
gitea.perren.cloud/caperren/${{ needs.test.outputs.repo_name }}:${{ needs.test.outputs.repo_version_hash }} 192.168.1.36:30008/caperren/${{ needs.test.outputs.repo_name }}:${{ needs.test.outputs.repo_version_hash }}
gitea.perren.cloud/caperren/caperren-com:latest 192.168.1.36:30008/caperren/caperren-com:latest
build-args: | build-args: |
REPO_VERSION_HASH=${{ needs.test.outputs.repo_version_hash }} REPO_VERSION_HASH=${{ needs.test.outputs.repo_version_hash }}
BUILD_ENVIRONMENT=production BUILD_ENVIRONMENT=production

View File

@@ -57,12 +57,16 @@ jobs:
- name: Login to Docker Registry - name: Login to Docker Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: gitea.perren.cloud registry: 192.168.1.36:30008
username: ${{ secrets.REGISTRY_USERNAME }} username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.ACTIONS_TOKEN }} password: ${{ secrets.ACTIONS_TOKEN }}
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
with:
buildkitd-config-inline: |
[registry."192.168.1.36:30008"]
http = true
- name: Build and Push - name: Build and Push
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
@@ -70,7 +74,7 @@ jobs:
context: caperren-com context: caperren-com
push: true push: true
tags: | tags: |
gitea.perren.cloud/caperren/caperren-com:latest-staging 192.168.1.36:30008/caperren/caperren-com:latest-staging
build-args: | build-args: |
REPO_VERSION_HASH=${{ needs.test.outputs.repo_version_hash }} REPO_VERSION_HASH=${{ needs.test.outputs.repo_version_hash }}
BUILD_ENVIRONMENT=staging BUILD_ENVIRONMENT=staging

View File

@@ -15,7 +15,8 @@
cleanup-check \ cleanup-check \
cleanup-code \ cleanup-code \
convert_video \ convert_video \
convert_video_times convert_video_times \
generate_asset_imports
default: dev default: dev
@@ -83,9 +84,17 @@ convert_video_times:
-init_hw_device vaapi=va:/dev/dri/renderD128 \ -init_hw_device vaapi=va:/dev/dri/renderD128 \
-filter_hw_device va \ -filter_hw_device va \
-i $(input) \ -i $(input) \
-vf 'format=nv12,hwupload,scale_vaapi=-2:720,trim=start=$(start):end=$(end)' \ -ss $(start) \
-to $(end) \
-vf 'format=nv12,hwupload,scale_vaapi=-2:720' \
-c:v h264_vaapi \ -c:v h264_vaapi \
-rc_mode CQP \ -rc_mode CQP \
-qp 28 \ -qp 28 \
-an \ -an \
$(output) $(output)
generate_asset_imports:
@for assets_path in `find "src/assets/${assets_relative_path}" -maxdepth 1 -type f -printf "%f\n"`; do \
without_extension=$${assets_path/%.*}; \
echo "import $${without_extension//-/_} from \"@assets/${assets_relative_path}/$$assets_path\";"; \
done;

View File

@@ -3,7 +3,10 @@ Altium
ASSEM ASSEM
astrojs astrojs
Atmel Atmel
automations
barebones barebones
beaglebone
Bitwarden
Candian Candian
caperren caperren
CEOAS CEOAS
@@ -12,10 +15,20 @@ Concours
CONSERV CONSERV
Corwin Corwin
dangerousthings dangerousthings
dechorionation
Dechorionator Dechorionator
dechorionators
dockerization
dockerizing
drumheller
ebox ebox
ELMI
fhhs fhhs
flowbite flowbite
flowrate
gcode
gerbers
Gitea
HDFS HDFS
headshot headshot
Homelab Homelab
@@ -24,36 +37,60 @@ iceops
ITAR ITAR
Jetson Jetson
KFSK KFSK
Labjack
leconte leconte
Loctite Loctite
luxon luxon
MGMT MGMT
microcontroller
microcontroller's
Micropumps
Millis
modbus
Mokai Mokai
Multimeters Multimeters
nixos nixos
nvme
offroad offroad
Onshape Onshape
OSSM OSSM
OSURC OSURC
panelized
Passthroughs
pcbs
Perren Perren
Perren's Perren's
Pixhawk Pixhawk
Protocase
pubpath pubpath
RFID RFID
Rito
RSSI RSSI
SARL SARL
SCARA
showerheads
Shuttlebox Shuttlebox
simplemotion
sinnhuber sinnhuber
sitemapindex sitemapindex
Smartsheet
solderable
ssds ssds
Starlink Starlink
steller steller
Steller Steller
Tanguay
Teamcenter
timelapse timelapse
touchoff
triaging
trivago trivago
Truong
Ubiquiti
Unstow Unstow
uuidv uuidv
vaapi vaapi
vitest vitest
Waterjet
Zebrafish Zebrafish
zscan zscan

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

View File

Before

Width:  |  Height:  |  Size: 2.7 MiB

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1017 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

Before

Width:  |  Height:  |  Size: 2.4 MiB

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

@@ -1,10 +1,23 @@
--- ---
import InlineLink from "@components/InlineLink.astro";
const { pathname } = Astro.url;
--- ---
<footer <footer
class="border-t-caperren-green-dark text-caperren-green-dark z-50 flex w-full max-w-full items-center justify-between border-t bg-black px-6 py-2 text-sm" class="border-t-caperren-green-dark text-caperren-green-dark z-50 flex w-full max-w-full items-center justify-between border-t bg-black px-6 py-2 text-sm"
> >
<span>{import.meta.env.PUBLIC_BUILD_ENVIRONMENT || "development"}</span> <span>{import.meta.env.PUBLIC_BUILD_ENVIRONMENT || "development"}</span>
<div>
<InlineLink
class:list={[
"text-caperren-green-dark hover:text-caperren-green",
pathname === "/hobby/this-website"
? "border-caperren-green-dark hover:border-caperren-green border-b-2"
: false,
]}
href="/hobby/this-website">About This Website</InlineLink
>
</div>
<span>{import.meta.env.PUBLIC_REPO_VERSION_HASH || "invalid"}</span> <span>{import.meta.env.PUBLIC_REPO_VERSION_HASH || "invalid"}</span>
</footer> </footer>

5
src/components/H4.astro Normal file
View File

@@ -0,0 +1,5 @@
---
---
<h4 class="md:text-md text-xs sm:text-sm"><slot /></h4>

View File

@@ -7,16 +7,10 @@ interface Props extends ComponentPropsBase {
} }
const { class: className, href, target } = Astro.props; const { class: className, href, target } = Astro.props;
const { pathname } = Astro.url;
let finalTarget: string | undefined = target; const finalTarget =
target === undefined ? (href.startsWith("/") ? undefined : "_blank") : target;
if (target === undefined) {
if (href.startsWith("/")) {
finalTarget = "";
} else {
finalTarget = "_blank";
}
}
--- ---
<> <>
@@ -24,6 +18,7 @@ if (target === undefined) {
class:list={["text-blue-500", "hover:text-blue-300", className]} class:list={["text-blue-500", "hover:text-blue-300", className]}
href={href} href={href}
target={finalTarget} target={finalTarget}
aria-current={pathname === href ? "page" : undefined}
> >
<slot /> <slot />
</a> </a>

View File

@@ -1,15 +1,21 @@
--- ---
import { Image } from "astro:assets"; import { Image } from "astro:assets";
import type { ComponentPropsBase } from "@interfaces/components.ts";
import type { carouselGroup } from "@interfaces/image-carousel.ts"; import type { carouselGroup } from "@interfaces/image-carousel.ts";
const groupToShow: carouselGroup = Astro.props.carouselGroup; interface Props extends ComponentPropsBase {
carouselGroup: carouselGroup;
showBorder?: boolean;
}
const { class: className, carouselGroup, showBorder = true } = Astro.props;
--- ---
<custom-carousel <custom-carousel
class="relative flex w-full flex-col" class="relative flex w-full flex-col"
data-custom-carousel={groupToShow.animation} data-custom-carousel={carouselGroup.animation ?? "slide"}
data-custom-carousel-interval={groupToShow.interval} data-custom-carousel-interval={carouselGroup.interval}
> >
<!-- Modal for fullscreen viewing --> <!-- Modal for fullscreen viewing -->
<div <div
@@ -57,54 +63,63 @@ const groupToShow: carouselGroup = Astro.props.carouselGroup;
</div> </div>
<!-- Carousel wrapper --> <!-- Carousel wrapper -->
<div class="relative h-56 w-full overflow-hidden md:h-120"> <div
class:list={[
"relative h-56 w-full overflow-hidden rounded-lg md:h-120",
showBorder ? "border" : false,
className ? className : "border-caperren-green-dark",
]}
>
{ {
groupToShow.images.map((image, index) => ( carouselGroup.images &&
<div carouselGroup.images.map((image, index) => (
class="hidden duration-1500 ease-in-out" <div
data-custom-carousel-item={index} class="hidden bg-black duration-1500 ease-in-out"
> data-custom-carousel-item={index}
<Image >
src={image} <Image
class="absolute inset-0 m-auto h-full max-h-full w-auto max-w-full object-contain" src={image}
alt="..." class="absolute inset-0 m-auto h-full max-h-full w-auto max-w-full object-contain"
layout="constrained" alt="..."
loading="eager" layout="constrained"
/> loading="eager"
</div> />
)) </div>
))
} }
</div> </div>
<!-- Slider indicators --> <!-- Slider indicators -->
{ {
groupToShow.images.length > 1 && ( carouselGroup.images && carouselGroup.images.length > 1 && (
<div> <div>
<div class="absolute bottom-2 left-1/2 z-30 flex -translate-x-1/2 space-x-3 rounded-full"> <div class="absolute bottom-2 left-1/2 z-30 flex -translate-x-1/2 space-x-3 rounded-full">
{groupToShow.images.map((_, index) => ( {carouselGroup.images &&
<button carouselGroup.images.map((_, index) => (
type="button" <button
class="hover:bg-caperren-green-light h-3 w-3 rounded-full bg-black" type="button"
aria-current={index ? "false" : "true"} class="hover:bg-caperren-green-light h-3 w-3 rounded-full"
aria-label={index.toString()} aria-current={index ? "false" : "true"}
data-custom-carousel-slide-to={index} aria-label={index.toString()}
/> data-custom-carousel-slide-to={index}
))} />
))}
</div> </div>
<button <button
type="button" type="button"
class="group absolute start-0 top-0 z-30 flex h-full cursor-pointer items-center justify-center px-4 focus:outline-none" class="group absolute start-0 top-0 z-30 flex h-full cursor-pointer items-center justify-center px-4 focus:outline-none"
data-custom-carousel-prev data-custom-carousel-prev
> >
<span class="ring-caperren-green/25 inline-flex h-10 w-10 items-center justify-center rounded-full bg-black/25 ring-2 group-hover:bg-black/75"> <span class="ring-caperren-green/35 group-hover:ring-caperren-green inline-flex h-10 w-10 items-center justify-center rounded-full bg-black/35 ring-2 group-hover:bg-black/75">
<svg <svg
class="text-caperren-green group-hover:text-caperren-green-light h-4 w-4" class="text-caperren-green stroke-caperren-green group-hover:text-caperren-green-light h-4 w-4"
aria-hidden="true" aria-hidden="true"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 6 10" viewBox="0 0 8 10"
> >
<path <path
stroke="currentColor" stroke="currentColor"
fill-opacity="0%"
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
stroke-width="2" stroke-width="2"
@@ -119,15 +134,16 @@ const groupToShow: carouselGroup = Astro.props.carouselGroup;
class="group absolute end-0 top-0 z-30 flex h-full cursor-pointer items-center justify-center px-4 focus:outline-none" class="group absolute end-0 top-0 z-30 flex h-full cursor-pointer items-center justify-center px-4 focus:outline-none"
data-custom-carousel-next data-custom-carousel-next
> >
<span class="ring-caperren-green/25 inline-flex h-10 w-10 items-center justify-center rounded-full bg-black/25 ring-2 group-hover:bg-black/75"> <span class="ring-caperren-green/25 group-hover:ring-caperren-green inline-flex h-10 w-10 items-center justify-center rounded-full bg-black/25 ring-2 group-hover:bg-black/75">
<svg <svg
class="text-caperren-green group-hover:text-caperren-green-light h-4 w-4" class="text-caperren-green stroke-caperren-green group-hover:text-caperren-green-light h-4 w-4"
aria-hidden="true" aria-hidden="true"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 6 10" viewBox="0 0 4 10"
> >
<path <path
stroke="currentColor" stroke="currentColor"
fill-opacity="0%"
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
stroke-width="2" stroke-width="2"

View File

@@ -22,7 +22,7 @@ const {
<div class="mx-auto my-auto"> <div class="mx-auto my-auto">
<video <video
class="h-auto w-full" class="border-caperren-green-dark h-auto w-full rounded-lg border"
controls={controls} controls={controls}
autoplay={autoPlay} autoplay={autoPlay}
loop={loop} loop={loop}

View File

@@ -1,13 +1,26 @@
--- ---
import type { videoConfig } from "@interfaces/video.ts"; import type { videoConfig } from "@interfaces/video.ts";
const config: videoConfig = Astro.props.videoConfig; interface Props extends videoConfig {}
const {
videoPath,
videoTitle,
width = "1920",
height = "1080",
autoPlay = false,
} = Astro.props;
const aspect = `${width} / ${height}`;
--- ---
<iframe <div class="mx-auto my-auto w-full" style={`aspect-ratio: ${aspect};`}>
class="h-128 w-full max-w-1/2" <iframe
src={config.videoPath} src={videoPath}
title={config.videoTitle ?? ""} title={videoTitle}
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" class="border-caperren-green-dark h-full w-full rounded-lg border"
referrerpolicy="strict-origin-when-cross-origin" allow={"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; " +
allowfullscreen></iframe> (autoPlay ? "autoplay;" : "")}
referrerpolicy="strict-origin-when-cross-origin"
allowfullscreen></iframe>
</div>

View File

@@ -1,26 +1,18 @@
--- ---
import type { navLink } from "@interfaces/site-layout.ts"; import type { navLink } from "@interfaces/site-layout.ts";
import { getHrefPath, getNavLinkSuffix } from "@data/site-layout.ts";
const items: navLink[] = Astro.props.items; const items: navLink[] = Astro.props.items;
const depth: number = Astro.props.depth ?? 0; const depth: number = Astro.props.depth ?? 0;
const paths: string[] = Astro.props.paths ?? []; const paths: string[] = Astro.props.paths ?? [];
const getNavLinkSuffix = (entry: navLink): string => {
return "-" + [...paths, entry.path].join("-");
};
const getHrefPath = (entry: navLink): string => {
return entry.pubpath
? entry.pubpath
: "/" +
(paths && paths.length ? [...paths, entry.path].join("/") : entry.path);
};
const { pathname } = Astro.url; const { pathname } = Astro.url;
--- ---
<ul <ul
class:list={[ class:list={[
"border-caperren-green flex flex-col space-y-4 space-x-8 bg-black", "border-caperren-green flex flex-col space-y-4 bg-black",
depth depth
? "space-y-4 py-4" ? "space-y-4 py-4"
: "items-start lg:mt-0 lg:flex-row lg:space-y-0 lg:space-x-8", : "items-start lg:mt-0 lg:flex-row lg:space-y-0 lg:space-x-8",
@@ -29,21 +21,23 @@ const { pathname } = Astro.url;
{ {
items.map( items.map(
(entry) => (entry) =>
(entry.enabled ?? true) && ( (entry.enabled ?? true) &&
!(entry.hidden ?? false) && (
<li class=""> <li class="">
{Array.isArray(entry.children) && entry.children.length ? ( {Array.isArray(entry.children) && entry.children.length ? (
<div> <div>
<button <button
id={"dropdownNavbarLink" + getNavLinkSuffix(entry)} id={"dropdownNavbarLink" + getNavLinkSuffix(paths, entry)}
data-dropdown-toggle={ data-dropdown-toggle={
"dropdownNavbar" + getNavLinkSuffix(entry) "dropdownNavbar" + getNavLinkSuffix(paths, entry)
} }
data-dropdown-placement="bottom-start" data-dropdown-placement="bottom-start"
data-dropdown-offset-distance="5" data-dropdown-offset-distance="5"
data-dropdown-offset-skidding="12" data-dropdown-offset-skidding="12"
class:list={[ class:list={[
"hover:text-caperren-green-light lg:hover:text-caperren-green-light flex w-full items-center justify-between lg:p-0 lg:hover:bg-transparent", "hover:text-caperren-green-light lg:hover:text-caperren-green-light flex w-full items-center justify-between lg:p-0 lg:hover:bg-transparent",
pathname.startsWith(getHrefPath(entry)) pathname.startsWith(getHrefPath(paths, entry)) &&
!(entry.placeholderEntry ?? false)
? "border-caperren-green border-b-2" ? "border-caperren-green border-b-2"
: false, : false,
]} ]}
@@ -65,7 +59,7 @@ const { pathname } = Astro.url;
</svg> </svg>
</button> </button>
<div <div
id={"dropdownNavbar" + getNavLinkSuffix(entry)} id={"dropdownNavbar" + getNavLinkSuffix(paths, entry)}
class="border-caperren-green z-10 hidden w-max max-w-screen border bg-black px-6 shadow-sm" class="border-caperren-green z-10 hidden w-max max-w-screen border bg-black px-6 shadow-sm"
> >
<Astro.self <Astro.self
@@ -78,18 +72,32 @@ const { pathname } = Astro.url;
) : ( ) : (
<div> <div>
<a <a
href={getHrefPath(entry)} href={
target={getHrefPath(entry).startsWith("/") ? "" : "_blank"} !(entry.placeholderEntry ?? false)
? getHrefPath(paths, entry)
: undefined
}
target={
getHrefPath(paths, entry).startsWith("/") ? "" : "_blank"
}
class:list={[ class:list={[
"hover:text-caperren-green-light ring-caperren-green-dark block bg-transparent lg:p-0", "ring-caperren-green-dark block bg-transparent lg:p-0",
pathname === getHrefPath(entry) pathname === getHrefPath(paths, entry)
? "border-caperren-green border-b-2" ? "border-caperren-green border-b-2"
: false, : false,
entry.isSubItem ? "ms-3" : false,
entry.placeholderEntry
? false
: "hover:text-caperren-green-light",
]} ]}
aria-current={ aria-current={
pathname === getHrefPath(entry) ? "page" : undefined pathname === getHrefPath(paths, entry) &&
!(entry.placeholderEntry ?? false)
? "page"
: undefined
} }
> >
{entry.isSubItem && "∟ "}
{entry.navText} {entry.navText}
</a> </a>
</div> </div>

View File

@@ -3,7 +3,7 @@ const hasHeader = Astro.slots.has("header");
const hasDefault = Astro.slots.has("default"); const hasDefault = Astro.slots.has("default");
--- ---
<div class="grid grid-cols-1 gap-3"> <div class="grid grid-cols-1 gap-0.5">
{ {
Astro.slots.has("header") && ( Astro.slots.has("header") && (
<div> <div>

View File

@@ -7,10 +7,15 @@ const keys: { [key: string]: string } = {
ADCP: "Acoustic doppler current profiler", ADCP: "Acoustic doppler current profiler",
COTS: "Consumer off-the-shelf", COTS: "Consumer off-the-shelf",
CTD: "Conductivity, temperature, and depth sensor", CTD: "Conductivity, temperature, and depth sensor",
DUTs: "Devices under test",
GUI: "Graphical user interface", GUI: "Graphical user interface",
NUC: "A small and low-power computer made by Intel", NUC: "A small and low-power computer made by Intel",
PCBs: "Printed circuit boards", PCBs: "Printed circuit boards",
SCARA: "Selective Compliance Assembly Robot Arm",
TDD: "Test driven development",
UPS: "Uninterruptible power supply", UPS: "Uninterruptible power supply",
VISA: "Virtual instrument software architecture",
VPS: "Virtual private server",
}; };
const key: string | undefined = Astro.props.key; const key: string | undefined = Astro.props.key;
@@ -21,6 +26,12 @@ if (key && keys.hasOwnProperty(key)) {
word = key; word = key;
definition = keys[key]; definition = keys[key];
} }
if (!word || !definition) {
throw new Error(
`Popover definition is missing! Inputs were\nkey: ${key}\nword: ${word}\ndefinition: ${definition}`,
);
}
--- ---
<> <>

View File

@@ -0,0 +1,58 @@
---
import Carousel from "@components/Media/CustomCarousel/CustomCarousel.astro";
import Ul from "@components/Ul.astro";
import H3 from "@components/H3.astro";
import H4 from "@components/H4.astro";
import PageGroup from "@components/PageGroup.astro";
import type {
printedCircuitBoard,
printedCircuitBoardRevision,
} from "@interfaces/printed-circuit-board.ts";
interface Props {
pcb: printedCircuitBoard;
}
const { pcb } = Astro.props;
const semanticPcbRevisionSort = (
a: printedCircuitBoardRevision,
b: printedCircuitBoardRevision,
): number =>
-((a.major - b.major) * 100 + (a.minor - b.minor) * 10 + (a.patch - b.patch));
---
<PageGroup>
<Fragment slot="header"
><H3>{pcb.name}</H3><H4>{pcb.description}</H4></Fragment
>
<div class="mt-1 grid grid-cols-1 gap-4 md:grid-cols-2">
{
pcb.revisions?.sort(semanticPcbRevisionSort).map((revision) => (
<div class="border-caperren-green block space-y-2 rounded-lg border bg-black py-2">
<div class="border-caperren-green flex flex-wrap items-center justify-between rounded-none border-b px-4 pb-2">
<div>
<span class="font-black">Revision:</span>
<span>
{revision.major}.{revision.minor}.{revision.patch}
</span>
</div>
<div class="text-sm italic">{revision.date.toISODate()}</div>
</div>
<div class="px-4">
<Carousel
class=""
carouselGroup={{ images: revision.images }}
showBorder={false}
/>
</div>
{revision.notes && revision.notes.length > 0 && (
<div class="border-caperren-green border-t px-4 pt-4 pb-2 text-sm">
<Ul lineItems={revision.notes} />
</div>
)}
</div>
))
}
</div>
</PageGroup>

Some files were not shown because too many files have changed in this diff Show More