From 21fbd59417eeda85ad480f6e1918c5f883ab8973 Mon Sep 17 00:00:00 2001 From: Jacobie Jackson Date: Sat, 5 Sep 2026 21:40:18 -0500 Subject: [PATCH] Add Photo Shot List Planner for issue #1245 --- PhotoShotListPlanner/cobie1818/README.md | 80 +++++ PhotoShotListPlanner/cobie1818/index.html | 86 ++++++ PhotoShotListPlanner/cobie1818/screenshot.png | Bin 0 -> 55980 bytes PhotoShotListPlanner/cobie1818/script.js | 233 +++++++++++++++ PhotoShotListPlanner/cobie1818/style.css | 274 ++++++++++++++++++ 5 files changed, 673 insertions(+) create mode 100644 PhotoShotListPlanner/cobie1818/README.md create mode 100644 PhotoShotListPlanner/cobie1818/index.html create mode 100644 PhotoShotListPlanner/cobie1818/screenshot.png create mode 100644 PhotoShotListPlanner/cobie1818/script.js create mode 100644 PhotoShotListPlanner/cobie1818/style.css diff --git a/PhotoShotListPlanner/cobie1818/README.md b/PhotoShotListPlanner/cobie1818/README.md new file mode 100644 index 000000000..0a14ea9fa --- /dev/null +++ b/PhotoShotListPlanner/cobie1818/README.md @@ -0,0 +1,80 @@ +# Photo Shot List Planner + +A responsive photography planning app built with HTML, CSS, and vanilla +JavaScript. Photographers can organize shot ideas before a trip or photo +session and track which shots they have completed. + +## Features + +- Add shots with a title, category, and priority. +- Reject empty and whitespace-only titles. +- Mark shots as completed or pending. +- Filter by all, pending, or completed shots. +- Delete individual shots. +- Display a completed-shot counter. +- Save the list in localStorage between page visits. +- Adapt the layout to desktop and mobile screens. + +## Technologies + +- HTML5 for page structure and form controls +- CSS3 for styling and responsive layouts +- Vanilla JavaScript for interactions and list management +- Browser localStorage for persistence + +No framework, package installation, API key, or database is required. +VS Code's Live Server extension is used for local development. + +## Run Locally + +1. Clone or download the repository. +2. Open the repository folder in VS Code. +3. Install the Live Server extension if it is not already installed. +4. Navigate to PhotoShotListPlanner/cobie1818. +5. Right-click index.html and select "Open with Live Server." + +## How to Use + +1. Enter a shot idea. +2. Select its category and priority. +3. Click "Add shot." +4. Use a shot's checkbox to toggle its completion status. +5. Use "Show shots" to filter the list. +6. Click "Delete" to remove an unwanted shot. + +## Data Storage + +The list is saved in the current browser on the current device. +It does not synchronize between browsers or devices. Clearing browser +site data removes the saved list. + +The app displays a message if stored data cannot be loaded or changes +cannot be saved. User-entered titles are displayed as text rather +than interpreted as HTML. + +## Manual Testing + +The following checks were performed in Microsoft Edge: + +- Adding shots with different categories and priorities +- Completing shots and returning them to pending +- Updating the completion counter +- Filtering completed and pending shots +- Retaining the list and completion status after refresh +- Rejecting empty and whitespace-only titles +- Adding and deleting a temporary shot +- Inspecting the responsive layout at a 375-pixel viewport width + +No automated tests are included with this contribution. + +## Screenshot + +![Photo Shot List Planner with sample shots](screenshot.png) + +## Related Issue + +https://github.com/thinkswell/javascript-mini-projects/issues/1245 + +## Author + +Jacobie Jackson (cobie1818) \ No newline at end of file diff --git a/PhotoShotListPlanner/cobie1818/index.html b/PhotoShotListPlanner/cobie1818/index.html new file mode 100644 index 000000000..84e285782 --- /dev/null +++ b/PhotoShotListPlanner/cobie1818/index.html @@ -0,0 +1,86 @@ + + + + + + Photo Shot List Planner + + + + +
+
+

PLAN YOUR NEXT PHOTO SESSION

+

Photo Shot List Planner

+

Keep your ideas organized and capture every shot that matters.

+
+ +
+

Add a shot

+ +
+
+ + +
+ +
+
+ + +
+ +
+ + +
+
+ + +
+ +

+
+ +
+
+

Your shot list

+

0 of 0 shots completed

+
+ +
+ + +
+ +

Your list is empty. Add your first shot above.

