Skip to content

Commit c46fc89

Browse files
authored
Merge pull request #265 from ToolboxAid/PR_26179_CHARLIE_029-sprites-clear-reset-controls
PR_26179_CHARLIE_029-sprites-clear-reset-controls
2 parents 44974c9 + 6dbe6ef commit c46fc89

6 files changed

Lines changed: 244 additions & 115 deletions

File tree

assets/toolbox/sprites/js/index.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ function normalizeColorKey(colorKey) {
4242
}
4343

4444
function clearCellColor(cell) {
45+
cell.classList.remove("is-painted");
4546
cell.classList.remove(...EDITOR_COLOR_KEYS.map((colorKey) => `sprite-canvas-cell--${colorKey}`));
4647
delete cell.dataset.spriteColorKey;
4748
}
@@ -99,7 +100,6 @@ function paintCell(cell) {
99100
const key = pixelKey(cell.dataset.spritePixelRow, cell.dataset.spritePixelColumn);
100101
if (editorState.activeTool === "eraser") {
101102
editorState.paintedPixels.delete(key);
102-
cell.classList.remove("is-painted");
103103
clearCellColor(cell);
104104
} else {
105105
editorState.paintedPixels.set(key, editorState.activeColor);
@@ -122,6 +122,20 @@ function fillGrid() {
122122
updateDraftStatus();
123123
}
124124

125+
function clearCanvas() {
126+
const grid = document.querySelector("[data-sprites-pixel-grid]");
127+
editorState.paintedPixels.clear();
128+
if (grid) {
129+
grid.querySelectorAll("[data-sprite-pixel-row]").forEach(clearCellColor);
130+
}
131+
updateDraftStatus();
132+
}
133+
134+
function resetGridToDefault() {
135+
setGridSize(DEFAULT_GRID_SIZE);
136+
clearCanvas();
137+
}
138+
125139
function editorColorValue(colorKey) {
126140
const variableName = EDITOR_COLOR_CSS_VARIABLES[normalizeColorKey(colorKey)];
127141
const value = getComputedStyle(document.documentElement).getPropertyValue(variableName).trim();
@@ -252,6 +266,18 @@ function wirePaletteButtons() {
252266
});
253267
}
254268

269+
function wireCanvasActions() {
270+
const clearButton = document.querySelector("[data-sprites-clear-canvas]");
271+
if (clearButton) {
272+
clearButton.addEventListener("click", clearCanvas);
273+
}
274+
275+
const resetButton = document.querySelector("[data-sprites-reset-grid]");
276+
if (resetButton) {
277+
resetButton.addEventListener("click", resetGridToDefault);
278+
}
279+
}
280+
255281
function wireExportButton() {
256282
const button = document.querySelector("[data-sprites-export-png]");
257283
if (button) {
@@ -262,6 +288,7 @@ function wireExportButton() {
262288
wireGridControls();
263289
wireDrawingTools();
264290
wirePaletteButtons();
291+
wireCanvasActions();
265292
wireExportButton();
266293
setGridSize(DEFAULT_GRID_SIZE);
267294
setActiveTool(editorState.activeTool);

dev/tests/playwright/tools/SpritesToolShell.spec.mjs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,19 @@ test("Sprite Creator shell loads with visible tool, canvas, details, and status
262262
await expect(page.locator("[data-sprites-pixel-grid] .is-painted")).toHaveCount(1024);
263263
await expect(page.locator("[data-sprites-pixel-grid] .sprite-canvas-cell--blue")).toHaveCount(1024);
264264
await expect(page.locator("[data-sprites-draft-status]")).toContainText("1024 draft pixels painted");
265+
await page.getByRole("button", { name: "Clear Canvas" }).click();
266+
await expect(page.locator("[data-sprites-pixel-grid] .is-painted")).toHaveCount(0);
267+
await expect(page.locator("[data-sprites-draft-status]")).toContainText("empty draft");
268+
await page.getByRole("button", { name: "Fill tool" }).click();
269+
await expect(page.locator("[data-sprites-pixel-grid] .is-painted")).toHaveCount(1024);
270+
await page.getByRole("button", { name: "Reset to 16x16" }).click();
271+
await expect(page.locator("[data-sprites-pixel-grid]")).toHaveAttribute("aria-label", "Sprite Creator 16 by 16 pixel canvas");
272+
await expect(page.locator("[data-sprites-pixel-grid] [role='gridcell']")).toHaveCount(256);
273+
await expect(page.locator("[data-sprites-pixel-grid] .is-painted")).toHaveCount(0);
274+
await expect(page.locator("[data-sprites-draft-status]")).toContainText("empty draft");
275+
await page.getByRole("button", { name: "Blue editor color" }).click();
276+
await page.getByRole("button", { name: "Fill tool" }).click();
277+
await expect(page.locator("[data-sprites-pixel-grid] .is-painted")).toHaveCount(256);
265278
await expect(page.locator("[data-sprites-preview-canvas]")).toBeVisible();
266279
const previewHasPaint = await page.locator("[data-sprites-preview-canvas]").evaluate((canvas) => {
267280
const context = canvas.getContext("2d");
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# PR_26179_CHARLIE_029-sprites-clear-reset-controls
2+
3+
Team: CHARLIE
4+
Workflow: stacked feature workflow
5+
Base branch: PR_26179_CHARLIE_028-sprites-editor-polish
6+
Canonical ZIP path for this batch: dev/workspace/zip/PR_26179_CHARLIE_029-sprites-clear-reset-controls_delta.zip
7+
8+
## Summary
9+
10+
Added Clear Canvas and Reset to 16x16 controls. Both operate only on unsaved page-session editor state and do not persist product data.
11+
12+
## Product Owner Testable Outcome
13+
14+
The Product Owner can fill or draw on the Sprite Creator canvas, clear the draft, and reset back to the 16x16 display mode.
15+
16+
## Branch Validation
17+
18+
PASS
19+
20+
- Current branch: PR_26179_CHARLIE_029-sprites-clear-reset-controls
21+
- Based on: PR_26179_CHARLIE_028-sprites-editor-polish
22+
- No start_of_day files changed
23+
- No DB/API/schema files changed
24+
- No stale PR #219-#228 code copied
25+
26+
## Requirement Checklist
27+
28+
| Requirement | Status | Notes |
29+
| --- | --- | --- |
30+
| Add Clear Canvas | PASS | Clears painted draft pixels. |
31+
| Add Reset to 16x16 | PASS | Resets grid to default display and clears draft. |
32+
| State remains unsaved page-session editor state | PASS | Module memory only; no browser storage. |
33+
| No DB/API/schema changes | PASS | None changed. |
34+
35+
## Validation Lane Report
36+
37+
Commands:
38+
39+
```text
40+
node --check assets/toolbox/sprites/js/index.js
41+
node --check dev/tests/playwright/tools/SpritesToolShell.spec.mjs
42+
git diff --check -- toolbox/sprites/index.html assets/toolbox/sprites/js/index.js dev/tests/playwright/tools/SpritesToolShell.spec.mjs
43+
rg --pcre2 -n -i "localStorage|sessionStorage|indexedDB|imageDataUrl|toDataURL|<style|style=|<script(?![^>]+src=)|on(click|change|submit|input|load|error)=|local-mem|fake-login|MEM DB" toolbox/sprites/index.html assets/toolbox/sprites/js/index.js dev/tests/playwright/tools/SpritesToolShell.spec.mjs
44+
npx playwright test dev/tests/playwright/tools/SpritesToolShell.spec.mjs --workers=1 --reporter=list --output=<temp>
45+
```
46+
47+
Results:
48+
49+
- Node syntax checks: PASS
50+
- `git diff --check`: PASS
51+
- Guard scan: PASS, no matches
52+
- Targeted Playwright: PASS, 1 test passed
53+
54+
## Manual Validation Notes
55+
56+
1. Open `/toolbox/sprites/index.html`.
57+
2. Use Fill, then click Clear Canvas and confirm the grid clears.
58+
3. Switch to 32x32, draw or fill, then click Reset to 16x16.
59+
4. Confirm the grid is 16x16 and the draft is empty.
60+
61+
## Previous PR Dependency
62+
63+
PR_26179_CHARLIE_028-sprites-editor-polish
64+
65+
## Next PR Dependency
66+
67+
PR_26179_CHARLIE_030-sprites-undo-redo
68+
69+
## ZIP Path
70+
71+
`dev/workspace/zip/PR_26179_CHARLIE_029-sprites-clear-reset-controls_delta.zip`
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
toolbox/sprites/index.html
2+
assets/toolbox/sprites/js/index.js
23
dev/tests/playwright/tools/SpritesToolShell.spec.mjs
3-
docs_build/dev/reports/PR_26179_CHARLIE_028-sprites-editor-polish.md
4+
docs_build/dev/reports/PR_26179_CHARLIE_029-sprites-clear-reset-controls.md
45
docs_build/dev/reports/codex_changed_files.txt
56
docs_build/dev/reports/codex_review.diff

0 commit comments

Comments
 (0)