This commit is contained in:
Charlotte Croce 2025-05-30 20:33:42 -04:00
parent b00777828e
commit cd2e3e9f13
44 changed files with 282 additions and 1384 deletions

View file

@ -1,5 +1,6 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
output: 'export',
images: { images: {
remotePatterns: [ remotePatterns: [
{ {

1
out/404.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[492],{3632:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return o}});let l=r(5155),n=r(6395);function o(){return(0,l.jsx)(n.HTTPAccessErrorFallback,{status:404,message:"This page could not be found."})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},3868:(e,t,r)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/_not-found/page",function(){return r(3632)}])},6395:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HTTPAccessErrorFallback",{enumerable:!0,get:function(){return o}}),r(8229);let l=r(5155);r(2115);let n={error:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},desc:{display:"inline-block"},h1:{display:"inline-block",margin:"0 20px 0 0",padding:"0 23px 0 0",fontSize:24,fontWeight:500,verticalAlign:"top",lineHeight:"49px"},h2:{fontSize:14,fontWeight:400,lineHeight:"49px",margin:0}};function o(e){let{status:t,message:r}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("title",{children:t+": "+r}),(0,l.jsx)("div",{style:n.error,children:(0,l.jsxs)("div",{children:[(0,l.jsx)("style",{dangerouslySetInnerHTML:{__html:"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}),(0,l.jsx)("h1",{className:"next-error-h1",style:n.h1,children:t}),(0,l.jsx)("div",{style:n.desc,children:(0,l.jsx)("h2",{style:n.h2,children:r})})]})})]})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}},e=>{var t=t=>e(e.s=t);e.O(0,[441,684,358],()=>t(3868)),_N_E=e.O()}]);

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{2725:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,6874,23))}},e=>{var s=s=>e(e.s=s);e.O(0,[874,441,684,358],()=>s(2725)),_N_E=e.O()}]);

View file

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[736],{4441:()=>{}},_=>{var e=e=>_(_.s=e);_.O(0,[441,684,358],()=>e(4441)),_N_E=_.O()}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[358],{392:(e,s,n)=>{Promise.resolve().then(n.t.bind(n,894,23)),Promise.resolve().then(n.t.bind(n,4970,23)),Promise.resolve().then(n.t.bind(n,6614,23)),Promise.resolve().then(n.t.bind(n,6975,23)),Promise.resolve().then(n.t.bind(n,7555,23)),Promise.resolve().then(n.t.bind(n,4911,23)),Promise.resolve().then(n.t.bind(n,9665,23)),Promise.resolve().then(n.t.bind(n,1295,23))},9393:()=>{}},e=>{var s=s=>e(e.s=s);e.O(0,[441,684],()=>(s(5415),s(392))),_N_E=e.O()}]);

View file

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[636],{326:(_,n,p)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/_app",function(){return p(472)}])}},_=>{var n=n=>_(_.s=n);_.O(0,[593,792],()=>(n(326),n(4294))),_N_E=_.O()}]);

View file

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[731],{2164:(_,n,e)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return e(9341)}])}},_=>{var n=n=>_(_.s=n);_.O(0,[636,593,792],()=>n(2164)),_N_E=_.O()}]);

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
(()=>{"use strict";var e={},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}},i=!0;try{e[o](a,a.exports,r),i=!1}finally{i&&delete t[o]}return a.exports}r.m=e,(()=>{var e=[];r.O=(t,o,n,a)=>{if(o){a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[o,n,a];return}for(var u=1/0,i=0;i<e.length;i++){for(var[o,n,a]=e[i],l=!0,c=0;c<o.length;c++)(!1&a||u>=a)&&Object.keys(r.O).every(e=>r.O[e](o[c]))?o.splice(c--,1):(l=!1,a<u&&(u=a));if(l){e.splice(i--,1);var d=n();void 0!==d&&(t=d)}}return t}})(),r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;r.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);r.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var u=2&n&&o;"object"==typeof u&&!~e.indexOf(u);u=t(u))Object.getOwnPropertyNames(u).forEach(e=>i[e]=()=>o[e]);return i.default=()=>o,r.d(a,i),a}})(),r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,o)=>(r.f[o](e,t),t),[])),r.u=e=>{},r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="_N_E:";r.l=(o,n,a,i)=>{if(e[o])return void e[o].push(n);if(void 0!==a)for(var u,l,c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var f=c[d];if(f.getAttribute("src")==o||f.getAttribute("data-webpack")==t+a){u=f;break}}u||(l=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,r.nc&&u.setAttribute("nonce",r.nc),u.setAttribute("data-webpack",t+a),u.src=r.tu(o)),e[o]=[n];var s=(t,r)=>{u.onerror=u.onload=null,clearTimeout(p);var n=e[o];if(delete e[o],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(e=>e(r)),t)return t(r)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=s.bind(null,u.onerror),u.onload=s.bind(null,u.onload),l&&document.head.appendChild(u)}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:e=>e},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("nextjs#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="/_next/",(()=>{var e={68:0,690:0};r.f.j=(t,o)=>{var n=r.o(e,t)?e[t]:void 0;if(0!==n)if(n)o.push(n[2]);else if(/^6(8|90)$/.test(t))e[t]=0;else{var a=new Promise((r,o)=>n=e[t]=[r,o]);o.push(n[2]=a);var i=r.p+r.u(t),u=Error();r.l(i,o=>{if(r.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var a=o&&("load"===o.type?"missing":o.type),i=o&&o.target&&o.target.src;u.message="Loading chunk "+t+" failed.\n("+a+": "+i+")",u.name="ChunkLoadError",u.type=a,u.request=i,n[1](u)}},"chunk-"+t,t)}},r.O.j=t=>0===e[t];var t=(t,o)=>{var n,a,[i,u,l]=o,c=0;if(i.some(t=>0!==e[t])){for(n in u)r.o(u,n)&&(r.m[n]=u[n]);if(l)var d=l(r)}for(t&&t(o);c<i.length;c++)a=i[c],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(d)},o=self.webpackChunk_N_E=self.webpackChunk_N_E||[];o.forEach(t.bind(null,0)),o.push=t.bind(null,o.push.bind(o))})()})();

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
self.__BUILD_MANIFEST=function(e,r,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:3,errorRate:1e-4,numBits:58,numHashes:14,bitArray:[1,1,0,e,0,e,e,r,e,e,r,e,e,e,r,e,r,e,e,e,r,r,e,r,r,e,r,r,e,r,e,e,e,e,r,e,e,r,e,e,r,r,e,e,e,r,r,e,e,e,e,r,r,r,r,r,r,e]},__routerFilterDynamic:{numItems:r,errorRate:1e-4,numBits:r,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-cc3f077a18ea1793.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();

View file

@ -0,0 +1 @@
self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()

1
out/index.html Normal file

File diff suppressed because one or more lines are too long

22
out/index.txt Normal file
View file

@ -0,0 +1,22 @@
1:"$Sreact.fragment"
2:I[4970,[],"ClientSegmentRoot"]
3:I[4342,["874","static/chunks/874-e0b9799315dd260f.js","177","static/chunks/app/layout-71be9c42175aaa6e.js"],"default"]
4:I[7555,[],""]
5:I[1295,[],""]
7:I[6874,["874","static/chunks/874-e0b9799315dd260f.js","974","static/chunks/app/page-346d0e5d4ca34bce.js"],""]
8:I[9665,[],"MetadataBoundary"]
a:I[9665,[],"OutletBoundary"]
d:I[4911,[],"AsyncMetadataOutlet"]
f:I[9665,[],"ViewportBoundary"]
11:I[6614,[],""]
:HL["/_next/static/css/a649fa2a92f52e5f.css","style"]
0:{"P":null,"b":"lDCEoNMJMABuG1DoKP_rd","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/a649fa2a92f52e5f.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","$L2",null,{"Component":"$3","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@6"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","div",null,{"className":"container","children":[["$","section",null,{"className":"intro","children":[["$","h1",null,{"children":"Hi! I'm Charlotte"}],["$","h2",null,{"children":"About Me"}],["$","p",null,{"children":"I'm a cybersecurity student from the Northeast USA. I currently work as a security engineer at the Leahy Center in Burlington, VT."}],["$","p",null,{"children":["Most of my coding projects are hosted on my Forgejo server at ",["$","a",null,{"href":"https://git.charlotte.sh/","target":"_blank","rel":"noopener noreferrer","children":"git.charlotte.sh"}]]}],["$","p",null,{"children":["Hiring? you can find my resume ",["$","$L7",null,{"href":"/resume","children":"here"}]]}]]}],["$","section",null,{"className":"projects","children":[["$","h2",null,{"children":"My Projects"}],["$","div",null,{"className":"project-grid","children":[["$","article","champlain-tech-journals",{"className":"project","children":[["$","h3",null,{"children":"Champlain Tech Journals"}],["$","p",null,{"children":"Notes, code, and lab write-ups from my Champlain College courses"}],["$","a",null,{"href":"https://git.charlotte.sh/lotte/ChamplainTechJournals","target":"_blank","rel":"noopener noreferrer","children":["Source Code",["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-external-link icon-small","aria-hidden":"true","children":[["$","path","1q9fwt",{"d":"M15 3h6v6"}],["$","path","gplh6r",{"d":"M10 14 21 3"}],["$","path","a6xqqp",{"d":"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}],"$undefined"]}],["$","span",null,{"className":"visually-hidden","children":"(opens in new tab)"}]]}]]}]]}]]}]]}],["$","$L8",null,{"children":"$L9"}],null,["$","$La",null,{"children":["$Lb","$Lc",["$","$Ld",null,{"promise":"$@e"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","c9cwUGiKwyP-6GDPYsJsj",{"children":[["$","$Lf",null,{"children":"$L10"}],null]}],null]}],false]],"m":"$undefined","G":["$11","$undefined"],"s":false,"S":true}
12:"$Sreact.suspense"
13:I[4911,[],"AsyncMetadata"]
6:{}
9:["$","$12",null,{"fallback":null,"children":["$","$L13",null,{"promise":"$@14"}]}]
c:null
10:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
b:null
14:{"metadata":[],"error":null,"digest":"$undefined"}
e:{"metadata":"$14:metadata","error":null,"digest":"$undefined"}

1
out/resume.html Normal file

File diff suppressed because one or more lines are too long

21
out/resume.txt Normal file

File diff suppressed because one or more lines are too long

View file

@ -560,7 +560,7 @@ footer {
} }
.skill-heading:first-of-type { .skill-heading:first-of-type {
margin-top: 0; margin-top: var(--space-lg);
} }
.dark-mode .skill-heading { .dark-mode .skill-heading {
@ -582,76 +582,6 @@ footer {
} }
} }
/* Workout Filters */
.filters-container {
display: flex;
gap: var(--space-xl);
margin-bottom: var(--space-xl);
flex-wrap: wrap;
}
.filter-group {
display: flex;
align-items: center;
gap: var(--space-sm);
}
.filter-group label {
font-weight: 500;
color: var(--accent-secondary);
}
.filter-select {
padding: var(--space-sm) var(--space-md);
border-radius: 9999px;
border: 1px solid var(--sage-200);
background-color: var(--bg-secondary);
color: var(--text);
font-size: 0.95rem;
cursor: pointer;
transition: all var(--transition);
}
.filter-select:hover,
.filter-select:focus {
border-color: var(--pink-300);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
.dark-mode .filter-select {
border-color: var(--pink-300);
}
.dark-mode .filter-select:hover,
.dark-mode .filter-select:focus {
border-color: var(--pink-400);
}
@media (max-width: 768px) {
.filters-container {
flex-direction: column;
gap: var(--space-md);
}
.filter-group {
width: 100%;
}
.filter-select {
flex: 1;
}
}
/* Workout Details */
.back-link {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
margin-bottom: var(--space-xl);
color: var(--accent-primary);
transition: all var(--transition);
}
.back-link:hover { .back-link:hover {
transform: translateX(-4px); transform: translateX(-4px);
} }

View file

@ -1,6 +1,9 @@
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { SkillGrid } from '@/components/Skills/SkillGrid'; import { ResumeHeader } from '@/components/Resume/ResumeHeader';
import { skills } from '@/data/skills'; import { EducationSection } from '@/components/Resume/EducationSection';
import { ExperienceSection } from '@/components/Resume/ExperienceSection';
import { CertificationsSection } from '@/components/Resume/CertificationsSection';
import { SkillsSection } from '@/components/Resume/SkillsSection';
export const metadata: Metadata = { export const metadata: Metadata = {
title: 'Resume - Charlotte Croce', title: 'Resume - Charlotte Croce',
@ -11,67 +14,12 @@ export default function Resume() {
return ( return (
<div className="container"> <div className="container">
<section className="intro"> <section className="intro">
<div className="resume-header"> <ResumeHeader />
<h1>Charlotte Croce</h1>
<div className="contact-info"></div>
</div>
</section>
<section className="resume-section">
<h2>Education</h2>
<div className="education-item">
<div className="education-header">
<h3>Champlain College</h3>
<span className="location">Burlington, VT</span>
</div>
<div className="education-header">
<div className="degree">Bachelor of Science in Computer Networking and Cybersecurity</div>
<span className="date">Class of 2027</span>
</div>
<div className="gpa">GPA: 3.97/4.0</div>
<div className="coursework">
<strong>Relevant Coursework:</strong> Network Security Controls, Web & Application Security, Database Security, System Administration for Enterprise and Distributed Systems, Automation & Scripting
</div>
</div>
</section>
<section className="resume-section">
<h2>Experience</h2>
<div className="experience-item">
<div className="experience-header">
<h3>The Leahy Center</h3>
<span className="location">Burlington, VT</span>
</div>
<div className="experience-header">
<div className="job-title">Security Engineer</div>
<span className="date">Jan 2024 Present</span>
</div>
<ul className="bullet-list">
<li>Maintained SIEM infrastructure, ensured uptime, and automated security operations</li>
<li>Optimized a threat detection engine to expand security coverage while reducing false positives</li>
<li>Developed an Elastic Stack dev environment for feature testing</li>
<li>Collaborated with analysts on alert response</li>
</ul>
<div className="experience-header">
<div className="job-title">SOC Intern</div>
<span className="date">Oct 2023 Dec 2023</span>
</div>
</div>
</section>
<section className="resume-section">
<h2>Certifications</h2>
<div className="skills-grid">
<div className="skill-category">CompTIA CySA+</div>
<div className="skill-category">CompTIA Security+</div>
<div className="skill-category">CompTIA A+</div>
</div>
</section>
<section className="resume-section">
<h2>Skills</h2>
<SkillGrid skills={skills} showHeadings={true} />
</section> </section>
<EducationSection />
<ExperienceSection />
<CertificationsSection />
<SkillsSection />
</div> </div>
); );
} }

View file

@ -1,72 +0,0 @@
import { notFound } from 'next/navigation';
import Link from 'next/link';
import { Clock, Dumbbell, ArrowLeft } from 'lucide-react';
import { workouts } from '@/data/workouts';
export function generateStaticParams() {
return workouts.map((workout) => ({
id: workout.id,
}));
}
export default async function WorkoutPage({ params }: { params: Promise<{ id: string }> }) {
const { id } = await params;
const workout = workouts.find(w => w.id === id);
if (!workout) {
notFound();
}
const difficultyColors = {
recovery: 'var(--sage-300)',
easy: 'var(--sage-400)',
moderate: 'var(--pink-300)',
strenuous: 'var(--pink-400)'
};
return (
<div className="container">
<Link href="/workouts" className="back-link">
<ArrowLeft size={16} />
Back to all workouts
</Link>
<section className="intro">
<h1>{workout.title}</h1>
{workout.description && <p>{workout.description}</p>}
<div style={{ display: 'flex', gap: 'var(--space-xl)', marginTop: 'var(--space-md)' }}>
<span style={{
display: 'inline-flex',
alignItems: 'center',
gap: 'var(--space-xs)',
color: difficultyColors[workout.difficulty],
fontWeight: 500
}}>
<Dumbbell size={20} />
{workout.difficulty.charAt(0).toUpperCase() + workout.difficulty.slice(1)}
</span>
<span style={{
display: 'inline-flex',
alignItems: 'center',
gap: 'var(--space-xs)',
fontWeight: 500
}}>
<Clock size={20} />
{workout.duration} minutes
</span>
</div>
</section>
<section className="resume-section">
<h2>Exercises</h2>
<ul className="bullet-list">
{workout.exercises.map((exercise, index) => (
<li key={index}>{exercise}</li>
))}
</ul>
</section>
</div>
);
}

View file

@ -1,55 +0,0 @@
'use client';
import { useState } from 'react';
import type { Metadata } from 'next';
import { WorkoutCard } from '@/components/WorkoutCard/WorkoutCard';
import { WorkoutFilters } from '@/components/WorkoutFilters/WorkoutFilters';
import { workouts } from '@/data/workouts';
import { WorkoutDifficulty, WorkoutDuration } from '@/types';
export default function WorkoutsPage() {
const [selectedDifficulty, setSelectedDifficulty] = useState<WorkoutDifficulty | null>(null);
const [selectedDuration, setSelectedDuration] = useState<WorkoutDuration | null>(null);
const filteredWorkouts = workouts.filter(workout => {
if (selectedDifficulty && workout.difficulty !== selectedDifficulty) {
return false;
}
if (selectedDuration && workout.duration !== selectedDuration) {
return false;
}
return true;
});
return (
<div className="container">
<section className="intro">
<h1>Uphill Fitness</h1>
<p>A collection of workouts I use to improve my mountaineering fitness</p>
</section>
<section className="projects">
<h2>Workouts</h2>
<WorkoutFilters
selectedDifficulty={selectedDifficulty}
selectedDuration={selectedDuration}
onDifficultyChange={setSelectedDifficulty}
onDurationChange={setSelectedDuration}
/>
<div className="project-grid">
{filteredWorkouts.map((workout) => (
<WorkoutCard key={workout.id} workout={workout} />
))}
</div>
{filteredWorkouts.length === 0 && (
<p style={{ textAlign: 'center', color: 'var(--accent-secondary)', marginTop: 'var(--space-xl)' }}>
No workouts found matching your criteria. Try adjusting your filters.
</p>
)}
</section>
</div>
);
}

View file

@ -11,21 +11,14 @@ export function Footer() {
{footerLinks.map((link) => ( {footerLinks.map((link) => (
<li key={link.name}> <li key={link.name}>
<a href={link.url} target="_blank" rel="noopener noreferrer"> <a href={link.url} target="_blank" rel="noopener noreferrer">
{link.icon === 'rss' ? ( {link.name}
<>
<Rss className="icon-small" aria-hidden="true" />
<span className="visually-hidden">FreshRSS</span>
</>
) : (
link.name
)}
</a> </a>
</li> </li>
))} ))}
</ul> </ul>
<p>&copy;{currentYear} Charlotte Croce</p> <p>&copy;{currentYear} Charlotte Croce</p>
<p className="theme-note"> <p className="theme-note">
If you like the colors of this website, check out my{' '} 🍓 If you like the colors of this website, check out my{' '}
<a <a
href="https://marketplace.visualstudio.com/items?itemName=charlotte-dev.fruitbasket-theme" href="https://marketplace.visualstudio.com/items?itemName=charlotte-dev.fruitbasket-theme"
target="_blank" target="_blank"

View file

@ -0,0 +1,20 @@
export function CertificationsSection() {
const certifications = [
"CompTIA CySA+",
"CompTIA Security+",
"CompTIA A+"
];
return (
<section className="resume-section">
<h2>Certifications</h2>
<div className="skills-grid">
{certifications.map((cert, index) => (
<div key={index} className="skill-category">
{cert}
</div>
))}
</div>
</section>
);
}

View file

@ -0,0 +1,34 @@
interface EducationItemProps {
institution: string;
location: string;
degree: string;
graduationYear: string;
gpa: string;
coursework: string;
}
export function EducationItem({
institution,
location,
degree,
graduationYear,
gpa,
coursework,
}: EducationItemProps) {
return (
<div className="education-item">
<div className="education-header">
<h3>{institution}</h3>
<span className="location">{location}</span>
</div>
<div className="education-header">
<div className="degree">{degree}</div>
<span className="date">{graduationYear}</span>
</div>
<div className="gpa">GPA: {gpa}</div>
<div className="coursework">
<strong>Relevant Coursework:</strong> {coursework}
</div>
</div>
);
}

View file

@ -0,0 +1,17 @@
import { EducationItem } from './EducationItem';
export function EducationSection() {
return (
<section className="resume-section">
<h2>Education</h2>
<EducationItem
institution="Champlain College"
location="Burlington, VT"
degree="Bachelor of Science in Computer Networking and Cybersecurity"
graduationYear="Class of 2027"
gpa="3.97/4.0"
coursework="Network Security Controls, Web & Application Security, Database Security, System Administration for Enterprise and Distributed Systems, Automation & Scripting"
/>
</section>
);
}

View file

@ -0,0 +1,40 @@
interface Position {
title: string;
dateRange: string;
responsibilities: string[];
}
interface ExperienceItemProps {
experience: {
company: string;
location: string;
positions: Position[];
};
}
export function ExperienceItem({ experience }: ExperienceItemProps) {
return (
<div className="experience-item">
<div className="experience-header">
<h3>{experience.company}</h3>
<span className="location">{experience.location}</span>
</div>
{experience.positions.map((position, index) => (
<div key={index}>
<div className="experience-header">
<div className="job-title">{position.title}</div>
<span className="date">{position.dateRange}</span>
</div>
{position.responsibilities.length > 0 && (
<ul className="bullet-list">
{position.responsibilities.map((responsibility, respIndex) => (
<li key={respIndex}>{responsibility}</li>
))}
</ul>
)}
</div>
))}
</div>
);
}

View file

@ -0,0 +1,40 @@
import { ExperienceItem } from './ExperienceItem';
export function ExperienceSection() {
const leahyCenterExperience = {
company: "The Leahy Center",
location: "Burlington, VT",
positions: [
{
title: "Lead Security Engineer",
dateRange: "May 2025 — Present",
responsibilities: [
"Planned, led, and executed a full-stack migration from VMware to Proxmox VE using iDRAC for remote server management"
]
},
{
title: "Security Engineer",
dateRange: "Jan 2024 — May 2025",
responsibilities: [
"Maintained Elastic Stack SIEM infrastructure, ensured uptime, and automated security operations",
"Optimized a threat detection engine to expand security coverage while reducing false positives",
"Collaborated with analysts on alert response"
]
},
{
title: "Security Operations Intern",
dateRange: "Oct 2023 — Dec 2023",
responsibilities: [
"Learning the ropes 🙃"
]
}
]
};
return (
<section className="resume-section">
<h2>Experience</h2>
<ExperienceItem experience={leahyCenterExperience} />
</section>
);
}

View file

@ -0,0 +1,9 @@
export function ResumeHeader() {
return (
<div className="resume-header">
<h1>Charlotte Croce</h1>
<div className="contact-info">
</div>
</div>
);
}

View file

@ -0,0 +1,14 @@
import { SkillGrid } from '@/components/Skills/SkillGrid';
import { skills } from '@/data/skills';
export function SkillsSection() {
return (
<section className="resume-section">
<div style={{ display: 'flex', gap: '0.2rem', alignItems: 'center' }}>
<h2 style={{ textDecoration: 'line-through', margin: 0 }}>Skills</h2>
<h2 style={{ margin: 0 }}>Keywords</h2>
</div>
<SkillGrid skills={skills} showHeadings={true} />
</section>
);
}

View file

@ -3,10 +3,10 @@ import { Skill } from '@/types';
export function SkillGrid({ skills, showHeadings = false }: { skills: Skill[]; showHeadings?: boolean }) { export function SkillGrid({ skills, showHeadings = false }: { skills: Skill[]; showHeadings?: boolean }) {
if (showHeadings) { if (showHeadings) {
return ( return (
<> <div className="skills-sections">
{skills.map((skillCategory, index) => ( {skills.map((skillCategory, index) => (
<div key={skillCategory.category}> <div key={skillCategory.category} className={`skill-section ${index === 0 ? 'first-section' : ''}`}>
<h3 className={`skill-heading ${index === 0 ? 'mt-0' : ''}`}>{skillCategory.category}</h3> <h3 className="skill-heading">{skillCategory.category}</h3>
<div className="skills-grid"> <div className="skills-grid">
{skillCategory.items.map((skill) => ( {skillCategory.items.map((skill) => (
<div key={skill} className="skill-category"> <div key={skill} className="skill-category">
@ -16,10 +16,10 @@ export function SkillGrid({ skills, showHeadings = false }: { skills: Skill[]; s
</div> </div>
</div> </div>
))} ))}
</> </div>
); );
} }
return ( return (
<div className="skills-grid"> <div className="skills-grid">
{skills.map((skillCategory) => {skills.map((skillCategory) =>

View file

@ -1,39 +0,0 @@
import Link from 'next/link';
import { Clock, Dumbbell } from 'lucide-react';
import { Workout } from '@/types';
export function WorkoutCard({ workout }: { workout: Workout }) {
const difficultyColors = {
recovery: 'var(--sage-300)',
easy: 'var(--sage-400)',
moderate: 'var(--pink-300)',
strenuous: 'var(--pink-400)'
};
return (
<article className="project">
<h3>{workout.title}</h3>
{workout.description && <p>{workout.description}</p>}
<div style={{ display: 'flex', gap: 'var(--space-md)', margin: 'var(--space-sm) 0' }}>
<span style={{
display: 'inline-flex',
alignItems: 'center',
gap: 'var(--space-xs)',
color: difficultyColors[workout.difficulty]
}}>
<Dumbbell size={16} />
{workout.difficulty}
</span>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: 'var(--space-xs)' }}>
<Clock size={16} />
{workout.duration} mins
</span>
</div>
<Link href={`/workouts/${workout.id}`} style={{ display: 'inline-flex', alignItems: 'center' }}>
View Workout
</Link>
</article>
);
}

View file

@ -1,58 +0,0 @@
'use client';
import { WorkoutDifficulty, WorkoutDuration } from '@/types';
interface WorkoutFiltersProps {
selectedDifficulty: WorkoutDifficulty | null;
selectedDuration: WorkoutDuration | null;
onDifficultyChange: (difficulty: WorkoutDifficulty | null) => void;
onDurationChange: (duration: WorkoutDuration | null) => void;
}
export function WorkoutFilters({
selectedDifficulty,
selectedDuration,
onDifficultyChange,
onDurationChange
}: WorkoutFiltersProps) {
const difficulties: WorkoutDifficulty[] = ['recovery', 'easy', 'moderate', 'strenuous'];
const durations: WorkoutDuration[] = [30, 60, 90, 120, 150, 180, 210, 240, 270, 300];
return (
<div className="filters-container">
<div className="filter-group">
<label htmlFor="difficulty-filter">Difficulty:</label>
<select
id="difficulty-filter"
value={selectedDifficulty || ''}
onChange={(e) => onDifficultyChange(e.target.value ? e.target.value as WorkoutDifficulty : null)}
className="filter-select"
>
<option value="">All difficulties</option>
{difficulties.map(diff => (
<option key={diff} value={diff}>
{diff.charAt(0).toUpperCase() + diff.slice(1)}
</option>
))}
</select>
</div>
<div className="filter-group">
<label htmlFor="duration-filter">Duration:</label>
<select
id="duration-filter"
value={selectedDuration || ''}
onChange={(e) => onDurationChange(e.target.value ? Number(e.target.value) as WorkoutDuration : null)}
className="filter-select"
>
<option value="">All durations</option>
{durations.map(duration => (
<option key={duration} value={duration}>
{duration} minutes
</option>
))}
</select>
</div>
</div>
);
}

View file

@ -1,22 +1,22 @@
import { Project } from '@/types'; import { Project } from '@/types';
export const projects: Project[] = [ export const projects: Project[] = [
{ /* {
id: 'fylgja-soc', id: 'fylgja-soc',
title: 'Fylgja SOC', title: 'Fylgja SOC',
description: 'A domain-specific language (DSL) for managing an ELK SIEM. Includes a CLI and SlackBot interface [WIP]', description: 'A domain-specific language (DSL) for managing an ELK SIEM. Includes a CLI and SlackBot interface [WIP]',
sourceUrl: 'https://git.charlotte.sh/lotte/fylgja' sourceUrl: 'https://git.charlotte.sh/lotte/fylgja'
}, },*/
{ {
id: 'champlain-tech-journals', id: 'champlain-tech-journals',
title: 'Champlain Tech Journals', title: 'Champlain Tech Journals',
description: 'Notes, code, and lab write-ups from my Champlain College courses', description: 'Notes, code, and lab write-ups from my Champlain College courses',
sourceUrl: 'https://git.charlotte.sh/lotte/ChamplainTechJournals' sourceUrl: 'https://git.charlotte.sh/lotte/ChamplainTechJournals'
}, },
{ /* {
id: 'nokken-health', id: 'nokken-health',
title: 'Nøkken Health', title: 'Nøkken Health',
description: 'A Flutter app to track and analyze health data [MVP]', description: 'A Flutter app to track and analyze health data [MVP]',
sourceUrl: 'https://git.charlotte.sh/lotte/nokken' sourceUrl: 'https://git.charlotte.sh/lotte/nokken'
} } */
]; ];

View file

@ -3,7 +3,7 @@ import { Skill } from '@/types';
export const skills: Skill[] = [ export const skills: Skill[] = [
{ {
category: 'Systems & Infrastructure', category: 'Systems & Infrastructure',
items: ['Active Directory', 'Debian Linux', 'Docker', 'RHEL Linux', 'VMWare', 'Windows Server'] items: ['Active Directory', 'Debian Linux', 'Docker', 'iDRAC', 'Proxmox VE', 'RHEL Linux', 'VMware', 'Windows Server']
}, },
{ {
category: 'Security Tools & Frameworks', category: 'Security Tools & Frameworks',

View file

@ -9,8 +9,5 @@ export const headerLinks: SocialLink[] = [
export const footerLinks: SocialLink[] = [ export const footerLinks: SocialLink[] = [
{ name: 'GitHub', url: 'https://github.com/charlottecroce' }, { name: 'GitHub', url: 'https://github.com/charlottecroce' },
{ name: 'Forgejo', url: 'https://git.charlotte.sh/lotte' }, { name: 'Forgejo', url: 'https://git.charlotte.sh/lotte' },
{ name: 'LinkedIn', url: 'https://linkedin.com/in/charlottecroce' }, { name: 'LinkedIn', url: 'https://linkedin.com/in/charlottecroce' }
{ name: 'Mastodon', url: 'https://hachyderm.io/@charlotte200' },
{ name: 'BookWyrm', url: 'https://bookwyrm.social/user/lottie' },
{ name: 'FreshRSS', url: 'https://rss.charlotte.sh', icon: 'rss' }
]; ];

View file

@ -1,992 +0,0 @@
import { Workout } from '@/types';
export const workouts: Workout[] = [
// STRENGTH TRAINING WORKOUTS
{
id: 'alpine-strength-upper',
title: 'Alpine Upper Body Power',
difficulty: 'strenuous',
duration: 90,
description: 'Upper body strength training for pulling movements crucial in mountaineering',
exercises: [
'Shoulder circles: 20 forward, 20 backward each arm',
'Arm swings: 20 cross-body swings per arm',
'Scapular push-ups: 2 sets of 15 reps',
'Band pull-aparts: 2 sets of 20 reps',
'Weighted pull-ups: 5 sets of 6-8 reps (add weight via belt)',
'Lat pulldowns with pause at bottom: 4 sets of 12 reps (3-second hold)',
'Rope pulls (seated, hand over hand): 4 sets of 30 seconds',
'Single-arm dumbbell rows: 4 sets of 10 reps per arm (2-second pause at top)',
'TRX body rows (feet elevated): 3 sets of 15 reps',
'Alternating dumbbell curls (simulate ice axe): 4 sets of 12 reps',
'Face pulls with external rotation: 3 sets of 15 reps',
'Wall angels: 3 sets of 15 reps',
'Dead hangs from pull-up bar: 3 sets of 60 seconds',
'Doorway chest stretch: 30 seconds each side',
'Cross-body shoulder stretch: 30 seconds each arm',
'Overhead triceps stretch: 30 seconds each arm'
]
},
{
id: 'alpine-strength-lower',
title: 'Alpine Lower Body Strength',
difficulty: 'strenuous',
duration: 120,
description: 'Leg strength workout for steep ascents and heavy load carrying',
exercises: [
'Forward leg swings: 15 each leg',
'Lateral leg swings: 15 each leg',
'Walking knee hugs: 10 each leg',
'Walking quad stretch: 10 each leg',
'Ankle circles: 20 each direction per ankle',
'Front squats (barbell): 5 sets of 8 reps',
'Single-leg Romanian deadlifts: 4 sets of 10 reps per leg',
'Weighted box step-ups (24" box, dumbbells): 4 sets of 15 reps per leg',
'Walking lunges with 60lb backpack: 4 sets of 20 total steps',
'Bulgarian split squats (rear foot elevated): 3 sets of 12 reps per leg',
'Single-leg calf raises on step: 4 sets of 30 reps per leg',
'Seated calf raises with weight: 3 sets of 20 reps',
'Tibialis raises (toes against wall): 3 sets of 20 reps',
'Standing quad stretch: 60 seconds each leg',
'Pigeon pose: 90 seconds each side',
'Seated forward fold: 2 minutes',
'Butterfly stretch: 90 seconds'
]
},
{
id: 'core-stability-alpine',
title: 'Alpine Core Stability',
difficulty: 'moderate',
duration: 60,
description: 'Core workout focused on stability for uneven terrain and load carrying',
exercises: [
'Cat-cow: 10 repetitions',
'Bird dogs: 10 reps each side (hold 5 seconds each)',
'Dead bugs with band: 3 sets of 20 reps (opposite arm/leg)',
'Pallof press (cable or band): 4 sets of 15 reps each side',
'Weighted plank (plate on back): 4 sets of 60 seconds',
'Side plank with top leg raised: 3 sets of 30 seconds each side',
'Side plank thread the needle: 3 sets of 12 reps each side',
'McGill curl-ups: 4 sets of 20 reps (hold 8 seconds each)',
'Farmer\'s carry with kettlebells: 4 sets of 60 seconds',
'Single-arm farmer\'s carry: 3 sets of 30 seconds each side',
'Turkish get-ups: 3 sets of 5 reps each side',
'Child\'s pose: 60 seconds',
'Cobra stretch: 30 seconds',
'Seated spinal twist: 60 seconds each side'
]
},
// CARDIOVASCULAR ENDURANCE WORKOUTS
{
id: 'altitude-simulator-intervals',
title: 'Altitude Simulation Intervals',
difficulty: 'strenuous',
duration: 90,
description: 'High-intensity intervals to prepare for reduced oxygen at altitude',
exercises: [
'Easy jog: 5 minutes',
'Dynamic stretching: high knees, butt kicks, leg swings (5 minutes)',
'Gradual incline walk: start flat, increase to 10% over 5 minutes',
'Stairmaster intervals: 2 minutes at level 12-14, 1 minute at level 6',
'Repeat stairmaster interval 8 times',
'Treadmill at 15% grade: 3 minutes at 3.5mph, 2 minutes at 2.5mph',
'Repeat treadmill interval 5 times',
'Box step-ups with 20lb vest: 50 continuous reps, right leg leads',
'Rest 90 seconds',
'Box step-ups with 20lb vest: 50 continuous reps, left leg leads',
'Rest 90 seconds',
'Repeat box step-ups 2 more times each leg',
'Cool down walk at 0% incline: 5 minutes',
'Box breathing: 4 seconds in, 4 hold, 4 out, 4 hold (5 minutes)'
]
},
{
id: 'long-endurance-hike',
title: 'Long Day Simulation',
difficulty: 'strenuous',
duration: 270,
description: 'Extended endurance workout simulating a long climbing day',
exercises: [
'Pack adjustment and gear check: ensure proper weight distribution (5 minutes)',
'Dynamic warm-up: arm circles, leg swings, torso twists (10 minutes)',
'Treadmill hiking at 15% incline, 2.5mph with 60lb pack: 30 minutes',
'Treadmill hiking at 12% incline, 3.0mph with 60lb pack: 30 minutes',
'Treadmill hiking at 18% incline, 2.0mph with 60lb pack: 30 minutes',
'Stairmaster with 60lb pack, level 8: 15 minutes',
'Stairmaster with 60lb pack, level 10: 15 minutes',
'Stairmaster with 60lb pack, level 6: 15 minutes',
'Practice eating/drinking while walking: consume 200 calories (15 minutes)',
'Treadmill varied incline: 5 minutes each at 5%, 10%, 15%, 10%, 5% (30 minutes)',
'Treadmill steady pace: 10% incline at 2.8mph for 35 minutes',
'Step-ups on 18" box: 3 sets of 30 per leg (15 minutes)',
'Walking lunges: 3 sets of 30 steps (15 minutes)',
'Standing quad stretch: 60 seconds each leg',
'Hamstring stretch on bench: 60 seconds each leg',
'Calf stretch against wall: 60 seconds each side',
'Hip flexor stretch: 90 seconds each side',
'Spinal twists: 60 seconds each side'
]
},
{
id: 'zone-2-endurance',
title: 'Zone 2 Base Building',
difficulty: 'moderate',
duration: 120,
description: 'Low-intensity endurance building for aerobic base',
exercises: [
'Light arm circles: 20 forward, 20 backward',
'Leg swings: 15 each direction per leg',
'Easy walking: 5 minutes gradually increasing pace',
'Incline treadmill at 10%, maintain heart rate 120-160 bpm: 60 minutes',
'Stairmaster at conversational pace (can speak full sentences): 30 minutes',
'Rowing machine at steady pace, 22-24 strokes per minute: 20 minutes',
'Flat treadmill walk: 5 minutes decreasing pace',
'Standing forward fold: 60 seconds',
'Seated hamstring stretch: 60 seconds each leg',
'Figure-4 hip stretch: 60 seconds each side'
]
},
// WEIGHTED PACK TRAINING
{
id: 'heavy-pack-progression',
title: 'Heavy Pack Progression',
difficulty: 'strenuous',
duration: 150,
description: 'Progressive pack weight training for expedition preparation',
exercises: [
'Unweighted shoulder rolls: 20 forward, 20 backward',
'Hip circles: 15 each direction',
'Bodyweight squats: 20 reps',
'Walking lunges: 20 total steps',
'Stair climbing with 30lb pack: steady pace for 30 minutes',
'Switch to 60lb pack: Treadmill at 10% grade, 2.5mph for 15 minutes',
'Maintain 60lb pack: Treadmill at 10% grade, 3.0mph for 15 minutes',
'Switch to 50lb pack: Box step-ups (18" box), 20 reps right leg',
'Maintain 50lb pack: Box step-ups (18" box), 20 reps left leg',
'Rest 2 minutes, repeat box step-ups',
'Maintain 50lb pack: Walking lunges, 10 steps forward, 10 steps backward',
'Rest 2 minutes, repeat lunges 2 more times',
'Switch to 30lb pack: Stairmaster intervals - 2 min fast, 1 min slow x 7 rounds',
'Remove pack: Hang from pull-up bar 30 seconds',
'Cat-cow pose: 15 repetitions',
'Child\'s pose with side reach: 60 seconds each side',
'Supine spinal twist: 90 seconds each side'
]
},
{
id: 'pack-carry-endurance',
title: 'Pack Carry Endurance',
difficulty: 'moderate',
duration: 180,
description: 'Extended pack carrying for load tolerance',
exercises: [
'Arm swings: 20 each direction',
'Leg swings: 15 each direction per leg',
'Torso rotations: 20 each direction',
'Ankle rolls: 15 each direction per ankle',
'With 35lb pack: Flat treadmill walk at 3.0mph for 30 minutes',
'With 35lb pack: Incline treadmill 5% grade at 2.8mph for 20 minutes',
'With 35lb pack: Incline treadmill 10% grade at 2.5mph for 20 minutes',
'With 35lb pack: Incline treadmill 15% grade at 2.0mph for 20 minutes',
'With 35lb pack: Stairmaster level 6 for 10 minutes',
'With 35lb pack: Stairmaster level 8 for 10 minutes',
'With 35lb pack: Stairmaster level 7 for 10 minutes',
'With 35lb pack: Balance beam walking (or line on floor) for 5 minutes',
'With 35lb pack: Step over 12" hurdles, 20 total',
'With 35lb pack: Duck under 4-foot bar, 20 total',
'With 35lb pack: Lateral steps over 6" barrier, 30 total',
'Remove pack gradually: Walk 5 min with 30lb, 5 min with 15lb, 5 min unweighted',
'Standing side bend: 30 seconds each side',
'Doorway chest stretch: 60 seconds',
'Neck rolls: 10 each direction'
]
},
// TECHNICAL SKILLS TRAINING
{
id: 'balance-proprioception',
title: 'Balance & Proprioception',
difficulty: 'moderate',
duration: 60,
description: 'Balance training for technical terrain and glacier travel',
exercises: [
'Ankle circles: 20 each direction per ankle',
'Single-leg toe touches: 10 per leg',
'Hip circles: 15 each direction',
'Single-leg stand on foam pad: 60 seconds right leg',
'Single-leg stand on foam pad: 60 seconds left leg',
'Repeat foam pad stands 3 more times',
'Bosu ball squats (flat side up): 15 reps',
'Bosu ball squats (round side up): 15 reps',
'Repeat Bosu squats 2 more sets',
'Slackline walking: 5 attempts of maximum distance',
'Slackline standing: Hold for maximum time, 5 attempts',
'Slackline squats: 5 attempts of maximum reps',
'Eyes-closed single-leg stand: 30 seconds right leg',
'Eyes-closed single-leg stand: 30 seconds left leg',
'Repeat eyes-closed stands 2 more times',
'Lateral hops over line: 20 reps each leg',
'Forward/backward hops over line: 20 reps each leg',
'Box jumps with soft landing: 3 sets of 10 reps',
'Agility ladder: High knees pattern for 3 passes',
'Agility ladder: In-in-out-out pattern for 3 passes',
'Agility ladder: Lateral shuffle pattern for 3 passes',
'Ankle alphabet: Write A-Z with each foot',
'Calf stretch on step: 60 seconds each side',
'Ankle dorsiflexion stretch: 60 seconds each side'
]
},
{
id: 'crampon-simulation',
title: 'Crampon Movement Patterns',
difficulty: 'moderate',
duration: 90,
description: 'Movement patterns simulating crampon use on steep terrain',
exercises: [
'Ankle rolls: 20 each direction per ankle',
'Knee circles: 15 each direction per leg',
'Hip flexor march: 20 steps in place',
'Monster walks with band: 20 steps each direction',
'High-knee step-ups (focus on foot flat placement): 20 reps right leg',
'High-knee step-ups: 20 reps left leg',
'Repeat step-ups 3 more sets',
'Lateral step-ups with crossover step: 15 reps leading with right',
'Lateral step-ups with crossover step: 15 reps leading with left',
'Repeat lateral step-ups 2 more sets',
'French technique on stairs: Walk sideways up stairs, 10 flights',
'French technique on stairs: Walk sideways down stairs, 10 flights',
'Front-pointing simulation: High knees against wall, 30 seconds',
'Rest 30 seconds, repeat 2 more times',
'Duck walk on 15% incline treadmill: 2 minutes at 1.5mph',
'Rest 1 minute, repeat 3 more times',
'Backward downhill walking on treadmill (-5% grade): 3 sets of 3 minutes',
'Controlled step-downs from 12" box: 3 sets of 15 per leg',
'Standing calf stretch: 60 seconds each side',
'Seated shin stretch: 60 seconds',
'Kneeling hip flexor stretch: 60 seconds each side'
]
},
// RECOVERY AND FLEXIBILITY
{
id: 'active-recovery-yoga',
title: 'Mountaineer\'s Recovery Yoga',
difficulty: 'recovery',
duration: 60,
description: 'Yoga sequence for mountaineering recovery and flexibility',
exercises: [
'Seated meditation: Focus on breath for 3 minutes',
'Ujjayi breathing: 2 minutes of ocean breath',
'Gentle neck rolls: 5 each direction',
'Sun salutation A: 3 rounds at slow pace',
'Sun salutation B: 2 rounds at slow pace',
'Low lunge with twist: Hold 60 seconds each side',
'Lizard pose: Hold 90 seconds each side',
'Pigeon pose: Hold 2 minutes each side',
'Seated forward fold: Hold 90 seconds',
'Wide-legged forward fold: Hold 90 seconds',
'Pyramid pose: Hold 60 seconds each side',
'Revolved triangle: Hold 60 seconds each side',
'Thread the needle: Hold 60 seconds each side',
'Puppy pose: Hold 90 seconds',
'Seated spinal twist: Hold 60 seconds each side',
'Reclined spinal twist: Hold 90 seconds each side',
'Happy baby pose: Hold 60 seconds',
'Legs up the wall: Hold 5 minutes',
'Savasana: Rest for 5 minutes'
]
},
{
id: 'foam-rolling-recovery',
title: 'Deep Tissue Recovery',
difficulty: 'recovery',
duration: 60,
description: 'Foam rolling and self-myofascial release for recovery',
exercises: [
'Light walking in place: 2 minutes',
'Arm circles: 20 each direction',
'Leg swings: 15 each direction per leg',
'IT band rolling: Start at hip, roll to knee, 90 seconds per side',
'IT band cross-friction: Find tender spots, hold 30 seconds each',
'Quadriceps rolling: Full length of thigh, 90 seconds per side',
'Vastus medialis focus: Inner quad above knee, 60 seconds per side',
'Calf rolling: Full length, 90 seconds per side',
'Peroneal rolling: Outside of shin, 60 seconds per side',
'Tibialis anterior rolling: Front of shin, 60 seconds per side',
'Glute rolling: Figure-4 position, 90 seconds per side',
'Piriformis trigger point: Tennis ball, hold tender spots 30 seconds',
'Upper back rolling: Focus on rhomboids, 2 minutes total',
'Lat rolling: Side-lying position, 60 seconds per side',
'Standing quad stretch: 60 seconds each leg',
'Standing hamstring stretch: 60 seconds each leg',
'Standing calf stretch: 60 seconds each leg'
]
},
// HIGH-INTENSITY TRAINING
{
id: 'summit-day-simulator',
title: 'Summit Day Simulation',
difficulty: 'strenuous',
duration: 300,
description: 'Intense workout simulating summit day conditions and demands',
exercises: [
'Headlamp warm-up: All exercises done with reduced lighting',
'Dynamic stretches with headlamp: Leg swings, arm circles (5 minutes)',
'Layer management practice: Add/remove layers while moving (5 minutes)',
'Joint mobility in cold simulation: Slow, controlled movements (5 minutes)',
'Heavy pack (60lb) stair climbing: Steady pace for 20 minutes',
'Maintain pace for 20 minutes',
'Increase pace slightly for final 20 minutes',
'HIIT with 60lb pack: 30 seconds sprint stairs, 30 seconds rest x 15',
'HIIT with 60lb pack: 60 seconds fast step-ups, 15 seconds rest x 15',
'HIIT with 60lb pack: 60 seconds incline treadmill run, 60 seconds walk x 8',
'Balance beam with pack: Walk forward, backward, sideways (10 minutes)',
'High step practice: Step over 24" barriers x 30',
'Rope handling with gloves: Practice knots and coiling (10 minutes)',
'Sustained treadmill effort: 15% grade at 2.5mph for 30 minutes',
'Maintain effort: Drop to 12% grade, increase to 3.0mph for 30 minutes',
'Final push: 18% grade at 2.0mph for 30 minutes',
'Descent simulation: -10% grade treadmill, focus on control, 30 minutes',
'Quad-burning downhill steps: Slow eccentric step-downs x 100',
'Exhaustion box step-ups: Max reps in 5 minutes',
'Mental focus drill: Count backwards from 1000 by 7s while stepping',
'Recovery nutrition: Practice eating/drinking while moving (15 minutes)',
'Cool down walk: Gradually decrease intensity over 15 minutes'
]
},
{
id: 'anaerobic-threshold',
title: 'Anaerobic Threshold Builder',
difficulty: 'strenuous',
duration: 90,
description: 'High-intensity workout to improve anaerobic threshold',
exercises: [
'Easy jog: 5 minutes at conversational pace',
'Dynamic warm-up: High knees 30 seconds, butt kicks 30 seconds',
'Leg swings: 15 each direction per leg',
'Gradual pace increase: 5 minutes building to threshold',
'Threshold interval 1: 8 minutes at 85-90% max heart rate',
'Recovery: 3 minutes easy pace',
'Threshold interval 2: 8 minutes at 85-90% max heart rate',
'Recovery: 3 minutes easy pace',
'Threshold interval 3: 8 minutes at 85-90% max heart rate',
'Recovery: 3 minutes easy pace',
'Threshold interval 4: 8 minutes at 85-90% max heart rate',
'Recovery: 3 minutes easy pace',
'Hill sprints: 30 seconds all-out up steep incline',
'Recovery walk down: 90 seconds',
'Repeat hill sprints 7 more times',
'Tempo stair climbing: 10 minutes at 80% effort',
'Cool down jog: 5 minutes easy pace',
'Walking: 5 minutes with arm swings'
]
},
// EXPEDITION-SPECIFIC TRAINING
{
id: 'cold-weather-conditioning',
title: 'Cold Weather Conditioning',
difficulty: 'moderate',
duration: 120,
description: 'Training to prepare for extreme cold conditions',
exercises: [
'Indoor layer practice: Base, mid, shell in proper order (5 minutes)',
'Zipper and ventilation management while moving (5 minutes)',
'Jumping jacks: 50 reps',
'Mountain climbers: 50 reps',
'Burpees: 30 reps',
'High knees: 60 seconds',
'Treadmill at moderate pace: Monitor body temperature for 15 minutes',
'Add mid-layer: Continue for 10 minutes, practice venting',
'Remove mid-layer while walking: Practice efficiency (5 minutes)',
'Steady state cardio: Find balance between warmth and sweating (15 minutes)',
'Hand exercises: Make fists, spread fingers, 50 reps',
'Foot exercises: Toe curls, ankle pumps, 50 reps each',
'Arm windmills: 30 seconds forward, 30 backward',
'Wim Hof breathing: 3 rounds of 30 breaths with retention',
'Cold exposure breathing: Slow nasal breathing for 5 minutes',
'Box breathing in cold: 5-5-5-5 pattern for 5 minutes',
'Practice tasks with expedition mitts: Tie knots, handle carabiners',
'Practice tasks with liner gloves: Adjust equipment, eat snacks',
'Gradual warm-up: Remove layers systematically over 10 minutes'
]
},
{
id: 'rope-team-simulation',
title: 'Rope Team Movement',
difficulty: 'moderate',
duration: 90,
description: 'Simulating movement as part of a rope team',
exercises: [
'Partner coordination walk: Match pace for 5 minutes',
'Mirror movements: Follow partner\'s steps exactly (5 minutes)',
'Synchronized marching: Call out "left, right" for 30 steps',
'Matched cadence stepping: 60 steps at slow pace',
'Matched cadence stepping: 60 steps at medium pace',
'Matched cadence stepping: 60 steps at varied pace',
'Communication drills: "Slack!", "Tension!", "Falling!" (5 minutes)',
'Hand signals practice while walking (5 minutes)',
'Whistle signals practice: One blast, two blasts, three blasts',
'Interval with stops: Walk 2 minutes, sudden stop and brace',
'Repeat stop drills 10 times with random timing',
'Tension management: Practice keeping consistent rope tension',
'Rest step on incline: Synchronized leg lock for 15 minutes',
'Pace counting: Both partners count to 100 steps, compare',
'Communication under exertion: Maintain conversation at high effort',
'Mock debrief: Discuss imaginary route conditions (5 minutes)',
'Cool down walk: Practice rope coiling while walking'
]
},
{
id: 'altitude-acclimatization-prep',
title: 'Pre-Acclimatization Protocol',
difficulty: 'moderate',
duration: 90,
description: 'Workout to prepare body for altitude acclimatization',
exercises: [
'Diaphragmatic breathing: Hand on belly, 10 deep breaths',
'Box breathing: 4-4-4-4 pattern for 5 minutes',
'Breath retention: Inhale, hold to comfort, exhale slowly x 5',
'Hypoxic intervals: 20 jumping jacks, hold breath 10 seconds',
'Recovery breathing: 30 seconds',
'Repeat hypoxic intervals 8 times',
'Steady state cardio: Nasal breathing only, 15 minutes',
'Rhythmic breathing: 3 steps inhale, 2 steps exhale for 15 minutes',
'High-rep circuit: 20 bodyweight squats',
'High-rep circuit: 20 push-ups',
'High-rep circuit: 20 lunges',
'High-rep circuit: 20 mountain climbers',
'Rest 60 seconds, repeat circuit 4 times',
'Walking meditation: Focus on breath for 5 minutes',
'Seated meditation: Visualize high altitude scenery for 5 minutes'
]
},
// MENTAL PREPARATION
{
id: 'mental-toughness-grind',
title: 'Mental Toughness Builder',
difficulty: 'strenuous',
duration: 180,
description: 'Monotonous, challenging workout to build mental resilience',
exercises: [
'Immediate start: No warm-up, straight to work',
'Brief shoulder rolls and ankle circles only (2 minutes)',
'Mental prep: Set intention for sustained focus (3 minutes)',
'Stairmaster at level 8: No entertainment, no music, 30 minutes',
'Continue Stairmaster: Count every 100 steps, 30 minutes',
'Continue Stairmaster: Focus only on breathing pattern, 30 minutes',
'Wall sit: 3 minutes (break into 30-second chunks if needed)',
'Rest 60 seconds',
'Wall sit: 3 minutes',
'Rest 60 seconds',
'Repeat wall sits 3 more times',
'Weighted plank (30lb plate): 2 minutes',
'Rest 30 seconds',
'Repeat weighted plank 4 more times',
'Treadmill at 15% incline, 2.5mph: Count backwards from 2000',
'Continue for full 60 minutes without checking time',
'Mental counting exercise: Count every left foot strike',
'Continue counting: Restart if you lose count (15 minutes)',
'Walk at 0% incline: 3 minutes',
'Light stretching: 2 minutes total'
]
},
// QUICK WORKOUTS
{
id: 'quick-strength-circuit',
title: 'Quick Strength Circuit',
difficulty: 'moderate',
duration: 30,
description: 'Fast-paced strength circuit for busy days',
exercises: [
'Jumping jacks: 30 seconds',
'Arm circles: 15 each direction',
'Leg swings: 10 each direction per leg',
'Circuit Round 1: Squats 20 reps',
'Circuit Round 1: Push-ups 15 reps',
'Circuit Round 1: Step-ups 20 per leg',
'Circuit Round 1: Pull-ups max reps',
'Circuit Round 1: Plank 60 seconds',
'Rest 60 seconds',
'Circuit Round 2: Repeat all exercises',
'Rest 60 seconds',
'Circuit Round 3: Repeat all exercises',
'Standing quad stretch: 30 seconds each leg',
'Chest opener stretch: 30 seconds',
'Overhead triceps stretch: 30 seconds each arm'
]
},
{
id: 'morning-mobility',
title: 'Morning Mobility Routine',
difficulty: 'easy',
duration: 30,
description: 'Quick mobility routine to start the day',
exercises: [
'Neck circles: 10 each direction',
'Shoulder circles: 15 forward, 15 backward',
'Arm circles: 15 small, 15 large each direction',
'Wrist circles: 15 each direction',
'Spinal waves: 10 cat-cow movements',
'Thoracic rotations: 10 each side',
'Hip circles: 10 each direction per leg',
'Knee circles: 10 each direction per leg',
'Ankle circles: 15 each direction per foot',
'World\'s greatest stretch: 5 per side',
'Inchworm to downward dog: 5 reps',
'Deep squat hold with rotation: 30 seconds',
'Single-leg balance: 30 seconds per leg',
'Single-leg balance with eyes closed: 20 seconds per leg',
'Cross-body toe touches: 10 per side',
'Bird dogs: 10 per side with 3-second holds',
'Dead bugs: 10 per side',
'Plank: 60 seconds',
'Side plank: 30 seconds each side',
'Deep belly breathing: 10 breaths',
'Box breathing: 5 rounds of 4-4-4-4',
'Visualization: Picture successful summit day (2 minutes)'
]
},
// TECHNIQUE FOCUS
{
id: 'efficient-movement-patterns',
title: 'Efficient Movement Patterns',
difficulty: 'moderate',
duration: 90,
description: 'Focus on energy-efficient movement techniques',
exercises: [
'Video analysis setup: Record baseline walking form (5 minutes)',
'Normal walking: Note natural cadence and form (5 minutes)',
'Rest step introduction: Lock back leg completely straight',
'Rest step practice: 50 steps focusing on full leg lock',
'Rest step on incline: 5% grade for 5 minutes',
'Rest step on incline: 10% grade for 5 minutes',
'Rest step on incline: 15% grade for 10 minutes',
'Pressure breathing: Sharp exhale with each step x 50 steps',
'Pressure breathing with rest step: Combine techniques for 5 minutes',
'Lock-step practice: Small steps, maintain rhythm for 100 steps',
'Lock-step on steep grade: 18% incline for 10 minutes',
'Three-point contact simulation: Hands on knees technique',
'Downhill plunge step: Controlled heel-first placement x 50',
'Downhill side-stepping: Reduce quad strain for 5 minutes',
'Switchback technique: Figure-8 pattern on flat ground',
'Video review: Compare to baseline, note improvements (5 minutes)',
'Mental rehearsal: Visualize perfect form (5 minutes)'
]
},
// PEAK TRAINING
{
id: 'peak-performance-test',
title: 'Peak Performance Test',
difficulty: 'strenuous',
duration: 120,
description: 'Maximum effort test to gauge expedition readiness',
exercises: [
'Dynamic warm-up: Full body mobility sequence (10 minutes)',
'Progressive loading: Light cardio building intensity (5 minutes)',
'Max weight step-up test: Find 3-rep max on 20" box',
'Record weight and rest 3 minutes',
'VO2 max stair test: Maximum floors climbed in 12 minutes',
'Record floors and rest 5 minutes',
'Loaded carry test: 50lb pack, max distance in 10 minutes',
'Record distance and rest 5 minutes',
'Technical circuit: Ladder footwork drill 60 seconds',
'Technical circuit: Balance beam with pack 60 seconds',
'Technical circuit: Precise foot placements on targets 60 seconds',
'Technical circuit: Quick direction changes 60 seconds',
'Rest 2 minutes, repeat technical circuit',
'Fatigue management: Hold perfect plank to failure',
'Recovery heart rate: Record HR at 1, 3, and 5 minutes post-effort',
'Cool down walk: Light movement for 10 minutes',
'Performance metrics review: Calculate improvements (5 minutes)',
'Training plan adjustment: Note weak areas for focus'
]
},
// GENERAL FITNESS - STRENGTH TRAINING
{
id: 'full-body-strength',
title: 'Full Body Strength Workout',
difficulty: 'moderate',
duration: 60,
description: 'Comprehensive strength training for overall fitness',
exercises: [
'Treadmill walk: 5 minutes at moderate pace',
'Arm circles: 20 forward, 20 backward',
'Leg swings: 15 each direction per leg',
'Bodyweight squats: 15 reps',
'Push-ups: 10 reps',
'Barbell back squats: 4 sets of 8-10 reps',
'Bench press: 4 sets of 8-10 reps',
'Deadlifts: 4 sets of 6-8 reps',
'Seated cable rows: 3 sets of 12 reps',
'Overhead press: 3 sets of 10 reps',
'Lat pulldown: 3 sets of 12 reps',
'Dumbbell lunges: 3 sets of 10 reps per leg',
'Plank: 3 sets of 60 seconds',
'Russian twists with medicine ball: 3 sets of 20 reps',
'Hamstring stretch: 30 seconds each leg',
'Quad stretch: 30 seconds each leg',
'Shoulder stretch: 30 seconds each arm'
]
},
{
id: 'upper-body-hypertrophy',
title: 'Upper Body Muscle Building',
difficulty: 'moderate',
duration: 90,
description: 'High-volume upper body workout for muscle growth',
exercises: [
'Arm circles: 15 each direction',
'Band pull-aparts: 20 reps',
'Light dumbbell presses: 15 reps',
'Barbell bench press: 4 sets of 10-12 reps',
'Incline dumbbell press: 3 sets of 12 reps',
'Cable chest flyes: 3 sets of 15 reps',
'Seated dumbbell shoulder press: 4 sets of 10 reps',
'Lateral raises: 3 sets of 15 reps',
'Front raises: 3 sets of 12 reps',
'Barbell curls: 4 sets of 10 reps',
'Hammer curls: 3 sets of 12 reps per arm',
'Tricep pushdowns: 4 sets of 12 reps',
'Overhead tricep extensions: 3 sets of 15 reps',
'Face pulls: 3 sets of 15 reps',
'Chest stretch: 60 seconds each side',
'Tricep stretch: 30 seconds each arm',
'Shoulder rolls: 20 forward, 20 backward'
]
},
{
id: 'lower-body-power',
title: 'Lower Body Power Development',
difficulty: 'strenuous',
duration: 90,
description: 'Explosive lower body training for power and strength',
exercises: [
'Dynamic leg swings: 15 each direction per leg',
'Walking lunges: 20 total steps',
'Jump squats: 2 sets of 10 reps',
'Box jumps: 3 sets of 8 reps',
'Power cleans: 5 sets of 3 reps',
'Barbell squats: 5 sets of 5 reps (heavy)',
'Bulgarian split squats: 3 sets of 8 reps per leg',
'Leg press: 4 sets of 12 reps',
'Walking lunges with dumbbells: 3 sets of 20 steps',
'Single-leg deadlifts: 3 sets of 10 reps per leg',
'Calf raises: 4 sets of 20 reps',
'Seated calf raises: 3 sets of 15 reps',
'Jump rope: 3 sets of 60 seconds',
'Foam rolling: Quads, hamstrings, calves (5 minutes)',
'Standing quad stretch: 60 seconds each leg',
'Seated hamstring stretch: 60 seconds each leg'
]
},
// GENERAL FITNESS - CARDIOVASCULAR
{
id: 'steady-state-cardio',
title: 'Classic Cardio Session',
difficulty: 'moderate',
duration: 60,
description: 'Traditional steady-state cardiovascular training',
exercises: [
'Light walking: 5 minutes',
'Dynamic stretching: Arm swings, leg swings (3 minutes)',
'Treadmill jog: Build to comfortable pace over 3 minutes',
'Steady running: Maintain conversational pace for 30 minutes',
'Incline walking: 5% grade at 3.5mph for 5 minutes',
'Cool down jog: Gradually decrease pace over 3 minutes',
'Walking: 2 minutes',
'Standing quad stretch: 30 seconds each leg',
'Calf stretch: 30 seconds each leg',
'Hamstring stretch: 30 seconds each leg'
]
},
{
id: 'interval-training',
title: 'Cardio Interval Training',
difficulty: 'strenuous',
duration: 60,
description: 'High-intensity interval training for cardiovascular fitness',
exercises: [
'Light jog: 5 minutes',
'Dynamic warm-up: High knees, butt kicks, leg swings (3 minutes)',
'Interval 1: 1 minute hard run, 2 minutes recovery jog',
'Interval 2: 1 minute hard run, 2 minutes recovery jog',
'Interval 3: 1 minute hard run, 2 minutes recovery jog',
'Interval 4: 1 minute hard run, 2 minutes recovery jog',
'Interval 5: 1 minute hard run, 2 minutes recovery jog',
'Interval 6: 1 minute hard run, 2 minutes recovery jog',
'Cool down jog: 5 minutes decreasing pace',
'Walking: 3 minutes',
'Standing forward fold: 60 seconds',
'Runner\'s lunge stretch: 30 seconds each side'
]
},
// GENERAL FITNESS - HIIT
{
id: 'hiit-circuit',
title: 'High-Intensity Circuit',
difficulty: 'strenuous',
duration: 30,
description: 'Fast-paced HIIT circuit for maximum calorie burn',
exercises: [
'Jumping jacks: 60 seconds',
'Dynamic stretching: 2 minutes',
'Circuit 1: Burpees 30 seconds, rest 30 seconds',
'Circuit 1: Mountain climbers 30 seconds, rest 30 seconds',
'Circuit 1: Jump squats 30 seconds, rest 30 seconds',
'Circuit 1: High knees 30 seconds, rest 30 seconds',
'Rest: 90 seconds',
'Circuit 2: Push-ups 30 seconds, rest 30 seconds',
'Circuit 2: Jumping lunges 30 seconds, rest 30 seconds',
'Circuit 2: Plank jacks 30 seconds, rest 30 seconds',
'Circuit 2: Skaters 30 seconds, rest 30 seconds',
'Rest: 90 seconds',
'Circuit 3: Box jumps 30 seconds, rest 30 seconds',
'Circuit 3: Battle ropes 30 seconds, rest 30 seconds',
'Circuit 3: Kettlebell swings 30 seconds, rest 30 seconds',
'Circuit 3: Bicycle crunches 30 seconds, rest 30 seconds',
'Cool down walk: 3 minutes',
'Light stretching: 3 minutes'
]
},
{
id: 'tabata-workout',
title: 'Tabata Training Session',
difficulty: 'strenuous',
duration: 30,
description: 'Intense Tabata protocol for conditioning',
exercises: [
'Light cardio: 3 minutes',
'Dynamic warm-up: 3 minutes',
'Tabata 1: Jump squats - 8 rounds of 20 sec work, 10 sec rest',
'Rest: 1 minute',
'Tabata 2: Push-ups - 8 rounds of 20 sec work, 10 sec rest',
'Rest: 1 minute',
'Tabata 3: Burpees - 8 rounds of 20 sec work, 10 sec rest',
'Rest: 1 minute',
'Tabata 4: Mountain climbers - 8 rounds of 20 sec work, 10 sec rest',
'Cool down walk: 3 minutes',
'Deep breathing: 2 minutes',
'Light stretching: 3 minutes'
]
},
// GENERAL FITNESS - BODYWEIGHT
{
id: 'bodyweight-strength',
title: 'No-Equipment Strength Workout',
difficulty: 'moderate',
duration: 60,
description: 'Complete bodyweight workout requiring no equipment',
exercises: [
'Arm circles: 15 each direction',
'Leg swings: 10 each direction per leg',
'Jumping jacks: 30 reps',
'Push-ups: 3 sets of 15-20 reps',
'Bodyweight squats: 3 sets of 20 reps',
'Pike push-ups: 3 sets of 10 reps',
'Bulgarian split squats: 3 sets of 12 reps per leg',
'Diamond push-ups: 3 sets of 10 reps',
'Single-leg glute bridges: 3 sets of 15 reps per leg',
'Tricep dips (on chair): 3 sets of 15 reps',
'Wall sit: 3 sets of 60 seconds',
'Superman holds: 3 sets of 30 seconds',
'Plank: 3 sets of 60 seconds',
'Side plank: 3 sets of 30 seconds each side',
'Cool down stretching: 5 minutes'
]
},
{
id: 'calisthenics-progression',
title: 'Calisthenics Skill Work',
difficulty: 'moderate',
duration: 60,
description: 'Progressive calisthenics for strength and skill development',
exercises: [
'Joint mobility: Wrists, shoulders, hips (5 minutes)',
'Scapular pulls: 3 sets of 10 reps',
'Negative pull-ups: 3 sets of 5 reps (5-second descent)',
'L-sit progression: 3 sets of 15-30 seconds',
'Handstand practice against wall: 5 sets of 30 seconds',
'Pseudo planche lean: 3 sets of 20 seconds',
'Pistol squat progression: 3 sets of 5 reps per leg',
'Muscle-up progression: 3 sets of 5 false grip rows',
'Dips: 3 sets of 10-15 reps',
'Dragon flag progression: 3 sets of 5 reps',
'Hollow body hold: 3 sets of 30 seconds',
'Arch body hold: 3 sets of 30 seconds',
'Front lever progression: 3 sets of 10 seconds',
'Skin the cat: 3 sets of 3 reps',
'Wrist conditioning: 3 minutes',
'Full body stretch: 5 minutes'
]
},
// GENERAL FITNESS - CORE
{
id: 'core-strength-basic',
title: 'Core Strength Fundamentals',
difficulty: 'easy',
duration: 30,
description: 'Foundation core workout for beginners',
exercises: [
'Cat-cow: 10 repetitions',
'Bird dogs: 10 reps each side',
'Dead bugs: 10 reps each side',
'Plank: 3 sets of 30 seconds',
'Side plank: 3 sets of 20 seconds each side',
'Glute bridges: 3 sets of 15 reps',
'Bicycle crunches: 3 sets of 20 reps',
'Russian twists (no weight): 3 sets of 20 reps',
'Leg raises: 3 sets of 10 reps',
'Superman: 3 sets of 12 reps',
'Mountain climbers: 3 sets of 20 reps',
'Child\'s pose: 60 seconds',
'Cobra stretch: 30 seconds',
'Seated forward fold: 60 seconds'
]
},
{
id: 'advanced-core-workout',
title: 'Advanced Core Challenge',
difficulty: 'strenuous',
duration: 60,
description: 'Intense core workout for advanced athletes',
exercises: [
'Dynamic warm-up: 5 minutes',
'Hanging leg raises: 4 sets of 12 reps',
'Ab wheel rollouts: 4 sets of 10 reps',
'Dragon flags: 3 sets of 5 reps',
'Weighted Russian twists: 4 sets of 20 reps',
'Decline sit-ups with weight: 3 sets of 15 reps',
'Plank to pike on stability ball: 3 sets of 12 reps',
'L-sit holds: 3 sets of 20 seconds',
'Side plank with hip dips: 3 sets of 15 reps each side',
'Pallof press: 3 sets of 12 reps each side',
'Turkish get-ups: 3 sets of 3 reps each side',
'Hollow body rocks: 3 sets of 30 seconds',
'V-ups: 3 sets of 15 reps',
'Cool down stretching: 5 minutes'
]
},
// GENERAL FITNESS - FLEXIBILITY
{
id: 'full-body-flexibility',
title: 'Complete Flexibility Routine',
difficulty: 'easy',
duration: 60,
description: 'Comprehensive stretching for overall flexibility',
exercises: [
'Light cardio warm-up: 5 minutes',
'Neck rolls: 10 each direction',
'Shoulder rolls: 15 forward, 15 backward',
'Arm circles: 15 each direction',
'Standing side bends: 10 each side',
'Standing forward fold: Hold 60 seconds',
'Standing quad stretch: 60 seconds each leg',
'Standing figure-4 stretch: 60 seconds each leg',
'Lunging hip flexor stretch: 60 seconds each side',
'Seated hamstring stretch: 60 seconds each leg',
'Butterfly stretch: 90 seconds',
'Seated spinal twist: 60 seconds each side',
'Cat-cow: 15 repetitions',
'Child\'s pose: 60 seconds',
'Cobra stretch: 60 seconds',
'Pigeon pose: 90 seconds each side',
'Lying spinal twist: 60 seconds each side',
'Happy baby pose: 60 seconds',
'Savasana: 3 minutes'
]
},
{
id: 'dynamic-mobility-flow',
title: 'Dynamic Mobility Flow',
difficulty: 'moderate',
duration: 30,
description: 'Flowing movement sequence for mobility and flexibility',
exercises: [
'Joint circles sequence: Ankles, knees, hips, spine, shoulders, neck',
'Sun salutation A: 3 rounds',
'World\'s greatest stretch: 5 reps each side',
'Cossack squats: 10 reps each side',
'Inchworm to push-up: 8 reps',
'Scorpion stretch: 8 reps each side',
'Threading the needle: 10 reps each side',
'Hip circles in tabletop: 10 each direction per leg',
'Downward dog to cobra flow: 10 repetitions',
'Lateral lunges with reach: 8 each side',
'Standing figure-8 hip circles: 10 each direction',
'Arm thread and reach: 8 each side',
'Deep squat with rotation: 10 alternating sides',
'Standing backbend: 5 reps with 3-second holds',
'Reverse prayer position: Hold 30 seconds',
'Deep breathing in child\'s pose: 2 minutes'
]
},
// GENERAL FITNESS - CIRCUIT TRAINING
{
id: 'metabolic-circuit',
title: 'Metabolic Conditioning Circuit',
difficulty: 'strenuous',
duration: 60,
description: 'High-intensity circuit for metabolic conditioning',
exercises: [
'Jump rope: 3 minutes',
'Dynamic stretching: 3 minutes',
'Circuit 1: Kettlebell swings 60 seconds',
'Circuit 1: Box jumps 60 seconds',
'Circuit 1: Battle ropes 60 seconds',
'Circuit 1: Burpees 60 seconds',
'Rest: 90 seconds',
'Circuit 2: Thrusters 60 seconds',
'Circuit 2: Renegade rows 60 seconds',
'Circuit 2: Jump squats 60 seconds',
'Circuit 2: Mountain climbers 60 seconds',
'Rest: 90 seconds',
'Circuit 3: Clean and press 60 seconds',
'Circuit 3: Plank jacks 60 seconds',
'Circuit 3: Skater jumps 60 seconds',
'Circuit 3: Medicine ball slams 60 seconds',
'Rest: 90 seconds',
'Repeat all circuits once more',
'Cool down walk: 3 minutes',
'Stretching: 5 minutes'
]
},
{
id: 'full-body-circuit',
title: 'Total Body Circuit Training',
difficulty: 'moderate',
duration: 60,
description: 'Balanced circuit targeting all major muscle groups',
exercises: [
'Light cardio: 5 minutes',
'Dynamic warm-up: 5 minutes',
'Station 1: Push-ups 60 seconds',
'Station 2: Bodyweight squats 60 seconds',
'Station 3: Dumbbell rows 60 seconds',
'Station 4: Lunges 60 seconds',
'Station 5: Plank 60 seconds',
'Rest: 2 minutes',
'Station 6: Dips 60 seconds',
'Station 7: Step-ups 60 seconds',
'Station 8: Pull-ups or lat pulldown 60 seconds',
'Station 9: Deadlifts 60 seconds',
'Station 10: Bicycle crunches 60 seconds',
'Rest: 2 minutes',
'Repeat entire circuit once more',
'Cool down: 5 minutes stretching'
]
}
];

View file

@ -25,15 +25,3 @@ export interface Experience {
bullets?: string[]; bullets?: string[];
}[]; }[];
} }
export type WorkoutDifficulty = 'recovery' | 'easy' | 'moderate' | 'strenuous';
export type WorkoutDuration = 30 | 60 | 90 | 120 | 150 | 180 | 210 | 240 | 270 | 300;
export interface Workout {
id: string;
title: string;
difficulty: WorkoutDifficulty;
duration: WorkoutDuration;
exercises: string[];
description?: string;
}

20
src/types/resume.ts Normal file
View file

@ -0,0 +1,20 @@
export interface Position {
title: string;
dateRange: string;
responsibilities: string[];
}
export interface Experience {
company: string;
location: string;
positions: Position[];
}
export interface Education {
institution: string;
location: string;
degree: string;
graduationYear: string;
gpa: string;
coursework: string;
}