+
    +
    + +
    +

    Your shot list is saved in this browser on this device.

    +
    +
    + + \ No newline at end of file diff --git a/PhotoShotListPlanner/cobie1818/screenshot.png b/PhotoShotListPlanner/cobie1818/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0a033367c47244341ffda6f2e90d959d18400a7a GIT binary patch literal 55980 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 B?veli literal 0 HcmV?d00001 diff --git a/PhotoShotListPlanner/cobie1818/script.js b/PhotoShotListPlanner/cobie1818/script.js new file mode 100644 index 000000000..c2e151d21 --- /dev/null +++ b/PhotoShotListPlanner/cobie1818/script.js @@ -0,0 +1,233 @@ +"use strict"; + +const STORAGE_KEY = "photo-shot-list-planner-cobie1818"; + +const form = document.getElementById("shot-form"); +const titleInput = document.getElementById("shot-title"); +const categoryInput = document.getElementById("shot-category"); +const priorityInput = document.getElementById("shot-priority"); +const filterInput = document.getElementById("shot-filter"); +const shotList = document.getElementById("shot-list"); +const shotCount = document.getElementById("shot-count"); +const emptyMessage = document.getElementById("empty-message"); +const feedback = document.getElementById("feedback"); + +const categories = Array.from(categoryInput.options, option => option.value); +const priorities = Array.from(priorityInput.options, option => option.value); + +let storageWarning = ""; +let shots = loadShots(); + +function showFeedback(message) { + feedback.textContent = [message, storageWarning].filter(Boolean).join(" "); +} + +function loadShots() { + try { + const saved = localStorage.getItem(STORAGE_KEY); + + if (saved === null) { + return []; + } + + const parsed = JSON.parse(saved); + const ids = new Set(); + + // Validate stored data before using it in the interface. + if (!Array.isArray(parsed) || !parsed.every(shot => { + const valid = + shot !== null && + typeof shot === "object" && + typeof shot.id === "string" && + shot.id.length > 0 && + !ids.has(shot.id) && + typeof shot.title === "string" && + shot.title.trim().length > 0 && + shot.title.length <= 120 && + categories.includes(shot.category) && + priorities.includes(shot.priority) && + typeof shot.completed === "boolean"; + + if (valid) { + ids.add(shot.id); + } + + return valid; + })) { + throw new Error("Invalid saved shot list"); + } + + return parsed; + } catch { + storageWarning = + "The saved list could not be loaded. An empty list is shown."; + return []; + } +} + +function saveShots() { + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(shots)); + storageWarning = ""; + } catch { + storageWarning = + "Changes could not be saved. Keep this page open to retain this list."; + } +} + +function createId() { + let id; + + do { + id = `shot-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`; + } while (shots.some(shot => shot.id === id)); + + return id; +} + +function createBadge(text, extraClass = "") { + const badge = document.createElement("span"); + badge.className = `badge ${extraClass}`.trim(); + badge.textContent = text; + return badge; +} + +function createShotCard(shot) { + const card = document.createElement("li"); + card.className = shot.completed ? "shot-card completed" : "shot-card"; + + const checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.className = "shot-checkbox"; + checkbox.checked = shot.completed; + checkbox.id = shot.id; + + const details = document.createElement("div"); + details.className = "shot-details"; + + // textContent displays user input as text, never as HTML. + const title = document.createElement("label"); + title.className = "shot-title"; + title.htmlFor = checkbox.id; + title.textContent = shot.title; + + const meta = document.createElement("div"); + meta.className = "shot-meta"; + meta.append( + createBadge(shot.category), + createBadge( + `${shot.priority} priority`, + `priority-${shot.priority.toLowerCase()}` + ) + ); + + details.append(title, meta); + + const deleteButton = document.createElement("button"); + deleteButton.type = "button"; + deleteButton.className = "delete-button"; + deleteButton.textContent = "Delete"; + deleteButton.setAttribute("aria-label", `Delete shot: ${shot.title}`); + + checkbox.addEventListener("change", () => { + shot.completed = checkbox.checked; + saveShots(); + renderShots(); + + // Restore keyboard focus after rebuilding the list. + const updatedCheckbox = document.getElementById(shot.id); + + if (updatedCheckbox) { + updatedCheckbox.focus(); + } else { + filterInput.focus(); + } + + showFeedback( + `"${shot.title}" marked ${shot.completed ? "completed" : "pending"}.` + ); + }); + + deleteButton.addEventListener("click", () => { + shots = shots.filter(item => item.id !== shot.id); + saveShots(); + renderShots(); + filterInput.focus(); + showFeedback(`Deleted "${shot.title}".`); + }); + + card.append(checkbox, details, deleteButton); + return card; +} + +function renderShots() { + const selectedFilter = filterInput.value; + const visibleShots = shots.filter(shot => { + if (selectedFilter === "pending") { + return !shot.completed; + } + + if (selectedFilter === "completed") { + return shot.completed; + } + + return true; + }); + + shotList.replaceChildren(); + + visibleShots.forEach(shot => { + shotList.appendChild(createShotCard(shot)); + }); + + const completedCount = shots.filter(shot => shot.completed).length; + shotCount.textContent = + `${completedCount} of ${shots.length} shots completed`; + + emptyMessage.hidden = visibleShots.length > 0; + + if (shots.length === 0) { + emptyMessage.textContent = + "Your list is empty. Add your first shot above."; + } else { + emptyMessage.textContent = `No ${selectedFilter} shots to show.`; + } +} + +titleInput.addEventListener("input", () => { + titleInput.setCustomValidity(""); +}); + +form.addEventListener("submit", event => { + event.preventDefault(); + + const title = titleInput.value.trim(); + + if (!title) { + titleInput.setCustomValidity("Enter a shot idea, not just spaces."); + titleInput.reportValidity(); + return; + } + + shots.push({ + id: createId(), + title, + category: categoryInput.value, + priority: priorityInput.value, + completed: false + }); + + saveShots(); + form.reset(); + + // Show the new shot even if the completed filter was selected. + filterInput.value = "all"; + renderShots(); + titleInput.focus(); + showFeedback(`Added "${title}".`); +}); + +filterInput.addEventListener("change", renderShots); + +renderShots(); +showFeedback(""); \ No newline at end of file diff --git a/PhotoShotListPlanner/cobie1818/style.css b/PhotoShotListPlanner/cobie1818/style.css new file mode 100644 index 000000000..301e78d4e --- /dev/null +++ b/PhotoShotListPlanner/cobie1818/style.css @@ -0,0 +1,274 @@ +:root { + color-scheme: light; + font-family: Arial, Helvetica, sans-serif; + color: #20312d; + background: #f3f5f1; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + line-height: 1.6; +} + +.container { + width: min(900px, 92%); + margin: 0 auto; + padding: 48px 0; +} + +header { + margin-bottom: 32px; +} + +.eyebrow { + color: #406650; + font-size: 0.8rem; + font-weight: bold; + letter-spacing: 0.12em; +} + +h1 { + margin: 8px 0; + font-size: clamp(2rem, 5vw, 3rem); + line-height: 1.2; +} + +h2 { + margin: 0 0 20px; + font-size: 1.3rem; +} + +header > p:last-child, +footer, +#shot-count { + color: #53635b; +} + +.panel { + margin-bottom: 24px; + padding: 28px; + background: #fff; + border: 1px solid #dce3da; + border-radius: 16px; + box-shadow: 0 8px 24px rgb(32 49 45 / 5%); +} + +.field { + display: flex; + flex-direction: column; + gap: 6px; + margin-bottom: 18px; +} + +label { + font-weight: bold; +} + +input, +select, +button { + font: inherit; +} + +input[type="text"], +select { + width: 100%; + padding: 12px; + color: #20312d; + background: #fff; + border: 1px solid #86978b; + border-radius: 8px; +} + +input::placeholder { + color: #657369; +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; +} + +button { + min-height: 44px; + padding: 10px 18px; + border: 1px solid transparent; + border-radius: 8px; + cursor: pointer; +} + +.primary-button { + color: #fff; + background: #315d46; + font-weight: bold; +} + +.primary-button:hover { + background: #244734; +} + +:focus-visible { + outline: 3px solid #2868b2; + outline-offset: 3px; +} + +#feedback { + margin: 14px 0 0; + color: #315d46; +} + +#feedback:empty { + display: none; +} + +.list-header { + display: flex; + align-items: baseline; + justify-content: space-between; + flex-wrap: wrap; + gap: 8px 20px; + margin-bottom: 18px; +} + +.list-header h2, +#shot-count { + margin: 0; +} + +.filter-field { + max-width: 240px; +} + +#empty-message { + padding: 24px 12px; + color: #53635b; + text-align: center; + background: #f5f7f3; + border-radius: 8px; +} + +.shot-list { + display: grid; + gap: 14px; + margin: 0; + padding: 0; + list-style: none; +} + +.shot-card { + display: flex; + align-items: center; + gap: 14px; + padding: 18px; + border: 1px solid #dce3da; + border-radius: 10px; +} + +.shot-checkbox { + flex-shrink: 0; + width: 22px; + height: 22px; + margin: 0; + accent-color: #315d46; + cursor: pointer; +} + +.shot-details { + flex: 1; + min-width: 0; +} + +.shot-title { + display: block; + margin: 0 0 6px; + overflow-wrap: anywhere; + font-weight: bold; +} + +.shot-meta { + display: flex; + flex-wrap: wrap; + gap: 8px; + font-size: 0.85rem; +} + +.badge { + padding: 3px 10px; + color: #384b40; + background: #edf1eb; + border-radius: 20px; +} + +.priority-high { + color: #842b21; + background: #fde8e4; +} + +.priority-medium { + color: #705008; + background: #fff2cc; +} + +.priority-low { + color: #24573c; + background: #e5f2e9; +} + +.shot-card.completed { + background: #f5f7f3; +} + +.completed .shot-title { + color: #59665d; + text-decoration: line-through; +} + +.delete-button { + flex-shrink: 0; + color: #842b21; + background: #fff; + border-color: #d9ada7; +} + +.delete-button:hover { + background: #fde8e4; +} + +footer { + text-align: center; + font-size: 0.85rem; +} + +@media (max-width: 600px) { + .container { + padding: 28px 0; + } + + .panel { + padding: 20px; + } + + .form-row { + grid-template-columns: 1fr; + gap: 0; + } + + .primary-button, + .filter-field { + width: 100%; + max-width: none; + } + + .shot-card { + flex-wrap: wrap; + } + + .delete-button { + margin-left: auto; + } +} \ No newline at end of file