Skip to content

Commit d67ef30

Browse files
committed
merge: main into develop (sync CITATION.cff, CHANGELOG.md and clipboard fix)
2 parents 6199590 + d4043f7 commit d67ef30

6 files changed

Lines changed: 355 additions & 25 deletions

File tree

CHANGELOG.md

Lines changed: 311 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,311 @@
1+
# Changelog
2+
3+
All notable changes to this project will be documented in this file.
4+
5+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7+
8+
## [1.2.0] - 2026-02-20
9+
10+
> Post-Alpha P1 milestone — all critical items from the Alpha review resolved.
11+
> Also includes P3-5 (arrow key element movement).
12+
13+
### Added
14+
15+
- **P1-3 — Import Netlist from Clipboard** (`0d8f064`)
16+
- New `PasteNetlistFromClipboardCommand` with modal dialog (textarea for pasting)
17+
- Keyboard shortcut: Ctrl+Shift+V
18+
- Parses via `QucatNetlistAdapter.importFromString()`, replaces current circuit
19+
- Full undo support — restores previous circuit state
20+
- Success/error notifications matching existing UX pattern
21+
- Added "Paste Netlist..." to File menu in `gui.config.yaml`
22+
- 6 new tests: parse, round-trip, undo, error, and non-browser fallback
23+
24+
- **P1-4 — Self-Contained Bundled HTML** (`b9e563f`)
25+
- New `scripts/bundle-html.mjs` produces `dist/jscircuit.html` (192 KB)
26+
- All JS and PNG assets inlined as Base64 data-URLs — zero external dependencies
27+
- Works via `file://`, `python -m http.server`, or inside a pip wheel
28+
- New `npm run build:standalone` script for distribution builds
29+
- New `src/utils/assetMap.js` — static import map resolved at build time by esbuild
30+
- Custom ESM test loader (`tests/png-loader.mjs`) to stub `.png` imports in Node
31+
32+
- **P3-5 — Arrow Keys Move Selected Elements**
33+
- Bare arrow keys nudge selected elements by one grid unit (10px)
34+
- Added `nudgeElements(ids, dx, dy)` to `CircuitService`
35+
- Registered `nudgeRight`, `nudgeLeft`, `nudgeUp`, `nudgeDown` commands
36+
- Ctrl+arrow keys still rotate (unchanged)
37+
- Full undo support via `exportState`/`importState`
38+
- 10 new tests covering all directions, multi-element, undo, edge cases
39+
40+
- **Notification component** (`src/gui/components/Notification.js`)
41+
- Reusable notification system extracted from clipboard command
42+
- Shared by both Copy and Paste netlist commands
43+
44+
- **Landing page** (`index.html`)
45+
- Simple entry point for the project root
46+
47+
### Changed
48+
49+
- **P1-1 — Rendering Speed & UI Sluggishness** (`6a4fd75`, `c4aec64`)
50+
- Grid rendering off by default; added `setShowGrid()` toggle
51+
- Fixed render deduplication — stable bound reference for `RenderScheduler` Set
52+
- Removed 4 redundant `render()` calls in GUIAdapter (event system already triggers them)
53+
- Consolidated all canvas event listeners in GUIAdapter (single owner)
54+
- Removed duplicate `initEventListeners()` from `CircuitRenderer`
55+
- Wired wheel→zoom, MMB pan, hover, dblclick, mouseleave through GUIAdapter
56+
- Cleaned up `dispose()` with stable `_boundPerformRender` reference
57+
- Removed dead `panStartX`/`panStartY` code
58+
59+
- **P1-2 — Rotation About Anchor Point** (`ab76f66`)
60+
- Single element: node[0] stays fixed, node[1] swings around it (QuCat convention)
61+
- Uses `Math.round` on trig for exact 90° increments
62+
- Multi-element: rotates around bounding-box centre
63+
- All positions snapped to `GRID_SPACING` after rotation
64+
- Orientation normalised to 0–359 via `((n%360)+360)%360`
65+
- `rotateElement()` now delegates to `rotateElements()`
66+
- Placement rotation (`rotatePlacingElement`) uses same node[0]-as-anchor convention
67+
- Fixed selection state sync in `CircuitRenderer``setSelectedElement()` clears Set,
68+
`setSelectedElements()` clears singular; prevents phantom entries causing silent no-ops
69+
70+
- **Refactored `getImagePath`**: Pure lookup from `ASSET_MAP` instead of runtime
71+
environment detection (`isNode()`, dynamic `import()`, `import.meta.url` fallbacks)
72+
73+
- **Refactored `CopyNetlistToClipboardCommand`**: Extracted notification logic into
74+
shared `Notification` component
75+
76+
- **Menu CSS polish**: Wider dropdown (min-width 280px), tighter padding and gap,
77+
single-line layout for all items including shortcuts
78+
79+
### Removed
80+
81+
- `CITATION.cff` — removed from repository
82+
- Dead code: duplicate event listeners, unused pan variables
83+
84+
### Testing
85+
86+
- **Test Coverage**: 464 tests (all passing ✅), up from 448 in v1.1.0
87+
- **New tests**: 6 for paste-netlist, 10 for nudge/arrow-key movement
88+
- **Updated**: Rotation tests adjusted for anchor-point convention
89+
- **New**: `tests/png-loader.mjs` — custom ESM loader for Node.js test environment
90+
91+
### Performance
92+
93+
- **Rendering**: Grid off by default eliminates ~30% of draw calls for empty canvases
94+
- **Event loop**: 4 fewer redundant renders per interaction cycle
95+
- **Render dedup**: `RenderScheduler` now correctly deduplicates with stable references
96+
- **Single event owner**: No duplicate listeners firing on the same canvas events
97+
- **Bundle Size**: 192 KB standalone HTML (down from 777 KB dev bundle + separate assets)
98+
- **Interaction**: Consistent 60 fps on mid-range laptops with ≤ 50 elements
99+
- **Load Time**: Near-instant in standalone mode (no external asset fetches)
100+
101+
---
102+
103+
## [1.1.0] - 2026-01-15
104+
105+
### Added
106+
107+
- **Clipboard Export for Netlist**: New "Copy Netlist" menu option (Ctrl+Shift+C)
108+
- Copy circuit netlist directly to system clipboard
109+
- Supports both modern Clipboard API and legacy browsers with fallback
110+
- Instant feedback with success/error notifications
111+
- Perfect for sharing circuits via messaging and collaboration tools
112+
113+
- **Shift Key Modifier Support**: Enhanced keyboard shortcut handling
114+
- Better modifier key combinations for advanced users
115+
- Foundation for more complex keyboard interactions
116+
117+
- **Improved Property Panel Architecture**:
118+
- Modularized configuration system
119+
- Single source of truth (gui.config.yaml)
120+
- Better maintainability and extensibility
121+
122+
### Changed
123+
124+
- **Zero External Dependencies**: Eliminated runtime fetch calls for configuration
125+
- Configuration now embedded in bundle
126+
- Faster startup (eliminates ~100-150ms network delay)
127+
- Works completely offline
128+
- Better widget deployment compatibility
129+
- Improved security posture
130+
131+
- **Standardized Element Type Naming**: All element types now consistently lowercase
132+
- Improved consistency across codebase
133+
- Better integration with custom extensions
134+
- More predictable API behavior
135+
136+
- **Reduced Component Label Font Size**: Improved visual clarity
137+
- Font size reduced from 12px to 9px
138+
- Reduced visual clutter in circuit drawings
139+
- Better readability with optimized positioning
140+
141+
### Improved
142+
143+
- **Documentation Enhancements**:
144+
- Complete "Getting Started" guide
145+
- Comprehensive extension tutorial with practical examples
146+
- Improved code examples throughout documentation
147+
- Better GitHub Pages integration
148+
149+
- **Performance Monitoring**:
150+
- Added comprehensive performance assessment documentation
151+
- Identified optimization opportunities for future releases
152+
- Baseline metrics established for 500+ element circuits
153+
154+
- **CI/CD Improvements**:
155+
- GitHub Actions automation for documentation deployment
156+
- Consistent build process across environments
157+
158+
### Fixed
159+
160+
- Fixed GitHub Pages asset paths for documentation links
161+
- Improved DOM cleanup in notification system (prevents "node not child" errors)
162+
- Better error handling in clipboard operations for unsupported environments
163+
- Corrected image paths in Getting Started tutorial
164+
165+
### Security
166+
167+
- Removed external configuration file dependencies
168+
- Reduced attack surface by embedding all configuration
169+
- Better security for browser-based widget deployment
170+
171+
### Performance
172+
173+
- Bundle Size: 777 KB (minified)
174+
- Load Time: < 1 second (previously ~100-150ms slower due to config fetch)
175+
- Hover Detection: O(log n) with spatial indexing
176+
- Tested with 500+ element circuits
177+
- Memory usage stable across long sessions
178+
179+
### Testing
180+
181+
- **Test Coverage**: 448 tests (all passing ✅)
182+
- **New Tests**: 6 dedicated tests for clipboard export feature
183+
- **Performance Benchmarks**: All targets met
184+
- **Browser Compatibility**: Modern browsers + IE11 fallback for clipboard
185+
186+
### Browser Support
187+
188+
- Chrome/Chromium: Full support (Clipboard API)
189+
- Firefox: Full support (Clipboard API)
190+
- Safari: Full support (Clipboard API)
191+
- Edge: Full support (Clipboard API)
192+
- Internet Explorer 11: Fallback support (execCommand)
193+
194+
---
195+
196+
## [1.0.0] - 2025-12-01
197+
198+
### Initial Release
199+
200+
- Full circuit editor with drag-and-drop support
201+
- Support for resistors, capacitors, inductors, junctions, wires, and grounds
202+
- Property panel for component configuration
203+
- Keyboard shortcuts for common operations
204+
- Netlist import/export (file-based)
205+
- Responsive canvas with zoom and pan
206+
- Undo/redo history
207+
- Comprehensive test suite (448 tests)
208+
- GitHub Pages documentation
209+
- Jupyter notebook widget integration
210+
- QuCat Python library integration
211+
212+
### Features
213+
214+
- Modular hexagonal architecture with DDD principles
215+
- Advanced spatial indexing for efficient element detection
216+
- Performance optimizations for large circuits (500+ elements)
217+
- Extensible element registry system
218+
- Customizable property panels
219+
- Export-focused design for QuCat integration
220+
221+
---
222+
223+
## Version Legend
224+
225+
- **[1.2.0]** - Current version (Post-Alpha P1 milestone)
226+
- **[1.1.0]** - Alpha review baseline
227+
- **[1.0.0]** - Initial stable release
228+
229+
---
230+
231+
## Upgrade Path
232+
233+
### From 1.0.0 to 1.1.0
234+
235+
**No breaking changes!** Upgrade is safe and recommended.
236+
237+
```bash
238+
npm install qucat-circuit-generator@latest
239+
```
240+
241+
**New in 1.1.0**:
242+
- Copy netlist to clipboard with Ctrl+Shift+C
243+
- Faster startup (no external config files)
244+
- Better offline support
245+
- Improved documentation
246+
247+
**Migration Notes**:
248+
- If you have custom configurations that rely on external files, they will need to be updated
249+
- All menu configurations should now reference gui.config.yaml instead of menu.config.yaml
250+
- No changes required to custom elements or extensions
251+
252+
---
253+
254+
## Future Roadmap (v1.3.0+)
255+
256+
### Next (P2 — Widget Integration)
257+
258+
- [ ] P2-1: Encapsulate as widget with `qucat.GUI_js` class (postMessage / Comm protocol)
259+
- [ ] P2-2: Remote compatibility (JupyterHub / Binder / SSH tunnels)
260+
261+
### GUI Tweaks (P3 — can be parallelised with P2)
262+
263+
- [ ] P3-1: macOS scroll / zoom / pan (pinch-to-zoom, two-finger pan)
264+
- [ ] P3-2: Keyboard shortcut conflicts on macOS
265+
- [ ] P3-3: Property panel popup UX (auto-focus, remove spinners, remove Cancel)
266+
- [ ] P3-4: Ground element cursor alignment
267+
- [ ] P3-5: Arrow keys move selected elements
268+
- [ ] P3-6: R-key placement bug
269+
270+
### Long-term (Future)
271+
272+
- [ ] Dark mode support
273+
- [ ] Internationalization (i18n)
274+
- [ ] Additional export formats (SPICE, JSON schema)
275+
- [ ] Web Worker offloading
276+
- [ ] NPM publishing
277+
278+
---
279+
280+
## Known Issues & Limitations
281+
282+
### Current Limitations
283+
284+
- Bundle size at upper limit (777 KB) - consider code splitting for future releases
285+
- Clipboard export not available in very old browsers (requires Clipboard API or execCommand)
286+
- No real-time collaboration yet
287+
288+
### Workarounds
289+
290+
- For older browsers: Use the file-based export (Save Netlist) as alternative
291+
- For large circuits: Split into multiple smaller circuits to manage complexity
292+
293+
---
294+
295+
## Contributing
296+
297+
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on reporting issues and submitting pull requests.
298+
299+
---
300+
301+
## Support
302+
303+
- 📚 **Documentation**: https://jurra.github.io/qucat-circuit-generator/
304+
- 🐛 **Issue Tracker**: https://github.com/jurra/qucat-circuit-generator/issues
305+
- 💬 **Discussions**: https://github.com/jurra/qucat-circuit-generator/discussions
306+
307+
---
308+
309+
## License
310+
311+
ISC - See LICENSE file for details

