Skip to content

Add Visual Editing to Live Preview pane#26463

Merged
AlexGaillard merged 33 commits intomainfrom
bry/visual-editing-preview-v2
Jan 21, 2026
Merged

Add Visual Editing to Live Preview pane#26463
AlexGaillard merged 33 commits intomainfrom
bry/visual-editing-preview-v2

Conversation

@bryantgillespie
Copy link
Member

@bryantgillespie bryantgillespie commented Jan 7, 2026

Scope

What's changed:

Adds visual editing capability to the live preview pane. This is a nice improvement for content editors where visual editing is enabled because it uses the live preview URLs to render the visual editor on the same page without having to navigate to the module. No context switching.

Update of
#26264

Potential Risks / Drawbacks

  • Not sure of any

Tested Scenarios

  • Tested to work great in Chrome and Firefox (thanks @formfcw 🙌 )

Review Notes / Questions

  • I would like to lorem ipsum
  • Special attention should be paid to dolor sit amet

Checklist

  • Added or updated tests
  • Documentation PR created here

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds visual editing capability to the live preview pane, allowing content editors to use visual editing features directly within the split-view interface without navigating to the Visual Editor module. The implementation includes a full-width mode with drag-to-expand functionality, a display options menu, and seamless integration with the existing Visual Editor module.

Key changes:

  • Added visual editing layer integration to live preview with two-layer enablement checks (prerequisites and same-origin validation)
  • Implemented full-width mode for live preview with automatic toggle at 95% drag threshold
  • Added display options menu consolidating preview actions (new window, visual editor, full-width)

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated no comments.

Show a summary per file
File Description
app/src/views/private/components/live-preview.vue Main component changes: added visual editing props, editing layer integration, display options menu, full-width mode support, and toggle editable elements button
app/src/utils/normalize-url.ts New utility to normalize URLs against window location with error handling
app/src/utils/normalize-url.test.ts Comprehensive test coverage for URL normalization edge cases
app/src/modules/visual/utils/same-origin.test.ts New tests for same-origin validation utility
app/src/modules/visual/components/editing-layer.vue Added 'saved' event emission for integration with live preview
app/src/modules/content/routes/preview.vue Integrated visual editing composable and passed props to LivePreview
app/src/modules/content/routes/item.vue Added full-width mode with auto-toggle logic, visual editing integration, and display options slot
app/src/styles/_base.scss Moved iframe pointer-events style to global scope for better reusability
app/src/lang/translations/en-US.yaml Added translation keys for new UI features
app/src/composables/use-visual-editing.ts New composable handling visual editing prerequisites validation
app/src/composables/use-visual-editing.test.ts Comprehensive test suite for visual editing enablement logic
.changeset/hungry-cats-swim.md Changeset documenting the minor version feature addition

@formfcw formfcw self-requested a review January 8, 2026 09:07
@bryantgillespie bryantgillespie marked this pull request as ready for review January 8, 2026 13:39
Copy link
Member

@rijkvanzanten rijkvanzanten left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. @formfcw can I get a once-over from you? 🙏

Copy link
Contributor

@formfcw formfcw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @bryantgillespie 🎉 It feels great. I really love it! ❤️

I still need to look more into the changes to the live-preview.vue file, but I already have a few minor requests.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

@codecov
Copy link

codecov bot commented Jan 20, 2026

Codecov Report

❌ Patch coverage is 98.88268% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 63.24%. Comparing base (8884e25) to head (78afad0).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #26463      +/-   ##
==========================================
+ Coverage   63.19%   63.24%   +0.04%     
==========================================
  Files        2111     2113       +2     
  Lines      137069   137234     +165     
  Branches     9010     9025      +15     
