Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
242 commits
Select commit Hold shift + click to select a range
1b10a5d
feat(app): right dock column and per-kind inspector
Nov 5, 2026
151e2fc
docs: CS6 parity matrix, wiki set, and CS6 UI evidence
Nov 5, 2026
1203ecc
feat(app): CS6 tool strip order and flyouts
Nov 5, 2026
49a4e61
feat(app): CS6 screen modes, Alt retouch swap, aegis gate
Nov 6, 2026
ed82eae
feat(app): in-canvas text editing and menu burn-down to 2 inert
Nov 6, 2026
cefe01c
fix(app): wire Ctrl+0 Fit Selection, keymap group counts, fmt
Nov 7, 2026
c275951
feat(app): 20.6 Ctrl+0 Fit Selection and rewind selection tests
Nov 7, 2026
fb3a92f
test(engine): stale-id refusal tests for filter commands
Nov 7, 2026
30dc39e
docs(release): add cross-platform release engineering plan
aliasfoxkde Nov 7, 2026
e04d4d2
docs(release): add T27 cross-platform release work ticket
aliasfoxkde Nov 7, 2026
e0d4b54
docs(release): track cross-platform release milestone
aliasfoxkde Nov 7, 2026
4c07ff1
docs(release): link comprehensive release campaign
aliasfoxkde Nov 7, 2026
0c609c6
docs(release): document planned package targets and evidence rules
aliasfoxkde Nov 7, 2026
5f65128
docs(handoff): direct agents to cross-platform release plan
aliasfoxkde Nov 7, 2026
a81fdb8
docs(release): RP-00 artifact matrix and TOOLCHAINS cross-link
Nov 7, 2026
165c400
feat(packaging): RP-01 Flatpak manifest+recipe, RPM declined (0070), …
Nov 7, 2026
8198542
feat(release): dist --source archive verb + tag workflow integration …
Nov 7, 2026
5d0ea59
docs(release): matrix marks source archive tested
Nov 7, 2026
d8a8792
feat(release): dist --sbom CycloneDX 1.5 over locked graph (RP-06)
Nov 7, 2026
8fc3694
feat(release): fail-closed aggregate validation before draft release …
Nov 7, 2026
5f85da1
docs(tasks): T27 board status in flight
Nov 7, 2026
a1ba95e
docs(release): record live-deployment drift evidence in matrix
Nov 7, 2026
a3cf9ba
docs(release): RP-04 Android feasibility report + matrix disposition
Nov 7, 2026
b63a040
fix(release): DEB glibc floor verified against binaries (RP-01 smoke)
Nov 7, 2026
a4d74a0
feat(release): in-tree app icon for AppImage (T27)
Nov 7, 2026
c9bec17
docs(release): real build states in artifact matrix (RP-02)
Nov 7, 2026
628e67b
docs(release): web bundle rebuild green in matrix (RP-05)
Nov 7, 2026
02c4460
feat(app): 20.5 multi-document tabs, clean raster opens
Nov 7, 2026
bec3032
feat(app): 21.4 preferences dialog with persisted UI scale
Nov 7, 2026
bc8b637
feat(app): 21.3 palette fuzzy scoring and persisted recents
Nov 7, 2026
7014638
wip(app,web): localStorage session persistence (21.1 partial)
Nov 3, 2026
fe24e9a
fix: resolve leftover conflict markers from the 21.1 cherry-pick
Nov 7, 2026
498af8a
feat(app): 21.1 autosave and crash recovery on both surfaces
Nov 7, 2026
ac17e25
feat(app): 21.2 render in device pixels (HiDPI)
Nov 7, 2026
970b1bc
docs: close 21.2 HiDPI in the ledgers
Nov 7, 2026
1e6fb7a
feat(app): 21.6 Commands runs .fwsteps alongside .jsf
Nov 7, 2026
88cf40c
feat(app): 21.5 desktop accesskit feature enabled
Nov 7, 2026
7449cbe
fix(app): guard recover_steps for wasm, single persisted init
Nov 7, 2026
f3e4c09
docs: 21.5 ledger entries
Nov 7, 2026
0c00b61
fix(app): repair distort, selection and redraw gestures
aliasfoxkde Nov 7, 2026
f9bea9f
fix(app): align symbol library click payload
aliasfoxkde Nov 7, 2026
a77ed51
fix(engine): reject overflowing retouch brush radii
aliasfoxkde Nov 7, 2026
a658edd
fix(xtask): isolate Aegis pattern state per invocation
aliasfoxkde Nov 7, 2026
88df723
docs: correct shell, build and parity details
coderabbitai[bot] Nov 7, 2026
3fc2baa
fix(xtask): emit accurate CycloneDX refs and dependency edges
aliasfoxkde Nov 7, 2026
c588a99
docs: identify progress snapshot as PR branch
aliasfoxkde Nov 7, 2026
397feaa
docs: close screenshot audit and separate chrome follow-up
aliasfoxkde Nov 7, 2026
a77a6bf
docs(release): reconcile implemented artifact pipeline
aliasfoxkde Nov 7, 2026
37e1510
docs(release): update artifact gaps and acceptance state
aliasfoxkde Nov 7, 2026
586ad7b
docs(release): distinguish implemented metadata from remaining signing
aliasfoxkde Nov 7, 2026
a82635c
fix(ci): use runner Chrome and grant draft-release permissions
aliasfoxkde Nov 7, 2026
c8d225b
fix(xtask): make SBOM serial source-sensitive
aliasfoxkde Nov 7, 2026
427f0f8
fix(engine): reject retouch radius overflow explicitly
aliasfoxkde Nov 7, 2026
5d3fa26
docs: record PR remediation and verification state
aliasfoxkde Nov 7, 2026
d7b98a9
fix(ci): verify checksum manifest in release aggregate
aliasfoxkde Nov 7, 2026
00fdd61
docs(release): mark updated SBOM verification pending
aliasfoxkde Nov 7, 2026
c25d5bd
docs(release): define a bounded MVP v1 release lane
aliasfoxkde Nov 7, 2026
1e1a2f2
docs(release): track MVP lane and release work in progress
aliasfoxkde Nov 7, 2026
f586ebc
docs(agent): correct Claude Code project status and gate
aliasfoxkde Nov 7, 2026
f330fd9
docs(agent): align instructions, layers and task isolation
aliasfoxkde Nov 7, 2026
14120df
docs: reconcile handoff snapshot and menu census
aliasfoxkde Nov 7, 2026
efddd1f
docs: update live task ledger for PR branch
aliasfoxkde Nov 7, 2026
6af496c
docs: correct menu census and current shell status
aliasfoxkde Nov 7, 2026
728159c
docs: correct live menu census
aliasfoxkde Nov 7, 2026
5c64409
docs: reconcile project menu status
aliasfoxkde Nov 7, 2026
5063ce3
docs: reconcile parity roadmap menu census
aliasfoxkde Nov 7, 2026
9d01a8d
docs: update current menu inert count
aliasfoxkde Nov 7, 2026
025199e
docs: update current shell work and menu census
aliasfoxkde Nov 7, 2026
cca3d91
style(xtask): apply rustfmt to release pipeline
aliasfoxkde Nov 7, 2026
eb26761
style(xtask): match rustfmt YAML error layout
aliasfoxkde Nov 7, 2026
e46ca3f
style(app): apply rustfmt to editor gesture tests
aliasfoxkde Nov 7, 2026
0c24ffe
style(engine): apply rustfmt to retouch guard tests
aliasfoxkde Nov 7, 2026
a2c9972
style(xtask): apply rustfmt to scratch-home guard
aliasfoxkde Nov 7, 2026
941e5b6
fix(app): center inserted symbol content
coderabbitai[bot] Nov 7, 2026
99ac326
fix(xtask): point Aegis at the scratch config on CI runners
Nov 9, 2026
9457199
fix(xtask): point Aegis at the scratch config on CI runners
Nov 9, 2026
539b76f
style: collapse nested conditionals to let-chains and use as_chunks
Nov 9, 2026
96c731e
fix(engine): refuse retouch radii whose diameter would wrap
Nov 9, 2026
8bbd840
ci: declare least-privilege GITHUB_TOKEN permissions
Nov 9, 2026
c74b179
build: raise MSRV to 1.95 and bump time past CVE-2026-25727
Nov 9, 2026
edf7fc7
fix(app): compile the recovery sidecar out of the wasm shell
Nov 9, 2026
43b1ffc
fix(app): remap shortcut mod codes to the evidenced Fireworks table
Nov 9, 2026
c2abb86
docs: reconcile ledgers to the 2026-11-07 ground truth
Nov 9, 2026
9bb43b2
chore(corpus): refresh scripts report timestamp
Nov 9, 2026
4ff5f0e
feat(app): 20.7 slice/hotspot editing and HTML preview
Nov 9, 2026
de48363
fix(app): one-axis creation gestures commit
Nov 9, 2026
d14937c
feat(app): Window-menu rows for the Slices and HTML Preview panels
Nov 9, 2026
db32839
fix(release): pass release assets positionally to gh release create
Nov 9, 2026
88123c3
fix(app): let one-axis creation gestures commit
Nov 9, 2026
092a91c
fix(xtask): move the test module to the end of the file
Nov 9, 2026
0cb2ce3
fix(xtask): point Aegis at the scratch config on CI runners
Nov 9, 2026
c0c145c
fix(xtask): re-pin the Aegis baseline and clear the xtask clippy fail…
Nov 9, 2026
7252648
fix(xtask): make the perf memory probe survive a replaced binary
Nov 9, 2026
78ce66d
docs: record the gate re-exec resolution finding
Nov 9, 2026
02c1c9d
fix(ci): let the CI image fetch a crate its cache lacks
Nov 9, 2026
4df8197
docs: record the CI-image offline fix and the runner-host truth
Nov 9, 2026
7e7f8ad
chore(aegis): re-pin the baseline for the release-workflow tree
Nov 9, 2026
b45be8c
docs: record the CI-image floor decision and the fork-bomb cleanup
Nov 9, 2026
aefe5ac
docs(ci): retire the offline-wall contract from the pipeline config
Nov 9, 2026
3f51a05
fix(xtask): carry the content-keyed aegis gate onto the release branch
Nov 9, 2026
1a5820b
fix(xtask): adjudicate the aegis findings this branch adds
Nov 9, 2026
8f2af84
docs(release): reconcile release ledgers with the Phase 0 audit (#19)
aliasfoxkde Nov 10, 2026
22364b2
Merge main into feat/dock-inspector-parity-matrix — takes main's merg…
Nov 10, 2026
8ada85c
style(xtask): apply rustfmt to the new aegis report verb
Nov 10, 2026
cc47def
Merge main into feat/dock-inspector-parity-matrix — site launch (#11)…
Nov 10, 2026
721d814
Merge main into feat/phase-21-daily-driver — takes main's merged Aegi…
Nov 10, 2026
270182b
docs(sessions): mark the deleted aegis suppression files as superseded
Nov 10, 2026
d41bcaa
docs(gaps): correct the decision-doc count after the merge
Nov 10, 2026
420d72d
fix(xtask): collapse the workspace-root lookup to a let-chain
Nov 10, 2026
e21cf3b
Merge origin/main into feat/release-workflow-repair
Nov 10, 2026
6eb7d9a
Merge remote-tracking branch 'origin/feat/release-workflow-repair' in…
Nov 10, 2026
55eb4fa
Merge remote-tracking branch 'origin/main' into feat/release-workflow…
Nov 10, 2026
dd99a82
Merge main into feat/slice-hotspot-edit — takes main's merged Aegis g…
Nov 10, 2026
5809ae5
Merge main into feat/phase-21-daily-driver — takes main's merged Aegi…
Nov 10, 2026
8c68b0f
docs(sessions): put the withdrawn-aegis-suppression notice before the…
Nov 10, 2026
5c0fda1
fix(xtask): restore the aegis adjudication the main merge dropped
Nov 10, 2026
110b264
Merge origin/main into feat/slice-hotspot-edit
Nov 10, 2026
1866927
Merge main into feat/dock-inspector-parity-matrix — takes main's merg…
Nov 10, 2026
80b7a3d
docs(changelog): regenerate for the merged history
Nov 10, 2026
6e8c3f3
fix(release): expect the bare version as the release title
Nov 10, 2026
bc0aef1
fix(xtask): collapse the glibc floor parse into a let-chain
Nov 10, 2026
7fcd453
feat(packaging): install the desktop entry and icon in the deb
Nov 10, 2026
7cf7dba
fix(packaging): read the deb's fields with dpkg-deb --field
Nov 10, 2026
22949fc
fix(flatpak): follow the desktop entry to its new home, and ship the …
Nov 10, 2026
e922156
fix(packaging): make the Linux recipes runnable, and the CLI askable
Nov 10, 2026
ea57c8e
feat(packaging): prove the CLI's document round trip inside the packa…
Nov 10, 2026
e011e52
docs(release): record the Linux distribution receipts in the matrix
Nov 10, 2026
43b938a
fix(packaging): make the desktop entry pass desktop-file-validate
Nov 10, 2026
80b31e4
ci(release): prove the built DEB installs on the release path
Nov 10, 2026
0f93d33
fix(xtask): backtick `AppImage` in deb desktop doc comments
Nov 10, 2026
08145d4
fix(xtask): backtick the product name in the deb payload doc comment
Nov 10, 2026
d4eea89
docs(parity): gate the 57651 placement claim on its evidence
Nov 10, 2026
1e7c174
Merge branch 'pr41' into HEAD
Nov 10, 2026
6d9c89d
fix(packaging): correct the flatpak recipe and the version extraction
Nov 10, 2026
22cd98c
fix(release): re-pin the wasm size budget to 22,000,000 B
Nov 10, 2026
f06e2b2
docs(release): renumber the wasm budget decision to 0079
Nov 10, 2026
385ec68
wip(keymap): preserve the CS6 keymap binding work in progress
Nov 10, 2026
61b0b40
docs(release): record the accesskit graph evidence in decision 0079
Nov 10, 2026
864078e
Merge origin/main into feat/slice-hotspot-edit
Nov 10, 2026
d604d7d
Merge origin/main into feat/dock-inspector-parity-matrix
Nov 10, 2026
d1699c0
Merge origin/main into feat/phase-21-daily-driver
Nov 10, 2026
24732c8
fix(xtask): backtick the two camelCase words in the ceiling's doc com…
Nov 10, 2026
fda5574
feat(engine): add session-scoped history rewind
Nov 10, 2026
8cc2539
feat(app): rewind the history from the History panel
Nov 10, 2026
ce85234
fix(engine): route the rewind through the delta door too
Nov 10, 2026
9c089b3
build(web): optimize wasm output and set 50 MB safety ceiling
aliasfoxkde Nov 10, 2026
8e19488
style: rustfmt the history-rewind change
Nov 10, 2026
e3e9360
docs: add production readiness plan and reconcile release guidance
aliasfoxkde Nov 10, 2026
8814bd3
docs: finish production guidance and policy reconciliation
aliasfoxkde Nov 10, 2026
0d4bc68
docs: remove duplicate plan link and finish release cross-reference
aliasfoxkde Nov 10, 2026
54be390
style(xtask): format scoped web build invocation
aliasfoxkde Nov 10, 2026
c4ec6ce
docs: add measured feature graph candidates to wasm plan
aliasfoxkde Nov 10, 2026
efbf68c
docs: refresh release plan main baseline
aliasfoxkde Nov 10, 2026
d7eea6d
chore(aegis): re-bless the content baseline for the parity-matrix con…
Nov 10, 2026
d5eb4d6
chore(aegis): re-bless the content baseline for the slice/hotspot work
Nov 10, 2026
fd432be
chore(aegis): cover the decision record's own quoted literals
Nov 10, 2026
0ebdd0e
chore(aegis): cover the decision record's own quoted literals
Nov 10, 2026
b81e2e2
test(app): make the rewind depths relative to the seeded document
Nov 10, 2026
bc8d4fb
docs: plan FireCraft WebOS shared platform integration
aliasfoxkde Nov 10, 2026
2580dd7
Merge main into feat/deb-desktop-integration
Nov 10, 2026
044482c
docs(release): define complete delivery matrix and shared Craft workf…
aliasfoxkde Nov 10, 2026
b1b9874
docs(webos): align FireCraft integration with shared Craft SDK
aliasfoxkde Nov 10, 2026
505c139
docs: correct shared workflow attribution
aliasfoxkde Nov 10, 2026
fa17934
docs: correct shared workflow attribution
aliasfoxkde Nov 10, 2026
0764bc4
docs(release): clarify FreeBSD ARM64 release prerequisites
aliasfoxkde Nov 10, 2026
43b9376
docs(plan): preserve independent FireCraft product scope
aliasfoxkde Nov 10, 2026
e17cf72
feat(compose): render onion-skin ghosts for states
Nov 10, 2026
7ad458f
fix(docs): use the constant's literal form
Nov 10, 2026
da61bba
chore(license): narrow FireCraft to Apache-2.0 alone
Nov 10, 2026
49c1947
docs(parity): correct the keyboard-access numbers
Nov 10, 2026
0b0de2c
feat(app): bind every printed CS6 accelerator
Nov 10, 2026
208476d
feat(brand): replace the fox mark with a vector flame
Nov 11, 2026
f6c40e8
chore(aegis): re-bless the baseline for the new mark
Nov 11, 2026
a9b7fe6
Merge main into feat/dock-inspector-parity-matrix
Nov 11, 2026
d4c1c32
chore(aegis): re-bless the baseline for the merged tree
Nov 11, 2026
848517d
Merge main into feat/slice-hotspot-edit
Nov 11, 2026
cfde42a
chore(aegis): re-bless the baseline for the merged tree
Nov 11, 2026
dab81c4
Merge main into feat/deb-desktop-integration
Nov 11, 2026
c3a3db5
Merge remote-tracking branch 'origin/main' into feat/history-rewind-s…
Nov 11, 2026
03d79f9
fix(xtask): backtick the FireCraft identifier in the changelog doc
Nov 11, 2026
d7ed6bb
fix(aegis): re-bless the baseline for the readiness-plan docs
Nov 11, 2026
0674cf1
test(engine): capture the rewind reference state after the first edit
Nov 11, 2026
1b2c2b6
docs(release): reconcile the live web deployment
Nov 11, 2026
e4b9ccd
docs(release): number the deployment decision 0084
Nov 11, 2026
71530eb
train: PR #8 dock inspector parity matrix
Nov 11, 2026
6962c0f
fix(xtask): backtick `GitForge` in the bundle-ceiling doc comment
Nov 11, 2026
fa7c9d2
merge: PR #13 slice/hotspot editing into the shell-lineage train
Nov 11, 2026
1fd4f85
docs: Clarify web deployment provenance and scope
coderabbitai[bot] Nov 11, 2026
a7f6a39
merge: PR #15 Phase 21 daily driver into the shell-lineage train
Nov 11, 2026
98178ae
merge: PR #41 Linux desktop integration into the shell-lineage train
Nov 11, 2026
0c73267
merge: PR #84 history rewind into the shell-lineage train
Nov 11, 2026
897bc6b
merge: PR #102 brand flame mark into the shell-lineage train
Nov 11, 2026
40e905d
merge: PR #83 wasm size budget re-pin into the shell-lineage train
Nov 11, 2026
3f53966
merge: PR #100 onion-skin rendering into the shell-lineage train
Nov 11, 2026
b02d0b5
feat(xtask): reachability and panel gates
Nov 11, 2026
2678899
fix(xtask): rustfmt the new gate modules
Nov 11, 2026
ac3ded6
docs(gates): correct the egui_kittest finding
Nov 11, 2026
e7c60e4
feat(release): add a machine-readable release manifest
Nov 11, 2026
8391e97
docs(decisions): renumber the release-manifest ADR to 0085
Nov 11, 2026
bbb9f3b
fix(xtask): make the snapshot diff match exhaustively
Nov 11, 2026
cf5b455
docs(release): state what the manifest's asset set covers
Nov 11, 2026
d61a11e
docs(release): count the manifest in the release checklist
Nov 11, 2026
43154c3
fix(xtask): name the checksum-list type the manifest reads
Nov 11, 2026
4a95cf1
merge: PR #103 CS6 keymap bindings into the shell-lineage train
Nov 11, 2026
1f3484a
fix(app): repair the merged shortcut table's syntax
Nov 11, 2026
b357639
fix(ci): fail closed, and split the stamp checks
Nov 11, 2026
6c9abb3
merge: PR #104 reconcile the live web deployment
Nov 11, 2026
719d4e6
feat(xtask): add the reachability gate and the panel-structure snapshot
Nov 11, 2026
285bfb4
feat(release): add the machine-readable release manifest
Nov 11, 2026
967bafe
chore(license): make FireCraft Apache-2.0 only
Nov 11, 2026
1e8ac9d
docs(release): land the production-readiness plan and the bundle-size…
Nov 11, 2026
4fff7bf
fix(app): restore the panel inventory the snapshot gate reads
Nov 11, 2026
fa82b36
ci: enforce the reachability and panel-snapshot gates in the pipeline
Nov 11, 2026
d10068d
fix(gate): re-bless the aegis baseline for the shell-lineage tree
Nov 11, 2026
5737e90
fix(engine): re-attach the brush-radius doc comment to its function
Nov 11, 2026
3b54294
fix(app): drop the duplicated tool arms in the canvas click handler
Nov 11, 2026
fc5d713
fix(release): stamp every version together
Nov 11, 2026
1ac80e4
chore(aegis): bless the release receipt identifiers
Nov 11, 2026
36026ff
chore(git): ignore the session scratch directory
Nov 11, 2026
805b3ef
docs(roadmap): land the v1 MVP roadmap
Nov 11, 2026
0f71fd8
docs(release): record the dryrun.3 receipt
Nov 11, 2026
116116e
fix(release): read the lock's fields the way TOML writes them
Nov 11, 2026
3563af9
fix(xtask): repair the release gate's two red checks
Nov 11, 2026
d1291f8
docs(release): note the source archive's canonical lowercase name
Nov 11, 2026
4273471
fix(xtask): let the stamp tests use expect()
Nov 11, 2026
bab5d64
docs: correct the keyboard-access numbers to the merged tree
Nov 11, 2026
8deafc4
fix(packaging): declare the libraries the desktop binary loads
Nov 11, 2026
5f76a12
feat(app): bind every remaining CS6 keymap command
Nov 11, 2026
6bc3f90
docs: cite the pipeline run by its short id
Nov 11, 2026
6f41a33
feat(doc): model the mask stack's combine mode
Nov 11, 2026
fb70492
feat(app): the Properties panel's mask stack section
Nov 11, 2026
a3141fd
docs: decision 0091, the T9 ticket, and the Phase 20 ledger
Nov 11, 2026
885be17
docs: restate the reachability measurement after the mask command
Nov 11, 2026
0214fc3
fix(doc): make the mask stack's model compile and pass the gates
Nov 11, 2026
097ef7d
docs: renumber the mask-stack decision to 0092
Nov 11, 2026
02b9247
feat(engine,compose): element mask stacks — coverage, levels, and fol…
Nov 11, 2026
7a45bcb
feat(app): the mask stack's level panel, and its persistence
Nov 11, 2026
0418c24
feat(app,engine): a mask level links and unlinks its own mask
Nov 11, 2026
71e375b
feat(app,engine): rebase the mask stack onto main
Nov 11, 2026
69c880e
ci: size the pipeline watchdogs from the fleet's measured wall-clock
Nov 11, 2026
754b0d8
Merge origin/main into feat/mask-stack-ui-v2: the release train and t…
Nov 12, 2026
44b383a
Merge origin/main into feat/mask-stack-ui-v2: the release train and t…
Nov 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .reachability-floor.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# The bless verb refuses to lower the floor.
#
# metric<TAB>value
registry_commands 253
shell_bound_commands 168
reachable_percent 66.40
floor_reachable_percent 66.40
registry_commands 257
shell_bound_commands 172
reachable_percent 66.93
floor_reachable_percent 66.93
84 changes: 83 additions & 1 deletion crates/app/src/shell/panels.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

use super::*;
use compose::abgr_pack;
use doc::{GroupObject, ImageObject, SliceObject};
use doc::{GroupObject, ImageObject, MaskCombineMode, SliceObject};

impl Shell {
/// Edit ▸ Paste as Mask / Paste Inside: the clipboard becomes the
Expand Down Expand Up @@ -889,6 +889,7 @@ impl Shell {
self.document_properties(ui);
return;
};
self.mask_stack_panel(ui, id);
let object = self.editor.document().registry.get(id).cloned();
let effects = match object {
Some(ObjectData::Path(path)) => {
Expand Down Expand Up @@ -1642,6 +1643,87 @@ impl Shell {
}
}

/// The mask stack section of the Properties panel: the element
/// mask's levels, their state, and the way each level combines with
/// the coverage below it.
///
/// A `FireCraft` extension (decision 0092): CS6 has one element mask
/// per object and no stack, so the level's mode defaults to the
/// union. The panel draws the section only when the selection
/// carries an element mask.
pub(super) fn mask_stack_panel(&mut self, ui: &mut egui::Ui, id: doc::ObjectId) {
let levels = engine::catalog::element_mask_stack(self.editor.document(), id);
if levels.is_empty() {
return;
}
ui.heading("Mask stack");
let count = levels.len();
for (index, level) in levels.iter().enumerate() {
// The levels are listed top first; the mask numbers count
// from the bottom, as CS6 numbers its masks.
let number = count - index;
ui.horizontal(|ui| {
let mut enabled = level.enabled;
if ui
.checkbox(&mut enabled, format!("Mask {number}"))
.changed()
{
self.run_command(
"mask.enable",
serde_json::json!({ "id": level.group, "enable": enabled }),
);
}
egui::ComboBox::from_id_salt(("mask_mode", level.group))
.selected_text(level.mode.as_str())
.width(80.0)
.show_ui(ui, |ui| {
for candidate in MaskCombineMode::ALL {
if ui
.selectable_label(candidate == level.mode, candidate.as_str())
.clicked()
{
self.run_command(
"mask.setStackMode",
serde_json::json!({
"id": level.group,
"mode": candidate.as_str(),
}),
);
}
}
});
if ui.small_button("↑").clicked() {
self.run_command(
"mask.moveLevel",
serde_json::json!({ "id": level.group, "delta": 1 }),
);
}
if ui.small_button("↓").clicked() {
self.run_command(
"mask.moveLevel",
serde_json::json!({ "id": level.group, "delta": -1 }),
);
}
if ui.small_button("remove").clicked() {
self.run_command("mask.removeLevel", serde_json::json!({ "id": level.group }));
}
// The link flag rides the level's own mask group, so
// it is per level: an unlinked level's mask moves on
// its own, without its content.
let mut linked = level.linked;
if ui.checkbox(&mut linked, "link").changed() {
self.run_command(
"mask.link",
serde_json::json!({ "id": level.group, "linked": linked }),
);
}
});
}
if ui.button("Add level").clicked() {
self.run_command("mask.addLevel", serde_json::json!({ "id": id }));
}
}

/// Bitmap properties: the pixel geometry as a readout, then the
/// shared display controls.
///
Expand Down
Loading
Loading