Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
571b8be
feat(canvas): new canvas
joshistoast Jul 9, 2026
1de0204
fix(canvas): inpainted queue items don't get fully regenerated
joshistoast Jul 9, 2026
7074302
fix(canvas): inpaint outputs stage more than one result
joshistoast Jul 9, 2026
8d96d85
fix(canvas): qol updates
joshistoast Jul 9, 2026
271fe1a
fix(canvas): order staging slots by queue execution
joshistoast Jul 9, 2026
f6d3456
feat(canvas): preview queued staging progress
joshistoast Jul 9, 2026
35df523
feat(canvas): add progress staging auto-switch
joshistoast Jul 9, 2026
67b6892
refactor(canvas): unify floating canvas controls
joshistoast Jul 9, 2026
fde10b7
style(layers): polish layer list interactions
joshistoast Jul 9, 2026
5513501
feat(canvas): add layer row context menus
joshistoast Jul 9, 2026
fa59a9f
feat(canvas): more qol updates
joshistoast Jul 9, 2026
beeb2f0
feat(canvas): layer context actions registry
joshistoast Jul 9, 2026
fbceff5
feat(canvas): add shared layer pixel export primitive
joshistoast Jul 9, 2026
fa36f6f
feat(canvas): add baked layer export primitive
joshistoast Jul 9, 2026
709ea52
feat(canvas): add 'save layer to assets'
joshistoast Jul 9, 2026
a3e2383
feat(canvas): add copy layer to clipboard
joshistoast Jul 9, 2026
f174719
feat(canvas): add crop layer to bbox
joshistoast Jul 9, 2026
0d5add5
feat(canvas): add copy layer to raster
joshistoast Jul 9, 2026
63d4ba4
feat(canvas): add layer copy and conversion parity
joshistoast Jul 9, 2026
2213173
feat(canvas): add boolean raster operations
joshistoast Jul 9, 2026
5c0fbda
feat(canvas): extract masked canvas areas
joshistoast Jul 9, 2026
4d4993f
feat(canvas): add control filter menu action
joshistoast Jul 9, 2026
2a9ce2b
fix(canvas): preserve live layer action state
joshistoast Jul 9, 2026
07fec99
refactor(canvas): organize layer context menu like legacy
joshistoast Jul 9, 2026
eb232eb
feat(canvas): add wavy denoising strength track
joshistoast Jul 9, 2026
50c0f7f
feat(canvas): clear selected masks with shift c
joshistoast Jul 9, 2026
a9d6ccd
fix(canvas): preserve cleared mask persistence
joshistoast Jul 9, 2026
3fb8248
fix(canvas): match legacy denoising wave track
joshistoast Jul 9, 2026
1187d7f
fix(canvas): move denoising wave beside label
joshistoast Jul 9, 2026
1bf4910
feat(canvas): move blend mode before opacity
joshistoast Jul 9, 2026
bb85170
fix(canvas): improve curves editor visibility
joshistoast Jul 9, 2026
47afab0
refactor(canvas): complete layer action registry
joshistoast Jul 9, 2026
dfe719b
fix(canvas): harden layer raster operations
joshistoast Jul 9, 2026
2c3d4f0
feat(canvas): add raster filter actions
joshistoast Jul 10, 2026
f061653
feat(canvas): create masks with segment anything
joshistoast Jul 10, 2026
74ce5fe
feat(canvas): run workflows from layers
joshistoast Jul 10, 2026
0a17730
fix(canvas): make raster structural history failure-atomic
joshistoast Jul 10, 2026
bd1cc55
fix(canvas): anchor new session menu
joshistoast Jul 10, 2026
3dd9d52
fix(layers): stop space from activating row drag
joshistoast Jul 10, 2026
e3595d3
test(layers): remove brittle dnd wiring assertions
joshistoast Jul 10, 2026
800396d
fix(canvas): restore curves plot structure
joshistoast Jul 10, 2026
99fea91
test(canvas): cover curves pointer cancellation
joshistoast Jul 10, 2026
b660ea7
test(canvas): verify curves drag completion
joshistoast Jul 10, 2026
f2bc351
fix(canvas): make layer thumbnails render independently
joshistoast Jul 10, 2026
1aee9b3
fix(canvas): cancel stale thumbnail rasterization
joshistoast Jul 10, 2026
1712d11
fix(canvas): release thumbnail bitmap resources
joshistoast Jul 10, 2026
5ec7d3c
fix(canvas): clean up unpublished thumbnail bitmaps
joshistoast Jul 10, 2026
220df23
fix(canvas): release deferred shared thumbnail bitmaps
joshistoast Jul 10, 2026
f3ced7b
feat(canvas): render faithful layer thumbnails
joshistoast Jul 10, 2026
d04b027
fix(canvas): bound thumbnail effect rendering
joshistoast Jul 10, 2026
507fbca
feat(canvas): add guarded canvas operation sessions
joshistoast Jul 10, 2026
2cee031
fix(canvas): harden canvas operation lifecycle
joshistoast Jul 10, 2026
6c55a44
fix(canvas): require synchronous operation commits
joshistoast Jul 10, 2026
6f74a44
feat(canvas): support interactive segment anything sessions
joshistoast Jul 11, 2026
51555d8
fix(canvas): harden interactive sam processing
joshistoast Jul 11, 2026
d4ce951
fix(canvas): finalize sam session lifecycle
joshistoast Jul 11, 2026
0a97585
fix(canvas): isolate sam session subscribers
joshistoast Jul 11, 2026
7ba03d8
fix(canvas): clear stale sam session errors
joshistoast Jul 11, 2026
16a5ebb
fix(canvas): allow sam retry after invalidation
joshistoast Jul 11, 2026
53c9460
fix(canvas): guard sam export preparation
joshistoast Jul 11, 2026
bd0a5b3
feat(canvas): add select object canvas tool
joshistoast Jul 11, 2026
335564f
fix(canvas): harden select object tool lifecycle
joshistoast Jul 11, 2026
d5aed49
feat(canvas): move select object into canvas controls
joshistoast Jul 11, 2026
743e31e
fix(canvas): guard select object commits
joshistoast Jul 11, 2026
62c48e2
fix(canvas): preserve replacement sam operations
joshistoast Jul 11, 2026
b58197e
feat(canvas): move layer filtering into canvas controls
joshistoast Jul 11, 2026
ab66f48
chore: remove committed implementation plan
joshistoast Jul 11, 2026
b49c2e0
fix(canvas): harden canvas filter operations
joshistoast Jul 11, 2026
8e5ca43
feat(canvas): move layer workflows into canvas controls
joshistoast Jul 11, 2026
6f4482f
Revert "feat(canvas): move layer workflows into canvas controls"
joshistoast Jul 11, 2026
2e7e927
fix(canvas): close canvas operation edit races
joshistoast Jul 11, 2026
a8000a6
feat(canvas): add legacy control preprocessors
joshistoast Jul 11, 2026
4630941
fix(canvas): match legacy filter parameter behavior
joshistoast Jul 11, 2026
7a58a5d
fix(canvas): align control adapter defaults
joshistoast Jul 11, 2026
077f7a8
feat(canvas): support z-image controls
joshistoast Jul 11, 2026
ad68879
fix(canvas): normalize z-image control state
joshistoast Jul 11, 2026
80a26b3
fix(canvas): guard malformed canvas snapshots
joshistoast Jul 11, 2026
f1632a9
fix(canvas): validate persisted snapshot layers
joshistoast Jul 11, 2026
ace7ce0
fix(canvas): preserve filter geometry and keyboard reorder
joshistoast Jul 11, 2026
5c53985
fix(canvas): keep operation controls visible
joshistoast Jul 11, 2026
756d523
fix(canvas): enforce operation lock boundaries
joshistoast Jul 11, 2026
6c423b7
fix(canvas): interrupt locked canvas operations
joshistoast Jul 11, 2026
04dad82
fix(canvas): segment canvas bbox composite
joshistoast Jul 11, 2026
2285735
fix(canvas): guard sam composite exports
joshistoast Jul 11, 2026
4edf679
fix(canvas): harden sam processing feedback
joshistoast Jul 12, 2026
ee831db
fix(canvas): validate sam preview output
joshistoast Jul 12, 2026
b495512
fix(canvas): reconcile sam utility results
joshistoast Jul 12, 2026
11cbe77
fix(canvas): contain utility queue seams
joshistoast Jul 12, 2026
cdb2f92
feat(canvas): redesign canvas operation panels
joshistoast Jul 12, 2026
5d19324
fix(canvas): make operation panels responsive
joshistoast Jul 12, 2026
ca14137
fix(canvas): close layer properties on operations
joshistoast Jul 12, 2026
3b58222
fix(canvas): close operation integration gaps
joshistoast Jul 12, 2026
d91ee66
fix(canvas): reset and reuse sam sources
joshistoast Jul 12, 2026
2cbeba9
fix(sam): update sam2 post-processing
joshistoast Jul 12, 2026
25aac2f
fix(canvas): preserve utility error details
joshistoast Jul 12, 2026
c78911f
fix(canvas): compact select object controls
joshistoast Jul 12, 2026
37001ef
fix(canvas): match legacy select object layout
joshistoast Jul 12, 2026
0cc9923
fix(canvas): preserve compact panel behavior
joshistoast Jul 12, 2026
e4e215a
fix(canvas): align queue event error types
joshistoast Jul 12, 2026
89138bc
feat(canvas): redesign SAM tool options
joshistoast Jul 12, 2026
44a5879
fix(canvas): SAM behavior matches legacy
joshistoast Jul 13, 2026
859c805
fix(canvas): define layer filter launch policy
joshistoast Jul 13, 2026
08398d9
fix(canvas): handle layer filter launch eligibility
joshistoast Jul 13, 2026
3af37f1
test(canvas): cover layer filter launch interactions
joshistoast Jul 13, 2026
8b1fc7f
feat(canvas): define control pixel edit targets
joshistoast Jul 13, 2026
b7c20e3
feat(canvas): add layer snapshot history
joshistoast Jul 13, 2026
9730be3
feat(canvas): paint directly on control layers
joshistoast Jul 13, 2026
5bce614
fix(canvas): make control paint commits failure atomic
joshistoast Jul 13, 2026
4055000
feat(canvas): edit control layers through selections
joshistoast Jul 13, 2026
80aa6d8
fix(canvas): skip no-op control selection edits
joshistoast Jul 13, 2026
e398b06
fix(canvas): make control selection rollback idempotent
joshistoast Jul 13, 2026
ae065f9
fix(canvas): make control edit rollback exact
joshistoast Jul 14, 2026
2fd03e2
fix(canvas): keep SAM results out of gallery
joshistoast Jul 14, 2026
8756a6d
feat(canvas): auto-process filter drafts in session
joshistoast Jul 14, 2026
931269b
feat(canvas): expose filter auto-process on the engine
joshistoast Jul 14, 2026
7901ff2
test(canvas): add autoProcess to filter session fixture
joshistoast Jul 14, 2026
350f805
refactor(canvas): extract shared operation status slot
joshistoast Jul 14, 2026
ead4b2f
feat(canvas): compact filter controls for the operation bar
joshistoast Jul 14, 2026
e4f5c00
feat(canvas): slim the filter operation bar
joshistoast Jul 14, 2026
606675c
refactor(canvas): remove unused canvas operation panel
joshistoast Jul 14, 2026
6a10600
fix(canvas): clear pending filter auto-run on interrupt
joshistoast Jul 14, 2026
bb60f4d
style(canvas): flatten filter bar to a single row
joshistoast Jul 14, 2026
45e2367
test(canvas): pin auto-process in-flight guard
joshistoast Jul 14, 2026
b1f59d3
fix(canvas): fully dispose filter session after commit fallback
joshistoast Jul 14, 2026
1096b9c
refactor(canvas): let the engine own filter commit teardown
joshistoast Jul 14, 2026
a57d7bb
perf(canvas): refactor canvas engine
joshistoast Jul 14, 2026
d4d9774
feat(canvas): merge visible legacy parity
joshistoast Jul 14, 2026
48698e5
feat(canvas): add reusable raster composite export
joshistoast Jul 16, 2026
cd8e8d0
feat(canvas): add gallery save service
joshistoast Jul 16, 2026
0502607
feat(canvas): add save-to-gallery context menu
joshistoast Jul 16, 2026
8d34539
fix(canvas): harden gallery context saves
joshistoast Jul 16, 2026
61f1f88
fix(canvas): isolate surface context menu boundary
joshistoast Jul 16, 2026
b4a623f
refactor(canvas): support atomic batch layer insertion
joshistoast Jul 16, 2026
81ca358
feat(canvas): add typed gallery image imports
joshistoast Jul 16, 2026
7286774
feat(gallery): send images to typed canvas layers
joshistoast Jul 16, 2026
97e7501
fix(gallery): harden canvas import feedback
joshistoast Jul 16, 2026
0f1c832
fix(dnd): route gallery drags to canvas targets
joshistoast Jul 16, 2026
d2ebe67
test(dnd): cover source-region collision routing
joshistoast Jul 16, 2026
3c93f5d
feat(canvas): add legacy gallery image drop zones
joshistoast Jul 16, 2026
c16cc57
refactor(canvas): share compositor plan types
joshistoast Jul 16, 2026
7d5110a
fix(canvas): color picker component mounting
joshistoast Jul 16, 2026
2f9fff9
fix(canvas): minor ui tweaks
joshistoast Jul 16, 2026
4867f50
fix(canvas): color picker mount test
joshistoast Jul 16, 2026
866289b
docs: design canvas context menu groups
joshistoast Jul 16, 2026
90dbb9b
fix(canvas): restore legacy context menu groups
joshistoast Jul 16, 2026
391e804
feat(canvas): small menus as default
joshistoast Jul 16, 2026
a008d0b
feat(canvas): harden engine ownership and raster transactions
joshistoast Jul 16, 2026
545db32
test(canvas): add real-browser acceptance coverage
joshistoast Jul 16, 2026
4d86917
docs(canvas): document engine ownership invariants
joshistoast Jul 16, 2026
f20d433
fix(ci): playwright and linux cpu tests
joshistoast Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .github/workflows/frontend-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ jobs:
with:
files_yaml: |
webv2:
- '.github/workflows/frontend-tests.yml'
- 'invokeai/frontend/webv2/**'