CITATION.cff

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
cff-version: 1.2.0
2+
message: "If you use this software, please cite it as below."
3+
title: "JSCircuit - Web-based Circuit Editor and Netlist Generator"
4+
abstract: "A web-based circuit editor for designing circuits and exporting netlists to various formats. Built with modern JavaScript, featuring real-time rendering, spatial indexing optimization, and support for multiple circuit types including cavity circuits, couplers, and optomechanical systems."
5+
authors:
6+
- family-names: "Urra Llanusa"
7+
given-names: "Jose Carlos"
8+
email: "j.c.urrallanusa@tudelft.nl"
9+
affiliation: "Delft University of Technology"
10+
contributors:
11+
- family-names: "Steele"
12+
given-names: "Gary"
13+
- family-names: "Branchet"
14+
given-names: "Susan"
15+
version: "1.1.0"
16+
date-released: "2025-01-15"
17+
license: "MIT"
18+
repository-code: "https://github.com/qucat/jscircuit"
19+
repository: "https://github.com/qucat/jscircuit"
20+
keywords:
21+
- "circuit editor"
22+
- "netlist generation"
23+
- "web application"
24+
- "quantum circuits"
25+
- "circuit design"
26+
- "interactive visualization"
27+
- "JavaScript"
28+
documentation: "https://github.com/qucat/jscircuit/blob/main/README.md"