==========================================
+ Hits        86623    86792     +169     
+ Misses      50446    50442       -4     
Flag Coverage Δ
api 46.62% <ø> (ø)
app 74.14% <98.88%> (+0.06%) ⬆️
composables 82.35% <ø> (ø)
create-directus-extension 94.44% <ø> (ø)
create-directus-project 98.43% <ø> (ø)
env 99.67% <ø> (ø)
errors 97.47% <ø> (ø)
extensions 35.63% <ø> (ø)
extensions-registry 95.27% <ø> (ø)
extensions-sdk 14.33% <ø> (ø)
format-title 100.00% <ø> (ø)
memory 95.64% <ø> (ø)
pressure 77.63% <ø> (ø)
release-notes-generator 81.14% <ø> (ø)
schema-builder 81.42% <ø> (ø)
sdk 25.95% <ø> (ø)
storage 92.00% <ø> (ø)
storage-driver-azure 76.76% <ø> (ø)
storage-driver-cloudinary 81.14% <ø> (ø)
storage-driver-gcs 69.72% <ø> (ø)
storage-driver-local 69.76% <ø> (ø)
storage-driver-s3 52.04% <ø> (ø)
storage-driver-supabase 68.63% <ø> (ø)
system-data 71.42% <ø> (ø)
update-check 55.67% <ø> (ø)
utils 90.26% <ø> (ø)
validation 44.50% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@formfcw formfcw changed the title Add Visual Editing to Live Preview pane - Take 2 Add Visual Editing to Live Preview pane Jan 21, 2026
Copy link
Contributor

@formfcw formfcw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few more change requests. Also, please update the PR description with our template for future reference.

Copy link
Contributor

@formfcw formfcw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm happy that we finally have this in such a nice way 🙌

LGTM 🎉

Copy link
Member

@AlexGaillard AlexGaillard left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🆒🫘

