diff --git a/CSS/main.css b/CSS/main.css deleted file mode 100644 index e8b7bdb..0000000 --- a/CSS/main.css +++ /dev/null @@ -1,76 +0,0 @@ -/** { - border: 1px solid red !important; -}*/ - -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -@media only screen and (max-width: 500px) { - p { - display: none; - } -} - -.grid { - margin: 0 auto; - max-width: 1200px; - width: 100%; -} - -.row { - width: 100%; - display: flex; - flex-wrap: wrap; -} - -.col-j1 { - width: 8.33%; -} - -.col-j2 { - width: 16.66%; -} - -.col-j3 { - width: 25%; -} - -.col-j4 { - width: 33.33%; -} - -.col-j5 { - width: 41.66%; -} - -.col-j6 { - width: 50%; -} - -.col-j7 { - width: 58.33%; -} - -.col-j8 { - width: 66.66%; -} - -.col-j9 { - width: 75%; -} - -.col-j10 { - width: 83.33%; -} - -.col-j11 { - width: 91.66%; -} - -.col-j12 { - width: 100%; -} diff --git a/CSS/main.min.css b/CSS/main.min.css deleted file mode 100644 index eb28ffb..0000000 --- a/CSS/main.min.css +++ /dev/null @@ -1 +0,0 @@ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}@media only screen and (max-width:500px){p{display:none}}.grid{margin:0 auto;max-width:1200px;width:100%}.row{width:100%;display:flex;flex-wrap:wrap}.col-j1{width:8.33%}.col-j2{width:16.66%}.col-j3{width:25%}.col-j4{width:33.33%}.col-j5{width:41.66%}.col-j6{width:50%}.col-j7{width:58.33%}.col-j8{width:66.66%}.col-j9{width:75%}.col-j10{width:83.33%}.col-j11{width:91.66%}.col-j12{width:100%} \ No newline at end of file diff --git a/CSS/style.css b/CSS/style.css deleted file mode 100644 index eab5044..0000000 --- a/CSS/style.css +++ /dev/null @@ -1,143 +0,0 @@ -/* Stylesheet for Project 1 of Udacity FEND program */ -/* Author: James Fehr */ - -/* ELEMENTS */ - -* { - font-family: "Fira Sans"; - color: #33334d; -} - -nav a, -button { - min-width:48; - min-height:48; -} - -a { - text-decoration: none; -} - -body { - /*background-color: #231f20;*/ - background-color: #ffffff; -} - -h1 { - font-size: 96px; - font-variant: small-caps; - font-weight: 400; - font-family: "Fira Sans", verdana, sans-serif; - padding: 0; - border: 0; - margin: 0; - word-wrap: break-word; - overflow-wrap: break-word; - white-space: pre-wrap; -} -@media only screen and (max-width: 500px) { - h1 { - font-size: 4em; - } - h2 { - font-size: 2em; - } - h3 { - font-size: 2em; - } -} -h4{ - font-size: 1.25em; - font-family: "Fira Sans", verdana, sans-serif; - word-wrap: break-word; - overflow-wrap: break-word; - white-space: pre-wrap; - vertical-align: middle; - padding: 0; - border: 0; - margin: 0; - text-decoration: none; - font-style: normal; - font-weight: 400; -} -h2 { - font-variant: small-caps; - font-size: 24px; - font-family: "Fira Sans", verdana, sans-serif; - padding: 0; - border: 0; - margin: 0; - word-wrap: break-word; - overflow-wrap: break-word; - white-space: pre-wrap; - vertical-align: middle; -} - -h3 { - font-variant: small-caps; - font-size: 22px; - align: center; - font-family: "Fira Sans", verdana, sans-serif; - text-align: center; - padding: 0 0 0; - line-height: 0.1; - word-wrap: break-word; - overflow-wrap: break-word; - white-space: pre-wrap; - text-decoration: none; - font-weight: 400; -} - -img { - max-width: 100%; -} - -/* CLASSES */ -.divider { - width: 100%; - min-height: 5px; - background-color: #33334d; - align-self: center; - font-family: "Fira Sans", verdana, sans-serif; - font-weight: lighter; - font-size: 22px; -} - -.divider-f { - width: 100%; - min-height: 5px; - align: relative 50; - text-indent: 50; - color: #33334d; - font-family: "Fira Sans", verdana, sans-serif; - font-weight: 400; - font-size: 22px; -} - - -.logo { - border-radius: 70px 40px; - border: 10px solid #33334d; - padding: 15px; - width: 135px; - height: 130px; - align: center; -} - -.banner { - width: 100%; - height: 250px; - padding-top: 5px; - background-color: #33334d; - background-image: - -webkit-linear-gradient(left, #4976C9, #33334d); - background-image: - -o-linear-gradient(left, #4976C9, #33334d); - background-image: - linear-gradient(to right, #4976C9, #33334d); -} - -/* IDs */ -#feat-item { - padding: 8.33%; -} diff --git a/CSS/style.min.css b/CSS/style.min.css deleted file mode 100644 index fe54462..0000000 --- a/CSS/style.min.css +++ /dev/null @@ -1 +0,0 @@ -*{font-family:"Fira Sans";color:#33334d}nav a,button{min-width:48;min-height:48}a{text-decoration:none}body{background-color:#fff}h1{font-size:96px;font-variant:small-caps;font-weight:400;font-family:"Fira Sans",verdana,sans-serif;padding:0;border:0;margin:0;word-wrap:break-word;overflow-wrap:break-word;white-space:pre-wrap}@media only screen and (max-width:500px){h1{font-size:4em}h2{font-size:2em}h3{font-size:2em}}h4{font-size:1.25em;font-family:"Fira Sans",verdana,sans-serif;word-wrap:break-word;overflow-wrap:break-word;white-space:pre-wrap;vertical-align:middle;padding:0;border:0;margin:0;text-decoration:none;font-style:normal;font-weight:400}h2{font-variant:small-caps;font-size:24px;font-family:"Fira Sans",verdana,sans-serif;padding:0;border:0;margin:0;word-wrap:break-word;overflow-wrap:break-word;white-space:pre-wrap;vertical-align:middle}h3{font-variant:small-caps;font-size:22px;align:center;font-family:"Fira Sans",verdana,sans-serif;text-align:center;padding:0;line-height:.1;word-wrap:break-word;overflow-wrap:break-word;white-space:pre-wrap;text-decoration:none;font-weight:400}img{max-width:100%}.divider{width:100%;min-height:5px;background-color:#33334d;align-self:center;font-family:"Fira Sans",verdana,sans-serif;font-weight:lighter;font-size:22px}.divider-f{width:100%;min-height:5px;align:relative 50;text-indent:50;color:#33334d;font-family:"Fira Sans",verdana,sans-serif;font-weight:400;font-size:22px}.logo{border-radius:70px 40px;border:10px solid #33334d;padding:15px;width:135px;height:130px;align:center}.banner{width:100%;height:250px;padding-top:5px;background-color:#33334d;background-image:-webkit-linear-gradient(left,#4976c9,#33334d);background-image:-o-linear-gradient(left,#4976c9,#33334d);background-image:linear-gradient(to right,#4976c9,#33334d)}#feat-item{padding:8.33%} \ No newline at end of file diff --git a/README.md b/README.md index a41573e..a39c99e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,23 @@ # Portfolio + **Portfolio of work** The project is to mock up a portfolio in a grid based pattern. -It has been *updated* with my own work to show off what I have done and provide easy access to projects as an ongoing +It has been *updated* with my own work to show off what I have done and provide easy access to projects as an ongoing and organic entity. -**Sept 19/15** +## **Sept 19/15** + - Updated links to my own work after publishing the repositories on Github - Added a picture of the Bugged game for Project 3 + +### May 31, 2025 + +- Converted Portfolio from Knockout.JS to React.JS +- Updated Education from Front-End Web Developer to General IT Developer +- Added hamburger menu with projects and contact options +- projects are setup using a toggle system, show/hide + +- update added About section describing certifications/diplomas + +- planned update is to sort the projects into languages used { eg: Python, HTML, Javascript, C#, VBasic } diff --git a/img/AirBus.png b/img/AirBus.png new file mode 100644 index 0000000..cb8de3a Binary files /dev/null and b/img/AirBus.png differ diff --git a/img/BS3.png b/img/BS3.png new file mode 100644 index 0000000..a5a8817 Binary files /dev/null and b/img/BS3.png differ diff --git a/img/CalcV6.png b/img/CalcV6.png new file mode 100644 index 0000000..585b935 Binary files /dev/null and b/img/CalcV6.png differ diff --git a/img/Club.png b/img/Club.png new file mode 100644 index 0000000..ed6a523 Binary files /dev/null and b/img/Club.png differ diff --git a/img/Kingdom.png b/img/Kingdom.png new file mode 100644 index 0000000..2190815 Binary files /dev/null and b/img/Kingdom.png differ diff --git a/img/NoteApp.png b/img/NoteApp.png new file mode 100644 index 0000000..f56f18d Binary files /dev/null and b/img/NoteApp.png differ diff --git a/img/PortfolioDeux.png b/img/PortfolioDeux.png new file mode 100644 index 0000000..ab89ef9 Binary files /dev/null and b/img/PortfolioDeux.png differ diff --git a/img/SSResumeTop.png b/img/SSResumeTop.png new file mode 100644 index 0000000..51c5e3f Binary files /dev/null and b/img/SSResumeTop.png differ diff --git a/img/Under Construction PNG - Free Download.jpeg b/img/Under Construction PNG - Free Download.jpeg new file mode 100644 index 0000000..351c187 Binary files /dev/null and b/img/Under Construction PNG - Free Download.jpeg differ diff --git a/img/banner.jpg b/img/banner.jpg new file mode 100644 index 0000000..2b04971 Binary files /dev/null and b/img/banner.jpg differ diff --git a/img/bkgrd_codingAbs.jpg b/img/bkgrd_codingAbs.jpg new file mode 100644 index 0000000..33caa86 Binary files /dev/null and b/img/bkgrd_codingAbs.jpg differ diff --git a/img/calcV2.png b/img/calcV2.png new file mode 100644 index 0000000..83a21ff Binary files /dev/null and b/img/calcV2.png differ diff --git a/img/code.png b/img/code.png new file mode 100644 index 0000000..05eba2e Binary files /dev/null and b/img/code.png differ diff --git a/img/gh.png b/img/gh.png new file mode 100644 index 0000000..5853419 Binary files /dev/null and b/img/gh.png differ diff --git a/img/j.png b/img/j.png new file mode 100644 index 0000000..8edbb77 Binary files /dev/null and b/img/j.png differ diff --git a/img/mail.png b/img/mail.png new file mode 100644 index 0000000..cf044bd Binary files /dev/null and b/img/mail.png differ diff --git a/img/moonCycles (2015_08_02 02_28_36 UTC).png b/img/moonCycles (2015_08_02 02_28_36 UTC).png new file mode 100644 index 0000000..ff5913a Binary files /dev/null and b/img/moonCycles (2015_08_02 02_28_36 UTC).png differ diff --git a/img/pvm6.png b/img/pvm6.png new file mode 100644 index 0000000..6550cd7 Binary files /dev/null and b/img/pvm6.png differ diff --git a/img/redcube (2015_08_02 02_28_36 UTC).png b/img/redcube (2015_08_02 02_28_36 UTC).png new file mode 100644 index 0000000..30600c4 Binary files /dev/null and b/img/redcube (2015_08_02 02_28_36 UTC).png differ diff --git a/img/switz.jpg b/img/switz.jpg new file mode 100644 index 0000000..445b8bd Binary files /dev/null and b/img/switz.jpg differ diff --git a/img/thumb 1.png b/img/thumb 1.png new file mode 100644 index 0000000..99baa01 Binary files /dev/null and b/img/thumb 1.png differ diff --git a/img/thumb 2.png b/img/thumb 2.png new file mode 100644 index 0000000..d47e8ff Binary files /dev/null and b/img/thumb 2.png differ diff --git a/img/thumb 3.png b/img/thumb 3.png new file mode 100644 index 0000000..5e287ec Binary files /dev/null and b/img/thumb 3.png differ diff --git a/img/water-1761027.jpg b/img/water-1761027.jpg new file mode 100644 index 0000000..59cf474 Binary files /dev/null and b/img/water-1761027.jpg differ diff --git a/index.html b/index.html index c3c152e..bbff188 100644 --- a/index.html +++ b/index.html @@ -1,66 +1,377 @@ + + + + + James Fehr + + + + + + + + + - - - - - - - - - - - - James Fehr - - + + + + +
+ +
+ +
+
+ + + + + + + -
- -
-
-

jf

+ function HamburgerMenu({ onProjectsToggle, projectsVisible, onAboutToggle, aboutVisible }) { + const [open, setOpen] = React.useState(false); + + // Close menu on outside click + React.useEffect(() => { + function handleClick(e) { + if (!e.target.closest('.hamburger') && !e.target.closest('.menu-dropdown')) { + setOpen(false); + } + } + if (open) document.addEventListener('mousedown', handleClick); + return () => document.removeEventListener('mousedown', handleClick); + }, [open]); + + return ( +
+
setOpen(o => !o)} aria-label="Open menu" tabIndex={0}> +
+
-
- -
-
-
Featured Work - - -
- -
-
-
- + ); + } + + function HamburgerMenuApp({ projectsVisible, aboutVisible, onProjectsToggle, onAboutToggle }) { + return ( + + ); + } + + function MainContentApp({ projectsVisible, aboutVisible }) { + return ( + <> + + + + ); + } + + function RootApp() { + const [projectsVisible, setProjectsVisible] = React.useState(false); + const [aboutVisible, setAboutVisible] = React.useState(false); + + // Render hamburger menu in menu-root + React.useEffect(() => { + ReactDOM.createRoot(document.getElementById('menu-root')).render( + setProjectsVisible(v => !v)} + onAboutToggle={() => setAboutVisible(v => !v)} + /> + ); + }, [projectsVisible, aboutVisible]); + + return ( + + ); + } + + // Render main content (About, Projects) in root + ReactDOM.createRoot(document.getElementById('root')).render(); + + diff --git a/js/script.js b/js/script.js deleted file mode 100644 index 561e06b..0000000 --- a/js/script.js +++ /dev/null @@ -1,25 +0,0 @@ -// Class for project grid -function Project(name, url, pic, git) { - var self = this; - self.name = name; - self.url = ko.observable(url); - self.pic = ko.observable(pic); - self.git = ko.observable(git); -} - -// ViewModel for the screen -function ProjectViewModel() { - var self = this; - - self.projects = ko.observableArray([ - new Project('Portfolio', 'http://turtle-head.github.io/Portfolio', 'img/portfolio-min.png', 'https://github.com/Turtle-Head/Portfolio'), - new Project('Bugged', 'http://turtle-head.github.io/Bugged/', 'img/bugged-min.png', 'https://github.com/Turtle-Head/Bugged'), - new Project('Killboard', 'http://turtle-head.github.io/Killboard/', 'img/ukcr-min.png', 'https://github.com/Turtle-Head/Killboard'), - new Project('Cat Clicker', 'http://turtle-head.github.io/CatClicker/', 'img/catClicker-min.png', 'https://github.com/Turtle-Head/CatClicker'), - new Project('skelsart.ca', 'http://skelsart.ca', 'img/skel-min.png', 'https://github.com/Turtle-Head/skelsart'), - new Project('Gelp', 'http://turtle-head.github.io/Project5/', 'img/gelp-min.png', 'https://github.com/Turtle-Head/Project5'), - new Project('Feed Reader', 'http://turtle-head.github.io/FeedReader-P6/', 'img/feedreader-min.png', 'https://github.com/Turtle-Head/FeedReader-P6') - ]); -} - -ko.applyBindings(new ProjectViewModel()); diff --git a/js/script.min.js b/js/script.min.js deleted file mode 100644 index f79666f..0000000 --- a/js/script.min.js +++ /dev/null @@ -1 +0,0 @@ -function Project(e,d,c,a){var b=this;b.name=e;b.url=ko.observable(d);b.pic=ko.observable(c);b.git=ko.observable(a)}function ProjectViewModel(){var a=this;a.projects=ko.observableArray([new Project("Portfolio","http://turtle-head.github.io/Portfolio","img/portfolio-min.png","https://github.com/Turtle-Head/Portfolio"),new Project("Bugged","http://turtle-head.github.io/Bugged/","img/bugged-min.png","https://github.com/Turtle-Head/Bugged"),new Project("Killboard","http://turtle-head.github.io/Killboard/","img/ukcr-min.png","https://github.com/Turtle-Head/Killboard"),new Project("Cat Clicker","http://turtle-head.github.io/CatClicker/","img/catClicker-min.png","https://github.com/Turtle-Head/CatClicker"),new Project("skelsart.ca","http://skelsart.ca","img/skel-min.png","https://github.com/Turtle-Head/skelsart"),new Project("Gelp","http://turtle-head.github.io/Project5/","img/gelp-min.png","https://github.com/Turtle-Head/Project5"),new Project("Feed Reader","http://turtle-head.github.io/FeedReader-P6/","img/feedreader-min.png","https://github.com/Turtle-Head/FeedReader-P6")])}ko.applyBindings(new ProjectViewModel()); \ No newline at end of file diff --git a/unused-scripts/script.js b/unused-scripts/script.js new file mode 100644 index 0000000..cdf885d --- /dev/null +++ b/unused-scripts/script.js @@ -0,0 +1,25 @@ +// Class for project grid +function Project(name, url, pic, git) { + var self = this; + self.name = name; + self.url = ko.observable(url); + self.pic = ko.observable(pic); + self.git = ko.observable(git); +} + +// ViewModel for the screen +function ProjectViewModel() { + var self = this; + + self.projects = ko.observableArray([ + new Project('Portfolio', 'http://turtle-head.github.io/Portfolio', 'img/Portfolio.png', 'https://github.com/Turtle-Head/Portfolio'), + new Project('Bugged', 'http://turtle-head.github.io/Bugged/', 'img/Bugged.png', 'https://github.com/Turtle-Head/Bugged'), + new Project('Unknown Crusade Killboard', 'http://turtle-head.github.io/Killboard/', 'img/UKCR.png', 'https://github.com/Turtle-Head/Killboard'), + new Project('Cat Clicker', 'http://turtle-head.github.io/CatClicker/', 'img/CatClicker.png', 'https://github.com/Turtle-Head/CatClicker'), + new Project('Skel\'s Art Studio', 'http://skelsart.ca', 'img/skelsart.jpg', 'https://github.com/Turtle-Head/artshow-demo'), + new Project('Gelp: Neighborhood Map Project', 'http://turtle-head.github.io/Project5/', 'img/gelp.jpg', 'https://github.com/Turtle-Head/Project5'), + new Project('Feed Reader: Testing', 'http://turtle-head.github.io/FeedReader-P6/', 'img/feedreader.png', 'https://github.com/Turtle-Head/FeedReader-P6') + ]); +} + +ko.applyBindings(new ProjectViewModel()); diff --git a/unused-scripts/script.min.js b/unused-scripts/script.min.js new file mode 100644 index 0000000..601b335 --- /dev/null +++ b/unused-scripts/script.min.js @@ -0,0 +1 @@ +function Project(e,d,c,a){var b=this;b.name=e;b.url=ko.observable(d);b.pic=ko.observable(c);b.git=ko.observable(a)}function ProjectViewModel(){var a=this;a.projects=ko.observableArray([new Project("Portfolio","http://turtle-head.github.io/Portfolio","img/Portfolio.png","https://github.com/Turtle-Head/Portfolio"),new Project("Bugged","http://turtle-head.github.io/Bugged/","img/Bugged.png","https://github.com/Turtle-Head/Bugged"),new Project("Unknown Crusade Killboard","http://turtle-head.github.io/Killboard/","img/UKCR.png","https://github.com/Turtle-Head/Killboard"),new Project("Cat Clicker","http://turtle-head.github.io/CatClicker/","img/CatClicker.png","https://github.com/Turtle-Head/CatClicker"),new Project("Skel's Art Studio","http://skelsart.ca","img/skelsart.jpg","https://github.com/Turtle-Head/artshow-demo"),new Project("Gelp: Neighborhood Map Project","http://turtle-head.github.io/Project5/","img/gelp.jpg","https://github.com/Turtle-Head/Project5"),new Project("Feed Reader: Testing","http://turtle-head.github.io/FeedReader-P6/","img/feedreader.png","https://github.com/Turtle-Head/FeedReader-P6")])}ko.applyBindings(new ProjectViewModel()); \ No newline at end of file