- name: install dependencies
Expand All @@ -91,3 +92,13 @@ jobs:
if: ${{ steps.changed-files.outputs.webv2_any_changed == 'true' || inputs.always_run == true }}
run: 'pnpm test'
shell: bash

- name: install Chromium
if: ${{ steps.changed-files.outputs.webv2_any_changed == 'true' || inputs.always_run == true }}
run: 'pnpm exec playwright install chromium'
shell: bash

- name: vitest browser
if: ${{ steps.changed-files.outputs.webv2_any_changed == 'true' || inputs.always_run == true }}
run: 'pnpm test:browser'
shell: bash
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Canvas Context Menu Groups Design

## Goal

Restore the legacy canvas context-menu organization with labeled layer and canvas groups while keeping Delete as the final action.

## Design

- Canvas-surface context menus use Chakra `Menu.ItemGroup` and `Menu.ItemGroupLabel` primitives with the established uppercase, subtle label styling.
- A context menu opened over a layer labels the layer-scoped actions with the singular layer type: Raster Layer, Control Layer, Inpaint Mask, or Regional Guidance.
- Canvas-wide actions are labeled Canvas. Save to Gallery remains in this canvas group and appears before the terminal Delete action.
- Delete remains a separated standalone danger action at the bottom so no non-destructive action appears beneath it.
- A context menu opened over empty canvas space shows only the Canvas group.
- Layer-panel kebab and row context menus remain unchanged because the legacy panel menus were ungrouped.

