Project: Complete Web App
- Due Dec 9, 2024 by 10pm
- Points 10
- Submitting a text entry box
For your project you will design and implement an interactive web application. Your app will be a website that allows users to modify and interact with some data or information on a topic of your choosing. You can build a sophisticated web application of your own design, or create a new web platform for a real client such as a student organization, an artist, a non-profit, or a local business. See the Project Proposal for details about what kinds of apps you might create.
The exact topic and structure of the app is up to you; this project is a chance for you to show off your web development skills. But no matter its form or content, you will need to meet the requirements detailed below.
Objectives
By completing this project you will practice and master the following skills:
- Creating new web pages from scratch
- Applying iterative development and modifying existing web projects
- Writing semantically rich and accessible HTML
- Using CSS to gives pages complex formatting and layouts
- Harnessing media queries and CSS frameworks to produce responsive web pages
- Working with fundamental JavaScript functions and data types
- Structuring a web page using React Components
- Using React props and state to make a web page interactive
- Integrating the Firebase web service for storage
- Designing and implementing a full-featured web application
- Synthesizing skills, tools, and concepts from across the course
Getting Setup
For your final project deliverable you will be working in the same repo you created for the Project Proposal. You will set you that repo to hold a React App as part of the second draft. See that assignment for details.
Project Requirements
This page lists the requirements for the final version project. Note however that many of these requirements you will already have completed as part of earlier drafts, so don't panic if they seem overwhelming here!
App Content and HTML Structure
Your project will need to use well-structured and appropriate HTML to define its content, but implemented using the React framework.
Details
- This requirement includes the project structure. Your app will be need to be built using Create React App Links to an external site., as described in the "Getting Setup" section. Note that you'll need to have "cleaned up" the auto-generated files; there should not be anything extraneous in your repository!
-
You'll need to specify the meta data (author and description) for your page in the HTML, modifying the
index.html
file provided by Create React App.You'll also need to specify your favicon—do not use the default React icon!
Note that you will not have more than 1 HTML file—your app will be built as a single-page application (and you'll use client-side routing to show multiple different pages.
- Your page content can be structured however you wish, but must include a header Links to an external site. with appropriate content (including the name of your app) and a footer Links to an external site. with appropriate content (e.g., copyright and contact info).
-
Overall, your web app needs to have sufficient content to make its layout and styling necessary. Just having a single data table won't be sufficient.
One way to ensure you have sufficient content is to make sure your app displays multiple different views of your data. For example, you could display a list of cards as one view, and then allow the use to select (click) on a card to see further details on that record as a second view. You can also display your data in different formats (such as a table and a chart), as long as the different views are meaningful and there is a point to having them both! An interactive map (such as one created with Leaflet Links to an external site.) or chart (such as created with Plotly Links to an external site.) are other ways of presenting content, though will not likely count as "interaction" (see below).
-
Your web site will need to include both text content and at least three (3) notable images or other media content (videos, etc). You are welcome to use stock images if appropriate. Unsplash Links to an external site., Morgue File Links to an external site., and Pixabay Links to an external site. are all good places to start looking for free images. Make sure you have the rights to any images you use, and include appropriate attribution Links to an external site..
Note that the text and images on your page will need to be actual content, not just lorem ipsum placeholder text! You're developing a "real" app!
- Your app will need to include a form (using the
<form>
element) allowing the user to submit some input to the app to interact with it. This can be a "search" or "filter" form. I suggest you aim to have at least two inputs (not just a single text query) in the form to help make your interaction sufficiently complex. - Your app's content needs to be meaningful: it must be complete and real. Any buttons or links on your site need to go somewhere or do something; if they are not functional, remove them! While it's okay to have some "seed" data, user-specific content should not be automatically populated. For example, a new user joining the site should not see a list of "friends" that they haven't actually specified.
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- Project built using create-react-app in the root of the repo. Cleaned up extraneous files
- Specified meta data in HTML (title, author, description, and own favicon)
- Includes sufficient content (e.g., multiple views of the data)
- Includes header element (with app name) and footer (with copyright) elements
- Includes 3+ images or media content
- Includes a form element
- Content is meaningful
React Components and Structure
Your app will need to be developed using the React framework, following the best practices introduced in this course. This requirement category focuses on your effective use of React Components.
Details
-
You will need to organize your app into appropriate Components (with informative and semantically-meaningful names!). You will need to have more than one Component (lots more!), with each Component representing a small, self-contained portion of DOM. You should design Components around the different data views of your app—you do not need to create a new Component for each HTML element, unless there is some specific logic/data that the element uses. Build a clear Component hierarchy!
Tip: Think about what are the different "parts" of your webpage (that change in response to user interaction), and make a Component for each one! Or for each piece of "data" think about how that datum will be rendered—that's a Component!
A good rule of thumb is that each component should render 2-3 levels of the DOM tree (so have 2-3 levels of nested elements). Less than that and maybe it shouldn't be a separate component; more than that and you should consider breaking it up. This is not a hard rule, just a guideline.
Components will need to be self-contained. They should render based purely on their props, without caring about where they are used in the DOM or what else is around them.
- Your components will need to use
props
andstate
appropriately—pass data between components as props, and use state to keep track of any dynamic values. Remember that state should be kept minimal; use props whenever you can! (That said, your app will need to track some state somewhere—it can not be all props). Note that we will not be learning or using Contexts in this course, so you should not use them in your application. -
Your app should only use Components to render content. You must NOT use DOM methods or jQuery—all rendering and DOM manipulation must happen via React state manipulation and render calls. There should be no references to
document
or$
in any of your Components or any of your code (other than theReactDOM.createRoot()
call).
While there aren't a lot of details in this requirement, it is central to fulfilling all the rest of the requirements (you need to effectively use the framework), making it a vital piece of your project.
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- App is broken up into a meaningful component hierarchy; each component reflects a "part" of the page
- Components are appropriately sized and scoped around data props
- Components are defined as self-contained entities
- Data is passed through the app via
props
to components; props and state are appropriately distinguished. - Content is only rendered on through components—no DOM calls!
React Interactivity
Your app will need to use React to provide multiple well-designed interactive features. The user must be able to provide input to the page (via e.g., button clicks, form submissions, mouse movements, etc) and see the content of the page change over time in order to achieve some purpose. Your app will need to support at least "two and a half" significant interactive features (the "half" can be a smaller feature). See "Details" below for what we mean by a "feature".
This requirement category also covers the interactive React code needed to enable these features.
Details
-
Your completed application will need to support at least "two and a half" significant interactive features—the "half" can be a smaller feature, so long as it still demonstrates the full range of the course material.
By "feature", we mean a specific set of user interactions that are used to achieve some goal (similar to a use case Links to an external site.). For example, a recipe app might allow the user to (1, small) search and filter for specific recipes, (2) organize (and reorganize!) those recipes into a "recipe book" for later use, and (3) upload new recipes the site. A chat application might allow the user to (1) send messages to other people, (2, small) organize/filter messages from different "channels" or groups, and (3) organize groups of people/friends who can receive messages.
- Note that all of these examples involve complex interactions. A feature is not just a single button to press. "Viewing" content isn't a feature, nor is navigating to different content. An interactive feature involves the user providing input in order to change some of the data displayed in the app.
- Think about features not in terms of code, but in terms of the task that the user is able to complete! The interaction needs to actually do something meaningful. You are not being graded on "business value", but there should be a point to this interaction.
- Each feature will likely have its own "view" and URL route (see below). If the features don't seem like different "pages" of the app, then they may not be different!
- Integrating Firebase's database is a good way to drive a feature, but is not a feature in itself. "User login" is also not a sufficient feature on its own. There has to be some purpose to the user logging in! That is, the app needs to behave differently depending on who is logged in.
Each feature needs to be involve new, project-specific implementation (code). A feature only counts if it's something you created. Functionality that is copied or substantially adapted from problem sets does not count as a feature. For example, you could include a "search filter" or a "comment" system if that is vital to your app's functionality, but it wouldn't count as a "feature" if you just copy the functionality from the exercises—you will need to go beyond that and do more. Similarly, functionality that is offered entirely through an external library is not sufficient (e.g., showing a Leaflet or Google map is not a feature, no matter how much interactivity they provide).
-
The following are not considered sufficient features on their own:
- A search form. Just displaying the results of a user search will not be considered a complete feature. The user would need to do something meaningful with the result of that search—such as view additional details for each result, interactively filter the data, or interactively visualize/graph the results. Your feature needs to be more than "just" a search form. A simple filter will be covered in an exercise; your app will need to support something more complex than that for it to count.
- User login. While supporting user accounts will help meet the Firebase requirements below, just providing a login form is not a feature on its own. User accounts will need to be used in support of some other interaction. That said, almost any actual use of user accounts will probably count as a feature.
- Generic comments or chat. We'll build a basic chat app as a demo; your project needs to be something else (or something beyond that). If you want your app to include some kind of social communication as its primary purpose (e.g., you're making a Slack clone), then you need to support social interactions by providing some kind of moderation or other ways to avoid spam/trolling/harassment—just letting people post messages isn't sufficient for a feature.
Your features should be complete, in that the user should be able to use your app to achieve their goal—not to only get halfway. We shouldn't use your app and be left thinking "now what?" or "but what do I do with this?". For example, a recipe app can't just have a button to "save recipes" without providing anything to do with those saved recipes! Note that just "seeing results of a search" is rarely a satisfying end point (and often won't meet the interaction requirements). What do people do with their results? What's the next step?
-
Features need to be interactive—they involve the user providing input to the page, which then changes its display in response. Static content (e.g,. a "resources" page) is not considered a feature for this assignment.
Each feature will need at least its own form of user input in order to be interactive. The user needs to be able to interact with or provide input to different DOM elements to perform different actions for each feature. For example, you could have a form that that lets the user filter the data displayed (one feature), and then the ability to save data records into a sublist (second feature).
- Inputs that influence the display in the same way—such as two different filter buttons, or "on" and "off" buttons that toggle a single change, or a "switch views" button—will not count as distinct features. Remember that a "feature" is larger than a single button or "interaction"/
- Remember that your app is required to have a form. A single form counts as a single user input, no matter how many
<input>
elements make up that form. - It is also possible to have a feature in which the content automatically change periodically (e.g., having something update every minute to provide a "live feed" of data). This can count as a form of input (provided it is dynamically changing).
-
In React, this means that the page needs to re-render and display different Components/props in response to user actions/events. Thus you will need to have some event handling defined in your components.
Interactions need to be state-based: interactions need to both read and write to a Component's
state
. Your app must use Componentstate
in a legitimate and significant way. There should be multiple interactions that modify the state, and there should be at least some part of the state that is modified by multiple different interactions (considering the previous state value). If your interactions don't require storing any state data, then they won't meet the project requirements!State information must be stored in the "lowest common ancestor" of the hierarchy as possible—do not save all of your state in the top-level
App
component! Lift the state up only when necessary, passing callback functions so child components can manipulate the lifted state.Interactions must be visible in the page itself, not just in the developer console! Note that "reloading" a page (such as from following a hyperlink) is not considered a form of interaction for these purposes. Links are not features!
IMPORTANT: The fundamental pieces of an interaction are: (1) handling user input events, (2) updating state based on that user input, and (3) rendering content based on the updated state. If you don't have that cycle, then you haven't implemented an interactive feature.
-
Each feature's interaction (the user input and display change it causes) needs to be purposeful—they need to manipulate the displayed content in a way that helps the user better understand the information or achieve some goal. Do not add inputs just for the sake of adding inputs! A button that just reveals more buttons isn't a feature or a worthwhile interaction. We should never left asking "why did I have to click this?"
This is to some extent a usability requirement, but it's also intended to make sure your features are within scope. Note that interactions that change the display based on a user input will almost certainly be purposeful.
Similarly, all your features need to be unified and connected in some way. Your app must not be a set of disconnected functionality, You're doing a group project, not multiple individual projects in the same repo!
Features need to be unique within the project. For example, multiple "filter" forms that that filter different parts of your data would not be considered a single feature (because they'll use the same code).
-
Interacting with your app should be a pleasant and frictionless user experience. Your app should have good usability Links to an external site.. For this project, good usability means:
-
The interactive features of your app need to be discoverable—the user needs to know what interactions are available. This includes instructions for usage and clear labels on elements is needed to make the page intuitive to use. The user should never wonder "where do I click now?" or "what does this button do?"
This also means that elements should be clear about their affordances Links to an external site.—clickable elements should look clickable (including aspects like the cursor changing Links to an external site.). Note that this should apply even to screen readers—use semantic HTML and ARIA attributes for clickable components when appropriate!
We should be able to figure out how to use your app without needing a manual! If more details are needed, make sure your app provides them.
-
Your app needs to provide feedback to the user about their actions (so the app doesn't look like its broken). For example, there should not be noticeable delays between user input and the site's response (you can work around slow responses by giving feedback such as a progress spinner).
Similarly, inform users of any errors that occur; your app should not "silently crash". Provide such feedback by rendering an element to the DOM—a framework component such as an Alert Links to an external site. or a Snackbar Links to an external site. is useful for this. You may not use the
window.alert()
function; all displayed content must remain in the browser.- In React, if an error occurs you can save that error value in the
state
, which will then re-render the component. Have the component conditionally render Links to an external site. (using anif
statement) an "alert" component or element to display the error.
Be sure to show users some kind of visual feedback while your code is performing asynchronous network actions (e.g., communicating with the Firebase servers). This can be a simple "working..." message, or you can use something more professional like an animated spinner icon. There are a number of libraries Links to an external site. that might make this easy.
- One basic strategy: right before you send a request (e.g., to sign in a user or post some data), begin showing the spinner. Once that request is finished (the
.then()
is executed), stop showing the spinner. - You must also inform the user of any errors when using Firebase. For example, if the user attempts to sign in with invalid credentials, you should
.catch()
and display the error message from Firebase, and then make sure that they can try again!
Note that all any feedback or alerts to the user need to be rendered "in-page". You cannot use the
window.alert()
(often just written asalert()
) function; use conditional rendering through React instead. - In React, if an error occurs you can save that error value in the
-
You may need to think hard about how to make your data meaningfully interactive. If you get stuck or are having problems, please check in with us and we can help you brainstorm!
There are a lot of details for this requirement, but in short: include sufficient interactive features, use component state, and make sure the interactions are smooth to use!
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- App has 2.5 interactive features.
- Features involve new, project-specific code
- Features are complete user interactions
- Features are unified
- Features are interactive and state-based.
- Features respond to different user inputs (one of which is a form)
- Interactions both read and write to state variables
- Interactions are visible in the page (not just console log); they change displayed content depending on user input
- Features provide interaction via the event-state-render cycle.
- State information is stored at appropriate levels (in the "lowest common ancestor")
- Interaction is pleasant and frictionless:
- Interactions are discoverable (include instructions)
- Interactions provide feedback, including on errors—particularly for Firebase
Client-Side Routing and Navigation
Your application must be structured as a single-page application using client-side routing (specifically, using the react-router
Links to an external site. library). Your application needs to have at least three (3) different routes. While it's a good idea to make each route/url correspond to a different feature or use case to keep the app organized, this is not required.
Details
Remember that you will need to
install
thereact-router-dom
library andimport
its provided Components in order to use them!-
To receive full credit for this portion of the project, you must include at least one route that uses a path parameter (e.g.,
/route/to/:itemId
) in a meaningful way. Note that having both/items
(which shows a list of items) and/item/:itemId
(which shows a single item's details) counts as two different routes.Firebase database ids make great (if not human readable) path parameters!
When implementing routes, be careful to test all paths of navigation that a user might take to make sure that no data is being lost (such as the user being logged out of your website). If the user mistypes a url, your app should not break!
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- Correctly integrates react-router (specifying
<Route>
s,<Link>
s, etc). - Includes sufficient number of routes (3+).
- Includes 1 route with a path parameter.
- Handles incorrect URLs and changes in access (e.g., login/logout) effectively.
Integrates Another React Library
One of the main skills needed to write impressive web apps being able to harness the hard work done by others, such as by using existing libraries that provide functionality for you. React's architecture facilitates implementing re-usable Components that allow you to easily add additional features and design elements to a web app.
For this project, your web app must include and use at least one third-party React Component or library (other than react-router
or firebaseui
), rendering its provided components in the DOM.
Details
A couple of examples of possible libraries you could use:
-
The
react-bootstrap
Links to an external site. library provides React implementations of Bootstrap components, from Component versions of things likeButtons
andForms
to interactive elements such asCarousels
. (For a Material Design site, you can use e.g. Material-UI Links to an external site. for similar effects). To meet this requirement, you will need to include an interactive widget such as a Carousel or Dropdown, not just a styled<Button>
element. If your web app has a map, then you can use
react-leaflet
Links to an external site. to include a Leaflet map as a React component.You can include data charts in your app via a library such as
recharts
Links to an external site. orreact-charts
Links to an external site..
And there are many, many more possible libraries; you are encouraged to search around and explore! Thing about what kind of functionality/component you need, and do a search for {TOPIC} react
—you'll probably find something! Note that you may need to tweak the functionality of your app to provide a place to use an external component.
Libraries specified in other requirements (i.e.,
react-router
,firebaseui
) do not count towards meeting this requirement.Only libraries that have renderable components count towards this requirement. Coding or architectural utilities such as
lodash
orredux
will not be sufficient.
When searching for other libraries, be sure to evaluate their quality before you use them! Look at the documentation on GitHub: can you understand how to use the library in a few minutes? Has the repo been updated recently? Does it have lots of stars and forks suggesting it is popular? If the answer to any of these questions is "no", you may want to look at something else to do the same work.
In order to use a library in your application you will need to install it with npm
, import
the provided Components, and instantiate them with appropriate props
when you render()
them. Part of this requirement is to be able to install, load, and use a library cleanly!
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- Project imports another library (included in the
package.json
list of dependencies). - App
imports
external components. - App renders imported components (they do something).
- Library components are used in a meaningful way (support the functionality of the app)
Data Persistence (Firebase)
As part of (or in addition to) responding to user input and displaying dynamic content, your app will need to persist some data to database through the Firebase web service.
Details
You will be using Firebase to store data.
- You should use the realtime database to store data for this course; do not use the Firestore database. It is acceptable to also use Firebase Storage if you wish to store images or media.
- You are not required to support user authentication, but most projects will want to have some kind of user-specific data.
- You can store site-based data (e.g., recipes, chat messages), or you can store user-specific data (e.g., a person's favorite recipes or chat preferences). Be sure that any user-specific data is isolated to that user! Remember that such data separate from user accounts (the accounts themselves are not data).
Your app will need to both read from from and write to the Firebase database (the data needs to be dynamic and changeable!) Remember that these are two separate processes: you read from the database by registering a value listener (usually when the comopnent loads), and you write to the database by pushing or setting values (e.g., in response to user actions).
- Reading data from Firebase is an asychronous process, so will need to be specified in an event hook. When the data has been loaded, you can process it and assign it to a
state
value, which will be rendered by the component. - Writing data to Firebase is an asynchronous process; you will need to include
catch()
clauses to handle any errors that may occur (and will be produced by the Promise). - Be sure to properly handle any errors that occur and provide feedback to the user that something went wrong.
You can display the data you load directly, or use it to otherwise customize the interactions the user makes—but your app needs to actually use the data in a significant way! Also make sure that your app remains usable while you want for the data to load (such as by showing a spinner).
The primary purpose of using something like Firebase is to provide data persistence—data inputted by the user will be available even when the page has been refreshed, visited a second time, or accessed from a separate computer. Persisting data to e.g., local storage will not meet this requirement.
- You will want to connect to and download data from Firebase when the app loads.
- This also means that your page will need to be able to load and render correctly whether hte data has been created or not!
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- App integrates Firebase web service
- App both reads from and writes to a Firebase (realtime) database
- Firebase access is properly integrated with React (e.g., through effect hooks)
- Catches and manages (e.g., displays) errors, from both data writing and authentication
- Firebase data is rendered in the app in a meaningful way
- Completed app successfully deployed to Firebase hosting
Site Style and CSS Structure
This is mostly the same requirement as from the draft version of the project
Your project will need to use CSS to specify a custom design and layout for your app's content. This includes colors, typography (fonts), layout, spacing (margin/padding), etc. The design of the app is up to you: I encourage you to get creative with how information might be presented. You might study examples from related pages (e.g., for related apps, systems, or organizations), or look at design examples such as from CSS Zen Garden Links to an external site., the Bootstrap Expo Links to an external site., or the Materialize Showcase Links to an external site..
Reminder: it is not acceptable to build your page using an pre-defined template (e.g., in which you just fill in the content) or similar "pre-built" work. The site you submit should be entirely implemented by you. You are welcome to get design ideas from other sources or look up how to achieve specific effects, but the entire page needs to be coded by you, not by someone else. If you include more than 1 line of code from another source, you need to include an appropriate citation. You will not receive credit for code you did not write yourself.
Details
It is acceptable to use a CSS framework such as Bootstrap when styling your app, though if you do so you must use the most recent version (v5 for Bootstrap) as introduced in class. Moreover, even if you use a framework to help style your app, you will need to include some additional CSS rules of your own to demonstrate your mastery of this material.
As a simple heuristic, something at the design complexity of the iSchool home page or Twitter Links to an external site. would be worth full credit, while something that looks as nice as reddit Links to an external site. would be around 80% credit (satisfactory). And remember: just duplicating features and effects from the exercises will not be worth full credit—do something on your own!
-
You must use CSS to style the page. Define an external stylesheet (e.g.,
style.css
) to contain your rules.We expect you to have a few dozen (20-30+) different CSS rules for this project; you will need that much complexity for the work to be satisfactory. These rules would be in addition to any framework provided styling.
Your page design should include modifications to all of the following: typography (fonts), colors (text or background), spacing (margin/padding), and layout (see below). It's fine if many of these changes are provided by Bootstrap, but you will need to include custom rules yourself. Note that you can use a a tool such as the Material Design Color Tool Links to an external site. to help determine an accessible color palette (and avoid contrast issues). (Adobe Color CC Links to an external site. is another nice color palette tool).
You are welcome and encouraged to go all-out on the artistry—just make sure that the page's content remains navigable, readable, and usable!
-
In order to demonstrate your development skills, your app must not entirely follow the default "flow" of content. You must also use a flexbox or grid to provide substantial "non-standard" layout structures. A multi-column layout is sufficient for full credit (and see Responsiveness below for related requirements). Note that simply using a flexbox to make elements horizontally "inline" will not be sufficient; you should use something like a multi-column layout.
It's acceptable to use a Bootstrap grid to meet this requirement.
Best practice is NEVER use the
float
orposition
properties! Use a flexbox instead! -
Your design (read: CSS styling) needs to be deeply considered with a high level of polish and refinement. This means that you've thought about (and customized!) aspects of the appearance like the color, typography, positioning, etc. While this course does not focus on visual design, we want to make sure that you've actually considered how to use CSS to make a modern and pleasant looking webpage.
You've all visited popular web sites; you should have a sense for what pages "look good" and what pages don't!
For us, a polished app design is:
- readable and navigable: we are able to see all the content, and move through the content without getting confused. Text is large/clear enough to read, buttons say what they do, links are obvious, etc.
- consistent: colors, borders, fonts, spacing, etc. should be consistent throughout and across pages. Ideally, pages should have a shared visual language: for example, elements that are both "cards" should have similar purposes/meanings (see e.g. the explanation here Links to an external site.).
- "clean": make sure that images or text content doesn't overshoot its container, that elements line up with each other, etc. There shouldn't be any visual "bugs".
- You must use Create React App's webpack system for loading external libraries and CSS files (
import
the CSS files through your JavaScript). You should not need to include any<link>
elements in your HTML, and will definitely not have anyscript
elements!
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- Loads an external CSS style sheet
- Stylesheet includes sufficient number of rules (20+)
- CSS changes:
- colors
- fonts/sizes
- margins/padding
- Uses flexbox or grid for non-standard layout (via Bootstrap is fine)
- Has a polished appearance
- readable & navigable
- consistent
- clean
- CSS files and libraries are imported through JavaScript
Accessibility
This is the same requirement as from the draft version of the project
As with everything, your web app should be accessible to all users, including those utilizing screen readers. You can ensure your content is accessible by semantically using HTML, applying appropriate headings and sections to make it navigable, and including text equivalents for the visual content (images) to make it perceivable.
Details
- For semantic html, this means appropriately using elements such as
<main>
and<section>
(though you don't need the latter if there are no sections), headings are used for headings (not to change font size), that you don't use<i>
when you mean<em>
, etc. Also remember that<a>
elements are for links (navigation), while<button>
elements are for interactive elements. Choose the element that reflects what happens when you click on it (and then style it to look however you want). - For navigable html, make sure that your headings form a clear hierarchy. Don't skip heading levels. Think of them as producing a "table of contents" for your content!
- There are particular elements (such as
<label>
) that you will need to use for forms. Be sure to include them! Links to an external site.. - Don't forget your
alt
attributes! If you have an image or graphic that is included via adiv
or something, make sure to give it anaria-label
. - If necessary, make sure to use ARIA attributes (particularly if you utilize components of a CSS framework). Remember: ARIA attributes are for when HTML isn't sufficient! Specify
role
Links to an external site. attributes for interactive elements (such as when you have a div that acts like a button). But don't over-use it; you don't need to specify ARIA attributes for elements that are already semantic! - Also make sure that your color choices have sufficient contrast to be accessible. You can use WebAIM's contrast checker Links to an external site. to check.
Luckily, Create React App includes the react-a11y
Links to an external site. linting library, which is able to detect some accessibility issues as "style" errors and report them in the console. Watch out for these and fix any issues that arise!
See React's Accessibility Guide Links to an external site. for further resources and examples.
You can run your web page through an accessibility checker such as WAVE Links to an external site. or AChecker Links to an external site. to confirm it is accessible. Or better yet, open up a screenreader such as Voice Over and try listening to your work!
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- Uses elements semantically (no
<i>
;<a>
for links, etc) - Correctly uses sectioning elements (
<main>
,<section>
, etc); not needed if no sections - Uses hierarchical headings; doesn't skip levels
- Includes
alt
attributes on all images - Form includes
<label>
elements (withfor
attribute) - Includes
aria-label
androle
attributes when necessary (and only when necessary!) - Colors have sufficient contrast
Responsive Design
This is the same requirement as from the draft version of the project
Your web app must be responsive and usable on both large desktop displays and small mobile devices. This means using adaptive layouts and multiple media sizes (e.g., different resolution images for different devices).
Details
Note that just using a CSS framework such as Bootstrap is not sufficient for this requirement; your CSS must include some media queries to receive full credit.
-
Your site needs to be optimally styled for two categories of screen size: small mobile screens and large desktop screens. In particular, your site needs to be styled to look noticeably and meaningfully different on different screen sizes to accommodate their different affordances. For example, your site could switch to multiple columns as the screen gets large, change the size of cards, add additional images or content, etc. Your media queries need to do something meaningful!
Styling differences can include layout, white-space, font-sizing, media presence, and more.
Just having content "wrap" on smaller screens—even if that wrapping is performed with a flexbox—is not sufficient. We need to see that you've used responsive CSS to purposefully and intentionally customize the page for both small and large displays. This may feel a bit forced, but it's part of demonstrating your mastery of the material! Note that using responsive Bootstrap elements (like a responsive grid) can help meet this requirement.
Remember that you need to do something beyond what is in the exercises to get credit!
-
You must follow mobile-first design principles Links to an external site. when implementing your page. In fact, I encourage you to take a "mobile-first" approach to both your design and to your implementation: make it work on mobile, and then expand to work on desktops.
Remember to specify the
viewport
meta so that your page will actually be responsive!Using a CSS Reset file such as normalize.css Links to an external site. or Bootstrap Reboot Links to an external site. is a good idea for making sure your site looks the same across browsers.
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- Specifies a viewport meta
- Includes media queries to handle 2+ sizes (at least small screens and large screens)
- Mobile-first CSS: media queries at the bottom (modify the small-size default)
- Styling changes on media and large screens
- Layout is noticeably and meaningfully different on different screen sizes
- Page content is polished on all screen sizes
Clean Coding Style
A requirement when writing any code is to make sure it is written well. Your code needs to be valid, clean, and readable. You should follow the best practices discussed in class, as well as the style guidelines described in the course text style guide Links to an external site..
A note on grading: Assessment of code style will be used as a "limiter" in grading your project—the project as a whole cannot receive a higher score than this individual aspect. This is to help ensure that work you submit has been crafted by you to match the requirements of the course beyond any external support or tools used.
Details
- All your code needs to be well-organized in your repo. You should use multiple files (modules) and folders to organize your React Components to make sure your structure is clear and readable. DO NOT put your entire app into a single
App.js
file with thousands of lines of code! Break it up into parts so it's easy to understand the organization of your app. -
HTML code needs to be valid and well organized. For example: only use block elements inside of block elements, etc.
Please also use clear and consistent indentation/spacing when writing your HTML (in React!) so it's easy to read.
-
CSS code needs to be well designed and organized. Use descriptive class names (not just
.thing1
). Only use id selectors when accessing DOM elements from the JavaScript; otherwise use class selectors for styling (they are cleaner). Avoid duplicating CSS rules/properties; use a shared class or group selector instead. Be sure and use comments to help organize your CSS (e.g., "block out" which rules apply to which part of the page).Remember to use a "mobile-first" approach! That means that your media queries should be at the bottom, after you've defined the "normal" rules.
- Your JavaScript code (apart from the React framework) needs to show good programming style.
-
You should effectively use the React framework when implementing your site. This includes:
- Developing effective and well-scoped and named Components (see above for details)
- Using function components and hooks as taught in this course. If you find other examples/tutorials that use class components, you should switch them to match the overall style of your app if at all possible.
- If you inline a
.map()
function inside of areturn
statement your project will not be considered satisfactory. Do not do that! This is very messy practice; use a separate variable to help with testing and readability! - Whenever the code becomes difficult to understand (or just very long), be sure and include comments and documentation explaining how it works. There are not specific commenting requirements and you do not need to comment every line of code (in fact you probably don't need many comments at all!), but you should provide comments whenever the code does anything complex to help the reader follow what is going on.
-
Be sure to check the developer console for warnings and errors, including linting/styling warnings, and to address those! Your code should run cleanly without any warnings or errors.
(There are no provided Jest tests for linting; you'll need to just check the developer console of your running app).
- When in doubt, consult the course text style guide Links to an external site. or ask us!
Coding style is important for readability (so we can understand your work!) and for maintainability (so you can iterate on this in the future). Thus it is vital that your code is well-written per the requirements of this class. Poorly written code may make a project unsatisfactory until the problems are fixed, regardless of the quality of the site produced.
Checklist
Below is a "checklist" that you can use to make sure you met all of the requirements for this section.
- Follows all the guidelines in the course text style guide Links to an external site..
- Organized files in repo
- Valid HTML
- No invalid usage
- No redundant elements
- Clean and consistent indentation
- Well-designed CSS
- Informative class names
- Effective selectors (e.g., no id selectors)
- No inappropriate duplication of rules
- Organized in file, with comments to "group" sets of rules
- Well-written JavaScript
- Informative variable and function names
- Uses
let
andconst
instead ofvar
- Functions avoid side effects (pure-ish)
- Sensible variables and data types (especially arrays vs. objects)
- Remove extraneous
console.log
calls
- Correct and idiomatic usage of React framework
- Uses well-scoped and informatively-named function components and hooks
- Does not define functions (including inline
.map()
) inside of areturn
statement or inline expression! - Includes comments if and only if necessary for understanding the code.
- Running app does not present any errors or warnings in the developer console.
Working as a Group
You will need to work as a group to complete this project. Each person will need to contribute to its development—that means contributing code.
All group members need to contribute to all aspects of the code to demonstrate that they understand the material. DO NOT divide up the work by language (e.g., have one person do the HTML/CSS and one do the React work)—this will in fact make it harder to implement the project. A better approach is to divide up the work by feature. That will ensure that everyone is able to contribute to all aspects of the material.
As with the previous draft, you are expected to use git
to share and collaborate on code. Each person will need to make some changes, commit their work, pull/merge the changes from other people, and then push the compiled code to GitHub.
We will grade the final compiled work that exists on the main
branch, as well as checking the commit history to confirm that all group members have demonstrated mastery of all of the material. We will be looking to see that each person has contributed substantively all aspects of the project: defining CSS, implementing React Components, and defining interactions (including event handling and state manipulation).
In addition, you will be required to fill out a peer evaluation Links to an external site. to help us evaluate group collaboration.
Submitting the Project
In order to submit the project, you will need to perform a couple of steps:
1. Confirm that the project is complete
Make sure your project works and meets all requirements. Check for bugs (look at the developer console), have someone else try to use the app, etc.
Also make sure the app works correctly when deployed! Make sure features still work, images load correctly, you don't have dead links, everything looks correct, etc.
(Although not required, it's a good idea to also update the
README.md
file to describe your project).
2. Tag Final Commit
For each deliverable, you will need to tag your commit so we know what version to grade. For this deliverable, you should tag it final
Make sure you tag the last commit on the main
branch, and push
the tag to GitHub!
For example:
git tag final
git push --tags
(If necessary, you can tag small fixes as final.1
, final.2
, etc.) -->
3. Deploy Web Page
At the end of the project, you will need to "publish" your styled webpage to Firebase Hosting (not Github Pages!). See the instructions in the second draft description for details. You should be able to access your app at e.g.,
https://firebase-project-id.web.app/
(or replacing firebase-project-id
with the name of your project)
4. Submit Peer Evaluation
Make sure that each group member has filled out the peer evaluation
Links to an external site.. All team members must complete this!
5. Submit to Canvas
Be sure to add
and commit
the final version of your work and push
your code to your GitHub repository (we will be grading the code on the main
branch).
Then submit both (1) a link to your code repo and (2) a link to your published web site to Canvas using the button at the top of the page.
Only one person in the group needs to submit the links to Canvas!
Grading Rubric
In assessing your project, our goal is to determine whether you've learned the course material at a sufficient level, as demonstrated by your project work. This project will be graded on a scale from 0 to 10 based on the below rubric:
Score | Description |
---|---|
10/10 | [Satisfactory] Project meets all requirements, and demonstrates a high level of mastery of the course material. The project is well designed and implemented, functioning without errors or problems and with a high level of polish and refinement. |
8/10 | [Satisfactory] Project meets most requirements, and demonstrates sufficient mastery of the course material. The project may display minor errors or problems with design, implementation, or functionality, or lack some polish or refinement. |
6/10 | [Unsatisfactory] Project meets many—but not all—requirements, and demonstrates partial mastery of the course material. The project may have major issues in design, implementation, or functionality ("works some of the time"). |
4/10 | [Unsatisfactory] Project meets only a few requirements, and demonstrates understanding (but not mastery) of course material. The project may be mostly non-functional, with significant issues in design and implementation. Project may be started but incomplete ("half done"). |
0/10 | [Unsatisfactory] Project is missing or meets no requirements. Project demonstrates no understanding of the course material. |
The categories of requirements listed above should not be considered equal in weight; the "React Components" and "React Interactivity" requirements are almost half of the project! Additionally, note that some requirements, if missing, will be enough for a project to be considered unsatisfactory. For example, you can't have a satisfactory project if it doesn't meet accessibility requirements (no matter how impressive the interaction!). Egregious programming errors can also cause a project to be unsatisfactory. Basically you need to make sure to handle things we think are really important to have a satisfactory project!
The below rubric has approximate weights for each category. These aren't mathematically exact, but should give you a sense for where to devote your attention.
Additionally, if a team member does not contribute to all aspects of the project (including interactive React features), that individual will not earn a satisfactory grade on the project.
Rubric
Criteria | Ratings | ||
---|---|---|---|
App Content and HTML Structure (~10%)
|
|||
React Components and Structure (~15%)
|
|||
React Interactivity (~30%)
|
|||
Client-Side Routing and Navigation (~5%)
|
|||
Integrates Another React Library (~5%)
|
|||
Data Persistence (Firebase) (~10%)
|
|||
Site Style and CSS Structure (~10%)
|
|||
Accessibility (~5%)
|
|||
Responsive Design (~5%)
|
|||
Clean Coding Style (~5%)
|
|||
|