feat(photo-editor): Ajax Image Editor client (Photoshop-parity tools)

Photoshop-parity editor client: layers, selection/masking, brushes,
smart filters, LUT import, Quick Edit, mobile gestures, workspaces,
batch operations, and the service-worker versioning (v978->v1006).

Source: vendor/photocraft (ad1cff44) photo-editor client files, merged
onto upstream/dev (a8c147b2). Conflict resolution documented in
pr_work/A_conflicts.md; editor files taken from vendor/photocraft
(upstream's editor is an earlier snapshot of the same feature).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
pewdiepie-archdaemon
2026-10-15 11:57:35 +00:00
co-authored by Claude Opus 5.5
parent c74f475679
commit 5fac693c1c
290 changed files with 34358 additions and 766 deletions
+32
View File
@@ -65,6 +65,38 @@ export function transformPopupHTML() {
<button type="button" data-spin="up" tabindex="-1" aria-label="Rotate +1°">+</button>
</span>
</div>
<div class="ge-transform-field">
<label>⇱</label>
<input type="number" class="ge-transform-popup-input" id="ge-transform-skew-x" step="1" value="0" aria-label="Horizontal skew" />
<span class="ge-transform-spin" data-spin-for="ge-transform-skew-x">
<button type="button" data-spin="down" tabindex="-1" aria-label="Skew X -1°">−</button>
<button type="button" data-spin="up" tabindex="-1" aria-label="Skew X +1°">+</button>
</span>
</div>
<div class="ge-transform-field">
<label>⇲</label>
<input type="number" class="ge-transform-popup-input" id="ge-transform-skew-y" step="1" value="0" aria-label="Vertical skew" />
<span class="ge-transform-spin" data-spin-for="ge-transform-skew-y">
<button type="button" data-spin="down" tabindex="-1" aria-label="Skew Y -1°">−</button>
<button type="button" data-spin="up" tabindex="-1" aria-label="Skew Y +1°">+</button>
</span>
</div>
<div class="ge-transform-field">
<label>⤒</label>
<input type="number" class="ge-transform-popup-input" id="ge-transform-persp-x" step="1" value="0" aria-label="Horizontal perspective" />
<span class="ge-transform-spin" data-spin-for="ge-transform-persp-x">
<button type="button" data-spin="down" tabindex="-1" aria-label="Perspective X -1">−</button>
<button type="button" data-spin="up" tabindex="-1" aria-label="Perspective X +1">+</button>
</span>
</div>
<div class="ge-transform-field">
<label>⤓</label>
<input type="number" class="ge-transform-popup-input" id="ge-transform-persp-y" step="1" value="0" aria-label="Vertical perspective" />
<span class="ge-transform-spin" data-spin-for="ge-transform-persp-y">
<button type="button" data-spin="down" tabindex="-1" aria-label="Perspective Y -1">−</button>
<button type="button" data-spin="up" tabindex="-1" aria-label="Perspective Y +1">+</button>
</span>
</div>
<span class="ge-transform-quick" aria-label="Transform actions">
<button type="button" class="ge-transform-quick-btn" id="ge-transform-flip-h" title="Flip horizontally" aria-label="Flip horizontally">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v18"/><path d="m8 7-4 5 4 5"/><path d="m16 7 4 5-4 5"/></svg>