## Boundaries

- Reuse existing translations for Canvas and singular layer types.
- Preserve all existing handlers, disabled states, submenu behavior, and menu positioning.
- Add no state, effects, dependencies, or action-registry coupling.

## Verification

- Add regression coverage for the surface-menu group model and render order.
- Verify each layer type resolves to the matching legacy label.
- Verify the optional Canvas group precedes the terminal danger section and panel menus remain ungrouped when labels are omitted.
- Run the focused context-menu tests, frontend typecheck, formatting check, and full frontend test suite.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import torch
from PIL import Image

# Import SAM2 components - these should be available in transformers 4.56.0+
from transformers.models.sam2 import Sam2Model
from transformers.models.sam2.processing_sam2 import Sam2Processor

Expand Down Expand Up @@ -101,7 +99,6 @@ def segment(
masks = self._sam2_processor.post_process_masks(
masks=outputs.pred_masks,
original_sizes=processed_inputs.original_sizes,
reshaped_input_sizes=processed_inputs.reshaped_input_sizes,
)

# There should be only one batch.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ export const createMockQueueItemStatusChangedEvent = (
status: 'completed',
error_type: null,
error_message: null,
error_traceback: null,
} as S['QueueItemStatusChangedEvent'],
overrides
);
Empty file.
8 changes: 7 additions & 1 deletion invokeai/frontend/webv2/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
"lint:oxc:fix": "oxlint --react-plugin --import-plugin --fix .",
"lint:tsc": "tsc --noEmit",
"preview": "vite preview",
"test": "vitest run"
"test": "vitest run --config vitest.config.mts",
"test:all": "pnpm run test && pnpm run test:browser",
"test:browser": "vitest run --config vitest.browser.config.mts"
},
"dependencies": {
"@chakra-ui/react": "^3.36.0",
Expand All @@ -30,9 +32,11 @@
"@tanstack/react-router": "^1.170.16",
"@tanstack/react-virtual": "^3.14.3",
"@xyflow/react": "^12.11.1",
"ag-psd": "^31.0.1",
"i18next": "^25.7.3",
"i18next-http-backend": "^3.0.2",
"lucide-react": "^1.21.0",
"perfect-freehand": "^1.2.3",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"react-hook-tanstack-virtual": "^0.0.4",
Expand All @@ -50,9 +54,11 @@
"@types/react-dom": "^19.2.3",
"@types/use-sync-external-store": "^1.5.0",
"@vitejs/plugin-react": "^6.0.3",
"@vitest/browser-playwright": "4.1.9",
"babel-plugin-react-compiler": "^1.0.0",
"oxfmt": "^0.56.0",
"oxlint": "^1.71.0",
"playwright": "1.61.1",
"typescript": "^6.0.3",
"vite": "^8.1.0",
"vitest": "^4.1.9"
Expand Down
Loading
Loading