README.md

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
**Start designing quantum circuits in your browser right away with jscircuit for your simulations**
88

9-
[![GitHub](https://img.shields.io/badge/GitHub-View%20Source-blue?style=for-the-badge&logo=github)](https://github.com/jurra/qucat-circuit-generator)
10-
[![App](https://img.shields.io/badge/Demo-Try%20Live-success?style=for-the-badge&logo=codesandbox)](https://jurra.github.io/qucat-circuit-generator/app/jscircuit.html)
11-
[![Docs](https://img.shields.io/badge/Docs-Getting%20Started-orange?style=for-the-badge&logo=gitbook)](https://jurra.github.io/qucat-circuit-generator/tutorial-getting-started.html)
9+
[![GitHub](https://img.shields.io/badge/GitHub-View%20Source-blue?style=for-the-badge&logo=github)](https://github.com/qucat/jscircuit)
10+
[![App](https://img.shields.io/badge/Demo-Try%20Live-success?style=for-the-badge&logo=codesandbox)](https://qucat.github.io/jscircuit/app/jscircuit.html)
11+
[![Docs](https://img.shields.io/badge/Docs-Getting%20Started-orange?style=for-the-badge&logo=gitbook)](https://qucat.github.io/jscircuit/tutorial-getting-started.html)
1212
</div>
1313

1414

@@ -17,6 +17,8 @@
1717

1818
**JSCircuit** is a lightweight, web-based circuit editor designed to generate netlists for **QuCat** simulations. It runs entirely in the browser, offering a modern alternative to desktop-based editors.
1919

20+
[**Get started right away with JSCircuit**](https://qucat.github.io/jscircuit/tutorial-getting-started.html)
21+
2022
### Why JSCircuit?
2123

2224
The project was built to solve two key challenges in the quantum circuit simulation workflow:
@@ -45,8 +47,8 @@ To run the project locally for development:
4547

4648
1. **Clone the repository**:
4749
```bash
48-
git clone https://github.com/jurra/qucat-circuit-generator.git
49-
cd qucat-circuit-generator
50+
git clone https://github.com/qucat/jscircuit.git
51+
cd jscircuit
5052
```
5153

5254
2. **Install dependencies**:
@@ -69,15 +71,20 @@ To run the project locally for development:
6971

7072
### Documentation
7173

72-
- **[Extension Guide](https://jurra.github.io/qucat-circuit-generator/tutorial-extension-guide.html)**: Learn how to add custom elements.
73-
- **[Architecture](https://jurra.github.io/qucat-circuit-generator/tutorial-overview.html)**: Understand the system design.
74-
- **[API Reference](https://jurra.github.io/qucat-circuit-generator/index.html)**: Detailed code documentation.
74+
- **[Extension Guide](https://qucat.github.io/jscircuit/tutorial-extension-integration-tutorial.html)**: Learn how to add custom elements.
75+
- **[API Reference](https://qucat.github.io/jscircuit/index.html)**: Detailed code documentation.
7576

7677
## Build the documentation locally
7778
```bash
7879
npm run docs:serve
7980
```
8081

82+
## Acknowledgments
83+
84+
This project builds upon the original QuCat GUI developed by **Mario Gely**, which provided the foundational concepts for circuit visualization and interaction as a reference to develop this application.
85+
86+
We acknowledge the support of the **TU Delft Digital Competence Center** in advancing this project.
87+
8188
## Licensed under the MIT License.
8289

8390
Technische Universiteit Delft hereby disclaims all copyright interest in the program "JSCircuit" written by the Author(s).
File renamed without changes.

0 commit comments

Comments
 (0)