@AlexGaillard AlexGaillard merged commit a200f32 into main Jan 21, 2026
69 checks passed
@AlexGaillard AlexGaillard deleted the bry/visual-editing-preview-v2 branch January 21, 2026 21:26
@github-actions github-actions bot added this to the Next Release milestone Jan 21, 2026
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Feb 5, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [directus/directus](https://github.com/directus/directus) | minor | `11.14.1` → `11.15.0` |

---

### Release Notes

<details>
<summary>directus/directus (directus/directus)</summary>

### [`v11.15.0`](https://github.com/directus/directus/releases/tag/v11.15.0)

[Compare Source](directus/directus@v11.14.1...v11.15.0)

##### ⚠️ Potential Breaking Changes

**Attached prompts, content items, and visual editor elements to AI Assistant Context ([#&#8203;26512](directus/directus#26512) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))**
To use this feature, update [@&#8203;directus/visual-editing](https://github.com/directus/visual-editing) to v1.2.0+ on your website.

##### ✨ New Features & Improvements

- **[@&#8203;directus/app](https://github.com/directus/app)**
  - Added deployment module for triggering deployments from Directus with Vercel as first supported provider ([#&#8203;26473](directus/directus#26473) by [@&#8203;gaetansenn](https://github.com/gaetansenn))
  - Added collaborative editing ([#&#8203;26172](directus/directus#26172) by [@&#8203;Nitwel](https://github.com/Nitwel))
  - Attached prompts, content items, and visual editor elements to AI Assistant Context ([#&#8203;26512](directus/directus#26512) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
  - Added multi-provider AI support with Google and OpenAI-compatible providers. Extracted shared AI types into new `@directus/ai` package. ([#&#8203;26481](directus/directus#26481) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
  - Added toggle to allow comparing revision to previous revision ([#&#8203;26480](directus/directus#26480) by [@&#8203;robluton](https://github.com/robluton))
  - Added relational field support on x-axis of bar chart ([#&#8203;26489](directus/directus#26489) by [@&#8203;JamesW1](https://github.com/JamesW1))
  - Added visual editing support to the live preview split pane, including display options menu, full-width mode with drag-to-expand, and quick access to the Visual Editor module. ([#&#8203;26463](directus/directus#26463) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
  - Changed permission-blocked fields from disabled to non-editable appearance ([#&#8203;26572](directus/directus#26572) by [@&#8203;HZooly](https://github.com/HZooly))
- **[@&#8203;directus/api](https://github.com/directus/api)**
  - Added deployment module for triggering deployments from Directus with Vercel as first supported provider ([#&#8203;26473](directus/directus#26473) by [@&#8203;gaetansenn](https://github.com/gaetansenn))
  - Added collaborative editing ([#&#8203;26172](directus/directus#26172) by [@&#8203;Nitwel](https://github.com/Nitwel))
  - Attached prompts, content items, and visual editor elements to AI Assistant Context ([#&#8203;26512](directus/directus#26512) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
  - Added multi-provider AI support with Google and OpenAI-compatible providers. Extracted shared AI types into new `@directus/ai` package. ([#&#8203;26481](directus/directus#26481) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
- **[@&#8203;directus/sdk](https://github.com/directus/sdk)**
  - Fixed race condition and allow accessing the connected state ([#&#8203;26511](directus/directus#26511) by [@&#8203;Nitwel](https://github.com/Nitwel))
  - Added deployment module for triggering deployments from Directus with Vercel as first supported provider ([#&#8203;26473](directus/directus#26473) by [@&#8203;gaetansenn](https://github.com/gaetansenn))
- **[@&#8203;directus/system-data](https://github.com/directus/system-data)**
  - Added deployment module for triggering deployments from Directus with Vercel as first supported provider ([#&#8203;26473](directus/directus#26473) by [@&#8203;gaetansenn](https://github.com/gaetansenn))
- **[@&#8203;directus/types](https://github.com/directus/types)**
  - Added deployment module for triggering deployments from Directus with Vercel as first supported provider ([#&#8203;26473](directus/directus#26473) by [@&#8203;gaetansenn](https://github.com/gaetansenn))
  - Added collaborative editing ([#&#8203;26172](directus/directus#26172) by [@&#8203;Nitwel](https://github.com/Nitwel))
  - Added multi-provider AI support with Google and OpenAI-compatible providers. Extracted shared AI types into new `@directus/ai` package. ([#&#8203;26481](directus/directus#26481) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
- **[@&#8203;directus/errors](https://github.com/directus/errors)**
  - Added deployment module for triggering deployments from Directus with Vercel as first supported provider ([#&#8203;26473](directus/directus#26473) by [@&#8203;gaetansenn](https://github.com/gaetansenn))
- **[@&#8203;directus/env](https://github.com/directus/env)**
  - Added deployment module for triggering deployments from Directus with Vercel as first supported provider ([#&#8203;26473](directus/directus#26473) by [@&#8203;gaetansenn](https://github.com/gaetansenn))
  - Added collaborative editing ([#&#8203;26172](directus/directus#26172) by [@&#8203;Nitwel](https://github.com/Nitwel))
- **[@&#8203;directus/utils](https://github.com/directus/utils)**
  - Added collaborative editing ([#&#8203;26172](directus/directus#26172) by [@&#8203;Nitwel](https://github.com/Nitwel))
- **[@&#8203;directus/ai](https://github.com/directus/ai)**
  - Attached prompts, content items, and visual editor elements to AI Assistant Context ([#&#8203;26512](directus/directus#26512) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
  - Added multi-provider AI support with Google and OpenAI-compatible providers. Extracted shared AI types into new `@directus/ai` package. ([#&#8203;26481](directus/directus#26481) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
- **[@&#8203;directus/memory](https://github.com/directus/memory)**
  - Added distributed locking ([#&#8203;26172](directus/directus#26172) by [@&#8203;Nitwel](https://github.com/Nitwel))

##### 🐛 Bug Fixes & Optimizations

- **[@&#8203;directus/app](https://github.com/directus/app)**
  - Replaced deprecated `ldapjs` with `ldapts` ([#&#8203;26363](directus/directus#26363) by [@&#8203;dstockton](https://github.com/dstockton))
  - Fixed an issue where the caret would jump to the end of the input in `v-template-input` when typing or updating content. ([#&#8203;26520](directus/directus#26520) by [@&#8203;mustafaazad03](https://github.com/mustafaazad03))
  - Fixed back button navigation on related items ([#&#8203;26553](directus/directus#26553) by [@&#8203;robluton](https://github.com/robluton))
  - Fixed table options menu clipping in markdown editor ([#&#8203;26487](directus/directus#26487) by [@&#8203;DamnItAzriel](https://github.com/DamnItAzriel))
  - Hide AI settings page when MCP and AI features are disabled through ENV ([#&#8203;26504](directus/directus#26504) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
  - Updated dependency ([#&#8203;26518](directus/directus#26518) by [@&#8203;rijkvanzanten](https://github.com/rijkvanzanten))
  - Fixed inconsistent disabled state across interfaces ([#&#8203;26470](directus/directus#26470) by [@&#8203;formfcw](https://github.com/formfcw))
  - Fixed an issue where custom CSS classes applied to PrivateView were not rendered ([#&#8203;26523](directus/directus#26523) by [@&#8203;u12206050](https://github.com/u12206050))
  - Fixed WYSIWYG interface not rendering when field is named "tooltip" ([#&#8203;26581](directus/directus#26581) by [@&#8203;robluton](https://github.com/robluton))
  - Fixed issue preventing sidebar details from being fetched when navigating back ([#&#8203;26542](directus/directus#26542) by [@&#8203;robluton](https://github.com/robluton))
  - Fixed Vue warning by passing required prop to interfaces ([#&#8203;26506](directus/directus#26506) by [@&#8203;formfcw](https://github.com/formfcw))
  - Fixed hardcoded "Loading..." text in field tree by using translation key ([#&#8203;26526](directus/directus#26526) by [@&#8203;sinan-yildiz-marsus](https://github.com/sinan-yildiz-marsus))
  - Renamed AI Chat to AI Assistant ([#&#8203;26517](directus/directus#26517) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
- **[@&#8203;directus/api](https://github.com/directus/api)**
  - Improved error message for system field updates that are not schema.is\_indexed ([#&#8203;26548](directus/directus#26548) by [@&#8203;JamesW1](https://github.com/JamesW1))
  - Replaced deprecated `ldapjs` with `ldapts` ([#&#8203;26363](directus/directus#26363) by [@&#8203;dstockton](https://github.com/dstockton))
  - Changed users.last\_access display mode to absolute ([#&#8203;26548](directus/directus#26548) by [@&#8203;JamesW1](https://github.com/JamesW1))
- **[@&#8203;directus/system-data](https://github.com/directus/system-data)**
  - Added collaborative editing ([#&#8203;26172](directus/directus#26172) by [@&#8203;Nitwel](https://github.com/Nitwel))
  - Added multi-provider AI support with Google and OpenAI-compatible providers. Extracted shared AI types into new `@directus/ai` package. ([#&#8203;26481](directus/directus#26481) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
  - Changed users.last\_access display mode to absolute ([#&#8203;26548](directus/directus#26548) by [@&#8203;JamesW1](https://github.com/JamesW1))
  - Renamed AI Chat to AI Assistant ([#&#8203;26517](directus/directus#26517) by [@&#8203;bryantgillespie](https://github.com/bryantgillespie))
- **[@&#8203;directus/env](https://github.com/directus/env)**
  - Fixed LDAP DN properties casted as arrays ([#&#8203;26579](directus/directus#26579) by [@&#8203;ComfortablyCoding](https://github.com/ComfortablyCoding))
- **[@&#8203;directus/memory](https://github.com/directus/memory)**
  - Handled empty buffers to prevent errors during race conditions or disconnects ([#&#8203;26172](directus/directus#26172) by [@&#8203;Nitwel](https://github.com/Nitwel))

##### 📦 Published Versions

- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/storage-driver-s3@&#8203;12.1.1`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4zLjYiLCJ1cGRhdGVkSW5WZXIiOiI0My4zLjYiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImltYWdlIl19-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/3752
Co-authored-by: Renovate Bot <[email protected]>
Co-committed-by: Renovate Bot <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants