Skip to content

feat: add Markdown rendering mechanism for AI crawlers#54

Open
matipojo wants to merge 73 commits intomain2from
feat/markdown-rendering
Open

feat: add Markdown rendering mechanism for AI crawlers#54
matipojo wants to merge 73 commits intomain2from
feat/markdown-rendering

Conversation

@matipojo
Copy link
Copy Markdown
Owner

Add a new module that serves Elementor page content as Markdown when crawlers send Accept: text/markdown header or ?format=markdown param.

  • Register markdown_rendering experiment (default inactive, alpha)
  • Intercept requests via template_redirect with Accept header detection
  • Core MarkdownRenderer tree walker with YAML frontmatter and --- separators
  • Add render_markdown() to Element_Base with recursive default
  • Widget_Base fallback via strip_tags for unknown widgets
  • Override render_markdown() in all classic widgets (29 widgets)
  • Override render_markdown() in atomic widgets (8 widgets)
  • HTML-to-Markdown converter for rich text content
  • Post meta caching with configurable TTL
  • Rate limiting and security hardening
  • Editor top bar View as Markdown menu item
  • Filter hooks for Pro/third-party extensibility
  • Comprehensive test suite

PR Checklist

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • Other... Please describe:

Summary

This PR can be summarized in the following changelog entry:

Description

An explanation of what is done in this PR

Test instructions

This PR can be tested by following these steps:

Quality assurance

  • I have tested this code to the best of my abilities
  • I have added unittests to verify the code works as intended
  • Docs have been added / updated (for bug fixes / features)

Fixes #

@matipojo matipojo force-pushed the feat/markdown-rendering branch from 207be68 to 2589d2a Compare February 21, 2026 19:16
Co-authored-by: Cursor <cursoragent@cursor.com>
@matipojo matipojo force-pushed the feat/markdown-rendering branch from 2589d2a to eda9991 Compare February 21, 2026 19:18
matipojo and others added 24 commits February 21, 2026 21:27
…4827)

## PR Checklist
<!-- 
Please check if your PR fulfills the following requirements:
**Filling out the template is required.** Any pull request that does not
include enough information to be reviewed in a timely manner may be
closed at the maintainers' discretion.
 -->
- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x" with no
spaces eg: [x]. -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Documentation content changes
- [ ] Other... Please describe:

## Summary

This PR can be summarized in the following changelog entry:

*

## Description
An explanation of what is done in this PR

*

## Test instructions
This PR can be tested by following these steps:

*

## Quality assurance

- [ ] I have tested this code to the best of my abilities
- [ ] I have added unittests to verify the code works as intended
- [ ] Docs have been added / updated (for bug fixes / features)

Fixes #

<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Refactor interactions promotion logic by extracting reusable
PromotionSelect component to standardize upgrade prompts across trigger
and easing controls.

Main changes:
- Created PromotionSelect component consolidating promotion UI logic
from Easing and Trigger controls with configurable options
- Updated test selectors to use hidden:true flag for compatibility with
disablePortal menu rendering changes
- Exported DEFAULT_VALUES constant and added aria-label to Field
component for improved test accessibility

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->

---------

Co-authored-by: ElementorBot <48412871+elementorbot@users.noreply.github.com>
Co-authored-by: Netanel Baba <50736016+Ntnelbaba@users.noreply.github.com>
## PR Checklist
<!-- 
Please check if your PR fulfills the following requirements:
**Filling out the template is required.** Any pull request that does not
include enough information to be reviewed in a timely manner may be
closed at the maintainers' discretion.
 -->
- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x" with no
spaces eg: [x]. -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Documentation content changes
- [ ] Other... Please describe:

## Summary

This PR can be summarized in the following changelog entry:

*

## Description
An explanation of what is done in this PR

*

## Test instructions
This PR can be tested by following these steps:

*

## Quality assurance

- [ ] I have tested this code to the best of my abilities
- [ ] I have added unittests to verify the code works as intended
- [ ] Docs have been added / updated (for bug fixes / features)

Fixes #

<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Refactor variables storage system to increase global variables
limit from 100 to 1000 and centralize configuration constants for better
maintainability.

Main changes:
- Created Constants class centralizing FORMAT_VERSION_V1,
FORMAT_VERSION_V2, TOTAL_VARIABLES_COUNT (1000), and VARIABLES_META_KEY
definitions
- Migrated constant references from Variables_Collection and Repository
classes to use centralized Constants class
- Updated limit validation logic across repository, collection, and
import-export modules to enforce new 1000 variable threshold

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->

---------

Co-authored-by: ElementorBot <48412871+elementorbot@users.noreply.github.com>
## PR Checklist
<!-- 
Please check if your PR fulfills the following requirements:
**Filling out the template is required.** Any pull request that does not
include enough information to be reviewed in a timely manner may be
closed at the maintainers' discretion.
 -->
- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x" with no
spaces eg: [x]. -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Documentation content changes
- [ ] Other... Please describe:

## Summary

This PR can be summarized in the following changelog entry:

*

## Description
An explanation of what is done in this PR

*

## Test instructions
This PR can be tested by following these steps:

*

## Quality assurance

- [ ] I have tested this code to the best of my abilities
- [ ] I have added unittests to verify the code works as intended
- [ ] Docs have been added / updated (for bug fixes / features)

Fixes #

<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Fix inconsistent label capitalization for the "While scrolling"
disabled trigger option to maintain consistent UI text formatting across
the trigger component.
Main changes:
- Updated DISABLED_OPTIONS label from "While Scrolling" to "While
scrolling" for consistent sentence-case capitalization across all
trigger options

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->
…truth [ED-22093] (elementor#34849)

## PR Checklist
<!-- 
Please check if your PR fulfills the following requirements:
**Filling out the template is required.** Any pull request that does not
include enough information to be reviewed in a timely manner may be
closed at the maintainers' discretion.
 -->
- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x" with no
spaces eg: [x]. -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Documentation content changes
- [ ] Other... Please describe:

## Summary

This PR can be summarized in the following changelog entry:

*

## Description
An explanation of what is done in this PR

*

## Test instructions
This PR can be tested by following these steps:

*

## Quality assurance

- [ ] I have tested this code to the best of my abilities
- [ ] I have added unittests to verify the code works as intended
- [ ] Docs have been added / updated (for bug fixes / features)

Fixes #


[ED-22093]:
https://elementor.atlassian.net/browse/ED-22093?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
…tor#34850)

## PR Checklist
<!-- 
Please check if your PR fulfills the following requirements:
**Filling out the template is required.** Any pull request that does not
include enough information to be reviewed in a timely manner may be
closed at the maintainers' discretion.
 -->
- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x" with no
spaces eg: [x]. -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Documentation content changes
- [ ] Other... Please describe:

## Summary

This PR can be summarized in the following changelog entry:

*

## Description
An explanation of what is done in this PR

*

## Test instructions
This PR can be tested by following these steps:

*

## Quality assurance

- [ ] I have tested this code to the best of my abilities
- [ ] I have added unittests to verify the code works as intended
- [ ] Docs have been added / updated (for bug fixes / features)

Fixes #
Batsirai-muchareva and others added 30 commits February 24, 2026 06:41
…lementor#34866)

## PR Checklist

- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?

- [ ] Bugfix
- [ ] Refactoring (no functional changes, no api changes)

## Summary

This PR can be summarized in the following changelog entry:

* Removes unnecessary interactions normalization logic.

## Description
Removes the `normalizeInteractions` function and its related files. The
normalization process was found to be redundant. Also, it makes
`customEffects` a required property to avoid possible type issues.

## Test instructions
This PR can be tested by following these steps:

* Verify that interactions within the editor continue to function as
expected after the normalization logic has been removed.

## Quality assurance

- [ ] I have tested this code to the best of my abilities

Fixes ED-21588
<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Fix type definition inconsistency by making customEffects a
required property in InteractionsControlPropsMap to prevent undefined
behavior in interactions controls.

Main changes:
- Changed customEffects property from optional to required in
InteractionsControlPropsMap type definition
- Aligned customEffects type signature with other control properties for
consistent type checking

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->
<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Add comprehensive end-to-end tests for new onboarding flow to
ensure user journey and API interaction validation [ED-22746]

Main changes:
- Created full onboarding happy path test covering all steps from login
through site features with API mocking
- Added data-testid attributes to ExperienceLevel and SiteFeatures
components for reliable test selection
- Implemented navigation state preservation tests validating user
selections persist across back navigation between steps

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->


[ED-22746]:
https://elementor.atlassian.net/browse/ED-22746?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

---------

Co-authored-by: ElementorBot <48412871+elementorbot@users.noreply.github.com>
…r#34871)

Reverts elementor#34821
<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Revert image format change from WebP back to PNG for all
onboarding step backgrounds and login screens.

Main changes:
- Changed background image format from .webp to .png across all
onboarding steps (step-1 through step-5)
- Reverted login background image from login.webp to login.png in
fullscreen card component
- Updated DEFAULT_CONFIG and LOGIN_CONFIG to use PNG format instead of
WebP

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->
…4870)

## PR Checklist
<!-- 
Please check if your PR fulfills the following requirements:
**Filling out the template is required.** Any pull request that does not
include enough information to be reviewed in a timely manner may be
closed at the maintainers' discretion.
 -->
- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x" with no
spaces eg: [x]. -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Documentation content changes
- [ ] Other... Please describe:

## Summary

This PR can be summarized in the following changelog entry:

*

## Description
An explanation of what is done in this PR

*

## Test instructions
This PR can be tested by following these steps:

*

## Quality assurance

- [ ] I have tested this code to the best of my abilities
- [ ] I have added unittests to verify the code works as intended
- [ ] Docs have been added / updated (for bug fixes / features)

Fixes #

<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Refactor Effect control to use PromotionSelect component and
standardize promotion label handling across interaction controls for
consistent upgrade messaging.

Main changes:
- Replaced custom Select implementation in Effect control with
PromotionSelect component matching Easing control pattern
- Made promotionLabel prop optional in PromotionSelect with "PRO
features" fallback, removing it from Easing control
- Exported EFFECT_OPTIONS and BASE_EFFECTS constants for external use in
interactions module

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->

---------

Co-authored-by: ElementorBot <48412871+elementorbot@users.noreply.github.com>
<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Implement final onboarding step with completion screen and
automatic redirect to new page creation after user completes or skips
the last onboarding step.

Main changes:
- Added completion screen with animated progress bar and redirects users
to createNewPage URL upon finishing onboarding
- Modified last step handlers to send complete:true flag and trigger
redirect instead of calling onComplete callback
- Removed continue button disable requirement on site_features step to
allow immediate progression without selection

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->

---------

Co-authored-by: ElementorBot <48412871+elementorbot@users.noreply.github.com>
## PR Checklist
<!-- 
Please check if your PR fulfills the following requirements:
**Filling out the template is required.** Any pull request that does not
include enough information to be reviewed in a timely manner may be
closed at the maintainers' discretion.
 -->
- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x" with no
spaces eg: [x]. -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Documentation content changes
- [ ] Other... Please describe:

## Summary

This PR can be summarized in the following changelog entry:

*

## Description
An explanation of what is done in this PR

*

## Test instructions
This PR can be tested by following these steps:

*

## Quality assurance

- [ ] I have tested this code to the best of my abilities
- [ ] I have added unittests to verify the code works as intended
- [ ] Docs have been added / updated (for bug fixes / features)

Fixes #

<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Skip flaky V4-V3 color variable synchronization tests to
stabilize CI pipeline while test stability issues are investigated and
resolved.

Main changes:
- Added test.describe.skip() to disable 'V4-V3 Color Variable Sync
@v4-tests' test suite execution
- Included TODO comment referencing ED-23110 ticket for tracking test
restoration and stability fixes

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->
… [ED-22746] (elementor#34882)

<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Refactor E-Onboarding test suite to use Playwright's native
request interception pattern instead of mutable variables for URL
validation.

Main changes:
- Replaced string variable `redirectedUrl` with `page.waitForRequest()`
to capture navigation requests using Promise.all pattern
- Removed `.skip` modifier from test suite to re-enable E-Onboarding
test execution
- Simplified route handler by removing async/await and direct URL
extraction from intercepted routes

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->
…8] (elementor#34877)

## PR Checklist
<!-- 
Please check if your PR fulfills the following requirements:
**Filling out the template is required.** Any pull request that does not
include enough information to be reviewed in a timely manner may be
closed at the maintainers' discretion.
 -->
- [ ] The commit message follows our guidelines:
https://github.com/elementor/elementor/blob/master/.github/CONTRIBUTING.md


## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x" with no
spaces eg: [x]. -->
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, local variables)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] CI related changes
- [ ] Documentation content changes
- [ ] Other... Please describe:

## Summary

This PR can be summarized in the following changelog entry:

*

## Description
An explanation of what is done in this PR

*

## Test instructions
This PR can be tested by following these steps:

*

## Quality assurance

- [ ] I have tested this code to the best of my abilities
- [ ] I have added unittests to verify the code works as intended
- [ ] Docs have been added / updated (for bug fixes / features)

Fixes #

<!--start_gitstream_placeholder-->
### ✨ PR Description
Purpose: Fix interaction filtering logic to properly respect breakpoint
exclusion settings and prevent animations from running on excluded
device sizes.

Main changes:
- Moved skipInteraction function to interactions-utils.js and added
breakpoints extraction during animation config normalization
- Refactored unwrapInteractionValue to accept fallback parameter and
added unwrapInteractionBreakpoints for proper breakpoint unwrapping
- Updated processElementInteractions to skip interactions after
extracting full animation config with breakpoint data

_Generated by LinearB AI and added by gitStream._
<sub>AI-generated content may contain inaccuracies. Please verify before
using.
💡 **Tip:** You can customize your AI Description using **Guidelines**
[Learn
how](https://docs.gitstream.cm/automation-actions/#describe-changes)</sub>
<!--end_gitstream_placeholder-->

---------

Co-authored-by: Netanel Baba <50736016+Ntnelbaba@users.noreply.github.com>
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.