Web Design for Everybody:
Coursera Capstone Project

Project URL 1: monakelleherrealtor.com

Project URL 2: 404 error page with responsive design: 404 error page

W3.org screenshots of html validations for each page.

Overview

The project I selected is building a website from scratch for my wife, Mona, who is a Licensed Real Estate Broker servicing the Portland Oregon metropolitan region. This site replaces one that I had set up in Wordpress which was installed on a self-hosted server in Amazon Web Services (AWS). The objective is a live static-website (no servers required) self-hosted in my AWS account in an AWS S3 (Secure Self Storage) bucket, the site is responsive, designed for accessibility, and passes both HTML and CSS validation.

Design Considerations

The site is designed for mobile first and has two responsive breaks, one at 480px and the other at 736 px. I chose these values after considering the range of mobile and tablet devices likely to be used, a web search on common break points in responsive designs, and a subjective assessment of how the site design looked and behaved at various sizes. The smallest screen size I used was for the iPhone 5/SE, please do not use any screen sizes smaller than 280px, the site is not designed to perform on screens narrower than 280px. I chose a color pallette from colorpallette.org and augmented it with additional tints and shades using maketintsandshades.com as required in order to stay consistent with the color palette and still pass accessibility validation

Responsive Design Elements

The Headers and Footers are responsive and rearrange at the design breaks. In addition the css adjusts formatting as the screen size increases. I coded an error page that is not reached by the menu that also meets the criteria for substantially transforming the look of the page by rearranging the location of elements within the content area. The link is provided above.

Key features for grading

The Capstone requires 3-4 additional features that are considered extras above and beyond the assignments in the class. The following items should be considered for that requirement:

Discussion

The navigation bar was adapated from one I found on youtube from a site called Coding Nepal. I had to modify it by reconfiguring the buttons which are named based on the content, I changed the hamburger from a fixed position and put it into a div in the header so I could better manipulate it's location relative to other header contents. I changed some formatting and created a separate js file for the jquery functions and moved the formatting into my css file. It's working fine but after discovering the ability to toggle children and siblings with jquery I think I could simplify the code a great deal from the original if I had more time to spend on it, on hindsight the code seems unnecessarily complex and awkward to support onging updates with new content.

The Blog Page uses a jquery method called slidingToggle, which is a little bit fancier and nicer than the simple toggle method I initially considered. I found some ways using javascript that just seemed too complex and felt it was worth trying to find something simpler. I plan on improving this by adding an additional function call into the toggle() method to update the text on the show/hide but I need to complete a few other projects first. From what I read I should be able to change the DOM for the text in the button with an additional callback.

Much effort went into the headers and footers trying to get them to behave, I redid them a number of times as I travelled up the learning curve. I chose to put the various elements into containers so I could manage arranging the containers without messing too much with the content of the containers. I also found that it was convenient to use a mix of absolute and responsive measures, mixing pixels with ems and percentages. This allowed me to limit the number of things that were changing at once. I would make sure that the layout maintained it's integrity to the next breakpoint, then I would make the changes necessary for the range in the next mediaquery. Once I had headers and footers that always looked pretty good and stayed where they belonged the page content was simpler to manage. They aren't perfect but I can always improve them later as I learn more.

Some comments about self-hosting on AWS

I have spent some time pursuing certifications in AWS, at first I was just motivated to gain familiarity but then decided to pursue a deeper understanding of the various services offered and the value they provide. This lead to the realization I could tap into a tremendous resource if I learned some web development skills. At first I planned on doing the setups manually but then I found a GitHub CloudFormation template offered by AWS that is simple to execute and delivers the perfect highly performant, secure static website, meaning very low cost because you don't have to consume and pay for server time. It's not a solution for every web site and it's not something a novice should attempt but if someone has some interest and technical skills and plans on doing lots of web development it's an option to consider. The backend and performance on this site is as good as you would get if you were a Fortune 5 company and there are no annoying ads to drop in.

Content-Security-Policy

The unexpected challenge was the additional work needed to implement a Content-Security-Policy on the CDN in order to protet against cross site scripting attacks that exploit weakness in a web page. I couldn't find a way around this so and decided it was best just to learn it and implement it on the site as a security best practice. Overall my choice of architecture forced me to pay close attention and adhere to secure coding practices.

Testing and Deploying on a CDN - Content Distribution Network

Some production conditions were difficult if not impossible to duplicate in my desktop environment, this meant that I would have to write code but before I knew if it would work I had to put it into my production environment and make sure everything worked with the security protocols in place. This also required that I pay attention to the cache on the edge of the CDN, I had to either clear the cache or version docs so that I was seeing the updated versions and not the cached versions of the previously deployed versions.