{"owner":"lewish","repo":"asciiflow","hasSkills":true,"totalSkillsCount":1,"totalTokensCount":1718,"categories":["claude-rule"],"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md"],"skills":{"CLAUDE.md":"# ASCIIFlow\n\nASCII diagram drawing web app (asciiflow.com). Client-side only, also runs as Electron desktop app.\n\n## Stack\n\n- **Language:** TypeScript 5.8\n- **UI:** React 16.14.0 + Material-UI 4.12.4\n- **Routing:** React Router DOM 5.3.4\n- **Build:** Bazel 8 (via Bazelisk) + esbuild (via aspect_rules_esbuild)\n- **Tests:** Mocha + Chai + Sinon (unit), Playwright (e2e)\n- **Desktop:** Electron 29.0.1\n\n## Build & Dev\n\n```bash\nbazel build client:bundle      # Production build (esbuild)\nbazel build client:site         # Full site with static assets\nbazel test //common:all         # Common tests only\nbazel test //client:all         # Client tests only\nbazel test //e2e:all            # Playwright e2e tests\n```\n\nRequires Node 22.x (managed by Bazel toolchain) and Bazel 8.x (via Bazelisk).\n\n## Project Structure\n\n```\nclient/                # Main frontend app\n  store/               # State management (Zustand)\n    index.ts           # Store singleton, ToolMode enum, tool instances\n    canvas.ts          # Per-drawing state (layers, undo/redo, zoom)\n    drawing_stringifier.ts  # Compress/share drawings via URL\n  draw/                # Drawing tool implementations (IDrawFunction interface)\n    box.ts, line.ts, text.ts, select.ts, freeform.ts, erase.ts, move.ts\n  components/          # Reusable React components\n  app.tsx              # React entry point with router\n  controller.ts        # Input event handling (desktop + touch)\n  view.tsx             # Canvas rendering (HTML5 canvas)\n  layer.ts             # Sparse grid data model (Vector → char)\n  vector.ts            # 2D vector math\n  constants.ts         # Character sets, grid dimensions, input config\n  drawer.tsx           # Sidebar UI (tools, file management, export)\n  export.tsx           # Export (SVG, HTML, PNG, Markdown, JSON)\ncommon/                # Shared utilities\n  stringifiers.ts      # Serialization interfaces\ntesting/               # Test infrastructure\n  test_setup.ts        # localStorage/window shim for Node.js tests\nbazel/                 # Bazel build infrastructure\n  playwright.bzl       # playwright_test() rule for e2e tests\n  playwright-runner.mjs # Playwright test runner with static server\n  resolve-extensions-loader.mjs # ESM loader for .ts extension resolution\ne2e/                   # Playwright e2e tests\n  app.spec.js          # Application e2e tests\n  playwright.config.mjs # Playwright configuration\nelectron/              # Electron desktop wrapper\nsite/                  # Static site assets\n```\n\n## Architecture\n\n- **State:** Zustand store (`client/store/index.ts`). `Store` is a singleton. React components subscribe via Zustand's `useStore()` hook with selectors.\n- **Drawing:** Command pattern — Controller dispatches input to the active `IDrawFunction` tool. Tools write to a scratch `Layer`, which is applied on commit.\n- **Layers:** Sparse grid (`Map<string, string>` keyed by Vector). `LayerView` composes multiple layers for rendering.\n- **Persistence:** Direct `localStorage.getItem`/`setItem` with `IStringifier` serialization (in store/index.ts and store/canvas.ts).\n- **Sharing:** Drawing → JSON → pako deflate → base64 → URL param at `/share/:encoded`.\n- **Routes:** `/` (new), `/local/:id` (saved), `/share/:encoded` (shared read-only).\n\n## Conventions\n\n- TypeScript with strict type checking\n- React functional components with hooks\n- Bazel BUILD files per directory\n- Unit tests use `.spec.ts` suffix alongside source files\n- E2e tests use `.spec.js` in `e2e/` directory\n- Path alias: `#asciiflow/*` maps to repo root\n- CSS modules for component styling\n- Drawing tools implement `IDrawFunction` with: `start()`, `move()`, `end()`, `handleKey()`, `getCursor()`\n\n## Issue Priority List\n\nRe-triaged July 13, 2026 after the v1.1.0 production release and the merge of PR #368. See GitHub issues for full details.\n\n### Recently shipped and closed in v1.1.0\n\nThese were previously labelled `fixed-in-staging`. The fixes are in tag `v1.1.0`, are live on asciiflow.com, and the issues have been closed or had the stale label removed.\n\n| Issue | Summary |\n|-------|---------|\n| #28 | Pan/zoom UX, scroll pans and Cmd/Ctrl+scroll zooms |\n| #129 | Two-finger swipe panning |\n| #187 | Line breaks in paste and export normalization |\n| #189 | Ctrl/Cmd+Z browser undo prevention |\n| #193 | Backspace in text mode moves and clears correctly |\n| #195 | Space-to-pan in text mode conflict |\n| #246 | Visible gridlines toggle in view panel |\n| #258 | Blurry canvas on HiDPI/Retina displays |\n| #297 | Space and Delete in text mode |\n| #307 | Delete works for the first scene |\n| #321 | Side-scroll wheel behaviour |\n| #332 | Undo while typing no longer reverts previous drawing action |\n| #338 | Copy/paste on macOS Safari/Firefox via native clipboard events |\n\n### Merged to main, pending next production release\n\n| Issue / PR | Summary |\n|------------|---------|\n| #368 | Entity-aware select/move tool and smarter snapping. Boxes move from their interior, attached lines reflow, line tips reshape, words move, rubber-band selections keep connected lines tidier. |\n| #58 | Partially addressed by #368, but still open because a full object model for arbitrary element manipulation is broader than the current select-tool work. |\n\n### Open bugs\n\n| Issue | Summary |\n|-------|---------|\n| #202 | Firefox Quick Find still reported for apostrophe/slash after the original v1.1.0 fix, needs fresh repro on current production |\n| #211 | Spaces broken during export |\n| #85 | CJK character support, fullwidth characters and IME input |\n\n### Feature Requests, High Priority\n\n| Issue | Summary |\n|-------|---------|\n| #241 | Customisable line/border/corner styles, including Unicode variants, rounded corners, ASCII mode, dashed lines |\n| #361 | Different characters for boxes and lines, likely folds into #241 |\n| #43 | Diagonal lines |\n| #54 | Export selected area only |\n| #346 | PWA support for offline/installable use, likely replaces Electron |\n\n### Feature Requests, Moderate Priority\n\n| Issue | Summary |\n|-------|---------|\n| #162 | Vertical/horizontal flip and 90-degree rotation |\n| #76 | Auto-centre text within boxes |\n| #324 | Remember cursor position across select/text tool switches |\n| #240 | Text tool insert mode in addition to overwrite |\n| #303 | Ctrl+arrow for word navigation in text mode |\n| #337 | Distinguishing crossing arrows, for example ╫ or similar |\n| #259 | Table generator with specified rows/columns |\n| #200 | Drag/move with arrow keys |\n| #197 | Set exact size for lines/boxes |\n\n### Feature Requests, Lower Priority / Longer Term\n\n| Issue | Summary |\n|-------|---------|\n| #44 | Configurable or limited drawing area |\n| #229 | Circle/ellipse support |\n| #134 | Trapezoid/mux shapes |\n| #336 | Colour support |\n| #273 | Pixel-perfect freeform lines |\n| #219 | Copy/paste characters in freeform mode |\n\n### Non-action / community\n\n| Issue | Summary |\n|-------|---------|\n| #369 | Thank-you issue. Needs a friendly reply and can probably be closed afterwards. |\n"},"files":{"CLAUDE.md":"# ASCIIFlow\n\nASCII diagram drawing web app (asciiflow.com). Client-side only, also runs as Electron desktop app.\n\n## Stack\n\n- **Language:** TypeScript 5.8\n- **UI:** React 16.14.0 + Material-UI 4.12.4\n- **Routing:** React Router DOM 5.3.4\n- **Build:** Bazel 8 (via Bazelisk) + esbuild (via aspect_rules_esbuild)\n- **Tests:** Mocha + Chai + Sinon (unit), Playwright (e2e)\n- **Desktop:** Electron 29.0.1\n\n## Build & Dev\n\n```bash\nbazel build client:bundle      # Production build (esbuild)\nbazel build client:site         # Full site with static assets\nbazel test //common:all         # Common tests only\nbazel test //client:all         # Client tests only\nbazel test //e2e:all            # Playwright e2e tests\n```\n\nRequires Node 22.x (managed by Bazel toolchain) and Bazel 8.x (via Bazelisk).\n\n## Project Structure\n\n```\nclient/                # Main frontend app\n  store/               # State management (Zustand)\n    index.ts           # Store singleton, ToolMode enum, tool instances\n    canvas.ts          # Per-drawing state (layers, undo/redo, zoom)\n    drawing_stringifier.ts  # Compress/share drawings via URL\n  draw/                # Drawing tool implementations (IDrawFunction interface)\n    box.ts, line.ts, text.ts, select.ts, freeform.ts, erase.ts, move.ts\n  components/          # Reusable React components\n  app.tsx              # React entry point with router\n  controller.ts        # Input event handling (desktop + touch)\n  view.tsx             # Canvas rendering (HTML5 canvas)\n  layer.ts             # Sparse grid data model (Vector → char)\n  vector.ts            # 2D vector math\n  constants.ts         # Character sets, grid dimensions, input config\n  drawer.tsx           # Sidebar UI (tools, file management, export)\n  export.tsx           # Export (SVG, HTML, PNG, Markdown, JSON)\ncommon/                # Shared utilities\n  stringifiers.ts      # Serialization interfaces\ntesting/               # Test infrastructure\n  test_setup.ts        # localStorage/window shim for Node.js tests\nbazel/                 # Bazel build infrastructure\n  playwright.bzl       # playwright_test() rule for e2e tests\n  playwright-runner.mjs # Playwright test runner with static server\n  resolve-extensions-loader.mjs # ESM loader for .ts extension resolution\ne2e/                   # Playwright e2e tests\n  app.spec.js          # Application e2e tests\n  playwright.config.mjs # Playwright configuration\nelectron/              # Electron desktop wrapper\nsite/                  # Static site assets\n```\n\n## Architecture\n\n- **State:** Zustand store (`client/store/index.ts`). `Store` is a singleton. React components subscribe via Zustand's `useStore()` hook with selectors.\n- **Drawing:** Command pattern — Controller dispatches input to the active `IDrawFunction` tool. Tools write to a scratch `Layer`, which is applied on commit.\n- **Layers:** Sparse grid (`Map<string, string>` keyed by Vector). `LayerView` composes multiple layers for rendering.\n- **Persistence:** Direct `localStorage.getItem`/`setItem` with `IStringifier` serialization (in store/index.ts and store/canvas.ts).\n- **Sharing:** Drawing → JSON → pako deflate → base64 → URL param at `/share/:encoded`.\n- **Routes:** `/` (new), `/local/:id` (saved), `/share/:encoded` (shared read-only).\n\n## Conventions\n\n- TypeScript with strict type checking\n- React functional components with hooks\n- Bazel BUILD files per directory\n- Unit tests use `.spec.ts` suffix alongside source files\n- E2e tests use `.spec.js` in `e2e/` directory\n- Path alias: `#asciiflow/*` maps to repo root\n- CSS modules for component styling\n- Drawing tools implement `IDrawFunction` with: `start()`, `move()`, `end()`, `handleKey()`, `getCursor()`\n\n## Issue Priority List\n\nRe-triaged July 13, 2026 after the v1.1.0 production release and the merge of PR #368. See GitHub issues for full details.\n\n### Recently shipped and closed in v1.1.0\n\nThese were previously labelled `fixed-in-staging`. The fixes are in tag `v1.1.0`, are live on asciiflow.com, and the issues have been closed or had the stale label removed.\n\n| Issue | Summary |\n|-------|---------|\n| #28 | Pan/zoom UX, scroll pans and Cmd/Ctrl+scroll zooms |\n| #129 | Two-finger swipe panning |\n| #187 | Line breaks in paste and export normalization |\n| #189 | Ctrl/Cmd+Z browser undo prevention |\n| #193 | Backspace in text mode moves and clears correctly |\n| #195 | Space-to-pan in text mode conflict |\n| #246 | Visible gridlines toggle in view panel |\n| #258 | Blurry canvas on HiDPI/Retina displays |\n| #297 | Space and Delete in text mode |\n| #307 | Delete works for the first scene |\n| #321 | Side-scroll wheel behaviour |\n| #332 | Undo while typing no longer reverts previous drawing action |\n| #338 | Copy/paste on macOS Safari/Firefox via native clipboard events |\n\n### Merged to main, pending next production release\n\n| Issue / PR | Summary |\n|------------|---------|\n| #368 | Entity-aware select/move tool and smarter snapping. Boxes move from their interior, attached lines reflow, line tips reshape, words move, rubber-band selections keep connected lines tidier. |\n| #58 | Partially addressed by #368, but still open because a full object model for arbitrary element manipulation is broader than the current select-tool work. |\n\n### Open bugs\n\n| Issue | Summary |\n|-------|---------|\n| #202 | Firefox Quick Find still reported for apostrophe/slash after the original v1.1.0 fix, needs fresh repro on current production |\n| #211 | Spaces broken during export |\n| #85 | CJK character support, fullwidth characters and IME input |\n\n### Feature Requests, High Priority\n\n| Issue | Summary |\n|-------|---------|\n| #241 | Customisable line/border/corner styles, including Unicode variants, rounded corners, ASCII mode, dashed lines |\n| #361 | Different characters for boxes and lines, likely folds into #241 |\n| #43 | Diagonal lines |\n| #54 | Export selected area only |\n| #346 | PWA support for offline/installable use, likely replaces Electron |\n\n### Feature Requests, Moderate Priority\n\n| Issue | Summary |\n|-------|---------|\n| #162 | Vertical/horizontal flip and 90-degree rotation |\n| #76 | Auto-centre text within boxes |\n| #324 | Remember cursor position across select/text tool switches |\n| #240 | Text tool insert mode in addition to overwrite |\n| #303 | Ctrl+arrow for word navigation in text mode |\n| #337 | Distinguishing crossing arrows, for example ╫ or similar |\n| #259 | Table generator with specified rows/columns |\n| #200 | Drag/move with arrow keys |\n| #197 | Set exact size for lines/boxes |\n\n### Feature Requests, Lower Priority / Longer Term\n\n| Issue | Summary |\n|-------|---------|\n| #44 | Configurable or limited drawing area |\n| #229 | Circle/ellipse support |\n| #134 | Trapezoid/mux shapes |\n| #336 | Colour support |\n| #273 | Pixel-perfect freeform lines |\n| #219 | Copy/paste characters in freeform mode |\n\n### Non-action / community\n\n| Issue | Summary |\n|-------|---------|\n| #369 | Thank-you issue. Needs a friendly reply and can probably be closed afterwards. |\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/lewish/asciiflow/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# ASCIIFlow\n\nASCII diagram drawing web app (asciiflow.com). Client-side only, also runs as Electron desktop app.\n\n## Stack\n\n- **Language:** TypeScript 5.8\n- **UI:** React 16.14.0 + Material-UI 4.12.4\n- **Routing:** React Router DOM 5.3.4\n- **Build:** Bazel 8 (via Bazelisk) + esbuild (via aspect_rules_esbuild)\n- **Tests:** Mocha + Chai + Sinon (unit), Playwright (e2e)\n- **Desktop:** Electron 29.0.1\n\n## Build & Dev\n\n```bash\nbazel build client:bundle      # Production build (esbuild)\nbazel build client:site         # Full site with static assets\nbazel test //common:all         # Common tests only\nbazel test //client:all         # Client tests only\nbazel test //e2e:all            # Playwright e2e tests\n```\n\nRequires Node 22.x (managed by Bazel toolchain) and Bazel 8.x (via Bazelisk).\n\n## Project Structure\n\n```\nclient/                # Main frontend app\n  store/               # State management (Zustand)\n    index.ts           # Store singleton, ToolMode enum, tool instances\n    canvas.ts          # Per-drawing state (layers, undo/redo, zoom)\n    drawing_stringifier.ts  # Compress/share drawings via URL\n  draw/                # Drawing tool implementations (IDrawFunction interface)\n    box.ts, line.ts, text.ts, select.ts, freeform.ts, erase.ts, move.ts\n  components/          # Reusable React components\n  app.tsx              # React entry point with router\n  controller.ts        # Input event handling (desktop + touch)\n  view.tsx             # Canvas rendering (HTML5 canvas)\n  layer.ts             # Sparse grid data model (Vector → char)\n  vector.ts            # 2D vector math\n  constants.ts         # Character sets, grid dimensions, input config\n  drawer.tsx           # Sidebar UI (tools, file management, export)\n  export.tsx           # Export (SVG, HTML, PNG, Markdown, JSON)\ncommon/                # Shared utilities\n  stringifiers.ts      # Serialization interfaces\ntesting/               # Test infrastructure\n  test_setup.ts        # localStorage/window shim for Node.js tests\nbazel/                 # Bazel build infrastructure\n  playwright.bzl       # playwright_test() rule for e2e tests\n  playwright-runner.mjs # Playwright test runner with static server\n  resolve-extensions-loader.mjs # ESM loader for .ts extension resolution\ne2e/                   # Playwright e2e tests\n  app.spec.js          # Application e2e tests\n  playwright.config.mjs # Playwright configuration\nelectron/              # Electron desktop wrapper\nsite/                  # Static site assets\n```\n\n## Architecture\n\n- **State:** Zustand store (`client/store/index.ts`). `Store` is a singleton. React components subscribe via Zustand's `useStore()` hook with selectors.\n- **Drawing:** Command pattern — Controller dispatches input to the active `IDrawFunction` tool. Tools write to a scratch `Layer`, which is applied on commit.\n- **Layers:** Sparse grid (`Map<string, string>` keyed by Vector). `LayerView` composes multiple layers for rendering.\n- **Persistence:** Direct `localStorage.getItem`/`setItem` with `IStringifier` serialization (in store/index.ts and store/canvas.ts).\n- **Sharing:** Drawing → JSON → pako deflate → base64 → URL param at `/share/:encoded`.\n- **Routes:** `/` (new), `/local/:id` (saved), `/share/:encoded` (shared read-only).\n\n## Conventions\n\n- TypeScript with strict type checking\n- React functional components with hooks\n- Bazel BUILD files per directory\n- Unit tests use `.spec.ts` suffix alongside source files\n- E2e tests use `.spec.js` in `e2e/` directory\n- Path alias: `#asciiflow/*` maps to repo root\n- CSS modules for component styling\n- Drawing tools implement `IDrawFunction` with: `start()`, `move()`, `end()`, `handleKey()`, `getCursor()`\n\n## Issue Priority List\n\nRe-triaged July 13, 2026 after the v1.1.0 production release and the merge of PR #368. See GitHub issues for full details.\n\n### Recently shipped and closed in v1.1.0\n\nThese were previously labelled `fixed-in-staging`. The fixes are in tag `v1.1.0`, are live on asciiflow.com, and the issues have been closed or had the stale label removed.\n\n| Issue | Summary |\n|-------|---------|\n| #28 | Pan/zoom UX, scroll pans and Cmd/Ctrl+scroll zooms |\n| #129 | Two-finger swipe panning |\n| #187 | Line breaks in paste and export normalization |\n| #189 | Ctrl/Cmd+Z browser undo prevention |\n| #193 | Backspace in text mode moves and clears correctly |\n| #195 | Space-to-pan in text mode conflict |\n| #246 | Visible gridlines toggle in view panel |\n| #258 | Blurry canvas on HiDPI/Retina displays |\n| #297 | Space and Delete in text mode |\n| #307 | Delete works for the first scene |\n| #321 | Side-scroll wheel behaviour |\n| #332 | Undo while typing no longer reverts previous drawing action |\n| #338 | Copy/paste on macOS Safari/Firefox via native clipboard events |\n\n### Merged to main, pending next production release\n\n| Issue / PR | Summary |\n|------------|---------|\n| #368 | Entity-aware select/move tool and smarter snapping. Boxes move from their interior, attached lines reflow, line tips reshape, words move, rubber-band selections keep connected lines tidier. |\n| #58 | Partially addressed by #368, but still open because a full object model for arbitrary element manipulation is broader than the current select-tool work. |\n\n### Open bugs\n\n| Issue | Summary |\n|-------|---------|\n| #202 | Firefox Quick Find still reported for apostrophe/slash after the original v1.1.0 fix, needs fresh repro on current production |\n| #211 | Spaces broken during export |\n| #85 | CJK character support, fullwidth characters and IME input |\n\n### Feature Requests, High Priority\n\n| Issue | Summary |\n|-------|---------|\n| #241 | Customisable line/border/corner styles, including Unicode variants, rounded corners, ASCII mode, dashed lines |\n| #361 | Different characters for boxes and lines, likely folds into #241 |\n| #43 | Diagonal lines |\n| #54 | Export selected area only |\n| #346 | PWA support for offline/installable use, likely replaces Electron |\n\n### Feature Requests, Moderate Priority\n\n| Issue | Summary |\n|-------|---------|\n| #162 | Vertical/horizontal flip and 90-degree rotation |\n| #76 | Auto-centre text within boxes |\n| #324 | Remember cursor position across select/text tool switches |\n| #240 | Text tool insert mode in addition to overwrite |\n| #303 | Ctrl+arrow for word navigation in text mode |\n| #337 | Distinguishing crossing arrows, for example ╫ or similar |\n| #259 | Table generator with specified rows/columns |\n| #200 | Drag/move with arrow keys |\n| #197 | Set exact size for lines/boxes |\n\n### Feature Requests, Lower Priority / Longer Term\n\n| Issue | Summary |\n|-------|---------|\n| #44 | Configurable or limited drawing area |\n| #229 | Circle/ellipse support |\n| #134 | Trapezoid/mux shapes |\n| #336 | Colour support |\n| #273 | Pixel-perfect freeform lines |\n| #219 | Copy/paste characters in freeform mode |\n\n### Non-action / community\n\n| Issue | Summary |\n|-------|---------|\n| #369 | Thank-you issue. Needs a friendly reply and can probably be closed afterwards. |\n","isInternal":false,"tokens":1718,"sizeBytes":7012}],"systemPromptSnippet":"<yakaai_skills repo=\"lewish/asciiflow\">\n<!-- File: CLAUDE.md (Tokens: ~1718 | Category: claude-rule) -->\n# ASCIIFlow\n\nASCII diagram drawing web app (asciiflow.com). Client-side only, also runs as Electron desktop app.\n\n## Stack\n\n- **Language:** TypeScript 5.8\n- **UI:** React 16.14.0 + Material-UI 4.12.4\n- **Routing:** React Router DOM 5.3.4\n- **Build:** Bazel 8 (via Bazelisk) + esbuild (via aspect_rules_esbuild)\n- **Tests:** Mocha + Chai + Sinon (unit), Playwright (e2e)\n- **Desktop:** Electron 29.0.1\n\n## Build & Dev\n\n```bash\nbazel build client:bundle      # Production build (esbuild)\nbazel build client:site         # Full site with static assets\nbazel test //common:all         # Common tests only\nbazel test //client:all         # Client tests only\nbazel test //e2e:all            # Playwright e2e tests\n```\n\nRequires Node 22.x (managed by Bazel toolchain) and Bazel 8.x (via Bazelisk).\n\n## Project Structure\n\n```\nclient/                # Main frontend app\n  store/               # State management (Zustand)\n    index.ts           # Store singleton, ToolMode enum, tool instances\n    canvas.ts          # Per-drawing state (layers, undo/redo, zoom)\n    drawing_stringifier.ts  # Compress/share drawings via URL\n  draw/                # Drawing tool implementations (IDrawFunction interface)\n    box.ts, line.ts, text.ts, select.ts, freeform.ts, erase.ts, move.ts\n  components/          # Reusable React components\n  app.tsx              # React entry point with router\n  controller.ts        # Input event handling (desktop + touch)\n  view.tsx             # Canvas rendering (HTML5 canvas)\n  layer.ts             # Sparse grid data model (Vector → char)\n  vector.ts            # 2D vector math\n  constants.ts         # Character sets, grid dimensions, input config\n  drawer.tsx           # Sidebar UI (tools, file management, export)\n  export.tsx           # Export (SVG, HTML, PNG, Markdown, JSON)\ncommon/                # Shared utilities\n  stringifiers.ts      # Serialization interfaces\ntesting/               # Test infrastructure\n  test_setup.ts        # localStorage/window shim for Node.js tests\nbazel/                 # Bazel build infrastructure\n  playwright.bzl       # playwright_test() rule for e2e tests\n  playwright-runner.mjs # Playwright test runner with static server\n  resolve-extensions-loader.mjs # ESM loader for .ts extension resolution\ne2e/                   # Playwright e2e tests\n  app.spec.js          # Application e2e tests\n  playwright.config.mjs # Playwright configuration\nelectron/              # Electron desktop wrapper\nsite/                  # Static site assets\n```\n\n## Architecture\n\n- **State:** Zustand store (`client/store/index.ts`). `Store` is a singleton. React components subscribe via Zustand's `useStore()` hook with selectors.\n- **Drawing:** Command pattern — Controller dispatches input to the active `IDrawFunction` tool. Tools write to a scratch `Layer`, which is applied on commit.\n- **Layers:** Sparse grid (`Map<string, string>` keyed by Vector). `LayerView` composes multiple layers for rendering.\n- **Persistence:** Direct `localStorage.getItem`/`setItem` with `IStringifier` serialization (in store/index.ts and store/canvas.ts).\n- **Sharing:** Drawing → JSON → pako deflate → base64 → URL param at `/share/:encoded`.\n- **Routes:** `/` (new), `/local/:id` (saved), `/share/:encoded` (shared read-only).\n\n## Conventions\n\n- TypeScript with strict type checking\n- React functional components with hooks\n- Bazel BUILD files per directory\n- Unit tests use `.spec.ts` suffix alongside source files\n- E2e tests use `.spec.js` in `e2e/` directory\n- Path alias: `#asciiflow/*` maps to repo root\n- CSS modules for component styling\n- Drawing tools implement `IDrawFunction` with: `start()`, `move()`, `end()`, `handleKey()`, `getCursor()`\n\n## Issue Priority List\n\nRe-triaged July 13, 2026 after the v1.1.0 production release and the merge of PR #368. See GitHub issues for full details.\n\n### Recently shipped and closed in v1.1.0\n\nThese were previously labelled `fixed-in-staging`. The fixes are in tag `v1.1.0`, are live on asciiflow.com, and the issues have been closed or had the stale label removed.\n\n| Issue | Summary |\n|-------|---------|\n| #28 | Pan/zoom UX, scroll pans and Cmd/Ctrl+scroll zooms |\n| #129 | Two-finger swipe panning |\n| #187 | Line breaks in paste and export normalization |\n| #189 | Ctrl/Cmd+Z browser undo prevention |\n| #193 | Backspace in text mode moves and clears correctly |\n| #195 | Space-to-pan in text mode conflict |\n| #246 | Visible gridlines toggle in view panel |\n| #258 | Blurry canvas on HiDPI/Retina displays |\n| #297 | Space and Delete in text mode |\n| #307 | Delete works for the first scene |\n| #321 | Side-scroll wheel behaviour |\n| #332 | Undo while typing no longer reverts previous drawing action |\n| #338 | Copy/paste on macOS Safari/Firefox via native clipboard events |\n\n### Merged to main, pending next production release\n\n| Issue / PR | Summary |\n|------------|---------|\n| #368 | Entity-aware select/move tool and smarter snapping. Boxes move from their interior, attached lines reflow, line tips reshape, words move, rubber-band selections keep connected lines tidier. |\n| #58 | Partially addressed by #368, but still open because a full object model for arbitrary element manipulation is broader than the current select-tool work. |\n\n### Open bugs\n\n| Issue | Summary |\n|-------|---------|\n| #202 | Firefox Quick Find still reported for apostrophe/slash after the original v1.1.0 fix, needs fresh repro on current production |\n| #211 | Spaces broken during export |\n| #85 | CJK character support, fullwidth characters and IME input |\n\n### Feature Requests, High Priority\n\n| Issue | Summary |\n|-------|---------|\n| #241 | Customisable line/border/corner styles, including Unicode variants, rounded corners, ASCII mode, dashed lines |\n| #361 | Different characters for boxes and lines, likely folds into #241 |\n| #43 | Diagonal lines |\n| #54 | Export selected area only |\n| #346 | PWA support for offline/installable use, likely replaces Electron |\n\n### Feature Requests, Moderate Priority\n\n| Issue | Summary |\n|-------|---------|\n| #162 | Vertical/horizontal flip and 90-degree rotation |\n| #76 | Auto-centre text within boxes |\n| #324 | Remember cursor position across select/text tool switches |\n| #240 | Text tool insert mode in addition to overwrite |\n| #303 | Ctrl+arrow for word navigation in text mode |\n| #337 | Distinguishing crossing arrows, for example ╫ or similar |\n| #259 | Table generator with specified rows/columns |\n| #200 | Drag/move with arrow keys |\n| #197 | Set exact size for lines/boxes |\n\n### Feature Requests, Lower Priority / Longer Term\n\n| Issue | Summary |\n|-------|---------|\n| #44 | Configurable or limited drawing area |\n| #229 | Circle/ellipse support |\n| #134 | Trapezoid/mux shapes |\n| #336 | Colour support |\n| #273 | Pixel-perfect freeform lines |\n| #219 | Copy/paste characters in freeform mode |\n\n### Non-action / community\n\n| Issue | Summary |\n|-------|---------|\n| #369 | Thank-you issue. Needs a friendly reply and can probably be closed afterwards. |\n</yakaai_skills>"}