From 5fac693c1c288c62837c4007bb5cd9e6ad14b793 Mon Sep 17 00:00:00 2001 From: pewdiepie-archdaemon Date: Tue, 13 Oct 2026 13:37:26 +0000 Subject: [PATCH] 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 --- static/css/13-image-editor.css | 4375 +++++++++++- static/css/documents-gallery-editor.css | 339 + static/fonts/BebasNeue-Regular.woff2 | Bin 0 -> 13768 bytes static/fonts/Lobster-Regular.woff2 | Bin 0 -> 33844 bytes static/fonts/PlayfairDisplay-Bold.woff2 | Bin 0 -> 38404 bytes static/fonts/PlayfairDisplay-Regular.woff2 | Bin 0 -> 38404 bytes static/fonts/Roboto-Bold.woff2 | Bin 0 -> 43136 bytes static/fonts/Roboto-Regular.woff2 | Bin 0 -> 43136 bytes static/fonts/RobotoMono-Bold.woff2 | Bin 0 -> 32796 bytes static/fonts/RobotoMono-Regular.woff2 | Bin 0 -> 32796 bytes static/fonts/custom/GohuFont.ttf | Bin 0 -> 1468 bytes static/icons/ollama-mark-crop.png | Bin 0 -> 7498 bytes static/icons/ollama-mark.png | Bin 0 -> 7487 bytes static/icons/sglang-logo.png | Bin 0 -> 109100 bytes static/icons/sglang-mark.png | Bin 0 -> 2171 bytes static/js/editor/actions-panel.js | 239 + static/js/editor/adjustment-layer.js | 27 +- static/js/editor/ai-models.js | 134 +- static/js/editor/ai-settings.js | 85 + static/js/editor/ai-tools-misc.js | 38 +- static/js/editor/aspect-fit.js | 35 + static/js/editor/batch-runner.js | 35 + static/js/editor/blend-modes.js | 256 + static/js/editor/brush-engine.js | 50 +- static/js/editor/brush-presets.js | 4 + static/js/editor/build/command-palette.js | 80 + static/js/editor/build/controls.js | 179 +- static/js/editor/build/dock.js | 496 ++ static/js/editor/build/options-bar.js | 252 + static/js/editor/build/popups.js | 14 +- static/js/editor/build/right-panel.js | 90 +- static/js/editor/build/toolbar.js | 305 +- static/js/editor/build/topbar.js | 521 +- static/js/editor/build/transform-popup.js | 32 + static/js/editor/canvas-context-menu.js | 313 + static/js/editor/canvas-events.js | 105 +- static/js/editor/canvas-transforms.js | 45 +- static/js/editor/clipboard-and-drop.js | 82 +- static/js/editor/color-mode.js | 56 + static/js/editor/control-kit.js | 201 + static/js/editor/document-codec.js | 12 +- static/js/editor/document-geometry.js | 278 +- static/js/editor/draggable-dialog.js | 72 + static/js/editor/editor-agent.js | 374 ++ static/js/editor/editor-bridge.js | 104 + static/js/editor/editor-control.js | 97 + static/js/editor/effects-worker.js | 36 + static/js/editor/effects.js | 52 +- static/js/editor/export-dialog.js | 12 + static/js/editor/filters/dehaze.js | 238 + static/js/editor/filters/effects.js | 1347 ++++ static/js/editor/fx/adj-popup.js | 190 +- static/js/editor/fx/cube-lut.js | 146 + static/js/editor/fx/develop.js | 161 + static/js/editor/fx/pixel-pass.js | 175 +- static/js/editor/history-panel.js | 120 +- static/js/editor/keyboard-shortcuts.js | 59 +- static/js/editor/layer-clipping.js | 22 +- static/js/editor/layer-groups.js | 13 +- static/js/editor/layer-helpers.js | 27 + static/js/editor/layer-hit-test.js | 31 + static/js/editor/layer-panel.js | 50 +- static/js/editor/look-recipes.js | 168 + static/js/editor/mask-ops.js | 62 + static/js/editor/multi-transform.js | 16 +- static/js/editor/nl-edit.js | 611 ++ static/js/editor/panel-visibility.js | 174 + static/js/editor/panels/panels.js | 446 ++ static/js/editor/panels/studio-panels.js | 298 + static/js/editor/patch-ops.js | 145 + static/js/editor/path-geometry.js | 120 + static/js/editor/perspective-crop.js | 99 + static/js/editor/perspective-warp.js | 111 + static/js/editor/precision-guides.js | 32 +- static/js/editor/preflight.js | 253 + static/js/editor/psd.js | 497 ++ static/js/editor/retouch.js | 433 ++ static/js/editor/scroll-affordance.js | 41 + static/js/editor/select-and-mask.js | 196 + static/js/editor/select-subject.js | 174 + static/js/editor/selection-mask.js | 20 +- static/js/editor/shape-boolean.js | 49 + static/js/editor/shape-layer.js | 15 +- static/js/editor/shortcuts-popover.js | 3 +- static/js/editor/state.js | 43 + static/js/editor/stroke-pipeline.js | 88 + static/js/editor/stroke-tool-sliders.js | 4 + static/js/editor/submenu-toggles.js | 33 + static/js/editor/text-layer.js | 239 +- static/js/editor/tool-shortcuts.js | 1 + static/js/editor/tools/bucket.js | 141 + static/js/editor/tools/color-range.js | 42 + static/js/editor/tools/crop.js | 70 +- static/js/editor/tools/eyedropper.js | 40 +- static/js/editor/tools/lasso.js | 77 +- static/js/editor/tools/object-select.js | 88 + static/js/editor/tools/patch.js | 69 + static/js/editor/tools/pen-path.js | 68 + static/js/editor/tools/perspective-crop.js | 145 + static/js/editor/tools/quick-select.js | 63 + static/js/editor/tools/stroke.js | 2 +- static/js/editor/tools/transform-session.js | 77 + static/js/editor/wire-extra-menus.js | 231 + static/js/editor/wire-import.js | 70 +- static/js/editor/wire-merge-buttons.js | 30 + static/js/editor/wire-selection-controls.js | 35 +- static/js/editor/wire-topbar-menus.js | 168 +- static/js/editor/wire-topbar-overflow.js | 18 +- static/js/editor/wire-topbar.js | 7 +- static/js/editor/wire-view-menu.js | 15 +- static/js/editor/workspaces.js | 37 + static/js/galleryEditor.js | 5914 ++++++++++++++++- static/sw.js | 57 +- .../photo-editor/adjustment-layers.spec.js | 17 +- tests/e2e/photo-editor/brush-cursor.spec.js | 3 +- tests/e2e/photo-editor/brush-engine.spec.js | 25 +- tests/e2e/photo-editor/compare-mode.spec.js | 3 +- tests/e2e/photo-editor/core-workflow.spec.js | 11 +- .../photo-editor/direct-manipulation.spec.js | 21 +- tests/e2e/photo-editor/group-effects.spec.js | 9 +- tests/e2e/photo-editor/group-mask.spec.js | 9 +- tests/e2e/photo-editor/helpers.js | 12 + tests/e2e/photo-editor/layer-clipping.spec.js | 6 +- tests/e2e/photo-editor/layer-locks.spec.js | 5 +- .../e2e/photo-editor/layer-mask-link.spec.js | 9 +- .../e2e/photo-editor/layer-selection.spec.js | 17 +- .../photo-editor/mobile-layer-sheet.spec.js | 21 +- .../e2e/photo-editor/multi-transform.spec.js | 13 +- .../photo-editor/phone-footer-gaps.spec.js | 40 + tests/e2e/photo-editor/placed-layers.spec.js | 25 +- .../e2e/photo-editor/project-recovery.spec.js | 10 +- .../photo-editor/rasterize-confirm.spec.js | 9 +- .../e2e/photo-editor/refresh-recovery.spec.js | 14 +- .../photo-editor/selection-boundary.spec.js | 64 +- .../e2e/photo-editor/selection-refine.spec.js | 27 +- tests/e2e/photo-editor/text-font-swap.spec.js | 41 + tests/e2e/photo-editor/text-shapes.spec.js | 17 +- .../e2e/photo-editor/transform-frame.spec.js | 60 +- tests/test_editor_actions_panel_js.py | 68 + tests/test_editor_add_layer_fx.py | 36 + tests/test_editor_adj_popup_close.py | 29 + tests/test_editor_adjustment_layers_js.py | 36 + tests/test_editor_adjustments_parity_js.py | 54 + tests/test_editor_agent_js.py | 203 + tests/test_editor_aspect_fit_js.py | 61 + tests/test_editor_autosave_recovery.py | 92 + tests/test_editor_batch.py | 104 + tests/test_editor_blend_modes_js.py | 60 + tests/test_editor_bridge_js.py | 79 + tests/test_editor_brush_engine_js.py | 105 +- tests/test_editor_bucket_options.py | 42 + tests/test_editor_bucket_tool.py | 102 + tests/test_editor_canvas_context_menu.py | 118 + tests/test_editor_canvas_navigation_js.py | 5 +- tests/test_editor_clipboard_paste_static.py | 53 + tests/test_editor_color_lookup_cube.py | 140 + tests/test_editor_color_mode_js.py | 68 + tests/test_editor_color_panels_js.py | 40 + tests/test_editor_command_palette_js.py | 43 + tests/test_editor_control_js.py | 120 + tests/test_editor_crop_options.py | 60 + tests/test_editor_dehaze.py | 94 + tests/test_editor_develop.py | 152 + tests/test_editor_dock_contrast.py | 35 + tests/test_editor_dock_detach_placement.py | 25 + tests/test_editor_dock_head_buttons.py | 35 + tests/test_editor_dock_history_glyph.py | 31 + tests/test_editor_dock_js.py | 105 + tests/test_editor_dock_layout.py | 41 + tests/test_editor_dock_overflow_glyph.py | 28 + tests/test_editor_dock_popup_placement.py | 37 + tests/test_editor_dock_tabs.py | 32 + tests/test_editor_document_codec_js.py | 4 + tests/test_editor_document_geometry_js.py | 67 +- tests/test_editor_extra_menus_js.py | 80 + tests/test_editor_eyedropper_options.py | 47 + tests/test_editor_filter_busy.py | 48 + tests/test_editor_filter_categories_js.py | 94 + tests/test_editor_filter_submenus.py | 39 + tests/test_editor_float_dock_icon.py | 33 + .../test_editor_generation_error_messages.py | 58 + tests/test_editor_history_dock.py | 32 + tests/test_editor_history_snapshots.py | 81 + tests/test_editor_keyboard_shortcut_audit.py | 113 + tests/test_editor_keyboard_shortcuts.py | 20 + tests/test_editor_landing_scroll_css.py | 36 + tests/test_editor_layer_hit_test_js.py | 90 + tests/test_editor_look_recipes.py | 123 + tests/test_editor_main_menus_js.py | 61 + tests/test_editor_marquee_selection_js.py | 28 +- tests/test_editor_mask_ops_js.py | 74 + tests/test_editor_menus_file_edit_help_js.py | 113 + tests/test_editor_mobile_footer_sheet.py | 46 + tests/test_editor_mobile_gestures.py | 61 + tests/test_editor_mobile_hscroll.py | 34 + ...test_editor_mobile_layer_opacity_footer.py | 31 + tests/test_editor_mobile_layer_rows.py | 36 + ...test_editor_mobile_layers_footer_spread.py | 36 + tests/test_editor_mobile_layers_header.py | 25 + tests/test_editor_mobile_layers_sheet.py | 40 + tests/test_editor_mobile_panels.py | 28 + tests/test_editor_mobile_phone_chrome.py | 29 + tests/test_editor_mobile_phone_footer_dock.py | 39 + tests/test_editor_mobile_qe_chips.py | 36 + tests/test_editor_mobile_qe_chrome.py | 74 + tests/test_editor_mobile_qe_sheet.py | 54 + tests/test_editor_mobile_tool_rail_more.py | 58 + tests/test_editor_mobile_touch_targets.py | 59 + ...test_editor_mobile_touch_targets_topbar.py | 44 + tests/test_editor_nl_edit_js.py | 292 + tests/test_editor_options_bar_js.py | 42 + tests/test_editor_p2_ops_static.py | 224 + tests/test_editor_panel_rail_collapse.py | 85 + ...est_editor_panel_titles_and_adjustments.py | 59 + tests/test_editor_panel_visibility.py | 128 + tests/test_editor_patch.py | 98 + tests/test_editor_pen_path_js.py | 60 + tests/test_editor_perspective_crop.py | 130 + tests/test_editor_photoshop_features.py | 60 + tests/test_editor_photoshop_features_more.py | 50 + tests/test_editor_photoshop_features_more2.py | 90 + tests/test_editor_photoshop_features_more3.py | 103 + tests/test_editor_photoshop_features_more4.py | 185 + tests/test_editor_photoshop_features_more5.py | 118 + tests/test_editor_photoshop_features_more6.py | 274 + tests/test_editor_photoshop_features_more7.py | 150 + tests/test_editor_photoshop_features_more8.py | 171 + tests/test_editor_photoshop_features_more9.py | 186 + tests/test_editor_photoshop_layout.py | 102 + tests/test_editor_preflight.py | 75 + tests/test_editor_psd_js.py | 39 + tests/test_editor_psd_layered_js.py | 71 + tests/test_editor_quick_edit_adjustments.py | 48 + tests/test_editor_quick_edit_blur_filters.py | 52 + tests/test_editor_quick_edit_border_smooth.py | 61 + .../test_editor_quick_edit_combine_shapes.py | 68 + .../test_editor_quick_edit_crop_selection.py | 34 + tests/test_editor_quick_edit_edit_menu.py | 40 + tests/test_editor_quick_edit_fill_colors.py | 37 + tests/test_editor_quick_edit_fill_fgbg.py | 22 + tests/test_editor_quick_edit_filters.py | 77 + .../test_editor_quick_edit_free_transform.py | 58 + tests/test_editor_quick_edit_image_mode.py | 32 + tests/test_editor_quick_edit_invert.py | 37 + tests/test_editor_quick_edit_layer_blend.py | 34 + tests/test_editor_quick_edit_layer_mask.py | 67 + tests/test_editor_quick_edit_layer_opacity.py | 34 + tests/test_editor_quick_edit_layer_styles.py | 35 + .../test_editor_quick_edit_load_selection.py | 65 + tests/test_editor_quick_edit_rasterize.py | 45 + tests/test_editor_quick_edit_recents.py | 46 + tests/test_editor_quick_edit_reselect.py | 46 + .../test_editor_quick_edit_save_selection.py | 55 + ...est_editor_quick_edit_select_all_layers.py | 39 + ...test_editor_quick_edit_selection_modify.py | 55 + tests/test_editor_quick_edit_static.py | 663 +- tests/test_editor_quick_edit_swap_colors.py | 40 + tests/test_editor_quick_edit_view_menu.py | 49 + tests/test_editor_quick_edit_warp_text.py | 50 + tests/test_editor_retouch_js.py | 121 + tests/test_editor_rotate_arbitrary.py | 96 + tests/test_editor_scroll_affordance.py | 40 + tests/test_editor_scroll_fade_contrast.py | 33 + tests/test_editor_select_subject.py | 74 + tests/test_editor_selection_modify.py | 85 + tests/test_editor_selection_tools_js.py | 162 + tests/test_editor_shape_boolean_js.py | 52 + tests/test_editor_shape_layers_js.py | 2 +- tests/test_editor_smart_filters.py | 80 + tests/test_editor_studio_panels_js.py | 78 + tests/test_editor_swatches_hex.py | 67 + tests/test_editor_swatches_picker.py | 40 + tests/test_editor_text_fonts.py | 66 + tests/test_editor_text_layers_js.py | 5 +- tests/test_editor_text_on_path.py | 83 + tests/test_editor_text_on_path_curve.py | 95 + tests/test_editor_text_opentype_js.py | 47 + tests/test_editor_text_options_layout.py | 29 + tests/test_editor_text_vertical_warp_js.py | 41 + tests/test_editor_theme_tokens.py | 48 + tests/test_editor_theme_tokens_checklist.py | 58 + tests/test_editor_theme_tokens_more.py | 52 + tests/test_editor_tool_flyout_position.py | 15 + tests/test_editor_tool_rail_ellipsis.py | 23 + tests/test_editor_topbar_static.py | 40 +- tests/test_editor_transform_perspective_js.py | 52 + tests/test_editor_transform_skew_js.py | 44 + tests/test_editor_window_menu_checkmarks.py | 76 + tests/test_editor_window_workspace_submenu.py | 55 + tests/test_editor_workspaces_js.py | 53 + 290 files changed, 34358 insertions(+), 766 deletions(-) create mode 100644 static/fonts/BebasNeue-Regular.woff2 create mode 100644 static/fonts/Lobster-Regular.woff2 create mode 100644 static/fonts/PlayfairDisplay-Bold.woff2 create mode 100644 static/fonts/PlayfairDisplay-Regular.woff2 create mode 100644 static/fonts/Roboto-Bold.woff2 create mode 100644 static/fonts/Roboto-Regular.woff2 create mode 100644 static/fonts/RobotoMono-Bold.woff2 create mode 100644 static/fonts/RobotoMono-Regular.woff2 create mode 100644 static/fonts/custom/GohuFont.ttf create mode 100644 static/icons/ollama-mark-crop.png create mode 100644 static/icons/ollama-mark.png create mode 100644 static/icons/sglang-logo.png create mode 100644 static/icons/sglang-mark.png create mode 100644 static/js/editor/actions-panel.js create mode 100644 static/js/editor/ai-settings.js create mode 100644 static/js/editor/aspect-fit.js create mode 100644 static/js/editor/batch-runner.js create mode 100644 static/js/editor/blend-modes.js create mode 100644 static/js/editor/build/command-palette.js create mode 100644 static/js/editor/build/dock.js create mode 100644 static/js/editor/build/options-bar.js create mode 100644 static/js/editor/canvas-context-menu.js create mode 100644 static/js/editor/color-mode.js create mode 100644 static/js/editor/control-kit.js create mode 100644 static/js/editor/draggable-dialog.js create mode 100644 static/js/editor/editor-agent.js create mode 100644 static/js/editor/editor-bridge.js create mode 100644 static/js/editor/editor-control.js create mode 100644 static/js/editor/filters/dehaze.js create mode 100644 static/js/editor/filters/effects.js create mode 100644 static/js/editor/fx/cube-lut.js create mode 100644 static/js/editor/fx/develop.js create mode 100644 static/js/editor/layer-hit-test.js create mode 100644 static/js/editor/look-recipes.js create mode 100644 static/js/editor/mask-ops.js create mode 100644 static/js/editor/nl-edit.js create mode 100644 static/js/editor/panel-visibility.js create mode 100644 static/js/editor/panels/panels.js create mode 100644 static/js/editor/panels/studio-panels.js create mode 100644 static/js/editor/patch-ops.js create mode 100644 static/js/editor/path-geometry.js create mode 100644 static/js/editor/perspective-crop.js create mode 100644 static/js/editor/perspective-warp.js create mode 100644 static/js/editor/preflight.js create mode 100644 static/js/editor/psd.js create mode 100644 static/js/editor/retouch.js create mode 100644 static/js/editor/scroll-affordance.js create mode 100644 static/js/editor/select-and-mask.js create mode 100644 static/js/editor/select-subject.js create mode 100644 static/js/editor/shape-boolean.js create mode 100644 static/js/editor/submenu-toggles.js create mode 100644 static/js/editor/tools/bucket.js create mode 100644 static/js/editor/tools/color-range.js create mode 100644 static/js/editor/tools/object-select.js create mode 100644 static/js/editor/tools/patch.js create mode 100644 static/js/editor/tools/pen-path.js create mode 100644 static/js/editor/tools/perspective-crop.js create mode 100644 static/js/editor/tools/quick-select.js create mode 100644 static/js/editor/wire-extra-menus.js create mode 100644 static/js/editor/workspaces.js create mode 100644 tests/e2e/photo-editor/phone-footer-gaps.spec.js create mode 100644 tests/e2e/photo-editor/text-font-swap.spec.js create mode 100644 tests/test_editor_actions_panel_js.py create mode 100644 tests/test_editor_add_layer_fx.py create mode 100644 tests/test_editor_adj_popup_close.py create mode 100644 tests/test_editor_adjustments_parity_js.py create mode 100644 tests/test_editor_agent_js.py create mode 100644 tests/test_editor_aspect_fit_js.py create mode 100644 tests/test_editor_autosave_recovery.py create mode 100644 tests/test_editor_batch.py create mode 100644 tests/test_editor_blend_modes_js.py create mode 100644 tests/test_editor_bridge_js.py create mode 100644 tests/test_editor_bucket_options.py create mode 100644 tests/test_editor_bucket_tool.py create mode 100644 tests/test_editor_canvas_context_menu.py create mode 100644 tests/test_editor_clipboard_paste_static.py create mode 100644 tests/test_editor_color_lookup_cube.py create mode 100644 tests/test_editor_color_mode_js.py create mode 100644 tests/test_editor_color_panels_js.py create mode 100644 tests/test_editor_command_palette_js.py create mode 100644 tests/test_editor_control_js.py create mode 100644 tests/test_editor_crop_options.py create mode 100644 tests/test_editor_dehaze.py create mode 100644 tests/test_editor_develop.py create mode 100644 tests/test_editor_dock_contrast.py create mode 100644 tests/test_editor_dock_detach_placement.py create mode 100644 tests/test_editor_dock_head_buttons.py create mode 100644 tests/test_editor_dock_history_glyph.py create mode 100644 tests/test_editor_dock_js.py create mode 100644 tests/test_editor_dock_layout.py create mode 100644 tests/test_editor_dock_overflow_glyph.py create mode 100644 tests/test_editor_dock_popup_placement.py create mode 100644 tests/test_editor_dock_tabs.py create mode 100644 tests/test_editor_extra_menus_js.py create mode 100644 tests/test_editor_eyedropper_options.py create mode 100644 tests/test_editor_filter_busy.py create mode 100644 tests/test_editor_filter_categories_js.py create mode 100644 tests/test_editor_filter_submenus.py create mode 100644 tests/test_editor_float_dock_icon.py create mode 100644 tests/test_editor_generation_error_messages.py create mode 100644 tests/test_editor_history_dock.py create mode 100644 tests/test_editor_history_snapshots.py create mode 100644 tests/test_editor_keyboard_shortcut_audit.py create mode 100644 tests/test_editor_landing_scroll_css.py create mode 100644 tests/test_editor_layer_hit_test_js.py create mode 100644 tests/test_editor_look_recipes.py create mode 100644 tests/test_editor_main_menus_js.py create mode 100644 tests/test_editor_mask_ops_js.py create mode 100644 tests/test_editor_menus_file_edit_help_js.py create mode 100644 tests/test_editor_mobile_footer_sheet.py create mode 100644 tests/test_editor_mobile_gestures.py create mode 100644 tests/test_editor_mobile_hscroll.py create mode 100644 tests/test_editor_mobile_layer_opacity_footer.py create mode 100644 tests/test_editor_mobile_layer_rows.py create mode 100644 tests/test_editor_mobile_layers_footer_spread.py create mode 100644 tests/test_editor_mobile_layers_header.py create mode 100644 tests/test_editor_mobile_layers_sheet.py create mode 100644 tests/test_editor_mobile_panels.py create mode 100644 tests/test_editor_mobile_phone_chrome.py create mode 100644 tests/test_editor_mobile_phone_footer_dock.py create mode 100644 tests/test_editor_mobile_qe_chips.py create mode 100644 tests/test_editor_mobile_qe_chrome.py create mode 100644 tests/test_editor_mobile_qe_sheet.py create mode 100644 tests/test_editor_mobile_tool_rail_more.py create mode 100644 tests/test_editor_mobile_touch_targets.py create mode 100644 tests/test_editor_mobile_touch_targets_topbar.py create mode 100644 tests/test_editor_nl_edit_js.py create mode 100644 tests/test_editor_options_bar_js.py create mode 100644 tests/test_editor_p2_ops_static.py create mode 100644 tests/test_editor_panel_rail_collapse.py create mode 100644 tests/test_editor_panel_titles_and_adjustments.py create mode 100644 tests/test_editor_panel_visibility.py create mode 100644 tests/test_editor_patch.py create mode 100644 tests/test_editor_pen_path_js.py create mode 100644 tests/test_editor_perspective_crop.py create mode 100644 tests/test_editor_photoshop_features.py create mode 100644 tests/test_editor_photoshop_features_more.py create mode 100644 tests/test_editor_photoshop_features_more2.py create mode 100644 tests/test_editor_photoshop_features_more3.py create mode 100644 tests/test_editor_photoshop_features_more4.py create mode 100644 tests/test_editor_photoshop_features_more5.py create mode 100644 tests/test_editor_photoshop_features_more6.py create mode 100644 tests/test_editor_photoshop_features_more7.py create mode 100644 tests/test_editor_photoshop_features_more8.py create mode 100644 tests/test_editor_photoshop_features_more9.py create mode 100644 tests/test_editor_photoshop_layout.py create mode 100644 tests/test_editor_preflight.py create mode 100644 tests/test_editor_psd_js.py create mode 100644 tests/test_editor_psd_layered_js.py create mode 100644 tests/test_editor_quick_edit_adjustments.py create mode 100644 tests/test_editor_quick_edit_blur_filters.py create mode 100644 tests/test_editor_quick_edit_border_smooth.py create mode 100644 tests/test_editor_quick_edit_combine_shapes.py create mode 100644 tests/test_editor_quick_edit_crop_selection.py create mode 100644 tests/test_editor_quick_edit_edit_menu.py create mode 100644 tests/test_editor_quick_edit_fill_colors.py create mode 100644 tests/test_editor_quick_edit_fill_fgbg.py create mode 100644 tests/test_editor_quick_edit_filters.py create mode 100644 tests/test_editor_quick_edit_free_transform.py create mode 100644 tests/test_editor_quick_edit_image_mode.py create mode 100644 tests/test_editor_quick_edit_invert.py create mode 100644 tests/test_editor_quick_edit_layer_blend.py create mode 100644 tests/test_editor_quick_edit_layer_mask.py create mode 100644 tests/test_editor_quick_edit_layer_opacity.py create mode 100644 tests/test_editor_quick_edit_layer_styles.py create mode 100644 tests/test_editor_quick_edit_load_selection.py create mode 100644 tests/test_editor_quick_edit_rasterize.py create mode 100644 tests/test_editor_quick_edit_recents.py create mode 100644 tests/test_editor_quick_edit_reselect.py create mode 100644 tests/test_editor_quick_edit_save_selection.py create mode 100644 tests/test_editor_quick_edit_select_all_layers.py create mode 100644 tests/test_editor_quick_edit_selection_modify.py create mode 100644 tests/test_editor_quick_edit_swap_colors.py create mode 100644 tests/test_editor_quick_edit_view_menu.py create mode 100644 tests/test_editor_quick_edit_warp_text.py create mode 100644 tests/test_editor_retouch_js.py create mode 100644 tests/test_editor_rotate_arbitrary.py create mode 100644 tests/test_editor_scroll_affordance.py create mode 100644 tests/test_editor_scroll_fade_contrast.py create mode 100644 tests/test_editor_select_subject.py create mode 100644 tests/test_editor_selection_modify.py create mode 100644 tests/test_editor_selection_tools_js.py create mode 100644 tests/test_editor_shape_boolean_js.py create mode 100644 tests/test_editor_smart_filters.py create mode 100644 tests/test_editor_studio_panels_js.py create mode 100644 tests/test_editor_swatches_hex.py create mode 100644 tests/test_editor_swatches_picker.py create mode 100644 tests/test_editor_text_fonts.py create mode 100644 tests/test_editor_text_on_path.py create mode 100644 tests/test_editor_text_on_path_curve.py create mode 100644 tests/test_editor_text_opentype_js.py create mode 100644 tests/test_editor_text_options_layout.py create mode 100644 tests/test_editor_text_vertical_warp_js.py create mode 100644 tests/test_editor_theme_tokens.py create mode 100644 tests/test_editor_theme_tokens_checklist.py create mode 100644 tests/test_editor_theme_tokens_more.py create mode 100644 tests/test_editor_tool_flyout_position.py create mode 100644 tests/test_editor_tool_rail_ellipsis.py create mode 100644 tests/test_editor_transform_perspective_js.py create mode 100644 tests/test_editor_transform_skew_js.py create mode 100644 tests/test_editor_window_menu_checkmarks.py create mode 100644 tests/test_editor_window_workspace_submenu.py create mode 100644 tests/test_editor_workspaces_js.py diff --git a/static/css/13-image-editor.css b/static/css/13-image-editor.css index 257e2805e..fcde25e05 100644 --- a/static/css/13-image-editor.css +++ b/static/css/13-image-editor.css @@ -103,6 +103,407 @@ margin: 0 4px; } +/* Contextual tool options bar (between topbar and editor body) */ +.ge-options-bar { + display: flex; + align-items: center; + gap: 10px; + flex: 0 0 auto; + flex-wrap: nowrap; + row-gap: 4px; + min-height: 40px; + padding: 4px 10px; + box-sizing: border-box; + border-bottom: 1px solid var(--border); + background: color-mix(in srgb, var(--panel) 92%, var(--fg) 8%); + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: thin; +} +.ge-options-tool { + display: flex; + align-items: center; + gap: 6px; + flex: 0 0 auto; + font-size: 11px; + font-weight: 600; + color: color-mix(in srgb, var(--fg) 85%, transparent); +} +.ge-options-tool-icon { + display: inline-flex; + width: 18px; + height: 18px; + align-items: center; + justify-content: center; +} +.ge-options-sep { + width: 1px; + height: 20px; + background: var(--border); + flex: 0 0 auto; +} +.ge-options-body { + display: flex; + align-items: center; + gap: 14px; + flex: 1 1 auto; + min-width: 0; +} +/* Tool options moved out of the dock into the options bar (Photoshop): + the real controls flow inline on the SAME single thin row, horizontally + scrollable when they do not fit. Section headings/hints are dropped in + this compact strip; the authoritative sliders mirror the contextual + strip, so duplicated ranges are hidden. */ +.ge-options-bar .ge-controls.ge-controls--in-options { + flex: 0 1 auto; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + gap: 14px; + padding: 0; + margin: 0; + border: 0; + min-width: 0; + max-height: none; + overflow: visible; +} +.ge-controls--in-options .ge-section-title, +.ge-controls--in-options .ge-section-hint { display: none; } +.ge-controls--in-options > section, +.ge-controls--in-options > div { flex: 0 0 auto; } +/* Lay out every visible tool section as one horizontal strip. Hidden + sections carry an inline display:none and are left untouched; visible + ones must override their inline display:block, hence !important. */ +.ge-controls--in-options > div:not([style*="display:none"]):not([style*="display: none"]) { + display: flex !important; + flex-direction: row !important; + flex-wrap: nowrap !important; + align-items: center; + gap: 12px; +} +.ge-controls--in-options .ge-control-row { + margin: 0; + flex: 0 0 auto; + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; +} +.ge-controls--in-options .ge-control-row label { white-space: nowrap; } +/* The Text section is authored as a vertical panel. When it is relocated into + the options bar its grids collapse to zero width, so the Font picker shrinks + to ~14px and the Font/Size labels pile into "FoSize". Lay the text strip out + as fixed-width field groups so the font picker keeps its room. */ +.ge-controls--in-options .ge-text-section .ge-text-grid { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: flex-end; + gap: 8px; + flex: 0 0 auto; +} +.ge-controls--in-options .ge-text-section .ge-text-field { + flex: 0 0 auto; + min-width: 56px; + align-items: stretch; +} +.ge-controls--in-options .ge-text-section .ge-text-field > span { white-space: nowrap; } +.ge-controls--in-options .ge-text-section .ge-text-font-field { min-width: 116px; } +.ge-controls--in-options .ge-text-section .ge-text-size-field { min-width: 56px; } +.ge-controls--in-options .ge-text-section .ge-text-field > select, +.ge-controls--in-options .ge-text-section .ge-text-field > input { width: 100%; } +.ge-controls--in-options .ge-text-section textarea { + flex: 0 0 auto; + width: 200px; + min-height: 0; + height: 40px; + resize: none; +} +.ge-options-bar:has(.ge-controls--in-options) .ge-options-body .ge-opt[data-opt="range"] { display: none; } +/* Secondary brush rows (pen-pressure toggles + preset Save/delete) do not + fit the thin strip; hide them behind the "..." overflow button. */ +.ge-controls--in-options .ge-brush-pressure-row, +.ge-controls--in-options .ge-brush-preset-row { display: none !important; } +.ge-options-bar.ge-more-open { flex-wrap: wrap; } +.ge-options-bar.ge-more-open .ge-controls--in-options .ge-brush-pressure-row, +.ge-options-bar.ge-more-open .ge-controls--in-options .ge-brush-preset-row { + display: flex !important; + flex-direction: row !important; + flex-wrap: nowrap !important; + align-items: center; + gap: 10px; +} +/* The brush-preset picker stays visible inline whenever a painting tool is + active, so switching brushes does not require discovering the "..." menu. */ +.ge-controls--in-options .ge-has-brush-presets .ge-brush-preset-row { + display: flex !important; + flex-direction: row !important; + flex-wrap: nowrap !important; + align-items: center; + gap: 8px; +} +.ge-options-more { + flex: 0 0 auto; + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + padding: 0; + color: color-mix(in srgb, var(--fg) 65%, transparent); + background: transparent; + border: 1px solid var(--border); + border-radius: 5px; + cursor: pointer; +} +.ge-options-more:hover { color: var(--fg); border-color: color-mix(in srgb, var(--fg) 35%, transparent); } +.ge-options-more[hidden] { display: none; } +.ge-opt { + display: flex; + align-items: center; + gap: 6px; + flex: 0 0 auto; +} +.ge-opt-label { + display: flex; + align-items: center; + gap: 4px; + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.04em; + color: color-mix(in srgb, var(--fg) 55%, transparent); + white-space: nowrap; +} +.ge-opt-value { + color: color-mix(in srgb, var(--fg) 80%, transparent); + font-variant-numeric: tabular-nums; +} +.ge-opt[data-opt="range"] input[type="range"] { width: 110px; } +/* Checkbox options (e.g. Move tool Auto-Select) — restyle the native + control so it matches the dark editor chrome instead of rendering as + a light OS checkbox. */ +.ge-opt.ge-auto-select-option { gap: 6px; cursor: pointer; } +.ge-opt input[type="checkbox"] { + appearance: none; + -webkit-appearance: none; + width: 14px; + height: 14px; + margin: 0; + flex: 0 0 auto; + box-sizing: border-box; + border: 1px solid var(--border); + border-radius: 3px; + background: var(--bg); + color: var(--fg); + cursor: pointer; + position: relative; +} +.ge-opt input[type="checkbox"]:checked { + background: var(--accent, #4c8bf5); + border-color: var(--accent, #4c8bf5); +} +.ge-opt input[type="checkbox"]:checked::after { + content: ''; + position: absolute; + left: 4px; + top: 1px; + width: 4px; + height: 8px; + border: solid #fff; + border-width: 0 2px 2px 0; + transform: rotate(45deg); +} +.ge-opt input[type="checkbox"]:focus-visible { + outline: 2px solid var(--accent, #4c8bf5); + outline-offset: 1px; +} +/* Dropdown options in the options bar (e.g. Auto-Select Target). */ +.ge-opt[data-opt="select"] select { + height: 24px; + padding: 0 6px; + border: 1px solid var(--border); + border-radius: 5px; + background: var(--bg); + color: var(--fg); + font: inherit; + font-size: 11px; + cursor: pointer; +} +.ge-opt[data-opt="select"] select:focus-visible { + outline: 2px solid var(--accent, #4c8bf5); + outline-offset: 1px; +} +.ge-opt-modes { display: inline-flex; gap: 2px; } +.ge-opt-mode { + min-width: 26px; + height: 24px; + padding: 0 6px; + font-size: 11px; + border: 1px solid var(--border); + background: transparent; + color: var(--fg); + border-radius: 5px; + cursor: pointer; +} +.ge-opt-mode.active { + background: var(--accent, #4c8bf5); + border-color: transparent; + color: #fff; +} +.ge-opt-empty { font-size: 11px; opacity: 0.5; } +.ge-options-empty .ge-options-sep { display: none; } +@media (max-width: 820px) { + .ge-options-bar { display: none; } +} + +/* Document tab strip (Photoshop-style) — names the open document and + offers a close affordance. Sits between the options bar and the body. */ +.ge-doc-tabs { + display: flex; + align-items: center; + gap: 2px; + flex: 0 0 auto; + min-height: 30px; + padding: 4px 8px 0; + box-sizing: border-box; + background: var(--panel); + border-bottom: 1px solid var(--border); + overflow: hidden; +} +.ge-doc-tabs::-webkit-scrollbar { display: none; } +.ge-doc-tab { + display: inline-flex; + align-items: center; + gap: 6px; + flex: 0 0 auto; + max-width: 240px; + padding: 5px 6px 5px 12px; + font-size: 11px; + color: color-mix(in srgb, var(--fg) 70%, transparent); + background: color-mix(in srgb, var(--panel) 82%, var(--fg) 6%); + border: 1px solid var(--border); + border-bottom: none; + border-radius: 6px 6px 0 0; +} +.ge-doc-tab.is-active { + background: var(--bg); + color: var(--fg); + border-bottom: 1px solid var(--bg); + margin-bottom: -1px; +} +.ge-doc-tab-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 190px; +} +.ge-doc-tab-close { + display: inline-flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + padding: 0; + border: none; + border-radius: 4px; + background: transparent; + color: inherit; + font-size: 13px; + line-height: 1; + cursor: pointer; + opacity: 0.6; +} +.ge-doc-tab-close:hover { + opacity: 1; + background: color-mix(in srgb, var(--fg) 14%, transparent); +} +/* Title-bar actions: Import + Save and the window controls (_ □ ×). */ +.ge-doc-tabs-actions { + display: flex; + align-items: center; + gap: 6px; + flex: 0 0 auto; + margin-left: auto; +} +/* Import/Save in the title bar render as ONE compact row (glyph + label), + matching the File/Edit/… topbar button height — not the 2-line stack. */ +.ge-doc-tabs-actions .ge-stacked-btn { + flex-direction: row; + height: 26px; + gap: 4px; + padding: 0 9px !important; +} +.ge-doc-tabs-actions .ge-stacked-btn .ge-stacked-glyph { display: inline-flex; } +.ge-doc-tabs-actions .ge-stacked-btn .ge-stacked-label { top: 0; font-size: 10px; opacity: 0.8; } +/* Save shows a SINGLE label (the live "Saved"/"Unsaved" status), not "SAVE Saved". */ +.ge-doc-tabs-actions #ge-save-menu-btn { flex-wrap: nowrap !important; column-gap: 5px; } +.ge-doc-tabs-actions #ge-save-menu-btn .ge-stacked-glyph { flex: 0 0 auto; } +.ge-doc-tabs-actions #ge-save-menu-btn .ge-save-action-label { display: none !important; } +/* Import + Save now live in the topbar row (their old title bar is gone): + one compact row each, matching the File/Edit/… button height. */ +.ge-topbar-right .ge-stacked-btn { + flex-direction: row; + height: 26px; + gap: 4px; + padding: 0 9px !important; +} +.ge-topbar-right .ge-stacked-btn .ge-stacked-glyph { display: inline-flex; } +.ge-topbar-right .ge-stacked-btn .ge-stacked-label { top: 0; font-size: 10px; opacity: 0.85; } +.ge-topbar-right #ge-save-menu-btn { flex-wrap: nowrap !important; column-gap: 5px; } +.ge-topbar-right #ge-save-menu-btn .ge-stacked-glyph { flex: 0 0 auto; } +.ge-topbar-right #ge-save-menu-btn .ge-save-action-label { display: none !important; } +.ge-win-controls { + display: flex; + align-items: center; + gap: 1px; + margin-left: 4px; +} +.ge-win-btn.ge-btn, +.ge-win-controls #ge-maximize-toggle { + width: 24px; + height: 22px; + padding: 0; + border: none; + border-radius: 4px; + background: transparent; + box-shadow: none; +} +.ge-win-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 22px; + padding: 0; + border: none; + border-radius: 4px; + background: transparent; + color: var(--fg); + font-size: 14px; + line-height: 1; + cursor: pointer; + opacity: 0.75; +} +.ge-win-btn:hover, +.ge-win-controls #ge-maximize-toggle:hover { + opacity: 1; + background: color-mix(in srgb, var(--fg) 14%, transparent); +} +.ge-win-close:hover { + background: #e5484d; + color: #fff; +} +.ge-win-controls #ge-maximize-toggle svg { top: 0 !important; } +/* The editor maximize now lives in the gallery modal header, beside the + window's minimize/close buttons (it adopts .modal-minimize-btn so it matches + them exactly). Keep its icon optically centred rather than the minimize + glyph's 2px drop. */ +#gallery-modal .modal-header .ge-header-max-btn svg { top: 0 !important; transform: none; } +@media (max-width: 820px) { + .ge-doc-tabs { min-height: 26px; padding: 3px 6px 0; } + .ge-doc-tab-label { max-width: 140px; } +} + /* Editor body (toolbar + canvas + panel) */ .ge-editor-body { display: flex; @@ -114,7 +515,7 @@ .ge-editor-footer { display: flex; align-items: center; - justify-content: space-between; + justify-content: flex-start; gap: 10px; min-height: 34px; padding: 3px 10px; @@ -125,9 +526,40 @@ } .ge-editor-footer .ge-canvas-size { min-width: 0; + padding-left: 10px; font-size: 11px; + white-space: nowrap; + font-variant-numeric: tabular-nums; color: color-mix(in srgb, var(--fg) 65%, transparent); } +.ge-status-tool { + min-width: 0; + padding-left: 10px; + border-left: 1px solid var(--border); + font-size: 11px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: color-mix(in srgb, var(--fg) 55%, transparent); +} +.ge-status-model { + min-width: 0; + max-width: 280px; + padding-left: 10px; + border-left: 1px solid var(--border); + font-size: 11px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: color-mix(in srgb, var(--fg) 55%, transparent); +} +.ge-footer-history { + display: flex; + align-items: center; + gap: 4px; + margin-right: 8px; +} +.ge-footer-history > .ge-btn { min-width: 28px; min-height: 26px; } .ge-footer-zoom { display: flex; align-items: center; @@ -163,10 +595,10 @@ /* Asymmetric horizontal padding shifts the whole column 4 px left — buttons, hover backgrounds, active highlight pills, and section separators all move together. */ - padding: 8px 8px 8px 0; + padding: 6px 6px 6px 0; background: var(--panel); border-right: 1px solid var(--border); - width: 64px; + width: 50px; flex-shrink: 0; min-height: 0; overflow-x: hidden; @@ -186,6 +618,87 @@ opacity: 0.6; flex-shrink: 0; } +/* Foreground / background color swatches pinned to the bottom of the + tool rail (Photoshop-style), with a swap button. */ +.ge-tool-swatches { + position: sticky; + bottom: 0; + margin-top: auto; + padding: 10px 0 8px; + display: flex; + flex-direction: column; + align-items: center; + gap: 2px; + background: var(--panel); +} +.ge-swatch { + display: block; + width: 26px; + height: 26px; + border: 1px solid var(--border); + border-radius: 999px; + overflow: hidden; + cursor: pointer; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5); + background: #fff; +} +.ge-swatch input[type="color"] { + -webkit-appearance: none; + appearance: none; + width: 100%; + height: 100%; + padding: 0; + border: 0; + background: none; + cursor: pointer; +} +/* After attachColorPicker swaps the rail swatch to type=text + .cp-swatch-input, + show just the colour (hide the hex text) and keep it round. */ +.ge-swatch input.cp-swatch-input { + width: 100%; + height: 100%; + padding: 0; + border: 0; + border-radius: 999px; + color: transparent; + caret-color: transparent; + text-shadow: none; + font-size: 0; + outline: none; + cursor: pointer; + background: var(--panel); +} +.ge-swatch input.cp-swatch-input::selection { background: transparent; } +.ge-swatch input[type="color"]::-webkit-color-swatch-wrapper { padding: 0; } +.ge-swatch input[type="color"]::-webkit-color-swatch { border: 0; border-radius: 3px; } +.ge-swatch-fg { + z-index: 2; + margin-left: 8px; + margin-top: -10px; +} +.ge-swatch-bg { margin-right: 8px; } +.ge-swatch-swap { + width: 18px; + height: 15px; + margin-top: 2px; + padding: 0; + display: inline-flex; + align-items: center; + justify-content: center; + color: color-mix(in srgb, var(--fg) 55%, transparent); + background: transparent; + border: 0; + cursor: pointer; +} +.ge-swatch-swap:hover { color: var(--fg); } +/* The left-rail fg/bg swatches are ROUND (Photoshop-style). Overrides the + generic `.ge-swatch-grid .ge-swatch` sizing rule further down the sheet. */ +.ge-tool-swatches .ge-swatch { + width: 26px; + height: 26px; + aspect-ratio: auto; + border-radius: 999px; +} /* All tool buttons share a fixed height so the column reads as a clean grid. Long labels (e.g. "Remove BG") truncate with ellipsis instead of wrapping to two lines and making one button taller than the others. */ @@ -194,9 +707,9 @@ flex-direction: column; align-items: center; justify-content: center; - gap: 2px; + gap: 1px; padding: 0 2px; - height: 42px; + height: 34px; flex-shrink: 0; border: none; background: none; @@ -224,8 +737,26 @@ shifted an additional 2 px left so the icon + label sit further inside the highlight pill (which still anchors to the button bounds). */ .ge-tool-btn > * { position: relative; z-index: 1; left: -2px; } -.ge-tool-icon { font-size: 18px; line-height: 1; } -.ge-tool-label { font-size: 10px; line-height: 1.25; } +.ge-tool-icon { font-size: 15px; line-height: 1; } +.ge-tool-icon svg { width: 15px; height: 15px; } +.ge-tool-label { font-size: 9px; line-height: 1.2; } +/* Corner triangle on tool slots that hide a family of tools (Photoshop + mark). Clicking it opens the flyout; the face itself still selects. */ +.ge-tool-flyout-tri { + position: absolute !important; + right: 3px !important; + bottom: 3px !important; + left: auto !important; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-bottom: 5px solid currentColor; + opacity: 0.5; + z-index: 3; + cursor: pointer; +} +.ge-tool-flyout-tri:hover { opacity: 0.9; } +.ge-tool-flyout-label { font-size: 12px; white-space: nowrap; } /* AI badge — same ✦ glyph the Enhance tool uses, pinned to the top- left of any tool button marked `ai: true`. Same color as the icon itself (inherits foreground) so it reads as part of the tool, not @@ -286,6 +817,79 @@ 0 2px 6px color-mix(in srgb, var(--red) 60%, transparent); } +/* Flyout slots — related tools collapse behind a single face button; the + caret (or right-click / long-press) opens the family. The flyout is + detached from the toolbar's scroll clip via position:fixed, with coords + set in toolbar.js on open. */ +.ge-tool-slot { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + flex-shrink: 0; +} +.ge-tool-slot > .ge-tool-btn { width: 100%; } +.ge-tool-caret { + position: absolute; + right: 3px; + bottom: 3px; + width: 12px; + height: 12px; + padding: 0; + display: none; + align-items: center; + justify-content: center; + border: none; + border-radius: 3px; + background: color-mix(in srgb, var(--fg) 14%, transparent); + color: var(--fg); + opacity: 0.7; + cursor: pointer; + z-index: 2; +} +.ge-tool-slot:hover > .ge-tool-caret, +.ge-tool-slot.open > .ge-tool-caret { display: inline-flex; } +.ge-tool-caret:hover { opacity: 1; } +.ge-tool-flyout { + position: fixed; + display: none; + flex-direction: column; + gap: 1px; + padding: 4px; + min-width: 132px; + background: var(--panel); + border: 1px solid var(--border); + border-radius: 8px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); + z-index: 200; +} +.ge-tool-slot.open > .ge-tool-flyout { display: flex; } +.ge-tool-flyout .ge-tool-btn { + flex-direction: row; + justify-content: flex-start; + gap: 8px; + height: 34px; + width: 100%; + padding: 0 8px; + opacity: 0.85; + border-radius: 5px; +} +.ge-tool-flyout .ge-tool-btn:hover { opacity: 1; background: color-mix(in srgb, var(--fg) 8%, transparent); } +.ge-tool-flyout .ge-tool-btn.active { opacity: 1; } +.ge-tool-flyout .ge-tool-label { font-size: 12px; white-space: nowrap; } +.ge-tool-flyout .ge-tool-ai { position: static !important; left: auto !important; } +.ge-tool-flyout .ge-tool-btn .ge-tool-clear { display: none !important; } +.ge-tool-flyout-sep { height: 1px; margin: 3px 2px; background: var(--border); opacity: 0.7; } +.ge-tool-flyout-heading { + font-size: 9px; + text-transform: uppercase; + letter-spacing: 0.06em; + opacity: 0.55; + padding: 2px 8px 1px; +} +.ge-tool-flyout-preset { opacity: 0.78; } +.ge-tool-flyout-preset .ge-tool-flyout-label { font-size: 11px; } + /* Aspect-ratio placeholder shown while a draft is loading. */ .ge-canvas-placeholder { background: color-mix(in srgb, var(--fg) 8%, transparent); @@ -359,7 +963,7 @@ .ge-ai-command { position: absolute; left: 50%; - bottom: 14px; + bottom: calc(14px + var(--ge-ai-lift, 0px)); z-index: 18; width: min(430px, calc(100% - 28px)); transform: translateX(-50%); @@ -372,6 +976,12 @@ backdrop-filter: blur(8px); transition: bottom 0.16s ease, opacity 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease; } +/* While the floating Transform box is open it owns the canvas area. The + bottom-docked Quick Edit bar would otherwise sit over the bottom-centre + transform handle and intercept the touch aimed at it. */ +#gallery-editor-container:has(.ge-transform-popup) .ge-ai-command { + display: none; +} .ge-ai-command-toggle { width: 100%; height: 28px; @@ -404,15 +1014,6 @@ font-size: 11px; font-weight: 650; } -.ge-ai-command-scope { - margin-left: 7px; - padding-left: 7px; - border-left: 1px solid var(--border); - color: var(--fg-muted); - font-size: 9px; - line-height: 1; - text-transform: uppercase; -} .ge-ai-command-collapsed { bottom: -16px; width: auto; @@ -430,6 +1031,104 @@ border-color: color-mix(in srgb, var(--accent, var(--red)) 42%, var(--border)); box-shadow: 0 8px 22px color-mix(in srgb, #000 24%, transparent); } +.ge-ai-command-model { + flex: 1 1 auto; + min-width: 0; + height: 26px; + box-sizing: border-box; + padding: 0 6px; + border: 1px solid var(--border); + border-radius: 7px; + background: color-mix(in srgb, var(--bg) 76%, #000 24%); + color: var(--fg); + font: inherit; + font-size: 11px; +} +.ge-ai-command-model:focus { + outline: none; + border-color: var(--accent, var(--red)); +} +/* AI settings dialog (image-edit + agent model pickers, double-check toggle) */ +.ge-ai-settings { + position: absolute; + inset: 0; + z-index: 261; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(2px); +} +.ge-ai-settings[hidden] { display: none; } +.ge-ai-settings-card { + width: min(420px, 100%); + max-height: 100%; + overflow: auto; + display: flex; + flex-direction: column; + gap: 12px; + padding: 18px; + border: 1px solid var(--border); + border-radius: 12px; + background: var(--panel, #232323); + color: var(--fg); + box-shadow: 0 18px 50px rgba(0, 0, 0, 0.5); +} +.ge-ai-settings-head { + display: flex; + align-items: center; + justify-content: space-between; +} +.ge-ai-settings-head h3 { margin: 0; font-size: 15px; } +.ge-ai-settings-close { + width: 26px; + height: 26px; + border: none; + border-radius: 7px; + background: transparent; + color: var(--fg-muted); + cursor: pointer; + font-size: 16px; + line-height: 1; +} +.ge-ai-settings-close:hover { background: rgba(255, 255, 255, 0.1); color: var(--fg); } +.ge-ai-settings-body { display: flex; flex-direction: column; gap: 6px; } +.ge-ai-settings-label { + margin-top: 4px; + color: var(--fg-muted); + font-size: 10px; + letter-spacing: 0.04em; + text-transform: uppercase; +} +.ge-ai-settings-body .ge-ai-command-model { flex: 0 0 auto; width: 100%; height: 30px; } +.ge-ai-settings-note { margin: 2px 0 0; color: var(--fg-muted); font-size: 11px; line-height: 1.4; } +.ge-ai-settings-opt { + display: flex; + align-items: center; + gap: 6px; + margin-top: 6px; + color: var(--fg-muted); + font-size: 12px; + cursor: pointer; + user-select: none; +} +.ge-ai-settings-opt input { margin: 0; accent-color: var(--accent, var(--red)); } +.ge-ai-settings-strength { display: flex; align-items: center; gap: 8px; } +.ge-ai-settings-strength input[type="range"] { flex: 1 1 auto; min-width: 0; accent-color: var(--accent, var(--red)); } +.ge-ai-settings-strength-val { flex: 0 0 auto; min-width: 30px; text-align: right; font-size: 11px; color: var(--fg-muted); } +.ge-ai-settings-foot { display: flex; justify-content: flex-end; } +.ge-ai-settings-done { + height: 30px; + padding: 0 14px; + border: none; + border-radius: 8px; + background: var(--accent, var(--red)); + color: #fff; + font: inherit; + font-size: 12px; + cursor: pointer; +} .ge-ai-command-form { display: flex; align-items: center; @@ -517,7 +1216,6 @@ opacity: 0.52; cursor: pointer; padding: 0; - margin-left: auto; } .ge-ai-command-close:hover { opacity: 0.9; @@ -543,7 +1241,7 @@ .ge-ai-command-suggestion { width: 100%; display: grid; - grid-template-columns: 38px minmax(82px, auto) minmax(0, 1fr); + grid-template-columns: 22px 38px minmax(82px, auto) minmax(0, 1fr); align-items: center; gap: 8px; min-height: 28px; @@ -560,6 +1258,23 @@ .ge-ai-command-suggestion.active { background: color-mix(in srgb, var(--accent, var(--red)) 16%, transparent); } +.ge-ai-command-suggestion-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + color: var(--fg-muted); +} +.ge-ai-command-suggestion-icon svg { + width: 15px; + height: 15px; + display: block; +} +.ge-ai-command-suggestion.active .ge-ai-command-suggestion-icon, +.ge-ai-command-suggestion:hover .ge-ai-command-suggestion-icon { + color: var(--fg); +} .ge-ai-command-suggestion-kind { min-width: 0; overflow: hidden; @@ -600,6 +1315,134 @@ .ge-ai-command-status[data-kind="error"] { color: var(--red, #e5484d); } +.ge-ai-command-progress { + position: relative; + height: 14px; + margin-top: 5px; + border-radius: 7px; + background: color-mix(in srgb, var(--accent, var(--red)) 14%, transparent); + overflow: hidden; +} +.ge-ai-command-progress[hidden] { display: none; } +.ge-ai-command-progress-fill { + position: absolute; + inset: 0 auto 0 0; + width: 0%; + border-radius: 7px; + background: linear-gradient(90deg, var(--accent, var(--red)), color-mix(in srgb, var(--accent, var(--red)) 55%, #fff)); + transition: width 0.4s ease; +} +.ge-ai-command-progress-label { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + font-size: 9px; + font-weight: 600; + letter-spacing: 0.2px; + color: #fff; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45); + pointer-events: none; +} +/* Stacked Quick Edit jobs — transient jelly-style notifications: each prompt + shows a row while queued/running, fades out when finished, and multiple rows + stack under each other. No persistent history to dismiss. */ +.ge-ai-command-stack { + display: flex; + flex-direction: column; + gap: 4px; + margin-top: 6px; + max-height: 168px; + overflow-y: auto; +} +.ge-ai-job { + display: flex; + align-items: center; + gap: 6px; + padding: 5px 6px; + border-radius: 7px; + border: 1px solid color-mix(in srgb, var(--fg) 10%, transparent); + background: color-mix(in srgb, var(--fg) 4%, transparent); + font-size: 10px; + line-height: 1.25; + animation: ge-ai-job-in 0.2s ease-out; +} +.ge-ai-job-leaving { + opacity: 0; + transform: translateY(-4px); + transition: opacity 0.32s ease, transform 0.32s ease; +} +@keyframes ge-ai-job-in { + from { opacity: 0; transform: translateY(4px); } + to { opacity: 1; transform: translateY(0); } +} +.ge-ai-job-icon { + flex: 0 0 auto; + display: inline-flex; + align-items: center; + justify-content: center; + width: 13px; + color: var(--fg-muted); +} +.ge-ai-job-body { + flex: 1 1 auto; + min-width: 0; + display: flex; + flex-direction: column; + gap: 1px; +} +.ge-ai-job-prompt { + color: var(--fg); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.ge-ai-job-detail { + color: var(--fg-muted); + font-size: 9px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.ge-ai-job-detail[hidden] { display: none; } +.ge-ai-job-cancel { + flex: 0 0 auto; + padding: 2px 6px; + border-radius: 5px; + border: 1px solid color-mix(in srgb, var(--red, #e5484d) 40%, transparent); + background: transparent; + color: var(--red, #e5484d); + font-size: 9px; + line-height: 1.4; + cursor: pointer; +} +.ge-ai-job-cancel:hover { + background: color-mix(in srgb, var(--red, #e5484d) 16%, transparent); +} +.ge-ai-job-cancel[hidden] { display: none; } +.ge-ai-job-running { border-color: color-mix(in srgb, var(--accent, var(--red)) 45%, transparent); } +.ge-ai-job-running .ge-ai-job-detail { color: var(--accent, var(--red)); } +.ge-ai-job-running .ge-ai-job-icon { color: var(--accent, var(--red)); } +.ge-ai-job-done .ge-ai-job-icon { color: var(--green, #4caf50); } +.ge-ai-job-error .ge-ai-job-icon { color: var(--red, #e5484d); } +.ge-ai-job-error .ge-ai-job-detail { color: var(--red, #e5484d); } +.ge-ai-job-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: currentColor; +} +/* The running row uses the app's whirlpool spinner (canvas), not a CSS ring. */ +.ge-ai-job-icon .ai-spinner-whirlpool { display: inline-flex; } +/* "fx" glyph for the new-adjustment-layer button next to the "+" new-layer button. */ +.ge-add-fx-glyph { + font-size: 10px; + font-style: italic; + font-weight: 700; + letter-spacing: -0.4px; + line-height: 1; +} /* Loading overlay shown while a large image is decoding — centered whirlpool + "Loading" caption over a translucent dim. */ .ge-loading-overlay { @@ -694,6 +1537,66 @@ box-shadow: 0 2px 12px rgba(0,0,0,0.3); background: repeating-conic-gradient(#808080 0% 25%, #a0a0a0 0% 50%) 50% / 16px 16px; } +/* AI-working indicator: while a Quick Edit / inpaint request is in flight a + fireflies glow drifts over only the region being edited (the selection + bounds, or the whole canvas when nothing is selected) — the same drifting, + pulsing look as the "yoyo" theme's ascii-fireflies background, scoped so it + never covers the workspace around the image. */ +.ge-canvas-area.ge-canvas-ai-busy::after { + content: ""; + position: absolute; + left: var(--ge-ai-busy-x, 0px); + top: var(--ge-ai-busy-y, 0px); + width: var(--ge-ai-busy-w, 100%); + height: var(--ge-ai-busy-h, 100%); + border-radius: 3px; + z-index: 11; + pointer-events: none; + /* slight dark scrim under the ASCII skeleton so the glyphs read clearly */ + background: rgba(6, 14, 9, 0.38); +} +.ge-canvas-area .ge-ai-ascii-fireflies { + position: absolute; + left: var(--ge-ai-busy-x, 0px); + top: var(--ge-ai-busy-y, 0px); + width: var(--ge-ai-busy-w, 100%); + height: var(--ge-ai-busy-h, 100%); + margin: 0; + padding: 0; + overflow: hidden; + border-radius: 3px; + z-index: 12; + pointer-events: none; + white-space: pre; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + font-size: 11px; + line-height: 1; + letter-spacing: 0; + color: #b8e6c1; + text-shadow: 0 0 6px rgba(120, 220, 150, 0.55); + background: transparent !important; + opacity: 0; + transition: opacity 0.25s ease; +} +.ge-canvas-area.ge-canvas-ai-busy .ge-ai-ascii-fireflies { opacity: 1; } +.ge-canvas-area .ge-ai-ascii-fireflies::after { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + background: linear-gradient(100deg, transparent 35%, rgba(184, 230, 193, 0.20) 50%, transparent 65%); + background-size: 220% 100%; + background-repeat: no-repeat; + animation: ge-ai-canvas-sheen 2.2s linear infinite; + mix-blend-mode: screen; +} +@media (prefers-reduced-motion: reduce) { + .ge-canvas-area .ge-ai-ascii-fireflies { display: none; } +} +@keyframes ge-ai-canvas-sheen { + 0% { background-position: 130% 0; } + 100% { background-position: -30% 0; } +} /* Transform-overlay canvas — sits over the main canvas with extra margin so resize / rotation handles can render OUTSIDE the image @@ -789,7 +1692,7 @@ /* Right panel */ .ge-right-panel { - width: 250px; + width: 340px; flex-shrink: 0; display: flex; flex-direction: column; @@ -866,8 +1769,25 @@ #ge-brush-controls { display: flex; flex-direction: column; - gap: 9px; + gap: 2px; } +/* The dropdown shells set `display:flex` above, which otherwise beats the + UA `[hidden]{display:none}` rule and leaves every menu open on load. */ +.ge-file-menu[hidden], +.ge-edit-menu[hidden], +.ge-layer-menu[hidden], +.ge-type-menu[hidden], +.ge-window-menu[hidden], +.ge-help-menu[hidden], +.ge-resize-menu[hidden], +.ge-edge-menu[hidden], +.ge-view-menu[hidden], +.ge-image-menu[hidden], +.ge-selection-menu[hidden], +.ge-filter-menu[hidden], +.ge-3d-menu[hidden], +.ge-plugins-menu[hidden], +.ge-save-menu[hidden] { display: none; } .ge-brush-pressure-row { justify-content: space-between; gap: 6px; } .ge-pressure-option { display: inline-flex; align-items: center; gap: 4px; font-size: 10px; opacity: 0.7; } .ge-pressure-option .toggle-switch { width: 24px; height: 14px; } @@ -955,6 +1875,10 @@ background: color-mix(in srgb, var(--red) 12%, transparent); } .ge-text-format-sep { width: 1px; height: 20px; background: var(--border); margin: 0 2px; } +.ge-text-opentype-row { grid-template-columns: repeat(3, minmax(0, 1fr)); } +.ge-text-inline-check { flex-direction: row; align-items: center; gap: 4px; } +.ge-text-inline-check > span { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.ge-text-inline-check input[type="checkbox"] { flex: 0 0 auto; width: auto; height: auto; min-width: 0; margin: 0; } .ge-shape-types { display: flex; gap: 4px; } .ge-shape-sides-field { max-width: 90px; } .ge-direct-text-editor { @@ -985,6 +1909,11 @@ flex-direction: column; gap: 4px; padding: 0 0 8px; + /* Never let the single-row popup grow wider than the editor: its + min-content width otherwise pushes it left across the tool column. + Capping + wrapping keeps the tool buttons clickable. */ + max-width: calc(100% - 90px); + min-width: 0; background: color-mix(in srgb, var(--panel) 98%, var(--bg)); border: 1px solid color-mix(in srgb, var(--accent, var(--red)) 42%, var(--border)); border-radius: 8px; @@ -1038,8 +1967,11 @@ .ge-transform-popup-body { display: flex; align-items: center; + flex-wrap: wrap; + row-gap: 6px; gap: 6px; padding: 4px 12px; + min-width: 0; } .ge-transform-popup-hint { padding: 0 12px; } .ge-transform-field { @@ -1975,6 +2907,57 @@ .ge-history-row-label { flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .ge-history-row-time { font-size: 9px; opacity: 0.55; flex-shrink: 0; } +/* Named snapshots (Photoshop-style restore points) — camera button + rows. */ +.ge-history-snapshots { border-bottom: 1px solid color-mix(in srgb, var(--fg) 10%, transparent); } +.ge-history-snap-head { + display: flex; align-items: center; gap: 6px; + padding: 7px 10px 4px; +} +.ge-history-snap-title { + flex: 1 1 auto; + font-weight: 600; font-size: 10px; letter-spacing: 0.04em; + text-transform: uppercase; opacity: 0.7; +} +.ge-history-snap-new { + display: inline-flex; align-items: center; justify-content: center; + width: 22px; height: 22px; + background: none; border: 1px solid color-mix(in srgb, var(--fg) 18%, transparent); + border-radius: 5px; color: var(--fg-muted); cursor: pointer; flex-shrink: 0; +} +.ge-history-snap-new:hover { color: var(--fg); border-color: color-mix(in srgb, var(--fg) 35%, transparent); } +.ge-history-snap-new svg { width: 13px; height: 13px; display: block; flex: 0 0 auto; } +.ge-history-snap-rows { padding: 0 0 4px; } +.ge-history-snap-empty { padding: 2px 10px 6px; font-size: 10px; opacity: 0.45; } +.ge-history-snap-row { + display: flex; align-items: center; gap: 6px; + padding: 0 6px 0 0; +} +.ge-history-snap-restore { + display: flex; align-items: center; gap: 8px; + flex: 1 1 auto; min-width: 0; + padding: 5px 4px 5px 10px; + background: none; border: none; text-align: left; cursor: pointer; + color: var(--fg); font-size: 11px; +} +.ge-history-snap-restore:hover { background: color-mix(in srgb, var(--fg) 8%, transparent); } +.ge-history-snap-dot { + width: 6px; height: 6px; border-radius: 50%; + background: var(--accent, var(--red)); flex-shrink: 0; +} +.ge-history-snap-del { + background: none; border: none; color: var(--fg-muted); + font-size: 14px; line-height: 1; cursor: pointer; padding: 0 4px; flex-shrink: 0; +} +.ge-history-snap-del:hover { color: var(--accent, var(--red)); } + +/* Docked History panel: the panel body *is* the timeline (Photoshop-style), + so it fills the dock and scrolls its own list. */ +.ge-history-body { padding: 0; display: flex; flex-direction: column; min-height: 0; } +.ge-history-body .ge-history-list { flex: 1 1 auto; min-height: 90px; } +.ge-history-popout { margin: 6px 10px; align-self: flex-start; font-size: 10px; } +/* (The docked History panel dropped its "Open in window" button — the timeline + is already shown inline; the floating window stays on the topbar clock.) */ + /* Tight button group in popup heads — min + close sit immediately next to each other with no inherited flex gap, pushed to the right edge. */ .ge-head-btns { @@ -2435,6 +3418,23 @@ } .ge-adj-revert:hover { opacity: 1; color: var(--fg); } +/* Develop panel polish: full-contrast value readouts, grouped heading labels, + and revert arrows that stay hidden until hover or a non-default value. */ +.ge-adj-develop .ge-adj-value { flex: 0 0 52px; color: var(--fg); font-size: 12px; opacity: 1; } +.ge-adj-group-label { + font-size: 10px; letter-spacing: .08em; text-transform: uppercase; + opacity: .55; margin: 10px 0 4px; +} +.ge-adj-develop .ge-adj-group-label:first-child { margin-top: 2px; } +.ge-adj-develop .ge-adj-revert { + min-width: 24px; min-height: 24px; margin-left: 6px; padding: 0; + opacity: 0; pointer-events: none; +} +.ge-adj-develop .ge-adj-row:hover .ge-adj-revert, +.ge-adj-develop .ge-adj-row.is-modified .ge-adj-revert { + opacity: 1; pointer-events: auto; +} + /* Adjustment sub-layer row in the layer panel — indented under parent. */ .ge-adj-sub-item { padding-left: 18px; @@ -2672,7 +3672,7 @@ .ge-layers-header #ge-add-layer { position: relative; top: 1px; } .ge-layer-blend-row { display: grid; - grid-template-columns: 38px minmax(0, 1fr); + grid-template-columns: 38px minmax(0, 1fr) auto; align-items: center; gap: 6px; padding: 4px 7px; @@ -2680,6 +3680,20 @@ font-size: 10px; color: color-mix(in srgb, var(--fg) 62%, transparent); } +.ge-layer-opacity-head { + display: inline-flex; + align-items: center; + gap: 4px; + white-space: nowrap; +} +.ge-layer-opacity-head input { + width: 48px; + height: 25px; + padding: 0 4px; + border-radius: 4px; + font-size: 10px; + text-align: right; +} .ge-layer-blend-row select { width: 100%; min-width: 0; @@ -2739,6 +3753,12 @@ } .ge-save-state-icon { display: none; } .ge-save-label { white-space: nowrap; min-width: 0; } +/* Save button: glyph on its own row, then the SAVE action label and the + live draft-status chip share the second row. */ +#ge-save-menu-btn { flex-direction: row !important; flex-wrap: wrap; column-gap: 4px; } +#ge-save-menu-btn .ge-stacked-glyph { flex: 0 0 100%; } +#ge-save-menu-btn .ge-save-action-label { top: 0; } +#ge-save-menu-btn .ge-save-label { top: 0; } .ge-save-state-saved { color: var(--fg); } .ge-save-menu .dropdown-item-compact { width: 100%; @@ -2755,14 +3775,30 @@ .ge-edge-wrap, .ge-view-wrap, .ge-image-wrap, +.ge-layer-wrap, +.ge-type-wrap, .ge-selection-wrap, -.ge-filter-wrap { position: relative; display: inline-block; } +.ge-filter-wrap, +.ge-3d-wrap, +.ge-plugins-wrap, +.ge-window-wrap, +.ge-file-wrap, +.ge-edit-wrap, +.ge-help-wrap { position: relative; display: inline-block; } .ge-resize-menu, .ge-edge-menu, .ge-view-menu, .ge-image-menu, +.ge-file-menu, +.ge-edit-menu, +.ge-layer-menu, +.ge-type-menu, .ge-selection-menu, -.ge-filter-menu { +.ge-filter-menu, +.ge-3d-menu, +.ge-plugins-menu, +.ge-window-menu, +.ge-help-menu { position: absolute; top: calc(100% + 2px); right: 0; @@ -2778,17 +3814,31 @@ } /* Mobile: escape the topbar's stacking context (z 5) so the dropdown lands above the bottom-sheet panels (z 50 / 60). Switch to fixed and - pin under the topbar. */ + pin under the topbar. Anchor to the LEFT of the viewport: the editor's + `.gallery-modal-content` ancestor carries a (identity) transform, so a + fixed dropdown's containing block is that ancestor rather than the + viewport. A `right` anchor resolved against the narrow topbar wrap and + pushed these ~224px menus off-screen (x ≈ -160 at 390px); a left + anchor keeps them fully on-screen. */ @media (max-width: 820px) { .ge-resize-menu, .ge-edge-menu, .ge-view-menu, .ge-image-menu, + .ge-file-menu, + .ge-edit-menu, + .ge-layer-menu, + .ge-type-menu, .ge-selection-menu, - .ge-filter-menu { + .ge-filter-menu, + .ge-3d-menu, + .ge-plugins-menu, + .ge-window-menu, + .ge-help-menu { position: fixed; top: 44px; - right: 8px; + left: 8px; + right: auto; z-index: 500; max-width: calc(100vw - 16px); } @@ -2797,13 +3847,29 @@ .ge-edge-menu { min-width: 220px; padding: 10px; gap: 6px; } .ge-view-menu { min-width: 174px; } .ge-image-menu { min-width: 180px; } +.ge-file-menu { min-width: 208px; } +.ge-edit-menu { min-width: 180px; } +.ge-layer-menu { min-width: 200px; } +.ge-type-menu { min-width: 180px; } .ge-selection-menu { min-width: 224px; } .ge-filter-menu { min-width: 180px; } +.ge-3d-menu { min-width: 220px; } +.ge-plugins-menu { min-width: 200px; } +.ge-window-menu { min-width: 200px; } +.ge-help-menu { min-width: 200px; } .ge-resize-menu .dropdown-item-compact, .ge-view-menu .dropdown-item-compact, .ge-image-menu .dropdown-item-compact, +.ge-file-menu .dropdown-item-compact, +.ge-edit-menu .dropdown-item-compact, +.ge-layer-menu .dropdown-item-compact, +.ge-type-menu .dropdown-item-compact, .ge-selection-menu .dropdown-item-compact, -.ge-filter-menu .dropdown-item-compact { +.ge-filter-menu .dropdown-item-compact, +.ge-3d-menu .dropdown-item-compact, +.ge-plugins-menu .dropdown-item-compact, +.ge-window-menu .dropdown-item-compact, +.ge-help-menu .dropdown-item-compact { width: 100%; background: none; border: none; @@ -2812,12 +3878,14 @@ } .ge-view-toggle .ge-view-check { opacity: 0; } .ge-view-toggle.active .ge-view-check { opacity: 1; color: var(--red); } +.ge-window-toggle .ge-window-check { opacity: 0; } +.ge-window-toggle.active .ge-window-check { opacity: 1; color: var(--red); } .ge-view-grid-size { display: grid; grid-template-columns: 1fr 52px auto; align-items: center; gap: 5px; - padding: 4px 8px; + padding: 4px 14px 4px 8px; font-size: 10px; color: var(--color-muted); } @@ -2832,25 +3900,198 @@ font: inherit; text-align: right; } -/* Sub-menu label inside the Filter / Image dropdown — small uppercase - header so "Blur" / "Selection" reads as a category, not an action. */ -.ge-filter-submenu-label { +/* Sub-menu label inside the topbar dropdowns — small uppercase header so + "Blur" / "Transform" reads as a category, not an action. Shared by every + editor dropdown (`.ge-menu-label`) and the legacy filter class. */ +.ge-filter-submenu-label, +.ge-menu-label { font-size: 9px; text-transform: uppercase; letter-spacing: 0.08em; - opacity: 0.45; - font-weight: 600; - padding: 4px 8px 2px; + opacity: 0.72; + font-weight: 700; + color: var(--color-muted); + padding: 8px 8px 3px; + border-top: 1px solid color-mix(in srgb, var(--fg) 12%, transparent); pointer-events: none; } +/* The first header in a menu sits flush to the menu's own padding so the + dropdown does not show an empty band at the top (Photoshop menus start + with an item or a tight separator, never dead space). */ +.ge-filter-submenu-label:first-child, +.ge-menu-label:first-child, +.dropdown-section-label:first-child { padding-top: 2px; } /* Disabled dropdown items (e.g. Fill when there's no selection) read as muted + non-interactive. */ .ge-image-menu .dropdown-item-compact:disabled, +.ge-layer-menu .dropdown-item-compact:disabled, +.ge-type-menu .dropdown-item-compact:disabled, .ge-selection-menu .dropdown-item-compact:disabled, -.ge-filter-menu .dropdown-item-compact:disabled { +.ge-filter-menu .dropdown-item-compact:disabled, +.ge-3d-menu .dropdown-item-compact:disabled, +.ge-plugins-menu .dropdown-item-compact:disabled, +.ge-file-menu .dropdown-item-compact:disabled, +.ge-edit-menu .dropdown-item-compact:disabled, +.ge-view-menu .dropdown-item-compact:disabled, +.ge-window-menu .dropdown-item-compact:disabled, +.ge-help-menu .dropdown-item-compact:disabled { opacity: 0.4; cursor: not-allowed; } +/* Photoshop menu feel — dark chrome, hover highlight, right-aligned + shortcut hints, submenu chevrons, keyboard-focus ring. */ +.ge-file-menu .dropdown-item-compact, +.ge-edit-menu .dropdown-item-compact, +.ge-image-menu .dropdown-item-compact, +.ge-layer-menu .dropdown-item-compact, +.ge-type-menu .dropdown-item-compact, +.ge-selection-menu .dropdown-item-compact, +.ge-filter-menu .dropdown-item-compact, +.ge-view-menu .dropdown-item-compact, +.ge-window-menu .dropdown-item-compact, +.ge-help-menu .dropdown-item-compact, +.ge-3d-menu .dropdown-item-compact, +.ge-plugins-menu .dropdown-item-compact { + position: relative; + justify-content: flex-start; +} +.ge-file-menu .dropdown-item-compact:hover:not(:disabled), +.ge-edit-menu .dropdown-item-compact:hover:not(:disabled), +.ge-image-menu .dropdown-item-compact:hover:not(:disabled), +.ge-layer-menu .dropdown-item-compact:hover:not(:disabled), +.ge-type-menu .dropdown-item-compact:hover:not(:disabled), +.ge-selection-menu .dropdown-item-compact:hover:not(:disabled), +.ge-filter-menu .dropdown-item-compact:hover:not(:disabled), +.ge-view-menu .dropdown-item-compact:hover:not(:disabled), +.ge-window-menu .dropdown-item-compact:hover:not(:disabled), +.ge-help-menu .dropdown-item-compact:hover:not(:disabled), +.ge-3d-menu .dropdown-item-compact:hover:not(:disabled), +.ge-plugins-menu .dropdown-item-compact:hover:not(:disabled) { + background: var(--accent, var(--red)); + color: var(--panel); +} +.ge-file-menu .dropdown-item-compact:focus-visible, +.ge-edit-menu .dropdown-item-compact:focus-visible, +.ge-image-menu .dropdown-item-compact:focus-visible, +.ge-layer-menu .dropdown-item-compact:focus-visible, +.ge-type-menu .dropdown-item-compact:focus-visible, +.ge-selection-menu .dropdown-item-compact:focus-visible, +.ge-filter-menu .dropdown-item-compact:focus-visible, +.ge-view-menu .dropdown-item-compact:focus-visible, +.ge-window-menu .dropdown-item-compact:focus-visible, +.ge-help-menu .dropdown-item-compact:focus-visible, +.ge-3d-menu .dropdown-item-compact:focus-visible, +.ge-plugins-menu .dropdown-item-compact:focus-visible { + outline: none; + background: color-mix(in srgb, var(--accent, #4c8bf5) 22%, transparent); + color: var(--fg); +} +.ge-file-menu .dropdown-shortcut, +.ge-edit-menu .dropdown-shortcut, +.ge-image-menu .dropdown-shortcut, +.ge-layer-menu .dropdown-shortcut, +.ge-selection-menu .dropdown-shortcut, +.ge-filter-menu .dropdown-shortcut, +.ge-view-menu .dropdown-shortcut, +.ge-window-menu .dropdown-shortcut, +.ge-help-menu .dropdown-shortcut, +.ge-save-menu .dropdown-shortcut { + margin-left: auto; + font-size: 9.5px; + opacity: 0.5; + font-variant-numeric: tabular-nums; + white-space: nowrap; +} +/* Menu items that open a submenu render a chevron on the right edge. */ +.ge-topbar .dropdown-item-compact.ge-has-submenu::after { + content: '›'; + margin-left: auto; + font-size: 13px; + line-height: 1; + opacity: 0.6; +} +/* --- Photoshop polish pass ------------------------------------------------- + 1. Flat text menu bar: title-case labels, no icon/box chrome, tight gaps. + 2. Compact dropdown rows + real separators instead of faint headers. + 3. Pin the right-hand action group so SAVE can never be clipped; the menu + row scrolls internally when the editor gets narrow. */ +.ge-topbar { justify-content: flex-start; } +.ge-topbar-left { + flex: 1 1 auto; + min-width: 0; + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: none; +} +.ge-topbar-left::-webkit-scrollbar { display: none; } +.ge-topbar-right { flex: 0 0 auto; margin-left: auto; } +.ge-topbar-left .ge-stacked-btn { + flex-direction: row !important; + gap: 0 !important; + padding: 5px 7px !important; + background: transparent; + border: 0; + box-shadow: none; + border-radius: 4px; + color: var(--fg); +} +.ge-topbar-left .ge-stacked-btn .ge-stacked-glyph, +.ge-topbar-left .ge-stacked-btn .ge-stacked-caret { display: none; } +.ge-topbar-left .ge-stacked-btn .ge-stacked-label { + position: static; + top: 0; + font-size: 12px; + letter-spacing: 0; + opacity: 1; + font-weight: 400; + text-transform: none; + color: inherit; +} +.ge-topbar-left .ge-stacked-btn:hover { background: var(--accent, var(--red)); color: var(--panel); } +/* Keep the menu bar Photoshop-short. The stacked buttons render as flat text + labels here, so they only need a tight row height. */ +.ge-topbar { padding: 2px 10px; } +.ge-topbar-left .ge-stacked-btn { height: 26px; min-height: 0; padding: 0 8px !important; } +/* When the menu bar is tight, drop the right group's text first (icon-only + Import/Save) so all twelve menus stay visible instead of Window/Help + scrolling out of view. Toggled from JS by measuring overflow. */ +.ge-topbar.ge-topbar-compact #ge-import-topbar { padding: 5px 7px !important; } +.ge-topbar.ge-topbar-compact #ge-import-topbar .ge-stacked-label, +.ge-topbar.ge-topbar-compact #ge-save-menu-btn .ge-save-action-label { display: none !important; } +.ge-topbar.ge-topbar-compact #ge-save-menu-btn { padding: 5px 8px !important; } +/* Non-essential right-group chrome hid so the full Photoshop menu bar + (through Help) always fits without scrolling out of view. */ +.ge-topbar .ge-alpha-badge, +.ge-topbar #ge-shortcuts-btn { display: none; } +/* Compact dropdown rows (Photoshop menus are ~24px tall, 12-13px text). */ +.ge-topbar .dropdown .dropdown-item-compact { + min-height: 0; + padding: 4px 10px; + font-size: 12.5px; + line-height: 1.35; + gap: 8px; +} +.ge-topbar .dropdown .dropdown-icon { width: 13px; height: 13px; } +.ge-topbar .dropdown .dropdown-shortcut { font-size: 11px; } +/* Section headers become real separators (Photoshop has no section labels); + the first one is dropped so a menu never starts with dead space. */ +.ge-topbar .dropdown .ge-menu-label, +.ge-topbar .dropdown .ge-filter-submenu-label, +.ge-topbar .dropdown .dropdown-section-label { + font-size: 0; + line-height: 0; + letter-spacing: 0; + opacity: 1; + height: 0; + padding: 0; + margin: 5px 10px; + border-top: 1px solid var(--border); + overflow: hidden; + pointer-events: none; +} +.ge-topbar .dropdown > .ge-menu-label:first-child, +.ge-topbar .dropdown > .ge-filter-submenu-label:first-child, +.ge-topbar .dropdown > .dropdown-section-label:first-child { display: none; } .ge-selection-save-row { display: grid; grid-template-columns: minmax(0, 1fr) 28px; @@ -3318,23 +4559,27 @@ display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; + flex: 0 0 auto; } .ge-canvas-preset { display: flex; flex-direction: column; - align-items: flex-start; - gap: 3px; + align-items: center; + justify-content: center; + gap: 2px; + flex: 0 0 auto; + min-height: 62px; min-width: 0; - padding: 8px 9px; + padding: 10px 9px; + line-height: 1.25; border: 1px solid color-mix(in srgb, var(--border) 85%, transparent); border-radius: 6px; background: color-mix(in srgb, var(--fg) 4%, transparent); color: var(--fg); font: inherit; - text-align: left; + text-align: center; cursor: pointer; box-sizing: border-box; - overflow: hidden; } .ge-canvas-preset:hover, .ge-canvas-preset.active { @@ -3344,14 +4589,31 @@ .ge-canvas-preset span, .ge-canvas-preset strong { display: block; - width: 100%; + width: auto; + max-width: 100%; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .ge-canvas-preset span { font-size: 11px; font-weight: 600; } -.ge-canvas-preset strong { font-size: 10px; font-weight: 500; opacity: .62; } +.ge-canvas-preset strong { font-size: 10px; font-weight: 500; opacity: .8; } +.ge-canvas-preview { + display: flex; + align-items: center; + justify-content: center; + margin: 2px 0 8px; + padding: 6px; + border: 1px solid color-mix(in srgb, var(--border) 80%, transparent); + border-radius: 6px; + background: color-mix(in srgb, var(--fg) 4%, transparent); +} +.ge-canvas-preview img { max-width: 100%; max-height: 120px; object-fit: contain; display: block; } +.ge-canvas-preview[hidden], +.ge-canvas-resolution-field[hidden] { display: none; } +.ge-canvas-resolution-field { display: inline-flex; align-items: center; gap: 6px; } +.ge-canvas-resolution-field input[type="number"] { width: 84px; } +.ge-canvas-resolution-unit { font-size: 11px; opacity: .6; } .ge-canvas-prompt-footer { display: flex; align-items: center; @@ -3413,6 +4675,328 @@ button .spinner-whirlpool { position: relative; } +/* Docked right panel stack (desktop) — Photoshop-style: several panel + groups are visible at once, stacked vertically. Each group shows one + tab's panel, collapses to its tab strip, and resizes via the divider + below it. The panel wrappers only re-parent existing elements, so all + ids/classes/listeners keep working; inactive panels are `hidden`. */ +.ge-right-panel--dock { + overflow: hidden; +} +.ge-dock { + display: flex; + flex-direction: column; + flex: 0 1 auto; + min-height: 0; + max-height: 68%; + overflow-y: auto; + overflow-x: hidden; +} +.ge-right-panel--dock > .ge-layers { flex: 1 1 auto; min-height: 0; } + +.ge-dock-group { + display: flex; + flex-direction: column; + flex: 0 0 auto; + min-height: 0; + overflow: hidden; +} +.ge-dock-group-head { + display: flex; + align-items: stretch; + flex: 0 0 auto; + gap: 2px; + padding: 0 4px 0 6px; + background: color-mix(in srgb, var(--panel) 88%, var(--fg) 12%); + border-bottom: 1px solid var(--border); +} +.ge-dock-tabs { + display: flex; + flex: 1 1 auto; + min-width: 0; + overflow-x: auto; + scrollbar-width: none; + gap: 1px; +} +.ge-dock-tabs::-webkit-scrollbar { display: none; } +.ge-dock-tab { + flex: 0 0 auto; + padding: 5px 14px 5px 8px; + font: inherit; + font-size: 9px; + font-weight: 600; + letter-spacing: 0.01em; + text-transform: uppercase; + white-space: nowrap; + color: color-mix(in srgb, var(--fg) 72%, transparent); + background: transparent; + border: 0; + border-bottom: 2px solid transparent; + cursor: pointer; +} +.ge-dock-tab:hover { color: var(--fg); } +.ge-dock-tab.active { + color: var(--fg); + border-bottom-color: var(--red); +} +.ge-dock-tab:focus-visible { + outline: 2px solid var(--red); + outline-offset: -2px; +} +/* A tab + its tear-off ("undock") control. The undock button appears on + hover / focus and floats that single panel into its own window. It sits + inside the tab button (top-right corner), not beside it. */ +.ge-dock-tab-item { + display: inline-flex; + align-items: stretch; + flex: 0 0 auto; + position: relative; +} +.ge-dock-tab-pop { + position: absolute; + top: 1px; + right: 1px; + display: none; + align-items: center; + justify-content: center; + width: 13px; + height: 13px; + padding: 0; + border: 0; + border-radius: 3px; + background: color-mix(in srgb, var(--panel) 88%, transparent); + color: color-mix(in srgb, var(--fg) 55%, transparent); + cursor: pointer; +} +.ge-dock-tab-item:hover .ge-dock-tab-pop, +.ge-dock-tab:focus-visible ~ .ge-dock-tab-pop { display: inline-flex; } +.ge-dock-tab-pop:hover { color: var(--fg); } +.ge-dock-collapse { + flex: 0 0 auto; + width: 26px; + height: 26px; + padding: 0; + display: inline-flex; + align-items: center; + justify-content: center; + color: color-mix(in srgb, var(--fg) 72%, transparent); + background: transparent; + border: 0; + cursor: pointer; + transition: transform 0.12s; +} +.ge-dock-collapse:hover { color: var(--fg); } +.ge-dock-detach { + flex: 0 0 auto; + width: 26px; + height: 26px; + padding: 0; + margin-left: 2px; + border-left: 1px solid color-mix(in srgb, var(--fg) 12%, transparent); + display: inline-flex; + align-items: center; + justify-content: center; + color: color-mix(in srgb, var(--fg) 70%, transparent); + background: transparent; + border-top: 0; + border-right: 0; + border-bottom: 0; + cursor: pointer; +} +.ge-dock-detach:hover { color: var(--fg); } +/* Collapsed groups shrink to their tab header only (never clip it). */ +.ge-dock-group.is-collapsed { + flex: 0 0 auto !important; + height: auto !important; +} +.ge-dock-tabs-more { + flex: 0 0 auto; + width: 26px; + height: 26px; + padding: 0; + display: inline-flex; + align-items: center; + justify-content: center; + color: color-mix(in srgb, var(--fg) 72%, transparent); + background: transparent; + border: 0; + cursor: pointer; +} +.ge-dock-tabs-more:hover { color: var(--fg); } +.ge-dock-collapse svg, .ge-dock-detach svg, .ge-dock-tabs-more svg { width: 16px; height: 16px; flex: 0 0 auto; } +.ge-dock-tabs-menu { + position: fixed; + z-index: 10060; + min-width: 140px; + padding: 4px; + display: flex; + flex-direction: column; + background: var(--panel); + border: 1px solid var(--border); + border-radius: 6px; + box-shadow: 0 10px 28px rgba(0, 0, 0, 0.5); +} +.ge-dock-tabs-menu-item { + text-align: left; + padding: 5px 8px; + font-size: 11.5px; + color: var(--fg); + background: transparent; + border: 0; + border-radius: 4px; + cursor: pointer; +} +.ge-dock-tabs-menu-item:hover { + background: color-mix(in srgb, var(--accent, #4c8bf5) 22%, transparent); +} +.ge-dock-group.is-floating .ge-dock-detach { display: none; } +/* Detached panel group — floats above the editor in its own draggable + window with a Dock control to return it to the stack. */ +.ge-float-window { + position: fixed; + z-index: 10050; + width: 260px; + max-width: calc(100vw - 16px); + background: var(--panel); + border: 1px solid var(--border); + border-radius: 8px; + box-shadow: 0 12px 34px rgba(0, 0, 0, 0.5); + overflow: hidden; +} +.ge-float-head { + display: flex; + align-items: center; + gap: 6px; + padding: 5px 6px 5px 10px; + background: color-mix(in srgb, var(--panel) 88%, var(--fg) 12%); + border-bottom: 1px solid var(--border); + cursor: grab; + touch-action: none; +} +.ge-float-title { + flex: 1 1 auto; + min-width: 0; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.03em; + text-transform: uppercase; + color: var(--fg); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.ge-float-btns { display: inline-flex; align-items: center; gap: 2px; } +.ge-float-dock { + width: 28px; + height: 26px; + padding: 0; + display: inline-flex; + align-items: center; + justify-content: center; + color: color-mix(in srgb, var(--fg) 70%, transparent); + background: transparent; + border: 0; + cursor: pointer; +} +.ge-float-dock svg { width: 16px; height: 16px; flex: 0 0 auto; } +.ge-float-dock:hover { color: var(--fg); } +.ge-float-body { max-height: 60vh; overflow-y: auto; } +.ge-float-body > .ge-dock-group { flex: 0 0 auto !important; height: auto !important; } +.ge-dock-group.is-collapsed .ge-dock-collapse { transform: rotate(-90deg); } +.ge-dock-group.is-collapsed .ge-dock-panels { display: none; } + +.ge-dock-panels { + display: flex; + flex-direction: column; + min-height: 0; + flex: 1 1 auto; + overflow-y: auto; + overflow-x: hidden; + /* A visible thin scrollbar makes it obvious when a group's content + (e.g. the swatch grid) continues below the fold instead of looking + like it was clipped mid-row. */ + scrollbar-width: thin; + scrollbar-color: color-mix(in srgb, var(--fg) 30%, transparent) transparent; +} +.ge-dock-panels::-webkit-scrollbar { width: 8px; } +.ge-dock-panels::-webkit-scrollbar-thumb { + background: color-mix(in srgb, var(--fg) 28%, transparent); + border-radius: 4px; +} +.ge-dock-panels::-webkit-scrollbar-track { background: transparent; } +.ge-dock-panel { + display: flex; + flex-direction: column; + flex: 0 0 auto; + min-width: 0; +} +.ge-dock-panel[hidden] { display: none; } + +/* View > Panels visibility: hide a panel's body + its tab-strip item, a whole + group (and its divider) once every member is hidden, and the pinned Layers / + Tool Options strips. Tagged by panel-visibility.js. */ +.ge-dock-panel[data-panel-hidden="1"], +.ge-dock-tab-item[data-panel-hidden="1"], +.ge-dock-group[data-panel-hidden="1"], +.ge-dock-divider[data-panel-hidden="1"], +.ge-layers[data-panel-hidden="1"], +.ge-controls[data-panel-hidden="1"], +.ge-dock[data-panel-hidden="1"], +.ge-right-panel[data-panel-hidden="1"] { display: none !important; } +/* When every dock group is hidden the rail must shrink to its remaining pinned + content instead of stretching to full height and leaving a blank column. */ +.ge-right-panel[data-panel-dock-hidden="1"] { align-self: flex-start; height: auto; } +.ge-right-panel[data-panel-dock-hidden="1"] > .ge-layers { flex: 0 0 auto; max-height: 100%; } +.ge-dock-select option[data-panel-hidden="1"] { display: none; } + +/* Drag divider between two stacked panel groups. */ +.ge-dock-divider { + flex: 0 0 auto; + height: 5px; + margin: -1px 0; + background: transparent; + cursor: ns-resize; + transition: background 0.12s; +} +.ge-dock-divider:hover, +.ge-dock-divider:active { + background: color-mix(in srgb, var(--red) 35%, transparent); +} + +/* Compact fallback (narrow desktop columns) — a single selector that + swaps one panel at a time. */ +.ge-dock--compact .ge-dock-tabbar { + display: flex; + flex: 0 0 auto; + padding: 7px 8px; + border-bottom: 1px solid var(--border); + background: var(--panel); +} +.ge-dock-select { + flex: 1 1 auto; + min-width: 0; + width: 100%; + padding: 5px 8px; + font: inherit; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.03em; + text-transform: uppercase; + color: var(--fg); + background-color: var(--bg, var(--panel)); + border: 1px solid var(--border); + border-radius: 6px; + cursor: pointer; +} +.ge-dock-select:focus-visible { + outline: 2px solid var(--red); + outline-offset: 1px; +} +.ge-dock--compact .ge-dock-panels { + flex: 1 1 auto; + max-height: none; +} + /* Floating value bubble that pops above the slider thumb while dragging. Solves the "I can't see the number" problem when the slider's opaque plate covers the row's right-edge value chip. */ @@ -3454,14 +5038,13 @@ button .spinner-whirlpool { } .ge-layers-header { display: flex; - flex-wrap: wrap; align-items: center; gap: 6px; - padding: 6px 10px; + padding: 4px 10px; font-size: 11px; font-weight: 600; color: var(--fg); - opacity: 0.8; + opacity: 0.85; border-bottom: 1px solid var(--border); position: relative; } @@ -3469,10 +5052,22 @@ button .spinner-whirlpool { .ge-layers-header #ge-add-layer { flex: 0 0 auto; white-space: nowrap; } .ge-layer-header-tools { display: flex; - flex: 0 0 100%; + flex: 0 1 auto; flex-wrap: wrap; align-items: center; + gap: 4px; +} +/* Panel action icons live in a compact row at the BOTTOM of the panel + (Photoshop-style); #ge-layer-tools stays an empty hook for shared + selected-layer actions. */ +.ge-layers-footer { + display: flex; + align-items: center; + justify-content: space-between; gap: 6px; + padding: 4px 8px; + border-top: 1px solid var(--border); + background: color-mix(in srgb, var(--bg-secondary, var(--panel)) 40%, var(--panel)); } .ge-layers-grab { display: none; } /* mobile only */ .ge-layers-merge-wrap { position: relative; display: inline-flex; } @@ -3554,7 +5149,7 @@ button .spinner-whirlpool { display: flex; align-items: center; gap: 4px; - padding: 5px 8px; + padding: 3px 8px; cursor: pointer; border-left: 2px solid transparent; transition: background 0.1s; @@ -3569,8 +5164,8 @@ button .spinner-whirlpool { @media (min-width: 701px) { .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item) { display: grid; - grid-template-columns: 12px 22px 34px minmax(0, 1fr) 24px; - row-gap: 5px; + grid-template-columns: 12px 22px 28px minmax(0, 1fr) 24px; + row-gap: 2px; } .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item) > .ge-layer-drag { grid-column: 1; @@ -3604,12 +5199,25 @@ button .spinner-whirlpool { justify-content: flex-end; min-width: 0; } + /* Photoshop-style: an idle layer row is ONE compact line. The per-row + opacity slider and action strip stay in the DOM (so they remain + testable) but only surface on the active or hovered row. */ + .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item) > .ge-layer-opacity-row, + .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item) > .ge-layer-controls { + display: none; + } + .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item).active > .ge-layer-opacity-row, + .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item).active > .ge-layer-controls, + .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item):hover > .ge-layer-opacity-row, + .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item):hover > .ge-layer-controls { + display: flex; + } } .ge-layer-inline-thumb { display: block; - width: 34px; - height: 26px; - flex: 0 0 34px; + width: 28px; + height: 21px; + flex: 0 0 28px; object-fit: contain; border: 1px solid color-mix(in srgb, var(--border) 80%, transparent); border-radius: 3px; @@ -3959,6 +5567,21 @@ button .spinner-whirlpool { font-variant-numeric: tabular-nums; opacity: .75; } +/* In the contextual options bar keep the eyedropper readout on ONE compact + row so the bar height matches the other tools and the centred canvas does + not jump between tools (which shifted the eyedropper sample point). The + loupe canvas keeps its 84x84 backing store; only its display size shrinks, + so the live pixel readout still works. */ +.ge-controls--in-options .ge-eyedropper-live { + min-height: 0; + height: 26px; + padding: 0 6px; + gap: 6px; +} +.ge-controls--in-options .ge-eyedropper-loupe { width: 22px; height: 22px; flex: 0 0 22px; } +.ge-controls--in-options .ge-eyedropper-live-swatch { width: 14px; height: 14px; flex: 0 0 14px; } +.ge-controls--in-options .ge-eyedropper-live-values { display: flex; flex-direction: row; align-items: center; gap: 8px; } + /* Left-edge drag handle on each layer row. */ .ge-layer-drag { display: flex; @@ -4112,6 +5735,14 @@ button .spinner-whirlpool { } .ge-crop-apply-btn:hover { background: color-mix(in srgb, var(--red) 85%, #000); } +/* Crop aspect preset buttons (options bar) */ +.ge-crop-preset-row { display: flex; gap: 4px; } +.ge-crop-preset.active { + background: var(--accent, #4c8bf5); + border-color: transparent; + color: #fff; +} + /* Text input floating */ .ge-text-input { background: var(--bg); @@ -4129,6 +5760,10 @@ button .spinner-whirlpool { display: none; box-sizing: border-box; } +/* Pixel brush: a hard square footprint instead of a feathered circle. */ +.ge-brush-cursor.ge-brush-cursor--pixel { + border-radius: 0; +} .ge-inpaint-section { padding: 8px 0; border-top: 1px solid var(--border); margin-top: 4px; } @@ -4267,6 +5902,19 @@ button .spinner-whirlpool { .ge-controls input[type="range"]::-moz-range-thumb { transition: width 0.12s ease, height 0.12s ease; } + /* Keep the right-hand actions (Import / Save / maximize) pinned and always + visible on phones: the menu row scrolls internally instead of dragging + the whole topbar sideways, which otherwise pushes Save off-screen. Uses a + child selector to beat the base `.ge-topbar-left{flex:0 0 auto}`. */ + .ge-topbar > .ge-topbar-left { + flex: 1 1 0; + min-width: 0; + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: none; + } + .ge-topbar > .ge-topbar-left::-webkit-scrollbar { display: none; } + .ge-topbar > .ge-topbar-right { flex: 0 0 auto; margin-left: 0; } .ge-toolbar { flex-direction: row; width: 100%; @@ -4282,6 +5930,34 @@ button .spinner-whirlpool { scrollbar-width: none; } .ge-toolbar::-webkit-scrollbar { display: none; } + /* Audit #5: the menu row and tool rail scroll sideways with hidden + scrollbars, so they read as static. Fade the overflowing edge (and drop + the fade on the side with nothing more to scroll to) so it's obvious there + are off-screen menus/tools. attachScrollAffordance() toggles the classes. */ + .ge-topbar-left.ge-scroll-fade, + .ge-toolbar.ge-scroll-fade { + -webkit-mask-image: linear-gradient(to right, transparent 0, #000 42px, #000 calc(100% - 42px), transparent 100%); + mask-image: linear-gradient(to right, transparent 0, #000 42px, #000 calc(100% - 42px), transparent 100%); + } + .ge-topbar-left.ge-scroll-fade.is-at-left, + .ge-toolbar.ge-scroll-fade.is-at-left { + -webkit-mask-image: linear-gradient(to right, #000 0, #000 calc(100% - 42px), transparent 100%); + mask-image: linear-gradient(to right, #000 0, #000 calc(100% - 42px), transparent 100%); + } + .ge-topbar-left.ge-scroll-fade.is-at-right, + .ge-toolbar.ge-scroll-fade.is-at-right { + -webkit-mask-image: linear-gradient(to right, transparent 0, #000 42px, #000 100%); + mask-image: linear-gradient(to right, transparent 0, #000 42px, #000 100%); + } + .ge-topbar-left.ge-scroll-fade.is-at-left.is-at-right, + .ge-toolbar.ge-scroll-fade.is-at-left.is-at-right { + -webkit-mask-image: none; + mask-image: none; + } + /* The horizontal mobile rail keeps a fixed short height; the fg/bg + swatch stack would stretch it and push tools under the layer sheet, + so it is hidden here (color stays reachable in the options bar). */ + .ge-tool-swatches { display: none; } /* Section labels in the toolbar were vertical breaks — turn them into thin vertical dividers when the column flows horizontally. */ .ge-tool-sep { @@ -4299,6 +5975,14 @@ button .spinner-whirlpool { flex-shrink: 0; width: 48px; } + /* Horizontal rail: slots become inline columns and the flyout caret is + always visible so touch users can open tool families without a hover. */ + .ge-tool-slot { + flex-direction: row; + flex-shrink: 0; + } + .ge-tool-slot > .ge-tool-btn { width: 48px; } + .ge-tool-caret { display: inline-flex; } /* Canvas is the main thing — give it as much vertical space as the editor body can spare. min-height keeps it visible even when the right panel is at its max. */ @@ -4355,12 +6039,20 @@ button .spinner-whirlpool { padding-top: 16px; position: relative; } - /* In peek state, the layers list takes the full panel height (~70vh) - and never overflows so its own scrollbar doesn't activate. Constrain - the list to the visible peek area so it scrolls properly when there - are more layers than the peek can show. */ + /* Peek state: bound the whole layers section to the peek height so its + bottom always meets the viewport edge and the list scrolls inside it. + Previously only the list was capped (peek - 52px) while the section + itself grew past the peek, so the add/fx/delete footer hung ~89px + below the phone viewport with no way to reach it. */ + .ge-right-panel:not(.expanded) .ge-layers { + max-height: var(--peek-height, 110px); + overflow: hidden; + } .ge-right-panel:not(.expanded) .ge-layers-list { - max-height: calc(var(--peek-height, 110px) - 52px); + flex: 1 1 auto; + min-height: 0; + max-height: none; + overflow-y: auto; -webkit-overflow-scrolling: touch; } /* Mobile layer-row buttons — bump hit targets up so fingers can @@ -4368,8 +6060,10 @@ button .spinner-whirlpool { .ge-layer-vis, .ge-layer-btn, .ge-layer-fx-btn { - width: 40px !important; - height: 40px !important; + width: 44px !important; + min-width: 44px !important; + height: 44px !important; + min-height: 44px !important; font-size: 18px !important; display: inline-flex; align-items: center; @@ -4380,19 +6074,30 @@ button .spinner-whirlpool { width: 18px; height: 18px; } + /* The desktop actions sit at 0.4 opacity, which reads as "nearly invisible" + against the pink selected-row overlay on a phone. Lift the resting opacity + so the fx / mask / duplicate icons stay legible. */ + .ge-layer-btn, + .ge-layer-fx-btn { + opacity: 0.78; + } + .ge-layer-btn:hover, + .ge-layer-fx-btn:hover { + opacity: 1; + } .ge-layers-list { overflow-x: clip; } .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item) { display: grid; - grid-template-columns: 12px 40px 34px minmax(0, 1fr) 40px; - grid-template-rows: 40px auto 40px; + grid-template-columns: 12px 44px 34px minmax(0, 1fr) 44px; + grid-template-rows: 44px auto; align-items: center; row-gap: 3px; } .ge-layers-list > .ge-layer-group-row { - grid-template-columns: 12px 40px 40px 34px minmax(0, 1fr) 40px; - grid-template-rows: 40px auto 40px; + grid-template-columns: 12px 44px 44px 34px minmax(0, 1fr) 44px; + grid-template-rows: 44px auto; align-items: center; row-gap: 3px; } @@ -4441,6 +6146,18 @@ button .spinner-whirlpool { min-width: 0; margin-left: 52px; } + /* Keep the active row's action strip on ONE line inside its row so it + can never wrap over the next layer; scroll it sideways instead. + (documents-gallery-editor.css sets flex-wrap:wrap on the .active row, + so this needs the extra .ge-right-panel scope to win.) */ + .ge-right-panel .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item).active > .ge-layer-controls, + .ge-right-panel .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item).active-parent > .ge-layer-controls, + .ge-right-panel .ge-layers-list > .ge-layer-group-row.active > .ge-layer-controls { + flex-wrap: nowrap; + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; + } .ge-mask-sub-item { display: grid; grid-template-columns: 40px 34px minmax(80px, 1fr) auto; @@ -4701,7 +6418,7 @@ button .spinner-whirlpool { flex-wrap: nowrap; justify-content: flex-start; gap: 6px; - padding: 6px 8px; + padding: 3px 8px; -webkit-overflow-scrolling: touch; scrollbar-width: none; } @@ -4723,9 +6440,9 @@ button .spinner-whirlpool { } .ge-topbar .ge-btn, .ge-topbar .ge-btn-sm { - padding: 7px 11px !important; - font-size: 13px !important; - min-height: 34px; + padding: 4px 9px !important; + font-size: 12px !important; + min-height: 28px; line-height: 1; top: 0 !important; } @@ -4873,6 +6590,21 @@ button .spinner-whirlpool { animation: none; transition: transform 0.18s ease-in; } + /* The layers right-panel (z 50) and the controls sheet (z 60) both + dock to the bottom on phones, covering the footer's history group + and making Undo/Redo unreachable by touch. Lift the history controls + above both sheets so a touch stroke can still be undone. */ + .ge-footer-history { + position: relative; + z-index: 65; + } + /* Once moved into the layer-sheet header the pill no longer needs the + overlay z-index/opacity lift — keep it crisp and flush right. */ + .ge-layers-header .ge-footer-history { + z-index: auto; + opacity: 1; + margin-left: auto; + } } /* ── Group Chat ────────────────────────────────────── */ @@ -4900,3 +6632,2510 @@ button .spinner-whirlpool { #group-model-picker .memory-item:hover { background: color-mix(in srgb, var(--fg) 6%, transparent); } + +/* Select and Mask workspace */ +.ge-sam-overlay { + position: fixed; + inset: 0; + z-index: 10050; + display: flex; + align-items: center; + justify-content: center; + background: rgba(3, 5, 8, 0.72); +} +.ge-sam-panel { + width: min(560px, 94vw); + max-height: 92vh; + overflow: auto; + display: flex; + flex-direction: column; + background: var(--panel, #14181f); + color: var(--fg, #e8ecf1); + border: 1px solid var(--border, #2a313c); + border-radius: 10px; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.55); +} +.ge-sam-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 10px 14px; + border-bottom: 1px solid var(--border, #2a313c); +} +.ge-sam-title { + font-weight: 600; + font-size: 13px; +} +.ge-sam-output-label { + display: flex; + align-items: center; + gap: 6px; + font-size: 11px; + color: var(--color-muted, #97a1ad); +} +.ge-sam-body { + display: flex; + gap: 14px; + padding: 14px; + flex-wrap: wrap; +} +.ge-sam-preview { + background: #11151b; + border: 1px solid var(--border, #2a313c); + border-radius: 6px; + cursor: crosshair; + touch-action: none; +} +.ge-sam-controls { + flex: 1 1 200px; + min-width: 200px; + display: flex; + flex-direction: column; + gap: 8px; + font-size: 11px; +} +.ge-sam-controls label { + display: flex; + flex-direction: column; + gap: 2px; +} +.ge-sam-brush-row { + display: flex; + gap: 6px; +} +.ge-sam-brush-add.active, +.ge-sam-brush-subtract.active { + border-color: var(--accent, #4c8bf5); + color: var(--accent, #4c8bf5); +} +.ge-sam-actions { + display: flex; + justify-content: flex-end; + gap: 8px; + padding: 10px 14px; + border-top: 1px solid var(--border, #2a313c); +} + +/* Color & analysis dock panels (Phase 7) */ +.ge-panel { + display: flex; + flex-direction: column; + gap: 8px; + padding: 10px 12px; + color: var(--fg, #e6e9ef); +} +.ge-panel-title { + font-size: 10px; + font-weight: 700; + letter-spacing: .08em; + text-transform: uppercase; + color: var(--color-muted, #8b93a1); +} +.ge-panel-empty { + font-size: 12px; + opacity: .6; + padding: 6px 0; +} +.ge-swatch-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(20px, 1fr)); + gap: 4px; +} +.ge-swatch { + width: 100%; + aspect-ratio: 1 / 1; + border: 1px solid var(--border, #2a313c); + border-radius: 4px; + cursor: pointer; + padding: 0; +} +.ge-swatch.active { + outline: 2px solid var(--accent, #4c8bf5); + outline-offset: 1px; +} +.ge-current-swatch { + height: 26px; + border-radius: 5px; + border: 1px solid var(--border, #2a313c); +} +/* SWATCHES panel hosts the shared color picker's trigger swatch + (colorPicker.js) and, next to it, harmony Suggestions + Recent colours. */ +.ge-swatch-body { display: flex; flex-direction: row; align-items: flex-start; gap: 8px; } +.ge-swatch-body .ge-color-input.cp-swatch-input { + width: 44px; + height: 44px; + flex: 0 0 auto; + min-width: 0; + border-radius: 8px; + border: 1px solid var(--border, #2a313c); + cursor: pointer; + background: none; +} +.ge-swatch-body .ge-color-input.cp-swatch-input::selection { background: transparent; } +.ge-swatch-col { display: flex; flex-direction: column; gap: 3px; flex: 1 1 auto; min-width: 0; } +.ge-swatch-row-label { font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; opacity: 0.78; } +.ge-swatch-row { display: flex; flex-wrap: nowrap; overflow-x: auto; gap: 4px; scrollbar-width: none; } +.ge-swatch-row::-webkit-scrollbar { display: none; } +.ge-mini-swatch { + width: 16px; + height: 16px; + padding: 0; + flex: 0 0 auto; + border: 1px solid color-mix(in srgb, var(--fg) 22%, transparent); + border-radius: 4px; + cursor: pointer; +} +.ge-mini-swatch:hover { transform: scale(1.12); } +.ge-mini-empty { font-size: 10px; opacity: 0.45; } +/* Always-visible SV + hue picker inside the SWATCHES panel (panels.js). Reuses + the shared .cp-sl/.cp-hue classes; this container just lays them out inline + instead of inside the floating .cp-popover, so the panel reads as a picker + without a click. */ +.ge-swatch-body { flex-wrap: wrap; } +.ge-inline-picker { + display: flex; + flex-direction: column; + gap: 4px; + flex: 1 1 100%; + width: 100%; + margin-top: 6px; +} +.ge-inline-picker .cp-sl { height: 80px; } +.ge-inline-picker .cp-hue { margin-top: 4px; } +.ge-hex-row { display: flex; align-items: center; gap: 4px; flex: 1 1 100%; width: 100%; margin-top: 6px; background: color-mix(in srgb, var(--fg) 6%, transparent); border: 1px solid var(--border); border-radius: 6px; padding: 4px 8px; } +.ge-hex-hash { color: color-mix(in srgb, var(--fg) 65%, transparent); font-size: 12px; font-weight: 600; } +.ge-hex-input { flex: 1 1 auto; min-width: 0; background: transparent; border: 0; outline: 0; color: var(--fg); font: inherit; font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; padding: 0; } +.ge-gradient-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(56px, 1fr)); + gap: 6px; +} +.ge-gradient-swatch { + height: 24px; + border-radius: 5px; + border: 1px solid var(--border, #2a313c); + cursor: pointer; + padding: 0; +} +.ge-channel-list { + display: flex; + flex-direction: column; + gap: 2px; + max-height: 220px; + overflow-y: auto; +} +.ge-channel-row { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 6px; + border-radius: 5px; + cursor: pointer; + font-size: 12px; +} +.ge-channel-row.active { + background: color-mix(in srgb, var(--accent, #4c8bf5) 22%, transparent); +} +.ge-channel-eye { + width: 20px; + text-align: center; + opacity: .8; +} +.ge-channel-name { + flex: 1 1 auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.ge-histogram-canvas, +.ge-navigator-canvas { + width: 100%; + background: #0b0d10; + border: 1px solid var(--border, #2a313c); + border-radius: 5px; +} +.ge-navigator-canvas { + cursor: grab; + touch-action: none; +} +.ge-navigator-canvas:active { + cursor: grabbing; +} +.ge-info-rows { + display: flex; + flex-direction: column; + gap: 4px; +} +.ge-info-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + font-size: 12px; +} +.ge-info-label { + color: var(--color-muted, #8b93a1); +} +.ge-info-value { + display: flex; + align-items: center; + gap: 6px; + font-variant-numeric: tabular-nums; +} +.ge-info-swatch { + width: 14px; + height: 14px; + border-radius: 3px; + border: 1px solid var(--border, #2a313c); + display: inline-block; +} +/* Command palette (Phase 11) */ +.ge-command-palette { + position: fixed; + inset: 0; + z-index: 10100; + display: flex; + align-items: flex-start; + justify-content: center; + padding-top: 12vh; + background: rgba(6, 8, 11, 0.45); +} +.ge-command-palette[hidden] { + display: none; +} +.ge-command-panel { + width: min(520px, 92vw); + max-height: 60vh; + display: flex; + flex-direction: column; + background: var(--panel, #161a21); + border: 1px solid var(--border, #2a313c); + border-radius: 10px; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); + overflow: hidden; +} +.ge-command-input { + width: 100%; + box-sizing: border-box; + padding: 12px 14px; + border: 0; + border-bottom: 1px solid var(--border, #2a313c); + background: transparent; + color: var(--fg, #e6e9ef); + font-size: 14px; + outline: none; +} +.ge-command-list { + overflow-y: auto; + padding: 6px; + display: flex; + flex-direction: column; + gap: 2px; +} +.ge-command-item { + text-align: left; + padding: 8px 10px; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--fg, #e6e9ef); + font-size: 13px; + cursor: pointer; +} +.ge-command-item.active, +.ge-command-item:hover { + background: var(--accent, #4c8bf5); + color: #fff; +} +.ge-command-empty { + margin: 0; + padding: 12px; + color: var(--color-muted, #8b93a1); + font-size: 13px; + text-align: center; +} +/* Extra studio dock panels (Properties / Character / Paths / Patterns / Adjustments / History) */ +.ge-panel-body { + display: flex; + flex-direction: column; + gap: 8px; + padding: 8px 10px; +} +.ge-text-align-row { + display: flex; + gap: 4px; +} +.ge-path-list { + gap: 4px; +} +.ge-adjustment-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 3px; + padding: 4px 6px; +} +.ge-adjustment-grid .ge-btn { + width: 100%; + text-align: left; +} +/* Actions panel (Phase 11) */ +.ge-actions-name-row, +.ge-actions-add-row, +.ge-actions-controls, +.ge-actions-batch-row { + display: flex; + gap: 6px; +} +.ge-actions-batch-select { + flex: 1 1 auto; + min-width: 0; +} +.ge-actions-name { + flex: 1 1 auto; + min-width: 0; +} +.ge-actions-command { + flex: 1 1 auto; + min-width: 0; +} +.ge-actions-list { + display: flex; + flex-direction: column; + gap: 4px; + max-height: 240px; + overflow-y: auto; +} +.ge-actions-step, +.ge-actions-saved-row { + display: flex; + align-items: center; + gap: 6px; +} +.ge-actions-step-index { + width: 18px; + color: var(--color-muted, #8b93a1); + font-variant-numeric: tabular-nums; +} +.ge-actions-step-label { + flex: 1 1 auto; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.ge-action-remove { + border: none; + background: none; + color: var(--color-muted, #8b93a1); + cursor: pointer; +} +.ge-actions-controls .ge-btn.active { + border-color: var(--accent, #4c8bf5); + color: var(--accent, #4c8bf5); +} + +/* Studio dock panels (PhotoCraft parity: Properties/Character/Adjustments/Paths/Patterns/History) */ +.ge-panel-body { + display: flex; + flex-direction: column; + gap: 6px; + padding: 8px 10px; +} +.ge-text-align-row { + display: flex; + gap: 4px; +} +.ge-adjustment-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 3px; + padding: 4px 6px; +} +.ge-adjustment-grid .ge-btn { + width: 100%; + justify-content: flex-start; + font-size: 11px; +} +.ge-path-list { + gap: 4px; +} + +/* ── Full-viewport editor (Photoshop-style) ────────────────────────────── + The editor opens filling the whole viewport instead of the small + gallery sheet. `#ge-maximize-toggle` flips to a remembered windowed + mode by adding `.ge-editor-windowed` to #gallery-editor-container. */ +.gallery-modal-content:has(#gallery-editor-container:not(.ge-editor-windowed)) { + width: 100vw; + max-width: 100vw; + height: 100vh; + max-height: 100vh; + margin: 0; + border-radius: 0; +} +#gallery-modal:has(#gallery-editor-container:not(.ge-editor-windowed)) { + padding: 0; + align-items: stretch; + /* Escape the desktop "chat area" narrowing (left = icon-rail + sidebar) so + the editor really fills the whole viewport, over the nav. */ + left: 0; + width: 100vw; +} +#ge-maximize-toggle.is-windowed { color: var(--fg); } + +/* Multi-document editor tabs live in the gallery tab bar. The container is + display:contents so each extra tab is a direct flex child of .gallery-tabs, + matching the primary #gallery-editor-tab. */ +.gallery-editor-tabs-extra { display: contents; } +.gallery-tab.gallery-tab-new { + min-width: 26px; + justify-content: center; + font-size: 16px; + font-weight: 600; + opacity: 0.75; +} +.gallery-tab.gallery-tab-new:hover { opacity: 1; } + +/* Draggable dialog grab bars (Image Size / canvas-size prompt). */ +.ge-draggable-handle { + cursor: move; + user-select: none; + touch-action: none; +} +.ge-draggable-handle:active { cursor: grabbing; } + +/* ============================================================================ + * Editor control kit + * ---------------------------------------------------------------------------- + * One shared, theme-token style for the interactive controls scattered across + * the editor (options bar, adjustment dialogs, Image/Canvas Size, transform + * popup, layers, brush settings, filters). control-kit.js adds the .ge-ctl* + * classes; these rules make every such control look like the rest of Odysseus + * (matches .cookbook-slider / .admin-slider / .toggle-switch). Older, more + * specific rules (transform popup, eraser/fx rows) still win on purpose. + * ==========================================================================*/ + +/* -- Range sliders --------------------------------------------------------*/ +.ge-ctl-range { + -webkit-appearance: none; + appearance: none; + max-width: 100%; + height: 14px; + margin: 0; + padding: 0; + background: transparent; + cursor: pointer; + vertical-align: middle; + --ge-pct: 50%; + --ge-accent: var(--accent, var(--red)); +} +.ge-ctl-range::-webkit-slider-runnable-track { + height: 6px; + border-radius: 4px; + background: linear-gradient( + to right, + var(--ge-accent) 0 var(--ge-pct), + color-mix(in srgb, var(--fg) 14%, transparent) var(--ge-pct) 100% + ); +} +.ge-ctl-range::-moz-range-track { + height: 6px; + border-radius: 4px; + background: color-mix(in srgb, var(--fg) 14%, transparent); +} +.ge-ctl-range::-moz-range-progress { + height: 6px; + border-radius: 4px; + background: var(--ge-accent); +} +.ge-ctl-range::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 14px; + height: 14px; + margin-top: -4px; + border-radius: 50%; + background: var(--fg); + border: 2px solid var(--panel); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35); + cursor: pointer; + transition: transform 0.1s, box-shadow 0.1s; +} +.ge-ctl-range::-moz-range-thumb { + width: 12px; + height: 12px; + border-radius: 50%; + background: var(--fg); + border: 2px solid var(--panel); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35); + cursor: pointer; +} +.ge-ctl-range:hover::-webkit-slider-thumb { + transform: scale(1.15); + box-shadow: 0 0 0 4px color-mix(in srgb, var(--ge-accent) 22%, transparent); +} +.ge-ctl-range:active::-webkit-slider-thumb { + transform: scale(1.25); + box-shadow: 0 0 0 6px color-mix(in srgb, var(--ge-accent) 28%, transparent); +} +.ge-ctl-range:hover::-moz-range-thumb { + box-shadow: 0 0 0 4px color-mix(in srgb, var(--ge-accent) 22%, transparent); +} +.ge-ctl-range:focus-visible { + outline: none; +} +.ge-ctl-range:focus-visible::-webkit-slider-thumb { + box-shadow: 0 0 0 3px var(--panel), 0 0 0 5px color-mix(in srgb, var(--ge-accent) 55%, transparent); +} +.ge-ctl-range:disabled { + opacity: 0.45; + cursor: default; +} +.ge-ctl-range:disabled::-webkit-slider-thumb { transform: none; box-shadow: none; } + +/* -- Number fields (no native spinners) -----------------------------------*/ +.ge-num-field { + position: relative; + display: inline-flex; + align-items: center; +} +.ge-ctl-num { + width: auto; + max-width: 100%; + height: 26px; + padding: 0 6px; + background: var(--bg); + color: var(--fg); + border: 1px solid var(--border); + border-radius: 4px; + font: inherit; + font-size: 11px; + font-variant-numeric: tabular-nums; + text-align: right; + -moz-appearance: textfield; + appearance: textfield; + box-sizing: border-box; +} +.ge-ctl-num::-webkit-outer-spin-button, +.ge-ctl-num::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} +.ge-ctl-num:focus { + outline: none; + border-color: var(--accent, var(--red)); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent, var(--red)) 25%, transparent); +} +.ge-ctl-num:disabled, +.ge-ctl-num[readonly] { opacity: 0.5; cursor: default; } + +/* Small stacked/horizontal stepper next to a number field */ +.ge-stepper { + display: inline-flex; + flex-direction: column; + margin-left: 3px; + border-radius: 4px; + overflow: hidden; + border: 1px solid var(--border); +} +.ge-stepper button { + width: 16px; + height: 12px; + padding: 0; + border: 0; + background: color-mix(in srgb, var(--fg) 8%, transparent); + color: var(--fg); + font-size: 9px; + line-height: 1; + cursor: pointer; +} +.ge-stepper button:hover { background: var(--accent, var(--red)); color: var(--panel); } +.ge-stepper button:active { background: color-mix(in srgb, var(--accent, var(--red)) 75%, #000); color: var(--panel); } + +/* -- Selects --------------------------------------------------------------*/ +.ge-ctl-select { + height: 26px; + max-width: 100%; + padding: 0 22px 0 8px; + background-color: var(--bg); + color: var(--fg); + border: 1px solid var(--border); + border-radius: 4px; + font: inherit; + font-size: 11px; + appearance: none; + -webkit-appearance: none; + background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), + linear-gradient(135deg, currentColor 50%, transparent 50%); + background-position: calc(100% - 12px) 11px, calc(100% - 8px) 11px; + background-size: 4px 4px, 4px 4px; + background-repeat: no-repeat; + cursor: pointer; +} +.ge-ctl-select:hover { border-color: color-mix(in srgb, var(--fg) 45%, var(--border)); } +.ge-ctl-select:focus { + outline: none; + border-color: var(--accent, var(--red)); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent, var(--red)) 25%, transparent); +} +.ge-ctl-select option { background: var(--select-option-bg, var(--panel)); color: var(--select-option-fg, var(--fg)); } + +/* -- Checkboxes -----------------------------------------------------------*/ +input.ge-ctl-check { + appearance: none; + -webkit-appearance: none; + width: 14px; + height: 14px; + margin: 0; + border: 1px solid var(--border); + border-radius: 3px; + background: var(--bg); + cursor: pointer; + position: relative; + vertical-align: middle; + flex: 0 0 auto; +} +input.ge-ctl-check:hover { border-color: color-mix(in srgb, var(--fg) 45%, var(--border)); } +input.ge-ctl-check:checked { + background: var(--accent, var(--red)); + border-color: var(--accent, var(--red)); +} +input.ge-ctl-check:checked::after { + content: ''; + position: absolute; + left: 4px; + top: 1px; + width: 3px; + height: 7px; + border: solid var(--panel); + border-width: 0 2px 2px 0; + transform: rotate(45deg); +} +input.ge-ctl-check:focus-visible { + outline: none; + box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent, var(--red)) 35%, transparent); +} + +/* -- Small icon/text buttons ----------------------------------------------*/ +.ge-ctl-btn { + height: 24px; + min-width: 24px; + padding: 0 8px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 4px; + background: color-mix(in srgb, var(--fg) 6%, transparent); + color: var(--fg); + border: 1px solid var(--border); + border-radius: 4px; + font: inherit; + font-size: 11px; + cursor: pointer; +} +.ge-ctl-btn:hover { background: color-mix(in srgb, var(--fg) 14%, transparent); } +.ge-ctl-btn:active { background: color-mix(in srgb, var(--accent, var(--red)) 30%, transparent); } +.ge-ctl-btn:focus-visible { + outline: none; + box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent, var(--red)) 35%, transparent); +} +.ge-ctl-btn:disabled { opacity: 0.45; cursor: default; } + +/* Scrubby numeric label — drag horizontally to change the value */ +.ge-scrub { + cursor: ew-resize; + user-select: none; + touch-action: none; +} +.ge-scrub::after { content: '\2194'; font-size: 8px; opacity: 0.4; margin-left: 3px; } +.ge-scrub.ge-scrubbing { color: var(--accent, var(--red)); } + +/* On touch/mobile the topbar menus are icon/touch driven — hide keyboard shortcut hints. */ +@media (max-width: 820px) { + .ge-topbar .dropdown .dropdown-shortcut { display: none; } +} + +/* Editor landing ("Image Editor" chooser + Saved projects) — keep it + scrollable at EVERY width, not just <=620px. The base rule centres the + content vertically (justify-content: center) with no overflow; once the + saved-project list grows taller than the sheet (worst in list view), flex + centring pushes the launch controls AND the grid/list toggle ABOVE the + sheet, while #gallery-editor-container's overflow: hidden makes that top + region unreachable — the user could not scroll back and got stuck. Using + auto margins to centre collapses them to 0 on overflow, so the top stays + reachable while short content still looks vertically centred. */ +.gallery-modal-content:has(#gallery-editor-container[style*="flex"]) .gallery-editor-landing { + justify-content: flex-start; + overflow-y: auto; + overscroll-behavior: contain; + -webkit-overflow-scrolling: touch; +} +.gallery-modal-content:has(#gallery-editor-container[style*="flex"]) .gallery-editor-landing::before, +.gallery-modal-content:has(#gallery-editor-container[style*="flex"]) .gallery-editor-landing::after { + content: ''; + flex: 0 0 auto; + margin: auto; +} + +/* Tool-aware canvas right-click menu (canvas-context-menu.js). */ +.ge-canvas-menu { + position: fixed; + z-index: 100000; + min-width: 208px; + padding: 5px; + background: #2b2b2b; + border: 1px solid #454545; + border-radius: 6px; + box-shadow: 0 10px 32px rgba(0, 0, 0, 0.55); + font-size: 13px; + color: #e6e6e6; + user-select: none; +} +.ge-canvas-menu-item { + display: flex; + align-items: center; + gap: 8px; + width: 100%; + padding: 6px 10px; + border: 0; + border-radius: 4px; + background: transparent; + color: inherit; + font: inherit; + text-align: left; + cursor: pointer; +} +.ge-canvas-menu-item:hover:not([disabled]), +.ge-canvas-menu-item:focus-visible:not([disabled]) { + background: #3d6ea5; + color: #fff; + outline: none; +} +.ge-canvas-menu-item[disabled] { + color: #6d6d6d; + cursor: default; +} +.ge-canvas-menu-lead { + width: 12px; + flex: 0 0 12px; + text-align: center; + color: #9ecbff; +} +.ge-canvas-menu-label { flex: 1 1 auto; white-space: nowrap; } +.ge-canvas-menu-hint { + flex: 0 0 auto; + margin-left: 20px; + color: #9a9a9a; + font-size: 11px; +} +.ge-canvas-menu-item:hover .ge-canvas-menu-hint { color: #d8e6f5; } +.ge-canvas-menu-caret { flex: 0 0 auto; margin-left: 16px; color: #b8b8b8; } +.ge-canvas-menu-sep { + height: 1px; + margin: 4px 6px; + background: #454545; +} +.ge-canvas-menu-sub { min-width: 172px; max-height: 60vh; overflow-y: auto; } + +/* Editor setup checklist (preflight) — shown over the canvas on open. */ +.ge-preflight { + position: absolute; + inset: 0; + z-index: 260; + display: flex; + align-items: center; + justify-content: center; + padding: 16px; + background: rgba(8, 10, 14, 0.55); + backdrop-filter: blur(2px); +} +.ge-preflight[hidden] { display: none; } +.ge-preflight-card { + width: min(560px, 100%); + max-height: 100%; + overflow: auto; + background: #23262c; + color: #e8eaed; + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 12px; + box-shadow: 0 18px 50px rgba(0, 0, 0, 0.5); + padding: 16px 18px; +} +.ge-preflight-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; } +.ge-preflight-head h3 { margin: 0 0 3px; font-size: 15px; } +.ge-preflight-head p { margin: 0; font-size: 12px; color: #a9b0ba; } +.ge-preflight-close { + background: transparent; border: 0; color: #a9b0ba; font-size: 20px; line-height: 1; + cursor: pointer; padding: 2px 6px; border-radius: 6px; +} +.ge-preflight-close:hover { background: rgba(255, 255, 255, 0.08); color: #fff; } +.ge-preflight-rows { display: flex; flex-direction: column; gap: 8px; margin: 14px 0; } +.ge-preflight-row { + display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border-radius: 9px; + background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.06); +} +.ge-preflight-row.is-done { border-color: rgba(90, 200, 130, 0.35); } +.ge-preflight-row.is-todo { border-color: rgba(230, 120, 110, 0.4); } +.ge-preflight-badge { + flex: 0 0 auto; width: 20px; height: 20px; border-radius: 50%; + display: flex; align-items: center; justify-content: center; + font-size: 12px; font-weight: 700; margin-top: 1px; +} +.ge-preflight-row.is-done .ge-preflight-badge { background: rgba(70, 180, 110, 0.2); color: #5fd08a; } +.ge-preflight-row.is-todo .ge-preflight-badge { background: rgba(220, 90, 80, 0.18); color: #ff8a7d; } +.ge-preflight-row.is-optional { border-color: rgba(210, 180, 90, 0.35); } +.ge-preflight-row.is-optional .ge-preflight-badge { background: rgba(210, 180, 90, 0.16); color: #e0c266; } +.ge-preflight-opt { + margin-left: 6px; + padding: 1px 6px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.08); + color: var(--fg-muted); + font-size: 9px; + letter-spacing: 0.05em; + text-transform: uppercase; + vertical-align: middle; +} +.ge-preflight-body { flex: 1 1 auto; min-width: 0; } +.ge-preflight-title { font-size: 13px; font-weight: 600; } +.ge-preflight-hint { font-size: 11.5px; color: #a9b0ba; margin-top: 2px; } +.ge-preflight-detail { font-size: 11px; color: #7f8792; margin-top: 3px; font-style: italic; } +.ge-preflight-actions { flex: 0 0 auto; display: flex; align-items: center; gap: 8px; } +.ge-preflight-act { + background: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.14); + color: #dfe3e8; font-size: 11px; padding: 4px 9px; border-radius: 7px; cursor: pointer; white-space: nowrap; +} +.ge-preflight-act:hover { background: rgba(255, 255, 255, 0.16); } +.ge-preflight-manual { display: flex; align-items: center; cursor: pointer; } +.ge-preflight-foot { + display: flex; align-items: center; justify-content: space-between; gap: 12px; + border-top: 1px solid rgba(255, 255, 255, 0.08); padding-top: 12px; +} +.ge-preflight-remember { font-size: 11.5px; color: #a9b0ba; display: flex; align-items: center; gap: 6px; cursor: pointer; } +.ge-preflight-foot-actions { display: flex; align-items: center; gap: 10px; } +.ge-preflight-summary { font-size: 11.5px; color: #8fd6a8; } +.ge-preflight-start { + background: #3d6ea5; border: 0; color: #fff; font-size: 12.5px; font-weight: 600; + padding: 7px 16px; border-radius: 8px; cursor: pointer; +} +.ge-preflight-start:hover { background: #4a80bd; } +.ge-setup-btn { + background: transparent; border: 1px solid rgba(255, 255, 255, 0.16); color: #c8cdd4; + font-size: 11px; padding: 2px 8px; border-radius: 6px; cursor: pointer; margin-left: 8px; +} +.ge-setup-btn:hover { background: rgba(255, 255, 255, 0.1); color: #fff; } +@media (max-width: 700px) { + .ge-preflight-card { padding: 13px 14px; } +} + +/* ── Quick Edit — premium look ────────────────────────────────────────── */ +@property --ge-qe-angle { + syntax: ''; + initial-value: 0deg; + inherits: false; +} +.ge-ai-command { + border: 1px solid transparent; + border-radius: 15px; + padding: 9px; + background: + linear-gradient( + color-mix(in srgb, var(--panel, #232323) 95%, transparent), + color-mix(in srgb, var(--panel, #232323) 90%, transparent) + ) padding-box, + conic-gradient(from 215deg, + color-mix(in srgb, var(--accent, var(--red)) 78%, transparent), + color-mix(in srgb, #7aa2ff 52%, transparent) 34%, + color-mix(in srgb, var(--accent, var(--red)) 18%, transparent) 58%, + color-mix(in srgb, var(--accent, var(--red)) 78%, transparent) + ) border-box; + box-shadow: + 0 16px 44px color-mix(in srgb, #000 46%, transparent), + 0 0 0 1px color-mix(in srgb, var(--accent, var(--red)) 10%, transparent), + inset 0 1px 0 color-mix(in srgb, #fff 9%, transparent); + backdrop-filter: blur(16px) saturate(1.25); +} +.ge-ai-command::before { + content: ""; + position: absolute; + inset: -1px; + z-index: 0; + border-radius: inherit; + padding: 1px; + background: conic-gradient(from var(--ge-qe-angle), + transparent 0 60%, + color-mix(in srgb, var(--accent, var(--red)) 88%, transparent) 78%, + color-mix(in srgb, #d6e3ff 96%, transparent) 84%, + transparent 92%); + -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + opacity: 0.8; + pointer-events: none; + animation: ge-qe-arc 7s linear infinite; +} +@keyframes ge-qe-arc { to { --ge-qe-angle: 360deg; } } +.ge-ai-command-head { padding-bottom: 8px; } +.ge-ai-command-title { + letter-spacing: 0.03em; + background: linear-gradient(90deg, + color-mix(in srgb, var(--fg) 92%, #fff), + color-mix(in srgb, var(--accent, var(--red)) 70%, var(--fg))); + -webkit-background-clip: text; background-clip: text; color: transparent; +} +.ge-ai-command .ge-btn-ai-mark { + background: linear-gradient(135deg, + color-mix(in srgb, var(--accent, var(--red)) 100%, #fff 22%), + #9ec1ff); + -webkit-background-clip: text; background-clip: text; color: transparent; + animation: ge-qe-spark 3.6s ease-in-out infinite; +} +@keyframes ge-qe-spark { + 0%, 100% { opacity: 0.82; transform: scale(1) rotate(0); } + 50% { opacity: 1; transform: scale(1.14) rotate(18deg); } +} +.ge-ai-command-input { + height: 36px; + border-radius: 10px; + border-color: color-mix(in srgb, var(--accent, var(--red)) 22%, var(--border)); + background: + linear-gradient(color-mix(in srgb, #fff 5%, transparent), transparent 55%), + color-mix(in srgb, var(--bg) 72%, #000 28%); + box-shadow: inset 0 1px 2px color-mix(in srgb, #000 42%, transparent); + transition: border-color 0.15s ease, box-shadow 0.15s ease, background 0.15s ease; +} +.ge-ai-command-input:focus { + border-color: color-mix(in srgb, var(--accent, var(--red)) 82%, transparent); + box-shadow: + inset 0 1px 2px color-mix(in srgb, #000 42%, transparent), + 0 0 0 3px color-mix(in srgb, var(--accent, var(--red)) 22%, transparent); +} +.ge-ai-command-clear { height: 36px; } +.ge-ai-command-run { + height: 36px !important; + min-width: 36px; + width: 36px; + border-radius: 10px; + background: linear-gradient(135deg, + color-mix(in srgb, var(--accent, var(--red)) 100%, #fff 14%), + color-mix(in srgb, var(--accent, var(--red)) 62%, #6f8dff)); + box-shadow: + 0 6px 18px color-mix(in srgb, var(--accent, var(--red)) 46%, transparent), + inset 0 1px 0 color-mix(in srgb, #fff 32%, transparent); + transition: transform 0.12s ease, box-shadow 0.16s ease, filter 0.16s ease, background 0.16s ease; +} +.ge-ai-command-run:hover { + background: linear-gradient(135deg, + color-mix(in srgb, var(--accent, var(--red)) 100%, #fff 20%), + color-mix(in srgb, var(--accent, var(--red)) 60%, #7a95ff)); + filter: brightness(1.06); + transform: translateY(-1px); + box-shadow: 0 9px 24px color-mix(in srgb, var(--accent, var(--red)) 58%, transparent); +} +.ge-ai-command-run:active { transform: translateY(0); filter: brightness(0.98); } +.ge-ai-command-suggestions { + border-radius: 12px; + border-color: color-mix(in srgb, var(--accent, var(--red)) 26%, var(--border)); + background: color-mix(in srgb, var(--panel, #232323) 97%, transparent); + box-shadow: 0 16px 36px color-mix(in srgb, #000 42%, transparent); +} +.ge-ai-command-suggestion { + border-radius: 8px; + transition: background 0.12s ease, transform 0.12s ease; +} +.ge-ai-command-suggestion:hover, +.ge-ai-command-suggestion.active { + background: color-mix(in srgb, var(--accent, var(--red)) 16%, transparent); + transform: translateX(1px); +} +.ge-ai-command-status { font-weight: 600; } +.ge-ai-command-collapsed { + border-radius: 999px; + padding: 3px 13px; +} +.ge-ai-command-collapsed:hover, +.ge-ai-command-collapsed:focus-within { + box-shadow: + 0 10px 26px color-mix(in srgb, #000 30%, transparent), + 0 0 0 1px color-mix(in srgb, var(--accent, var(--red)) 30%, transparent); +} +@media (prefers-reduced-motion: reduce) { + .ge-ai-command::before, + .ge-ai-command .ge-btn-ai-mark { animation: none; } +} + +/* Quick Edit routing-mode selector (Auto / Quick / Agent / Image): uses the + standard ctl-select look, pushed to the right of the header row. */ +.ge-ai-command .ge-ai-command-mode { + margin-left: auto; + margin-right: 6px; + max-width: 104px; +} + +/* Mobile footer fix (audit 2026-10-11 #1): the footer overflowed horizontally + (scrollWidth 532 vs clientWidth 378) so the zoom controls sat off-screen. + On phones drop the wide text readouts and tighten the controls so history + + zoom fit. */ +@media (max-width: 700px) { + .ge-editor-footer { + gap: 6px; + padding: 3px 6px; + overflow: hidden; + min-width: 0; + } + .ge-editor-footer .ge-status-tool, + .ge-editor-footer .ge-status-model, + .ge-editor-footer .ge-canvas-size { + display: none; + } + .ge-footer-history { margin-right: 2px; } + .ge-footer-zoom { gap: 3px; min-width: 0; } + .ge-footer-zoom > .ge-btn, + .ge-footer-history > .ge-btn { min-width: 26px; } + /* Float the footer above the peek/expanded layers sheet so its zoom/setup + controls stay tappable (position/left/right/bottom set in JS). */ + .ge-editor-footer.ge-footer-floating { + border: 1px solid var(--border); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 4px 14px rgba(0, 0, 0, 0.28); + } +} + +/* EVAL: an editor toast fired while a floating panel is open (Adjust/Develop, + FX, Transform, filter modal, History) is moved to the bottom-centre by + ui.js so it never covers the panel's controls. */ +body.ge-editor-open .toast.toast-editor-bottom { + top: auto; + bottom: 84px; + left: 12px; + right: 12px; + max-width: none; + min-width: 0; +} + +/* Audit #7 / EVAL: on a phone, a toast at the viewport top overlaps the + editor's menu row AND the top-docked Transform/Adjust/FX popups (Develop, + Filters). While the editor is open, anchor shared toasts at the bottom, + centred just above the floating footer, so they never cover the controls. + The horizontal slide animation is preserved (the toast stays full-width). */ +@media (max-width: 700px) { + body.ge-editor-open .toast { + top: auto; + bottom: 84px; + left: 12px; + right: 12px; + max-width: none; + min-width: 0; + } +} + +/* Mobile touch targets (audit 2026-10-11 #3): keep the primary editor controls + at least 44x44 CSS px for a comfortable tap. Scoped to the open editor on + phones — desktop is untouched. */ +@media (max-width: 700px) { + .ge-toolbar .ge-tool-btn { + min-width: 44px; + min-height: 44px; + height: 44px; + } + /* Tap targets: only the primary in-sheet controls (layers footer, editor + footer, panels overlay) get the full 44px box. Applying this to every + editor button inflated the top menu row and clipped its labels, so the + topbar/menu buttons keep their natural size. */ + .ge-layers-footer .ge-btn, + .ge-editor-footer .ge-btn, + .ge-mobile-panels .ge-btn { + min-height: 44px; + min-width: 44px; + } + body.ge-editor-open .ge-ai-command-toggle, + body.ge-editor-open .ge-setup-btn { + min-height: 44px; + } + body.ge-editor-open .ge-layer-opacity, + body.ge-editor-open .ge-ctl-select, + body.ge-editor-open .ge-ctl-num { + min-height: 44px; + } + /* Horizontal-scroll fix (audit 2026-10-11 #4): the menu row and tool rail stay + single-row (wrapping them made the chrome 2-3x taller), but their sideways + scroll is contained so it never drags the page or overshoots the fade. */ + .ge-topbar-left, + .ge-toolbar, + .ge-dock-tabs { + overscroll-behavior-x: contain; + -webkit-overflow-scrolling: touch; + } +} + + +/* Colour panels: chips are round and the redundant inner title is dropped + (the dock tab strip already names each panel). Adjustments get SVG icons. */ +.ge-mini-swatch, +.ge-swatch-grid .ge-swatch, +.ge-swatch-body .ge-color-input.cp-swatch-input { + border-radius: 50%; +} +.ge-gradient-swatch { border-radius: 999px; } +#ge-panel-swatches > .ge-panel-title, +#ge-panel-gradients > .ge-panel-title, +#ge-panel-patterns > .ge-panel-title, +#ge-panel-adjustments > .ge-panel-title, +#ge-panel-properties > .ge-panel-title, +#ge-panel-histogram > .ge-panel-title { + display: none; +} +.ge-adjustment-grid .ge-adj-btn { + display: flex; + align-items: center; + gap: 5px; + min-height: 0; + padding: 3px 6px; +} +.ge-adj-icon { display: inline-flex; flex: 0 0 auto; } +.ge-adj-icon svg { width: 14px; height: 14px; display: block; } +.ge-adj-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + +/* Mobile panel access (≤ 700 px). The desktop dock is bypassed on phones, so + the studio panels are mounted in a compact overlay opened from a "Panels" + button in the layers header (see right-panel.js). */ +@media (max-width: 700px) { + .ge-layers-panels-btn { + order: 1; + margin-left: 8px; + min-height: 44px; + min-width: 44px; + padding: 0 12px; + border-radius: 8px; + } + .ge-mobile-panels { + position: fixed; + left: 0; + right: 0; + bottom: 0; + z-index: 70; + display: flex; + flex-direction: column; + max-height: 62vh; + background: var(--panel, #1b1f27); + border-top: 1px solid var(--border, #2a313c); + border-radius: 12px 12px 0 0; + box-shadow: 0 -6px 20px rgba(0, 0, 0, 0.35); + overflow: hidden; + } + .ge-mobile-panels[hidden] { display: none; } + .ge-mobile-panels-head { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + border-bottom: 1px solid var(--border, #2a313c); + } + .ge-mobile-panels-title { + font-size: 12px; + letter-spacing: 0.06em; + text-transform: uppercase; + opacity: 0.7; + } + .ge-mobile-panels-close { min-width: 44px; min-height: 44px; } + .ge-mobile-panels .ge-dock-tabbar { padding: 8px 12px 4px; } + .ge-mobile-panels .ge-dock-select { width: 100%; min-height: 44px; } + .ge-mobile-panels .ge-dock-panels { overflow-y: auto; padding: 4px 12px 16px; } +} + +/* Mobile layer rows: only the ACTIVE layer shows its opacity slider, and the + slider stays a thin fixed-width track instead of stretching edge-to-edge + over the thumbnail and the fx/action strip. The panel's Blend/Opacity row is + the primary touch control for opacity. */ +@media (max-width: 700px) { + .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item) > .ge-layer-opacity-row { + display: none; + } + .ge-layers-list > .ge-layer-item:not(.ge-adj-sub-item):not(.ge-mask-sub-item).active > .ge-layer-opacity-row { + display: flex; + } + body.ge-editor-open .ge-layer-item .ge-layer-opacity { + min-height: 0 !important; + height: 18px !important; + flex: 0 0 auto !important; + width: 140px !important; + } +} + +/* Mobile layers footer: keep the add / fx / merge / Fill tools on ONE row + (they were wrapping and orphaning "Fill" on its own line). */ +@media (max-width: 700px) { + .ge-layers-footer { + flex-wrap: nowrap; + gap: 4px; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .ge-layers-footer .ge-layer-header-tools, + .ge-layers-footer .ge-layer-tools { + flex-wrap: nowrap; + gap: 3px; + } + /* Spread the tool row across the full sheet width instead of leaving a + big empty right gutter (the empty #ge-layer-tools hook used to hold the + right edge via space-between). */ + .ge-layers-footer .ge-layer-header-tools { + flex: 1 1 auto; + justify-content: space-between; + } + .ge-layers-footer .ge-layer-tools:empty { display: none; } + .ge-layers-footer .ge-btn { + min-width: 40px !important; + flex: 0 0 auto; + } + .ge-layers-footer #ge-layer-fill { + min-width: 52px !important; + width: auto !important; + padding: 0 10px !important; + } +} + +/* Tool-rail "more tools" chevron. The rail is wrapped (see galleryEditor.js) + so an overlay chevron can sit on its right edge on phones, outside the + scrolling element (and thus outside its mask fade). */ +.ge-toolbar-wrap { display: contents; } +.ge-tool-more { display: none; } +@media (max-width: 700px) { + .ge-toolbar-wrap { + display: flex; + flex: 0 0 auto; + width: 100%; + position: relative; + align-items: stretch; + } + .ge-toolbar-wrap > .ge-toolbar { flex: 1 1 auto; min-width: 0; } + .ge-tool-more { + display: none; + position: absolute; + top: 0; + bottom: 0; + right: 0; + width: 22px; + align-items: center; + justify-content: center; + padding: 0; + border: none; + background: transparent; + color: var(--fg, #e6e9ef); + font-size: 20px; + line-height: 1; + cursor: pointer; + z-index: 2; + } + .ge-tool-more.is-visible { display: flex; } + /* Keep the floating editor footer from stacking on the Quick Edit card. The + card owns the bottom of the canvas while it is open, so the footer (zoom / + Setup / AI settings) hides until it closes. */ + body:has(.ge-ai-command:not(.ge-ai-command-collapsed)) .ge-editor-footer.ge-footer-floating { + display: none; + } +} + +/* On phones the Quick Edit card sits between the tool rail and the peek layers + sheet, so the suggestion popup cannot grow upward without being clipped by + the rail. Show the suggestions as a compact horizontal chip row inside the + card instead. */ +@media (max-width: 700px) { + .ge-ai-command:not(.ge-ai-command-collapsed) { + display: flex; + flex-direction: column; + } + .ge-ai-command-head { order: 0; } + .ge-ai-command-suggestions { + position: static; + order: 1; + left: auto; + right: auto; + bottom: auto; + z-index: auto; + flex-direction: row; + flex-wrap: nowrap; + gap: 6px; + max-height: none; + padding: 0 0 6px; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; + } + .ge-ai-command-suggestions::-webkit-scrollbar { display: none; } + .ge-ai-command-form { order: 2; } + .ge-ai-command-status { order: 3; } + .ge-ai-command-stack { order: 4; } + .ge-ai-command-progress { order: 5; } + .ge-ai-command-suggestion { + width: auto; + flex: 0 0 auto; + grid-template-columns: none; + gap: 0; + min-height: 30px; + padding: 5px 11px; + border: 1px solid color-mix(in srgb, var(--accent, var(--red)) 32%, var(--border)); + border-radius: 16px; + background: color-mix(in srgb, var(--panel, var(--bg)) 82%, transparent); + } + .ge-ai-command-suggestion-icon, + .ge-ai-command-suggestion-kind, + .ge-ai-command-suggestion-hint { + display: none; + } + .ge-ai-command-suggestion-main { + white-space: nowrap; + font-size: 11px; + font-weight: 550; + } +} + +/* While the editor is open on a phone the app-shell chat selector sits right + above the editor chrome; lift it above the 70% default so it stays legible. */ +@media (max-width: 700px) { + body.ge-editor-open .chat-meta-overlay { + display: none !important; + } + body.ge-editor-open .tour-hint { + display: none !important; + } + body.ge-editor-open { + font-family: var(--font-family, 'Fira Code', monospace); + } +} + +/* Phone menu bar: tighten the Photoshop menus and keep the Save control + icon-only so the twelve menus + Import + Save are not crowded. */ +@media (max-width: 700px) { + .ge-topbar-left .ge-stacked-btn { + font-size: 11px; + padding: 0 6px !important; + } + .ge-topbar.ge-topbar-compact #ge-draft-status { + display: none; + } +} + +/* Phone editor: dock the zoom/Setup footer flush to the Layers sheet. The + footer spans the full width with square corners so canvas bottom == footer + top == sheet top, with no rounded-card seam or dead space between them, and + the sheet's grab handle (which would read as a stray strip) is hidden. */ +@media (max-width: 700px) { + .ge-editor-footer.ge-footer-floating { + border-radius: 0; + border-left: 0; + border-right: 0; + border-bottom: 0; + } + body.ge-footer-docked .ge-right-panel .ge-layers-grab { + display: none !important; + } +} + +/* Long dropdown menus (Filter especially) can grow past the viewport bottom; + cap them to the space below the topbar and let them scroll. */ +.ge-image-menu, +.ge-layer-menu, +.ge-filter-menu, +.ge-edit-menu, +.ge-selection-menu, +.ge-type-menu, +.ge-3d-menu, +.ge-view-menu, +.ge-window-menu, +.ge-plugins-menu, +.ge-help-menu { + max-height: min(560px, 70vh) !important; + overflow-y: auto !important; + overscroll-behavior: contain; + scrollbar-width: auto !important; + scrollbar-color: auto !important; + -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent); + mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent); +} +.ge-image-menu::-webkit-scrollbar, +.ge-layer-menu::-webkit-scrollbar, +.ge-filter-menu::-webkit-scrollbar, +.ge-edit-menu::-webkit-scrollbar, +.ge-selection-menu::-webkit-scrollbar, +.ge-type-menu::-webkit-scrollbar, +.ge-3d-menu::-webkit-scrollbar, +.ge-view-menu::-webkit-scrollbar, +.ge-window-menu::-webkit-scrollbar, +.ge-plugins-menu::-webkit-scrollbar, +.ge-help-menu::-webkit-scrollbar { + width: 8px; + height: 8px; +} +.ge-image-menu::-webkit-scrollbar-track, +.ge-layer-menu::-webkit-scrollbar-track, +.ge-filter-menu::-webkit-scrollbar-track, +.ge-edit-menu::-webkit-scrollbar-track, +.ge-selection-menu::-webkit-scrollbar-track, +.ge-type-menu::-webkit-scrollbar-track, +.ge-3d-menu::-webkit-scrollbar-track, +.ge-view-menu::-webkit-scrollbar-track, +.ge-window-menu::-webkit-scrollbar-track, +.ge-plugins-menu::-webkit-scrollbar-track, +.ge-help-menu::-webkit-scrollbar-track { + background: var(--panel); +} +.ge-image-menu::-webkit-scrollbar-thumb, +.ge-layer-menu::-webkit-scrollbar-thumb, +.ge-filter-menu::-webkit-scrollbar-thumb, +.ge-edit-menu::-webkit-scrollbar-thumb, +.ge-selection-menu::-webkit-scrollbar-thumb, +.ge-type-menu::-webkit-scrollbar-thumb, +.ge-3d-menu::-webkit-scrollbar-thumb, +.ge-view-menu::-webkit-scrollbar-thumb, +.ge-window-menu::-webkit-scrollbar-thumb, +.ge-plugins-menu::-webkit-scrollbar-thumb, +.ge-help-menu::-webkit-scrollbar-thumb { + background-color: var(--red); + border-radius: 4px; +} +.ge-image-menu::-webkit-scrollbar, +.ge-layer-menu::-webkit-scrollbar, +.ge-filter-menu::-webkit-scrollbar, +.ge-edit-menu::-webkit-scrollbar, +.ge-selection-menu::-webkit-scrollbar, +.ge-type-menu::-webkit-scrollbar, +.ge-3d-menu::-webkit-scrollbar, +.ge-view-menu::-webkit-scrollbar, +.ge-window-menu::-webkit-scrollbar, +.ge-plugins-menu::-webkit-scrollbar, +.ge-help-menu::-webkit-scrollbar { + width: 8px; +} +.ge-image-menu::-webkit-scrollbar-track, +.ge-layer-menu::-webkit-scrollbar-track, +.ge-filter-menu::-webkit-scrollbar-track, +.ge-edit-menu::-webkit-scrollbar-track, +.ge-selection-menu::-webkit-scrollbar-track, +.ge-type-menu::-webkit-scrollbar-track, +.ge-3d-menu::-webkit-scrollbar-track, +.ge-view-menu::-webkit-scrollbar-track, +.ge-window-menu::-webkit-scrollbar-track, +.ge-plugins-menu::-webkit-scrollbar-track, +.ge-help-menu::-webkit-scrollbar-track { + background: var(--panel); +} +.ge-image-menu::-webkit-scrollbar-thumb, +.ge-layer-menu::-webkit-scrollbar-thumb, +.ge-filter-menu::-webkit-scrollbar-thumb, +.ge-edit-menu::-webkit-scrollbar-thumb, +.ge-selection-menu::-webkit-scrollbar-thumb, +.ge-type-menu::-webkit-scrollbar-thumb, +.ge-3d-menu::-webkit-scrollbar-thumb, +.ge-view-menu::-webkit-scrollbar-thumb, +.ge-window-menu::-webkit-scrollbar-thumb, +.ge-plugins-menu::-webkit-scrollbar-thumb, +.ge-help-menu::-webkit-scrollbar-thumb { + background: var(--red); + border-radius: 4px; + border: 2px solid var(--panel); +} +/* Custom scroll indicator: macOS/headless browsers hide overlay scrollbars, so + draw a thin 3px thumb driven by scrollTop inside each dropdown menu. */ +.ge-menu-thumb { + position: absolute; + top: 0; + right: 2px; + width: 3px; + min-height: 18px; + border-radius: 2px; + background: var(--red); + pointer-events: none; + display: none; + z-index: 3; +} + +/* Busy veil shown while a heavy pixel filter commits on a large document. */ +.ge-busy-veil { + position: fixed; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.35); + z-index: 60; + pointer-events: none; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 14px; + border: 1px solid var(--border); + border-radius: 6px; + background: var(--panel); + color: var(--fg); + font: inherit; + font-size: 12px; +} +.ge-busy-spin { + width: 14px; + height: 14px; + border: 2px solid color-mix(in srgb, var(--fg) 25%, transparent); + border-top-color: var(--red); + border-radius: 50%; + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { + to { transform: rotate(360deg); } +} + +/* Flyout submenu panels: compact rows + a viewport-bounded height so long + lists (the 19 Image > Adjustments entries) all fit or scroll. */ +.ge-menu-parent + .ge-submenu .dropdown-item-compact { + min-height: 0 !important; + height: auto !important; + padding: 3px 10px !important; + line-height: 1.2 !important; + font-size: 12px !important; +} +.ge-submenu { + max-height: calc(100vh - 180px) !important; + overflow-y: auto !important; + scrollbar-width: auto; + scrollbar-color: auto; +} +.ge-submenu::-webkit-scrollbar { width: 8px; height: 8px; } +.ge-submenu::-webkit-scrollbar-track { background: var(--panel); } +.ge-submenu::-webkit-scrollbar-thumb { background: var(--red); border-radius: 4px; border: 2px solid var(--panel); } +.ge-filter-menu:has(.ge-menu-parent.open), +.ge-image-menu:has(.ge-menu-parent.open) { + overflow: visible !important; +} + +/* Flyout submenu panels: compact rows so long lists (e.g. the 19 Image > + Adjustments entries) fit without clipping, and let the panel scroll. */ +.ge-submenu .dropdown-item-compact { + padding-top: 2px; + padding-bottom: 2px; +} +.ge-submenu { + scrollbar-width: auto; + scrollbar-color: auto; +} +.ge-submenu::-webkit-scrollbar { width: 8px; height: 8px; } +.ge-submenu::-webkit-scrollbar-track { background: var(--panel); } +.ge-submenu::-webkit-scrollbar-thumb { background: var(--red); border-radius: 4px; border: 2px solid var(--panel); } +/* Release the parent menu's overflow clip while a flyout is open so the + panel is not cut off at the menu edge. */ +.ge-filter-menu:has(.ge-menu-parent.open), +.ge-image-menu:has(.ge-menu-parent.open) { + overflow: visible !important; +} + +/* The global "Pro tip" hint card can overlap the editor menus; hide it while + the editor is open. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* The global "Pro tip" hint card can overlap the editor menus; hide it while + the editor is open. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* The onboarding "Pro tip" tour hint floats over the editor menus; hide it + while the editor is open so it never occludes a dropdown or flyout. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* Long dropdown menus (Filter especially) can grow past the viewport bottom; + cap them to the space below the topbar and let them scroll. */ +.ge-image-menu, +.ge-layer-menu, +.ge-filter-menu, +.ge-edit-menu, +.ge-selection-menu, +.ge-type-menu, +.ge-3d-menu, +.ge-view-menu, +.ge-window-menu, +.ge-plugins-menu, +.ge-help-menu { + max-height: min(560px, 70vh) !important; + overflow-y: auto !important; + overscroll-behavior: contain; + scrollbar-width: auto !important; + scrollbar-color: auto !important; + -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent); + mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent); +} +.ge-image-menu::-webkit-scrollbar, +.ge-layer-menu::-webkit-scrollbar, +.ge-filter-menu::-webkit-scrollbar, +.ge-edit-menu::-webkit-scrollbar, +.ge-selection-menu::-webkit-scrollbar, +.ge-type-menu::-webkit-scrollbar, +.ge-3d-menu::-webkit-scrollbar, +.ge-view-menu::-webkit-scrollbar, +.ge-window-menu::-webkit-scrollbar, +.ge-plugins-menu::-webkit-scrollbar, +.ge-help-menu::-webkit-scrollbar { + width: 8px; + height: 8px; +} +.ge-image-menu::-webkit-scrollbar-track, +.ge-layer-menu::-webkit-scrollbar-track, +.ge-filter-menu::-webkit-scrollbar-track, +.ge-edit-menu::-webkit-scrollbar-track, +.ge-selection-menu::-webkit-scrollbar-track, +.ge-type-menu::-webkit-scrollbar-track, +.ge-3d-menu::-webkit-scrollbar-track, +.ge-view-menu::-webkit-scrollbar-track, +.ge-window-menu::-webkit-scrollbar-track, +.ge-plugins-menu::-webkit-scrollbar-track, +.ge-help-menu::-webkit-scrollbar-track { + background: var(--panel); +} +.ge-image-menu::-webkit-scrollbar-thumb, +.ge-layer-menu::-webkit-scrollbar-thumb, +.ge-filter-menu::-webkit-scrollbar-thumb, +.ge-edit-menu::-webkit-scrollbar-thumb, +.ge-selection-menu::-webkit-scrollbar-thumb, +.ge-type-menu::-webkit-scrollbar-thumb, +.ge-3d-menu::-webkit-scrollbar-thumb, +.ge-view-menu::-webkit-scrollbar-thumb, +.ge-window-menu::-webkit-scrollbar-thumb, +.ge-plugins-menu::-webkit-scrollbar-thumb, +.ge-help-menu::-webkit-scrollbar-thumb { + background-color: var(--red); + border-radius: 4px; +} +.ge-image-menu::-webkit-scrollbar, +.ge-layer-menu::-webkit-scrollbar, +.ge-filter-menu::-webkit-scrollbar, +.ge-edit-menu::-webkit-scrollbar, +.ge-selection-menu::-webkit-scrollbar, +.ge-type-menu::-webkit-scrollbar, +.ge-3d-menu::-webkit-scrollbar, +.ge-view-menu::-webkit-scrollbar, +.ge-window-menu::-webkit-scrollbar, +.ge-plugins-menu::-webkit-scrollbar, +.ge-help-menu::-webkit-scrollbar { + width: 8px; +} +.ge-image-menu::-webkit-scrollbar-track, +.ge-layer-menu::-webkit-scrollbar-track, +.ge-filter-menu::-webkit-scrollbar-track, +.ge-edit-menu::-webkit-scrollbar-track, +.ge-selection-menu::-webkit-scrollbar-track, +.ge-type-menu::-webkit-scrollbar-track, +.ge-3d-menu::-webkit-scrollbar-track, +.ge-view-menu::-webkit-scrollbar-track, +.ge-window-menu::-webkit-scrollbar-track, +.ge-plugins-menu::-webkit-scrollbar-track, +.ge-help-menu::-webkit-scrollbar-track { + background: var(--panel); +} +.ge-image-menu::-webkit-scrollbar-thumb, +.ge-layer-menu::-webkit-scrollbar-thumb, +.ge-filter-menu::-webkit-scrollbar-thumb, +.ge-edit-menu::-webkit-scrollbar-thumb, +.ge-selection-menu::-webkit-scrollbar-thumb, +.ge-type-menu::-webkit-scrollbar-thumb, +.ge-3d-menu::-webkit-scrollbar-thumb, +.ge-view-menu::-webkit-scrollbar-thumb, +.ge-window-menu::-webkit-scrollbar-thumb, +.ge-plugins-menu::-webkit-scrollbar-thumb, +.ge-help-menu::-webkit-scrollbar-thumb { + background: var(--red); + border-radius: 4px; + border: 2px solid var(--panel); +} +/* Custom scroll indicator: macOS/headless browsers hide overlay scrollbars, so + draw a thin 3px thumb driven by scrollTop inside each dropdown menu. */ +.ge-menu-thumb { + position: absolute; + top: 0; + right: 2px; + width: 3px; + min-height: 18px; + border-radius: 2px; + background: var(--red); + pointer-events: none; + display: none; + z-index: 3; +} + +/* Busy veil shown while a heavy pixel filter commits on a large document. */ +.ge-busy-veil { + position: fixed; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.35); + z-index: 60; + pointer-events: none; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 14px; + border: 1px solid var(--border); + border-radius: 6px; + background: var(--panel); + color: var(--fg); + font: inherit; + font-size: 12px; +} +.ge-busy-spin { + width: 14px; + height: 14px; + border: 2px solid color-mix(in srgb, var(--fg) 25%, transparent); + border-top-color: var(--red); + border-radius: 50%; + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { + to { transform: rotate(360deg); } +} + +/* Flyout submenu panels: compact rows + a viewport-bounded height so long + lists (the 19 Image > Adjustments entries) all fit or scroll. */ +.ge-menu-parent + .ge-submenu .dropdown-item-compact { + min-height: 0 !important; + height: auto !important; + padding: 3px 10px !important; + line-height: 1.2 !important; + font-size: 12px !important; +} +.ge-submenu { + max-height: calc(100vh - 180px) !important; + overflow-y: auto !important; + scrollbar-width: auto; + scrollbar-color: auto; +} +.ge-submenu::-webkit-scrollbar { width: 8px; height: 8px; } +.ge-submenu::-webkit-scrollbar-track { background: var(--panel); } +.ge-submenu::-webkit-scrollbar-thumb { background: var(--red); border-radius: 4px; border: 2px solid var(--panel); } +.ge-filter-menu:has(.ge-menu-parent.open), +.ge-image-menu:has(.ge-menu-parent.open) { + overflow: visible !important; +} + +/* Flyout submenu panels: compact rows so long lists (e.g. the 19 Image > + Adjustments entries) fit without clipping, and let the panel scroll. */ +.ge-submenu .dropdown-item-compact { + padding-top: 2px; + padding-bottom: 2px; +} +.ge-submenu { + scrollbar-width: auto; + scrollbar-color: auto; +} +.ge-submenu::-webkit-scrollbar { width: 8px; height: 8px; } +.ge-submenu::-webkit-scrollbar-track { background: var(--panel); } +.ge-submenu::-webkit-scrollbar-thumb { background: var(--red); border-radius: 4px; border: 2px solid var(--panel); } +/* Release the parent menu's overflow clip while a flyout is open so the + panel is not cut off at the menu edge. */ +.ge-filter-menu:has(.ge-menu-parent.open), +.ge-image-menu:has(.ge-menu-parent.open) { + overflow: visible !important; +} + +/* The global "Pro tip" hint card can overlap the editor menus; hide it while + the editor is open. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* The global "Pro tip" hint card can overlap the editor menus; hide it while + the editor is open. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* The onboarding "Pro tip" tour hint floats over the editor menus; hide it + while the editor is open so it never occludes a dropdown or flyout. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* Phone editor: while the Quick Edit card is open it owns the bottom of the + canvas. Force the layers sheet back to its peek height and hide the floating + zoom/Setup footer so neither the sheet nor the footer covers the card. */ +@media (max-width: 700px) { + body.ge-qe-open .ge-editor-footer.ge-footer-floating { + display: none !important; + } + body.ge-qe-open .ge-right-panel:not(.minimized) { + transform: translateY(calc(100% - var(--peek-height, 110px))) !important; + } +} + +/* Long dropdown menus (Filter especially) can grow past the viewport bottom; + cap them to the space below the topbar and let them scroll. */ +.ge-image-menu, +.ge-layer-menu, +.ge-filter-menu, +.ge-edit-menu, +.ge-selection-menu, +.ge-type-menu, +.ge-3d-menu, +.ge-view-menu, +.ge-window-menu, +.ge-plugins-menu, +.ge-help-menu { + max-height: min(560px, 70vh) !important; + overflow-y: auto !important; + overscroll-behavior: contain; + scrollbar-width: auto !important; + scrollbar-color: auto !important; + -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent); + mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent); +} +.ge-image-menu::-webkit-scrollbar, +.ge-layer-menu::-webkit-scrollbar, +.ge-filter-menu::-webkit-scrollbar, +.ge-edit-menu::-webkit-scrollbar, +.ge-selection-menu::-webkit-scrollbar, +.ge-type-menu::-webkit-scrollbar, +.ge-3d-menu::-webkit-scrollbar, +.ge-view-menu::-webkit-scrollbar, +.ge-window-menu::-webkit-scrollbar, +.ge-plugins-menu::-webkit-scrollbar, +.ge-help-menu::-webkit-scrollbar { + width: 8px; + height: 8px; +} +.ge-image-menu::-webkit-scrollbar-track, +.ge-layer-menu::-webkit-scrollbar-track, +.ge-filter-menu::-webkit-scrollbar-track, +.ge-edit-menu::-webkit-scrollbar-track, +.ge-selection-menu::-webkit-scrollbar-track, +.ge-type-menu::-webkit-scrollbar-track, +.ge-3d-menu::-webkit-scrollbar-track, +.ge-view-menu::-webkit-scrollbar-track, +.ge-window-menu::-webkit-scrollbar-track, +.ge-plugins-menu::-webkit-scrollbar-track, +.ge-help-menu::-webkit-scrollbar-track { + background: var(--panel); +} +.ge-image-menu::-webkit-scrollbar-thumb, +.ge-layer-menu::-webkit-scrollbar-thumb, +.ge-filter-menu::-webkit-scrollbar-thumb, +.ge-edit-menu::-webkit-scrollbar-thumb, +.ge-selection-menu::-webkit-scrollbar-thumb, +.ge-type-menu::-webkit-scrollbar-thumb, +.ge-3d-menu::-webkit-scrollbar-thumb, +.ge-view-menu::-webkit-scrollbar-thumb, +.ge-window-menu::-webkit-scrollbar-thumb, +.ge-plugins-menu::-webkit-scrollbar-thumb, +.ge-help-menu::-webkit-scrollbar-thumb { + background-color: var(--red); + border-radius: 4px; +} +.ge-image-menu::-webkit-scrollbar, +.ge-layer-menu::-webkit-scrollbar, +.ge-filter-menu::-webkit-scrollbar, +.ge-edit-menu::-webkit-scrollbar, +.ge-selection-menu::-webkit-scrollbar, +.ge-type-menu::-webkit-scrollbar, +.ge-3d-menu::-webkit-scrollbar, +.ge-view-menu::-webkit-scrollbar, +.ge-window-menu::-webkit-scrollbar, +.ge-plugins-menu::-webkit-scrollbar, +.ge-help-menu::-webkit-scrollbar { + width: 8px; +} +.ge-image-menu::-webkit-scrollbar-track, +.ge-layer-menu::-webkit-scrollbar-track, +.ge-filter-menu::-webkit-scrollbar-track, +.ge-edit-menu::-webkit-scrollbar-track, +.ge-selection-menu::-webkit-scrollbar-track, +.ge-type-menu::-webkit-scrollbar-track, +.ge-3d-menu::-webkit-scrollbar-track, +.ge-view-menu::-webkit-scrollbar-track, +.ge-window-menu::-webkit-scrollbar-track, +.ge-plugins-menu::-webkit-scrollbar-track, +.ge-help-menu::-webkit-scrollbar-track { + background: var(--panel); +} +.ge-image-menu::-webkit-scrollbar-thumb, +.ge-layer-menu::-webkit-scrollbar-thumb, +.ge-filter-menu::-webkit-scrollbar-thumb, +.ge-edit-menu::-webkit-scrollbar-thumb, +.ge-selection-menu::-webkit-scrollbar-thumb, +.ge-type-menu::-webkit-scrollbar-thumb, +.ge-3d-menu::-webkit-scrollbar-thumb, +.ge-view-menu::-webkit-scrollbar-thumb, +.ge-window-menu::-webkit-scrollbar-thumb, +.ge-plugins-menu::-webkit-scrollbar-thumb, +.ge-help-menu::-webkit-scrollbar-thumb { + background: var(--red); + border-radius: 4px; + border: 2px solid var(--panel); +} +/* Custom scroll indicator: macOS/headless browsers hide overlay scrollbars, so + draw a thin 3px thumb driven by scrollTop inside each dropdown menu. */ +.ge-menu-thumb { + position: absolute; + top: 0; + right: 2px; + width: 3px; + min-height: 18px; + border-radius: 2px; + background: var(--red); + pointer-events: none; + display: none; + z-index: 3; +} + +/* Busy veil shown while a heavy pixel filter commits on a large document. */ +.ge-busy-veil { + position: fixed; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.35); + z-index: 60; + pointer-events: none; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 14px; + border: 1px solid var(--border); + border-radius: 6px; + background: var(--panel); + color: var(--fg); + font: inherit; + font-size: 12px; +} +.ge-busy-spin { + width: 14px; + height: 14px; + border: 2px solid color-mix(in srgb, var(--fg) 25%, transparent); + border-top-color: var(--red); + border-radius: 50%; + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { + to { transform: rotate(360deg); } +} + +/* Flyout submenu panels: compact rows + a viewport-bounded height so long + lists (the 19 Image > Adjustments entries) all fit or scroll. */ +.ge-menu-parent + .ge-submenu .dropdown-item-compact { + min-height: 0 !important; + height: auto !important; + padding: 3px 10px !important; + line-height: 1.2 !important; + font-size: 12px !important; +} +.ge-submenu { + max-height: calc(100vh - 180px) !important; + overflow-y: auto !important; + scrollbar-width: auto; + scrollbar-color: auto; +} +.ge-submenu::-webkit-scrollbar { width: 8px; height: 8px; } +.ge-submenu::-webkit-scrollbar-track { background: var(--panel); } +.ge-submenu::-webkit-scrollbar-thumb { background: var(--red); border-radius: 4px; border: 2px solid var(--panel); } +.ge-filter-menu:has(.ge-menu-parent.open), +.ge-image-menu:has(.ge-menu-parent.open) { + overflow: visible !important; +} + +/* Flyout submenu panels: compact rows so long lists (e.g. the 19 Image > + Adjustments entries) fit without clipping, and let the panel scroll. */ +.ge-submenu .dropdown-item-compact { + padding-top: 2px; + padding-bottom: 2px; +} +.ge-submenu { + scrollbar-width: auto; + scrollbar-color: auto; +} +.ge-submenu::-webkit-scrollbar { width: 8px; height: 8px; } +.ge-submenu::-webkit-scrollbar-track { background: var(--panel); } +.ge-submenu::-webkit-scrollbar-thumb { background: var(--red); border-radius: 4px; border: 2px solid var(--panel); } +/* Release the parent menu's overflow clip while a flyout is open so the + panel is not cut off at the menu edge. */ +.ge-filter-menu:has(.ge-menu-parent.open), +.ge-image-menu:has(.ge-menu-parent.open) { + overflow: visible !important; +} + +/* The global "Pro tip" hint card can overlap the editor menus; hide it while + the editor is open. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* The global "Pro tip" hint card can overlap the editor menus; hide it while + the editor is open. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* The onboarding "Pro tip" tour hint floats over the editor menus; hide it + while the editor is open so it never occludes a dropdown or flyout. */ +body.ge-editor-open .tour-hint { + display: none !important; +} + +/* Busy veil shown while a heavy filter renders on a large document. */ +.ge-busy-veil { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + background: rgba(8, 10, 14, 0.45); + z-index: 40; +} +.ge-busy-veil.is-on { display: flex; } +.ge-busy-card { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 16px; + border-radius: 8px; + border: 1px solid var(--border); + background: var(--panel); + color: var(--fg); + font-size: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} +.ge-busy-spin { + width: 14px; + height: 14px; + border-radius: 50%; + border: 2px solid color-mix(in srgb, var(--fg) 30%, transparent); + border-top-color: var(--red); + animation: ge-busy-spin 0.8s linear infinite; +} +@keyframes ge-busy-spin { to { transform: rotate(360deg); } } + +/* Photoshop-style nested submenus (Filter groups + Image > Adjustments). + A parent row shows a chevron and reveals a flyout panel on hover/click. + Children stay inside the same menu subtree so the delegated + [data-filter-action] / [data-image-action] handlers still fire. */ +.dropdown-item-compact.ge-menu-parent { + position: relative; + justify-content: space-between; +} +.ge-submenu-caret { + margin-left: auto; + color: var(--color-muted); +} +.ge-submenu { + display: none; + position: absolute; + left: calc(100% - 2px); + top: 0; + min-width: 190px; + max-height: min(70vh, 560px); + overflow-y: auto; + background: var(--panel); + border: 1px solid var(--border); + border-radius: 6px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); + z-index: 20; + padding: 4px; +} +.ge-menu-parent.open + .ge-submenu, +.ge-menu-parent:hover + .ge-submenu, +.ge-menu-parent:focus-within + .ge-submenu, +.ge-submenu:hover { + display: block; +} +/* The dropdowns clip overflow to draw the custom scroll thumb; release the + clip while a flyout is open/hovered so it can extend past the menu edge. */ +.ge-filter-menu:has(.ge-menu-parent.open), +.ge-filter-menu:has(.ge-menu-parent:hover), +.ge-filter-menu:has(.ge-submenu:hover), +.ge-image-menu:has(.ge-menu-parent.open), +.ge-image-menu:has(.ge-menu-parent:hover), +.ge-image-menu:has(.ge-submenu:hover), +.ge-selection-menu:has(.ge-menu-parent.open), +.ge-selection-menu:has(.ge-menu-parent:hover), +.ge-selection-menu:has(.ge-submenu:hover) { + overflow: visible !important; + -webkit-mask-image: none; + mask-image: none; +} +/* The Window menu's Workspace flyout needs the same clip release. */ +.ge-window-menu:has(.ge-menu-parent.open), +.ge-window-menu:has(.ge-menu-parent:hover), +.ge-window-menu:has(.ge-submenu:hover) { + overflow: visible !important; + -webkit-mask-image: none; + mask-image: none; +} + +/* Perspective Crop overlay (tools/perspective-crop.js). */ +.ge-pcrop-overlay { + position: fixed; + inset: 0; + z-index: 10050; + pointer-events: none; +} +.ge-pcrop-svg { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + pointer-events: none; +} +.ge-pcrop-svg polygon { + fill: color-mix(in srgb, var(--red) 12%, transparent); + stroke: var(--red); + stroke-width: 1.5; + vector-effect: non-scaling-stroke; +} +.ge-pcrop-handle { + position: absolute; + width: 14px; + height: 14px; + margin: -7px 0 0 -7px; + border-radius: 50%; + background: #fff; + border: 2px solid var(--red); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5); + cursor: grab; + pointer-events: auto; + touch-action: none; +} +.ge-pcrop-handle:active { cursor: grabbing; } +.ge-pcrop-bar { + position: absolute; + display: flex; + align-items: center; + gap: 8px; + padding: 5px 8px; + border-radius: 8px; + background: var(--panel, #222); + border: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.45); + pointer-events: auto; + transform: translateY(-100%); +} +.ge-pcrop-bar .ge-pcrop-title { + font-size: 12px; + font-weight: 600; + color: var(--fg); +} +.ge-pcrop-bar .ge-pcrop-size { + font-size: 11px; + opacity: 0.75; + font-variant-numeric: tabular-nums; +} +.ge-pcrop-spacer { flex: 1 1 auto; min-width: 12px; } + +/* Mobile (390) usability: several editor controls sat well below the 44px + touch-target guideline, so they were easy to miss with a thumb. Give the + primary top-menu buttons, the Layers-header action row, the layer-opacity + slider and the Quick Edit field/run button a comfortable hit area on phones. + Sizing only — no layout/order change. */ +@media (max-width: 700px) { + .ge-topbar .ge-btn-sm, + .ge-topbar .ge-stacked-btn { + min-height: 34px; + } + #ge-undo, + #ge-redo, + #ge-history-btn, + #ge-compare-btn { + min-width: 38px; + min-height: 38px; + display: inline-flex; + align-items: center; + justify-content: center; + } + .ge-layer-opacity { + height: 30px; + } + #ge-ai-command-input { + min-height: 40px; + } + #ge-ai-command-run { + min-width: 42px; + min-height: 42px; + } +} diff --git a/static/css/documents-gallery-editor.css b/static/css/documents-gallery-editor.css index 702bb331a..76c0e01b1 100644 --- a/static/css/documents-gallery-editor.css +++ b/static/css/documents-gallery-editor.css @@ -978,3 +978,342 @@ body.doc-find-active mark.doc-find-mark.current { color: var(--accent, var(--red)); vertical-align: -2px; } + +/* Colour chips: every pickable colour input renders as a circle, regardless of + the container it sits in (options bar .ge-text-field, Character panel, + gradient stops, export matte, etc.). Forced with !important so parent + input[type="color"] rules can't square them off. */ +input.ge-color-picker, +input.ge-color-picker.cp-swatch-input, +.ge-text-field input.ge-color-picker, +.ge-swatch input.ge-color-picker, +.ge-filter-row input.ge-color-picker, +.ge-gradient-color-row input.ge-color-picker { + border-radius: 50% !important; +} +input.ge-color-picker::-webkit-color-swatch { + border: 0 !important; + border-radius: 50% !important; +} +input.ge-color-picker::-moz-color-swatch { + border: 0 !important; + border-radius: 50% !important; +} + +/* --------------------------------------------------------------------------- + Editor theme alignment: map the editor's controls onto the app's design + tokens (static/css/00-tokens.css) so the editor matches the rest of the + product. No new colours — only the shared CSS variables. +--------------------------------------------------------------------------- */ + +/* Checkboxes + radios → the app's circular dot (see 17-research.css). */ +body.ge-editor-open input[type="checkbox"], +body.ge-editor-open input[type="radio"] { + -webkit-appearance: none; + appearance: none; + width: 14px; + height: 14px; + margin: 0; + padding: 0; + border: 1.5px solid var(--border); + border-radius: 50%; + background: var(--bg); + cursor: pointer; + position: relative; + flex: 0 0 auto; + vertical-align: middle; + transition: background 0.12s ease, border-color 0.12s ease; +} +body.ge-editor-open input[type="checkbox"]:checked, +body.ge-editor-open input[type="radio"]:checked { + background: var(--fg); + border-color: var(--fg); +} +body.ge-editor-open input[type="checkbox"]:focus-visible, +body.ge-editor-open input[type="radio"]:focus-visible { + outline: 2px solid var(--red); + outline-offset: 1px; +} + +/* Selects → the app's select tokens. */ +body.ge-editor-open select { + background: var(--select-bg, var(--bg)); + color: var(--select-fg, var(--fg)); + border: 1px solid var(--border); + border-radius: 6px; +} +body.ge-editor-open select option { + background: var(--select-option-bg, var(--panel)); + color: var(--select-option-fg, var(--fg)); +} +body.ge-editor-open select option:checked, +body.ge-editor-open select option:hover { + background: var(--select-option-active-bg, var(--panel)); +} +body.ge-editor-open select:focus-visible { + outline: 1px solid var(--red); + outline-offset: 1px; +} + +/* Text / number inputs → token background, border and focus ring. */ +body.ge-editor-open input[type="text"], +body.ge-editor-open input[type="number"], +body.ge-editor-open input[type="search"], +body.ge-editor-open textarea { + background: var(--bg); + color: var(--fg); + border: 1px solid var(--border); + border-radius: 6px; +} +body.ge-editor-open input[type="text"]:focus-visible, +body.ge-editor-open input[type="number"]:focus-visible, +body.ge-editor-open input[type="search"]:focus-visible, +body.ge-editor-open textarea:focus-visible { + outline: 1px solid var(--red); + outline-offset: 1px; +} + +/* Range sliders → the app's accent. */ +body.ge-editor-open input[type="range"] { + accent-color: var(--accent, var(--red)); +} + +/* Scrollbars → the app's 8px red-thumb recipe (00-tokens.css). */ +body.ge-editor-open * { + scrollbar-width: thin; + scrollbar-color: var(--red) var(--panel); +} +body.ge-editor-open *::-webkit-scrollbar { + width: 8px; + height: 8px; +} +body.ge-editor-open *::-webkit-scrollbar-track { + background: var(--panel); +} +body.ge-editor-open *::-webkit-scrollbar-thumb { + background-color: var(--red); + border-radius: 4px; + border: 2px solid var(--panel); +} +body.ge-editor-open *::-webkit-scrollbar-thumb:hover { + background-color: color-mix(in srgb, var(--red) 80%, white); +} + +/* --------------------------------------------------------------------------- + Editor theme alignment (part 2): buttons, segmented toggles, tabs, list + rows, panel headers, badges, focus rings, number fields and colour-picker + chrome mapped onto the app's shared design tokens. Existing tokens only — + no new colours, and no geometry beyond colour / border / radius / focus. +--------------------------------------------------------------------------- */ + +/* The editor references two secondary / muted variables that the app token + layer never defines; map them onto the real tokens so every + var(--fg-muted) / var(--bg-secondary) editor rule resolves. */ +body.ge-editor-open { + --fg-muted: var(--color-muted); + --bg-secondary: var(--panel); +} + +/* Buttons → the app's `.cal-btn` recipe (5px radius; the primary button + uses the accent fill with a --bg foreground instead of a hard-coded #fff). */ +body.ge-editor-open .ge-btn { + border-radius: 5px; +} +body.ge-editor-open .ge-btn-primary { + background: var(--accent, var(--red)); + border-color: var(--accent, var(--red)); + color: var(--bg); +} +body.ge-editor-open .ge-btn-primary:hover { + background: var(--accent, var(--red)); + opacity: 0.9; +} +body.ge-editor-open .ge-win-close:hover { + background: var(--accent, var(--red)); + color: var(--bg); +} + +/* Segmented / option toggles, command palette and channel rows → the app's + accent token (--red) instead of the editor's blue #4c8bf5 fallback. */ +body.ge-editor-open .ge-opt-mode.active, +body.ge-editor-open .ge-crop-preset.active, +body.ge-editor-open .ge-command-item.active, +body.ge-editor-open .ge-command-item:hover { + background: var(--accent, var(--red)); + border-color: var(--accent, var(--red)); + color: var(--bg); +} +body.ge-editor-open .ge-channel-row.active, +body.ge-editor-open .ge-dock-tabs-menu-item:hover, +body.ge-editor-open .ge-filter-menu .dropdown-item-compact:focus-visible, +body.ge-editor-open .ge-view-menu .dropdown-item-compact:focus-visible, +body.ge-editor-open .ge-window-menu .dropdown-item-compact:focus-visible, +body.ge-editor-open .ge-help-menu .dropdown-item-compact:focus-visible, +body.ge-editor-open .ge-3d-menu .dropdown-item-compact:focus-visible, +body.ge-editor-open .ge-plugins-menu .dropdown-item-compact:focus-visible { + background: color-mix(in srgb, var(--accent, var(--red)) 22%, transparent); +} +body.ge-editor-open .ge-sam-brush-add.active, +body.ge-editor-open .ge-sam-brush-subtract.active, +body.ge-editor-open .ge-actions-controls .ge-btn.active { + border-color: var(--accent, var(--red)); + color: var(--accent, var(--red)); +} + +/* Tabs → the app tab convention: the active tab's underline is the accent. */ +body.ge-editor-open .ge-dock-tab.active { + border-bottom-color: var(--accent, var(--red)); +} + +/* Colour-picker chrome → the token accent instead of the blue fallback. */ +body.ge-editor-open .ge-swatch.active { + outline-color: var(--accent, var(--red)); +} + +/* Badges / status pills → the app's --bg foreground on an accent fill. */ +body.ge-editor-open .ge-tool-clear { + color: var(--bg); +} + +/* Panel headers → the app's muted section-title token. */ +body.ge-editor-open .ge-panel-title, +body.ge-editor-open .ge-info-label { + color: var(--color-muted); +} + +/* Focus rings → the app's 1px --red ring (matching the earlier input/select + block) on the controls that previously fell back to the UA outline. */ +body.ge-editor-open .ge-btn:focus-visible, +body.ge-editor-open .ge-tool-btn:focus-visible, +body.ge-editor-open .ge-doc-tab:focus-visible, +body.ge-editor-open .ge-history-row:focus-visible, +body.ge-editor-open .ge-swatch:focus-visible, +body.ge-editor-open .ge-opt-mode:focus-visible, +body.ge-editor-open .ge-stepper button:focus-visible { + outline: 1px solid var(--red); + outline-offset: 1px; +} + +/* --------------------------------------------------------------------------- + Editor theme alignment (part 3): the setup / preflight checklist and the + remaining checkbox list-row / badge chrome mapped onto the app's shared + design tokens. Existing tokens only — no new colours, and no geometry beyond + colour / border / radius / focus. Scoped to body.ge-editor-open. +--------------------------------------------------------------------------- */ + +/* Checklist card + rows → the app's panel / border / muted tokens. */ +body.ge-editor-open .ge-preflight-card { + background: var(--panel); + color: var(--fg); + border-color: var(--border); +} +body.ge-editor-open .ge-preflight-head p, +body.ge-editor-open .ge-preflight-hint, +body.ge-editor-open .ge-preflight-detail, +body.ge-editor-open .ge-preflight-remember, +body.ge-editor-open .ge-preflight-close { + color: var(--color-muted); +} +body.ge-editor-open .ge-preflight-close:hover { + background: color-mix(in srgb, var(--fg) 8%, transparent); + color: var(--fg); +} +body.ge-editor-open .ge-preflight-row { + background: color-mix(in srgb, var(--panel) 92%, var(--fg) 4%); + border-color: var(--border); +} +body.ge-editor-open .ge-preflight-row.is-done { + border-color: color-mix(in srgb, var(--green) 45%, var(--border)); +} +body.ge-editor-open .ge-preflight-row.is-todo { + border-color: var(--red); +} +body.ge-editor-open .ge-preflight-row.is-optional { + border-color: color-mix(in srgb, var(--accent-warm) 45%, var(--border)); +} + +/* Row badges → the semantic tokens (done = green, todo = red, optional = warm). */ +body.ge-editor-open .ge-preflight-badge { + background: color-mix(in srgb, var(--fg) 10%, transparent); + color: var(--fg); +} +body.ge-editor-open .ge-preflight-row.is-done .ge-preflight-badge { + background: color-mix(in srgb, var(--green) 20%, transparent); + color: var(--green); +} +body.ge-editor-open .ge-preflight-row.is-todo .ge-preflight-badge { + background: color-mix(in srgb, var(--red) 18%, transparent); + color: var(--red); +} +body.ge-editor-open .ge-preflight-row.is-optional .ge-preflight-badge { + background: color-mix(in srgb, var(--accent-warm) 16%, transparent); + color: var(--accent-warm); +} +body.ge-editor-open .ge-preflight-opt { + background: color-mix(in srgb, var(--fg) 8%, transparent); + color: var(--color-muted); +} + +/* Checklist actions / footer → token buttons and borders. */ +body.ge-editor-open .ge-preflight-act { + background: color-mix(in srgb, var(--fg) 8%, transparent); + border-color: var(--border); + color: var(--fg); +} +body.ge-editor-open .ge-preflight-act:hover { + background: color-mix(in srgb, var(--fg) 16%, transparent); +} +body.ge-editor-open .ge-preflight-foot { + border-top-color: var(--border); +} +body.ge-editor-open .ge-preflight-summary { + color: var(--green); +} +body.ge-editor-open .ge-preflight-start { + background: var(--accent, var(--red)); + color: var(--bg); +} +body.ge-editor-open .ge-preflight-start:hover { + background: var(--accent, var(--red)); + opacity: 0.9; +} +body.ge-editor-open .ge-setup-btn { + border-color: var(--border); + color: var(--color-muted); +} +body.ge-editor-open .ge-setup-btn:hover { + background: color-mix(in srgb, var(--fg) 10%, transparent); + color: var(--fg); +} + +/* The options-bar checkbox overrode the shared dot with a square + a drawn + ::after tick; force it back to the app's 14px circular dot (part 1). */ +body.ge-editor-open .ge-opt input[type="checkbox"], +body.ge-editor-open .ge-opt input[type="radio"] { + border-radius: 50%; + border-width: 1.5px; +} +body.ge-editor-open .ge-opt input[type="checkbox"]:checked, +body.ge-editor-open .ge-opt input[type="radio"]:checked { + background: var(--fg); + border-color: var(--fg); +} +body.ge-editor-open .ge-opt input[type="checkbox"]:checked::after { + content: none; +} + +/* Remaining list-row / thumbnail chrome → panel + border + muted tokens. */ +body.ge-editor-open .ge-history-row-dot { + background: var(--color-muted); +} +body.ge-editor-open .ge-layer-inline-thumb { + background: var(--panel); + border-color: var(--border); +} +body.ge-editor-open .ge-channel-row, +body.ge-editor-open .ge-channel-name { + color: var(--fg); +} +body.ge-editor-open .ge-channel-eye { + color: var(--color-muted); +} diff --git a/static/fonts/BebasNeue-Regular.woff2 b/static/fonts/BebasNeue-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..92d6a0f7297276c67ade85119be8996eae8b3d57 GIT binary patch literal 13768 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≠ueS2(Z(=p06JW_4vixfA?-eT;=$)( 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 literal 0 HcmV?d00001 diff --git a/static/fonts/Lobster-Regular.woff2 b/static/fonts/Lobster-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..656ed22de808e0f3f33c81778ea715457a929bb4 GIT binary patch literal 33844 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

UM)zSmGGWmHb0;VI`>T|tMr^|v4@ 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 Mi1oHC?g9V+0Qc|{KL7v# literal 0 HcmV?d00001 diff --git a/static/fonts/PlayfairDisplay-Bold.woff2 b/static/fonts/PlayfairDisplay-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5a3fbbdae8f66414a2754017de622f3c74c536b0 GIT binary patch literal 38404 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

7eh|( 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

7eh|( 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 literal 0 HcmV?d00001 diff --git a/static/fonts/RobotoMono-Regular.woff2 b/static/fonts/RobotoMono-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bfa169c30067c4d08aa76dfb11f28526d169c9ea GIT binary patch literal 32796 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 literal 0 HcmV?d00001 diff --git a/static/fonts/custom/GohuFont.ttf b/static/fonts/custom/GohuFont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..710f09f087ec2f656ae79d2e140e022215d8d67e GIT binary patch literal 1468 zcmds1O-NKx7(Ms>j1Fm{1qE5WDIpad=O@jEDFSN@K?+k7gLIgA&J51X8)lyA?5tHt zi&he@+C+;Wa3Csh8MtW`Ee!%UZrs(PD5i7Yds;54efRO*d%p91_q*rbci)2m(2QlM zxRFSVk3J7yc@OAM$hKd<*%z6p-uVWIDf+XiLb8Nrb(Q{GS}b+fHV{y%;AA!}ldP2L zb?NAj={IKb)wzpLS1&Q%M1MSMCexj?P$50`y!RDKoS5)iY7jb zN6=YmMcE+p&>h7mgaxw|=+2=zxd*x%b63+?<~c$&>VueelsKC9(+miam*+%!)L~^U zY3-iUbM&Obc4#=xQE~SstI}iy!uPAFRODvJh}WE~J?Fn2o%_pMCLhJQd-67@Xh3jX zpf6r)(6Ad>_vu^lnyL_DU6r&h=~{zNe2>?7e7lioYoPUPwDn9t_;)rpm9-yp0cA=a z+hM%$-U@I6gB}*}BkN&>tKIjoiVl46um-z zg+=xlvP#u*E|ay5&QzBX2}SyQjEUlW(OP6s=Gv@hBM%d4gh>_coSiq*gk$6~SYRy4 zRWW8}7V=4g1Z&HAax62$bQA=s!9dJYaImV&htZ2DZBH!{R?$va<&0@Wf*~VDUEbQn z;ofMkRQoTHlU%-x3O6A|859xXHl!H&VA3pCa#qm@g~Gv5h{WHwy!WNmU&?>gADiHp S>i$=lvOV+eq|E&N-}Mu36TdV7 literal 0 HcmV?d00001 diff --git a/static/icons/ollama-mark-crop.png b/static/icons/ollama-mark-crop.png new file mode 100644 index 0000000000000000000000000000000000000000..2554b38a14bf90287c29b2fcdadd2705c87fa148 GIT binary patch literal 7498 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 UkZ(hP4*&oF07*qoM6N<$f>5WP-T(jq literal 0 HcmV?d00001 diff --git a/static/icons/ollama-mark.png b/static/icons/ollama-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd2cf1ed8043caf62e8b069330889c0cf0f5a3b GIT binary patch literal 7487 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 VN)t_MNWmR&QzouW( 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�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

>ZQIgPN3KjFt7ETPbOj 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 OL_h!l000000000dCz+%G literal 0 HcmV?d00001 diff --git a/static/icons/sglang-mark.png b/static/icons/sglang-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..3e0fe3eda51977519637fff23717f39a2e9817da GIT binary patch literal 2171 zcmV->2!!{EP)FK?9JJJjpGLdE3$kov4?;kzA zcka38ci%bZo_iz;?s5E&K)Qj`ZNP0rS8@af$e;j%1b`$tjvi*a21JntU}-65m~3O6 z8XXo`2HjL8we|1~(YNDLSZ)d>9*_Q0hQ`C(Ol0^@vHm4r2rnWCX%R&MQ54W>P-C`@ z-pVq{{*A}`dUkiH{l1X25tzUu^O{n94QI(NuUxbo9OEYfMKjQM?J8W@^#-(`sFCus z>5aUO{C;`0yW?M;_L6s-uB`wcLv1x_ep(XfQIeybxRIMBoGiC@N?H zfYHl%0>rQNA0M?gtRU-xMN?(A?R0#+=4Z3I)@cU*X`pdbSfz~yrLsGlczmB8{ z*f7AtBATii!Ln98rX`7}XM3dZu4YN8_1_(l=@x*cdHOd5JyV#U#jdPt^VR?EVkmON zJ@DA1f_R<{>HaX8f8hZmU#EH**R4*fEfS&+J(Mjx^ZFc1&ZbHhvv)zD-VIoZP&4#e z>N29#TU+XqGaizuMrWFkZBefN?;>rfD4H`LOvR<3NMYzWb8^zPn(9eL9%j!gGko93 z_BB3zTI$DB6Jx%O{tBWgn?b;by4|6kbAjZ?Cd@)+3h>%d`f5W_`Ggspeg%#RlVcgf zked(Llcs`oOeI`7dZd`haz=TMwywh!a$g#xJC$ld^Q{8iJ7xo2Z#GbWdi9*Iz1EZL zXB(o$MXYEJdOwS z@>tC;Sj2uKKa2UXO5_vkP6R@c!B{^K0TV-I^N#Gq3TPU1nRd9|A+Knsd~HdtHsE=lmdi|27f^ai5~P#a>rJ1%!~; z&S^2>1FAy2Ep74^gFr2qTWVNWVDg<^QX_`_1YnF7U{)^8K9tElC5rS0nV@jVNO~y+ z@(0fy>T?}(4a#$pBhcbkj~6;pzEd#>VU;a{W&a2=U;0Gc%uP3Sf3vhfhd+`;rplA_0^Wq=NFa(;MYv>!UBA^AL|=*?E~57+3cOY$-fOquZOyj=7nU6lirshAELsHc z^U=E9_6&ARNgn&uhnGE{JYO#3=h5-;=ogF3mgZm#e9c_5rHtvZ$ zD&^JhkWOTM0FX@ZMH6F_^I4uY5pJK?sG(XlEu9KNsHx zhMhoDgme;FZ5P9&SkKdXM~Y`md2`pn0IV!$>9H1;<1kRsK=AjX8&ZVWfnd{HvjuNh zAwUQacSx1@G>hT4+xzc*4uq5jRV--7YJMOv-1CIMot5eB9q_XpgemYlGU?aMM)b-L zkGQVw?HYzsVz4OVP$5rq8^GGbP&lv^wuQkv-aADRx(inx76M_P2Wq#y0QY}y3otq! zt{>V5`LiAa^QcNFn6nT*`N^{>n`>AIaDoxCs%F8}{ci$MRp_d%0mtP32U!e4%Ljjj zQ41EQY_4H*p|XW50CO5}T{r`F=hWD*FYb$Hq3Dq(!RDNDrzjb64o!6siz-8Yt0#5&RDF%x3nqu2h<_SiK-5Dcnh$R%D%2{eV&21St%9$dBf;bi1Z z8Pq|BhWdYYgol(uVK{oD6EXm;t command[0] === id) || null; +} + +export function createActionsPanel({ showToast = () => {}, getLayers = null, selectLayer = null } = {}) { + let steps = []; + let recording = false; + let saved = loadSaved(); + + const body = el('div', 'ge-panel-body ge-actions-body'); + + const nameRow = el('div', 'ge-actions-name-row'); + const nameInput = document.createElement('input'); + nameInput.type = 'text'; + nameInput.placeholder = 'Action name'; + nameInput.className = 'ge-actions-name'; + const saveButton = el('button', 'ge-btn ge-btn-sm', 'Save'); + saveButton.type = 'button'; + nameRow.append(nameInput, saveButton); + + const addRow = el('div', 'ge-actions-add-row'); + const addSelect = document.createElement('select'); + addSelect.className = 'ge-actions-command'; + ACTION_COMMANDS.forEach(([id, label]) => addSelect.appendChild(new Option(label, id))); + const addButton = el('button', 'ge-btn ge-btn-sm', 'Add'); + addButton.type = 'button'; + addRow.append(addSelect, addButton); + + const controls = el('div', 'ge-actions-controls'); + const recordButton = el('button', 'ge-btn ge-btn-sm', 'Record'); + recordButton.type = 'button'; + const playButton = el('button', 'ge-btn ge-btn-sm', 'Play'); + playButton.type = 'button'; + const clearButton = el('button', 'ge-btn ge-btn-sm', 'Clear'); + clearButton.type = 'button'; + controls.append(recordButton, playButton, clearButton); + + const batchRow = el('div', 'ge-actions-batch-row'); + const batchSelect = document.createElement('select'); + batchSelect.className = 'ge-actions-batch-select'; + const batchButton = el('button', 'ge-btn ge-btn-sm', 'Batch'); + batchButton.type = 'button'; + batchButton.title = 'Apply the selected action to every layer'; + const batchDocsButton = el('button', 'ge-btn ge-btn-sm', 'Batch docs'); + batchDocsButton.type = 'button'; + batchDocsButton.title = 'Apply the selected action to every open document'; + batchRow.append(batchSelect, batchButton, batchDocsButton); + + const list = el('div', 'ge-actions-list'); + const savedList = el('div', 'ge-actions-saved'); + + body.append(nameRow, addRow, controls, batchRow, list, savedList); + + function renderList() { + list.innerHTML = ''; + if (!steps.length) { + list.appendChild(el('p', 'ge-panel-empty', 'No steps. Add commands or record.')); + return; + } + steps.forEach((step, index) => { + const command = commandById(step); + const row = el('div', 'ge-actions-step', `${index + 1}${command ? command[1] : step}`); + const remove = el('button', 'ge-action-remove', '✕'); + remove.type = 'button'; + remove.addEventListener('click', () => { steps.splice(index, 1); renderList(); }); + row.appendChild(remove); + list.appendChild(row); + }); + } + + function renderSaved() { + savedList.innerHTML = ''; + syncBatchSelect(); + const names = Object.keys(saved); + if (!names.length) return; + savedList.appendChild(el('div', 'ge-panel-title', 'SAVED')); + names.forEach(name => { + const row = el('div', 'ge-actions-saved-row'); + const loadButton = el('button', 'ge-btn ge-btn-sm', name); + loadButton.type = 'button'; + loadButton.addEventListener('click', () => { steps = saved[name].slice(); renderList(); }); + const deleteButton = el('button', 'ge-action-remove', '✕'); + deleteButton.type = 'button'; + deleteButton.addEventListener('click', () => { delete saved[name]; persist(); renderSaved(); }); + row.append(loadButton, deleteButton); + savedList.appendChild(row); + }); + } + + function persist() { + try { localStorage.setItem(STORAGE_KEY, JSON.stringify(saved)); } catch { /* ignore */ } + } + + function syncBatchSelect() { + const names = Object.keys(saved); + const previous = batchSelect.value; + batchSelect.innerHTML = ''; + if (!names.length) { + batchSelect.appendChild(new Option('No saved actions', '')); + batchButton.disabled = true; + batchDocsButton.disabled = true; + return; + } + batchButton.disabled = false; + batchDocsButton.disabled = false; + names.forEach(name => batchSelect.appendChild(new Option(name, name))); + if (names.includes(previous)) batchSelect.value = previous; + } + + function loadSaved() { + try { + const raw = localStorage.getItem(STORAGE_KEY); + const parsed = raw ? JSON.parse(raw) : null; + return parsed && typeof parsed === 'object' ? parsed : {}; + } catch { return {}; } + } + + function runStep(step) { + const command = commandById(step); + if (!command) return; + document.querySelector(command[2])?.click(); + } + + function play() { + steps.forEach((step, index) => setTimeout(() => runStep(step), index * 60)); + showToast(`Playing ${steps.length} action${steps.length === 1 ? '' : 's'}`); + } + + async function runOnAllLayers() { + const name = batchSelect.value; + const action = name && saved[name] ? saved[name].slice() : null; + if (!action || !action.length) { showToast('Select a saved action to batch'); return; } + if (!getLayers || !selectLayer) { showToast('Batch is unavailable'); return; } + const layers = getLayers() || []; + if (layers.length < 1) { showToast('No layers to batch'); return; } + showToast(`Batching "${name}" over ${layers.length} layer${layers.length === 1 ? '' : 's'}`); + for (const layer of layers) { + selectLayer(layer.id); + for (const step of action) { + runStep(step); + await new Promise(resolve => setTimeout(resolve, 80)); + } + } + showToast('Batch complete'); + } + + function onDocumentClick(event) { + if (!recording) return; + const match = ACTION_COMMANDS.find(command => event.target.closest?.(command[2])); + if (match && !steps.includes(match[0])) { + steps.push(match[0]); + renderList(); + } + } + + function toggleRecord() { + recording = !recording; + recordButton.classList.toggle('active', recording); + recordButton.textContent = recording ? 'Stop' : 'Record'; + showToast(recording ? 'Recording actions…' : 'Recording stopped'); + } + + addButton.addEventListener('click', () => { steps.push(addSelect.value); renderList(); }); + recordButton.addEventListener('click', toggleRecord); + playButton.addEventListener('click', play); + batchButton.addEventListener('click', () => { runOnAllLayers(); }); + batchDocsButton.addEventListener('click', async () => { + const name = batchSelect.value; + if (!name) { showToast('Select a saved action to batch'); return; } + try { + const response = await window.geEditorControl?.invoke?.('actions.batchDocuments', { name }); + const results = (response && response.result) || []; + const ok = results.filter((entry) => entry.ok).length; + showToast(`Batch docs: ${ok}/${results.length} document${results.length === 1 ? '' : 's'}`); + } catch (error) { + showToast('Batch docs failed: ' + (error?.message || error)); + } + }); + clearButton.addEventListener('click', () => { steps = []; renderList(); }); + saveButton.addEventListener('click', () => { + const name = (nameInput.value || '').trim(); + if (!name) return; + saved[name] = steps.slice(); + persist(); + renderSaved(); + showToast(`Saved action "${name}"`); + }); + document.addEventListener('click', onDocumentClick, true); + + const element = el('div', 'ge-panel'); + element.id = 'ge-panel-actions'; + element.appendChild(el('div', 'ge-panel-title', 'ACTIONS')); + element.appendChild(body); + renderList(); + renderSaved(); + + return { element, play, run: runStep, runOnAllLayers, getSteps: () => steps.slice(), setSteps: (next) => { steps = next.slice(); renderList(); } }; +} diff --git a/static/js/editor/adjustment-layer.js b/static/js/editor/adjustment-layer.js index e13e4ca53..71a27c99a 100644 --- a/static/js/editor/adjustment-layer.js +++ b/static/js/editor/adjustment-layer.js @@ -2,10 +2,12 @@ import { applyAdjustment } from './fx/pixel-pass.js'; import { defaultAdjParams } from './layer-helpers.js'; import { renderWithLayerMasks } from './composite-helpers.js'; +import { blendDraw } from './blend-modes.js'; const TYPES = new Set([ 'brightness-contrast', 'exposure', + 'develop', 'white-balance', 'hue-saturation', 'vibrance', @@ -16,6 +18,12 @@ const TYPES = new Set([ 'color-balance', 'selective-color', 'gradient-map', + 'invert', + 'posterize', + 'threshold', + 'photo-filter', + 'channel-mixer', + 'color-lookup', ]); function clone(value) { @@ -52,6 +60,11 @@ export function normalizeAdjustmentData(value) { params.ranges[name] = { ...clone(defaults.ranges[name]), ...(params.ranges[name] || {}) }; } } + if (type === 'channel-mixer') { + for (const name of ['red', 'green', 'blue', 'constant']) { + params[name] = { ...clone(defaults[name]), ...(params[name] || {}) }; + } + } return { type, params }; } @@ -109,11 +122,8 @@ export function drawAdjustmentLayer(target, editorState, layer, clippingBase, re adjusted = clipped; } - target.globalAlpha = Number.isFinite(layer.opacity) ? layer.opacity : 1; - target.globalCompositeOperation = layer.blendMode || 'source-over'; - target.drawImage(adjusted, 0, 0); - target.globalAlpha = 1; - target.globalCompositeOperation = 'source-over'; + const opacity = Number.isFinite(layer.opacity) ? layer.opacity : 1; + blendDraw(target, adjusted, layer.blendMode, opacity, 0, 0); return true; } @@ -154,11 +164,8 @@ export async function drawAdjustmentLayerAsync(target, editorState, layer, clipp clippedCtx.globalCompositeOperation = 'source-over'; adjusted = clipped; } - target.globalAlpha = Number.isFinite(layer.opacity) ? layer.opacity : 1; - target.globalCompositeOperation = layer.blendMode || 'source-over'; - target.drawImage(adjusted, 0, 0); - target.globalAlpha = 1; - target.globalCompositeOperation = 'source-over'; + const opacity = Number.isFinite(layer.opacity) ? layer.opacity : 1; + blendDraw(target, adjusted, layer.blendMode, opacity, 0, 0); return true; } diff --git a/static/js/editor/ai-models.js b/static/js/editor/ai-models.js index 5b4252f6b..6da7d0e03 100644 --- a/static/js/editor/ai-models.js +++ b/static/js/editor/ai-models.js @@ -27,6 +27,12 @@ import { state } from './state.js'; import { sortModelIds } from '../modelSort.js'; +// Last result of loadAIModels() — consumed by the editor setup checklist +// (static/js/editor/preflight.js) to decide whether an image provider is +// reachable and which image models are available. +let _aiModelsStatus = { ready: false, models: [], error: null, at: 0 }; +export function getAIModelsStatus() { return _aiModelsStatus; } + export function resolveInpaintModel(select) { const options = Array.from(select?.options || []).filter(option => !option.disabled && option.value && option.value !== '__serve_cookbook__'); @@ -34,6 +40,71 @@ export function resolveInpaintModel(select) { return explicit || options.find(option => /inpaint|edit|fill/i.test(option.value)) || options[0] || null; } +// Resolve the model the Quick Edit box will use. Prefers the explicit Quick +// Edit picker (#ge-ai-command-model); falls back to the inpaint picker / Auto. +export function resolveQuickEditModel() { + const sel = document.getElementById('ge-ai-command-model'); + if (sel && sel.value && sel.value !== '__serve_cookbook__') { + const opt = sel.options[sel.selectedIndex]; + const raw = sel.value || ''; + const idx = raw.indexOf('::'); + return { + endpoint: idx < 0 ? raw : raw.slice(0, idx), + model: idx < 0 ? '' : raw.slice(idx + 2), + label: ((opt && opt.textContent) || '').trim(), + }; + } + const inp = document.getElementById('ge-ai-inpaint'); + const opt = resolveInpaintModel(inp); + if (!opt) return { endpoint: '', model: '', label: '' }; + const raw = opt.value || ''; + const idx = raw.indexOf('::'); + return { + endpoint: idx < 0 ? raw : raw.slice(0, idx), + model: idx < 0 ? '' : raw.slice(idx + 2), + label: ((opt.textContent || '').trim().replace(/^Auto\s*\((.*)\)$/, '$1')), + }; +} + +// Resolve the Quick Edit AGENT (planner) model — the vision-language model +// that reads the canvas screenshot and plans the edit. Default is the local +// Qwen3.5-9B VL server on seneca; "Server default" keeps the HARNESS planner. +export function resolveQuickEditAgentModel() { + const sel = document.getElementById('ge-ai-command-agent-model'); + const raw = (sel && sel.value) || ''; + if (!raw || raw === 'default') { + return { agent: '', endpoint: '', label: 'Server default' }; + } + const idx = raw.indexOf('::'); + const endpoint = idx < 0 ? '' : raw.slice(0, idx); + const agent = idx < 0 ? raw : raw.slice(idx + 2); + const opt = sel.options[sel.selectedIndex]; + return { agent, endpoint, label: ((opt && opt.textContent) || '').trim() }; +} + +// Quick Edit agent (planner) model options. Kept small + explicit; the local +// Qwen3.5-9B VL is the default. `value` encodes "::". +export const QUICK_EDIT_AGENT_OPTIONS = [ + { value: 'http://100.69.120.65:8097/v1::Qwen/Qwen3.5-9B', label: 'Qwen3.5-9B VL · local' }, + { value: 'default', label: 'Server default (hosted planner)' }, +]; + + +// can see which model Quick Edit / inpaint will call. +export function updateFooterEditModel() { + const el = document.getElementById('ge-status-model'); + if (!el) return; + const info = resolveQuickEditModel(); + if (!info.label && !info.model) { + el.textContent = 'Edit: none'; + el.title = 'No AI edit model available'; + return; + } + const label = info.label || info.model; + el.textContent = `Edit: ${label}`; + el.title = `AI edit model: ${label}`; +} + // Heuristic classifier on a model id + endpoint name. A model can be: // - gen: text-to-image generation // - inpaint: image+mask edit (inpaint / img2img) @@ -92,11 +163,40 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im const aiGenSelect = document.getElementById('ge-ai-model'); const aiInpaintSelect = document.getElementById('ge-ai-inpaint'); + const aiCommandSelect = document.getElementById('ge-ai-command-model'); + const aiCommandAgentSelect = document.getElementById('ge-ai-command-agent-model'); + if (aiInpaintSelect) aiInpaintSelect.addEventListener('change', () => updateFooterEditModel()); + if (aiCommandSelect) aiCommandSelect.addEventListener('change', () => updateFooterEditModel()); + // The Quick Edit agent (planner) picker is static for now (local VL default, + // server default option); restore/save its choice from localStorage. + const populateAgentSelect = () => { + if (!aiCommandAgentSelect) return; + aiCommandAgentSelect.innerHTML = ''; + for (const opt of QUICK_EDIT_AGENT_OPTIONS) { + const el = document.createElement('option'); + el.value = opt.value; + el.textContent = opt.label; + aiCommandAgentSelect.appendChild(el); + } + try { + const saved = localStorage.getItem('ge-ai-command-agent-model'); + if (saved && [...aiCommandAgentSelect.options].some(o => o.value === saved)) { + aiCommandAgentSelect.value = saved; + } + } catch {} + if (!aiCommandAgentSelect._agentWired) { + aiCommandAgentSelect._agentWired = true; + aiCommandAgentSelect.addEventListener('change', () => { + try { localStorage.setItem('ge-ai-command-agent-model', aiCommandAgentSelect.value); } catch {} + }); + } + }; // The global Gen model dropdown was removed from the editor topbar; // only bail if there's nothing to populate at all (neither the Gen // select nor the inpaint select nor any per-tool select). - if (!aiGenSelect && !aiInpaintSelect && + if (!aiGenSelect && !aiInpaintSelect && !aiCommandSelect && !aiCommandAgentSelect && !document.querySelector('select.ge-tool-model')) return; + populateAgentSelect(); async function loadAIModels(opts = {}) { try { @@ -108,11 +208,13 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im const endpoints = await res.json(); if (aiGenSelect) aiGenSelect.innerHTML = ''; if (aiInpaintSelect) aiInpaintSelect.innerHTML = ''; + if (aiCommandSelect) aiCommandSelect.innerHTML = ''; const perToolSelects = Array.from(document.querySelectorAll('select.ge-tool-model')); for (const ts of perToolSelects) ts.innerHTML = ''; let firstGen = null; let selectedGen = null; let selectedInpaint = null; + const loaded = []; for (const ep of endpoints) { if (!ep.is_enabled) continue; const hasListedModels = Array.isArray(ep.models) && ep.models.length; @@ -130,6 +232,7 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im const shortModel = modelId ? String(modelId).split('/').pop() : (ep.name || ep.base_url); const epHint = modelId && ep.name && ep.name !== modelId ? ` · ${ep.name}` : ''; const label = `${shortModel}${epHint}${epUsable ? '' : ' (offline)'}`; + loaded.push({ value, label, gen: caps.gen, inpaint: caps.inpaint, usable: epUsable, endpoint: ep.base_url, model: modelId }); if (caps.gen && aiGenSelect) { const opt = document.createElement('option'); opt.value = value; @@ -158,6 +261,13 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im opt.disabled = !epUsable; ts.appendChild(opt); } + if (aiCommandSelect) { + const opt = document.createElement('option'); + opt.value = value; + opt.textContent = label; + opt.disabled = !epUsable; + aiCommandSelect.appendChild(opt); + } } } } @@ -173,6 +283,7 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im const auto = resolveInpaintModel({ options: aiInpaintSelect.options, value: '' }); aiInpaintSelect.options[0].textContent = auto ? `Auto (${auto.textContent})` : 'Auto (no available model)'; } + updateFooterEditModel(); // Append the "Serve a model in Cookbook…" sentinel at the // bottom of every model dropdown. const appendServeSentinel = (sel) => { @@ -188,6 +299,7 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im for (const ts of perToolSelects) appendServeSentinel(ts); if (aiGenSelect) appendServeSentinel(aiGenSelect); if (aiInpaintSelect) appendServeSentinel(aiInpaintSelect); + if (aiCommandSelect) appendServeSentinel(aiCommandSelect); // Wire the sentinel on the Gen + Inpaint selects too. const wireServeSentinel = (sel) => { if (!sel) return; @@ -203,6 +315,18 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im }; wireServeSentinel(aiGenSelect); wireServeSentinel(aiInpaintSelect); + wireServeSentinel(aiCommandSelect); + if (aiCommandSelect) { + try { + const saved = localStorage.getItem('ge-ai-command-model'); + if (saved && [...aiCommandSelect.options].some(o => o.value === saved)) aiCommandSelect.value = saved; + } catch {} + aiCommandSelect.addEventListener('change', () => { + if (aiCommandSelect.value === '__serve_cookbook__') return; + try { localStorage.setItem('ge-ai-command-model', aiCommandSelect.value); } catch {} + updateFooterEditModel(); + }); + } // Restore each per-tool selection from localStorage. for (const ts of perToolSelects) { const key = 'ge-tool-model-' + ts.dataset.geToolModel; @@ -223,6 +347,8 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im try { localStorage.setItem(key, ts.value); } catch {} }); } + _aiModelsStatus = { ready: true, models: loaded, error: null, at: Date.now() }; + try { window.dispatchEvent(new CustomEvent('ge:ai-models-status')); } catch {} } catch (e) { // Fetch failed — still give the user the affordance to set up // a model. Otherwise the dropdown shows only "Auto" with no @@ -230,6 +356,7 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im const fallback = ''; if (aiGenSelect) aiGenSelect.innerHTML = fallback; if (aiInpaintSelect) aiInpaintSelect.innerHTML = fallback; + if (aiCommandSelect) aiCommandSelect.innerHTML = fallback; document.querySelectorAll('select.ge-tool-model').forEach(ts => { ts.innerHTML = fallback; }); const wireServe = (sel) => { if (!sel) return; @@ -245,7 +372,12 @@ export function wireAIModelSelectors({ container, apiBase, openCookbookForImg2im }; wireServe(aiGenSelect); wireServe(aiInpaintSelect); + wireServe(aiCommandSelect); document.querySelectorAll('select.ge-tool-model').forEach(wireServe); + populateAgentSelect(); + updateFooterEditModel(); + _aiModelsStatus = { ready: false, models: [], error: String(e?.message || e), at: Date.now() }; + try { window.dispatchEvent(new CustomEvent('ge:ai-models-status')); } catch {} } } loadAIModels(); diff --git a/static/js/editor/ai-settings.js b/static/js/editor/ai-settings.js new file mode 100644 index 000000000..ec8cd846c --- /dev/null +++ b/static/js/editor/ai-settings.js @@ -0,0 +1,85 @@ +/** + * AI settings dialog. + * + * Holds the image-edit model, the AI agent (vision) model, and the opt-in + * "Double-check AI edits" toggle. Opened from the Quick Edit gear button and + * from the editor setup checklist; keeps the Quick Edit box itself uncluttered. + */ +export function createAiSettings({ container }) { + const el = document.createElement('div'); + el.className = 'ge-ai-settings'; + el.hidden = true; + el.setAttribute('role', 'dialog'); + el.setAttribute('aria-modal', 'true'); + el.setAttribute('aria-label', 'AI settings'); + el.innerHTML = ` +
+
+

AI settings

+ +
+
+ + + + +

Recommended, not required — the vision agent plans edits and can double-check results.

+ +
+ + 1.4× +
+

How strongly named looks (Kodachrome, teal and orange, …) are graded.

+ +
+
+ +
+
`; + + function open(focusId) { + el.hidden = false; + if (focusId) { + const target = document.getElementById(focusId); + if (target) { + try { target.focus({ preventScroll: true }); } catch (_) { target.focus(); } + } + } + } + function close() { el.hidden = true; } + + el.addEventListener('click', (e) => { + if (e.target === el || e.target.closest('[data-ai-settings-close]')) { + e.preventDefault(); + close(); + } + }); + const onKey = (e) => { if (e.key === 'Escape' && !el.hidden) close(); }; + document.addEventListener('keydown', onKey); + + container.appendChild(el); + + const strengthInput = el.querySelector('#ge-look-strength'); + const strengthVal = el.querySelector('#ge-look-strength-val'); + if (strengthInput) { + try { + const saved = parseFloat(localStorage.getItem('ge-look-strength')); + if (Number.isFinite(saved) && saved > 0) strengthInput.value = String(saved); + } catch (_) {} + if (strengthVal) strengthVal.textContent = Number(strengthInput.value).toFixed(1) + '×'; + strengthInput.addEventListener('input', () => { + const v = Number(strengthInput.value); + if (strengthVal) strengthVal.textContent = v.toFixed(1) + '×'; + try { localStorage.setItem('ge-look-strength', String(v)); } catch (_) {} + }); + } + + function destroy() { + document.removeEventListener('keydown', onKey); + el.remove(); + } + + return { element: el, open, close, destroy }; +} diff --git a/static/js/editor/ai-tools-misc.js b/static/js/editor/ai-tools-misc.js index b9cb9fea1..0e7429782 100644 --- a/static/js/editor/ai-tools-misc.js +++ b/static/js/editor/ai-tools-misc.js @@ -220,16 +220,11 @@ export function wireAIToolsMisc({ renderLayerPanel(); composite(); } - const addButton = document.getElementById('ge-add-layer'); - addButton?.addEventListener('click', event => { - event.preventDefault(); - event.stopPropagation(); + const buildFxMenu = (anchor) => { document.querySelector('.ge-add-layer-menu')?.remove(); const menu = document.createElement('div'); menu.className = 'ge-add-layer-menu ge-frosted'; menu.innerHTML = ` - - @@ -242,9 +237,16 @@ export function wireAIToolsMisc({ + + + + + + + `; document.body.appendChild(menu); - const rect = addButton.getBoundingClientRect(); + const rect = anchor.getBoundingClientRect(); const menuRect = menu.getBoundingClientRect(); menu.style.left = `${Math.max(8, Math.min(window.innerWidth - menuRect.width - 8, rect.right - menuRect.width))}px`; menu.style.top = `${Math.max(8, Math.min(window.innerHeight - menuRect.height - 8, rect.bottom + 5))}px`; @@ -253,7 +255,7 @@ export function wireAIToolsMisc({ document.removeEventListener('pointerdown', away, true); }; const away = pointerEvent => { - if (!menu.contains(pointerEvent.target) && pointerEvent.target !== addButton) close(); + if (!menu.contains(pointerEvent.target) && pointerEvent.target !== anchor) close(); }; requestAnimationFrame(() => document.addEventListener('pointerdown', away, true)); menu.addEventListener('click', clickEvent => { @@ -261,10 +263,26 @@ export function wireAIToolsMisc({ if (!button) return; clickEvent.preventDefault(); clickEvent.stopPropagation(); - if (button.dataset.layerKind === 'raster') addEmptyLayer(); - else if (button.dataset.adjustmentType) openAdjustmentLayer?.(button.dataset.adjustmentType, addButton); + if (button.dataset.adjustmentType) openAdjustmentLayer?.(button.dataset.adjustmentType, anchor); close(); }); + }; + + // "+" adds a plain pixel layer directly. + const addButton = document.getElementById('ge-add-layer'); + addButton?.addEventListener('click', event => { + event.preventDefault(); + event.stopPropagation(); + document.querySelector('.ge-add-layer-menu')?.remove(); + addEmptyLayer(); + }); + + // "fx" opens the adjustment-layer chooser. + const addFxButton = document.getElementById('ge-add-fx'); + addFxButton?.addEventListener('click', event => { + event.preventDefault(); + event.stopPropagation(); + buildFxMenu(addFxButton); }); return { addEmptyLayer }; diff --git a/static/js/editor/aspect-fit.js b/static/js/editor/aspect-fit.js new file mode 100644 index 000000000..55933f855 --- /dev/null +++ b/static/js/editor/aspect-fit.js @@ -0,0 +1,35 @@ +// Pure aspect-fitting geometry for the editor. When a whole-image resize is +// asked for a target aspect that differs from the current image, content must +// be cropped to that aspect (centred on a focus point) and then scaled +// UNIFORMLY — never stretched. +// +// aspectFitCropRect returns the document-space rectangle to crop FIRST so a +// subsequent uniform scale-to-{targetW,targetH} preserves the subject aspect +// ratio. Returns the full image unchanged when the aspect already matches. + +export function aspectFitCropRect({ width, height, focusX, focusY, targetAspect, tolerance = 0.005 } = {}) { + const w = Number(width); + const h = Number(height); + const a = Number(targetAspect); + if (!(w > 0) || !(h > 0) || !(a > 0)) return null; + const curAspect = w / h; + if (Math.abs(curAspect - a) / a <= tolerance) return { x: 0, y: 0, width: Math.round(w), height: Math.round(h) }; + const fx = Number.isFinite(Number(focusX)) ? Number(focusX) : w / 2; + const fy = Number.isFinite(Number(focusY)) ? Number(focusY) : h / 2; + let cw; + let ch; + if (curAspect > a) { + ch = h; + cw = Math.max(1, Math.round(ch * a)); + } else { + cw = w; + ch = Math.max(1, Math.round(cw / a)); + } + let x = Math.round(fx - cw / 2); + let y = Math.round(fy - ch / 2); + x = Math.max(0, Math.min(w - cw, x)); + y = Math.max(0, Math.min(h - ch, y)); + return { x, y, width: cw, height: ch }; +} + +export default { aspectFitCropRect }; diff --git a/static/js/editor/batch-runner.js b/static/js/editor/batch-runner.js new file mode 100644 index 000000000..f8dd421a4 --- /dev/null +++ b/static/js/editor/batch-runner.js @@ -0,0 +1,35 @@ +/** + * Batch runner — a small, dependency-free orchestrator that applies one action + * to every item in a list (open documents), isolating each item so a failure on + * one never aborts the batch. Pure async control flow: the caller supplies + * `runOne`, so the same loop is unit-testable without an editor. + */ + +/** + * @param {object} options + * @param {Array<{id:string,name?:string}>} options.documents + * @param {(doc:object, index:number)=>Promise} options.runOne + * @param {number} [options.delayMs] + * @param {(done:number,total:number,doc:object)=>void} [options.onProgress] + * @returns {Promise>} + */ +export async function runBatchOverDocuments({ documents, runOne, delayMs = 0, onProgress = null } = {}) { + const list = Array.isArray(documents) ? documents.filter(Boolean) : []; + const results = []; + for (let index = 0; index < list.length; index += 1) { + const doc = list[index]; + try { + const output = await runOne(doc, index); + results.push({ id: doc.id, name: doc.name, ok: true, output: output === undefined ? null : output }); + } catch (error) { + results.push({ id: doc.id, name: doc.name, ok: false, error: String((error && error.message) || error) }); + } + if (typeof onProgress === 'function') { + try { onProgress(index + 1, list.length, doc); } catch { /* progress is best-effort */ } + } + if (delayMs > 0) await new Promise(resolve => setTimeout(resolve, delayMs)); + } + return results; +} + +export default { runBatchOverDocuments }; diff --git a/static/js/editor/blend-modes.js b/static/js/editor/blend-modes.js new file mode 100644 index 000000000..ee3f3f8e6 --- /dev/null +++ b/static/js/editor/blend-modes.js @@ -0,0 +1,256 @@ +/** + * Layer/graphic blend modes. + * + * Canvas2D can only composite a subset of the Photoshop blend modes natively. + * This module exposes that native set plus the "extra" modes PhotoCraft offers + * (Dissolve, Linear Burn, Darker Color, Linear Dodge/Add, Lighter Color, + * Vivid Light, Linear Light, Pin Light, Hard Mix, Subtract, Divide) and a + * single `blendDraw` entry point that both paths go through. + * + * The non-native modes follow the W3C compositing spec (separable + the two + * non-separable luminance modes) and operate on ImageData in the overlap of + * the source and the destination so rendering stays reasonably cheap. + */ + +export const NATIVE_BLEND_MODES = new Set([ + 'source-over', + 'multiply', + 'screen', + 'overlay', + 'darken', + 'lighten', + 'color-dodge', + 'color-burn', + 'hard-light', + 'soft-light', + 'difference', + 'exclusion', + 'hue', + 'saturation', + 'color', + 'luminosity', +]); + +const NATIVE_ALIASES = { + 'linear-dodge': 'lighter', + add: 'lighter', +}; + +export const EXTRA_BLEND_MODES = [ + { value: 'linear-dodge', label: 'Linear Dodge (Add)' }, + { value: 'linear-burn', label: 'Linear Burn' }, + { value: 'darker-color', label: 'Darker Color' }, + { value: 'lighter-color', label: 'Lighter Color' }, + { value: 'vivid-light', label: 'Vivid Light' }, + { value: 'linear-light', label: 'Linear Light' }, + { value: 'pin-light', label: 'Pin Light' }, + { value: 'hard-mix', label: 'Hard Mix' }, + { value: 'subtract', label: 'Subtract' }, + { value: 'divide', label: 'Divide' }, + { value: 'dissolve', label: 'Dissolve' }, +]; + +const NON_SEPARABLE = new Set(['darker-color', 'lighter-color']); + +export function isNativeBlendMode(mode) { + if (!mode) return true; + return NATIVE_BLEND_MODES.has(mode) || Object.prototype.hasOwnProperty.call(NATIVE_ALIASES, mode); +} + +export function isKnownBlendMode(mode) { + if (!mode) return true; + return isNativeBlendMode(mode) || EXTRA_BLEND_MODES.some(entry => entry.value === mode); +} + +function clamp01(value) { + return value < 0 ? 0 : value > 1 ? 1 : value; +} + +function lum(r, g, b) { + return 0.299 * r + 0.587 * g + 0.114 * b; +} + +// Separable per-channel blend functions on normalized [0,1] values. +function blendChannel(mode, cb, cs) { + switch (mode) { + case 'normal': + return cs; + case 'multiply': + return cb * cs; + case 'screen': + return cb + cs - cb * cs; + case 'overlay': + return cb <= 0.5 ? 2 * cb * cs : 1 - 2 * (1 - cb) * (1 - cs); + case 'darken': + return Math.min(cb, cs); + case 'lighten': + return Math.max(cb, cs); + case 'color-dodge': + if (cb === 0) return 0; + if (cs === 1) return 1; + return Math.min(1, cb / (1 - cs)); + case 'color-burn': + if (cb === 1) return 1; + if (cs === 0) return 0; + return 1 - Math.min(1, (1 - cb) / cs); + case 'hard-light': + return cs <= 0.5 ? 2 * cs * cb : 1 - 2 * (1 - cs) * (1 - cb); + case 'soft-light': { + if (cs <= 0.5) return cb - (1 - 2 * cs) * cb * (1 - cb); + const d = cb <= 0.25 ? ((16 * cb - 12) * cb + 4) * cb : Math.sqrt(cb); + return cb + (2 * cs - 1) * (d - cb); + } + case 'difference': + return Math.abs(cb - cs); + case 'exclusion': + return cb + cs - 2 * cb * cs; + case 'linear-burn': + return clamp01(cb + cs - 1); + case 'linear-dodge': + return clamp01(cb + cs); + case 'vivid-light': + return cs <= 0.5 + ? (cs === 0 ? 0 : 1 - Math.min(1, (1 - cb) / (2 * cs))) + : (cs === 1 ? 1 : Math.min(1, cb / (2 * (1 - cs)))); + case 'linear-light': + return clamp01(cb + 2 * cs - 1); + case 'pin-light': + return cs <= 0.5 ? Math.min(cb, 2 * cs) : Math.max(cb, 2 * cs - 1); + case 'hard-mix': { + const vivid = cs <= 0.5 + ? (cs === 0 ? 0 : 1 - Math.min(1, (1 - cb) / (2 * cs))) + : (cs === 1 ? 1 : Math.min(1, cb / (2 * (1 - cs)))); + return vivid < 0.5 ? 0 : 1; + } + case 'subtract': + return clamp01(cb - cs); + case 'divide': + return cs === 0 ? 1 : clamp01(cb / cs); + default: + return cs; + } +} + +function dissolveRandom(i) { + let seed = (i * 2654435761) >>> 0; + seed ^= seed >>> 13; + seed = (seed * 1274126177) >>> 0; + return seed / 4294967296; +} + +function ensureSourceData(source) { + const sw = source.width || source.naturalWidth || 0; + const sh = source.height || source.naturalHeight || 0; + if (!sw || !sh) return null; + const scratch = document.createElement('canvas'); + scratch.width = sw; + scratch.height = sh; + const sctx = scratch.getContext('2d'); + sctx.drawImage(source, 0, 0, sw, sh); + return { data: sctx.getImageData(0, 0, sw, sh).data, sw, sh }; +} + +function blendCustom(ctx, source, mode, alpha, dx, dy) { + if (alpha <= 0) return; + const src = ensureSourceData(source); + if (!src) return; + const tw = ctx.canvas.width; + const th = ctx.canvas.height; + const sw = src.sw; + const sh = src.sh; + const sx0 = Math.max(0, -dx); + const sy0 = Math.max(0, -dy); + const dx0 = Math.max(0, dx); + const dy0 = Math.max(0, dy); + const w = Math.min(sw - sx0, tw - dx0); + const h = Math.min(sh - sy0, th - dy0); + if (w <= 0 || h <= 0) return; + + const dst = ctx.getImageData(dx0, dy0, w, h); + const dd = dst.data; + const sd = src.data; + const nonSeparable = NON_SEPARABLE.has(mode); + const dissolve = mode === 'dissolve'; + + for (let y = 0; y < h; y += 1) { + for (let x = 0; x < w; x += 1) { + const si = ((y + sy0) * sw + (x + sx0)) * 4; + const di = (y * w + x) * 4; + const sa = (sd[si + 3] / 255) * alpha; + const ba = dd[di + 3] / 255; + + if (dissolve) { + const seed = (y + dy0) * 73856093 ^ (x + dx0) * 19349663; + if (dissolveRandom(seed) >= sa) continue; + dd[di] = sd[si]; + dd[di + 1] = sd[si + 1]; + dd[di + 2] = sd[si + 2]; + dd[di + 3] = 255; + continue; + } + + if (sa === 0) continue; + + const sr = sd[si] / 255; + const sg = sd[si + 1] / 255; + const sb = sd[si + 2] / 255; + const br = dd[di] / 255; + const bg = dd[di + 1] / 255; + const bb = dd[di + 2] / 255; + + let mergedR; + let mergedG; + let mergedB; + if (nonSeparable) { + const backdropLum = lum(br, bg, bb); + const sourceLum = lum(sr, sg, sb); + const useSource = mode === 'darker-color' ? sourceLum < backdropLum : sourceLum > backdropLum; + mergedR = useSource ? sr : br; + mergedG = useSource ? sg : bg; + mergedB = useSource ? sb : bb; + } else { + mergedR = blendChannel(mode, br, sr); + mergedG = blendChannel(mode, bg, sg); + mergedB = blendChannel(mode, bb, sb); + } + + const srEff = (1 - ba) * sr + ba * mergedR; + const sgEff = (1 - ba) * sg + ba * mergedG; + const sbEff = (1 - ba) * sb + ba * mergedB; + + const ao = sa + ba * (1 - sa); + if (ao <= 0) continue; + const cr = (sa * srEff + ba * br * (1 - sa)) / ao; + const cg = (sa * sgEff + ba * bg * (1 - sa)) / ao; + const cbOut = (sa * sbEff + ba * bb * (1 - sa)) / ao; + + dd[di] = Math.round(clamp01(cr) * 255); + dd[di + 1] = Math.round(clamp01(cg) * 255); + dd[di + 2] = Math.round(clamp01(cbOut) * 255); + dd[di + 3] = Math.round(ao * 255); + } + } + ctx.putImageData(dst, dx0, dy0); +} + +/** + * Composite `source` onto a 2D context (or canvas) using `mode` at `alpha`. + * Native modes use globalCompositeOperation; the rest fall back to pixel math. + */ +export function blendDraw(target, source, mode, alpha = 1, dx = 0, dy = 0) { + if (!target || !source) return; + const ctx = typeof target.getContext === 'function' ? target.getContext('2d') : target; + const a = Number.isFinite(alpha) ? clamp01(alpha) : 1; + const normalized = mode || 'source-over'; + if (isNativeBlendMode(normalized)) { + const prevAlpha = ctx.globalAlpha; + const prevOp = ctx.globalCompositeOperation; + ctx.globalAlpha = a; + ctx.globalCompositeOperation = NATIVE_ALIASES[normalized] || normalized; + ctx.drawImage(source, dx, dy); + ctx.globalAlpha = prevAlpha; + ctx.globalCompositeOperation = prevOp; + return; + } + blendCustom(ctx, source, normalized, a, dx, dy); +} diff --git a/static/js/editor/brush-engine.js b/static/js/editor/brush-engine.js index 3c6950f98..97c9d093a 100644 --- a/static/js/editor/brush-engine.js +++ b/static/js/editor/brush-engine.js @@ -24,6 +24,32 @@ export function createBrushSampler({ getDiameter, getSpacing, getSmoothing, emit emit(emitted); }; + // Emit evenly spaced dabs from the last emitted sample toward `target`, + // carrying the sub-spacing remainder forward. Shared by drag updates and + // the final pointer-up so a stroke ends on the same spacing grid instead + // of stamping one detached dab (which reads as a dot where drawing stopped). + const emitSpaced = (target) => { + if (!emitted) return; + const start = { ...emitted }; + const dx = target.x - start.x; + const dy = target.y - start.y; + const distance = Math.hypot(dx, dy); + if (!distance) return; + const diameter = Math.max(1, Number(getDiameter()) || 1); + const spacing = Math.max(0.5, diameter * Math.max(0.01, Number(getSpacing()) || 0.01)); + let travelled = spacing - remainder; + while (travelled <= distance) { + const t = travelled / distance; + output({ + x: start.x + dx * t, + y: start.y + dy * t, + pressure: start.pressure + (target.pressure - start.pressure) * t, + }); + travelled += spacing; + } + remainder = Math.max(0, distance - (travelled - spacing)); + }; + const begin = (sample) => { emitted = null; filtered = { ...sample, pressure: normalisePressure(sample.pressure) }; @@ -41,30 +67,14 @@ export function createBrushSampler({ getDiameter, getSpacing, getSmoothing, emit y: filtered.y + (raw.y - filtered.y) * response, pressure: filtered.pressure + (raw.pressure - filtered.pressure) * response, }; - const start = { ...emitted }; - const dx = filtered.x - start.x; - const dy = filtered.y - start.y; - const distance = Math.hypot(dx, dy); - if (!distance) return; - const diameter = Math.max(1, Number(getDiameter()) || 1); - const spacing = Math.max(0.5, diameter * Math.max(0.01, Number(getSpacing()) || 0.01)); - let travelled = spacing - remainder; - while (travelled <= distance) { - const t = travelled / distance; - output({ - x: start.x + dx * t, - y: start.y + dy * t, - pressure: start.pressure + (filtered.pressure - start.pressure) * t, - }); - travelled += spacing; - } - remainder = Math.max(0, distance - (travelled - spacing)); + emitSpaced(filtered); }; const end = (sample) => { + // Reach the true pointer-up point along the spacing grid rather than with + // a single far dab, so the stroke does not terminate in a detached dot. if (sample && emitted) { - const finalSample = { ...sample, pressure: normalisePressure(sample.pressure) }; - if (Math.hypot(finalSample.x - emitted.x, finalSample.y - emitted.y) > 0.25) output(finalSample); + emitSpaced({ ...sample, pressure: normalisePressure(sample.pressure) }); } emitted = null; filtered = null; diff --git a/static/js/editor/brush-presets.js b/static/js/editor/brush-presets.js index 5c1eab246..9533714bc 100644 --- a/static/js/editor/brush-presets.js +++ b/static/js/editor/brush-presets.js @@ -4,6 +4,7 @@ const BUILT_INS = [ { id: 'soft-round', name: 'Soft Round', size: 80, opacity: 100, flow: 35, softness: 100, spacing: 12, smoothing: 25, blendMode: 'source-over' }, { id: 'hard-round', name: 'Hard Round', size: 24, opacity: 100, flow: 100, softness: 0, spacing: 18, smoothing: 15, blendMode: 'source-over' }, { id: 'detail', name: 'Detail', size: 6, opacity: 100, flow: 70, softness: 20, spacing: 10, smoothing: 55, blendMode: 'source-over' }, + { id: 'pixel-1px', name: 'Pixel', size: 1, opacity: 100, flow: 100, softness: 0, spacing: 1, smoothing: 0, blendMode: 'source-over', pixel: true }, ]; export function loadBrushPresets(storage = globalThis.localStorage) { @@ -31,6 +32,7 @@ export function captureBrushPreset(state, name) { spacing: state.brushSpacing, smoothing: state.brushSmoothing, blendMode: state.brushBlendMode, + pixel: !!state.brushPixel, }; } @@ -43,4 +45,6 @@ export function applyBrushPreset(state, preset) { state.brushSpacing = preset.spacing; state.brushSmoothing = preset.smoothing; state.brushBlendMode = preset.blendMode || 'source-over'; + state.brushPixel = !!preset.pixel; } + diff --git a/static/js/editor/build/command-palette.js b/static/js/editor/build/command-palette.js new file mode 100644 index 000000000..2bef2c873 --- /dev/null +++ b/static/js/editor/build/command-palette.js @@ -0,0 +1,80 @@ +/** Command palette (Ctrl/Cmd+K): fuzzy list of tools, panels and actions. */ + +export function createCommandPalette({ commands = [], onRun = null } = {}) { + const overlay = document.createElement('div'); + overlay.className = 'ge-command-palette'; + overlay.hidden = true; + overlay.setAttribute('role', 'dialog'); + overlay.setAttribute('aria-modal', 'true'); + overlay.setAttribute('aria-label', 'Command palette'); + overlay.innerHTML = ` +
+ +
+
`; + document.body.appendChild(overlay); + + const input = overlay.querySelector('.ge-command-input'); + const list = overlay.querySelector('.ge-command-list'); + let filtered = []; + let activeIndex = 0; + + function render() { + const query = input.value.trim().toLowerCase(); + filtered = commands.filter(cmd => !query || String(cmd.label).toLowerCase().includes(query)); + list.innerHTML = ''; + if (!filtered.length) { + const empty = document.createElement('p'); + empty.className = 'ge-command-empty'; + empty.textContent = 'No matching commands'; + list.appendChild(empty); + return; + } + if (activeIndex >= filtered.length) activeIndex = 0; + filtered.forEach((cmd, index) => { + const row = document.createElement('button'); + row.type = 'button'; + row.className = `ge-command-item${index === activeIndex ? ' active' : ''}`; + row.setAttribute('role', 'option'); + row.setAttribute('aria-selected', index === activeIndex ? 'true' : 'false'); + row.textContent = cmd.label; + row.addEventListener('click', () => run(cmd)); + list.appendChild(row); + }); + } + + function run(cmd) { + close(); + if (typeof cmd.run === 'function') cmd.run(); + else if (typeof onRun === 'function') onRun(cmd); + } + + function open() { + overlay.hidden = false; + input.value = ''; + activeIndex = 0; + render(); + input.focus(); + } + + function close() { + overlay.hidden = true; + } + + input.addEventListener('input', () => { activeIndex = 0; render(); }); + input.addEventListener('keydown', (event) => { + if (event.key === 'Escape') { event.preventDefault(); close(); } + else if (event.key === 'ArrowDown') { event.preventDefault(); activeIndex = Math.min(activeIndex + 1, filtered.length - 1); render(); } + else if (event.key === 'ArrowUp') { event.preventDefault(); activeIndex = Math.max(activeIndex - 1, 0); render(); } + else if (event.key === 'Enter') { event.preventDefault(); if (filtered[activeIndex]) run(filtered[activeIndex]); } + }); + overlay.addEventListener('pointerdown', (event) => { if (event.target === overlay) close(); }); + + return { + element: overlay, + open, + close, + toggle: () => (overlay.hidden ? open() : close()), + isOpen: () => !overlay.hidden, + }; +} diff --git a/static/js/editor/build/controls.js b/static/js/editor/build/controls.js index 74f9d1fcb..ba2c09330 100644 --- a/static/js/editor/build/controls.js +++ b/static/js/editor/build/controls.js @@ -6,10 +6,10 @@ * sections are all toggled `display:none` here; the tool-switch handler * in galleryEditor.js shows the section matching the active tool. * - * @param {{ color: string, brushSize: number, wandTolerance: number }} ctx + * @param {{ color: string, brushSize: number, wandTolerance: number, bucketTolerance: number, cropAspectPreset: string, eyedropperSampleSize: number }} ctx * @returns {string} */ -export function controlsHTML({ color, brushSize, wandTolerance }) { +export function controlsHTML({ color, brushSize, wandTolerance, bucketTolerance = 32, cropAspectPreset = 'free', eyedropperSampleSize = 1 }) { const brushSliderValue = Math.round(Math.log(Math.max(1, brushSize)) / Math.log(800) * 1000); return `
+
+ + + + + +
Edit
@@ -43,7 +45,7 @@ export function shortcutsPopupHTML() {
Ctrl+Shift+S Save to Gallery
Ctrl+Alt+J New Layer
Ctrl+Alt+G Clipping Mask
-
Ctrl+Alt+T Free Transform
+
Ctrl+T Free Transform
Ctrl+Shift+T Canvas size…
@@ -62,6 +64,13 @@ export function shortcutsPopupHTML() {
] Brush size +
Drag tolerance slider → live wand retune
+
+
Touch
+
Pinch → Zoom
+
Two-finger drag → Pan
+
Two-finger tap → Undo
+
Three-finger tap → Redo
+
Press ? or click the keyboard icon to toggle.
`; @@ -81,6 +90,7 @@ export function historyPanelHTML(historyIcon) { +
`; } @@ -95,6 +105,7 @@ export function canvasSizePromptHTML() {