Skip to content

Commit 435b9ca

Browse files
authored
fix: close remaining phase 2 baseline QA failures (#6)
* feat: complete Phase 2 professional designer Complete the Phase 2 designer, preset library, Scan Safety v2, batch generation, camera scanning, print tooling, design history, sharing, project workflow and related documentation. * fix: close remaining phase 2 baseline QA failures * feat: complete phase 2 implementation
1 parent 2897b60 commit 435b9ca

44 files changed

Lines changed: 2108 additions & 229 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ jobs:
3131
- run: pnpm typecheck
3232
- run: pnpm test
3333
- run: pnpm build
34+
- run: pnpm check:bundle
3435
- run: pnpm audit --prod --audit-level high
3536

3637
e2e:

.github/workflows/release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ jobs:
2424
- name: Verify tag matches package version
2525
run: pnpm release:verify
2626
- run: pnpm check
27+
- run: pnpm check:bundle
2728
- run: pnpm audit:prod
2829
- run: pnpm --filter @moduqr/web exec playwright install --with-deps chromium firefox webkit
2930
- run: pnpm --filter @moduqr/web test:e2e

CHANGELOG.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ All notable changes follow Keep a Changelog and Semantic Versioning.
99
- Ten static payload types with Smart Detect parsing and editable structured inputs.
1010
- ModuQR-owned SVG renderer with square, rounded, dot/circle, diamond, pixel, Connected, and Fluid module styles.
1111
- Independent finder overrides and multi-stop module/background gradients.
12-
- Sanitized PNG/JPEG/WebP/SVG logo support, center cutout, frames, and 24 data-defined presets.
13-
- Deterministic Scan Safety scoring plus real browser-rasterized decode verification.
12+
- Sanitized PNG/JPEG/WebP/SVG logo support, center cutout, advanced frames, per-region styling, and 60 searchable/favoritable data-defined presets.
13+
- Scan Safety v2 with deterministic scoring, browser-rasterized decode verification, blur/scale/rotation/contrast simulations and scan-first Auto Fix.
1414
- SVG, PNG, JPEG, WebP, and PDF export with preflight and post-compression decode checks where applicable.
15-
- Local image scanner, privacy-safe Scan → Redesign, IndexedDB projects, versioned JSON portability, PWA/offline behavior, SEO pages, accessibility checks, CI, CodeQL, and release gates.
16-
- Design schema v2 with transparent migration from schema v1.
15+
- Local camera/upload/drop/paste scanner, privacy-safe Scan → Redesign, IndexedDB project tags/revision history, design-only share URLs, versioned JSON portability, PWA/offline behavior, SEO pages, accessibility checks, CI, CodeQL, and release gates.
16+
- Design schema v3 with transparent migration from schema v1 and v2.
17+
- Local batch generator for up to 500 CSV/TSV/JSON rows with template variables, Worker preparation, verified SVG/PNG ZIP export and PDF sheets.
18+
- Mockup Preview, Print Safety Assistant, print-size/module calculator, scan-distance planning heuristic and local small-file QR capacity analysis.
1719

1820
### Changed
1921
- Added neighbour-aware Connected/Fluid rendering and richer Phase 2 finder/gradient controls.
@@ -22,7 +24,7 @@ All notable changes follow Keep a Changelog and Semantic Versioning.
2224
- Local Playwright uses the system Chrome channel; CI retains the full managed Chromium/Firefox/WebKit matrix, and local QA can explicitly exercise the built production server without downloading managed browsers.
2325
- Local project reopening now passes only an IndexedDB project ID between routes instead of duplicating the whole design in session storage.
2426
- Production PWA registration warms the currently loaded Next.js static assets for stronger first-session offline behavior.
25-
- Batch and Dynamic roadmap pages remain accessible but are `noindex` and omitted from the sitemap until they ship.
27+
- Batch is now a real indexed static tool; Dynamic remains a `noindex` Phase 3 roadmap route.
2628
- Design tabs now use a keyboard-friendly roving tab stop with Arrow/Home/End navigation, and advanced range controls match the renderer/import schema limits.
2729

2830
### Fixed
@@ -53,7 +55,7 @@ All notable changes follow Keep a Changelog and Semantic Versioning.
5355
- Release and CI installs use the committed lockfile with `--frozen-lockfile`; release verification also runs the production dependency audit, and CI uses bounded job timeouts with stale-run cancellation.
5456

5557
### Tests
56-
- Added regressions for schema migration/import safety, payload edge cases, QR capacity failure, favorite persistence, logo MIME/SVG hardening, logo-padding cutout behavior, resolution-invariant obstruction scoring, frame/quiet-zone separation, finder/gradient contrast, runtime renderer hardening, PWA behavior, roadmap `noindex`, keyboard tab navigation, and responsive overflow.
58+
- Added regressions for v1/v2→v3 migration/import safety, payload edge cases, QR capacity failure, favorite/history persistence, logo MIME/SVG hardening, region/frame rendering, design-share privacy, batch parsing/limits, print planning, Auto Fix, resolution-invariant obstruction scoring, finder/gradient contrast, runtime renderer hardening, PWA behavior, dynamic-roadmap `noindex`, keyboard tab navigation, RTL and responsive overflow.
5759
- Browser QA covers renderer→scanner round trips, all shipped presets, advanced styles, exports, accessibility, and mobile/desktop behavior.
5860

5961
> The first public release, `v0.1.0`, remains gated on a clean install from the committed lockfile and the complete lint, typecheck, unit, production-build, browser, accessibility, dependency-audit, and security acceptance matrix. Roadmap phase numbers do not determine SemVer major versions.

README.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,38 +25,40 @@ The second rule is privacy. Static payloads, WiFi credentials, logos, scanned im
2525

2626
## Designer
2727

28-
The current static studio includes the complete Phase 1 foundation plus the first Phase 2 professional-designer primitives:
28+
The current static studio includes the Phase 1 foundation plus the Phase 2 professional-designer implementation candidate:
2929

3030
- URL, text, email, phone, SMS, WhatsApp, WiFi, vCard, geolocation and iCalendar payloads
3131
- Smart input detection plus editable parsing for structured WiFi, vCard, calendar and messaging payloads
3232
- ModuQR-owned SVG rendering over a raw QR matrix
3333
- square, rounded, extra-rounded, dot/circle, diamond, soft-square, pixel, Connected and Fluid module styles
3434
- neighbour-aware Connected/Fluid rendering
3535
- square, rounded and circular finder rendering with independent top-left, top-right and bottom-left overrides
36-
- solid colors, multi-stop linear/radial module gradients, independent background gradients, quiet-zone and error-correction controls
36+
- solid colors, multi-stop linear/radial module gradients, independent background gradients, per-region data/timing/alignment styling, quiet-zone and error-correction controls
3737
- PNG, JPEG, WebP and sanitized SVG logos with protected finder regions and center cutout
3838
- minimal, rounded, badge, label and sticker-style frames kept outside the QR square
39-
- 24 data-defined presets; the planned 50+ validated Phase 2 preset library is not claimed as shipped yet
40-
- live preview, Undo/Redo, Reset, Surprise Me, keyboard shortcuts and local project saving
41-
- versioned JSON design import/export with explicit v1 → v2 project migration
39+
- 60 data-defined presets with search, category filters and local favorites; every preset is covered by automated decode regression tests
40+
- live preview, advanced Undo/Redo, Reset, Surprise Me, keyboard shortcuts, project tags, duplicate/search and 40-revision local design history
41+
- versioned JSON design import/export with explicit v1/v2v3 project migration plus privacy-safe design-only share URLs
4242
- custom raster export from 256–8192 px plus 512/1024/2048/4096 presets
4343
- SVG, PNG, JPEG, WebP and PDF export through the same renderer
44+
- mockup preview, printer-aware sizing guidance, Scan Safety v2 stress simulations and deterministic scan-first Auto Fix
45+
- local CSV/TSV/JSON batch generation up to 500 rows with templates, Worker preparation, ZIP exports and PDF sheets
4446

4547
### Scan → Redesign
4648

47-
The local scanner accepts uploaded, dropped or pasted raster images. It detects the decoded content type, previews normalized HTTP(S) URLs before navigation, and can send the payload into the Designer using same-tab `sessionStorage` instead of putting sensitive content into the URL.
49+
The local scanner accepts live camera input plus uploaded, dropped or pasted raster images. It detects the decoded content type, previews normalized HTTP(S) URLs before navigation, and can send the payload into the Designer using same-tab `sessionStorage` instead of putting sensitive content into the URL.
4850

4951
## Scan safety
5052

51-
The current score is deterministic and explainable. It evaluates contrast, weakest gradient-stop contrast, inherited and customized finder contrast, quiet zone, QR density/version, output module size, logo pressure, higher-risk geometry, encoding failure and — most importantly — whether the final browser-rasterized SVG can actually be decoded.
53+
Scan Safety v2 is deterministic and explainable. It evaluates contrast, weakest gradient-stop contrast, finder and per-region contrast, quiet zone, QR density/version, output module size, logo pressure, higher-risk geometry, encoding failure and — most importantly — whether the final browser-rasterized SVG can actually be decoded. Optional local degradation tests exercise blur, down/up-scaling, rotation and reduced contrast; Auto Fix applies conservative styling changes and is regression-tested to improve deliberately risky designs.
5254

5355
Every export performs a decode preflight. Raster exports are checked again after image compression before the download is allowed. The score is a risk signal, not a guarantee for every printer, surface, camera or lighting condition.
5456

5557
See [Scan Safety](docs/SCAN_SAFETY.md).
5658

5759
## Local projects
5860

59-
Projects are stored in IndexedDB and carry an explicit document schema version. The Projects view supports search, sorting, favorites, rename, duplicate, delete and reopen. Transactions are treated as complete only after IndexedDB commits them. JSON export is the portable backup format.
61+
Projects are stored in IndexedDB and carry an explicit document schema version. The Projects view supports search across names/tags/content, sorting, tags, favorites, rename, duplicate, delete and reopen. Saved edits retain the latest 40 local revisions for explicit restore-as-working-copy history. Transactions are treated as complete only after IndexedDB commits them. JSON export is the portable backup format.
6062

6163
## Privacy & security
6264

@@ -120,13 +122,13 @@ Set `NEXT_PUBLIC_SITE_URL` to the public HTTPS origin before a production deploy
120122

121123
## Testing
122124

123-
Vitest covers payloads, project migration/import boundaries, renderer behavior, presets and safety scoring. Playwright covers decode round trips, export preflight, PWA behavior, accessibility smoke tests, project persistence, over-capacity payload handling and horizontal-overflow checks at 320, 375, 390, 430, 768, 1024, 1280, 1440 and 1920 CSS pixels.
125+
Vitest covers payloads, v1/v2→v3 project migration/import boundaries, renderer behavior, 60 presets, batch parsing/limits, ZIP generation, design-only sharing, print planning and safety scoring. Playwright covers decode round trips, Phase 2 preset scans, safety simulations/Auto Fix, camera permission handling, batch Worker preparation, export preflight, PWA behavior, accessibility smoke tests, project persistence/history/tags, over-capacity payload handling, RTL/touch behavior and horizontal-overflow checks at 320, 375, 390, 430, 768, 1024, 1280, 1440 and 1920 CSS pixels.
124126

125127
A new visual style is not releaseable merely because it looks good: it must survive automated decode regression coverage.
126128

127129
## SEO
128130

129-
Useful landing pages exist for static features that actually ship. Batch and Dynamic routes remain accessible as roadmap documentation but are `noindex` and omitted from the sitemap until those features ship. Metadata includes canonical URLs, sitemap, robots, raster OpenGraph/Twitter artwork and structured SoftwareApplication/FAQ data.
131+
Useful landing pages exist for static features that actually ship. Batch is a shipped Phase 2 static feature and is indexed; the Dynamic route remains roadmap documentation, is `noindex`, and stays out of the sitemap until Phase 3 server mode ships. Metadata includes canonical URLs, sitemap, robots, raster OpenGraph/Twitter artwork and structured SoftwareApplication/FAQ data.
130132

131133
## Roadmap and versioning
132134

ROADMAP.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
## Phase 1 — Foundation & Static QR Studio
66
Release-candidate static generator foundation: custom SVG renderer, image scanner, scan-safety v1, local projects, offline PWA, exports, accessibility and SEO. Public release remains gated by the complete clean-install and browser/security QA matrix.
77

8-
## Phase 2 — Professional Designer — In progress
9-
Neighbour-aware rendering, richer frames/gradients, 50+ validated presets, mockups, print assistant, safety simulations/Auto Fix, camera scanner, batch generation and advanced history.
8+
## Phase 2 — Professional Designer — Implementation complete, acceptance gate pending
9+
The Phase 2 implementation now contains neighbour-aware Connected/Fluid rendering, independent finder controls, per-region styling, advanced gradients/frames, 60 searchable/favoritable presets, Surprise Me, project tags/search/duplicate/history, design-only sharing, schema-v3 migration, mockups, Print Safety Assistant, Scan Safety v2 simulations/Auto Fix, camera/upload/drop scanner flows, Scan → Redesign, and a local 500-row CSV/TSV/JSON batch pipeline with Worker preparation, templates, ZIP/PDF exports and capacity analysis.
1010

11-
Current Phase 2 foundation includes neighbour-aware Connected/Fluid modules, independent finder overrides, multi-stop module/background gradients, schema-v2 project migration, and matching scan-safety regression coverage.
11+
Phase 2 does **not** become release-complete until the clean-install lint/typecheck/unit/build/a11y/E2E/browser matrix, 500-row batch acceptance run, dependency/security checks, performance/bundle audit and Phase 1 regressions are green.
1212

13-
## Phase 3 — Dynamic & Developer Platform
14-
Optional PostgreSQL server mode, dynamic redirects, privacy-respecting analytics, REST/OpenAPI, API keys, SDK/React/CLI/embed/MCP packages and Docker self-hosting.
13+
## Phase 3 — Dynamic & Developer Platform — Next after Phase 2 gate
14+
Optional PostgreSQL server mode, dynamic redirects, privacy-respecting analytics, REST/OpenAPI, API keys, SDK/React/CLI/embed/MCP packages and Docker self-hosting. Static generation must remain server-independent.
1515

1616
Each phase is gated by regression, accessibility, performance, dependency and security audits.

apps/web/app/about/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ export default function AboutPage() {
88
<h1>A QR tool built around the part other editors hide: reliability.</h1>
99
<p>ModuQR separates QR encoding from visual rendering, keeps static generation local, and treats scanability as a product feature rather than an afterthought.</p>
1010
<h2>Current scope</h2>
11-
<p>The static QR studio, local image scanner, local projects, exports, PWA behavior, accessibility, SEO, and open-source quality form the current release-candidate foundation. Phase 2 is expanding the professional designer while the optional dynamic server platform remains a later milestone.</p>
11+
<p>The static QR studio, local camera/image scanner, local projects, exports, PWA behavior, accessibility, SEO, professional design controls, safety simulations, and local batch generation form the current Phase 2 release-candidate foundation. The optional dynamic server platform remains a later milestone.</p>
1212
</article>;
1313
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import type { Metadata } from 'next';
2-
import { SeoPage } from '@/components/seo-page';
2+
import { BatchGenerator } from '@/components/batch-generator';
33
import { seoContent } from '@/lib/seo-content';
44

55
export const metadata: Metadata = {
66
title: 'Batch QR Code Generator',
77
description: seoContent.batch.intro,
88
alternates: { canonical: '/batch-qr-code-generator' },
9-
robots: { index: false, follow: true },
109
};
1110

1211
export default function Page() {
13-
return <SeoPage content={seoContent.batch}/>;
12+
return (
13+
<div className="page">
14+
<BatchGenerator />
15+
</div>
16+
);
1417
}

0 commit comments

Comments
 (0)